diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py index 52ca114b4..7557348ca 100644 --- a/openlp/core/lib/mediamanageritem.py +++ b/openlp/core/lib/mediamanageritem.py @@ -178,6 +178,8 @@ class MediaManagerItem(QtGui.QWidget): """ # Add a toolbar self.addToolbar() + #Allow the plugin to define it's own header + self.addStartHeaderBar() # Create buttons for the toolbar ## File Button ## if self.hasFileIcon: @@ -190,13 +192,13 @@ class MediaManagerItem(QtGui.QWidget): self.addToolbarButton( translate(self.TranslationContext, u'New '+self.PluginTextShort), translate(self.TranslationContext, u'Add a new '+self.PluginTextShort), - u':'+self.IconPath+ u'_load.png', self.onNewClick, self.PluginTextShort+u'NewItem') + u':'+self.IconPath+ u'_new.png', self.onNewClick, self.PluginTextShort+u'NewItem') ## Edit Button ## if self.hasEditIcon: self.addToolbarButton( translate(self.TranslationContext, u'Edit '+self.PluginTextShort), translate(self.TranslationContext, u'Edit the selected '+self.PluginTextShort), - u':'+self.IconPath+ u'_load.png', self.onEditClick, self.PluginTextShort+u'EditItem') + u':'+self.IconPath+ u'_edit.png', self.onEditClick, self.PluginTextShort+u'EditItem') ## Delete Button ## self.addToolbarButton( translate(self.TranslationContext, u'Delete '+self.PluginTextShort), @@ -220,7 +222,7 @@ class MediaManagerItem(QtGui.QWidget): translate(self.TranslationContext, u'Add the selected item(s) to the service'), u':/system/system_add.png', self.onAddClick, self.PluginTextShort+u'AddItem') #Allow the plugin to define it's own header - self.addHeaderBar() + self.addEndHeaderBar() #Add the List widget self.ListView = self.ListViewWithDnD_class() self.ListView.uniformItemSizes = True @@ -239,7 +241,7 @@ class MediaManagerItem(QtGui.QWidget): ':' +self.IconPath+u'_new.png', translate(self.TranslationContext, u'&Edit '+self.PluginTextShort), self.onEditClick)) - self.ListView.addAction(self.contextMenuSeparator(self.SongListWidget)) + self.ListView.addAction(contextMenuSeparator(self.ListView)) self.ListView.addAction(contextMenuAction( self.ListView, ':/system/system_preview.png', translate(self.TranslationContext, u'&Preview '+self.PluginTextShort), @@ -263,7 +265,16 @@ class MediaManagerItem(QtGui.QWidget): """ pass - def addHeaderBar(self): + def addStartHeaderBar(self): + """ + Slot at start of toolbar for plugin to addwidgets + """ + pass + + def addEndHeaderBar(self): + """ + Slot at end of toolbar for plugin to add widgets + """ pass def onFileClick(self): diff --git a/openlp/core/lib/renderer.py b/openlp/core/lib/renderer.py index 24e8a5b8f..ba4adbd53 100644 --- a/openlp/core/lib/renderer.py +++ b/openlp/core/lib/renderer.py @@ -519,7 +519,7 @@ class Renderer(object): self.footerFont = QtGui.QFont(self._theme.font_footer_name, int(self._theme.font_footer_proportion), # size int(footer_weight), # weight - self._theme.font_footer_italics)# italic + self._theme.font_footer_italics) # italic self.footerFont.setPixelSize(int(self._theme.font_footer_proportion)) main_weight = 50 if self._theme.font_main_weight == u'Bold': diff --git a/openlp/core/lib/serviceitem.py b/openlp/core/lib/serviceitem.py index 9648ba2ba..d0b81e3e7 100644 --- a/openlp/core/lib/serviceitem.py +++ b/openlp/core/lib/serviceitem.py @@ -88,13 +88,13 @@ class ServiceItem(object): The render method is what renders the frames for the screen. """ log.debug(u'Render called') - if self.theme == None: - self.RenderManager.set_override_theme(None) - else: - self.RenderManager.set_override_theme(self.theme) - log.debug(u'Formatting slides') self.frames = [] if self.service_item_type == ServiceType.Text: + log.debug(u'Formatting slides') + if self.theme == None: + self.RenderManager.set_override_theme(None) + else: + self.RenderManager.set_override_theme(self.theme) for slide in self.service_frames: formated = self.RenderManager.format_slide(slide[u'raw_slide']) for format in formated: diff --git a/openlp/core/lib/settingsmanager.py b/openlp/core/lib/settingsmanager.py index 26146d7fd..55fcaf6d2 100644 --- a/openlp/core/lib/settingsmanager.py +++ b/openlp/core/lib/settingsmanager.py @@ -34,13 +34,22 @@ class SettingsManager(object): self.width = self.screen[u'size'].width() self.height = self.screen[u'size'].height() self.mainwindow_height = self.height * 0.8 - self.mainwindow_docbars = self.width / 5 - if self.mainwindow_docbars > 300: - self.mainwindow_docbars > 300 - self.mainwindow_slidecontroller = self.width / 6 - self.slidecontroller = ((self.width - (self.mainwindow_docbars * 3 ) / 2 ) / 2 ) -100 + mainwindow_docbars = self.width / 5 + self.mainwindow_left = 0 + self.mainwindow_right = 0 + if mainwindow_docbars > 300: + self.mainwindow_left = 300 + self.mainwindow_right = 300 + + self.mainwindow_left = int( ConfigHelper.get_config( + u'user interface', u'mediamanager left', self.mainwindow_left)) + self.mainwindow_right = int( ConfigHelper.get_config( + u'user interface', u'mediamanager right', self.mainwindow_right)) + print self.mainwindow_left, self.mainwindow_right + + self.slidecontroller = (self.width - (self.mainwindow_left + self.mainwindow_right) - 100 ) / 2 self.slidecontroller_image = self.slidecontroller - 50 - print self.width, self.mainwindow_docbars, self.slidecontroller, self.slidecontroller_image + print self.width, mainwindow_docbars, self.slidecontroller, self.slidecontroller_image self.showMediaManager = str_to_bool( ConfigHelper.get_config( u'user interface', u'display mediamanager', True)) @@ -67,3 +76,7 @@ class SettingsManager(object): ConfigHelper.set_config(u'user interface', u'display previewpanel', isVisible) + def setDockbarLeft(self, value): + #ConfigHelper.set_config(u'user interface', u'mediamanager left', value) + pass + diff --git a/openlp/core/ui/mainwindow.py b/openlp/core/ui/mainwindow.py index f5e326f6e..67644643b 100644 --- a/openlp/core/ui/mainwindow.py +++ b/openlp/core/ui/mainwindow.py @@ -36,6 +36,15 @@ from openlp.core.lib import translate, Plugin, MediaManagerItem, \ from openlp.core.utils import ConfigHelper +class mediaDock(QtGui.QDockWidget): + def __init__(self, parent=None, name=None): + QtGui.QDockWidget.__init__(self, parent) + self.parent = parent + + def resizeEvent(self, resizeEvent): + if resizeEvent.size().width() != resizeEvent.oldSize().width(): + self.parent.settingsmanager.setDockbarLeft(resizeEvent.size().width()) + class Ui_MainWindow(object): def setupUi(self, MainWindow): """ @@ -107,7 +116,7 @@ class Ui_MainWindow(object): self.DefaultThemeLabel.setObjectName(u'DefaultThemeLabel') self.StatusBar.addPermanentWidget(self.DefaultThemeLabel) # Create the MediaManager - self.MediaManagerDock = QtGui.QDockWidget(MainWindow) + self.MediaManagerDock = mediaDock(MainWindow) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(u':/system/system_mediamanager.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) @@ -115,7 +124,15 @@ class Ui_MainWindow(object): self.MediaManagerDock.setFloating(False) self.MediaManagerDock.setObjectName(u'MediaManagerDock') self.MediaManagerDock.setMinimumWidth( - self.settingsmanager.mainwindow_docbars) + self.settingsmanager.mainwindow_left) + +# self.MediaManagerDock.setSizePolicy(QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, +# QtGui.QSizePolicy.Maximum)) +# geometry = self.MediaManagerDock.geometry() +# geometry.setWidth(self.settingsmanager.mainwindow_left) +# self.MediaManagerDock.setGeometry(geometry) +# self.MediaManagerDock.setMinimumWidth(10) + self.MediaManagerContents = QtGui.QWidget() self.MediaManagerContents.setObjectName(u'MediaManagerContents') self.MediaManagerLayout = QtGui.QHBoxLayout(self.MediaManagerContents) @@ -139,7 +156,7 @@ class Ui_MainWindow(object): QtGui.QDockWidget.AllDockWidgetFeatures) self.ServiceManagerDock.setObjectName(u'ServiceManagerDock') self.ServiceManagerDock.setMinimumWidth( - self.settingsmanager.mainwindow_docbars) + self.settingsmanager.mainwindow_right) self.ServiceManagerContents = ServiceManager(self) self.ServiceManagerDock.setWidget(self.ServiceManagerContents) MainWindow.addDockWidget( diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py index f7e7b8e22..7676231ca 100644 --- a/openlp/core/ui/slidecontroller.py +++ b/openlp/core/ui/slidecontroller.py @@ -75,7 +75,7 @@ class SlideController(QtGui.QWidget): self.parent = parent self.image_list = [u'Start Loop', u'Stop Loop', u'Loop Separator', u'Image SpinBox'] self.timer_id = 0 - self.item = None + self.commandItem = None self.Panel = QtGui.QWidget(parent.ControlSplitter) self.Splitter = QtGui.QSplitter(self.Panel) self.Splitter.setOrientation(QtCore.Qt.Vertical) @@ -238,9 +238,9 @@ class SlideController(QtGui.QWidget): """ log.debug(u'addServiceItem') #If old item was a command tell it to stop - if self.item is not None and self.item.service_item_type == ServiceType.Command: - Receiver().send_message(u'%s_stop'% self.item.name.lower()) - self.item = item + if self.commandItem is not None and self.commandItem.service_item_type == ServiceType.Command: + Receiver().send_message(u'%s_stop'% self.commandItem.name.lower()) + self.commandItem = item item.render() self.enableToolBar(item) if item.service_item_type == ServiceType.Command: @@ -257,9 +257,9 @@ class SlideController(QtGui.QWidget): """ log.debug(u'addServiceItem') #If old item was a command tell it to stop - if self.item is not None and self.item.service_item_type == ServiceType.Command: - Receiver().send_message(u'%s_stop'% self.item.name.lower()) - self.item = item + if self.commandItem is not None and self.commandItem.service_item_type == ServiceType.Command: + Receiver().send_message(u'%s_stop'% self.commandItem.name.lower()) + self.commandItem = item self.enableToolBar(item) if item.service_item_type == ServiceType.Command: Receiver().send_message(u'%s_start'%item.name.lower(), \ @@ -334,8 +334,8 @@ class SlideController(QtGui.QWidget): """ Go to the next slide. """ - if self.item.service_item_type == ServiceType.Command: - Receiver().send_message(u'%s_next'% self.item.name.lower()) + if self.commandItem.service_item_type == ServiceType.Command: + Receiver().send_message(u'%s_next'% self.commandItem.name.lower()) else: row = self.PreviewListWidget.currentRow() + 1 if row == self.PreviewListWidget.rowCount(): @@ -347,8 +347,8 @@ class SlideController(QtGui.QWidget): """ Go to the previous slide. """ - if self.item.service_item_type == ServiceType.Command: - Receiver().send_message(u'%s_previous'% self.item.name.lower()) + if self.commandItem.service_item_type == ServiceType.Command: + Receiver().send_message(u'%s_previous'% self.commandItem.name.lower()) else: row = self.PreviewListWidget.currentRow() - 1 if row == -1: @@ -379,6 +379,3 @@ class SlideController(QtGui.QWidget): def timerEvent(self, event): if event.timerId() == self.timer_id: self.onSlideSelectedNext() - - - diff --git a/openlp/plugins/bibles/lib/biblestab.py b/openlp/plugins/bibles/lib/biblestab.py index 3a5f1ad37..39d85ea8b 100644 --- a/openlp/plugins/bibles/lib/biblestab.py +++ b/openlp/plugins/bibles/lib/biblestab.py @@ -184,14 +184,14 @@ class BiblesTab(SettingsTab): check_state = self.NewChaptersCheckBox.checkState() self.show_new_chapters = False # we have a set value convert to True/False - if check_state == 2: + if check_state == QtCore.Qt.Checked: self.show_new_chapters = True def onBibleSearchCheckBoxChanged(self): check_state = self.BibleSearchCheckBox.checkState() self.bible_search = False # we have a set value convert to True/False - if check_state == 2: + if check_state == QtCore.Qt.Checked: self.bible_search = True def load(self): diff --git a/openlp/plugins/custom/customplugin.py b/openlp/plugins/custom/customplugin.py index 13a72e201..999dccf93 100644 --- a/openlp/plugins/custom/customplugin.py +++ b/openlp/plugins/custom/customplugin.py @@ -28,10 +28,18 @@ from PyQt4 import QtCore, QtGui from forms import EditCustomForm from openlp.core.lib import Plugin -from openlp.plugins.custom.lib import CustomManager, CustomTab, CustomMediaItem +from openlp.plugins.custom.lib import CustomManager, CustomMediaItem class CustomPlugin(Plugin): + """ + This plugin enables the user to create, edit and display + custom slide shows. Custom shows are divided into slides. + Each show is able to have it's own theme. + Custom shows are designed to replace the use of songs where + the songs plugin has become restrictive. Examples could be + Welcome slides, Bible Reading information, Orders of service. + """ global log log=logging.getLogger(u'CustomPlugin') diff --git a/openlp/plugins/custom/forms/editcustomdialog.py b/openlp/plugins/custom/forms/editcustomdialog.py index 901b42295..b3f25f176 100644 --- a/openlp/plugins/custom/forms/editcustomdialog.py +++ b/openlp/plugins/custom/forms/editcustomdialog.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- # vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - ############################################################################### # OpenLP - Open Source Lyrics Projection # # --------------------------------------------------------------------------- # @@ -30,7 +29,7 @@ class Ui_customEditDialog(object): customEditDialog.setObjectName(u'customEditDialog') customEditDialog.resize(590, 541) icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(u':/icon/openlp-logo-16x16.png'), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon.addPixmap(QtGui.QPixmap(u':/icon/openlp.org-icon-32.bmp'), QtGui.QIcon.Normal, QtGui.QIcon.Off) customEditDialog.setWindowIcon(icon) self.gridLayout = QtGui.QGridLayout(customEditDialog) self.gridLayout.setObjectName(u'gridLayout') @@ -46,8 +45,8 @@ class Ui_customEditDialog(object): self.horizontalLayout_4 = QtGui.QHBoxLayout() self.horizontalLayout_4.setObjectName(u'horizontalLayout_4') self.VerseListView = QtGui.QListWidget(customEditDialog) - self.VerseListView.setObjectName(u'VerseListView') self.VerseListView.setAlternatingRowColors(True) + self.VerseListView.setObjectName(u'VerseListView') self.horizontalLayout_4.addWidget(self.VerseListView) self.verticalLayout = QtGui.QVBoxLayout() self.verticalLayout.setObjectName(u'verticalLayout') @@ -69,47 +68,49 @@ class Ui_customEditDialog(object): self.gridLayout.addLayout(self.horizontalLayout_4, 1, 0, 1, 1) self.EditWidget = QtGui.QWidget(customEditDialog) self.EditWidget.setObjectName(u'EditWidget') - self.EditLayout = QtGui.QHBoxLayout(self.EditWidget) - self.EditLayout.setSpacing(8) - self.EditLayout.setMargin(0) - self.EditLayout.setObjectName(u'EditLayout') + self.EditLayout_3 = QtGui.QHBoxLayout(self.EditWidget) + self.EditLayout_3.setSpacing(8) + self.EditLayout_3.setMargin(0) + self.EditLayout_3.setObjectName(u'EditLayout_3') self.VerseTextEdit = QtGui.QTextEdit(self.EditWidget) self.VerseTextEdit.setObjectName(u'VerseTextEdit') - self.EditLayout.addWidget(self.VerseTextEdit) - self.ButtonWidget = QtGui.QWidget(self.EditWidget) - self.ButtonWidget.setObjectName(u'ButtonWidget') - self.ButtonLayout = QtGui.QVBoxLayout(self.ButtonWidget) - self.ButtonLayout.setSpacing(8) - self.ButtonLayout.setMargin(0) - self.ButtonLayout.setObjectName(u'ButtonLayout') - self.AddButton = QtGui.QPushButton(self.ButtonWidget) + self.EditLayout_3.addWidget(self.VerseTextEdit) + self.ButtonWidge = QtGui.QWidget(self.EditWidget) + self.ButtonWidge.setObjectName(u'ButtonWidge') + self.verticalLayout_2 = QtGui.QVBoxLayout(self.ButtonWidge) + self.verticalLayout_2.setObjectName(u'verticalLayout_2') + self.AddButton = QtGui.QPushButton(self.ButtonWidge) self.AddButton.setObjectName(u'AddButton') - self.ButtonLayout.addWidget(self.AddButton) - self.EditButton = QtGui.QPushButton(self.ButtonWidget) + self.AddButton.setToolTip(translate(u'customEditDialog', u'Add new slide at bottom')) + self.verticalLayout_2.addWidget(self.AddButton) + self.EditButton = QtGui.QPushButton(self.ButtonWidge) self.EditButton.setObjectName(u'EditButton') - self.ButtonLayout.addWidget(self.EditButton) - self.SaveButton = QtGui.QPushButton(self.ButtonWidget) + self.verticalLayout_2.addWidget(self.EditButton) + self.EditAllButton = QtGui.QPushButton(self.ButtonWidge) + self.EditAllButton.setObjectName(u'EditAllButton') + self.verticalLayout_2.addWidget(self.EditAllButton) + self.SaveButton = QtGui.QPushButton(self.ButtonWidge) self.SaveButton.setObjectName(u'SaveButton') - self.ButtonLayout.addWidget(self.SaveButton) - self.DeleteButton = QtGui.QPushButton(self.ButtonWidget) + self.verticalLayout_2.addWidget(self.SaveButton) + self.DeleteButton = QtGui.QPushButton(self.ButtonWidge) self.DeleteButton.setObjectName(u'DeleteButton') - self.ButtonLayout.addWidget(self.DeleteButton) - self.ClearButton = QtGui.QPushButton(self.ButtonWidget) + self.verticalLayout_2.addWidget(self.DeleteButton) + self.ClearButton = QtGui.QPushButton(self.ButtonWidge) self.ClearButton.setObjectName(u'ClearButton') - self.ButtonLayout.addWidget(self.ClearButton) + self.verticalLayout_2.addWidget(self.ClearButton) spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) - self.ButtonLayout.addItem(spacerItem1) - self.EditLayout.addWidget(self.ButtonWidget) + self.verticalLayout_2.addItem(spacerItem1) + self.EditLayout_3.addWidget(self.ButtonWidge) self.gridLayout.addWidget(self.EditWidget, 2, 0, 1, 1) - self.horizontalLayout = QtGui.QHBoxLayout() - self.horizontalLayout.setObjectName(u'horizontalLayout') + self.horizontalLayout_3 = QtGui.QHBoxLayout() + self.horizontalLayout_3.setObjectName(u'horizontalLayout_3') self.ThemeLabel = QtGui.QLabel(customEditDialog) self.ThemeLabel.setObjectName(u'ThemeLabel') - self.horizontalLayout.addWidget(self.ThemeLabel) - self.ThemecomboBox = QtGui.QComboBox(customEditDialog) - self.ThemecomboBox.setObjectName(u'ThemecomboBox') - self.horizontalLayout.addWidget(self.ThemecomboBox) - self.gridLayout.addLayout(self.horizontalLayout, 3, 0, 1, 1) + self.horizontalLayout_3.addWidget(self.ThemeLabel) + self.ThemeComboBox = QtGui.QComboBox(customEditDialog) + self.ThemeComboBox.setObjectName(u'ThemeComboBox') + self.horizontalLayout_3.addWidget(self.ThemeComboBox) + self.gridLayout.addLayout(self.horizontalLayout_3, 3, 0, 1, 1) self.horizontalLayout_2 = QtGui.QHBoxLayout() self.horizontalLayout_2.setObjectName(u'horizontalLayout_2') self.CreditLabel = QtGui.QLabel(customEditDialog) @@ -123,24 +124,39 @@ class Ui_customEditDialog(object): self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) self.buttonBox.setObjectName(u'buttonBox') self.gridLayout.addWidget(self.buttonBox, 5, 0, 1, 1) + self.retranslateUi(customEditDialog) QtCore.QMetaObject.connectSlotsByName(customEditDialog) customEditDialog.setTabOrder(self.TitleEdit, self.VerseTextEdit) - customEditDialog.setTabOrder(self.VerseTextEdit, self.EditButton) - customEditDialog.setTabOrder(self.EditButton, self.SaveButton) - customEditDialog.setTabOrder(self.SaveButton, self.CreditEdit) - customEditDialog.setTabOrder(self.CreditEdit, self.VerseListView) - customEditDialog.setTabOrder(self.VerseListView, self.AddButton) - customEditDialog.setTabOrder(self.AddButton, self.DeleteButton) - customEditDialog.setTabOrder(self.DeleteButton, self.buttonBox) + customEditDialog.setTabOrder(self.VerseTextEdit, self.AddButton) + customEditDialog.setTabOrder(self.AddButton, self.VerseListView) + customEditDialog.setTabOrder(self.VerseListView, self.EditButton) + customEditDialog.setTabOrder(self.EditButton, self.EditAllButton) + customEditDialog.setTabOrder(self.EditAllButton, self.SaveButton) + customEditDialog.setTabOrder(self.SaveButton, self.DeleteButton) + customEditDialog.setTabOrder(self.DeleteButton, self.CreditEdit) + customEditDialog.setTabOrder(self.CreditEdit, self.UpButton) + customEditDialog.setTabOrder(self.UpButton, self.DownButton) + customEditDialog.setTabOrder(self.DownButton, self.ThemeComboBox) + customEditDialog.setTabOrder(self.ThemeComboBox, self.buttonBox) def retranslateUi(self, customEditDialog): - customEditDialog.setWindowTitle(translate(u'customEditDialog', u'Edit Custom Slides')) - self.TitleLabel.setText(translate(u'customEditDialog', u'Title:')) - self.AddButton.setText(translate(u'customEditDialog', u'Add')) - self.EditButton.setText(translate(u'customEditDialog', u'Edit')) - self.SaveButton.setText(translate(u'customEditDialog', u'Save')) - self.DeleteButton.setText(translate(u'customEditDialog', u'Delete')) - self.ClearButton.setText(translate(u'customEditDialog', u'Clear')) - self.ThemeLabel.setText(translate(u'customEditDialog', u'Theme:')) - self.CreditLabel.setText(translate(u'customEditDialog', u'Credits:')) + self.UpButton.setToolTip(translate(u'customEditDialog', u'Move slide Up 1')) + self.DownButton.setToolTip(translate(u'customEditDialog', u'Move slide down 1')) + customEditDialog.setWindowTitle(translate(u'customEditDialog', 'Edit Custom Slides')) + self.TitleLabel.setText(translate(u'customEditDialog', 'Title:')) + self.AddButton.setText(translate(u'customEditDialog', 'Add New')) + self.AddButton.setToolTip(translate(u'customEditDialog', u'Add new slide at bottom')) + self.EditButton.setText(translate(u'customEditDialog', 'Edit')) + self.EditButton.setToolTip(translate(u'customEditDialog', u'Edit selected slide')) + self.EditAllButton.setText(translate(u'customEditDialog', 'Edit All')) + self.EditAllButton.setToolTip(translate(u'customEditDialog', u'Edit all slides')) + self.SaveButton.setText(translate(u'customEditDialog', 'Save')) + self.SaveButton.setToolTip(translate(u'customEditDialog', u'Replace edited slide')) + self.DeleteButton.setText(translate(u'customEditDialog', 'Delete')) + self.DeleteButton.setToolTip(translate(u'customEditDialog', u'Delete selected slide')) + self.ClearButton.setText(translate(u'customEditDialog', 'Clear')) + self.ClearButton.setToolTip(translate(u'customEditDialog', u'Clear edit area')) + self.ThemeLabel.setText(translate(u'customEditDialog', 'Theme:')) + self.ThemeComboBox.setToolTip(translate(u'customEditDialog', u'Set Theme for Slides')) + self.CreditLabel.setText(translate(u'customEditDialog', 'Credits:')) diff --git a/openlp/plugins/custom/forms/editcustomform.py b/openlp/plugins/custom/forms/editcustomform.py index cdb48ed71..d5654db3e 100644 --- a/openlp/plugins/custom/forms/editcustomform.py +++ b/openlp/plugins/custom/forms/editcustomform.py @@ -40,20 +40,33 @@ class EditCustomForm(QtGui.QDialog, Ui_customEditDialog): #self.parent = parent self.setupUi(self) # Connecting signals and slots - QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'rejected()'), self.rejected) - QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(u'accepted()'), self.accept) - QtCore.QObject.connect(self.AddButton, QtCore.SIGNAL(u'pressed()'), self.onAddButtonPressed) - QtCore.QObject.connect(self.EditButton, QtCore.SIGNAL(u'pressed()'), self.onEditButtonPressed) - QtCore.QObject.connect(self.SaveButton, QtCore.SIGNAL(u'pressed()'), self.onSaveButtonPressed) - QtCore.QObject.connect(self.DeleteButton, QtCore.SIGNAL(u'pressed()'), self.onDeleteButtonPressed) - QtCore.QObject.connect(self.ClearButton, QtCore.SIGNAL(u'pressed()'), self.onClearButtonPressed) - QtCore.QObject.connect(self.UpButton, QtCore.SIGNAL(u'pressed()'), self.onUpButtonPressed) - QtCore.QObject.connect(self.DownButton, QtCore.SIGNAL(u'pressed()'), self.onDownButtonPressed) + QtCore.QObject.connect(self.buttonBox, + QtCore.SIGNAL(u'rejected()'), self.rejected) + QtCore.QObject.connect(self.buttonBox, + QtCore.SIGNAL(u'accepted()'), self.accept) + QtCore.QObject.connect(self.AddButton, + QtCore.SIGNAL(u'pressed()'), self.onAddButtonPressed) + QtCore.QObject.connect(self.EditButton, + QtCore.SIGNAL(u'pressed()'), self.onEditButtonPressed) + QtCore.QObject.connect(self.EditAllButton, + QtCore.SIGNAL(u'pressed()'), self.onEditAllButtonPressed) + QtCore.QObject.connect(self.SaveButton, + QtCore.SIGNAL(u'pressed()'), self.onSaveButtonPressed) + QtCore.QObject.connect(self.DeleteButton, + QtCore.SIGNAL(u'pressed()'), self.onDeleteButtonPressed) + QtCore.QObject.connect(self.ClearButton, + QtCore.SIGNAL(u'pressed()'), self.onClearButtonPressed) + QtCore.QObject.connect(self.UpButton, + QtCore.SIGNAL(u'pressed()'), self.onUpButtonPressed) + QtCore.QObject.connect(self.DownButton, + QtCore.SIGNAL(u'pressed()'), self.onDownButtonPressed) QtCore.QObject.connect(self.VerseListView, - QtCore.SIGNAL(u'itemDoubleClicked(QListWidgetItem*)'), self.onVerseListViewSelected) + QtCore.SIGNAL(u'itemDoubleClicked(QListWidgetItem*)'), + self.onVerseListViewSelected) QtCore.QObject.connect(self.VerseListView, - QtCore.SIGNAL(u'itemClicked(QListWidgetItem*)'), self.onVerseListViewPressed) + QtCore.SIGNAL(u'itemClicked(QListWidgetItem*)'), + self.onVerseListViewPressed) QtCore.QObject.connect(Receiver.get_receiver(), QtCore.SIGNAL(u'update_themes'), self.loadThemes) # Create other objects and forms @@ -61,23 +74,25 @@ class EditCustomForm(QtGui.QDialog, Ui_customEditDialog): self.initialise() def initialise(self): - self.valid = True + self.editAll = False self.DeleteButton.setEnabled(False) self.EditButton.setEnabled(False) + self.EditAllButton.setEnabled(True) self.SaveButton.setEnabled(False) + self.ClearButton.setEnabled(False) self.TitleEdit.setText(u'') self.CreditEdit.setText(u'') self.VerseTextEdit.clear() self.VerseListView.clear() #make sure we have a new item self.customSlide = CustomSlide() - self.ThemecomboBox.addItem(u'') + self.ThemeComboBox.addItem(u'') def loadThemes(self, themelist): - self.ThemecomboBox.clear() - self.ThemecomboBox.addItem(u'') + self.ThemeComboBox.clear() + self.ThemeComboBox.addItem(u'') for themename in themelist: - self.ThemecomboBox.addItem(themename) + self.ThemeComboBox.addItem(themename) def loadCustom(self, id): self.customSlide = CustomSlide() @@ -92,12 +107,12 @@ class EditCustomForm(QtGui.QDialog, Ui_customEditDialog): for verse in verseList: self.VerseListView.addItem(verse[1]) theme = unicode(self.customSlide.theme_name) - id = self.ThemecomboBox.findText(theme, QtCore.Qt.MatchExactly) + id = self.ThemeComboBox.findText(theme, QtCore.Qt.MatchExactly) if id == -1: id = 0 # Not Found - self.ThemecomboBox.setCurrentIndex(id) + self.ThemeComboBox.setCurrentIndex(id) else: - self.ThemecomboBox.setCurrentIndex(0) + self.ThemeComboBox.setCurrentIndex(0) def accept(self): valid , message = self._validate() @@ -116,7 +131,7 @@ class EditCustomForm(QtGui.QDialog, Ui_customEditDialog): self.customSlide.title = unicode(self.TitleEdit.displayText()) self.customSlide.text = unicode(sxml.extract_xml()) self.customSlide.credits = unicode(self.CreditEdit.displayText()) - self.customSlide.theme_name = unicode(self.ThemecomboBox.currentText()) + self.customSlide.theme_name = unicode(self.ThemeComboBox.currentText()) self.custommanager.save_slide(self.customSlide) self.close() @@ -140,6 +155,10 @@ class EditCustomForm(QtGui.QDialog, Ui_customEditDialog): def onClearButtonPressed(self): self.VerseTextEdit.clear() + self.editAll = False + self.AddButton.setEnabled(True) + self.EditAllButton.setEnabled(True) + self.SaveButton.setEnabled(False) def onVerseListViewPressed(self, item): self.DeleteButton.setEnabled(True) @@ -156,30 +175,52 @@ class EditCustomForm(QtGui.QDialog, Ui_customEditDialog): def onEditButtonPressed(self): self.editText(self.VerseListView.currentItem().text()) + def onEditAllButtonPressed(self): + self.editAll = True + self.AddButton.setEnabled(False) + if self.VerseListView.count() > 0: + verse_list = u'' + for row in range(0, self.VerseListView.count()): + item = self.VerseListView.item(row) + verse_list += item.text() + verse_list += u'\n---\n' + self.editText(verse_list) + def editText(self, text): self.beforeText = text self.VerseTextEdit.setPlainText(text) self.DeleteButton.setEnabled(False) self.EditButton.setEnabled(False) + self.EditAllButton.setEnabled(False) self.SaveButton.setEnabled(True) + self.ClearButton.setEnabled(True) def onSaveButtonPressed(self): - self.VerseListView.currentItem().setText(self.VerseTextEdit.toPlainText()) - #number of lines has change - if len(self.beforeText.split(u'\n')) != len(self.VerseTextEdit.toPlainText().split(u'\n')): - tempList = {} - for row in range(0, self.VerseListView.count()): - tempList[row] = self.VerseListView.item(row).text() + if self.editAll: self.VerseListView.clear() - for row in range (0, len(tempList)): - self.VerseListView.addItem(tempList[row]) - self.VerseListView.repaint() + for row in unicode(self.VerseTextEdit.toPlainText()).split(u'---'): + self.VerseListView.addItem(row) + else: + self.VerseListView.currentItem().setText(self.VerseTextEdit.toPlainText()) + #number of lines has change + if len(self.beforeText.split(u'\n')) != len(self.VerseTextEdit.toPlainText().split(u'\n')): + tempList = {} + for row in range(0, self.VerseListView.count()): + tempList[row] = self.VerseListView.item(row).text() + self.VerseListView.clear() + for row in range (0, len(tempList)): + self.VerseListView.addItem(tempList[row]) + self.VerseListView.repaint() + self.AddButton.setEnabled(True) self.SaveButton.setEnabled(False) self.EditButton.setEnabled(False) + self.EditAllButton.setEnabled(True) + self.VerseTextEdit.clear() def onDeleteButtonPressed(self): self.VerseListView.takeItem(self.VerseListView.currentRow()) self.EditButton.setEnabled(False) + self.EditAllButton.setEnabled(True) def _validate(self): valid = True diff --git a/openlp/plugins/custom/lib/__init__.py b/openlp/plugins/custom/lib/__init__.py index 5a29c92b7..bd5c46225 100644 --- a/openlp/plugins/custom/lib/__init__.py +++ b/openlp/plugins/custom/lib/__init__.py @@ -23,5 +23,4 @@ ############################################################################### from manager import CustomManager -from customtab import CustomTab from mediaitem import CustomMediaItem diff --git a/openlp/plugins/custom/lib/customtab.py b/openlp/plugins/custom/lib/customtab.py deleted file mode 100644 index b60d1a7e5..000000000 --- a/openlp/plugins/custom/lib/customtab.py +++ /dev/null @@ -1,37 +0,0 @@ -# -*- coding: utf-8 -*- -# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4 - -############################################################################### -# OpenLP - Open Source Lyrics Projection # -# --------------------------------------------------------------------------- # -# Copyright (c) 2008-2009 Raoul Snyman # -# Portions copyright (c) 2008-2009 Martin Thompson, Tim Bentley, Carsten # -# Tinggaard, Jon Tibble, Jonathan Corwin, Maikel Stuivenberg, Scott Guerrieri # -# --------------------------------------------------------------------------- # -# This program is free software; you can redistribute it and/or modify it # -# under the terms of the GNU General Public License as published by the Free # -# Software Foundation; version 2 of the License. # -# # -# This program is distributed in the hope that it will be useful, but WITHOUT # -# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or # -# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for # -# more details. # -# # -# You should have received a copy of the GNU General Public License along # -# with this program; if not, write to the Free Software Foundation, Inc., 59 # -# Temple Place, Suite 330, Boston, MA 02111-1307 USA # -############################################################################### - -from PyQt4 import QtCore, QtGui - -from openlp.core.lib import SettingsTab, translate - -class CustomTab(SettingsTab): - """ - SongsTab is the songs settings tab in the settings dialog. - """ - def __init__(self): - SettingsTab.__init__(self, translate(u'CustomTab', u'Custom'), u'Custom') - - def setupUi(self): - self.setObjectName(u'CustomTab') diff --git a/openlp/plugins/custom/lib/mediaitem.py b/openlp/plugins/custom/lib/mediaitem.py index c47299804..b8429efed 100644 --- a/openlp/plugins/custom/lib/mediaitem.py +++ b/openlp/plugins/custom/lib/mediaitem.py @@ -26,7 +26,8 @@ import logging from PyQt4 import QtCore, QtGui -from openlp.core.lib import MediaManagerItem, SongXMLParser, ServiceItem, translate, contextMenuAction, contextMenuSeparator, BaseListWithDnD +from openlp.core.lib import MediaManagerItem, SongXMLParser, ServiceItem, \ + translate, contextMenuAction, contextMenuSeparator, BaseListWithDnD class CustomListView(BaseListWithDnD): def __init__(self, parent=None): @@ -45,78 +46,18 @@ class CustomMediaItem(MediaManagerItem): self.TranslationContext = u'CustomPlugin' self.PluginTextShort = u'Custom' self.ConfigSection = u'custom' + self.IconPath = u'custom/custom' + self.hasFileIcon = False + self.hasNewIcon = True + self.hasEditIcon = True + # this next is a class, not an instance of a class - it will + # be instanced by the base MediaManagerItem + self.ListViewWithDnD_class = CustomListView + self.ServiceItemIconName = u':/custom/custom_image.png' + self.servicePath = None MediaManagerItem.__init__(self, parent, icon, title) self.parent = parent - def setupUi(self): - # Add a toolbar - self.addToolbar() - # Create buttons for the toolbar - ## New Custom Button ## - self.addToolbarButton( - translate(u'CustomMediaItem',u'New Custom Item'), - translate(u'CustomMediaItem',u'Add a new Custom Item'), - u':/custom/custom_new.png', self.onCustomNewClick, u'CustomNewItem') - ## Edit Custom Button ## - self.addToolbarButton( - translate(u'CustomMediaItem',u'Edit Custom Item'), - translate(u'CustomMediaItem',u'Edit the selected Custom Item'), - u':/custom/custom_edit.png', self.onCustomEditClick, u'CustomEditItem') - ## Delete Custom Button ## - self.addToolbarButton( - translate(u'CustomMediaItem',u'Delete Custom Item'), - translate(u'CustomMediaItem',u'Delete the selected Custom Item'), - u':/custom/custom_delete.png', self.onCustomDeleteClick, u'CustomDeleteItem') - ## Separator Line ## - self.addToolbarSeparator() - ## Preview Custom Button ## - self.addToolbarButton( - translate(u'CustomMediaItem',u'Preview Custom Item'), - translate(u'CustomMediaItem',u'Preview the selected Custom Item'), - u':/system/system_preview.png', self.onPreviewClick, u'CustomPreviewItem') - ## Live Custom Button ## - self.addToolbarButton( - translate(u'CustomMediaItem',u'Go Live'), - translate(u'CustomMediaItem', u'Send the selected Custom live'), - u':/system/system_live.png', self.onLiveClick, u'CustomLiveItem') - ## Add Custom Button ## - self.addToolbarButton( - translate(u'CustomMediaItem',u'Add Custom To Service'), - translate(u'CustomMediaItem',u'Add the selected Custom(s) to the service'), - u':/system/system_add.png', self.onAddClick, u'CustomAddItem') - # Add the CustomListView widget - self.CustomWidget = QtGui.QWidget(self) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) - sizePolicy.setHorizontalStretch(0) - sizePolicy.setVerticalStretch(0) - sizePolicy.setHeightForWidth(self.CustomWidget.sizePolicy().hasHeightForWidth()) - self.CustomWidget.setSizePolicy(sizePolicy) - self.CustomWidget.setObjectName(u'CustomWidget') - # Add the Custom widget to the page layout - self.PageLayout.addWidget(self.CustomWidget) - self.ListView = CustomListView() - self.ListView.setAlternatingRowColors(True) - self.ListView.setDragEnabled(True) - self.PageLayout.addWidget(self.ListView) - # Signals - QtCore.QObject.connect(self.ListView, - QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onPreviewClick) - #define and add the context menu - self.ListView.setContextMenuPolicy(QtCore.Qt.ActionsContextMenu) - self.ListView.addAction(contextMenuAction(self.ListView, - ':/custom/custom_edit.png', translate(u'CustomMediaItem', u'&Edit Custom'), - self.onCustomEditClick)) - self.ListView.addAction(contextMenuSeparator(self.ListView)) - self.ListView.addAction(contextMenuAction( - self.ListView, ':/system/system_preview.png', - translate(u'CustomMediaItem',u'&Preview Custom'), self.onPreviewClick)) - self.ListView.addAction(contextMenuAction( - self.ListView, ':/system/system_live.png', - translate(u'CustomMediaItem',u'&Show Live'), self.onLiveClick)) - self.ListView.addAction(contextMenuAction( - self.ListView, ':/system/system_add.png', - translate(u'CustomMediaItem',u'&Add to Service'), self.onAddClick)) - def initialise(self): self.loadCustomListView(self.parent.custommanager.get_all_slides()) @@ -127,12 +68,12 @@ class CustomMediaItem(MediaManagerItem): custom_name.setData(QtCore.Qt.UserRole, QtCore.QVariant(CustomSlide.id)) self.ListView.addItem(custom_name) - def onCustomNewClick(self): + def onNewClick(self): self.parent.edit_custom_form.loadCustom(0) self.parent.edit_custom_form.exec_() self.initialise() - def onCustomEditClick(self): + def onEditClick(self): item = self.ListView.currentItem() if item is not None: item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] @@ -140,7 +81,7 @@ class CustomMediaItem(MediaManagerItem): self.parent.edit_custom_form.exec_() self.initialise() - def onCustomDeleteClick(self): + def onDeleteClick(self): item = self.ListView.currentItem() if item is not None: item_id = (item.data(QtCore.Qt.UserRole)).toInt()[0] diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py index 09efb2d5c..ab076b088 100644 --- a/openlp/plugins/images/lib/mediaitem.py +++ b/openlp/plugins/images/lib/mediaitem.py @@ -53,7 +53,6 @@ class ImageMediaItem(MediaManagerItem): self.hasEditIcon = False self.OnNewPrompt = u'Select Image(s)' self.OnNewFileMasks = u'Images (*.jpg *jpeg *.gif *.png *.bmp)' - self.slidecontroller = u'image' # this next is a class, not an instance of a class - it will # be instanced by the base MediaManagerItem self.ListViewWithDnD_class = ImageListView diff --git a/openlp/plugins/presentations/lib/__init__.py b/openlp/plugins/presentations/lib/__init__.py index b2bbadaa5..2ee88aaba 100644 --- a/openlp/plugins/presentations/lib/__init__.py +++ b/openlp/plugins/presentations/lib/__init__.py @@ -23,7 +23,7 @@ ############################################################################### from impresscontroller import ImpressController -from powerpointcontroller import PowerpointController +#from powerpointcontroller import PowerpointController from messagelistener import MessageListener from mediaitem import PresentationMediaItem from presentationtab import PresentationTab diff --git a/openlp/plugins/presentations/lib/impresscontroller.py b/openlp/plugins/presentations/lib/impresscontroller.py index 6124333eb..854e1ff7e 100644 --- a/openlp/plugins/presentations/lib/impresscontroller.py +++ b/openlp/plugins/presentations/lib/impresscontroller.py @@ -57,7 +57,8 @@ class ImpressController(object): when required. """ log.debug(u'start Openoffice') - cmd = u'openoffice.org -nologo -norestore -minimized -headless ' + u'"' + u'-accept=socket,host=localhost,port=2002;urp;'+ u'"' + # -headless + cmd = u'openoffice.org -nologo -norestore -minimized -invisible ' + u'"' + u'-accept=socket,host=localhost,port=2002;urp;'+ u'"' self.process = QtCore.QProcess() self.process.startDetached(cmd) self.process.waitForStarted() diff --git a/openlp/plugins/presentations/lib/mediaitem.py b/openlp/plugins/presentations/lib/mediaitem.py index c86bf2fff..5e20ce745 100644 --- a/openlp/plugins/presentations/lib/mediaitem.py +++ b/openlp/plugins/presentations/lib/mediaitem.py @@ -62,7 +62,7 @@ class PresentationMediaItem(MediaManagerItem): MediaManagerItem.__init__(self, parent, icon, title) self.message_listener = MessageListener(controllers) - def addHeaderBar(self): + def addEndHeaderBar(self): self.PresentationWidget = QtGui.QWidget(self) sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) diff --git a/openlp/plugins/presentations/lib/powerpointcontroller.py b/openlp/plugins/presentations/lib/powerpointcontroller.py index e31c1ce4e..b239e350c 100644 --- a/openlp/plugins/presentations/lib/powerpointcontroller.py +++ b/openlp/plugins/presentations/lib/powerpointcontroller.py @@ -21,8 +21,10 @@ # with this program; if not, write to the Free Software Foundation, Inc., 59 # # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### - -from win32com.client import Dispatch +try: + from win32com.client import Dispatch +except: + pass # PPT API documentation: # http://msdn.microsoft.com/en-us/library/aa269321(office.10).aspx diff --git a/openlp/plugins/presentations/presentationplugin.py b/openlp/plugins/presentations/presentationplugin.py index 605b0d5bc..7f2d07c11 100644 --- a/openlp/plugins/presentations/presentationplugin.py +++ b/openlp/plugins/presentations/presentationplugin.py @@ -30,7 +30,12 @@ from PyQt4 import QtCore, QtGui from openlp.core.lib import Plugin, MediaManagerItem from openlp.plugins.presentations.lib import PresentationMediaItem, PresentationTab, \ - ImpressController, PowerpointController + ImpressController +try: + from openlp.plugins.presentations.lib import PowerpointController +except: + pass + class PresentationPlugin(Plugin): @@ -72,7 +77,7 @@ class PresentationPlugin(Plugin): """ log.debug('check_pre_conditions') #Lets see if Impress is required (Default is Not wanted) - if int(self.config.get_config(u'Impress', 0)) == 2: + if int(self.config.get_config(u'Impress', QtCore.Qt.Unchecked)) == QtCore.Qt.Checked: try: #Check to see if we have uno installed import uno @@ -80,8 +85,8 @@ class PresentationPlugin(Plugin): self.registerControllers(u'Impress', openoffice) except: log.error(u'Reason : %s', sys.exc_info()) - #Lets see if Impress is required (Default is Not wanted) - if int(self.config.get_config(u'Powerpoint', 0)) == 2: + #Lets see if Powerpoint is required (Default is Not wanted) + if int(self.config.get_config(u'Powerpoint', QtCore.Qt.Unchecked)) == QtCore.Qt.Checked: try: #Check to see if we are Win32 from win32com.client import Dispatch @@ -89,8 +94,8 @@ class PresentationPlugin(Plugin): self.registerControllers(u'Powerpoint', powerpoint) except: log.error(u'Reason : %s', sys.exc_info()) - #Lets see if Impress is required (Default is Not wanted) - if int(self.config.get_config(u'Powerpoint Viewer', 0)) == 2: + #Lets see if Powerpoint Viewer is required (Default is Not wanted) + if int(self.config.get_config(u'Powerpoint Viewer', QtCore.Qt.Unchecked)) == QtCore.Qt.Checked: try: #Check to see if we are Win32 from win32com.client import Dispatch @@ -108,5 +113,4 @@ class PresentationPlugin(Plugin): log.debug(u'Finalise') #Ask each controller to tidy up for controller in self.controllers: - print controller self.controllers[controller].kill() diff --git a/openlp/plugins/remotes/remoteplugin.py b/openlp/plugins/remotes/remoteplugin.py index 6852e08d2..4205b994d 100644 --- a/openlp/plugins/remotes/remoteplugin.py +++ b/openlp/plugins/remotes/remoteplugin.py @@ -42,7 +42,7 @@ class RemotesPlugin(Plugin): """ log.debug('check_pre_conditions') #Lets see if Remote is required - if int(self.config.get_config(u'startup', 0)) == 2: + if int(self.config.get_config(u'startup', 0)) == QtCore.Qt.Checked: return True else: return False diff --git a/resources/forms/editcustomdialog.ui b/resources/forms/editcustomdialog.ui index 3fce3f588..98bc1abb0 100644 --- a/resources/forms/editcustomdialog.ui +++ b/resources/forms/editcustomdialog.ui @@ -14,7 +14,7 @@ Edit Custom Slides - + :/icon/openlp.org-icon-32.bmp:/icon/openlp.org-icon-32.bmp @@ -35,12 +35,19 @@ - + + + true + + + + + @@ -65,6 +72,9 @@ + + + @@ -88,33 +98,46 @@ 0 - + - - - 8 - - - 0 - + - + + + + - Add + Add New - + + + + Edit - + + + + + + Edit All + + + + + + + + Save @@ -122,11 +145,24 @@ + + + Delete + + + + + + + Clear + + + @@ -156,7 +192,11 @@ - + + + + + @@ -185,13 +225,17 @@ TitleEdit - VerseTextEdit_3 - EditButton_3 - SaveButton_3 - CreditEdit + VerseTextEdit + AddButton VerseListView - AddButton_3 + EditButton + EditAllButton + SaveButton DeleteButton + CreditEdit + UpButton + DownButton + ThemeComboBox buttonBox