Merge branch 'master' into develop

This commit is contained in:
Olivier Keshavjee 2017-11-27 21:53:37 +01:00
commit cb79e504e7
20 changed files with 4010 additions and 2259 deletions

View file

@ -1,42 +1,67 @@
# Manuskript # Manuskript
[Manuskript](http://www.theologeek.ch/manuskript) is an open-source tool for writers. [Manuskript](http://www.theologeek.ch/manuskript) is an open-source
tool for writers.
![Main view](http://www.theologeek.ch/manuskript/wp-content/uploads/2016/03/manuskript-0.3.0.jpg) Manuskript runs on on GNU/Linux, Mac OS X, and Windows.
![Main view](http://www.theologeek.ch/manuskript/wp-content/uploads/2017/11/manuskript-0.5.0-main-view.jpg)
## Features
Manuskript provides a rich environment to help writers create their
first draft and then further refine and edit their masterpiece.
With Manuskript you can:
* Grow your premise from one sentence, to a paragraph, to a full
summary
* Create characters
* Conceive plots
* Construct outlines
([Outline mode](http://www.theologeek.ch/manuskript/2016/02/05/outliner/)
and/or
[Index cards](http://www.theologeek.ch/manuskript/2016/02/05/index-cards/))
* Write with focus
([Distraction free mode](https://github.com/olivierkes/manuskript/wiki/Full-screen-mode))
* Build worlds
* [Track items](https://github.com/olivierkes/manuskript/wiki/How-to-keep-track-of-important-items)
* Edit and re-organize chapters and scenes
* View [Story line](http://www.theologeek.ch/manuskript/2016/02/28/story-line/)
* Compose with
[fiction or non-fiction templates and writing modes](http://www.theologeek.ch/manuskript/2016/03/31/writing-modes-simple-fiction/)
* Export to HTML, ePub, OpenDocument, DocX, PDF, and
[more](https://github.com/olivierkes/manuskript/wiki/Import-and-Export-capabilities)
## [Download](http://www.theologeek.ch/manuskript/download) Additionally Manuskript can help in many more ways with a spell
checker, markdown highlighter,
[frequency analyzer](http://www.theologeek.ch/manuskript/2016/02/08/frequency-analyzer/),
and automatic save in
[open and plain text file format](http://www.theologeek.ch/manuskript/2016/03/31/open-plain-text-file-format/).
## Running from sources ## Download
To run the application without installing just: [Download](http://www.theologeek.ch/manuskript/download) and install Manuskript today.
* Download [latest code archive](https://github.com/olivierkes/manuskript/archive/master.zip) or clone the repository.
* Run:
* On Linux/Mac: bin/manuskript
Be sure to have all **dependencies** installed!
## Dependencies
- Python 3
- PyQt5
- Qt SVG (`libqt5svg5` on Ubuntu)
- Qt Webkit (`python3-pyqt5.qtwebkit` on Ubuntu)
- lxml (`python3-lxml` on Ubuntu)
Optional:
- pyenchant
- zlib
### To install dependencies on Linux:
- Arch Linux:
```sudo pacman -S --needed python python-pyqt5 qt5-svg python-lxml python-pyenchant zlib```
- Debian based (Ubuntu, Linux Mint, etc.):
```sudo apt-get install python3-pyqt5 libqt5svg5 python3-lxml python3-enchant zlib1g```
Additional packages that might be needed: ``python3-pyqt5.qtwebkit pyqt5-dev-tools``
## HowTo's ## HowTo's
See the [Wiki](http://github.com/olivierkes/manuskript/wiki) for more See the [Wiki](http://github.com/olivierkes/manuskript/wiki) for more
detailed instructions on how to install on GNU/Linux, Windows, and OS X. detailed instructions on how to install and use Manuskript.
## Contribute
You can help improve Manuskript by reporting
[issues](https://github.com/olivierkes/manuskript/issues), writing
[wiki documentation](https://github.com/olivierkes/manuskript/wiki),
and
[translating to other languages](https://github.com/olivierkes/manuskript/wiki/Translate-Manuskript).
See also
[Manuskript Contribute page](http://www.theologeek.ch/manuskript/contribute/).
Manuskript is written in Python3 and PyQt5.
## Free Software
Manuskript is [Free Software](https://www.gnu.org/philosophy/free-sw.html).
You have the freedom to run, copy, distribute, study, change and improve the software.
Manuskript is distributed under the [GNU General Public License](https://www.gnu.org/licenses/gpl.html) version 3 or (at your option) any later version.

1
_config.yml Normal file
View file

@ -0,0 +1 @@
theme: jekyll-theme-cayman

View file

@ -53,13 +53,13 @@ SOURCES += ../manuskript/ui/views/textEditView.py
SOURCES += ../manuskript/ui/views/corkDelegate.py SOURCES += ../manuskript/ui/views/corkDelegate.py
SOURCES += ../manuskript/ui/views/outlineDelegates.py SOURCES += ../manuskript/ui/views/outlineDelegates.py
SOURCES += ../manuskript/ui/views/lineEditView.py SOURCES += ../manuskript/ui/views/lineEditView.py
SOURCES += ../manuskript/ui/views/textEditCompleter.py
SOURCES += ../manuskript/ui/views/cmbOutlineLabelChoser.py SOURCES += ../manuskript/ui/views/cmbOutlineLabelChoser.py
SOURCES += ../manuskript/ui/views/plotDelegate.py SOURCES += ../manuskript/ui/views/plotDelegate.py
SOURCES += ../manuskript/ui/views/plotTreeView.py SOURCES += ../manuskript/ui/views/plotTreeView.py
SOURCES += ../manuskript/ui/views/treeView.py SOURCES += ../manuskript/ui/views/treeView.py
SOURCES += ../manuskript/ui/views/characterTreeView.py SOURCES += ../manuskript/ui/views/characterTreeView.py
SOURCES += ../manuskript/ui/views/storylineView.py SOURCES += ../manuskript/ui/views/storylineView.py
SOURCES += ../manuskript/ui/views/MDEditCompleter.py
SOURCES += ../manuskript/ui/search.py SOURCES += ../manuskript/ui/search.py
SOURCES += ../manuskript/ui/collapsibleDockWidgets.py SOURCES += ../manuskript/ui/collapsibleDockWidgets.py
SOURCES += ../manuskript/ui/exporters/manuskript/plainTextSettings.py SOURCES += ../manuskript/ui/exporters/manuskript/plainTextSettings.py

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

View file

@ -102,8 +102,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# Main Menu # Main Menu
for i in [self.actSave, self.actSaveAs, self.actCloseProject, for i in [self.actSave, self.actSaveAs, self.actCloseProject,
self.menuEdit, self.menuView, self.menuTools, self.menuHelp, self.menuEdit, self.menuView, self.menuOrganize,
self.actImport, self.actCompile, self.actSettings]: self.menuTools, self.menuHelp, self.actImport,
self.actCompile, self.actSettings]:
i.setEnabled(False) i.setEnabled(False)
# Main Menu:: File # Main Menu:: File
@ -122,6 +123,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.actCopy.triggered.connect(self.documentsCopy) self.actCopy.triggered.connect(self.documentsCopy)
self.actCut.triggered.connect(self.documentsCut) self.actCut.triggered.connect(self.documentsCut)
self.actPaste.triggered.connect(self.documentsPaste) self.actPaste.triggered.connect(self.documentsPaste)
self.actRename.triggered.connect(self.documentsRename)
self.actDuplicate.triggered.connect(self.documentsDuplicate) self.actDuplicate.triggered.connect(self.documentsDuplicate)
self.actDelete.triggered.connect(self.documentsDelete) self.actDelete.triggered.connect(self.documentsDelete)
self.actMoveUp.triggered.connect(self.documentsMoveUp) self.actMoveUp.triggered.connect(self.documentsMoveUp)
@ -209,7 +211,14 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def tabMainChanged(self): def tabMainChanged(self):
"Called when main tab changes." "Called when main tab changes."
self.menuDocuments.menuAction().setVisible(self.tabMain.currentIndex() == self.TabRedac) tabIsEditor = self.tabMain.currentIndex() == self.TabRedac
self.menuOrganize.menuAction().setEnabled(tabIsEditor)
for i in [self.actCut,
self.actCopy,
self.actPaste,
self.actDelete,
self.actRename]:
i.setEnabled(tabIsEditor)
def focusChanged(self, old, new): def focusChanged(self, old, new):
""" """
@ -449,6 +458,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
def documentsPaste(self): def documentsPaste(self):
"Paste clipboard item(s) into selected item." "Paste clipboard item(s) into selected item."
if self._lastFocus: self._lastFocus.paste() if self._lastFocus: self._lastFocus.paste()
def documentsRename(self):
"Rename selected item."
if self._lastFocus: self._lastFocus.rename()
def documentsDuplicate(self): def documentsDuplicate(self):
"Duplicate selected item(s)." "Duplicate selected item(s)."
if self._lastFocus: self._lastFocus.duplicate() if self._lastFocus: self._lastFocus.duplicate()
@ -559,8 +571,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
for i in [self.actOpen, self.menuRecents]: for i in [self.actOpen, self.menuRecents]:
i.setEnabled(False) i.setEnabled(False)
for i in [self.actSave, self.actSaveAs, self.actCloseProject, for i in [self.actSave, self.actSaveAs, self.actCloseProject,
self.menuEdit, self.menuView, self.menuTools, self.menuHelp, self.menuEdit, self.menuView, self.menuOrganize,
self.actImport, self.actCompile, self.actSettings]: self.menuTools, self.menuHelp, self.actImport,
self.actCompile, self.actSettings]:
i.setEnabled(True) i.setEnabled(True)
# Add project name to Window's name # Add project name to Window's name
@ -603,8 +616,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
for i in [self.actOpen, self.menuRecents]: for i in [self.actOpen, self.menuRecents]:
i.setEnabled(True) i.setEnabled(True)
for i in [self.actSave, self.actSaveAs, self.actCloseProject, for i in [self.actSave, self.actSaveAs, self.actCloseProject,
self.menuEdit, self.menuView, self.menuTools, self.menuHelp, self.menuEdit, self.menuView, self.menuOrganize,
self.actImport, self.actCompile, self.actSettings]: self.menuTools, self.menuHelp, self.actImport,
self.actCompile, self.actSettings]:
i.setEnabled(False) i.setEnabled(False)
# Set Window's name - no project loaded # Set Window's name - no project loaded
@ -1140,12 +1154,12 @@ class MainWindow(QMainWindow, Ui_MainWindow):
# Help box # Help box
references = [ references = [
(self.lytTabOverview, (self.lytTabOverview,
self.tr("Enter informations about your book, and yourself."), self.tr("Enter information about your book, and yourself."),
0), 0),
(self.lytSituation, (self.lytSituation,
self.tr( self.tr(
"""The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous """The basic situation, in the form of a 'What if...?' question. Ex: 'What if the most dangerous
evil wizard could wasn't abled to kill a baby?' (Harry Potter)"""), evil wizard wasn't able to kill a baby?' (Harry Potter)"""),
1), 1),
(self.lytSummary, (self.lytSummary,
self.tr( self.tr(

View file

@ -35,14 +35,14 @@ class aboutDialog(QWidget, Ui_about):
GNU General Public License Version 3 GNU General Public License Version 3
</a><br>""" </a><br>"""
) )
self.labelManuskriptVersion.setOpenExternalLinks(True) self.labelManuskriptVersion.setOpenExternalLinks(True)
self.labelSoftwareVersion.setText( self.labelSoftwareVersion.setText(
"<b>" + self.tr("Software Versions in Use:") + "</b><br>" "<b>" + self.tr("Software Versions in Use:") + "</b><br>"
+ "&nbsp;"*5 + self.tr("Python") + " " + python_version() + "<br>" + "&nbsp;"*5 + "Python " + python_version() + "<br>"
+ "&nbsp;"*5 + self.tr("PyQt") + " " + PYQT_VERSION_STR + "<br>" + "&nbsp;"*5 + "PyQt " + PYQT_VERSION_STR + "<br>"
+ "&nbsp;"*5 + self.tr("Qt") + " " + QT_VERSION_STR + "&nbsp;"*5 + "Qt " + QT_VERSION_STR
) )
#self.labelPythonVersion.setText() #self.labelPythonVersion.setText()
#self.labelPyQtVersion.setText() #self.labelPyQtVersion.setText()

View file

@ -395,6 +395,8 @@ class editorWidget(QWidget, Ui_editorWidget_ui):
if self.getCurrentItemView(): self.getCurrentItemView().cut() if self.getCurrentItemView(): self.getCurrentItemView().cut()
def paste(self): def paste(self):
if self.getCurrentItemView(): self.getCurrentItemView().paste() if self.getCurrentItemView(): self.getCurrentItemView().paste()
def rename(self):
if self.getCurrentItemView(): self.getCurrentItemView().rename()
def duplicate(self): def duplicate(self):
if self.getCurrentItemView(): self.getCurrentItemView().duplicate() if self.getCurrentItemView(): self.getCurrentItemView().duplicate()
def delete(self): def delete(self):

View file

@ -22,14 +22,14 @@ except:
class mainEditor(QWidget, Ui_mainEditor): class mainEditor(QWidget, Ui_mainEditor):
""" """
`mainEditor` is responsible for opening `outlineItem`s and offering informations `mainEditor` is responsible for opening `outlineItem`s and offering information
and commands about those `outlineItem`s to the used. and commands about those `outlineItem`s to the used.
It contains two main elements: It contains two main elements:
1. A `tabSplitter`, which can open any numer of `outlineItem`s either in tabs 1. A `tabSplitter`, which can open any numer of `outlineItem`s either in tabs
(in `QTabWidget`) and/or in splitted views (children `tabSplitter`s). (in `QTabWidget`) and/or in splitted views (children `tabSplitter`s).
2. An horizontal layout contain a number of buttons and informations: 2. An horizontal layout contain a number of buttons and information:
- Go up button - Go up button
- Select folder view: either "text", "cork" or "outline" (see `editorWidget`) - Select folder view: either "text", "cork" or "outline" (see `editorWidget`)
@ -252,6 +252,7 @@ class mainEditor(QWidget, Ui_mainEditor):
def copy(self): self.currentEditor().copy() def copy(self): self.currentEditor().copy()
def cut(self): self.currentEditor().cut() def cut(self): self.currentEditor().cut()
def paste(self): self.currentEditor().paste() def paste(self): self.currentEditor().paste()
def rename(self): self.currentEditor().rename()
def duplicate(self): self.currentEditor().duplicate() def duplicate(self): self.currentEditor().duplicate()
def delete(self): self.currentEditor().delete() def delete(self): self.currentEditor().delete()
def moveUp(self): self.currentEditor().moveUp() def moveUp(self): self.currentEditor().moveUp()

View file

@ -12,6 +12,7 @@ class Ui_generalSettings(object):
def setupUi(self, generalSettings): def setupUi(self, generalSettings):
generalSettings.setObjectName("generalSettings") generalSettings.setObjectName("generalSettings")
generalSettings.resize(267, 401) generalSettings.resize(267, 401)
generalSettings.setWindowTitle("Form")
self.verticalLayout_2 = QtWidgets.QVBoxLayout(generalSettings) self.verticalLayout_2 = QtWidgets.QVBoxLayout(generalSettings)
self.verticalLayout_2.setContentsMargins(0, 0, 0, 0) self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
self.verticalLayout_2.setSpacing(10) self.verticalLayout_2.setSpacing(10)
@ -58,7 +59,6 @@ class Ui_generalSettings(object):
def retranslateUi(self, generalSettings): def retranslateUi(self, generalSettings):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
generalSettings.setWindowTitle(_translate("generalSettings", "Form"))
self.chkGeneralSplitScenes.setText(_translate("generalSettings", "Split scenes at:")) self.chkGeneralSplitScenes.setText(_translate("generalSettings", "Split scenes at:"))
self.txtGeneralSplitScenes.setPlaceholderText(_translate("generalSettings", "\\n---\\n")) self.txtGeneralSplitScenes.setPlaceholderText(_translate("generalSettings", "\\n---\\n"))
self.chkGeneralTrimTitles.setText(_translate("generalSettings", "Trim long titles (> 32 chars)")) self.chkGeneralTrimTitles.setText(_translate("generalSettings", "Trim long titles (> 32 chars)"))

View file

@ -11,22 +11,13 @@
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string notr="true">Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<property name="spacing"> <property name="spacing">
<number>10</number> <number>10</number>
</property> </property>
<property name="leftMargin"> <property name="margin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
@ -50,16 +41,7 @@
<string>General</string> <string>General</string>
</attribute> </attribute>
<layout class="QVBoxLayout" name="verticalLayout_5"> <layout class="QVBoxLayout" name="verticalLayout_5">
<property name="leftMargin"> <property name="margin">
<number>6</number>
</property>
<property name="topMargin">
<number>6</number>
</property>
<property name="rightMargin">
<number>6</number>
</property>
<property name="bottomMargin">
<number>6</number> <number>6</number>
</property> </property>
<item> <item>
@ -77,7 +59,7 @@
<item row="3" column="1"> <item row="3" column="1">
<widget class="QLineEdit" name="txtGeneralSplitScenes"> <widget class="QLineEdit" name="txtGeneralSplitScenes">
<property name="text"> <property name="text">
<string/> <string notr="true"/>
</property> </property>
<property name="placeholderText"> <property name="placeholderText">
<string>\n---\n</string> <string>\n---\n</string>

View file

@ -1044,8 +1044,8 @@ class Ui_MainWindow(object):
self.menuView.setObjectName("menuView") self.menuView.setObjectName("menuView")
self.menuMode = QtWidgets.QMenu(self.menuView) self.menuMode = QtWidgets.QMenu(self.menuView)
self.menuMode.setObjectName("menuMode") self.menuMode.setObjectName("menuMode")
self.menuDocuments = QtWidgets.QMenu(self.menubar) self.menuOrganize = QtWidgets.QMenu(self.menubar)
self.menuDocuments.setObjectName("menuDocuments") self.menuOrganize.setObjectName("menuOrganize")
MainWindow.setMenuBar(self.menubar) MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar") self.statusbar.setObjectName("statusbar")
@ -1210,6 +1210,10 @@ class Ui_MainWindow(object):
icon = QtGui.QIcon.fromTheme("arrow-down") icon = QtGui.QIcon.fromTheme("arrow-down")
self.actMoveDown.setIcon(icon) self.actMoveDown.setIcon(icon)
self.actMoveDown.setObjectName("actMoveDown") self.actMoveDown.setObjectName("actMoveDown")
self.actRename = QtWidgets.QAction(MainWindow)
icon = QtGui.QIcon.fromTheme("edit-rename")
self.actRename.setIcon(icon)
self.actRename.setObjectName("actRename")
self.menuFile.addAction(self.actOpen) self.menuFile.addAction(self.actOpen)
self.menuFile.addAction(self.menuRecents.menuAction()) self.menuFile.addAction(self.menuRecents.menuAction())
self.menuFile.addAction(self.actSave) self.menuFile.addAction(self.actSave)
@ -1224,6 +1228,12 @@ class Ui_MainWindow(object):
self.menuHelp.addAction(self.actAbout) self.menuHelp.addAction(self.actAbout)
self.menuTools.addAction(self.actSpellcheck) self.menuTools.addAction(self.actSpellcheck)
self.menuTools.addAction(self.actToolFrequency) self.menuTools.addAction(self.actToolFrequency)
self.menuEdit.addAction(self.actCut)
self.menuEdit.addAction(self.actCopy)
self.menuEdit.addAction(self.actPaste)
self.menuEdit.addAction(self.actDelete)
self.menuEdit.addAction(self.actRename)
self.menuEdit.addSeparator()
self.menuEdit.addAction(self.actLabels) self.menuEdit.addAction(self.actLabels)
self.menuEdit.addAction(self.actStatus) self.menuEdit.addAction(self.actStatus)
self.menuEdit.addAction(self.actSettings) self.menuEdit.addAction(self.actSettings)
@ -1232,21 +1242,15 @@ class Ui_MainWindow(object):
self.menuMode.addAction(self.actModeSnowflake) self.menuMode.addAction(self.actModeSnowflake)
self.menuView.addAction(self.menuMode.menuAction()) self.menuView.addAction(self.menuMode.menuAction())
self.menuView.addSeparator() self.menuView.addSeparator()
self.menuDocuments.addAction(self.actCopy) self.menuOrganize.addAction(self.actMoveUp)
self.menuDocuments.addAction(self.actCut) self.menuOrganize.addAction(self.actMoveDown)
self.menuDocuments.addAction(self.actPaste) self.menuOrganize.addSeparator()
self.menuDocuments.addAction(self.actDuplicate) self.menuOrganize.addAction(self.actMerge)
self.menuDocuments.addAction(self.actDelete) self.menuOrganize.addAction(self.actSplitDialog)
self.menuDocuments.addSeparator() self.menuOrganize.addAction(self.actSplitCursor)
self.menuDocuments.addAction(self.actMoveUp)
self.menuDocuments.addAction(self.actMoveDown)
self.menuDocuments.addSeparator()
self.menuDocuments.addAction(self.actMerge)
self.menuDocuments.addAction(self.actSplitDialog)
self.menuDocuments.addAction(self.actSplitCursor)
self.menubar.addAction(self.menuFile.menuAction()) self.menubar.addAction(self.menuFile.menuAction())
self.menubar.addAction(self.menuEdit.menuAction()) self.menubar.addAction(self.menuEdit.menuAction())
self.menubar.addAction(self.menuDocuments.menuAction()) self.menubar.addAction(self.menuOrganize.menuAction())
self.menubar.addAction(self.menuView.menuAction()) self.menubar.addAction(self.menuView.menuAction())
self.menubar.addAction(self.menuTools.menuAction()) self.menubar.addAction(self.menuTools.menuAction())
self.menubar.addAction(self.menuHelp.menuAction()) self.menubar.addAction(self.menuHelp.menuAction())
@ -1270,10 +1274,10 @@ class Ui_MainWindow(object):
def retranslateUi(self, MainWindow): def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate _translate = QtCore.QCoreApplication.translate
self.grpBookInfos.setTitle(_translate("MainWindow", "Book informations")) self.grpBookInfos.setTitle(_translate("MainWindow", "Book information"))
self.label_10.setText(_translate("MainWindow", "Title")) self.label_10.setText(_translate("MainWindow", "Title"))
self.label_11.setText(_translate("MainWindow", "Subtitle")) self.label_11.setText(_translate("MainWindow", "Subtitle"))
self.label_12.setText(_translate("MainWindow", "Serie")) self.label_12.setText(_translate("MainWindow", "Series"))
self.label_13.setText(_translate("MainWindow", "Volume")) self.label_13.setText(_translate("MainWindow", "Volume"))
self.label_14.setText(_translate("MainWindow", "Genre")) self.label_14.setText(_translate("MainWindow", "Genre"))
self.label_16.setText(_translate("MainWindow", "License")) self.label_16.setText(_translate("MainWindow", "License"))
@ -1358,13 +1362,13 @@ class Ui_MainWindow(object):
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Labels")) self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Labels"))
self.tabMain.setTabText(self.tabMain.indexOf(self.lytTabDebug), _translate("MainWindow", "Debug")) self.tabMain.setTabText(self.tabMain.indexOf(self.lytTabDebug), _translate("MainWindow", "Debug"))
self.menuFile.setTitle(_translate("MainWindow", "&File")) self.menuFile.setTitle(_translate("MainWindow", "&File"))
self.menuRecents.setTitle(_translate("MainWindow", "&Recents")) self.menuRecents.setTitle(_translate("MainWindow", "&Recent"))
self.menuHelp.setTitle(_translate("MainWindow", "&Help")) self.menuHelp.setTitle(_translate("MainWindow", "&Help"))
self.menuTools.setTitle(_translate("MainWindow", "&Tools")) self.menuTools.setTitle(_translate("MainWindow", "&Tools"))
self.menuEdit.setTitle(_translate("MainWindow", "&Edit")) self.menuEdit.setTitle(_translate("MainWindow", "&Edit"))
self.menuView.setTitle(_translate("MainWindow", "&View")) self.menuView.setTitle(_translate("MainWindow", "&View"))
self.menuMode.setTitle(_translate("MainWindow", "&Mode")) self.menuMode.setTitle(_translate("MainWindow", "&Mode"))
self.menuDocuments.setTitle(_translate("MainWindow", "&Documents")) self.menuOrganize.setTitle(_translate("MainWindow", "Organi&ze"))
self.dckCheatSheet.setWindowTitle(_translate("MainWindow", "&Cheat sheet")) self.dckCheatSheet.setWindowTitle(_translate("MainWindow", "&Cheat sheet"))
self.dckSearch.setWindowTitle(_translate("MainWindow", "Sea&rch")) self.dckSearch.setWindowTitle(_translate("MainWindow", "Sea&rch"))
self.dckNavigation.setWindowTitle(_translate("MainWindow", "&Navigation")) self.dckNavigation.setWindowTitle(_translate("MainWindow", "&Navigation"))
@ -1408,16 +1412,18 @@ class Ui_MainWindow(object):
self.actSplitDialog.setShortcut(_translate("MainWindow", "Ctrl+Shift+K")) self.actSplitDialog.setShortcut(_translate("MainWindow", "Ctrl+Shift+K"))
self.actSplitCursor.setText(_translate("MainWindow", "Sp&lit at cursor")) self.actSplitCursor.setText(_translate("MainWindow", "Sp&lit at cursor"))
self.actSplitCursor.setShortcut(_translate("MainWindow", "Ctrl+K")) self.actSplitCursor.setShortcut(_translate("MainWindow", "Ctrl+K"))
self.actMerge.setText(_translate("MainWindow", "Me&rge")) self.actMerge.setText(_translate("MainWindow", "M&erge"))
self.actMerge.setShortcut(_translate("MainWindow", "Ctrl+M")) self.actMerge.setShortcut(_translate("MainWindow", "Ctrl+M"))
self.actDuplicate.setText(_translate("MainWindow", "&Duplicate")) self.actDuplicate.setText(_translate("MainWindow", "Dupl&icate"))
self.actDuplicate.setShortcut(_translate("MainWindow", "Ctrl+D")) self.actDuplicate.setShortcut(_translate("MainWindow", "Ctrl+D"))
self.actDelete.setText(_translate("MainWindow", "D&elete")) self.actDelete.setText(_translate("MainWindow", "&Delete"))
self.actDelete.setShortcut(_translate("MainWindow", "Del")) self.actDelete.setShortcut(_translate("MainWindow", "Del"))
self.actMoveUp.setText(_translate("MainWindow", "&Move Up")) self.actMoveUp.setText(_translate("MainWindow", "&Move Up"))
self.actMoveUp.setShortcut(_translate("MainWindow", "Ctrl+Shift+Up")) self.actMoveUp.setShortcut(_translate("MainWindow", "Ctrl+Shift+Up"))
self.actMoveDown.setText(_translate("MainWindow", "M&ove Down")) self.actMoveDown.setText(_translate("MainWindow", "M&ove Down"))
self.actMoveDown.setShortcut(_translate("MainWindow", "Ctrl+Shift+Down")) self.actMoveDown.setShortcut(_translate("MainWindow", "Ctrl+Shift+Down"))
self.actRename.setText(_translate("MainWindow", "&Rename"))
self.actRename.setShortcut(_translate("MainWindow", "F2"))
from manuskript.ui.cheatSheet import cheatSheet from manuskript.ui.cheatSheet import cheatSheet
from manuskript.ui.editors.mainEditor import mainEditor from manuskript.ui.editors.mainEditor import mainEditor

View file

@ -151,7 +151,7 @@
<item> <item>
<widget class="QGroupBox" name="grpBookInfos"> <widget class="QGroupBox" name="grpBookInfos">
<property name="title"> <property name="title">
<string>Book informations</string> <string>Book information</string>
</property> </property>
<layout class="QFormLayout" name="formLayout_3"> <layout class="QFormLayout" name="formLayout_3">
<property name="leftMargin"> <property name="leftMargin">
@ -186,7 +186,7 @@
<item row="2" column="0"> <item row="2" column="0">
<widget class="QLabel" name="label_12"> <widget class="QLabel" name="label_12">
<property name="text"> <property name="text">
<string>Serie</string> <string>Series</string>
</property> </property>
</widget> </widget>
</item> </item>
@ -2101,7 +2101,7 @@
</property> </property>
<widget class="QMenu" name="menuRecents"> <widget class="QMenu" name="menuRecents">
<property name="title"> <property name="title">
<string>&amp;Recents</string> <string>&amp;Recent</string>
</property> </property>
<property name="icon"> <property name="icon">
<iconset theme="folder-recent"> <iconset theme="folder-recent">
@ -2137,6 +2137,12 @@
<property name="title"> <property name="title">
<string>&amp;Edit</string> <string>&amp;Edit</string>
</property> </property>
<addaction name="actCut"/>
<addaction name="actCopy"/>
<addaction name="actPaste"/>
<addaction name="actDelete"/>
<addaction name="actRename"/>
<addaction name="separator"/>
<addaction name="actLabels"/> <addaction name="actLabels"/>
<addaction name="actStatus"/> <addaction name="actStatus"/>
<addaction name="actSettings"/> <addaction name="actSettings"/>
@ -2156,16 +2162,10 @@
<addaction name="menuMode"/> <addaction name="menuMode"/>
<addaction name="separator"/> <addaction name="separator"/>
</widget> </widget>
<widget class="QMenu" name="menuDocuments"> <widget class="QMenu" name="menuOrganize">
<property name="title"> <property name="title">
<string>&amp;Documents</string> <string>Organi&amp;ze</string>
</property> </property>
<addaction name="actCopy"/>
<addaction name="actCut"/>
<addaction name="actPaste"/>
<addaction name="actDuplicate"/>
<addaction name="actDelete"/>
<addaction name="separator"/>
<addaction name="actMoveUp"/> <addaction name="actMoveUp"/>
<addaction name="actMoveDown"/> <addaction name="actMoveDown"/>
<addaction name="separator"/> <addaction name="separator"/>
@ -2175,7 +2175,7 @@
</widget> </widget>
<addaction name="menuFile"/> <addaction name="menuFile"/>
<addaction name="menuEdit"/> <addaction name="menuEdit"/>
<addaction name="menuDocuments"/> <addaction name="menuOrganize"/>
<addaction name="menuView"/> <addaction name="menuView"/>
<addaction name="menuTools"/> <addaction name="menuTools"/>
<addaction name="menuHelp"/> <addaction name="menuHelp"/>
@ -2555,7 +2555,7 @@
<normaloff>.</normaloff>.</iconset> <normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Me&amp;rge</string> <string>M&amp;erge</string>
</property> </property>
<property name="shortcut"> <property name="shortcut">
<string>Ctrl+M</string> <string>Ctrl+M</string>
@ -2567,7 +2567,7 @@
<normaloff>.</normaloff>.</iconset> <normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>&amp;Duplicate</string> <string>Dupl&amp;icate</string>
</property> </property>
<property name="shortcut"> <property name="shortcut">
<string>Ctrl+D</string> <string>Ctrl+D</string>
@ -2579,7 +2579,7 @@
<normaloff>.</normaloff>.</iconset> <normaloff>.</normaloff>.</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>D&amp;elete</string> <string>&amp;Delete</string>
</property> </property>
<property name="shortcut"> <property name="shortcut">
<string>Del</string> <string>Del</string>
@ -2609,6 +2609,18 @@
<string>Ctrl+Shift+Down</string> <string>Ctrl+Shift+Down</string>
</property> </property>
</action> </action>
<action name="actRename">
<property name="icon">
<iconset theme="edit-rename">
<normaloff>.</normaloff>.</iconset>
</property>
<property name="text">
<string>&amp;Rename</string>
</property>
<property name="shortcut">
<string>F2</string>
</property>
</action>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget> <customwidget>

View file

@ -83,40 +83,60 @@ class outlineBasics(QAbstractItemView):
menu.addSeparator() menu.addSeparator()
# Rename / add / remove items # Add text / folder
self.actRename = QAction(QIcon.fromTheme("edit-rename"), qApp.translate("outlineBasics", "Rename"), menu) self.actAddFolder = QAction(QIcon.fromTheme("folder-new"),
self.actRename.triggered.connect(self.rename) qApp.translate("outlineBasics", "New &Folder"),
menu.addAction(self.actRename) menu)
self.actAddFolder = QAction(QIcon.fromTheme("folder-new"), qApp.translate("outlineBasics", "New Folder"), menu)
self.actAddFolder.triggered.connect(self.addFolder) self.actAddFolder.triggered.connect(self.addFolder)
menu.addAction(self.actAddFolder) menu.addAction(self.actAddFolder)
self.actAddText = QAction(QIcon.fromTheme("document-new"), qApp.translate("outlineBasics", "New Text"), menu) self.actAddText = QAction(QIcon.fromTheme("document-new"),
qApp.translate("outlineBasics", "New &Text"),
menu)
self.actAddText.triggered.connect(self.addText) self.actAddText.triggered.connect(self.addText)
menu.addAction(self.actAddText) 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() menu.addSeparator()
# Copy, cut, paste # Copy, cut, paste, duplicate
self.actCopy = QAction(QIcon.fromTheme("edit-copy"), qApp.translate("outlineBasics", "Copy"), menu) self.actCopy = QAction(QIcon.fromTheme("edit-copy"),
qApp.translate("outlineBasics", "&Copy"), menu)
self.actCopy.triggered.connect(self.copy) self.actCopy.triggered.connect(self.copy)
menu.addAction(self.actCopy) menu.addAction(self.actCopy)
self.actCut = QAction(QIcon.fromTheme("edit-cut"), qApp.translate("outlineBasics", "Cut"), menu) self.actCut = QAction(QIcon.fromTheme("edit-cut"),
qApp.translate("outlineBasics", "C&ut"), menu)
self.actCut.triggered.connect(self.cut) self.actCut.triggered.connect(self.cut)
menu.addAction(self.actCut) menu.addAction(self.actCut)
self.actPaste = QAction(QIcon.fromTheme("edit-paste"), qApp.translate("outlineBasics", "Paste"), menu) self.actPaste = QAction(QIcon.fromTheme("edit-paste"),
qApp.translate("outlineBasics", "&Paste"), menu)
self.actPaste.triggered.connect(self.paste) self.actPaste.triggered.connect(self.paste)
menu.addAction(self.actPaste) menu.addAction(self.actPaste)
menu.addSeparator() menu.addSeparator()
# Rename / duplicate / remove items
self.actRename = QAction(QIcon.fromTheme("edit-rename"),
qApp.translate("outlineBasics", "&Rename"),
menu)
self.actRename.triggered.connect(self.rename)
menu.addAction(self.actRename)
self.actDuplicate = QAction(QIcon.fromTheme("folder-copy"),
qApp.translate("outlineBasics", "Dup&licate"),
menu)
self.actDuplicate.triggered.connect(self.duplicate)
menu.addAction(self.actDuplicate)
self.actDelete = QAction(QIcon.fromTheme("edit-delete"),
qApp.translate("outlineBasics", "&Delete"),
menu)
self.actDelete.triggered.connect(self.delete)
menu.addAction(self.actDelete)
menu.addSeparator()
# POV # POV
self.menuPOV = QMenu(qApp.translate("outlineBasics", "Set POV"), menu) self.menuPOV = QMenu(qApp.translate("outlineBasics", "Set POV"), menu)
mw = mainWindow() mw = mainWindow()
@ -224,6 +244,7 @@ class outlineBasics(QAbstractItemView):
if len(sel) == 0: if len(sel) == 0:
self.actCopy.setEnabled(False) self.actCopy.setEnabled(False)
self.actCut.setEnabled(False) self.actCut.setEnabled(False)
self.actDuplicate.setEnabled(False)
self.actRename.setEnabled(False) self.actRename.setEnabled(False)
self.actDelete.setEnabled(False) self.actDelete.setEnabled(False)
self.menuPOV.setEnabled(False) self.menuPOV.setEnabled(False)
@ -276,12 +297,19 @@ class outlineBasics(QAbstractItemView):
mimeData = self.model().mimeData(self.selectionModel().selectedIndexes()) mimeData = self.model().mimeData(self.selectionModel().selectedIndexes())
qApp.clipboard().setMimeData(mimeData) qApp.clipboard().setMimeData(mimeData)
def paste(self): def paste(self, mimeData=None):
"""
Paste item from mimeData to selected item. If mimeData is not given,
it is taken from clipboard. If not item selected, paste into root.
"""
index = self.currentIndex() index = self.currentIndex()
if len(self.getSelection()) == 0: if len(self.getSelection()) == 0:
index = self.rootIndex() index = self.rootIndex()
data = qApp.clipboard().mimeData()
self.model().dropMimeData(data, Qt.CopyAction, -1, 0, index) if mimeData is None:
mimeData = qApp.clipboard().mimeData()
self.model().dropMimeData(mimeData, Qt.CopyAction, -1, 0, index)
def cut(self): def cut(self):
self.copy() self.copy()
@ -312,8 +340,11 @@ class outlineBasics(QAbstractItemView):
self.model().removeIndexes(self.getSelection()) self.model().removeIndexes(self.getSelection())
def duplicate(self): def duplicate(self):
self.copy() """
self.paste() Duplicates item(s), while preserving clipbaord content.
"""
mimeData = self.model().mimeData(self.selectionModel().selectedIndexes())
self.paste(mimeData)
def move(self, delta=1): def move(self, delta=1):
""" """

View file

@ -588,6 +588,7 @@ class textEditView(QTextEdit):
function = getattr(F.mainWindow().treeRedacOutline, functionName) function = getattr(F.mainWindow().treeRedacOutline, functionName)
function() function()
def rename(self): self.callMainTreeView("rename")
def duplicate(self): self.callMainTreeView("duplicate") def duplicate(self): self.callMainTreeView("duplicate")
def moveUp(self): self.callMainTreeView("moveUp") def moveUp(self): self.callMainTreeView("moveUp")
def moveDown(self): self.callMainTreeView("moveDown") def moveDown(self): self.callMainTreeView("moveDown")

View file

@ -3,7 +3,7 @@
# Single source the package version # Single source the package version
# https://packaging.python.org/guides/single-sourcing-package-version/ # https://packaging.python.org/guides/single-sourcing-package-version/
__version__ = "0.5.0" __version__ = "0.6.0"
def getVersion(): def getVersion():
return __version__ return __version__

View file

@ -1,25 +1,28 @@
#!/bin/bash #!/bin/bash
# Can take two parameters: AppVersion PkgNumber # Can take two parameters: AppVersion PkgNumber
# Default values are: 0.5.0 1 # If not provided, AppVersion is found in manuskript/version.py
# PkgNumber is 1.
# Manuskript Vars
AppName=manuskript
AppVersion=${1:-0.5.0}
PkgNumber=${2:-1}
PkgVersion=$AppVersion-$PkgNumber
#PkgSizeInKb # find with: du -sk manuskript-0.5.0-1
# Program vars # Program vars
ScriptPath="$( cd "$(dirname "$0")" ; pwd -P )" ScriptPath="$( cd "$(dirname "$0")" ; pwd -P )"
Dest="$ScriptPath/../dist/$AppName-$PkgVersion" Root="$ScriptPath/../"
echo Package directory: $Dest # Manuskript Vars
AppName=manuskript
Version=$(grep -E "__version__.*\".*\"" "$Root/manuskript/version.py" \
| cut -d\" -f2) # Look for version in manuskript/version
AppVersion=${1:-$Version}
PkgNumber=${2:-1}
PkgVersion=$AppVersion-$PkgNumber
Dest="$Root/dist/$AppName-$PkgVersion"
echo -n Creating folder structure echo "Package directory: $Dest"
mkdir -p $Dest/DEBIAN
mkdir -p $Dest/usr/bin echo -n "Creating folder structure"
mkdir -p $Dest/usr/share/applications mkdir -p "$Dest/DEBIAN"
mkdir -p "$Dest/usr/bin"
mkdir -p "$Dest/usr/share/applications"
echo " [✓]" echo " [✓]"
# Getting manuskript files, by downloading # Getting manuskript files, by downloading
@ -32,29 +35,31 @@ echo " [✓]"
# Using the current direction as source # Using the current direction as source
echo -n Copying manuskript content echo -n "Copying manuskript content"
rsync -a --exclude=.git --include="*.msk" --exclude-from=.gitignore $ScriptPath/../ $Dest/usr/share/manuskript rsync -a --exclude=.git --include="*.msk" --exclude-from="$Root/.gitignore" \
cp $ScriptPath/create_deb/manuskript $Dest/usr/bin/manuskript "$ScriptPath/../" "$Dest/usr/share/manuskript"
cp $ScriptPath/create_deb/manuskript.desktop $Dest/usr/share/applications/manuskript.desktop cp "$ScriptPath/create_deb/manuskript" "$Dest/usr/bin/manuskript"
cp $ScriptPath/create_deb/control $Dest/DEBIAN/control cp "$ScriptPath/create_deb/manuskript.desktop" \
"$Dest/usr/share/applications/manuskript.desktop"
cp "$ScriptPath/create_deb/control" "$Dest/DEBIAN/control"
sed -i "s/{PkgVersion}/$PkgVersion/" $Dest/DEBIAN/control sed -i "s/{PkgVersion}/$PkgVersion/" "$Dest/DEBIAN/control"
PkgSizeInKb=$(du -sk $Dest | cut -f 1) PkgSizeInKb=$(du -sk "$Dest" | cut -f 1)
sed -i "s/{PkgSizeInKb}/$PkgSizeInKb/" $Dest/DEBIAN/control sed -i "s/{PkgSizeInKb}/$PkgSizeInKb/" "$Dest/DEBIAN/control"
echo " [✓]" echo " [✓]"
echo -n Setting permissions echo -n "Setting permissions"
chmod 0755 $Dest/usr/bin/manuskript chmod 0755 "$Dest/usr/bin/manuskript"
echo " [✓]" echo " [✓]"
echo Your root password might now be asked to finish setting permissions: echo "Your root password might now be asked to finish setting permissions:"
sudo chown root:root -R $Dest sudo chown root:root -R "$Dest"
echo Creating the package… echo "Creating the package…"
dpkg -b $Dest dpkg -b "$Dest"
echo -n Removing build folder echo -n "Removing build folder"
sudo rm -r $Dest sudo rm -r "$Dest"
echo " [✓]" echo " [✓]"
echo Done ! echo Done !