manuskript/manuskript/ui/editors/editorWidget.py

247 lines
9 KiB
Python
Raw Normal View History

2015-06-06 11:13:27 +12:00
#!/usr/bin/env python
#--!-- coding: utf8 --!--
from qt import *
from enums import *
from ui.editors.editorWidget_ui import *
2015-06-20 04:47:45 +12:00
from ui.editors.fullScreenEditor import *
from ui.editors.textFormat import *
2015-06-15 22:18:42 +12:00
from ui.views.textEditView import *
from functions import *
import settings
2015-06-06 11:13:27 +12:00
class editorWidget(QWidget, Ui_editorWidget_ui):
2015-06-07 05:10:44 +12:00
toggledSpellcheck = pyqtSignal(bool)
dictChanged = pyqtSignal(str)
2015-06-28 00:06:35 +12:00
def __init__(self, parent):
2015-06-06 11:13:27 +12:00
QWidget.__init__(self, parent)
self.setupUi(self)
2015-06-11 05:45:42 +12:00
self.currentIndex = QModelIndex()
self.currentID = None
2015-06-06 11:13:27 +12:00
self.txtEdits = []
self.scroll.setBackgroundRole(QPalette.Base)
self.toggledSpellcheck.connect(self.txtRedacText.toggleSpellcheck, AUC)
self.dictChanged.connect(self.txtRedacText.setDict, AUC)
self.txtRedacText.setHighlighting(True)
2015-06-07 05:10:44 +12:00
self.currentDict = ""
self.spellcheck = True
self.folderView = "cork"
2015-06-30 00:21:57 +12:00
self.mw = mainWindow()
2015-06-28 00:06:35 +12:00
#def setModel(self, model):
#self._model = model
#self.setView()
2015-06-11 05:45:42 +12:00
def setFolderView(self, v):
oldV = self.folderView
if v == "cork":
self.folderView = "cork"
2015-06-09 22:32:43 +12:00
elif v == "outline":
self.folderView = "outline"
else:
self.folderView = "text"
# Saving value
settings.folderView = self.folderView
if oldV != self.folderView and self.currentIndex:
self.setCurrentModelIndex(self.currentIndex)
def setCorkSizeFactor(self, v):
self.corkView.itemDelegate().setCorkSizeFactor(v)
2015-06-16 09:15:10 +12:00
self.redrawCorkItems()
2015-06-16 09:15:10 +12:00
def redrawCorkItems(self):
r = self.corkView.rootIndex()
2015-06-11 05:45:42 +12:00
if r.isValid():
count = r.internalPointer().childCount()
else:
2015-06-30 00:21:57 +12:00
count = self.mw.mdlOutline.rootItem.childCount()
2015-06-11 05:45:42 +12:00
for c in range(count):
self.corkView.itemDelegate().sizeHintChanged.emit(r.child(c, 0))
2015-06-06 11:13:27 +12:00
2015-06-11 05:45:42 +12:00
def setView(self):
2015-06-30 00:21:57 +12:00
#index = mainWindow().treeRedacOutline.currentIndex()
2015-06-06 11:13:27 +12:00
2015-06-30 00:21:57 +12:00
## 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)
2015-06-11 05:45:42 +12:00
2015-06-30 00:21:57 +12:00
#if len(sel) != 0:
#item = index.internalPointer()
#else:
#index = QModelIndex()
#item = self.mw.mdlOutline.rootItem
2015-06-11 05:45:42 +12:00
2015-06-30 00:21:57 +12:00
#self.currentIndex = index
if self.currentIndex.isValid():
item = self.currentIndex.internalPointer()
else:
item = self.mw.mdlOutline.rootItem
2015-06-11 05:45:42 +12:00
def addTitle(itm):
edt = textEditView(self, html="<h{l}>{t}</h{l}>".format(l=min(itm.level()+1, 5), t=itm.title()), autoResize=True)
2015-06-11 05:45:42 +12:00
edt.setFrameShape(QFrame.NoFrame)
self.txtEdits.append(edt)
l.addWidget(edt)
def addLine():
2015-06-16 01:46:31 +12:00
line = QFrame(self.text)
2015-06-11 05:45:42 +12:00
line.setFrameShape(QFrame.HLine)
line.setFrameShadow(QFrame.Sunken)
l.addWidget(line)
2015-06-16 01:46:31 +12:00
def addText(itm):
edt = textEditView(self,
index=itm.index(),
spellcheck=self.spellcheck,
2015-06-30 00:21:57 +12:00
dict=settings.dict,
highlighting=True,
autoResize=True)
2015-06-11 05:45:42 +12:00
edt.setFrameShape(QFrame.NoFrame)
2015-07-03 23:59:41 +12:00
edt.setStyleSheet("background: {};".format(settings.textEditor["background"]))
2015-06-25 05:53:51 +12:00
edt.setStatusTip("{} ({})".format(itm.path(), itm.type()))
self.toggledSpellcheck.connect(edt.toggleSpellcheck, AUC)
self.dictChanged.connect(edt.setDict, AUC)
2015-06-11 05:45:42 +12:00
#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)
2015-06-06 11:13:27 +12:00
2015-06-11 05:45:42 +12:00
if child.isFolder():
addTitle(child)
addChildren(child)
2015-06-09 22:32:43 +12:00
2015-06-11 05:45:42 +12:00
else:
2015-06-16 01:46:31 +12:00
addText(child)
2015-06-09 22:32:43 +12:00
addLine()
2015-06-11 05:45:42 +12:00
def addSpacer():
l.addItem(QSpacerItem(10, 1000, QSizePolicy.Minimum, QSizePolicy.Expanding))
# Display multiple selected items
2015-06-30 00:21:57 +12:00
#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:
#addText(sItem)
#addLine()
#addSpacer()
#self.scroll.setWidget(w)
if item and item.isFolder() and self.folderView == "text":
2015-06-11 05:45:42 +12:00
self.stack.setCurrentIndex(1)
w = QWidget()
l = QVBoxLayout(w)
2015-07-03 23:59:41 +12:00
w.setStyleSheet("background: {};".format(settings.textEditor["background"]))
2015-06-11 05:45:42 +12:00
#self.scroll.setWidgetResizable(False)
self.txtEdits = []
2015-06-30 00:21:57 +12:00
if item != self.mw.mdlOutline.rootItem:
addTitle(item)
2015-06-11 05:45:42 +12:00
addChildren(item)
addSpacer()
self.scroll.setWidget(w)
2015-06-15 22:38:38 +12:00
elif item and item.isFolder() and self.folderView == "cork":
2015-06-11 05:45:42 +12:00
self.stack.setCurrentIndex(2)
2015-06-30 00:21:57 +12:00
self.corkView.setModel(self.mw.mdlOutline)
self.corkView.setRootIndex(self.currentIndex)
self.corkView.selectionModel().selectionChanged.connect(
lambda: mainWindow().redacMetadata.selectionChanged(self.corkView), AUC)
self.corkView.clicked.connect(
lambda: mainWindow().redacMetadata.selectionChanged(self.corkView), AUC)
2015-06-15 22:38:38 +12:00
elif item and item.isFolder() and self.folderView == "outline":
2015-06-11 05:45:42 +12:00
self.stack.setCurrentIndex(3)
self.outlineView.setModelPersos(mainWindow().mdlPersos)
self.outlineView.setModelLabels(mainWindow().mdlLabels)
self.outlineView.setModelStatus(mainWindow().mdlStatus)
2015-06-30 00:21:57 +12:00
self.outlineView.setModel(self.mw.mdlOutline)
self.outlineView.setRootIndex(self.currentIndex)
self.outlineView.selectionModel().selectionChanged.connect(
lambda: mainWindow().redacMetadata.selectionChanged(self.outlineView), AUC)
self.outlineView.clicked.connect(
lambda: mainWindow().redacMetadata.selectionChanged(self.outlineView), AUC)
2015-06-06 11:13:27 +12:00
else:
2015-06-28 00:06:35 +12:00
self.txtRedacText.setCurrentModelIndex(self.currentIndex)
self.stack.setCurrentIndex(0) # Single text item
2015-06-11 05:45:42 +12:00
try:
2015-06-30 00:21:57 +12:00
self.mw.mdlOutline.dataChanged.connect(self.modelDataChanged, AUC)
2015-07-01 23:24:27 +12:00
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
2015-06-11 05:45:42 +12:00
self.updateStatusBar()
def setCurrentModelIndex(self, index=None):
if index.isValid():
self.currentIndex = index
self.currentID = self.mw.mdlOutline.ID(index)
2015-06-30 00:21:57 +12:00
#self._model = index.model()
2015-06-11 05:45:42 +12:00
else:
self.currentIndex = QModelIndex()
self.setView()
def updateIndexFromID(self):
idx = self.mw.mdlOutline.getIndexByID(self.currentID)
if idx != self.currentIndex:
self.currentIndex = idx
self.setView()
2015-06-07 05:10:44 +12:00
def modelDataChanged(self, topLeft, bottomRight):
2015-07-01 23:24:27 +12:00
#if self.currentID:
#self.updateIndexFromID()
if not self.currentIndex:
return
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():
2015-06-30 00:21:57 +12:00
#if self._model:
mw = mainWindow()
if not mw: return
2015-06-30 00:33:30 +12:00
mw.mainEditor.updateStats()
2015-06-07 05:10:44 +12:00
def toggleSpellcheck(self, v):
self.spellcheck = v
self.toggledSpellcheck.emit(v)
def setDict(self, dct):
self.currentDict = dct
self.dictChanged.emit(dct)