This commit is contained in:
Andreas Preikschat 2011-04-13 14:33:34 +02:00
commit d6bc3af3ad
76 changed files with 1825 additions and 543 deletions

View File

@ -1,112 +1,112 @@
@ECHO OFF
REM Command file for Sphinx documentation
set SPHINXBUILD=sphinx-build
set ALLSPHINXOPTS=-d build/doctrees %SPHINXOPTS% source
if NOT "%PAPER%" == "" (
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
)
if "%1" == "" goto help
if "%1" == "help" (
:help
echo.Please use `make ^<target^>` where ^<target^> is one of
echo. html to make standalone HTML files
echo. dirhtml to make HTML files named index.html in directories
echo. pickle to make pickle files
echo. json to make JSON files
echo. htmlhelp to make HTML files and a HTML help project
echo. qthelp to make HTML files and a qthelp project
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
echo. changes to make an overview over all changed/added/deprecated items
echo. linkcheck to check all external links for integrity
echo. doctest to run all doctests embedded in the documentation if enabled
goto end
)
if "%1" == "clean" (
for /d %%i in (build\*) do rmdir /q /s %%i
del /q /s build\*
goto end
)
if "%1" == "html" (
%SPHINXBUILD% -b html %ALLSPHINXOPTS% build/html
echo.
echo.Build finished. The HTML pages are in build/html.
goto end
)
if "%1" == "dirhtml" (
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% build/dirhtml
echo.
echo.Build finished. The HTML pages are in build/dirhtml.
goto end
)
if "%1" == "pickle" (
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% build/pickle
echo.
echo.Build finished; now you can process the pickle files.
goto end
)
if "%1" == "json" (
%SPHINXBUILD% -b json %ALLSPHINXOPTS% build/json
echo.
echo.Build finished; now you can process the JSON files.
goto end
)
if "%1" == "htmlhelp" (
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% build/htmlhelp
echo.
echo.Build finished; now you can run HTML Help Workshop with the ^
.hhp project file in build/htmlhelp.
goto end
)
if "%1" == "qthelp" (
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% build/qthelp
echo.
echo.Build finished; now you can run "qcollectiongenerator" with the ^
.qhcp project file in build/qthelp, like this:
echo.^> qcollectiongenerator build\qthelp\OpenLP.qhcp
echo.To view the help file:
echo.^> assistant -collectionFile build\qthelp\OpenLP.ghc
goto end
)
if "%1" == "latex" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% build/latex
echo.
echo.Build finished; the LaTeX files are in build/latex.
goto end
)
if "%1" == "changes" (
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% build/changes
echo.
echo.The overview file is in build/changes.
goto end
)
if "%1" == "linkcheck" (
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% build/linkcheck
echo.
echo.Link check complete; look for any errors in the above output ^
or in build/linkcheck/output.txt.
goto end
)
if "%1" == "doctest" (
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% build/doctest
echo.
echo.Testing of doctests in the sources finished, look at the ^
results in build/doctest/output.txt.
goto end
)
:end
@ECHO OFF
REM Command file for Sphinx documentation
set SPHINXBUILD=sphinx-build
set ALLSPHINXOPTS=-d build/doctrees %SPHINXOPTS% source
if NOT "%PAPER%" == "" (
set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
)
if "%1" == "" goto help
if "%1" == "help" (
:help
echo.Please use `make ^<target^>` where ^<target^> is one of
echo. html to make standalone HTML files
echo. dirhtml to make HTML files named index.html in directories
echo. pickle to make pickle files
echo. json to make JSON files
echo. htmlhelp to make HTML files and a HTML help project
echo. qthelp to make HTML files and a qthelp project
echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
echo. changes to make an overview over all changed/added/deprecated items
echo. linkcheck to check all external links for integrity
echo. doctest to run all doctests embedded in the documentation if enabled
goto end
)
if "%1" == "clean" (
for /d %%i in (build\*) do rmdir /q /s %%i
del /q /s build\*
goto end
)
if "%1" == "html" (
%SPHINXBUILD% -b html %ALLSPHINXOPTS% build/html
echo.
echo.Build finished. The HTML pages are in build/html.
goto end
)
if "%1" == "dirhtml" (
%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% build/dirhtml
echo.
echo.Build finished. The HTML pages are in build/dirhtml.
goto end
)
if "%1" == "pickle" (
%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% build/pickle
echo.
echo.Build finished; now you can process the pickle files.
goto end
)
if "%1" == "json" (
%SPHINXBUILD% -b json %ALLSPHINXOPTS% build/json
echo.
echo.Build finished; now you can process the JSON files.
goto end
)
if "%1" == "htmlhelp" (
%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% build/htmlhelp
echo.
echo.Build finished; now you can run HTML Help Workshop with the ^
.hhp project file in build/htmlhelp.
goto end
)
if "%1" == "qthelp" (
%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% build/qthelp
echo.
echo.Build finished; now you can run "qcollectiongenerator" with the ^
.qhcp project file in build/qthelp, like this:
echo.^> qcollectiongenerator build\qthelp\OpenLP.qhcp
echo.To view the help file:
echo.^> assistant -collectionFile build\qthelp\OpenLP.ghc
goto end
)
if "%1" == "latex" (
%SPHINXBUILD% -b latex %ALLSPHINXOPTS% build/latex
echo.
echo.Build finished; the LaTeX files are in build/latex.
goto end
)
if "%1" == "changes" (
%SPHINXBUILD% -b changes %ALLSPHINXOPTS% build/changes
echo.
echo.The overview file is in build/changes.
goto end
)
if "%1" == "linkcheck" (
%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% build/linkcheck
echo.
echo.Link check complete; look for any errors in the above output ^
or in build/linkcheck/output.txt.
goto end
)
if "%1" == "doctest" (
%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% build/doctest
echo.
echo.Testing of doctests in the sources finished, look at the ^
results in build/doctest/output.txt.
goto end
)
:end

View File

@ -0,0 +1,57 @@
=====
Alert
=====
From time to time it may be necessary to display a small unobtrusive message to
the congregation. In OpenLP this is known as an `Alert`. Examples could be a car
with the headlights left on, a parent needed in nursery, or anything else
somebody may need notified about. This is easily accomplished using the Alert,
which is accessible from the top Menu under :menuselection:`Tools --> Alert`.
.. image:: pics/alert.png
:guilabel:`Alert text:` Enter the message you want displayed in this box.
:guilabel:`Parameter:` This box is used for words you want to insert into the
alert text.
You will add the Parameter text into the alert text using “<>” (without
quotations). Anywhere in the Alert text that you add these two symbols, <> side
by side, will insert any text you have in the parameter box into the Alert
message.
Examples of use
---------------
:guilabel:`Alert text:` The owner of the vehicle with license plate number <>
your lights are on.
:guilabel:`Parameter:` HNN432
These two settings will display like this:
The owner of the vehicle with the license plate number HNN432 your lights are on.
You could also reverse this example:
:guilabel:`Alert text:` HNN432 <>
:guilabel:`Parameter:` left their lights on.
`Will display like this:` HNN432 left their lights on.
If you use the same alerts on a regular basis, Save your Alert and you will have
access to the alert with a click of the mouse. You may also click on `New` to
make a new alert or `Delete` an alert you do not need.
When you are ready to Display your Alert you have two options. Clicking on
Display will display the Alert and the Alert Message window will remain open.
Clicking Display & Close will display the alert and close the Alert Message
window.
All details of the display, font, color, size and position are adjusted from the
top Menu item :menuselection:`Settings --> Configure OpenLP`, Alert tab and the
instructions here. :doc:`configure`
**Please note:** Alert Message is a Plugin that needs to be Active in the Plugin
List for use.

View File

@ -5,6 +5,8 @@ Bibles
Managing Bibles in OpenLP is a relatively simple process. There are also
converters provided to get data from other formats into OpenLP.
.. _bibleimporter:
Bible Importer
==============
@ -60,11 +62,12 @@ Importing OSIS Bibles
**About OSIS Formatted Bibles**
OSIS is a format intended to provide a common format for Bibles. More
information can be found out here: http://www.bibletechnologies.net/
The OSIS XML standard was designed to provide a common format for distribution
of electronic Bibles. More information can be found out at the `Bible Technologies website
<http://www.bibletechnologies.net/>`_.
If you have any software installed that is part of the Sword Project
http://www.crosswire.org/sword/index.jsp it can be easily converted.
If you have any software installed that is part of the `Sword Project
<http://www.crosswire.org/sword/index.jsp>`_ it can be easily converted.
Importing OSIS files is very simple. Select your OSIS Bible file and click
:guilabel:`Next`

View File

@ -42,7 +42,7 @@ master_doc = 'index'
# General information about the project.
project = u'OpenLP'
copyright = u'2010, Raoul Snyman'
copyright = u'2004 - 2011, Raoul Snyman'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
@ -92,19 +92,30 @@ pygments_style = 'sphinx'
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'default'
if sys.argv[2] == 'qthelp' or sys.argv[2] == 'htmlhelp':
html_theme = 'openlp_qthelp'
else:
html_theme = 'default'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
if sys.argv[2] == 'html':
html_theme_options = {
'sidebarbgcolor': '#3a60a9',
'relbarbgcolor': '#203b6f',
'footerbgcolor': '#26437c',
'headtextcolor': '#203b6f',
'linkcolor': '#26437c',
'sidebarlinkcolor': '#ceceff'
}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
html_theme_path = [os.path.join(os.path.abspath('..'), 'themes')]
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
html_title = u'OpenLP 2.0 Reference Manual'
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
@ -125,7 +136,7 @@ html_static_path = ['_static']
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
@ -165,7 +176,7 @@ html_static_path = ['_static']
#html_file_suffix = None
# Output file base name for HTML help builder.
htmlhelp_basename = 'OpenLPdoc'
htmlhelp_basename = 'OpenLP'
# -- Options for LaTeX output --------------------------------------------------
@ -179,7 +190,7 @@ htmlhelp_basename = 'OpenLPdoc'
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title, author, documentclass [howto/manual]).
latex_documents = [
('index', 'OpenLP.tex', u'OpenLP Documentation',
('index', 'OpenLP.tex', u'OpenLP Reference Manual',
u'Wesley Stout', 'manual'),
]
@ -212,6 +223,6 @@ latex_documents = [
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
('index', 'openlp', u'OpenLP Documentation',
('index', 'openlp', u'OpenLP Reference Manual',
[u'Wesley Stout'], 1)
]

View File

@ -43,9 +43,14 @@ working on when you closed the program.
**Show the splash screen:**
When this box it selected, the OpenLP logo will be displayed in the center of
the screen until the program opens. This is useful to know if the program is
opening.
The OpenLP logo is displayed while OpenLP loads when this checkbox is checked.
This is useful to give some indication that the program is loading.
**Check for updates to OpenLP**
OpenLP will check to see if there is a newer version available on a regular
basis when this checkbox is checked. Please note that this requires Internet
access.
Application Settings
^^^^^^^^^^^^^^^^^^^^
@ -60,6 +65,14 @@ working on before starting a new service.
When this box is selected, the next item in the Service Manager will show in the
Preview pane.
**Unblank display when adding new live item**
When using the :guilabel:`blank to` button with this checkbox checked, on going
live with the next item, the screen will be automatically re-enabled. If this
checkbox is not checked you will need to click the :guilabel:`blank to` button
again to reverse the action.
**Slide loop delay**
This setting is the time delay in seconds if you want to continuously loop

View File

@ -0,0 +1,572 @@
==========================
Frequently Asked Questions
==========================
General Questions
=================
When is the release date for OpenLP 2.0?
----------------------------------------
*It will be ready when it's ready!* We do not have fixed dates, but we have
set some `targets for the releases <http://wiki.openlp.org/Version_2_Milestones>`_.
If you take part in the `development <http://wiki.openlp.org/Development:Getting_Started>`_,
start to `test OpenLP <http://wiki.openlp.org/Testing:Getting_Started>`_ and
`provide feedback <http://wiki.openlp.org/Help:Contents>`_ this will speed up
the progress.
Can I help with OpenLP?
-----------------------
OpenLP is possible because of the commitment of individuals. If you would like
to help there are several things that you can get involved with. Please see:
`Contributing <http://openlp.org/en/documentation/introduction/contributing.html>`_
for more information.
I use and like OpenLP and would like to tell others online. Where can I do this?
--------------------------------------------------------------------------------
A variety of places!
* Are you on facebook? Then `become a fan <http://www.facebook.com/openlp>`_
* Are you on twitter? Then `follow openlp <http://twitter.com/openlp>`_, and
retweet the announcements.
* Give us a thumbs up on the
`SourceForge project page <http://www.sourceforge.net/projects/openlp>`_
* If you have a website or blog, then link to our site http://www.openlp.org
with a few words saying what the software is and why you like it.
* Add a placemark on our `Worldwide Usage map <http://maps.google.com/maps/ms?ie=UTF8&source=embed&msa=0&msid=113314234297482809599.00047e88b1985e07ad495&ll=13.923404,0&spn=155.179835,316.054688&z=2>`_,
so others in your locality can see someone close by is using it.
* If you are a member of any Christian Forums or websites, and their rules allow
it, then perhaps review the software or ask others to review it.
What operating systems will OpenLP 2.0 support?
-----------------------------------------------
OpenLP 2.0 is designed to be cross platform. Currently it has been known to run
on Windows (XP, Vista, 7), Linux (Ubuntu/Kubuntu, Fedora), FreeBSD & Mac OSX.
`Please let us know <http://wiki.openlp.org/Help:Contents>`_ if you've
successfully run it on something else.
Which programming language is 2.0 developed in?
-----------------------------------------------
OpenLP 2.0 is written in `Python <http://www.python.org>`_ and uses the
`Qt4 toolkit <http://qt.nokia.com>`_. Both are cross-platform which allows the
software to run on different types of machine and so allow more people access to
free worship software. Python is one of the easier programming languages to
learn, so this helps us develop and `find bugs <http://wiki.openlp.org/Bug#Something_has_gone_wrong.2C_what_should_I_do_to_help_get_it_fixed.3F>`_
quicker, and also allows more developers to contribute with the project.
Which written languages does OpenLP support?
--------------------------------------------
The beta now has support for a few languages which can be seen on the
:menuselection:`Settings -->Translate` menu. However some of these translations
are incomplete. If you would like to help complete or start to translate OpenLP
into your language then see the `Getting started page <http://wiki.openlp.org/Translation:Getting_Started>`_.
What is a beta release?
-----------------------
A beta release is a release which is almost feature complete and is fairly
stable. However there may still be a few `features <http://wiki.openlp.org/Version_2_Features>`_
to complete, and `bugs <https://bugs.launchpad.net/openlp>`_ we've not yet fixed.
It is used by several people without serious problems. However there is a small
possibility that it could still crash occasionally or do unexpected things. It
is intended for those who want the latest version, and are prepared to give the
program a good test before using it in a live situation to ensure they won't
encounter any unexpected problems. If you want to have a look at the latest beta
release then just `download it <http://openlp.org/en/download.html>`_.
Should I use this beta release at Church in my Sunday services?
---------------------------------------------------------------
As long as you have taken the time to run through your service a couple of times
on your target machine, the answer to this question is **yes**. The OpenLP
team believes that OpenLP 2.0 beta 1 is stable enough to be used in Sunday
services. As of beta 1, there are a good number of churches already using
version 2.0 successfully. The OpenLP team works hard to make sure each release
is solid, but cannot yet guarantee that everything works perfectly, or even
correctly.
If however your congregation is made up of 85 year old women who snarl when you
suggest replacing the gas lamps with electric light bulbs and consider the pipe
organ too loud and modern, then we recommend sticking with version 1.2 for now.
As of beta 1, version 1.2 of OpenLP is "put out to pasture" - no more
development or even bugfixes will be performed on that version.
Upgrading
=========
Does 2.0 replace 1.2, or can they be run side by side?
------------------------------------------------------
It is perfectly safe to install 2.0 on a system with 1.2. Both versions are
installed in separate places, so you can still go back to 1.2. You can even run
them at the same time!
2.0 stores its data in a separate folder to 1.2, so your data is perfectly safe,
and whatever you do in 2.0 will not damage 1.2
Are 1.2 and 2.0 compatible?
---------------------------
No. However imports exist to transfer your data to the new version.
I have a computer that is quite old, should I upgrade?
------------------------------------------------------
2.0 does require significantly more resources than v1.2. Therefore if your
computer does not have much memory you may find 2.0 will struggle, `especially`
when changing between slides.
Why can I not see my 1.2 songs, bibles and themes in 2.0?
---------------------------------------------------------
This is an beta release, which means it is not finished and one of the things we
haven't completely finished yet is importing 1.2 data automatically. We plan to
do this `Version 1.9.6 (beta 2) <http://wiki.openlp.org/Version_2_Milestones#Version_1.9.6_.28beta_2.29>`_.
How do I transfer my 1.2 song database?
---------------------------------------
In OpenLP 2.0, go to the :menuselection:`File --> Import --> Song` menu.
In the Wizard that appears, click Next and choose "openlp.org v1.x" from the
Format list. Click the search button on the Filename prompt, and at the bottom
of the dialog, copy the following into the File name prompt::
%ALLUSERSPROFILE%\Application Data\openlp.org\Data\songs.olp
*(This must be in the popup file chooser dialog. Don't enter it directly into
the wizard).*
Click Open, then in the wizard just click Next and wait for the import to complete.
How do I transfer my 1.2 Bibles?
--------------------------------
In OpenLP 2.0, go to the :menuselection:`File --> Import --> Bible` menu.
In the Wizard that appears, click Next and choose "openlp.org v1.x" from the
Format list.
Click the search button on the Filename prompt, and at the bottom of the dialog,
copy the following into the File name prompt::
%ALLUSERSPROFILE%\Application Data\openlp.org\Data\Bibles
*(This must be in the popup file chooser dialog. Don't enter it directly into
the wizard).*
Choose the Bible, Click Open, then in the wizard just click Next, enter the
License details, and wait for the import to complete.
How do I transfer my 1.2 Themes?
--------------------------------
In openlp.org v1, export each theme by selecting it in the Theme Manager, and
then clicking the picture of a blue folder with red arrow on the Theme Managers
toolbox. This theme file can then be imported into V2 using the
:menuselection:`File --> Import --> Theme` menu.
I can't get my 2.0 theme to look the same as 1.2
------------------------------------------------
OpenLP 2.0 is a complete rewrite using a completely different programming
language so it would work on different types of system. There are differences in
how the old and new languages draw text on the screen, and therefore it is
unlikely you'll get an exact match.
Using OpenLP
============
Is there a manual or any documentation for 2.0?
-----------------------------------------------
Some folks are working on a brand new manual for OpenLP 2.0. You can find the
latest version of this manual at http://manual.openlp.org. If you need help,
use the live chat feature or ask in the forums. If you would like to help write
the manual, please let us know - we are always happy for new volunteers to join
the team and contribute to the project.
I've started OpenLP, but I can't see the songs or bibles section in the Media Manager
-------------------------------------------------------------------------------------
When you installed OpenLP, the first time wizard would have asked which plugins
you wanted, and songs and bibles should have been selected. If for some reason
they were not, then you will need to activate them yourself. See
`How do I activate / deactivate a plugin <http://wiki.openlp.org/Bug#How_do_I_activate_.2F_deactivate_a_plugin.3F>`_
for instructions.
How do I activate / deactivate a plugin?
----------------------------------------
Plugins can be turned on and off from the Plugin List Screen. Select the plugin
you wish to start/stop and change it's status. You should not need to restart
OpenLP.
What are these plugins that I keep seeing mentioned?
----------------------------------------------------
The plugins allow OpenLP to be extend easily. A number have been written
(Songs, Bibles, Presentations) etc but it is possible for the application to be
extended with functionality only you require. If this is the case then go for
it but lets us know as we can help and it may be something someone else wants.
How do I enable PowerPoint/Impress/PowerPoint Viewer?
-----------------------------------------------------
First of all ensure that the presentation plugin is enabled (see above).
Then to enable a presentation application, go to the `Settings` dialog, switch
to the `Presentations` tab and check one of the enabled checkboxes. OpenLP will
automatically detect which of the three you have installed, and enable the
appropriate checkbox(es). Check the applications you require, and then restart
OpenLP for the change to be detected.
Note, PowerPoint Viewer 2010 is not yet supported, use 2003 or 2007.
See also `I'm on Windows and PowerPoint is installed, but it doesn't appear as an option <http://wiki.openlp.org/OpenLP_2_Introduction_and_FAQ#I.27m_on_Windows_and_PowerPoint_is_installed.2C_but_it_doesn.27t_appear_as_an_option>`_
and `Why is there no presentations plugin available on OS X? <http://wiki.openlp.org/OpenLP_2_Introduction_and_FAQ#Why_is_there_no_presentations_plugin_available_on_OS_X.3F>`_
Why is there no presentations plugin available on OS X?
-------------------------------------------------------
Currently the presentations plugin is not bundled with OpenLP on OS X. The
reason for that is that the OpenOffice.org version on Mac OS X does not contain
the (more exact: does only contain a broken) interoperability component (the so
called pyuno bridge) which could be used by OpenLP. As soon as the
interoperability component works on OS X we can re-enable the plugin and bundle
it. We are really sorry for that.
Is it possible to get Bible x? How?
-----------------------------------
The Bible plugin has a much improved `Import Wizard` which can import Bibles
from a variety of sources. The following sources are supported:
CSV
The same format as documented for `openlp.org 1.x <http://www.openlp.org/en/documentation/importing_exporting_data/bibles/importing_comma_delimited_files.html>`_.
OSIS
An XML format for Bible. You can export Bibles from the `Sword Project <http://www.crosswire.org/sword/software/>`_
into OSIS using the ``mod2osis`` tool. After using the Sword software Media
Manager (or other Sword frontend, like BibleTime or Xiphos) to download the
required Bible, run the following command from the command line (works on
Windows and Linux)::
mod2osis <name> > <name>.osis
The ``<name>`` parameter is the name of your Bible, as you see it in Sword.
Note that the ``<name>`` is case sensitive on all environments. Once you
have exported your Bible to OSIS, the Bible import wizard will the read
``<name>.osis`` file and import your Bible.
OpenSong
OpenSong have a good selection of Bibles on their
`download page <http://www.opensong.org/d/downloads#bible_translations>`_.
Web Download
OpenLP can download Bibles on demand from the following 3 sites:
* `Crosswalk <http://biblestudy.crosswalk.com/bibles/>`_
* `BibleGateway <http://www.biblegateway.com/versions/>`_
* `BibleServer <http://www.bibleserver.com>`_
Why do my Bible verses take a long time to load?
------------------------------------------------
In order to better conform to copyright law, the Web Download Bibles are not
downloaded when you import them, but on the fly as you search for them. As a
result, the search takes a little longer if you need to download those
particular verses. Having said that, the Web Download Bibles cache downloaded
verses so that you don't need to download them again.
My Bible is on the Web Download sites, but my Church isn't on the internet. What options do I have?
---------------------------------------------------------------------------------------------------
When you create and save a service, all the items in the service are saved with
it. That means any images, presentations, songs and media items are saved. This
is also true for bibles. What this means is you can create the service on your
home computer, insert a Bible passage from the web, save it and then open the
service using your church computer and voila, the Bible passage should be there!
Note this can also be done with songs, etc!
(Advanced) Where do I find the configuration file?
==================================================
Linux, FreeBSD & PC-BSD
-----------------------
If your distribution supports the XDG standard, you'll find OpenLP's
configuration file in::
/home/<user>/.config/OpenLP/OpenLP.conf
If that file and/or directory does not exist, look for::
/home/<user>/.openlp/openlp.conf
``<user>`` is your username.
OS X
----
You'll find your configuration file here::
/Users/<user>/Library/Preferences/org.openlp.OpenLP.plist
``<user>`` is your username.
Windows
-------
On Windows, OpenLP does not use a configuration file, it uses the Windows
registry. You can find the settings here::
HKEY_CURRENT_USER\Software\OpenLP\OpenLP
Troubleshooting
===============
Something has gone wrong, what should I do to help get it fixed?
----------------------------------------------------------------
If you have found an error in the program (what we call a bug) you should report
this to us so that OpenLP can be improved. Before reporting any bugs please
first make sure that there isn't already a bug report about your problem:
#. Check the `Launchpad bug list <https://bugs.launchpad.net/openlp>`_
#. `OpenLP support System <http://www.support.openlp.org/projects/openlp>`_
#. Check the `bug reports <http://openlp.org/en/forums/openlp_20/bug_reports.html>`_ forum
If there **is already a bug report**, you may be able to help by providing
further information. However, **if no one else has reported** it yet, then
please post a new bug report.
#. The **preferred place** for reporting bugs is the
`bugs list <https://bugs.launchpad.net/openlp>`_ on Launchpad.
#. Alternatively, if you don't have a Launchpad account and don't want to sign
up for one, you can post in the
`bug reports forum <http://openlp.org/en/forums/openlp_20/bug_reports.html>`_.
#. If none of these ways suits you, you can send an email to
``bugs (at) openlp.org``.
What information should I include in a bug report?
--------------------------------------------------
Since OpenLP 1.9.4, there is a bug report dialog which automatically opens when
OpenLP hits a serious bug. However, this doesn't appear all the time, and in
some behavioural bugs, you'll have to file a bug report yourself. The following
items are information the developers need in order to reproduce the bug.
Operating System
Include information such as the version of your operating system, the
distribution (e.g. Ubuntu, Fedora, etc.) if you're using Linux, or the
edition (e.g. Home, Basic, Business, etc.) if you're using Windows.
Version of OpenLP
You can find out the version of OpenLP by going to :menuselection:`Help --> About`
Steps to Reproduce
The exact steps the developers need to follow in order to reproduce the bug.
Version of MS Office or OpenOffice
If you're using the song imports or the presentation plugin, you'll need to
supply the version of Office, OpenOffice.org or LibreOffice.
Bible Translation and Source
If the bug occurred while you were working with Bibles, specify the
translation of the Bible, and the source format if you imported it yourself.
**Any** Other Information
Often bugs are caused by something that might not seem to be directly
related to the bug itself. If you have any other information with regards to
actions you performed or other activities when the bug occurred, it would be
welcomed by the developers.
The more information you give us, the better we can help you.
I've been asked to email a debug log, where do I find this?
-----------------------------------------------------------
We may need a debug log to help pin-point the issue. A new log file is created
each time you start OpenLP so copy the file before you run the software a second
time. On Windows a Debug option is available in the start menu. On other systems,
you will need to run OpenLP from the command line, with the following
option: ```-l debug```. Please note, that is a lowercase **L**.
If you haven't been given a specific email address to send it to, then please do
not paste the log contents straight into a forum post. Instead, open the log
file in a text editor (such as notepad on Windows) and copy and paste the
contents into somewhere like `pastebin.com <http://pastebin.com>`_. Then give us
the link to the page that is created.
Windows
^^^^^^^
Find the OpenLP 2.0 folder in your Start menu. Choose the "OpenLP (Debug)" option.
OpenLP will start up. Go to the :menuselection:`Tools --> Open Data Folder` menu
option, and an Explorer window will appear containing folders such as alerts,
bibles, custom etc. Keep this Explorer window open.
Now repeat the steps you need to take in OpenLP to reproduce the problem you had,
and then close down OpenLP.
In the Explorer window you left open, navigate up one level into the openlp
folder. You will see the ``openlp.log`` file. This is the file to e-mail.
Linux/FreeBSD
^^^^^^^^^^^^^
If you installed OpenLP from a package::
@:~$ openlp -l debug
Alternately, if you're running OpenLP from source::
@:~$ ./openlp.pyw -l debug
If your Linux distribution supports the XDG standard, you'll find the log in::
~/.cache/openlp/openlp.log
Otherwise, you'll find the log file in::
~/.openlp/openlp.log
Mac OS X
^^^^^^^^
Open Terminal.app and navigate to where you installed OpenLP, usually
``/Applications``::
@:~$ cd /Applications
Then go into the OpenLP.app directory, down to the OpenLP executable::
@:~$ cd OpenLP.app/Contents/MacOS
And then run OpenLP in debug mode::
@:~$ ./openlp -l debug
Once you've done that, you need to get the log file. In your home directory,
open the Library directory, and the Application Support directory within that.
Then open the openlp directory, and you should find the openlp.log file in that
directory::
/Users/<username>/Library/Application Support/openlp/openlp.log
``<username>`` is your username.
I'm on Windows and PowerPoint is installed, but it doesn't appear as an option
------------------------------------------------------------------------------
Try installing the `Visual C++ Runtime Redistributable <http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en>`_.
The command line shows many error messages
------------------------------------------
When running OpenLP from the command line, you might get something like this::
WARNING: bool Phonon::FactoryPrivate::createBackend() phonon backend plugin could not be loaded
WARNING: bool Phonon::FactoryPrivate::createBackend() phonon backend plugin could not be loaded
WARNING: Phonon::createPath: Cannot connect Phonon::MediaObject ( no objectName ) to VideoDisplay ( no objectName ).
WARNING: Phonon::createPath: Cannot connect Phonon::MediaObject ( no objectName ) to Phonon::AudioOutput ( no objectName ).
WARNING: bool Phonon::FactoryPrivate::createBackend() phonon backend plugin could not be loaded
These error messages indicate that you need to install an appropriate backend
for Phonon.
Linux/FreeBSD
^^^^^^^^^^^^^
If you're using Gnome, you need to install the GStreamer backend for Phonon. On
Ubuntu you would install the ```phonon-backend-gstreamer``` package::
@:~$ sudo aptitude install phonon-backend-gstreamer
If you're using KDE, you need to install the Xine backend for Phonon. On Kubuntu
you would install the ```phonon-backend-xine``` package::
@:~$ sudo aptitude install phonon-backend-xine
If you know which audiovisual system you're using, then install the appropriate
backend.
phonon-backend-vlc may also be worth trying on some systems.
Windows & Mac OS X
^^^^^^^^^^^^^^^^^^
Phonon should already be set up properly. If you're still having issues, let the
developers know.
I've upgraded from 1.9.2 to a newer version, and now OpenLP crashes on load
---------------------------------------------------------------------------
You need to upgrade your song database. See this `blog post <http://openlp.org/en/users/jt/blog/2010-07-20-flag_day_database_schema_changes_in_trunk_revision_956.html>`_
for information on how to do this.
I've upgraded to 1.9.5, and now OpenLP has duplicates of many songs in the Media Manager
----------------------------------------------------------------------------------------
You need to run :menuselection:`Tools --> Re-index Songs`.
There are no menu icons in OpenLP
---------------------------------
This may affect (only) Linux users with XFCE or Gnome. To solve the problem,
follow the instructions on `this bug report <https://bugs.launchpad.net/ubuntu/+source/qt4-x11/+bug/501468/comments/3>`_.
JPEG images don't work
----------------------
This is a known issue on some Mac OS X 10.5 systems, and has also been seen on
Windows XP too. The solution is to convert the image into another format such as
PNG.
MP3's and other audio formats don't work
----------------------------------------
This is a known issue on some systems, including some XP machines, and we have
no solution at the moment.
Videos can be slow or pixelated. Background Videos are very slow
----------------------------------------------------------------
If you are just playing videos from the Media plugin, try selecting the
:guilabel:`Use Phonon for Video playback` option in the Media configuration,
accessible by going to :menuselection:`Settings --> Configure OpenLP --> Media`.
As for text over video, we have no solution for speeding this up. Reducing the
monitor resolution and avoiding shadows and outline text will help. We are
hoping a future release of the toolkit we are using (QtWebKit) will help improve
this, but there is no timeframe at present.
Features
========
What new features will I find in 2.0?
-------------------------------------
Since 2.0 was a rewrite from the ground up, you won't find a great deal of new
features since initially we want to ensure all the 1.2 features are included.
However the developers have managed to sneak a few in. Take a look at the
`complete list <http://wiki.openlp.org/Version_2_Features>`_.
Why hasn't popular feature request X been implemented?
------------------------------------------------------
We made a decision to first implement 1.2 features, before going wild on new
features. There are only a handful of developers working in their spare time. If
we were to try and include everything we wanted to implement, then 2.0 would not
likely ever get released.
I have a great idea for a new feature, where should I suggest it?
-----------------------------------------------------------------
First of all check it isn't on the `Feature Requests <http://wiki.openlp.org/Feature_Requests>`_
page. If it is, then you need to say no more, it's already been suggested! If it
isn't on the list, then head to the
`feature request forum <http://openlp.org/en/forums/openlp_20/feature_requests.html>`_
and post the idea there.

View File

@ -13,9 +13,13 @@ Contents:
introduction
glossary
wizard
dualmonitors
configure
bibles
themes
mediamanager
songs
songs
alert
faq
troubleshooting

View File

@ -5,33 +5,31 @@ Introduction
About
-----
OpenLP is an open source lyrics projection application developed specifically
for churches. It is licensed under the GNU Generic Public License, which means
that it is free to use and distribute, and it stays free.
OpenLP stands for "Open Source Lyrics Projection" and is presentation software
developed for churches to provide a single easy to use interface for the
projection needs of a typical worship service. First created in 2004, it has
steadily grown in features and maturity such that it is now a mainstay in
hundreds of churches around the world.
Lyrics Projection
-----------------
OpenLP has searchable databases of songs and Bible verses allowing them to be
projected instantly or saved in a pre-prepared order of service file. Themes
allow for a variety of presentation options and allow you to add attractive
visuals to enhance your presentations. PowerPoint and OpenOffice presentations,
videos and audio files can be run from within the program removing the need to
switch between different programs. Alert messages can be displayed so the
nursery or car park stewards can notify the congregation easily. Remote
capability allows the worship leader to change songs, or for alert messages to
be sent from anywhere on the network, even via a smart phone or tablet.
OpenLP's purpose is to project the lyrics of songs and Bible verses using a
computer and a data projector. OpenLP also has the ability to project videos,
images, and also play audio. OpenLP also is highly customizable providing users
with the ability to set up a wide variety of themes, including themes with
video backgrounds.
Being free, this software can be installed on as many PCs as required,
including the home PCs of worship leader(s) at no additional cost. Compared to
the expensive site licenses and restrictions of commercial software we believe
OpenLP is the perfect choice for quality and value. Still in active development
by a growing team of enthusiastic developers, features are being added all the
time resulting in continual improvement of the software.
Open Source
-----------
OpenLP is open source software. This means that the source code (the
programming instructions the developers write) is open to anyone who wants to
look at it. This gives you, the end user, a few freedoms.
From a developer's perspective, it gives you the freedom to inspect the code
and make sure that it is not malicious. Also, it gives you the freedom to
change the code and the freedom to "fork" the project and make it your own.
For end users open source software gives you the freedom to use software as
you wish. You are not required to pay for the software and you are free to
make copies and distribute it to anyone you want.
OpenLP is licensed under the GNU Generic Public License, which means
that it is free to use, distribute, modify, and it stays free.
GNU General Public License
--------------------------
@ -42,5 +40,4 @@ to charge for the software, and that you have to distribute the source code as
well.
You can find a copy of the GNU General Public License from the Help menu
selecting about OpenLP or on-line
at: http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt
selecting about OpenLP or `view the license on-line <http://www.gnu.org/licenses/old-licenses/gpl-2.0.txt>`_.

View File

@ -16,8 +16,8 @@ this is what the `Media Manager` looks like with all the plugins enabled.
.. image:: pics/mediamanager.png
To enable the plugins navigate to :menuselection:`Settings --> Plugins` or
press `F7`. You will want to click on the plugin to the left that you want to
enable and select **active** from the drop down box to the right.
press :kbd:`Alt+F7`. You will want to click on the plugin to the left that you
would like to enable and select **active** from the drop down box to the right.
.. image:: pics/plugins.png
@ -99,9 +99,10 @@ You will type your search query in this box for the following two searches.
Book Chapter
Book Chapter-Chapter
Book Chapter:Verse-Verse
Book Chapter:Verse-End (this will display verses to the end of the chapter)
Book Chapter:Verse-Verse, Verse-Verse
Book Chapter:Verse-Verse,Chapter:Verse-Verse
Book Chapter: Verse-Chapter:Verse
Book Chapter:Verse-Chapter:Verse
`Text Search:`

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 111 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 138 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 104 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 36 KiB

View File

@ -71,8 +71,8 @@ Importing from CCLI Song Select
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
To import from CCLI Song Select you must be a CCLI Subscriber and also a
subscriber of the Song Select service. For info on that go to:
http://www.ccli.com
subscriber of the Song Select service. For more info check out the `CCLI website.
<http://www.ccli.com>`_
The first step for importing from CCLI Song Select is to log into your account.
Then search for your desired song. For this example we will be adding the song

View File

@ -1,3 +1,5 @@
.. _themes:
======
Themes
======

View File

@ -0,0 +1,177 @@
===============
Troubleshooting
===============
I can not play videos or other media
------------------------------------
If you can not play video or audio through openlp, there are several areas that
could be an issue. First thing is to make sure you can play the media file
through your default media player. OpenLP should be able to play any file that
you can play through your default media player.
If you can play a file through your media player but not on OpenLP it may help
to enable Phonon for multimedia playback. Go to the OpenLP configuration
:menuselection:`Settings --> Configure OpenLP...` and select the Media tab.
Make sure the check box for `Use Phonon for video playback` is checked.
.. image:: pics/phononcheckbox.png
Codecs
^^^^^^
You may need to install codecs for certain files to play. Most newer versions
of Windows and OS X will support most media types. Most Linux distributions
will require a little more help to get certain media types to play.
Microsoft Windows
^^^^^^^^^^^^^^^^^
Later versions of Microsoft Windows (Vista, Windows 7) generally come with
everything you need to play most media formats. If for some reason you need
additional codecs we have seen success from the `Combined Community Codec Pack
(CCCP) <http://www.cccp-project.net/>`_. You might also wish to check out the
K-Lite Codec Pack. If you are having issues, results do seem to vary with the
different options. What works for some may not for others, so some trial and
error may be required.
Mac
^^^
If you are using a Mac. You may wish to play Windows formats. flip4mac enables
you to use popular Windows formats such as .wmv on your Mac. You can get it
`from here <http://dynamic.telestream.net/downloads/download-flip4macwmv.htm>`_.
Ubuntu Linux (and variants)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
If you are using Ubuntu Linux, or one of its variants (Kubuntu, Edubuntu, etc...)
it is a fairly quick and easy process to get all the codecs you need to make
things work. You will need to install two meta-packages that contain all the
multimedia codecs that you will generally need. From the Software Center install
ubuntu-restricted-extras and Kubuntu-restricted-extras, or from the terminal::
user@linux:~ $ sudo apt-get install ubuntu-restricted-extras kubuntu-restricted-extras
**Note** if you are running Kubuntu there is no need to install the
ubuntu-restricted-extras meta-package
For more information on Ubuntu and multimedia issues please check out the
`community documentation <https://help.ubuntu.com/community/RestrictedFormats/>`_.
Arch Linux
^^^^^^^^^^
The following command provides the most complete solution for codecs on Arch
Linux::
root@linux:~ # pacman -S gstreamer0.10-{base,good,bad,ugly}-plugins gstreamer0.10-ffmpeg
If you need more help with Arch Linux and multimedia please see the `Arch Linux
documentation <https://wiki.archlinux.org/index.php/Codecs>`_.
Debian Linux
^^^^^^^^^^^^
You will need to add the Debian Multimedia Repository. So add the folowing to
/etc/apt/sources.list::
deb http://www.debian-multimedia.org testing main non-free
Then update the repository info::
root@linux:~ # apt-get update
Then install the following packages::
root@linux:~ # apt-get install gstreamer0.10-ffmpeg gstreamer0.10-lame gstreamer0.10-plugins-really-bad gstreamer0.10-plugins-bad gstreamer0.10-plugins-ugly gstreamer0.10-plugins-good gstreamer0.10-x264
Fedora Linux
^^^^^^^^^^^^
You will need to set up Fedora to play most media formats. This is relatively
simple using the rpmfusion repository.
**Note** the following commands will enable a third party repository to your
system. Please check out `the RPM Fusion site <http://rpmfusion.org>`_ for more information.
To enable both the free and nonfree components for any Fedora official release
enter the following commands::
su -c 'yum localinstall --nogpgcheck http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm'
After enabling the rpmfusion repository you will want to refresh your package
list, perform any updates and search for gstreamer-good, bad, and ugly and
install.
Follow the tutorial `using the rpmfusion repository <http://www.linuxjournal.com/video/getting-mp3-support-fedora-using-rpmfusion-repositories>`_
to enable extra audio and video formats on Fedora
The Media Manager appears to be missing some features
-----------------------------------------------------
If you do not see all the features listed in the Media Manager, you may need
to enable them.
To enable the plugins navigate to :menuselection:`Settings --> Plugins` or
press :kbd:`Alt+F7`. You will want to click on the plugin to the left that you
would like to enable and select **active** from the drop down box to the right.
.. image:: pics/plugins.png
By default all plugins should be enabled during the first run wizard except the
remotes plugin, unless you specify differently.
I can not see the book, chapter, and verse when I display scripture
-------------------------------------------------------------------
The book, chapter, and verse should be displayed when you display scripture. If
you can not see this your theme probably has the text size too small for the
info to be seen. See the section of the manual on :ref:`themes` if you need more info
on text sizes in themes.
I am running Mac OS X and I do not have a presentations plugin
--------------------------------------------------------------
Due to software limitations with Keynote and OpenOffice Impress, the
presentations plugin on OS X is not currently available.
I am using PowerPoint 2010 or PowerPoint Viewer 2010 and presentations do not work
----------------------------------------------------------------------------------
Currently OpenLP does not support PowerPoint Viewer 2010. PowerPoint 2010 should
work correctly, although some users have reported problems. If you have issues
with PowerPoint 2010 or PowerPoint Viewer 2010 try the PowerPoint 2003 or 2007
Viewers. `Download the PowerPoint 2007 viewer for free
<http://www.microsoft.com/downloads/en/details.aspx?FamilyID=048dc840-14e1-467d-8dca-19d2a8fd7485&displaylang=en>`_.
I have PowerPoint installed but it does not show as a presentation option
-------------------------------------------------------------------------
Installing the `Visual C++ Runtime Redistributable. <http://www.microsoft.com/downloads/en/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&displaylang=en>`_
has fixed this problem according to some of our users.
I have JPG images and they will not work on my system
-----------------------------------------------------
This is a known issue on some Mac OS X 10.5 systems and on a few Windows XP
systems. Currently the only solution is to convert your images into another
format. We would suggest using PNG images when possible with OpenLP.
I am running a Linux Distro and can not see the menus
-----------------------------------------------------
This seems to be a problem with XFCE and some versions of Gnome too. To correct
this problem, open a terminal and type in the following commands::
gconftool-2 --type boolean --set /desktop/gnome/interface/buttons_have_icons true
gconftool-2 --type boolean --set /desktop/gnome/interface/menus_have_icons true
I chose to use a web Bible but it did not download the entire Bible
-------------------------------------------------------------------
Due to copyright restrictions OpenLP cannot download an entire Bible. It can
only download the section you search for. If you do not have an internet
connection where you intend to use OpenLP you will need another scripture
source. For more information about acquiring Bibles please see :ref:`bibleimporter`.

View File

@ -0,0 +1,102 @@
================
First Run Wizard
================
When using OpenLP for the first time, the **First Run Wizard** will help you
with setting up your installation. This wizard is not intended to be a
comprehensive setup but will help you with the basics.
Select Translation
------------------
.. image:: pics/001-first-time-language.png
You can choose the translation you want to use or let OpenLP
automatically select it based on your operating system locale. Click
:guilabel:`OK` to continue.
The "Welcome to the First Time Wizard" dialog box will appear next. Click
:guilabel:`Next`.
.. image:: pics/002-first-time-wizard-welcome.png
Activate required Plugins
-------------------------
.. image:: pics/003-first-time-wizard-plugins.png
OpenLP has several plugins to choose from. By default, all plugins are enabled,
except the *Remote Access* plugin. For more information on these plugins, please
read the :doc:`mediamanager` section in the manual. If you are not sure of which
plugins to enable or disable, leave the selection as is. You can easily activate
or deactivate plugins later, when OpenLP is running, by going to
:menuselection:`Settings --> Plugin List`. Click :guilabel:`Next` to continue.
Sample Songs
------------
.. image:: pics/004-first-time-wizard-songs.png
OpenLP provides some sample songs in a few languages for downloading and
importing into your new song database. This is convenient for new users who do
not have any songs yet. If you already have songs in your database, OpenLP will
simply add these sample songs to your database, leaving your existing songs
intact. Once you are happy with which songs you'd like, click :guilabel:`Next`.
Sample Bibles
-------------
.. image:: pics/005-first-time-wizard-bibles.png
There are also a number of free Bibles that you can download and install. Using
the check box next to each Bible, select each Bible that you would like
installed. If you do not wish to install any Bibles, simply leave them all
unchecked. Once you are happy with your selection, click :guilabel:`Next` to
continue.
Sample Themes
-------------
.. image:: pics/006-first-time-wizard-themes.png
Some sample themes are also available for download and installation into OpenLP.
As with the Bibles, simply check the check box next to each theme to select it.
If you are a new user, these themes can help you understand how themes work. If
you are happy with your selected themes, click :guilabel:`Next` to continue.
Default Settings
----------------
.. image:: pics/007-first-time-wizard-settings.png
Default Display Monitor
^^^^^^^^^^^^^^^^^^^^^^^
Screen 2. If you are installing OpenLP but are not connected to a second output
at the time, you can set this up later by going to
:menuselection:`Settings --> Configure OpenLP`.
Default Theme
^^^^^^^^^^^^^
If you have selected one or more themes on the themes page of the wizard, you
can select which theme you'd like to be the default theme.
If you are happy with the selections you have made, click :guilabel:`Next` to
continue to the next page.
.. image:: pics/009-first-time-wizard-progress.png
Making progress.
.. image:: pics/010-first-time-wizard-finished.png
On the last page of the wizard, OpenLP will download the sample songs, Bibles
and themes, and set up OpenLP for you. Click :guilabel:`Finish` and OpenLP will
start.
.. image:: pics/011-first-time-wizard-song-import.png
The main window.
.. image:: pics/012-openlp-main-window.png

View File

@ -38,6 +38,7 @@ from traceback import format_exception
from PyQt4 import QtCore, QtGui
from openlp.core.lib import Receiver, check_directory_exists
from openlp.core.lib.ui import UiStrings
from openlp.core.resources import qInitResources
from openlp.core.ui.mainwindow import MainWindow
from openlp.core.ui.firsttimelanguageform import FirstTimeLanguageForm
@ -77,6 +78,13 @@ class OpenLP(QtGui.QApplication):
class in order to provide the core of the application.
"""
def exec_(self):
"""
Override exec method to allow the shared memory to be released on exit
"""
QtGui.QApplication.exec_()
self.sharedMemory.detach()
def run(self):
"""
Run the OpenLP application.
@ -107,11 +115,13 @@ class OpenLP(QtGui.QApplication):
# make sure Qt really display the splash screen
self.processEvents()
# start the main app window
self.mainWindow = MainWindow(screens, self.clipboard())
self.mainWindow = MainWindow(screens, self.clipboard(),
self.arguments())
self.mainWindow.show()
if show_splash:
# now kill the splashscreen
self.splash.finish(self.mainWindow)
log.debug(u'Splashscreen closed')
self.mainWindow.repaint()
self.processEvents()
if not has_run_wizard:
@ -122,6 +132,24 @@ class OpenLP(QtGui.QApplication):
VersionThread(self.mainWindow).start()
return self.exec_()
def isAlreadyRunning(self):
"""
Look to see if OpenLP is already running and ask if a 2nd copy
is to be started.
"""
self.sharedMemory = QtCore.QSharedMemory('OpenLP')
if self.sharedMemory.attach():
status = QtGui.QMessageBox.critical(None,
UiStrings.Error, UiStrings.OpenLPStart,
QtGui.QMessageBox.StandardButtons(
QtGui.QMessageBox.Yes | QtGui.QMessageBox.No))
if status == QtGui.QMessageBox.No:
return True
return False
else:
self.sharedMemory.create(1)
return False
def hookException(self, exctype, value, traceback):
if not hasattr(self, u'mainWindow'):
log.exception(''.join(format_exception(exctype, value, traceback)))
@ -194,6 +222,9 @@ def main():
qInitResources()
# Now create and actually run the application.
app = OpenLP(qt_args)
# Instance check
if app.isAlreadyRunning():
sys.exit()
app.setOrganizationName(u'OpenLP')
app.setOrganizationDomain(u'openlp.org')
app.setApplicationName(u'OpenLP')

View File

@ -166,7 +166,7 @@ def build_icon(icon):
QtGui.QIcon.Normal, QtGui.QIcon.Off)
return button_icon
def context_menu_action(base, icon, text, slot):
def context_menu_action(base, icon, text, slot, shortcuts=None):
"""
Utility method to help build context menus for plugins
@ -186,6 +186,8 @@ def context_menu_action(base, icon, text, slot):
if icon:
action.setIcon(build_icon(icon))
QtCore.QObject.connect(action, QtCore.SIGNAL(u'triggered()'), slot)
if shortcuts:
action.setShortcuts(shortcuts)
return action
def context_menu(base, icon, text):

View File

@ -101,6 +101,10 @@ class EventReceiver(QtCore.QObject):
``servicemanager_previous_item``
Display the previous item in the service
``servicemanager_preview_live``
Requests a Preview item from the Service Manager to update live and
add a new item to the preview panel
``servicemanager_next_item``
Display the next item in the service

View File

@ -85,7 +85,12 @@ body {
}
/* lyric css */
%s
sup {
font-size:0.6em;
vertical-align:top;
position:relative;
top:-0.3em;
}
</style>
<script language="javascript">
var timer = null;

View File

@ -101,6 +101,7 @@ class MediaManagerItem(QtGui.QWidget):
self.toolbar = None
self.remoteTriggered = None
self.singleServiceItem = True
self.quickPreviewAllowed = False
self.pageLayout = QtGui.QVBoxLayout(self)
self.pageLayout.setSpacing(0)
self.pageLayout.setMargin(0)
@ -266,23 +267,25 @@ class MediaManagerItem(QtGui.QWidget):
context_menu_action(
self.listView, u':/general/general_delete.png',
self.plugin.getString(StringContent.Delete)[u'title'],
self.onDeleteClick))
self.onDeleteClick, [QtCore.Qt.Key_Delete]))
self.listView.addAction(context_menu_separator(self.listView))
self.listView.addAction(
context_menu_action(
self.listView, u':/general/general_preview.png',
self.plugin.getString(StringContent.Preview)[u'title'],
self.onPreviewClick))
self.onPreviewClick, [QtCore.Qt.Key_Enter]))
self.listView.addAction(
context_menu_action(
self.listView, u':/general/general_live.png',
self.plugin.getString(StringContent.Live)[u'title'],
self.onLiveClick))
self.onLiveClick, [QtCore.Qt.ShiftModifier + \
QtCore.Qt.Key_Enter, QtCore.Qt.ShiftModifier + \
QtCore.Qt.Key_Return]))
self.listView.addAction(
context_menu_action(
self.listView, u':/general/general_add.png',
self.plugin.getString(StringContent.Service)[u'title'],
self.onAddClick))
self.onAddClick, [QtCore.Qt.Key_Plus, QtCore.Qt.Key_Equal]))
if self.addToServiceItem:
self.listView.addAction(
context_menu_action(
@ -293,6 +296,9 @@ class MediaManagerItem(QtGui.QWidget):
QtCore.QObject.connect(self.listView,
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'),
self.onClickPressed)
QtCore.QObject.connect(self.listView,
QtCore.SIGNAL(u'itemSelectionChanged()'),
self.onSelectionChange)
def initialise(self):
"""
@ -411,7 +417,16 @@ class MediaManagerItem(QtGui.QWidget):
else:
self.onPreviewClick()
def onPreviewClick(self):
def onSelectionChange(self):
"""
Allows the change of current item in the list to be actioned
"""
if QtCore.QSettings().value(u'advanced/single click preview',
QtCore.QVariant(False)).toBool() and self.quickPreviewAllowed \
and self.listView.selectedIndexes():
self.onPreviewClick(True)
def onPreviewClick(self, keepFocus=False):
"""
Preview an item by building a service item then adding that service
item to the preview slide controller.
@ -426,6 +441,8 @@ class MediaManagerItem(QtGui.QWidget):
if serviceItem:
serviceItem.from_plugin = True
self.parent.previewController.addServiceItem(serviceItem)
if keepFocus:
self.listView.setFocus()
def onLiveClick(self):
"""

View File

@ -145,7 +145,8 @@ class RenderManager(object):
else:
self.theme = self.service_theme
else:
if theme:
# Images have a theme of -1
if theme and theme != -1:
self.theme = theme
elif theme_level == ThemeLevel.Song or \
theme_level == ThemeLevel.Service:

View File

@ -109,7 +109,9 @@ class ServiceItem(object):
self.edit_id = None
self.xml_version = None
self.start_time = 0
self.end_time = 0
self.media_length = 0
self.from_service = False
self._new_item()
def _new_item(self):
@ -261,6 +263,7 @@ class ServiceItem(object):
u'data': self.data_string,
u'xml_version': self.xml_version,
u'start_time': self.start_time,
u'end_time': self.end_time,
u'media_length': self.media_length
}
service_data = []
@ -307,6 +310,8 @@ class ServiceItem(object):
self.xml_version = header[u'xml_version']
if u'start_time' in header:
self.start_time = header[u'start_time']
if u'end_time' in header:
self.end_time = header[u'end_time']
if u'media_length' in header:
self.media_length = header[u'media_length']
if self.service_item_type == ServiceItemType.Text:
@ -449,4 +454,3 @@ class ServiceItem(object):
return end
else:
return u'%s : %s' % (start, end)

View File

@ -23,7 +23,7 @@
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
###############################################################################
import logging
import re
try:
import enchant
@ -38,20 +38,24 @@ except ImportError:
from PyQt4 import QtCore, QtGui
from openlp.core.lib import translate, DisplayTags
log = logging.getLogger(__name__)
class SpellTextEdit(QtGui.QPlainTextEdit):
"""
Spell checking widget based on QPlanTextEdit.
"""
def __init__(self, *args):
global ENCHANT_AVAILABLE
QtGui.QPlainTextEdit.__init__(self, *args)
# Default dictionary based on the current locale.
if ENCHANT_AVAILABLE:
try:
self.dictionary = enchant.Dict()
self.highlighter = Highlighter(self.document())
self.highlighter.spellingDictionary = self.dictionary
except DictNotFoundError:
self.dictionary = enchant.Dict(u'en_US')
self.highlighter = Highlighter(self.document())
self.highlighter.spellingDictionary = self.dictionary
ENCHANT_AVAILABLE = False
log.debug(u'Could not load default dictionary')
def mousePressEvent(self, event):
"""

View File

@ -49,14 +49,17 @@ class UiStrings(object):
Cancel = translate('OpenLP.Ui', 'Cancel')
CCLINumberLabel = translate('OpenLP.Ui', 'CCLI number:')
CreateService = translate('OpenLP.Ui', 'Create a new service.')
Continuous = translate('OpenLP.Ui', 'Continuous')
Default = unicode(translate('OpenLP.Ui', 'Default'))
Delete = translate('OpenLP.Ui', '&Delete')
DisplayStyle = translate('OpenLP.Ui', 'Display style:')
Edit = translate('OpenLP.Ui', '&Edit')
EmptyField = translate('OpenLP.Ui', 'Empty Field')
Error = translate('OpenLP.Ui', 'Error')
Export = translate('OpenLP.Ui', 'Export')
FontSizePtUnit = translate('OpenLP.Ui', 'pt',
'Abbreviated font pointsize unit')
Hours = translate('OpenLP.Ui', 'h', 'The abbreviated unit for hours')
Image = translate('OpenLP.Ui', 'Image')
Import = translate('OpenLP.Ui', 'Import')
LengthTime = unicode(translate('OpenLP.Ui', 'Length %s'))
@ -64,6 +67,7 @@ class UiStrings(object):
LiveBGError = translate('OpenLP.Ui', 'Live Background Error')
LivePanel = translate('OpenLP.Ui', 'Live Panel')
Load = translate('OpenLP.Ui', 'Load')
Minutes = translate('OpenLP.Ui', 'm', 'The abbreviated unit for minutes')
Middle = translate('OpenLP.Ui', 'Middle')
New = translate('OpenLP.Ui', 'New')
NewService = translate('OpenLP.Ui', 'New Service')
@ -74,6 +78,8 @@ class UiStrings(object):
NISp = translate('OpenLP.Ui', 'No Items Selected', 'Plural')
OLPV1 = translate('OpenLP.Ui', 'openlp.org 1.x')
OLPV2 = translate('OpenLP.Ui', 'OpenLP 2.0')
OpenLPStart = translate('OpenLP.Ui', 'OpenLP is already running. Do you '
'wish to continue?')
OpenService = translate('OpenLP.Ui', 'Open Service')
Preview = translate('OpenLP.Ui', 'Preview')
PreviewPanel = translate('OpenLP.Ui', 'Preview Panel')
@ -82,7 +88,7 @@ class UiStrings(object):
ReplaceLiveBG = translate('OpenLP.Ui', 'Replace Live Background')
ResetBG = translate('OpenLP.Ui', 'Reset Background')
ResetLiveBG = translate('OpenLP.Ui', 'Reset Live Background')
S = translate('OpenLP.Ui', 's', 'The abbreviated unit for seconds')
Seconds = translate('OpenLP.Ui', 's', 'The abbreviated unit for seconds')
SaveAndPreview = translate('OpenLP.Ui', 'Save && Preview')
Search = translate('OpenLP.Ui', 'Search')
SelectDelete = translate('OpenLP.Ui', 'You must select an item to delete.')
@ -93,6 +99,8 @@ class UiStrings(object):
Theme = translate('OpenLP.Ui', 'Theme', 'Singular')
Themes = translate('OpenLP.Ui', 'Themes', 'Plural')
Top = translate('OpenLP.Ui', 'Top')
VersePerSlide = translate('OpenLP.Ui', 'Verse Per Slide')
VersePerLine = translate('OpenLP.Ui', 'Verse Per Line')
Version = translate('OpenLP.Ui', 'Version')
def add_welcome_page(parent, image):
@ -311,3 +319,20 @@ def create_valign_combo(form, parent, layout):
form.verticalComboBox.addItem(UiStrings.Bottom)
verticalLabel.setBuddy(form.verticalComboBox)
layout.addRow(verticalLabel, form.verticalComboBox)
def find_and_set_in_combo_box(combo_box, value_to_find):
"""
Find a string in a combo box and set it as the selected item if present
``combo_box``
The combo box to check for selected items
``value_to_find``
The value to find
"""
index = combo_box.findText(value_to_find,
QtCore.Qt.MatchExactly)
if index == -1:
# Not Found.
index = 0
combo_box.setCurrentIndex(index)

View File

@ -133,7 +133,7 @@ class Ui_AboutDialog(object):
u'en_ZA': [u'Raoul "superfly" Snyman'],
u'et': [u'Mattias "mahfiaz" P\xf5ldaru'],
u'fr': [u'Stephan\xe9 "stbrunner" Brunner'],
u'hu': [u'Gyuris Gell\xe9t'],
u'hu': [u'Gyuris Gell\xe9rt'],
u'ja': [u'Kunio "Kunio" Nakamaru'],
u'nb': [u'Atle "pendlaren" Weibell', u'Frode "frodus" Woldsund'],
u'nl': [u'Arjen "typovar" van Voorst'],

View File

@ -67,6 +67,10 @@ class AdvancedTab(SettingsTab):
self.doubleClickLiveCheckBox = QtGui.QCheckBox(self.uiGroupBox)
self.doubleClickLiveCheckBox.setObjectName(u'doubleClickLiveCheckBox')
self.uiLayout.addRow(self.doubleClickLiveCheckBox)
self.singleClickPreviewCheckBox = QtGui.QCheckBox(self.uiGroupBox)
self.singleClickPreviewCheckBox.setObjectName(
u'singleClickPreviewCheckBox')
self.uiLayout.addRow(self.singleClickPreviewCheckBox)
self.expandServiceItemCheckBox = QtGui.QCheckBox(self.uiGroupBox)
self.expandServiceItemCheckBox.setObjectName(
u'expandServiceItemCheckBox')
@ -130,6 +134,8 @@ class AdvancedTab(SettingsTab):
'Remember active media manager tab on startup'))
self.doubleClickLiveCheckBox.setText(translate('OpenLP.AdvancedTab',
'Double-click to send items straight to live'))
self.singleClickPreviewCheckBox.setText(translate('OpenLP.AdvancedTab',
'Preview items when clicked in Media Manager'))
self.expandServiceItemCheckBox.setText(translate('OpenLP.AdvancedTab',
'Expand new service items on creation'))
self.enableAutoCloseCheckBox.setText(translate('OpenLP.AdvancedTab',
@ -164,6 +170,9 @@ class AdvancedTab(SettingsTab):
self.doubleClickLiveCheckBox.setChecked(
settings.value(u'double click live',
QtCore.QVariant(False)).toBool())
self.singleClickPreviewCheckBox.setChecked(
settings.value(u'single click preview',
QtCore.QVariant(False)).toBool())
self.expandServiceItemCheckBox.setChecked(
settings.value(u'expand service item',
QtCore.QVariant(False)).toBool())
@ -193,6 +202,8 @@ class AdvancedTab(SettingsTab):
QtCore.QVariant(self.mediaPluginCheckBox.isChecked()))
settings.setValue(u'double click live',
QtCore.QVariant(self.doubleClickLiveCheckBox.isChecked()))
settings.setValue(u'single click preview',
QtCore.QVariant(self.singleClickPreviewCheckBox.isChecked()))
settings.setValue(u'expand service item',
QtCore.QVariant(self.expandServiceItemCheckBox.isChecked()))
settings.setValue(u'enable exit confirmation',

View File

@ -57,6 +57,7 @@ except ImportError:
from openlp.core.lib import translate, SettingsManager
from openlp.core.lib.mailto import mailto
from openlp.core.lib.ui import UiStrings
from openlp.core.utils import get_application_version
from exceptiondialog import Ui_ExceptionDialog
@ -78,7 +79,7 @@ class ExceptionForm(QtGui.QDialog, Ui_ExceptionDialog):
return QtGui.QDialog.exec_(self)
def _createReport(self):
openlp_version = self.parent().applicationVersion[u'full']
openlp_version = get_application_version()
description = unicode(self.descriptionTextEdit.toPlainText())
traceback = unicode(self.exceptionTextEdit.toPlainText())
system = unicode(translate('OpenLP.ExceptionForm',

View File

@ -105,6 +105,9 @@ class GeneralTab(SettingsTab):
self.saveCheckServiceCheckBox = QtGui.QCheckBox(self.settingsGroupBox)
self.saveCheckServiceCheckBox.setObjectName(u'saveCheckServiceCheckBox')
self.settingsLayout.addRow(self.saveCheckServiceCheckBox)
self.autoUnblankCheckBox = QtGui.QCheckBox(self.settingsGroupBox)
self.autoUnblankCheckBox.setObjectName(u'autoUnblankCheckBox')
self.settingsLayout.addRow(self.autoUnblankCheckBox)
self.autoPreviewCheckBox = QtGui.QCheckBox(self.settingsGroupBox)
self.autoPreviewCheckBox.setObjectName(u'autoPreviewCheckBox')
self.settingsLayout.addRow(self.autoPreviewCheckBox)
@ -224,6 +227,8 @@ class GeneralTab(SettingsTab):
translate('OpenLP.GeneralTab', 'Application Settings'))
self.saveCheckServiceCheckBox.setText(translate('OpenLP.GeneralTab',
'Prompt to save before starting a new service'))
self.autoUnblankCheckBox.setText(translate('OpenLP.GeneralTab',
'Unblank display when adding new live item'))
self.autoPreviewCheckBox.setText(translate('OpenLP.GeneralTab',
'Automatically preview next item in service'))
self.timeoutLabel.setText(translate('OpenLP.GeneralTab',
@ -262,6 +267,8 @@ class GeneralTab(SettingsTab):
u'songselect password', QtCore.QVariant(u'')).toString()))
self.saveCheckServiceCheckBox.setChecked(settings.value(u'save prompt',
QtCore.QVariant(False)).toBool())
self.autoUnblankCheckBox.setChecked(settings.value(u'auto unblank',
QtCore.QVariant(False)).toBool())
self.monitorComboBox.setCurrentIndex(self.monitorNumber)
self.displayOnMonitorCheck.setChecked(self.screens.display)
self.warningCheckBox.setChecked(settings.value(u'blank warning',
@ -312,6 +319,8 @@ class GeneralTab(SettingsTab):
QtCore.QVariant(self.checkForUpdatesCheckBox.isChecked()))
settings.setValue(u'save prompt',
QtCore.QVariant(self.saveCheckServiceCheckBox.isChecked()))
settings.setValue(u'auto unblank',
QtCore.QVariant(self.autoUnblankCheckBox.isChecked()))
settings.setValue(u'auto preview',
QtCore.QVariant(self.autoPreviewCheckBox.isChecked()))
settings.setValue(u'loop delay',

View File

@ -367,7 +367,7 @@ class MainDisplay(DisplayWidget):
self.mediaObject.setCurrentSource(Phonon.MediaSource(videoPath))
# Need the timer to trigger set the trigger to 200ms
# Value taken from web documentation.
if self.serviceItem.start_time != 0:
if self.serviceItem.end_time != 0:
self.mediaObject.setTickInterval(200)
self.mediaObject.play()
self.webView.setVisible(False)
@ -401,9 +401,9 @@ class MainDisplay(DisplayWidget):
def videoTick(self, tick):
"""
Triggered on video tick every 200 milli seconds
Will be used to manage stop time later
"""
pass
if tick > self.serviceItem.end_time * 1000:
self.videoFinished()
def isWebLoaded(self):
"""
@ -489,7 +489,11 @@ class MainDisplay(DisplayWidget):
self.footer(serviceItem.foot_text)
# if was hidden keep it hidden
if self.hideMode and self.isLive:
self.hideDisplay(self.hideMode)
if QtCore.QSettings().value(u'general/auto unblank',
QtCore.QVariant(False)).toBool():
Receiver.send_message(u'slidecontroller_live_unblank')
else:
self.hideDisplay(self.hideMode)
# display hidden for video end we have a new item so must be shown
if self.videoHide and self.isLive:
self.videoHide = False

View File

@ -469,7 +469,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
actionList = ActionList()
def __init__(self, screens, clipboard):
def __init__(self, screens, clipboard, arguments):
"""
This constructor sets up the interface, the various managers, and the
plugins.
@ -477,6 +477,7 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
QtGui.QMainWindow.__init__(self)
self.screens = screens
self.clipboard = clipboard
self.arguments = arguments
# Set up settings sections for the main application
# (not for use by plugins)
self.uiSettingsSection = u'user interface'
@ -660,7 +661,16 @@ class MainWindow(QtGui.QMainWindow, Ui_MainWindow):
if self.liveController.display.isVisible():
self.liveController.display.setFocus()
self.activateWindow()
if QtCore.QSettings().value(
# On Windows, arguments contains the entire commandline
# So args[0]=='python' args[1]=='openlp.pyw'
# Therefore this approach is not going to work
# Bypass for now.
if len(self.arguments) and os.name != u'nt':
args = []
for a in self.arguments:
args.extend([a])
self.ServiceManagerContents.loadFile(unicode(args[0]))
elif QtCore.QSettings().value(
self.generalSettingsSection + u'/auto open',
QtCore.QVariant(False)).toBool():
self.ServiceManagerContents.loadLastFile()

View File

@ -33,12 +33,12 @@ from openlp.core.ui.printservicedialog import Ui_PrintServiceDialog, ZoomSize
class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
def __init__(self, parent, serviceManager):
def __init__(self, mainWindow, serviceManager):
"""
Constructor
"""
QtGui.QDialog.__init__(self, parent)
self.parent = parent
QtGui.QDialog.__init__(self, mainWindow)
self.mainWindow = mainWindow
self.serviceManager = serviceManager
self.printer = QtGui.QPrinter()
self.printDialog = QtGui.QPrintDialog(self.printer, self)
@ -134,9 +134,12 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
item.notes.replace(u'\n', u'<br />'))
# Add play length of media files.
if item.is_media() and self.metaDataCheckBox.isChecked():
tme = item.media_length
if item.end_time > 0:
tme = item.end_time - item.start_time
text += u'<p><strong>%s</strong> %s</p>' % (translate(
'OpenLP.ServiceManager', u'Playing time:'),
unicode(datetime.timedelta(seconds=item.media_length)))
unicode(datetime.timedelta(seconds=tme)))
if self.footerTextEdit.toPlainText():
text += u'<h4>%s</h4>%s' % (translate('OpenLP.ServiceManager',
u'Custom Service Notes:'), self.footerTextEdit.toPlainText())
@ -181,13 +184,14 @@ class PrintServiceForm(QtGui.QDialog, Ui_PrintServiceDialog):
"""
Copies the display text to the clipboard as plain text
"""
self.parent.clipboard.setText(self.document.toPlainText())
self.mainWindow.clipboard.setText(
self.document.toPlainText())
def copyHtmlText(self):
"""
Copies the display text to the clipboard as Html
"""
self.parent.clipboard.setText(self.document.toHtml())
self.mainWindow.clipboard.setText(self.document.toHtml())
def printServiceOrder(self):
"""

View File

@ -141,4 +141,3 @@ class ServiceItemEditForm(QtGui.QDialog, Ui_ServiceItemEditDialog):
else:
self.upButton.setEnabled(True)
self.deleteButton.setEnabled(True)

View File

@ -35,7 +35,8 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import OpenLPToolbar, ServiceItem, context_menu_action, \
Receiver, build_icon, ItemCapabilities, SettingsManager, translate
from openlp.core.lib.theme import ThemeLevel
from openlp.core.lib.ui import UiStrings, critical_error_message_box
from openlp.core.lib.ui import UiStrings, critical_error_message_box, \
find_and_set_in_combo_box
from openlp.core.ui import ServiceNoteForm, ServiceItemEditForm, StartTimeForm
from openlp.core.ui.printserviceform import PrintServiceForm
from openlp.core.utils import AppLocation, delete_file, file_is_unicode, \
@ -231,13 +232,15 @@ class ServiceManager(QtGui.QWidget):
QtCore.QObject.connect(self.themeComboBox,
QtCore.SIGNAL(u'activated(int)'), self.onThemeComboBoxSelected)
QtCore.QObject.connect(self.serviceManagerList,
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.makeLive)
QtCore.SIGNAL(u'doubleClicked(QModelIndex)'), self.onMakeLive)
QtCore.QObject.connect(self.serviceManagerList,
QtCore.SIGNAL(u'itemCollapsed(QTreeWidgetItem*)'), self.collapsed)
QtCore.QObject.connect(self.serviceManagerList,
QtCore.SIGNAL(u'itemExpanded(QTreeWidgetItem*)'), self.expanded)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'servicemanager_preview_live'), self.previewLive)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'servicemanager_next_item'), self.nextItem)
QtCore.QObject.connect(Receiver.get_receiver(),
@ -561,6 +564,7 @@ class ServiceManager(QtGui.QWidget):
self.newFile()
for item in items:
serviceItem = ServiceItem()
serviceItem.from_service = True
serviceItem.render_manager = self.mainwindow.renderManager
serviceItem.set_from_service(item, self.servicePath)
self.validateItem(serviceItem)
@ -585,6 +589,21 @@ class ServiceManager(QtGui.QWidget):
message=translate('OpenLP.ServiceManager',
'File could not be opened because it is corrupt.'))
log.exception(u'Problem loading service file %s' % fileName)
except zipfile.BadZipfile:
if os.path.getsize(fileName) == 0:
log.exception(u'Service file is zero sized: %s' % fileName)
QtGui.QMessageBox.information(self,
translate('OpenLP.ServiceManager', 'Empty File'),
translate('OpenLP.ServiceManager', 'This service file '
'does not contain any data.'))
else:
log.exception(u'Service file is cannot be extracted as zip: '
u'%s' % fileName)
QtGui.QMessageBox.information(self,
translate('OpenLP.ServiceManager', 'Corrupt File'),
translate('OpenLP.ServiceManager', 'This file is either'
'corrupt or not an OpenLP 2.0 service file.'))
return
finally:
if fileTo:
fileTo.close()
@ -658,10 +677,6 @@ class ServiceManager(QtGui.QWidget):
item = self.findServiceItem()[0]
self.startTimeForm.item = self.serviceItems[item]
if self.startTimeForm.exec_():
self.serviceItems[item][u'service_item'].start_time = \
self.startTimeForm.hourSpinBox.value() * 3600 + \
self.startTimeForm.minuteSpinBox.value() * 60 + \
self.startTimeForm.secondSpinBox.value()
self.repaintServiceList(item, -1)
def onServiceItemEditForm(self):
@ -672,6 +687,19 @@ class ServiceManager(QtGui.QWidget):
self.addServiceItem(self.serviceItemEditForm.getServiceItem(),
replace=True, expand=self.serviceItems[item][u'expanded'])
def previewLive(self, message):
"""
Called by the SlideController to request a preview item be made live
and allows the next preview to be updated if relevent.
"""
uuid, row = message.split(u':')
for sitem in self.serviceItems:
if sitem[u'service_item']._uuid == uuid:
item = self.serviceManagerList.topLevelItem(sitem[u'order'] - 1)
self.serviceManagerList.setCurrentItem(item)
self.makeLive(int(row))
return
def nextItem(self):
"""
Called by the SlideController to select the next service item.
@ -994,7 +1022,7 @@ class ServiceManager(QtGui.QWidget):
editId, uuid = message.split(u':')
for item in self.serviceItems:
if item[u'service_item']._uuid == uuid:
item[u'service_item'].edit_id = editId
item[u'service_item'].edit_id = int(editId)
self.setModified(True)
def replaceServiceItem(self, newItem):
@ -1027,6 +1055,7 @@ class ServiceManager(QtGui.QWidget):
if expand is None:
expand = self.expandTabs
item.render()
item.from_service = True
if replace:
sitem, child = self.findServiceItem()
item.merge(self.serviceItems[sitem][u'service_item'])
@ -1081,11 +1110,27 @@ class ServiceManager(QtGui.QWidget):
else:
return self.serviceItems[item][u'service_item']
def makeLive(self):
def onMakeLive(self):
"""
Send the current item to the Live slide controller but triggered
by a tablewidget click event.
"""
self.makeLive()
def makeLive(self, row=-1):
"""
Send the current item to the Live slide controller
``row``
Row number to be displayed if from preview.
-1 is passed if the value is not set
"""
item, child = self.findServiceItem()
# No items in service
if item == -1:
return
if row != -1:
child = row
if self.serviceItems[item][u'service_item'].is_valid:
self.mainwindow.liveController.addServiceManagerItem(
self.serviceItems[item][u'service_item'], child)
@ -1217,13 +1262,7 @@ class ServiceManager(QtGui.QWidget):
action = context_menu_action(self.serviceManagerList, None, theme,
self.onThemeChangeAction)
self.themeMenu.addAction(action)
index = self.themeComboBox.findText(self.service_theme,
QtCore.Qt.MatchExactly)
# Not Found
if index == -1:
index = 0
self.service_theme = u''
self.themeComboBox.setCurrentIndex(index)
find_and_set_in_combo_box(self.themeComboBox, self.service_theme)
self.mainwindow.renderManager.set_service_theme(self.service_theme)
self.regenerateServiceItems()
@ -1262,4 +1301,4 @@ class ServiceManager(QtGui.QWidget):
Print a Service Order Sheet.
"""
settingDialog = PrintServiceForm(self.mainwindow, self)
settingDialog.exec_()
settingDialog.exec_()

View File

@ -185,7 +185,7 @@ class SlideController(QtGui.QWidget):
self.delaySpinBox.setMinimum(1)
self.delaySpinBox.setMaximum(180)
self.toolbar.addToolbarWidget(u'Image SpinBox', self.delaySpinBox)
self.delaySpinBox.setSuffix(UiStrings.S)
self.delaySpinBox.setSuffix(UiStrings.Seconds)
self.delaySpinBox.setToolTip(translate('OpenLP.SlideController',
'Delay between slides in seconds'))
else:
@ -1014,8 +1014,12 @@ class SlideController(QtGui.QWidget):
"""
row = self.previewListWidget.currentRow()
if row > -1 and row < self.previewListWidget.rowCount():
self.parent.liveController.addServiceManagerItem(
self.serviceItem, row)
if self.serviceItem.from_service:
Receiver.send_message('servicemanager_preview_live',
u'%s:%s' % (self.serviceItem._uuid, row))
else:
self.parent.liveController.addServiceManagerItem(
self.serviceItem, row)
def onMediaStart(self, item):
"""

View File

@ -32,39 +32,90 @@ from openlp.core.lib.ui import UiStrings, create_accept_reject_button_box
class Ui_StartTimeDialog(object):
def setupUi(self, StartTimeDialog):
StartTimeDialog.setObjectName(u'StartTimeDialog')
StartTimeDialog.resize(300, 10)
StartTimeDialog.resize(350, 10)
self.dialogLayout = QtGui.QGridLayout(StartTimeDialog)
self.dialogLayout.setObjectName(u'dialogLayout')
self.startLabel = QtGui.QLabel(StartTimeDialog)
self.startLabel.setObjectName(u'startLabel')
self.startLabel.setAlignment(QtCore.Qt.AlignHCenter)
self.dialogLayout.addWidget(self.startLabel, 0, 1, 1, 1)
self.finishLabel = QtGui.QLabel(StartTimeDialog)
self.finishLabel.setObjectName(u'finishLabel')
self.finishLabel.setAlignment(QtCore.Qt.AlignHCenter)
self.dialogLayout.addWidget(self.finishLabel, 0, 2, 1, 1)
self.lengthLabel = QtGui.QLabel(StartTimeDialog)
self.lengthLabel.setObjectName(u'startLabel')
self.lengthLabel.setAlignment(QtCore.Qt.AlignHCenter)
self.dialogLayout.addWidget(self.lengthLabel, 0, 3, 1, 1)
self.hourLabel = QtGui.QLabel(StartTimeDialog)
self.hourLabel.setObjectName("hourLabel")
self.dialogLayout.addWidget(self.hourLabel, 0, 0, 1, 1)
self.hourLabel.setObjectName(u'hourLabel')
self.dialogLayout.addWidget(self.hourLabel, 1, 0, 1, 1)
self.hourSpinBox = QtGui.QSpinBox(StartTimeDialog)
self.hourSpinBox.setObjectName("hourSpinBox")
self.dialogLayout.addWidget(self.hourSpinBox, 0, 1, 1, 1)
self.hourSpinBox.setObjectName(u'hourSpinBox')
self.hourSpinBox.setMinimum(0)
self.hourSpinBox.setMaximum(4)
self.dialogLayout.addWidget(self.hourSpinBox, 1, 1, 1, 1)
self.hourFinishSpinBox = QtGui.QSpinBox(StartTimeDialog)
self.hourFinishSpinBox.setObjectName(u'hourFinishSpinBox')
self.hourFinishSpinBox.setMinimum(0)
self.hourFinishSpinBox.setMaximum(4)
self.dialogLayout.addWidget(self.hourFinishSpinBox, 1, 2, 1, 1)
self.hourFinishLabel = QtGui.QLabel(StartTimeDialog)
self.hourFinishLabel.setObjectName(u'hourLabel')
self.hourFinishLabel.setAlignment(QtCore.Qt.AlignRight)
self.dialogLayout.addWidget(self.hourFinishLabel, 1, 3, 1, 1)
self.minuteLabel = QtGui.QLabel(StartTimeDialog)
self.minuteLabel.setObjectName("minuteLabel")
self.dialogLayout.addWidget(self.minuteLabel, 1, 0, 1, 1)
self.minuteLabel.setObjectName(u'minuteLabel')
self.dialogLayout.addWidget(self.minuteLabel, 2, 0, 1, 1)
self.minuteSpinBox = QtGui.QSpinBox(StartTimeDialog)
self.minuteSpinBox.setObjectName("minuteSpinBox")
self.dialogLayout.addWidget(self.minuteSpinBox, 1, 1, 1, 1)
self.minuteSpinBox.setObjectName(u'minuteSpinBox')
self.minuteSpinBox.setMinimum(0)
self.minuteSpinBox.setMaximum(59)
self.dialogLayout.addWidget(self.minuteSpinBox, 2, 1, 1, 1)
self.minuteFinishSpinBox = QtGui.QSpinBox(StartTimeDialog)
self.minuteFinishSpinBox.setObjectName(u'minuteFinishSpinBox')
self.minuteFinishSpinBox.setMinimum(0)
self.minuteFinishSpinBox.setMaximum(59)
self.dialogLayout.addWidget(self.minuteFinishSpinBox, 2, 2, 1, 1)
self.minuteFinishLabel = QtGui.QLabel(StartTimeDialog)
self.minuteFinishLabel.setObjectName(u'minuteLabel')
self.minuteFinishLabel.setAlignment(QtCore.Qt.AlignRight)
self.dialogLayout.addWidget(self.minuteFinishLabel, 2, 3, 1, 1)
self.secondLabel = QtGui.QLabel(StartTimeDialog)
self.secondLabel.setObjectName("secondLabel")
self.dialogLayout.addWidget(self.secondLabel, 2, 0, 1, 1)
self.secondLabel.setObjectName(u'secondLabel')
self.dialogLayout.addWidget(self.secondLabel, 3, 0, 1, 1)
self.secondSpinBox = QtGui.QSpinBox(StartTimeDialog)
self.secondSpinBox.setObjectName("secondSpinBox")
self.dialogLayout.addWidget(self.secondSpinBox, 2, 1, 1, 1)
self.secondSpinBox.setObjectName(u'secondSpinBox')
self.secondSpinBox.setMinimum(0)
self.secondSpinBox.setMaximum(59)
self.secondFinishSpinBox = QtGui.QSpinBox(StartTimeDialog)
self.secondFinishSpinBox.setObjectName(u'secondFinishSpinBox')
self.secondFinishSpinBox.setMinimum(0)
self.secondFinishSpinBox.setMaximum(59)
self.dialogLayout.addWidget(self.secondFinishSpinBox, 3, 2, 1, 1)
self.secondFinishLabel = QtGui.QLabel(StartTimeDialog)
self.secondFinishLabel.setObjectName(u'secondLabel')
self.secondFinishLabel.setAlignment(QtCore.Qt.AlignRight)
self.dialogLayout.addWidget(self.secondFinishLabel, 3, 3, 1, 1)
self.dialogLayout.addWidget(self.secondSpinBox, 3, 1, 1, 1)
self.buttonBox = create_accept_reject_button_box(StartTimeDialog, True)
self.dialogLayout.addWidget(self.buttonBox, 4, 0, 1, 2)
self.dialogLayout.addWidget(self.buttonBox, 5, 2, 1, 2)
self.retranslateUi(StartTimeDialog)
self.setMaximumHeight(self.sizeHint().height())
QtCore.QMetaObject.connectSlotsByName(StartTimeDialog)
def retranslateUi(self, StartTimeDialog):
self.setWindowTitle(translate('OpenLP.StartTimeForm',
'Item Start Time'))
'Item Start and Finish Time'))
self.hourSpinBox.setSuffix(UiStrings.Hours)
self.minuteSpinBox.setSuffix(UiStrings.Minutes)
self.secondSpinBox.setSuffix(UiStrings.Seconds)
self.hourFinishSpinBox.setSuffix(UiStrings.Hours)
self.minuteFinishSpinBox.setSuffix(UiStrings.Minutes)
self.secondFinishSpinBox.setSuffix(UiStrings.Seconds)
self.hourLabel.setText(translate('OpenLP.StartTimeForm', 'Hours:'))
self.hourSpinBox.setSuffix(translate('OpenLP.StartTimeForm', 'h'))
self.minuteSpinBox.setSuffix(translate('OpenLP.StartTimeForm', 'm'))
self.secondSpinBox.setSuffix(UiStrings.S)
self.minuteLabel.setText(translate('OpenLP.StartTimeForm', 'Minutes:'))
self.secondLabel.setText(translate('OpenLP.StartTimeForm', 'Seconds:'))
self.startLabel.setText(translate('OpenLP.StartTimeForm', 'Start'))
self.finishLabel.setText(translate('OpenLP.StartTimeForm', 'Finish'))
self.lengthLabel.setText(translate('OpenLP.StartTimeForm', 'Length'))

View File

@ -28,6 +28,9 @@ from PyQt4 import QtGui
from starttimedialog import Ui_StartTimeDialog
from openlp.core.lib import translate
from openlp.core.lib.ui import UiStrings, critical_error_message_box
class StartTimeForm(QtGui.QDialog, Ui_StartTimeDialog):
"""
The exception dialog
@ -40,13 +43,51 @@ class StartTimeForm(QtGui.QDialog, Ui_StartTimeDialog):
"""
Run the Dialog with correct heading.
"""
seconds = self.item[u'service_item'].start_time
hour, minutes, seconds = self._time_split(
self.item[u'service_item'].start_time)
self.hourSpinBox.setValue(hour)
self.minuteSpinBox.setValue(minutes)
self.secondSpinBox.setValue(seconds)
hours, minutes, seconds = self._time_split(
self.item[u'service_item'].media_length)
self.hourFinishSpinBox.setValue(hours)
self.minuteFinishSpinBox.setValue(minutes)
self.secondFinishSpinBox.setValue(seconds)
self.hourFinishLabel.setText(u'%s%s' % (unicode(hour), UiStrings.Hours))
self.minuteFinishLabel.setText(u'%s%s' %
(unicode(minutes), UiStrings.Minutes))
self.secondFinishLabel.setText(u'%s%s' %
(unicode(seconds), UiStrings.Seconds))
return QtGui.QDialog.exec_(self)
def accept(self):
start = self.hourSpinBox.value() * 3600 + \
self.minuteSpinBox.value() * 60 + \
self.secondSpinBox.value()
end = self.hourFinishSpinBox.value() * 3600 + \
self.minuteFinishSpinBox.value() * 60 + \
self.secondFinishSpinBox.value()
if end > self.item[u'service_item'].media_length:
critical_error_message_box(
title=translate('OpenLP.StartTimeForm',
'Time Validation Error'),
message=translate('OpenLP.StartTimeForm',
'End time is set after the end of the media item'))
return
elif start > end:
critical_error_message_box(
title=translate('OpenLP.StartTimeForm',
'Time Validation Error'),
message=translate('OpenLP.StartTimeForm',
'Start time is after the End Time of the media item'))
return
self.item[u'service_item'].start_time = start
self.item[u'service_item'].end_time = end
return QtGui.QDialog.accept(self)
def _time_split(self, seconds):
hours = seconds / 3600
seconds -= 3600 * hours
minutes = seconds / 60
seconds -= 60 * minutes
self.hourSpinBox.setValue(hours)
self.minuteSpinBox.setValue(minutes)
self.secondSpinBox.setValue(seconds)
return QtGui.QDialog.exec_(self)
return hours, minutes, seconds

View File

@ -63,26 +63,19 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
QtCore.SIGNAL(u'currentIndexChanged(int)'),
self.onGradientComboBoxCurrentIndexChanged)
QtCore.QObject.connect(self.colorButton,
QtCore.SIGNAL(u'clicked()'),
self.onColorButtonClicked)
QtCore.SIGNAL(u'clicked()'), self.onColorButtonClicked)
QtCore.QObject.connect(self.gradientStartButton,
QtCore.SIGNAL(u'clicked()'),
self.onGradientStartButtonClicked)
QtCore.SIGNAL(u'clicked()'), self.onGradientStartButtonClicked)
QtCore.QObject.connect(self.gradientEndButton,
QtCore.SIGNAL(u'clicked()'),
self.onGradientEndButtonClicked)
QtCore.SIGNAL(u'clicked()'), self.onGradientEndButtonClicked)
QtCore.QObject.connect(self.imageBrowseButton,
QtCore.SIGNAL(u'clicked()'),
self.onImageBrowseButtonClicked)
QtCore.SIGNAL(u'clicked()'), self.onImageBrowseButtonClicked)
QtCore.QObject.connect(self.mainColorButton,
QtCore.SIGNAL(u'clicked()'),
self.onMainColorButtonClicked)
QtCore.SIGNAL(u'clicked()'), self.onMainColorButtonClicked)
QtCore.QObject.connect(self.outlineColorButton,
QtCore.SIGNAL(u'clicked()'),
self.onOutlineColorButtonClicked)
QtCore.SIGNAL(u'clicked()'), self.onOutlineColorButtonClicked)
QtCore.QObject.connect(self.shadowColorButton,
QtCore.SIGNAL(u'clicked()'),
self.onShadowColorButtonClicked)
QtCore.SIGNAL(u'clicked()'), self.onShadowColorButtonClicked)
QtCore.QObject.connect(self.outlineCheckBox,
QtCore.SIGNAL(u'stateChanged(int)'),
self.onOutlineCheckCheckBoxStateChanged)
@ -90,8 +83,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
QtCore.SIGNAL(u'stateChanged(int)'),
self.onShadowCheckCheckBoxStateChanged)
QtCore.QObject.connect(self.footerColorButton,
QtCore.SIGNAL(u'clicked()'),
self.onFooterColorButtonClicked)
QtCore.SIGNAL(u'clicked()'), self.onFooterColorButtonClicked)
QtCore.QObject.connect(self.mainPositionCheckBox,
QtCore.SIGNAL(u'stateChanged(int)'),
self.onMainPositionCheckBoxStateChanged)
@ -99,26 +91,23 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
QtCore.SIGNAL(u'stateChanged(int)'),
self.onFooterPositionCheckBoxStateChanged)
QtCore.QObject.connect(self,
QtCore.SIGNAL(u'currentIdChanged(int)'),
self.onCurrentIdChanged)
QtCore.SIGNAL(u'currentIdChanged(int)'), self.onCurrentIdChanged)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'theme_line_count'),
self.updateLinesText)
QtCore.SIGNAL(u'theme_line_count'), self.updateLinesText)
QtCore.QObject.connect(self.mainSizeSpinBox,
QtCore.SIGNAL(u'valueChanged(int)'),
self.calculateLines)
QtCore.SIGNAL(u'valueChanged(int)'), self.calculateLines)
QtCore.QObject.connect(self.lineSpacingSpinBox,
QtCore.SIGNAL(u'valueChanged(int)'),
self.calculateLines)
QtCore.SIGNAL(u'valueChanged(int)'), self.calculateLines)
QtCore.QObject.connect(self.outlineSizeSpinBox,
QtCore.SIGNAL(u'valueChanged(int)'),
self.calculateLines)
QtCore.SIGNAL(u'valueChanged(int)'), self.calculateLines)
QtCore.QObject.connect(self.shadowSizeSpinBox,
QtCore.SIGNAL(u'valueChanged(int)'),
self.calculateLines)
QtCore.SIGNAL(u'valueChanged(int)'), self.calculateLines)
QtCore.QObject.connect(self.mainFontComboBox,
QtCore.SIGNAL(u'activated(int)'),
self.calculateLines)
QtCore.SIGNAL(u'activated(int)'), self.calculateLines)
QtCore.QObject.connect(self.footerFontComboBox,
QtCore.SIGNAL(u'activated(int)'), self.updateTheme)
QtCore.QObject.connect(self.footerSizeSpinBox,
QtCore.SIGNAL(u'valueChanged(int)'), self.updateTheme)
def setDefaults(self):
"""
@ -389,7 +378,7 @@ class ThemeForm(QtGui.QWizard, Ui_ThemeWizard):
Handle the display and state of the Footer Area page.
"""
self.footerFontComboBox.setCurrentFont(
QtGui.QFont(self.theme.font_main_name))
QtGui.QFont(self.theme.font_footer_name))
self.footerColorButton.setStyleSheet(u'background-color: %s' %
self.theme.font_footer_color)
self.setField(u'footerSizeSpinBox',

View File

@ -445,6 +445,7 @@ class ThemeManager(QtGui.QWidget):
files = SettingsManager.get_files(self.settingsSection, u'.png')
if firstTime:
self.firstTime()
files = SettingsManager.get_files(self.settingsSection, u'.png')
# No themes have been found so create one
if len(files) == 0:
theme = ThemeXML()

View File

@ -28,7 +28,7 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import SettingsTab, Receiver, translate
from openlp.core.lib.theme import ThemeLevel
from openlp.core.lib.ui import UiStrings
from openlp.core.lib.ui import UiStrings, find_and_set_in_combo_box
class ThemesTab(SettingsTab):
"""
@ -185,12 +185,7 @@ class ThemesTab(SettingsTab):
self.DefaultComboBox.clear()
for theme in theme_list:
self.DefaultComboBox.addItem(theme)
id = self.DefaultComboBox.findText(
self.global_theme, QtCore.Qt.MatchExactly)
if id == -1:
id = 0 # Not Found
self.global_theme = u''
self.DefaultComboBox.setCurrentIndex(id)
find_and_set_in_combo_box(self.DefaultComboBox, self.global_theme)
self.parent.renderManager.set_global_theme(
self.global_theme, self.theme_level)
if self.global_theme is not u'':
@ -206,4 +201,4 @@ class ThemesTab(SettingsTab):
if not preview.isNull():
preview = preview.scaled(300, 255, QtCore.Qt.KeepAspectRatio,
QtCore.Qt.SmoothTransformation)
self.DefaultListView.setPixmap(preview)
self.DefaultListView.setPixmap(preview)

View File

@ -91,7 +91,7 @@ class LanguageManager(object):
"""
Retrieve a saved language to use from settings
"""
settings = QtCore.QSettings(u'OpenLP', u'OpenLP')
settings = QtCore.QSettings()
language = unicode(settings.value(
u'general/language', QtCore.QVariant(u'[en]')).toString())
log.info(u'Language file: \'%s\' Loaded from conf file' % language)

View File

@ -112,7 +112,7 @@ class AlertsTab(SettingsTab):
self.FontSizeSpinBox.setSuffix(UiStrings.FontSizePtUnit)
self.TimeoutLabel.setText(
translate('AlertsPlugin.AlertsTab', 'Alert timeout:'))
self.TimeoutSpinBox.setSuffix(UiStrings.S)
self.TimeoutSpinBox.setSuffix(UiStrings.Seconds)
self.PreviewGroupBox.setTitle(UiStrings.Preview)
self.FontPreview.setText(UiStrings.OLPV2)

View File

@ -85,8 +85,18 @@ class BibleImportForm(OpenLPWizard):
"""
OpenLPWizard.setupUi(self, image)
QtCore.QObject.connect(self.formatComboBox,
QtCore.SIGNAL(u'currentIndexChanged(int)'), self.selectStack,
QtCore.SLOT(u'setCurrentIndex(int)'))
QtCore.SIGNAL(u'currentIndexChanged(int)'),
self.onCurrentIndexChanged)
def onCurrentIndexChanged(self, index):
"""
Called when the format combo box's index changed. We have to check if
the import is available and accordingly to disable or enable the next
button.
"""
self.selectStack.setCurrentIndex(index)
next_button = self.button(QtGui.QWizard.NextButton)
next_button.setEnabled(BibleFormat.get_availability(index))
def customInit(self):
"""

View File

@ -30,6 +30,7 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import Receiver, SettingsTab, translate
from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle
from openlp.core.lib.ui import UiStrings, find_and_set_in_combo_box
log = logging.getLogger(__name__)
@ -48,108 +49,107 @@ class BiblesTab(SettingsTab):
def setupUi(self):
self.setObjectName(u'BiblesTab')
SettingsTab.setupUi(self)
self.VerseDisplayGroupBox = QtGui.QGroupBox(self.leftColumn)
self.VerseDisplayGroupBox.setObjectName(u'VerseDisplayGroupBox')
self.VerseDisplayLayout = QtGui.QFormLayout(self.VerseDisplayGroupBox)
self.VerseDisplayLayout.setObjectName(u'VerseDisplayLayout')
self.NewChaptersCheckBox = QtGui.QCheckBox(self.VerseDisplayGroupBox)
self.NewChaptersCheckBox.setObjectName(u'NewChaptersCheckBox')
self.VerseDisplayLayout.addRow(self.NewChaptersCheckBox)
self.DisplayStyleLabel = QtGui.QLabel(self.VerseDisplayGroupBox)
self.DisplayStyleLabel.setObjectName(u'DisplayStyleLabel')
self.DisplayStyleComboBox = QtGui.QComboBox(self.VerseDisplayGroupBox)
self.DisplayStyleComboBox.addItems([u'', u'', u'', u''])
self.DisplayStyleComboBox.setObjectName(u'DisplayStyleComboBox')
self.VerseDisplayLayout.addRow(self.DisplayStyleLabel,
self.DisplayStyleComboBox)
self.LayoutStyleLabel = QtGui.QLabel(self.VerseDisplayGroupBox)
self.LayoutStyleLabel.setObjectName(u'LayoutStyleLabel')
self.LayoutStyleComboBox = QtGui.QComboBox(self.VerseDisplayGroupBox)
self.LayoutStyleComboBox.setObjectName(u'LayoutStyleComboBox')
self.LayoutStyleComboBox.addItems([u'', u'', u''])
self.VerseDisplayLayout.addRow(self.LayoutStyleLabel,
self.LayoutStyleComboBox)
self.BibleSecondCheckBox = QtGui.QCheckBox(self.VerseDisplayGroupBox)
self.BibleSecondCheckBox.setObjectName(u'BibleSecondCheckBox')
self.VerseDisplayLayout.addRow(self.BibleSecondCheckBox)
self.BibleThemeLabel = QtGui.QLabel(self.VerseDisplayGroupBox)
self.BibleThemeLabel.setObjectName(u'BibleThemeLabel')
self.BibleThemeComboBox = QtGui.QComboBox(self.VerseDisplayGroupBox)
self.BibleThemeComboBox.setSizeAdjustPolicy(
self.verseDisplayGroupBox = QtGui.QGroupBox(self.leftColumn)
self.verseDisplayGroupBox.setObjectName(u'verseDisplayGroupBox')
self.verseDisplayLayout = QtGui.QFormLayout(self.verseDisplayGroupBox)
self.verseDisplayLayout.setObjectName(u'verseDisplayLayout')
self.newChaptersCheckBox = QtGui.QCheckBox(self.verseDisplayGroupBox)
self.newChaptersCheckBox.setObjectName(u'newChaptersCheckBox')
self.verseDisplayLayout.addRow(self.newChaptersCheckBox)
self.displayStyleLabel = QtGui.QLabel(self.verseDisplayGroupBox)
self.displayStyleLabel.setObjectName(u'displayStyleLabel')
self.displayStyleComboBox = QtGui.QComboBox(self.verseDisplayGroupBox)
self.displayStyleComboBox.addItems([u'', u'', u'', u''])
self.displayStyleComboBox.setObjectName(u'displayStyleComboBox')
self.verseDisplayLayout.addRow(self.displayStyleLabel,
self.displayStyleComboBox)
self.layoutStyleLabel = QtGui.QLabel(self.verseDisplayGroupBox)
self.layoutStyleLabel.setObjectName(u'layoutStyleLabel')
self.layoutStyleComboBox = QtGui.QComboBox(self.verseDisplayGroupBox)
self.layoutStyleComboBox.setObjectName(u'layoutStyleComboBox')
self.layoutStyleComboBox.addItems([u'', u'', u''])
self.verseDisplayLayout.addRow(self.layoutStyleLabel,
self.layoutStyleComboBox)
self.bibleSecondCheckBox = QtGui.QCheckBox(self.verseDisplayGroupBox)
self.bibleSecondCheckBox.setObjectName(u'bibleSecondCheckBox')
self.verseDisplayLayout.addRow(self.bibleSecondCheckBox)
self.bibleThemeLabel = QtGui.QLabel(self.verseDisplayGroupBox)
self.bibleThemeLabel.setObjectName(u'BibleThemeLabel')
self.bibleThemeComboBox = QtGui.QComboBox(self.verseDisplayGroupBox)
self.bibleThemeComboBox.setSizeAdjustPolicy(
QtGui.QComboBox.AdjustToMinimumContentsLength)
self.BibleThemeComboBox.setSizePolicy(
self.bibleThemeComboBox.setSizePolicy(
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Fixed)
self.BibleThemeComboBox.addItem(u'')
self.BibleThemeComboBox.setObjectName(u'BibleThemeComboBox')
self.VerseDisplayLayout.addRow(self.BibleThemeLabel,
self.BibleThemeComboBox)
self.ChangeNoteLabel = QtGui.QLabel(self.VerseDisplayGroupBox)
self.ChangeNoteLabel.setWordWrap(True)
self.ChangeNoteLabel.setObjectName(u'ChangeNoteLabel')
self.VerseDisplayLayout.addRow(self.ChangeNoteLabel)
self.leftLayout.addWidget(self.VerseDisplayGroupBox)
self.bibleThemeComboBox.addItem(u'')
self.bibleThemeComboBox.setObjectName(u'BibleThemeComboBox')
self.verseDisplayLayout.addRow(self.bibleThemeLabel,
self.bibleThemeComboBox)
self.changeNoteLabel = QtGui.QLabel(self.verseDisplayGroupBox)
self.changeNoteLabel.setWordWrap(True)
self.changeNoteLabel.setObjectName(u'changeNoteLabel')
self.verseDisplayLayout.addRow(self.changeNoteLabel)
self.leftLayout.addWidget(self.verseDisplayGroupBox)
self.leftLayout.addStretch()
self.rightColumn.setSizePolicy(
QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred)
self.rightLayout.addStretch()
# Signals and slots
QtCore.QObject.connect(
self.NewChaptersCheckBox, QtCore.SIGNAL(u'stateChanged(int)'),
self.newChaptersCheckBox, QtCore.SIGNAL(u'stateChanged(int)'),
self.onNewChaptersCheckBoxChanged)
QtCore.QObject.connect(
self.DisplayStyleComboBox, QtCore.SIGNAL(u'activated(int)'),
self.displayStyleComboBox, QtCore.SIGNAL(u'activated(int)'),
self.onDisplayStyleComboBoxChanged)
QtCore.QObject.connect(
self.BibleThemeComboBox, QtCore.SIGNAL(u'activated(int)'),
self.bibleThemeComboBox, QtCore.SIGNAL(u'activated(int)'),
self.onBibleThemeComboBoxChanged)
QtCore.QObject.connect(
self.LayoutStyleComboBox, QtCore.SIGNAL(u'activated(int)'),
self.layoutStyleComboBox, QtCore.SIGNAL(u'activated(int)'),
self.onLayoutStyleComboBoxChanged)
QtCore.QObject.connect(
self.BibleSecondCheckBox, QtCore.SIGNAL(u'stateChanged(int)'),
self.bibleSecondCheckBox, QtCore.SIGNAL(u'stateChanged(int)'),
self.onBibleSecondCheckBox)
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'theme_update_list'), self.updateThemeList)
def retranslateUi(self):
self.VerseDisplayGroupBox.setTitle(
self.verseDisplayGroupBox.setTitle(
translate('BiblesPlugin.BiblesTab', 'Verse Display'))
self.NewChaptersCheckBox.setText(
self.newChaptersCheckBox.setText(
translate('BiblesPlugin.BiblesTab',
'Only show new chapter numbers'))
self.LayoutStyleLabel.setText(
self.layoutStyleLabel.setText(
translate('BiblesPlugin.BiblesTab', 'Layout style:'))
self.DisplayStyleLabel.setText(
translate('BiblesPlugin.BiblesTab', 'Display style:'))
self.BibleThemeLabel.setText(
self.displayStyleLabel.setText(UiStrings.DisplayStyle)
self.bibleThemeLabel.setText(
translate('BiblesPlugin.BiblesTab', 'Bible theme:'))
self.LayoutStyleComboBox.setItemText(LayoutStyle.VersePerSlide,
translate('BiblesPlugin.BiblesTab', 'Verse Per Slide'))
self.LayoutStyleComboBox.setItemText(LayoutStyle.VersePerLine,
translate('BiblesPlugin.BiblesTab', 'Verse Per Line'))
self.LayoutStyleComboBox.setItemText(LayoutStyle.Continuous,
translate('BiblesPlugin.BiblesTab', 'Continuous'))
self.DisplayStyleComboBox.setItemText(DisplayStyle.NoBrackets,
self.layoutStyleComboBox.setItemText(LayoutStyle.VersePerSlide,
UiStrings.VersePerSlide)
self.layoutStyleComboBox.setItemText(LayoutStyle.VersePerLine,
UiStrings.VersePerLine)
self.layoutStyleComboBox.setItemText(LayoutStyle.Continuous,
UiStrings.Continuous)
self.displayStyleComboBox.setItemText(DisplayStyle.NoBrackets,
translate('BiblesPlugin.BiblesTab', 'No Brackets'))
self.DisplayStyleComboBox.setItemText(DisplayStyle.Round,
self.displayStyleComboBox.setItemText(DisplayStyle.Round,
translate('BiblesPlugin.BiblesTab', '( And )'))
self.DisplayStyleComboBox.setItemText(DisplayStyle.Curly,
self.displayStyleComboBox.setItemText(DisplayStyle.Curly,
translate('BiblesPlugin.BiblesTab', '{ And }'))
self.DisplayStyleComboBox.setItemText(DisplayStyle.Square,
self.displayStyleComboBox.setItemText(DisplayStyle.Square,
translate('BiblesPlugin.BiblesTab', '[ And ]'))
self.ChangeNoteLabel.setText(translate('BiblesPlugin.BiblesTab',
self.changeNoteLabel.setText(translate('BiblesPlugin.BiblesTab',
'Note:\nChanges do not affect verses already in the service.'))
self.BibleSecondCheckBox.setText(
self.bibleSecondCheckBox.setText(
translate('BiblesPlugin.BiblesTab', 'Display second Bible verses'))
def onBibleThemeComboBoxChanged(self):
self.bible_theme = self.BibleThemeComboBox.currentText()
self.bible_theme = self.bibleThemeComboBox.currentText()
def onDisplayStyleComboBoxChanged(self):
self.display_style = self.DisplayStyleComboBox.currentIndex()
self.display_style = self.displayStyleComboBox.currentIndex()
def onLayoutStyleComboBoxChanged(self):
self.layout_style = self.LayoutStyleComboBox.currentIndex()
self.layout_style = self.layoutStyleComboBox.currentIndex()
def onNewChaptersCheckBoxChanged(self, check_state):
self.show_new_chapters = False
@ -176,10 +176,10 @@ class BiblesTab(SettingsTab):
settings.value(u'bible theme', QtCore.QVariant(u'')).toString())
self.second_bibles = settings.value(
u'second bibles', QtCore.QVariant(True)).toBool()
self.NewChaptersCheckBox.setChecked(self.show_new_chapters)
self.DisplayStyleComboBox.setCurrentIndex(self.display_style)
self.LayoutStyleComboBox.setCurrentIndex(self.layout_style)
self.BibleSecondCheckBox.setChecked(self.second_bibles)
self.newChaptersCheckBox.setChecked(self.show_new_chapters)
self.displayStyleComboBox.setCurrentIndex(self.display_style)
self.layoutStyleComboBox.setCurrentIndex(self.layout_style)
self.bibleSecondCheckBox.setChecked(self.second_bibles)
settings.endGroup()
def save(self):
@ -204,14 +204,8 @@ class BiblesTab(SettingsTab):
[u'Bible Theme', u'Song Theme']
"""
self.BibleThemeComboBox.clear()
self.BibleThemeComboBox.addItem(u'')
self.bibleThemeComboBox.clear()
self.bibleThemeComboBox.addItem(u'')
for theme in theme_list:
self.BibleThemeComboBox.addItem(theme)
index = self.BibleThemeComboBox.findText(
unicode(self.bible_theme), QtCore.Qt.MatchExactly)
if index == -1:
# Not Found.
index = 0
self.bible_theme = u''
self.BibleThemeComboBox.setCurrentIndex(index)
self.bibleThemeComboBox.addItem(theme)
find_and_set_in_combo_box(self.bibleThemeComboBox, self.bible_theme)

View File

@ -32,7 +32,7 @@ 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
media_item_combo_box, critical_error_message_box, find_and_set_in_combo_box
from openlp.plugins.bibles.forms import BibleImportForm
from openlp.plugins.bibles.lib import LayoutStyle, DisplayStyle, \
VerseReferenceList, get_reference_match
@ -106,6 +106,12 @@ class BibleMediaItem(MediaManagerItem):
translate('BiblesPlugin.MediaItem', 'Text Search'))
])
self.quickLayout.addRow(self.quickSearchLabel, self.quickSearchEdit)
self.quickLayoutLabel = QtGui.QLabel(self.quickTab)
self.quickLayoutLabel.setObjectName(u'quickClearLabel')
self.quickLayoutComboBox = media_item_combo_box(self.quickTab,
u'quickLayoutComboBox')
self.quickLayoutComboBox.addItems([u'', u'', u''])
self.quickLayout.addRow(self.quickLayoutLabel, self.quickLayoutComboBox)
self.quickClearLabel = QtGui.QLabel(self.quickTab)
self.quickClearLabel.setObjectName(u'quickClearLabel')
self.quickClearComboBox = media_item_combo_box(self.quickTab,
@ -210,6 +216,9 @@ class BibleMediaItem(MediaManagerItem):
QtCore.SIGNAL(u'searchTypeChanged(int)'), self.updateAutoCompleter)
QtCore.QObject.connect(self.quickVersionComboBox,
QtCore.SIGNAL(u'activated(int)'), self.updateAutoCompleter)
QtCore.QObject.connect(
self.quickLayoutComboBox, QtCore.SIGNAL(u'activated(int)'),
self.onlayoutStyleComboBoxChanged)
# Buttons
QtCore.QObject.connect(self.advancedSearchButton,
QtCore.SIGNAL(u'pressed()'), self.onAdvancedSearchButton)
@ -234,6 +243,7 @@ class BibleMediaItem(MediaManagerItem):
self.advancedSecondComboBox.setVisible(False)
self.quickSecondLabel.setVisible(False)
self.quickSecondComboBox.setVisible(False)
self.quickLayoutComboBox.setCurrentIndex(self.settings.layout_style)
def retranslateUi(self):
log.debug(u'retranslateUi')
@ -269,12 +279,19 @@ class BibleMediaItem(MediaManagerItem):
translate('BiblesPlugin.MediaItem', 'Clear'))
self.advancedClearComboBox.addItem(
translate('BiblesPlugin.MediaItem', 'Keep'))
self.quickLayoutLabel.setText(UiStrings.DisplayStyle)
self.quickLayoutComboBox.setItemText(LayoutStyle.VersePerSlide,
UiStrings.VersePerSlide)
self.quickLayoutComboBox.setItemText(LayoutStyle.VersePerLine,
UiStrings.VersePerLine)
self.quickLayoutComboBox.setItemText(LayoutStyle.Continuous,
UiStrings.Continuous)
def initialise(self):
log.debug(u'bible manager initialise')
self.parent.manager.media = self
self.loadBibles()
self.updateAutoCompleter()
self.updateAutoCompleter(False)
self.configUpdated()
log.debug(u'bible manager initialise complete')
@ -298,23 +315,26 @@ class BibleMediaItem(MediaManagerItem):
bibles = self.parent.manager.get_bibles().keys()
bibles.sort()
# Load the bibles into the combo boxes.
first = True
for bible in bibles:
if bible:
self.quickVersionComboBox.addItem(bible)
self.quickSecondComboBox.addItem(bible)
self.advancedVersionComboBox.addItem(bible)
self.advancedSecondComboBox.addItem(bible)
if first:
first = False
self.initialiseBible(bible)
# set the default value
bible = QtCore.QSettings().value(
self.settingsSection + u'/advanced bible',
QtCore.QVariant(u'')).toString()
if bible in bibles:
find_and_set_in_combo_box(self.advancedVersionComboBox, bible)
self.initialiseAdvancedBible(unicode(bible))
def reloadBibles(self):
log.debug(u'Reloading Bibles')
self.parent.manager.reload_bibles()
self.loadBibles()
def initialiseBible(self, bible):
def initialiseAdvancedBible(self, bible):
"""
This initialises the given bible, which means that its book names and
their chapter numbers is added to the combo boxes on the
@ -324,7 +344,7 @@ class BibleMediaItem(MediaManagerItem):
``bible``
The bible to initialise (unicode).
"""
log.debug(u'initialiseBible %s', bible)
log.debug(u'initialiseAdvancedBible %s', bible)
book_data = self.parent.manager.get_books(bible)
self.advancedBookComboBox.clear()
first = True
@ -354,12 +374,20 @@ class BibleMediaItem(MediaManagerItem):
self.adjustComboBox(1, verse_count, self.advancedFromVerse)
self.adjustComboBox(1, verse_count, self.advancedToVerse)
def updateAutoCompleter(self):
def updateAutoCompleter(self, updateConfig=True):
"""
This updates the bible book completion list for the search field. The
completion depends on the bible. It is only updated when we are doing a
reference search, otherwise the auto completion list is removed.
"""
if updateConfig:
QtCore.QSettings().setValue(self.settingsSection + u'/quick bible',
QtCore.QVariant(self.quickVersionComboBox.currentText()))
else:
book = QtCore.QSettings().value(
self.settingsSection + u'/quick bible',
QtCore.QVariant(u'')).toString()
find_and_set_in_combo_box(self.quickVersionComboBox, book)
books = []
# We have to do a 'Reference Search'.
if self.quickSearchEdit.currentSearchType() == BibleSearch.Reference:
@ -372,7 +400,9 @@ class BibleMediaItem(MediaManagerItem):
add_widget_completer(books, self.quickSearchEdit)
def onAdvancedVersionComboBox(self):
self.initialiseBible(
QtCore.QSettings().setValue(self.settingsSection + u'/advanced bible',
QtCore.QVariant(self.advancedVersionComboBox.currentText()))
self.initialiseAdvancedBible(
unicode(self.advancedVersionComboBox.currentText()))
def onAdvancedBookComboBox(self):
@ -804,3 +834,11 @@ class BibleMediaItem(MediaManagerItem):
if self.settings.display_style == DisplayStyle.Square:
return u'{su}[%s]{/su}' % verse_text
return u'{su}%s{/su}' % verse_text
def onlayoutStyleComboBoxChanged(self):
self.settings.layout_style = self.quickLayoutComboBox.currentIndex()
self.settings.layoutStyleComboBox.setCurrentIndex(
self.settings.layout_style)
QtCore.QSettings().setValue(
self.settingsSection + u'/verse layout style',
QtCore.QVariant(self.settings.layout_style))

View File

@ -96,4 +96,7 @@ class VerseReferenceList(object):
version[u'copyright'])
if version[u'permission'].strip():
result = result + u', ' + version[u'permission']
result = result.rstrip()
if result.endswith(u','):
return result[:len(result)-1]
return result

View File

@ -29,7 +29,7 @@ import logging
from PyQt4 import QtCore, QtGui
from openlp.core.lib import Receiver, translate
from openlp.core.lib.ui import critical_error_message_box
from openlp.core.lib.ui import critical_error_message_box, find_and_set_in_combo_box
from openlp.plugins.custom.lib import CustomXMLBuilder, CustomXMLParser
from openlp.plugins.custom.lib.db import CustomSlide
from editcustomdialog import Ui_CustomEditDialog
@ -98,11 +98,7 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog):
for slide in slideList:
self.slideListView.addItem(slide[1])
theme = self.customSlide.theme_name
id = self.themeComboBox.findText(theme, QtCore.Qt.MatchExactly)
# No theme match
if id == -1:
id = 0
self.themeComboBox.setCurrentIndex(id)
find_and_set_in_combo_box(self.themeComboBox, theme)
# If not preview hide the preview button.
self.previewButton.setVisible(False)
if preview:
@ -265,4 +261,4 @@ class EditCustomForm(QtGui.QDialog, Ui_CustomEditDialog):
message=translate('CustomPlugin.EditCustomForm',
'You need to add at least one slide'))
return False
return True
return True

View File

@ -45,7 +45,7 @@ class EditCustomSlideForm(QtGui.QDialog, Ui_CustomSlideEditDialog):
self.setupUi(self)
# Connecting signals and slots
QtCore.QObject.connect(self.splitButton,
QtCore.SIGNAL(u'pressed()'), self.onSplitButtonPressed)
QtCore.SIGNAL(u'clicked()'), self.onSplitButtonPressed)
def setText(self, text):
"""

View File

@ -46,6 +46,7 @@ class CustomMediaItem(MediaManagerItem):
self.IconPath = u'custom/custom'
MediaManagerItem.__init__(self, parent, self, icon)
self.singleServiceItem = False
self.quickPreviewAllowed = True
# Holds information about whether the edit is remotly triggered and
# which Custom is required.
self.remoteCustom = -1

View File

@ -46,6 +46,7 @@ class ImageMediaItem(MediaManagerItem):
def __init__(self, parent, plugin, icon):
self.IconPath = u'images/image'
MediaManagerItem.__init__(self, parent, self, icon)
self.quickPreviewAllowed = True
QtCore.QObject.connect(Receiver.get_receiver(),
QtCore.SIGNAL(u'live_theme_changed'), self.liveThemeChanged)

View File

@ -105,7 +105,7 @@ class PresentationDocument(object):
Loads the presentation and starts it
``presentation``
The file name of the presentations to the run.
The file name of the presentations to the run.
Returns False if the file could not be opened
"""

View File

@ -31,7 +31,7 @@ from PyQt4 import QtCore, QtGui
from openlp.core.lib import Receiver, translate
from openlp.core.lib.ui import UiStrings, add_widget_completer, \
critical_error_message_box
critical_error_message_box, find_and_set_in_combo_box
from openlp.plugins.songs.forms import EditVerseForm
from openlp.plugins.songs.lib import SongXML, VerseType, clean_song
from openlp.plugins.songs.lib.db import Book, Song, Author, Topic
@ -208,20 +208,9 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
self.alternativeEdit.setText(u'')
if self.song.song_book_id != 0:
book_name = self.manager.get_object(Book, self.song.song_book_id)
id = self.songBookComboBox.findText(
unicode(book_name.name), QtCore.Qt.MatchExactly)
if id == -1:
# Not Found
id = 0
self.songBookComboBox.setCurrentIndex(id)
find_and_set_in_combo_box(self.songBookComboBox, unicode(book_name.name))
if self.song.theme_name:
id = self.themeComboBox.findText(
unicode(self.song.theme_name), QtCore.Qt.MatchExactly)
if id == -1:
# Not Found
id = 0
self.song.theme_name = None
self.themeComboBox.setCurrentIndex(id)
find_and_set_in_combo_box(self.themeComboBox, unicode(self.song.theme_name))
if self.song.copyright:
self.copyrightEdit.setText(self.song.copyright)
else:
@ -269,6 +258,8 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
if index is None:
index = VerseType.Other
verse[0][u'type'] = VerseType.Tags[index]
if verse[0][u'label'] == u'':
verse[0][u'label'] = u'1'
verse_def = u'%s%s' % (verse[0][u'type'], verse[0][u'label'])
item = QtGui.QTableWidgetItem(verse[1])
item.setData(QtCore.Qt.UserRole, QtCore.QVariant(verse_def))
@ -788,4 +779,4 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
self.song.verse_order)
except:
log.exception(u'Problem processing song Lyrics \n%s',
sxml.dump_xml())
sxml.dump_xml())

View File

@ -66,7 +66,17 @@ class SongImportForm(OpenLPWizard):
self.formatStack.setCurrentIndex(0)
QtCore.QObject.connect(self.formatComboBox,
QtCore.SIGNAL(u'currentIndexChanged(int)'),
self.formatStack.setCurrentIndex)
self.onCurrentIndexChanged)
def onCurrentIndexChanged(self, index):
"""
Called when the format combo box's index changed. We have to check if
the import is available and accordingly to disable or enable the next
button.
"""
self.formatStack.setCurrentIndex(index)
next_button = self.button(QtGui.QWizard.NextButton)
next_button.setEnabled(SongFormat.get_availability(index))
def customInit(self):
"""

View File

@ -73,6 +73,7 @@ class SongMediaItem(MediaManagerItem):
self.remoteSong = -1
self.editItem = None
self.whitespace = re.compile(r'\W+', re.UNICODE)
self.quickPreviewAllowed = True
def addEndHeaderBar(self):
self.addToolbarSeparator()
@ -282,19 +283,20 @@ class SongMediaItem(MediaManagerItem):
self.remoteTriggered = None
self.remoteSong = -1
def onRemoteEdit(self, songid):
def onRemoteEdit(self, message):
"""
Called by ServiceManager or SlideController by event passing
the Song Id in the payload along with an indicator to say which
type of display is required.
"""
log.debug(u'onRemoteEdit %s' % songid)
fields = songid.split(u':')
valid = self.parent.manager.get_object(Song, fields[1])
log.debug(u'onRemoteEdit %s' % message)
remote_type, song_id = message.split(u':')
song_id = int(song_id)
valid = self.parent.manager.get_object(Song, song_id)
if valid:
self.remoteSong = fields[1]
self.remoteTriggered = fields[0]
self.edit_song_form.loadSong(fields[1], (fields[0] == u'P'))
self.remoteSong = song_id
self.remoteTriggered = remote_type
self.edit_song_form.loadSong(song_id, (remote_type == u'P'))
self.edit_song_form.exec_()
def onEditClick(self):

View File

@ -39,12 +39,8 @@ if os.name == u'nt':
PAGE_AFTER = 5
PAGE_BOTH = 6
else:
try:
import uno
from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER, \
PAGE_BOTH
except ImportError:
pass
import uno
from com.sun.star.style.BreakType import PAGE_BEFORE, PAGE_AFTER, PAGE_BOTH
class OooImport(SongImport):
"""

View File

@ -73,6 +73,8 @@ class OpenLyricsExport(object):
u', '.join([author.display_name for author in song.authors]))
filename = re.sub(
r'[/\\?*|<>\[\]":<>+%]+', u'_', filename).strip(u'_')
tree.write(os.path.join(self.save_path, filename),
# Pass a file object, because lxml does not cope with some special
# characters in the path (see lp:757673 and lp:744337).
tree.write(open(os.path.join(self.save_path, filename), u'w'),
encoding=u'utf-8', xml_declaration=True, pretty_print=True)
return True

View File

@ -63,7 +63,9 @@ class OpenLyricsImport(SongImport):
self.import_wizard.incrementProgressBar(
WizardStrings.ImportingType % os.path.basename(file_path))
try:
parsed_file = etree.parse(file_path, parser)
# Pass a file object, because lxml does not cope with some
# special characters in the path (see lp:757673 and lp:744337).
parsed_file = etree.parse(open(file_path, u'r'), parser)
xml = unicode(etree.tostring(parsed_file))
if self.openLyrics.xml_to_song(xml) is None:
log.debug(u'File could not be imported: %s' % file_path)

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS><TS version="1.1" language="hu_HU">
<!DOCTYPE TS>
<TS version="2.0" language="hu_HU">
<context>
<name>AlertPlugin.AlertForm</name>
<message>
@ -696,7 +697,7 @@ demand and thus an internet connection is required.</source>
<message>
<location filename="openlp/plugins/custom/customplugin.py" line="59"/>
<source>&lt;strong&gt;Custom Plugin&lt;/strong&gt;&lt;br /&gt;The custom plugin provides the ability to set up custom text slides that can be displayed on the screen the same way songs are. This plugin provides greater freedom over the songs plugin.</source>
<translation>&lt;strong&gt;Speciális bővítmény&lt;/strong&gt;&lt;br /&gt;Az speciális bővítmény dalokhoz hasonló egyéni diák vetítését teszi lehetővé. Ugyanakkor több szabadságot enged meg, mint a dalok bővítmény.</translation>
<translation>&lt;strong&gt;Speciális bővítmény&lt;/strong&gt;&lt;br /&gt;Az speciális bővítmény dalokhoz hasonló egyéni diasor vetítését teszi lehetővé. Ugyanakkor több szabadságot enged meg, mint a dalok bővítmény.</translation>
</message>
</context>
<context>
@ -717,7 +718,7 @@ demand and thus an internet connection is required.</source>
<message>
<location filename="openlp/plugins/custom/forms/editcustomdialog.py" line="106"/>
<source>Edit Custom Slides</source>
<translation>Speciális diák szerkesztése</translation>
<translation>Speciális diasor szerkesztése</translation>
</message>
<message>
<location filename="openlp/plugins/custom/forms/editcustomdialog.py" line="108"/>
@ -841,7 +842,7 @@ demand and thus an internet connection is required.</source>
<message>
<location filename="openlp/plugins/images/imageplugin.py" line="44"/>
<source>&lt;strong&gt;Image Plugin&lt;/strong&gt;&lt;br /&gt;The image plugin provides displaying of images.&lt;br /&gt;One of the distinguishing features of this plugin is the ability to group a number of images together in the service manager, making the displaying of multiple images easier. This plugin can also make use of OpenLP&apos;s &quot;timed looping&quot; feature to create a slide show that runs automatically. In addition to this, images from the plugin can be used to override the current theme&apos;s background, which renders text-based items like songs with the selected image as a background instead of the background provided by the theme.</source>
<translation>&lt;strong&gt;Kép bővítmény&lt;/strong&gt;&lt;br /&gt;A kép a bővítmény különféle képek vetítését teszi lehetővé.&lt;br /&gt;A bővítmény egyik különös figyelmet érdemlő képessége az, hogy képes a sorrendkezelőn csoportba foglalni a képeket, így könnyebbé téve képek tömeges vetítését. A bővítmény képes az OpenLP időzített körkörös lejátszásra is, amivel a diákat automatikusan tudjuk léptetni. Továbbá, a bővítményben megadott képekkel felülírhatjuk a téma háttérképét, amellyel a szöveg alapú elemek, mint pl. a dalok, a megadott háttérképpel jelennek meg, a témában beállított háttérkép helyett.</translation>
<translation>&lt;strong&gt;Kép bővítmény&lt;/strong&gt;&lt;br /&gt;A kép a bővítmény különféle képek vetítését teszi lehetővé.&lt;br /&gt;A bővítmény egyik különös figyelmet érdemlő képessége az, hogy képes a sorrendkezelőn csoportba foglalni a képeket, így könnyebbé téve képek tömeges vetítését. A bővítmény képes az OpenLP időzített körkörös lejátszásra is, amivel a diasort automatikusan tudjuk léptetni. Továbbá, a bővítményben megadott képekkel felülírhatjuk a téma háttérképét, amellyel a szöveg alapú elemek, mint pl. a dalok, a megadott háttérképpel jelennek meg, a témában beállított háttérkép helyett.</translation>
</message>
<message>
<location filename="openlp/plugins/images/imageplugin.py" line="72"/>
@ -1078,7 +1079,7 @@ Find out more about OpenLP: http://openlp.org/
OpenLP is written and maintained by volunteers. If you would like to see more free Christian software being written, please consider contributing by using the button below.</source>
<translation>OpenLP &lt;version&gt; &lt;revision&gt; Nyílt forrású dalszöveg vetítő
Az OpenLP egy templomi/gyülekezeti bemutató, ill. dalszöveg vetítő szabad szoftver, mely használható énekek, bibliai versek, videók, képek és bemutatók (ha az OpenOffice.org, PowerPoint vagy a PowerPoint Viewer telepítve van) vetítésére a gyülekezeti dicsőítés alatt egy számítógép és egy projektor segítségével.
Az OpenLP egy templomi/gyülekezeti bemutató, ill. dalszöveg vetítő szabad szoftver, mely énekek, bibliai versek, videók, képek és bemutatók (ha az OpenOffice.org, PowerPoint vagy a PowerPoint Viewer telepítve van) vetítésére használható a gyülekezeti dicsőítés alatt egy számítógép és egy projektor segítségével.
Többet az OpenLP-ről: http://openlp.org/
@ -1221,12 +1222,12 @@ Végső köszönet
Úgy szerette Isten a világot, hogy
egyszülött Fiát adta oda, hogy egyetlen
benne hívő se vesszen el, hanem
örök élete legyen.&quot; János 3,16
örök élete legyen. (Jn 3,16)
És végül, de nem utolsósorban, a végső köszönet
Istené, Atyánké, mert elküldte a Fiát, hogy meghaljon
a kereszten, megszabadítva bennünket a bűntől. Ezért
ezt a programot ingyen készítettük neked, mert Ő
ezt a programot szabadnak és ingyenesnek készítettük, mert Ő
tett minket szabaddá.</translation>
</message>
<message>
@ -1245,14 +1246,12 @@ Tinggaard, Frode Woldsund</translation>
<message>
<location filename="openlp/core/ui/aboutdialog.py" line="231"/>
<source>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.</source>
<translation>Ez egy szabad szoftver; terjeszthető illetve módosítható a GNU Általános Közreadási Feltételek dokumentumában leírtak szerint -- 2. verzió --, melyet a Szabad Szoftver Alapítvány ad ki.
</translation>
<translation>Ez egy szabad szoftver; terjeszthető illetve módosítható a GNU Általános Közreadási Feltételek dokumentumában leírtak szerint - 2. verzió -, melyet a Szabad Szoftver Alapítvány ad ki.</translation>
</message>
<message>
<location filename="openlp/core/ui/aboutdialog.py" line="236"/>
<source>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 below for more details.</source>
<translation>Ez a program abban a reményben kerül közreadásra, hogy hasznos lesz, de minden egyéb GARANCIA NÉLKÜL, az eladhatóságra vagy valamely célra való alkalmazhatóságra való származtatott garanciát is beleértve. További részletekért lásd a alább.
</translation>
<translation>Ez a program abban a reményben kerül közreadásra, hogy hasznos lesz, de minden egyéb GARANCIA NÉLKÜL, az eladhatóságra vagy valamely célra való alkalmazhatóságra való származtatott garanciát is beleértve. További részletekért lásd a alább.</translation>
</message>
</context>
<context>
@ -1343,7 +1342,7 @@ Tinggaard, Frode Woldsund</translation>
<message>
<location filename="openlp/core/ui/displaytagdialog.py" line="135"/>
<source>Start tag</source>
<translation>Kezdő címke</translation>
<translation>Nyitó címke</translation>
</message>
<message>
<location filename="openlp/core/ui/displaytagdialog.py" line="137"/>
@ -1358,12 +1357,12 @@ Tinggaard, Frode Woldsund</translation>
<message>
<location filename="openlp/core/ui/displaytagdialog.py" line="145"/>
<source>Tag Id</source>
<translation>Címke ID</translation>
<translation>ID</translation>
</message>
<message>
<location filename="openlp/core/ui/displaytagdialog.py" line="147"/>
<source>Start HTML</source>
<translation>Kezdő HTML</translation>
<translation>Nyitó HTML</translation>
</message>
<message>
<location filename="openlp/core/ui/displaytagdialog.py" line="149"/>
@ -1394,7 +1393,7 @@ Tinggaard, Frode Woldsund</translation>
<message>
<location filename="openlp/core/ui/exceptiondialog.py" line="102"/>
<source>Oops! OpenLP hit a problem, and couldn&apos;t recover. The text in the box below contains information that might be helpful to the OpenLP developers, so please e-mail it to bugs@openlp.org, along with a detailed description of what you were doing when the problem occurred.</source>
<translation>Hoppá! Az OpenLP hibába ütközött, és nem tudta lekezelni. Az alábbi dobozban található szöveg olyan információkat tartalmaz, amelyek hasznosak lehetnek az OpenLP fejlesztői számára, tehát kérjük, küld el bugs@openlp.org email címre egy részletes leírás mellett, amely tartalmazza, hogy éppen merre és mit tettél, amikor a hiba történt.</translation>
<translation>Hoppá! Az OpenLP hibába ütközött, és nem tudta lekezelni. Az alszövegdoboz olyan információkat tartalmaz, amelyek hasznosak lehetnek az OpenLP fejlesztői számára, tehát kérjük, küld el a bugs@openlp.org email címre egy részletes leírás mellett, amely tartalmazza, hogy éppen hol és mit tettél, amikor a hiba történt.</translation>
</message>
<message>
<location filename="openlp/core/ui/exceptiondialog.py" line="97"/>
@ -1415,13 +1414,12 @@ Tinggaard, Frode Woldsund</translation>
<location filename="openlp/core/ui/exceptiondialog.py" line="99"/>
<source>Please enter a description of what you were doing to cause this error
(Minimum 20 characters)</source>
<translation>Írd le mit tettél, ami a hibát okozta
(minimum 20 karakter)</translation>
<translation>Írd le mit tettél, ami a hibához vezetett (minimum 20 karakter)</translation>
</message>
<message>
<location filename="openlp/core/ui/exceptiondialog.py" line="112"/>
<source>Attach File</source>
<translation>Csatolt fájl</translation>
<translation>Fájl csatolása</translation>
</message>
<message>
<location filename="openlp/core/ui/exceptionform.py" line="171"/>
@ -1536,7 +1534,7 @@ Version: %s
<message>
<location filename="openlp/core/ui/firsttimeform.py" line="252"/>
<source>Enabling selected plugins...</source>
<translation>Kijelölt beépülők engedélyezése</translation>
<translation>Kijelölt bővítmények engedélyezése</translation>
</message>
<message>
<location filename="openlp/core/ui/firsttimewizard.py" line="191"/>
@ -1556,12 +1554,12 @@ Version: %s
<message>
<location filename="openlp/core/ui/firsttimewizard.py" line="201"/>
<source>Activate required Plugins</source>
<translation>Szükséges beépülők aktiválása</translation>
<translation>Igényelt bővítmények aktiválása</translation>
</message>
<message>
<location filename="openlp/core/ui/firsttimewizard.py" line="203"/>
<source>Select the Plugins you wish to use. </source>
<translation>Jelöld ki az alkalmazni kívánt beépülőket.</translation>
<translation>Jelöld ki az alkalmazni kívánt bővítményeket.</translation>
</message>
<message>
<location filename="openlp/core/ui/firsttimewizard.py" line="205"/>
@ -1571,7 +1569,7 @@ Version: %s
<message>
<location filename="openlp/core/ui/firsttimewizard.py" line="206"/>
<source>Custom Text</source>
<translation>Egyedi szöveg</translation>
<translation>Speciális</translation>
</message>
<message>
<location filename="openlp/core/ui/firsttimewizard.py" line="208"/>
@ -1596,17 +1594,17 @@ Version: %s
<message>
<location filename="openlp/core/ui/firsttimewizard.py" line="215"/>
<source>Allow remote access</source>
<translation>Távvezérlés engedélyezése</translation>
<translation>Távvezérlő</translation>
</message>
<message>
<location filename="openlp/core/ui/firsttimewizard.py" line="217"/>
<source>Monitor Song Usage</source>
<translation>Dalstatisztika monitorozása</translation>
<translation>Dalstatisztika</translation>
</message>
<message>
<location filename="openlp/core/ui/firsttimewizard.py" line="219"/>
<source>Allow Alerts</source>
<translation>Értesítések engedélyezése</translation>
<translation>Értesítések</translation>
</message>
<message>
<location filename="openlp/core/ui/firsttimewizard.py" line="221"/>
@ -1679,7 +1677,7 @@ Az Első indulás tündér további megkerüléséhez, nyomd meg a Befejezés go
<message>
<location filename="openlp/core/ui/firsttimewizard.py" line="252"/>
<source>Please wait while OpenLP is set up and your data is imported.</source>
<translation>Várj, amíg az OpenLP beállítások érvényre jutnak és míg at adatok importálódnak.</translation>
<translation>Várj, amíg az OpenLP beállítások érvényre jutnak és míg az adatok importálódnak.</translation>
</message>
<message>
<location filename="openlp/core/ui/firsttimewizard.py" line="254"/>
@ -1757,7 +1755,7 @@ Az Első indulás tündér további megkerüléséhez, nyomd meg a Befejezés go
<message>
<location filename="openlp/core/ui/generaltab.py" line="229"/>
<source>Slide loop delay:</source>
<translation>Időzített diák késleltetése:</translation>
<translation>Időzített dia késleltetése:</translation>
</message>
<message>
<location filename="openlp/core/ui/generaltab.py" line="231"/>
@ -1818,12 +1816,12 @@ Az Első indulás tündér további megkerüléséhez, nyomd meg a Befejezés go
<context>
<name>OpenLP.LanguageManager</name>
<message>
<location filename="openlp/core/utils/languagemanager.py" line="130"/>
<location filename="openlp/core/utils/languagemanager.py" line="132"/>
<source>Language</source>
<translation>Nyelv</translation>
</message>
<message>
<location filename="openlp/core/utils/languagemanager.py" line="130"/>
<location filename="openlp/core/utils/languagemanager.py" line="132"/>
<source>Please restart OpenLP to use your new language setting.</source>
<translation>A nyelvi beállítások az OpenLP újraindítása után lépnek érvénybe.</translation>
</message>
@ -1839,347 +1837,347 @@ Az Első indulás tündér további megkerüléséhez, nyomd meg a Befejezés go
<context>
<name>OpenLP.MainWindow</name>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="313"/>
<location filename="openlp/core/ui/mainwindow.py" line="315"/>
<source>&amp;File</source>
<translation>&amp;Fájl</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="314"/>
<location filename="openlp/core/ui/mainwindow.py" line="316"/>
<source>&amp;Import</source>
<translation>&amp;Importálás</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="315"/>
<location filename="openlp/core/ui/mainwindow.py" line="317"/>
<source>&amp;Export</source>
<translation>&amp;Exportálás</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="316"/>
<location filename="openlp/core/ui/mainwindow.py" line="318"/>
<source>&amp;View</source>
<translation>&amp;Nézet</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="317"/>
<location filename="openlp/core/ui/mainwindow.py" line="319"/>
<source>M&amp;ode</source>
<translation>&amp;Mód</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="318"/>
<location filename="openlp/core/ui/mainwindow.py" line="320"/>
<source>&amp;Tools</source>
<translation>&amp;Eszközök</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="319"/>
<location filename="openlp/core/ui/mainwindow.py" line="321"/>
<source>&amp;Settings</source>
<translation>&amp;Beállítások</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="368"/>
<location filename="openlp/core/ui/mainwindow.py" line="370"/>
<source>&amp;Language</source>
<translation>&amp;Nyelv</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="322"/>
<location filename="openlp/core/ui/mainwindow.py" line="324"/>
<source>&amp;Help</source>
<translation>&amp;Súgó</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="323"/>
<location filename="openlp/core/ui/mainwindow.py" line="325"/>
<source>Media Manager</source>
<translation>Médiakezelő</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="325"/>
<location filename="openlp/core/ui/mainwindow.py" line="327"/>
<source>Service Manager</source>
<translation>Sorrendkezelő</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="327"/>
<location filename="openlp/core/ui/mainwindow.py" line="329"/>
<source>Theme Manager</source>
<translation>Témakezelő</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="329"/>
<location filename="openlp/core/ui/mainwindow.py" line="331"/>
<source>&amp;New</source>
<translation>&amp;Új</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="332"/>
<location filename="openlp/core/ui/mainwindow.py" line="334"/>
<source>Ctrl+N</source>
<translation></translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="333"/>
<location filename="openlp/core/ui/mainwindow.py" line="335"/>
<source>&amp;Open</source>
<translation>Meg&amp;nyitás</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="335"/>
<location filename="openlp/core/ui/mainwindow.py" line="337"/>
<source>Open an existing service.</source>
<translation>Meglévő sorrend megnyitása.</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="337"/>
<location filename="openlp/core/ui/mainwindow.py" line="339"/>
<source>Ctrl+O</source>
<translation></translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="338"/>
<location filename="openlp/core/ui/mainwindow.py" line="340"/>
<source>&amp;Save</source>
<translation>&amp;Mentés</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="340"/>
<location filename="openlp/core/ui/mainwindow.py" line="342"/>
<source>Save the current service to disk.</source>
<translation>Aktuális sorrend mentése lemezre.</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="342"/>
<location filename="openlp/core/ui/mainwindow.py" line="344"/>
<source>Ctrl+S</source>
<translation></translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="343"/>
<location filename="openlp/core/ui/mainwindow.py" line="345"/>
<source>Save &amp;As...</source>
<translation>Mentés &amp;sként</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="345"/>
<location filename="openlp/core/ui/mainwindow.py" line="347"/>
<source>Save Service As</source>
<translation>Sorrend mentése másként</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="347"/>
<location filename="openlp/core/ui/mainwindow.py" line="349"/>
<source>Save the current service under a new name.</source>
<translation>Az aktuális sorrend más néven való mentése.</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="349"/>
<location filename="openlp/core/ui/mainwindow.py" line="351"/>
<source>Ctrl+Shift+S</source>
<translation></translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="356"/>
<location filename="openlp/core/ui/mainwindow.py" line="358"/>
<source>E&amp;xit</source>
<translation>&amp;Kilépés</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="358"/>
<location filename="openlp/core/ui/mainwindow.py" line="360"/>
<source>Quit OpenLP</source>
<translation>OpenLP bezárása</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="360"/>
<location filename="openlp/core/ui/mainwindow.py" line="362"/>
<source>Alt+F4</source>
<translation></translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="366"/>
<location filename="openlp/core/ui/mainwindow.py" line="368"/>
<source>&amp;Theme</source>
<translation>&amp;Téma</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="374"/>
<location filename="openlp/core/ui/mainwindow.py" line="376"/>
<source>&amp;Configure OpenLP...</source>
<translation>OpenLP &amp;beállítása</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="376"/>
<location filename="openlp/core/ui/mainwindow.py" line="378"/>
<source>&amp;Media Manager</source>
<translation>&amp;Médiakezelő</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="378"/>
<location filename="openlp/core/ui/mainwindow.py" line="380"/>
<source>Toggle Media Manager</source>
<translation>Médiakezelő átváltása</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="380"/>
<location filename="openlp/core/ui/mainwindow.py" line="382"/>
<source>Toggle the visibility of the media manager.</source>
<translation>A médiakezelő láthatóságának átváltása.</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="382"/>
<location filename="openlp/core/ui/mainwindow.py" line="384"/>
<source>F8</source>
<translation></translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="384"/>
<location filename="openlp/core/ui/mainwindow.py" line="386"/>
<source>&amp;Theme Manager</source>
<translation>&amp;Témakezelő</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="386"/>
<location filename="openlp/core/ui/mainwindow.py" line="388"/>
<source>Toggle Theme Manager</source>
<translation>Témakezelő átváltása</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="388"/>
<location filename="openlp/core/ui/mainwindow.py" line="390"/>
<source>Toggle the visibility of the theme manager.</source>
<translation>A témakezelő láthatóságának átváltása.</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="390"/>
<location filename="openlp/core/ui/mainwindow.py" line="392"/>
<source>F10</source>
<translation></translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="392"/>
<location filename="openlp/core/ui/mainwindow.py" line="394"/>
<source>&amp;Service Manager</source>
<translation>&amp;Sorrendkezelő</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="394"/>
<location filename="openlp/core/ui/mainwindow.py" line="396"/>
<source>Toggle Service Manager</source>
<translation>Sorrendkezelő átváltása</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="396"/>
<location filename="openlp/core/ui/mainwindow.py" line="398"/>
<source>Toggle the visibility of the service manager.</source>
<translation>A sorrendkezelő láthatóságának átváltása.</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="398"/>
<location filename="openlp/core/ui/mainwindow.py" line="400"/>
<source>F9</source>
<translation></translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="400"/>
<location filename="openlp/core/ui/mainwindow.py" line="402"/>
<source>&amp;Preview Panel</source>
<translation>&amp;Előnézet panel</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="402"/>
<location filename="openlp/core/ui/mainwindow.py" line="404"/>
<source>Toggle Preview Panel</source>
<translation>Előnézet panel átváltása</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="404"/>
<location filename="openlp/core/ui/mainwindow.py" line="406"/>
<source>Toggle the visibility of the preview panel.</source>
<translation>Az előnézet panel láthatóságának átváltása.</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="406"/>
<location filename="openlp/core/ui/mainwindow.py" line="408"/>
<source>F11</source>
<translation></translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="408"/>
<location filename="openlp/core/ui/mainwindow.py" line="410"/>
<source>&amp;Live Panel</source>
<translation>&amp;É adás panel</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="410"/>
<location filename="openlp/core/ui/mainwindow.py" line="412"/>
<source>Toggle Live Panel</source>
<translation>É adás panel átváltása</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="412"/>
<location filename="openlp/core/ui/mainwindow.py" line="414"/>
<source>Toggle the visibility of the live panel.</source>
<translation>Az é adás panel láthatóságának átváltása.</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="414"/>
<location filename="openlp/core/ui/mainwindow.py" line="416"/>
<source>F12</source>
<translation></translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="416"/>
<location filename="openlp/core/ui/mainwindow.py" line="418"/>
<source>&amp;Plugin List</source>
<translation>&amp;Bővítménylista</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="418"/>
<location filename="openlp/core/ui/mainwindow.py" line="420"/>
<source>List the Plugins</source>
<translation>Bővítmények listája</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="420"/>
<location filename="openlp/core/ui/mainwindow.py" line="422"/>
<source>Alt+F7</source>
<translation></translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="422"/>
<location filename="openlp/core/ui/mainwindow.py" line="424"/>
<source>&amp;User Guide</source>
<translation>&amp;Felhasználói kézikönyv</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="424"/>
<location filename="openlp/core/ui/mainwindow.py" line="426"/>
<source>&amp;About</source>
<translation>&amp;Névjegy</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="425"/>
<location filename="openlp/core/ui/mainwindow.py" line="427"/>
<source>More information about OpenLP</source>
<translation>További információ az OpenLP-ről</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="427"/>
<location filename="openlp/core/ui/mainwindow.py" line="429"/>
<source>Ctrl+F1</source>
<translation></translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="429"/>
<location filename="openlp/core/ui/mainwindow.py" line="431"/>
<source>&amp;Online Help</source>
<translation>&amp;Online súgó</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="434"/>
<location filename="openlp/core/ui/mainwindow.py" line="433"/>
<source>&amp;Web Site</source>
<translation>&amp;Weboldal</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="442"/>
<location filename="openlp/core/ui/mainwindow.py" line="441"/>
<source>Use the system language, if available.</source>
<translation>Rendszernyelv használata, ha elérhető.</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="438"/>
<location filename="openlp/core/ui/mainwindow.py" line="437"/>
<source>Set the interface language to %s</source>
<translation>A felhasználói felület nyelvének átváltása erre: %s</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="444"/>
<location filename="openlp/core/ui/mainwindow.py" line="443"/>
<source>Add &amp;Tool...</source>
<translation>&amp;Eszköz hozzáadása</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="446"/>
<location filename="openlp/core/ui/mainwindow.py" line="445"/>
<source>Add an application to the list of tools.</source>
<translation>Egy alkalmazás hozzáadása az eszközök listához.</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="452"/>
<location filename="openlp/core/ui/mainwindow.py" line="451"/>
<source>&amp;Default</source>
<translation>&amp;Alapértelmezett</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="454"/>
<location filename="openlp/core/ui/mainwindow.py" line="453"/>
<source>Set the view mode back to the default.</source>
<translation>Nézetmód visszaállítása az alapértelmezettre.</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="456"/>
<location filename="openlp/core/ui/mainwindow.py" line="455"/>
<source>&amp;Setup</source>
<translation>&amp;Szerkesztés</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="457"/>
<location filename="openlp/core/ui/mainwindow.py" line="456"/>
<source>Set the view mode to Setup.</source>
<translation>Nézetmód váltása a Beállítás módra.</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="459"/>
<location filename="openlp/core/ui/mainwindow.py" line="458"/>
<source>&amp;Live</source>
<translation>&amp;É adás</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="460"/>
<location filename="openlp/core/ui/mainwindow.py" line="459"/>
<source>Set the view mode to Live.</source>
<translation>Nézetmód váltása a É módra.</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="648"/>
<location filename="openlp/core/ui/mainwindow.py" line="645"/>
<source>Version %s of OpenLP is now available for download (you are currently running version %s).
You can download the latest version from http://openlp.org/.</source>
@ -2188,27 +2186,27 @@ You can download the latest version from http://openlp.org/.</source>
A legfrissebb verzió a http://openlp.org/ oldalról szerezhető be.</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="652"/>
<location filename="openlp/core/ui/mainwindow.py" line="649"/>
<source>OpenLP Version Updated</source>
<translation>OpenLP verziófrissítés</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="704"/>
<location filename="openlp/core/ui/mainwindow.py" line="701"/>
<source>OpenLP Main Display Blanked</source>
<translation>Sötét OpenLP képernyő</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="704"/>
<location filename="openlp/core/ui/mainwindow.py" line="701"/>
<source>The Main Display has been blanked out</source>
<translation>A képernyő el lett sötétítve</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="920"/>
<location filename="openlp/core/ui/mainwindow.py" line="910"/>
<source>Default Theme: %s</source>
<translation>Alapértelmezett téma: %s</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="370"/>
<location filename="openlp/core/ui/mainwindow.py" line="372"/>
<source>Configure &amp;Shortcuts...</source>
<translation>&amp;Gyorsbillentyűk beállítása</translation>
</message>
@ -2219,42 +2217,42 @@ A legfrissebb verzió a http://openlp.org/ oldalról szerezhető be.</translatio
<translation>Magyar</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="352"/>
<location filename="openlp/core/ui/mainwindow.py" line="354"/>
<source>Print the current Service Order.</source>
<translation>Az aktuális sorrend nyomtatása.</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="354"/>
<location filename="openlp/core/ui/mainwindow.py" line="356"/>
<source>Ctrl+P</source>
<translation></translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="372"/>
<location filename="openlp/core/ui/mainwindow.py" line="374"/>
<source>&amp;Configure Display Tags</source>
<translation>Megjelenítési &amp;címkek beállítása</translation>
<translation>Megjelenítési &amp;címkék beállítása</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="440"/>
<location filename="openlp/core/ui/mainwindow.py" line="439"/>
<source>&amp;Autodetect</source>
<translation>&amp;Automatikus felismerés</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="448"/>
<location filename="openlp/core/ui/mainwindow.py" line="447"/>
<source>Open &amp;Data Folder...</source>
<translation>&amp;Adatmappa megnyitása</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="450"/>
<location filename="openlp/core/ui/mainwindow.py" line="449"/>
<source>Open the folder where songs, bibles and other data resides.</source>
<translation>A dalokat, Bibliákat és egyéb adatokat tartalmazó mappa megnyitása.</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="842"/>
<location filename="openlp/core/ui/mainwindow.py" line="832"/>
<source>Close OpenLP</source>
<translation>OpenLP bezárása</translation>
</message>
<message>
<location filename="openlp/core/ui/mainwindow.py" line="842"/>
<location filename="openlp/core/ui/mainwindow.py" line="832"/>
<source>Are you sure you want to close OpenLP?</source>
<translation>Biztosan bezárható az OpenLP?</translation>
</message>
@ -3158,7 +3156,7 @@ A tartalom kódolása nem UTF-8.</translation>
<message>
<location filename="openlp/core/ui/themewizard.py" line="448"/>
<source>Define the font and display characteristics for the Display text</source>
<translation>A szöveg betűkészlete és a megjelenési tulajdonságai</translation>
<translation>A szöveg betűkészlete és megjelenési tulajdonságai</translation>
</message>
<message>
<location filename="openlp/core/ui/themewizard.py" line="473"/>
@ -3203,7 +3201,7 @@ A tartalom kódolása nem UTF-8.</translation>
<message>
<location filename="openlp/core/ui/themewizard.py" line="470"/>
<source>Define the font and display characteristics for the Footer text</source>
<translation>A lábléc szöveg betűkészlete és a megjelenési tulajdonságai</translation>
<translation>A lábléc szöveg betűkészlete és megjelenési tulajdonságai</translation>
</message>
<message>
<location filename="openlp/core/ui/themewizard.py" line="477"/>
@ -3293,7 +3291,7 @@ A tartalom kódolása nem UTF-8.</translation>
<message>
<location filename="openlp/core/ui/themewizard.py" line="530"/>
<source>View the theme and save it replacing the current one or change the name to create a new theme</source>
<translation>A téma előnézete és mentése. Felülírható már egy meglévő vagy egy új név megadásával új téma hozható létre</translation>
<translation>A téma előnézete és mentése: egy már meglévő téma felülírható vagy egy új név megadásával új téma hozható létre</translation>
</message>
<message>
<location filename="openlp/core/ui/themewizard.py" line="534"/>
@ -4439,7 +4437,7 @@ A kódlap felelős a karakterek helyes megjelenítéséért.</translation>
<message>
<location filename="openlp/plugins/songs/forms/editsongform.py" line="367"/>
<source>You have not selected a valid author. Either select an author from the list, or type in a new author and click the &quot;Add Author to Song&quot; button to add the new author.</source>
<translation>Nincs kijelölve egyetlen szerző sem. Vagy válassz egy szerzőt a listából, vagy írj az új szerző mezőbe és kattints az Szerző hozzáadása a dalhoz gombon a szerző megjelöléséhez.</translation>
<translation>Nincs kijelölve egyetlen szerző sem. Vagy válassz egy szerzőt a listából, vagy írj az új szerző mezőbe és kattints a Hozzáadás gombra a szerző megjelöléséhez.</translation>
</message>
<message>
<location filename="openlp/plugins/songs/forms/editsongform.py" line="395"/>
@ -4459,7 +4457,7 @@ A kódlap felelős a karakterek helyes megjelenítéséért.</translation>
<message>
<location filename="openlp/plugins/songs/forms/editsongform.py" line="426"/>
<source>You have not selected a valid topic. Either select a topic from the list, or type in a new topic and click the &quot;Add Topic to Song&quot; button to add the new topic.</source>
<translation>Nincs kijelölve egyetlen témakör sem. Vagy válassz egy témakört a listából, vagy írj az új témakör mezőbe és kattints a Témakör hozzáadása a dalhoz gombon a témakör megjelöléséhez.</translation>
<translation>Nincs kijelölve egyetlen témakör sem. Vagy válassz egy témakört a listából, vagy írj az új témakör mezőbe és kattints a Hozzáadás gombraa témakör megjelöléséhez.</translation>
</message>
<message>
<location filename="openlp/plugins/songs/forms/editsongform.py" line="561"/>

View File

@ -394,10 +394,7 @@ if __name__ == '__main__':
--template Info.plist.master \
--expandto %(target_directory)s/Info.plist' \
% { 'config_file' : options.config, 'target_directory' : os.getcwd() })
os.system('python expander.py --config %(config_file)s \
--template version.master \
--expandto %(target_directory)s/.version' \
% { 'config_file' : options.config, 'target_directory' : os.getcwd() })
os.system('python get_version.py > .version')
# prepare variables
app_name_lower = settings['openlp_appname'].lower()

View File

@ -0,0 +1,36 @@
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
import os
from bzrlib.branch import Branch
def get_version(path):
b = Branch.open_containing(path)[0]
b.lock_read()
result = '0.0.0'
try:
# Get the branch's latest revision number.
revno = b.revno()
# Convert said revision number into a bzr revision id.
revision_id = b.dotted_revno_to_revision_id((revno,))
# Get a dict of tags, with the revision id as the key.
tags = b.tags.get_reverse_tag_dict()
# Check if the latest
if revision_id in tags:
result = tags[revision_id][0]
else:
result = '%s-bzr%s' % (sorted(b.tags.get_tag_dict().keys())[-1], revno)
finally:
b.unlock()
return result
def get_path():
if len(sys.argv) > 1:
return os.path.abspath(sys.argv[1])
else:
return os.path.abspath('.')
if __name__ == u'__main__':
path = get_path()
print get_version(path)

View File

@ -2,7 +2,6 @@
openlp_appname = OpenLP
openlp_dmgname = OpenLP-1.9.4-bzrXXXX
openlp_version = XXXX
openlp_full_version = 1.9.4-latest
openlp_basedir = /Users/openlp/trunk
openlp_icon_file = openlp-logo-with-text.icns
openlp_dmg_icon_file = openlp-logo-420x420.png

View File

@ -1 +0,0 @@
%(openlp_full_version)s

View File

@ -69,6 +69,7 @@ Source: ..\..\dist\OpenLP\*; DestDir: {app}; Flags: ignoreversion recursesubdirs
[Icons]
Name: {group}\{#AppName}; Filename: {app}\{#AppExeName}
Name: {group}\{#AppName} (Debug); Filename: {app}\{#AppExeName}; Parameters: -l debug
Name: {group}\{#AppName} Help; Filename: {app}\{#AppName}.chm
Name: {group}\{cm:ProgramOnTheWeb,{#AppName}}; Filename: {#AppURL}
Name: {group}\{cm:UninstallProgram,{#AppName}}; Filename: {uninstallexe}
Name: {commondesktop}\{#AppName}; Filename: {app}\{#AppExeName}; Tasks: desktopicon

View File

@ -94,6 +94,10 @@ from subprocess import Popen, PIPE
python_exe = sys.executable
innosetup_exe = os.path.join(os.getenv(u'PROGRAMFILES'), 'Inno Setup 5',
u'ISCC.exe')
sphinx_exe = os.path.join(os.path.split(python_exe)[0], u'Scripts',
u'sphinx-build.exe')
hhc_exe = os.path.join(os.getenv(u'PROGRAMFILES'), 'HTML Help Workshop',
u'hhc.exe')
# Base paths
script_path = os.path.split(os.path.abspath(__file__))[0]
@ -109,6 +113,7 @@ i18n_utils = os.path.join(script_path, u'translation_utils.py')
# Paths
source_path = os.path.join(branch_path, u'openlp')
manual_path = os.path.join(branch_path, u'documentation', u'manual')
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')
@ -132,21 +137,6 @@ def update_code():
print output
raise Exception(u'Error updating the code')
def clean_build_directories():
dist_dir = os.path.join(build_path, u'dist')
build_dir = os.path.join(build_path, u'build')
if os.path.exists(dist_dir):
for root, dirs, files in os.walk(dist_dir, topdown=False):
print root
for file in files:
os.remove(os.path.join(root, file))
os.removedirs(dist_dir)
if os.path.exists(build_dir):
for root, dirs, files in os.walk(build_dir, topdown=False):
for file in files:
os.remove(os.path.join(root, file))
os.removedirs(build_dir)
def run_pyinstaller():
print u'Running PyInstaller...'
os.chdir(branch_path)
@ -240,6 +230,31 @@ def compile_translations():
if code != 0:
raise Exception('Error running lconvert on %s' % source_path)
def run_sphinx():
print u'Running Sphinx...'
os.chdir(manual_path)
sphinx = Popen((sphinx_exe, u'-b', u'htmlhelp', u'-d', u'build/doctrees',
u'source', u'build/htmlhelp'), stdout=PIPE)
output, error = sphinx.communicate()
code = sphinx.wait()
if code != 0:
print output
raise Exception(u'Error running Sphinx')
def run_htmlhelp():
print u'Running HTML Help Workshop...'
os.chdir(os.path.join(manual_path, u'build', u'htmlhelp'))
hhc = Popen((hhc_exe, u'OpenLP.chm'), stdout=PIPE)
output, error = hhc.communicate()
code = hhc.wait()
if code != 1:
print u'Exit code:', code
print output
raise Exception(u'Error running HTML Help Workshop')
else:
copy(os.path.join(manual_path, u'build', 'htmlhelp', u'OpenLP.chm'),
os.path.join(dist_path, u'OpenLP.chm'))
def run_innosetup():
print u'Running Inno Setup...'
os.chdir(winres_path)
@ -260,7 +275,6 @@ def main():
print "Inno Setup path:", innosetup_path
print "Windows resources:", winres_path
update_code()
#clean_build_directories()
run_pyinstaller()
write_version_file()
copy_enchant()
@ -268,6 +282,8 @@ def main():
copy_windows_files()
update_translations()
compile_translations()
run_sphinx()
run_htmlhelp()
run_innosetup()
print "Done."