Ejemplo n.º 1
0
class QProjectItem(QtGui.QTreeWidgetItem):
    """
    Верхний уровень меню, проекты
    """
    def __init__(self, root, parent, name):
        QtGui.QTreeWidgetItem.__init__(self, name)
        self._disabled = False
        self.root = root
        self.wrapper = parent

    def _build_menu(self, parent):
        """
        Context menu of table item, shows with right click
        """
        self.menu = QContextMenu(parent)
        self.menu._actions((
            ('Добавить таблицу', self._addTable),
            ('Переименовать', self._rename),
            ('Удалить', self._remove),
            ('Свойства', self._props),
            ('Модули', self._plugin),
            ('Экспорт в AMF', self._amf),
        ))

        self.menuPlugins = QContextMenu('Plugins', parent)
        self.menuHg = QContextMenu('Mercurial', parent)
        self.menuHg._actions((
            ("Обновить", self._hg_update),
            ("Зафиксировать", self._hg_commit)
        ))
        try:
            pth = os.path.join(self._project.data.path, 'scripts')
            self.menuPlugins._actions([
                (i.replace('.swf', ''), self._openHtml)
                for i in os.listdir(pth) if re.match('.*\.swf$', i)
            ])
            self.branches = QContextMenu(u'Переключить ветку', parent)
            self.branches._actions(
                [(i, self._hg_branch) for i in self._project.data.branches()]
            )
            self.menuHg.addMenu(self.branches)
        except:
            pass

        self.menu.addMenu(self.menuPlugins)
        self.menu.addMenu(self.menuHg)
        self._avaibility()
        return self.menu
 

    def _disable(self):
        """
        Имитируем отключение проекта,
        если не удалось проинициализровать его базу
        """
        self.setTextColor(0, QtGui.QColor('grey'))
        self._disabled = True
        self.root._message(self._project.error)

    def _avaibility(self):
        """
        Для неактивных проектов отключаем некоторые пункты контекстного меню
        """
        if self._disabled:
            for i in (self._amf, self._plugin, self._props, self._addTable):
                self.menu.avaibility[i].setDisabled(True)
            self.menuPlugins.setDisabled(True)
            self.menuHg.setDisabled(True)        
        
    def _props(self):
        """
        Свойства проекта
        """
        dialogue = ProjectProperty(self.root, self._project)
        dialogue.exec_()

    def _remove(self):
        """
        Удаляем проект из среды
        """
        dialog = EnsureDialog(
            self.root, self,
            u'''
            Удалить проект из среды?
            Данные на жестком диске не будут удалены
            ''',
            u'Удалить проект'
        )
        if dialog.exec_() == QtGui.QDialog.Accepted:
            item = self.root.tree.currentItem()
            projectManager.delProject(item._project.name)
            self.root._update()

    def _rename(self):
        """
        Простой диалог для переименования проекта
        влияет только на отображение в дереве
        """
        dialogue = InputDialugue(
            self.root, self, u'Новое имя', self._project.name
        )
        if dialogue.exec_() == QtGui.QDialog.Accepted:
            if not dialogue._val:
                return
            self.root.window.settings.setValue(
                "proj/%s/name" % dialogue._val,
                self.root.window.settings.value(
                    "proj/%s/name" % self._project.name, self._project.name
                ).toPyObject()
            )
            self.root.window.settings.remove(
                "proj/%s/name" % self._project.name
            )
            projectManager.renameProject(self._project.name, dialogue._val)
            self.root._update()
    
    # Таблицы

    def _addTable(self):
        """
        Добавляем новую таблицу 
        """
        dialogue = TableNewDialugue(self.root, self)
        if dialogue.exec_() == QtGui.QDialog.Accepted:
            self._project.data.create(
                dialogue._name,
                **dialogue._kwargs
            )
            new = QProjectTableItem(self.root, self, [str(dialogue._name)])
            new._project = self._project
            new._table = self._project.data.table[dialogue._name]
            self.addChild(new)

    # AMF

    def _amf(self):
        """
        Экспорт содержимого базы в AMF файл
        поддерживается загрузка на удаленный сервер
        """
        dialogue = AMFDialog(self.root, self._project)
        dialogue.exec_()

    # Плагины

    def _openHtml(self):
        """
        Открываем флеш плагин на отдельной вкладке,
        Поддержка общения flash <-> js <-> JsonDB через класс WebView
        """        
        swf = '%s' % self.root.tree._caction.text()
        pth = os.path.abspath(os.path.join(
            self._project.data.path, 'scripts', '%s.swf' % swf
        ))
        self.root.tab._addTab(
            pth,
            WebView(self.root, self, pth),
            '%s ()' % swf
        )

    def _plugin(self):
        """
        Немодальное окно диалога подключаемого python-модуля
        (находятся в папке path/to/db/scripts)
        """
        dialogue = PluginDialog(self.root, self._project)
        dialogue.show()

    # Mercurial

    def _hg_update(self):
        """
        Удобный диалог для
        hg pull & hg update -C
        """
        if HgDialogue(self.root, self, 'update').exec_() == QtGui.QDialog.Accepted:
            self.root._message(u'Wait. Идет обновление дерева проектов')
            self._project._load()
            self.root._update()
            self.root._message(u'Ready')

    def _hg_commit(self):
        """
        Удобный диалог для
        hg commit & hg push
        """
        HgDialogue(self.root, self, 'commit').exec_()

    def _hg_branch(self):        
        branch = '%s' % self.root.tree._caction.text()
        self.root._message("Wait")
        self._project.data.branch(branch)
        self.root._message("Project %s updated to branch %s" % (self._project.name, branch))
        self._project._load()
        self.root._update()