diff --git a/src/mainWindow.py b/src/mainWindow.py index 8f7ed5d..fecf4d7 100644 --- a/src/mainWindow.py +++ b/src/mainWindow.py @@ -113,11 +113,12 @@ class MainWindow(QMainWindow, Ui_MainWindow): # OUTLINE ############################################################################### - def outlineRemoveItems(self): - for idx in self.treeRedacOutline.selectedIndexes(): - if idx.isValid(): - self.mdlOutline.removeIndex(idx) - + def outlineRemoveItemsRedac(self): + self.treeRedacOutline.delete() + + def outlineRemoveItemsOutline(self): + self.treeOutlineOutline.delete() + ############################################################################### # PERSOS ############################################################################### @@ -603,11 +604,11 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.lstSubPlots.activated.connect(self.changeCurrentSubPlot, AUC) self.btnRedacAddFolder.clicked.connect(self.treeRedacOutline.addFolder, AUC) - self.btnPlanAddFolder.clicked.connect(self.treePlanOutline.addFolder, AUC) + self.btnOutlineAddFolder.clicked.connect(self.treeOutlineOutline.addFolder, AUC) self.btnRedacAddText.clicked.connect(self.treeRedacOutline.addText, AUC) - self.btnPlanAddText.clicked.connect(self.treePlanOutline.addText, AUC) - self.btnRedacRemoveItem.clicked.connect(self.outlineRemoveItems, AUC) - self.btnPlanRemoveItem.clicked.connect(self.outlineRemoveItems, AUC) + self.btnOutlineAddText.clicked.connect(self.treeOutlineOutline.addText, AUC) + self.btnRedacRemoveItem.clicked.connect(self.outlineRemoveItemsRedac, AUC) + self.btnOutlineRemoveItem.clicked.connect(self.outlineRemoveItemsOutline, AUC) self.mainEditor.btnRedacShowOutline.toggled.connect(self.treeRedacWidget.setVisible) self.mainEditor.btnRedacShowOutline.setChecked(True) @@ -740,25 +741,25 @@ class MainWindow(QMainWindow, Ui_MainWindow): # Outline self.treeRedacOutline.setModel(self.mdlOutline) - self.treePlanOutline.setModelPersos(self.mdlPersos) - self.treePlanOutline.setModelLabels(self.mdlLabels) - self.treePlanOutline.setModelStatus(self.mdlStatus) + self.treeOutlineOutline.setModelPersos(self.mdlPersos) + self.treeOutlineOutline.setModelLabels(self.mdlLabels) + self.treeOutlineOutline.setModelStatus(self.mdlStatus) self.redacMetadata.setModels(self.mdlOutline, self.mdlPersos, self.mdlLabels, self.mdlStatus) self.outlineItemEditor.setModels(self.mdlOutline, self.mdlPersos, self.mdlLabels, self.mdlStatus) - self.treePlanOutline.setModel(self.mdlOutline) + self.treeOutlineOutline.setModel(self.mdlOutline) #self.redacEditor.setModel(self.mdlOutline) - self.treePlanOutline.selectionModel().selectionChanged.connect(lambda: - self.outlineItemEditor.selectionChanged(self.treePlanOutline), AUC) - self.treePlanOutline.clicked.connect(lambda: - self.outlineItemEditor.selectionChanged(self.treePlanOutline), AUC) + self.treeOutlineOutline.selectionModel().selectionChanged.connect(lambda: + self.outlineItemEditor.selectionChanged(self.treeOutlineOutline), AUC) + self.treeOutlineOutline.clicked.connect(lambda: + self.outlineItemEditor.selectionChanged(self.treeOutlineOutline), AUC) # Sync selection - #self.treeRedacOutline.setSelectionModel(self.treePlanOutline + #self.treeRedacOutline.setSelectionModel(self.treeOutlineOutline #.selectionModel()) self.treeRedacOutline.selectionModel().selectionChanged.connect( @@ -773,8 +774,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): #self.treeRedacOutline.selectionModel().selectionChanged.connect(self.outlineSelectionChanged, AUC) #self.treeRedacOutline.selectionModel().selectionChanged.connect(self.outlineSelectionChanged, AUC) - #self.treePlanOutline.selectionModel().selectionChanged.connect(self.outlineSelectionChanged, AUC) - #self.treePlanOutline.selectionModel().selectionChanged.connect(self.outlineSelectionChanged, AUC) + #self.treeOutlineOutline.selectionModel().selectionChanged.connect(self.outlineSelectionChanged, AUC) + #self.treeOutlineOutline.selectionModel().selectionChanged.connect(self.outlineSelectionChanged, AUC) # Cheat Sheet self.cheatSheet.setModels() @@ -1072,7 +1073,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.mainEditor.updateCorkView() if item == "Outline": self.mainEditor.updateTreeView() - self.treePlanOutline.viewport().update() + self.treeOutlineOutline.viewport().update() if item == "Tree": self.treeRedacOutline.viewport().update() diff --git a/src/models/outlineModel.py b/src/models/outlineModel.py index 260b538..c791324 100644 --- a/src/models/outlineModel.py +++ b/src/models/outlineModel.py @@ -84,7 +84,13 @@ class outlineModel(QAbstractItemModel): return QModelIndex() childItem = index.internalPointer() - parentItem = childItem.parent() + try: + parentItem = childItem.parent() + except AttributeError: + import traceback, sys + print(traceback.print_exc()) + print(sys.exc_info()[0]) + return QModelIndex() if parentItem == self.rootItem: return QModelIndex() @@ -318,6 +324,23 @@ class outlineModel(QAbstractItemModel): item = index.internalPointer() self.removeRow(item.row(), index.parent()) + def removeIndexes(self, indexes): + levels = {} + for i in indexes: + item = i.internalPointer() + level = item.level() + if not level in levels: + levels[level] = [] + levels[level].append([i.row(), i]) + + # Sort by level then by row + for l in reversed(sorted(levels.keys())): + rows = levels[l] + + rows = list(reversed(sorted(rows, key=lambda x:x[0]))) + for r in rows: + self.removeIndex(r[1]) + def removeRow(self, row, parent=QModelIndex()): return self.removeRows(row, 1, parent) diff --git a/src/ui/editors/editorWidget.py b/src/ui/editors/editorWidget.py index 29f1cfa..64b67b1 100644 --- a/src/ui/editors/editorWidget.py +++ b/src/ui/editors/editorWidget.py @@ -190,6 +190,7 @@ class editorWidget(QWidget, Ui_editorWidget_ui): self.mw.mdlOutline.dataChanged.connect(self.modelDataChanged, AUC) self.mw.mdlOutline.rowsInserted.connect(self.updateIndexFromID, AUC) self.mw.mdlOutline.rowsRemoved.connect(self.updateIndexFromID, AUC) + self.mw.mdlOutline.rowsAboutToBeRemoved.connect(self.rowsAboutToBeRemoved, AUC) except TypeError: pass @@ -220,6 +221,13 @@ class editorWidget(QWidget, Ui_editorWidget_ui): if topLeft.row() <= self.currentIndex.row() <= bottomRight.row(): self.updateStatusBar() + def rowsAboutToBeRemoved(self, parent, first, last): + if self.currentIndex: + if self.currentIndex.parent() == parent and \ + first <= self.currentIndex.row() <= last: + # Item deleted, close tab + self.mw.mainEditor.tab.removeTab(self.mw.mainEditor.tab.indexOf(self)) + def updateStatusBar(self): # Update progress #if self.currentIndex and self.currentIndex.isValid(): diff --git a/src/ui/mainWindow.py b/src/ui/mainWindow.py index b488e2d..e5efbcc 100644 --- a/src/ui/mainWindow.py +++ b/src/ui/mainWindow.py @@ -726,13 +726,13 @@ class Ui_MainWindow(object): self.splitterOutlineV = QtWidgets.QSplitter(self.layoutWidget) self.splitterOutlineV.setOrientation(QtCore.Qt.Vertical) self.splitterOutlineV.setObjectName("splitterOutlineV") - self.treePlanOutline = outlineView(self.splitterOutlineV) - self.treePlanOutline.setDragEnabled(True) - self.treePlanOutline.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop) - self.treePlanOutline.setDefaultDropAction(QtCore.Qt.MoveAction) - self.treePlanOutline.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) - self.treePlanOutline.setObjectName("treePlanOutline") - self.treePlanOutline.header().setStretchLastSection(False) + self.treeOutlineOutline = outlineView(self.splitterOutlineV) + self.treeOutlineOutline.setDragEnabled(True) + self.treeOutlineOutline.setDragDropMode(QtWidgets.QAbstractItemView.DragDrop) + self.treeOutlineOutline.setDefaultDropAction(QtCore.Qt.MoveAction) + self.treeOutlineOutline.setSelectionMode(QtWidgets.QAbstractItemView.ExtendedSelection) + self.treeOutlineOutline.setObjectName("treeOutlineOutline") + self.treeOutlineOutline.header().setStretchLastSection(False) self.frame = QtWidgets.QFrame(self.splitterOutlineV) self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel) self.frame.setFrameShadow(QtWidgets.QFrame.Raised) @@ -745,24 +745,24 @@ class Ui_MainWindow(object): self.verticalLayout_14.addWidget(self.splitterOutlineV) self.horizontalLayout_18 = QtWidgets.QHBoxLayout() self.horizontalLayout_18.setObjectName("horizontalLayout_18") - self.btnPlanAddFolder = QtWidgets.QPushButton(self.layoutWidget) - self.btnPlanAddFolder.setText("") + self.btnOutlineAddFolder = QtWidgets.QPushButton(self.layoutWidget) + self.btnOutlineAddFolder.setText("") icon = QtGui.QIcon.fromTheme("folder-new") - self.btnPlanAddFolder.setIcon(icon) - self.btnPlanAddFolder.setObjectName("btnPlanAddFolder") - self.horizontalLayout_18.addWidget(self.btnPlanAddFolder) - self.btnPlanAddText = QtWidgets.QPushButton(self.layoutWidget) - self.btnPlanAddText.setText("") + self.btnOutlineAddFolder.setIcon(icon) + self.btnOutlineAddFolder.setObjectName("btnOutlineAddFolder") + self.horizontalLayout_18.addWidget(self.btnOutlineAddFolder) + self.btnOutlineAddText = QtWidgets.QPushButton(self.layoutWidget) + self.btnOutlineAddText.setText("") icon = QtGui.QIcon.fromTheme("document-new") - self.btnPlanAddText.setIcon(icon) - self.btnPlanAddText.setObjectName("btnPlanAddText") - self.horizontalLayout_18.addWidget(self.btnPlanAddText) - self.btnPlanRemoveItem = QtWidgets.QPushButton(self.layoutWidget) - self.btnPlanRemoveItem.setText("") + self.btnOutlineAddText.setIcon(icon) + self.btnOutlineAddText.setObjectName("btnOutlineAddText") + self.horizontalLayout_18.addWidget(self.btnOutlineAddText) + self.btnOutlineRemoveItem = QtWidgets.QPushButton(self.layoutWidget) + self.btnOutlineRemoveItem.setText("") icon = QtGui.QIcon.fromTheme("list-remove") - self.btnPlanRemoveItem.setIcon(icon) - self.btnPlanRemoveItem.setObjectName("btnPlanRemoveItem") - self.horizontalLayout_18.addWidget(self.btnPlanRemoveItem) + self.btnOutlineRemoveItem.setIcon(icon) + self.btnOutlineRemoveItem.setObjectName("btnOutlineRemoveItem") + self.horizontalLayout_18.addWidget(self.btnOutlineRemoveItem) spacerItem15 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_18.addItem(spacerItem15) self.btnPlanShowDetails = QtWidgets.QPushButton(self.layoutWidget) @@ -1047,13 +1047,13 @@ class Ui_MainWindow(object): self.retranslateUi(MainWindow) self.stack.setCurrentIndex(1) - 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(0) - self.tabRedacInfos.setCurrentIndex(1) + self.tabRedacInfos.setCurrentIndex(0) self.tabWidget.setCurrentIndex(1) self.btnPlotShowSummary.toggled['bool'].connect(self.grpPlotSummary.setVisible) self.comboBox_2.currentIndexChanged['int'].connect(self.stkPlotSummary.setCurrentIndex) @@ -1175,17 +1175,17 @@ class Ui_MainWindow(object): self.actCompile.setText(_translate("MainWindow", "Compile")) self.actCompile.setShortcut(_translate("MainWindow", "F6")) -from ui.views.treeView import treeView +from ui.views.outlineView import outlineView +from ui.views.basicItemView import basicItemView +from ui.views.metadataView import metadataView +from ui.views.textEditView import textEditView from ui.editors.mainEditor import mainEditor from ui.welcome import welcome -from ui.sldImportance import sldImportance -from ui.views.persoTreeView import persoTreeView -from ui.cheatSheet import cheatSheet -from ui.search import search -from ui.views.basicItemView import basicItemView -from ui.views.plotTreeView import plotTreeView -from ui.views.metadataView import metadataView -from ui.views.outlineView import outlineView -from ui.collapsibleGroupBox2 import collapsibleGroupBox2 from ui.views.lineEditView import lineEditView -from ui.views.textEditView import textEditView +from ui.search import search +from ui.collapsibleGroupBox2 import collapsibleGroupBox2 +from ui.cheatSheet import cheatSheet +from ui.views.persoTreeView import persoTreeView +from ui.views.treeView import treeView +from ui.views.plotTreeView import plotTreeView +from ui.sldImportance import sldImportance diff --git a/src/ui/mainWindow.ui b/src/ui/mainWindow.ui index 9f246a3..c0f4fcd 100644 --- a/src/ui/mainWindow.ui +++ b/src/ui/mainWindow.ui @@ -109,7 +109,7 @@ - 5 + 6 true @@ -1399,7 +1399,7 @@ Qt::Vertical - + true @@ -1434,7 +1434,7 @@ - + @@ -1445,7 +1445,7 @@ - + @@ -1456,7 +1456,7 @@ - + @@ -1584,7 +1584,7 @@ QTabWidget::South - 1 + 0 true diff --git a/src/ui/views/outlineBasics.py b/src/ui/views/outlineBasics.py index 5234a56..d898503 100644 --- a/src/ui/views/outlineBasics.py +++ b/src/ui/views/outlineBasics.py @@ -172,8 +172,7 @@ class outlineBasics(QAbstractItemView): self.delete() def delete(self): - for i in self.getSelection(): - self.model().removeIndex(i) + self.model().removeIndexes(self.getSelection()) def setPOV(self, POV): for i in self.getSelection(): diff --git a/src/ui/views/textEditView.py b/src/ui/views/textEditView.py index 9e3994f..1366b5b 100644 --- a/src/ui/views/textEditView.py +++ b/src/ui/views/textEditView.py @@ -25,6 +25,7 @@ class textEditView(QTextEdit): self._column = Outline.text.value self._index = None self._indexes = None + self._model = None self._placeholderText = self.placeholderText() self._updating = False self._item = None @@ -59,6 +60,8 @@ class textEditView(QTextEdit): #self.document().contentsChanged.connect(lambda: print("Document changed")) #self.document().contentsChanged.connect(lambda: print(self.objectName(), "Contents changed")) + + self.setEnabled(False) if index: self.setCurrentModelIndex(index) @@ -81,7 +84,14 @@ class textEditView(QTextEdit): def setModel(self, model): self._model = model - #self._model.dataChanged.connect(self.update, AUC) + try: + self._model.dataChanged.connect(self.update, AUC) + except TypeError: + pass + try: + self._model.rowsAboutToBeRemoved.connect(self.rowsAboutToBeRemoved, AUC) + except TypeError: + pass def setColumn(self, col): self._column = col @@ -97,33 +107,42 @@ class textEditView(QTextEdit): def setCurrentModelIndex(self, index): self._indexes = None if index.isValid(): + self.setEnabled(True) if index.column() != self._column: index = index.sibling(index.row(), self._column) self._index = index self.setPlaceholderText(self._placeholderText) - - self._model = index.model() - try: - self._model.dataChanged.connect(self.update, AUC) - except TypeError: - pass + + if not self._model: + self.setModel(index.model()) self.setupEditorForIndex(self._index) self.loadFontSettings() - #self.document().contentsChanged.connect(self.submit, AUC) self.updateText() else: self._index = QModelIndex() - try: - self.document().contentsChanged.disconnect(self.submit) - #self._model.dataChanged.disconnect(self.update) - except: - pass self.setPlainText("") + self.setEnabled(False) + + def setCurrentModelIndexes(self, indexes): + self._index = None + self._indexes = [] + + for i in indexes: + if i.isValid(): + self.setEnabled(True) + if i.column() != self._column: + i = i.sibling(i.row(), self._column) + self._indexes.append(i) + + if not self._model: + self.setModel(i.model()) + + self.updateText() def setupEditorForIndex(self, index): @@ -200,19 +219,6 @@ class textEditView(QTextEdit): self.highlighter.setDefaultCharFormat(self._defaultCharFormat) self.highlighter.setDefaultBlockFormat(self._defaultBlockFormat) - def setCurrentModelIndexes(self, indexes): - self._index = None - self._indexes = [] - - for i in indexes: - if i.isValid(): - if i.column() != self._column: - i = i.sibling(i.row(), self._column) - self._indexes.append(i) - - #self.document().contentsChanged.connect(self.submit) - self.updateText() - def update(self, topLeft, bottomRight): if self._updating: return @@ -248,6 +254,15 @@ class textEditView(QTextEdit): if update: self.updateText() + def rowsAboutToBeRemoved(self, parent, first, last): + if self._index: + if self._index.parent() == parent and \ + first <= self._index.row() <= last: + self._index = None + self.setEnabled(False) + + #FIXME: self._indexes + def disconnectDocument(self): try: self.document().contentsChanged.disconnect(self.updateTimer.start) @@ -329,11 +344,11 @@ class textEditView(QTextEdit): self._updating = False elif self._indexes: - print("Submitting many indexes") self._updating = True for i in self._indexes: item = i.internalPointer() if self.toPlainText() != toString(item.data(self._column)): + print("Submitting many indexes") self._model.setData(i, self.toPlainText()) self._updating = False