From 7cb05b98f22e5b51eb6d39aa04b8521f3d443bba Mon Sep 17 00:00:00 2001 From: Olivier Keshavjee Date: Tue, 9 Jun 2015 14:03:22 +0200 Subject: [PATCH] Adds: labels (not yet editable) --- src/enums.py | 18 ++++---- src/mainWindow.py | 20 +++++++++ src/ui/cmbOutlineLabelChoser.py | 48 +++++++++++++++++++++ src/ui/cmbOutlinePersoChoser.py | 1 + src/ui/mainWindow.py | 41 ++++++++++++++---- src/ui/mainWindow.ui | 47 +++++++++++++++++--- src/ui/views/outlineView.py | 12 +++++- src/ui/views/treeOutlineDelegates.py | 64 ++++++++++++++++++++++++++-- test_project/labels.xml | 32 ++++++++++++++ test_project/outline.xml | 6 +-- 10 files changed, 257 insertions(+), 32 deletions(-) create mode 100644 src/ui/cmbOutlineLabelChoser.py create mode 100644 test_project/labels.xml diff --git a/src/enums.py b/src/enums.py index 96b2c66c..103e62d1 100644 --- a/src/enums.py +++ b/src/enums.py @@ -33,12 +33,14 @@ class Outline(Enum): summaryFull = 4 POV = 5 notes = 6 - status = 7 - compile = 8 - text = 9 - wordCount = 10 - goal = 11 - goalPercentage = 12 - setGoal = 13 # The goal set by the user, if any. Can be different from goal which can be computed + label = 7 + status = 8 + compile = 9 + text = 10 + wordCount = 11 + goal = 12 + goalPercentage = 13 + setGoal = 14 # The goal set by the user, if any. Can be different from goal which can be computed # (sum of all sub-items' goals) - textFormat = 14 + textFormat = 15 + diff --git a/src/mainWindow.py b/src/mainWindow.py index 8d865581..e41ddafa 100644 --- a/src/mainWindow.py +++ b/src/mainWindow.py @@ -134,10 +134,25 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.lstPersos.selectionModel().currentChanged.connect(self.changeCurrentPerso) self.tabPersos.currentChanged.connect(self.resizePersosInfos) + # Labels + self.mdlLabels = QStandardItemModel() + for color, text in [ + (Qt.transparent, ""), + (Qt.yellow, "Idea"), + (Qt.green, "Note"), + (Qt.blue, "Chapter"), + (Qt.red, "Scene") + ]: + px = QPixmap(32, 32) + px.fill(color) + self.mdlLabels.appendRow(QStandardItem(QIcon(px), text)) + + # Outline self.mdlOutline = outlineModel() self.treeRedacOutline.setModel(self.mdlOutline) self.treePlanOutline.setModelPersos(self.mdlPersos) + self.treePlanOutline.setModelLabels(self.mdlLabels) self.treePlanOutline.setModel(self.mdlOutline) self.cmbPlanPOV.setModels(self.mdlPersos, self.mdlOutline) @@ -166,6 +181,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.btnPlanRemoveItem.clicked.connect(self.outlineRemoveItems) self.cmbRedacPOV.setModels(self.mdlPersos, self.mdlOutline) + self.cmbRedacLabel.setModels(self.mdlLabels, self.mdlOutline) self.cmbRedacStatus.setModel(self.mdlOutline) #self.chkRedacCompile.setModel(self.mdlOutline) @@ -184,6 +200,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.treeRedacOutline.selectionModel().currentChanged.connect(lambda idx: self.mprOutline.setRootIndex(idx.parent())) self.treeRedacOutline.selectionModel().currentChanged.connect(self.mprOutline.setCurrentModelIndex) self.treeRedacOutline.selectionModel().currentChanged.connect(self.cmbRedacPOV.setCurrentModelIndex) + self.treeRedacOutline.selectionModel().currentChanged.connect(self.cmbRedacLabel.setCurrentModelIndex) self.treeRedacOutline.selectionModel().currentChanged.connect(self.cmbRedacStatus.setCurrentModelIndex) self.treeRedacOutline.selectionModel().currentChanged.connect(self.chkRedacCompile.setCurrentModelIndex) self.treeRedacOutline.selectionModel().currentChanged.connect(self.redacEditor.setCurrentModelIndex) @@ -208,6 +225,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.tblDebugPersos.setModel(self.mdlPersos) self.tblDebugPersosInfos.setModel(self.mdlPersosInfos) self.treeDebugOutline.setModel(self.mdlOutline) + self.lstDebugLabels.setModel(self.mdlLabels) # Playing with qStyle self.cmbStyle.addItems(list(QStyleFactory.keys())) @@ -328,6 +346,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): loadStandardItemModelXML(self.mdlFlatData, "{}/flatModel.xml".format(project)) loadStandardItemModelXML(self.mdlPersos, "{}/perso.xml".format(project)) loadStandardItemModelXML(self.mdlPersosInfos, "{}/persoInfos.xml".format(project)) + loadStandardItemModelXML(self.mdlLabels, "{}/labels.xml".format(project)) self.mdlOutline.loadFromXML("{}/outline.xml".format(project)) # Stuff @@ -352,6 +371,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): saveStandardItemModelXML(self.mdlFlatData, "{}/flatModel.xml".format(self.currentProject)) saveStandardItemModelXML(self.mdlPersos, "{}/perso.xml".format(self.currentProject)) saveStandardItemModelXML(self.mdlPersosInfos, "{}/persoInfos.xml".format(self.currentProject)) + saveStandardItemModelXML(self.mdlLabels, "{}/labels.xml".format(self.currentProject)) self.mdlOutline.saveToXML("{}/outline.xml".format(self.currentProject)) # closeEvent diff --git a/src/ui/cmbOutlineLabelChoser.py b/src/ui/cmbOutlineLabelChoser.py new file mode 100644 index 00000000..932ad78c --- /dev/null +++ b/src/ui/cmbOutlineLabelChoser.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python +#--!-- coding: utf8 --!-- + + + + +from qt import * +from enums import * + +class cmbOutlineLabelChoser(QComboBox): + + def __init__(self, parent=None): + QComboBox.__init__(self, parent) + self.activated[int].connect(self.changed) + self.currentModelIndex = None + + def setModels(self, mdlLabels, mdlOutline): + self.mdlLabels = mdlLabels + self.mdlLabels.dataChanged.connect(self.updateItems) + self.mdlOutline = mdlOutline + self.mdlOutline.dataChanged.connect(self.updateSelectedItem) + self.updateItems() + + def updateSelectedItem(self, idx1=None, idx2=None): + if not self.currentModelIndex or not self.currentModelIndex.isValid(): + self.setCurrentIndex(0) + else: + val = self.currentModelIndex.internalPointer().data(Outline.label.value) + if not val: val = 0 + self.setCurrentIndex(int(val)) + + def changed(self, idx): + if self.currentModelIndex: + modelIndex = self.mdlOutline.index(self.currentModelIndex.row(), Outline.label.value, self.currentModelIndex.parent()) + self.mdlOutline.setData(modelIndex, self.currentIndex()) + + def setCurrentModelIndex(self, idx): + self.currentModelIndex = idx + self.updateSelectedItem() + + def updateItems(self): + self.clear() + for i in range(self.mdlLabels.rowCount()): + self.addItem(self.mdlLabels.item(i, 0).icon(), + self.mdlLabels.item(i, 0).text()) + + if self.currentModelIndex: + self.updateSelectedItem() \ No newline at end of file diff --git a/src/ui/cmbOutlinePersoChoser.py b/src/ui/cmbOutlinePersoChoser.py index 2077aa71..a763099c 100644 --- a/src/ui/cmbOutlinePersoChoser.py +++ b/src/ui/cmbOutlinePersoChoser.py @@ -19,6 +19,7 @@ class cmbOutlinePersoChoser(QComboBox): self.mdlPersos.dataChanged.connect(self.updateItems) self.mdlOutline = mdlOutline self.mdlOutline.dataChanged.connect(self.updateSelectedItem) + self.updateItems() def updateSelectedItem(self, idx1=None, idx2=None): if not self.currentModelIndex or not self.currentModelIndex.isValid(): diff --git a/src/ui/mainWindow.py b/src/ui/mainWindow.py index 481e36fa..cd722755 100644 --- a/src/ui/mainWindow.py +++ b/src/ui/mainWindow.py @@ -958,14 +958,14 @@ class Ui_MainWindow(object): self.formLayout_5.setWidget(1, QtWidgets.QFormLayout.FieldRole, self.cmbRedacStatus) self.label_32 = QtWidgets.QLabel(self.groupBox_4) self.label_32.setObjectName("label_32") - self.formLayout_5.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_32) + self.formLayout_5.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_32) self.chkRedacCompile = chkOutlineCompile(self.groupBox_4) self.chkRedacCompile.setText("") self.chkRedacCompile.setObjectName("chkRedacCompile") - self.formLayout_5.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.chkRedacCompile) + self.formLayout_5.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.chkRedacCompile) self.label_29 = QtWidgets.QLabel(self.groupBox_4) self.label_29.setObjectName("label_29") - self.formLayout_5.setWidget(3, QtWidgets.QFormLayout.LabelRole, self.label_29) + self.formLayout_5.setWidget(4, QtWidgets.QFormLayout.LabelRole, self.label_29) self.txtRedacGoal = QtWidgets.QLineEdit(self.groupBox_4) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) @@ -976,7 +976,19 @@ class Ui_MainWindow(object): self.txtRedacGoal.setStyleSheet("border-radius: 6px;") self.txtRedacGoal.setFrame(False) self.txtRedacGoal.setObjectName("txtRedacGoal") - self.formLayout_5.setWidget(3, QtWidgets.QFormLayout.FieldRole, self.txtRedacGoal) + self.formLayout_5.setWidget(4, QtWidgets.QFormLayout.FieldRole, self.txtRedacGoal) + self.label_33 = QtWidgets.QLabel(self.groupBox_4) + self.label_33.setObjectName("label_33") + self.formLayout_5.setWidget(2, QtWidgets.QFormLayout.LabelRole, self.label_33) + self.cmbRedacLabel = cmbOutlineLabelChoser(self.groupBox_4) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Fixed) + sizePolicy.setHorizontalStretch(0) + sizePolicy.setVerticalStretch(0) + sizePolicy.setHeightForWidth(self.cmbRedacLabel.sizePolicy().hasHeightForWidth()) + self.cmbRedacLabel.setSizePolicy(sizePolicy) + self.cmbRedacLabel.setFrame(False) + self.cmbRedacLabel.setObjectName("cmbRedacLabel") + self.formLayout_5.setWidget(2, QtWidgets.QFormLayout.FieldRole, self.cmbRedacLabel) self.verticalLayout_20.addWidget(self.groupBox_4) self.groupBox_5 = collapsibleGroupBox2(self.tab_17) self.groupBox_5.setFlat(True) @@ -1078,6 +1090,14 @@ class Ui_MainWindow(object): self.treeDebugOutline.setObjectName("treeDebugOutline") self.horizontalLayout_32.addWidget(self.treeDebugOutline) self.tabWidget.addTab(self.tab_20, "") + self.tab = QtWidgets.QWidget() + self.tab.setObjectName("tab") + self.horizontalLayout = QtWidgets.QHBoxLayout(self.tab) + self.horizontalLayout.setObjectName("horizontalLayout") + self.lstDebugLabels = QtWidgets.QListView(self.tab) + self.lstDebugLabels.setObjectName("lstDebugLabels") + self.horizontalLayout.addWidget(self.lstDebugLabels) + self.tabWidget.addTab(self.tab, "") self.verticalLayout_29.addWidget(self.tabWidget) self.tabMain.addTab(self.lytTabDebug, "") self.horizontalLayout_2.addWidget(self.tabMain) @@ -1153,14 +1173,14 @@ class Ui_MainWindow(object): self.menubar.addAction(self.menuTools.menuAction()) self.retranslateUi(MainWindow) - self.tabMain.setCurrentIndex(5) + self.tabMain.setCurrentIndex(6) self.tabSummary.setCurrentIndex(0) self.tabPersos.setCurrentIndex(0) self.tabPlot.setCurrentIndex(0) self.comboBox_2.setCurrentIndex(0) self.stkPlotSummary.setCurrentIndex(1) self.tabRedacInfos.setCurrentIndex(0) - self.tabWidget.setCurrentIndex(3) + self.tabWidget.setCurrentIndex(4) self.pushButton_16.toggled['bool'].connect(self.plainTextEdit_7.setVisible) self.btnPlotShowSummary.toggled['bool'].connect(self.grpPlotSummary.setVisible) self.comboBox_2.currentIndexChanged['int'].connect(self.stkPlotSummary.setCurrentIndex) @@ -1286,6 +1306,7 @@ class Ui_MainWindow(object): self.label_32.setText(_translate("MainWindow", "Compile")) self.label_29.setText(_translate("MainWindow", "Goal")) self.txtRedacGoal.setPlaceholderText(_translate("MainWindow", "Word count")) + self.label_33.setText(_translate("MainWindow", "Label")) self.groupBox_5.setTitle(_translate("MainWindow", "Scene summary")) self.txtRedacSummarySentance.setPlaceholderText(_translate("MainWindow", "One line scene summary")) self.groupBox_6.setTitle(_translate("MainWindow", "Notes")) @@ -1309,6 +1330,7 @@ class Ui_MainWindow(object): self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_10), _translate("MainWindow", "Persos")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_16), _translate("MainWindow", "Perso Infos")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_20), _translate("MainWindow", "Outline")) + self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Labels")) self.tabMain.setTabText(self.tabMain.indexOf(self.lytTabDebug), _translate("MainWindow", "Debug")) self.menu_Fichier.setTitle(_translate("MainWindow", "File")) self.menuMode.setTitle(_translate("MainWindow", "Mode")) @@ -1332,11 +1354,12 @@ class Ui_MainWindow(object): self.actSpellcheck.setText(_translate("MainWindow", "Spellcheck")) self.actSpellcheck.setShortcut(_translate("MainWindow", "F8")) +from ui.views.outlineView import outlineView from ui.views.treeView import treeView from ui.chkOutlineCompile import chkOutlineCompile -from ui.editors.editorWidget import editorWidget -from ui.collapsibleGroupBox2 import collapsibleGroupBox2 from ui.cmbOutlinePersoChoser import cmbOutlinePersoChoser +from ui.cmbOutlineLabelChoser import cmbOutlineLabelChoser +from ui.collapsibleGroupBox2 import collapsibleGroupBox2 +from ui.editors.editorWidget import editorWidget from ui.cmbOutlineStatusChoser import cmbOutlineStatusChoser -from ui.views.outlineView import outlineView from ui.sldImportance import sldImportance diff --git a/src/ui/mainWindow.ui b/src/ui/mainWindow.ui index 76f6f246..770e89c6 100644 --- a/src/ui/mainWindow.ui +++ b/src/ui/mainWindow.ui @@ -18,7 +18,7 @@ - 5 + 6 true @@ -1887,28 +1887,28 @@ - + Compile - + - + Goal - + @@ -1930,6 +1930,26 @@ + + + + Label + + + + + + + + 0 + 0 + + + + false + + + @@ -2062,7 +2082,7 @@ QTabWidget::West - 3 + 4 @@ -2112,6 +2132,16 @@ + + + Labels + + + + + + + @@ -2337,6 +2367,11 @@ QTreeView
ui.views.treeView.h
+ + cmbOutlineLabelChoser + QComboBox +
ui.cmbOutlineLabelChoser.h
+
diff --git a/src/ui/views/outlineView.py b/src/ui/views/outlineView.py index 3efa3c84..0fa4e7bb 100644 --- a/src/ui/views/outlineView.py +++ b/src/ui/views/outlineView.py @@ -12,16 +12,21 @@ from ui.views.dndView import * class outlineView(QTreeView, dndView): - def __init__(self, parent=None, modelPersos=None): + def __init__(self, parent=None, modelPersos=None, modelLabels=None): QTreeView.__init__(self, parent) dndView.__init__(self) self.modelPersos = modelPersos + self.modelLabels = modelLabels self.header().setStretchLastSection(False) def setModelPersos(self, model): # This is used by treeOutlinePersoDelegate to select character self.modelPersos = model + def setModelLabels(self, model): + # This is used by treeOutlineLabelDelegate to display labels + self.modelLabels = model + def setModel(self, model): QTreeView.setModel(self, model) @@ -34,12 +39,15 @@ class outlineView(QTreeView, dndView): self.setItemDelegateForColumn(Outline.status.value, self.treePlanOutlineStatusDelegate) self.treePlanOutlineGoalPercentageDelegate = treeOutlineGoalPercentageDelegate() self.setItemDelegateForColumn(Outline.goalPercentage.value, self.treePlanOutlineGoalPercentageDelegate) + self.treePlanOutlineLabelDelegate = treeOutlineLabelDelegate(self.modelLabels) + self.setItemDelegateForColumn(Outline.label.value, self.treePlanOutlineLabelDelegate) # Hiding columns for c in range(1, self.model().columnCount()): self.hideColumn(c) for c in [Outline.POV.value, Outline.status.value, Outline.compile.value, - Outline.wordCount.value, Outline.goal.value, Outline.goalPercentage.value]: + Outline.wordCount.value, Outline.goal.value, Outline.goalPercentage.value, + Outline.label.value]: self.showColumn(c) self.header().setSectionResizeMode(Outline.title.value, QHeaderView.Stretch) diff --git a/src/ui/views/treeOutlineDelegates.py b/src/ui/views/treeOutlineDelegates.py index 591354ec..6439ee9e 100644 --- a/src/ui/views/treeOutlineDelegates.py +++ b/src/ui/views/treeOutlineDelegates.py @@ -1,13 +1,11 @@ #!/usr/bin/env python #--!-- coding: utf8 --!-- - - - from qt import * from enums import * from functions import * + class treeOutlinePersoDelegate(QStyledItemDelegate): def __init__(self, mdlPersos, parent=None): @@ -39,6 +37,7 @@ class treeOutlinePersoDelegate(QStyledItemDelegate): editor.setItemData(i+1, self.mdlPersos.item(i, Perso.name.value).text(), Qt.ToolTipRole) editor.setCurrentIndex(editor.findData(index.data())) + editor.showPopup() def setModelData(self, editor, model, index): val = editor.currentData() @@ -50,6 +49,7 @@ class treeOutlinePersoDelegate(QStyledItemDelegate): return self.mdlPersos.item(i, Perso.name.value).text() return "" + class treeOutlineCompileDelegate(QStyledItemDelegate): def __init__(self, parent=None): @@ -58,6 +58,7 @@ class treeOutlineCompileDelegate(QStyledItemDelegate): def displayText(self, value, locale): return "" + class treeOutlineGoalPercentageDelegate(QStyledItemDelegate): def __init__(self, rootIndex=None, parent=None): QStyledItemDelegate.__init__(self, parent) @@ -109,6 +110,7 @@ class treeOutlineGoalPercentageDelegate(QStyledItemDelegate): def displayText(self, value, locale): return "" + class treeOutlineStatusDelegate(QStyledItemDelegate): def __init__(self, parent=None): @@ -131,7 +133,61 @@ class treeOutlineStatusDelegate(QStyledItemDelegate): for status in statuses: editor.addItem(status) editor.setCurrentIndex(editor.findText(index.data())) + editor.showPopup() def setModelData(self, editor, model, index): val = editor.currentText() - model.setData(index, val) \ No newline at end of file + model.setData(index, val) + + +class treeOutlineLabelDelegate(QStyledItemDelegate): + + def __init__(self, mdlLabels, parent=None): + QStyledItemDelegate.__init__(self, parent) + self.mdlLabels = mdlLabels + + #def sizeHint(self, option, index): + #s = QStyledItemDelegate.sizeHint(self, option, index) + #if s.width() > 200: + #s.setWidth(200) + #elif s.width() < 100: + #s.setWidth(100) + #return s + QSize(18, 0) + + def createEditor(self, parent, option, index): + item = index.internalPointer() + editor = QComboBox(parent) + editor.setAutoFillBackground(True) + editor.setFrame(False) + return editor + + def setEditorData(self, editor, index): + for i in range(self.mdlLabels.rowCount()): + editor.addItem(self.mdlLabels.item(i, 0).icon(), + self.mdlLabels.item(i, 0).text()) + + val = index.internalPointer().data(Outline.label.value) + if not val: val = 0 + editor.setCurrentIndex(int(val)) + editor.showPopup() + + def setModelData(self, editor, model, index): + val = editor.currentIndex() + model.setData(index, val) + + def paint(self, painter, option, index): + if not index.isValid(): + return QStyledItemDelegate.paint(self, painter, option, index) + else: + item = index.internalPointer() + + d = item.data(index.column(), Qt.DisplayRole) + if not d: + d = 0 + + lbl = self.mdlLabels.item(int(d), 0) + opt = QStyleOptionViewItem(option) + self.initStyleOption(opt, self.mdlLabels.indexFromItem(lbl)) + + qApp.style().drawControl(QStyle.CE_ItemViewItem, opt, painter) + \ No newline at end of file diff --git a/test_project/labels.xml b/test_project/labels.xml new file mode 100644 index 00000000..5c9b07c8 --- /dev/null +++ b/test_project/labels.xml @@ -0,0 +1,32 @@ + + +
+ + + + +
+ + + + + + Idea + + + Note + + + Chapter + + + Scene + + +
diff --git a/test_project/outline.xml b/test_project/outline.xml index 0d1d77f9..23877b8e 100644 --- a/test_project/outline.xml +++ b/test_project/outline.xml @@ -37,7 +37,7 @@ - + @@ -54,7 +54,7 @@ - - + +