diff --git a/src/mainWindow.py b/src/mainWindow.py index bafc540b..5a8e070f 100644 --- a/src/mainWindow.py +++ b/src/mainWindow.py @@ -166,7 +166,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.treePlanOutline.setModel(self.mdlOutline) self.cmbPlanPOV.setModels(self.mdlPersos, self.mdlOutline) - + self.redacEditor.setModel(self.mdlOutline) + self.mprPlan = QDataWidgetMapper() self.mprPlan.setModel(self.mdlOutline) mapping = [ @@ -214,15 +215,16 @@ class MainWindow(QMainWindow, Ui_MainWindow): 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) + #self.treeRedacOutline.selectionModel().currentChanged.connect(self.redacEditor.setCurrentModelIndex) + self.treeRedacOutline.selectionModel().selectionChanged.connect(self.redacEditor.setView) self.treeRedacOutline.selectionModel().currentChanged.connect(self.redacEditor.txtRedacText.setCurrentModelIndex) self.tabMain.currentChanged.connect(self.mprOutline.submit) - self.treeRedacOutline.selectionModel().currentChanged.connect(self.outlineSelectionChanged) - self.treeRedacOutline.selectionModel().currentChanged.connect(self.outlineSelectionChanged) - self.treePlanOutline.selectionModel().currentChanged.connect(self.outlineSelectionChanged) - self.treePlanOutline.selectionModel().currentChanged.connect(self.outlineSelectionChanged) + self.treeRedacOutline.selectionModel().selectionChanged.connect(self.outlineSelectionChanged) + self.treeRedacOutline.selectionModel().selectionChanged.connect(self.outlineSelectionChanged) + self.treePlanOutline.selectionModel().selectionChanged.connect(self.outlineSelectionChanged) + self.treePlanOutline.selectionModel().selectionChanged.connect(self.outlineSelectionChanged) self.sldCorkSizeFactor.valueChanged.connect(self.redacEditor.setCorkSizeFactor) self.btnRedacFolderCork.toggled.connect(self.sldCorkSizeFactor.setVisible) @@ -256,12 +258,21 @@ class MainWindow(QMainWindow, Ui_MainWindow): # OUTLINE # #################################################################################################### - def outlineSelectionChanged(self, idx): - if idx.isValid(): - self.btnRedacFolderText.setHidden(not idx.internalPointer().isFolder()) - self.btnRedacFolderCork.setHidden(not idx.internalPointer().isFolder()) - self.btnRedacFolderOutline.setHidden(not idx.internalPointer().isFolder()) - self.sldCorkSizeFactor.setHidden(not idx.internalPointer().isFolder()) + def outlineSelectionChanged(self): + if len(self.treeRedacOutline.selectionModel().selection().indexes()) == 0: + hidden = False + else: + idx = self.treeRedacOutline.currentIndex() + if idx.isValid(): + hidden = not idx.internalPointer().isFolder() + else: + hidden = False + + + self.btnRedacFolderText.setHidden(hidden) + self.btnRedacFolderCork.setHidden(hidden) + self.btnRedacFolderOutline.setHidden(hidden) + self.sldCorkSizeFactor.setHidden(hidden) def outlineRemoveItems(self): for idx in self.treeRedacOutline.selectedIndexes(): diff --git a/src/ui/editors/editorWidget.py b/src/ui/editors/editorWidget.py index c515c0ec..96faf90e 100644 --- a/src/ui/editors/editorWidget.py +++ b/src/ui/editors/editorWidget.py @@ -18,7 +18,7 @@ class editorWidget(QWidget, Ui_editorWidget_ui): def __init__(self, parent=None): QWidget.__init__(self, parent) self.setupUi(self) - self.currentIndex = None + self.currentIndex = QModelIndex() self.txtEdits = [] self.scroll.setBackgroundRole(QPalette.Base) self.toggledSpellcheck.connect(self.txtRedacText.toggleSpellcheck) @@ -27,6 +27,10 @@ class editorWidget(QWidget, Ui_editorWidget_ui): self.spellcheck = True self.folderView = "cork" + def setModel(self, model): + self._model = model + self.setView() + def setFolderView(self, v): oldV = self.folderView if v == "cork": @@ -42,113 +46,126 @@ class editorWidget(QWidget, Ui_editorWidget_ui): def setCorkSizeFactor(self, v): self.corkView.itemDelegate().setCorkSizeFactor(v) r = self.corkView.rootIndex() - for c in range(r.row()): + + if r.isValid(): + count = r.internalPointer().childCount() + else: + count = self._model.rootItem.childCount() + + for c in range(count): self.corkView.itemDelegate().sizeHintChanged.emit(r.child(c, 0)) - def setCurrentModelIndex(self, index): + def setView(self): + index = mainWindow().treeRedacOutline.currentIndex() - if index.isValid(): - - self.currentIndex = index - self._model = index.model() - + # Couting the number of other selected items + sel = [] + for i in mainWindow().treeRedacOutline.selectionModel().selection().indexes(): + if i.column() != 0: continue + if i not in sel: sel.append(i) + + if len(sel) != 0: item = index.internalPointer() + else: + index = QModelIndex() + item = self._model.rootItem - # Couting the number of selected items - sel = [index] - for i in mainWindow().treeRedacOutline.selectionModel().selection().indexes(): - if i.column() != 0: continue - if i not in sel: sel.append(i) + def addTitle(itm): + edt = customTextEdit(self, html="{t}".format(l=min(itm.level()+1, 5), t=itm.title()), autoResize=True) + edt.setFrameShape(QFrame.NoFrame) + self.txtEdits.append(edt) + l.addWidget(edt) + + def addLine(): + line = QFrame(self.scene) + line.setFrameShape(QFrame.HLine) + line.setFrameShadow(QFrame.Sunken) + l.addWidget(line) + + def addScene(itm): + edt = customTextEdit(self, index=itm.index(), spellcheck=self.spellcheck, dict=self.currentDict, autoResize=True) + edt.setFrameShape(QFrame.NoFrame) + edt.setStatusTip(itm.path()) + self.toggledSpellcheck.connect(edt.toggleSpellcheck) + self.dictChanged.connect(edt.setDict) + #edt.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) + self.txtEdits.append(edt) + l.addWidget(edt) + + def addChildren(itm): + for c in range(itm.childCount()): + child = itm.child(c) - def addTitle(itm): - edt = customTextEdit(self, html="{t}".format(l=min(itm.level()+1, 5), t=itm.title()), autoResize=True) - edt.setFrameShape(QFrame.NoFrame) - self.txtEdits.append(edt) - l.addWidget(edt) - - def addLine(): - line = QFrame(self.scene) - line.setFrameShape(QFrame.HLine) - line.setFrameShadow(QFrame.Sunken) - l.addWidget(line) - - def addScene(itm): - edt = customTextEdit(self, index=itm.index(), spellcheck=self.spellcheck, dict=self.currentDict, autoResize=True) - edt.setFrameShape(QFrame.NoFrame) - edt.setStatusTip(itm.path()) - self.toggledSpellcheck.connect(edt.toggleSpellcheck) - self.dictChanged.connect(edt.setDict) - #edt.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) - self.txtEdits.append(edt) - l.addWidget(edt) - - def addChildren(itm): - for c in range(itm.childCount()): - child = itm.child(c) + if child.isFolder(): + addTitle(child) + addChildren(child) - if child.isFolder(): - addTitle(child) - addChildren(child) - - else: - addScene(child) - addLine() - - def addSpacer(): - l.addItem(QSpacerItem(10, 1000, QSizePolicy.Minimum, QSizePolicy.Expanding)) - - # Display multiple selected items - if len(sel) > 1 and False: # Buggy and not very useful, skip - self.stack.setCurrentIndex(1) - w = QWidget() - l = QVBoxLayout(w) - self.txtEdits = [] - for idx in sel: - sItem = idx.internalPointer() - addTitle(sItem) - if sItem.isFolder(): - addChildren(sItem) - else: - addScene(sItem) + else: + addScene(child) addLine() - addSpacer() - self.scroll.setWidget(w) - - elif item.isFolder() and self.folderView == "text": - self.stack.setCurrentIndex(1) - - w = QWidget() - l = QVBoxLayout(w) - #self.scroll.setWidgetResizable(False) - - self.txtEdits = [] - - addTitle(item) - addChildren(item) - addSpacer() - self.scroll.setWidget(w) - - elif item.isFolder() and self.folderView == "cork": - self.stack.setCurrentIndex(2) - self.corkView.setModel(self._model) - self.corkView.setRootIndex(self.currentIndex) - - elif item.isFolder() and self.folderView == "outline": - self.stack.setCurrentIndex(3) - self.outlineView.setModelPersos(mainWindow().mdlPersos) - self.outlineView.setModelLabels(mainWindow().mdlLabels) - self.outlineView.setModelStatus(mainWindow().mdlStatus) - self.outlineView.setModel(self._model) - self.outlineView.setRootIndex(self.currentIndex) - - else: - self.stack.setCurrentIndex(0) + + def addSpacer(): + l.addItem(QSpacerItem(10, 1000, QSizePolicy.Minimum, QSizePolicy.Expanding)) - self._model.dataChanged.connect(self.modelDataChanged) - self.updateStatusBar() + # Display multiple selected items + if len(sel) > 1 and False: # Buggy and not very useful, skip + self.stack.setCurrentIndex(1) + w = QWidget() + l = QVBoxLayout(w) + self.txtEdits = [] + for idx in sel: + sItem = idx.internalPointer() + addTitle(sItem) + if sItem.isFolder(): + addChildren(sItem) + else: + addScene(sItem) + addLine() + addSpacer() + self.scroll.setWidget(w) + + elif item.isFolder() and self.folderView == "text": + self.stack.setCurrentIndex(1) + + w = QWidget() + l = QVBoxLayout(w) + #self.scroll.setWidgetResizable(False) + + self.txtEdits = [] + + addTitle(item) + addChildren(item) + addSpacer() + self.scroll.setWidget(w) + + elif item.isFolder() and self.folderView == "cork": + self.stack.setCurrentIndex(2) + self.corkView.setModel(self._model) + self.corkView.setRootIndex(index) + + elif item.isFolder() and self.folderView == "outline": + self.stack.setCurrentIndex(3) + self.outlineView.setModelPersos(mainWindow().mdlPersos) + self.outlineView.setModelLabels(mainWindow().mdlLabels) + self.outlineView.setModelStatus(mainWindow().mdlStatus) + self.outlineView.setModel(self._model) + self.outlineView.setRootIndex(index) else: - self.currentIndex = None + self.stack.setCurrentIndex(0) + + self._model.dataChanged.connect(self.modelDataChanged) + self.updateStatusBar() + + + def setCurrentModelIndex(self, index=None): + if index.isValid(): + self.currentIndex = index + self._model = index.model() + else: + self.currentIndex = QModelIndex() + + self.setView() def modelDataChanged(self, topLeft, bottomRight): if not self.currentIndex: diff --git a/src/ui/views/outlineView.py b/src/ui/views/outlineView.py index d3616abc..1692bc6c 100644 --- a/src/ui/views/outlineView.py +++ b/src/ui/views/outlineView.py @@ -62,6 +62,7 @@ class outlineView(QTreeView, dndView, outlineBasics): self.header().setSectionResizeMode(Outline.title.value, QHeaderView.Stretch) self.header().setSectionResizeMode(Outline.POV.value, QHeaderView.ResizeToContents) self.header().setSectionResizeMode(Outline.status.value, QHeaderView.ResizeToContents) + self.header().setSectionResizeMode(Outline.label.value, QHeaderView.ResizeToContents) self.header().setSectionResizeMode(Outline.compile.value, QHeaderView.ResizeToContents) self.header().setSectionResizeMode(Outline.wordCount.value, QHeaderView.ResizeToContents) self.header().setSectionResizeMode(Outline.goal.value, QHeaderView.ResizeToContents) diff --git a/src/ui/views/treeOutlineDelegates.py b/src/ui/views/treeOutlineDelegates.py index d9a238b6..6b49b324 100644 --- a/src/ui/views/treeOutlineDelegates.py +++ b/src/ui/views/treeOutlineDelegates.py @@ -49,6 +49,18 @@ class treeOutlinePersoDelegate(QStyledItemDelegate): return self.mdlPersos.item(i, Perso.name.value).text() return "" + def paint(self, painter, option, index): + #option.rect.setWidth(option.rect.width() - 18) + QStyledItemDelegate.paint(self, painter, option, index) + #option.rect.setWidth(option.rect.width() + 18) + + if index.isValid() and index.internalPointer().data(Outline.POV.value) not in ["", None]: + opt = QStyleOptionComboBox() + opt.rect = option.rect + r = qApp.style().subControlRect(QStyle.CC_ComboBox, opt, QStyle.SC_ComboBoxArrow) + option.rect = r + qApp.style().drawPrimitive(QStyle.PE_IndicatorArrowDown, option, painter) + class treeOutlineCompileDelegate(QStyledItemDelegate): @@ -86,7 +98,7 @@ class treeOutlineGoalPercentageDelegate(QStyledItemDelegate): typ = item.data(Outline.type.value) level = item.level() - if self.rootIndex: + if self.rootIndex and self.rootIndex.isValid(): level -= self.rootIndex.internalPointer().level() + 1 margin = 5 @@ -150,6 +162,16 @@ class treeOutlineStatusDelegate(QStyledItemDelegate): except: return "" + def paint(self, painter, option, index): + QStyledItemDelegate.paint(self, painter, option, index) + + if index.isValid() and index.internalPointer().data(Outline.status.value) not in ["", None, "0"]: + opt = QStyleOptionComboBox() + opt.rect = option.rect + r = qApp.style().subControlRect(QStyle.CC_ComboBox, opt, QStyle.SC_ComboBoxArrow) + option.rect = r + qApp.style().drawPrimitive(QStyle.PE_IndicatorArrowDown, option, painter) + class treeOutlineLabelDelegate(QStyledItemDelegate): @@ -157,18 +179,25 @@ class treeOutlineLabelDelegate(QStyledItemDelegate): 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 sizeHint(self, option, index): + d = index.internalPointer().data(index.column(), Qt.DisplayRole) + if not d: + d = 0 + item = self.mdlLabels.item(int(d), 0) + idx = self.mdlLabels.indexFromItem(item) + opt = QStyleOptionViewItem(option) + self.initStyleOption(opt, idx) + s = qApp.style().sizeFromContents(QStyle.CT_ItemViewItem, opt, QSize()) + if s.width() > 150: + s.setWidth(150) + elif s.width() < 50: + s.setWidth(50) + return s + QSize(18, 0) def createEditor(self, parent, option, index): item = index.internalPointer() editor = QComboBox(parent) - editor.setAutoFillBackground(True) + #editor.setAutoFillBackground(True) editor.setFrame(False) return editor @@ -201,4 +230,12 @@ class treeOutlineLabelDelegate(QStyledItemDelegate): self.initStyleOption(opt, self.mdlLabels.indexFromItem(lbl)) qApp.style().drawControl(QStyle.CE_ItemViewItem, opt, painter) + + # Drop down indicator + if index.isValid() and index.internalPointer().data(Outline.label.value) not in ["", None, "0"]: + opt = QStyleOptionComboBox() + opt.rect = option.rect + r = qApp.style().subControlRect(QStyle.CC_ComboBox, opt, QStyle.SC_ComboBoxArrow) + option.rect = r + qApp.style().drawPrimitive(QStyle.PE_IndicatorArrowDown, option, painter) \ No newline at end of file diff --git a/test_project/outline.xml b/test_project/outline.xml index aebd1836..d1e580bb 100644 --- a/test_project/outline.xml +++ b/test_project/outline.xml @@ -1,7 +1,7 @@ - - + + @@ -37,7 +37,7 @@ - + @@ -51,13 +51,13 @@ - + - + - +