UI improvements

This commit is contained in:
Olivier Keshavjee 2015-06-26 15:55:34 +02:00
parent 3aac8aabff
commit 3800a553be
7 changed files with 612 additions and 292 deletions

View file

@ -14,18 +14,25 @@ SOURCES += ../src/loadSave.py
SOURCES += ../src/mainWindow.py
SOURCES += ../src/settingsWindow.py
SOURCES += ../src/models/outlineModel.py
SOURCES += ../src/models/persosProxyModel.py
SOURCES += ../src/models/plotModel.py
SOURCES += ../src/ui/helpLabel.py
SOURCES += ../src/ui/sldImportance.py
SOURCES += ../src/ui/welcome.py
SOURCES += ../src/ui/editors/editorWidget.py
SOURCES += ../src/ui/editors/fullScreenEditor.py
SOURCES += ../src/ui/editors/textFormat.py
SOURCES += ../src/ui/views/corkDelegate.py
SOURCES += ../src/ui/views/outlineDelegates.py
SOURCES += ../src/ui/views/outlineBasics.py
SOURCES += ../src/ui/views/cmbOutlineLabelChoser.py
SOURCES += ../src/ui/views/cmbOutlinePersoChoser.py
SOURCES += ../src/ui/views/cmbOutlineStatusChoser.py
SOURCES += ../src/ui/views/treeView.py
SOURCES += ../src/ui/views/lineEditView.py
SOURCES += ../src/ui/views/textEditView.py
SOURCES += ../src/ui/views/plotTreeView.py

Binary file not shown.

File diff suppressed because it is too large Load diff

View file

@ -124,7 +124,7 @@ def outlineItemColors(item):
colors["Progress"] = colorFromProgress(pg)
# Compile
if item.isCompile() in [0, "0"]:
if item.compile() in [0, "0"]:
colors["Compile"] = QColor(Qt.gray)
else:
colors["Compile"] = QColor(Qt.black)

View file

@ -387,10 +387,10 @@ class outlineItem():
#print("Data: ", column, role)
if role == Qt.DisplayRole or role == Qt.EditRole:
if column == Outline.compile.value:
return self.data(column, Qt.CheckStateRole)
#if column == Outline.compile.value:
#return self.data(column, Qt.CheckStateRole)
elif Outline(column) in self._data:
if Outline(column) in self._data:
return self._data[Outline(column)]
else:
@ -411,7 +411,11 @@ class outlineItem():
#return QBrush(Qt.gray)
elif role == Qt.CheckStateRole and column == Outline.compile.value:
return self._data[Outline(column)]
#print(self.title(), self.compile())
#if self._data[Outline(column)] and not self.compile():
#return Qt.PartiallyChecked
#else:
return self._data[Outline(column)]
elif role == Qt.FontRole:
f = QFont()
@ -458,6 +462,9 @@ class outlineItem():
if column == Outline.text.value:
wc = wordCount(data)
self.setData(Outline.wordCount.value, wc)
if column == Outline.compile.value:
self.emitDataChanged(cols=[Outline.title.value, Outline.compile.value], recursive=True)
if updateWordCount:
self.updateWordCount()
@ -527,16 +534,21 @@ class outlineItem():
else:
return QModelIndex()
def emitDataChanged(self, cols=None):
def emitDataChanged(self, cols=None, recursive=False):
idx = self.index()
if idx and self._model:
if not cols:
# Emit data changed for the whole item (all columns)
self._model.dataChanged.emit(idx, self.index(len(Outline)))
else:
# Emit only for the specified columns
for c in cols:
self._model.dataChanged.emit(self.index(c), self.index(c))
if recursive:
for c in self.children():
c.emitDataChanged(cols, recursive=True)
def removeChild(self, row):
self.childItems.pop(row)
@ -559,8 +571,13 @@ class outlineItem():
def isText(self):
return self._data[Outline.type] == "txt"
def isCompile(self):
return Outline.compile in self._data and self._data[Outline.compile]
def compile(self):
if self._data[Outline.compile] in ["0", 0]:
return False
elif self.parent():
return self.parent().compile()
else:
return True # rootItem always compile
def title(self):
if Outline.title in self._data:

View file

@ -23,119 +23,124 @@ class outlineBasics(QAbstractItemView):
if event.button() == Qt.RightButton:
index = self.currentIndex()
sel = self.getSelection()
clipboard = qApp.clipboard()
self.menu = QMenu(self)
# Add / remove items
self.actAddFolder = QAction(QIcon.fromTheme("folder-new"), qApp.translate("outlineBasics", "New Folder"), self.menu)
self.actAddFolder.triggered.connect(self.addFolder)
self.menu.addAction(self.actAddFolder)
self.actAddText = QAction(QIcon.fromTheme("document-new"), qApp.translate("outlineBasics", "New Text"), self.menu)
self.actAddText.triggered.connect(self.addText)
self.menu.addAction(self.actAddText)
self.actDelete = QAction(QIcon.fromTheme("edit-delete"), qApp.translate("outlineBasics", "Delete"), self.menu)
self.actDelete.triggered.connect(self.delete)
self.menu.addAction(self.actDelete)
self.menu.addSeparator()
# Copy, cut, paste
self.actCopy = QAction(QIcon.fromTheme("edit-copy"), qApp.translate("outlineBasics", "Copy"), self.menu)
self.actCopy.triggered.connect(self.copy)
self.menu.addAction(self.actCopy)
self.actCut = QAction(QIcon.fromTheme("edit-cut"), qApp.translate("outlineBasics", "Cut"), self.menu)
self.actCut.triggered.connect(self.cut)
self.menu.addAction(self.actCut)
self.actPaste = QAction(QIcon.fromTheme("edit-paste"), qApp.translate("outlineBasics", "Paste"), self.menu)
self.actPaste.triggered.connect(self.paste)
self.menu.addAction(self.actPaste)
self.menu.addSeparator()
# POV
self.menuPOV = QMenu(qApp.translate("outlineBasics", "Set POV"), self.menu)
mw = mainWindow()
a = QAction(QIcon.fromTheme("edit-delete"), qApp.translate("outlineBasics", "None"), self.menuPOV)
a.triggered.connect(lambda: self.setPOV(""))
self.menuPOV.addAction(a)
self.menuPOV.addSeparator()
menus = []
for i in [self.tr("Main"), self.tr("Secondary"), self.tr("Minor")]:
m = QMenu(i, self.menuPOV)
menus.append(m)
self.menuPOV.addMenu(m)
mpr = QSignalMapper(self.menuPOV)
for i in range(mw.mdlPersos.rowCount()):
a = QAction(mw.mdlPersos.item(i, Perso.name.value).text(), self.menuPOV)
a.triggered.connect(mpr.map)
mpr.setMapping(a, int(mw.mdlPersos.item(i, Perso.ID.value).text()))
imp = mw.mdlPersos.item(i, Perso.importance.value)
if imp:
imp = toInt(imp.text())
else:
imp = 0
menus[2-imp].addAction(a)
mpr.mapped.connect(self.setPOV)
self.menu.addMenu(self.menuPOV)
# Status
self.menuStatus = QMenu(qApp.translate("outlineBasics", "Set Status"), self.menu)
#a = QAction(QIcon.fromTheme("edit-delete"), qApp.translate("outlineBasics", "None"), self.menuStatus)
#a.triggered.connect(lambda: self.setStatus(""))
#self.menuStatus.addAction(a)
#self.menuStatus.addSeparator()
mpr = QSignalMapper(self.menuStatus)
for i in range(mw.mdlStatus.rowCount()):
a = QAction(mw.mdlStatus.item(i, 0).text(), self.menuStatus)
a.triggered.connect(mpr.map)
mpr.setMapping(a, i)
self.menuStatus.addAction(a)
mpr.mapped.connect(self.setStatus)
self.menu.addMenu(self.menuStatus)
# Labels
self.menuLabel = QMenu(qApp.translate("outlineBasics", "Set Label"), self.menu)
mpr = QSignalMapper(self.menuLabel)
for i in range(mw.mdlLabels.rowCount()):
a = QAction(mw.mdlLabels.item(i, 0).icon(),
mw.mdlLabels.item(i, 0).text(),
self.menuLabel)
a.triggered.connect(mpr.map)
mpr.setMapping(a, i)
self.menuLabel.addAction(a)
mpr.mapped.connect(self.setLabel)
self.menu.addMenu(self.menuLabel)
self.menu = self.makePopupMenu()
self.menu.popup(event.globalPos())
def makePopupMenu(self):
index = self.currentIndex()
sel = self.getSelection()
clipboard = qApp.clipboard()
menu = QMenu(self)
# Add / remove items
self.actAddFolder = QAction(QIcon.fromTheme("folder-new"), qApp.translate("outlineBasics", "New Folder"), menu)
self.actAddFolder.triggered.connect(self.addFolder)
menu.addAction(self.actAddFolder)
self.actAddText = QAction(QIcon.fromTheme("document-new"), qApp.translate("outlineBasics", "New Text"), menu)
self.actAddText.triggered.connect(self.addText)
menu.addAction(self.actAddText)
self.actDelete = QAction(QIcon.fromTheme("edit-delete"), qApp.translate("outlineBasics", "Delete"), menu)
self.actDelete.triggered.connect(self.delete)
menu.addAction(self.actDelete)
menu.addSeparator()
# Copy, cut, paste
self.actCopy = QAction(QIcon.fromTheme("edit-copy"), qApp.translate("outlineBasics", "Copy"), menu)
self.actCopy.triggered.connect(self.copy)
menu.addAction(self.actCopy)
self.actCut = QAction(QIcon.fromTheme("edit-cut"), qApp.translate("outlineBasics", "Cut"), menu)
self.actCut.triggered.connect(self.cut)
menu.addAction(self.actCut)
self.actPaste = QAction(QIcon.fromTheme("edit-paste"), qApp.translate("outlineBasics", "Paste"), menu)
self.actPaste.triggered.connect(self.paste)
menu.addAction(self.actPaste)
menu.addSeparator()
if len(sel) > 0 and index.isValid() and not index.internalPointer().isFolder() \
or not clipboard.mimeData().hasFormat("application/xml"):
self.actPaste.setEnabled(False)
if len(sel) > 0 and index.isValid() and not index.internalPointer().isFolder():
self.actAddFolder.setEnabled(False)
self.actAddText.setEnabled(False)
# POV
self.menuPOV = QMenu(qApp.translate("outlineBasics", "Set POV"), menu)
mw = mainWindow()
a = QAction(QIcon.fromTheme("edit-delete"), qApp.translate("outlineBasics", "None"), self.menuPOV)
a.triggered.connect(lambda: self.setPOV(""))
self.menuPOV.addAction(a)
self.menuPOV.addSeparator()
menus = []
for i in [self.tr("Main"), self.tr("Secondary"), self.tr("Minor")]:
m = QMenu(i, self.menuPOV)
menus.append(m)
self.menuPOV.addMenu(m)
mpr = QSignalMapper(self.menuPOV)
for i in range(mw.mdlPersos.rowCount()):
a = QAction(mw.mdlPersos.item(i, Perso.name.value).text(), self.menuPOV)
a.triggered.connect(mpr.map)
mpr.setMapping(a, int(mw.mdlPersos.item(i, Perso.ID.value).text()))
if len(sel) == 0:
self.actCopy.setEnabled(False)
self.actCut.setEnabled(False)
self.actDelete.setEnabled(False)
self.menuPOV.setEnabled(False)
self.menuStatus.setEnabled(False)
self.menuLabel.setEnabled(False)
imp = mw.mdlPersos.item(i, Perso.importance.value)
if imp:
imp = toInt(imp.text())
else:
imp = 0
menus[2-imp].addAction(a)
mpr.mapped.connect(self.setPOV)
menu.addMenu(self.menuPOV)
# Status
self.menuStatus = QMenu(qApp.translate("outlineBasics", "Set Status"), menu)
#a = QAction(QIcon.fromTheme("edit-delete"), qApp.translate("outlineBasics", "None"), self.menuStatus)
#a.triggered.connect(lambda: self.setStatus(""))
#self.menuStatus.addAction(a)
#self.menuStatus.addSeparator()
mpr = QSignalMapper(self.menuStatus)
for i in range(mw.mdlStatus.rowCount()):
a = QAction(mw.mdlStatus.item(i, 0).text(), self.menuStatus)
a.triggered.connect(mpr.map)
mpr.setMapping(a, i)
self.menuStatus.addAction(a)
mpr.mapped.connect(self.setStatus)
menu.addMenu(self.menuStatus)
# Labels
self.menuLabel = QMenu(qApp.translate("outlineBasics", "Set Label"), menu)
mpr = QSignalMapper(self.menuLabel)
for i in range(mw.mdlLabels.rowCount()):
a = QAction(mw.mdlLabels.item(i, 0).icon(),
mw.mdlLabels.item(i, 0).text(),
self.menuLabel)
a.triggered.connect(mpr.map)
mpr.setMapping(a, i)
self.menuLabel.addAction(a)
mpr.mapped.connect(self.setLabel)
menu.addMenu(self.menuLabel)
if len(sel) > 0 and index.isValid() and not index.internalPointer().isFolder() \
or not clipboard.mimeData().hasFormat("application/xml"):
self.actPaste.setEnabled(False)
if len(sel) > 0 and index.isValid() and not index.internalPointer().isFolder():
self.actAddFolder.setEnabled(False)
self.actAddText.setEnabled(False)
if len(sel) == 0:
self.actCopy.setEnabled(False)
self.actCut.setEnabled(False)
self.actDelete.setEnabled(False)
self.menuPOV.setEnabled(False)
self.menuStatus.setEnabled(False)
self.menuLabel.setEnabled(False)
return menu
def addFolder(self):
self.addItem("folder")

View file

@ -29,6 +29,54 @@ class treeView(QTreeView, dndView, outlineBasics):
self.titleDelegate = treeTitleDelegate()
self.setItemDelegateForColumn(Outline.title.value, self.titleDelegate)
def makePopupMenu(self):
menu = outlineBasics.makePopupMenu(self)
first = menu.actions()[0]
if len(self.selectedIndexes()) != 0:
index = self.currentIndex()
item = index.internalPointer()
self.actExpand = QAction(self.tr("Expand {}").format(item.title()), menu)
self.actExpand.triggered.connect(self.expandCurrentIndex)
menu.insertAction(first, self.actExpand)
self.actCollapse = QAction(self.tr("Collapse {}").format(item.title()), menu)
self.actCollapse.triggered.connect(self.collapseCurrentIndex)
menu.insertAction(first, self.actCollapse)
menu.insertSeparator(first)
self.actExpandAll = QAction(self.tr("Expand All"), menu)
self.actExpandAll.triggered.connect(self.expandAll)
menu.insertAction(first, self.actExpandAll)
self.actCollapseAll = QAction(self.tr("Collapse All"), menu)
self.actCollapseAll.triggered.connect(self.collapseAll)
menu.insertAction(first, self.actCollapseAll)
menu.insertSeparator(first)
return menu
def expandCurrentIndex(self, index=None):
if index is None or type(index) == bool:
index = self.currentIndex()
self.expand(index)
for i in range(self.model().rowCount(index)):
idx = self.model().index(i, 0, index)
self.expandCurrentIndex(index=idx)
def collapseCurrentIndex(self, index=None):
if index is None or type(index) == bool:
index = self.currentIndex()
self.collapse(index)
for i in range(self.model().rowCount(index)):
idx = self.model().index(i, 0, index)
self.collapseCurrentIndex(index=idx)
def dragMoveEvent(self, event):
dndView.dragMoveEvent(self, event)
QTreeView.dragMoveEvent(self, event)