1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 """left navigation pane"""
29
30 import os
31 import sys
32 import logging
33
34 logger = logging.getLogger('camelot.view.controls.navpane')
35
36 from PyQt4 import QtGui
37 from PyQt4 import QtCore
38 from PyQt4.QtCore import Qt
39
40 import settings
41 from camelot.view import art
42 from camelot.view.model_thread import get_model_thread
43 from camelot.view.helpers import addActions, createAction
44 from camelot.view.controls.modeltree import ModelItem, ModelTree
45 from appscheme import scheme, defaultUI
46
47 QT_MAJOR_VERSION = float('.'.join(str(QtCore.QT_VERSION_STR).split('.')[0:2]))
48
49 _ = lambda x:x
50
51
53 """Navigation pane Caption"""
54 - def __init__(self,
55 text,
56 textbold=True,
57 textindent=3,
58 width=160,
59 height=32,
60 objectname='PaneCaption',
61 parent=None):
62
63 super(PaneCaption, self).__init__(parent)
64
65 self.setText(text)
66
67 if textbold:
68 self.textbold()
69
70 font = self.font()
71 font.setPointSize(font.pointSize() + 2)
72 self.setFont(font)
73
74 self.setIndent(textindent)
75
76 self.setObjectName(objectname)
77
78 style = """
79 QLabel#PaneCaption {
80 margin: 3px 0 0 3px;
81 border: 1px solid %s;
82 color: %s;
83 background-color: %s;
84 }
85 """ % (scheme.bordercolor(),
86 scheme.captiontextcolor(),
87 scheme.captionbackground())
88
89 self.setStyleSheet(style);
90 self.setFixedHeight(height)
91 self.resize(width, height)
92
94 font = self.font()
95 font.setBold(True)
96 font.setPointSize(font.pointSize() + 1)
97 self.setFont(font)
98
99
213
214
216 """ms office-like navigation pane in Qt"""
217
218 - def __init__(self, app_admin, objectname='NavigationPane', parent=None):
219 super(NavigationPane, self).__init__(parent)
220 self.app_admin = app_admin
221 self.sections = app_admin.getSections()
222 buttons = [PaneButton(label, icon)
223 for (section,(label, icon)) in self.sections]
224 self.setFeatures(QtGui.QDockWidget.NoDockWidgetFeatures)
225
226 self.setcontent(buttons)
227 self.parent = parent
228
229 self.currentbutton = -1
230
231 self.caption = PaneCaption('')
232 self.setTitleBarWidget(self.caption)
233
234 self.setObjectName(objectname)
235
236
237
238
239
240
241 - def setcontent(self, buttons):
242 logger.debug('setting up pane content')
243 self.content = QtGui.QWidget()
244 self.content.setObjectName('NavPaneContent')
245
246 style = """
247 QWidget#NavPaneContent {
248 margin-left: 3px;
249 background-color: %s;
250 }
251 """ % scheme.bordercolor()
252
253 self.content.setStyleSheet(style)
254
255 self.mt = get_model_thread()
256
257
258
259 header_labels = ['']
260 self.treewidget = ModelTree(header_labels, self)
261 self.treewidget.setObjectName('NavPaneTree')
262
263 style = """
264 QWidget#NavPaneTree {
265 margin-left: 3px;
266 border: 1px solid %s;
267 }
268 """ % scheme.bordercolor()
269
270 self.treewidget.setStyleSheet(style)
271
272
273 self.treewidget.contextmenu = QtGui.QMenu(self)
274 newWindowAct = createAction(self,
275 _('Open in New Window'),
276 self.popWindow,
277 'Ctrl+Enter')
278
279 addActions(self.treewidget.contextmenu, (newWindowAct,))
280 self.treewidget.setContextMenuPolicy(Qt.CustomContextMenu)
281 self.connect(self.treewidget,
282 QtCore.SIGNAL('customContextMenuRequested(const QPoint &)'),
283 self.createContextMenu)
284
285 layout = QtGui.QVBoxLayout()
286 layout.setSpacing(1)
287 layout.setContentsMargins(1,1,1,1)
288 layout.addWidget(self.treewidget)
289
290 if buttons:
291 for b in buttons:
292 layout.addWidget(b)
293 self.connect(b, QtCore.SIGNAL('indexselected'), self.change_current)
294 self.buttons = buttons
295
296 self.content.setLayout(layout)
297 self.setWidget(self.content)
298
300 self.treewidget.clear()
301 self.models = models
302
303
304 if not models:
305 return
306
307 self.treewidget.clear_model_items()
308
309 for model in models:
310 logger.debug('loading model %s' % str(model[0]))
311
312 item = ModelItem(self.treewidget, [model[0].getName()])
313
314 self.treewidget.modelitems.append(item)
315
316 self.treewidget.update()
317
319 logger.debug('set current to %s' % text)
320
321 if self.currentbutton != -1:
322 button = self.buttons[self.currentbutton]
323 button.setStyleSheet(button.stylenormal)
324 button.selected = False
325 self.caption.setText(text)
326 self.currentbutton = index
327
328 def get_models_for_tree():
329 """Return pairs of (Admin,query) classes for items in the tree"""
330 section = self.sections[index][0]
331 return self.app_admin.getEntitiesAndQueriesInSection(section)
332
333 self.mt.post(get_models_for_tree,
334 lambda models:self.set_models_in_tree(models))
335
337 logger.debug('creating context menu')
338 item = self.treewidget.itemAt(point)
339 if item:
340
341
342
343 self.treewidget.setCurrentItem(item)
344 self.treewidget.contextmenu.popup(self.cursor().pos())
345
347 """pops a model window in parent's workspace"""
348 logger.debug('poping a window in parent')
349 item = self.treewidget.currentItem()
350
351
352 self.parent.createMdiChild(item)
353