1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
# This file is part of the Frescobaldi project, http://www.frescobaldi.org/
#
# Copyright (c) 2008 - 2014 by Wilbert Berendsen
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
# See http://www.gnu.org/licenses/ for more information.
"""
The Documents menu.
"""
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QAction, QActionGroup, QMenu
import app
import icons
import plugin
import engrave
import documenticon
import util
class DocumentMenu(QMenu):
def __init__(self, mainwindow):
super(DocumentMenu, self).__init__(mainwindow)
self.aboutToShow.connect(self.populate)
app.translateUI(self)
self.setToolTipsVisible(True)
def translateUI(self):
self.setTitle(_('menu title', '&Documents'))
def populate(self):
self.clear()
mainwindow = self.parentWidget()
for a in DocumentActionGroup.instance(mainwindow).actions():
self.addAction(a)
class DocumentActionGroup(plugin.MainWindowPlugin, QActionGroup):
"""Maintains a list of actions to set the current document.
The actions are added to the View->Documents menu in the order
of the tabbar. The actions also get accelerators that are kept
during the lifetime of a document.
"""
def __init__(self, mainwindow):
QActionGroup.__init__(self, mainwindow)
self._acts = {}
self._accels = {}
self.setExclusive(True)
for d in app.documents:
self.addDocument(d)
app.documentCreated.connect(self.addDocument)
app.documentClosed.connect(self.removeDocument)
app.documentUrlChanged.connect(self.setDocumentStatus)
app.documentModificationChanged.connect(self.setDocumentStatus)
app.jobStarted.connect(self.setDocumentStatus)
app.jobFinished.connect(self.setDocumentStatus)
mainwindow.currentDocumentChanged.connect(self.setCurrentDocument)
engrave.engraver(mainwindow).stickyChanged.connect(self.setDocumentStatus)
self.triggered.connect(self.slotTriggered)
def actions(self):
return [self._acts[doc] for doc in self.mainwindow().documents()]
def addDocument(self, doc):
a = QAction(self)
a.setCheckable(True)
if doc is self.mainwindow().currentDocument():
a.setChecked(True)
self._acts[doc] = a
self.setDocumentStatus(doc)
def removeDocument(self, doc):
self._acts[doc].deleteLater()
del self._acts[doc]
del self._accels[doc]
def setCurrentDocument(self, doc):
self._acts[doc].setChecked(True)
def setDocumentStatus(self, doc):
# create accels
accels = [self._accels[d] for d in self._accels if d is not doc]
name = doc.documentName().replace('&', '&&')
for index, char in enumerate(name):
if char.isalnum() and char.lower() not in accels:
name = name[:index] + '&' + name[index:]
self._accels[doc] = char.lower()
break
else:
self._accels[doc] = ''
# add [sticky] mark if necessary
if doc == engrave.engraver(self.mainwindow()).stickyDocument():
# L10N: 'always engraved': the document is marked as 'Always Engrave' in the LilyPond menu
name += " " + _("[always engraved]")
self._acts[doc].setText(name)
self._acts[doc].setToolTip(util.path(doc.url()))
icon = documenticon.icon(doc, self.mainwindow())
if icon.name() == "text-plain":
icon = QIcon()
self._acts[doc].setIcon(icon)
def slotTriggered(self, action):
for doc, act in self._acts.items():
if act == action:
self.mainwindow().setCurrentDocument(doc)
break
|