QGIS API Documentation 3.37.0-Master (fdefdf9c27f)
qgsdatabaseschemacombobox.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsdatabaseschemacombobox.cpp
3 --------------------------------
4 Date : March 2020
5 Copyright : (C) 2020 Nyall Dawson
6 Email : nyall dot dawson at gmail dot com
7***************************************************************************
8* *
9* This program is free software; you can redistribute it and/or modify *
10* it under the terms of the GNU General Public License as published by *
11* the Free Software Foundation; either version 2 of the License, or *
12* (at your option) any later version. *
13* *
14***************************************************************************/
15
19#include "qgsapplication.h"
20#include <QHBoxLayout>
21#include <QToolButton>
22
23QgsDatabaseSchemaComboBox::QgsDatabaseSchemaComboBox( const QString &provider, const QString &connection, QWidget *parent )
24 : QWidget( parent )
25 , mProvider( provider )
26{
27 if ( !provider.isEmpty() && !connection.isEmpty() )
28 mModel = new QgsDatabaseSchemaModel( provider, connection, this );
29 init();
30}
31
33 : QWidget( parent )
34{
35 mModel = new QgsDatabaseSchemaModel( connection, this );
36 init();
37}
38
40{
41 mAllowEmpty = allowEmpty;
42 if ( mModel )
43 mModel->setAllowEmptySchema( mAllowEmpty );
44}
45
47{
48 return mAllowEmpty;
49}
50
51void QgsDatabaseSchemaComboBox::init()
52{
53 mComboBox = new QComboBox();
54
55 mSortModel = new QgsDatabaseSchemaComboBoxSortModel( this );
56
57 if ( mModel )
58 mSortModel->setSourceModel( mModel );
59
60 mSortModel->setSortRole( Qt::DisplayRole );
61 mSortModel->setSortLocaleAware( true );
62 mSortModel->setSortCaseSensitivity( Qt::CaseInsensitive );
63 mSortModel->setDynamicSortFilter( true );
64 mSortModel->sort( 0 );
65
66 mComboBox->setModel( mSortModel );
67
68 QHBoxLayout *l = new QHBoxLayout();
69 l->setContentsMargins( 0, 0, 0, 0 );
70 l->addWidget( mComboBox );
71
72 QToolButton *refreshButton = new QToolButton();
73 refreshButton->setAutoRaise( true );
74 refreshButton->setToolTip( tr( "Refresh schemas" ) );
75 refreshButton->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "mActionRefresh.svg" ) ) );
76 l->addWidget( refreshButton );
77 setLayout( l );
78
79 connect( refreshButton, &QToolButton::clicked, this, &QgsDatabaseSchemaComboBox::refreshSchemas );
80
81 connect( mComboBox, static_cast < void ( QComboBox::* )( int ) > ( &QComboBox::activated ), this, &QgsDatabaseSchemaComboBox::indexChanged );
82 connect( mSortModel, &QAbstractItemModel::rowsInserted, this, &QgsDatabaseSchemaComboBox::rowsChanged );
83 connect( mSortModel, &QAbstractItemModel::rowsRemoved, this, &QgsDatabaseSchemaComboBox::rowsChanged );
84}
85
86void QgsDatabaseSchemaComboBox::setSchema( const QString &schema )
87{
88 if ( schema == currentSchema() )
89 return;
90
91 if ( schema.isEmpty() )
92 {
93 if ( mAllowEmpty )
94 mComboBox->setCurrentIndex( 0 );
95 else
96 mComboBox->setCurrentIndex( -1 );
97
98 emit schemaChanged( QString() );
99 return;
100 }
101
102 const QModelIndexList idx = mSortModel->match( mSortModel->index( 0, 0 ), Qt::DisplayRole, schema, 1, Qt::MatchFixedString | Qt::MatchCaseSensitive );
103 if ( !idx.empty() )
104 {
105 const QModelIndex proxyIdx = idx.at( 0 );
106 if ( proxyIdx.isValid() )
107 {
108 mComboBox->setCurrentIndex( proxyIdx.row() );
110 return;
111 }
112 }
113 mComboBox->setCurrentIndex( -1 );
114 emit schemaChanged( QString() );
115}
116
117void QgsDatabaseSchemaComboBox::setConnectionName( const QString &connection, const QString &provider )
118{
119 if ( !provider.isEmpty() )
120 mProvider = provider;
121
122 const QString oldSchema = currentSchema();
123 QgsDatabaseSchemaModel *oldModel = mModel;
124 if ( !connection.isEmpty() && !mProvider.isEmpty() )
125 {
126 mModel = new QgsDatabaseSchemaModel( mProvider, connection, this );
127 mModel->setAllowEmptySchema( mAllowEmpty );
128 mSortModel->setSourceModel( mModel );
129 }
130 else
131 {
132 mModel = nullptr;
133 mSortModel->setSourceModel( nullptr );
134 }
135 if ( oldModel )
136 oldModel->deleteLater();
137
138 if ( currentSchema() != oldSchema )
139 setSchema( oldSchema );
140}
141
143{
144 const QString oldSchema = currentSchema();
145 if ( mModel )
146 mModel->refresh();
147 setSchema( oldSchema );
148}
149
151{
152 const QModelIndex proxyIndex = mSortModel->index( mComboBox->currentIndex(), 0 );
153 if ( !proxyIndex.isValid() )
154 {
155 return QString();
156 }
157
158 return mSortModel->data( proxyIndex, Qt::DisplayRole ).toString();
159}
160
161void QgsDatabaseSchemaComboBox::indexChanged( int i )
162{
163 Q_UNUSED( i )
165}
166
167void QgsDatabaseSchemaComboBox::rowsChanged()
168{
169 if ( mComboBox->count() == 1 || ( mAllowEmpty && mComboBox->count() == 2 && mComboBox->currentIndex() == 1 ) )
170 {
171 //currently selected connection item has changed
173 }
174 else if ( mComboBox->count() == 0 )
175 {
176 emit schemaChanged( QString() );
177 }
178}
179
180
182QgsDatabaseSchemaComboBoxSortModel::QgsDatabaseSchemaComboBoxSortModel( QObject *parent )
183 : QSortFilterProxyModel( parent )
184{
185
186}
187
188bool QgsDatabaseSchemaComboBoxSortModel::lessThan( const QModelIndex &left, const QModelIndex &right ) const
189{
190 // empty row is always first
191 if ( sourceModel()->data( left, static_cast< int >( QgsDatabaseSchemaModel::CustomRole::Empty ) ).toBool() )
192 return true;
193 else if ( sourceModel()->data( right, static_cast< int >( QgsDatabaseSchemaModel::CustomRole::Empty ) ).toBool() )
194 return false;
195
196 // default mode is alphabetical order
197 const QString leftStr = sourceModel()->data( left ).toString();
198 const QString rightStr = sourceModel()->data( right ).toString();
199 return QString::localeAwareCompare( leftStr, rightStr ) < 0;
200}
201
The QgsAbstractDatabaseProviderConnection class provides common functionality for DB based connection...
static QIcon getThemeIcon(const QString &name, const QColor &fillColor=QColor(), const QColor &strokeColor=QColor())
Helper to get a theme icon.
void setConnectionName(const QString &connection, const QString &provider=QString())
Sets the database connection name from which to retrieve the available schemas.
QgsDatabaseSchemaComboBox(const QString &provider, const QString &connection, QWidget *parent=nullptr)
Constructor for QgsDatabaseSchemaComboBox, for the specified provider and connection.
void setSchema(const QString &schema)
Sets the current schema selected in the combo box.
void refreshSchemas()
Refreshes the list of available schemas.
void schemaChanged(const QString &schema)
Emitted whenever the currently selected schema changes.
bool allowEmptySchema() const
Returns true if the combobox allows the empty schema ("not set") choice.
void setAllowEmptySchema(bool allowEmpty)
Sets whether an optional empty schema ("not set") option is present in the combobox.
QString currentSchema() const
Returns the name of the current schema selected in the combo box.
A model containing schemas from a database connection.
void setAllowEmptySchema(bool allowEmpty)
Sets whether an optional empty schema ("not set") option is present in the model.
@ Empty
Entry is an empty entry.
void refresh()
Refreshes the schema list by querying the underlying connection.