MainEditor getting smarter

This commit is contained in:
Olivier Keshavjee 2015-06-29 14:21:57 +02:00
parent 37810a7108
commit 7a7f102490
9 changed files with 188 additions and 105 deletions

View file

@ -360,20 +360,18 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.makeConnections()
# Load settings
for i in settings.openIndexes:
idx = self.mdlOutline.indexFromPath(i)
self.mainEditor.setCurrentModelIndex(idx, newTab = True)
self.generateViewMenu()
self.mainEditor.sldCorkSizeFactor.setValue(settings.corkSizeFactor)
self.actSpellcheck.setChecked(settings.spellcheck)
self.toggleSpellcheck(settings.spellcheck)
self.updateMenuDict()
self.setDictionary()
self.treeRedacOutline.setCurrentIndex(
self.mdlOutline.indexFromPath(settings.lastIndex))
self.mainEditor.setFolderView(settings.folderView)
if settings.folderView == "text":
self.mainEditor.btnRedacFolderText.setChecked(True)
elif settings.folderView == "cork":
self.mainEditor.btnRedacFolderCork.setChecked(True)
elif settings.folderView == "outline":
self.mainEditor.btnRedacFolderOutline.setChecked(True)
self.mainEditor.updateFolderViewButtons(settings.folderView)
self.tabMain.setCurrentIndex(settings.lastTab)
self.mainEditor.updateCorkBackground()
@ -455,12 +453,11 @@ class MainWindow(QMainWindow, Ui_MainWindow):
settings.lastTab = self.tabMain.currentIndex()
if self.currentProject:
# Remembering the current item
if len(self.treeRedacOutline.selectedIndexes()) == 0:
sel = QModelIndex()
else:
sel = self.treeRedacOutline.currentIndex()
settings.lastIndex = self.mdlOutline.pathToIndex(sel)
# Remembering the current items
sel = []
for i in range(self.mainEditor.tab.count()):
sel.append(self.mdlOutline.pathToIndex(self.mainEditor.tab.widget(i).currentIndex))
settings.openIndexes = sel
# Save data from models
if self.currentProject and settings.saveOnQuit:
@ -756,9 +753,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.outlineItemEditor.selectionChanged(self.treePlanOutline), AUC)
self.treePlanOutline.clicked.connect(lambda:
self.outlineItemEditor.selectionChanged(self.treePlanOutline), AUC)
self.treeRedacOutline.setSelectionModel(self.treePlanOutline
.selectionModel())
# Sync selection
#self.treeRedacOutline.setSelectionModel(self.treePlanOutline
#.selectionModel())
self.treeRedacOutline.selectionModel().selectionChanged.connect(
lambda: self.redacMetadata.selectionChanged(self.treeRedacOutline), AUC)
@ -767,7 +765,8 @@ class MainWindow(QMainWindow, Ui_MainWindow):
#self.treeRedacOutline.selectionModel().currentChanged.connect(self.redacEditor.setCurrentModelIndex)
self.treeRedacOutline.selectionModel().selectionChanged.connect(self.mainEditor.selectionChanged, AUC)
self.treeRedacOutline.selectionModel().currentChanged.connect(self.mainEditor.setCurrentModelIndex, AUC)
#self.treeRedacOutline.doubleClicked.connect(self.mainEditor.setCurrentModelIndex, AUC)
#self.treeRedacOutline.selectionModel().currentChanged.connect(self.mainEditor.setCurrentModelIndex, AUC)
#self.treeRedacOutline.selectionModel().selectionChanged.connect(self.outlineSelectionChanged, AUC)
#self.treeRedacOutline.selectionModel().selectionChanged.connect(self.outlineSelectionChanged, AUC)
@ -936,11 +935,11 @@ class MainWindow(QMainWindow, Ui_MainWindow):
for i in enchant.list_dicts():
a = QAction(str(i[0]), self)
a.setCheckable(True)
a.triggered.connect(self.setDictionary, AUC)
if settings.dict is None:
settings.dict = enchant.get_default_language()
if str(i[0]) == settings.dict:
a.setChecked(True)
a.triggered.connect(self.setDictionary, AUC)
self.menuDictGroup.addAction(a)
self.menuDict.addAction(a)
@ -950,7 +949,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
for i in self.menuDictGroup.actions():
if i.isChecked():
self.dictChanged.emit(i.text().replace("&", ""))
#self.dictChanged.emit(i.text().replace("&", ""))
settings.dict = i.text().replace("&", "")
# Find all textEditView from self, and toggle spellcheck
@ -963,9 +962,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def toggleSpellcheck(self, val):
settings.spellcheck = val
self.mainEditor.toggleSpellcheck(val)
self.redacMetadata.toggleSpellcheck(val)
self.outlineItemEditor.toggleSpellcheck(val)
#self.mainEditor.toggleSpellcheck(val)
#self.redacMetadata.toggleSpellcheck(val)
#self.outlineItemEditor.toggleSpellcheck(val)
# Find all textEditView from self, and toggle spellcheck
for w in self.findChildren(textEditView, QRegExp(".*"),

View file

@ -68,7 +68,7 @@ def openReference(ref):
index = mw.mdlOutline.getIndexByID(_ref)
if index.isValid():
mw.treeRedacOutline.setCurrentIndex(index)
mw.mainEditor.setCurrentModelIndex(index, newTab=True)
return True
else:
print("Ref not found")

View file

@ -32,7 +32,7 @@ dict = None
corkSizeFactor = 100
folderView = "cork"
lastTab = 0
lastIndex = ""
openIndexes = [""]
autoSave = False
autoSaveDelay = 5
autoSaveNoChanges = True
@ -61,7 +61,7 @@ textEditor = {
def save(filename=None):
global spellcheck, dict, corkSliderFactor, viewSettings, corkSizeFactor, folderView, lastTab, lastIndex, \
global spellcheck, dict, corkSliderFactor, viewSettings, corkSizeFactor, folderView, lastTab, openIndexes, \
autoSave, autoSaveDelay, saveOnQuit, autoSaveNoChanges, autoSaveNoChangesDelay, outlineViewColumns, \
corkBackground, fullScreenTheme, defaultTextType, textEditor
@ -72,7 +72,7 @@ def save(filename=None):
"corkSizeFactor": corkSizeFactor,
"folderView": folderView,
"lastTab": lastTab,
"lastIndex": lastIndex,
"openIndexes": openIndexes,
"autoSave":autoSave,
"autoSaveDelay":autoSaveDelay,
"saveOnQuit":saveOnQuit,
@ -139,9 +139,9 @@ def load(string, fromString=False):
global lastTab
lastTab = allSettings["lastTab"]
if "lastIndex" in allSettings:
global lastIndex
lastIndex = allSettings["lastIndex"]
if "openIndexes" in allSettings:
global openIndexes
openIndexes = allSettings["openIndexes"]
if "autoSave" in allSettings:
global autoSave

View file

@ -27,6 +27,7 @@ class editorWidget(QWidget, Ui_editorWidget_ui):
self.currentDict = ""
self.spellcheck = True
self.folderView = "cork"
self.mw = mainWindow()
#def setModel(self, model):
#self._model = model
@ -58,27 +59,32 @@ class editorWidget(QWidget, Ui_editorWidget_ui):
if r.isValid():
count = r.internalPointer().childCount()
else:
count = self._model.rootItem.childCount()
count = self.mw.mdlOutline.rootItem.childCount()
for c in range(count):
self.corkView.itemDelegate().sizeHintChanged.emit(r.child(c, 0))
def setView(self):
index = mainWindow().treeRedacOutline.currentIndex()
#index = mainWindow().treeRedacOutline.currentIndex()
# 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)
## 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
#if len(sel) != 0:
#item = index.internalPointer()
#else:
#index = QModelIndex()
#item = self.mw.mdlOutline.rootItem
self.currentIndex = index
#self.currentIndex = index
if self.currentIndex.isValid():
item = self.currentIndex.internalPointer()
else:
item = self.mw.mdlOutline.rootItem
def addTitle(itm):
edt = textEditView(self, html="<h{l}>{t}</h{l}>".format(l=min(itm.level()+1, 5), t=itm.title()), autoResize=True)
@ -96,7 +102,7 @@ class editorWidget(QWidget, Ui_editorWidget_ui):
edt = textEditView(self,
index=itm.index(),
spellcheck=self.spellcheck,
dict=self.currentDict,
dict=settings.dict,
highlighting=True,
autoResize=True)
edt.setFrameShape(QFrame.NoFrame)
@ -123,23 +129,23 @@ class editorWidget(QWidget, Ui_editorWidget_ui):
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:
addText(sItem)
addLine()
addSpacer()
self.scroll.setWidget(w)
#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)
elif item and item.isFolder() and self.folderView == "text":
if item and item.isFolder() and self.folderView == "text":
self.stack.setCurrentIndex(1)
w = QWidget()
@ -148,7 +154,7 @@ class editorWidget(QWidget, Ui_editorWidget_ui):
self.txtEdits = []
if item != self._model.rootItem:
if item != self.mw.mdlOutline.rootItem:
addTitle(item)
addChildren(item)
@ -157,8 +163,8 @@ class editorWidget(QWidget, Ui_editorWidget_ui):
elif item and item.isFolder() and self.folderView == "cork":
self.stack.setCurrentIndex(2)
self.corkView.setModel(self._model)
self.corkView.setRootIndex(index)
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(
@ -169,8 +175,8 @@ class editorWidget(QWidget, Ui_editorWidget_ui):
self.outlineView.setModelPersos(mainWindow().mdlPersos)
self.outlineView.setModelLabels(mainWindow().mdlLabels)
self.outlineView.setModelStatus(mainWindow().mdlStatus)
self.outlineView.setModel(self._model)
self.outlineView.setRootIndex(index)
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(
@ -181,7 +187,7 @@ class editorWidget(QWidget, Ui_editorWidget_ui):
self.stack.setCurrentIndex(0) # Single text item
try:
self._model.dataChanged.connect(self.modelDataChanged, AUC)
self.mw.mdlOutline.dataChanged.connect(self.modelDataChanged, AUC)
except TypeError:
pass
@ -191,7 +197,7 @@ class editorWidget(QWidget, Ui_editorWidget_ui):
def setCurrentModelIndex(self, index=None):
if index.isValid():
self.currentIndex = index
self._model = index.model()
#self._model = index.model()
else:
self.currentIndex = QModelIndex()
@ -206,11 +212,11 @@ class editorWidget(QWidget, Ui_editorWidget_ui):
def updateStatusBar(self):
# Update progress
#if self.currentIndex and self.currentIndex.isValid():
if self._model:
mw = mainWindow()
if not mw: return
mw.mainEditor.updateStats(self.currentIndex)
#if self._model:
mw = mainWindow()
if not mw: return
mw.mainEditor.updateStats(self.currentIndex)
def toggleSpellcheck(self, v):
self.spellcheck = v

View file

@ -12,6 +12,7 @@ class mainEditor(QWidget, Ui_mainEditor):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.setupUi(self)
self._updating = False
self.mw = mainWindow()
self.tab.tabCloseRequested.connect(self.closeTab)
@ -41,21 +42,36 @@ class mainEditor(QWidget, Ui_mainEditor):
return self.tab.currentWidget()
def tabChanged(self, index):
#FIXME: Update UI
pass
if self.currentEditor():
index = self.currentEditor().currentIndex
view = self.currentEditor().folderView
self.updateFolderViewButtons(view)
else:
index = QModelIndex()
self._updating = True
self.mw.treeRedacOutline.setCurrentIndex(index)
self._updating = False
def closeTab(self, index):
#FIXME: submit data if textedit?
self.tab.removeTab(index)
def allTabs(self):
return [self.tab.widget(i) for i in range(self.tab.count())]
###############################################################################
# SELECTION AND UPDATES
###############################################################################
def selectionChanged(self):
if self._updating:
return
if len(self.mw.treeRedacOutline.selectionModel().
selection().indexes()) == 0:
hidden = False
idx = QModelIndex()
else:
idx = self.mw.treeRedacOutline.currentIndex()
if idx.isValid():
@ -69,21 +85,36 @@ class mainEditor(QWidget, Ui_mainEditor):
self.sldCorkSizeFactor.setHidden(hidden)
self.btnRedacFullscreen.setVisible(hidden)
#FIXME
#self.redacEditor.setView
self.setCurrentModelIndex(idx)
def openIndexes(self, indexes, newTab=False):
for i in indexes:
self.setCurrentModelIndex(i, newTab)
def setCurrentModelIndex(self, index, newTab=False):
if not index.isValid():
return
title = self.tr("Root")
else:
title = index.internalPointer().title()
item = index.internalPointer()
# Checking if tab is already openned
for w in self.allTabs():
if w.currentIndex == index:
self.tab.setCurrentWidget(w)
return
editor = editorWidget(self)
editor.setCurrentModelIndex(index)
self.tab.addTab(editor, item.title())
self.tab.setCurrentIndex(self.tab.count() - 1)
if qApp.keyboardModifiers() & Qt.ControlModifier:
newTab = True
if newTab or not self.tab.count():
editor = editorWidget(self)
editor.setCurrentModelIndex(index)
self.tab.addTab(editor, title)
self.tab.setCurrentIndex(self.tab.count() - 1)
else:
self.currentEditor().setCurrentModelIndex(index)
self.tab.setTabText(self.tab.currentIndex(), title)
#FIXME: check if tab is already open
@ -94,15 +125,22 @@ class mainEditor(QWidget, Ui_mainEditor):
# UI
###############################################################################
def updateFolderViewButtons(self, view):
if view == "text":
self.btnRedacFolderText.setChecked(True)
elif view == "cork":
self.btnRedacFolderCork.setChecked(True)
elif view == "outline":
self.btnRedacFolderOutline.setChecked(True)
def updateStats(self, index=None):
if index:
item = index.internalPointer()
else:
item = self._model.rootItem
item = self.mw.mdlOutline.rootItem
if not item:
item = self._model.rootItem
item = self.mw.mdlOutline.rootItem
wc = item.data(Outline.wordCount.value)
goal = item.data(Outline.goal.value)
@ -167,12 +205,12 @@ class mainEditor(QWidget, Ui_mainEditor):
###############################################################################
def setDict(self, dict):
pass
#FIXME
print(dict)
for w in self.allTabs():
w.setDict(dict)
def toggleSpellcheck(self, val):
pass
#FIXME
#self.redacEditor.toggleSpellcheck(val)
for w in self.allTabs():
w.toggleSpellcheck(val)

View file

@ -789,6 +789,7 @@ class Ui_MainWindow(object):
self.verticalLayout_30.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_30.setObjectName("verticalLayout_30")
self.treeRedacOutline = treeView(self.treeRedacWidget)
self.treeRedacOutline.setEditTriggers(QtWidgets.QAbstractItemView.EditKeyPressed)
self.treeRedacOutline.setObjectName("treeRedacOutline")
self.verticalLayout_30.addWidget(self.treeRedacOutline)
self.horizontalLayout_31 = QtWidgets.QHBoxLayout()
@ -1032,7 +1033,7 @@ class Ui_MainWindow(object):
self.retranslateUi(MainWindow)
self.stack.setCurrentIndex(1)
self.tabMain.setCurrentIndex(2)
self.tabMain.setCurrentIndex(6)
self.tabSummary.setCurrentIndex(0)
self.tabPersos.setCurrentIndex(3)
self.tabPlot.setCurrentIndex(0)
@ -1169,14 +1170,14 @@ class Ui_MainWindow(object):
self.actSettings.setShortcut(_translate("MainWindow", "F8"))
self.actCloseProject.setText(_translate("MainWindow", "Close project"))
from ui.views.persoTreeView import persoTreeView
from ui.views.textEditView import textEditView
from ui.sldImportance import sldImportance
from ui.views.metadataView import metadataView
from ui.editors.mainEditor import mainEditor
from ui.views.basicItemView import basicItemView
from ui.views.outlineView import outlineView
from ui.views.lineEditView import lineEditView
from ui.welcome import welcome
from ui.views.plotTreeView import plotTreeView
from ui.views.textEditView import textEditView
from ui.views.basicItemView import basicItemView
from ui.editors.mainEditor import mainEditor
from ui.views.metadataView import metadataView
from ui.views.outlineView import outlineView
from ui.views.persoTreeView import persoTreeView
from ui.views.treeView import treeView
from ui.views.lineEditView import lineEditView
from ui.sldImportance import sldImportance

View file

@ -109,7 +109,7 @@
<item>
<widget class="QTabWidget" name="tabMain">
<property name="currentIndex">
<number>2</number>
<number>6</number>
</property>
<property name="documentMode">
<bool>true</bool>
@ -1520,7 +1520,11 @@
<number>0</number>
</property>
<item>
<widget class="treeView" name="treeRedacOutline"/>
<widget class="treeView" name="treeRedacOutline">
<property name="editTriggers">
<set>QAbstractItemView::EditKeyPressed</set>
</property>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_31">

View file

@ -35,7 +35,7 @@ class textEditView(QTextEdit):
self._fromTheme = False
self.spellcheck = spellcheck
self.currentDict = dict
self.currentDict = dict if dict else settings.dict
self.highlighter = None
self._autoResize = autoResize
self._defaultBlockFormat = QTextBlockFormat()
@ -75,9 +75,9 @@ class textEditView(QTextEdit):
else:
self.spellcheck = False
#if self._highlighting and not self.highlighter:
#self.highlighter = t2tHighlighter(self)
#self.highlighter.setDefaultBlockFormat(self._defaultBlockFormat)
if self._highlighting and not self.highlighter:
self.highlighter = t2tHighlighter(self)
self.highlighter.setDefaultBlockFormat(self._defaultBlockFormat)
def setModel(self, model):
self._model = model

View file

@ -17,6 +17,7 @@ class treeView(QTreeView, dndView, outlineBasics):
QTreeView.__init__(self, parent)
dndView.__init__(self, parent)
outlineBasics.__init__(self, parent)
self._indexesToOpen = None
def setModel(self, model):
QTreeView.setModel(self, model)
@ -33,7 +34,29 @@ class treeView(QTreeView, dndView, outlineBasics):
menu = outlineBasics.makePopupMenu(self)
first = menu.actions()[0]
# Open item in new tab
sel = self.selectedIndexes()
pos = self.viewport().mapFromGlobal(QCursor.pos())
mouseIndex = self.indexAt(pos)
if mouseIndex.isValid():
mouseTitle = mouseIndex.internalPointer().title()
else:
mouseTitle = self.tr("Root")
if mouseIndex in sel and len(sel) > 1:
actionTitle = self.tr("Open {} items in new tabs").format(len(sel))
self._indexesToOpen = sel
else:
actionTitle = self.tr("Open {} in a new tab").format(mouseTitle)
self._indexesToOpen = [mouseIndex]
self.actNewTab = QAction(actionTitle, menu)
self.actNewTab.triggered.connect(self.openNewTab)
menu.insertAction(first, self.actNewTab)
menu.insertSeparator(first)
# Expand /collapse item
if len(self.selectedIndexes()) != 0:
index = self.currentIndex()
item = index.internalPointer()
@ -46,7 +69,8 @@ class treeView(QTreeView, dndView, outlineBasics):
menu.insertAction(first, self.actCollapse)
menu.insertSeparator(first)
# Expand /collapse all
self.actExpandAll = QAction(self.tr("Expand All"), menu)
self.actExpandAll.triggered.connect(self.expandAll)
menu.insertAction(first, self.actExpandAll)
@ -59,6 +83,9 @@ class treeView(QTreeView, dndView, outlineBasics):
return menu
def openNewTab(self):
mainWindow().mainEditor.openIndexes(self._indexesToOpen, newTab=True)
def expandCurrentIndex(self, index=None):
if index is None or type(index) == bool:
index = self.currentIndex()
@ -81,6 +108,14 @@ class treeView(QTreeView, dndView, outlineBasics):
dndView.dragMoveEvent(self, event)
QTreeView.dragMoveEvent(self, event)
def mousePressEvent(self, event):
if event.button() == Qt.RightButton:
# Capture mouse press so that selection doesn't change
# on right click
pass
else:
QTreeView.mousePressEvent(self, event)
def mouseReleaseEvent(self, event):
QTreeView.mouseReleaseEvent(self, event)
outlineBasics.mouseReleaseEvent(self, event)