def __init__(self, proj, applet=None, parent=None): QtGui.QWidget.__init__(self, parent) assert isinstance(applet, (types.NoneType, AbstractApplet)) self.__applet = applet if applet is None: restToApp = False self.__restrictedToApplet = restToApp self.__project = proj self.__widgetMap = {} #weakref.WeakKeyDictionary() self.__projToWidgets = weakref.WeakKeyDictionary() self.setContentsMargins(0,0,0,0) self.__lay = QtGui.QVBoxLayout(self) self.__lay.setContentsMargins(0,0,0,0) self.__lay.setSpacing(0) self.__toolbar = QtGui.QToolBar() self.__stack = QtGui.QStackedWidget() self.__newDataBut = QtGui.QPushButton("+") self.__browseDataBut = ComboBox() self.__browseDataBut.setIconSize(QtCore.QSize(16,16)) self.__menubar = QtGui.QMenuBar() self.__menubar.setDefaultUp(True) # -- configure the layout -- self.__lay.addWidget(self.__stack) self.__lay.addWidget(self.__toolbar) self.__newDataBut.setFixedSize(QtCore.QSize(40, self.__hh__)) self.__browseDataBut.setFixedSize(QtCore.QSize(150, self.__hh__)) self.__menubar.setFixedHeight(self.__hh__) # -- an empty widget for the bkgd -- self.__bkgd = EmptyAppletBackground(applet, self, restToApp=restToApp) self.__stack.addWidget(self.__bkgd) self.__bkgd.show() # -- configure the toolbar -- self.__toolbar.setStyleSheet("QToolBar{background-color: " +\ "qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, "+\ "stop:0 rgba(135,135,135,255), " +\ "stop:0.1 rgba(175,175,175,255), " +\ "stop:1 rgba(200, 200, 200, 255));}") self.__toolbar.setFloatable(False) self.__toolbar.setMovable(False) self.__toolbar.addWidget(self.__newDataBut) self.__toolbar.addWidget(self.__browseDataBut) self.__toolbar.addWidget(self.__menubar) # -- connect relevant stuff -- self.__newDataBut.pressed.connect(self.update_dataFac_menu) self.__browseDataBut.activated[int].connect(self.show_data_at_index) self.update_dataFac_menu() data = self.update_combo_list() if not restToApp: self.__stack.setCurrentWidget(self.__bkgd) else: if self.__browseDataBut.count() >= 1: self.__browseDataBut.setCurrentIndex(0) # -- if there is only one data that is global data # and no space toolbar or menu hide the header -- if len(data)==1 and isinstance(data[0][0], GlobalData) and \ len(self.__toolbar.actions()) == 2 and self.__restrictedToApplet: self.__toolbar.hide() AppletFactoryManager().applet_created.emit(self)
class AppletSpace(QtGui.QWidget): # -- PROPERTIES -- name = property(lambda x:x.__applet.name if x.__applet else "uknown") project = property(lambda x:x.__project) # -- NONE API ATTRIBUTES -- __hh__ = 22 # header content height def __init__(self, proj, applet=None, parent=None): QtGui.QWidget.__init__(self, parent) assert isinstance(applet, (types.NoneType, AbstractApplet)) self.__applet = applet if applet is None: restToApp = False self.__restrictedToApplet = restToApp self.__project = proj self.__widgetMap = {} #weakref.WeakKeyDictionary() self.__projToWidgets = weakref.WeakKeyDictionary() self.setContentsMargins(0,0,0,0) self.__lay = QtGui.QVBoxLayout(self) self.__lay.setContentsMargins(0,0,0,0) self.__lay.setSpacing(0) self.__toolbar = QtGui.QToolBar() self.__stack = QtGui.QStackedWidget() self.__newDataBut = QtGui.QPushButton("+") self.__browseDataBut = ComboBox() self.__browseDataBut.setIconSize(QtCore.QSize(16,16)) self.__menubar = QtGui.QMenuBar() self.__menubar.setDefaultUp(True) # -- configure the layout -- self.__lay.addWidget(self.__stack) self.__lay.addWidget(self.__toolbar) self.__newDataBut.setFixedSize(QtCore.QSize(40, self.__hh__)) self.__browseDataBut.setFixedSize(QtCore.QSize(150, self.__hh__)) self.__menubar.setFixedHeight(self.__hh__) # -- an empty widget for the bkgd -- self.__bkgd = EmptyAppletBackground(applet, self, restToApp=restToApp) self.__stack.addWidget(self.__bkgd) self.__bkgd.show() # -- configure the toolbar -- self.__toolbar.setStyleSheet("QToolBar{background-color: " +\ "qlineargradient(spread:pad, x1:0, y1:1, x2:0, y2:0, "+\ "stop:0 rgba(135,135,135,255), " +\ "stop:0.1 rgba(175,175,175,255), " +\ "stop:1 rgba(200, 200, 200, 255));}") self.__toolbar.setFloatable(False) self.__toolbar.setMovable(False) self.__toolbar.addWidget(self.__newDataBut) self.__toolbar.addWidget(self.__browseDataBut) self.__toolbar.addWidget(self.__menubar) # -- connect relevant stuff -- self.__newDataBut.pressed.connect(self.update_dataFac_menu) self.__browseDataBut.activated[int].connect(self.show_data_at_index) self.update_dataFac_menu() data = self.update_combo_list() if not restToApp: self.__stack.setCurrentWidget(self.__bkgd) else: if self.__browseDataBut.count() >= 1: self.__browseDataBut.setCurrentIndex(0) # -- if there is only one data that is global data # and no space toolbar or menu hide the header -- if len(data)==1 and isinstance(data[0][0], GlobalData) and \ len(self.__toolbar.actions()) == 2 and self.__restrictedToApplet: self.__toolbar.hide() AppletFactoryManager().applet_created.emit(self) @project.setter def project(self, proj): assert isinstance(proj, Project) projWidgets = self.__projToWidgets.get(self.__project, []) for w in projWidgets: self.__stack.removeWidget(w) self.__project = proj self.__menubar.clear() self.__widgetMap.clear() self.__projToWidgets.clear() self.update_combo_list() def supports(self, data): if not self.__restrictedToApplet: return True else: return data.mimetype in self.__applet.mimetypes def add_content(self, data, content): content = content.widget self.__stack.addWidget(content) index = self.__browseDataBut.findText(data.name) self.__browseDataBut.setCurrentIndex(index) self.__stack.setCurrentWidget(content) def update_dataFac_menu(self): menu = QtGui.QMenu(self.__newDataBut) if not self.__restrictedToApplet: dataFacs = [f for f in DataFactoryManager().gather_items().itervalues() \ if not f.singleton] else: dataFacs = self.__applet.get_data_types() dataFacs.sort(cmp = lambda x,y:cmp(x.name, y.name)) for dt in dataFacs: action = menu.addAction(dt.icon, dt.name) action.setIconVisibleInMenu(True) func = self.__make_dataFac_handler(dt) action.triggered.connect(func) self.__newDataBut.setMenu(menu) def update_combo_list(self): proj = self.__project self.__browseDataBut.blockSignals(True) currentText = self.__browseDataBut.currentText() self.__browseDataBut.clear() if not self.__restrictedToApplet: mimetypes = [f.created_mimetype for f in \ DataFactoryManager().gather_items().itervalues()] else: mimetypes = self.__applet.get_mimetypes() data = [(datum,proj) for k, datum in proj if datum.mimetype in mimetypes] for dp in data: if dp[0].hidden: continue self.__browseDataBut.addItem(dp[0].icon, dp[0].name, to_qvariant(dp)) self.__browseDataBut.insertSeparator(self.__browseDataBut.count()) globalProj = GlobalDataManager() globalData = [(datum, globalProj) for k, datum in globalProj \ if datum.mimetype in mimetypes] for dp in globalData: if dp[0].hidden: continue self.__browseDataBut.addItem(dp[0].icon, dp[0].name, to_qvariant(dp)) index = self.__browseDataBut.findText(currentText) self.__browseDataBut.setCurrentIndex(index) self.__browseDataBut.blockSignals(False) return data def __make_dataFac_handler(self, dataFac): def on_dataFac_chosen(checked): data = dataFac._new_0() self.show_data(data) return on_dataFac_chosen def show_data(self, data): self.update_combo_list() index = self.__browseDataBut.findText(data.name) if index > -1: #-1 is not found # : calls show_data_at_index by the signals self.__browseDataBut.setCurrentIndex(index) def show_data_at_index(self, index): itemData = self.__browseDataBut.itemData(index) if not itemData: return data, proj = itemData # NO_SPACE_CONTENT_TRACKING # content = proj.get_data_property(data, "spaceContent") content = self.__widgetMap.get(data) if not content: if not self.__restrictedToApplet: appFac = DataEditorSelector.mime_type_handler([data.mimetype]) content = appFac._create_space_content_0(data) else: content = self.__applet._create_space_content_0(data) self.__widgetMap[data]=content if content is None: print "Applet", self.name, "returned None content" widget = content.widget self.__projToWidgets.setdefault( proj, set() ).add(widget) self.__menubar.clear() for menu in content.menus: self.__menubar.addMenu(menu) if not self.__stack.indexOf(widget)>-1: self.__stack.addWidget(widget) self.__stack.setCurrentWidget(widget)