This commit is contained in:
Jonathan Corwin 2011-04-13 23:11:21 +01:00
commit d45423569f
41 changed files with 1397 additions and 694 deletions

View File

@ -5,32 +5,6 @@ Frequently Asked Questions
General Questions General Questions
================= =================
What is OpenLP?
---------------
OpenLP stands for "Open source Lyric Projection" and is presentation software
developed for Churches to provide a single easy to use interface for the
projection needs of a typical act of Worship. First created in 2004, it has
steadily grown in features and maturity such that is it now a mainstay in
hundreds of churches around the world.
It can hold a searchable database of song lyrics and Bible verses allowing them
to be projected instantly or saved in a pre-prepared order of service file.
Themes allow song backgrounds to be changed instantly. PowerPoint presentations,
videos and audio files can be run from within the program removing the need to
switch between different programs. Alert messages can be displayed so the
Nursery or Car park stewards can notify the congregation easily. Remote
capability allows the worship leader to change songs, or for alert messages to
be sent from anywhere on the network, even via a phone.
Being free, this software can be installed on as many computers as required,
even on the home computers of worship leaders without additional cost. Compared
to the expensive site licenses or restrictions of commercial software we believe
OpenLP cannot be beaten for value. Still in active development by a growing team
of enthusiastic developers, features are being added all the time, meaning the
software just improves all the time.
When is the release date for OpenLP 2.0? When is the release date for OpenLP 2.0?
---------------------------------------- ----------------------------------------
@ -67,7 +41,7 @@ A variety of places!
it, then perhaps review the software or ask others to review it. it, then perhaps review the software or ask others to review it.
What operating systems will OpenLP 2.0 support? What operating systems will OpenLP 2.0 support?
=============================================== -----------------------------------------------
OpenLP 2.0 is designed to be cross platform. Currently it has been known to run OpenLP 2.0 is designed to be cross platform. Currently it has been known to run
on Windows (XP, Vista, 7), Linux (Ubuntu/Kubuntu, Fedora), FreeBSD & Mac OSX. on Windows (XP, Vista, 7), Linux (Ubuntu/Kubuntu, Fedora), FreeBSD & Mac OSX.
@ -377,7 +351,7 @@ please post a new bug report.
``bugs (at) openlp.org``. ``bugs (at) openlp.org``.
What information should I include in a bug report? What information should I include in a bug report?
================================================== --------------------------------------------------
Since OpenLP 1.9.4, there is a bug report dialog which automatically opens when Since OpenLP 1.9.4, there is a bug report dialog which automatically opens when
OpenLP hits a serious bug. However, this doesn't appear all the time, and in OpenLP hits a serious bug. However, this doesn't appear all the time, and in

View File

@ -8,7 +8,7 @@ About
OpenLP stands for "Open Source Lyrics Projection" and is presentation software OpenLP stands for "Open Source Lyrics Projection" and is presentation software
developed for churches to provide a single easy to use interface for the developed for churches to provide a single easy to use interface for the
projection needs of a typical worship service. First created in 2004, it has projection needs of a typical worship service. First created in 2004, it has
steadily grown in features and maturity such that is it now a mainstay in steadily grown in features and maturity such that it is now a mainstay in
hundreds of churches around the world. hundreds of churches around the world.
OpenLP has searchable databases of songs and Bible verses allowing them to be OpenLP has searchable databases of songs and Bible verses allowing them to be
@ -40,5 +40,4 @@ to charge for the software, and that you have to distribute the source code as
well. well.
You can find a copy of the GNU General Public License from the Help menu You can find a copy of the GNU General Public License from the Help menu
selecting about OpenLP or on-line at: selecting about OpenLP or `view the license on-line <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>`_.
`<http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>`_.

View File

@ -1,3 +1,5 @@
.. _themes:
====== ======
Themes Themes
====== ======

View File

@ -126,7 +126,7 @@ I can not see the book, chapter, and verse when I display scripture
The book, chapter, and verse should be displayed when you display scripture. If The book, chapter, and verse should be displayed when you display scripture. If
you can not see this your theme probably has the text size too small for the you can not see this your theme probably has the text size too small for the
info to be seen. See the section of the manual on themes if you need more info info to be seen. See the section of the manual on :ref:`themes` if you need more info
on text sizes in themes. on text sizes in themes.
I am running Mac OS X and I do not have a presentations plugin I am running Mac OS X and I do not have a presentations plugin
@ -173,4 +173,5 @@ I chose to use a web Bible but it did not download the entire Bible
Due to copyright restrictions OpenLP cannot download an entire Bible. It can Due to copyright restrictions OpenLP cannot download an entire Bible. It can
only download the section you search for. If you do not have an internet only download the section you search for. If you do not have an internet
connection where you intend to use OpenLP you will need another scripture connection where you intend to use OpenLP you will need another scripture
source. For more information about acquiring bibles please see :ref:`bibleimporter`. source. For more information about acquiring Bibles please see :ref:`bibleimporter`.

View File

@ -116,7 +116,7 @@ class OpenLP(QtGui.QApplication):
self.processEvents() self.processEvents()
# start the main app window # start the main app window
self.mainWindow = MainWindow(screens, self.clipboard(), self.mainWindow = MainWindow(screens, self.clipboard(),
self.arguments()) self.arguments())
self.mainWindow.show() self.mainWindow.show()
if show_splash: if show_splash:
# now kill the splashscreen # now kill the splashscreen

View File

@ -166,58 +166,6 @@ def build_icon(icon):
QtGui.QIcon.Normal, QtGui.QIcon.Off) QtGui.QIcon.Normal, QtGui.QIcon.Off)
return button_icon return button_icon
def context_menu_action(base, icon, text, slot, shortcuts=None):
"""
Utility method to help build context menus for plugins
``base``
The parent menu to add this menu item to
``icon``
An icon for this action
``text``
The text to display for this action
``slot``
The code to run when this action is triggered
"""
action = QtGui.QAction(text, base)
if icon:
action.setIcon(build_icon(icon))
QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot)
if shortcuts:
action.setShortcuts(shortcuts)
return action
def context_menu(base, icon, text):
"""
Utility method to help build context menus for plugins
``base``
The parent object to add this menu to
``icon``
An icon for this menu
``text``
The text to display for this menu
"""
action = QtGui.QMenu(text, base)
action.setIcon(build_icon(icon))
return action
def context_menu_separator(base):
"""
Add a separator to a context menu
``base``
The menu object to add the separator to
"""
action = QtGui.QAction(u'', base)
action.setSeparator(True)
return action
def image_to_byte(image): def image_to_byte(image):
""" """
Resize an image to fit on the current screen for the web and returns Resize an image to fit on the current screen for the web and returns
@ -343,3 +291,4 @@ from dockwidget import OpenLPDockWidget
from renderer import Renderer from renderer import Renderer
from rendermanager import RenderManager from rendermanager import RenderManager
from mediamanageritem import MediaManagerItem from mediamanageritem import MediaManagerItem
from openlp.core.utils.actions import ActionList

View File

@ -460,7 +460,7 @@ def build_lyrics_css(item, webkitvers):
.lyricsshadow { .lyricsshadow {
%s %s
} }
""" """
theme = item.themedata theme = item.themedata
lyricstable = u'' lyricstable = u''
lyrics = u'' lyrics = u''
@ -468,8 +468,7 @@ def build_lyrics_css(item, webkitvers):
outline = u'' outline = u''
shadow = u'' shadow = u''
if theme and item.main: if theme and item.main:
lyricstable = u'left: %spx; top: %spx;' % \ lyricstable = u'left: %spx; top: %spx;' % (item.main.x(), item.main.y())
(item.main.x(), item.main.y())
lyrics = build_lyrics_format_css(theme, item.main.width(), lyrics = build_lyrics_format_css(theme, item.main.width(),
item.main.height()) item.main.height())
# For performance reasons we want to show as few DIV's as possible, # For performance reasons we want to show as few DIV's as possible,

View File

@ -31,10 +31,10 @@ import os
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import context_menu_action, context_menu_separator, \ from openlp.core.lib import SettingsManager, OpenLPToolbar, ServiceItem, \
SettingsManager, OpenLPToolbar, ServiceItem, StringContent, build_icon, \ StringContent, build_icon, translate, Receiver, ListWidgetWithDnD
translate, Receiver, ListWidgetWithDnD from openlp.core.lib.ui import UiStrings, context_menu_action, \
from openlp.core.lib.ui import UiStrings context_menu_separator
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -260,39 +260,42 @@ class MediaManagerItem(QtGui.QWidget):
context_menu_action( context_menu_action(
self.listView, u':/general/general_edit.png', self.listView, u':/general/general_edit.png',
self.plugin.getString(StringContent.Edit)[u'title'], self.plugin.getString(StringContent.Edit)[u'title'],
self.onEditClick)) self.onEditClick, context=QtCore.Qt.WidgetShortcut))
self.listView.addAction(context_menu_separator(self.listView)) self.listView.addAction(context_menu_separator(self.listView))
if self.hasDeleteIcon: if self.hasDeleteIcon:
self.listView.addAction( self.listView.addAction(
context_menu_action( context_menu_action(
self.listView, u':/general/general_delete.png', self.listView, u':/general/general_delete.png',
self.plugin.getString(StringContent.Delete)[u'title'], self.plugin.getString(StringContent.Delete)[u'title'],
self.onDeleteClick, [QtCore.Qt.Key_Delete])) self.onDeleteClick, [QtCore.Qt.Key_Delete],
context=QtCore.Qt.WidgetShortcut))
self.listView.addAction(context_menu_separator(self.listView)) self.listView.addAction(context_menu_separator(self.listView))
self.listView.addAction( self.listView.addAction(
context_menu_action( context_menu_action(
self.listView, u':/general/general_preview.png', self.listView, u':/general/general_preview.png',
self.plugin.getString(StringContent.Preview)[u'title'], self.plugin.getString(StringContent.Preview)[u'title'],
self.onPreviewClick, [QtCore.Qt.Key_Enter])) self.onPreviewClick, [QtCore.Qt.Key_Enter,
QtCore.Qt.Key_Return], context=QtCore.Qt.WidgetShortcut))
self.listView.addAction( self.listView.addAction(
context_menu_action( context_menu_action(
self.listView, u':/general/general_live.png', self.listView, u':/general/general_live.png',
self.plugin.getString(StringContent.Live)[u'title'], self.plugin.getString(StringContent.Live)[u'title'],
self.onLiveClick, [QtCore.Qt.ShiftModifier + \ self.onLiveClick, [QtCore.Qt.ShiftModifier + \
QtCore.Qt.Key_Enter, QtCore.Qt.ShiftModifier + \ QtCore.Qt.Key_Enter, QtCore.Qt.ShiftModifier + \
QtCore.Qt.Key_Return])) QtCore.Qt.Key_Return], context=QtCore.Qt.WidgetShortcut))
self.listView.addAction( self.listView.addAction(
context_menu_action( context_menu_action(
self.listView, u':/general/general_add.png', self.listView, u':/general/general_add.png',
self.plugin.getString(StringContent.Service)[u'title'], self.plugin.getString(StringContent.Service)[u'title'],
self.onAddClick, [QtCore.Qt.Key_Plus, QtCore.Qt.Key_Equal])) self.onAddClick, [QtCore.Qt.Key_Plus, QtCore.Qt.Key_Equal],
context=QtCore.Qt.WidgetShortcut))
if self.addToServiceItem: if self.addToServiceItem:
self.listView.addAction( self.listView.addAction(
context_menu_action( context_menu_action(
self.listView, u':/general/general_add.png', self.listView, u':/general/general_add.png',
translate('OpenLP.MediaManagerItem', translate('OpenLP.MediaManagerItem',
'&Add to selected Service Item'), '&Add to selected Service Item'),
self.onAddEditClick)) self.onAddEditClick, context=QtCore.Qt.WidgetShortcut))
QtCore.QObject.connect(self.listView, QtCore.QObject.connect(self.listView,
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), QtCore.SIGNAL(u'doubleClicked(QModelIndex)'),
self.onClickPressed) self.onClickPressed)

View File

@ -29,6 +29,7 @@ import logging
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import build_icon from openlp.core.lib import build_icon
from openlp.core.lib.ui import icon_action
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -132,7 +133,8 @@ class SearchEdit(QtGui.QLineEdit):
menu = QtGui.QMenu(self) menu = QtGui.QMenu(self)
first = None first = None
for identifier, icon, title in items: for identifier, icon, title in items:
action = QtGui.QAction(build_icon(icon), title, menu) action = icon_action(menu, u'', icon)
action.setText(title)
action.setData(QtCore.QVariant(identifier)) action.setData(QtCore.QVariant(identifier))
menu.addAction(action) menu.addAction(action)
QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered(bool)'), QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered(bool)'),

View File

@ -23,7 +23,7 @@
# with this program; if not, write to the Free Software Foundation, Inc., 59 # # with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
import logging
import re import re
try: try:
import enchant import enchant
@ -38,20 +38,24 @@ except ImportError:
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate, DisplayTags from openlp.core.lib import translate, DisplayTags
log = logging.getLogger(__name__)
class SpellTextEdit(QtGui.QPlainTextEdit): class SpellTextEdit(QtGui.QPlainTextEdit):
""" """
Spell checking widget based on QPlanTextEdit. Spell checking widget based on QPlanTextEdit.
""" """
def __init__(self, *args): def __init__(self, *args):
global ENCHANT_AVAILABLE
QtGui.QPlainTextEdit.__init__(self, *args) QtGui.QPlainTextEdit.__init__(self, *args)
# Default dictionary based on the current locale. # Default dictionary based on the current locale.
if ENCHANT_AVAILABLE: if ENCHANT_AVAILABLE:
try: try:
self.dictionary = enchant.Dict() self.dictionary = enchant.Dict()
self.highlighter = Highlighter(self.document())
self.highlighter.spellingDictionary = self.dictionary
except DictNotFoundError: except DictNotFoundError:
self.dictionary = enchant.Dict(u'en_US') ENCHANT_AVAILABLE = False
self.highlighter = Highlighter(self.document()) log.debug(u'Could not load default dictionary')
self.highlighter.spellingDictionary = self.dictionary
def mousePressEvent(self, event): def mousePressEvent(self, event):
""" """

View File

@ -51,8 +51,7 @@ class OpenLPToolbar(QtGui.QToolBar):
log.debug(u'Init done for %s' % parent.__class__.__name__) log.debug(u'Init done for %s' % parent.__class__.__name__)
def addToolbarButton(self, title, icon, tooltip=None, slot=None, def addToolbarButton(self, title, icon, tooltip=None, slot=None,
checkable=False, shortcut=0, alternate=0, checkable=False, shortcuts=None, context=QtCore.Qt.WidgetShortcut):
context=QtCore.Qt.WidgetShortcut):
""" """
A method to help developers easily add a button to the toolbar. A method to help developers easily add a button to the toolbar.
@ -74,16 +73,12 @@ class OpenLPToolbar(QtGui.QToolBar):
If *True* the button has two, *off* and *on*, states. Default is If *True* the button has two, *off* and *on*, states. Default is
*False*, which means the buttons has only one state. *False*, which means the buttons has only one state.
``shortcut`` ``shortcuts``
The primary shortcut for this action The list of shortcuts for this action
``alternate``
The alternate shortcut for this action
``context`` ``context``
Specify the context in which this shortcut is valid Specify the context in which this shortcut is valid
""" """
newAction = None
if icon: if icon:
actionIcon = build_icon(icon) actionIcon = build_icon(icon)
if slot and not checkable: if slot and not checkable:
@ -92,7 +87,7 @@ class OpenLPToolbar(QtGui.QToolBar):
newAction = self.addAction(actionIcon, title) newAction = self.addAction(actionIcon, title)
self.icons[title] = actionIcon self.icons[title] = actionIcon
else: else:
newAction = QtGui.QAction(title, newAction) newAction = QtGui.QAction(title, self)
self.addAction(newAction) self.addAction(newAction)
QtCore.QObject.connect(newAction, QtCore.QObject.connect(newAction,
QtCore.SIGNAL(u'triggered()'), slot) QtCore.SIGNAL(u'triggered()'), slot)
@ -103,8 +98,9 @@ class OpenLPToolbar(QtGui.QToolBar):
QtCore.QObject.connect(newAction, QtCore.QObject.connect(newAction,
QtCore.SIGNAL(u'toggled(bool)'), slot) QtCore.SIGNAL(u'toggled(bool)'), slot)
self.actions[title] = newAction self.actions[title] = newAction
newAction.setShortcuts([shortcut, alternate]) if shortcuts is not None:
newAction.setShortcutContext(context) newAction.setShortcuts(shortcuts)
newAction.setShortcutContext(context)
return newAction return newAction
def addToolbarSeparator(self, handle): def addToolbarSeparator(self, handle):

View File

@ -31,6 +31,7 @@ import logging
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import build_icon, Receiver, translate from openlp.core.lib import build_icon, Receiver, translate
from openlp.core.utils.actions import ActionList
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -49,14 +50,18 @@ class UiStrings(object):
Cancel = translate('OpenLP.Ui', 'Cancel') Cancel = translate('OpenLP.Ui', 'Cancel')
CCLINumberLabel = translate('OpenLP.Ui', 'CCLI number:') CCLINumberLabel = translate('OpenLP.Ui', 'CCLI number:')
CreateService = translate('OpenLP.Ui', 'Create a new service.') CreateService = translate('OpenLP.Ui', 'Create a new service.')
Continuous = translate('OpenLP.Ui', 'Continuous')
Default = unicode(translate('OpenLP.Ui', 'Default')) Default = unicode(translate('OpenLP.Ui', 'Default'))
Delete = translate('OpenLP.Ui', '&Delete') Delete = translate('OpenLP.Ui', '&Delete')
DisplayStyle = translate('OpenLP.Ui', 'Display style:')
Edit = translate('OpenLP.Ui', '&Edit') Edit = translate('OpenLP.Ui', '&Edit')
EmptyField = translate('OpenLP.Ui', 'Empty Field') EmptyField = translate('OpenLP.Ui', 'Empty Field')
Error = translate('OpenLP.Ui', 'Error') Error = translate('OpenLP.Ui', 'Error')
Export = translate('OpenLP.Ui', 'Export') Export = translate('OpenLP.Ui', 'Export')
File = translate('OpenLP.Ui', 'File')
FontSizePtUnit = translate('OpenLP.Ui', 'pt', FontSizePtUnit = translate('OpenLP.Ui', 'pt',
'Abbreviated font pointsize unit') 'Abbreviated font pointsize unit')
Help = translate('OpenLP.Ui', 'Help')
Hours = translate('OpenLP.Ui', 'h', 'The abbreviated unit for hours') Hours = translate('OpenLP.Ui', 'h', 'The abbreviated unit for hours')
Image = translate('OpenLP.Ui', 'Image') Image = translate('OpenLP.Ui', 'Image')
Import = translate('OpenLP.Ui', 'Import') Import = translate('OpenLP.Ui', 'Import')
@ -64,6 +69,7 @@ class UiStrings(object):
Live = translate('OpenLP.Ui', 'Live') Live = translate('OpenLP.Ui', 'Live')
LiveBGError = translate('OpenLP.Ui', 'Live Background Error') LiveBGError = translate('OpenLP.Ui', 'Live Background Error')
LivePanel = translate('OpenLP.Ui', 'Live Panel') LivePanel = translate('OpenLP.Ui', 'Live Panel')
LiveToolbar = translate('OpenLP.Ui', 'Live Toolbar')
Load = translate('OpenLP.Ui', 'Load') Load = translate('OpenLP.Ui', 'Load')
Minutes = translate('OpenLP.Ui', 'm', 'The abbreviated unit for minutes') Minutes = translate('OpenLP.Ui', 'm', 'The abbreviated unit for minutes')
Middle = translate('OpenLP.Ui', 'Middle') Middle = translate('OpenLP.Ui', 'Middle')
@ -81,6 +87,7 @@ class UiStrings(object):
OpenService = translate('OpenLP.Ui', 'Open Service') OpenService = translate('OpenLP.Ui', 'Open Service')
Preview = translate('OpenLP.Ui', 'Preview') Preview = translate('OpenLP.Ui', 'Preview')
PreviewPanel = translate('OpenLP.Ui', 'Preview Panel') PreviewPanel = translate('OpenLP.Ui', 'Preview Panel')
PreviewToolbar = translate('OpenLP.Ui', 'Preview Toolbar')
PrintServiceOrder = translate('OpenLP.Ui', 'Print Service Order') PrintServiceOrder = translate('OpenLP.Ui', 'Print Service Order')
ReplaceBG = translate('OpenLP.Ui', 'Replace Background') ReplaceBG = translate('OpenLP.Ui', 'Replace Background')
ReplaceLiveBG = translate('OpenLP.Ui', 'Replace Live Background') ReplaceLiveBG = translate('OpenLP.Ui', 'Replace Live Background')
@ -91,13 +98,19 @@ class UiStrings(object):
Search = translate('OpenLP.Ui', 'Search') Search = translate('OpenLP.Ui', 'Search')
SelectDelete = translate('OpenLP.Ui', 'You must select an item to delete.') SelectDelete = translate('OpenLP.Ui', 'You must select an item to delete.')
SelectEdit = translate('OpenLP.Ui', 'You must select an item to edit.') SelectEdit = translate('OpenLP.Ui', 'You must select an item to edit.')
Settings = translate('OpenLP.Ui', 'Settings')
SaveService = translate('OpenLP.Ui', 'Save Service') SaveService = translate('OpenLP.Ui', 'Save Service')
Service = translate('OpenLP.Ui', 'Service') Service = translate('OpenLP.Ui', 'Service')
StartTimeCode = unicode(translate('OpenLP.Ui', 'Start %s')) StartTimeCode = unicode(translate('OpenLP.Ui', 'Start %s'))
Theme = translate('OpenLP.Ui', 'Theme', 'Singular') Theme = translate('OpenLP.Ui', 'Theme', 'Singular')
Themes = translate('OpenLP.Ui', 'Themes', 'Plural') Themes = translate('OpenLP.Ui', 'Themes', 'Plural')
Tools = translate('OpenLP.Ui', 'Tools')
Top = translate('OpenLP.Ui', 'Top') Top = translate('OpenLP.Ui', 'Top')
VersePerSlide = translate('OpenLP.Ui', 'Verse Per Slide')
VersePerLine = translate('OpenLP.Ui', 'Verse Per Line')
Version = translate('OpenLP.Ui', 'Version') Version = translate('OpenLP.Ui', 'Version')
View = translate('OpenLP.Ui', 'View')
ViewMode = translate('OpenLP.Ui', 'View Model')
def add_welcome_page(parent, image): def add_welcome_page(parent, image):
""" """
@ -238,45 +251,128 @@ def create_up_down_push_button_set(parent):
QtCore.SIGNAL(u'clicked()'), parent.onDownButtonClicked) QtCore.SIGNAL(u'clicked()'), parent.onDownButtonClicked)
return up_button, down_button return up_button, down_button
def base_action(parent, name): def base_action(parent, name, category=None):
""" """
Return the most basic action with the object name set. Return the most basic action with the object name set.
``category``
The category the action should be listed in the shortcut dialog. If you
not wish, that this action is added to the shortcut dialog, then do not
state any.
""" """
action = QtGui.QAction(parent) action = QtGui.QAction(parent)
action.setObjectName(name) action.setObjectName(name)
if category is not None:
action_list = ActionList.get_instance()
action_list.add_action(action, category)
return action return action
def checkable_action(parent, name, checked=None): def checkable_action(parent, name, checked=None, category=None):
""" """
Return a standard action with the checkable attribute set. Return a standard action with the checkable attribute set.
""" """
action = base_action(parent, name) action = base_action(parent, name, category)
action.setCheckable(True) action.setCheckable(True)
if checked is not None: if checked is not None:
action.setChecked(checked) action.setChecked(checked)
return action return action
def icon_action(parent, name, icon, checked=None): def icon_action(parent, name, icon, checked=None, category=None):
""" """
Return a standard action with an icon. Return a standard action with an icon.
""" """
if checked is not None: if checked is not None:
action = checkable_action(parent, name, checked) action = checkable_action(parent, name, checked, category)
else: else:
action = base_action(parent, name) action = base_action(parent, name, category)
action.setIcon(build_icon(icon)) action.setIcon(build_icon(icon))
return action return action
def shortcut_action(parent, text, shortcuts, function): def shortcut_action(parent, name, shortcuts, function, icon=None, checked=None,
category=None, context=QtCore.Qt.WindowShortcut):
""" """
Return a shortcut enabled action. Return a shortcut enabled action.
""" """
action = QtGui.QAction(text, parent) action = QtGui.QAction(parent)
action.setObjectName(name)
if icon is not None:
action.setIcon(build_icon(icon))
if checked is not None:
action.setCheckable(True)
action.setChecked(checked)
action.setShortcuts(shortcuts) action.setShortcuts(shortcuts)
action.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) action.setShortcutContext(context)
action_list = ActionList.get_instance()
action_list.add_action(action, category)
QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), function) QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), function)
return action return action
def context_menu_action(base, icon, text, slot, shortcuts=None, category=None,
context=QtCore.Qt.WindowShortcut):
"""
Utility method to help build context menus for plugins
``base``
The parent menu to add this menu item to
``icon``
An icon for this action
``text``
The text to display for this action
``slot``
The code to run when this action is triggered
``shortcuts``
The action's shortcuts.
``category``
The category the shortcut should be listed in the shortcut dialog. If
left to None, then the action will be hidden in the shortcut dialog.
``context``
The context the shortcut is valid.
"""
action = QtGui.QAction(text, base)
if icon:
action.setIcon(build_icon(icon))
QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot)
if shortcuts is not None:
action.setShortcuts(shortcuts)
action.setShortcutContext(context)
action_list = ActionList.get_instance()
action_list.add_action(action)
return action
def context_menu(base, icon, text):
"""
Utility method to help build context menus for plugins
``base``
The parent object to add this menu to
``icon``
An icon for this menu
``text``
The text to display for this menu
"""
action = QtGui.QMenu(text, base)
action.setIcon(build_icon(icon))
return action
def context_menu_separator(base):
"""
Add a separator to a context menu
``base``
The menu object to add the separator to
"""
action = QtGui.QAction(u'', base)
action.setSeparator(True)
return action
def add_widget_completer(cache, widget): def add_widget_completer(cache, widget):
""" """
Adds a text autocompleter to a widget. Adds a text autocompleter to a widget.
@ -315,3 +411,20 @@ def create_valign_combo(form, parent, layout):
form.verticalComboBox.addItem(UiStrings.Bottom) form.verticalComboBox.addItem(UiStrings.Bottom)
verticalLabel.setBuddy(form.verticalComboBox) verticalLabel.setBuddy(form.verticalComboBox)
layout.addRow(verticalLabel, form.verticalComboBox) layout.addRow(verticalLabel, form.verticalComboBox)
def find_and_set_in_combo_box(combo_box, value_to_find):
"""
Find a string in a combo box and set it as the selected item if present
``combo_box``
The combo box to check for selected items
``value_to_find``
The value to find
"""
index = combo_box.findText(value_to_find,
QtCore.Qt.MatchExactly)
if index == -1:
# Not Found.
index = 0
combo_box.setCurrentIndex(index)

View File

@ -33,12 +33,13 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import RenderManager, build_icon, OpenLPDockWidget, \ from openlp.core.lib import RenderManager, build_icon, OpenLPDockWidget, \
SettingsManager, PluginManager, Receiver, translate SettingsManager, PluginManager, Receiver, translate
from openlp.core.lib.ui import UiStrings, base_action, checkable_action, \ from openlp.core.lib.ui import UiStrings, base_action, checkable_action, \
icon_action icon_action, shortcut_action
from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, \ from openlp.core.ui import AboutForm, SettingsForm, ServiceManager, \
ThemeManager, SlideController, PluginForm, MediaDockManager, \ ThemeManager, SlideController, PluginForm, MediaDockManager, \
ShortcutListForm, DisplayTagForm ShortcutListForm, DisplayTagForm
from openlp.core.utils import AppLocation, add_actions, LanguageManager, \ from openlp.core.utils import AppLocation, add_actions, LanguageManager, \
ActionList, get_application_version get_application_version
from openlp.core.utils.actions import ActionList, CategoryOrder
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -161,74 +162,86 @@ class Ui_MainWindow(object):
mainWindow.addDockWidget(QtCore.Qt.RightDockWidgetArea, mainWindow.addDockWidget(QtCore.Qt.RightDockWidgetArea,
self.themeManagerDock) self.themeManagerDock)
# Create the menu items # Create the menu items
self.FileNewItem = icon_action(mainWindow, u'FileNewItem', action_list = ActionList.get_instance()
u':/general/general_new.png') action_list.add_category(UiStrings.File, CategoryOrder.standardMenu)
mainWindow.actionList.add_action(self.FileNewItem, u'File') self.FileNewItem = shortcut_action(mainWindow, u'FileNewItem',
self.FileOpenItem = icon_action(mainWindow, u'FileOpenItem', [QtGui.QKeySequence(u'Ctrl+N')],
u':/general/general_open.png') self.ServiceManagerContents.onNewServiceClicked,
mainWindow.actionList.add_action(self.FileOpenItem, u'File') u':/general/general_new.png', category=UiStrings.File)
self.FileSaveItem = icon_action(mainWindow, u'FileSaveItem', self.FileOpenItem = shortcut_action(mainWindow, u'FileOpenItem',
u':/general/general_save.png') [QtGui.QKeySequence(u'Ctrl+O')],
mainWindow.actionList.add_action(self.FileSaveItem, u'File') self.ServiceManagerContents.onLoadServiceClicked,
self.FileSaveAsItem = base_action(mainWindow, u'FileSaveAsItem') u':/general/general_open.png', category=UiStrings.File)
mainWindow.actionList.add_action(self.FileSaveAsItem, u'File') self.FileSaveItem = shortcut_action(mainWindow, u'FileSaveItem',
self.printServiceOrderItem = base_action( [QtGui.QKeySequence(u'Ctrl+S')],
mainWindow, u'printServiceItem') self.ServiceManagerContents.saveFile,
mainWindow.actionList.add_action( u':/general/general_save.png', category=UiStrings.File)
self.printServiceOrderItem, u'Print Service Order') self.FileSaveAsItem = shortcut_action(mainWindow, u'FileSaveAsItem',
self.FileExitItem = icon_action(mainWindow, u'FileExitItem', [QtGui.QKeySequence(u'Ctrl+Shift+S')],
u':/system/system_exit.png') self.ServiceManagerContents.saveFileAs, category=UiStrings.File)
mainWindow.actionList.add_action(self.FileExitItem, u'File') self.printServiceOrderItem = shortcut_action(mainWindow,
self.ImportThemeItem = base_action(mainWindow, u'ImportThemeItem') u'printServiceItem', [QtGui.QKeySequence(u'Ctrl+P')],
mainWindow.actionList.add_action(self.ImportThemeItem, u'Import') self.ServiceManagerContents.printServiceOrder,
self.ImportLanguageItem = base_action(mainWindow, u'ImportLanguageItem') category=UiStrings.File)
mainWindow.actionList.add_action(self.ImportLanguageItem, u'Import') self.FileExitItem = shortcut_action(mainWindow, u'FileExitItem',
self.ExportThemeItem = base_action(mainWindow, u'ExportThemeItem') [QtGui.QKeySequence(u'Alt+F4')], mainWindow.close,
mainWindow.actionList.add_action(self.ExportThemeItem, u'Export') u':/system/system_exit.png', category=UiStrings.File)
self.ExportLanguageItem = base_action(mainWindow, u'ExportLanguageItem') action_list.add_category(UiStrings.Import, CategoryOrder.standardMenu)
mainWindow.actionList.add_action(self.ExportLanguageItem, u'Export') self.ImportThemeItem = base_action(
self.ViewMediaManagerItem = icon_action(mainWindow, mainWindow, u'ImportThemeItem', UiStrings.Import)
u'ViewMediaManagerItem', u':/system/system_mediamanager.png', self.ImportLanguageItem = base_action(
self.mediaManagerDock.isVisible()) mainWindow, u'ImportLanguageItem')#, UiStrings.Import)
self.ViewThemeManagerItem = icon_action(mainWindow, action_list.add_category(UiStrings.Export, CategoryOrder.standardMenu)
u'ViewThemeManagerItem', u':/system/system_thememanager.png', self.ExportThemeItem = base_action(
self.themeManagerDock.isVisible()) mainWindow, u'ExportThemeItem', UiStrings.Export)
mainWindow.actionList.add_action(self.ViewMediaManagerItem, u'View') self.ExportLanguageItem = base_action(
self.ViewServiceManagerItem = icon_action(mainWindow, mainWindow, u'ExportLanguageItem')#, UiStrings.Export)
u'ViewServiceManagerItem', u':/system/system_servicemanager.png', action_list.add_category(UiStrings.View, CategoryOrder.standardMenu)
self.serviceManagerDock.isVisible()) self.ViewMediaManagerItem = shortcut_action(mainWindow,
mainWindow.actionList.add_action(self.ViewServiceManagerItem, u'View') u'ViewMediaManagerItem', [QtGui.QKeySequence(u'F8')],
self.ViewPreviewPanel = checkable_action(mainWindow, self.toggleMediaManager, u':/system/system_mediamanager.png',
u'ViewPreviewPanel', previewVisible) self.mediaManagerDock.isVisible(), UiStrings.View)
mainWindow.actionList.add_action(self.ViewPreviewPanel, u'View') self.ViewThemeManagerItem = shortcut_action(mainWindow,
self.ViewLivePanel = checkable_action(mainWindow, u'ViewLivePanel', u'ViewThemeManagerItem', [QtGui.QKeySequence(u'F10')],
liveVisible) self.toggleThemeManager, u':/system/system_thememanager.png',
mainWindow.actionList.add_action(self.ViewLivePanel, u'View') self.themeManagerDock.isVisible(), UiStrings.View)
self.ModeDefaultItem = checkable_action(mainWindow, u'ModeDefaultItem') self.ViewServiceManagerItem = shortcut_action(mainWindow,
mainWindow.actionList.add_action(self.ModeDefaultItem, u'View Mode') u'ViewServiceManagerItem', [QtGui.QKeySequence(u'F9')],
self.ModeSetupItem = checkable_action(mainWindow, u'ModeLiveItem') self.toggleServiceManager, u':/system/system_servicemanager.png',
mainWindow.actionList.add_action(self.ModeSetupItem, u'View Mode') self.serviceManagerDock.isVisible(), UiStrings.View)
self.ModeLiveItem = checkable_action(mainWindow, u'ModeLiveItem', True) self.ViewPreviewPanel = shortcut_action(mainWindow,
mainWindow.actionList.add_action(self.ModeLiveItem, u'View Mode') u'ViewPreviewPanel', [QtGui.QKeySequence(u'F11')],
self.setPreviewPanelVisibility, checked=previewVisible,
category=UiStrings.View)
self.ViewLivePanel = shortcut_action(mainWindow, u'ViewLivePanel',
[QtGui.QKeySequence(u'F12')], self.setLivePanelVisibility,
checked=liveVisible, category=UiStrings.View)
action_list.add_category(UiStrings.ViewMode, CategoryOrder.standardMenu)
self.ModeDefaultItem = checkable_action(
mainWindow, u'ModeDefaultItem', category=UiStrings.ViewMode)
self.ModeSetupItem = checkable_action(
mainWindow, u'ModeLiveItem', category=UiStrings.ViewMode)
self.ModeLiveItem = checkable_action(
mainWindow, u'ModeLiveItem', True, UiStrings.ViewMode)
self.ModeGroup = QtGui.QActionGroup(mainWindow) self.ModeGroup = QtGui.QActionGroup(mainWindow)
self.ModeGroup.addAction(self.ModeDefaultItem) self.ModeGroup.addAction(self.ModeDefaultItem)
self.ModeGroup.addAction(self.ModeSetupItem) self.ModeGroup.addAction(self.ModeSetupItem)
self.ModeGroup.addAction(self.ModeLiveItem) self.ModeGroup.addAction(self.ModeLiveItem)
self.ModeDefaultItem.setChecked(True) self.ModeDefaultItem.setChecked(True)
action_list.add_category(UiStrings.Tools, CategoryOrder.standardMenu)
self.ToolsAddToolItem = icon_action(mainWindow, u'ToolsAddToolItem', self.ToolsAddToolItem = icon_action(mainWindow, u'ToolsAddToolItem',
u':/tools/tools_add.png') u':/tools/tools_add.png', category=UiStrings.Tools)
mainWindow.actionList.add_action(self.ToolsAddToolItem, u'Tools')
self.ToolsOpenDataFolder = icon_action(mainWindow, self.ToolsOpenDataFolder = icon_action(mainWindow,
u'ToolsOpenDataFolder', u':/general/general_open.png') u'ToolsOpenDataFolder', u':/general/general_open.png',
mainWindow.actionList.add_action(self.ToolsOpenDataFolder, u'Tools') category=UiStrings.Tools)
self.settingsPluginListItem = icon_action(mainWindow, action_list.add_category(UiStrings.Settings, CategoryOrder.standardMenu)
u'settingsPluginListItem', u':/system/settings_plugin_list.png') self.settingsPluginListItem = shortcut_action(mainWindow,
mainWindow.actionList.add_action(self.settingsPluginListItem, u'settingsPluginListItem', [QtGui.QKeySequence(u'Alt+F7')],
u'Settings') self.onPluginItemClicked, u':/system/settings_plugin_list.png',
category=UiStrings.Settings)
# i18n Language Items # i18n Language Items
self.AutoLanguageItem = checkable_action(mainWindow, self.AutoLanguageItem = checkable_action(mainWindow,
u'AutoLanguageItem', LanguageManager.auto_language) u'AutoLanguageItem', LanguageManager.auto_language)
mainWindow.actionList.add_action(self.AutoLanguageItem, u'Settings')
self.LanguageGroup = QtGui.QActionGroup(mainWindow) self.LanguageGroup = QtGui.QActionGroup(mainWindow)
self.LanguageGroup.setExclusive(True) self.LanguageGroup.setExclusive(True)
self.LanguageGroup.setObjectName(u'LanguageGroup') self.LanguageGroup.setObjectName(u'LanguageGroup')
@ -241,24 +254,26 @@ class Ui_MainWindow(object):
add_actions(self.LanguageGroup, [languageItem]) add_actions(self.LanguageGroup, [languageItem])
self.SettingsShortcutsItem = icon_action(mainWindow, self.SettingsShortcutsItem = icon_action(mainWindow,
u'SettingsShortcutsItem', u'SettingsShortcutsItem',
u':/system/system_configure_shortcuts.png') u':/system/system_configure_shortcuts.png',
category=UiStrings.Settings)
self.DisplayTagItem = icon_action(mainWindow, self.DisplayTagItem = icon_action(mainWindow,
u'DisplayTagItem', u':/system/tag_editor.png') u'DisplayTagItem', u':/system/tag_editor.png',
category=UiStrings.Settings)
self.SettingsConfigureItem = icon_action(mainWindow, self.SettingsConfigureItem = icon_action(mainWindow,
u'SettingsConfigureItem', u':/system/system_settings.png') u'SettingsConfigureItem', u':/system/system_settings.png',
mainWindow.actionList.add_action(self.SettingsShortcutsItem, category=UiStrings.Settings)
u'Settings') action_list.add_category(UiStrings.Help, CategoryOrder.standardMenu)
self.HelpDocumentationItem = icon_action(mainWindow, self.HelpDocumentationItem = icon_action(mainWindow,
u'HelpDocumentationItem', u':/system/system_help_contents.png') u'HelpDocumentationItem', u':/system/system_help_contents.png',
category=None)#UiStrings.Help)
self.HelpDocumentationItem.setEnabled(False) self.HelpDocumentationItem.setEnabled(False)
mainWindow.actionList.add_action(self.HelpDocumentationItem, u'Help') self.HelpAboutItem = shortcut_action(mainWindow, u'HelpAboutItem',
self.HelpAboutItem = icon_action(mainWindow, u'HelpAboutItem', [QtGui.QKeySequence(u'Ctrl+F1')], self.onHelpAboutItemClicked,
u':/system/system_about.png') u':/system/system_about.png', category=UiStrings.Help)
mainWindow.actionList.add_action(self.HelpAboutItem, u'Help') self.HelpOnlineHelpItem = base_action(
self.HelpOnlineHelpItem = base_action(mainWindow, u'HelpOnlineHelpItem') mainWindow, u'HelpOnlineHelpItem', category=UiStrings.Help)
mainWindow.actionList.add_action(self.HelpOnlineHelpItem, u'Help') self.helpWebSiteItem = base_action(
self.helpWebSiteItem = base_action(mainWindow, u'helpWebSiteItem') mainWindow, u'helpWebSiteItem', category=UiStrings.Help)
mainWindow.actionList.add_action(self.helpWebSiteItem, u'Help')
add_actions(self.FileImportMenu, add_actions(self.FileImportMenu,
(self.ImportThemeItem, self.ImportLanguageItem)) (self.ImportThemeItem, self.ImportLanguageItem))
add_actions(self.FileExportMenu, add_actions(self.FileExportMenu,
@ -294,14 +309,11 @@ class Ui_MainWindow(object):
# Connect up some signals and slots # Connect up some signals and slots
QtCore.QObject.connect(self.FileMenu, QtCore.QObject.connect(self.FileMenu,
QtCore.SIGNAL(u'aboutToShow()'), self.updateFileMenu) QtCore.SIGNAL(u'aboutToShow()'), self.updateFileMenu)
QtCore.QObject.connect(self.FileExitItem,
QtCore.SIGNAL(u'triggered()'), mainWindow.close)
QtCore.QMetaObject.connectSlotsByName(mainWindow) QtCore.QMetaObject.connectSlotsByName(mainWindow)
# Hide the entry, as it does not have any functionality yet. # Hide the entry, as it does not have any functionality yet.
self.ToolsAddToolItem.setVisible(False) self.ToolsAddToolItem.setVisible(False)
self.ImportLanguageItem.setVisible(False) self.ImportLanguageItem.setVisible(False)
self.ExportLanguageItem.setVisible(False) self.ExportLanguageItem.setVisible(False)
self.SettingsShortcutsItem.setVisible(False)
self.HelpDocumentationItem.setVisible(False) self.HelpDocumentationItem.setVisible(False)
def retranslateUi(self, mainWindow): def retranslateUi(self, mainWindow):
@ -329,36 +341,27 @@ class Ui_MainWindow(object):
self.FileNewItem.setText(translate('OpenLP.MainWindow', '&New')) self.FileNewItem.setText(translate('OpenLP.MainWindow', '&New'))
self.FileNewItem.setToolTip(UiStrings.NewService) self.FileNewItem.setToolTip(UiStrings.NewService)
self.FileNewItem.setStatusTip(UiStrings.CreateService) self.FileNewItem.setStatusTip(UiStrings.CreateService)
self.FileNewItem.setShortcut(translate('OpenLP.MainWindow', 'Ctrl+N'))
self.FileOpenItem.setText(translate('OpenLP.MainWindow', '&Open')) self.FileOpenItem.setText(translate('OpenLP.MainWindow', '&Open'))
self.FileOpenItem.setToolTip(UiStrings.OpenService) self.FileOpenItem.setToolTip(UiStrings.OpenService)
self.FileOpenItem.setStatusTip( self.FileOpenItem.setStatusTip(
translate('OpenLP.MainWindow', 'Open an existing service.')) translate('OpenLP.MainWindow', 'Open an existing service.'))
self.FileOpenItem.setShortcut(translate('OpenLP.MainWindow', 'Ctrl+O'))
self.FileSaveItem.setText(translate('OpenLP.MainWindow', '&Save')) self.FileSaveItem.setText(translate('OpenLP.MainWindow', '&Save'))
self.FileSaveItem.setToolTip(UiStrings.SaveService) self.FileSaveItem.setToolTip(UiStrings.SaveService)
self.FileSaveItem.setStatusTip( self.FileSaveItem.setStatusTip(
translate('OpenLP.MainWindow', 'Save the current service to disk.')) translate('OpenLP.MainWindow', 'Save the current service to disk.'))
self.FileSaveItem.setShortcut(translate('OpenLP.MainWindow', 'Ctrl+S'))
self.FileSaveAsItem.setText( self.FileSaveAsItem.setText(
translate('OpenLP.MainWindow', 'Save &As...')) translate('OpenLP.MainWindow', 'Save &As...'))
self.FileSaveAsItem.setToolTip( self.FileSaveAsItem.setToolTip(
translate('OpenLP.MainWindow', 'Save Service As')) translate('OpenLP.MainWindow', 'Save Service As'))
self.FileSaveAsItem.setStatusTip(translate('OpenLP.MainWindow', self.FileSaveAsItem.setStatusTip(translate('OpenLP.MainWindow',
'Save the current service under a new name.')) 'Save the current service under a new name.'))
self.FileSaveAsItem.setShortcut(
translate('OpenLP.MainWindow', 'Ctrl+Shift+S'))
self.printServiceOrderItem.setText(UiStrings.PrintServiceOrder) self.printServiceOrderItem.setText(UiStrings.PrintServiceOrder)
self.printServiceOrderItem.setStatusTip(translate('OpenLP.MainWindow', self.printServiceOrderItem.setStatusTip(translate('OpenLP.MainWindow',
'Print the current Service Order.')) 'Print the current Service Order.'))
self.printServiceOrderItem.setShortcut(
translate('OpenLP.MainWindow', 'Ctrl+P'))
self.FileExitItem.setText( self.FileExitItem.setText(
translate('OpenLP.MainWindow', 'E&xit')) translate('OpenLP.MainWindow', 'E&xit'))
self.FileExitItem.setStatusTip( self.FileExitItem.setStatusTip(
translate('OpenLP.MainWindow', 'Quit OpenLP')) translate('OpenLP.MainWindow', 'Quit OpenLP'))
self.FileExitItem.setShortcut(
translate('OpenLP.MainWindow', 'Alt+F4'))
self.ImportThemeItem.setText( self.ImportThemeItem.setText(
translate('OpenLP.MainWindow', '&Theme')) translate('OpenLP.MainWindow', '&Theme'))
self.ImportLanguageItem.setText( self.ImportLanguageItem.setText(
@ -379,53 +382,39 @@ class Ui_MainWindow(object):
translate('OpenLP.MainWindow', 'Toggle Media Manager')) translate('OpenLP.MainWindow', 'Toggle Media Manager'))
self.ViewMediaManagerItem.setStatusTip(translate('OpenLP.MainWindow', self.ViewMediaManagerItem.setStatusTip(translate('OpenLP.MainWindow',
'Toggle the visibility of the media manager.')) 'Toggle the visibility of the media manager.'))
self.ViewMediaManagerItem.setShortcut(
translate('OpenLP.MainWindow', 'F8'))
self.ViewThemeManagerItem.setText( self.ViewThemeManagerItem.setText(
translate('OpenLP.MainWindow', '&Theme Manager')) translate('OpenLP.MainWindow', '&Theme Manager'))
self.ViewThemeManagerItem.setToolTip( self.ViewThemeManagerItem.setToolTip(
translate('OpenLP.MainWindow', 'Toggle Theme Manager')) translate('OpenLP.MainWindow', 'Toggle Theme Manager'))
self.ViewThemeManagerItem.setStatusTip(translate('OpenLP.MainWindow', self.ViewThemeManagerItem.setStatusTip(translate('OpenLP.MainWindow',
'Toggle the visibility of the theme manager.')) 'Toggle the visibility of the theme manager.'))
self.ViewThemeManagerItem.setShortcut(
translate('OpenLP.MainWindow', 'F10'))
self.ViewServiceManagerItem.setText( self.ViewServiceManagerItem.setText(
translate('OpenLP.MainWindow', '&Service Manager')) translate('OpenLP.MainWindow', '&Service Manager'))
self.ViewServiceManagerItem.setToolTip( self.ViewServiceManagerItem.setToolTip(
translate('OpenLP.MainWindow', 'Toggle Service Manager')) translate('OpenLP.MainWindow', 'Toggle Service Manager'))
self.ViewServiceManagerItem.setStatusTip(translate('OpenLP.MainWindow', self.ViewServiceManagerItem.setStatusTip(translate('OpenLP.MainWindow',
'Toggle the visibility of the service manager.')) 'Toggle the visibility of the service manager.'))
self.ViewServiceManagerItem.setShortcut(
translate('OpenLP.MainWindow', 'F9'))
self.ViewPreviewPanel.setText( self.ViewPreviewPanel.setText(
translate('OpenLP.MainWindow', '&Preview Panel')) translate('OpenLP.MainWindow', '&Preview Panel'))
self.ViewPreviewPanel.setToolTip( self.ViewPreviewPanel.setToolTip(
translate('OpenLP.MainWindow', 'Toggle Preview Panel')) translate('OpenLP.MainWindow', 'Toggle Preview Panel'))
self.ViewPreviewPanel.setStatusTip(translate('OpenLP.MainWindow', self.ViewPreviewPanel.setStatusTip(translate('OpenLP.MainWindow',
'Toggle the visibility of the preview panel.')) 'Toggle the visibility of the preview panel.'))
self.ViewPreviewPanel.setShortcut(
translate('OpenLP.MainWindow', 'F11'))
self.ViewLivePanel.setText( self.ViewLivePanel.setText(
translate('OpenLP.MainWindow', '&Live Panel')) translate('OpenLP.MainWindow', '&Live Panel'))
self.ViewLivePanel.setToolTip( self.ViewLivePanel.setToolTip(
translate('OpenLP.MainWindow', 'Toggle Live Panel')) translate('OpenLP.MainWindow', 'Toggle Live Panel'))
self.ViewLivePanel.setStatusTip(translate('OpenLP.MainWindow', self.ViewLivePanel.setStatusTip(translate('OpenLP.MainWindow',
'Toggle the visibility of the live panel.')) 'Toggle the visibility of the live panel.'))
self.ViewLivePanel.setShortcut(
translate('OpenLP.MainWindow', 'F12'))
self.settingsPluginListItem.setText(translate('OpenLP.MainWindow', self.settingsPluginListItem.setText(translate('OpenLP.MainWindow',
'&Plugin List')) '&Plugin List'))
self.settingsPluginListItem.setStatusTip( self.settingsPluginListItem.setStatusTip(
translate('OpenLP.MainWindow', 'List the Plugins')) translate('OpenLP.MainWindow', 'List the Plugins'))
self.settingsPluginListItem.setShortcut(
translate('OpenLP.MainWindow', 'Alt+F7'))
self.HelpDocumentationItem.setText( self.HelpDocumentationItem.setText(
translate('OpenLP.MainWindow', '&User Guide')) translate('OpenLP.MainWindow', '&User Guide'))
self.HelpAboutItem.setText(translate('OpenLP.MainWindow', '&About')) self.HelpAboutItem.setText(translate('OpenLP.MainWindow', '&About'))
self.HelpAboutItem.setStatusTip( self.HelpAboutItem.setStatusTip(
translate('OpenLP.MainWindow', 'More information about OpenLP')) translate('OpenLP.MainWindow', 'More information about OpenLP'))
self.HelpAboutItem.setShortcut(
translate('OpenLP.MainWindow', 'Ctrl+F1'))
self.HelpOnlineHelpItem.setText( self.HelpOnlineHelpItem.setText(
translate('OpenLP.MainWindow', '&Online Help')) translate('OpenLP.MainWindow', '&Online Help'))
# Uncomment after 1.9.5 beta string freeze # Uncomment after 1.9.5 beta string freeze
@ -467,8 +456,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
""" """
log.info(u'MainWindow loaded') log.info(u'MainWindow loaded')
actionList = ActionList()
def __init__(self, screens, clipboard, arguments): def __init__(self, screens, clipboard, arguments):
""" """
This constructor sets up the interface, the various managers, and the This constructor sets up the interface, the various managers, and the
@ -485,7 +472,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
self.serviceSettingsSection = u'servicemanager' self.serviceSettingsSection = u'servicemanager'
self.songsSettingsSection = u'songs' self.songsSettingsSection = u'songs'
self.serviceNotSaved = False self.serviceNotSaved = False
self.actionList = ActionList()
self.settingsmanager = SettingsManager(screens) self.settingsmanager = SettingsManager(screens)
self.aboutForm = AboutForm(self) self.aboutForm = AboutForm(self)
self.settingsForm = SettingsForm(self.screens, self, self) self.settingsForm = SettingsForm(self.screens, self, self)
@ -510,16 +496,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
QtCore.QObject.connect(self.ExportThemeItem, QtCore.QObject.connect(self.ExportThemeItem,
QtCore.SIGNAL(u'triggered()'), QtCore.SIGNAL(u'triggered()'),
self.themeManagerContents.onExportTheme) self.themeManagerContents.onExportTheme)
QtCore.QObject.connect(self.ViewMediaManagerItem,
QtCore.SIGNAL(u'triggered(bool)'), self.toggleMediaManager)
QtCore.QObject.connect(self.ViewServiceManagerItem,
QtCore.SIGNAL(u'triggered(bool)'), self.toggleServiceManager)
QtCore.QObject.connect(self.ViewThemeManagerItem,
QtCore.SIGNAL(u'triggered(bool)'), self.toggleThemeManager)
QtCore.QObject.connect(self.ViewPreviewPanel,
QtCore.SIGNAL(u'toggled(bool)'), self.setPreviewPanelVisibility)
QtCore.QObject.connect(self.ViewLivePanel,
QtCore.SIGNAL(u'toggled(bool)'), self.setLivePanelVisibility)
QtCore.QObject.connect(self.mediaManagerDock, QtCore.QObject.connect(self.mediaManagerDock,
QtCore.SIGNAL(u'visibilityChanged(bool)'), QtCore.SIGNAL(u'visibilityChanged(bool)'),
self.ViewMediaManagerItem.setChecked) self.ViewMediaManagerItem.setChecked)
@ -533,32 +509,14 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
QtCore.SIGNAL(u'triggered()'), self.onHelpWebSiteClicked) QtCore.SIGNAL(u'triggered()'), self.onHelpWebSiteClicked)
QtCore.QObject.connect(self.HelpOnlineHelpItem, QtCore.QObject.connect(self.HelpOnlineHelpItem,
QtCore.SIGNAL(u'triggered()'), self.onHelpOnLineHelpClicked) QtCore.SIGNAL(u'triggered()'), self.onHelpOnLineHelpClicked)
QtCore.QObject.connect(self.HelpAboutItem,
QtCore.SIGNAL(u'triggered()'), self.onHelpAboutItemClicked)
QtCore.QObject.connect(self.ToolsOpenDataFolder, QtCore.QObject.connect(self.ToolsOpenDataFolder,
QtCore.SIGNAL(u'triggered()'), self.onToolsOpenDataFolderClicked) QtCore.SIGNAL(u'triggered()'), self.onToolsOpenDataFolderClicked)
QtCore.QObject.connect(self.settingsPluginListItem,
QtCore.SIGNAL(u'triggered()'), self.onPluginItemClicked)
QtCore.QObject.connect(self.DisplayTagItem, QtCore.QObject.connect(self.DisplayTagItem,
QtCore.SIGNAL(u'triggered()'), self.onDisplayTagItemClicked) QtCore.SIGNAL(u'triggered()'), self.onDisplayTagItemClicked)
QtCore.QObject.connect(self.SettingsConfigureItem, QtCore.QObject.connect(self.SettingsConfigureItem,
QtCore.SIGNAL(u'triggered()'), self.onSettingsConfigureItemClicked) QtCore.SIGNAL(u'triggered()'), self.onSettingsConfigureItemClicked)
QtCore.QObject.connect(self.SettingsShortcutsItem, QtCore.QObject.connect(self.SettingsShortcutsItem,
QtCore.SIGNAL(u'triggered()'), self.onSettingsShortcutsItemClicked) QtCore.SIGNAL(u'triggered()'), self.onSettingsShortcutsItemClicked)
QtCore.QObject.connect(self.FileNewItem, QtCore.SIGNAL(u'triggered()'),
self.ServiceManagerContents.onNewServiceClicked)
QtCore.QObject.connect(self.FileOpenItem,
QtCore.SIGNAL(u'triggered()'),
self.ServiceManagerContents.onLoadServiceClicked)
QtCore.QObject.connect(self.FileSaveItem,
QtCore.SIGNAL(u'triggered()'),
self.ServiceManagerContents.saveFile)
QtCore.QObject.connect(self.FileSaveAsItem,
QtCore.SIGNAL(u'triggered()'),
self.ServiceManagerContents.saveFileAs)
QtCore.QObject.connect(self.printServiceOrderItem,
QtCore.SIGNAL(u'triggered()'),
self.ServiceManagerContents.printServiceOrder)
# i18n set signals for languages # i18n set signals for languages
self.LanguageGroup.triggered.connect(LanguageManager.set_language) self.LanguageGroup.triggered.connect(LanguageManager.set_language)
QtCore.QObject.connect(self.ModeDefaultItem, QtCore.QObject.connect(self.ModeDefaultItem,
@ -781,7 +739,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
""" """
Show the shortcuts dialog Show the shortcuts dialog
""" """
self.shortcutForm.exec_(self.actionList) if self.shortcutForm.exec_():
self.shortcutForm.save()
def onModeDefaultItemClicked(self): def onModeDefaultItemClicked(self):
""" """
@ -928,19 +887,16 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
unicode(translate('OpenLP.MainWindow', 'Default Theme: %s')) % unicode(translate('OpenLP.MainWindow', 'Default Theme: %s')) %
theme) theme)
def toggleMediaManager(self, visible): def toggleMediaManager(self):
if self.mediaManagerDock.isVisible() != visible: self.mediaManagerDock.setVisible(not self.mediaManagerDock.isVisible())
self.mediaManagerDock.setVisible(visible)
def toggleServiceManager(self, visible): def toggleServiceManager(self):
if self.serviceManagerDock.isVisible() != visible: self.serviceManagerDock.setVisible(not self.serviceManagerDock.isVisible())
self.serviceManagerDock.setVisible(visible)
def toggleThemeManager(self, visible): def toggleThemeManager(self):
if self.themeManagerDock.isVisible() != visible: self.themeManagerDock.setVisible(not self.themeManagerDock.isVisible())
self.themeManagerDock.setVisible(visible)
def setPreviewPanelVisibility(self, visible): def setPreviewPanelVisibility(self, visible=None):
""" """
Sets the visibility of the preview panel including saving the setting Sets the visibility of the preview panel including saving the setting
and updating the menu. and updating the menu.
@ -950,12 +906,14 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
True - Visible True - Visible
False - Hidden False - Hidden
""" """
if visible is None:
visible = self.ViewPreviewPanel.isVisible()
self.previewController.panel.setVisible(visible) self.previewController.panel.setVisible(visible)
QtCore.QSettings().setValue(u'user interface/preview panel', QtCore.QSettings().setValue(u'user interface/preview panel',
QtCore.QVariant(visible)) QtCore.QVariant(visible))
self.ViewPreviewPanel.setChecked(visible) self.ViewPreviewPanel.setChecked(visible)
def setLivePanelVisibility(self, visible): def setLivePanelVisibility(self, visible=None):
""" """
Sets the visibility of the live panel including saving the setting and Sets the visibility of the live panel including saving the setting and
updating the menu. updating the menu.
@ -965,6 +923,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
True - Visible True - Visible
False - Hidden False - Hidden
""" """
if visible is None:
visible = self.ViewLivePanel.isVisible()
self.liveController.panel.setVisible(visible) self.liveController.panel.setVisible(visible)
QtCore.QSettings().setValue(u'user interface/live panel', QtCore.QSettings().setValue(u'user interface/live panel',
QtCore.QVariant(visible)) QtCore.QVariant(visible))
@ -1022,8 +982,9 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
self.FileMenu.addSeparator() self.FileMenu.addSeparator()
for fileId, filename in enumerate(recentFilesToDisplay): for fileId, filename in enumerate(recentFilesToDisplay):
log.debug('Recent file name: %s', filename) log.debug('Recent file name: %s', filename)
action = QtGui.QAction(u'&%d %s' % (fileId + 1, action = base_action(self, u'')
QtCore.QFileInfo(filename).fileName()), self) action.setText(u'&%d %s' %
(fileId + 1, QtCore.QFileInfo(filename).fileName()))
action.setData(QtCore.QVariant(filename)) action.setData(QtCore.QVariant(filename))
self.connect(action, QtCore.SIGNAL(u'triggered()'), self.connect(action, QtCore.SIGNAL(u'triggered()'),
self.ServiceManagerContents.onRecentServiceClicked) self.ServiceManagerContents.onRecentServiceClicked)

View File

@ -132,6 +132,8 @@ class Ui_PrintServiceDialog(object):
self.groupLayout = QtGui.QVBoxLayout() self.groupLayout = QtGui.QVBoxLayout()
self.slideTextCheckBox = QtGui.QCheckBox() self.slideTextCheckBox = QtGui.QCheckBox()
self.groupLayout.addWidget(self.slideTextCheckBox) self.groupLayout.addWidget(self.slideTextCheckBox)
self.pageBreakAfterText = QtGui.QCheckBox()
self.groupLayout.addWidget(self.pageBreakAfterText)
self.notesCheckBox = QtGui.QCheckBox() self.notesCheckBox = QtGui.QCheckBox()
self.groupLayout.addWidget(self.notesCheckBox) self.groupLayout.addWidget(self.notesCheckBox)
self.metaDataCheckBox = QtGui.QCheckBox() self.metaDataCheckBox = QtGui.QCheckBox()
@ -149,6 +151,8 @@ class Ui_PrintServiceDialog(object):
printServiceDialog.setWindowTitle(UiStrings.PrintServiceOrder) printServiceDialog.setWindowTitle(UiStrings.PrintServiceOrder)
self.slideTextCheckBox.setText(translate('OpenLP.PrintServiceForm', self.slideTextCheckBox.setText(translate('OpenLP.PrintServiceForm',
'Include slide text if available')) 'Include slide text if available'))
self.pageBreakAfterText.setText(translate('OpenLP.PrintServiceForm',
'Add page break before each text item.'))
self.notesCheckBox.setText(translate('OpenLP.PrintServiceForm', self.notesCheckBox.setText(translate('OpenLP.PrintServiceForm',
'Include service item notes')) 'Include service item notes'))
self.metaDataCheckBox.setText(translate('OpenLP.PrintServiceForm', self.metaDataCheckBox.setText(translate('OpenLP.PrintServiceForm',

View File

@ -24,12 +24,65 @@
# Temple Place, Suite 330, Boston, MA 02111-1307 USA # # Temple Place, Suite 330, Boston, MA 02111-1307 USA #
############################################################################### ###############################################################################
import datetime import datetime
import os
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from lxml import html
from openlp.core.lib import translate from openlp.core.lib import translate, get_text_file_string
from openlp.core.lib.ui import UiStrings from openlp.core.lib.ui import UiStrings
from openlp.core.ui.printservicedialog import Ui_PrintServiceDialog, ZoomSize from openlp.core.ui.printservicedialog import Ui_PrintServiceDialog, ZoomSize
from openlp.core.utils import AppLocation
DEFAULT_CSS = """/*
Edit this file to customize the service order print. Note, that not all CSS
properties are supported. See:
http://doc.trolltech.com/4.7/richtext-html-subset.html#css-properties
*/
.serviceTitle {
font-weight:600;
font-size:x-large;
color:black;
}
.itemTitle {
font-weight:600;
font-size:large;
color:black;
}
.itemText {
color:black;
}
.itemFooter {
font-size:8px;
color:black;
}
.itemNotesTitle {
font-weight:bold;
font-size:12px;
color:black;
}
.itemNotesText {
font-size:11px;
color:black;
}
.customNotesTitle {
font-weight:bold;
font-size:11px;
color:black;
}
.customNotesText {
font-size:11px;
color:black;
}
"""
class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog): class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
@ -50,6 +103,10 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
settings.beginGroup(u'advanced') settings.beginGroup(u'advanced')
self.slideTextCheckBox.setChecked(settings.value( self.slideTextCheckBox.setChecked(settings.value(
u'print slide text', QtCore.QVariant(False)).toBool()) u'print slide text', QtCore.QVariant(False)).toBool())
self.pageBreakAfterText.setChecked(settings.value(
u'add page break', QtCore.QVariant(False)).toBool())
if not self.slideTextCheckBox.isChecked():
self.pageBreakAfterText.setDisabled(True)
self.metaDataCheckBox.setChecked(settings.value( self.metaDataCheckBox.setChecked(settings.value(
u'print file meta data', QtCore.QVariant(False)).toBool()) u'print file meta data', QtCore.QVariant(False)).toBool())
self.notesCheckBox.setChecked(settings.value( self.notesCheckBox.setChecked(settings.value(
@ -76,6 +133,9 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
QtCore.SIGNAL(u'triggered()'), self.copyText) QtCore.SIGNAL(u'triggered()'), self.copyText)
QtCore.QObject.connect(self.htmlCopy, QtCore.QObject.connect(self.htmlCopy,
QtCore.SIGNAL(u'triggered()'), self.copyHtmlText) QtCore.SIGNAL(u'triggered()'), self.copyHtmlText)
QtCore.QObject.connect(self.slideTextCheckBox,
QtCore.SIGNAL(u'stateChanged(int)'),
self.onSlideTextCheckBoxChanged)
self.updatePreviewText() self.updatePreviewText()
def toggleOptions(self, checked): def toggleOptions(self, checked):
@ -93,59 +153,124 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
""" """
Creates the html text and updates the html of *self.document*. Creates the html text and updates the html of *self.document*.
""" """
text = u'' html_data = html.fromstring(
if self.titleLineEdit.text(): u'<title>%s</title>' % unicode(self.titleLineEdit.text()))
text += u'<h2>%s</h2>' % unicode(self.titleLineEdit.text()) css_path = os.path.join(
for item in self.serviceManager.serviceItems: AppLocation.get_data_path(), u'servicePrint.css')
if not os.path.isfile(css_path):
# Create default css file.
css_file = open(css_path, u'w')
css_file.write(DEFAULT_CSS)
css_file.close()
custom_css = get_text_file_string(css_path)
self._addChildToParent(
u'style', custom_css, html_data.head, u'type', u'text/css')
self._addChildToParent(u'body', parent=html_data)
self._addChildToParent(u'span', unicode(self.titleLineEdit.text()),
html_data.body, u'class', u'serviceTitle')
for index, item in enumerate(self.serviceManager.serviceItems):
item = item[u'service_item'] item = item[u'service_item']
div = self._addChildToParent(u'div', parent=html_data.body)
# Add the title of the service item. # Add the title of the service item.
text += u'<h3><img src="%s" /> %s</h3>' % (item.icon, item_title = self._addChildToParent(
item.get_display_title()) u'h2', parent=div, attribute=u'class', value=u'itemTitle')
# Add slide text of the service item. self._addChildToParent(
u'img', parent=item_title, attribute=u'src', value=item.icon)
self._fromstring(
u'<span> %s</span>' % item.get_display_title(), item_title)
if self.slideTextCheckBox.isChecked(): if self.slideTextCheckBox.isChecked():
# Add the text of the service item.
if item.is_text(): if item.is_text():
# Add the text of the service item. verse_def = None
verse = None
for slide in item.get_frames(): for slide in item.get_frames():
if not verse: if not verse_def or verse_def != slide[u'verseTag']:
text += u'<p>' + slide[u'html'] p = self._addChildToParent(u'p', parent=div,
verse = slide[u'verseTag'] attribute=u'class', value=u'itemText')
elif verse != slide[u'verseTag']:
text += u'<\p><p>' + slide[u'html']
verse = slide[u'verseTag']
else: else:
text += u'<br/>' + slide[u'html'] self._addChildToParent(u'br', parent=p)
text += u'</p>' self._fromstring(u'<span>%s</span>' % slide[u'html'], p)
verse_def = slide[u'verseTag']
# Break the page before the div element.
if index != 0 and self.pageBreakAfterText.isChecked():
div.set(u'style', u'page-break-before:always')
# Add the image names of the service item.
elif item.is_image(): elif item.is_image():
# Add the image names of the service item. ol = self._addChildToParent(u'ol', parent=div)
text += u'<ol>'
for slide in range(len(item.get_frames())): for slide in range(len(item.get_frames())):
text += u'<li><p>%s</p></li>' % \ self._addChildToParent(u'li', item.get_frame_title(slide), ol)
item.get_frame_title(slide) # add footer
text += u'</ol>'
if item.foot_text: if item.foot_text:
# add footer self._fromstring(
text += u'<p>%s</p>' % item.foot_text item.foot_text, div, u'class', u'itemFooter')
# Add service items' notes. # Add service items' notes.
if self.notesCheckBox.isChecked(): if self.notesCheckBox.isChecked():
if item.notes: if item.notes:
text += u'<p><strong>%s</strong></p>%s' % (translate( p = self._addChildToParent(u'p', parent=div)
'OpenLP.ServiceManager', 'Notes:'), self._addChildToParent(u'span', unicode(
item.notes.replace(u'\n', u'<br />')) translate('OpenLP.ServiceManager', 'Notes:')), p,
u'class', u'itemNotesTitle')
self._fromstring(u'<span> %s</span>' % item.notes.replace(
u'\n', u'<br />'), p, u'class', u'itemNotesText')
# Add play length of media files. # Add play length of media files.
if item.is_media() and self.metaDataCheckBox.isChecked(): if item.is_media() and self.metaDataCheckBox.isChecked():
tme = item.media_length tme = item.media_length
if item.end_time > 0: if item.end_time > 0:
tme = item.end_time - item.start_time tme = item.end_time - item.start_time
text += u'<p><strong>%s</strong> %s</p>' % (translate( title = self._fromstring(u'<p><strong>%s</strong> </p>' %
'OpenLP.ServiceManager', u'Playing time:'), translate('OpenLP.ServiceManager', 'Playing time:'), div)
unicode(datetime.timedelta(seconds=tme))) self._fromstring(u'<span>%s</span>' %
unicode(datetime.timedelta(seconds=tme)), title)
# Add the custom service notes:
if self.footerTextEdit.toPlainText(): if self.footerTextEdit.toPlainText():
text += u'<h4>%s</h4>%s' % (translate('OpenLP.ServiceManager', self._addChildToParent(u'span', translate('OpenLP.ServiceManager',
u'Custom Service Notes:'), self.footerTextEdit.toPlainText()) u'Custom Service Notes:'), div, u'class', u'customNotesTitle')
self.document.setHtml(text) self._addChildToParent(
u'span', u' %s' % self.footerTextEdit.toPlainText(), div,
u'class', u'customNotesText')
self.document.setHtml(html.tostring(html_data))
self.previewWidget.updatePreview() self.previewWidget.updatePreview()
def _addChildToParent(self, tag, text=None, parent=None, attribute=None,
value=None):
"""
Creates a html element. If ``text`` is given, the element's text will
set and if a ``parent`` is given, the element is appended.
``tag``
The html tag, e. g. ``u'span'``. Defaults to ``None``.
``text``
The text for the tag. Defaults to ``None``.
``parent``
The parent element. Defaults to ``None``.
``attribute``
An optional attribute, for instance ``u'class``.
``value``
The value for the given ``attribute``. It does not have a meaning,
if the attribute is left to its default.
"""
element = html.Element(tag)
if text is not None:
element.text = unicode(text)
if parent is not None:
parent.append(element)
if attribute is not None:
element.set(attribute, value if value is not None else u'')
return element
def _fromstring(self, string, parent, attribute=None, value=None):
"""
This is used to create a child html element from a string.
"""
element = html.fromstring(string)
if attribute is not None:
element.set(attribute, value if value is not None else u'')
parent.append(element)
return element
def paintRequested(self, printer): def paintRequested(self, printer):
""" """
Paint the preview of the *self.document*. Paint the preview of the *self.document*.
@ -232,6 +357,13 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
else: else:
self.copyTextButton.setText(UiStrings.CopyToText) self.copyTextButton.setText(UiStrings.CopyToText)
def onSlideTextCheckBoxChanged(self, state):
"""
Disable or enable the ``pageBreakAfterText`` checkbox as it should only
be enabled, when the ``slideTextCheckBox`` is enabled.
"""
self.pageBreakAfterText.setDisabled(state == QtCore.Qt.Unchecked)
def saveOptions(self): def saveOptions(self):
""" """
Save the settings and close the dialog. Save the settings and close the dialog.
@ -241,6 +373,8 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
settings.beginGroup(u'advanced') settings.beginGroup(u'advanced')
settings.setValue(u'print slide text', settings.setValue(u'print slide text',
QtCore.QVariant(self.slideTextCheckBox.isChecked())) QtCore.QVariant(self.slideTextCheckBox.isChecked()))
settings.setValue(u'add page break',
QtCore.QVariant(self.pageBreakAfterText.isChecked()))
settings.setValue(u'print file meta data', settings.setValue(u'print file meta data',
QtCore.QVariant(self.metaDataCheckBox.isChecked())) QtCore.QVariant(self.metaDataCheckBox.isChecked()))
settings.setValue(u'print notes', settings.setValue(u'print notes',

View File

@ -32,14 +32,16 @@ log = logging.getLogger(__name__)
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import OpenLPToolbar, ServiceItem, context_menu_action, \ from openlp.core.lib import OpenLPToolbar, ServiceItem, Receiver, build_icon, \
Receiver, build_icon, ItemCapabilities, SettingsManager, translate ItemCapabilities, SettingsManager, translate
from openlp.core.lib.theme import ThemeLevel from openlp.core.lib.theme import ThemeLevel
from openlp.core.lib.ui import UiStrings, critical_error_message_box from openlp.core.lib.ui import UiStrings, critical_error_message_box, \
context_menu_action, find_and_set_in_combo_box
from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm
from openlp.core.ui.printserviceform import PrintServiceForm from openlp.core.ui.printserviceform import PrintServiceForm
from openlp.core.utils import AppLocation, delete_file, file_is_unicode, \ from openlp.core.utils import AppLocation, delete_file, file_is_unicode, \
split_filename split_filename
from openlp.core.utils.actions import ActionList, CategoryOrder
class ServiceManagerList(QtGui.QTreeWidget): class ServiceManagerList(QtGui.QTreeWidget):
""" """
@ -164,38 +166,55 @@ class ServiceManager(QtGui.QWidget):
u':/services/service_top.png', u':/services/service_top.png',
translate('OpenLP.ServiceManager', translate('OpenLP.ServiceManager',
'Move item to the top of the service.'), 'Move item to the top of the service.'),
self.onServiceTop, shortcut=QtCore.Qt.Key_Home) self.onServiceTop, shortcuts=[QtCore.Qt.Key_Home])
self.serviceManagerList.moveTop.setObjectName(u'moveTop')
action_list = ActionList.get_instance()
action_list.add_category(UiStrings.Service, CategoryOrder.standardToolbar)
action_list.add_action(
self.serviceManagerList.moveTop, UiStrings.Service)
self.serviceManagerList.moveUp = self.orderToolbar.addToolbarButton( self.serviceManagerList.moveUp = self.orderToolbar.addToolbarButton(
translate('OpenLP.ServiceManager', 'Move &up'), translate('OpenLP.ServiceManager', 'Move &up'),
u':/services/service_up.png', u':/services/service_up.png',
translate('OpenLP.ServiceManager', translate('OpenLP.ServiceManager',
'Move item up one position in the service.'), 'Move item up one position in the service.'),
self.onServiceUp, shortcut=QtCore.Qt.Key_PageUp) self.onServiceUp, shortcuts=[QtCore.Qt.Key_PageUp])
self.serviceManagerList.moveUp.setObjectName(u'moveUp')
action_list.add_action(self.serviceManagerList.moveUp, UiStrings.Service)
self.serviceManagerList.moveDown = self.orderToolbar.addToolbarButton( self.serviceManagerList.moveDown = self.orderToolbar.addToolbarButton(
translate('OpenLP.ServiceManager', 'Move &down'), translate('OpenLP.ServiceManager', 'Move &down'),
u':/services/service_down.png', u':/services/service_down.png',
translate('OpenLP.ServiceManager', translate('OpenLP.ServiceManager',
'Move item down one position in the service.'), 'Move item down one position in the service.'),
self.onServiceDown, shortcut=QtCore.Qt.Key_PageDown) self.onServiceDown, shortcuts=[QtCore.Qt.Key_PageDown])
self.serviceManagerList.moveDown.setObjectName(u'moveDown')
action_list.add_action(
self.serviceManagerList.moveDown, UiStrings.Service)
self.serviceManagerList.moveBottom = self.orderToolbar.addToolbarButton( self.serviceManagerList.moveBottom = self.orderToolbar.addToolbarButton(
translate('OpenLP.ServiceManager', 'Move to &bottom'), translate('OpenLP.ServiceManager', 'Move to &bottom'),
u':/services/service_bottom.png', u':/services/service_bottom.png',
translate('OpenLP.ServiceManager', translate('OpenLP.ServiceManager',
'Move item to the end of the service.'), 'Move item to the end of the service.'),
self.onServiceEnd, shortcut=QtCore.Qt.Key_End) self.onServiceEnd, shortcuts=[QtCore.Qt.Key_End])
self.serviceManagerList.moveBottom.setObjectName(u'moveBottom')
action_list.add_action(
self.serviceManagerList.moveBottom, UiStrings.Service)
self.serviceManagerList.down = self.orderToolbar.addToolbarButton( self.serviceManagerList.down = self.orderToolbar.addToolbarButton(
translate('OpenLP.ServiceManager', 'Move &down'), translate('OpenLP.ServiceManager', 'Move &down'),
None, None,
translate('OpenLP.ServiceManager', translate('OpenLP.ServiceManager',
'Moves the selection down the window.'), 'Moves the selection down the window.'),
self.onMoveSelectionDown, shortcut=QtCore.Qt.Key_Down) self.onMoveSelectionDown, shortcuts=[QtCore.Qt.Key_Down])
self.serviceManagerList.down.setObjectName(u'down')
action_list.add_action(self.serviceManagerList.down)
self.serviceManagerList.down.setVisible(False) self.serviceManagerList.down.setVisible(False)
self.serviceManagerList.up = self.orderToolbar.addToolbarButton( self.serviceManagerList.up = self.orderToolbar.addToolbarButton(
translate('OpenLP.ServiceManager', 'Move up'), translate('OpenLP.ServiceManager', 'Move up'),
None, None,
translate('OpenLP.ServiceManager', translate('OpenLP.ServiceManager',
'Moves the selection up the window.'), 'Moves the selection up the window.'),
self.onMoveSelectionUp, shortcut=QtCore.Qt.Key_Up) self.onMoveSelectionUp, shortcuts=[QtCore.Qt.Key_Up])
self.serviceManagerList.up.setObjectName(u'up')
action_list.add_action(self.serviceManagerList.up)
self.serviceManagerList.up.setVisible(False) self.serviceManagerList.up.setVisible(False)
self.orderToolbar.addSeparator() self.orderToolbar.addSeparator()
self.serviceManagerList.delete = self.orderToolbar.addToolbarButton( self.serviceManagerList.delete = self.orderToolbar.addToolbarButton(
@ -210,22 +229,28 @@ class ServiceManager(QtGui.QWidget):
u':/services/service_expand_all.png', u':/services/service_expand_all.png',
translate('OpenLP.ServiceManager', translate('OpenLP.ServiceManager',
'Expand all the service items.'), 'Expand all the service items.'),
self.onExpandAll, shortcut=QtCore.Qt.Key_Plus) self.onExpandAll, shortcuts=[QtCore.Qt.Key_Plus])
self.serviceManagerList.expand.setObjectName(u'expand')
action_list.add_action(self.serviceManagerList.expand, UiStrings.Service)
self.serviceManagerList.collapse = self.orderToolbar.addToolbarButton( self.serviceManagerList.collapse = self.orderToolbar.addToolbarButton(
translate('OpenLP.ServiceManager', '&Collapse all'), translate('OpenLP.ServiceManager', '&Collapse all'),
u':/services/service_collapse_all.png', u':/services/service_collapse_all.png',
translate('OpenLP.ServiceManager', translate('OpenLP.ServiceManager',
'Collapse all the service items.'), 'Collapse all the service items.'),
self.onCollapseAll, shortcut=QtCore.Qt.Key_Minus) self.onCollapseAll, shortcuts=[QtCore.Qt.Key_Minus])
self.serviceManagerList.collapse.setObjectName(u'collapse')
action_list.add_action(
self.serviceManagerList.collapse, UiStrings.Service)
self.orderToolbar.addSeparator() self.orderToolbar.addSeparator()
self.serviceManagerList.makeLive = self.orderToolbar.addToolbarButton( self.serviceManagerList.makeLive = self.orderToolbar.addToolbarButton(
translate('OpenLP.ServiceManager', 'Go Live'), translate('OpenLP.ServiceManager', 'Go Live'),
u':/general/general_live.png', u':/general/general_live.png',
translate('OpenLP.ServiceManager', translate('OpenLP.ServiceManager',
'Send the selected item to Live.'), 'Send the selected item to Live.'), self.makeLive,
self.makeLive, shortcut=QtCore.Qt.Key_Enter, shortcuts=[QtCore.Qt.Key_Enter, QtCore.Qt.Key_Return])
alternate=QtCore.Qt.Key_Return) self.serviceManagerList.makeLive.setObjectName(u'orderToolbar')
self.orderToolbar.setObjectName(u'orderToolbar') action_list.add_action(
self.serviceManagerList.makeLive, UiStrings.Service)
self.layout.addWidget(self.orderToolbar) self.layout.addWidget(self.orderToolbar)
# Connect up our signals and slots # Connect up our signals and slots
QtCore.QObject.connect(self.themeComboBox, QtCore.QObject.connect(self.themeComboBox,
@ -300,7 +325,6 @@ class ServiceManager(QtGui.QWidget):
self.themeMenu = QtGui.QMenu( self.themeMenu = QtGui.QMenu(
translate('OpenLP.ServiceManager', '&Change Item Theme')) translate('OpenLP.ServiceManager', '&Change Item Theme'))
self.menu.addMenu(self.themeMenu) self.menu.addMenu(self.themeMenu)
self.setServiceHotkeys()
self.serviceManagerList.addActions( self.serviceManagerList.addActions(
[self.serviceManagerList.moveDown, [self.serviceManagerList.moveDown,
self.serviceManagerList.moveUp, self.serviceManagerList.moveUp,
@ -314,19 +338,6 @@ class ServiceManager(QtGui.QWidget):
]) ])
self.configUpdated() self.configUpdated()
def setServiceHotkeys(self):
actionList = self.mainwindow.actionList
actionList.add_action(self.serviceManagerList.moveDown, u'Service')
actionList.add_action(self.serviceManagerList.moveUp, u'Service')
actionList.add_action(self.serviceManagerList.moveTop, u'Service')
actionList.add_action(self.serviceManagerList.moveBottom, u'Service')
actionList.add_action(self.serviceManagerList.makeLive, u'Service')
actionList.add_action(self.serviceManagerList.up, u'Service')
actionList.add_action(self.serviceManagerList.down, u'Service')
actionList.add_action(self.serviceManagerList.expand, u'Service')
actionList.add_action(self.serviceManagerList.collapse, u'Service')
def setModified(self, modified=True): def setModified(self, modified=True):
""" """
Setter for property "modified". Sets whether or not the current service Setter for property "modified". Sets whether or not the current service
@ -691,9 +702,9 @@ class ServiceManager(QtGui.QWidget):
Called by the SlideController to request a preview item be made live Called by the SlideController to request a preview item be made live
and allows the next preview to be updated if relevent. and allows the next preview to be updated if relevent.
""" """
id, row = message.split(u':') uuid, row = message.split(u':')
for sitem in self.serviceItems: for sitem in self.serviceItems:
if sitem[u'service_item']._uuid == id: if sitem[u'service_item']._uuid == uuid:
item = self.serviceManagerList.topLevelItem(sitem[u'order'] - 1) item = self.serviceManagerList.topLevelItem(sitem[u'order'] - 1)
self.serviceManagerList.setCurrentItem(item) self.serviceManagerList.setCurrentItem(item)
self.makeLive(int(row)) self.makeLive(int(row))
@ -1021,7 +1032,7 @@ class ServiceManager(QtGui.QWidget):
editId, uuid = message.split(u':') editId, uuid = message.split(u':')
for item in self.serviceItems: for item in self.serviceItems:
if item[u'service_item']._uuid == uuid: if item[u'service_item']._uuid == uuid:
item[u'service_item'].edit_id = editId item[u'service_item'].edit_id = int(editId)
self.setModified(True) self.setModified(True)
def replaceServiceItem(self, newItem): def replaceServiceItem(self, newItem):
@ -1259,15 +1270,9 @@ class ServiceManager(QtGui.QWidget):
for theme in theme_list: for theme in theme_list:
self.themeComboBox.addItem(theme) self.themeComboBox.addItem(theme)
action = context_menu_action(self.serviceManagerList, None, theme, action = context_menu_action(self.serviceManagerList, None, theme,
self.onThemeChangeAction) self.onThemeChangeAction, context=QtCore.Qt.WidgetShortcut)
self.themeMenu.addAction(action) self.themeMenu.addAction(action)
index = self.themeComboBox.findText(self.service_theme, find_and_set_in_combo_box(self.themeComboBox, self.service_theme)
QtCore.Qt.MatchExactly)
# Not Found
if index == -1:
index = 0
self.service_theme = u''
self.themeComboBox.setCurrentIndex(index)
self.mainwindow.renderManager.set_service_theme(self.service_theme) self.mainwindow.renderManager.set_service_theme(self.service_theme)
self.regenerateServiceItems() self.regenerateServiceItems()

View File

@ -31,41 +31,72 @@ from openlp.core.lib import translate, build_icon
class Ui_ShortcutListDialog(object): class Ui_ShortcutListDialog(object):
def setupUi(self, shortcutListDialog): def setupUi(self, shortcutListDialog):
shortcutListDialog.setObjectName(u'shortcutListDialog') shortcutListDialog.setObjectName(u'shortcutListDialog')
self.dialogLayout = QtGui.QVBoxLayout(shortcutListDialog) shortcutListDialog.resize(500, 438)
self.dialogLayout.setObjectName(u'dialogLayout') self.shortcutListLayout = QtGui.QVBoxLayout(shortcutListDialog)
self.shortcutListLayout.setObjectName(u'shortcutListLayout')
self.descriptionLabel = QtGui.QLabel(shortcutListDialog)
self.descriptionLabel.setObjectName(u'descriptionLabel')
self.descriptionLabel.setWordWrap(True)
self.shortcutListLayout.addWidget(self.descriptionLabel)
self.treeWidget = QtGui.QTreeWidget(shortcutListDialog) self.treeWidget = QtGui.QTreeWidget(shortcutListDialog)
self.treeWidget.setAlternatingRowColors(True)
self.treeWidget.setObjectName(u'treeWidget') self.treeWidget.setObjectName(u'treeWidget')
self.treeWidget.setAlternatingRowColors(True)
self.treeWidget.setColumnCount(3) self.treeWidget.setColumnCount(3)
self.dialogLayout.addWidget(self.treeWidget) self.treeWidget.setColumnWidth(0, 250)
self.defaultButton = QtGui.QRadioButton(shortcutListDialog) self.shortcutListLayout.addWidget(self.treeWidget)
self.defaultButton.setChecked(True) self.detailsLayout = QtGui.QGridLayout()
self.defaultButton.setObjectName(u'defaultButton') self.detailsLayout.setObjectName(u'detailsLayout')
self.dialogLayout.addWidget(self.defaultButton) self.detailsLayout.setContentsMargins(-1, 0, -1, -1)
self.customLayout = QtGui.QHBoxLayout() self.defaultRadioButton = QtGui.QRadioButton(shortcutListDialog)
self.customLayout.setObjectName(u'customLayout') self.defaultRadioButton.setObjectName(u'defaultRadioButton')
self.customButton = QtGui.QRadioButton(shortcutListDialog) self.defaultRadioButton.setChecked(True)
self.customButton.setObjectName(u'customButton') self.detailsLayout.addWidget(self.defaultRadioButton, 0, 0, 1, 1)
self.customLayout.addWidget(self.customButton) self.customRadioButton = QtGui.QRadioButton(shortcutListDialog)
self.shortcutButton = QtGui.QPushButton(shortcutListDialog) self.customRadioButton.setObjectName(u'customRadioButton')
self.shortcutButton.setIcon( self.detailsLayout.addWidget(self.customRadioButton, 1, 0, 1, 1)
self.primaryLayout = QtGui.QHBoxLayout()
self.primaryLayout.setObjectName(u'primaryLayout')
self.primaryPushButton = QtGui.QPushButton(shortcutListDialog)
self.primaryPushButton.setObjectName(u'primaryPushButton')
self.primaryPushButton.setMinimumSize(QtCore.QSize(84, 0))
self.primaryPushButton.setIcon(
build_icon(u':/system/system_configure_shortcuts.png')) build_icon(u':/system/system_configure_shortcuts.png'))
self.shortcutButton.setCheckable(True) self.primaryPushButton.setCheckable(True)
self.shortcutButton.setObjectName(u'shortcutButton') self.primaryLayout.addWidget(self.primaryPushButton)
self.customLayout.addWidget(self.shortcutButton) self.clearPrimaryButton = QtGui.QToolButton(shortcutListDialog)
self.clearShortcutButton = QtGui.QToolButton(shortcutListDialog) self.clearPrimaryButton.setObjectName(u'clearPrimaryButton')
self.clearShortcutButton.setIcon( self.clearPrimaryButton.setMinimumSize(QtCore.QSize(0, 16))
self.clearPrimaryButton.setIcon(
build_icon(u':/system/clear_shortcut.png')) build_icon(u':/system/clear_shortcut.png'))
self.clearShortcutButton.setAutoRaise(True) self.primaryLayout.addWidget(self.clearPrimaryButton)
self.clearShortcutButton.setObjectName(u'clearShortcutButton') self.detailsLayout.addLayout(self.primaryLayout, 1, 1, 1, 1)
self.customLayout.addWidget(self.clearShortcutButton) self.alternateLayout = QtGui.QHBoxLayout()
self.customLayout.addStretch() self.alternateLayout.setObjectName(u'alternateLayout')
self.dialogLayout.addLayout(self.customLayout) self.alternatePushButton = QtGui.QPushButton(shortcutListDialog)
self.alternatePushButton.setObjectName(u'alternatePushButton')
self.alternatePushButton.setCheckable(True)
self.alternatePushButton.setIcon(
build_icon(u':/system/system_configure_shortcuts.png'))
self.alternateLayout.addWidget(self.alternatePushButton)
self.clearAlternateButton = QtGui.QToolButton(shortcutListDialog)
self.clearAlternateButton.setObjectName(u'clearAlternateButton')
self.clearAlternateButton.setIcon(
build_icon(u':/system/clear_shortcut.png'))
self.alternateLayout.addWidget(self.clearAlternateButton)
self.detailsLayout.addLayout(self.alternateLayout, 1, 2, 1, 1)
self.primaryLabel = QtGui.QLabel(shortcutListDialog)
self.primaryLabel.setObjectName(u'primaryLabel')
self.detailsLayout.addWidget(self.primaryLabel, 0, 1, 1, 1)
self.alternateLabel = QtGui.QLabel(shortcutListDialog)
self.alternateLabel.setObjectName(u'alternateLabel')
self.detailsLayout.addWidget(self.alternateLabel, 0, 2, 1, 1)
self.shortcutListLayout.addLayout(self.detailsLayout)
self.buttonBox = QtGui.QDialogButtonBox(shortcutListDialog) self.buttonBox = QtGui.QDialogButtonBox(shortcutListDialog)
self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel |
QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.Reset)
self.buttonBox.setObjectName(u'buttonBox') self.buttonBox.setObjectName(u'buttonBox')
self.dialogLayout.addWidget(self.buttonBox) self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel |
QtGui.QDialogButtonBox.Ok | QtGui.QDialogButtonBox.RestoreDefaults)
self.shortcutListLayout.addWidget(self.buttonBox)
self.retranslateUi(shortcutListDialog) self.retranslateUi(shortcutListDialog)
QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'), QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'),
shortcutListDialog.accept) shortcutListDialog.accept)
@ -76,13 +107,24 @@ class Ui_ShortcutListDialog(object):
def retranslateUi(self, shortcutListDialog): def retranslateUi(self, shortcutListDialog):
shortcutListDialog.setWindowTitle( shortcutListDialog.setWindowTitle(
translate('OpenLP.ShortcutListDialog', 'Customize Shortcuts')) translate('OpenLP.ShortcutListDialog', 'Customize Shortcuts'))
self.descriptionLabel.setText(translate('OpenLP.ShortcutListDialog',
'Select an action and click one of the buttons below to start '
'capturing a new primary or alternate shortcut, respectively.'))
self.treeWidget.setHeaderLabels([ self.treeWidget.setHeaderLabels([
translate('OpenLP.ShortcutListDialog', 'Action'), translate('OpenLP.ShortcutListDialog', 'Action'),
translate('OpenLP.ShortcutListDialog', 'Shortcut'), translate('OpenLP.ShortcutListDialog', 'Shortcut'),
translate('OpenLP.ShortcutListDialog', 'Alternate')]) translate('OpenLP.ShortcutListDialog', 'Alternate')])
self.defaultButton.setText( self.defaultRadioButton.setText(
translate('OpenLP.ShortcutListDialog', 'Default: %s')) translate('OpenLP.ShortcutListDialog', 'Default'))
self.customButton.setText( self.customRadioButton.setText(
translate('OpenLP.ShortcutListDialog', 'Custom:')) translate('OpenLP.ShortcutListDialog', 'Custom'))
self.shortcutButton.setText( self.primaryPushButton.setToolTip(
translate('OpenLP.ShortcutListDialog', 'None')) translate('OpenLP.ShortcutListDialog', 'Capture shortcut.'))
self.alternatePushButton.setToolTip(
translate('OpenLP.ShortcutListDialog', 'Capture shortcut.'))
self.clearPrimaryButton.setToolTip(
translate('OpenLP.ShortcutListDialog',
'Restore the default shortcut of this action.'))
self.clearAlternateButton.setToolTip(
translate('OpenLP.ShortcutListDialog',
'Restore the default shortcut of this action.'))

View File

@ -30,6 +30,7 @@ import re
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.utils import translate from openlp.core.utils import translate
from openlp.core.utils.actions import ActionList
from shortcutlistdialog import Ui_ShortcutListDialog from shortcutlistdialog import Ui_ShortcutListDialog
REMOVE_AMPERSAND = re.compile(r'&{1}') REMOVE_AMPERSAND = re.compile(r'&{1}')
@ -41,72 +42,391 @@ class ShortcutListForm(QtGui.QDialog, Ui_ShortcutListDialog):
The shortcut list dialog The shortcut list dialog
""" """
def __init__(self, parent): def __init__(self, parent=None):
"""
Do some initialisation stuff
"""
QtGui.QDialog.__init__(self, parent) QtGui.QDialog.__init__(self, parent)
self.setupUi(self) self.setupUi(self)
self.actionList = None self.changedActions = {}
self.captureShortcut = False self.action_list = ActionList.get_instance()
QtCore.QObject.connect(self.shortcutButton, QtCore.QObject.connect(self.primaryPushButton,
QtCore.SIGNAL(u'toggled(bool)'), self.onShortcutButtonClicked) QtCore.SIGNAL(u'toggled(bool)'), self.onPrimaryPushButtonClicked)
QtCore.QObject.connect(self.alternatePushButton,
QtCore.SIGNAL(u'toggled(bool)'), self.onAlternatePushButtonClicked)
QtCore.QObject.connect(self.treeWidget, QtCore.SIGNAL(
u'currentItemChanged(QTreeWidgetItem*, QTreeWidgetItem*)'),
self.onCurrentItemChanged)
QtCore.QObject.connect(self.treeWidget,
QtCore.SIGNAL(u'itemDoubleClicked(QTreeWidgetItem*, int)'),
self.onItemDoubleClicked)
QtCore.QObject.connect(self.clearPrimaryButton,
QtCore.SIGNAL(u'clicked(bool)'), self.onClearPrimaryButtonClicked)
QtCore.QObject.connect(self.clearAlternateButton,
QtCore.SIGNAL(u'clicked(bool)'), self.onClearAlternateButtonClicked)
QtCore.QObject.connect(self.buttonBox,
QtCore.SIGNAL(u'clicked(QAbstractButton*)'),
self.onRestoreDefaultsClicked)
QtCore.QObject.connect(self.defaultRadioButton,
QtCore.SIGNAL(u'clicked(bool)'), self.onDefaultRadioButtonClicked)
QtCore.QObject.connect(self.customRadioButton,
QtCore.SIGNAL(u'clicked(bool)'), self.onCustomRadioButtonClicked)
def keyPressEvent(self, event):
if self.primaryPushButton.isChecked() or \
self.alternatePushButton.isChecked():
event.ignore()
elif event.key() == QtCore.Qt.Key_Escape:
event.accept()
self.close()
def keyReleaseEvent(self, event): def keyReleaseEvent(self, event):
Qt = QtCore.Qt if not self.primaryPushButton.isChecked() and \
if not self.captureShortcut: not self.alternatePushButton.isChecked():
return return
key = event.key() key = event.key()
if key == Qt.Key_Shift or key == Qt.Key_Control or \ if key == QtCore.Qt.Key_Shift or key == QtCore.Qt.Key_Control or \
key == Qt.Key_Meta or key == Qt.Key_Alt: key == QtCore.Qt.Key_Meta or key == QtCore.Qt.Key_Alt:
return return
key_string = QtGui.QKeySequence(key).toString() key_string = QtGui.QKeySequence(key).toString()
if event.modifiers() & Qt.ControlModifier == Qt.ControlModifier: if event.modifiers() & QtCore.Qt.ControlModifier == \
QtCore.Qt.ControlModifier:
key_string = u'Ctrl+' + key_string key_string = u'Ctrl+' + key_string
if event.modifiers() & Qt.AltModifier == Qt.AltModifier: if event.modifiers() & QtCore.Qt.AltModifier == QtCore.Qt.AltModifier:
key_string = u'Alt+' + key_string key_string = u'Alt+' + key_string
if event.modifiers() & Qt.ShiftModifier == Qt.ShiftModifier: if event.modifiers() & QtCore.Qt.ShiftModifier == \
QtCore.Qt.ShiftModifier:
key_string = u'Shift+' + key_string key_string = u'Shift+' + key_string
key_sequence = QtGui.QKeySequence(key_string) key_sequence = QtGui.QKeySequence(key_string)
existing_key = QtGui.QKeySequence(u'Ctrl+Shift+F8') # The action we are attempting to change.
if key_sequence == existing_key: changing_action = self._currentItemAction()
QtGui.QMessageBox.warning( shortcut_valid = True
self, for category in self.action_list.categories:
for action in category.actions:
shortcuts = self._actionShortcuts(action)
if key_sequence not in shortcuts:
continue
if action is changing_action:
if self.primaryPushButton.isChecked() and \
shortcuts.index(key_sequence) == 0:
continue
if self.alternatePushButton.isChecked() and \
shortcuts.index(key_sequence) == 1:
continue
# Have the same parent, thus they cannot have the same shortcut.
if action.parent() is changing_action.parent():
shortcut_valid = False
# The new shortcut is already assigned, but if both shortcuts
# are only valid in a different widget the new shortcut is
# vaild, because they will not interfere.
if action.shortcutContext() in [QtCore.Qt.WindowShortcut,
QtCore.Qt.ApplicationShortcut]:
shortcut_valid = False
if changing_action.shortcutContext() in \
[QtCore.Qt.WindowShortcut, QtCore.Qt.ApplicationShortcut]:
shortcut_valid = False
if not shortcut_valid:
QtGui.QMessageBox.warning(self,
translate('OpenLP.ShortcutListDialog', 'Duplicate Shortcut'), translate('OpenLP.ShortcutListDialog', 'Duplicate Shortcut'),
unicode(translate('OpenLP.ShortcutListDialog', 'The shortcut ' unicode(translate('OpenLP.ShortcutListDialog', 'The shortcut '
'"%s" is already assigned to another action, please ' '"%s" is already assigned to another action, please '
'use a different shortcut.')) % key_sequence.toString(), 'use a different shortcut.')) % key_sequence.toString(),
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok), QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok),
QtGui.QMessageBox.Ok QtGui.QMessageBox.Ok
) )
else: else:
self.shortcutButton.setText(key_sequence.toString()) if self.primaryPushButton.isChecked():
self.shortcutButton.setChecked(False) self._adjustButton(self.primaryPushButton,
self.captureShortcut = False False, text=key_sequence.toString())
elif self.alternatePushButton.isChecked():
self._adjustButton(self.alternatePushButton,
False, text=key_sequence.toString())
def exec_(self, actionList): def exec_(self):
self.actionList = actionList self.changedActions = {}
self.refreshActions() self.reloadShortcutList()
self._adjustButton(self.primaryPushButton, False, False, u'')
self._adjustButton(self.alternatePushButton, False, False, u'')
return QtGui.QDialog.exec_(self) return QtGui.QDialog.exec_(self)
def refreshActions(self): def reloadShortcutList(self):
"""
Reload the ``treeWidget`` list to add new and remove old actions.
"""
self.treeWidget.clear() self.treeWidget.clear()
for category in self.actionList.categories: for category in self.action_list.categories:
# Check if the category is for internal use only.
if category.name is None:
continue
item = QtGui.QTreeWidgetItem([category.name]) item = QtGui.QTreeWidgetItem([category.name])
for action in category.actions: for action in category.actions:
actionText = REMOVE_AMPERSAND.sub('', unicode(action.text())) actionText = REMOVE_AMPERSAND.sub('', unicode(action.text()))
if (len(action.shortcuts()) == 2): actionItem = QtGui.QTreeWidgetItem([actionText])
shortcutText = action.shortcuts()[0].toString()
alternateText = action.shortcuts()[1].toString()
else:
shortcutText = action.shortcut().toString()
alternateText = u''
actionItem = QtGui.QTreeWidgetItem(
[actionText, shortcutText, alternateText])
actionItem.setIcon(0, action.icon()) actionItem.setIcon(0, action.icon())
actionItem.setData(0,
QtCore.Qt.UserRole, QtCore.QVariant(action))
item.addChild(actionItem) item.addChild(actionItem)
item.setExpanded(True)
self.treeWidget.addTopLevelItem(item) self.treeWidget.addTopLevelItem(item)
item.setExpanded(True)
self.refreshShortcutList()
def onShortcutButtonClicked(self, toggled): def refreshShortcutList(self):
self.captureShortcut = toggled """
This refreshes the item's shortcuts shown in the list. Note, this
neither adds new actions nor removes old actions.
"""
iterator = QtGui.QTreeWidgetItemIterator(self.treeWidget)
while iterator.value():
item = iterator.value()
iterator += 1
action = self._currentItemAction(item)
if action is None:
continue
shortcuts = self._actionShortcuts(action)
if len(shortcuts) == 0:
item.setText(1, u'')
item.setText(2, u'')
elif len(shortcuts) == 1:
item.setText(1, shortcuts[0].toString())
item.setText(2, u'')
else:
item.setText(1, shortcuts[0].toString())
item.setText(2, shortcuts[1].toString())
self.onCurrentItemChanged()
def onPrimaryPushButtonClicked(self, toggled):
"""
Save the new primary shortcut.
"""
self.customRadioButton.setChecked(True)
if toggled:
self.alternatePushButton.setChecked(False)
return
action = self._currentItemAction()
if action is None:
return
shortcuts = self._actionShortcuts(action)
new_shortcuts = [QtGui.QKeySequence(self.primaryPushButton.text())]
if len(shortcuts) == 2:
new_shortcuts.append(shortcuts[1])
self.changedActions[action] = new_shortcuts
self.refreshShortcutList()
def onAlternatePushButtonClicked(self, toggled):
"""
Save the new alternate shortcut.
"""
self.customRadioButton.setChecked(True)
if toggled:
self.primaryPushButton.setChecked(False)
return
action = self._currentItemAction()
if action is None:
return
shortcuts = self._actionShortcuts(action)
new_shortcuts = []
if len(shortcuts) != 0:
new_shortcuts.append(shortcuts[0])
new_shortcuts.append(
QtGui.QKeySequence(self.alternatePushButton.text()))
self.changedActions[action] = new_shortcuts
self.refreshShortcutList()
def onItemDoubleClicked(self, item, column):
"""
A item has been double clicked. The ``primaryPushButton`` will be
checked and the item's shortcut will be displayed.
"""
action = self._currentItemAction(item)
if action is None:
return
self.primaryPushButton.setChecked(column in [0, 1])
self.alternatePushButton.setChecked(column not in [0, 1])
if column in [0, 1]:
self.primaryPushButton.setFocus(QtCore.Qt.OtherFocusReason)
else:
self.alternatePushButton.setFocus(QtCore.Qt.OtherFocusReason)
self.onCurrentItemChanged(item)
def onCurrentItemChanged(self, item=None, previousItem=None):
"""
A item has been pressed. We adjust the button's text to the action's
shortcut which is encapsulate in the item.
"""
action = self._currentItemAction(item)
self.primaryPushButton.setEnabled(action is not None)
self.alternatePushButton.setEnabled(action is not None)
primary_text = u''
alternate_text = u''
primary_label_text = u''
alternate_label_text = u''
if action is None:
self.primaryPushButton.setChecked(False)
self.alternatePushButton.setChecked(False)
else:
if len(action.defaultShortcuts) != 0:
primary_label_text = action.defaultShortcuts[0].toString()
if len(action.defaultShortcuts) == 2:
alternate_label_text = action.defaultShortcuts[1].toString()
shortcuts = self._actionShortcuts(action)
# We do not want to loose pending changes, that is why we have to
# keep the text when, this function has not been triggered by a signal.
if item is None:
primary_text = self.primaryPushButton.text()
alternate_text = self.alternatePushButton.text()
elif len(shortcuts) == 1:
primary_text = shortcuts[0].toString()
elif len(shortcuts) == 2:
primary_text = shortcuts[0].toString()
alternate_text = shortcuts[1].toString()
self.primaryPushButton.setText(primary_text)
self.alternatePushButton.setText(alternate_text)
self.primaryLabel.setText(primary_label_text)
self.alternateLabel.setText(alternate_label_text)
# We do not want to toggle and radio button, as the function has not
# been triggered by a signal.
if item is None:
return
if primary_label_text == primary_text and \
alternate_label_text == alternate_text:
self.defaultRadioButton.toggle()
else:
self.customRadioButton.toggle()
def onRestoreDefaultsClicked(self, button):
"""
Restores all default shortcuts.
"""
if self.buttonBox.buttonRole(button) != QtGui.QDialogButtonBox.ResetRole:
return
if QtGui.QMessageBox.question(self,
translate('OpenLP.ShortcutListDialog', 'Restore Default Shortcuts'),
translate('OpenLP.ShortcutListDialog', 'Do you want to restore all '
'shortcuts to their defaults?'), QtGui.QMessageBox.StandardButtons(
QtGui.QMessageBox.Yes |
QtGui.QMessageBox.No)) == QtGui.QMessageBox.No:
return
self._adjustButton(self.primaryPushButton, False, text=u'')
self._adjustButton(self.alternatePushButton, False, text=u'')
for category in self.action_list.categories:
for action in category.actions:
self.changedActions[action] = action.defaultShortcuts
self.refreshShortcutList()
def onDefaultRadioButtonClicked(self, toggled):
"""
The default radio button has been clicked, which means we have to make
sure, that we use the default shortcuts for the action.
"""
if not toggled:
return
action = self._currentItemAction()
if action is None:
return
temp_shortcuts = self._actionShortcuts(action)
self.changedActions[action] = action.defaultShortcuts
self.refreshShortcutList()
primary_button_text = u''
alternate_button_text = u''
if len(temp_shortcuts) != 0:
primary_button_text = temp_shortcuts[0].toString()
if len(temp_shortcuts) == 2:
alternate_button_text = temp_shortcuts[1].toString()
self.primaryPushButton.setText(primary_button_text)
self.alternatePushButton.setText(alternate_button_text)
def onCustomRadioButtonClicked(self, toggled):
"""
The custom shortcut radio button was clicked, thus we have to restore
the custom shortcuts by calling those functions triggered by button
clicks.
"""
if not toggled:
return
self.onPrimaryPushButtonClicked(False)
self.onAlternatePushButtonClicked(False)
self.refreshShortcutList()
def save(self):
"""
Save the shortcuts. **Note**, that we do not have to load the shortcuts,
as they are loaded in :class:`~openlp.core.utils.ActionList`.
"""
settings = QtCore.QSettings()
settings.beginGroup(u'shortcuts')
for category in self.action_list.categories:
# Check if the category is for internal use only.
if category.name is None:
continue
for action in category.actions:
if self.changedActions .has_key(action):
action.setShortcuts(self.changedActions[action])
settings.setValue(
action.objectName(), QtCore.QVariant(action.shortcuts()))
settings.endGroup()
def onClearPrimaryButtonClicked(self, toggled):
"""
Restore the defaults of this action.
"""
self.primaryPushButton.setChecked(False)
action = self._currentItemAction()
if action is None:
return
shortcuts = self._actionShortcuts(action)
new_shortcuts = []
if len(action.defaultShortcuts) != 0:
new_shortcuts.append(action.defaultShortcuts[0])
if len(shortcuts) == 2:
new_shortcuts.append(shortcuts[1])
self.changedActions[action] = new_shortcuts
self.refreshShortcutList()
self.onCurrentItemChanged(self.treeWidget.currentItem())
def onClearAlternateButtonClicked(self, toggled):
"""
Restore the defaults of this action.
"""
self.alternatePushButton.setChecked(False)
action = self._currentItemAction()
if action is None:
return
shortcuts = self._actionShortcuts(action)
new_shortcuts = []
if len(shortcuts) != 0:
new_shortcuts.append(shortcuts[0])
if len(action.defaultShortcuts) == 2:
new_shortcuts.append(action.defaultShortcuts[1])
self.changedActions[action] = new_shortcuts
self.refreshShortcutList()
self.onCurrentItemChanged(self.treeWidget.currentItem())
def _actionShortcuts(self, action):
"""
This returns the shortcuts for the given ``action``, which also includes
those shortcuts which are not saved yet but already assigned (as changes
are applied when closing the dialog).
"""
if self.changedActions.has_key(action):
return self.changedActions[action]
return action.shortcuts()
def _currentItemAction(self, item=None):
"""
Returns the action of the given ``item``. If no item is given, we return
the action of the current item of the ``treeWidget``.
"""
if item is None:
item = self.treeWidget.currentItem()
if item is None:
return
return item.data(0, QtCore.Qt.UserRole).toPyObject()
def _adjustButton(self, button, checked=None, enabled=None, text=None):
"""
Can be called to adjust more properties of the given ``button`` at once.
"""
# Set the text before checking the button, because this emits a signal.
if text is not None:
button.setText(text)
if checked is not None:
button.setChecked(checked)
if enabled is not None:
button.setEnabled(enabled)

View File

@ -32,8 +32,9 @@ from PyQt4.phonon import Phonon
from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \ from openlp.core.lib import OpenLPToolbar, Receiver, resize_image, \
ItemCapabilities, translate ItemCapabilities, translate
from openlp.core.lib.ui import icon_action, UiStrings, shortcut_action from openlp.core.lib.ui import UiStrings, shortcut_action
from openlp.core.ui import HideMode, MainDisplay from openlp.core.ui import HideMode, MainDisplay
from openlp.core.utils.actions import ActionList, CategoryOrder
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -140,12 +141,16 @@ class SlideController(QtGui.QWidget):
translate('OpenLP.SlideController', 'Previous Slide'), translate('OpenLP.SlideController', 'Previous Slide'),
u':/slides/slide_previous.png', u':/slides/slide_previous.png',
translate('OpenLP.SlideController', 'Move to previous'), translate('OpenLP.SlideController', 'Move to previous'),
self.onSlideSelectedPrevious) self.onSlideSelectedPrevious,
shortcuts=[QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp],
context=QtCore.Qt.WidgetWithChildrenShortcut)
self.nextItem = self.toolbar.addToolbarButton( self.nextItem = self.toolbar.addToolbarButton(
translate('OpenLP.SlideController', 'Next Slide'), translate('OpenLP.SlideController', 'Next Slide'),
u':/slides/slide_next.png', u':/slides/slide_next.png',
translate('OpenLP.SlideController', 'Move to next'), translate('OpenLP.SlideController', 'Move to next'),
self.onSlideSelectedNext) self.onSlideSelectedNext,
shortcuts=[QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown],
context=QtCore.Qt.WidgetWithChildrenShortcut)
self.toolbar.addToolbarSeparator(u'Close Separator') self.toolbar.addToolbarSeparator(u'Close Separator')
if self.isLive: if self.isLive:
self.hideMenu = QtGui.QToolButton(self.toolbar) self.hideMenu = QtGui.QToolButton(self.toolbar)
@ -154,16 +159,20 @@ class SlideController(QtGui.QWidget):
self.toolbar.addToolbarWidget(u'Hide Menu', self.hideMenu) self.toolbar.addToolbarWidget(u'Hide Menu', self.hideMenu)
self.hideMenu.setMenu(QtGui.QMenu( self.hideMenu.setMenu(QtGui.QMenu(
translate('OpenLP.SlideController', 'Hide'), self.toolbar)) translate('OpenLP.SlideController', 'Hide'), self.toolbar))
self.blankScreen = icon_action(self.hideMenu, u'Blank Screen', self.blankScreen = shortcut_action(self.hideMenu, u'blankScreen',
u':/slides/slide_blank.png', False) [QtCore.Qt.Key_Period], self.onBlankDisplay,
u':/slides/slide_blank.png', False, UiStrings.LiveToolbar)
self.blankScreen.setText( self.blankScreen.setText(
translate('OpenLP.SlideController', 'Blank Screen')) translate('OpenLP.SlideController', 'Blank Screen'))
self.themeScreen = icon_action(self.hideMenu, u'Blank Theme', self.themeScreen = shortcut_action(self.hideMenu, u'themeScreen',
u':/slides/slide_theme.png', False) [QtGui.QKeySequence(u'T')], self.onThemeDisplay,
u':/slides/slide_theme.png', False, UiStrings.LiveToolbar)
self.themeScreen.setText( self.themeScreen.setText(
translate('OpenLP.SlideController', 'Blank to Theme')) translate('OpenLP.SlideController', 'Blank to Theme'))
self.desktopScreen = icon_action(self.hideMenu, u'Desktop Screen', self.desktopScreen = shortcut_action(self.hideMenu,
u':/slides/slide_desktop.png', False) u'desktopScreen', [QtGui.QKeySequence(u'D')],
self.onHideDisplay, u':/slides/slide_desktop.png', False,
UiStrings.LiveToolbar)
self.desktopScreen.setText( self.desktopScreen.setText(
translate('OpenLP.SlideController', 'Show Desktop')) translate('OpenLP.SlideController', 'Show Desktop'))
self.hideMenu.setDefaultAction(self.blankScreen) self.hideMenu.setDefaultAction(self.blankScreen)
@ -291,12 +300,6 @@ class SlideController(QtGui.QWidget):
QtCore.QObject.connect(self.previewListWidget, QtCore.QObject.connect(self.previewListWidget,
QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected) QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected)
if self.isLive: if self.isLive:
QtCore.QObject.connect(self.blankScreen,
QtCore.SIGNAL(u'triggered(bool)'), self.onBlankDisplay)
QtCore.QObject.connect(self.themeScreen,
QtCore.SIGNAL(u'triggered(bool)'), self.onThemeDisplay)
QtCore.QObject.connect(self.desktopScreen,
QtCore.SIGNAL(u'triggered(bool)'), self.onHideDisplay)
QtCore.QObject.connect(self.volumeSlider, QtCore.QObject.connect(self.volumeSlider,
QtCore.SIGNAL(u'sliderReleased()'), self.mediaVolume) QtCore.SIGNAL(u'sliderReleased()'), self.mediaVolume)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
@ -362,33 +365,37 @@ class SlideController(QtGui.QWidget):
QtCore.SIGNAL(u'config_screen_changed'), self.screenSizeChanged) QtCore.SIGNAL(u'config_screen_changed'), self.screenSizeChanged)
def setPreviewHotkeys(self, parent=None): def setPreviewHotkeys(self, parent=None):
actionList = self.parent.actionList self.previousItem.setObjectName(u'previousItemPreview')
self.previousItem.setShortcuts([QtCore.Qt.Key_Up, 0]) self.nextItem.setObjectName(u'nextItemPreview')
actionList.add_action(self.previousItem, u'Preview') action_list = ActionList.get_instance()
self.nextItem.setShortcuts([QtCore.Qt.Key_Down, 0]) action_list.add_category(
actionList.add_action(self.nextItem, u'Preview') UiStrings.PreviewToolbar, CategoryOrder.standardToolbar)
action_list.add_action(self.previousItem, UiStrings.PreviewToolbar)
action_list.add_action(self.nextItem, UiStrings.PreviewToolbar)
def setLiveHotkeys(self, parent=None): def setLiveHotkeys(self, parent=None):
actionList = self.parent.actionList self.previousItem.setObjectName(u'previousItemLive')
self.previousItem.setShortcuts([QtCore.Qt.Key_Up, QtCore.Qt.Key_PageUp]) self.nextItem.setObjectName(u'nextItemLive')
self.previousItem.setShortcutContext( action_list = ActionList.get_instance()
QtCore.Qt.WidgetWithChildrenShortcut) action_list.add_category(
actionList.add_action(self.previousItem, u'Live') UiStrings.LiveToolbar, CategoryOrder.standardToolbar)
self.nextItem.setShortcuts([QtCore.Qt.Key_Down, QtCore.Qt.Key_PageDown]) action_list.add_action(self.previousItem, UiStrings.LiveToolbar)
self.nextItem.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut) action_list.add_action(self.nextItem, UiStrings.LiveToolbar)
actionList.add_action(self.nextItem, u'Live') self.previousService = shortcut_action(parent, u'previousService',
self.previousService = shortcut_action(parent, [QtCore.Qt.Key_Left], self.servicePrevious, UiStrings.LiveToolbar)
translate('OpenLP.SlideController', 'Previous Service'), self.previousService.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut)
[QtCore.Qt.Key_Left, 0], self.servicePrevious) self.previousService.setText(
actionList.add_action(self.previousService, u'Live') translate('OpenLP.SlideController', 'Previous Service'))
self.nextService = shortcut_action(parent, self.nextService = shortcut_action(parent, 'nextService',
translate('OpenLP.SlideController', 'Next Service'), [QtCore.Qt.Key_Right], self.serviceNext, UiStrings.LiveToolbar)
[QtCore.Qt.Key_Right, 0], self.serviceNext) self.nextService.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut)
actionList.add_action(self.nextService, u'Live') self.nextService.setText(
self.escapeItem = shortcut_action(parent, translate('OpenLP.SlideController', 'Next Service'))
translate('OpenLP.SlideController', 'Escape Item'), self.escapeItem = shortcut_action(parent, 'escapeItem',
[QtCore.Qt.Key_Escape, 0], self.liveEscape) [QtCore.Qt.Key_Escape], self.liveEscape, UiStrings.LiveToolbar)
actionList.add_action(self.escapeItem, u'Live') self.escapeItem.setShortcutContext(QtCore.Qt.WidgetWithChildrenShortcut)
self.escapeItem.setText(
translate('OpenLP.SlideController', 'Escape Item'))
def liveEscape(self): def liveEscape(self):
self.display.setVisible(False) self.display.setVisible(False)
@ -745,10 +752,12 @@ class SlideController(QtGui.QWidget):
""" """
self.onBlankDisplay(False) self.onBlankDisplay(False)
def onBlankDisplay(self, checked): def onBlankDisplay(self, checked=None):
""" """
Handle the blank screen button actions Handle the blank screen button actions
""" """
if checked is None:
checked = self.blankScreen.isChecked()
log.debug(u'onBlankDisplay %s' % checked) log.debug(u'onBlankDisplay %s' % checked)
self.hideMenu.setDefaultAction(self.blankScreen) self.hideMenu.setDefaultAction(self.blankScreen)
self.blankScreen.setChecked(checked) self.blankScreen.setChecked(checked)
@ -764,10 +773,12 @@ class SlideController(QtGui.QWidget):
self.blankPlugin() self.blankPlugin()
self.updatePreview() self.updatePreview()
def onThemeDisplay(self, checked): def onThemeDisplay(self, checked=None):
""" """
Handle the Theme screen button Handle the Theme screen button
""" """
if checked is None:
checked = self.themeScreen.isChecked()
log.debug(u'onThemeDisplay %s' % checked) log.debug(u'onThemeDisplay %s' % checked)
self.hideMenu.setDefaultAction(self.themeScreen) self.hideMenu.setDefaultAction(self.themeScreen)
self.blankScreen.setChecked(False) self.blankScreen.setChecked(False)
@ -783,10 +794,12 @@ class SlideController(QtGui.QWidget):
self.blankPlugin() self.blankPlugin()
self.updatePreview() self.updatePreview()
def onHideDisplay(self, checked): def onHideDisplay(self, checked=None):
""" """
Handle the Hide screen button Handle the Hide screen button
""" """
if checked is None:
checked = self.desktopScreen.isChecked()
log.debug(u'onHideDisplay %s' % checked) log.debug(u'onHideDisplay %s' % checked)
self.hideMenu.setDefaultAction(self.desktopScreen) self.hideMenu.setDefaultAction(self.desktopScreen)
self.blankScreen.setChecked(False) self.blankScreen.setChecked(False)

View File

@ -63,26 +63,19 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
QtCore.SIGNAL(u'currentIndexChanged(int)'), QtCore.SIGNAL(u'currentIndexChanged(int)'),
self.onGradientComboBoxCurrentIndexChanged) self.onGradientComboBoxCurrentIndexChanged)
QtCore.QObject.connect(self.colorButton, QtCore.QObject.connect(self.colorButton,
QtCore.SIGNAL(u'clicked()'), QtCore.SIGNAL(u'clicked()'), self.onColorButtonClicked)
self.onColorButtonClicked)
QtCore.QObject.connect(self.gradientStartButton, QtCore.QObject.connect(self.gradientStartButton,
QtCore.SIGNAL(u'clicked()'), QtCore.SIGNAL(u'clicked()'), self.onGradientStartButtonClicked)
self.onGradientStartButtonClicked)
QtCore.QObject.connect(self.gradientEndButton, QtCore.QObject.connect(self.gradientEndButton,
QtCore.SIGNAL(u'clicked()'), QtCore.SIGNAL(u'clicked()'), self.onGradientEndButtonClicked)
self.onGradientEndButtonClicked)
QtCore.QObject.connect(self.imageBrowseButton, QtCore.QObject.connect(self.imageBrowseButton,
QtCore.SIGNAL(u'clicked()'), QtCore.SIGNAL(u'clicked()'), self.onImageBrowseButtonClicked)
self.onImageBrowseButtonClicked)
QtCore.QObject.connect(self.mainColorButton, QtCore.QObject.connect(self.mainColorButton,
QtCore.SIGNAL(u'clicked()'), QtCore.SIGNAL(u'clicked()'), self.onMainColorButtonClicked)
self.onMainColorButtonClicked)
QtCore.QObject.connect(self.outlineColorButton, QtCore.QObject.connect(self.outlineColorButton,
QtCore.SIGNAL(u'clicked()'), QtCore.SIGNAL(u'clicked()'), self.onOutlineColorButtonClicked)
self.onOutlineColorButtonClicked)
QtCore.QObject.connect(self.shadowColorButton, QtCore.QObject.connect(self.shadowColorButton,
QtCore.SIGNAL(u'clicked()'), QtCore.SIGNAL(u'clicked()'), self.onShadowColorButtonClicked)
self.onShadowColorButtonClicked)
QtCore.QObject.connect(self.outlineCheckBox, QtCore.QObject.connect(self.outlineCheckBox,
QtCore.SIGNAL(u'stateChanged(int)'), QtCore.SIGNAL(u'stateChanged(int)'),
self.onOutlineCheckCheckBoxStateChanged) self.onOutlineCheckCheckBoxStateChanged)
@ -90,8 +83,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
QtCore.SIGNAL(u'stateChanged(int)'), QtCore.SIGNAL(u'stateChanged(int)'),
self.onShadowCheckCheckBoxStateChanged) self.onShadowCheckCheckBoxStateChanged)
QtCore.QObject.connect(self.footerColorButton, QtCore.QObject.connect(self.footerColorButton,
QtCore.SIGNAL(u'clicked()'), QtCore.SIGNAL(u'clicked()'), self.onFooterColorButtonClicked)
self.onFooterColorButtonClicked)
QtCore.QObject.connect(self.mainPositionCheckBox, QtCore.QObject.connect(self.mainPositionCheckBox,
QtCore.SIGNAL(u'stateChanged(int)'), QtCore.SIGNAL(u'stateChanged(int)'),
self.onMainPositionCheckBoxStateChanged) self.onMainPositionCheckBoxStateChanged)
@ -99,26 +91,23 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
QtCore.SIGNAL(u'stateChanged(int)'), QtCore.SIGNAL(u'stateChanged(int)'),
self.onFooterPositionCheckBoxStateChanged) self.onFooterPositionCheckBoxStateChanged)
QtCore.QObject.connect(self, QtCore.QObject.connect(self,
QtCore.SIGNAL(u'currentIdChanged(int)'), QtCore.SIGNAL(u'currentIdChanged(int)'), self.onCurrentIdChanged)
self.onCurrentIdChanged)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'theme_line_count'), QtCore.SIGNAL(u'theme_line_count'), self.updateLinesText)
self.updateLinesText)
QtCore.QObject.connect(self.mainSizeSpinBox, QtCore.QObject.connect(self.mainSizeSpinBox,
QtCore.SIGNAL(u'valueChanged(int)'), QtCore.SIGNAL(u'valueChanged(int)'), self.calculateLines)
self.calculateLines)
QtCore.QObject.connect(self.lineSpacingSpinBox, QtCore.QObject.connect(self.lineSpacingSpinBox,
QtCore.SIGNAL(u'valueChanged(int)'), QtCore.SIGNAL(u'valueChanged(int)'), self.calculateLines)
self.calculateLines)
QtCore.QObject.connect(self.outlineSizeSpinBox, QtCore.QObject.connect(self.outlineSizeSpinBox,
QtCore.SIGNAL(u'valueChanged(int)'), QtCore.SIGNAL(u'valueChanged(int)'), self.calculateLines)
self.calculateLines)
QtCore.QObject.connect(self.shadowSizeSpinBox, QtCore.QObject.connect(self.shadowSizeSpinBox,
QtCore.SIGNAL(u'valueChanged(int)'), QtCore.SIGNAL(u'valueChanged(int)'), self.calculateLines)
self.calculateLines)
QtCore.QObject.connect(self.mainFontComboBox, QtCore.QObject.connect(self.mainFontComboBox,
QtCore.SIGNAL(u'activated(int)'), QtCore.SIGNAL(u'activated(int)'), self.calculateLines)
self.calculateLines) QtCore.QObject.connect(self.footerFontComboBox,
QtCore.SIGNAL(u'activated(int)'), self.updateTheme)
QtCore.QObject.connect(self.footerSizeSpinBox,
QtCore.SIGNAL(u'valueChanged(int)'), self.updateTheme)
def setDefaults(self): def setDefaults(self):
""" """
@ -389,7 +378,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
Handle the display and state of the Footer Area page. Handle the display and state of the Footer Area page.
""" """
self.footerFontComboBox.setCurrentFont( self.footerFontComboBox.setCurrentFont(
QtGui.QFont(self.theme.font_main_name)) QtGui.QFont(self.theme.font_footer_name))
self.footerColorButton.setStyleSheet(u'background-color: %s' % self.footerColorButton.setStyleSheet(u'background-color: %s' %
self.theme.font_footer_color) self.theme.font_footer_color)
self.setField(u'footerSizeSpinBox', self.setField(u'footerSizeSpinBox',

View File

@ -445,6 +445,7 @@ class ThemeManager(QtGui.QWidget):
files = SettingsManager.get_files(self.settingsSection, u'.png') files = SettingsManager.get_files(self.settingsSection, u'.png')
if firstTime: if firstTime:
self.firstTime() self.firstTime()
files = SettingsManager.get_files(self.settingsSection, u'.png')
# No themes have been found so create one # No themes have been found so create one
if len(files) == 0: if len(files) == 0:
theme = ThemeXML() theme = ThemeXML()

View File

@ -28,7 +28,7 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import SettingsTab, Receiver, translate from openlp.core.lib import SettingsTab, Receiver, translate
from openlp.core.lib.theme import ThemeLevel from openlp.core.lib.theme import ThemeLevel
from openlp.core.lib.ui import UiStrings from openlp.core.lib.ui import UiStrings, find_and_set_in_combo_box
class ThemesTab(SettingsTab): class ThemesTab(SettingsTab):
""" """
@ -185,12 +185,7 @@ class ThemesTab(SettingsTab):
self.DefaultComboBox.clear() self.DefaultComboBox.clear()
for theme in theme_list: for theme in theme_list:
self.DefaultComboBox.addItem(theme) self.DefaultComboBox.addItem(theme)
id = self.DefaultComboBox.findText( find_and_set_in_combo_box(self.DefaultComboBox, self.global_theme)
self.global_theme, QtCore.Qt.MatchExactly)
if id == -1:
id = 0 # Not Found
self.global_theme = u''
self.DefaultComboBox.setCurrentIndex(id)
self.parent.renderManager.set_global_theme( self.parent.renderManager.set_global_theme(
self.global_theme, self.theme_level) self.global_theme, self.theme_level)
if self.global_theme is not u'': if self.global_theme is not u'':

View File

@ -495,7 +495,7 @@ def get_uno_instance(resolver):
from languagemanager import LanguageManager from languagemanager import LanguageManager
from actions import ActionList from actions import ActionList
__all__ = [u'AppLocation', u'check_latest_version', u'add_actions', __all__ = [u'AppLocation', u'get_application_version', u'check_latest_version',
u'get_filesystem_encoding', u'LanguageManager', u'ActionList', u'add_actions', u'get_filesystem_encoding', u'LanguageManager',
u'get_web_page', u'file_is_unicode', u'string_is_unicode', u'ActionList', u'get_web_page', u'file_is_unicode', u'string_is_unicode',
u'get_uno_command', u'get_uno_instance', u'delete_file'] u'get_uno_command', u'get_uno_instance', u'delete_file']

View File

@ -27,6 +27,8 @@
The :mod:`~openlp.core.utils.actions` module provides action list classes used The :mod:`~openlp.core.utils.actions` module provides action list classes used
by the shortcuts system. by the shortcuts system.
""" """
from PyQt4 import QtCore, QtGui
class ActionCategory(object): class ActionCategory(object):
""" """
The :class:`~openlp.core.utils.ActionCategory` class encapsulates a The :class:`~openlp.core.utils.ActionCategory` class encapsulates a
@ -67,6 +69,7 @@ class CategoryActionList(object):
Python 3 "next" method. Python 3 "next" method.
""" """
if self.index >= len(self.actions): if self.index >= len(self.actions):
self.index = 0
raise StopIteration raise StopIteration
else: else:
self.index += 1 self.index += 1
@ -94,6 +97,12 @@ class CategoryActionList(object):
self.actions.append((weight, action)) self.actions.append((weight, action))
self.actions.sort(key=lambda act: act[0]) self.actions.sort(key=lambda act: act[0])
def remove(self, remove_action):
for action in self.actions:
if action[1] == remove_action:
self.actions.remove(action)
return
class CategoryList(object): class CategoryList(object):
""" """
@ -126,6 +135,7 @@ class CategoryList(object):
Python 3 "next" method for iterator. Python 3 "next" method for iterator.
""" """
if self.index >= len(self.categories): if self.index >= len(self.categories):
self.index = 0
raise StopIteration raise StopIteration
else: else:
self.index += 1 self.index += 1
@ -163,6 +173,11 @@ class CategoryList(object):
self.categories.append(category) self.categories.append(category)
self.categories.sort(key=lambda cat: cat.weight) self.categories.sort(key=lambda cat: cat.weight)
def remove(self, name):
for category in self.categories:
if category.name == name:
self.categories.remove(category)
class ActionList(object): class ActionList(object):
""" """
@ -171,13 +186,101 @@ class ActionList(object):
has a weight by which it is sorted when iterating through the list of has a weight by which it is sorted when iterating through the list of
actions or categories. actions or categories.
""" """
instance = None
def __init__(self): def __init__(self):
self.categories = CategoryList() self.categories = CategoryList()
def add_action(self, action, category=u'Default', weight=None): @staticmethod
def get_instance():
if ActionList.instance is None:
ActionList.instance = ActionList()
return ActionList.instance
def add_action(self, action, category=None, weight=None):
"""
Add an action to the list of actions.
``action``
The action to add (QAction).
``category``
The category this action belongs to. The category can be a QString
or python unicode string. **Note**, if the category is ``None``, the
category and its actions are being hidden in the shortcut dialog.
However, if they are added, it is possible to avoid assigning
shortcuts twice, which is important.
``weight``
The weight specifies how important a category is. However, this only
has an impact on the order the categories are displayed.
"""
if category is not None:
category = unicode(category)
if category not in self.categories: if category not in self.categories:
self.categories.append(category) self.categories.append(category)
action.defaultShortcuts = action.shortcuts()
if weight is None: if weight is None:
self.categories[category].actions.append(action) self.categories[category].actions.append(action)
else: else:
self.categories[category].actions.add(action, weight) self.categories[category].actions.add(action, weight)
if category is None:
# Stop here, as this action is not configurable.
return
# Load the shortcut from the config.
settings = QtCore.QSettings()
settings.beginGroup(u'shortcuts')
shortcuts = settings.value(action.objectName(),
QtCore.QVariant(action.shortcuts())).toStringList()
action.setShortcuts(
[QtGui.QKeySequence(shortcut) for shortcut in shortcuts])
settings.endGroup()
def remove_action(self, action, category=None):
"""
This removes an action from its category. Empty categories are
automatically removed.
``action``
The QAction object to be removed.
``category``
The name (unicode string) of the category, which contains the
action. Defaults to None.
"""
if category is not None:
category = unicode(category)
if category not in self.categories:
return
self.categories[category].actions.remove(action)
# Remove empty categories.
if len(self.categories[category].actions) == 0:
self.categories.remove(category)
def add_category(self, name, weight):
"""
Add an empty category to the list of categories. This is ony convenient
for categories with a given weight.
``name``
The category's name.
``weight``
The category's weight (int).
"""
if name in self.categories:
# Only change the weight and resort the categories again.
for category in self.categories:
if category.name == name:
category.weight = weight
self.categories.categories.sort(key=lambda cat: cat.weight)
return
self.categories.add(name, weight)
class CategoryOrder(object):
"""
An enumeration class for category weights.
"""
standardMenu = -20
standardToolbar = -10

View File

@ -30,6 +30,8 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import Plugin, StringContent, build_icon, translate from openlp.core.lib import Plugin, StringContent, build_icon, translate
from openlp.core.lib.db import Manager from openlp.core.lib.db import Manager
from openlp.core.lib.ui import icon_action, UiStrings
from openlp.core.utils.actions import ActionList
from openlp.plugins.alerts.lib import AlertsManager, AlertsTab from openlp.plugins.alerts.lib import AlertsManager, AlertsTab
from openlp.plugins.alerts.lib.db import init_schema from openlp.plugins.alerts.lib.db import init_schema
from openlp.plugins.alerts.forms import AlertForm from openlp.plugins.alerts.forms import AlertForm
@ -58,9 +60,8 @@ class AlertsPlugin(Plugin):
use it as their parent. use it as their parent.
""" """
log.info(u'add tools menu') log.info(u'add tools menu')
self.toolsAlertItem = QtGui.QAction(tools_menu) self.toolsAlertItem = icon_action(tools_menu, u'toolsAlertItem',
self.toolsAlertItem.setIcon(build_icon(u':/plugins/plugin_alerts.png')) u':/plugins/plugin_alerts.png')
self.toolsAlertItem.setObjectName(u'toolsAlertItem')
self.toolsAlertItem.setText(translate('AlertsPlugin', '&Alert')) self.toolsAlertItem.setText(translate('AlertsPlugin', '&Alert'))
self.toolsAlertItem.setStatusTip( self.toolsAlertItem.setStatusTip(
translate('AlertsPlugin', 'Show an alert message.')) translate('AlertsPlugin', 'Show an alert message.'))
@ -74,6 +75,8 @@ class AlertsPlugin(Plugin):
log.info(u'Alerts Initialising') log.info(u'Alerts Initialising')
Plugin.initialise(self) Plugin.initialise(self)
self.toolsAlertItem.setVisible(True) self.toolsAlertItem.setVisible(True)
action_list = ActionList.get_instance()
action_list.add_action(self.toolsAlertItem, UiStrings.Tools)
self.liveController.alertTab = self.settings_tab self.liveController.alertTab = self.settings_tab
def finalise(self): def finalise(self):
@ -84,6 +87,8 @@ class AlertsPlugin(Plugin):
self.manager.finalise() self.manager.finalise()
Plugin.finalise(self) Plugin.finalise(self)
self.toolsAlertItem.setVisible(False) self.toolsAlertItem.setVisible(False)
action_list = ActionList.get_instance()
action_list.remove_action(self.toolsAlertItem, u'Tools')
def toggleAlertsState(self): def toggleAlertsState(self):
self.alertsActive = not self.alertsActive self.alertsActive = not self.alertsActive

View File

@ -29,6 +29,8 @@ import logging
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import Plugin, StringContent, build_icon, translate from openlp.core.lib import Plugin, StringContent, build_icon, translate
from openlp.core.lib.ui import base_action, UiStrings
from openlp.core.utils.actions import ActionList
from openlp.plugins.bibles.lib import BibleManager, BiblesTab, BibleMediaItem from openlp.plugins.bibles.lib import BibleManager, BiblesTab, BibleMediaItem
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -50,6 +52,10 @@ class BiblePlugin(Plugin):
self.manager = BibleManager(self) self.manager = BibleManager(self)
Plugin.initialise(self) Plugin.initialise(self)
self.importBibleItem.setVisible(True) self.importBibleItem.setVisible(True)
action_list = ActionList.get_instance()
action_list.add_action(self.importBibleItem, UiStrings.Import)
# Do not add the action to the list yet.
#action_list.add_action(self.exportBibleItem, UiStrings.Export)
# Set to invisible until we can export bibles # Set to invisible until we can export bibles
self.exportBibleItem.setVisible(False) self.exportBibleItem.setVisible(False)
@ -60,25 +66,25 @@ class BiblePlugin(Plugin):
log.info(u'Plugin Finalise') log.info(u'Plugin Finalise')
self.manager.finalise() self.manager.finalise()
Plugin.finalise(self) Plugin.finalise(self)
action_list = ActionList.get_instance()
action_list.remove_action(self.importBibleItem, UiStrings.Import)
self.importBibleItem.setVisible(False) self.importBibleItem.setVisible(False)
#action_list.remove_action(self.exportBibleItem, UiStrings.Export)
self.exportBibleItem.setVisible(False) self.exportBibleItem.setVisible(False)
def addImportMenuItem(self, import_menu): def addImportMenuItem(self, import_menu):
self.importBibleItem = QtGui.QAction(import_menu) self.importBibleItem = base_action(import_menu, u'importBibleItem')
self.importBibleItem.setObjectName(u'importBibleItem') self.importBibleItem.setText(translate('BiblesPlugin', '&Bible'))
import_menu.addAction(self.importBibleItem) import_menu.addAction(self.importBibleItem)
self.importBibleItem.setText(
translate('BiblesPlugin', '&Bible'))
# signals and slots # signals and slots
QtCore.QObject.connect(self.importBibleItem, QtCore.QObject.connect(self.importBibleItem,
QtCore.SIGNAL(u'triggered()'), self.onBibleImportClick) QtCore.SIGNAL(u'triggered()'), self.onBibleImportClick)
self.importBibleItem.setVisible(False) self.importBibleItem.setVisible(False)
def addExportMenuItem(self, export_menu): def addExportMenuItem(self, export_menu):
self.exportBibleItem = QtGui.QAction(export_menu) self.exportBibleItem = base_action(export_menu, u'exportBibleItem')
self.exportBibleItem.setObjectName(u'exportBibleItem')
export_menu.addAction(self.exportBibleItem)
self.exportBibleItem.setText(translate('BiblesPlugin', '&Bible')) self.exportBibleItem.setText(translate('BiblesPlugin', '&Bible'))
export_menu.addAction(self.exportBibleItem)
self.exportBibleItem.setVisible(False) self.exportBibleItem.setVisible(False)
def onBibleImportClick(self): def onBibleImportClick(self):

View File

@ -85,8 +85,18 @@ class BibleImportForm(OpenLPWizard):
""" """
OpenLPWizard.setupUi(self, image) OpenLPWizard.setupUi(self, image)
QtCore.QObject.connect(self.formatComboBox, QtCore.QObject.connect(self.formatComboBox,
QtCore.SIGNAL(u'currentIndexChanged(int)'), self.selectStack, QtCore.SIGNAL(u'currentIndexChanged(int)'),
QtCore.SLOT(u'setCurrentIndex(int)')) self.onCurrentIndexChanged)
def onCurrentIndexChanged(self, index):
"""
Called when the format combo box's index changed. We have to check if
the import is available and accordingly to disable or enable the next
button.
"""
self.selectStack.setCurrentIndex(index)
next_button = self.button(QtGui.QWizard.NextButton)
next_button.setEnabled(BibleFormat.get_availability(index))
def customInit(self): def customInit(self):
""" """

View File

@ -30,6 +30,7 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import Receiver, SettingsTab, translate from openlp.core.lib import Receiver, SettingsTab, translate
from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle
from openlp.core.lib.ui import UiStrings, find_and_set_in_combo_box
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -48,108 +49,107 @@ class BiblesTab(SettingsTab):
def setupUi(self): def setupUi(self):
self.setObjectName(u'BiblesTab') self.setObjectName(u'BiblesTab')
SettingsTab.setupUi(self) SettingsTab.setupUi(self)
self.VerseDisplayGroupBox = QtGui.QGroupBox(self.leftColumn) self.verseDisplayGroupBox = QtGui.QGroupBox(self.leftColumn)
self.VerseDisplayGroupBox.setObjectName(u'VerseDisplayGroupBox') self.verseDisplayGroupBox.setObjectName(u'verseDisplayGroupBox')
self.VerseDisplayLayout = QtGui.QFormLayout(self.VerseDisplayGroupBox) self.verseDisplayLayout = QtGui.QFormLayout(self.verseDisplayGroupBox)
self.VerseDisplayLayout.setObjectName(u'VerseDisplayLayout') self.verseDisplayLayout.setObjectName(u'verseDisplayLayout')
self.NewChaptersCheckBox = QtGui.QCheckBox(self.VerseDisplayGroupBox) self.newChaptersCheckBox = QtGui.QCheckBox(self.verseDisplayGroupBox)
self.NewChaptersCheckBox.setObjectName(u'NewChaptersCheckBox') self.newChaptersCheckBox.setObjectName(u'newChaptersCheckBox')
self.VerseDisplayLayout.addRow(self.NewChaptersCheckBox) self.verseDisplayLayout.addRow(self.newChaptersCheckBox)
self.DisplayStyleLabel = QtGui.QLabel(self.VerseDisplayGroupBox) self.displayStyleLabel = QtGui.QLabel(self.verseDisplayGroupBox)
self.DisplayStyleLabel.setObjectName(u'DisplayStyleLabel') self.displayStyleLabel.setObjectName(u'displayStyleLabel')
self.DisplayStyleComboBox = QtGui.QComboBox(self.VerseDisplayGroupBox) self.displayStyleComboBox = QtGui.QComboBox(self.verseDisplayGroupBox)
self.DisplayStyleComboBox.addItems([u'', u'', u'', u'']) self.displayStyleComboBox.addItems([u'', u'', u'', u''])
self.DisplayStyleComboBox.setObjectName(u'DisplayStyleComboBox') self.displayStyleComboBox.setObjectName(u'displayStyleComboBox')
self.VerseDisplayLayout.addRow(self.DisplayStyleLabel, self.verseDisplayLayout.addRow(self.displayStyleLabel,
self.DisplayStyleComboBox) self.displayStyleComboBox)
self.LayoutStyleLabel = QtGui.QLabel(self.VerseDisplayGroupBox) self.layoutStyleLabel = QtGui.QLabel(self.verseDisplayGroupBox)
self.LayoutStyleLabel.setObjectName(u'LayoutStyleLabel') self.layoutStyleLabel.setObjectName(u'layoutStyleLabel')
self.LayoutStyleComboBox = QtGui.QComboBox(self.VerseDisplayGroupBox) self.layoutStyleComboBox = QtGui.QComboBox(self.verseDisplayGroupBox)
self.LayoutStyleComboBox.setObjectName(u'LayoutStyleComboBox') self.layoutStyleComboBox.setObjectName(u'layoutStyleComboBox')
self.LayoutStyleComboBox.addItems([u'', u'', u'']) self.layoutStyleComboBox.addItems([u'', u'', u''])
self.VerseDisplayLayout.addRow(self.LayoutStyleLabel, self.verseDisplayLayout.addRow(self.layoutStyleLabel,
self.LayoutStyleComboBox) self.layoutStyleComboBox)
self.BibleSecondCheckBox = QtGui.QCheckBox(self.VerseDisplayGroupBox) self.bibleSecondCheckBox = QtGui.QCheckBox(self.verseDisplayGroupBox)
self.BibleSecondCheckBox.setObjectName(u'BibleSecondCheckBox') self.bibleSecondCheckBox.setObjectName(u'bibleSecondCheckBox')
self.VerseDisplayLayout.addRow(self.BibleSecondCheckBox) self.verseDisplayLayout.addRow(self.bibleSecondCheckBox)
self.BibleThemeLabel = QtGui.QLabel(self.VerseDisplayGroupBox) self.bibleThemeLabel = QtGui.QLabel(self.verseDisplayGroupBox)
self.BibleThemeLabel.setObjectName(u'BibleThemeLabel') self.bibleThemeLabel.setObjectName(u'BibleThemeLabel')
self.BibleThemeComboBox = QtGui.QComboBox(self.VerseDisplayGroupBox) self.bibleThemeComboBox = QtGui.QComboBox(self.verseDisplayGroupBox)
self.BibleThemeComboBox.setSizeAdjustPolicy( self.bibleThemeComboBox.setSizeAdjustPolicy(
QtGui.QComboBox.AdjustToMinimumContentsLength) QtGui.QComboBox.AdjustToMinimumContentsLength)
self.BibleThemeComboBox.setSizePolicy( self.bibleThemeComboBox.setSizePolicy(
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed) QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
self.BibleThemeComboBox.addItem(u'') self.bibleThemeComboBox.addItem(u'')
self.BibleThemeComboBox.setObjectName(u'BibleThemeComboBox') self.bibleThemeComboBox.setObjectName(u'BibleThemeComboBox')
self.VerseDisplayLayout.addRow(self.BibleThemeLabel, self.verseDisplayLayout.addRow(self.bibleThemeLabel,
self.BibleThemeComboBox) self.bibleThemeComboBox)
self.ChangeNoteLabel = QtGui.QLabel(self.VerseDisplayGroupBox) self.changeNoteLabel = QtGui.QLabel(self.verseDisplayGroupBox)
self.ChangeNoteLabel.setWordWrap(True) self.changeNoteLabel.setWordWrap(True)
self.ChangeNoteLabel.setObjectName(u'ChangeNoteLabel') self.changeNoteLabel.setObjectName(u'changeNoteLabel')
self.VerseDisplayLayout.addRow(self.ChangeNoteLabel) self.verseDisplayLayout.addRow(self.changeNoteLabel)
self.leftLayout.addWidget(self.VerseDisplayGroupBox) self.leftLayout.addWidget(self.verseDisplayGroupBox)
self.leftLayout.addStretch() self.leftLayout.addStretch()
self.rightColumn.setSizePolicy( self.rightColumn.setSizePolicy(
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
self.rightLayout.addStretch() self.rightLayout.addStretch()
# Signals and slots # Signals and slots
QtCore.QObject.connect( QtCore.QObject.connect(
self.NewChaptersCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.newChaptersCheckBox, QtCore.SIGNAL(u'stateChanged(int)'),
self.onNewChaptersCheckBoxChanged) self.onNewChaptersCheckBoxChanged)
QtCore.QObject.connect( QtCore.QObject.connect(
self.DisplayStyleComboBox, QtCore.SIGNAL(u'activated(int)'), self.displayStyleComboBox, QtCore.SIGNAL(u'activated(int)'),
self.onDisplayStyleComboBoxChanged) self.onDisplayStyleComboBoxChanged)
QtCore.QObject.connect( QtCore.QObject.connect(
self.BibleThemeComboBox, QtCore.SIGNAL(u'activated(int)'), self.bibleThemeComboBox, QtCore.SIGNAL(u'activated(int)'),
self.onBibleThemeComboBoxChanged) self.onBibleThemeComboBoxChanged)
QtCore.QObject.connect( QtCore.QObject.connect(
self.LayoutStyleComboBox, QtCore.SIGNAL(u'activated(int)'), self.layoutStyleComboBox, QtCore.SIGNAL(u'activated(int)'),
self.onLayoutStyleComboBoxChanged) self.onLayoutStyleComboBoxChanged)
QtCore.QObject.connect( QtCore.QObject.connect(
self.BibleSecondCheckBox, QtCore.SIGNAL(u'stateChanged(int)'), self.bibleSecondCheckBox, QtCore.SIGNAL(u'stateChanged(int)'),
self.onBibleSecondCheckBox) self.onBibleSecondCheckBox)
QtCore.QObject.connect(Receiver.get_receiver(), QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList) QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList)
def retranslateUi(self): def retranslateUi(self):
self.VerseDisplayGroupBox.setTitle( self.verseDisplayGroupBox.setTitle(
translate('BiblesPlugin.BiblesTab', 'Verse Display')) translate('BiblesPlugin.BiblesTab', 'Verse Display'))
self.NewChaptersCheckBox.setText( self.newChaptersCheckBox.setText(
translate('BiblesPlugin.BiblesTab', translate('BiblesPlugin.BiblesTab',
'Only show new chapter numbers')) 'Only show new chapter numbers'))
self.LayoutStyleLabel.setText( self.layoutStyleLabel.setText(
translate('BiblesPlugin.BiblesTab', 'Layout style:')) translate('BiblesPlugin.BiblesTab', 'Layout style:'))
self.DisplayStyleLabel.setText( self.displayStyleLabel.setText(UiStrings.DisplayStyle)
translate('BiblesPlugin.BiblesTab', 'Display style:')) self.bibleThemeLabel.setText(
self.BibleThemeLabel.setText(
translate('BiblesPlugin.BiblesTab', 'Bible theme:')) translate('BiblesPlugin.BiblesTab', 'Bible theme:'))
self.LayoutStyleComboBox.setItemText(LayoutStyle.VersePerSlide, self.layoutStyleComboBox.setItemText(LayoutStyle.VersePerSlide,
translate('BiblesPlugin.BiblesTab', 'Verse Per Slide')) UiStrings.VersePerSlide)
self.LayoutStyleComboBox.setItemText(LayoutStyle.VersePerLine, self.layoutStyleComboBox.setItemText(LayoutStyle.VersePerLine,
translate('BiblesPlugin.BiblesTab', 'Verse Per Line')) UiStrings.VersePerLine)
self.LayoutStyleComboBox.setItemText(LayoutStyle.Continuous, self.layoutStyleComboBox.setItemText(LayoutStyle.Continuous,
translate('BiblesPlugin.BiblesTab', 'Continuous')) UiStrings.Continuous)
self.DisplayStyleComboBox.setItemText(DisplayStyle.NoBrackets, self.displayStyleComboBox.setItemText(DisplayStyle.NoBrackets,
translate('BiblesPlugin.BiblesTab', 'No Brackets')) translate('BiblesPlugin.BiblesTab', 'No Brackets'))
self.DisplayStyleComboBox.setItemText(DisplayStyle.Round, self.displayStyleComboBox.setItemText(DisplayStyle.Round,
translate('BiblesPlugin.BiblesTab', '( And )')) translate('BiblesPlugin.BiblesTab', '( And )'))
self.DisplayStyleComboBox.setItemText(DisplayStyle.Curly, self.displayStyleComboBox.setItemText(DisplayStyle.Curly,
translate('BiblesPlugin.BiblesTab', '{ And }')) translate('BiblesPlugin.BiblesTab', '{ And }'))
self.DisplayStyleComboBox.setItemText(DisplayStyle.Square, self.displayStyleComboBox.setItemText(DisplayStyle.Square,
translate('BiblesPlugin.BiblesTab', '[ And ]')) translate('BiblesPlugin.BiblesTab', '[ And ]'))
self.ChangeNoteLabel.setText(translate('BiblesPlugin.BiblesTab', self.changeNoteLabel.setText(translate('BiblesPlugin.BiblesTab',
'Note:\nChanges do not affect verses already in the service.')) 'Note:\nChanges do not affect verses already in the service.'))
self.BibleSecondCheckBox.setText( self.bibleSecondCheckBox.setText(
translate('BiblesPlugin.BiblesTab', 'Display second Bible verses')) translate('BiblesPlugin.BiblesTab', 'Display second Bible verses'))
def onBibleThemeComboBoxChanged(self): def onBibleThemeComboBoxChanged(self):
self.bible_theme = self.BibleThemeComboBox.currentText() self.bible_theme = self.bibleThemeComboBox.currentText()
def onDisplayStyleComboBoxChanged(self): def onDisplayStyleComboBoxChanged(self):
self.display_style = self.DisplayStyleComboBox.currentIndex() self.display_style = self.displayStyleComboBox.currentIndex()
def onLayoutStyleComboBoxChanged(self): def onLayoutStyleComboBoxChanged(self):
self.layout_style = self.LayoutStyleComboBox.currentIndex() self.layout_style = self.layoutStyleComboBox.currentIndex()
def onNewChaptersCheckBoxChanged(self, check_state): def onNewChaptersCheckBoxChanged(self, check_state):
self.show_new_chapters = False self.show_new_chapters = False
@ -176,10 +176,10 @@ class BiblesTab(SettingsTab):
settings.value(u'bible theme', QtCore.QVariant(u'')).toString()) settings.value(u'bible theme', QtCore.QVariant(u'')).toString())
self.second_bibles = settings.value( self.second_bibles = settings.value(
u'second bibles', QtCore.QVariant(True)).toBool() u'second bibles', QtCore.QVariant(True)).toBool()
self.NewChaptersCheckBox.setChecked(self.show_new_chapters) self.newChaptersCheckBox.setChecked(self.show_new_chapters)
self.DisplayStyleComboBox.setCurrentIndex(self.display_style) self.displayStyleComboBox.setCurrentIndex(self.display_style)
self.LayoutStyleComboBox.setCurrentIndex(self.layout_style) self.layoutStyleComboBox.setCurrentIndex(self.layout_style)
self.BibleSecondCheckBox.setChecked(self.second_bibles) self.bibleSecondCheckBox.setChecked(self.second_bibles)
settings.endGroup() settings.endGroup()
def save(self): def save(self):
@ -204,14 +204,8 @@ class BiblesTab(SettingsTab):
[u'Bible Theme', u'Song Theme'] [u'Bible Theme', u'Song Theme']
""" """
self.BibleThemeComboBox.clear() self.bibleThemeComboBox.clear()
self.BibleThemeComboBox.addItem(u'') self.bibleThemeComboBox.addItem(u'')
for theme in theme_list: for theme in theme_list:
self.BibleThemeComboBox.addItem(theme) self.bibleThemeComboBox.addItem(theme)
index = self.BibleThemeComboBox.findText( find_and_set_in_combo_box(self.bibleThemeComboBox, self.bible_theme)
unicode(self.bible_theme), QtCore.Qt.MatchExactly)
if index == -1:
# Not Found.
index = 0
self.bible_theme = u''
self.BibleThemeComboBox.setCurrentIndex(index)

View File

@ -32,7 +32,7 @@ from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \
translate translate
from openlp.core.lib.searchedit import SearchEdit from openlp.core.lib.searchedit import SearchEdit
from openlp.core.lib.ui import UiStrings, add_widget_completer, \ from openlp.core.lib.ui import UiStrings, add_widget_completer, \
media_item_combo_box, critical_error_message_box media_item_combo_box, critical_error_message_box, find_and_set_in_combo_box
from openlp.plugins.bibles.forms import BibleImportForm from openlp.plugins.bibles.forms import BibleImportForm
from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \ from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \
VerseReferenceList, get_reference_match VerseReferenceList, get_reference_match
@ -107,6 +107,12 @@ class BibleMediaItem(MediaManagerItem):
translate('BiblesPlugin.MediaItem', 'Text Search')) translate('BiblesPlugin.MediaItem', 'Text Search'))
]) ])
self.quickLayout.addRow(self.quickSearchLabel, self.quickSearchEdit) self.quickLayout.addRow(self.quickSearchLabel, self.quickSearchEdit)
self.quickLayoutLabel = QtGui.QLabel(self.quickTab)
self.quickLayoutLabel.setObjectName(u'quickClearLabel')
self.quickLayoutComboBox = media_item_combo_box(self.quickTab,
u'quickLayoutComboBox')
self.quickLayoutComboBox.addItems([u'', u'', u''])
self.quickLayout.addRow(self.quickLayoutLabel, self.quickLayoutComboBox)
self.quickClearLabel = QtGui.QLabel(self.quickTab) self.quickClearLabel = QtGui.QLabel(self.quickTab)
self.quickClearLabel.setObjectName(u'quickClearLabel') self.quickClearLabel.setObjectName(u'quickClearLabel')
self.quickClearComboBox = media_item_combo_box(self.quickTab, self.quickClearComboBox = media_item_combo_box(self.quickTab,
@ -211,6 +217,9 @@ class BibleMediaItem(MediaManagerItem):
QtCore.SIGNAL(u'searchTypeChanged(int)'), self.updateAutoCompleter) QtCore.SIGNAL(u'searchTypeChanged(int)'), self.updateAutoCompleter)
QtCore.QObject.connect(self.quickVersionComboBox, QtCore.QObject.connect(self.quickVersionComboBox,
QtCore.SIGNAL(u'activated(int)'), self.updateAutoCompleter) QtCore.SIGNAL(u'activated(int)'), self.updateAutoCompleter)
QtCore.QObject.connect(
self.quickLayoutComboBox, QtCore.SIGNAL(u'activated(int)'),
self.onlayoutStyleComboBoxChanged)
# Buttons # Buttons
QtCore.QObject.connect(self.advancedSearchButton, QtCore.QObject.connect(self.advancedSearchButton,
QtCore.SIGNAL(u'pressed()'), self.onAdvancedSearchButton) QtCore.SIGNAL(u'pressed()'), self.onAdvancedSearchButton)
@ -235,6 +244,7 @@ class BibleMediaItem(MediaManagerItem):
self.advancedSecondComboBox.setVisible(False) self.advancedSecondComboBox.setVisible(False)
self.quickSecondLabel.setVisible(False) self.quickSecondLabel.setVisible(False)
self.quickSecondComboBox.setVisible(False) self.quickSecondComboBox.setVisible(False)
self.quickLayoutComboBox.setCurrentIndex(self.settings.layout_style)
def retranslateUi(self): def retranslateUi(self):
log.debug(u'retranslateUi') log.debug(u'retranslateUi')
@ -270,11 +280,22 @@ class BibleMediaItem(MediaManagerItem):
translate('BiblesPlugin.MediaItem', 'Clear')) translate('BiblesPlugin.MediaItem', 'Clear'))
self.advancedClearComboBox.addItem( self.advancedClearComboBox.addItem(
translate('BiblesPlugin.MediaItem', 'Keep')) translate('BiblesPlugin.MediaItem', 'Keep'))
self.quickLayoutLabel.setText(UiStrings.DisplayStyle)
self.quickLayoutComboBox.setItemText(LayoutStyle.VersePerSlide,
UiStrings.VersePerSlide)
self.quickLayoutComboBox.setItemText(LayoutStyle.VersePerLine,
UiStrings.VersePerLine)
self.quickLayoutComboBox.setItemText(LayoutStyle.Continuous,
UiStrings.Continuous)
def initialise(self): def initialise(self):
log.debug(u'bible manager initialise') log.debug(u'bible manager initialise')
self.parent.manager.media = self self.parent.manager.media = self
self.loadBibles() self.loadBibles()
bible = QtCore.QSettings().value(
self.settingsSection + u'/quick bible', QtCore.QVariant(
self.quickVersionComboBox.currentText())).toString()
find_and_set_in_combo_box(self.quickVersionComboBox, bible)
self.updateAutoCompleter() self.updateAutoCompleter()
self.configUpdated() self.configUpdated()
log.debug(u'bible manager initialise complete') log.debug(u'bible manager initialise complete')
@ -299,23 +320,28 @@ class BibleMediaItem(MediaManagerItem):
bibles = self.parent.manager.get_bibles().keys() bibles = self.parent.manager.get_bibles().keys()
bibles.sort() bibles.sort()
# Load the bibles into the combo boxes. # Load the bibles into the combo boxes.
first = True
for bible in bibles: for bible in bibles:
if bible: if bible:
self.quickVersionComboBox.addItem(bible) self.quickVersionComboBox.addItem(bible)
self.quickSecondComboBox.addItem(bible) self.quickSecondComboBox.addItem(bible)
self.advancedVersionComboBox.addItem(bible) self.advancedVersionComboBox.addItem(bible)
self.advancedSecondComboBox.addItem(bible) self.advancedSecondComboBox.addItem(bible)
if first: # set the default value
first = False bible = QtCore.QSettings().value(
self.initialiseBible(bible) self.settingsSection + u'/advanced bible',
QtCore.QVariant(u'')).toString()
if bible in bibles:
find_and_set_in_combo_box(self.advancedVersionComboBox, bible)
self.initialiseAdvancedBible(unicode(bible))
elif len(bibles):
self.initialiseAdvancedBible(bibles[0])
def reloadBibles(self): def reloadBibles(self):
log.debug(u'Reloading Bibles') log.debug(u'Reloading Bibles')
self.parent.manager.reload_bibles() self.parent.manager.reload_bibles()
self.loadBibles() self.loadBibles()
def initialiseBible(self, bible): def initialiseAdvancedBible(self, bible):
""" """
This initialises the given bible, which means that its book names and This initialises the given bible, which means that its book names and
their chapter numbers is added to the combo boxes on the their chapter numbers is added to the combo boxes on the
@ -325,7 +351,7 @@ class BibleMediaItem(MediaManagerItem):
``bible`` ``bible``
The bible to initialise (unicode). The bible to initialise (unicode).
""" """
log.debug(u'initialiseBible %s', bible) log.debug(u'initialiseAdvancedBible %s', bible)
book_data = self.parent.manager.get_books(bible) book_data = self.parent.manager.get_books(bible)
self.advancedBookComboBox.clear() self.advancedBookComboBox.clear()
first = True first = True
@ -361,6 +387,8 @@ class BibleMediaItem(MediaManagerItem):
completion depends on the bible. It is only updated when we are doing a completion depends on the bible. It is only updated when we are doing a
reference search, otherwise the auto completion list is removed. reference search, otherwise the auto completion list is removed.
""" """
QtCore.QSettings().setValue(self.settingsSection + u'/quick bible',
QtCore.QVariant(self.quickVersionComboBox.currentText()))
books = [] books = []
# We have to do a 'Reference Search'. # We have to do a 'Reference Search'.
if self.quickSearchEdit.currentSearchType() == BibleSearch.Reference: if self.quickSearchEdit.currentSearchType() == BibleSearch.Reference:
@ -368,12 +396,14 @@ class BibleMediaItem(MediaManagerItem):
bible = unicode(self.quickVersionComboBox.currentText()) bible = unicode(self.quickVersionComboBox.currentText())
if bible: if bible:
book_data = bibles[bible].get_books() book_data = bibles[bible].get_books()
books = [book.name for book in book_data] books = [book.name + u' ' for book in book_data]
books.sort() books.sort()
add_widget_completer(books, self.quickSearchEdit) add_widget_completer(books, self.quickSearchEdit)
def onAdvancedVersionComboBox(self): def onAdvancedVersionComboBox(self):
self.initialiseBible( QtCore.QSettings().setValue(self.settingsSection + u'/advanced bible',
QtCore.QVariant(self.advancedVersionComboBox.currentText()))
self.initialiseAdvancedBible(
unicode(self.advancedVersionComboBox.currentText())) unicode(self.advancedVersionComboBox.currentText()))
def onAdvancedBookComboBox(self): def onAdvancedBookComboBox(self):
@ -805,3 +835,11 @@ class BibleMediaItem(MediaManagerItem):
if self.settings.display_style == DisplayStyle.Square: if self.settings.display_style == DisplayStyle.Square:
return u'{su}[%s]{/su}' % verse_text return u'{su}[%s]{/su}' % verse_text
return u'{su}%s{/su}' % verse_text return u'{su}%s{/su}' % verse_text
def onlayoutStyleComboBoxChanged(self):
self.settings.layout_style = self.quickLayoutComboBox.currentIndex()
self.settings.layoutStyleComboBox.setCurrentIndex(
self.settings.layout_style)
QtCore.QSettings().setValue(
self.settingsSection + u'/verse layout style',
QtCore.QVariant(self.settings.layout_style))

View File

@ -96,4 +96,7 @@ class VerseReferenceList(object):
version[u'copyright']) version[u'copyright'])
if version[u'permission'].strip(): if version[u'permission'].strip():
result = result + u', ' + version[u'permission'] result = result + u', ' + version[u'permission']
result = result.rstrip()
if result.endswith(u','):
return result[:len(result)-1]
return result return result

View File

@ -29,7 +29,7 @@ import logging
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import Receiver, translate from openlp.core.lib import Receiver, translate
from openlp.core.lib.ui import critical_error_message_box from openlp.core.lib.ui import critical_error_message_box, find_and_set_in_combo_box
from openlp.plugins.custom.lib import CustomXMLBuilder, CustomXMLParser from openlp.plugins.custom.lib import CustomXMLBuilder, CustomXMLParser
from openlp.plugins.custom.lib.db import CustomSlide from openlp.plugins.custom.lib.db import CustomSlide
from editcustomdialog import Ui_CustomEditDialog from editcustomdialog import Ui_CustomEditDialog
@ -98,11 +98,7 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog):
for slide in slideList: for slide in slideList:
self.slideListView.addItem(slide[1]) self.slideListView.addItem(slide[1])
theme = self.customSlide.theme_name theme = self.customSlide.theme_name
id = self.themeComboBox.findText(theme, QtCore.Qt.MatchExactly) find_and_set_in_combo_box(self.themeComboBox, theme)
# No theme match
if id == -1:
id = 0
self.themeComboBox.setCurrentIndex(id)
# If not preview hide the preview button. # If not preview hide the preview button.
self.previewButton.setVisible(False) self.previewButton.setVisible(False)
if preview: if preview:

View File

@ -105,7 +105,7 @@ class PresentationDocument(object):
Loads the presentation and starts it Loads the presentation and starts it
``presentation`` ``presentation``
The file name of the presentations to the run. The file name of the presentations to the run.
Returns False if the file could not be opened Returns False if the file could not be opened
""" """

View File

@ -31,7 +31,7 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import Receiver, translate from openlp.core.lib import Receiver, translate
from openlp.core.lib.ui import UiStrings, add_widget_completer, \ from openlp.core.lib.ui import UiStrings, add_widget_completer, \
critical_error_message_box critical_error_message_box, find_and_set_in_combo_box
from openlp.plugins.songs.forms import EditVerseForm from openlp.plugins.songs.forms import EditVerseForm
from openlp.plugins.songs.lib import SongXML, VerseType, clean_song from openlp.plugins.songs.lib import SongXML, VerseType, clean_song
from openlp.plugins.songs.lib.db import Book, Song, Author, Topic from openlp.plugins.songs.lib.db import Book, Song, Author, Topic
@ -208,20 +208,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
self.alternativeEdit.setText(u'') self.alternativeEdit.setText(u'')
if self.song.song_book_id != 0: if self.song.song_book_id != 0:
book_name = self.manager.get_object(Book, self.song.song_book_id) book_name = self.manager.get_object(Book, self.song.song_book_id)
id = self.songBookComboBox.findText( find_and_set_in_combo_box(self.songBookComboBox, unicode(book_name.name))
unicode(book_name.name), QtCore.Qt.MatchExactly)
if id == -1:
# Not Found
id = 0
self.songBookComboBox.setCurrentIndex(id)
if self.song.theme_name: if self.song.theme_name:
id = self.themeComboBox.findText( find_and_set_in_combo_box(self.themeComboBox, unicode(self.song.theme_name))
unicode(self.song.theme_name), QtCore.Qt.MatchExactly)
if id == -1:
# Not Found
id = 0
self.song.theme_name = None
self.themeComboBox.setCurrentIndex(id)
if self.song.copyright: if self.song.copyright:
self.copyrightEdit.setText(self.song.copyright) self.copyrightEdit.setText(self.song.copyright)
else: else:

View File

@ -66,7 +66,17 @@ class SongImportForm(OpenLPWizard):
self.formatStack.setCurrentIndex(0) self.formatStack.setCurrentIndex(0)
QtCore.QObject.connect(self.formatComboBox, QtCore.QObject.connect(self.formatComboBox,
QtCore.SIGNAL(u'currentIndexChanged(int)'), QtCore.SIGNAL(u'currentIndexChanged(int)'),
self.formatStack.setCurrentIndex) self.onCurrentIndexChanged)
def onCurrentIndexChanged(self, index):
"""
Called when the format combo box's index changed. We have to check if
the import is available and accordingly to disable or enable the next
button.
"""
self.formatStack.setCurrentIndex(index)
next_button = self.button(QtGui.QWizard.NextButton)
next_button.setEnabled(SongFormat.get_availability(index))
def customInit(self): def customInit(self):
""" """

View File

@ -283,19 +283,20 @@ class SongMediaItem(MediaManagerItem):
self.remoteTriggered = None self.remoteTriggered = None
self.remoteSong = -1 self.remoteSong = -1
def onRemoteEdit(self, songid): def onRemoteEdit(self, message):
""" """
Called by ServiceManager or SlideController by event passing Called by ServiceManager or SlideController by event passing
the Song Id in the payload along with an indicator to say which the Song Id in the payload along with an indicator to say which
type of display is required. type of display is required.
""" """
log.debug(u'onRemoteEdit %s' % songid) log.debug(u'onRemoteEdit %s' % message)
fields = songid.split(u':') remote_type, song_id = message.split(u':')
valid = self.parent.manager.get_object(Song, fields[1]) song_id = int(song_id)
valid = self.parent.manager.get_object(Song, song_id)
if valid: if valid:
self.remoteSong = fields[1] self.remoteSong = song_id
self.remoteTriggered = fields[0] self.remoteTriggered = remote_type
self.edit_song_form.loadSong(fields[1], (fields[0] == u'P')) self.edit_song_form.loadSong(song_id, (remote_type == u'P'))
self.edit_song_form.exec_() self.edit_song_form.exec_()
def onEditClick(self): def onEditClick(self):

View File

@ -39,12 +39,8 @@ if os.name == u'nt':
PAGE_AFTER = 5 PAGE_AFTER = 5
PAGE_BOTH = 6 PAGE_BOTH = 6
else: else:
try: import uno
import uno from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER, PAGE_BOTH
from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER, \
PAGE_BOTH
except ImportError:
pass
class OooImport(SongImport): class OooImport(SongImport):
""" """

View File

@ -73,6 +73,8 @@ class OpenLyricsExport(object):
u', '.join([author.display_name for author in song.authors])) u', '.join([author.display_name for author in song.authors]))
filename = re.sub( filename = re.sub(
r'[/\\?*|<>\[\]":<>+%]+', u'_', filename).strip(u'_') r'[/\\?*|<>\[\]":<>+%]+', u'_', filename).strip(u'_')
tree.write(os.path.join(self.save_path, filename), # Pass a file object, because lxml does not cope with some special
# characters in the path (see lp:757673 and lp:744337).
tree.write(open(os.path.join(self.save_path, filename), u'w'),
encoding=u'utf-8', xml_declaration=True, pretty_print=True) encoding=u'utf-8', xml_declaration=True, pretty_print=True)
return True return True

View File

@ -63,7 +63,9 @@ class OpenLyricsImport(SongImport):
self.import_wizard.incrementProgressBar( self.import_wizard.incrementProgressBar(
WizardStrings.ImportingType % os.path.basename(file_path)) WizardStrings.ImportingType % os.path.basename(file_path))
try: try:
parsed_file = etree.parse(file_path, parser) # Pass a file object, because lxml does not cope with some
# special characters in the path (see lp:757673 and lp:744337).
parsed_file = etree.parse(open(file_path, u'r'), parser)
xml = unicode(etree.tostring(parsed_file)) xml = unicode(etree.tostring(parsed_file))
if self.openLyrics.xml_to_song(xml) is None: if self.openLyrics.xml_to_song(xml) is None:
log.debug(u'File could not be imported: %s' % file_path) log.debug(u'File could not be imported: %s' % file_path)

View File

@ -33,7 +33,8 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import Plugin, StringContent, build_icon, translate, \ from openlp.core.lib import Plugin, StringContent, build_icon, translate, \
Receiver Receiver
from openlp.core.lib.db import Manager from openlp.core.lib.db import Manager
from openlp.core.lib.ui import UiStrings from openlp.core.lib.ui import UiStrings, base_action, icon_action
from openlp.core.utils.actions import ActionList
from openlp.plugins.songs.lib import clean_song, SongMediaItem, SongsTab from openlp.plugins.songs.lib import clean_song, SongMediaItem, SongsTab
from openlp.plugins.songs.lib.db import init_schema, Song from openlp.plugins.songs.lib.db import init_schema, Song
from openlp.plugins.songs.lib.importer import SongFormat from openlp.plugins.songs.lib.importer import SongFormat
@ -65,6 +66,10 @@ class SongsPlugin(Plugin):
log.info(u'Songs Initialising') log.info(u'Songs Initialising')
Plugin.initialise(self) Plugin.initialise(self)
self.toolsReindexItem.setVisible(True) self.toolsReindexItem.setVisible(True)
action_list = ActionList.get_instance()
action_list.add_action(self.SongImportItem, UiStrings.Import)
action_list.add_action(self.SongExportItem, UiStrings.Export)
action_list.add_action(self.toolsReindexItem, UiStrings.Tools)
self.mediaItem.displayResultsSong( self.mediaItem.displayResultsSong(
self.manager.get_all_objects(Song, order_by_ref=Song.search_title)) self.manager.get_all_objects(Song, order_by_ref=Song.search_title))
@ -78,10 +83,8 @@ class SongsPlugin(Plugin):
use it as their parent. use it as their parent.
""" """
# Main song import menu item - will eventually be the only one # Main song import menu item - will eventually be the only one
self.SongImportItem = QtGui.QAction(import_menu) self.SongImportItem = base_action(import_menu, u'SongImportItem')
self.SongImportItem.setObjectName(u'SongImportItem') self.SongImportItem.setText(translate('SongsPlugin', '&Song'))
self.SongImportItem.setText(translate(
'SongsPlugin', '&Song'))
self.SongImportItem.setToolTip(translate('SongsPlugin', self.SongImportItem.setToolTip(translate('SongsPlugin',
'Import songs using the import wizard.')) 'Import songs using the import wizard.'))
import_menu.addAction(self.SongImportItem) import_menu.addAction(self.SongImportItem)
@ -99,10 +102,8 @@ class SongsPlugin(Plugin):
use it as their parent. use it as their parent.
""" """
# Main song import menu item - will eventually be the only one # Main song import menu item - will eventually be the only one
self.SongExportItem = QtGui.QAction(export_menu) self.SongExportItem = base_action(export_menu, u'SongExportItem')
self.SongExportItem.setObjectName(u'SongExportItem') self.SongExportItem.setText(translate('SongsPlugin', '&Song'))
self.SongExportItem.setText(translate(
'SongsPlugin', '&Song'))
self.SongExportItem.setToolTip(translate('SongsPlugin', self.SongExportItem.setToolTip(translate('SongsPlugin',
'Exports songs using the export wizard.')) 'Exports songs using the export wizard.'))
export_menu.addAction(self.SongExportItem) export_menu.addAction(self.SongExportItem)
@ -120,9 +121,8 @@ class SongsPlugin(Plugin):
use it as their parent. use it as their parent.
""" """
log.info(u'add tools menu') log.info(u'add tools menu')
self.toolsReindexItem = QtGui.QAction(tools_menu) self.toolsReindexItem = icon_action(tools_menu, u'toolsReindexItem',
self.toolsReindexItem.setIcon(build_icon(u':/plugins/plugin_songs.png')) u':/plugins/plugin_songs.png')
self.toolsReindexItem.setObjectName(u'toolsReindexItem')
self.toolsReindexItem.setText( self.toolsReindexItem.setText(
translate('SongsPlugin', '&Re-index Songs')) translate('SongsPlugin', '&Re-index Songs'))
self.toolsReindexItem.setStatusTip( self.toolsReindexItem.setStatusTip(
@ -259,4 +259,8 @@ class SongsPlugin(Plugin):
log.info(u'Songs Finalising') log.info(u'Songs Finalising')
self.manager.finalise() self.manager.finalise()
self.toolsReindexItem.setVisible(False) self.toolsReindexItem.setVisible(False)
action_list = ActionList.get_instance()
action_list.remove_action(self.SongImportItem, UiStrings.Import)
action_list.remove_action(self.SongExportItem, UiStrings.Export)
action_list.remove_action(self.toolsReindexItem, UiStrings.Tools)
Plugin.finalise(self) Plugin.finalise(self)

View File

@ -32,6 +32,8 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import Plugin, StringContent, Receiver, build_icon, \ from openlp.core.lib import Plugin, StringContent, Receiver, build_icon, \
translate translate
from openlp.core.lib.db import Manager from openlp.core.lib.db import Manager
from openlp.core.lib.ui import base_action, shortcut_action, UiStrings
from openlp.core.utils.actions import ActionList
from openlp.plugins.songusage.forms import SongUsageDetailForm, \ from openlp.plugins.songusage.forms import SongUsageDetailForm, \
SongUsageDeleteForm SongUsageDeleteForm
from openlp.plugins.songusage.lib.db import init_schema, SongUsageItem from openlp.plugins.songusage.lib.db import init_schema, SongUsageItem
@ -63,30 +65,25 @@ class SongUsagePlugin(Plugin):
self.SongUsageMenu.setObjectName(u'SongUsageMenu') self.SongUsageMenu.setObjectName(u'SongUsageMenu')
self.SongUsageMenu.setTitle(translate( self.SongUsageMenu.setTitle(translate(
'SongUsagePlugin', '&Song Usage Tracking')) 'SongUsagePlugin', '&Song Usage Tracking'))
#SongUsage Delete # SongUsage Delete
self.SongUsageDelete = QtGui.QAction(tools_menu) self.SongUsageDelete = base_action(tools_menu, u'SongUsageDelete')
self.SongUsageDelete.setText(translate('SongUsagePlugin', self.SongUsageDelete.setText(translate('SongUsagePlugin',
'&Delete Tracking Data')) '&Delete Tracking Data'))
self.SongUsageDelete.setStatusTip(translate('SongUsagePlugin', self.SongUsageDelete.setStatusTip(translate('SongUsagePlugin',
'Delete song usage data up to a specified date.')) 'Delete song usage data up to a specified date.'))
self.SongUsageDelete.setObjectName(u'SongUsageDelete') # SongUsage Report
#SongUsage Report self.SongUsageReport = base_action(tools_menu, u'SongUsageReport')
self.SongUsageReport = QtGui.QAction(tools_menu)
self.SongUsageReport.setText( self.SongUsageReport.setText(
translate('SongUsagePlugin', '&Extract Tracking Data')) translate('SongUsagePlugin', '&Extract Tracking Data'))
self.SongUsageReport.setStatusTip( self.SongUsageReport.setStatusTip(
translate('SongUsagePlugin', 'Generate a report on song usage.')) translate('SongUsagePlugin', 'Generate a report on song usage.'))
self.SongUsageReport.setObjectName(u'SongUsageReport') # SongUsage activation
#SongUsage activation self.SongUsageStatus = shortcut_action(tools_menu, u'SongUsageStatus',
self.SongUsageStatus = QtGui.QAction(tools_menu) [QtCore.Qt.Key_F4], self.toggleSongUsageState, checked=False)
self.SongUsageStatus.setCheckable(True)
self.SongUsageStatus.setChecked(False)
self.SongUsageStatus.setText(translate( self.SongUsageStatus.setText(translate(
'SongUsagePlugin', 'Toggle Tracking')) 'SongUsagePlugin', 'Toggle Tracking'))
self.SongUsageStatus.setStatusTip(translate('SongUsagePlugin', self.SongUsageStatus.setStatusTip(translate('SongUsagePlugin',
'Toggle the tracking of song usage.')) 'Toggle the tracking of song usage.'))
self.SongUsageStatus.setShortcut(u'F4')
self.SongUsageStatus.setObjectName(u'SongUsageStatus')
#Add Menus together #Add Menus together
self.toolsMenu.addAction(self.SongUsageMenu.menuAction()) self.toolsMenu.addAction(self.SongUsageMenu.menuAction())
self.SongUsageMenu.addAction(self.SongUsageStatus) self.SongUsageMenu.addAction(self.SongUsageStatus)
@ -97,9 +94,6 @@ class SongUsagePlugin(Plugin):
QtCore.QObject.connect(self.SongUsageStatus, QtCore.QObject.connect(self.SongUsageStatus,
QtCore.SIGNAL(u'visibilityChanged(bool)'), QtCore.SIGNAL(u'visibilityChanged(bool)'),
self.SongUsageStatus.setChecked) self.SongUsageStatus.setChecked)
QtCore.QObject.connect(self.SongUsageStatus,
QtCore.SIGNAL(u'triggered(bool)'),
self.toggleSongUsageState)
QtCore.QObject.connect(self.SongUsageDelete, QtCore.QObject.connect(self.SongUsageDelete,
QtCore.SIGNAL(u'triggered()'), self.onSongUsageDelete) QtCore.SIGNAL(u'triggered()'), self.onSongUsageDelete)
QtCore.QObject.connect(self.SongUsageReport, QtCore.QObject.connect(self.SongUsageReport,
@ -116,6 +110,13 @@ class SongUsagePlugin(Plugin):
self.settingsSection + u'/active', self.settingsSection + u'/active',
QtCore.QVariant(False)).toBool() QtCore.QVariant(False)).toBool()
self.SongUsageStatus.setChecked(self.SongUsageActive) self.SongUsageStatus.setChecked(self.SongUsageActive)
action_list = ActionList.get_instance()
action_list.add_action(self.SongUsageDelete,
translate('SongUsagePlugin', 'Song Usage'))
action_list.add_action(self.SongUsageReport,
translate('SongUsagePlugin', 'Song Usage'))
action_list.add_action(self.SongUsageStatus,
translate('SongUsagePlugin', 'Song Usage'))
if self.manager is None: if self.manager is None:
self.manager = Manager(u'songusage', init_schema) self.manager = Manager(u'songusage', init_schema)
self.SongUsagedeleteform = SongUsageDeleteForm(self.manager, self.SongUsagedeleteform = SongUsageDeleteForm(self.manager,
@ -131,6 +132,13 @@ class SongUsagePlugin(Plugin):
self.manager.finalise() self.manager.finalise()
Plugin.finalise(self) Plugin.finalise(self)
self.SongUsageMenu.menuAction().setVisible(False) self.SongUsageMenu.menuAction().setVisible(False)
action_list = ActionList.get_instance()
action_list.remove_action(self.SongUsageDelete,
translate('SongUsagePlugin', 'Song Usage'))
action_list.remove_action(self.SongUsageReport,
translate('SongUsagePlugin', 'Song Usage'))
action_list.remove_action(self.SongUsageStatus,
translate('SongUsagePlugin', 'Song Usage'))
#stop any events being processed #stop any events being processed
self.SongUsageActive = False self.SongUsageActive = False

View File

@ -41,35 +41,35 @@
</widget> </widget>
</item> </item>
<item> <item>
<layout class="QVBoxLayout" name="shortcutLayout"> <layout class="QGridLayout" name="detailsLayout">
<property name="topMargin">
<number>0</number>
</property>
<property name="spacing"> <property name="spacing">
<number>8</number> <number>8</number>
</property> </property>
<property name="leftMargin"> <item row="0" column="0">
<number>0</number>
</property>
<item>
<widget class="QRadioButton" name="defaultRadioButton"> <widget class="QRadioButton" name="defaultRadioButton">
<property name="text"> <property name="text">
<string>Default: None</string> <string>Default:</string>
</property> </property>
<property name="checked"> <property name="checked">
<bool>true</bool> <bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
<item> <item row="1" column="0">
<layout class="QHBoxLayout" name="customShortcutLayout"> <widget class="QRadioButton" name="customRadioButton">
<property name="text">
<string>Custom:</string>
</property>
</widget>
</item>
<item row="1" column="1">
<layout class="QHBoxLayout" name="shortcutLayout">
<property name="spacing"> <property name="spacing">
<number>8</number> <number>8</number>
</property> </property>
<item>
<widget class="QRadioButton" name="customRadioButton">
<property name="text">
<string>Custom:</string>
</property>
</widget>
</item>
<item> <item>
<widget class="QPushButton" name="shortcutPushButton"> <widget class="QPushButton" name="shortcutPushButton">
<property name="minimumSize"> <property name="minimumSize">
@ -83,7 +83,7 @@
</property> </property>
<property name="icon"> <property name="icon">
<iconset resource="../images/openlp-2.qrc"> <iconset resource="../images/openlp-2.qrc">
<normaloff>:/system/system_settings.png</normaloff>:/system/system_settings.png</iconset> <normaloff>:/system/system_configure_shortcuts.png</normaloff>:/system/system_configure_shortcuts.png</iconset>
</property> </property>
<property name="checkable"> <property name="checkable">
<bool>true</bool> <bool>true</bool>
@ -110,21 +110,51 @@
</property> </property>
</widget> </widget>
</item> </item>
</layout>
</item>
<item row="1" column="2">
<layout class="QHBoxLayout" name="alternateLayout">
<property name="spacing">
<number>8</number>
</property>
<item> <item>
<spacer name="customShortcutSpacer"> <widget class="QPushButton" name="alternatePushButton">
<property name="orientation"> <property name="text">
<enum>Qt::Horizontal</enum> <string>None</string>
</property> </property>
<property name="sizeHint" stdset="0"> <property name="icon">
<size> <iconset resource="../images/openlp-2.qrc">
<width>40</width> <normaloff>:/system/system_configure_shortcuts.png</normaloff>:/system/system_configure_shortcuts.png</iconset>
<height>20</height>
</size>
</property> </property>
</spacer> </widget>
</item>
<item>
<widget class="QToolButton" name="clearAlternateButton">
<property name="text">
<string/>
</property>
<property name="icon">
<iconset resource="../images/openlp-2.qrc">
<normaloff>:/system/clear_shortcut.png</normaloff>:/system/clear_shortcut.png</iconset>
</property>
</widget>
</item> </item>
</layout> </layout>
</item> </item>
<item row="0" column="1">
<widget class="QLabel" name="shortcutLabel">
<property name="text">
<string>Ctrl+V</string>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="alternateLabel">
<property name="text">
<string>Shift+Ins</string>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>