16#ifndef QGSQUERYRESULTWIDGET_H
17#define QGSQUERYRESULTWIDGET_H
19#include "ui_qgsqueryresultpanelwidgetbase.h"
20#include "ui_qgsqueryresultwidgetbase.h"
32#include <QStyledItemDelegate>
35#include <QtConcurrent>
37using namespace Qt::StringLiterals;
41class QgsQueryResultPanelWidget;
51class GUI_EXPORT QgsQueryResultItemDelegate :
public QStyledItemDelegate
57 explicit QgsQueryResultItemDelegate( QObject *parent =
nullptr );
59 QString displayText(
const QVariant &value,
const QLocale &locale )
const override;
66class GUI_EXPORT QgsConnectionsApiFetcher :
public QObject
72 QgsConnectionsApiFetcher(
const QString &uri,
const QString &providerKey )
74 , mProviderKey( providerKey )
86 void tokensReady(
const QStringList &newTokens );
89 void fetchingFinished();
94 QAtomicInt mStopFetching = 0;
95 std::unique_ptr<QgsFeedback> mFeedback;
117class GUI_EXPORT QgsQueryResultWidget :
public QWidget,
private Ui::QgsQueryResultWidgetBase
125 static const QgsSettingsEntryString *settingLastSourceFolder;
134 SqlQueryMode = 1 << 0,
135 QueryLayerUpdateMode = 1 << 1,
137 Q_ENUM( QueryWidgetMode )
142 QgsQueryResultWidget( QWidget *parent =
nullptr, QgsAbstractDatabaseProviderConnection *connection
SIP_TRANSFER =
nullptr );
144 ~QgsQueryResultWidget()
override;
149 void setSqlVectorLayerOptions(
const QgsAbstractDatabaseProviderConnection::SqlVectorLayerOptions &options );
154 void setWidgetMode( QueryWidgetMode widgetMode );
159 void setConnection( QgsAbstractDatabaseProviderConnection *connection
SIP_TRANSFER );
164 void setQuery(
const QString &sql );
166 SIP_SKIP bool promptUnsavedChanges();
184 void showError(
const QString &title,
const QString &message,
bool isSqlError =
false );
191 Q_DECL_DEPRECATED
void tokensReady(
const QStringList &tokens )
SIP_DEPRECATED;
205 void copyResults(
int fromRow,
int toRow,
int fromColumn,
int toColumn );
215 void createSqlVectorLayer(
const QString &providerKey,
const QString &connectionUri,
const QgsAbstractDatabaseProviderConnection::SqlVectorLayerOptions &options );
221 void firstResultBatchFetched();
223 SIP_SKIP void requestDialogTitleUpdate(
const QString &filename );
230 void updateButtons();
233 void saveQuery(
bool saveAs );
234 void setHasChanged(
bool hasChanged );
235 void populatePresetQueryMenu();
236 void showHistoryPanel(
bool show );
239 QgsQueryResultPanelWidget *mQueryWidget =
nullptr;
240 QPointer< QgsDatabaseQueryHistoryWidget > mHistoryWidget;
242 QMenu *mPresetQueryMenu =
nullptr;
244 bool mHasChangedFileContents =
false;
246 void updateDialogTitle();
249 friend class TestQgsQueryResultWidget;
265class GUI_EXPORT QgsQueryResultPanelWidget :
public QgsPanelWidget,
private Ui::QgsQueryResultPanelWidgetBase
273 QgsQueryResultPanelWidget( QWidget *parent =
nullptr, QgsAbstractDatabaseProviderConnection *connection
SIP_TRANSFER =
nullptr );
275 ~QgsQueryResultPanelWidget()
override;
280 QgsCodeEditorSQL *sqlEditor();
285 QgsCodeEditorWidget *codeEditorWidget();
290 void setSqlVectorLayerOptions(
const QgsAbstractDatabaseProviderConnection::SqlVectorLayerOptions &options );
295 void setWidgetMode( QgsQueryResultWidget::QueryWidgetMode widgetMode );
300 void setConnection( QgsAbstractDatabaseProviderConnection *connection
SIP_TRANSFER );
305 void setQuery(
const QString &sql );
323 void showError(
const QString &title,
const QString &message,
bool isSqlError =
false );
328 void tokensReady(
const QStringList &tokens );
342 void copyResults(
int fromRow,
int toRow,
int fromColumn,
int toColumn );
352 void createSqlVectorLayer(
const QString &providerKey,
const QString &connectionUri,
const QgsAbstractDatabaseProviderConnection::SqlVectorLayerOptions &options );
358 void firstResultBatchFetched();
365 void updateButtons();
367 void showCellContextMenu( QPoint point );
368 void copySelection();
371 QgsCodeEditorWidget *mCodeEditorWidget =
nullptr;
372 QgsCodeEditorSQL *mSqlEditor =
nullptr;
374 std::unique_ptr<QgsAbstractDatabaseProviderConnection> mConnection;
375 std::unique_ptr<QgsQueryResultModel> mModel;
376 std::unique_ptr<QgsFeedback> mFeedback;
378 QPointer<QgsConnectionsApiFetcher> mApiFetcher;
380 bool mWasCanceled =
false;
381 mutable QgsAbstractDatabaseProviderConnection::SqlVectorLayerOptions mSqlVectorLayerOptions;
382 bool mFirstRowFetched =
false;
383 QFutureWatcher<QgsAbstractDatabaseProviderConnection::QueryResult> mQueryResultWatcher;
384 QString mSqlErrorMessage;
385 long long mActualRowCount = -1;
386 long long mFetchedRowsBatchCount = 0;
387 QgsQueryResultWidget::QueryWidgetMode mQueryWidgetMode = QgsQueryResultWidget::QueryWidgetMode::SqlQueryMode;
388 long long mCurrentHistoryEntryId = -1;
393 void updateSqlLayerColumns();
398 void cancelRunningQuery();
403 void cancelApiFetcher();
408 void startFetching();
413 QgsAbstractDatabaseProviderConnection::SqlVectorLayerOptions sqlVectorLayerOptions()
const;
417 friend class TestQgsQueryResultWidget;
418 friend class QgsQueryResultWidget;
433class GUI_EXPORT QgsQueryResultDialog :
public QDialog
443 QgsQueryResultDialog( QgsAbstractDatabaseProviderConnection *connection
SIP_TRANSFER =
nullptr, QWidget *parent =
nullptr );
448 QgsQueryResultWidget *resultWidget() {
return mWidget; }
450 void closeEvent( QCloseEvent *event )
override;
453 QgsQueryResultWidget *mWidget =
nullptr;
467class GUI_EXPORT QgsQueryResultMainWindow :
public QMainWindow
477 QgsQueryResultMainWindow( QgsAbstractDatabaseProviderConnection *connection
SIP_TRANSFER =
nullptr,
const QString &identifierName = QString() );
482 QgsQueryResultWidget *resultWidget() {
return mWidget; }
484 void closeEvent( QCloseEvent *event )
override;
487 QgsQueryResultWidget *mWidget =
nullptr;
488 QString mIdentifierName;
490 void updateWindowTitle(
const QString &fileName );
MessageLevel
Level for messages This will be used both for message log and message bar in application.
@ Info
Information message.
QueryStorageBackend
Stored query storage backends.
A SQL editor based on QScintilla2.
Custom QgsHistoryWidget for use with the database query provider.
QgsSettingsTreeNode * createChildNode(const QString &key)
Creates a normal tree node It will return the existing child node if it exists at the given key.
static QgsSettingsTreeNode * sTreeGui
#define SIP_ENUM_BASETYPE(type)