Files
novelWriter/nw/gui/mainmenu.py
T
2019-04-27 16:09:33 +02:00

369 lines
13 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""novelWriter GUI Main Menu
novelWriter GUI Main Menu
=============================
Class holding the main window
File History:
Created: 2019-04-27 [0.0.1] (Split from winmain)
"""
import logging
import nw
from PyQt5.QtWidgets import qApp, QMenuBar, QAction
from PyQt5.QtGui import QIcon
from nw.enum import nwItemClass, nwDocAction
logger = logging.getLogger(__name__)
class GuiMainMenu(QMenuBar):
def __init__(self, theParent, theProject):
QMenuBar.__init__(self, theParent)
logger.debug("Initialising Main Menu ...")
self.mainConf = nw.CONFIG
self.theParent = theParent
self.theProject = theProject
self._buildProjectMenu()
self._buildStructureMenu()
self._buildDocumentMenu()
self._buildEditMenu()
self._buildFormatMenu()
self._buildToolsMenu()
self._buildHelpMenu()
# Function Pointers
self._docAction = self.theParent.docEditor.docAction
logger.debug("Main Menu initialisation complete")
return
def openRecentProject(self, menuItem, recentItem):
logger.verbose("User requested opening recent project #%d" % recentItem)
self.theParent.openProject(self.mainConf.recentList[recentItem])
return True
##
# Menu Action
##
def _menuExit(self):
self.theParent.closeMain()
qApp.quit()
return True
def _showAbout(self):
self.docTabs.createTab(None,nw.DOCTYPE_ABOUT)
return True
##
# Menu Builders
##
def _buildProjectMenu(self):
# Project
self.projMenu = self.addMenu("&Project")
# Project > New Project
menuItem = QAction(QIcon.fromTheme("folder-new"), "New Project", self)
menuItem.setStatusTip("Create New Project")
menuItem.triggered.connect(self.theParent.newProject)
self.projMenu.addAction(menuItem)
# Project > Open Project
menuItem = QAction(QIcon.fromTheme("folder-open"), "Open Project", self)
menuItem.setStatusTip("Open Project")
menuItem.setShortcut("Ctrl+Shift+O")
menuItem.triggered.connect(lambda : self.theParent.openProject(None))
self.projMenu.addAction(menuItem)
# Project > Save Project
menuItem = QAction(QIcon.fromTheme("document-save"), "Save Project", self)
menuItem.setStatusTip("Save Project")
menuItem.setShortcut("Ctrl+Shift+S")
menuItem.triggered.connect(self.theParent.saveProject)
self.projMenu.addAction(menuItem)
# Project > Recent Projects
recentMenu = self.projMenu.addMenu(QIcon.fromTheme("document-open-recent"),"Recent Projects")
for n in range(len(self.mainConf.recentList)):
recentProject = self.mainConf.recentList[n]
if recentProject == "": continue
menuItem = QAction(QIcon.fromTheme("folder-open"), "%d: %s" % (n,recentProject), self.projMenu)
menuItem.triggered.connect(lambda menuItem, n=n : self.openRecentProject(menuItem, n))
recentMenu.addAction(menuItem)
# Project > Separator
self.projMenu.addSeparator()
# Project > Project Settings
menuItem = QAction(QIcon.fromTheme("document-properties"), "Project Settings", self)
menuItem.setStatusTip("Project Settings")
menuItem.triggered.connect(self.theParent.editProjectDialog)
self.projMenu.addAction(menuItem)
# Project > Separator
self.projMenu.addSeparator()
# Project > Exit
menuItem = QAction(QIcon.fromTheme("application-exit"), "Exit", self)
menuItem.setStatusTip("Exit %s" % nw.__package__)
menuItem.setShortcut("Ctrl+Q")
menuItem.triggered.connect(self._menuExit)
self.projMenu.addAction(menuItem)
return
def _buildStructureMenu(self):
# Structure
self.structMenu = self.addMenu("&Structure")
# Structure > New Folder
menuItem = QAction(QIcon.fromTheme("folder-new"), "Create Folder", self)
menuItem.setStatusTip("Create Folder")
menuItem.setShortcut("Ctrl+Shift+N")
self.structMenu.addAction(menuItem)
# Structure > New Root
rootMenu = self.structMenu.addMenu(QIcon.fromTheme("folder-new"), "Create Root Group")
self.rootItems = {}
self.rootItems[nwItemClass.NOVEL] = QAction(QIcon.fromTheme("folder-new"), "Novel Root", rootMenu)
self.rootItems[nwItemClass.PLOT] = QAction(QIcon.fromTheme("folder-new"), "Plot Root", rootMenu)
self.rootItems[nwItemClass.CHARACTER] = QAction(QIcon.fromTheme("folder-new"), "Character Root", rootMenu)
self.rootItems[nwItemClass.WORLD] = QAction(QIcon.fromTheme("folder-new"), "Location Root", rootMenu)
self.rootItems[nwItemClass.TIMELINE] = QAction(QIcon.fromTheme("folder-new"), "Timeline Root", rootMenu)
self.rootItems[nwItemClass.OBJECT] = QAction(QIcon.fromTheme("folder-new"), "Object Root", rootMenu)
self.rootItems[nwItemClass.CUSTOM] = QAction(QIcon.fromTheme("folder-new"), "Custom Root", rootMenu)
rootMenu.addActions(self.rootItems.values())
# Structure > Rename Folder
menuItem = QAction(QIcon.fromTheme("folder-new"), "Rename Folder", self)
menuItem.setStatusTip("Rename Selected Folder")
menuItem.setShortcut("Ctrl+Shift+E")
self.structMenu.addAction(menuItem)
# Structure > Delete Folder
menuItem = QAction(QIcon.fromTheme("edit-delete"), "Delete Folder", self)
menuItem.setStatusTip("Delete Selected Folder")
menuItem.setShortcut("Ctrl+Shift+Del")
self.structMenu.addAction(menuItem)
# Structure > Separator
self.structMenu.addSeparator()
# Structure > Move Up
menuItem = QAction(QIcon.fromTheme("go-up"), "Move Item Up", self)
menuItem.setStatusTip("Move Item Up")
menuItem.setShortcut("Ctrl+Up")
self.structMenu.addAction(menuItem)
# Structure > Move Down
menuItem = QAction(QIcon.fromTheme("go-down"), "Move Item Down", self)
menuItem.setStatusTip("Move Item Down")
menuItem.setShortcut("Ctrl+Down")
self.structMenu.addAction(menuItem)
return
def _buildDocumentMenu(self):
# Document
self.docuMenu = self.addMenu("&Document")
# Document > New
menuItem = QAction(QIcon.fromTheme("document-new"), "&New Document", self)
menuItem.setStatusTip("Create New Document")
menuItem.setShortcut("Ctrl+N")
self.docuMenu.addAction(menuItem)
# Document > Open
menuItem = QAction(QIcon.fromTheme("document-open"), "&Open Document", self)
menuItem.setStatusTip("Open Selected Document")
menuItem.setShortcut("Ctrl+O")
self.docuMenu.addAction(menuItem)
# Document > Save
menuItem = QAction(QIcon.fromTheme("document-save"), "&Save Document", self)
menuItem.setStatusTip("Save Current Document")
menuItem.setShortcut("Ctrl+S")
menuItem.triggered.connect(self.theParent.saveDocument)
self.docuMenu.addAction(menuItem)
# Document > Separator
self.docuMenu.addSeparator()
# Document > Edit
menuItem = QAction(QIcon.fromTheme("document-properties"), "&Edit Document", self)
menuItem.setStatusTip("Change Document Settings")
menuItem.setShortcut("Ctrl+E")
self.docuMenu.addAction(menuItem)
# Document > Delete
menuItem = QAction(QIcon.fromTheme("edit-delete"), "&Delete Document", self)
menuItem.setStatusTip("Delete Selected Document")
menuItem.setShortcut("Ctrl+Del")
self.docuMenu.addAction(menuItem)
# Document > Separator
self.docuMenu.addSeparator()
# Document > Split
menuItem = QAction(QIcon.fromTheme("list-add"), "Split Document", self)
menuItem.setStatusTip("Split Selected Document")
self.docuMenu.addAction(menuItem)
# Document > Merge
menuItem = QAction(QIcon.fromTheme("list-remove"), "Merge Document", self)
menuItem.setStatusTip("Merge Selected Documents")
self.docuMenu.addAction(menuItem)
return
def _buildEditMenu(self):
# Edit
self.editMenu = self.addMenu("&Edit")
# Edit > Undo
menuItem = QAction(QIcon.fromTheme("edit-undo"), "Undo", self)
menuItem.setStatusTip("Undo Last Change")
menuItem.setShortcut("Ctrl+Z")
menuItem.triggered.connect(lambda: self._docAction(nwDocAction.UNDO))
self.editMenu.addAction(menuItem)
# Edit > Redo
menuItem = QAction(QIcon.fromTheme("edit-redo"), "Redo", self)
menuItem.setStatusTip("Redo Last Change")
menuItem.setShortcut("Ctrl+Y")
menuItem.triggered.connect(lambda: self._docAction(nwDocAction.REDO))
self.editMenu.addAction(menuItem)
# Edit > Separator
self.editMenu.addSeparator()
# Edit > Cut
menuItem = QAction(QIcon.fromTheme("edit-cut"), "Cut", self)
menuItem.setStatusTip("Cut Selected Text")
menuItem.setShortcut("Ctrl+X")
menuItem.triggered.connect(lambda: self._docAction(nwDocAction.CUT))
self.editMenu.addAction(menuItem)
# Edit > Copy
menuItem = QAction(QIcon.fromTheme("edit-copy"), "Copy", self)
menuItem.setStatusTip("Copy Selected Text")
menuItem.setShortcut("Ctrl+C")
menuItem.triggered.connect(lambda: self._docAction(nwDocAction.COPY))
self.editMenu.addAction(menuItem)
# Edit > Paste
menuItem = QAction(QIcon.fromTheme("edit-paste"), "Paste", self)
menuItem.setStatusTip("Paste Text from Clipboard")
menuItem.setShortcut("Ctrl+V")
menuItem.triggered.connect(lambda: self._docAction(nwDocAction.PASTE))
self.editMenu.addAction(menuItem)
# Edit > Separator
self.editMenu.addSeparator()
# Edit > Select All
menuItem = QAction(QIcon.fromTheme("edit-select-all"), "Select All", self)
menuItem.setStatusTip("Select All Text in Document")
menuItem.setShortcut("Ctrl+A")
menuItem.triggered.connect(lambda: self._docAction(nwDocAction.SEL_ALL))
self.editMenu.addAction(menuItem)
# Edit > Select Paragraph
menuItem = QAction(QIcon.fromTheme("edit-select-all"), "Select Paragraph", self)
menuItem.setStatusTip("Select All Text in Paragraph")
menuItem.setShortcut("Ctrl+Shift+A")
menuItem.triggered.connect(lambda: self._docAction(nwDocAction.SEL_PARA))
self.editMenu.addAction(menuItem)
return
def _buildFormatMenu(self):
# Format
self.fmtMenu = self.addMenu("&Format")
# Format > Bold Text
menuItem = QAction(QIcon.fromTheme("format-text-bold"), "Bold Text", self)
menuItem.setStatusTip("Make Selected Text Bold")
menuItem.setShortcut("Ctrl+B")
menuItem.triggered.connect(lambda: self._docAction(nwDocAction.BOLD))
self.fmtMenu.addAction(menuItem)
# Format > Italic Text
menuItem = QAction(QIcon.fromTheme("format-text-italic"), "Italic Text", self)
menuItem.setStatusTip("Make Selected Text Italic")
menuItem.setShortcut("Ctrl+I")
menuItem.triggered.connect(lambda: self._docAction(nwDocAction.ITALIC))
self.fmtMenu.addAction(menuItem)
# Format > Underline Text
menuItem = QAction(QIcon.fromTheme("format-text-underline"), "Underline Text", self)
menuItem.setStatusTip("Underline Selected Text")
menuItem.setShortcut("Ctrl+U")
menuItem.triggered.connect(lambda: self._docAction(nwDocAction.U_LINE))
self.fmtMenu.addAction(menuItem)
# Edit > Separator
self.fmtMenu.addSeparator()
# Format > Double Quotes
menuItem = QAction(QIcon.fromTheme("insert-text"), "Wrap Double Quotes", self)
menuItem.setStatusTip("Wrap Selected Text in Double Quotes")
menuItem.setShortcut("Ctrl+D")
menuItem.triggered.connect(lambda: self._docAction(nwDocAction.D_QUOTE))
self.fmtMenu.addAction(menuItem)
# Format > Single Quotes
menuItem = QAction(QIcon.fromTheme("insert-text"), "Wrap Single Quotes", self)
menuItem.setStatusTip("Wrap Selected Text in Single Quotes")
menuItem.setShortcut("Ctrl+Shift+D")
menuItem.triggered.connect(lambda: self._docAction(nwDocAction.S_QUOTE))
self.fmtMenu.addAction(menuItem)
return
def _buildToolsMenu(self):
# Tools
self.toolsMenu = self.addMenu("&Tools")
# Tools > Settings
menuItem = QAction(QIcon.fromTheme("preferences-system"), "Preferences", self)
menuItem.setStatusTip("Preferences")
self.toolsMenu.addAction(menuItem)
return
def _buildHelpMenu(self):
# Help
self.helpMenu = self.addMenu("&Help")
# Help > About
menuItem = QAction(QIcon.fromTheme("help-about"), "About %s" % nw.__package__, self)
menuItem.setStatusTip("About %s" % nw.__package__)
menuItem.triggered.connect(self._showAbout)
self.helpMenu.addAction(menuItem)
# Help > About Qt5
menuItem = QAction(QIcon.fromTheme("help-about"), "About Qt5", self)
menuItem.setStatusTip("About Qt5")
self.helpMenu.addAction(menuItem)
return
# END Class GuiMainMenu