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 logging
31 logger = logging.getLogger( 'camelot.view.controls.navpane' )
32
33 from PyQt4.QtCore import Qt
34 from PyQt4 import QtGui, QtCore
35
36 from camelot.view.model_thread import post
37 from camelot.action import addActions, createAction
38 from camelot.view.controls.modeltree import ModelItem, ModelTree
39 from appscheme import scheme
40
41 QT_MAJOR_VERSION = float( '.'.join( str( QtCore.QT_VERSION_STR ).split( '.' )[0:2] ) )
42
43 _ = lambda x:x
44
45 from camelot.view.controls.user_translatable_label import UserTranslatableLabel
46
48 """Navigation pane Caption"""
49 - def __init__( self,
50 text,
51 textbold = True,
52 textindent = 3,
53 width = 160,
54 height = 32,
55 objectname = 'PaneCaption',
56 parent = None ):
57
58 super(UserTranslatableLabel, self).__init__(text, parent)
59
60 if textbold:
61 self.textbold()
62
63 font = self.font()
64 font.setPointSize( font.pointSize() + 2 )
65 self.setFont( font )
66
67 self.setIndent( textindent )
68
69 self.setObjectName( objectname )
70
71 style = """
72 QLabel#PaneCaption {
73 margin: 3px 0 0 3px;
74 border: 1px solid %s;
75 color: %s;
76 background-color: %s;
77 }
78 """ % ( scheme.bordercolor(),
79 scheme.captiontextcolor(),
80 scheme.captionbackground() )
81
82 self.setStyleSheet( style );
83 self.setFixedHeight( height )
84 self.resize( width, height )
85
86 - def textbold( self ):
87 font = self.font()
88 font.setBold( True )
89 font.setPointSize( font.pointSize() + 1 )
90 self.setFont( font )
91
92
207
208
210 """ms office-like navigation pane in Qt"""
211
212 - def __init__( self, app_admin, objectname = 'NavigationPane', parent = None ):
213 QtGui.QDockWidget.__init__( self, parent )
214 self.app_admin = app_admin
215 self.setFeatures( QtGui.QDockWidget.NoDockWidgetFeatures )
216 self.parent = parent
217 self.currentbutton = -1
218 self.caption = PaneCaption( '' )
219 self.setTitleBarWidget( self.caption )
220 self.setObjectName( objectname )
221 self.buttons = []
222 self.content = QtGui.QWidget()
223 self.content.setObjectName( 'NavPaneContent' )
224 header_labels = ['']
225 layout = QtGui.QVBoxLayout()
226 layout.setSpacing( 1 )
227 layout.setContentsMargins( 1, 1, 1, 1 )
228 self.treewidget = ModelTree( header_labels, self )
229 layout.addWidget( self.treewidget )
230 self.setMinimumWidth(QtGui.QFontMetrics(QtGui.QApplication.font()).averageCharWidth()*40)
231 self.content.setLayout( layout )
232 self.setWidget( self.content )
233
234
235
236
237 self.setMinimumWidth(0)
238
239
240
241
242 self.connect( self.app_admin, self.app_admin.auth_changed_signal, self.auth_update )
243 self.auth_update()
244
247
250
268
269 - def setcontent( self, buttons ):
270 logger.debug( 'setting up pane content' )
271
272 style = """
273 QWidget#NavPaneContent {
274 margin-left: 3px;
275 background-color: %s;
276 }
277 """ % scheme.bordercolor()
278
279 self.content.setStyleSheet( style )
280
281
282
283
284
285
286 self.treewidget.setObjectName( 'NavPaneTree' )
287
288 style = """
289 QWidget#NavPaneTree {
290 margin-left: 3px;
291 border: 1px solid %s;
292 background-color: rgb(255, 255, 255);
293 }
294 """ % scheme.bordercolor()
295
296 self.treewidget.setStyleSheet( style )
297
298
299 self.treewidget.contextmenu = QtGui.QMenu( self )
300 newWindowAct = createAction( parent = self,
301 text = _( 'Open in New Window' ),
302 slot = self.popWindow,
303 shortcut = 'Ctrl+Enter' )
304
305 addActions( self.treewidget.contextmenu, ( newWindowAct, ) )
306 self.treewidget.setContextMenuPolicy( Qt.CustomContextMenu )
307 self.connect( self.treewidget,
308 QtCore.SIGNAL( 'customContextMenuRequested(const QPoint &)' ),
309 self.createContextMenu )
310
311 if buttons:
312 for b in buttons:
313 self.content.layout().addWidget( b )
314 self.connect( b, QtCore.SIGNAL( 'indexselected' ), self.change_current )
315 self.buttons = buttons
316 else:
317 self.buttons = []
318
320 self.treewidget.clear()
321 self.treewidget.clear_model_items()
322 self.items = items
323
324 if not items:
325 return
326
327 for item in items:
328 model_item = ModelItem( self.treewidget, [item.get_verbose_name()] )
329 self.treewidget.modelitems.append( model_item )
330
331 self.treewidget.update()
332
334 logger.debug( 'set current to %s' % text )
335 if self.currentbutton != -1:
336 button = self.buttons[self.currentbutton]
337 button.setStyleSheet( button.stylenormal )
338 button.selected = False
339 self.caption.setText( text )
340 self.currentbutton = index
341
342 def get_models_for_tree():
343 """Return pairs of (Admin, query) classes for items in the tree"""
344 if index<len(self.sections):
345 section = self.sections[index]
346 return section.get_items()
347 return []
348
349 post( get_models_for_tree, self.set_items_in_tree )
350
352 logger.debug( 'creating context menu' )
353 item = self.treewidget.itemAt( point )
354 if item:
355 self.treewidget.setCurrentItem( item )
356 self.treewidget.contextmenu.popup( self.cursor().pos() )
357
359 """pops a model window in parent's workspace"""
360 logger.debug( 'poping a window in parent' )
361 item = self.treewidget.currentItem()
362 self.parent.createMdiChild( item )
363