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
from openlp.core.lib import Plugin, PluginStatus, Registry
from openlp.core.utils import AppLocation
log = logging.getLogger(__name__)
@ -46,17 +47,14 @@ class PluginManager(object):
"""
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 plugins for them to interact with via their ServiceItems.
``plugin_dir``
The directory to search for plugins.
"""
log.info(u'Plugin manager Initialising')
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)
self.plugins = []
log.info(u'Plugin manager Initialised')

View File

@ -36,9 +36,8 @@ import sys
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 import UiStrings
log = logging.getLogger(__name__)
@ -70,7 +69,8 @@ class Settings(QtCore.QSettings):
``__obsolete_settings__``
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.
@ -260,7 +260,6 @@ class Settings(QtCore.QSettings):
"""
Settings.__default_settings__ = dict(default_values.items() + Settings.__default_settings__.items())
@staticmethod
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)
else:
button_box.addButton(*button)
QtCore.QObject.connect(button_box, QtCore.SIGNAL(u'accepted()'), dialog.accept)
QtCore.QObject.connect(button_box, QtCore.SIGNAL(u'rejected()'), dialog.reject)
button_box.accepted.connect(dialog.accept)
button_box.rejected.connect(dialog.reject)
return button_box
@ -211,7 +211,7 @@ def create_button(parent, name, **kwargs):
if not kwargs.pop(u'enabled', True):
button.setEnabled(False)
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():
if key not in [u'text', u'icon', u'tooltip', u'click']:
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.add_action(action, unicode(kwargs.pop(u'category')))
if kwargs.get(u'triggers'):
QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered(bool)'),
kwargs.pop(u'triggers'))
action.triggered.connect(kwargs.pop(u'triggers'))
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']:
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)
self.setupUi(self)
self.settingsSection = u'crashreport'
self.settings_section = u'crashreport'
def exec_(self):
"""
@ -159,12 +159,11 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog):
'--- Library Versions ---\n%s\n')
filename = QtGui.QFileDialog.getSaveFileName(self,
translate('OpenLP.ExceptionForm', 'Save Crash Report'),
Settings().value(self.settingsSection + u'/last directory'),
translate('OpenLP.ExceptionForm',
'Text files (*.txt *.log *.text)'))
Settings().value(self.settings_section + u'/last directory'),
translate('OpenLP.ExceptionForm', 'Text files (*.txt *.log *.text)'))
if filename:
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()
try:
report_file = open(filename, u'w')
@ -230,7 +229,7 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog):
"""
files = QtGui.QFileDialog.getOpenFileName(
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))
if files:
self.fileAttachment = unicode(files)

View File

@ -297,7 +297,7 @@ class MainDisplay(Display):
self.image(path)
# Update the preview frame.
if self.is_live:
self.parent().updatePreview()
self.live_controller.updatePreview()
return True
def image(self, path):
@ -508,6 +508,16 @@ class MainDisplay(Display):
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):
"""

View File

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

View File

@ -142,8 +142,7 @@ class ServiceManagerDialog(object):
self.service_manager_list.setHeaderHidden(True)
self.service_manager_list.setExpandsOnDoubleClick(False)
self.service_manager_list.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
QtCore.QObject.connect(self.service_manager_list, QtCore.SIGNAL('customContextMenuRequested(QPoint)'),
self.context_menu)
self.service_manager_list.customContextMenuRequested.connect(self.context_menu)
self.service_manager_list.setObjectName(u'service_manager_list')
# enable drop
self.service_manager_list.__class__.dragEnterEvent = self.drag_enter_event
@ -202,18 +201,10 @@ class ServiceManagerDialog(object):
triggers=self.make_live)
self.layout.addWidget(self.order_toolbar)
# Connect up our signals and slots
QtCore.QObject.connect(self.theme_combo_box, QtCore.SIGNAL(u'activated(int)'),
self.on_theme_combo_box_selected)
QtCore.QObject.connect(self.service_manager_list, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'),
self.on_make_live)
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)
self.theme_combo_box.activated.connect(self.on_theme_combo_box_selected)
self.service_manager_list.doubleClicked.connect(self.on_make_live)
self.service_manager_list.itemCollapsed.connect(self.collapsed)
self.service_manager_list.itemExpanded.connect(self.expanded)
# Last little bits of setting up
self.service_theme = Settings().value(self.main_window.serviceManagerSettingsSection + u'/service theme')
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.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):
"""

View File

@ -230,7 +230,7 @@ class SlideController(DisplayController):
self.play_slides_once = create_action(self, u'playSlidesOnce', text=UiStrings().PlaySlidesToEnd,
icon=u':/media/media_time.png', checked=False, shortcuts=[],
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)
else:
self.play_slides_menu.setDefaultAction(self.play_slides_once)
@ -293,6 +293,7 @@ class SlideController(DisplayController):
self.audioTimeLabel.setObjectName(u'audioTimeLabel')
self.toolbar.addToolbarWidget(self.audioTimeLabel)
self.toolbar.setWidgetVisible(self.audio_list, False)
self.toolbar.setWidgetVisible([u'songMenu'], False)
# Screen preview area
self.preview_frame = QtGui.QFrame(self.splitter)
self.preview_frame.setGeometry(QtCore.QRect(0, 0, 300, 300 * self.ratio))
@ -581,7 +582,7 @@ class SlideController(DisplayController):
self.preview_list_widget.resizeRowsToContents()
else:
# 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())):
self.preview_list_widget.setRowHeight(framenumber, width / self.ratio)
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
"""
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.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.hide_menu_list)
@ -617,7 +622,7 @@ class SlideController(DisplayController):
"""
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):
"""
@ -639,14 +644,15 @@ class SlideController(DisplayController):
self.mediabar.hide()
self.song_menu.hide()
self.toolbar.setWidgetVisible(self.loop_list, False)
self.toolbar.setWidgetVisible([u'songMenu'], False)
# Reset the button
self.play_slides_once.setChecked(False)
self.play_slides_once.setIcon(build_icon(u':/media/media_time.png'))
self.play_slides_loop.setChecked(False)
self.play_slides_loop.setIcon(build_icon(u':/media/media_time.png'))
if item.is_text():
if Settings().value(self.parent().songsSettingsSection + u'/display songbar') and self.slideList:
self.song_menu.show()
if Settings().value(self.main_window.songsSettingsSection + u'/display songbar') and self.slideList:
self.toolbar.setWidgetVisible([u'songMenu'], True)
if item.is_capable(ItemCapabilities.CanLoop) and len(item.get_frames()) > 1:
self.toolbar.setWidgetVisible(self.loop_list)
if item.is_media():
@ -747,7 +753,7 @@ class SlideController(DisplayController):
self._resetBlank()
Registry().execute(u'%s_start' % service_item.name.lower(), [service_item, self.is_live, self.hide_mode(), slideno])
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.setRowCount(0)
self.preview_list_widget.setColumnWidth(0, width)
@ -766,8 +772,8 @@ class SlideController(DisplayController):
action.setData(counter)
QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered(bool)'), self.onTrackTriggered)
self.display.audioPlayer.repeat = Settings().value(
self.parent().generalSettingsSection + u'/audio repeat list')
if Settings().value(self.parent().generalSettingsSection + u'/audio start paused'):
self.main_window.generalSettingsSection + u'/audio repeat list')
if Settings().value(self.main_window.generalSettingsSection + u'/audio start paused'):
self.audioPauseItem.setChecked(True)
self.display.audioPlayer.pause()
else:
@ -875,7 +881,7 @@ class SlideController(DisplayController):
Allow the main display to blank the main display at startup time
"""
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):
# Order done to handle initial conversion
if display_type == u'themed':
@ -913,9 +919,9 @@ class SlideController(DisplayController):
self.theme_screen.setChecked(False)
self.desktop_screen.setChecked(False)
if checked:
Settings().setValue(self.parent().generalSettingsSection + u'/screen blank', u'blanked')
Settings().setValue(self.main_window.generalSettingsSection + u'/screen blank', u'blanked')
else:
Settings().remove(self.parent().generalSettingsSection + u'/screen blank')
Settings().remove(self.main_window.generalSettingsSection + u'/screen blank')
self.blankPlugin()
self.updatePreview()
self.onToggleLoop()
@ -932,9 +938,9 @@ class SlideController(DisplayController):
self.theme_screen.setChecked(checked)
self.desktop_screen.setChecked(False)
if checked:
Settings().setValue(self.parent().generalSettingsSection + u'/screen blank', u'themed')
Settings().setValue(self.main_window.generalSettingsSection + u'/screen blank', u'themed')
else:
Settings().remove(self.parent().generalSettingsSection + u'/screen blank')
Settings().remove(self.main_window.generalSettingsSection + u'/screen blank')
self.blankPlugin()
self.updatePreview()
self.onToggleLoop()
@ -951,9 +957,9 @@ class SlideController(DisplayController):
self.theme_screen.setChecked(False)
self.desktop_screen.setChecked(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:
Settings().remove(self.parent().generalSettingsSection + u'/screen blank')
Settings().remove(self.main_window.generalSettingsSection + u'/screen blank')
self.hidePlugin(checked)
self.updatePreview()
self.onToggleLoop()
@ -1253,7 +1259,7 @@ class SlideController(DisplayController):
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()
if -1 < row < self.preview_list_widget.rowCount():
@ -1382,3 +1388,14 @@ class SlideController(DisplayController):
return self._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.setObjectName(u'theme_list_widget')
self.layout.addWidget(self.theme_list_widget)
QtCore.QObject.connect(self.theme_list_widget, QtCore.SIGNAL('customContextMenuRequested(QPoint)'),
self.context_menu)
self.theme_list_widget.customContextMenuRequested.connect(self.context_menu)
# build the context menu
self.menu = QtGui.QMenu()
self.edit_action = create_widget_action(self.menu,
@ -130,10 +129,8 @@ class ThemeManager(QtGui.QWidget):
text=translate('OpenLP.ThemeManager', '&Export Theme'),
icon=u':/general/general_export.png', triggers=self.on_export_theme)
# Signals
QtCore.QObject.connect(self.theme_list_widget,
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.change_global_from_screen)
QtCore.QObject.connect(self.theme_list_widget,
QtCore.SIGNAL(u'currentItemChanged(QListWidgetItem *, QListWidgetItem *)'), self.check_list_state)
self.theme_list_widget.doubleClicked.connect(self.change_global_from_screen)
self.theme_list_widget.currentItemChanged.connect(self.check_list_state)
Registry().register_function(u'theme_update_global', self.change_global_from_tab)
Registry().register_function(u'config_updated', self.config_updated)
# Variables
@ -160,7 +157,6 @@ class ThemeManager(QtGui.QWidget):
delete_file(theme_file)
self.application.set_normal_cursor()
def config_updated(self):
"""
Triggered when Config dialog is updated.

View File

@ -122,7 +122,7 @@ __default_settings__ = {
u'alerts/background color': u'#660000',
u'alerts/font color': u'#ffffff',
u'alerts/timeout': 5
}
}
class AlertsPlugin(Plugin):
@ -133,7 +133,7 @@ class AlertsPlugin(Plugin):
self.weight = -3
self.iconPath = u':/plugins/plugin_alerts.png'
self.icon = build_icon(self.iconPath)
self.alertsmanager = AlertsManager(self)
self.alerts_manager = AlertsManager(self)
self.manager = Manager(u'alerts', init_schema)
self.alertForm = AlertForm(self)
@ -176,7 +176,7 @@ class AlertsPlugin(Plugin):
Settings().setValue(self.settingsSection + u'/active', self.alertsActive)
def onAlertsTrigger(self):
self.alertForm.loadList()
self.alertForm.load_list()
self.alertForm.exec_()
def about(self):
@ -194,7 +194,8 @@ class AlertsPlugin(Plugin):
u'plural': translate('AlertsPlugin', 'Alerts', 'name plural')
}
## 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):

View File

@ -32,61 +32,63 @@ from PyQt4 import QtGui
from openlp.core.lib import build_icon, translate
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):
alertDialog.setWindowTitle(translate('AlertsPlugin.AlertForm', 'Alert Message'))
self.alertEntryLabel.setText(translate('AlertsPlugin.AlertForm', 'Alert &text:'))
self.alertParameter.setText(translate('AlertsPlugin.AlertForm', '&Parameter:'))
self.newButton.setText(translate('AlertsPlugin.AlertForm', '&New'))
self.saveButton.setText(translate('AlertsPlugin.AlertForm', '&Save'))
self.displayButton.setText(translate('AlertsPlugin.AlertForm', 'Displ&ay'))
self.displayCloseButton.setText(translate('AlertsPlugin.AlertForm', 'Display && Cl&ose'))
class Ui_AlertDialog(object):
def setupUi(self, alert_dialog):
alert_dialog.setObjectName(u'alert_dialog')
alert_dialog.resize(400, 300)
alert_dialog.setWindowIcon(build_icon(u':/icon/openlp-logo-16x16.png'))
self.alert_dialog_layout = QtGui.QGridLayout(alert_dialog)
self.alert_dialog_layout.setObjectName(u'alert_dialog_layout')
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
super(AlertForm, self).__init__(self.plugin.main_window)
self.setupUi(self)
QtCore.QObject.connect(self.displayButton, QtCore.SIGNAL(u'clicked()'), self.onDisplayClicked)
QtCore.QObject.connect(self.displayCloseButton, QtCore.SIGNAL(u'clicked()'), self.onDisplayCloseClicked)
QtCore.QObject.connect(self.alertTextEdit, QtCore.SIGNAL(u'textChanged(const QString&)'), self.onTextChanged)
QtCore.QObject.connect(self.newButton, QtCore.SIGNAL(u'clicked()'), self.onNewClick)
QtCore.QObject.connect(self.saveButton, QtCore.SIGNAL(u'clicked()'), self.onSaveClick)
QtCore.QObject.connect(self.alertListWidget, QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onDoubleClick)
QtCore.QObject.connect(self.alertListWidget, QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSingleClick)
QtCore.QObject.connect(self.alertListWidget, QtCore.SIGNAL(u'currentRowChanged(int)'), self.onCurrentRowChanged)
self.display_button.clicked.connect(self.on_display_clicked)
self.display_close_button.clicked.connect(self.on_display_close_clicked)
self.alert_text_edit.textChanged.connect(self.on_text_changed)
self.new_button.clicked.connect(self.on_new_click)
self.save_button.clicked.connect(self.on_save_all)
self.alert_list_widget.doubleClicked.connect(self.on_double_click)
self.alert_list_widget.clicked.connect(self.on_single_click)
self.alert_list_widget.currentRowChanged.connect(self.on_current_row_changed)
def exec_(self):
"""
Execute the dialog and return the exit code.
"""
self.displayButton.setEnabled(False)
self.displayCloseButton.setEnabled(False)
self.alertTextEdit.setText(u'')
self.display_button.setEnabled(False)
self.display_close_button.setEnabled(False)
self.alert_text_edit.setText(u'')
return QtGui.QDialog.exec_(self)
def loadList(self):
def load_list(self):
"""
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)
for alert in alerts:
item_name = QtGui.QListWidgetItem(alert.text)
item_name.setData(QtCore.Qt.UserRole, alert.id)
self.alertListWidget.addItem(item_name)
if alert.text == unicode(self.alertTextEdit.text()):
self.alert_list_widget.addItem(item_name)
if alert.text == unicode(self.alert_text_edit.text()):
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.
"""
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.
"""
if self.triggerAlert(self.alertTextEdit.text()):
if self.trigger_alert(self.alert_text_edit.text()):
self.close()
def onDeleteButtonClicked(self):
"""
Deletes the selected item.
"""
item = self.alertListWidget.currentItem()
item = self.alert_list_widget.currentItem()
if item:
item_id = item.data(QtCore.Qt.UserRole)
self.manager.delete_object(AlertItem, item_id)
row = self.alertListWidget.row(item)
self.alertListWidget.takeItem(row)
row = self.alert_list_widget.row(item)
self.alert_list_widget.takeItem(row)
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.
"""
if not self.alertTextEdit.text():
if not self.alert_text_edit.text():
QtGui.QMessageBox.information(self,
translate('AlertsPlugin.AlertForm', 'New Alert'),
translate('AlertsPlugin.AlertForm', 'You haven\'t specified any text for your alert. \n'
'Please type in some text before clicking New.'))
else:
alert = AlertItem()
alert.text = self.alertTextEdit.text()
alert.text = self.alert_text_edit.text()
self.manager.save_object(alert)
self.loadList()
self.load_list()
def onSaveClick(self):
def on_save_all(self):
"""
Save the alert, we are editing.
"""
if 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.item_id = None
self.loadList()
self.saveButton.setEnabled(False)
self.load_list()
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.
"""
# Only enable the button, if we are editing an item.
if self.item_id:
self.saveButton.setEnabled(True)
if self.alertTextEdit.text():
self.displayButton.setEnabled(True)
self.displayCloseButton.setEnabled(True)
self.save_button.setEnabled(True)
if self.alert_text_edit.text():
self.display_button.setEnabled(True)
self.display_close_button.setEnabled(True)
else:
self.displayButton.setEnabled(False)
self.displayCloseButton.setEnabled(False)
self.display_button.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.
"""
item = self.alertListWidget.selectedIndexes()[0]
bitem = self.alertListWidget.item(item.row())
self.triggerAlert(bitem.text())
self.alertTextEdit.setText(bitem.text())
item = self.alert_list_widget.selectedIndexes()[0]
bitem = self.alert_list_widget.item(item.row())
self.trigger_alert(bitem.text())
self.alert_text_edit.setText(bitem.text())
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
be changed.
"""
item = self.alertListWidget.selectedIndexes()[0]
bitem = self.alertListWidget.item(item.row())
self.alertTextEdit.setText(bitem.text())
item = self.alert_list_widget.selectedIndexes()[0]
bitem = self.alert_list_widget.item(item.row())
self.alert_text_edit.setText(bitem.text())
self.item_id = bitem.data(QtCore.Qt.UserRole)
# If the alert does not contain '<>' we clear the ParameterEdit field.
if self.alertTextEdit.text().find(u'<>') == -1:
self.parameterEdit.setText(u'')
self.saveButton.setEnabled(False)
if self.alert_text_edit.text().find(u'<>') == -1:
self.parameter_edit.setText(u'')
self.save_button.setEnabled(False)
def triggerAlert(self, text):
def trigger_alert(self, text):
"""
Prepares the alert text for displaying.
@ -182,42 +182,44 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog):
if not text:
return False
# 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', 'You have not entered a parameter to be replaced.\n'
'Do you want to continue anyway?'),
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.No | QtGui.QMessageBox.Yes)) == QtGui.QMessageBox.No:
self.parameterEdit.setFocus()
self.parameter_edit.setFocus()
return False
# The ParameterEdit field is not empty, but we have not found '<>'
# 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', 'The alert text does not contain \'<>\'.\n'
'Do you want to continue anyway?'),
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.No | QtGui.QMessageBox.Yes)) == QtGui.QMessageBox.No:
self.parameterEdit.setFocus()
self.parameter_edit.setFocus()
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)
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.
``row``
The row (int). If there is no current row, the value is -1.
"""
if row == -1:
self.displayButton.setEnabled(False)
self.displayCloseButton.setEnabled(False)
self.saveButton.setEnabled(False)
self.deleteButton.setEnabled(False)
self.display_button.setEnabled(False)
self.display_close_button.setEnabled(False)
self.save_button.setEnabled(False)
self.delete_button.setEnabled(False)
else:
self.displayButton.setEnabled(True)
self.displayCloseButton.setEnabled(True)
self.deleteButton.setEnabled(True)
self.display_button.setEnabled(True)
self.display_close_button.setEnabled(True)
self.delete_button.setEnabled(True)
# 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):
QtCore.QObject.__init__(self, parent)
self.screen = None
self.timer_id = 0
self.alert_list = []
Registry().register_function(u'live_display_active', self.generate_alert)

View File

@ -84,7 +84,7 @@ class PptviewController(PresentationController):
if self.process:
return
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')
self.process = cdll.LoadLibrary(dllpath)
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.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):
songUsageDeleteDialog.setWindowTitle(translate('SongUsagePlugin.SongUsageDeleteForm', 'Delete Song Usage Data'))
self.deleteLabel.setText(
class Ui_SongUsageDeleteDialog(object):
def setupUi(self, song_usage_delete_dialog):
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 '
'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
QtGui.QDialog.__init__(self, parent)
self.setupUi(self)
QtCore.QObject.connect(self.button_box, QtCore.SIGNAL(u'clicked(QAbstractButton*)'),
self.onButtonBoxClicked)
self.button_box.clicked.connect(self.on_button_box_clicked)
def onButtonBoxClicked(self, button):
def on_button_box_clicked(self, button):
if self.button_box.standardButton(button) == QtGui.QDialogButtonBox.Ok:
ret = QtGui.QMessageBox.question(self,
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?'),
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Yes | QtGui.QMessageBox.No), QtGui.QMessageBox.No)
if ret == QtGui.QMessageBox.Yes:
deleteDate = self.deleteCalendar.selectedDate().toPyDate()
self.manager.delete_all_objects(SongUsageItem, SongUsageItem.usagedate <= deleteDate)
delete_date = self.delete_calendar.selectedDate().toPyDate()
self.manager.delete_all_objects(SongUsageItem, SongUsageItem.usagedate <= delete_date)
self.main_window.information_message(
translate('SongUsagePlugin.SongUsageDeleteForm', 'Deletion Successful'),
translate(
'SongUsagePlugin.SongUsageDeleteForm', 'All requested data has been deleted successfully. ')
'SongUsagePlugin.SongUsageDeleteForm', 'All requested data has been deleted successfully.')
)
self.accept()
else:
@ -75,4 +74,4 @@ class SongUsageDeleteForm(QtGui.QDialog, Ui_SongUsageDeleteDialog):
self._main_window = Registry().get(u'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.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):
songUsageDetailDialog.setWindowTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Song Usage Extraction'))
self.dateRangeGroupBox.setTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Select Date Range'))
self.toLabel.setText(translate('SongUsagePlugin.SongUsageDetailForm', 'to'))
self.fileGroupBox.setTitle(translate('SongUsagePlugin.SongUsageDetailForm', 'Report Location'))
class Ui_SongUsageDetailDialog(object):
def setupUi(self, song_usage_detail_dialog):
song_usage_detail_dialog.setObjectName(u'song_usage_detail_dialog')
song_usage_detail_dialog.resize(609, 413)
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__)
class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog):
"""
Class documentation goes here.
@ -57,13 +58,11 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog):
"""
We need to set up the screen
"""
toDate = Settings().value(self.plugin.settingsSection + u'/to date')
fromDate = Settings().value(self.plugin.settingsSection + u'/from date')
self.fromDate.setSelectedDate(fromDate)
self.toDate.setSelectedDate(toDate)
self.fileLineEdit.setText(Settings().value(self.plugin.settingsSection + u'/last directory export'))
self.from_date_calendar.setSelectedDate(Settings().value(self.plugin.settingsSection + u'/from date'))
self.to_date_calendar.setSelectedDate(Settings().value(self.plugin.settingsSection + u'/to date'))
self.file_line_edit.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
"""
@ -72,14 +71,14 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog):
Settings().value(self.plugin.settingsSection + u'/last directory export'))
if path:
Settings().setValue(self.plugin.settingsSection + u'/last directory export', path)
self.fileLineEdit.setText(path)
self.file_line_edit.setText(path)
def accept(self):
"""
Ok was triggered so lets save the data and run the report
"""
log.debug(u'accept')
path = self.fileLineEdit.text()
path = self.file_line_edit.text()
if not path:
self.main_window.error_message(
translate('SongUsagePlugin.SongUsageDetailForm', 'Output Path Not Selected'),
@ -88,36 +87,36 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog):
)
return
check_directory_exists(path)
filename = translate('SongUsagePlugin.SongUsageDetailForm', 'usage_detail_%s_%s.txt') % (
self.fromDate.selectedDate().toString(u'ddMMyyyy'),
self.toDate.selectedDate().toString(u'ddMMyyyy'))
Settings().setValue(u'songusage/from date', self.fromDate.selectedDate())
Settings().setValue(u'songusage/to date', self.toDate.selectedDate())
file_name = translate('SongUsagePlugin.SongUsageDetailForm', 'usage_detail_%s_%s.txt') % (
self.from_date_calendar.selectedDate().toString(u'ddMMyyyy'),
self.to_date_calendar.selectedDate().toString(u'ddMMyyyy'))
Settings().setValue(self.plugin.settingsSection + u'/from date', self.from_date_calendar.selectedDate())
Settings().setValue(self.plugin.settingsSection + u'/to date', self.to_date_calendar.selectedDate())
usage = self.plugin.manager.get_all_objects(
SongUsageItem, and_(
SongUsageItem.usagedate >= self.fromDate.selectedDate().toPyDate(),
SongUsageItem.usagedate < self.toDate.selectedDate().toPyDate()),
SongUsageItem.usagedate >= self.from_date_calendar.selectedDate().toPyDate(),
SongUsageItem.usagedate < self.to_date_calendar.selectedDate().toPyDate()),
[SongUsageItem.usagedate, SongUsageItem.usagetime])
outname = os.path.join(path, filename)
fileHandle = None
report_file_name = os.path.join(path, file_name)
file_handle = None
try:
fileHandle = open(outname, u'w')
file_handle = open(report_file_name, u'w')
for instance in usage:
record = u'\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",\"%s\",' \
u'\"%s\",\"%s\"\n' % (instance.usagedate,
instance.usagetime, instance.title, instance.copyright,
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(
translate('SongUsagePlugin.SongUsageDetailForm', 'Report Creation'),
translate('SongUsagePlugin.SongUsageDetailForm', 'Report \n%s \n'
'has been successfully created. ') % outname
'has been successfully created. ') % report_file_name
)
except IOError:
log.exception(u'Failed to write out song usage records')
finally:
if fileHandle:
fileHandle.close()
if file_handle:
file_handle.close()
self.close()
def _get_main_window(self):
@ -128,4 +127,4 @@ class SongUsageDetailForm(QtGui.QDialog, Ui_SongUsageDetailDialog):
self._main_window = Registry().get(u'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__)
YEAR = QtCore.QDate().currentDate().year()
if QtCore.QDate().currentDate().month() < 9:
YEAR -= 1
@ -54,7 +53,7 @@ __default_settings__ = {
u'songusage/to date': QtCore.QDate(YEAR, 8, 31),
u'songusage/from date': QtCore.QDate(YEAR - 1, 9, 1),
u'songusage/last directory export': u''
}
}
class SongUsagePlugin(Plugin):
@ -67,7 +66,7 @@ class SongUsagePlugin(Plugin):
self.icon = build_icon(u':/plugins/plugin_songusage.png')
self.activeIcon = build_icon(u':/songusage/song_usage_active.png')
self.inactiveIcon = build_icon(u':/songusage/song_usage_inactive.png')
self.songUsageActive = False
self.song_usage_active = False
def checkPreConditions(self):
return self.manager.session is not None
@ -83,59 +82,59 @@ class SongUsagePlugin(Plugin):
"""
log.info(u'add tools menu')
self.toolsMenu = tools_menu
self.songUsageMenu = QtGui.QMenu(tools_menu)
self.songUsageMenu.setObjectName(u'songUsageMenu')
self.songUsageMenu.setTitle(translate('SongUsagePlugin', '&Song Usage Tracking'))
self.song_usage_menu = QtGui.QMenu(tools_menu)
self.song_usage_menu.setObjectName(u'song_usage_menu')
self.song_usage_menu.setTitle(translate('SongUsagePlugin', '&Song Usage Tracking'))
# 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'),
statustip=translate('SongUsagePlugin', 'Delete song usage data up to a specified date.'),
triggers=self.onSongUsageDelete)
triggers=self.on_song_usage_delete)
# 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'),
statustip=translate('SongUsagePlugin', 'Generate a report on song usage.'),
triggers=self.onSongUsageReport)
triggers=self.on_song_usage_report)
# 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'),
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
self.toolsMenu.addAction(self.songUsageMenu.menuAction())
self.songUsageMenu.addAction(self.songUsageStatus)
self.songUsageMenu.addSeparator()
self.songUsageMenu.addAction(self.songUsageReport)
self.songUsageMenu.addAction(self.songUsageDelete)
self.songUsageActiveButton = QtGui.QToolButton(self.main_window.statusBar)
self.songUsageActiveButton.setCheckable(True)
self.songUsageActiveButton.setAutoRaise(True)
self.songUsageActiveButton.setStatusTip(translate('SongUsagePlugin', 'Toggle the tracking of song usage.'))
self.songUsageActiveButton.setObjectName(u'songUsageActiveButton')
self.main_window.statusBar.insertPermanentWidget(1, self.songUsageActiveButton)
self.songUsageActiveButton.hide()
self.toolsMenu.addAction(self.song_usage_menu.menuAction())
self.song_usage_menu.addAction(self.song_usage_status)
self.song_usage_menu.addSeparator()
self.song_usage_menu.addAction(self.song_usage_report)
self.song_usage_menu.addAction(self.song_usage_delete)
self.song_usage_active_button = QtGui.QToolButton(self.main_window.statusBar)
self.song_usage_active_button.setCheckable(True)
self.song_usage_active_button.setAutoRaise(True)
self.song_usage_active_button.setStatusTip(translate('SongUsagePlugin', 'Toggle the tracking of song usage.'))
self.song_usage_active_button.setObjectName(u'song_usage_active_button')
self.main_window.statusBar.insertPermanentWidget(1, self.song_usage_active_button)
self.song_usage_active_button.hide()
# Signals and slots
QtCore.QObject.connect(self.songUsageStatus, QtCore.SIGNAL(u'visibilityChanged(bool)'),
self.songUsageStatus.setChecked)
QtCore.QObject.connect(self.songUsageActiveButton, QtCore.SIGNAL(u'toggled(bool)'), self.toggleSongUsageState)
self.songUsageMenu.menuAction().setVisible(False)
QtCore.QObject.connect(self.song_usage_status, QtCore.SIGNAL(u'visibilityChanged(bool)'),
self.song_usage_status.setChecked)
self.song_usage_active_button.toggled.connect(self.toggle_song_usage_state)
self.song_usage_menu.menuAction().setVisible(False)
def initialise(self):
log.info(u'SongUsage Initialising')
Plugin.initialise(self)
Registry().register_function(u'slidecontroller_live_started', self.display_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
self.setButtonState()
self.set_button_state()
action_list = ActionList.get_instance()
action_list.add_action(self.songUsageStatus, translate('SongUsagePlugin', 'Song Usage'))
action_list.add_action(self.songUsageDelete, translate('SongUsagePlugin', 'Song Usage'))
action_list.add_action(self.songUsageReport, translate('SongUsagePlugin', 'Song Usage'))
self.songUsageDeleteForm = SongUsageDeleteForm(self.manager, self.main_window)
self.songUsageDetailForm = SongUsageDetailForm(self, self.main_window)
self.songUsageMenu.menuAction().setVisible(True)
self.songUsageActiveButton.show()
action_list.add_action(self.song_usage_status, translate('SongUsagePlugin', 'Song Usage'))
action_list.add_action(self.song_usage_delete, translate('SongUsagePlugin', 'Song Usage'))
action_list.add_action(self.song_usage_report, translate('SongUsagePlugin', 'Song Usage'))
self.song_usage_delete_form = SongUsageDeleteForm(self.manager, self.main_window)
self.song_usage_detail_form = SongUsageDetailForm(self, self.main_window)
self.song_usage_menu.menuAction().setVisible(True)
self.song_usage_active_button.show()
def finalise(self):
"""
@ -144,44 +143,43 @@ class SongUsagePlugin(Plugin):
log.info(u'Plugin Finalise')
self.manager.finalise()
Plugin.finalise(self)
self.songUsageMenu.menuAction().setVisible(False)
self.song_usage_menu.menuAction().setVisible(False)
action_list = ActionList.get_instance()
action_list.remove_action(self.songUsageStatus, translate('SongUsagePlugin', 'Song Usage'))
action_list.remove_action(self.songUsageDelete, translate('SongUsagePlugin', 'Song Usage'))
action_list.remove_action(self.songUsageReport, translate('SongUsagePlugin', 'Song Usage'))
self.songUsageActiveButton.hide()
action_list.remove_action(self.song_usage_status, translate('SongUsagePlugin', 'Song Usage'))
action_list.remove_action(self.song_usage_delete, translate('SongUsagePlugin', 'Song Usage'))
action_list.remove_action(self.song_usage_report, translate('SongUsagePlugin', 'Song Usage'))
self.song_usage_active_button.hide()
# 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
the UI when necessary,
"""
self.songUsageActive = not self.songUsageActive
Settings().setValue(self.settingsSection + u'/active', self.songUsageActive)
self.setButtonState()
self.song_usage_active = not self.song_usage_active
Settings().setValue(self.settingsSection + u'/active', self.song_usage_active)
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
button and check box set correctly.
"""
self.songUsageActiveButton.blockSignals(True)
self.songUsageStatus.blockSignals(True)
if self.songUsageActive:
self.songUsageActiveButton.setIcon(self.activeIcon)
self.songUsageStatus.setChecked(True)
self.songUsageActiveButton.setChecked(True)
self.songUsageActiveButton.setToolTip(translate('SongUsagePlugin', 'Song usage tracking is active.'))
self.song_usage_active_button.blockSignals(True)
self.song_usage_status.blockSignals(True)
if self.song_usage_active:
self.song_usage_active_button.setIcon(self.activeIcon)
self.song_usage_status.setChecked(True)
self.song_usage_active_button.setChecked(True)
self.song_usage_active_button.setToolTip(translate('SongUsagePlugin', 'Song usage tracking is active.'))
else:
self.songUsageActiveButton.setIcon(self.inactiveIcon)
self.songUsageStatus.setChecked(False)
self.songUsageActiveButton.setChecked(False)
self.songUsageActiveButton.setToolTip(translate('SongUsagePlugin', 'Song usage tracking is inactive.'))
self.songUsageActiveButton.blockSignals(False)
self.songUsageStatus.blockSignals(False)
self.song_usage_active_button.setIcon(self.inactiveIcon)
self.song_usage_status.setChecked(False)
self.song_usage_active_button.setChecked(False)
self.song_usage_active_button.setToolTip(translate('SongUsagePlugin', 'Song usage tracking is inactive.'))
self.song_usage_active_button.blockSignals(False)
self.song_usage_status.blockSignals(False)
def display_song_usage(self, item):
"""
@ -197,7 +195,7 @@ class SongUsagePlugin(Plugin):
def _add_song_usage(self, source, item):
audit = item[0].audit
if self.songUsageActive and audit:
if self.song_usage_active and audit:
song_usage_item = SongUsageItem()
song_usage_item.usagedate = datetime.today()
song_usage_item.usagetime = datetime.now().time()
@ -209,12 +207,12 @@ class SongUsagePlugin(Plugin):
song_usage_item.source = source
self.manager.save_object(song_usage_item)
def onSongUsageDelete(self):
self.songUsageDeleteForm.exec_()
def on_song_usage_delete(self):
self.song_usage_delete_form.exec_()
def onSongUsageReport(self):
self.songUsageDetailForm.initialise()
self.songUsageDetailForm.exec_()
def on_song_usage_report(self):
self.song_usage_detail_form.initialise()
self.song_usage_detail_form.exec_()
def about(self):
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):
"""
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, \
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.
FormattingTags.load_tags()
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.
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()
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
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# 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
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# 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
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_settings_tabs()
@ -79,7 +79,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled
mocked_settings_form = MagicMock()
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# 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
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_settings_tabs()
@ -115,7 +115,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active
mocked_settings_form = MagicMock()
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_settings_tabs()
@ -134,7 +134,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled
mocked_import_menu = MagicMock()
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_import_menu()
@ -152,7 +152,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active
mocked_import_menu = MagicMock()
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_import_menu()
@ -169,7 +169,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled
mocked_export_menu = MagicMock()
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_export_menu()
@ -187,7 +187,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active
mocked_export_menu = MagicMock()
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_export_menu()
@ -204,7 +204,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled
mocked_tools_menu = MagicMock()
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_tools_menu()
@ -222,7 +222,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active
mocked_tools_menu = MagicMock()
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# WHEN: We run hook_tools_menu()
@ -239,7 +239,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled
mocked_plugin.isActive.return_value = False
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# WHEN: We run initialise_plugins()
@ -257,7 +257,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active
mocked_plugin.isActive.return_value = True
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# WHEN: We run initialise_plugins()
@ -275,7 +275,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled
mocked_plugin.isActive.return_value = False
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# WHEN: We run finalise_plugins()
@ -293,7 +293,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active
mocked_plugin.isActive.return_value = True
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# 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
mocked_plugin = MagicMock()
mocked_plugin.name = 'Mocked Plugin'
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# 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
mocked_plugin = MagicMock()
mocked_plugin.name = 'Mocked Plugin'
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# WHEN: We run finalise_plugins()
@ -343,7 +343,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Disabled
mocked_plugin.isActive.return_value = False
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# WHEN: We run finalise_plugins()
@ -362,7 +362,7 @@ class TestPluginManager(TestCase):
mocked_plugin = MagicMock()
mocked_plugin.status = PluginStatus.Active
mocked_plugin.isActive.return_value = True
plugin_manager = PluginManager('')
plugin_manager = PluginManager()
plugin_manager.plugins = [mocked_plugin]
# 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.main_window = QtGui.QMainWindow()
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):
os.unlink(self.ini_file)
@ -41,7 +40,7 @@ class TestPluginManager(TestCase):
Test the find_plugins() method to ensure it imports the correct plugins.
"""
# 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
old_platform = sys.platform