forked from openlp/openlp
Display handling cleanups and changes to service item flags
bzr-revno: 783
This commit is contained in:
commit
66054c44e4
@ -172,7 +172,7 @@ from mediamanageritem import MediaManagerItem
|
|||||||
from xmlrootclass import XmlRootClass
|
from xmlrootclass import XmlRootClass
|
||||||
from serviceitem import ServiceItem
|
from serviceitem import ServiceItem
|
||||||
from serviceitem import ServiceItemType
|
from serviceitem import ServiceItemType
|
||||||
from serviceitem import ServiceItem
|
from serviceitem import ItemCapabilities
|
||||||
from toolbar import OpenLPToolbar
|
from toolbar import OpenLPToolbar
|
||||||
from dockwidget import OpenLPDockWidget
|
from dockwidget import OpenLPDockWidget
|
||||||
from songxmlhandler import SongXMLBuilder, SongXMLParser
|
from songxmlhandler import SongXMLBuilder, SongXMLParser
|
||||||
|
@ -109,6 +109,12 @@ class EventReceiver(QtCore.QObject):
|
|||||||
``presentation types``
|
``presentation types``
|
||||||
Informs all components of the presentation types supported.
|
Informs all components of the presentation types supported.
|
||||||
|
|
||||||
|
``blank_check``
|
||||||
|
Check to see if th eblank display message is required
|
||||||
|
|
||||||
|
``version_check``
|
||||||
|
Version has changed so pop up window.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
"""
|
"""
|
||||||
|
@ -49,7 +49,7 @@ class RenderManager(object):
|
|||||||
"""
|
"""
|
||||||
log.info(u'RenderManager Loaded')
|
log.info(u'RenderManager Loaded')
|
||||||
|
|
||||||
def __init__(self, theme_manager, screens, screen_number=0):
|
def __init__(self, theme_manager, screens):
|
||||||
"""
|
"""
|
||||||
Initialise the render manager.
|
Initialise the render manager.
|
||||||
"""
|
"""
|
||||||
@ -57,7 +57,6 @@ class RenderManager(object):
|
|||||||
self.screens = screens
|
self.screens = screens
|
||||||
self.theme_manager = theme_manager
|
self.theme_manager = theme_manager
|
||||||
self.renderer = Renderer()
|
self.renderer = Renderer()
|
||||||
self.screens.set_current_display(screen_number)
|
|
||||||
self.calculate_default(self.screens.current[u'size'])
|
self.calculate_default(self.screens.current[u'size'])
|
||||||
self.theme = u''
|
self.theme = u''
|
||||||
self.service_theme = u''
|
self.service_theme = u''
|
||||||
@ -65,12 +64,9 @@ class RenderManager(object):
|
|||||||
self.override_background = None
|
self.override_background = None
|
||||||
self.themedata = None
|
self.themedata = None
|
||||||
|
|
||||||
def update_display(self, screen_number):
|
def update_display(self):
|
||||||
"""
|
"""
|
||||||
Updates the render manager's information about the current screen.
|
Updates the render manager's information about the current screen.
|
||||||
|
|
||||||
``screen_number``
|
|
||||||
The updated index of the output/display screen.
|
|
||||||
"""
|
"""
|
||||||
log.debug(u'Update Display')
|
log.debug(u'Update Display')
|
||||||
self.calculate_default(self.screens.current[u'size'])
|
self.calculate_default(self.screens.current[u'size'])
|
||||||
|
@ -42,6 +42,13 @@ class ServiceItemType(object):
|
|||||||
Image = 2
|
Image = 2
|
||||||
Command = 3
|
Command = 3
|
||||||
|
|
||||||
|
class ItemCapabilities(object):
|
||||||
|
AllowsPreview = 1
|
||||||
|
AllowsEdit = 2
|
||||||
|
AllowsMaintain = 3
|
||||||
|
RequiresMedia = 4
|
||||||
|
|
||||||
|
|
||||||
class ServiceItem(object):
|
class ServiceItem(object):
|
||||||
"""
|
"""
|
||||||
The service item is a base class for the plugins to use to interact with
|
The service item is a base class for the plugins to use to interact with
|
||||||
@ -67,14 +74,18 @@ class ServiceItem(object):
|
|||||||
self.raw_footer = None
|
self.raw_footer = None
|
||||||
self.theme = None
|
self.theme = None
|
||||||
self.service_item_type = None
|
self.service_item_type = None
|
||||||
self.edit_enabled = False
|
|
||||||
self.maintain_allowed = False
|
|
||||||
self._raw_frames = []
|
self._raw_frames = []
|
||||||
self._display_frames = []
|
self._display_frames = []
|
||||||
self._uuid = unicode(uuid.uuid1())
|
self._uuid = unicode(uuid.uuid1())
|
||||||
self.auto_preview_allowed = False
|
|
||||||
self.notes = u''
|
self.notes = u''
|
||||||
self.from_plugin = False
|
self.from_plugin = False
|
||||||
|
self.capabilities = []
|
||||||
|
|
||||||
|
def add_capability(self, capability):
|
||||||
|
self.capabilities.append(capability)
|
||||||
|
|
||||||
|
def is_capable(self, capability):
|
||||||
|
return capability in self.capabilities
|
||||||
|
|
||||||
def addIcon(self, icon):
|
def addIcon(self, icon):
|
||||||
"""
|
"""
|
||||||
@ -207,10 +218,8 @@ class ServiceItem(object):
|
|||||||
u'type':self.service_item_type,
|
u'type':self.service_item_type,
|
||||||
u'audit':self.audit,
|
u'audit':self.audit,
|
||||||
u'notes':self.notes,
|
u'notes':self.notes,
|
||||||
u'preview':self.auto_preview_allowed,
|
u'from_plugin':self.from_plugin,
|
||||||
u'edit':self.edit_enabled,
|
u'capabilities':self.capabilities
|
||||||
u'maintain':self.maintain_allowed,
|
|
||||||
u'from_plugin':self.from_plugin
|
|
||||||
}
|
}
|
||||||
service_data = []
|
service_data = []
|
||||||
if self.service_item_type == ServiceItemType.Text:
|
if self.service_item_type == ServiceItemType.Text:
|
||||||
@ -244,11 +253,9 @@ class ServiceItem(object):
|
|||||||
self.addIcon(header[u'icon'])
|
self.addIcon(header[u'icon'])
|
||||||
self.raw_footer = header[u'footer']
|
self.raw_footer = header[u'footer']
|
||||||
self.audit = header[u'audit']
|
self.audit = header[u'audit']
|
||||||
self.auto_preview_allowed = header[u'preview']
|
|
||||||
self.notes = header[u'notes']
|
self.notes = header[u'notes']
|
||||||
self.edit_enabled = header[u'edit']
|
|
||||||
self.maintain_allowed = header[u'maintain']
|
|
||||||
self.from_plugin = header[u'from_plugin']
|
self.from_plugin = header[u'from_plugin']
|
||||||
|
self.capabilities = header[u'capabilities']
|
||||||
if self.service_item_type == ServiceItemType.Text:
|
if self.service_item_type == ServiceItemType.Text:
|
||||||
for slide in serviceitem[u'serviceitem'][u'data']:
|
for slide in serviceitem[u'serviceitem'][u'data']:
|
||||||
self._raw_frames.append(slide)
|
self._raw_frames.append(slide)
|
||||||
@ -284,11 +291,8 @@ class ServiceItem(object):
|
|||||||
"""
|
"""
|
||||||
return self._uuid != other._uuid
|
return self._uuid != other._uuid
|
||||||
|
|
||||||
def is_song(self):
|
|
||||||
return self.name.lower() == u'songs'
|
|
||||||
|
|
||||||
def is_media(self):
|
def is_media(self):
|
||||||
return self.name.lower() == u'media'
|
return ItemCapabilities.RequiresMedia in self.capabilities
|
||||||
|
|
||||||
def is_command(self):
|
def is_command(self):
|
||||||
return self.service_item_type == ServiceItemType.Command
|
return self.service_item_type == ServiceItemType.Command
|
||||||
|
@ -54,6 +54,7 @@ class SettingsTab(QtGui.QWidget):
|
|||||||
self.config = PluginConfig(title)
|
self.config = PluginConfig(title)
|
||||||
else:
|
else:
|
||||||
self.config = PluginConfig(section)
|
self.config = PluginConfig(section)
|
||||||
|
self.preLoad()
|
||||||
self.load()
|
self.load()
|
||||||
|
|
||||||
def setupUi(self):
|
def setupUi(self):
|
||||||
@ -62,6 +63,12 @@ class SettingsTab(QtGui.QWidget):
|
|||||||
"""
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def preLoad(self):
|
||||||
|
"""
|
||||||
|
Setup the tab's interface.
|
||||||
|
"""
|
||||||
|
pass
|
||||||
|
|
||||||
def retranslateUi(self):
|
def retranslateUi(self):
|
||||||
"""
|
"""
|
||||||
Setup the interface translation strings.
|
Setup the interface translation strings.
|
||||||
|
@ -25,16 +25,29 @@
|
|||||||
|
|
||||||
from PyQt4 import QtCore, QtGui
|
from PyQt4 import QtCore, QtGui
|
||||||
|
|
||||||
from openlp.core.lib import SettingsTab, str_to_bool
|
from openlp.core.lib import SettingsTab, str_to_bool, Receiver
|
||||||
|
|
||||||
class GeneralTab(SettingsTab):
|
class GeneralTab(SettingsTab):
|
||||||
"""
|
"""
|
||||||
GeneralTab is the general settings tab in the settings dialog.
|
GeneralTab is the general settings tab in the settings dialog.
|
||||||
"""
|
"""
|
||||||
def __init__(self, screen_list):
|
def __init__(self, screens):
|
||||||
self.screen_list = screen_list
|
self.screens = screens
|
||||||
SettingsTab.__init__(self, u'General')
|
SettingsTab.__init__(self, u'General')
|
||||||
|
|
||||||
|
def preLoad(self):
|
||||||
|
"""
|
||||||
|
Set up the display screen and set correct screen
|
||||||
|
values.
|
||||||
|
If not set before default to last screen.
|
||||||
|
"""
|
||||||
|
self.MonitorNumber = int(self.config.get_config(u'monitor',
|
||||||
|
self.screens.monitor_number))
|
||||||
|
self.screens.set_current_display(self.MonitorNumber)
|
||||||
|
self.screens.monitor_number = self.MonitorNumber
|
||||||
|
self.DisplayOnMonitor = str_to_bool(self.config.get_config(u'display on monitor', u'True'))
|
||||||
|
self.screens.display = self.DisplayOnMonitor
|
||||||
|
|
||||||
def setupUi(self):
|
def setupUi(self):
|
||||||
self.setObjectName(u'GeneralTab')
|
self.setObjectName(u'GeneralTab')
|
||||||
self.tabTitleVisible = self.trUtf8('General')
|
self.tabTitleVisible = self.trUtf8('General')
|
||||||
@ -60,6 +73,10 @@ class GeneralTab(SettingsTab):
|
|||||||
self.MonitorComboBox = QtGui.QComboBox(self.MonitorGroupBox)
|
self.MonitorComboBox = QtGui.QComboBox(self.MonitorGroupBox)
|
||||||
self.MonitorComboBox.setObjectName(u'MonitorComboBox')
|
self.MonitorComboBox.setObjectName(u'MonitorComboBox')
|
||||||
self.MonitorLayout.addWidget(self.MonitorComboBox)
|
self.MonitorLayout.addWidget(self.MonitorComboBox)
|
||||||
|
self.MonitorLayout.addWidget(self.MonitorComboBox)
|
||||||
|
self.DisplayOnMonitorCheck = QtGui.QCheckBox(self.MonitorGroupBox)
|
||||||
|
self.DisplayOnMonitorCheck.setObjectName(u'MonitorComboBox')
|
||||||
|
self.MonitorLayout.addWidget(self.DisplayOnMonitorCheck)
|
||||||
self.GeneralLeftLayout.addWidget(self.MonitorGroupBox)
|
self.GeneralLeftLayout.addWidget(self.MonitorGroupBox)
|
||||||
self.StartupGroupBox = QtGui.QGroupBox(self.GeneralLeftWidget)
|
self.StartupGroupBox = QtGui.QGroupBox(self.GeneralLeftWidget)
|
||||||
self.StartupGroupBox.setObjectName(u'StartupGroupBox')
|
self.StartupGroupBox.setObjectName(u'StartupGroupBox')
|
||||||
@ -133,6 +150,8 @@ class GeneralTab(SettingsTab):
|
|||||||
self.GeneralLayout.addWidget(self.GeneralRightWidget)
|
self.GeneralLayout.addWidget(self.GeneralRightWidget)
|
||||||
QtCore.QObject.connect(self.MonitorComboBox,
|
QtCore.QObject.connect(self.MonitorComboBox,
|
||||||
QtCore.SIGNAL(u'activated(int)'), self.onMonitorComboBoxChanged)
|
QtCore.SIGNAL(u'activated(int)'), self.onMonitorComboBoxChanged)
|
||||||
|
QtCore.QObject.connect(self.DisplayOnMonitorCheck,
|
||||||
|
QtCore.SIGNAL(u'stateChanged(int)'), self.onDisplayOnMonitorCheckChanged)
|
||||||
QtCore.QObject.connect(self.WarningCheckBox,
|
QtCore.QObject.connect(self.WarningCheckBox,
|
||||||
QtCore.SIGNAL(u'stateChanged(int)'), self.onWarningCheckBoxChanged)
|
QtCore.SIGNAL(u'stateChanged(int)'), self.onWarningCheckBoxChanged)
|
||||||
QtCore.QObject.connect(self.AutoOpenCheckBox,
|
QtCore.QObject.connect(self.AutoOpenCheckBox,
|
||||||
@ -153,6 +172,7 @@ class GeneralTab(SettingsTab):
|
|||||||
def retranslateUi(self):
|
def retranslateUi(self):
|
||||||
self.MonitorGroupBox.setTitle(self.trUtf8('Monitors'))
|
self.MonitorGroupBox.setTitle(self.trUtf8('Monitors'))
|
||||||
self.MonitorLabel.setText(self.trUtf8('Select monitor for output display:'))
|
self.MonitorLabel.setText(self.trUtf8('Select monitor for output display:'))
|
||||||
|
self.DisplayOnMonitorCheck.setText(self.trUtf8('Display if in single screen'))
|
||||||
self.StartupGroupBox.setTitle(self.trUtf8('Application Startup'))
|
self.StartupGroupBox.setTitle(self.trUtf8('Application Startup'))
|
||||||
self.WarningCheckBox.setText(self.trUtf8('Show blank screen warning'))
|
self.WarningCheckBox.setText(self.trUtf8('Show blank screen warning'))
|
||||||
self.AutoOpenCheckBox.setText(self.trUtf8('Automatically open the last service'))
|
self.AutoOpenCheckBox.setText(self.trUtf8('Automatically open the last service'))
|
||||||
@ -168,6 +188,9 @@ class GeneralTab(SettingsTab):
|
|||||||
def onMonitorComboBoxChanged(self):
|
def onMonitorComboBoxChanged(self):
|
||||||
self.MonitorNumber = self.MonitorComboBox.currentIndex()
|
self.MonitorNumber = self.MonitorComboBox.currentIndex()
|
||||||
|
|
||||||
|
def onDisplayOnMonitorCheckChanged(self, value):
|
||||||
|
self.DisplayOnMonitor = (value == QtCore.Qt.Checked)
|
||||||
|
|
||||||
def onAutoOpenCheckBoxChanged(self, value):
|
def onAutoOpenCheckBoxChanged(self, value):
|
||||||
self.AutoOpen = (value == QtCore.Qt.Checked)
|
self.AutoOpen = (value == QtCore.Qt.Checked)
|
||||||
|
|
||||||
@ -193,13 +216,12 @@ class GeneralTab(SettingsTab):
|
|||||||
self.Password = self.PasswordEdit.displayText()
|
self.Password = self.PasswordEdit.displayText()
|
||||||
|
|
||||||
def load(self):
|
def load(self):
|
||||||
for screen in self.screen_list.screen_list:
|
for screen in self.screens.screen_list:
|
||||||
screen_name = u'%s %d' % (self.trUtf8('Screen'), screen[u'number'] + 1)
|
screen_name = u'%s %d' % (self.trUtf8('Screen'), screen[u'number'] + 1)
|
||||||
if screen[u'primary']:
|
if screen[u'primary']:
|
||||||
screen_name = u'%s (%s)' % (screen_name, self.trUtf8('primary'))
|
screen_name = u'%s (%s)' % (screen_name, self.trUtf8('primary'))
|
||||||
self.MonitorComboBox.addItem(screen_name)
|
self.MonitorComboBox.addItem(screen_name)
|
||||||
# Get the configs
|
# Get the configs
|
||||||
self.MonitorNumber = int(self.config.get_config(u'monitor', u'0'))
|
|
||||||
self.Warning = str_to_bool(self.config.get_config(u'blank warning', u'False'))
|
self.Warning = str_to_bool(self.config.get_config(u'blank warning', u'False'))
|
||||||
self.AutoOpen = str_to_bool(self.config.get_config(u'auto open', u'False'))
|
self.AutoOpen = str_to_bool(self.config.get_config(u'auto open', u'False'))
|
||||||
self.ShowSplash = str_to_bool(self.config.get_config(u'show splash', u'True'))
|
self.ShowSplash = str_to_bool(self.config.get_config(u'show splash', u'True'))
|
||||||
@ -211,6 +233,7 @@ class GeneralTab(SettingsTab):
|
|||||||
self.SaveCheckServiceCheckBox.setChecked(self.PromptSaveService)
|
self.SaveCheckServiceCheckBox.setChecked(self.PromptSaveService)
|
||||||
# Set a few things up
|
# Set a few things up
|
||||||
self.MonitorComboBox.setCurrentIndex(self.MonitorNumber)
|
self.MonitorComboBox.setCurrentIndex(self.MonitorNumber)
|
||||||
|
self.DisplayOnMonitorCheck.setChecked(self.DisplayOnMonitor)
|
||||||
self.WarningCheckBox.setChecked(self.Warning)
|
self.WarningCheckBox.setChecked(self.Warning)
|
||||||
self.AutoOpenCheckBox.setChecked(self.AutoOpen)
|
self.AutoOpenCheckBox.setChecked(self.AutoOpen)
|
||||||
self.ShowSplashCheckBox.setChecked(self.ShowSplash)
|
self.ShowSplashCheckBox.setChecked(self.ShowSplash)
|
||||||
@ -221,6 +244,7 @@ class GeneralTab(SettingsTab):
|
|||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
self.config.set_config(u'monitor', self.MonitorNumber)
|
self.config.set_config(u'monitor', self.MonitorNumber)
|
||||||
|
self.config.set_config(u'display on monitor', self.DisplayOnMonitor)
|
||||||
self.config.set_config(u'blank warning', self.Warning)
|
self.config.set_config(u'blank warning', self.Warning)
|
||||||
self.config.set_config(u'auto open', self.AutoOpen)
|
self.config.set_config(u'auto open', self.AutoOpen)
|
||||||
self.config.set_config(u'show splash', self.ShowSplash)
|
self.config.set_config(u'show splash', self.ShowSplash)
|
||||||
@ -229,3 +253,9 @@ class GeneralTab(SettingsTab):
|
|||||||
self.config.set_config(u'ccli number', self.CCLINumber)
|
self.config.set_config(u'ccli number', self.CCLINumber)
|
||||||
self.config.set_config(u'songselect username', self.Username)
|
self.config.set_config(u'songselect username', self.Username)
|
||||||
self.config.set_config(u'songselect password', self.Password)
|
self.config.set_config(u'songselect password', self.Password)
|
||||||
|
self.screens.display = self.DisplayOnMonitor
|
||||||
|
#Monitor Number has changed.
|
||||||
|
if self.screens.monitor_number != self.MonitorNumber:
|
||||||
|
self.screens.monitor_number = self.MonitorNumber
|
||||||
|
self.screens.set_current_display(self.MonitorNumber)
|
||||||
|
Receiver.send_message(u'screen_changed')
|
||||||
|
@ -130,13 +130,15 @@ class MainDisplay(DisplayWidget):
|
|||||||
QtCore.SIGNAL(u'media_pause'), self.onMediaPause)
|
QtCore.SIGNAL(u'media_pause'), self.onMediaPause)
|
||||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||||
QtCore.SIGNAL(u'media_stop'), self.onMediaStop)
|
QtCore.SIGNAL(u'media_stop'), self.onMediaStop)
|
||||||
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||||
|
QtCore.SIGNAL(u'update_config'), self.setup)
|
||||||
|
|
||||||
def setup(self, screenNumber):
|
def setup(self):
|
||||||
"""
|
"""
|
||||||
Sets up the screen on a particular screen.
|
Sets up the screen on a particular screen.
|
||||||
@param (integer) screen This is the screen number.
|
|
||||||
"""
|
"""
|
||||||
log.debug(u'Setup %s for %s ' %(self.screens, screenNumber))
|
log.debug(u'Setup %s for %s ' %(self.screens,
|
||||||
|
self.screens.monitor_number))
|
||||||
self.setVisible(False)
|
self.setVisible(False)
|
||||||
self.screen = self.screens.current
|
self.screen = self.screens.current
|
||||||
#Sort out screen locations and sizes
|
#Sort out screen locations and sizes
|
||||||
@ -183,7 +185,6 @@ class MainDisplay(DisplayWidget):
|
|||||||
else:
|
else:
|
||||||
self.setVisible(False)
|
self.setVisible(False)
|
||||||
self.primary = True
|
self.primary = True
|
||||||
Receiver.send_message(u'screen_changed')
|
|
||||||
|
|
||||||
def resetDisplay(self):
|
def resetDisplay(self):
|
||||||
Receiver.send_message(u'stop_display_loop')
|
Receiver.send_message(u'stop_display_loop')
|
||||||
@ -247,7 +248,7 @@ class MainDisplay(DisplayWidget):
|
|||||||
else:
|
else:
|
||||||
self.display_text.setPixmap(QtGui.QPixmap.fromImage(frame))
|
self.display_text.setPixmap(QtGui.QPixmap.fromImage(frame))
|
||||||
self.display_frame = frame
|
self.display_frame = frame
|
||||||
if not self.isVisible():
|
if not self.isVisible() and self.screens.display:
|
||||||
self.setVisible(True)
|
self.setVisible(True)
|
||||||
self.showFullScreen()
|
self.showFullScreen()
|
||||||
else:
|
else:
|
||||||
@ -320,4 +321,4 @@ class MainDisplay(DisplayWidget):
|
|||||||
self.video.setVisible(False)
|
self.video.setVisible(False)
|
||||||
self.display_text.show()
|
self.display_text.show()
|
||||||
self.display_image.show()
|
self.display_image.show()
|
||||||
self.blankDisplay(False, False)
|
self.blankDisplay(False, False)
|
||||||
|
@ -496,6 +496,8 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||||||
QtCore.SIGNAL(u'version_check'), self.versionCheck)
|
QtCore.SIGNAL(u'version_check'), self.versionCheck)
|
||||||
QtCore.QObject.connect(Receiver.get_receiver(),
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||||
QtCore.SIGNAL(u'blank_check'), self.blankCheck)
|
QtCore.SIGNAL(u'blank_check'), self.blankCheck)
|
||||||
|
QtCore.QObject.connect(Receiver.get_receiver(),
|
||||||
|
QtCore.SIGNAL(u'screen_changed'), self.screenChanged)
|
||||||
QtCore.QObject.connect(self.FileNewItem,
|
QtCore.QObject.connect(self.FileNewItem,
|
||||||
QtCore.SIGNAL(u'triggered()'),
|
QtCore.SIGNAL(u'triggered()'),
|
||||||
self.ServiceManagerContents.onNewService)
|
self.ServiceManagerContents.onNewService)
|
||||||
@ -512,7 +514,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||||||
#RenderManager needs to call ThemeManager and
|
#RenderManager needs to call ThemeManager and
|
||||||
#ThemeManager needs to call RenderManager
|
#ThemeManager needs to call RenderManager
|
||||||
self.RenderManager = RenderManager(self.ThemeManagerContents,
|
self.RenderManager = RenderManager(self.ThemeManagerContents,
|
||||||
self.screens, self.getMonitorNumber())
|
self.screens)
|
||||||
#Define the media Dock Manager
|
#Define the media Dock Manager
|
||||||
self.mediaDockManager = MediaDockManager(self.MediaToolBox)
|
self.mediaDockManager = MediaDockManager(self.MediaToolBox)
|
||||||
log.info(u'Load Plugins')
|
log.info(u'Load Plugins')
|
||||||
@ -563,24 +565,13 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||||||
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok),
|
QtGui.QMessageBox.StandardButtons(QtGui.QMessageBox.Ok),
|
||||||
QtGui.QMessageBox.Ok)
|
QtGui.QMessageBox.Ok)
|
||||||
|
|
||||||
def getMonitorNumber(self):
|
|
||||||
"""
|
|
||||||
Set up the default behaviour of the monitor configuration in
|
|
||||||
here. Currently it is set to default to monitor 0 if the saved
|
|
||||||
monitor number does not exist.
|
|
||||||
"""
|
|
||||||
screen_number = int(self.generalConfig.get_config(u'monitor', 0))
|
|
||||||
if not self.screens.screen_exists(screen_number):
|
|
||||||
screen_number = 0
|
|
||||||
return screen_number
|
|
||||||
|
|
||||||
def show(self):
|
def show(self):
|
||||||
"""
|
"""
|
||||||
Show the main form, as well as the display form
|
Show the main form, as well as the display form
|
||||||
"""
|
"""
|
||||||
self.showMaximized()
|
self.showMaximized()
|
||||||
screen_number = self.getMonitorNumber()
|
#screen_number = self.getMonitorNumber()
|
||||||
self.mainDisplay.setup(screen_number)
|
self.mainDisplay.setup()
|
||||||
if self.mainDisplay.isVisible():
|
if self.mainDisplay.isVisible():
|
||||||
self.mainDisplay.setFocus()
|
self.mainDisplay.setFocus()
|
||||||
self.activateWindow()
|
self.activateWindow()
|
||||||
@ -598,7 +589,6 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||||||
QtGui.QMessageBox.Ok)
|
QtGui.QMessageBox.Ok)
|
||||||
|
|
||||||
def versionThread(self):
|
def versionThread(self):
|
||||||
#app_version = self.applicationVersion[u'full']
|
|
||||||
vT = VersionThread(self, self.applicationVersion, self.generalConfig)
|
vT = VersionThread(self, self.applicationVersion, self.generalConfig)
|
||||||
vT.start()
|
vT.start()
|
||||||
|
|
||||||
@ -621,13 +611,10 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
|
|||||||
Show the Settings dialog
|
Show the Settings dialog
|
||||||
"""
|
"""
|
||||||
self.settingsForm.exec_()
|
self.settingsForm.exec_()
|
||||||
updated_display = self.getMonitorNumber()
|
|
||||||
if updated_display != self.screens.current_display:
|
def screenChanged(self):
|
||||||
self.screens.set_current_display(updated_display)
|
self.RenderManager.update_display()
|
||||||
self.RenderManager.update_display(updated_display)
|
self.mainDisplay.setup()
|
||||||
self.mainDisplay.setup(updated_display)
|
|
||||||
#Trigger after changes have been made
|
|
||||||
Receiver.send_message(u'config_updated')
|
|
||||||
self.activateWindow()
|
self.activateWindow()
|
||||||
|
|
||||||
def closeEvent(self, event):
|
def closeEvent(self, event):
|
||||||
|
@ -37,14 +37,17 @@ class ScreenList(object):
|
|||||||
self.preview = None
|
self.preview = None
|
||||||
self.current = None
|
self.current = None
|
||||||
self.screen_list = []
|
self.screen_list = []
|
||||||
self.count = 0
|
self.display_count = 0
|
||||||
|
#actual display number
|
||||||
self.current_display = 0
|
self.current_display = 0
|
||||||
|
#save config display number
|
||||||
|
self.monitor_number = 0
|
||||||
|
|
||||||
def add_screen(self, screen):
|
def add_screen(self, screen):
|
||||||
if screen[u'primary']:
|
if screen[u'primary']:
|
||||||
self.current = screen
|
self.current = screen
|
||||||
self.screen_list.append(screen)
|
self.screen_list.append(screen)
|
||||||
self.count += 1
|
self.display_count += 1
|
||||||
|
|
||||||
def screen_exists(self, number):
|
def screen_exists(self, number):
|
||||||
for screen in self.screen_list:
|
for screen in self.screen_list:
|
||||||
@ -53,21 +56,15 @@ class ScreenList(object):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
def set_current_display(self, number):
|
def set_current_display(self, number):
|
||||||
if number + 1 > self.count:
|
"""
|
||||||
|
Set up the current screen dimensions
|
||||||
|
"""
|
||||||
|
if number + 1 > self.display_count:
|
||||||
self.current = self.screen_list[0]
|
self.current = self.screen_list[0]
|
||||||
self.current_display = 0
|
self.current_display = 0
|
||||||
else:
|
else:
|
||||||
self.current = self.screen_list[number]
|
self.current = self.screen_list[number]
|
||||||
self.preview = self.current
|
self.preview = self.current
|
||||||
self.current_display = number
|
self.current_display = number
|
||||||
if self.count == 1:
|
if self.display_count == 1:
|
||||||
self.preview = self.screen_list[0]
|
self.preview = self.screen_list[0]
|
||||||
|
|
||||||
# if self.screen[u'number'] != screenNumber:
|
|
||||||
# # We will most probably never actually hit this bit, but just in
|
|
||||||
# # case the index in the list doesn't match the screen number, we
|
|
||||||
# # search for it.
|
|
||||||
# for scrn in self.screens:
|
|
||||||
# if scrn[u'number'] == screenNumber:
|
|
||||||
# self.screen = scrn
|
|
||||||
# break
|
|
||||||
|
@ -33,7 +33,7 @@ log = logging.getLogger(__name__)
|
|||||||
from PyQt4 import QtCore, QtGui
|
from PyQt4 import QtCore, QtGui
|
||||||
|
|
||||||
from openlp.core.lib import PluginConfig, OpenLPToolbar, ServiceItem, \
|
from openlp.core.lib import PluginConfig, OpenLPToolbar, ServiceItem, \
|
||||||
contextMenuAction, Receiver, str_to_bool, build_icon
|
contextMenuAction, Receiver, str_to_bool, build_icon, ItemCapabilities
|
||||||
from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm
|
from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm
|
||||||
|
|
||||||
class ServiceManagerList(QtGui.QTreeWidget):
|
class ServiceManagerList(QtGui.QTreeWidget):
|
||||||
@ -233,9 +233,9 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
self.editAction.setVisible(False)
|
self.editAction.setVisible(False)
|
||||||
self.maintainAction.setVisible(False)
|
self.maintainAction.setVisible(False)
|
||||||
self.notesAction.setVisible(False)
|
self.notesAction.setVisible(False)
|
||||||
if serviceItem[u'service_item'].edit_enabled:
|
if serviceItem[u'service_item'].is_capable(ItemCapabilities.AllowsEdit):
|
||||||
self.editAction.setVisible(True)
|
self.editAction.setVisible(True)
|
||||||
if serviceItem[u'service_item'].maintain_allowed:
|
if serviceItem[u'service_item'].is_capable(ItemCapabilities.AllowsMaintain):
|
||||||
self.maintainAction.setVisible(True)
|
self.maintainAction.setVisible(True)
|
||||||
if item.parent() is None:
|
if item.parent() is None:
|
||||||
self.notesAction.setVisible(True)
|
self.notesAction.setVisible(True)
|
||||||
@ -713,7 +713,7 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
get_config(u'auto preview', u'False')):
|
get_config(u'auto preview', u'False')):
|
||||||
item += 1
|
item += 1
|
||||||
if self.serviceItems and item < len(self.serviceItems) and \
|
if self.serviceItems and item < len(self.serviceItems) and \
|
||||||
self.serviceItems[item][u'service_item'].auto_preview_allowed:
|
serviceItem[u'service_item'].is_capable(ItemCapabilities.AllowsPreview):
|
||||||
self.parent.PreviewController.addServiceManagerItem(
|
self.parent.PreviewController.addServiceManagerItem(
|
||||||
self.serviceItems[item][u'service_item'], 0)
|
self.serviceItems[item][u'service_item'], 0)
|
||||||
|
|
||||||
@ -722,7 +722,7 @@ class ServiceManager(QtGui.QWidget):
|
|||||||
Posts a remote edit message to a plugin to allow item to be edited.
|
Posts a remote edit message to a plugin to allow item to be edited.
|
||||||
"""
|
"""
|
||||||
item, count = self.findServiceItem()
|
item, count = self.findServiceItem()
|
||||||
if self.serviceItems[item][u'service_item'].edit_enabled:
|
if serviceItem[u'service_item'].is_capable(ItemCapabilities.AllowsEdit):
|
||||||
self.remoteEditTriggered = True
|
self.remoteEditTriggered = True
|
||||||
Receiver.send_message(u'%s_edit' %
|
Receiver.send_message(u'%s_edit' %
|
||||||
self.serviceItems[item][u'service_item'].name, u'L:%s' %
|
self.serviceItems[item][u'service_item'].name, u'L:%s' %
|
||||||
|
@ -34,11 +34,11 @@ log = logging.getLogger(__name__)
|
|||||||
|
|
||||||
class SettingsForm(QtGui.QDialog, Ui_SettingsDialog):
|
class SettingsForm(QtGui.QDialog, Ui_SettingsDialog):
|
||||||
|
|
||||||
def __init__(self, screen_list, mainWindow, parent=None):
|
def __init__(self, screens, mainWindow, parent=None):
|
||||||
QtGui.QDialog.__init__(self, parent)
|
QtGui.QDialog.__init__(self, parent)
|
||||||
self.setupUi(self)
|
self.setupUi(self)
|
||||||
# General tab
|
# General tab
|
||||||
self.GeneralTab = GeneralTab(screen_list)
|
self.GeneralTab = GeneralTab(screens)
|
||||||
self.addTab(u'General', self.GeneralTab)
|
self.addTab(u'General', self.GeneralTab)
|
||||||
# Themes tab
|
# Themes tab
|
||||||
self.ThemesTab = ThemesTab(mainWindow)
|
self.ThemesTab = ThemesTab(mainWindow)
|
||||||
|
@ -375,8 +375,7 @@ class SlideController(QtGui.QWidget):
|
|||||||
self.Toolbar.makeWidgetsInvisible(self.image_list)
|
self.Toolbar.makeWidgetsInvisible(self.image_list)
|
||||||
if item.is_text():
|
if item.is_text():
|
||||||
self.Toolbar.makeWidgetsInvisible(self.image_list)
|
self.Toolbar.makeWidgetsInvisible(self.image_list)
|
||||||
if item.is_song() and \
|
if str_to_bool(self.songsconfig.get_config(u'show songbar', True)) \
|
||||||
str_to_bool(self.songsconfig.get_config(u'show songbar', True)) \
|
|
||||||
and len(self.slideList) > 0:
|
and len(self.slideList) > 0:
|
||||||
self.Toolbar.makeWidgetsVisible([u'Song Menu'])
|
self.Toolbar.makeWidgetsVisible([u'Song Menu'])
|
||||||
elif item.is_image():
|
elif item.is_image():
|
||||||
@ -395,7 +394,8 @@ class SlideController(QtGui.QWidget):
|
|||||||
self.Toolbar.setVisible(True)
|
self.Toolbar.setVisible(True)
|
||||||
self.Mediabar.setVisible(False)
|
self.Mediabar.setVisible(False)
|
||||||
self.Toolbar.makeWidgetsInvisible(self.song_edit_list)
|
self.Toolbar.makeWidgetsInvisible(self.song_edit_list)
|
||||||
if item.edit_enabled and item.from_plugin:
|
if serviceItem[u'service_item'].is_capable(ItemCapabilities.AllowsEdit)\
|
||||||
|
and item.from_plugin:
|
||||||
self.Toolbar.makeWidgetsVisible(self.song_edit_list)
|
self.Toolbar.makeWidgetsVisible(self.song_edit_list)
|
||||||
elif item.is_media():
|
elif item.is_media():
|
||||||
self.Toolbar.setVisible(False)
|
self.Toolbar.setVisible(False)
|
||||||
@ -494,7 +494,8 @@ class SlideController(QtGui.QWidget):
|
|||||||
bits = frame[u'verseTag'].split(u':')
|
bits = frame[u'verseTag'].split(u':')
|
||||||
tag = None
|
tag = None
|
||||||
#If verse handle verse number else tag only
|
#If verse handle verse number else tag only
|
||||||
if bits[0] == self.trUtf8('Verse'):
|
if bits[0] == self.trUtf8('Verse') or \
|
||||||
|
bits[0] == self.trUtf8('Chorus'):
|
||||||
tag = u'%s%s' % (bits[0][0], bits[1][0:] )
|
tag = u'%s%s' % (bits[0][0], bits[1][0:] )
|
||||||
row = bits[1][0:]
|
row = bits[1][0:]
|
||||||
else:
|
else:
|
||||||
@ -759,7 +760,7 @@ class SlideController(QtGui.QWidget):
|
|||||||
else:
|
else:
|
||||||
self.mediaObject.stop()
|
self.mediaObject.stop()
|
||||||
self.mediaObject.clearQueue()
|
self.mediaObject.clearQueue()
|
||||||
file = os.path.join(item.service_item_path, item.get_frame_title())
|
file = os.path.join(item.get_frame_path(), item.get_frame_title())
|
||||||
self.mediaObject.setCurrentSource(Phonon.MediaSource(file))
|
self.mediaObject.setCurrentSource(Phonon.MediaSource(file))
|
||||||
self.onMediaPlay()
|
self.onMediaPlay()
|
||||||
|
|
||||||
|
@ -29,7 +29,7 @@ import time
|
|||||||
from PyQt4 import QtCore, QtGui
|
from PyQt4 import QtCore, QtGui
|
||||||
|
|
||||||
from openlp.core.lib import MediaManagerItem, Receiver, str_to_bool, \
|
from openlp.core.lib import MediaManagerItem, Receiver, str_to_bool, \
|
||||||
BaseListWithDnD
|
BaseListWithDnD, ItemCapabilities
|
||||||
from openlp.plugins.bibles.forms import ImportWizardForm
|
from openlp.plugins.bibles.forms import ImportWizardForm
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -449,7 +449,7 @@ class BibleMediaItem(MediaManagerItem):
|
|||||||
raw_slides = []
|
raw_slides = []
|
||||||
raw_footer = []
|
raw_footer = []
|
||||||
bible_text = u''
|
bible_text = u''
|
||||||
service_item.auto_preview_allowed = True
|
service_item.add_capability(ItemCapabilities.AllowsPreview)
|
||||||
#If we want to use a 2nd translation / version
|
#If we want to use a 2nd translation / version
|
||||||
bible2 = u''
|
bible2 = u''
|
||||||
if self.SearchTabWidget.currentIndex() == 0:
|
if self.SearchTabWidget.currentIndex() == 0:
|
||||||
@ -608,4 +608,4 @@ class BibleMediaItem(MediaManagerItem):
|
|||||||
|
|
||||||
def searchByReference(self, bible, search):
|
def searchByReference(self, bible, search):
|
||||||
log.debug(u'searchByReference %s, %s', bible, search)
|
log.debug(u'searchByReference %s, %s', bible, search)
|
||||||
self.search_results = self.parent.manager.get_verses(bible, search)
|
self.search_results = self.parent.manager.get_verses(bible, search)
|
||||||
|
@ -28,7 +28,7 @@ import logging
|
|||||||
from PyQt4 import QtCore, QtGui
|
from PyQt4 import QtCore, QtGui
|
||||||
|
|
||||||
from openlp.core.lib import MediaManagerItem, SongXMLParser, BaseListWithDnD,\
|
from openlp.core.lib import MediaManagerItem, SongXMLParser, BaseListWithDnD,\
|
||||||
Receiver, str_to_bool
|
Receiver, str_to_bool, ItemCapabilities
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -144,11 +144,11 @@ class CustomMediaItem(MediaManagerItem):
|
|||||||
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
|
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
|
||||||
else:
|
else:
|
||||||
item_id = self.remoteCustom
|
item_id = self.remoteCustom
|
||||||
service_item.auto_preview_allowed = True
|
service_item.add_capability(ItemCapabilities.AllowsEdit)
|
||||||
|
service_item.add_capability(ItemCapabilities.AllowsPreview)
|
||||||
customSlide = self.parent.custommanager.get_custom(item_id)
|
customSlide = self.parent.custommanager.get_custom(item_id)
|
||||||
title = customSlide.title
|
title = customSlide.title
|
||||||
credit = customSlide.credits
|
credit = customSlide.credits
|
||||||
service_item.edit_enabled = True
|
|
||||||
service_item.editId = item_id
|
service_item.editId = item_id
|
||||||
theme = customSlide.theme_name
|
theme = customSlide.theme_name
|
||||||
if theme:
|
if theme:
|
||||||
@ -166,4 +166,4 @@ class CustomMediaItem(MediaManagerItem):
|
|||||||
else:
|
else:
|
||||||
raw_footer.append(u'')
|
raw_footer.append(u'')
|
||||||
service_item.raw_footer = raw_footer
|
service_item.raw_footer = raw_footer
|
||||||
return True
|
return True
|
||||||
|
@ -28,7 +28,7 @@ import os
|
|||||||
|
|
||||||
from PyQt4 import QtCore, QtGui
|
from PyQt4 import QtCore, QtGui
|
||||||
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon, \
|
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon, \
|
||||||
contextMenuAction
|
contextMenuAction, ItemCapabilities
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -140,8 +140,8 @@ class ImageMediaItem(MediaManagerItem):
|
|||||||
items = self.ListView.selectedIndexes()
|
items = self.ListView.selectedIndexes()
|
||||||
if items:
|
if items:
|
||||||
service_item.title = self.trUtf8('Image(s)')
|
service_item.title = self.trUtf8('Image(s)')
|
||||||
service_item.auto_preview_allowed = True
|
service_item.add_capability(ItemCapabilities.AllowsMaintain)
|
||||||
service_item.maintain_allowed = True
|
service_item.add_capability(ItemCapabilities.AllowsPreview)
|
||||||
for item in items:
|
for item in items:
|
||||||
bitem = self.ListView.item(item.row())
|
bitem = self.ListView.item(item.row())
|
||||||
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
|
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
|
||||||
|
@ -28,7 +28,8 @@ import os
|
|||||||
|
|
||||||
from PyQt4 import QtCore, QtGui
|
from PyQt4 import QtCore, QtGui
|
||||||
|
|
||||||
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon
|
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, build_icon, \
|
||||||
|
ItemCapabilities
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -82,6 +83,7 @@ class MediaMediaItem(MediaManagerItem):
|
|||||||
if len(items) > 1:
|
if len(items) > 1:
|
||||||
return False
|
return False
|
||||||
service_item.title = unicode(self.trUtf8('Media'))
|
service_item.title = unicode(self.trUtf8('Media'))
|
||||||
|
service_item.add_capability(ItemCapabilities.Requires_media)
|
||||||
for item in items:
|
for item in items:
|
||||||
bitem = self.ListView.item(item.row())
|
bitem = self.ListView.item(item.row())
|
||||||
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
|
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
|
||||||
|
@ -152,7 +152,6 @@ class PresentationMediaItem(MediaManagerItem):
|
|||||||
service_item.title = unicode(self.DisplayTypeComboBox.currentText())
|
service_item.title = unicode(self.DisplayTypeComboBox.currentText())
|
||||||
service_item.shortname = unicode(self.DisplayTypeComboBox.currentText())
|
service_item.shortname = unicode(self.DisplayTypeComboBox.currentText())
|
||||||
shortname = service_item.shortname
|
shortname = service_item.shortname
|
||||||
|
|
||||||
for item in items:
|
for item in items:
|
||||||
bitem = self.ListView.item(item.row())
|
bitem = self.ListView.item(item.row())
|
||||||
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
|
filename = unicode((bitem.data(QtCore.Qt.UserRole)).toString())
|
||||||
|
@ -28,7 +28,7 @@ import logging
|
|||||||
from PyQt4 import QtCore, QtGui
|
from PyQt4 import QtCore, QtGui
|
||||||
|
|
||||||
from openlp.core.lib import MediaManagerItem, SongXMLParser, \
|
from openlp.core.lib import MediaManagerItem, SongXMLParser, \
|
||||||
BaseListWithDnD, Receiver, str_to_bool
|
BaseListWithDnD, Receiver, str_to_bool, ItemCapabilities
|
||||||
from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm
|
from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -290,10 +290,10 @@ class SongMediaItem(MediaManagerItem):
|
|||||||
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
|
item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0]
|
||||||
else:
|
else:
|
||||||
item_id = self.remoteSong
|
item_id = self.remoteSong
|
||||||
service_item.auto_preview_allowed = True
|
service_item.add_capability(ItemCapabilities.AllowsEdit)
|
||||||
|
service_item.add_capability(ItemCapabilities.AllowsPreview)
|
||||||
song = self.parent.songmanager.get_song(item_id)
|
song = self.parent.songmanager.get_song(item_id)
|
||||||
service_item.theme = song.theme_name
|
service_item.theme = song.theme_name
|
||||||
service_item.edit_enabled = True
|
|
||||||
service_item.editId = item_id
|
service_item.editId = item_id
|
||||||
if song.lyrics.startswith(u'<?xml version='):
|
if song.lyrics.startswith(u'<?xml version='):
|
||||||
songXML = SongXMLParser(song.lyrics)
|
songXML = SongXMLParser(song.lyrics)
|
||||||
@ -310,7 +310,8 @@ class SongMediaItem(MediaManagerItem):
|
|||||||
break
|
break
|
||||||
for verse in verseList:
|
for verse in verseList:
|
||||||
if verse[1]:
|
if verse[1]:
|
||||||
if verse[0][u'type'] == "Verse":
|
if verse[0][u'type'] == "Verse" \
|
||||||
|
or verse[0][u'type'] == "Chorus":
|
||||||
if verse[0][u'label'] == order[1:]:
|
if verse[0][u'label'] == order[1:]:
|
||||||
verseTag = u'%s:%s' % \
|
verseTag = u'%s:%s' % \
|
||||||
(verse[0][u'type'], verse[0][u'label'])
|
(verse[0][u'type'], verse[0][u'label'])
|
||||||
@ -345,4 +346,4 @@ class SongMediaItem(MediaManagerItem):
|
|||||||
service_item.audit = [
|
service_item.audit = [
|
||||||
song.title, author_audit, song.copyright, song.ccli_number
|
song.title, author_audit, song.copyright, song.ccli_number
|
||||||
]
|
]
|
||||||
return True
|
return True
|
||||||
|
Loading…
Reference in New Issue
Block a user