Skip to content

Commit 5fb52fa

Browse files
committedAug 17, 2015
Remove query dialog. Replace with tabs
1 parent bbce092 commit 5fb52fa

File tree

3 files changed

+189
-188
lines changed

3 files changed

+189
-188
lines changed
 

‎python/plugins/db_manager/db_manager.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
***************************************************************************/
2323
"""
2424

25+
import functools
26+
2527
from PyQt4.QtCore import QObject, Qt, QSettings, QByteArray, SIGNAL, QSize
2628
from PyQt4.QtGui import QMainWindow, QApplication, QMenu, QIcon, QTabWidget, QGridLayout, QSpacerItem, QSizePolicy, \
2729
QDockWidget, QStatusBar, QMenuBar, QToolBar, QKeySequence
@@ -188,17 +190,22 @@ def runSqlWindow(self):
188190

189191
from dlg_sql_window import DlgSqlWindow
190192

191-
dlg = DlgSqlWindow(self.iface, db, self)
192-
# refreshDb = lambda x: self.refreshItem( db.connection() ) # refresh the database tree
193-
#self.connect( dlg, SIGNAL( "queryExecuted(const QString &)" ), refreshDb )
194-
dlg.show()
195-
dlg.exec_()
193+
query = DlgSqlWindow(self.iface, db, self)
194+
index = self.tabs.addTab(query, self.tr("Query"))
195+
self.tabs.setCurrentIndex(index)
196+
try:
197+
self.tabs.setTabIcon(index, self.tree.currentItem().icon())
198+
except AttributeError:
199+
pass
200+
query.nameChanged.connect(functools.partial(self.update_tab_name, index))
196201

202+
def update_tab_name(self, index, name):
203+
name = name + "(query)"
204+
self.tabs.setTabText(index, name)
197205

198206
def showSystemTables(self):
199207
self.tree.showSystemTables(self.actionShowSystemTables.isChecked())
200208

201-
202209
def registerAction(self, action, menuName, callback=None):
203210
""" register an action to the manager's main menu """
204211
if not hasattr(self, '_registeredDbActions'):
@@ -340,13 +347,21 @@ def unregisterAllActions(self):
340347
self.unregisterAction(action, menuName)
341348
del self._registeredDbActions
342349

350+
def close_tab(self, index):
351+
widget = self.tabs.widget(index)
352+
if widget not in [self.info, self.table, self.preview]:
353+
self.tabs.removeTab(index)
354+
widget.deleteLater()
355+
343356
def setupUi(self):
344357
self.setWindowTitle(self.tr("DB Manager"))
345358
self.setWindowIcon(QIcon(":/db_manager/icon"))
346359
self.resize(QSize(700, 500).expandedTo(self.minimumSizeHint()))
347360

348361
# create central tab widget
349362
self.tabs = QTabWidget()
363+
self.tabs.setTabsClosable(True)
364+
self.tabs.tabCloseRequested.connect(self.close_tab)
350365
self.info = InfoViewer(self)
351366
self.tabs.addTab(self.info, self.tr("Info"))
352367
self.table = TableViewer(self)

‎python/plugins/db_manager/dlg_sql_window.py

Lines changed: 22 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,9 @@
2222
***************************************************************************/
2323
"""
2424

25-
from PyQt4.QtCore import Qt, QObject, QSettings, QByteArray, SIGNAL
26-
from PyQt4.QtGui import QDialog, QAction, QKeySequence, QDialogButtonBox, QApplication, QCursor, QMessageBox, QClipboard, QInputDialog, QIcon
25+
from PyQt4.QtCore import Qt, QObject, QSettings, QByteArray, SIGNAL, pyqtSignal
26+
from PyQt4.QtGui import QDialog, QWidget, QAction, QKeySequence, \
27+
QDialogButtonBox, QApplication, QCursor, QMessageBox, QClipboard, QInputDialog, QIcon
2728
from PyQt4.Qsci import QsciAPIs
2829

2930
from qgis.core import QgsProject
@@ -45,9 +46,10 @@
4546
import re
4647

4748

48-
class DlgSqlWindow(QDialog, Ui_Dialog):
49+
class DlgSqlWindow(QWidget, Ui_Dialog):
50+
nameChanged = pyqtSignal(str)
4951
def __init__(self, iface, db, parent=None):
50-
QDialog.__init__(self, parent)
52+
QWidget.__init__(self, parent)
5153
self.iface = iface
5254
self.db = db
5355
self.setupUi(self)
@@ -56,9 +58,6 @@ def __init__(self, iface, db, parent=None):
5658

5759
self.defaultLayerName = 'QueryLayer'
5860

59-
settings = QSettings()
60-
self.restoreGeometry(settings.value("/DB_Manager/sqlWindow/geometry", QByteArray(), type=QByteArray))
61-
6261
self.editSql.setFocus()
6362
self.editSql.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
6463
self.initCompleter()
@@ -67,36 +66,39 @@ def __init__(self, iface, db, parent=None):
6766
copyAction = QAction("copy", self)
6867
self.viewResult.addAction(copyAction)
6968
copyAction.setShortcuts(QKeySequence.Copy)
70-
QObject.connect(copyAction, SIGNAL("triggered()"), self.copySelectedResults)
7169

72-
self.connect(self.btnExecute, SIGNAL("clicked()"), self.executeSql)
73-
self.connect(self.btnClear, SIGNAL("clicked()"), self.clearSql)
74-
self.connect(self.buttonBox.button(QDialogButtonBox.Close), SIGNAL("clicked()"), self.close)
70+
copyAction.triggered.connect(self.copySelectedResults)
71+
72+
self.btnExecute.clicked.connect(self.executeSql)
73+
self.btnClear.clicked.connect(self.clearSql)
74+
75+
self.presetStore.clicked.connect(self.storePreset)
76+
self.presetDelete.clicked.connect(self.deletePreset)
77+
self.presetCombo.activated[str].connect(self.loadPreset)
78+
self.presetCombo.activated[str].connect(self.presetName.setText)
7579

76-
self.connect(self.presetStore, SIGNAL("clicked()"), self.storePreset)
77-
self.connect(self.presetDelete, SIGNAL("clicked()"), self.deletePreset)
78-
self.connect(self.presetCombo, SIGNAL("activated(QString)"), self.loadPreset)
79-
self.connect(self.presetCombo, SIGNAL("activated(QString)"), self.presetName.setText)
8080
self.updatePresetsCombobox()
8181

8282
# hide the load query as layer if feature is not supported
8383
self._loadAsLayerAvailable = self.db.connector.hasCustomQuerySupport()
8484
self.loadAsLayerGroup.setVisible(self._loadAsLayerAvailable)
8585
if self._loadAsLayerAvailable:
8686
self.layerTypeWidget.hide() # show if load as raster is supported
87-
self.connect(self.loadLayerBtn, SIGNAL("clicked()"), self.loadSqlLayer)
88-
self.connect(self.getColumnsBtn, SIGNAL("clicked()"), self.fillColumnCombos)
89-
self.connect(self.loadAsLayerGroup, SIGNAL("toggled(bool)"), self.loadAsLayerToggled)
87+
self.loadLayerBtn.clicked.connect(self.loadSqlLayer)
88+
self.getColumnsBtn.clicked.connect(self.fillColumnCombos)
89+
self.loadAsLayerGroup.toggled.connect(self.loadAsLayerToggled)
9090
self.loadAsLayerToggled(False)
9191

9292
self._createViewAvailable = self.db.connector.hasCreateSpatialViewSupport()
9393
self.btnCreateView.setVisible( self._createViewAvailable )
9494
if self._createViewAvailable:
95-
self.connect( self.btnCreateView, SIGNAL("clicked()"), self.createView )
95+
self.btnCreateView.clicked.connect(self.createView)
9696

9797
self.queryBuilderFirst = True
9898
self.queryBuilderBtn.setIcon(QIcon(":/db_manager/icons/sql.gif"))
99-
self.connect( self.queryBuilderBtn, SIGNAL("clicked()"), self.displayQueryBuilder )
99+
self.queryBuilderBtn.clicked.connect(self.displayQueryBuilder)
100+
101+
self.presetName.textChanged.connect(self.nameChanged)
100102

101103
def updatePresetsCombobox(self):
102104
self.presetCombo.clear()
@@ -135,13 +137,6 @@ def loadPreset(self, name):
135137
name = QgsProject.instance().readEntry('DBManager', 'savedQueries/q' + unicode(name.__hash__()) + '/name')[0]
136138
self.editSql.setText(query)
137139

138-
def closeEvent(self, e):
139-
""" save window state """
140-
settings = QSettings()
141-
settings.setValue("/DB_Manager/sqlWindow/geometry", self.saveGeometry())
142-
143-
QDialog.closeEvent(self, e)
144-
145140
def loadAsLayerToggled(self, checked):
146141
self.loadAsLayerGroup.setChecked(checked)
147142
self.loadAsLayerWidget.setVisible(checked)

‎python/plugins/db_manager/ui/DlgSqlWindow.ui

Lines changed: 146 additions & 155 deletions
Original file line numberDiff line numberDiff line change
@@ -6,168 +6,14 @@
66
<rect>
77
<x>0</x>
88
<y>0</y>
9-
<width>801</width>
9+
<width>626</width>
1010
<height>525</height>
1111
</rect>
1212
</property>
1313
<property name="windowTitle">
1414
<string>SQL window</string>
1515
</property>
1616
<layout class="QGridLayout" name="gridLayout_2">
17-
<item row="0" column="0">
18-
<widget class="QSplitter" name="splitter">
19-
<property name="orientation">
20-
<enum>Qt::Vertical</enum>
21-
</property>
22-
<widget class="QWidget" name="layoutWidget">
23-
<layout class="QVBoxLayout" name="verticalLayout_2">
24-
<item>
25-
<layout class="QHBoxLayout" name="horizontalLayout">
26-
<item>
27-
<widget class="QLabel" name="label">
28-
<property name="text">
29-
<string>SQL query:</string>
30-
</property>
31-
</widget>
32-
</item>
33-
<item>
34-
<spacer name="horizontalSpacer">
35-
<property name="orientation">
36-
<enum>Qt::Horizontal</enum>
37-
</property>
38-
<property name="sizeHint" stdset="0">
39-
<size>
40-
<width>40</width>
41-
<height>20</height>
42-
</size>
43-
</property>
44-
</spacer>
45-
</item>
46-
<item>
47-
<widget class="QToolButton" name="queryBuilderBtn">
48-
<property name="text">
49-
<string/>
50-
</property>
51-
</widget>
52-
</item>
53-
<item>
54-
<widget class="QLineEdit" name="presetName">
55-
<property name="text">
56-
<string notr="true"/>
57-
</property>
58-
</widget>
59-
</item>
60-
<item>
61-
<widget class="QComboBox" name="presetCombo"/>
62-
</item>
63-
<item>
64-
<widget class="QPushButton" name="presetStore">
65-
<property name="text">
66-
<string>Store</string>
67-
</property>
68-
</widget>
69-
</item>
70-
<item>
71-
<widget class="QPushButton" name="presetDelete">
72-
<property name="text">
73-
<string>Delete</string>
74-
</property>
75-
</widget>
76-
</item>
77-
</layout>
78-
</item>
79-
<item>
80-
<widget class="QgsCodeEditorSQL" name="editSql"/>
81-
</item>
82-
<item>
83-
<layout class="QHBoxLayout">
84-
<item>
85-
<widget class="QPushButton" name="btnExecute">
86-
<property name="text">
87-
<string>&amp;Execute (F5)</string>
88-
</property>
89-
<property name="shortcut">
90-
<string>F5</string>
91-
</property>
92-
</widget>
93-
</item>
94-
<item>
95-
<widget class="QLabel" name="lblResult">
96-
<property name="text">
97-
<string/>
98-
</property>
99-
</widget>
100-
</item>
101-
<item>
102-
<widget class="QPushButton" name="btnCreateView">
103-
<property name="text">
104-
<string>Create a view</string>
105-
</property>
106-
</widget>
107-
</item>
108-
<item>
109-
<spacer>
110-
<property name="orientation">
111-
<enum>Qt::Horizontal</enum>
112-
</property>
113-
<property name="sizeHint" stdset="0">
114-
<size>
115-
<width>40</width>
116-
<height>20</height>
117-
</size>
118-
</property>
119-
</spacer>
120-
</item>
121-
<item>
122-
<widget class="QPushButton" name="btnClear">
123-
<property name="text">
124-
<string>&amp;Clear</string>
125-
</property>
126-
</widget>
127-
</item>
128-
</layout>
129-
</item>
130-
</layout>
131-
</widget>
132-
<widget class="QWidget" name="layoutWidget">
133-
<layout class="QVBoxLayout" name="verticalLayout">
134-
<item>
135-
<widget class="QLabel" name="label_2">
136-
<property name="text">
137-
<string>Result:</string>
138-
</property>
139-
</widget>
140-
</item>
141-
<item>
142-
<widget class="QTableView" name="viewResult">
143-
<property name="sizePolicy">
144-
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
145-
<horstretch>0</horstretch>
146-
<verstretch>3</verstretch>
147-
</sizepolicy>
148-
</property>
149-
<property name="selectionBehavior">
150-
<enum>QAbstractItemView::SelectRows</enum>
151-
</property>
152-
<property name="horizontalScrollMode">
153-
<enum>QAbstractItemView::ScrollPerPixel</enum>
154-
</property>
155-
</widget>
156-
</item>
157-
</layout>
158-
</widget>
159-
</widget>
160-
</item>
161-
<item row="2" column="0">
162-
<widget class="QDialogButtonBox" name="buttonBox">
163-
<property name="orientation">
164-
<enum>Qt::Horizontal</enum>
165-
</property>
166-
<property name="standardButtons">
167-
<set>QDialogButtonBox::Close</set>
168-
</property>
169-
</widget>
170-
</item>
17117
<item row="1" column="0">
17218
<widget class="QGroupBox" name="loadAsLayerGroup">
17319
<property name="sizePolicy">
@@ -372,6 +218,150 @@ columns</string>
372218
</layout>
373219
</widget>
374220
</item>
221+
<item row="0" column="0">
222+
<widget class="QSplitter" name="splitter">
223+
<property name="orientation">
224+
<enum>Qt::Vertical</enum>
225+
</property>
226+
<widget class="QWidget" name="layoutWidget">
227+
<layout class="QVBoxLayout" name="verticalLayout_2">
228+
<item>
229+
<layout class="QHBoxLayout" name="horizontalLayout">
230+
<item>
231+
<widget class="QToolButton" name="queryBuilderBtn">
232+
<property name="text">
233+
<string/>
234+
</property>
235+
</widget>
236+
</item>
237+
<item>
238+
<spacer name="horizontalSpacer">
239+
<property name="orientation">
240+
<enum>Qt::Horizontal</enum>
241+
</property>
242+
<property name="sizeHint" stdset="0">
243+
<size>
244+
<width>40</width>
245+
<height>20</height>
246+
</size>
247+
</property>
248+
</spacer>
249+
</item>
250+
<item>
251+
<widget class="QLabel" name="label">
252+
<property name="text">
253+
<string>Saved query:</string>
254+
</property>
255+
</widget>
256+
</item>
257+
<item>
258+
<widget class="QComboBox" name="presetCombo"/>
259+
</item>
260+
<item>
261+
<widget class="QLabel" name="label_2">
262+
<property name="text">
263+
<string>Name</string>
264+
</property>
265+
</widget>
266+
</item>
267+
<item>
268+
<widget class="QLineEdit" name="presetName">
269+
<property name="text">
270+
<string notr="true"/>
271+
</property>
272+
</widget>
273+
</item>
274+
<item>
275+
<widget class="QPushButton" name="presetStore">
276+
<property name="text">
277+
<string>Store</string>
278+
</property>
279+
</widget>
280+
</item>
281+
<item>
282+
<widget class="QPushButton" name="presetDelete">
283+
<property name="text">
284+
<string>Delete</string>
285+
</property>
286+
</widget>
287+
</item>
288+
</layout>
289+
</item>
290+
<item>
291+
<widget class="QgsCodeEditorSQL" name="editSql"/>
292+
</item>
293+
<item>
294+
<layout class="QHBoxLayout">
295+
<item>
296+
<widget class="QPushButton" name="btnExecute">
297+
<property name="text">
298+
<string>&amp;Execute (F5)</string>
299+
</property>
300+
<property name="shortcut">
301+
<string>F5</string>
302+
</property>
303+
</widget>
304+
</item>
305+
<item>
306+
<widget class="QLabel" name="lblResult">
307+
<property name="text">
308+
<string/>
309+
</property>
310+
</widget>
311+
</item>
312+
<item>
313+
<widget class="QPushButton" name="btnCreateView">
314+
<property name="text">
315+
<string>Create a view</string>
316+
</property>
317+
</widget>
318+
</item>
319+
<item>
320+
<spacer>
321+
<property name="orientation">
322+
<enum>Qt::Horizontal</enum>
323+
</property>
324+
<property name="sizeHint" stdset="0">
325+
<size>
326+
<width>40</width>
327+
<height>20</height>
328+
</size>
329+
</property>
330+
</spacer>
331+
</item>
332+
<item>
333+
<widget class="QPushButton" name="btnClear">
334+
<property name="text">
335+
<string>&amp;Clear</string>
336+
</property>
337+
</widget>
338+
</item>
339+
</layout>
340+
</item>
341+
</layout>
342+
</widget>
343+
<widget class="QWidget" name="layoutWidget">
344+
<layout class="QVBoxLayout" name="verticalLayout">
345+
<item>
346+
<widget class="QTableView" name="viewResult">
347+
<property name="sizePolicy">
348+
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
349+
<horstretch>0</horstretch>
350+
<verstretch>3</verstretch>
351+
</sizepolicy>
352+
</property>
353+
<property name="selectionBehavior">
354+
<enum>QAbstractItemView::SelectRows</enum>
355+
</property>
356+
<property name="horizontalScrollMode">
357+
<enum>QAbstractItemView::ScrollPerPixel</enum>
358+
</property>
359+
</widget>
360+
</item>
361+
</layout>
362+
</widget>
363+
</widget>
364+
</item>
375365
</layout>
376366
</widget>
377367
<customwidgets>
@@ -386,6 +376,7 @@ columns</string>
386376
<tabstop>btnClear</tabstop>
387377
<tabstop>viewResult</tabstop>
388378
</tabstops>
379+
<resources/>
389380
<connections>
390381
<connection>
391382
<sender>loadAsLayerGroup</sender>

0 commit comments

Comments
 (0)
Please sign in to comment.