manuskript/src/mainWindow.py

316 lines
13 KiB
Python
Raw Normal View History

2015-05-28 13:32:09 +12:00
#!/usr/bin/env python
#--!-- coding: utf8 --!--
from __future__ import print_function
from __future__ import unicode_literals
2015-06-04 04:40:19 +12:00
from qt import *
2015-05-28 13:32:09 +12:00
from ui.mainWindow import *
2015-05-31 16:03:07 +12:00
from loadSave import *
2015-06-01 22:29:06 +12:00
from enums import *
2015-06-02 10:06:17 +12:00
from models.outlineModel import *
2015-05-28 13:32:09 +12:00
class MainWindow(QMainWindow, Ui_MainWindow):
def __init__(self):
QMainWindow.__init__(self)
self.setupUi(self)
2015-05-31 16:03:07 +12:00
self.readSettings()
2015-05-29 05:15:57 +12:00
# UI
2015-05-28 13:32:09 +12:00
self.splitterPersos.setStretchFactor(0, 25)
self.splitterPersos.setStretchFactor(1, 75)
2015-05-29 05:15:57 +12:00
self.splitterPlot.setStretchFactor(0, 20)
self.splitterPlot.setStretchFactor(1, 40)
self.splitterPlot.setStretchFactor(2, 40)
2015-05-28 13:32:09 +12:00
self.splitterPlan.setStretchFactor(0, 25)
self.splitterPlan.setStretchFactor(1, 75)
2015-05-29 05:15:57 +12:00
2015-05-28 13:32:09 +12:00
self.splitterRedac.setStretchFactor(0, 20)
self.splitterRedac.setStretchFactor(1, 60)
self.splitterRedac.setStretchFactor(2, 20)
2015-05-31 16:03:07 +12:00
# Word count
self.mprWordCount = QSignalMapper(self)
2015-05-28 13:32:09 +12:00
for t, i in [
(self.txtSummarySentance, 0),
(self.txtSummaryPara, 1),
(self.txtSummaryPage, 2),
(self.txtSummaryFull, 3)
]:
2015-05-31 16:03:07 +12:00
t.textChanged.connect(self.mprWordCount.map)
self.mprWordCount.setMapping(t, i)
self.mprWordCount.mapped.connect(self.wordCount)
2015-05-28 13:32:09 +12:00
# Snowflake Method Cycle
self.mapperCycle = QSignalMapper(self)
for t, i in [
(self.btnStepTwo, 0),
(self.btnStepThree, 1),
(self.btnStepFour, 2),
(self.btnStepFive, 3),
(self.btnStepSix, 4),
(self.btnStepSeven, 5),
(self.btnStepEight, 6)
]:
t.clicked.connect(self.mapperCycle.map)
self.mapperCycle.setMapping(t, i)
self.mapperCycle.mapped.connect(self.clickCycle)
2015-05-31 16:03:07 +12:00
# Données
self.mdlFlatData = QStandardItemModel(2, 8)
self.tblDebugFlatData.setModel(self.mdlFlatData)
self.mprSummary = QDataWidgetMapper()
self.mprSummary.setModel(self.mdlFlatData)
self.mprSummary.addMapping(self.txtSummarySentance, 0)
self.mprSummary.addMapping(self.txtSummarySentance_2, 0)
self.mprSummary.addMapping(self.txtSummaryPara, 1)
self.mprSummary.addMapping(self.txtSummaryPara_2, 1)
self.mprSummary.addMapping(self.txtPlotSummaryPara, 1)
self.mprSummary.addMapping(self.txtSummaryPage, 2)
self.mprSummary.addMapping(self.txtSummaryPage_2, 2)
self.mprSummary.addMapping(self.txtPlotSummaryPage, 2)
self.mprSummary.addMapping(self.txtSummaryFull, 3)
self.mprSummary.addMapping(self.txtPlotSummaryFull, 3)
self.mprSummary.setCurrentIndex(1)
self.mprInfos = QDataWidgetMapper()
self.mprInfos.setModel(self.mdlFlatData)
self.mprInfos.addMapping(self.txtGeneralTitle, 0)
self.mprInfos.addMapping(self.txtGeneralSubtitle, 1)
self.mprInfos.addMapping(self.txtGeneralSerie, 2)
self.mprInfos.addMapping(self.txtGeneralVolume, 3)
self.mprInfos.addMapping(self.txtGeneralGenre, 4)
self.mprInfos.addMapping(self.txtGeneralLicense, 5)
self.mprInfos.addMapping(self.txtGeneralAuthor, 6)
self.mprInfos.addMapping(self.txtGeneralEmail, 7)
self.mprInfos.setCurrentIndex(0)
# Persos
self.mdlPersos = QStandardItemModel(0, 10)
2015-06-01 08:41:32 +12:00
self.mdlPersosInfos = QStandardItemModel(1, 0)
2015-06-01 22:29:06 +12:00
self.mdlPersosInfos.insertColumn(0, [QStandardItem("ID")])
2015-05-31 16:03:07 +12:00
self.mdlPersosInfos.setHorizontalHeaderLabels(["Description"])
self.lstPersos.setModel(self.mdlPersos)
self.tblPersoInfos.setModel(self.mdlPersosInfos)
2015-06-01 08:41:32 +12:00
self.tblPersoInfos.setRowHidden(0, True)
2015-05-31 16:03:07 +12:00
self.btnAddPerso.clicked.connect(self.createPerso)
self.btnRmPerso.clicked.connect(self.removePerso)
self.btnPersoAddInfo.clicked.connect(lambda: self.mdlPersosInfos.insertRow(self.mdlPersosInfos.rowCount()))
self.mprPersos = QDataWidgetMapper()
self.mprPersos.setModel(self.mdlPersos)
mapping = [
2015-06-01 22:29:06 +12:00
(self.txtPersoName, Perso.name.value),
(self.txtPersoMotivation, Perso.motivation.value),
(self.txtPersoGoal, Perso.goal.value),
(self.txtPersoConflict, Perso.conflict.value),
(self.txtPersoEpiphany, Perso.epiphany.value),
(self.txtPersoSummarySentance, Perso.summarySentance.value),
(self.txtPersoSummaryPara, Perso.summaryPara.value),
2015-06-02 10:06:17 +12:00
(self.txtPersoSummaryFull, Perso.summaryFull.value),
(self.txtPersoNotes, Perso.notes.value)
2015-05-31 16:03:07 +12:00
]
2015-06-01 08:41:32 +12:00
for w, i in mapping:
self.mprPersos.addMapping(w, i)
2015-06-01 22:29:06 +12:00
self.mprPersos.addMapping(self.sldPersoImportance, Perso.importance.value, "importance")
2015-05-31 16:03:07 +12:00
self.sldPersoImportance.importanceChanged.connect(self.mprPersos.submit)
self.mprPersos.setCurrentIndex(0)
self.lstPersos.selectionModel().currentChanged.connect(self.mprPersos.setCurrentModelIndex)
self.lstPersos.selectionModel().currentChanged.connect(self.changeCurrentPerso)
2015-06-01 08:41:32 +12:00
self.tabPersos.currentChanged.connect(self.resizePersosInfos)
2015-05-31 16:03:07 +12:00
2015-06-02 10:06:17 +12:00
# Outline
self.mdlOutline = outlineModel()
#self.mdlOutline.setHorizontalHeaderLabels(
#[i.name for i in Outline])
self.treeRedacOutline.setModel(self.mdlOutline)
self.treePlanOutline.setModel(self.mdlOutline)
self.treeRedacOutline.setSelectionModel(self.treePlanOutline.selectionModel())
for c in range(1, self.mdlOutline.columnCount()):
self.treeRedacOutline.hideColumn(c)
self.treePlanOutline.hideColumn(c)
self.btnRedacAddFolder.clicked.connect(lambda: self.outlineAddItem("folder"))
self.btnRedacAddScene.clicked.connect(lambda: self.outlineAddItem("scene"))
2015-06-03 00:40:48 +12:00
self.btnRedacRemoveItem.clicked.connect(self.outlineRemoveItems)
2015-05-31 16:03:07 +12:00
#Debug
self.mdlFlatData.setVerticalHeaderLabels(["Infos générales", "Summary"])
self.tblDebugFlatData.setModel(self.mdlFlatData)
2015-06-01 22:29:06 +12:00
self.tblDebugPersos.setModel(self.mdlPersos)
self.tblDebugPersosInfos.setModel(self.mdlPersosInfos)
2015-06-02 10:06:17 +12:00
self.treeDebugOutline.setModel(self.mdlOutline)
2015-05-31 16:03:07 +12:00
self.loadProject("test_project")
2015-06-02 10:06:17 +12:00
####################################################################################################
# OUTLINE #
####################################################################################################
def outlineAddItem(self, type="folder"):
2015-06-03 00:44:04 +12:00
if len(self.treeRedacOutline.selectedIndexes()) == 0:
parent = QModelIndex()
else:
parent = self.treeRedacOutline.currentIndex()
2015-06-02 10:06:17 +12:00
item = outlineItem("Nouveau", type)
2015-06-03 00:44:04 +12:00
self.mdlOutline.appendItem(item, parent)
2015-06-02 10:06:17 +12:00
2015-06-03 00:40:48 +12:00
def outlineRemoveItems(self):
for idx in self.treeRedacOutline.selectedIndexes():
if idx.isValid():
self.mdlOutline.removeIndex(idx)
2015-06-02 10:06:17 +12:00
2015-06-01 08:41:32 +12:00
####################################################################################################
# PERSOS #
####################################################################################################
2015-05-31 16:03:07 +12:00
def createPerso(self):
2015-06-01 08:41:32 +12:00
"Creates a perso by adding a row in mdlPersos and a column in mdlPersosInfos with same ID"
2015-05-31 16:03:07 +12:00
p = QStandardItem("Nouveau perso")
2015-06-01 08:41:32 +12:00
self.mdlPersos.appendRow(p)
pid = self.getPersosID()
self.checkPersosID() # Attributes a persoID (which is logically pid)
# Add column in persos infos
self.mdlPersosInfos.insertColumn(self.mdlPersosInfos.columnCount(), [QStandardItem(pid)])
2015-05-31 16:03:07 +12:00
self.mdlPersosInfos.setHorizontalHeaderItem(self.mdlPersosInfos.columnCount()-1, QStandardItem("Valeur"))
2015-06-01 08:41:32 +12:00
def getPersosID(self):
"Returns an unused perso ID (row 1)"
vals = []
for i in range(self.mdlPersos.rowCount()):
2015-06-01 22:29:06 +12:00
item = self.mdlPersos.item(i, Perso.ID.value)
2015-06-01 08:41:32 +12:00
if item and item.text():
vals.append(int(item.text()))
k = 0
while k in vals: k += 1
return str(k)
def checkPersosID(self):
"Checks whether some persos ID (row 1) are empty, if so, assign an ID"
empty = []
for i in range(self.mdlPersos.rowCount()):
2015-06-01 22:29:06 +12:00
item = self.mdlPersos.item(i, Perso.ID.value)
2015-06-01 08:41:32 +12:00
if not item:
item = QStandardItem()
item.setText(self.getPersosID())
2015-06-01 22:29:06 +12:00
self.mdlPersos.setItem(i, Perso.ID.value, item)
2015-05-31 16:03:07 +12:00
def removePerso(self):
i = self.lstPersos.currentIndex()
self.mdlPersos.takeRow(i.row())
self.mdlPersosInfos.takeColumn(i.row()+1)
2015-06-01 08:41:32 +12:00
def changeCurrentPerso(self, trash=None):
idx = self.lstPersos.currentIndex()
2015-06-01 22:29:06 +12:00
pid = self.mdlPersos.item(idx.row(), Perso.ID.value).text()
for c in range(self.mdlPersosInfos.columnCount()):
pid2 = self.mdlPersosInfos.item(0, c).text()
self.tblPersoInfos.setColumnHidden(c, c <> 0 and pid <> pid2)
2015-05-31 16:03:07 +12:00
2015-06-01 08:41:32 +12:00
self.resizePersosInfos()
def resizePersosInfos(self):
self.tblPersoInfos.resizeColumnToContents(0)
w = self.tblPersoInfos.viewport().width()
w2 = self.tblPersoInfos.columnWidth(0)
current = self.lstPersos.currentIndex().row() + 1
self.tblPersoInfos.setColumnWidth(current, w - w2)
####################################################################################################
# GENERAL #
####################################################################################################
def loadProject(self, project):
self.currentProject = project
loadStandardItemModelXML(self.mdlFlatData, "{}/flatModel.xml".format(project))
loadStandardItemModelXML(self.mdlPersos, "{}/perso.xml".format(project))
loadStandardItemModelXML(self.mdlPersosInfos, "{}/persoInfos.xml".format(project))
2015-06-04 04:40:19 +12:00
self.mdlOutline.loadFromXML("{}/outline.xml".format(project))
2015-06-01 08:41:32 +12:00
# Stuff
self.checkPersosID()
2015-06-01 22:29:06 +12:00
# Adds header labels
self.mdlPersos.setHorizontalHeaderLabels(
[i.name for i in Perso])
2015-06-01 08:41:32 +12:00
2015-05-31 16:03:07 +12:00
def readSettings(self):
# Load State and geometry
settings = QSettings(qApp.organizationName(), qApp.applicationName())
2015-06-04 04:40:19 +12:00
self.restoreGeometry(settings.value("geometry"))
self.restoreState(settings.value("windowState"))
2015-05-31 16:03:07 +12:00
def closeEvent(self, event):
# Save State and geometry
settings = QSettings(qApp.organizationName(), qApp.applicationName())
settings.setValue("geometry", self.saveGeometry())
settings.setValue("windowState", self.saveState())
# Save data from models
saveStandardItemModelXML(self.mdlFlatData, "{}/flatModel.xml".format(self.currentProject))
saveStandardItemModelXML(self.mdlPersos, "{}/perso.xml".format(self.currentProject))
saveStandardItemModelXML(self.mdlPersosInfos, "{}/persoInfos.xml".format(self.currentProject))
2015-06-04 04:40:19 +12:00
self.mdlOutline.saveToXML("{}/outline.xml".format(self.currentProject))
2015-05-31 16:03:07 +12:00
# closeEvent
QMainWindow.closeEvent(self, event)
2015-05-28 13:32:09 +12:00
def clickCycle(self, i):
if i == 0: # step 2 - paragraph summary
self.tabMain.setCurrentIndex(1)
self.tabSummary.setCurrentIndex(1)
if i == 1: # step 3 - characters summary
self.tabMain.setCurrentIndex(2)
self.tabPersos.setCurrentIndex(0)
if i == 2: # step 4 - page summary
self.tabMain.setCurrentIndex(1)
self.tabSummary.setCurrentIndex(2)
if i == 3: # step 5 - characters description
self.tabMain.setCurrentIndex(2)
self.tabPersos.setCurrentIndex(1)
if i == 4: # step 6 - four page synopsis
self.tabMain.setCurrentIndex(1)
self.tabSummary.setCurrentIndex(3)
if i == 5: # step 7 - full character charts
self.tabMain.setCurrentIndex(2)
self.tabPersos.setCurrentIndex(2)
if i == 6: # step 8 - scene list
self.tabMain.setCurrentIndex(3)
2015-05-31 16:03:07 +12:00
"Updates word counts over tabs"
def wordCount(self, i):
src= {
0:self.txtSummarySentance,
1:self.txtSummaryPara,
2:self.txtSummaryPage,
3:self.txtSummaryFull
2015-05-28 13:32:09 +12:00
}[i]
lbl = {
0:self.lblSummaryWCSentance,
1:self.lblSummaryWCPara,
2:self.lblSummaryWCPage,
3:self.lblSummaryWCFull
}[i]
2015-06-04 04:40:19 +12:00
wc = len(src.toPlainText().strip().split(" ")) if src.toPlainText() else 0
2015-05-28 13:32:09 +12:00
if i in [2, 3]: pages = " (~{} pages)".format(int(wc / 25) / 10.)
else: pages = ""
lbl.setText("Mots: {}{}".format(wc, pages))