Head + merge issues

This commit is contained in:
Tim Bentley 2013-02-21 21:33:06 +00:00
commit 0a1ebfbdb9
23 changed files with 501 additions and 389 deletions

View File

@ -35,6 +35,7 @@ import logging
import imp import imp
from openlp.core.lib import Plugin, PluginStatus, Registry from openlp.core.lib import Plugin, PluginStatus, Registry
from openlp.core.utils import AppLocation
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -46,17 +47,14 @@ class PluginManager(object):
""" """
log.info(u'Plugin manager loaded') log.info(u'Plugin manager loaded')
def __init__(self, plugin_dir): def __init__(self):
""" """
The constructor for the plugin manager. Passes the controllers on to The constructor for the plugin manager. Passes the controllers on to
the plugins for them to interact with via their ServiceItems. the plugins for them to interact with via their ServiceItems.
``plugin_dir``
The directory to search for plugins.
""" """
log.info(u'Plugin manager Initialising') log.info(u'Plugin manager Initialising')
Registry().register(u'plugin_manager', self) Registry().register(u'plugin_manager', self)
self.base_path = os.path.abspath(plugin_dir) self.base_path = os.path.abspath(AppLocation.get_directory(AppLocation.PluginsDir))
log.debug(u'Base path %s ', self.base_path) log.debug(u'Base path %s ', self.base_path)
self.plugins = [] self.plugins = []
log.info(u'Plugin manager Initialised') log.info(u'Plugin manager Initialised')

View File

@ -36,9 +36,8 @@ import sys
from PyQt4 import QtCore, QtGui from PyQt4 import QtCore, QtGui
from openlp.core.lib import SlideLimits from openlp.core.lib import SlideLimits, UiStrings
from openlp.core.lib.theme import ThemeLevel from openlp.core.lib.theme import ThemeLevel
from openlp.core.lib import UiStrings
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
@ -70,7 +69,8 @@ class Settings(QtCore.QSettings):
``__obsolete_settings__`` ``__obsolete_settings__``
Each entry is structured in the following way:: Each entry is structured in the following way::
(u'general/enable slide loop', u'advanced/slide limits', [(SlideLimits.Wrap, True), (SlideLimits.End, False)]) (u'general/enable slide loop', u'advanced/slide limits',
[(SlideLimits.Wrap, True), (SlideLimits.End, False)])
The first entry is the *old key*; it will be removed. The first entry is the *old key*; it will be removed.
@ -260,7 +260,6 @@ class Settings(QtCore.QSettings):
""" """
Settings.__default_settings__ = dict(default_values.items() + Settings.__default_settings__.items()) Settings.__default_settings__ = dict(default_values.items() + Settings.__default_settings__.items())
@staticmethod @staticmethod
def set_filename(ini_file): def set_filename(ini_file):
""" """

View File

@ -109,8 +109,8 @@ def create_button_box(dialog, name, standard_buttons, custom_buttons=None):
button_box.addButton(button, QtGui.QDialogButtonBox.ActionRole) button_box.addButton(button, QtGui.QDialogButtonBox.ActionRole)
else: else:
button_box.addButton(*button) button_box.addButton(*button)
QtCore.QObject.connect(button_box, QtCore.SIGNAL(u'accepted()'), dialog.accept) button_box.accepted.connect(dialog.accept)
QtCore.QObject.connect(button_box, QtCore.SIGNAL(u'rejected()'), dialog.reject) button_box.rejected.connect(dialog.reject)
return button_box return button_box
@ -211,7 +211,7 @@ def create_button(parent, name, **kwargs):
if not kwargs.pop(u'enabled', True): if not kwargs.pop(u'enabled', True):
button.setEnabled(False) button.setEnabled(False)
if kwargs.get(u'click'): if kwargs.get(u'click'):
QtCore.QObject.connect(button, QtCore.SIGNAL(u'clicked()'), kwargs.pop(u'click')) button.clicked.connect(kwargs.pop(u'click'))
for key in kwargs.keys(): for key in kwargs.keys():
if key not in [u'text', u'icon', u'tooltip', u'click']: if key not in [u'text', u'icon', u'tooltip', u'click']:
log.warn(u'Parameter %s was not consumed in create_button().', key) log.warn(u'Parameter %s was not consumed in create_button().', key)
@ -297,8 +297,7 @@ def create_action(parent, name, **kwargs):
action_list = ActionList.get_instance() action_list = ActionList.get_instance()
action_list.add_action(action, unicode(kwargs.pop(u'category'))) action_list.add_action(action, unicode(kwargs.pop(u'category')))
if kwargs.get(u'triggers'): if kwargs.get(u'triggers'):
QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered(bool)'), action.triggered.connect(kwargs.pop(u'triggers'))
kwargs.pop(u'triggers'))
for key in kwargs.keys(): for key in kwargs.keys():
if key not in [u'text', u'icon', u'tooltip', u'statustip', u'checked', u'shortcuts', u'category', u'triggers']: if key not in [u'text', u'icon', u'tooltip', u'statustip', u'checked', u'shortcuts', u'category', u'triggers']:
log.warn(u'Parameter %s was not consumed in create_action().', key) log.warn(u'Parameter %s was not consumed in create_action().', key)

View File

@ -106,7 +106,7 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog):
""" """
QtGui.QDialog.__init__(self, parent) QtGui.QDialog.__init__(self, parent)
self.setupUi(self) self.setupUi(self)
self.settingsSection = u'crashreport' self.settings_section = u'crashreport'
def exec_(self): def exec_(self):
""" """
@ -159,12 +159,11 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog):
'--- Library Versions ---\n%s\n') '--- Library Versions ---\n%s\n')
filename = QtGui.QFileDialog.getSaveFileName(self, filename = QtGui.QFileDialog.getSaveFileName(self,
translate('OpenLP.ExceptionForm', 'Save Crash Report'), translate('OpenLP.ExceptionForm', 'Save Crash Report'),
Settings().value(self.settingsSection + u'/last directory'), Settings().value(self.settings_section + u'/last directory'),
translate('OpenLP.ExceptionForm', translate('OpenLP.ExceptionForm', 'Text files (*.txt *.log *.text)'))
'Text files (*.txt *.log *.text)'))
if filename: if filename:
filename = unicode(filename).replace(u'/', os.path.sep) filename = unicode(filename).replace(u'/', os.path.sep)
Settings().setValue(self.settingsSection + u'/last directory', os.path.dirname(filename)) Settings().setValue(self.settings_section + u'/last directory', os.path.dirname(filename))
report_text = report_text % self._createReport() report_text = report_text % self._createReport()
try: try:
report_file = open(filename, u'w') report_file = open(filename, u'w')
@ -230,7 +229,7 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog):
""" """
files = QtGui.QFileDialog.getOpenFileName( files = QtGui.QFileDialog.getOpenFileName(
self, translate('ImagePlugin.ExceptionDialog', 'Select Attachment'), self, translate('ImagePlugin.ExceptionDialog', 'Select Attachment'),
Settings().value(self.settingsSection + u'/last directory'), u'%s (*.*) (*)' % UiStrings().AllFiles) Settings().value(self.settings_section + u'/last directory'), u'%s (*.*) (*)' % UiStrings().AllFiles)
log.info(u'New files(s) %s', unicode(files)) log.info(u'New files(s) %s', unicode(files))
if files: if files:
self.fileAttachment = unicode(files) self.fileAttachment = unicode(files)

View File

@ -297,7 +297,7 @@ class MainDisplay(Display):
self.image(path) self.image(path)
# Update the preview frame. # Update the preview frame.
if self.is_live: if self.is_live:
self.parent().updatePreview() self.live_controller.updatePreview()
return True return True
def image(self, path): def image(self, path):
@ -508,6 +508,16 @@ class MainDisplay(Display):
application = property(_get_application) application = property(_get_application)
def _get_live_controller(self):
"""
Adds the live controller to the class dynamically
"""
if not hasattr(self, u'_live_controller'):
self._live_controller = Registry().get(u'live_controller')
return self._live_controller
live_controller = property(_get_live_controller)
class AudioPlayer(QtCore.QObject): class AudioPlayer(QtCore.QObject):
""" """

View File

@ -487,7 +487,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
self.timer_id = 0 self.timer_id = 0
self.timer_version_id = 0 self.timer_version_id = 0
# Set up the path with plugins # Set up the path with plugins
self.plugin_manager = PluginManager(AppLocation.get_directory(AppLocation.PluginsDir)) self.plugin_manager = PluginManager()
self.imageManager = ImageManager() self.imageManager = ImageManager()
# Set up the interface # Set up the interface
self.setupUi(self) self.setupUi(self)

View File

@ -142,8 +142,7 @@ class ServiceManagerDialog(object):
self.service_manager_list.setHeaderHidden(True) self.service_manager_list.setHeaderHidden(True)
self.service_manager_list.setExpandsOnDoubleClick(False) self.service_manager_list.setExpandsOnDoubleClick(False)
self.service_manager_list.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.service_manager_list.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
QtCore.QObject.connect(self.service_manager_list, QtCore.SIGNAL('customContextMenuRequested(QPoint)'), self.service_manager_list.customContextMenuRequested.connect(self.context_menu)
self.context_menu)
self.service_manager_list.setObjectName(u'service_manager_list') self.service_manager_list.setObjectName(u'service_manager_list')
# enable drop # enable drop
self.service_manager_list.__class__.dragEnterEvent = self.drag_enter_event self.service_manager_list.__class__.dragEnterEvent = self.drag_enter_event
@ -202,18 +201,10 @@ class ServiceManagerDialog(object):
triggers=self.make_live) triggers=self.make_live)
self.layout.addWidget(self.order_toolbar) self.layout.addWidget(self.order_toolbar)
# Connect up our signals and slots # Connect up our signals and slots
QtCore.QObject.connect(self.theme_combo_box, QtCore.SIGNAL(u'activated(int)'), self.theme_combo_box.activated.connect(self.on_theme_combo_box_selected)
self.on_theme_combo_box_selected) self.service_manager_list.doubleClicked.connect(self.on_make_live)
QtCore.QObject.connect(self.service_manager_list, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.service_manager_list.itemCollapsed.connect(self.collapsed)
self.on_make_live) self.service_manager_list.itemExpanded.connect(self.expanded)
QtCore.QObject.connect(self.service_manager_list, QtCore.SIGNAL(u'itemCollapsed(QTreeWidgetItem*)'),
self.collapsed)
QtCore.QObject.connect(self.service_manager_list, QtCore.SIGNAL(u'itemExpanded(QTreeWidgetItem*)'),
self.expanded)
Registry().register_function(u'theme_update_list', self.update_theme_list)
Registry().register_function(u'config_updated', self.config_updated)
Registry().register_function(u'config_screen_changed', self.regenerate_service_Items)
Registry().register_function(u'theme_update_global', self.theme_change)
# Last little bits of setting up # Last little bits of setting up
self.service_theme = Settings().value(self.main_window.serviceManagerSettingsSection + u'/service theme') self.service_theme = Settings().value(self.main_window.serviceManagerSettingsSection + u'/service theme')
self.servicePath = AppLocation.get_section_data_path(u'servicemanager') self.servicePath = AppLocation.get_section_data_path(u'servicemanager')
@ -273,6 +264,10 @@ class ServiceManagerDialog(object):
self.service_manager_list.expand, self.service_manager_list.expand,
self.service_manager_list.collapse self.service_manager_list.collapse
]) ])
Registry().register_function(u'theme_update_list', self.update_theme_list)
Registry().register_function(u'config_updated', self.config_updated)
Registry().register_function(u'config_screen_changed', self.regenerate_service_Items)
Registry().register_function(u'theme_update_global', self.theme_change)
def drag_enter_event(self, event): def drag_enter_event(self, event):
""" """

View File

@ -230,7 +230,7 @@ class SlideController(DisplayController):
self.play_slides_once = create_action(self, u'playSlidesOnce', text=UiStrings().PlaySlidesToEnd, self.play_slides_once = create_action(self, u'playSlidesOnce', text=UiStrings().PlaySlidesToEnd,
icon=u':/media/media_time.png', checked=False, shortcuts=[], icon=u':/media/media_time.png', checked=False, shortcuts=[],
category=self.category, triggers=self.onPlaySlidesOnce) category=self.category, triggers=self.onPlaySlidesOnce)
if Settings().value(self.parent().advancedSettingsSection + u'/slide limits') == SlideLimits.Wrap: if Settings().value(self.main_window.advancedSettingsSection + u'/slide limits') == SlideLimits.Wrap:
self.play_slides_menu.setDefaultAction(self.play_slides_loop) self.play_slides_menu.setDefaultAction(self.play_slides_loop)
else: else:
self.play_slides_menu.setDefaultAction(self.play_slides_once) self.play_slides_menu.setDefaultAction(self.play_slides_once)
@ -293,6 +293,7 @@ class SlideController(DisplayController):
self.audioTimeLabel.setObjectName(u'audioTimeLabel') self.audioTimeLabel.setObjectName(u'audioTimeLabel')
self.toolbar.addToolbarWidget(self.audioTimeLabel) self.toolbar.addToolbarWidget(self.audioTimeLabel)
self.toolbar.setWidgetVisible(self.audio_list, False) self.toolbar.setWidgetVisible(self.audio_list, False)
self.toolbar.setWidgetVisible([u'songMenu'], False)
# Screen preview area # Screen preview area
self.preview_frame = QtGui.QFrame(self.splitter) self.preview_frame = QtGui.QFrame(self.splitter)
self.preview_frame.setGeometry(QtCore.QRect(0, 0, 300, 300 * self.ratio)) self.preview_frame.setGeometry(QtCore.QRect(0, 0, 300, 300 * self.ratio))
@ -581,7 +582,7 @@ class SlideController(DisplayController):
self.preview_list_widget.resizeRowsToContents() self.preview_list_widget.resizeRowsToContents()
else: else:
# Sort out image heights. # Sort out image heights.
width = self.parent().controlSplitter.sizes()[self.split] width = self.main_window.controlSplitter.sizes()[self.split]
for framenumber in range(len(self.service_item.get_frames())): for framenumber in range(len(self.service_item.get_frames())):
self.preview_list_widget.setRowHeight(framenumber, width / self.ratio) self.preview_list_widget.setRowHeight(framenumber, width / self.ratio)
self.onControllerSizeChanged(self.controller.width(), self.controller.height()) self.onControllerSizeChanged(self.controller.width(), self.controller.height())
@ -591,10 +592,14 @@ class SlideController(DisplayController):
Change layout of display control buttons on controller size change Change layout of display control buttons on controller size change
""" """
if self.is_live: if self.is_live:
if width > 300 and self.hide_menu.isVisible(): # Space used by the toolbar.
used_space = self.toolbar.size().width() + self.hide_menu.size().width()
# The + 40 is needed to prevent flickering. This can be considered a "buffer".
if width > used_space + 40 and self.hide_menu.isVisible():
self.toolbar.setWidgetVisible(self.hide_menu_list, False) self.toolbar.setWidgetVisible(self.hide_menu_list, False)
self.toolbar.setWidgetVisible(self.wide_menu) self.toolbar.setWidgetVisible(self.wide_menu)
elif width < 300 and not self.hide_menu.isVisible(): # The - 40 is needed to prevent flickering. This can be considered a "buffer".
elif width < used_space - 40 and not self.hide_menu.isVisible():
self.toolbar.setWidgetVisible(self.wide_menu, False) self.toolbar.setWidgetVisible(self.wide_menu, False)
self.toolbar.setWidgetVisible(self.hide_menu_list) self.toolbar.setWidgetVisible(self.hide_menu_list)
@ -617,7 +622,7 @@ class SlideController(DisplayController):
""" """
Updates the Slide Limits variable from the settings. Updates the Slide Limits variable from the settings.
""" """
self.slide_limits = Settings().value(self.parent().advancedSettingsSection + u'/slide limits') self.slide_limits = Settings().value(self.main_window.advancedSettingsSection + u'/slide limits')
def enableToolBar(self, item): def enableToolBar(self, item):
""" """
@ -639,14 +644,15 @@ class SlideController(DisplayController):
self.mediabar.hide() self.mediabar.hide()
self.song_menu.hide() self.song_menu.hide()
self.toolbar.setWidgetVisible(self.loop_list, False) self.toolbar.setWidgetVisible(self.loop_list, False)
self.toolbar.setWidgetVisible([u'songMenu'], False)
# Reset the button # Reset the button
self.play_slides_once.setChecked(False) self.play_slides_once.setChecked(False)
self.play_slides_once.setIcon(build_icon(u':/media/media_time.png')) self.play_slides_once.setIcon(build_icon(u':/media/media_time.png'))
self.play_slides_loop.setChecked(False) self.play_slides_loop.setChecked(False)
self.play_slides_loop.setIcon(build_icon(u':/media/media_time.png')) self.play_slides_loop.setIcon(build_icon(u':/media/media_time.png'))
if item.is_text(): if item.is_text():
if Settings().value(self.parent().songsSettingsSection + u'/display songbar') and self.slideList: if Settings().value(self.main_window.songsSettingsSection + u'/display songbar') and self.slideList:
self.song_menu.show() self.toolbar.setWidgetVisible([u'songMenu'], True)
if item.is_capable(ItemCapabilities.CanLoop) and len(item.get_frames()) > 1: if item.is_capable(ItemCapabilities.CanLoop) and len(item.get_frames()) > 1:
self.toolbar.setWidgetVisible(self.loop_list) self.toolbar.setWidgetVisible(self.loop_list)
if item.is_media(): if item.is_media():
@ -747,7 +753,7 @@ class SlideController(DisplayController):
self._resetBlank() self._resetBlank()
Registry().execute(u'%s_start' % service_item.name.lower(), [service_item, self.is_live, self.hide_mode(), slideno]) Registry().execute(u'%s_start' % service_item.name.lower(), [service_item, self.is_live, self.hide_mode(), slideno])
self.slideList = {} self.slideList = {}
width = self.parent().controlSplitter.sizes()[self.split] width = self.main_window.controlSplitter.sizes()[self.split]
self.preview_list_widget.clear() self.preview_list_widget.clear()
self.preview_list_widget.setRowCount(0) self.preview_list_widget.setRowCount(0)
self.preview_list_widget.setColumnWidth(0, width) self.preview_list_widget.setColumnWidth(0, width)
@ -766,8 +772,8 @@ class SlideController(DisplayController):
action.setData(counter) action.setData(counter)
QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered(bool)'), self.onTrackTriggered) QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered(bool)'), self.onTrackTriggered)
self.display.audioPlayer.repeat = Settings().value( self.display.audioPlayer.repeat = Settings().value(
self.parent().generalSettingsSection + u'/audio repeat list') self.main_window.generalSettingsSection + u'/audio repeat list')
if Settings().value(self.parent().generalSettingsSection + u'/audio start paused'): if Settings().value(self.main_window.generalSettingsSection + u'/audio start paused'):
self.audioPauseItem.setChecked(True) self.audioPauseItem.setChecked(True)
self.display.audioPlayer.pause() self.display.audioPlayer.pause()
else: else:
@ -875,7 +881,7 @@ class SlideController(DisplayController):
Allow the main display to blank the main display at startup time Allow the main display to blank the main display at startup time
""" """
log.debug(u'mainDisplaySetBackground live = %s' % self.is_live) log.debug(u'mainDisplaySetBackground live = %s' % self.is_live)
display_type = Settings().value(self.parent().generalSettingsSection + u'/screen blank') display_type = Settings().value(self.main_window.generalSettingsSection + u'/screen blank')
if self.screens.which_screen(self.window()) != self.screens.which_screen(self.display): if self.screens.which_screen(self.window()) != self.screens.which_screen(self.display):
# Order done to handle initial conversion # Order done to handle initial conversion
if display_type == u'themed': if display_type == u'themed':
@ -913,9 +919,9 @@ class SlideController(DisplayController):
self.theme_screen.setChecked(False) self.theme_screen.setChecked(False)
self.desktop_screen.setChecked(False) self.desktop_screen.setChecked(False)
if checked: if checked:
Settings().setValue(self.parent().generalSettingsSection + u'/screen blank', u'blanked') Settings().setValue(self.main_window.generalSettingsSection + u'/screen blank', u'blanked')
else: else:
Settings().remove(self.parent().generalSettingsSection + u'/screen blank') Settings().remove(self.main_window.generalSettingsSection + u'/screen blank')
self.blankPlugin() self.blankPlugin()
self.updatePreview() self.updatePreview()
self.onToggleLoop() self.onToggleLoop()
@ -932,9 +938,9 @@ class SlideController(DisplayController):
self.theme_screen.setChecked(checked) self.theme_screen.setChecked(checked)
self.desktop_screen.setChecked(False) self.desktop_screen.setChecked(False)
if checked: if checked:
Settings().setValue(self.parent().generalSettingsSection + u'/screen blank', u'themed') Settings().setValue(self.main_window.generalSettingsSection + u'/screen blank', u'themed')
else: else:
Settings().remove(self.parent().generalSettingsSection + u'/screen blank') Settings().remove(self.main_window.generalSettingsSection + u'/screen blank')
self.blankPlugin() self.blankPlugin()
self.updatePreview() self.updatePreview()
self.onToggleLoop() self.onToggleLoop()
@ -951,9 +957,9 @@ class SlideController(DisplayController):
self.theme_screen.setChecked(False) self.theme_screen.setChecked(False)
self.desktop_screen.setChecked(checked) self.desktop_screen.setChecked(checked)
if checked: if checked:
Settings().setValue(self.parent().generalSettingsSection + u'/screen blank', u'hidden') Settings().setValue(self.main_window.generalSettingsSection + u'/screen blank', u'hidden')
else: else:
Settings().remove(self.parent().generalSettingsSection + u'/screen blank') Settings().remove(self.main_window.generalSettingsSection + u'/screen blank')
self.hidePlugin(checked) self.hidePlugin(checked)
self.updatePreview() self.updatePreview()
self.onToggleLoop() self.onToggleLoop()
@ -1253,7 +1259,7 @@ class SlideController(DisplayController):
def onGoLive(self): def onGoLive(self):
""" """
If preview copy slide item to live If preview copy slide item to live controller from Preview Controller
""" """
row = self.preview_list_widget.currentRow() row = self.preview_list_widget.currentRow()
if -1 < row < self.preview_list_widget.rowCount(): if -1 < row < self.preview_list_widget.rowCount():
@ -1382,3 +1388,14 @@ class SlideController(DisplayController):
return self._live_controller return self._live_controller
live_controller = property(_get_live_controller) live_controller = property(_get_live_controller)
def _get_main_window(self):
"""
Adds the main window to the class dynamically
"""
if not hasattr(self, u'_main_window'):
self._main_window = Registry().get(u'main_window')
return self._main_window
main_window = property(_get_main_window)

View File

@ -105,8 +105,7 @@ class ThemeManager(QtGui.QWidget):
self.theme_list_widget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.theme_list_widget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.theme_list_widget.setObjectName(u'theme_list_widget') self.theme_list_widget.setObjectName(u'theme_list_widget')
self.layout.addWidget(self.theme_list_widget) self.layout.addWidget(self.theme_list_widget)
QtCore.QObject.connect(self.theme_list_widget, QtCore.SIGNAL('customContextMenuRequested(QPoint)'), self.theme_list_widget.customContextMenuRequested.connect(self.context_menu)
self.context_menu)
# build the context menu # build the context menu
self.menu = QtGui.QMenu() self.menu = QtGui.QMenu()
self.edit_action = create_widget_action(self.menu, self.edit_action = create_widget_action(self.menu,
@ -130,10 +129,8 @@ class ThemeManager(QtGui.QWidget):
text=translate('OpenLP.ThemeManager', '&Export Theme'), text=translate('OpenLP.ThemeManager', '&Export Theme'),
icon=u':/general/general_export.png', triggers=self.on_export_theme) icon=u':/general/general_export.png', triggers=self.on_export_theme)
# Signals # Signals
QtCore.QObject.connect(self.theme_list_widget, self.theme_list_widget.doubleClicked.connect(self.change_global_from_screen)
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.change_global_from_screen) self.theme_list_widget.currentItemChanged.connect(self.check_list_state)
QtCore.QObject.connect(self.theme_list_widget,
QtCore.SIGNAL(u'currentItemChanged(QListWidgetItem *, QListWidgetItem *)'), self.check_list_state)
Registry().register_function(u'theme_update_global', self.change_global_from_tab) Registry().register_function(u'theme_update_global', self.change_global_from_tab)
Registry().register_function(u'config_updated', self.config_updated) Registry().register_function(u'config_updated', self.config_updated)
# Variables # Variables
@ -160,7 +157,6 @@ class ThemeManager(QtGui.QWidget):
delete_file(theme_file) delete_file(theme_file)
self.application.set_normal_cursor() self.application.set_normal_cursor()
def config_updated(self): def config_updated(self):
""" """
Triggered when Config dialog is updated. Triggered when Config dialog is updated.

View File

@ -122,7 +122,7 @@ __default_settings__ = {
u'alerts/background color': u'#660000', u'alerts/background color': u'#660000',
u'alerts/font color': u'#ffffff', u'alerts/font color': u'#ffffff',
u'alerts/timeout': 5 u'alerts/timeout': 5
} }
class AlertsPlugin(Plugin): class AlertsPlugin(Plugin):
@ -133,7 +133,7 @@ class AlertsPlugin(Plugin):
self.weight = -3 self.weight = -3
self.iconPath = u':/plugins/plugin_alerts.png' self.iconPath = u':/plugins/plugin_alerts.png'
self.icon = build_icon(self.iconPath) self.icon = build_icon(self.iconPath)
self.alertsmanager = AlertsManager(self) self.alerts_manager = AlertsManager(self)
self.manager = Manager(u'alerts', init_schema) self.manager = Manager(u'alerts', init_schema)
self.alertForm = AlertForm(self) self.alertForm = AlertForm(self)
@ -176,7 +176,7 @@ class AlertsPlugin(Plugin):
Settings().setValue(self.settingsSection + u'/active', self.alertsActive) Settings().setValue(self.settingsSection + u'/active', self.alertsActive)
def onAlertsTrigger(self): def onAlertsTrigger(self):
self.alertForm.loadList() self.alertForm.load_list()
self.alertForm.exec_() self.alertForm.exec_()
def about(self): def about(self):
@ -194,7 +194,8 @@ class AlertsPlugin(Plugin):
u'plural': translate('AlertsPlugin', 'Alerts', 'name plural') u'plural': translate('AlertsPlugin', 'Alerts', 'name plural')
} }
## Name for MediaDockManager, SettingsManager ## ## Name for MediaDockManager, SettingsManager ##
self.textStrings[StringContent.VisibleName] = {u'title': translate('AlertsPlugin', 'Alerts', 'container title') self.textStrings[StringContent.VisibleName] = {
u'title': translate('AlertsPlugin', 'Alerts', 'container title')
} }
def getDisplayJavaScript(self): def getDisplayJavaScript(self):

View File

@ -32,61 +32,63 @@ from PyQt4 import QtGui
from openlp.core.lib import build_icon, translate from openlp.core.lib import build_icon, translate
from openlp.core.lib.ui import create_button, create_button_box from openlp.core.lib.ui import create_button, create_button_box
class Ui_AlertDialog(object):
def setupUi(self, alertDialog):
alertDialog.setObjectName(u'alertDialog')
alertDialog.resize(400, 300)
alertDialog.setWindowIcon(build_icon(u':/icon/openlp-logo-16x16.png'))
self.alertDialogLayout = QtGui.QGridLayout(alertDialog)
self.alertDialogLayout.setObjectName(u'alertDialogLayout')
self.alertTextLayout = QtGui.QFormLayout()
self.alertTextLayout.setObjectName(u'alertTextLayout')
self.alertEntryLabel = QtGui.QLabel(alertDialog)
self.alertEntryLabel.setObjectName(u'alertEntryLabel')
self.alertTextEdit = QtGui.QLineEdit(alertDialog)
self.alertTextEdit.setObjectName(u'alertTextEdit')
self.alertEntryLabel.setBuddy(self.alertTextEdit)
self.alertTextLayout.addRow(self.alertEntryLabel, self.alertTextEdit)
self.alertParameter = QtGui.QLabel(alertDialog)
self.alertParameter.setObjectName(u'alertParameter')
self.parameterEdit = QtGui.QLineEdit(alertDialog)
self.parameterEdit.setObjectName(u'parameterEdit')
self.alertParameter.setBuddy(self.parameterEdit)
self.alertTextLayout.addRow(self.alertParameter, self.parameterEdit)
self.alertDialogLayout.addLayout(self.alertTextLayout, 0, 0, 1, 2)
self.alertListWidget = QtGui.QListWidget(alertDialog)
self.alertListWidget.setAlternatingRowColors(True)
self.alertListWidget.setObjectName(u'alertListWidget')
self.alertDialogLayout.addWidget(self.alertListWidget, 1, 0)
self.manageButtonLayout = QtGui.QVBoxLayout()
self.manageButtonLayout.setObjectName(u'manageButtonLayout')
self.newButton = QtGui.QPushButton(alertDialog)
self.newButton.setIcon(build_icon(u':/general/general_new.png'))
self.newButton.setObjectName(u'newButton')
self.manageButtonLayout.addWidget(self.newButton)
self.saveButton = QtGui.QPushButton(alertDialog)
self.saveButton.setEnabled(False)
self.saveButton.setIcon(build_icon(u':/general/general_save.png'))
self.saveButton.setObjectName(u'saveButton')
self.manageButtonLayout.addWidget(self.saveButton)
self.deleteButton = create_button(alertDialog, u'deleteButton', role=u'delete', enabled=False,
click=alertDialog.onDeleteButtonClicked)
self.manageButtonLayout.addWidget(self.deleteButton)
self.manageButtonLayout.addStretch()
self.alertDialogLayout.addLayout(self.manageButtonLayout, 1, 1)
displayIcon = build_icon(u':/general/general_live.png')
self.displayButton = create_button(alertDialog, u'displayButton', icon=displayIcon, enabled=False)
self.displayCloseButton = create_button(alertDialog, u'displayCloseButton', icon=displayIcon, enabled=False)
self.button_box = create_button_box(alertDialog, u'button_box', [u'close'],
[self.displayButton, self.displayCloseButton])
self.alertDialogLayout.addWidget(self.button_box, 2, 0, 1, 2)
self.retranslateUi(alertDialog)
def retranslateUi(self, alertDialog): class Ui_AlertDialog(object):
alertDialog.setWindowTitle(translate('AlertsPlugin.AlertForm', 'Alert Message')) def setupUi(self, alert_dialog):
self.alertEntryLabel.setText(translate('AlertsPlugin.AlertForm', 'Alert &text:')) alert_dialog.setObjectName(u'alert_dialog')
self.alertParameter.setText(translate('AlertsPlugin.AlertForm', '&Parameter:')) alert_dialog.resize(400, 300)
self.newButton.setText(translate('AlertsPlugin.AlertForm', '&New')) alert_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo-16x16.png'))
self.saveButton.setText(translate('AlertsPlugin.AlertForm', '&Save')) self.alert_dialog_layout = QtGui.QGridLayout(alert_dialog)
self.displayButton.setText(translate('AlertsPlugin.AlertForm', 'Displ&ay')) self.alert_dialog_layout.setObjectName(u'alert_dialog_layout')
self.displayCloseButton.setText(translate('AlertsPlugin.AlertForm', 'Display && Cl&ose')) self.alert_text_layout = QtGui.QFormLayout()
self.alert_text_layout.setObjectName(u'alert_text_layout')
self.alert_entry_label = QtGui.QLabel(alert_dialog)
self.alert_entry_label.setObjectName(u'alert_entry_label')
self.alert_text_edit = QtGui.QLineEdit(alert_dialog)
self.alert_text_edit.setObjectName(u'alert_text_edit')
self.alert_entry_label.setBuddy(self.alert_text_edit)
self.alert_text_layout.addRow(self.alert_entry_label, self.alert_text_edit)
self.alert_parameter = QtGui.QLabel(alert_dialog)
self.alert_parameter.setObjectName(u'alert_parameter')
self.parameter_edit = QtGui.QLineEdit(alert_dialog)
self.parameter_edit.setObjectName(u'parameter_edit')
self.alert_parameter.setBuddy(self.parameter_edit)
self.alert_text_layout.addRow(self.alert_parameter, self.parameter_edit)
self.alert_dialog_layout.addLayout(self.alert_text_layout, 0, 0, 1, 2)
self.alert_list_widget = QtGui.QListWidget(alert_dialog)
self.alert_list_widget.setAlternatingRowColors(True)
self.alert_list_widget.setObjectName(u'alert_list_widget')
self.alert_dialog_layout.addWidget(self.alert_list_widget, 1, 0)
self.manage_button_layout = QtGui.QVBoxLayout()
self.manage_button_layout.setObjectName(u'manage_button_layout')
self.new_button = QtGui.QPushButton(alert_dialog)
self.new_button.setIcon(build_icon(u':/general/general_new.png'))
self.new_button.setObjectName(u'new_button')
self.manage_button_layout.addWidget(self.new_button)
self.save_button = QtGui.QPushButton(alert_dialog)
self.save_button.setEnabled(False)
self.save_button.setIcon(build_icon(u':/general/general_save.png'))
self.save_button.setObjectName(u'save_button')
self.manage_button_layout.addWidget(self.save_button)
self.delete_button = create_button(alert_dialog, u'delete_button', role=u'delete', enabled=False,
click=alert_dialog.onDeleteButtonClicked)
self.manage_button_layout.addWidget(self.delete_button)
self.manage_button_layout.addStretch()
self.alert_dialog_layout.addLayout(self.manage_button_layout, 1, 1)
displayIcon = build_icon(u':/general/general_live.png')
self.display_button = create_button(alert_dialog, u'display_button', icon=displayIcon, enabled=False)
self.display_close_button = create_button(alert_dialog, u'display_close_button', icon=displayIcon,
enabled=False)
self.button_box = create_button_box(alert_dialog, u'button_box', [u'close'],
[self.display_button, self.display_close_button])
self.alert_dialog_layout.addWidget(self.button_box, 2, 0, 1, 2)
self.retranslateUi(alert_dialog)
def retranslateUi(self, alert_dialog):
alert_dialog.setWindowTitle(translate('AlertsPlugin.AlertForm', 'Alert Message'))
self.alert_entry_label.setText(translate('AlertsPlugin.AlertForm', 'Alert &text:'))
self.alert_parameter.setText(translate('AlertsPlugin.AlertForm', '&Parameter:'))
self.new_button.setText(translate('AlertsPlugin.AlertForm', '&New'))
self.save_button.setText(translate('AlertsPlugin.AlertForm', '&Save'))
self.display_button.setText(translate('AlertsPlugin.AlertForm', 'Displ&ay'))
self.display_close_button.setText(translate('AlertsPlugin.AlertForm', 'Display && Cl&ose'))

View File

@ -48,131 +48,131 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog):
self.item_id = None self.item_id = None
super(AlertForm, self).__init__(self.plugin.main_window) super(AlertForm, self).__init__(self.plugin.main_window)
self.setupUi(self) self.setupUi(self)
QtCore.QObject.connect(self.displayButton, QtCore.SIGNAL(u'clicked()'), self.onDisplayClicked) self.display_button.clicked.connect(self.on_display_clicked)
QtCore.QObject.connect(self.displayCloseButton, QtCore.SIGNAL(u'clicked()'), self.onDisplayCloseClicked) self.display_close_button.clicked.connect(self.on_display_close_clicked)
QtCore.QObject.connect(self.alertTextEdit, QtCore.SIGNAL(u'textChanged(const QString&)'), self.onTextChanged) self.alert_text_edit.textChanged.connect(self.on_text_changed)
QtCore.QObject.connect(self.newButton, QtCore.SIGNAL(u'clicked()'), self.onNewClick) self.new_button.clicked.connect(self.on_new_click)
QtCore.QObject.connect(self.saveButton, QtCore.SIGNAL(u'clicked()'), self.onSaveClick) self.save_button.clicked.connect(self.on_save_all)
QtCore.QObject.connect(self.alertListWidget, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onDoubleClick) self.alert_list_widget.doubleClicked.connect(self.on_double_click)
QtCore.QObject.connect(self.alertListWidget, QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSingleClick) self.alert_list_widget.clicked.connect(self.on_single_click)
QtCore.QObject.connect(self.alertListWidget, QtCore.SIGNAL(u'currentRowChanged(int)'), self.onCurrentRowChanged) self.alert_list_widget.currentRowChanged.connect(self.on_current_row_changed)
def exec_(self): def exec_(self):
""" """
Execute the dialog and return the exit code. Execute the dialog and return the exit code.
""" """
self.displayButton.setEnabled(False) self.display_button.setEnabled(False)
self.displayCloseButton.setEnabled(False) self.display_close_button.setEnabled(False)
self.alertTextEdit.setText(u'') self.alert_text_edit.setText(u'')
return QtGui.QDialog.exec_(self) return QtGui.QDialog.exec_(self)
def loadList(self): def load_list(self):
""" """
Loads the list with alerts. Loads the list with alerts.
""" """
self.alertListWidget.clear() self.alert_list_widget.clear()
alerts = self.manager.get_all_objects(AlertItem, order_by_ref=AlertItem.text) alerts = self.manager.get_all_objects(AlertItem, order_by_ref=AlertItem.text)
for alert in alerts: for alert in alerts:
item_name = QtGui.QListWidgetItem(alert.text) item_name = QtGui.QListWidgetItem(alert.text)
item_name.setData(QtCore.Qt.UserRole, alert.id) item_name.setData(QtCore.Qt.UserRole, alert.id)
self.alertListWidget.addItem(item_name) self.alert_list_widget.addItem(item_name)
if alert.text == unicode(self.alertTextEdit.text()): if alert.text == unicode(self.alert_text_edit.text()):
self.item_id = alert.id self.item_id = alert.id
self.alertListWidget.setCurrentRow(self.alertListWidget.row(item_name)) self.alert_list_widget.setCurrentRow(self.alert_list_widget.row(item_name))
def onDisplayClicked(self): def on_display_clicked(self):
""" """
Display the current alert text. Display the current alert text.
""" """
self.triggerAlert(self.alertTextEdit.text()) self.trigger_alert(self.alert_text_edit.text())
def onDisplayCloseClicked(self): def on_display_close_clicked(self):
""" """
Close the alert preview. Close the alert preview.
""" """
if self.triggerAlert(self.alertTextEdit.text()): if self.trigger_alert(self.alert_text_edit.text()):
self.close() self.close()
def onDeleteButtonClicked(self): def onDeleteButtonClicked(self):
""" """
Deletes the selected item. Deletes the selected item.
""" """
item = self.alertListWidget.currentItem() item = self.alert_list_widget.currentItem()
if item: if item:
item_id = item.data(QtCore.Qt.UserRole) item_id = item.data(QtCore.Qt.UserRole)
self.manager.delete_object(AlertItem, item_id) self.manager.delete_object(AlertItem, item_id)
row = self.alertListWidget.row(item) row = self.alert_list_widget.row(item)
self.alertListWidget.takeItem(row) self.alert_list_widget.takeItem(row)
self.item_id = None self.item_id = None
self.alertTextEdit.setText(u'') self.alert_text_edit.setText(u'')
def onNewClick(self): def on_new_click(self):
""" """
Create a new alert. Create a new alert.
""" """
if not self.alertTextEdit.text(): if not self.alert_text_edit.text():
QtGui.QMessageBox.information(self, QtGui.QMessageBox.information(self,
translate('AlertsPlugin.AlertForm', 'New Alert'), translate('AlertsPlugin.AlertForm', 'New Alert'),
translate('AlertsPlugin.AlertForm', 'You haven\'t specified any text for your alert. \n' translate('AlertsPlugin.AlertForm', 'You haven\'t specified any text for your alert. \n'
'Please type in some text before clicking New.')) 'Please type in some text before clicking New.'))
else: else:
alert = AlertItem() alert = AlertItem()
alert.text = self.alertTextEdit.text() alert.text = self.alert_text_edit.text()
self.manager.save_object(alert) self.manager.save_object(alert)
self.loadList() self.load_list()
def onSaveClick(self): def on_save_all(self):
""" """
Save the alert, we are editing. Save the alert, we are editing.
""" """
if self.item_id: if self.item_id:
alert = self.manager.get_object(AlertItem, self.item_id) alert = self.manager.get_object(AlertItem, self.item_id)
alert.text = self.alertTextEdit.text() alert.text = self.alert_text_edit.text()
self.manager.save_object(alert) self.manager.save_object(alert)
self.item_id = None self.item_id = None
self.loadList() self.load_list()
self.saveButton.setEnabled(False) self.save_button.setEnabled(False)
def onTextChanged(self): def on_text_changed(self):
""" """
Enable save button when data has been changed by editing the form. Enable save button when data has been changed by editing the form.
""" """
# Only enable the button, if we are editing an item. # Only enable the button, if we are editing an item.
if self.item_id: if self.item_id:
self.saveButton.setEnabled(True) self.save_button.setEnabled(True)
if self.alertTextEdit.text(): if self.alert_text_edit.text():
self.displayButton.setEnabled(True) self.display_button.setEnabled(True)
self.displayCloseButton.setEnabled(True) self.display_close_button.setEnabled(True)
else: else:
self.displayButton.setEnabled(False) self.display_button.setEnabled(False)
self.displayCloseButton.setEnabled(False) self.display_close_button.setEnabled(False)
def onDoubleClick(self): def on_double_click(self):
""" """
List item has been double clicked to display it. List item has been double clicked to display it.
""" """
item = self.alertListWidget.selectedIndexes()[0] item = self.alert_list_widget.selectedIndexes()[0]
bitem = self.alertListWidget.item(item.row()) bitem = self.alert_list_widget.item(item.row())
self.triggerAlert(bitem.text()) self.trigger_alert(bitem.text())
self.alertTextEdit.setText(bitem.text()) self.alert_text_edit.setText(bitem.text())
self.item_id = bitem.data(QtCore.Qt.UserRole) self.item_id = bitem.data(QtCore.Qt.UserRole)
self.saveButton.setEnabled(False) self.save_button.setEnabled(False)
def onSingleClick(self): def on_single_click(self):
""" """
List item has been single clicked to add it to the edit field so it can List item has been single clicked to add it to the edit field so it can
be changed. be changed.
""" """
item = self.alertListWidget.selectedIndexes()[0] item = self.alert_list_widget.selectedIndexes()[0]
bitem = self.alertListWidget.item(item.row()) bitem = self.alert_list_widget.item(item.row())
self.alertTextEdit.setText(bitem.text()) self.alert_text_edit.setText(bitem.text())
self.item_id = bitem.data(QtCore.Qt.UserRole) self.item_id = bitem.data(QtCore.Qt.UserRole)
# If the alert does not contain '<>' we clear the ParameterEdit field. # If the alert does not contain '<>' we clear the ParameterEdit field.
if self.alertTextEdit.text().find(u'<>') == -1: if self.alert_text_edit.text().find(u'<>') == -1:
self.parameterEdit.setText(u'') self.parameter_edit.setText(u'')
self.saveButton.setEnabled(False) self.save_button.setEnabled(False)
def triggerAlert(self, text): def trigger_alert(self, text):
""" """
Prepares the alert text for displaying. Prepares the alert text for displaying.
@ -182,42 +182,44 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog):
if not text: if not text:
return False return False
# We found '<>' in the alert text, but the ParameterEdit field is empty. # We found '<>' in the alert text, but the ParameterEdit field is empty.
if text.find(u'<>') != -1 and not self.parameterEdit.text() and QtGui.QMessageBox.question(self, if text.find(u'<>') != -1 and not self.parameter_edit.text() and QtGui.QMessageBox.question(self,
translate('AlertsPlugin.AlertForm', 'No Parameter Found'), translate('AlertsPlugin.AlertForm', 'No Parameter Found'),
translate('AlertsPlugin.AlertForm', 'You have not entered a parameter to be replaced.\n' translate('AlertsPlugin.AlertForm', 'You have not entered a parameter to be replaced.\n'
'Do you want to continue anyway?'), 'Do you want to continue anyway?'),
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.No | QtGui.QMessageBox.Yes)) == QtGui.QMessageBox.No: QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.No | QtGui.QMessageBox.Yes)) == QtGui.QMessageBox.No:
self.parameterEdit.setFocus() self.parameter_edit.setFocus()
return False return False
# The ParameterEdit field is not empty, but we have not found '<>' # The ParameterEdit field is not empty, but we have not found '<>'
# in the alert text. # in the alert text.
elif text.find(u'<>') == -1 and self.parameterEdit.text() and QtGui.QMessageBox.question(self, elif text.find(u'<>') == -1 and self.parameter_edit.text() and QtGui.QMessageBox.question(self,
translate('AlertsPlugin.AlertForm', 'No Placeholder Found'), translate('AlertsPlugin.AlertForm', 'No Placeholder Found'),
translate('AlertsPlugin.AlertForm', 'The alert text does not contain \'<>\'.\n' translate('AlertsPlugin.AlertForm', 'The alert text does not contain \'<>\'.\n'
'Do you want to continue anyway?'), 'Do you want to continue anyway?'),
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.No | QtGui.QMessageBox.Yes)) == QtGui.QMessageBox.No: QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.No | QtGui.QMessageBox.Yes)) == QtGui.QMessageBox.No:
self.parameterEdit.setFocus() self.parameter_edit.setFocus()
return False return False
text = text.replace(u'<>', self.parameterEdit.text())
text = text.replace(u'<>', self.parameter_edit.text())
self.plugin.alerts_manager.display_alert(text)
self.plugin.alertsmanager.display_alert(text) self.plugin.alertsmanager.display_alert(text)
return True return True
def onCurrentRowChanged(self, row): def on_current_row_changed(self, row):
""" """
Called when the *alertListWidget*'s current row has been changed. This Called when the *alert_list_widget*'s current row has been changed. This
enables or disables buttons which require an item to act on. enables or disables buttons which require an item to act on.
``row`` ``row``
The row (int). If there is no current row, the value is -1. The row (int). If there is no current row, the value is -1.
""" """
if row == -1: if row == -1:
self.displayButton.setEnabled(False) self.display_button.setEnabled(False)
self.displayCloseButton.setEnabled(False) self.display_close_button.setEnabled(False)
self.saveButton.setEnabled(False) self.save_button.setEnabled(False)
self.deleteButton.setEnabled(False) self.delete_button.setEnabled(False)
else: else:
self.displayButton.setEnabled(True) self.display_button.setEnabled(True)
self.displayCloseButton.setEnabled(True) self.display_close_button.setEnabled(True)
self.deleteButton.setEnabled(True) self.delete_button.setEnabled(True)
# We do not need to enable the save button, as it is only enabled # We do not need to enable the save button, as it is only enabled
# when typing text in the "alertTextEdit". # when typing text in the "alert_text_edit".

View File

@ -49,7 +49,6 @@ class AlertsManager(QtCore.QObject):
def __init__(self, parent): def __init__(self, parent):
QtCore.QObject.__init__(self, parent) QtCore.QObject.__init__(self, parent)
self.screen = None
self.timer_id = 0 self.timer_id = 0
self.alert_list = [] self.alert_list = []
Registry().register_function(u'live_display_active', self.generate_alert) Registry().register_function(u'live_display_active', self.generate_alert)

View File

@ -84,7 +84,7 @@ class PptviewController(PresentationController):
if self.process: if self.process:
return return
log.debug(u'start PPTView') log.debug(u'start PPTView')
dllpath = os.path.join(self.plugin_manager.basepath, u'presentations', u'lib', u'pptviewlib', dllpath = os.path.join(self.plugin_manager.base_path, u'presentations', u'lib', u'pptviewlib',
u'pptviewlib.dll') u'pptviewlib.dll')
self.process = cdll.LoadLibrary(dllpath) self.process = cdll.LoadLibrary(dllpath)
if log.isEnabledFor(logging.DEBUG): if log.isEnabledFor(logging.DEBUG):

View File

@ -32,29 +32,30 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate from openlp.core.lib import translate
from openlp.core.lib.ui import create_button_box from openlp.core.lib.ui import create_button_box
class Ui_SongUsageDeleteDialog(object):
def setupUi(self, songUsageDeleteDialog):
songUsageDeleteDialog.setObjectName(u'songUsageDeleteDialog')
songUsageDeleteDialog.resize(291, 243)
self.verticalLayout = QtGui.QVBoxLayout(songUsageDeleteDialog)
self.verticalLayout.setSpacing(8)
self.verticalLayout.setContentsMargins(8, 8, 8, 8)
self.verticalLayout.setObjectName(u'verticalLayout')
self.deleteLabel = QtGui.QLabel(songUsageDeleteDialog)
self.deleteLabel.setObjectName(u'deleteLabel')
self.verticalLayout.addWidget(self.deleteLabel)
self.deleteCalendar = QtGui.QCalendarWidget(songUsageDeleteDialog)
self.deleteCalendar.setFirstDayOfWeek(QtCore.Qt.Sunday)
self.deleteCalendar.setGridVisible(True)
self.deleteCalendar.setVerticalHeaderFormat(QtGui.QCalendarWidget.NoVerticalHeader)
self.deleteCalendar.setObjectName(u'deleteCalendar')
self.verticalLayout.addWidget(self.deleteCalendar)
self.button_box = create_button_box(songUsageDeleteDialog, u'button_box', [u'cancel', u'ok'])
self.verticalLayout.addWidget(self.button_box)
self.retranslateUi(songUsageDeleteDialog)
def retranslateUi(self, songUsageDeleteDialog): class Ui_SongUsageDeleteDialog(object):
songUsageDeleteDialog.setWindowTitle(translate('SongUsagePlugin.SongUsageDeleteForm', 'Delete Song Usage Data')) def setupUi(self, song_usage_delete_dialog):
self.deleteLabel.setText( song_usage_delete_dialog.setObjectName(u'song_usage_delete_dialog')
song_usage_delete_dialog.resize(291, 243)
self.vertical_layout = QtGui.QVBoxLayout(song_usage_delete_dialog)
self.vertical_layout.setSpacing(8)
self.vertical_layout.setContentsMargins(8, 8, 8, 8)
self.vertical_layout.setObjectName(u'vertical_layout')
self.delete_label = QtGui.QLabel(song_usage_delete_dialog)
self.delete_label.setObjectName(u'delete_label')
self.vertical_layout.addWidget(self.delete_label)
self.delete_calendar = QtGui.QCalendarWidget(song_usage_delete_dialog)
self.delete_calendar.setFirstDayOfWeek(QtCore.Qt.Sunday)
self.delete_calendar.setGridVisible(True)
self.delete_calendar.setVerticalHeaderFormat(QtGui.QCalendarWidget.NoVerticalHeader)
self.delete_calendar.setObjectName(u'delete_calendar')
self.vertical_layout.addWidget(self.delete_calendar)
self.button_box = create_button_box(song_usage_delete_dialog, u'button_box', [u'cancel', u'ok'])
self.vertical_layout.addWidget(self.button_box)
self.retranslateUi(song_usage_delete_dialog)
def retranslateUi(self, song_usage_delete_dialog):
song_usage_delete_dialog.setWindowTitle(translate('SongUsagePlugin.SongUsageDeleteForm', 'Delete Song Usage Data'))
self.delete_label.setText(
translate('SongUsagePlugin.SongUsageDeleteForm', 'Select the date up to which the song usage data ' translate('SongUsagePlugin.SongUsageDeleteForm', 'Select the date up to which the song usage data '
'should be deleted. All data recorded before this date will be permanently deleted.')) 'should be deleted. All data recorded before this date will be permanently deleted.'))

View File

@ -45,10 +45,9 @@ class SongUsageDeleteForm(QtGui.QDialog, Ui_SongUsageDeleteDialog):
self.manager = manager self.manager = manager
QtGui.QDialog.__init__(self, parent) QtGui.QDialog.__init__(self, parent)
self.setupUi(self) self.setupUi(self)
QtCore.QObject.connect(self.button_box, QtCore.SIGNAL(u'clicked(QAbstractButton*)'), self.button_box.clicked.connect(self.on_button_box_clicked)
self.onButtonBoxClicked)
def onButtonBoxClicked(self, button): def on_button_box_clicked(self, button):
if self.button_box.standardButton(button) == QtGui.QDialogButtonBox.Ok: if self.button_box.standardButton(button) == QtGui.QDialogButtonBox.Ok:
ret = QtGui.QMessageBox.question(self, ret = QtGui.QMessageBox.question(self,
translate('SongUsagePlugin.SongUsageDeleteForm', 'Delete Selected Song Usage Events?'), translate('SongUsagePlugin.SongUsageDeleteForm', 'Delete Selected Song Usage Events?'),
@ -56,12 +55,12 @@ class SongUsageDeleteForm(QtGui.QDialog, Ui_SongUsageDeleteDialog):
'Are you sure you want to delete selected Song Usage data?'), 'Are you sure you want to delete selected Song Usage data?'),
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No), QtGui.QMessageBox.No) QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No), QtGui.QMessageBox.No)
if ret == QtGui.QMessageBox.Yes: if ret == QtGui.QMessageBox.Yes:
deleteDate = self.deleteCalendar.selectedDate().toPyDate() delete_date = self.delete_calendar.selectedDate().toPyDate()
self.manager.delete_all_objects(SongUsageItem, SongUsageItem.usagedate <= deleteDate) self.manager.delete_all_objects(SongUsageItem, SongUsageItem.usagedate <= delete_date)
self.main_window.information_message( self.main_window.information_message(
translate('SongUsagePlugin.SongUsageDeleteForm', 'Deletion Successful'), translate('SongUsagePlugin.SongUsageDeleteForm', 'Deletion Successful'),
translate( translate(
'SongUsagePlugin.SongUsageDeleteForm', 'All requested data has been deleted successfully. ') 'SongUsagePlugin.SongUsageDeleteForm', 'All requested data has been deleted successfully.')
) )
self.accept() self.accept()
else: else:
@ -75,4 +74,4 @@ class SongUsageDeleteForm(QtGui.QDialog, Ui_SongUsageDeleteDialog):
self._main_window = Registry().get(u'main_window') self._main_window = Registry().get(u'main_window')
return self._main_window return self._main_window
main_window = property(_get_main_window) main_window = property(_get_main_window)

View File

@ -32,56 +32,56 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import build_icon, translate from openlp.core.lib import build_icon, translate
from openlp.core.lib.ui import create_button_box from openlp.core.lib.ui import create_button_box
class Ui_SongUsageDetailDialog(object):
def setupUi(self, songUsageDetailDialog):
songUsageDetailDialog.setObjectName(u'songUsageDetailDialog')
songUsageDetailDialog.resize(609, 413)
self.verticalLayout = QtGui.QVBoxLayout(songUsageDetailDialog)
self.verticalLayout.setSpacing(8)
self.verticalLayout.setContentsMargins(8, 8, 8, 8)
self.verticalLayout.setObjectName(u'verticalLayout')
self.dateRangeGroupBox = QtGui.QGroupBox(songUsageDetailDialog)
self.dateRangeGroupBox.setObjectName(u'dateRangeGroupBox')
self.dateHorizontalLayout = QtGui.QHBoxLayout(self.dateRangeGroupBox)
self.dateHorizontalLayout.setSpacing(8)
self.dateHorizontalLayout.setContentsMargins(8, 8, 8, 8)
self.dateHorizontalLayout.setObjectName(u'dateHorizontalLayout')
self.fromDate = QtGui.QCalendarWidget(self.dateRangeGroupBox)
self.fromDate.setObjectName(u'fromDate')
self.dateHorizontalLayout.addWidget(self.fromDate)
self.toLabel = QtGui.QLabel(self.dateRangeGroupBox)
self.toLabel.setScaledContents(False)
self.toLabel.setAlignment(QtCore.Qt.AlignCenter)
self.toLabel.setObjectName(u'toLabel')
self.dateHorizontalLayout.addWidget(self.toLabel)
self.toDate = QtGui.QCalendarWidget(self.dateRangeGroupBox)
self.toDate.setObjectName(u'toDate')
self.dateHorizontalLayout.addWidget(self.toDate)
self.verticalLayout.addWidget(self.dateRangeGroupBox)
self.fileGroupBox = QtGui.QGroupBox(self.dateRangeGroupBox)
self.fileGroupBox.setObjectName(u'fileGroupBox')
self.fileHorizontalLayout = QtGui.QHBoxLayout(self.fileGroupBox)
self.fileHorizontalLayout.setSpacing(8)
self.fileHorizontalLayout.setContentsMargins(8, 8, 8, 8)
self.fileHorizontalLayout.setObjectName(u'fileHorizontalLayout')
self.fileLineEdit = QtGui.QLineEdit(self.fileGroupBox)
self.fileLineEdit.setObjectName(u'fileLineEdit')
self.fileLineEdit.setReadOnly(True)
self.fileHorizontalLayout.addWidget(self.fileLineEdit)
self.saveFilePushButton = QtGui.QPushButton(self.fileGroupBox)
self.saveFilePushButton.setMaximumWidth(self.saveFilePushButton.size().height())
self.saveFilePushButton.setIcon(build_icon(u':/general/general_open.png'))
self.saveFilePushButton.setObjectName(u'saveFilePushButton')
self.fileHorizontalLayout.addWidget(self.saveFilePushButton)
self.verticalLayout.addWidget(self.fileGroupBox)
self.button_box = create_button_box(songUsageDetailDialog, u'button_box', [u'cancel', u'ok'])
self.verticalLayout.addWidget(self.button_box)
self.retranslateUi(songUsageDetailDialog)
QtCore.QObject.connect(self.saveFilePushButton, QtCore.SIGNAL(u'clicked()'),
songUsageDetailDialog.defineOutputLocation)
def retranslateUi(self, songUsageDetailDialog): class Ui_SongUsageDetailDialog(object):
songUsageDetailDialog.setWindowTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Song Usage Extraction')) def setupUi(self, song_usage_detail_dialog):
self.dateRangeGroupBox.setTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Select Date Range')) song_usage_detail_dialog.setObjectName(u'song_usage_detail_dialog')
self.toLabel.setText(translate('SongUsagePlugin.SongUsageDetailForm', 'to')) song_usage_detail_dialog.resize(609, 413)
self.fileGroupBox.setTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Report Location')) self.vertical_layout = QtGui.QVBoxLayout(song_usage_detail_dialog)
self.vertical_layout.setSpacing(8)
self.vertical_layout.setContentsMargins(8, 8, 8, 8)
self.vertical_layout.setObjectName(u'vertical_layout')
self.date_range_group_box = QtGui.QGroupBox(song_usage_detail_dialog)
self.date_range_group_box.setObjectName(u'date_range_group_box')
self.date_horizontal_layout = QtGui.QHBoxLayout(self.date_range_group_box)
self.date_horizontal_layout.setSpacing(8)
self.date_horizontal_layout.setContentsMargins(8, 8, 8, 8)
self.date_horizontal_layout.setObjectName(u'date_horizontal_layout')
self.from_date_calendar = QtGui.QCalendarWidget(self.date_range_group_box)
self.from_date_calendar.setObjectName(u'from_date_calendar')
self.date_horizontal_layout.addWidget(self.from_date_calendar)
self.to_label = QtGui.QLabel(self.date_range_group_box)
self.to_label.setScaledContents(False)
self.to_label.setAlignment(QtCore.Qt.AlignCenter)
self.to_label.setObjectName(u'to_label')
self.date_horizontal_layout.addWidget(self.to_label)
self.to_date_calendar = QtGui.QCalendarWidget(self.date_range_group_box)
self.to_date_calendar.setObjectName(u'to_date_calendar')
self.date_horizontal_layout.addWidget(self.to_date_calendar)
self.vertical_layout.addWidget(self.date_range_group_box)
self.file_group_box = QtGui.QGroupBox(self.date_range_group_box)
self.file_group_box.setObjectName(u'file_group_box')
self.file_horizontal_layout = QtGui.QHBoxLayout(self.file_group_box)
self.file_horizontal_layout.setSpacing(8)
self.file_horizontal_layout.setContentsMargins(8, 8, 8, 8)
self.file_horizontal_layout.setObjectName(u'file_horizontal_layout')
self.file_line_edit = QtGui.QLineEdit(self.file_group_box)
self.file_line_edit.setObjectName(u'file_line_edit')
self.file_line_edit.setReadOnly(True)
self.file_horizontal_layout.addWidget(self.file_line_edit)
self.save_file_push_button = QtGui.QPushButton(self.file_group_box)
self.save_file_push_button.setMaximumWidth(self.save_file_push_button.size().height())
self.save_file_push_button.setIcon(build_icon(u':/general/general_open.png'))
self.save_file_push_button.setObjectName(u'save_file_push_button')
self.file_horizontal_layout.addWidget(self.save_file_push_button)
self.vertical_layout.addWidget(self.file_group_box)
self.button_box = create_button_box(song_usage_detail_dialog, u'button_box', [u'cancel', u'ok'])
self.vertical_layout.addWidget(self.button_box)
self.retranslateUi(song_usage_detail_dialog)
self.save_file_push_button.clicked.connect(song_usage_detail_dialog.define_output_location)
def retranslateUi(self, song_usage_detail_dialog):
song_usage_detail_dialog.setWindowTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Song Usage Extraction'))
self.date_range_group_box.setTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Select Date Range'))
self.to_label.setText(translate('SongUsagePlugin.SongUsageDetailForm', 'to'))
self.file_group_box.setTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Report Location'))

View File

@ -39,6 +39,7 @@ from songusagedetaildialog import Ui_SongUsageDetailDialog
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog): class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog):
""" """
Class documentation goes here. Class documentation goes here.
@ -57,13 +58,11 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog):
""" """
We need to set up the screen We need to set up the screen
""" """
toDate = Settings().value(self.plugin.settingsSection + u'/to date') self.from_date_calendar.setSelectedDate(Settings().value(self.plugin.settingsSection + u'/from date'))
fromDate = Settings().value(self.plugin.settingsSection + u'/from date') self.to_date_calendar.setSelectedDate(Settings().value(self.plugin.settingsSection + u'/to date'))
self.fromDate.setSelectedDate(fromDate) self.file_line_edit.setText(Settings().value(self.plugin.settingsSection + u'/last directory export'))
self.toDate.setSelectedDate(toDate)
self.fileLineEdit.setText(Settings().value(self.plugin.settingsSection + u'/last directory export'))
def defineOutputLocation(self): def define_output_location(self):
""" """
Triggered when the Directory selection button is clicked Triggered when the Directory selection button is clicked
""" """
@ -72,14 +71,14 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog):
Settings().value(self.plugin.settingsSection + u'/last directory export')) Settings().value(self.plugin.settingsSection + u'/last directory export'))
if path: if path:
Settings().setValue(self.plugin.settingsSection + u'/last directory export', path) Settings().setValue(self.plugin.settingsSection + u'/last directory export', path)
self.fileLineEdit.setText(path) self.file_line_edit.setText(path)
def accept(self): def accept(self):
""" """
Ok was triggered so lets save the data and run the report Ok was triggered so lets save the data and run the report
""" """
log.debug(u'accept') log.debug(u'accept')
path = self.fileLineEdit.text() path = self.file_line_edit.text()
if not path: if not path:
self.main_window.error_message( self.main_window.error_message(
translate('SongUsagePlugin.SongUsageDetailForm', 'Output Path Not Selected'), translate('SongUsagePlugin.SongUsageDetailForm', 'Output Path Not Selected'),
@ -88,36 +87,36 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog):
) )
return return
check_directory_exists(path) check_directory_exists(path)
filename = translate('SongUsagePlugin.SongUsageDetailForm', 'usage_detail_%s_%s.txt') % ( file_name = translate('SongUsagePlugin.SongUsageDetailForm', 'usage_detail_%s_%s.txt') % (
self.fromDate.selectedDate().toString(u'ddMMyyyy'), self.from_date_calendar.selectedDate().toString(u'ddMMyyyy'),
self.toDate.selectedDate().toString(u'ddMMyyyy')) self.to_date_calendar.selectedDate().toString(u'ddMMyyyy'))
Settings().setValue(u'songusage/from date', self.fromDate.selectedDate()) Settings().setValue(self.plugin.settingsSection + u'/from date', self.from_date_calendar.selectedDate())
Settings().setValue(u'songusage/to date', self.toDate.selectedDate()) Settings().setValue(self.plugin.settingsSection + u'/to date', self.to_date_calendar.selectedDate())
usage = self.plugin.manager.get_all_objects( usage = self.plugin.manager.get_all_objects(
SongUsageItem, and_( SongUsageItem, and_(
SongUsageItem.usagedate >= self.fromDate.selectedDate().toPyDate(), SongUsageItem.usagedate >= self.from_date_calendar.selectedDate().toPyDate(),
SongUsageItem.usagedate < self.toDate.selectedDate().toPyDate()), SongUsageItem.usagedate < self.to_date_calendar.selectedDate().toPyDate()),
[SongUsageItem.usagedate, SongUsageItem.usagetime]) [SongUsageItem.usagedate, SongUsageItem.usagetime])
outname = os.path.join(path, filename) report_file_name = os.path.join(path, file_name)
fileHandle = None file_handle = None
try: try:
fileHandle = open(outname, u'w') file_handle = open(report_file_name, u'w')
for instance in usage: for instance in usage:
record = u'\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",' \ record = u'\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",' \
u'\"%s\",\"%s\"\n' % (instance.usagedate, u'\"%s\",\"%s\"\n' % (instance.usagedate,
instance.usagetime, instance.title, instance.copyright, instance.usagetime, instance.title, instance.copyright,
instance.ccl_number, instance.authors, instance.plugin_name, instance.source) instance.ccl_number, instance.authors, instance.plugin_name, instance.source)
fileHandle.write(record.encode(u'utf-8')) file_handle.write(record.encode(u'utf-8'))
self.main_window.information_message( self.main_window.information_message(
translate('SongUsagePlugin.SongUsageDetailForm', 'Report Creation'), translate('SongUsagePlugin.SongUsageDetailForm', 'Report Creation'),
translate('SongUsagePlugin.SongUsageDetailForm', 'Report \n%s \n' translate('SongUsagePlugin.SongUsageDetailForm', 'Report \n%s \n'
'has been successfully created. ') % outname 'has been successfully created. ') % report_file_name
) )
except IOError: except IOError:
log.exception(u'Failed to write out song usage records') log.exception(u'Failed to write out song usage records')
finally: finally:
if fileHandle: if file_handle:
fileHandle.close() file_handle.close()
self.close() self.close()
def _get_main_window(self): def _get_main_window(self):
@ -128,4 +127,4 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog):
self._main_window = Registry().get(u'main_window') self._main_window = Registry().get(u'main_window')
return self._main_window return self._main_window
main_window = property(_get_main_window) main_window = property(_get_main_window)

View File

@ -42,7 +42,6 @@ from openlp.plugins.songusage.lib.db import init_schema, SongUsageItem
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
YEAR = QtCore.QDate().currentDate().year() YEAR = QtCore.QDate().currentDate().year()
if QtCore.QDate().currentDate().month() < 9: if QtCore.QDate().currentDate().month() < 9:
YEAR -= 1 YEAR -= 1
@ -54,7 +53,7 @@ __default_settings__ = {
u'songusage/to date': QtCore.QDate(YEAR, 8, 31), u'songusage/to date': QtCore.QDate(YEAR, 8, 31),
u'songusage/from date': QtCore.QDate(YEAR - 1, 9, 1), u'songusage/from date': QtCore.QDate(YEAR - 1, 9, 1),
u'songusage/last directory export': u'' u'songusage/last directory export': u''
} }
class SongUsagePlugin(Plugin): class SongUsagePlugin(Plugin):
@ -67,7 +66,7 @@ class SongUsagePlugin(Plugin):
self.icon = build_icon(u':/plugins/plugin_songusage.png') self.icon = build_icon(u':/plugins/plugin_songusage.png')
self.activeIcon = build_icon(u':/songusage/song_usage_active.png') self.activeIcon = build_icon(u':/songusage/song_usage_active.png')
self.inactiveIcon = build_icon(u':/songusage/song_usage_inactive.png') self.inactiveIcon = build_icon(u':/songusage/song_usage_inactive.png')
self.songUsageActive = False self.song_usage_active = False
def checkPreConditions(self): def checkPreConditions(self):
return self.manager.session is not None return self.manager.session is not None
@ -83,59 +82,59 @@ class SongUsagePlugin(Plugin):
""" """
log.info(u'add tools menu') log.info(u'add tools menu')
self.toolsMenu = tools_menu self.toolsMenu = tools_menu
self.songUsageMenu = QtGui.QMenu(tools_menu) self.song_usage_menu = QtGui.QMenu(tools_menu)
self.songUsageMenu.setObjectName(u'songUsageMenu') self.song_usage_menu.setObjectName(u'song_usage_menu')
self.songUsageMenu.setTitle(translate('SongUsagePlugin', '&Song Usage Tracking')) self.song_usage_menu.setTitle(translate('SongUsagePlugin', '&Song Usage Tracking'))
# SongUsage Delete # SongUsage Delete
self.songUsageDelete = create_action(tools_menu, u'songUsageDelete', self.song_usage_delete = create_action(tools_menu, u'songUsageDelete',
text=translate('SongUsagePlugin', '&Delete Tracking Data'), text=translate('SongUsagePlugin', '&Delete Tracking Data'),
statustip=translate('SongUsagePlugin', 'Delete song usage data up to a specified date.'), statustip=translate('SongUsagePlugin', 'Delete song usage data up to a specified date.'),
triggers=self.onSongUsageDelete) triggers=self.on_song_usage_delete)
# SongUsage Report # SongUsage Report
self.songUsageReport = create_action(tools_menu, u'songUsageReport', self.song_usage_report = create_action(tools_menu, u'songUsageReport',
text=translate('SongUsagePlugin', '&Extract Tracking Data'), text=translate('SongUsagePlugin', '&Extract Tracking Data'),
statustip=translate('SongUsagePlugin', 'Generate a report on song usage.'), statustip=translate('SongUsagePlugin', 'Generate a report on song usage.'),
triggers=self.onSongUsageReport) triggers=self.on_song_usage_report)
# SongUsage activation # SongUsage activation
self.songUsageStatus = create_action(tools_menu, u'songUsageStatus', self.song_usage_status = create_action(tools_menu, u'songUsageStatus',
text=translate('SongUsagePlugin', 'Toggle Tracking'), text=translate('SongUsagePlugin', 'Toggle Tracking'),
statustip=translate('SongUsagePlugin', 'Toggle the tracking of song usage.'), checked=False, statustip=translate('SongUsagePlugin', 'Toggle the tracking of song usage.'), checked=False,
shortcuts=[QtCore.Qt.Key_F4], triggers=self.toggleSongUsageState) shortcuts=[QtCore.Qt.Key_F4], triggers=self.toggle_song_usage_state)
# Add Menus together # Add Menus together
self.toolsMenu.addAction(self.songUsageMenu.menuAction()) self.toolsMenu.addAction(self.song_usage_menu.menuAction())
self.songUsageMenu.addAction(self.songUsageStatus) self.song_usage_menu.addAction(self.song_usage_status)
self.songUsageMenu.addSeparator() self.song_usage_menu.addSeparator()
self.songUsageMenu.addAction(self.songUsageReport) self.song_usage_menu.addAction(self.song_usage_report)
self.songUsageMenu.addAction(self.songUsageDelete) self.song_usage_menu.addAction(self.song_usage_delete)
self.songUsageActiveButton = QtGui.QToolButton(self.main_window.statusBar) self.song_usage_active_button = QtGui.QToolButton(self.main_window.statusBar)
self.songUsageActiveButton.setCheckable(True) self.song_usage_active_button.setCheckable(True)
self.songUsageActiveButton.setAutoRaise(True) self.song_usage_active_button.setAutoRaise(True)
self.songUsageActiveButton.setStatusTip(translate('SongUsagePlugin', 'Toggle the tracking of song usage.')) self.song_usage_active_button.setStatusTip(translate('SongUsagePlugin', 'Toggle the tracking of song usage.'))
self.songUsageActiveButton.setObjectName(u'songUsageActiveButton') self.song_usage_active_button.setObjectName(u'song_usage_active_button')
self.main_window.statusBar.insertPermanentWidget(1, self.songUsageActiveButton) self.main_window.statusBar.insertPermanentWidget(1, self.song_usage_active_button)
self.songUsageActiveButton.hide() self.song_usage_active_button.hide()
# Signals and slots # Signals and slots
QtCore.QObject.connect(self.songUsageStatus, QtCore.SIGNAL(u'visibilityChanged(bool)'), QtCore.QObject.connect(self.song_usage_status, QtCore.SIGNAL(u'visibilityChanged(bool)'),
self.songUsageStatus.setChecked) self.song_usage_status.setChecked)
QtCore.QObject.connect(self.songUsageActiveButton, QtCore.SIGNAL(u'toggled(bool)'), self.toggleSongUsageState) self.song_usage_active_button.toggled.connect(self.toggle_song_usage_state)
self.songUsageMenu.menuAction().setVisible(False) self.song_usage_menu.menuAction().setVisible(False)
def initialise(self): def initialise(self):
log.info(u'SongUsage Initialising') log.info(u'SongUsage Initialising')
Plugin.initialise(self) Plugin.initialise(self)
Registry().register_function(u'slidecontroller_live_started', self.display_song_usage) Registry().register_function(u'slidecontroller_live_started', self.display_song_usage)
Registry().register_function(u'print_service_started', self.print_song_usage) Registry().register_function(u'print_service_started', self.print_song_usage)
self.songUsageActive = Settings().value(self.settingsSection + u'/active') self.song_usage_active = Settings().value(self.settingsSection + u'/active')
# Set the button and checkbox state # Set the button and checkbox state
self.setButtonState() self.set_button_state()
action_list = ActionList.get_instance() action_list = ActionList.get_instance()
action_list.add_action(self.songUsageStatus, translate('SongUsagePlugin', 'Song Usage')) action_list.add_action(self.song_usage_status, translate('SongUsagePlugin', 'Song Usage'))
action_list.add_action(self.songUsageDelete, translate('SongUsagePlugin', 'Song Usage')) action_list.add_action(self.song_usage_delete, translate('SongUsagePlugin', 'Song Usage'))
action_list.add_action(self.songUsageReport, translate('SongUsagePlugin', 'Song Usage')) action_list.add_action(self.song_usage_report, translate('SongUsagePlugin', 'Song Usage'))
self.songUsageDeleteForm = SongUsageDeleteForm(self.manager, self.main_window) self.song_usage_delete_form = SongUsageDeleteForm(self.manager, self.main_window)
self.songUsageDetailForm = SongUsageDetailForm(self, self.main_window) self.song_usage_detail_form = SongUsageDetailForm(self, self.main_window)
self.songUsageMenu.menuAction().setVisible(True) self.song_usage_menu.menuAction().setVisible(True)
self.songUsageActiveButton.show() self.song_usage_active_button.show()
def finalise(self): def finalise(self):
""" """
@ -144,44 +143,43 @@ class SongUsagePlugin(Plugin):
log.info(u'Plugin Finalise') log.info(u'Plugin Finalise')
self.manager.finalise() self.manager.finalise()
Plugin.finalise(self) Plugin.finalise(self)
self.songUsageMenu.menuAction().setVisible(False) self.song_usage_menu.menuAction().setVisible(False)
action_list = ActionList.get_instance() action_list = ActionList.get_instance()
action_list.remove_action(self.songUsageStatus, translate('SongUsagePlugin', 'Song Usage')) action_list.remove_action(self.song_usage_status, translate('SongUsagePlugin', 'Song Usage'))
action_list.remove_action(self.songUsageDelete, translate('SongUsagePlugin', 'Song Usage')) action_list.remove_action(self.song_usage_delete, translate('SongUsagePlugin', 'Song Usage'))
action_list.remove_action(self.songUsageReport, translate('SongUsagePlugin', 'Song Usage')) action_list.remove_action(self.song_usage_report, translate('SongUsagePlugin', 'Song Usage'))
self.songUsageActiveButton.hide() self.song_usage_active_button.hide()
# stop any events being processed # stop any events being processed
self.songUsageActive = False self.song_usage_active = False
def toggleSongUsageState(self): def toggle_song_usage_state(self):
""" """
Manage the state of the audit collection and amend Manage the state of the audit collection and amend
the UI when necessary, the UI when necessary,
""" """
self.songUsageActive = not self.songUsageActive self.song_usage_active = not self.song_usage_active
Settings().setValue(self.settingsSection + u'/active', self.songUsageActive) Settings().setValue(self.settingsSection + u'/active', self.song_usage_active)
self.setButtonState() self.set_button_state()
def setButtonState(self): def set_button_state(self):
""" """
Keep buttons inline. Turn of signals to stop dead loop but we need the Keep buttons inline. Turn of signals to stop dead loop but we need the
button and check box set correctly. button and check box set correctly.
""" """
self.songUsageActiveButton.blockSignals(True) self.song_usage_active_button.blockSignals(True)
self.songUsageStatus.blockSignals(True) self.song_usage_status.blockSignals(True)
if self.songUsageActive: if self.song_usage_active:
self.songUsageActiveButton.setIcon(self.activeIcon) self.song_usage_active_button.setIcon(self.activeIcon)
self.songUsageStatus.setChecked(True) self.song_usage_status.setChecked(True)
self.songUsageActiveButton.setChecked(True) self.song_usage_active_button.setChecked(True)
self.songUsageActiveButton.setToolTip(translate('SongUsagePlugin', 'Song usage tracking is active.')) self.song_usage_active_button.setToolTip(translate('SongUsagePlugin', 'Song usage tracking is active.'))
else: else:
self.songUsageActiveButton.setIcon(self.inactiveIcon) self.song_usage_active_button.setIcon(self.inactiveIcon)
self.songUsageStatus.setChecked(False) self.song_usage_status.setChecked(False)
self.songUsageActiveButton.setChecked(False) self.song_usage_active_button.setChecked(False)
self.songUsageActiveButton.setToolTip(translate('SongUsagePlugin', 'Song usage tracking is inactive.')) self.song_usage_active_button.setToolTip(translate('SongUsagePlugin', 'Song usage tracking is inactive.'))
self.songUsageActiveButton.blockSignals(False) self.song_usage_active_button.blockSignals(False)
self.songUsageStatus.blockSignals(False) self.song_usage_status.blockSignals(False)
def display_song_usage(self, item): def display_song_usage(self, item):
""" """
@ -197,7 +195,7 @@ class SongUsagePlugin(Plugin):
def _add_song_usage(self, source, item): def _add_song_usage(self, source, item):
audit = item[0].audit audit = item[0].audit
if self.songUsageActive and audit: if self.song_usage_active and audit:
song_usage_item = SongUsageItem() song_usage_item = SongUsageItem()
song_usage_item.usagedate = datetime.today() song_usage_item.usagedate = datetime.today()
song_usage_item.usagetime = datetime.now().time() song_usage_item.usagetime = datetime.now().time()
@ -209,12 +207,12 @@ class SongUsagePlugin(Plugin):
song_usage_item.source = source song_usage_item.source = source
self.manager.save_object(song_usage_item) self.manager.save_object(song_usage_item)
def onSongUsageDelete(self): def on_song_usage_delete(self):
self.songUsageDeleteForm.exec_() self.song_usage_delete_form.exec_()
def onSongUsageReport(self): def on_song_usage_report(self):
self.songUsageDetailForm.initialise() self.song_usage_detail_form.initialise()
self.songUsageDetailForm.exec_() self.song_usage_detail_form.exec_()
def about(self): def about(self):
about_text = translate('SongUsagePlugin', '<strong>SongUsage Plugin' about_text = translate('SongUsagePlugin', '<strong>SongUsage Plugin'

View File

@ -50,7 +50,7 @@ class TestFormattingTags(TestCase):
def get_html_tags_with_user_tags_test(self): def get_html_tags_with_user_tags_test(self):
""" """
Test the FormattingTags class' get_html_tags static method in combination with user tags. FormattingTags class - test the get_html_tags(), add_html_tags() and remove_html_tag() methods.
""" """
with patch(u'openlp.core.lib.translate') as mocked_translate, \ with patch(u'openlp.core.lib.translate') as mocked_translate, \
patch(u'openlp.core.lib.settings') as mocked_settings, \ patch(u'openlp.core.lib.settings') as mocked_settings, \
@ -67,7 +67,7 @@ class TestFormattingTags(TestCase):
# WHEN: Add our tag and get the tags again. # WHEN: Add our tag and get the tags again.
FormattingTags.load_tags() FormattingTags.load_tags()
FormattingTags.add_html_tags([TAG]) FormattingTags.add_html_tags([TAG])
new_tags_list = FormattingTags.get_html_tags() new_tags_list = copy.deepcopy(FormattingTags.get_html_tags())
# THEN: Lists should not be identically. # THEN: Lists should not be identically.
assert old_tags_list != new_tags_list, u'The lists should be different.' assert old_tags_list != new_tags_list, u'The lists should be different.'
@ -76,3 +76,9 @@ class TestFormattingTags(TestCase):
new_tag = new_tags_list.pop() new_tag = new_tags_list.pop()
assert TAG == new_tag, u'Tags should be identically.' assert TAG == new_tag, u'Tags should be identically.'
# WHEN: Remove the new tag.
FormattingTags.remove_html_tag(len(new_tags_list))
# THEN: The lists should now be identically.
assert old_tags_list == FormattingTags.get_html_tags(), u'The lists should be identically.'

View File

@ -28,7 +28,7 @@ class TestPluginManager(TestCase):
# GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Disabled # GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Disabled
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled mocked_plugin.status = PluginStatus.Disabled
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_media_manager() # WHEN: We run hook_media_manager()
@ -45,7 +45,7 @@ class TestPluginManager(TestCase):
# GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Active # GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Active
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active mocked_plugin.status = PluginStatus.Active
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_media_manager() # WHEN: We run hook_media_manager()
@ -61,7 +61,7 @@ class TestPluginManager(TestCase):
# GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Disabled # GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Disabled
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled mocked_plugin.status = PluginStatus.Disabled
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_settings_tabs() # WHEN: We run hook_settings_tabs()
@ -79,7 +79,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled mocked_plugin.status = PluginStatus.Disabled
mocked_settings_form = MagicMock() mocked_settings_form = MagicMock()
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_settings_tabs() # WHEN: We run hook_settings_tabs()
@ -98,7 +98,7 @@ class TestPluginManager(TestCase):
# GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Active # GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Active
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active mocked_plugin.status = PluginStatus.Active
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_settings_tabs() # WHEN: We run hook_settings_tabs()
@ -115,7 +115,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active mocked_plugin.status = PluginStatus.Active
mocked_settings_form = MagicMock() mocked_settings_form = MagicMock()
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_settings_tabs() # WHEN: We run hook_settings_tabs()
@ -134,7 +134,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled mocked_plugin.status = PluginStatus.Disabled
mocked_import_menu = MagicMock() mocked_import_menu = MagicMock()
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_import_menu() # WHEN: We run hook_import_menu()
@ -152,7 +152,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active mocked_plugin.status = PluginStatus.Active
mocked_import_menu = MagicMock() mocked_import_menu = MagicMock()
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_import_menu() # WHEN: We run hook_import_menu()
@ -169,7 +169,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled mocked_plugin.status = PluginStatus.Disabled
mocked_export_menu = MagicMock() mocked_export_menu = MagicMock()
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_export_menu() # WHEN: We run hook_export_menu()
@ -187,7 +187,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active mocked_plugin.status = PluginStatus.Active
mocked_export_menu = MagicMock() mocked_export_menu = MagicMock()
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_export_menu() # WHEN: We run hook_export_menu()
@ -204,7 +204,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled mocked_plugin.status = PluginStatus.Disabled
mocked_tools_menu = MagicMock() mocked_tools_menu = MagicMock()
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_tools_menu() # WHEN: We run hook_tools_menu()
@ -222,7 +222,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active mocked_plugin.status = PluginStatus.Active
mocked_tools_menu = MagicMock() mocked_tools_menu = MagicMock()
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_tools_menu() # WHEN: We run hook_tools_menu()
@ -239,7 +239,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled mocked_plugin.status = PluginStatus.Disabled
mocked_plugin.isActive.return_value = False mocked_plugin.isActive.return_value = False
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run initialise_plugins() # WHEN: We run initialise_plugins()
@ -257,7 +257,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active mocked_plugin.status = PluginStatus.Active
mocked_plugin.isActive.return_value = True mocked_plugin.isActive.return_value = True
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run initialise_plugins() # WHEN: We run initialise_plugins()
@ -275,7 +275,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled mocked_plugin.status = PluginStatus.Disabled
mocked_plugin.isActive.return_value = False mocked_plugin.isActive.return_value = False
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run finalise_plugins() # WHEN: We run finalise_plugins()
@ -293,7 +293,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active mocked_plugin.status = PluginStatus.Active
mocked_plugin.isActive.return_value = True mocked_plugin.isActive.return_value = True
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run finalise_plugins() # WHEN: We run finalise_plugins()
@ -310,7 +310,7 @@ class TestPluginManager(TestCase):
# GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Active # GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Active
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.name = 'Mocked Plugin' mocked_plugin.name = 'Mocked Plugin'
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run finalise_plugins() # WHEN: We run finalise_plugins()
@ -326,7 +326,7 @@ class TestPluginManager(TestCase):
# GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Active # GIVEN: A PluginManager instance and a list with a mocked up plugin whose status is set to Active
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.name = 'Mocked Plugin' mocked_plugin.name = 'Mocked Plugin'
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run finalise_plugins() # WHEN: We run finalise_plugins()
@ -343,7 +343,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled mocked_plugin.status = PluginStatus.Disabled
mocked_plugin.isActive.return_value = False mocked_plugin.isActive.return_value = False
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run finalise_plugins() # WHEN: We run finalise_plugins()
@ -362,7 +362,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock() mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active mocked_plugin.status = PluginStatus.Active
mocked_plugin.isActive.return_value = True mocked_plugin.isActive.return_value = True
plugin_manager = PluginManager('') plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin] plugin_manager.plugins = [mocked_plugin]
# WHEN: We run new_service_created() # WHEN: We run new_service_created()

View File

@ -0,0 +1,93 @@
"""
Package to test the openlp.core.lib.settings package.
"""
import os
from unittest import TestCase
from tempfile import mkstemp
from openlp.core.lib import Settings
from PyQt4 import QtGui
class TestSettings(TestCase):
def setUp(self):
"""
Create the UI
"""
fd, self.ini_file = mkstemp(u'.ini')
Settings().set_filename(self.ini_file)
self.application = QtGui.QApplication.instance()
def tearDown(self):
"""
Delete all the C++ objects at the end so that we don't have a segfault
"""
del self.application
os.unlink(self.ini_file)
os.unlink(Settings().fileName())
def settings_basic_test(self):
"""
Test the Settings creation and its default usage
"""
# GIVEN: A new Settings setup
# WHEN reading a setting for the first time
default_value = Settings().value(u'general/has run wizard')
# THEN the default value is returned
assert default_value is False, u'The default value should be False'
# WHEN a new value is saved into config
Settings().setValue(u'general/has run wizard', True)
# THEN the new value is returned when re-read
assert Settings().value(u'general/has run wizard') is True, u'The saved value should have been returned'
def settings_override_test(self):
"""
Test the Settings creation and its override usage
"""
# GIVEN: an override for the settings
screen_settings = {
u'test/extend': u'very wide',
}
Settings().extend_default_settings(screen_settings)
# WHEN reading a setting for the first time
extend = Settings().value(u'test/extend')
# THEN the default value is returned
assert extend == u'very wide', u'The default value of "very wide" should be returned'
# WHEN a new value is saved into config
Settings().setValue(u'test/extend', u'very short')
# THEN the new value is returned when re-read
assert Settings().value(u'test/extend') == u'very short', u'The saved value should be returned'
def settings_override_with_group_test(self):
"""
Test the Settings creation and its override usage - with groups
"""
# GIVEN: an override for the settings
screen_settings = {
u'test/extend': u'very wide',
}
Settings.extend_default_settings(screen_settings)
# WHEN reading a setting for the first time
settings = Settings()
settings.beginGroup(u'test')
extend = settings.value(u'extend')
# THEN the default value is returned
assert extend == u'very wide', u'The default value defined should be returned'
# WHEN a new value is saved into config
Settings().setValue(u'test/extend', u'very short')
# THEN the new value is returned when re-read
assert Settings().value(u'test/extend') == u'very short', u'The saved value should be returned'

View File

@ -29,7 +29,6 @@ class TestPluginManager(TestCase):
self.app = QtGui.QApplication.instance() self.app = QtGui.QApplication.instance()
self.main_window = QtGui.QMainWindow() self.main_window = QtGui.QMainWindow()
Registry().register(u'main_window', self.main_window) Registry().register(u'main_window', self.main_window)
self.plugins_dir = os.path.abspath(os.path.join(os.path.basename(__file__), u'..', u'openlp', u'plugins'))
def tearDown(self): def tearDown(self):
os.unlink(self.ini_file) os.unlink(self.ini_file)
@ -41,7 +40,7 @@ class TestPluginManager(TestCase):
Test the find_plugins() method to ensure it imports the correct plugins. Test the find_plugins() method to ensure it imports the correct plugins.
""" """
# GIVEN: A plugin manager # GIVEN: A plugin manager
plugin_manager = PluginManager(self.plugins_dir) plugin_manager = PluginManager()
# WHEN: We mock out sys.platform to make it return "darwin" and then find the plugins # WHEN: We mock out sys.platform to make it return "darwin" and then find the plugins
old_platform = sys.platform old_platform = sys.platform