manuskript/manuskript/ui/views/outlineBasics.py

277 lines
10 KiB
Python
Raw Normal View History

#!/usr/bin/env python
2016-02-07 00:34:22 +13:00
# --!-- coding: utf8 --!--
2017-10-24 00:45:08 +13:00
from PyQt5.QtCore import Qt, QSignalMapper, QSize
2016-02-07 00:34:22 +13:00
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAbstractItemView, qApp, QMenu, QAction
2017-10-24 00:45:08 +13:00
from PyQt5.QtWidgets import QListWidget, QWidgetAction, QListWidgetItem, QLineEdit
2016-02-07 00:34:22 +13:00
from manuskript import settings
from manuskript.enums import Outline
from manuskript.functions import mainWindow
2017-10-24 00:45:08 +13:00
from manuskript.functions import toInt, customIcons
2016-02-07 00:34:22 +13:00
from manuskript.models.outlineModel import outlineItem
class outlineBasics(QAbstractItemView):
def __init__(self, parent=None):
pass
2016-02-07 00:34:22 +13:00
def getSelection(self):
sel = []
for i in self.selectedIndexes():
2016-02-07 00:34:22 +13:00
if i.column() != 0:
continue
if not i in sel:
sel.append(i)
return sel
2016-02-07 00:34:22 +13:00
def mouseReleaseEvent(self, event):
if event.button() == Qt.RightButton:
2015-06-27 01:55:34 +12:00
self.menu = self.makePopupMenu()
2015-06-10 07:20:26 +12:00
self.menu.popup(event.globalPos())
else:
QAbstractItemView.mouseReleaseEvent(self, event)
2016-02-07 00:34:22 +13:00
2015-06-27 01:55:34 +12:00
def makePopupMenu(self):
index = self.currentIndex()
sel = self.getSelection()
clipboard = qApp.clipboard()
2016-02-07 00:34:22 +13:00
2015-06-27 01:55:34 +12:00
menu = QMenu(self)
2016-02-07 00:34:22 +13:00
# Open items
2017-10-24 00:45:08 +13:00
self.actOpen = QAction(QIcon.fromTheme("go-right"), qApp.translate("outlineBasics", "Open Item"), menu)
2017-10-15 08:39:16 +13:00
self.actOpen.triggered.connect(self.openItem)
menu.addAction(self.actOpen)
2017-10-30 21:26:46 +13:00
2017-10-15 08:39:16 +13:00
menu.addSeparator()
2017-10-30 21:26:46 +13:00
# Rename / add / remove items
self.actRename = QAction(QIcon.fromTheme("edit-rename"), qApp.translate("outlineBasics", "Rename"), menu)
self.actRename.triggered.connect(self.rename)
menu.addAction(self.actRename)
2015-06-27 01:55:34 +12:00
self.actAddFolder = QAction(QIcon.fromTheme("folder-new"), qApp.translate("outlineBasics", "New Folder"), menu)
self.actAddFolder.triggered.connect(self.addFolder)
menu.addAction(self.actAddFolder)
2016-02-07 00:34:22 +13:00
2015-06-27 01:55:34 +12:00
self.actAddText = QAction(QIcon.fromTheme("document-new"), qApp.translate("outlineBasics", "New Text"), menu)
self.actAddText.triggered.connect(self.addText)
menu.addAction(self.actAddText)
2016-02-07 00:34:22 +13:00
2015-06-27 01:55:34 +12:00
self.actDelete = QAction(QIcon.fromTheme("edit-delete"), qApp.translate("outlineBasics", "Delete"), menu)
self.actDelete.triggered.connect(self.delete)
menu.addAction(self.actDelete)
2016-02-07 00:34:22 +13:00
2015-06-27 01:55:34 +12:00
menu.addSeparator()
2016-02-07 00:34:22 +13:00
2015-06-27 01:55:34 +12:00
# 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)
2016-02-07 00:34:22 +13:00
2015-06-27 01:55:34 +12:00
self.actCut = QAction(QIcon.fromTheme("edit-cut"), qApp.translate("outlineBasics", "Cut"), menu)
self.actCut.triggered.connect(self.cut)
menu.addAction(self.actCut)
2016-02-07 00:34:22 +13:00
2015-06-27 01:55:34 +12:00
self.actPaste = QAction(QIcon.fromTheme("edit-paste"), qApp.translate("outlineBasics", "Paste"), menu)
self.actPaste.triggered.connect(self.paste)
menu.addAction(self.actPaste)
2016-02-07 00:34:22 +13:00
2015-06-27 01:55:34 +12:00
menu.addSeparator()
2016-02-07 00:34:22 +13:00
2015-06-27 01:55:34 +12:00
# POV
self.menuPOV = QMenu(qApp.translate("outlineBasics", "Set POV"), menu)
mw = mainWindow()
2015-09-29 22:17:03 +13:00
a = QAction(QIcon.fromTheme("dialog-no"), qApp.translate("outlineBasics", "None"), self.menuPOV)
2015-06-27 01:55:34 +12:00
a.triggered.connect(lambda: self.setPOV(""))
self.menuPOV.addAction(a)
self.menuPOV.addSeparator()
2016-02-07 00:34:22 +13:00
2015-06-27 01:55:34 +12:00
menus = []
2017-10-30 21:26:46 +13:00
for i in [qApp.translate("outlineBasics", "Main"),
qApp.translate("outlineBasics", "Secondary"),
qApp.translate("outlineBasics", "Minor")]:
2015-06-27 01:55:34 +12:00
m = QMenu(i, self.menuPOV)
menus.append(m)
self.menuPOV.addMenu(m)
2016-02-07 00:34:22 +13:00
2015-06-27 01:55:34 +12:00
mpr = QSignalMapper(self.menuPOV)
for i in range(mw.mdlCharacter.rowCount()):
a = QAction(mw.mdlCharacter.icon(i), mw.mdlCharacter.name(i), self.menuPOV)
2015-06-27 01:55:34 +12:00
a.triggered.connect(mpr.map)
mpr.setMapping(a, int(mw.mdlCharacter.ID(i)))
2016-02-07 00:34:22 +13:00
imp = toInt(mw.mdlCharacter.importance(i))
2016-02-07 00:34:22 +13:00
menus[2 - imp].addAction(a)
2015-06-27 01:55:34 +12:00
mpr.mapped.connect(self.setPOV)
menu.addMenu(self.menuPOV)
2016-02-07 00:34:22 +13:00
2015-06-27 01:55:34 +12:00
# Status
self.menuStatus = QMenu(qApp.translate("outlineBasics", "Set Status"), menu)
2016-02-07 00:34:22 +13:00
# a = QAction(QIcon.fromTheme("dialog-no"), qApp.translate("outlineBasics", "None"), self.menuStatus)
# a.triggered.connect(lambda: self.setStatus(""))
# self.menuStatus.addAction(a)
# self.menuStatus.addSeparator()
2015-06-27 01:55:34 +12:00
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)
2016-02-07 00:34:22 +13:00
2015-06-27 01:55:34 +12:00
# 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(),
2016-02-07 00:34:22 +13:00
mw.mdlLabels.item(i, 0).text(),
2015-06-27 01:55:34 +12:00
self.menuLabel)
a.triggered.connect(mpr.map)
mpr.setMapping(a, i)
self.menuLabel.addAction(a)
mpr.mapped.connect(self.setLabel)
menu.addMenu(self.menuLabel)
2016-02-07 00:34:22 +13:00
2017-10-24 00:45:08 +13:00
menu.addSeparator()
# Custom icons
self.menuCustomIcons = QMenu(qApp.translate("outlineBasics", "Set Custom Icon"), menu)
a = QAction(qApp.translate("outlineBasics", "Restore to default"), self.menuCustomIcons)
a.triggered.connect(lambda: self.setCustomIcon(""))
self.menuCustomIcons.addAction(a)
self.menuCustomIcons.addSeparator()
txt = QLineEdit()
txt.textChanged.connect(self.filterLstIcons)
txt.setPlaceholderText("Filter icons")
txt.setStyleSheet("background: transparent; border: none;")
act = QWidgetAction(self.menuCustomIcons)
act.setDefaultWidget(txt)
self.menuCustomIcons.addAction(act)
self.lstIcons = QListWidget()
for i in customIcons():
item = QListWidgetItem()
item.setIcon(QIcon.fromTheme(i))
item.setData(Qt.UserRole, i)
item.setToolTip(i)
self.lstIcons.addItem(item)
self.lstIcons.itemClicked.connect(self.setCustomIconFromItem)
self.lstIcons.setViewMode(self.lstIcons.IconMode)
self.lstIcons.setUniformItemSizes(True)
self.lstIcons.setResizeMode(self.lstIcons.Adjust)
self.lstIcons.setMovement(self.lstIcons.Static)
self.lstIcons.setStyleSheet("background: transparent; background: none;")
self.filterLstIcons("")
act = QWidgetAction(self.menuCustomIcons)
act.setDefaultWidget(self.lstIcons)
self.menuCustomIcons.addAction(act)
menu.addMenu(self.menuCustomIcons)
# Disabling stuff
2015-06-27 01:55:34 +12:00
if len(sel) > 0 and index.isValid() and not index.internalPointer().isFolder() \
2016-02-07 00:34:22 +13:00
or not clipboard.mimeData().hasFormat("application/xml"):
2015-06-27 01:55:34 +12:00
self.actPaste.setEnabled(False)
2016-02-07 00:34:22 +13:00
2015-06-27 01:55:34 +12:00
if len(sel) > 0 and index.isValid() and not index.internalPointer().isFolder():
self.actAddFolder.setEnabled(False)
self.actAddText.setEnabled(False)
2016-02-07 00:34:22 +13:00
2015-06-27 01:55:34 +12:00
if len(sel) == 0:
2017-10-15 08:39:16 +13:00
self.actOpen.setEnabled(False)
2015-06-27 01:55:34 +12:00
self.actCopy.setEnabled(False)
self.actCut.setEnabled(False)
self.actRename.setEnabled(False)
2015-06-27 01:55:34 +12:00
self.actDelete.setEnabled(False)
self.menuPOV.setEnabled(False)
self.menuStatus.setEnabled(False)
self.menuLabel.setEnabled(False)
2017-10-24 00:45:08 +13:00
self.menuCustomIcons.setEnabled(False)
2016-02-07 00:34:22 +13:00
if len(sel) > 1:
self.actRename.setEnabled(False)
2015-06-27 01:55:34 +12:00
return menu
2016-02-07 00:34:22 +13:00
2017-10-15 08:39:16 +13:00
def openItem(self):
idx = self.currentIndex()
from manuskript.functions import MW
MW.openIndex(idx)
2017-10-30 21:26:46 +13:00
def rename(self):
if len(self.getSelection()) == 1:
index = self.currentIndex()
self.edit(index)
elif len(self.getSelection()) > 1:
# FIXME: add smart rename
pass
2015-06-10 07:29:17 +12:00
def addFolder(self):
self.addItem("folder")
2016-02-07 00:34:22 +13:00
2015-06-16 01:46:31 +12:00
def addText(self):
self.addItem("text")
2016-02-07 00:34:22 +13:00
def addItem(self, _type="folder"):
2015-06-10 07:29:17 +12:00
if len(self.selectedIndexes()) == 0:
parent = self.rootIndex()
else:
parent = self.currentIndex()
2016-02-07 00:34:22 +13:00
if _type == "text":
2015-06-25 20:01:28 +12:00
_type = settings.defaultTextType
2016-02-07 00:34:22 +13:00
item = outlineItem(title=qApp.translate("outlineBasics", "New"), _type=_type)
2015-06-10 07:29:17 +12:00
self.model().appendItem(item, parent)
2016-02-07 00:34:22 +13:00
def copy(self):
mimeData = self.model().mimeData(self.selectionModel().selectedIndexes())
qApp.clipboard().setMimeData(mimeData)
2016-02-07 00:34:22 +13:00
def paste(self):
index = self.currentIndex()
if len(self.getSelection()) == 0:
2015-06-10 07:29:17 +12:00
index = self.rootIndex()
data = qApp.clipboard().mimeData()
self.model().dropMimeData(data, Qt.CopyAction, -1, 0, index)
2016-02-07 00:34:22 +13:00
def cut(self):
self.copy()
self.delete()
2016-02-07 00:34:22 +13:00
def delete(self):
self.model().removeIndexes(self.getSelection())
2016-02-07 00:34:22 +13:00
2015-06-10 07:20:26 +12:00
def setPOV(self, POV):
for i in self.getSelection():
self.model().setData(i.sibling(i.row(), Outline.POV.value), str(POV))
2016-02-07 00:34:22 +13:00
2015-06-10 07:20:26 +12:00
def setStatus(self, status):
for i in self.getSelection():
self.model().setData(i.sibling(i.row(), Outline.status.value), str(status))
2016-02-07 00:34:22 +13:00
2015-06-10 07:20:26 +12:00
def setLabel(self, label):
for i in self.getSelection():
2016-02-07 00:34:22 +13:00
self.model().setData(i.sibling(i.row(), Outline.label.value), str(label))
2017-10-24 00:45:08 +13:00
def setCustomIcon(self, customIcon):
for i in self.getSelection():
item = i.internalPointer()
item.setCustomIcon(customIcon)
def setCustomIconFromItem(self, item):
icon = item.data(Qt.UserRole)
self.setCustomIcon(icon)
self.menu.close()
def filterLstIcons(self, text):
for l in self.lstIcons.findItems("", Qt.MatchContains):
l.setHidden(not text in l.data(Qt.UserRole))