diff --git a/i18n/manuskript.pro b/i18n/manuskript.pro
index cd3e3c05..b78f9478 100644
--- a/i18n/manuskript.pro
+++ b/i18n/manuskript.pro
@@ -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
diff --git a/i18n/manuskript_fr.qm b/i18n/manuskript_fr.qm
index bf58c90e..14a7417d 100644
Binary files a/i18n/manuskript_fr.qm and b/i18n/manuskript_fr.qm differ
diff --git a/i18n/manuskript_fr.ts b/i18n/manuskript_fr.ts
index 846db3ee..0444ab4d 100644
--- a/i18n/manuskript_fr.ts
+++ b/i18n/manuskript_fr.ts
@@ -214,7 +214,7 @@
Contexte
-
+
Plan
@@ -359,67 +359,67 @@
Mode
-
+
Nouveau perso
-
+
(~{} pages)
-
+
Entrez toutes les informations relatives au livre, ainsi qu'à vous.
-
+
Prenez le temps de réfléchir à un résumé de votre livre, en une phrase (~50 mots). Puis augmentez cette phrase en un paragraphe, puis en une page, puis en un résumé complet.
-
+
Créez ici vos personnage.
-
+
Développez vos intrigues.
-
+
Créez le plan de votre chef-d'œuvre.
-
+
Écrivez.
-
+
Des infos pour débugger des fois pendant qu'on code c'est utile.
-
+
Dictionnaire
-
+
Installez PyEnchant pour profiter du correcteur orthographique
-
+
Mots: {}{}
-
+
Texte
@@ -459,7 +459,7 @@
Et si...?
-
+
Cartes
@@ -479,7 +479,7 @@
F9
-
+
Arbre
@@ -504,77 +504,77 @@
Réglages
-
+
Le projet {} a été enregistré.
-
+
Le projet {} a été chargé.
-
+
La situation de base, sous la forme d'une question: "Et si...?" Par exemple: "Et si le plus dangereux magiciens mauvais n'était pas capable de tuer un bébé?" (Harry Potter)
-
+
Rien
-
+
POV
-
+
Label
-
+
Progrès
-
+
Compilation
-
+
Couleur de l'icone
-
+
Couleur du texte
-
+
Couleur de l'arrière-plan
-
+
Icone
-
+
Arrière-plan
-
+
Bordure
-
+
Coin
@@ -584,22 +584,22 @@
Fermer le projet
-
+
Le fichier {} n'existe pas. Essayez encore.
-
+
Le projet {} a été chargé, avec des erreurs:
-
+
* {} n'a pas été trouvé dans le fichier du projet.
-
+
Le projet {} a été chargé avec des erreurs.
@@ -617,17 +617,17 @@
Apparence
-
+
Labels
-
+
Status
-
+
Plein écran
@@ -672,348 +672,348 @@
Enregistrer en quittant
-
+
Apparence
-
+
Arbre
-
+
Couleurs
-
+
Icone:
-
+
Rien
-
+
POV
-
+
Label
-
+
Progrès
-
+
Compilation
-
+
Texte:
-
+
Arrière-plan:
-
+
Dossiers
-
+
Afficher le nombre de sous-éléments
-
+
Afficher le nombre de mots
-
+
Afficher le progrès
-
+
Texte
-
+
Plan
-
+
Colonnes visibles
-
+
Goal
-
+
Nombre de mots
-
+
Pourcentage
-
+
Titre
-
+
Cartes
-
+
Couleurs des cartes
-
+
Bordure:
-
+
Coin:
-
+
Arrière-plan
-
+
Couleur:
-
+
Ctrl+S
-
+
Image:
-
+
Nouveau
-
+
Modifier
-
+
Supprimer
-
+
Nom du thème:
-
+
Enregistrer
-
+
Annuler
-
+
Arrière plan de la fenêtre
-
+
Arrière plan du texte
-
+
Options du texte
-
+
Options des paragraphes
-
+
Type:
-
+
Pas d'image
-
+
Mosaïque
-
+
Centrée
-
+
Étirée
-
+
Mise à l'échelle
-
+
Zoomée
-
+
Opacité:
-
+
%
-
+
Position:
-
+
Gauche
-
+
Centre
-
+
Droite
-
+
Largeur:
-
+
px
-
+
Arrondi:
-
+
Marges:
-
+
Intérieur:
-
+
Police:
-
+
Taille:
-
+
Orthographe:
-
+
Espacement
des lignes:
-
+
Simple
-
+
1.5 lignes
-
+
Double
-
+
Proportionnel
-
+
Tabulation:
-
+
Espacement:
-
+
Retrait 1ère ligne
@@ -1037,11 +1037,41 @@ des lignes:
Charger au démarrage le dernier projet ouvert
+
+
+
+ Format de texte par défaut
+
+
+
+
+ Le format définit par défaut lorsque vous créez un nouveau élément texte. Vous pouvez changer ce format pour chaque élément.
+
+
+
+
+ Éditeur de texte
+
+
+
+
+ Police
+
+
+
+
+ Famille:
+
+
+
+
+ Paragraphes
+
SpellAction
-
+
Suggestions
@@ -1152,12 +1182,12 @@ des lignes:
editorWidget
-
+
{} mots / {}
-
+
{} mots
@@ -1173,17 +1203,17 @@ des lignes:
fullScreenEditor
-
+
Thème:
-
+
{} mots / {}
-
+
{} mots
@@ -1212,22 +1242,22 @@ des lignes:
Form
-
+
Propriétés
-
+
Résumé
-
+
Résumé en une ligne
-
+
Notes
@@ -1235,76 +1265,183 @@ des lignes:
outlineBasics
-
+
Copier
-
+
Couper
-
+
Coller
-
+
Supprimer
-
+
Choisir le POV
-
+
Choisir le status
-
+
Choisir le label
-
+
Nouveau Dossier
-
+
Aucun
-
+
Nouveau
-
+
Nouveau text
-
+
Principal
-
+
Secondaire
-
+
Mineur
+
+ outlineModel
+
+
+
+ Titre
+
+
+
+
+ POV
+
+
+
+
+ Label
+
+
+
+
+ Status
+
+
+
+
+ Compilation
+
+
+
+
+ Nombre de mots
+
+
+
+
+ Goal
+
+
+
+ outlinePersoDelegate
+
+
+
+ Aucun
+
+
+
+
+ Principal
+
+
+
+
+ Secondaire
+
+
+
+
+ Mineur
+
+
+
+ persosProxyModel
+
+
+
+ Principal
+
+
+
+
+ Secondaire
+
+
+
+
+ Mineurs
+
+
+
+ plotModel
+
+
+
+ Nouvelle intrigue
+
+
+
+
+ Nouvelle sous-intrigue
+
+
+
+
+ Principale
+
+
+
+
+ Secondaire
+
+
+
+
+ Mineure
+
+
plotTreeView
@@ -1331,58 +1468,78 @@ des lignes:
Form
-
+
POV
-
+
Status
-
+
Label
-
+
Compile
-
+
Goal
-
+
Nombre de mots
+
+
+
+ Format:
+
settingsWindow
-
+
Nouveau status
-
+
Nouveau label
-
+
nouveautheme
-
+
Nouveau Thème
+
+
+
+ Txt2Tags
+
+
+
+
+ Texte riche (html)
+
+
+
+
+ Texte simple
+
sldImportance
@@ -1415,11 +1572,77 @@ des lignes:
textEditView
-
+
Différentes valeurs
+
+ textFormat
+
+
+
+ CTRL+G
+
+
+
+
+ CTRL+I
+
+
+
+
+ CTRL+U
+
+
+
+
+ CTRL+P
+
+
+
+
+ CTRL+L
+
+
+
+
+ CTRL+E
+
+
+
+
+ CTRL+R
+
+
+
+
+ CTRL+J
+
+
+
+ treeView
+
+
+
+ Développer {}
+
+
+
+
+ Fermer {}
+
+
+
+
+ Tout développer
+
+
+
+
+ Tout fermer
+
+
welcome
@@ -1433,37 +1656,37 @@ des lignes:
-
+
Modèles
-
+
Vide
-
+
Roman
-
+
Nouvelle
-
+
-
+
-
+
Projets de démonstration
@@ -1478,129 +1701,149 @@ des lignes:
Ajouter le nombre de mots
-
+
La prochaine fois, ouvrir automatiquement le dernier projet
-
+
Ouvrir...
-
+
Récents
-
+
Créer
-
+
Ouvrir le projet
-
+
Projet Manuskript (*.msk)
-
+
Enregistrer le projer sous...
-
+
Créer un nouveau projet
-
+
Chapitre
-
+
Scène
-
+
Trilogie
-
+
Livre
-
+
Section
-
+
mots chacun(e).
-
+
de
-
+
Texte
-
+
Quelque chose
-
+
<b>Total:</b> {} mots (~ {} pages)
-
+
Idée
-
+
Note
-
+
Recherche
-
+
TODO
-
+
Premier brouillon
-
+
Second brouillon
-
+
Final
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/functions.py b/src/functions.py
index 8eacdab7..4a7df449 100644
--- a/src/functions.py
+++ b/src/functions.py
@@ -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)
diff --git a/src/models/outlineModel.py b/src/models/outlineModel.py
index 0dbc4732..d8dfca7b 100644
--- a/src/models/outlineModel.py
+++ b/src/models/outlineModel.py
@@ -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:
diff --git a/src/ui/views/outlineBasics.py b/src/ui/views/outlineBasics.py
index b09b1e1e..472c9873 100644
--- a/src/ui/views/outlineBasics.py
+++ b/src/ui/views/outlineBasics.py
@@ -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")
diff --git a/src/ui/views/treeView.py b/src/ui/views/treeView.py
index 30130989..90fd055e 100644
--- a/src/ui/views/treeView.py
+++ b/src/ui/views/treeView.py
@@ -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)