diff --git a/openlp/core/__init__.py b/openlp/core/__init__.py index a6cfa60c7..b325f0c6c 100644 --- a/openlp/core/__init__.py +++ b/openlp/core/__init__.py @@ -24,8 +24,298 @@ # Temple Place, Suite 330, Boston, MA 02111-1307 USA # ############################################################################### """ -The :mod:`core` module provides all core application functions - -All the core functions of the OpenLP application including the GUI, settings, -logging and a plugin framework are contained within the openlp.core module. +The :mod:`lib` module contains most of the components and libraries that make +OpenLP work. """ +import logging +import os.path +import types + +from PyQt4 import QtCore, QtGui + +log = logging.getLogger(__name__) + +# TODO make external and configurable in alpha 4 via a settings dialog +html_expands = [] + +html_expands.append({u'desc':u'Red', u'start tag':u'{r}', + u'start html':u'', + u'end tag':u'{/r}', u'end html':u'', u'protected':False}) +html_expands.append({u'desc':u'Black', u'start tag':u'{b}', + u'start html':u'', + u'end tag':u'{/b}', u'end html':u'', u'protected':False}) +html_expands.append({u'desc':u'Blue', u'start tag':u'{bl}', + u'start html':u'', + u'end tag':u'{/bl}', u'end html':u'', u'protected':False}) +html_expands.append({u'desc':u'Yellow', u'start tag':u'{y}', + u'start html':u'', + u'end tag':u'{/y}', u'end html':u'', u'protected':False}) +html_expands.append({u'desc':u'Green', u'start tag':u'{g}', + u'start html':u'', + u'end tag':u'{/g}', u'end html':u'', u'protected':False}) +html_expands.append({u'desc':u'Pink', u'start tag':u'{pk}', + u'start html':u'', + u'end tag':u'{/pk}', u'end html':u'', u'protected':False}) +html_expands.append({u'desc':u'Orange', u'start tag':u'{o}', + u'start html':u'', + u'end tag':u'{/o}', u'end html':u'', u'protected':False}) +html_expands.append({u'desc':u'Purple', u'start tag':u'{pp}', + u'start html':u'', + u'end tag':u'{/pp}', u'end html':u'', u'protected':False}) +html_expands.append({u'desc':u'White', u'start tag':u'{w}', + u'start html':u'', + u'end tag':u'{/w}', u'end html':u'', u'protected':False}) +html_expands.append({u'desc':u'Superscript', u'start tag':u'{su}', + u'start html':u'', u'end tag':u'{/su}', u'end html':u'', + u'protected':True}) +html_expands.append({u'desc':u'Subscript', u'start tag':u'{sb}', + u'start html':u'', u'end tag':u'{/sb}', u'end html':u'', + u'protected':True}) +html_expands.append({u'desc':u'Paragraph', u'start tag':u'{p}', + u'start html':u'

', u'end tag':u'{/p}', u'end html':u'

', + u'protected':True}) +html_expands.append({u'desc':u'Bold', u'start tag':u'{st}', + u'start html':u'', u'end tag':u'{/st}', u'end html':u'', + u'protected':True}) +html_expands.append({u'desc':u'Italics', u'start tag':u'{it}', + u'start html':u'', u'end tag':u'{/it}', u'end html':u'', + u'protected':True}) + +def translate(context, text, comment=None): + """ + A special shortcut method to wrap around the Qt4 translation functions. + This abstracts the translation procedure so that we can change it if at a + later date if necessary, without having to redo the whole of OpenLP. + + ``context`` + The translation context, used to give each string a context or a + namespace. + + ``text`` + The text to put into the translation tables for translation. + + ``comment`` + An identifying string for when the same text is used in different roles + within the same context. + """ + return QtCore.QCoreApplication.translate(context, text, comment) + +def get_text_file_string(text_file): + """ + Open a file and return its content as unicode string. If the supplied file + name is not a file then the function returns False. If there is an error + loading the file or the content can't be decoded then the function will + return None. + + ``textfile`` + The name of the file. + """ + if not os.path.isfile(text_file): + return False + file_handle = None + content_string = None + try: + file_handle = open(text_file, u'r') + content = file_handle.read() + content_string = content.decode(u'utf-8') + except (IOError, UnicodeError): + log.exception(u'Failed to open text file %s' % text_file) + finally: + if file_handle: + file_handle.close() + return content_string + +def str_to_bool(stringvalue): + """ + Convert a string version of a boolean into a real boolean. + + ``stringvalue`` + The string value to examine and convert to a boolean type. + """ + if isinstance(stringvalue, bool): + return stringvalue + return unicode(stringvalue).strip().lower() in (u'true', u'yes', u'y') + +def build_icon(icon): + """ + Build a QIcon instance from an existing QIcon, a resource location, or a + physical file location. If the icon is a QIcon instance, that icon is + simply returned. If not, it builds a QIcon instance from the resource or + file name. + + ``icon`` + The icon to build. This can be a QIcon, a resource string in the form + ``:/resource/file.png``, or a file location like ``/path/to/file.png``. + """ + button_icon = QtGui.QIcon() + if isinstance(icon, QtGui.QIcon): + button_icon = icon + elif isinstance(icon, basestring): + if icon.startswith(u':/'): + button_icon.addPixmap(QtGui.QPixmap(icon), QtGui.QIcon.Normal, + QtGui.QIcon.Off) + else: + button_icon.addPixmap(QtGui.QPixmap.fromImage(QtGui.QImage(icon)), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + elif isinstance(icon, QtGui.QImage): + button_icon.addPixmap(QtGui.QPixmap.fromImage(icon), + QtGui.QIcon.Normal, QtGui.QIcon.Off) + return button_icon + +def context_menu_action(base, icon, text, slot): + """ + Utility method to help build context menus for plugins + + ``base`` + The parent menu to add this menu item to + + ``icon`` + An icon for this action + + ``text`` + The text to display for this action + + ``slot`` + The code to run when this action is triggered + """ + action = QtGui.QAction(text, base) + if icon: + action.setIcon(build_icon(icon)) + QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot) + return action + +def context_menu(base, icon, text): + """ + Utility method to help build context menus for plugins + + ``base`` + The parent object to add this menu to + + ``icon`` + An icon for this menu + + ``text`` + The text to display for this menu + """ + action = QtGui.QMenu(text, base) + action.setIcon(build_icon(icon)) + return action + +def context_menu_separator(base): + """ + Add a separator to a context menu + + ``base`` + The menu object to add the separator to + """ + action = QtGui.QAction(u'', base) + action.setSeparator(True) + return action + +def image_to_byte(image): + """ + Resize an image to fit on the current screen for the web and returns + it as a byte stream. + + ``image`` + The image to converted. + """ + byte_array = QtCore.QByteArray() + # use buffer to store pixmap into byteArray + buffie = QtCore.QBuffer(byte_array) + buffie.open(QtCore.QIODevice.WriteOnly) + if isinstance(image, QtGui.QImage): + pixmap = QtGui.QPixmap.fromImage(image) + else: + pixmap = QtGui.QPixmap(image) + pixmap.save(buffie, "PNG") + # convert to base64 encoding so does not get missed! + return byte_array.toBase64() + +def resize_image(image, width, height, background=QtCore.Qt.black): + """ + Resize an image to fit on the current screen. + + ``image`` + The image to resize. + + ``width`` + The new image width. + + ``height`` + The new image height. + + ``background`` + The background colour defaults to black. + + """ + preview = QtGui.QImage(image) + if not preview.isNull(): + # Only resize if different size + if preview.width() == width and preview.height == height: + return preview + preview = preview.scaled(width, height, QtCore.Qt.KeepAspectRatio, + QtCore.Qt.SmoothTransformation) + realw = preview.width() + realh = preview.height() + # and move it to the centre of the preview space + new_image = QtGui.QImage(width, height, + QtGui.QImage.Format_ARGB32_Premultiplied) + new_image.fill(background) + painter = QtGui.QPainter(new_image) + painter.drawImage((width - realw) / 2, (height - realh) / 2, preview) + return new_image + +def check_item_selected(list_widget, message): + """ + Check if a list item is selected so an action may be performed on it + + ``list_widget`` + The list to check for selected items + + ``message`` + The message to give the user if no item is selected + """ + if not list_widget.selectedIndexes(): + QtGui.QMessageBox.information(list_widget.parent(), + translate('OpenLP.MediaManagerItem', 'No Items Selected'), message) + return False + return True + +def clean_tags(text): + """ + Remove Tags from text for display + """ + text = text.replace(u'
', u'\n') + for tag in html_expands: + text = text.replace(tag[u'start tag'], u'') + text = text.replace(tag[u'end tag'], u'') + return text + +def expand_tags(text): + """ + Expand tags HTML for display + """ + for tag in html_expands: + text = text.replace(tag[u'start tag'], tag[u'start html']) + text = text.replace(tag[u'end tag'], tag[u'end html']) + return text + +from spelltextedit import SpellTextEdit +from eventreceiver import Receiver +from settingsmanager import SettingsManager +from plugin import PluginStatus, Plugin +from pluginmanager import PluginManager +from settingstab import SettingsTab +from serviceitem import ServiceItem +from serviceitem import ServiceItemType +from serviceitem import ItemCapabilities +from htmlbuilder import build_html, build_lyrics_format_css, \ + build_lyrics_outline_css +from toolbar import OpenLPToolbar +from dockwidget import OpenLPDockWidget +from theme import ThemeLevel, ThemeXML +from renderer import Renderer +from rendermanager import RenderManager +from mediamanageritem import MediaManagerItem +from baselistwithdnd import BaseListWithDnD