New feature: story line (work in progress)

This commit is contained in:
Olivier Keshavjee 2016-02-27 19:56:55 +01:00
parent 461eb0715e
commit e73a89c079
6 changed files with 417 additions and 111 deletions

View file

@ -699,6 +699,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.treeOutlineOutline.setModel(self.mdlOutline)
# self.redacEditor.setModel(self.mdlOutline)
self.storylineView.setModel(self.mdlPlots)
self.treeOutlineOutline.selectionModel().selectionChanged.connect(lambda:
self.outlineItemEditor.selectionChanged(
@ -799,6 +800,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.toolbar.addCustomWidget(self.tr("Book summary"), self.grpPlotSummary, self.TabPlots)
self.toolbar.addCustomWidget(self.tr("Project tree"), self.treeRedacWidget, self.TabRedac)
self.toolbar.addCustomWidget(self.tr("Metadata"), self.redacMetadata, self.TabRedac)
self.toolbar.addCustomWidget(self.tr("Story line"), self.storylineView, self.TabRedac)
# Custom "tab" bar on the left
self.lstTabs.setIconSize(QSize(48, 48))
@ -838,9 +840,12 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.splitterOutlineV.setStretchFactor(0, 75)
self.splitterOutlineV.setStretchFactor(1, 25)
self.splitterRedac.setStretchFactor(0, 30)
self.splitterRedac.setStretchFactor(1, 40)
self.splitterRedac.setStretchFactor(2, 30)
# self.splitterRedacV.setStretchFactor(0, 55)
# self.splitterRedacV.setStretchFactor(1, 25)
self.splitterRedacH.setStretchFactor(0, 30)
self.splitterRedacH.setStretchFactor(1, 40)
self.splitterRedacH.setStretchFactor(2, 30)
# QFormLayout stretch
for w in [self.txtWorldDescription, self.txtWorldPassion, self.txtWorldConflict]:

View file

@ -2,8 +2,7 @@
# Form implementation generated from reading ui file 'manuskript/ui/mainWindow.ui'
#
# Created: Mon Feb 8 11:20:10 2016
# by: PyQt5 UI code generator 5.2.1
# Created by: PyQt5 UI code generator 5.4.2
#
# WARNING! All changes made in this file will be lost!
@ -17,8 +16,8 @@ class Ui_MainWindow(object):
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.centralwidget)
self.horizontalLayout_2.setSpacing(0)
self.horizontalLayout_2.setContentsMargins(0, 6, 0, 0)
self.horizontalLayout_2.setSpacing(0)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.stack = QtWidgets.QStackedWidget(self.centralwidget)
self.stack.setObjectName("stack")
@ -809,7 +808,6 @@ class Ui_MainWindow(object):
self.layoutWidget = QtWidgets.QWidget(self.splitterOutlineH)
self.layoutWidget.setObjectName("layoutWidget")
self.verticalLayout_14 = QtWidgets.QVBoxLayout(self.layoutWidget)
self.verticalLayout_14.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_14.setObjectName("verticalLayout_14")
self.splitterOutlineV = QtWidgets.QSplitter(self.layoutWidget)
self.splitterOutlineV.setOrientation(QtCore.Qt.Vertical)
@ -869,10 +867,13 @@ class Ui_MainWindow(object):
self.verticalLayout_15 = QtWidgets.QVBoxLayout(self.lytTabRedac)
self.verticalLayout_15.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_15.setObjectName("verticalLayout_15")
self.splitterRedac = QtWidgets.QSplitter(self.lytTabRedac)
self.splitterRedac.setOrientation(QtCore.Qt.Horizontal)
self.splitterRedac.setObjectName("splitterRedac")
self.treeRedacWidget = QtWidgets.QWidget(self.splitterRedac)
self.splitterRedacV = QtWidgets.QSplitter(self.lytTabRedac)
self.splitterRedacV.setOrientation(QtCore.Qt.Vertical)
self.splitterRedacV.setObjectName("splitterRedacV")
self.splitterRedacH = QtWidgets.QSplitter(self.splitterRedacV)
self.splitterRedacH.setOrientation(QtCore.Qt.Horizontal)
self.splitterRedacH.setObjectName("splitterRedacH")
self.treeRedacWidget = QtWidgets.QWidget(self.splitterRedacH)
self.treeRedacWidget.setObjectName("treeRedacWidget")
self.verticalLayout_30 = QtWidgets.QVBoxLayout(self.treeRedacWidget)
self.verticalLayout_30.setContentsMargins(0, 0, 0, 0)
@ -905,11 +906,13 @@ class Ui_MainWindow(object):
spacerItem16 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
self.horizontalLayout_31.addItem(spacerItem16)
self.verticalLayout_30.addLayout(self.horizontalLayout_31)
self.mainEditor = mainEditor(self.splitterRedac)
self.mainEditor = mainEditor(self.splitterRedacH)
self.mainEditor.setObjectName("mainEditor")
self.redacMetadata = metadataView(self.splitterRedac)
self.redacMetadata = metadataView(self.splitterRedacH)
self.redacMetadata.setObjectName("redacMetadata")
self.verticalLayout_15.addWidget(self.splitterRedac)
self.storylineView = storylineView(self.splitterRedacV)
self.storylineView.setObjectName("storylineView")
self.verticalLayout_15.addWidget(self.splitterRedacV)
self.tabMain.addTab(self.lytTabRedac, "")
self.lytTabDebug = QtWidgets.QWidget()
self.lytTabDebug.setObjectName("lytTabDebug")
@ -989,7 +992,7 @@ class Ui_MainWindow(object):
self.horizontalLayout_2.addWidget(self.stack)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1112, 20))
self.menubar.setGeometry(QtCore.QRect(0, 0, 1112, 30))
self.menubar.setObjectName("menubar")
self.menuFile = QtWidgets.QMenu(self.menubar)
self.menuFile.setObjectName("menuFile")
@ -1159,7 +1162,7 @@ class Ui_MainWindow(object):
self.retranslateUi(MainWindow)
self.stack.setCurrentIndex(1)
self.tabMain.setCurrentIndex(4)
self.tabMain.setCurrentIndex(6)
self.tabSummary.setCurrentIndex(0)
self.tabPersos.setCurrentIndex(0)
self.tabPlot.setCurrentIndex(0)
@ -1294,19 +1297,20 @@ class Ui_MainWindow(object):
self.actCloseProject.setText(_translate("MainWindow", "&Close project"))
self.actCompile.setText(_translate("MainWindow", "Co&mpile"))
self.actCompile.setShortcut(_translate("MainWindow", "F6"))
self.actToolFrequency.setText(_translate("MainWindow", "Frequency Analyzer"))
self.actToolFrequency.setText(_translate("MainWindow", "&Frequency Analyzer"))
from manuskript.ui.welcome import welcome
from manuskript.ui.views.metadataView import metadataView
from manuskript.ui.views.basicItemView import basicItemView
from manuskript.ui.editors.mainEditor import mainEditor
from manuskript.ui.views.plotTreeView import plotTreeView
from manuskript.ui.sldImportance import sldImportance
from manuskript.ui.views.textEditCompleter import textEditCompleter
from manuskript.ui.views.treeView import treeView
from manuskript.ui.views.persoTreeView import persoTreeView
from manuskript.ui.search import search
from manuskript.ui.cheatSheet import cheatSheet
from manuskript.ui.views.outlineView import outlineView
from manuskript.ui.views.textEditView import textEditView
from manuskript.ui.editors.mainEditor import mainEditor
from manuskript.ui.search import search
from manuskript.ui.sldImportance import sldImportance
from manuskript.ui.views.basicItemView import basicItemView
from manuskript.ui.views.lineEditView import lineEditView
from manuskript.ui.views.metadataView import metadataView
from manuskript.ui.views.outlineView import outlineView
from manuskript.ui.views.persoTreeView import persoTreeView
from manuskript.ui.views.plotTreeView import plotTreeView
from manuskript.ui.views.storylineView import storylineView
from manuskript.ui.views.textEditCompleter import textEditCompleter
from manuskript.ui.views.textEditView import textEditView
from manuskript.ui.views.treeView import treeView
from manuskript.ui.welcome import welcome

View file

@ -124,7 +124,7 @@
<enum>QTabWidget::Rounded</enum>
</property>
<property name="currentIndex">
<number>4</number>
<number>6</number>
</property>
<property name="documentMode">
<bool>true</bool>
@ -1770,88 +1770,94 @@
<number>0</number>
</property>
<item>
<widget class="QSplitter" name="splitterRedac">
<widget class="QSplitter" name="splitterRedacV">
<property name="orientation">
<enum>Qt::Horizontal</enum>
<enum>Qt::Vertical</enum>
</property>
<widget class="QWidget" name="treeRedacWidget" native="true">
<layout class="QVBoxLayout" name="verticalLayout_30">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="treeView" name="treeRedacOutline">
<property name="editTriggers">
<set>QAbstractItemView::EditKeyPressed</set>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_31">
<item>
<widget class="QPushButton" name="btnRedacAddFolder">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset theme="folder-new">
<normaloff>../../../../../../../.designer/backup</normaloff>../../../../../../../.designer/backup</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnRedacAddText">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset theme="document-new">
<normaloff>../../../../../../../.designer/backup</normaloff>../../../../../../../.designer/backup</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnRedacRemoveItem">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset theme="list-remove">
<normaloff>../../../../../../../.designer/backup</normaloff>../../../../../../../.designer/backup</iconset>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_7">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
<widget class="QSplitter" name="splitterRedacH">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<widget class="QWidget" name="treeRedacWidget" native="true">
<layout class="QVBoxLayout" name="verticalLayout_30">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="treeView" name="treeRedacOutline">
<property name="editTriggers">
<set>QAbstractItemView::EditKeyPressed</set>
</property>
<attribute name="headerVisible">
<bool>false</bool>
</attribute>
</widget>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_31">
<item>
<widget class="QPushButton" name="btnRedacAddFolder">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset theme="folder-new">
<normaloff>../../../../../../../.designer/backup</normaloff>../../../../../../../.designer/backup</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnRedacAddText">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset theme="document-new">
<normaloff>../../../../../../../.designer/backup</normaloff>../../../../../../../.designer/backup</iconset>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnRedacRemoveItem">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset theme="list-remove">
<normaloff>../../../../../../../.designer/backup</normaloff>../../../../../../../.designer/backup</iconset>
</property>
</widget>
</item>
<item>
<spacer name="horizontalSpacer_7">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="mainEditor" name="mainEditor" native="true"/>
<widget class="metadataView" name="redacMetadata" native="true"/>
</widget>
<widget class="mainEditor" name="mainEditor" native="true"/>
<widget class="metadataView" name="redacMetadata" native="true"/>
<widget class="storylineView" name="storylineView" native="true"/>
</widget>
</item>
</layout>
@ -1967,7 +1973,7 @@
<x>0</x>
<y>0</y>
<width>1112</width>
<height>20</height>
<height>30</height>
</rect>
</property>
<widget class="QMenu" name="menuFile">
@ -2323,7 +2329,7 @@ QListView::item:hover {
</action>
<action name="actToolFrequency">
<property name="text">
<string>Frequency Analyzer</string>
<string>&amp;Frequency Analyzer</string>
</property>
</action>
</widget>
@ -2405,6 +2411,12 @@ QListView::item:hover {
<extends>QTextEdit</extends>
<header>manuskript.ui.views.textEditCompleter.h</header>
</customwidget>
<customwidget>
<class>storylineView</class>
<extends>QWidget</extends>
<header>manuskript.ui.views.storylineView.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections>

View file

@ -0,0 +1,89 @@
#!/usr/bin/env python
# --!-- coding: utf8 --!--
from PyQt5.QtCore import Qt
from PyQt5.QtGui import QBrush, QPen
from PyQt5.QtWidgets import QWidget, QGraphicsScene, QGraphicsSimpleTextItem, QMenu, QAction
from manuskript.functions import randomColor
from manuskript.ui.views.storylineView_ui import Ui_storylineView
class storylineView(QWidget, Ui_storylineView):
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.setupUi(self)
self._mdlPlots = None
self.btnRefresh.clicked.connect(self.refresh)
self.scene = QGraphicsScene()
self.view.setScene(self.scene)
self.generateMenu()
def generateMenu(self):
m = QMenu()
for i in [
self.tr("Show Plots"),
self.tr("Show Characters"),
self.tr("Show Objects"),
]:
a = QAction(i, m)
a.setCheckable(True)
a.setEnabled(False)
m.addAction(a)
self.btnSettings.setMenu(m)
def setModel(self, mdlPlots):
self._mdlPlots = mdlPlots
self._mdlPlots.dataChanged.connect(self.refresh)
self._mdlPlots.rowsInserted.connect(self.refresh)
def refresh(self):
if not self._mdlPlots:
pass
LINE_HEIGHT = 32
LINE_SPACING = 6
RECT_WIDTH = 200
TOTAL_WIDTH = 4000
s = self.scene
s.clear()
plotsID = self._mdlPlots.getPlotsByImportance()
i = 0
plots = []
# Add Plots
for importance in plotsID:
for ID in importance:
name = self._mdlPlots.getPlotNameByID(ID)
print(ID, name)
color = randomColor()
# Rect
r = s.addRect(0, 0, RECT_WIDTH, LINE_HEIGHT)
r.setPen(QPen(Qt.NoPen))
r.setBrush(QBrush(color))
r.setPos(0, i * LINE_HEIGHT + i * LINE_SPACING)
i += 1
# Text
txt = QGraphicsSimpleTextItem(name, r)
txt.setPos(r.boundingRect().center() - txt.boundingRect().center())
# Line
line = s.addLine(10, LINE_HEIGHT / 2, TOTAL_WIDTH, LINE_HEIGHT / 2)
line.setParentItem(r)
line.setPen(QPen(color, 5))
line.setZValue(-10)
plots.append((ID, r))
# Add Folders and Texts
# self.view.fitInView(0, 0, TOTAL_WIDTH, i * LINE_HEIGHT, Qt.KeepAspectRatioByExpanding) # KeepAspectRatio
self.view.setSceneRect()

View file

@ -0,0 +1,63 @@
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'manuskript/ui/views/storylineView_ui.ui'
#
# Created by: PyQt5 UI code generator 5.4.2
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_storylineView(object):
def setupUi(self, storylineView):
storylineView.setObjectName("storylineView")
storylineView.resize(1040, 130)
self.horizontalLayout = QtWidgets.QHBoxLayout(storylineView)
self.horizontalLayout.setContentsMargins(0, 0, 0, 0)
self.horizontalLayout.setSpacing(0)
self.horizontalLayout.setObjectName("horizontalLayout")
self.verticalLayout = QtWidgets.QVBoxLayout()
self.verticalLayout.setSpacing(0)
self.verticalLayout.setObjectName("verticalLayout")
self.btnZoomIn = QtWidgets.QPushButton(storylineView)
self.btnZoomIn.setMaximumSize(QtCore.QSize(32, 32))
self.btnZoomIn.setFlat(True)
self.btnZoomIn.setObjectName("btnZoomIn")
self.verticalLayout.addWidget(self.btnZoomIn)
self.btnZoomOut = QtWidgets.QPushButton(storylineView)
self.btnZoomOut.setMaximumSize(QtCore.QSize(32, 32))
self.btnZoomOut.setFlat(True)
self.btnZoomOut.setObjectName("btnZoomOut")
self.verticalLayout.addWidget(self.btnZoomOut)
self.btnRefresh = QtWidgets.QPushButton(storylineView)
self.btnRefresh.setMaximumSize(QtCore.QSize(32, 32))
self.btnRefresh.setText("")
icon = QtGui.QIcon.fromTheme("view-refresh")
self.btnRefresh.setIcon(icon)
self.btnRefresh.setFlat(True)
self.btnRefresh.setObjectName("btnRefresh")
self.verticalLayout.addWidget(self.btnRefresh)
spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout.addItem(spacerItem)
self.btnSettings = QtWidgets.QPushButton(storylineView)
self.btnSettings.setMaximumSize(QtCore.QSize(32, 32))
self.btnSettings.setText("")
icon = QtGui.QIcon.fromTheme("preferences-system")
self.btnSettings.setIcon(icon)
self.btnSettings.setFlat(True)
self.btnSettings.setObjectName("btnSettings")
self.verticalLayout.addWidget(self.btnSettings)
self.horizontalLayout.addLayout(self.verticalLayout)
self.view = QtWidgets.QGraphicsView(storylineView)
self.view.setObjectName("view")
self.horizontalLayout.addWidget(self.view)
self.retranslateUi(storylineView)
QtCore.QMetaObject.connectSlotsByName(storylineView)
def retranslateUi(self, storylineView):
_translate = QtCore.QCoreApplication.translate
storylineView.setWindowTitle(_translate("storylineView", "Form"))
self.btnZoomIn.setText(_translate("storylineView", "+"))
self.btnZoomOut.setText(_translate("storylineView", "-"))

View file

@ -0,0 +1,133 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>storylineView</class>
<widget class="QWidget" name="storylineView">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>1040</width>
<height>130</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout">
<property name="spacing">
<number>0</number>
</property>
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>0</number>
</property>
<item>
<widget class="QPushButton" name="btnZoomIn">
<property name="maximumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string>+</string>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnZoomOut">
<property name="maximumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string>-</string>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="btnRefresh">
<property name="maximumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset theme="view-refresh">
<normaloff/>
</iconset>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="btnSettings">
<property name="maximumSize">
<size>
<width>32</width>
<height>32</height>
</size>
</property>
<property name="text">
<string/>
</property>
<property name="icon">
<iconset theme="preferences-system">
<normaloff/>
</iconset>
</property>
<property name="flat">
<bool>true</bool>
</property>
</widget>
</item>
</layout>
</item>
<item>
<widget class="QGraphicsView" name="view"/>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>