diff --git a/openlp/core/lib/mediamanageritem.py b/openlp/core/lib/mediamanageritem.py
index a79355c88..0cc25717c 100644
--- a/openlp/core/lib/mediamanageritem.py
+++ b/openlp/core/lib/mediamanageritem.py
@@ -288,6 +288,7 @@ class MediaManagerItem(QtGui.QWidget):
self.listView, u':/general/general_add.png',
translate('OpenLP.MediaManagerItem',
'&Add to selected Service Item'), self.onAddEditClick)
+ self.addCustomContextActions()
# Create the context menu and add all actions from the listView.
self.menu = QtGui.QMenu()
self.menu.addActions(self.listView.actions())
@@ -301,6 +302,13 @@ class MediaManagerItem(QtGui.QWidget):
QtCore.SIGNAL('customContextMenuRequested(QPoint)'),
self.contextMenu)
+ def addCustomContextActions(self):
+ """
+ Implement this method in your descendent media manager item to
+ add any context menu items. This method is called automatically.
+ """
+ pass
+
def initialise(self):
"""
Implement this method in your descendent media manager item to
diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py
index b661b1e49..72a998efe 100644
--- a/openlp/core/ui/maindisplay.py
+++ b/openlp/core/ui/maindisplay.py
@@ -233,10 +233,12 @@ class MainDisplay(QtGui.QGraphicsView):
API for replacement backgrounds so Images are added directly to cache
"""
self.image_manager.add_image(name, path)
- self.image(name)
if hasattr(self, u'serviceItem'):
self.override[u'image'] = name
self.override[u'theme'] = self.serviceItem.themedata.theme_name
+ self.image(name)
+ return True
+ return False
def image(self, name):
"""
@@ -349,6 +351,9 @@ class MainDisplay(QtGui.QGraphicsView):
"""
Loads and starts a video to run with the option of sound
"""
+ # We request a background video but have no service Item
+ if isBackground and not hasattr(self, u'serviceItem'):
+ return None
if not self.mediaObject:
self.createMediaObject()
log.debug(u'video')
diff --git a/openlp/core/ui/serviceitemeditdialog.py b/openlp/core/ui/serviceitemeditdialog.py
index a00feafc7..d821430b2 100644
--- a/openlp/core/ui/serviceitemeditdialog.py
+++ b/openlp/core/ui/serviceitemeditdialog.py
@@ -35,6 +35,8 @@ class Ui_ServiceItemEditDialog(object):
def setupUi(self, serviceItemEditDialog):
serviceItemEditDialog.setObjectName(u'serviceItemEditDialog')
self.dialogLayout = QtGui.QGridLayout(serviceItemEditDialog)
+ self.dialogLayout.setContentsMargins(8, 8, 8, 8)
+ self.dialogLayout.setSpacing(8)
self.dialogLayout.setObjectName(u'dialogLayout')
self.listWidget = QtGui.QListWidget(serviceItemEditDialog)
self.listWidget.setAlternatingRowColors(True)
diff --git a/openlp/core/ui/servicemanager.py b/openlp/core/ui/servicemanager.py
index 6424dfb2c..6a34dc1e6 100644
--- a/openlp/core/ui/servicemanager.py
+++ b/openlp/core/ui/servicemanager.py
@@ -48,18 +48,18 @@ class ServiceManagerList(QtGui.QTreeWidget):
"""
Set up key bindings and mouse behaviour for the service list
"""
- def __init__(self, mainwindow, parent=None, name=None):
+ def __init__(self, serviceManager, parent=None, name=None):
QtGui.QTreeWidget.__init__(self, parent)
- self.mainwindow = mainwindow
+ self.serviceManager = serviceManager
def keyPressEvent(self, event):
if isinstance(event, QtGui.QKeyEvent):
# here accept the event and do something
if event.key() == QtCore.Qt.Key_Up:
- self.mainwindow.onMoveSelectionUp()
+ self.serviceManager.onMoveSelectionUp()
event.accept()
elif event.key() == QtCore.Qt.Key_Down:
- self.mainwindow.onMoveSelectionDown()
+ self.serviceManager.onMoveSelectionDown()
event.accept()
event.ignore()
else:
@@ -688,7 +688,7 @@ class ServiceManager(QtGui.QWidget):
QtGui.QAction, serviceItem[u'service_item'].theme)
if themeAction is not None:
themeAction.setChecked(True)
- action = self.menu.exec_(self.serviceManagerList.mapToGlobal(point))
+ self.menu.exec_(self.serviceManagerList.mapToGlobal(point))
def onServiceItemNoteForm(self):
item = self.findServiceItem()[0]
diff --git a/openlp/core/ui/servicenoteform.py b/openlp/core/ui/servicenoteform.py
index d361c567e..3bc55e242 100644
--- a/openlp/core/ui/servicenoteform.py
+++ b/openlp/core/ui/servicenoteform.py
@@ -49,6 +49,8 @@ class ServiceNoteForm(QtGui.QDialog):
def setupUi(self):
self.setObjectName(u'serviceNoteEdit')
self.dialogLayout = QtGui.QVBoxLayout(self)
+ self.dialogLayout.setContentsMargins(8, 8, 8, 8)
+ self.dialogLayout.setSpacing(8)
self.dialogLayout.setObjectName(u'verticalLayout')
self.textEdit = QtGui.QTextEdit(self)
self.textEdit.setObjectName(u'textEdit')
diff --git a/openlp/core/ui/slidecontroller.py b/openlp/core/ui/slidecontroller.py
index 8e2c199a1..e86e2e760 100644
--- a/openlp/core/ui/slidecontroller.py
+++ b/openlp/core/ui/slidecontroller.py
@@ -27,6 +27,7 @@
import logging
import os
+import time
from PyQt4 import QtCore, QtGui
from PyQt4.phonon import Phonon
@@ -412,9 +413,11 @@ class SlideController(QtGui.QWidget):
self.display.videoStop()
def servicePrevious(self):
+ time.sleep(0.1)
Receiver.send_message('servicemanager_previous_item')
def serviceNext(self):
+ time.sleep(0.1)
Receiver.send_message('servicemanager_next_item')
def screenSizeChanged(self):
diff --git a/openlp/core/ui/thememanager.py b/openlp/core/ui/thememanager.py
index ff852c591..69c229532 100644
--- a/openlp/core/ui/thememanager.py
+++ b/openlp/core/ui/thememanager.py
@@ -39,7 +39,8 @@ from openlp.core.lib import OpenLPToolbar, get_text_file_string, build_icon, \
check_directory_exists
from openlp.core.lib.theme import ThemeXML, BackgroundType, VerticalType, \
BackgroundGradientType
-from openlp.core.lib.ui import UiStrings, critical_error_message_box
+from openlp.core.lib.ui import UiStrings, critical_error_message_box, \
+ context_menu_action, context_menu_separator
from openlp.core.theme import Theme
from openlp.core.ui import FileRenameForm, ThemeForm
from openlp.core.utils import AppLocation, delete_file, file_is_unicode, \
@@ -104,25 +105,29 @@ class ThemeManager(QtGui.QWidget):
self.contextMenu)
# build the context menu
self.menu = QtGui.QMenu()
- self.editAction = self.menu.addAction(
- translate('OpenLP.ThemeManager', '&Edit Theme'))
- self.editAction.setIcon(build_icon(u':/themes/theme_edit.png'))
- self.copyAction = self.menu.addAction(
- translate('OpenLP.ThemeManager', '&Copy Theme'))
- self.copyAction.setIcon(build_icon(u':/themes/theme_edit.png'))
- self.renameAction = self.menu.addAction(
- translate('OpenLP.ThemeManager', '&Rename Theme'))
- self.renameAction.setIcon(build_icon(u':/themes/theme_edit.png'))
- self.deleteAction = self.menu.addAction(
- translate('OpenLP.ThemeManager', '&Delete Theme'))
- self.deleteAction.setIcon(build_icon(u':/general/general_delete.png'))
- self.separator = self.menu.addSeparator()
- self.globalAction = self.menu.addAction(
- translate('OpenLP.ThemeManager', 'Set As &Global Default'))
- self.globalAction.setIcon(build_icon(u':/general/general_export.png'))
- self.exportAction = self.menu.addAction(
- translate('OpenLP.ThemeManager', '&Export Theme'))
- self.exportAction.setIcon(build_icon(u':/general/general_export.png'))
+ self.editAction = context_menu_action(
+ self.menu, u':/themes/theme_edit.png',
+ translate('OpenLP.ThemeManager', '&Edit Theme'), self.onEditTheme)
+ self.copyAction = context_menu_action(
+ self.menu, u':/themes/theme_edit.png',
+ translate('OpenLP.ThemeManager', '&Copy Theme'), self.onCopyTheme)
+ self.renameAction = context_menu_action(
+ self.menu, u':/themes/theme_edit.png',
+ translate('OpenLP.ThemeManager', '&Rename Theme'),
+ self.onRenameTheme)
+ self.deleteAction = context_menu_action(
+ self.menu, u':/general/general_delete.png',
+ translate('OpenLP.ThemeManager', '&Delete Theme'),
+ self.onDeleteTheme)
+ context_menu_separator(self.menu)
+ self.globalAction = context_menu_action(
+ self.menu, u':/general/general_export.png',
+ translate('OpenLP.ThemeManager', 'Set As &Global Default'),
+ self.changeGlobalFromScreen)
+ self.exportAction = context_menu_action(
+ self.menu, u':/general/general_export.png',
+ translate('OpenLP.ThemeManager', '&Export Theme'),
+ self.onExportTheme)
# Signals
QtCore.QObject.connect(self.themeListWidget,
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'),
@@ -198,19 +203,7 @@ class ThemeManager(QtGui.QWidget):
self.deleteAction.setVisible(True)
self.renameAction.setVisible(True)
self.globalAction.setVisible(True)
- action = self.menu.exec_(self.themeListWidget.mapToGlobal(point))
- if action == self.editAction:
- self.onEditTheme()
- if action == self.copyAction:
- self.onCopyTheme()
- if action == self.renameAction:
- self.onRenameTheme()
- if action == self.deleteAction:
- self.onDeleteTheme()
- if action == self.globalAction:
- self.changeGlobalFromScreen()
- if action == self.exportAction:
- self.onExportTheme()
+ self.menu.exec_(self.themeListWidget.mapToGlobal(point))
def changeGlobalFromTab(self, themeName):
"""
diff --git a/openlp/plugins/bibles/lib/mediaitem.py b/openlp/plugins/bibles/lib/mediaitem.py
index cb8273327..0734df818 100644
--- a/openlp/plugins/bibles/lib/mediaitem.py
+++ b/openlp/plugins/bibles/lib/mediaitem.py
@@ -34,7 +34,8 @@ from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \
translate
from openlp.core.lib.searchedit import SearchEdit
from openlp.core.lib.ui import UiStrings, add_widget_completer, \
- media_item_combo_box, critical_error_message_box, find_and_set_in_combo_box
+ media_item_combo_box, critical_error_message_box, \
+ find_and_set_in_combo_box, build_icon
from openlp.plugins.bibles.forms import BibleImportForm
from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \
VerseReferenceList, get_reference_match
@@ -57,8 +58,8 @@ class BibleMediaItem(MediaManagerItem):
def __init__(self, parent, plugin, icon):
self.IconPath = u'songs/song'
- self.lockIcon = QtGui.QIcon(u':/bibles/bibles_search_lock.png')
- self.unlockIcon = QtGui.QIcon(u':/bibles/bibles_search_unlock.png')
+ self.lockIcon = build_icon(u':/bibles/bibles_search_lock.png')
+ self.unlockIcon = build_icon(u':/bibles/bibles_search_unlock.png')
MediaManagerItem.__init__(self, parent, plugin, icon)
# Place to store the search results for both bibles.
self.settings = self.plugin.settings_tab
@@ -983,7 +984,8 @@ class BibleMediaItem(MediaManagerItem):
Search for some Bible verses (by reference).
"""
bible = unicode(self.quickVersionComboBox.currentText())
- search_results = self.plugin.manager.get_verses(bible, string, False, False)
+ search_results = self.plugin.manager.get_verses(bible, string, False,
+ False)
if search_results:
versetext = u' '.join([verse.text for verse in search_results])
return [[string, versetext]]
diff --git a/openlp/plugins/images/lib/mediaitem.py b/openlp/plugins/images/lib/mediaitem.py
index 481b55c09..3c4489bbc 100644
--- a/openlp/plugins/images/lib/mediaitem.py
+++ b/openlp/plugins/images/lib/mediaitem.py
@@ -208,8 +208,13 @@ class ImageMediaItem(MediaManagerItem):
filename = unicode(bitem.data(QtCore.Qt.UserRole).toString())
if os.path.exists(filename):
(path, name) = os.path.split(filename)
- self.plugin.liveController.display.directImage(name, filename)
- self.resetAction.setVisible(True)
+ if self.plugin.liveController.display.directImage(name,
+ filename):
+ self.resetAction.setVisible(True)
+ else:
+ critical_error_message_box(UiStrings().LiveBGError,
+ translate('ImagePlugin.MediaItem',
+ 'There was no display item to amend.'))
else:
critical_error_message_box(UiStrings().LiveBGError,
unicode(translate('ImagePlugin.MediaItem',
diff --git a/openlp/plugins/media/lib/mediaitem.py b/openlp/plugins/media/lib/mediaitem.py
index 1e39a0426..77f91a529 100644
--- a/openlp/plugins/media/lib/mediaitem.py
+++ b/openlp/plugins/media/lib/mediaitem.py
@@ -114,8 +114,12 @@ class MediaMediaItem(MediaManagerItem):
filename = unicode(item.data(QtCore.Qt.UserRole).toString())
if os.path.exists(filename):
(path, name) = os.path.split(filename)
- self.plugin.liveController.display.video(filename, 0, True)
- self.resetAction.setVisible(True)
+ if self.plugin.liveController.display.video(filename, 0, True):
+ self.resetAction.setVisible(True)
+ else:
+ critical_error_message_box(UiStrings().LiveBGError,
+ translate('MediaPlugin.MediaItem',
+ 'There was no display item to amend.'))
else:
critical_error_message_box(UiStrings().LiveBGError,
unicode(translate('MediaPlugin.MediaItem',
diff --git a/openlp/plugins/songs/lib/ewimport.py b/openlp/plugins/songs/lib/ewimport.py
index 09f84fbe2..448d629d5 100644
--- a/openlp/plugins/songs/lib/ewimport.py
+++ b/openlp/plugins/songs/lib/ewimport.py
@@ -31,6 +31,7 @@ EasyWorship song databases into the current installation database.
import os
import struct
+import re
from openlp.core.lib import translate
from openlp.core.ui.wizard import WizardStrings
@@ -38,11 +39,26 @@ from openlp.plugins.songs.lib import VerseType
from openlp.plugins.songs.lib import retrieve_windows_encoding
from songimport import SongImport
+RTF_STRIPPING_REGEX = re.compile(r'\{\\tx[^}]*\}')
+# regex: at least two newlines, can have spaces between them
+SLIDE_BREAK_REGEX = re.compile(r'\n *?\n[\n ]*')
+NUMBER_REGEX = re.compile(r'[0-9]+')
+NOTE_REGEX = re.compile(r'\(.*?\)')
+
def strip_rtf(blob, encoding):
depth = 0
control = False
clear_text = []
control_word = []
+
+ # workaround for \tx bug: remove one pair of curly braces
+ # if \tx is encountered
+ match = RTF_STRIPPING_REGEX.search(blob)
+ if match:
+ # start and end indices of match are curly braces - filter them out
+ blob = ''.join([blob[i] for i in xrange(len(blob))
+ if i != match.start() and i !=match.end()])
+
for c in blob:
if control:
# for delimiters, set control to False
@@ -259,9 +275,45 @@ class EasyWorshipSongImport(SongImport):
if words:
# Format the lyrics
words = strip_rtf(words, self.encoding)
- for verse in words.split(u'\n\n'):
+ verse_type = VerseType.Tags[VerseType.Verse]
+ for verse in SLIDE_BREAK_REGEX.split(words):
+ verse = verse.strip()
+ if not verse:
+ continue
+ verse_split = verse.split(u'\n', 1)
+ first_line_is_tag = False
+ # EW tags: verse, chorus, pre-chorus, bridge, tag,
+ # intro, ending, slide
+ for type in VerseType.Names+[u'tag', u'slide']:
+ type = type.lower()
+ ew_tag = verse_split[0].strip().lower()
+ if ew_tag.startswith(type):
+ verse_type = type[0]
+ if type == u'tag' or type == u'slide':
+ verse_type = VerseType.Tags[VerseType.Other]
+ first_line_is_tag = True
+ number_found = False
+ # check if tag is followed by number and/or note
+ if len(ew_tag) > len(type):
+ match = NUMBER_REGEX.search(ew_tag)
+ if match:
+ number = match.group()
+ verse_type += number
+ number_found = True
+ match = NOTE_REGEX.search(ew_tag)
+ if match:
+ self.comments += ew_tag + u'\n'
+ if not number_found:
+ verse_type += u'1'
+ break
self.add_verse(
- verse.strip(), VerseType.Tags[VerseType.Verse])
+ verse_split[-1].strip() if first_line_is_tag else verse,
+ verse_type)
+ if len(self.comments) > 5:
+ self.comments += unicode(
+ translate('SongsPlugin.EasyWorshipSongImport',
+ '\n[above are Song Tags with notes imported from \
+ EasyWorship]'))
if self.stop_import_flag:
break
if not self.finish():
diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py
index e2efbe3df..a2814a1df 100644
--- a/openlp/plugins/songs/lib/mediaitem.py
+++ b/openlp/plugins/songs/lib/mediaitem.py
@@ -35,7 +35,8 @@ from sqlalchemy.sql import or_
from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \
translate, check_item_selected, PluginStatus
from openlp.core.lib.searchedit import SearchEdit
-from openlp.core.lib.ui import UiStrings
+from openlp.core.lib.ui import UiStrings, context_menu_action, \
+ context_menu_separator
from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \
SongImportForm, SongExportForm
from openlp.plugins.songs.lib import OpenLyrics, SongXML, VerseType, \
@@ -128,6 +129,13 @@ class SongMediaItem(MediaManagerItem):
QtCore.SIGNAL(u'searchTypeChanged(int)'),
self.onSearchTextButtonClick)
+ def addCustomContextActions(self):
+ context_menu_separator(self.listView)
+ context_menu_action(
+ self.listView, u':/general/general_clone.png',
+ translate('OpenLP.MediaManagerItem',
+ '&Clone'), self.onCloneClick)
+
def onFocus(self):
self.searchTextEdit.setFocus()
@@ -366,6 +374,24 @@ class SongMediaItem(MediaManagerItem):
self.plugin.manager.delete_object(Song, item_id)
self.onSearchTextButtonClick()
+ def onCloneClick(self):
+ """
+ Clone a Song
+ """
+ log.debug(u'onCloneClick')
+ if check_item_selected(self.listView, UiStrings().SelectEdit):
+ self.editItem = self.listView.currentItem()
+ item_id = (self.editItem.data(QtCore.Qt.UserRole)).toInt()[0]
+ old_song = self.plugin.manager.get_object(Song, item_id)
+ song_xml = self.openLyrics.song_to_xml(old_song)
+ new_song_id = self.openLyrics.xml_to_song(song_xml)
+ new_song = self.plugin.manager.get_object(Song, new_song_id)
+ new_song.title = u'%s <%s>' % (new_song.title,
+ translate('SongsPlugin.MediaItem', 'copy',
+ 'For song cloning'))
+ self.plugin.manager.save_object(new_song)
+ self.onSongListLoad()
+
def generateSlideData(self, service_item, item=None, xmlVersion=False):
log.debug(u'generateSlideData (%s:%s)' % (service_item, item))
item_id = self._getIdOfItemToGenerate(item, self.remoteSong)
diff --git a/resources/images/OpenLP.ico b/resources/images/OpenLP.ico
index b275542c3..c4aa7c41e 100644
Binary files a/resources/images/OpenLP.ico and b/resources/images/OpenLP.ico differ
diff --git a/resources/images/README.txt b/resources/images/README.txt
new file mode 100644
index 000000000..1ec31b48b
--- /dev/null
+++ b/resources/images/README.txt
@@ -0,0 +1,6 @@
+OpenLP.ico
+
+This Windows icon contains several images with different resolution.
+It can be recreated by command:
+
+icotool -c -o OpenLP.ico openlp-logo-16x16.png openlp-logo-32x32.png openlp-logo-48x48.png openlp-logo-64x64.png openlp-logo-128x128.png
diff --git a/resources/images/general_clone.png b/resources/images/general_clone.png
new file mode 100644
index 000000000..db1d9fbaf
Binary files /dev/null and b/resources/images/general_clone.png differ
diff --git a/resources/images/openlp-2.qrc b/resources/images/openlp-2.qrc
index 89be90056..fff1f75b8 100644
--- a/resources/images/openlp-2.qrc
+++ b/resources/images/openlp-2.qrc
@@ -56,6 +56,7 @@
general_save.png
general_email.png
general_revert.png
+ general_clone.png
slide_close.png
diff --git a/resources/windows/OpenLP.spec b/resources/windows/OpenLP.spec
deleted file mode 100644
index 47a1952f3..000000000
--- a/resources/windows/OpenLP.spec
+++ /dev/null
@@ -1,14 +0,0 @@
-# -*- mode: python -*-
-a = Analysis([
- os.path.join(HOMEPATH, 'support\\_mountzlib.py'),
- os.path.join(HOMEPATH, 'support\\useUnicode.py'),
- os.path.abspath('openlp.pyw')],
- pathex=[os.path.abspath('.')])
-pyz = PYZ(a.pure)
-exe = EXE(pyz, a.scripts, exclude_binaries=1,
- name=os.path.abspath(os.path.join('build', 'pyi.win32', 'OpenLP',
- 'OpenLP.exe')),
- debug=False, strip=False, upx=True, console=False,
- icon=os.path.abspath(os.path.join('resources', 'images', 'OpenLP.ico')))
-coll = COLLECT(exe, a.binaries, a.zipfiles, a.datas, strip=False, upx=True,
- name=os.path.abspath(os.path.join('dist', 'OpenLP')))
diff --git a/scripts/windows-builder.py b/scripts/windows-builder.py
index 4ab31f893..d6f4d42e3 100644
--- a/scripts/windows-builder.py
+++ b/scripts/windows-builder.py
@@ -32,8 +32,7 @@ Windows Build Script
This script is used to build the Windows binary and the accompanying installer.
For this script to work out of the box, it depends on a number of things:
-Python 2.6
- This build script only works with Python 2.6.
+Python 2.6/2.7
PyQt4
You should already have this installed, OpenLP doesn't work without it. The
@@ -49,7 +48,7 @@ Inno Setup 5
UPX
This is used to compress DLLs and EXEs so that they take up less space, but
- still function exactly the same. To install UPS, download it from
+ still function exactly the same. To install UPX, download it from
http://upx.sourceforge.net/, extract it into C:\%PROGRAMFILES%\UPX, and then
add that directory to your PATH environment variable.
@@ -61,7 +60,7 @@ HTML Help Workshop
This is used to create the help file
PyInstaller
- PyInstaller should be a checkout of revision 844 of trunk, and in a
+ PyInstaller should be a checkout of revision 1470 of trunk, and in a
directory called, "pyinstaller" on the same level as OpenLP's Bazaar shared
repository directory. The revision is very important as there is currently
a major regression in HEAD.
@@ -73,13 +72,8 @@ PyInstaller
http://svn.pyinstaller.org/trunk
Then you need to copy the two hook-*.py files from the "pyinstaller"
- subdirectory in OpenLP's "resources" directory into PyInstaller's "hooks"
- directory.
-
- Once you've done that, open a command prompt (DOS shell), navigate to the
- PyInstaller directory and run::
-
- C:\Projects\pyinstaller>python Configure.py
+ subdirectory in OpenLP's "resources" directory into PyInstaller's
+ "PyInstaller/hooks" directory.
Bazaar
You need the command line "bzr" client installed.
@@ -137,9 +131,11 @@ site_packages = os.path.join(os.path.split(python_exe)[0], u'Lib',
# Files and executables
pyi_build = os.path.abspath(os.path.join(branch_path, u'..', u'..',
- u'pyinstaller', u'Build.py'))
+ u'pyinstaller', u'pyinstaller.py'))
+openlp_main_script = os.path.abspath(os.path.join(branch_path, 'openlp.pyw'))
lrelease_exe = os.path.join(site_packages, u'PyQt4', u'bin', u'lrelease.exe')
i18n_utils = os.path.join(script_path, u'translation_utils.py')
+win32_icon = os.path.join(branch_path, u'resources', u'images', 'OpenLP.ico')
# Paths
source_path = os.path.join(branch_path, u'openlp')
@@ -148,9 +144,8 @@ manual_build_path = os.path.join(manual_path, u'build')
helpfile_path = os.path.join(manual_build_path, u'htmlhelp')
i18n_path = os.path.join(branch_path, u'resources', u'i18n')
winres_path = os.path.join(branch_path, u'resources', u'windows')
-build_path = os.path.join(branch_path, u'build', u'pyi.win32', u'OpenLP')
-dist_path = os.path.join(branch_path, u'dist', u'OpenLP')
-enchant_path = os.path.join(site_packages, u'enchant')
+build_path = os.path.join(branch_path, u'build')
+dist_path = os.path.join(build_path, u'dist', u'OpenLP')
pptviewlib_path = os.path.join(source_path, u'plugins', u'presentations',
u'lib', u'pptviewlib')
@@ -174,8 +169,15 @@ def update_code():
def run_pyinstaller():
print u'Running PyInstaller...'
os.chdir(branch_path)
- pyinstaller = Popen((python_exe, pyi_build, u'-y', u'-o', build_path,
- os.path.join(winres_path, u'OpenLP.spec')), stdout=PIPE)
+ pyinstaller = Popen((python_exe, pyi_build,
+ u'--noconfirm',
+ u'--windowed',
+ u'-o', build_path,
+ u'-i', win32_icon,
+ u'-p', branch_path,
+ u'-n', 'OpenLP',
+ openlp_main_script),
+ stdout=PIPE)
output, error = pyinstaller.communicate()
code = pyinstaller.wait()
if code != 0:
@@ -208,19 +210,6 @@ def write_version_file():
f.write(versionstring)
f.close()
-def copy_enchant():
- print u'Copying enchant/pyenchant...'
- source = enchant_path
- dest = os.path.join(dist_path, u'enchant')
- for root, dirs, files in os.walk(source):
- for filename in files:
- if not filename.endswith(u'.pyc') and not filename.endswith(u'.pyo'):
- dest_path = os.path.join(dest, root[len(source) + 1:])
- if not os.path.exists(dest_path):
- os.makedirs(dest_path)
- copy(os.path.join(root, filename),
- os.path.join(dest_path, filename))
-
def copy_plugins():
print u'Copying plugins...'
source = os.path.join(source_path, u'plugins')
@@ -353,7 +342,6 @@ def main():
build_pptviewlib()
run_pyinstaller()
write_version_file()
- copy_enchant()
copy_plugins()
if os.path.exists(manual_path):
run_sphinx()