head
@ -17,7 +17,7 @@ import sys
|
|||||||
# If extensions (or modules to document with autodoc) are in another directory,
|
# If extensions (or modules to document with autodoc) are in another directory,
|
||||||
# add these directories to sys.path here. If the directory is relative to the
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||||
sys.path.insert(0, os.path.abspath(os.path.join('..', '..')))
|
sys.path.insert(0, os.path.abspath(os.path.join('..', '..', '..')))
|
||||||
|
|
||||||
# -- General configuration -----------------------------------------------------
|
# -- General configuration -----------------------------------------------------
|
||||||
|
|
||||||
@ -39,7 +39,7 @@ master_doc = 'index'
|
|||||||
|
|
||||||
# General information about the project.
|
# General information about the project.
|
||||||
project = u'OpenLP'
|
project = u'OpenLP'
|
||||||
copyright = u'2009, Raoul Snyman'
|
copyright = u'2004-2010, Raoul Snyman'
|
||||||
|
|
||||||
# The version info for the project you're documenting, acts as replacement for
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
# |version| and |release|, also used in various other places throughout the
|
# |version| and |release|, also used in various other places throughout the
|
||||||
@ -48,7 +48,7 @@ copyright = u'2009, Raoul Snyman'
|
|||||||
# The short X.Y version.
|
# The short X.Y version.
|
||||||
version = '2.0'
|
version = '2.0'
|
||||||
# The full version, including alpha/beta/rc tags.
|
# The full version, including alpha/beta/rc tags.
|
||||||
release = '2.0.pre'
|
release = '1.9.3'
|
||||||
|
|
||||||
# The language for content autogenerated by Sphinx. Refer to documentation
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
# for a list of supported languages.
|
# for a list of supported languages.
|
||||||
@ -111,7 +111,7 @@ html_theme_options = {
|
|||||||
|
|
||||||
# The name for this set of Sphinx documents. If None, it defaults to
|
# The name for this set of Sphinx documents. If None, it defaults to
|
||||||
# "<project> v<release> documentation".
|
# "<project> v<release> documentation".
|
||||||
#html_title = None
|
html_title = 'OpenLP 2.0 Developer API'
|
||||||
|
|
||||||
# A shorter title for the navigation bar. Default is the same as html_title.
|
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||||
#html_short_title = None
|
#html_short_title = None
|
||||||
@ -166,7 +166,7 @@ html_static_path = ['_static']
|
|||||||
#html_file_suffix = ''
|
#html_file_suffix = ''
|
||||||
|
|
||||||
# Output file base name for HTML help builder.
|
# Output file base name for HTML help builder.
|
||||||
htmlhelp_basename = 'OpenLPdoc'
|
htmlhelp_basename = 'OpenLP-2.0-api'
|
||||||
|
|
||||||
|
|
||||||
# -- Options for LaTeX output --------------------------------------------------
|
# -- Options for LaTeX output --------------------------------------------------
|
||||||
@ -180,7 +180,7 @@ htmlhelp_basename = 'OpenLPdoc'
|
|||||||
# Grouping the document tree into LaTeX files. List of tuples
|
# Grouping the document tree into LaTeX files. List of tuples
|
||||||
# (source start file, target name, title, author, documentclass [howto/manual]).
|
# (source start file, target name, title, author, documentclass [howto/manual]).
|
||||||
latex_documents = [
|
latex_documents = [
|
||||||
('index', 'OpenLP.tex', u'OpenLP Documentation',
|
('index', 'OpenLP.tex', u'OpenLP 2.0 Developer API',
|
||||||
u'Raoul Snyman', 'manual'),
|
u'Raoul Snyman', 'manual'),
|
||||||
]
|
]
|
||||||
|
|
@ -3,9 +3,13 @@
|
|||||||
:mod:`core` Module
|
:mod:`core` Module
|
||||||
==================
|
==================
|
||||||
|
|
||||||
|
.. automodule:: openlp.core
|
||||||
|
:members:
|
||||||
|
|
||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
|
||||||
lib
|
lib
|
||||||
theme
|
theme
|
||||||
|
ui
|
||||||
|
utils
|
@ -1,7 +1,7 @@
|
|||||||
.. _core-lib:
|
.. _core-lib:
|
||||||
|
|
||||||
:mod:`lib` Module
|
Object Library
|
||||||
=================
|
==============
|
||||||
|
|
||||||
.. automodule:: openlp.core.lib
|
.. automodule:: openlp.core.lib
|
||||||
:members:
|
:members:
|
27
documentation/api/source/core/ui.rst
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
.. _core-ui:
|
||||||
|
|
||||||
|
User Interface
|
||||||
|
==============
|
||||||
|
|
||||||
|
.. automodule:: openlp.core.ui
|
||||||
|
|
||||||
|
Main Windows
|
||||||
|
------------
|
||||||
|
|
||||||
|
.. autoclass:: openlp.core.ui.mainwindow.MainWindow
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.core.ui.maindisplay.MainDisplay
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Managers
|
||||||
|
--------
|
||||||
|
|
||||||
|
.. autoclass:: openlp.core.ui.servicemanager.ServiceManager
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.core.ui.mediadockmanager.MediaDockManager
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.core.ui.thememanager.ThemeManager
|
||||||
|
:members:
|
7
documentation/api/source/core/utils.rst
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
.. _core-utils:
|
||||||
|
|
||||||
|
Utilities
|
||||||
|
=========
|
||||||
|
|
||||||
|
.. automodule:: openlp.core.utils
|
||||||
|
:members:
|
@ -15,7 +15,6 @@ Contents:
|
|||||||
.. toctree::
|
.. toctree::
|
||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
|
||||||
openlp
|
|
||||||
core/index
|
core/index
|
||||||
plugins/index
|
plugins/index
|
||||||
|
|
31
documentation/api/source/plugins/alerts.rst
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
.. _plugins-alerts:
|
||||||
|
|
||||||
|
Alerts Plugin
|
||||||
|
=============
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.alerts
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Plugin Class
|
||||||
|
------------
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.alerts.alertsplugin.AlertsPlugin
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Forms
|
||||||
|
-----
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.alerts.forms
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.alerts.forms.alertform.AlertForm
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Helper Classes & Functions
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.alerts.lib
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.alerts.lib.db
|
||||||
|
:members:
|
@ -6,93 +6,50 @@ Bibles Plugin
|
|||||||
.. automodule:: openlp.plugins.bibles
|
.. automodule:: openlp.plugins.bibles
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
:mod:`BiblePlugin` Class
|
Plugin Class
|
||||||
-------------------------
|
------------
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.bibles.bibleplugin.BiblePlugin
|
.. autoclass:: openlp.plugins.bibles.bibleplugin.BiblePlugin
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
:mod:`forms` Submodule
|
Forms
|
||||||
----------------------
|
-----
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.bibles.forms
|
.. automodule:: openlp.plugins.bibles.forms
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
:mod:`BibleImportWizard`
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.bibles.forms.bibleimportwizard.Ui_BibleImportWizard
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.bibles.forms.importwizardform.ImportWizardForm
|
.. autoclass:: openlp.plugins.bibles.forms.importwizardform.ImportWizardForm
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
:mod:`lib` Submodule
|
Helper Classes & Functions
|
||||||
--------------------
|
--------------------------
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.bibles.lib
|
.. automodule:: openlp.plugins.bibles.lib
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
:mod:`db`
|
|
||||||
^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.bibles.lib.db
|
.. automodule:: openlp.plugins.bibles.lib.db
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.bibles.lib.db.BibleDB
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`csv`
|
|
||||||
^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.bibles.lib.csvbible
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.bibles.lib.csvbible.CSVBible
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`http`
|
|
||||||
^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.bibles.lib.http
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.bibles.lib.http.HTTPBible
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`osis`
|
|
||||||
^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.bibles.lib.osis
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.bibles.lib.osis.OSISBible
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`opensong`
|
|
||||||
^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.bibles.lib.opensong
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.bibles.lib.opensong.OpenSongBible
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`biblestab`
|
|
||||||
^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.bibles.lib.biblestab
|
.. automodule:: openlp.plugins.bibles.lib.biblestab
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
:mod:`manager`
|
|
||||||
^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.bibles.lib.manager
|
.. automodule:: openlp.plugins.bibles.lib.manager
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
:mod:`mediaitem`
|
|
||||||
^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.bibles.lib.mediaitem
|
.. automodule:: openlp.plugins.bibles.lib.mediaitem
|
||||||
:members:
|
:members:
|
||||||
|
|
||||||
|
Bible Importers
|
||||||
|
---------------
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.bibles.lib.csvbible
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.bibles.lib.http
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.bibles.lib.osis
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.bibles.lib.opensong
|
||||||
|
:members:
|
34
documentation/api/source/plugins/custom.rst
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
.. _plugins-custom:
|
||||||
|
|
||||||
|
Custom Slides Plugin
|
||||||
|
====================
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.custom
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Plugin Class
|
||||||
|
------------
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.custom.customplugin.CustomPlugin
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Forms
|
||||||
|
-----
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.custom.forms
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.custom.forms.editcustomform.EditCustomForm
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.custom.forms.editcustomslideform.EditCustomSlideForm
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Helper Classes & Functions
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.custom.lib
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.custom.lib.mediaitem
|
||||||
|
:members:
|
22
documentation/api/source/plugins/images.rst
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
.. _plugins-images:
|
||||||
|
|
||||||
|
Images Plugin
|
||||||
|
=============
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.images
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Plugin Class
|
||||||
|
------------
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.images.imageplugin.ImagePlugin
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Helper Classes & Functions
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.images.lib
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.images.lib.mediaitem
|
||||||
|
:members:
|
20
documentation/api/source/plugins/index.rst
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
.. _plugins-index:
|
||||||
|
|
||||||
|
Plugins
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
songs
|
||||||
|
bibles
|
||||||
|
presentations
|
||||||
|
media
|
||||||
|
images
|
||||||
|
custom
|
||||||
|
remotes
|
||||||
|
songusage
|
||||||
|
alerts
|
22
documentation/api/source/plugins/media.rst
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
.. _plugins-media:
|
||||||
|
|
||||||
|
Media Plugin
|
||||||
|
============
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.media
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Plugin Class
|
||||||
|
------------
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.media.mediaplugin.MediaPlugin
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Helper Classes & Functions
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.media.lib
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.media.lib.mediaitem
|
||||||
|
:members:
|
19
documentation/api/source/plugins/remotes.rst
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
.. _plugins-remotes:
|
||||||
|
|
||||||
|
Remotes Plugin
|
||||||
|
==============
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.remotes
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Plugin Class
|
||||||
|
------------
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.remotes.remoteplugin.RemotesPlugin
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Helper Classes & Functions
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.remotes.lib
|
||||||
|
:members:
|
103
documentation/api/source/plugins/songs.rst
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
.. _plugins-songs:
|
||||||
|
|
||||||
|
Songs Plugin
|
||||||
|
============
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Plugin Class
|
||||||
|
------------
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.songs.songsplugin.SongsPlugin
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Forms
|
||||||
|
-----
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.forms
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.songs.forms.authorsform.AuthorsForm
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.songs.forms.editsongform.EditSongForm
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.songs.forms.editverseform.EditVerseForm
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.songs.forms.songbookform.SongBookForm
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.songs.forms.songimportform.SongImportForm
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.songs.forms.songmaintenanceform.SongMaintenanceForm
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.songs.forms.topicsform.TopicsForm
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Helper Classes & Functions
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.lib
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.lib.db
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.lib.importer
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.lib.mediaitem
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.songs.lib.mediaitem.SongListView
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.lib.songimport
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.lib.songstab
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.lib.xml
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Song Importers
|
||||||
|
--------------
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.lib.cclifileimport
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.songs.lib.cclifileimport.CCLIFileImportError
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.lib.ewimport
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.songs.lib.ewimport.FieldDescEntry
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.lib.olp1import
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.lib.olpimport
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.lib.oooimport
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.lib.opensongimport
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.lib.sofimport
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.lib.songbeamerimport
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songs.lib.wowimport
|
||||||
|
:members:
|
34
documentation/api/source/plugins/songusage.rst
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
.. _plugins-songusage:
|
||||||
|
|
||||||
|
Song Usage Plugin
|
||||||
|
=================
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songusage
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Plugin Class
|
||||||
|
------------
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.songusage.songusageplugin.SongUsagePlugin
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Forms
|
||||||
|
-----
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songusage.forms
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.songusage.forms.songusagedeleteform.SongUsageDeleteForm
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. autoclass:: openlp.plugins.songusage.forms.songusagedetailform.SongUsageDetailForm
|
||||||
|
:members:
|
||||||
|
|
||||||
|
Helper Classes & Functions
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songusage.lib
|
||||||
|
:members:
|
||||||
|
|
||||||
|
.. automodule:: openlp.plugins.songusage.lib.db
|
||||||
|
:members:
|
88
documentation/manual/Makefile
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
# Makefile for Sphinx documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
# You can set these variables from the command line.
|
||||||
|
SPHINXOPTS =
|
||||||
|
SPHINXBUILD = sphinx-build
|
||||||
|
PAPER =
|
||||||
|
|
||||||
|
# Internal variables.
|
||||||
|
PAPEROPT_a4 = -D latex_paper_size=a4
|
||||||
|
PAPEROPT_letter = -D latex_paper_size=letter
|
||||||
|
ALLSPHINXOPTS = -d build/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
|
||||||
|
|
||||||
|
.PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest
|
||||||
|
|
||||||
|
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 of 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)"
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-rm -rf build/*
|
||||||
|
|
||||||
|
html:
|
||||||
|
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) build/html
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The HTML pages are in build/html."
|
||||||
|
|
||||||
|
dirhtml:
|
||||||
|
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) build/dirhtml
|
||||||
|
@echo
|
||||||
|
@echo "Build finished. The HTML pages are in build/dirhtml."
|
||||||
|
|
||||||
|
pickle:
|
||||||
|
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) build/pickle
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can process the pickle files."
|
||||||
|
|
||||||
|
json:
|
||||||
|
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) build/json
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; now you can process the JSON files."
|
||||||
|
|
||||||
|
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."
|
||||||
|
|
||||||
|
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.qhc"
|
||||||
|
|
||||||
|
latex:
|
||||||
|
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) build/latex
|
||||||
|
@echo
|
||||||
|
@echo "Build finished; the LaTeX files are in build/latex."
|
||||||
|
@echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \
|
||||||
|
"run these through (pdf)latex."
|
||||||
|
|
||||||
|
changes:
|
||||||
|
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) build/changes
|
||||||
|
@echo
|
||||||
|
@echo "The overview file is in build/changes."
|
||||||
|
|
||||||
|
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."
|
||||||
|
|
||||||
|
doctest:
|
||||||
|
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) build/doctest
|
||||||
|
@echo "Testing of doctests in the sources finished, look at the " \
|
||||||
|
"results in build/doctest/output.txt."
|
112
documentation/manual/make.bat
Normal file
@ -0,0 +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
|
208
documentation/manual/source/conf.py
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
#
|
||||||
|
# OpenLP documentation build configuration file, created by
|
||||||
|
# sphinx-quickstart on Fri Jul 10 17:20:40 2009.
|
||||||
|
#
|
||||||
|
# This file is execfile()d with the current directory set to its containing dir.
|
||||||
|
#
|
||||||
|
# Note that not all possible configuration values are present in this
|
||||||
|
# autogenerated file.
|
||||||
|
#
|
||||||
|
# All configuration values have a default; values that are commented out
|
||||||
|
# serve to show the default.
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# If extensions (or modules to document with autodoc) are in another directory,
|
||||||
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||||
|
#sys.path.insert(0, os.path.abspath(os.path.join('..', '..')))
|
||||||
|
|
||||||
|
# -- General configuration -----------------------------------------------------
|
||||||
|
|
||||||
|
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||||
|
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||||
|
#extensions = ['sphinx.ext.autodoc']
|
||||||
|
|
||||||
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
|
templates_path = ['_templates']
|
||||||
|
|
||||||
|
# The suffix of source filenames.
|
||||||
|
source_suffix = '.rst'
|
||||||
|
|
||||||
|
# The encoding of source files.
|
||||||
|
source_encoding = 'utf-8'
|
||||||
|
|
||||||
|
# The master toctree document.
|
||||||
|
master_doc = 'index'
|
||||||
|
|
||||||
|
# General information about the project.
|
||||||
|
project = u'OpenLP'
|
||||||
|
copyright = u'2004-2010 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
|
||||||
|
# built documents.
|
||||||
|
#
|
||||||
|
# The short X.Y version.
|
||||||
|
version = '2.0'
|
||||||
|
# The full version, including alpha/beta/rc tags.
|
||||||
|
release = '1.9.3'
|
||||||
|
|
||||||
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
|
# for a list of supported languages.
|
||||||
|
#language = None
|
||||||
|
|
||||||
|
# There are two options for replacing |today|: either, you set today to some
|
||||||
|
# non-false value, then it is used:
|
||||||
|
#today = ''
|
||||||
|
# Else, today_fmt is used as the format for a strftime call.
|
||||||
|
#today_fmt = '%B %d, %Y'
|
||||||
|
|
||||||
|
# List of documents that shouldn't be included in the build.
|
||||||
|
#unused_docs = []
|
||||||
|
|
||||||
|
# List of directories, relative to source directory, that shouldn't be searched
|
||||||
|
# for source files.
|
||||||
|
exclude_trees = []
|
||||||
|
|
||||||
|
# The reST default role (used for this markup: `text`) to use for all documents.
|
||||||
|
#default_role = None
|
||||||
|
|
||||||
|
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||||
|
#add_function_parentheses = True
|
||||||
|
|
||||||
|
# If true, the current module name will be prepended to all description
|
||||||
|
# unit titles (such as .. function::).
|
||||||
|
add_module_names = False
|
||||||
|
|
||||||
|
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||||
|
# output. They are ignored by default.
|
||||||
|
#show_authors = False
|
||||||
|
|
||||||
|
# The name of the Pygments (syntax highlighting) style to use.
|
||||||
|
pygments_style = 'sphinx'
|
||||||
|
|
||||||
|
# A list of ignored prefixes for module index sorting.
|
||||||
|
#modindex_common_prefix = []
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for HTML output ---------------------------------------------------
|
||||||
|
|
||||||
|
# The theme to use for HTML and HTML Help pages. Major themes that come with
|
||||||
|
# Sphinx are currently 'default' and 'sphinxdoc'.
|
||||||
|
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 = {
|
||||||
|
'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 = []
|
||||||
|
|
||||||
|
# The name for this set of Sphinx documents. If None, it defaults to
|
||||||
|
# "<project> v<release> documentation".
|
||||||
|
html_title = u'OpenLP 2.0 User Manual'
|
||||||
|
|
||||||
|
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||||
|
#html_short_title = None
|
||||||
|
|
||||||
|
# The name of an image file (relative to this directory) to place at the top
|
||||||
|
# of the sidebar.
|
||||||
|
#html_logo = None
|
||||||
|
|
||||||
|
# The name of an image file (within the static path) to use as favicon of the
|
||||||
|
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||||
|
# pixels large.
|
||||||
|
#html_favicon = None
|
||||||
|
|
||||||
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
|
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'
|
||||||
|
|
||||||
|
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||||
|
# typographically correct entities.
|
||||||
|
#html_use_smartypants = True
|
||||||
|
|
||||||
|
# Custom sidebar templates, maps document names to template names.
|
||||||
|
#html_sidebars = {}
|
||||||
|
|
||||||
|
# Additional templates that should be rendered to pages, maps page names to
|
||||||
|
# template names.
|
||||||
|
#html_additional_pages = {}
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
#html_use_modindex = True
|
||||||
|
|
||||||
|
# If false, no index is generated.
|
||||||
|
#html_use_index = True
|
||||||
|
|
||||||
|
# If true, the index is split into individual pages for each letter.
|
||||||
|
#html_split_index = False
|
||||||
|
|
||||||
|
# If true, links to the reST sources are added to the pages.
|
||||||
|
#html_show_sourcelink = True
|
||||||
|
|
||||||
|
# If true, an OpenSearch description file will be output, and all pages will
|
||||||
|
# contain a <link> tag referring to it. The value of this option must be the
|
||||||
|
# base URL from which the finished HTML is served.
|
||||||
|
#html_use_opensearch = ''
|
||||||
|
|
||||||
|
# If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml").
|
||||||
|
#html_file_suffix = ''
|
||||||
|
|
||||||
|
# Output file base name for HTML help builder.
|
||||||
|
htmlhelp_basename = 'OpenLP-2.0-manual'
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for LaTeX output --------------------------------------------------
|
||||||
|
|
||||||
|
# The paper size ('letter' or 'a4').
|
||||||
|
#latex_paper_size = 'letter'
|
||||||
|
|
||||||
|
# The font size ('10pt', '11pt' or '12pt').
|
||||||
|
#latex_font_size = '10pt'
|
||||||
|
|
||||||
|
# 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 2.0 User Manual',
|
||||||
|
u'Raoul Snyman', 'manual'),
|
||||||
|
]
|
||||||
|
|
||||||
|
# The name of an image file (relative to this directory) to place at the top of
|
||||||
|
# the title page.
|
||||||
|
#latex_logo = None
|
||||||
|
|
||||||
|
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||||
|
# not chapters.
|
||||||
|
#latex_use_parts = False
|
||||||
|
|
||||||
|
# Additional stuff for the LaTeX preamble.
|
||||||
|
#latex_preamble = ''
|
||||||
|
|
||||||
|
# Documents to append as an appendix to all manuals.
|
||||||
|
#latex_appendices = []
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
#latex_use_modindex = True
|
||||||
|
|
||||||
|
# A dictionary that contains LaTeX snippets that override those Sphinx usually
|
||||||
|
# puts into the generated .tex files.
|
||||||
|
latex_elements = {
|
||||||
|
'fontpkg': '\\usepackage{helvet}'
|
||||||
|
}
|
180
documentation/manual/source/dualmonitors.rst
Normal file
@ -0,0 +1,180 @@
|
|||||||
|
==================
|
||||||
|
Dual Monitor Setup
|
||||||
|
==================
|
||||||
|
|
||||||
|
The first step in getting OpenLP working on your system is to setup your
|
||||||
|
computer properly for dual monitors. This is not very difficult, but the steps
|
||||||
|
do vary depending on operating system.
|
||||||
|
|
||||||
|
Most modern computers do have the ability for dual monitors. To be certain
|
||||||
|
check your computer's documentation. A typical desktop computer capable of dual
|
||||||
|
monitors will have two of, or a combination of the two connectors below.
|
||||||
|
|
||||||
|
**VGA**
|
||||||
|
|
||||||
|
.. image:: pics/vga.png
|
||||||
|
|
||||||
|
**DVI**
|
||||||
|
|
||||||
|
.. image:: pics/dvi.png
|
||||||
|
|
||||||
|
A laptop computer setup only varies slightly, generally you will need only one
|
||||||
|
of outputs pictured above since your laptops screen serves as one of the
|
||||||
|
monitors. Sometimes with older laptops a key stroke generally involving the
|
||||||
|
:kbd:`Fn` key and another key is required to enable the second monitor on
|
||||||
|
laptops.
|
||||||
|
|
||||||
|
Some computers also incorporate the use of :abbr:`S-Video (Separate Video)` or
|
||||||
|
:abbr:`HDMI (High-Definition Multimedia Interface)` connections.
|
||||||
|
|
||||||
|
A typical OpenLP set up consist of your normal single monitor setup, with your
|
||||||
|
projector setup as the second monitor. With the option of extending your
|
||||||
|
desktop across the second monitor, or your operating system's equivalent.
|
||||||
|
|
||||||
|
Microsoft Windows
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
Dual monitor setup is similar among all the currently supported Windows
|
||||||
|
releases (XP, Vista, Windows 7), but does vary slightly from one release to the
|
||||||
|
next.
|
||||||
|
|
||||||
|
Windows 7
|
||||||
|
^^^^^^^^^
|
||||||
|
|
||||||
|
Windows 7 has using a projector in mind. Simply connect your projector and
|
||||||
|
press :kbd:`Windows+P`.
|
||||||
|
|
||||||
|
The more traditional way is also fairly straight forward. Go to
|
||||||
|
:guilabel:`Control Panel` and click on :guilabel:`Display`. This will open up
|
||||||
|
the :guilabel:`Display` dialog. You can also bypass this step by right click on
|
||||||
|
a blank area on your desktop and selecting :guilabel:`Resolution`.
|
||||||
|
|
||||||
|
.. image:: pics/winsevendisplay.png
|
||||||
|
|
||||||
|
Then click on the :guilabel:`Adjust resolution` link in the left pane. Enable
|
||||||
|
your projector and make sure that the selected value for :guilabel:`Multiple
|
||||||
|
displays` is :guilabel:`Extend these displays`.
|
||||||
|
|
||||||
|
.. image:: pics/winsevenresolution.png
|
||||||
|
|
||||||
|
Windows Vista
|
||||||
|
^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
From :guilabel:`Control Panel` click on :guilabel:`Personalize`, or right click
|
||||||
|
a blank place on the desktop and click :guilabel:`Personalization`.
|
||||||
|
|
||||||
|
.. image:: pics/vistapersonalize.png
|
||||||
|
|
||||||
|
From the :guilabel:`Personalization` window click on :guilabel:`Display
|
||||||
|
Settings`. Then enable the montior that represents your projector and make sure
|
||||||
|
you have checked :guilabel:`Extend the desktop onto this monitor`.
|
||||||
|
|
||||||
|
.. image:: pics/vistadisplaysettings.png
|
||||||
|
|
||||||
|
Windows XP
|
||||||
|
^^^^^^^^^^
|
||||||
|
|
||||||
|
From :guilabel:`Control Panel` select :guilabel:`Display`, or right click on a
|
||||||
|
blank area of the desktop and select :guilabel:`Properties`. From the
|
||||||
|
:guilabel:`Display Properties` window click on the :guilabel:`Settings` tab.
|
||||||
|
Then click on the monitor that represents your projector and make sure you have
|
||||||
|
checked :guilabel:`Extend my Windows desktop onto this monitor`.
|
||||||
|
|
||||||
|
.. image:: pics/xpdisplaysettings.png
|
||||||
|
|
||||||
|
Linux
|
||||||
|
-----
|
||||||
|
|
||||||
|
Due to the vast varieties of hardware, distributions, desktops, and drivers
|
||||||
|
this is not an exhaustive guide to dual monitor setup on Linux. This guide
|
||||||
|
assumes that you have properly set up any proprietary drivers if needed. You
|
||||||
|
should seek out your distributions documentation if this general guide does not
|
||||||
|
work.
|
||||||
|
|
||||||
|
GNOME
|
||||||
|
^^^^^
|
||||||
|
|
||||||
|
This guide is for users of the GNOME desktop who do not use proprietary drivers.
|
||||||
|
From most distros go to :menuselection:`System --> Preferences --> Display
|
||||||
|
Settings (Monitors)`. Set up your projector with the correct resolution and make
|
||||||
|
sure that :guilabel:`Same image on all monitors` is **unchecked**.
|
||||||
|
|
||||||
|
.. image:: pics/gnome.png
|
||||||
|
|
||||||
|
KDE
|
||||||
|
^^^
|
||||||
|
|
||||||
|
This guide is for users of the KDE desktop who do not use proprietary drivers.
|
||||||
|
From most distros click the Kick Off menu and navigate to
|
||||||
|
:guilabel:`System Settings`
|
||||||
|
|
||||||
|
.. image:: pics/kdesystemsettings.png
|
||||||
|
|
||||||
|
Click on the display and monitor icon.
|
||||||
|
|
||||||
|
.. image:: pics/kdedisplay.png
|
||||||
|
|
||||||
|
From here you will need to set up your projector with the appropriate
|
||||||
|
resolution, and position. OpenLP works best projecting to the monitor on the
|
||||||
|
right.
|
||||||
|
|
||||||
|
Linux Systems Using nVidia Drivers
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
This guide is for users of the proprietary nVidia driver on Linux Distributions.
|
||||||
|
It is assumed that you have properly setup your drivers according to your
|
||||||
|
distribution's documentation, and you have a working ``xorg.conf`` file in place.
|
||||||
|
|
||||||
|
If you wish to make the changes permanent in setting up your system for dual
|
||||||
|
monitors it will be necessary to modify your ``xorg.conf`` file. It is always a
|
||||||
|
good idea to make a backup of any critical file before making changes::
|
||||||
|
|
||||||
|
user@linux:~ $ sudo cp /etc/X11/xorg.conf /etc/X11/xorg.conf.old
|
||||||
|
|
||||||
|
Or for those using systems that use the root user instead of sudo, change to
|
||||||
|
root and enter::
|
||||||
|
|
||||||
|
root@linux: # cp /etc/X11/xorg.conf /etc/X11/xorg.conf.old
|
||||||
|
|
||||||
|
The exact location of the ``xorg.conf`` file can vary so check your
|
||||||
|
distribution's documentation.
|
||||||
|
|
||||||
|
If you want to make your changes permanent run nVidia settings from the
|
||||||
|
terminal::
|
||||||
|
|
||||||
|
user@linux:~ $ sudo nvidia-settings
|
||||||
|
|
||||||
|
Or, as root::
|
||||||
|
|
||||||
|
root@linux: # nividia-settings
|
||||||
|
|
||||||
|
If you do not want to write the changes to your ``xorg.conf`` file simply run
|
||||||
|
the nVidia Settings program (``nvidia-settings``) from your desktop's menu,
|
||||||
|
usually in an administration or system menu, or from the terminal as a normal
|
||||||
|
user run::
|
||||||
|
|
||||||
|
user@linux:~ $ nvidia-settings
|
||||||
|
|
||||||
|
Once you have opened nVidia Settings, click on
|
||||||
|
:guilabel:`X Server Display Configuration`. Then select the monitor you are
|
||||||
|
wanting to use as your second monitor and click :guilabel:`Configure`.
|
||||||
|
|
||||||
|
.. image:: pics/nvlinux1.png
|
||||||
|
|
||||||
|
After clicking :guilabel:`Configure`, select :guilabel:`TwinView`. Then click
|
||||||
|
:guilabel:`OK`.
|
||||||
|
|
||||||
|
.. image:: pics/twinview.png
|
||||||
|
|
||||||
|
Then click :guilabel:`Apply` and if you are happy with the way things look click
|
||||||
|
:guilabel:`Keep` to keep your new settings. Don't worry if all goes wrong the
|
||||||
|
settings will return back to the previous settings in 15 seconds without any
|
||||||
|
action. nVidia Settings should take care of selecting your optimum resolution
|
||||||
|
etc, but that can be changed as needed. When you are happy with everything click
|
||||||
|
on :guilabel:`Save to X Configuration File`.
|
||||||
|
|
||||||
|
.. image:: pics/xorgwrite.png
|
||||||
|
|
||||||
|
Then click :guilabel:`Save` and you should be set. You may want to restart X or
|
||||||
|
your machine just to make sure all the settings carry over the next time you log
|
||||||
|
in.
|
70
documentation/manual/source/glossary.rst
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
========
|
||||||
|
Glossary
|
||||||
|
========
|
||||||
|
|
||||||
|
The developers of OpenLP have strived to make it a straightforward and easy to
|
||||||
|
use application. However, it is good to be familiar with a few terms that will
|
||||||
|
be used throughout this documentation, and when seeking support.
|
||||||
|
|
||||||
|
Main Window
|
||||||
|
-----------
|
||||||
|
|
||||||
|
The Main Window is what you will see when you first open OpenLP
|
||||||
|
|
||||||
|
.. image:: pics/mainwindow.png
|
||||||
|
|
||||||
|
The Main Window contains all the tools and plugins that make OpenLP function
|
||||||
|
|
||||||
|
Media Manager
|
||||||
|
-------------
|
||||||
|
|
||||||
|
The Media Manager contains a number of tabs that plugins supply to OpenLP.
|
||||||
|
Each tab in the Media Manager is called a **Media Item**
|
||||||
|
|
||||||
|
.. image:: pics/mediamanager.png
|
||||||
|
|
||||||
|
From the Media Manager you can send Media Items to the Preview or Live screens.
|
||||||
|
|
||||||
|
Preview
|
||||||
|
-------
|
||||||
|
|
||||||
|
The preview pane is a section to preview your media items before you go live
|
||||||
|
with them.
|
||||||
|
|
||||||
|
.. image:: pics/preview.png
|
||||||
|
|
||||||
|
Service File
|
||||||
|
------------
|
||||||
|
|
||||||
|
A service file, is the file that is created when you save your work on OpenLP.
|
||||||
|
The service file consist of **Service Items**
|
||||||
|
|
||||||
|
Service Item
|
||||||
|
------------
|
||||||
|
|
||||||
|
A service item are the **media items** that are in the **service manager**
|
||||||
|
|
||||||
|
Service Manger
|
||||||
|
--------------
|
||||||
|
|
||||||
|
The service manager contains the media items in your service file. This is the
|
||||||
|
area from wich your media items go live, and you can also save, open, and edit
|
||||||
|
services files.
|
||||||
|
|
||||||
|
.. image:: pics/servicemanager.png
|
||||||
|
|
||||||
|
Slide Controller
|
||||||
|
----------------
|
||||||
|
|
||||||
|
The Slide Controller controls which slide from a **Service Item** is currently
|
||||||
|
being displayed, and moving between the various slides.
|
||||||
|
|
||||||
|
.. image:: pics/slidecontroller.png
|
||||||
|
|
||||||
|
Theme Manager
|
||||||
|
-------------
|
||||||
|
|
||||||
|
The theme manager is where themes are created and edited. Themes are the text
|
||||||
|
styles backgrounds that you use to personalize your services.
|
||||||
|
|
||||||
|
.. image:: pics/thememanager.png
|
@ -3,8 +3,8 @@
|
|||||||
You can adapt this file completely to your liking, but it should at least
|
You can adapt this file completely to your liking, but it should at least
|
||||||
contain the root `toctree` directive.
|
contain the root `toctree` directive.
|
||||||
|
|
||||||
Welcome to OpenLP's documentation
|
Welcome to the OpenLP 2.0 User Manual
|
||||||
==================================
|
=====================================
|
||||||
|
|
||||||
Contents:
|
Contents:
|
||||||
|
|
||||||
@ -12,6 +12,8 @@ Contents:
|
|||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
|
||||||
introduction
|
introduction
|
||||||
|
glossary
|
||||||
|
dualmonitors
|
||||||
|
|
||||||
Indices and tables
|
Indices and tables
|
||||||
==================
|
==================
|
BIN
documentation/manual/source/pics/dvi.png
Normal file
After Width: | Height: | Size: 19 KiB |
BIN
documentation/manual/source/pics/gnome.png
Normal file
After Width: | Height: | Size: 33 KiB |
BIN
documentation/manual/source/pics/kdedisplay.png
Normal file
After Width: | Height: | Size: 64 KiB |
BIN
documentation/manual/source/pics/kdesystemsettings.png
Normal file
After Width: | Height: | Size: 112 KiB |
BIN
documentation/manual/source/pics/mainwindow.png
Normal file
After Width: | Height: | Size: 123 KiB |
BIN
documentation/manual/source/pics/mediamanager.png
Normal file
After Width: | Height: | Size: 104 KiB |
BIN
documentation/manual/source/pics/nvlinux1.png
Normal file
After Width: | Height: | Size: 140 KiB |
BIN
documentation/manual/source/pics/preview.png
Normal file
After Width: | Height: | Size: 22 KiB |
BIN
documentation/manual/source/pics/servicemanager.png
Normal file
After Width: | Height: | Size: 18 KiB |
BIN
documentation/manual/source/pics/slidecontroller.png
Normal file
After Width: | Height: | Size: 90 KiB |
BIN
documentation/manual/source/pics/thememanager.png
Normal file
After Width: | Height: | Size: 31 KiB |
BIN
documentation/manual/source/pics/twinview.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
documentation/manual/source/pics/vga.png
Normal file
After Width: | Height: | Size: 7.2 KiB |
BIN
documentation/manual/source/pics/vistadisplaysettings.png
Executable file
After Width: | Height: | Size: 51 KiB |
BIN
documentation/manual/source/pics/vistapersonalize.png
Executable file
After Width: | Height: | Size: 139 KiB |
BIN
documentation/manual/source/pics/winsevendisplay.png
Executable file
After Width: | Height: | Size: 155 KiB |
BIN
documentation/manual/source/pics/winsevenresolution.png
Executable file
After Width: | Height: | Size: 141 KiB |
BIN
documentation/manual/source/pics/xorgwrite.png
Normal file
After Width: | Height: | Size: 13 KiB |
BIN
documentation/manual/source/pics/xpdisplaysettings.png
Normal file
After Width: | Height: | Size: 35 KiB |
@ -1,8 +0,0 @@
|
|||||||
.. _plugins-images:
|
|
||||||
|
|
||||||
Images Plugin
|
|
||||||
=============
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.images
|
|
||||||
:members:
|
|
||||||
|
|
@ -1,28 +0,0 @@
|
|||||||
.. _plugins-index:
|
|
||||||
|
|
||||||
:mod:`plugins` Module
|
|
||||||
=====================
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. toctree::
|
|
||||||
:maxdepth: 2
|
|
||||||
|
|
||||||
songs
|
|
||||||
bibles
|
|
||||||
presentations
|
|
||||||
media
|
|
||||||
images
|
|
||||||
|
|
||||||
:mod:`custom` Plugin
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.custom
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`songusage` Plugin
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songusage
|
|
||||||
:members:
|
|
@ -1,8 +0,0 @@
|
|||||||
.. _plugins-media:
|
|
||||||
|
|
||||||
Media Plugin
|
|
||||||
============
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.media
|
|
||||||
:members:
|
|
||||||
|
|
@ -1,193 +0,0 @@
|
|||||||
.. _plugins-songs:
|
|
||||||
|
|
||||||
Songs Plugin
|
|
||||||
============
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:class:`SongsPlugin` Class
|
|
||||||
--------------------------
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.songsplugin.SongsPlugin
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`forms` Submodule
|
|
||||||
----------------------
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.forms
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:class:`AuthorsForm`
|
|
||||||
^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.forms.authorsdialog.Ui_AuthorsDialog
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.forms.authorsform.AuthorsForm
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:class:`EditSongForm`
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.forms.editsongdialog.Ui_EditSongDialog
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.forms.editsongform.EditSongForm
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:class:`EditVerseForm`
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.forms.editversedialog.Ui_EditVerseDialog
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.forms.editverseform.EditVerseForm
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:class:`SongBookForm`
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.forms.songbookdialog.Ui_SongBookDialog
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.forms.songbookform.SongBookForm
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:class:`SongImportForm`
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.forms.songimportwizard.Ui_SongImportWizard
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.forms.songimportform.ImportWizardForm
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:class:`SongMaintenanceForm`
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.forms.songmaintenancedialog.Ui_SongMaintenanceDialog
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.forms.songmaintenanceform.SongMaintenanceForm
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:class:`TopicsForm`
|
|
||||||
^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.forms.topicsdialog.Ui_TopicsDialog
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.forms.topicsform.TopicsForm
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`lib` Submodule
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`cclifileimport` Submodule
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib.cclifileimport
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.lib.cclifileimport.CCLIFileImportError
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`db` Submodule
|
|
||||||
^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib.db
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`ewimport` Submodule
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib.ewimport
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.lib.ewimport.FieldDescEntry
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`importer` Submodule
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib.importer
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`mediaitem` Submodule
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib.mediaitem
|
|
||||||
:members:
|
|
||||||
|
|
||||||
.. autoclass:: openlp.plugins.songs.lib.mediaitem.SongListView
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`olp1import` Submodule
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib.olp1import
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`olpimport` Submodule
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib.olpimport
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`oooimport` Submodule
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib.oooimport
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`opensongimport` Submodule
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib.opensongimport
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`sofimport` Submodule
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib.sofimport
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`songbeamerimport` Submodule
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib.songbeamerimport
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`songimport` Submodule
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib.songimport
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`songstab` Submodule
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib.songstab
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`wowimport` Submodule
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib.wowimport
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`songxml` Submodule
|
|
||||||
^^^^^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib.songxml
|
|
||||||
:members:
|
|
||||||
|
|
||||||
:mod:`xml` Submodule
|
|
||||||
^^^^^^^^^^^^^^^^^^^^
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.songs.lib.xml
|
|
||||||
:members:
|
|
@ -223,16 +223,13 @@ def image_to_byte(image):
|
|||||||
``image``
|
``image``
|
||||||
The image to converted.
|
The image to converted.
|
||||||
"""
|
"""
|
||||||
log.debug(u'image_to_byte')
|
log.debug(u'image_to_byte - start')
|
||||||
byte_array = QtCore.QByteArray()
|
byte_array = QtCore.QByteArray()
|
||||||
# use buffer to store pixmap into byteArray
|
# use buffer to store pixmap into byteArray
|
||||||
buffie = QtCore.QBuffer(byte_array)
|
buffie = QtCore.QBuffer(byte_array)
|
||||||
buffie.open(QtCore.QIODevice.WriteOnly)
|
buffie.open(QtCore.QIODevice.WriteOnly)
|
||||||
if isinstance(image, QtGui.QImage):
|
image.save(buffie, "PNG")
|
||||||
pixmap = QtGui.QPixmap.fromImage(image)
|
log.debug(u'image_to_byte - end')
|
||||||
else:
|
|
||||||
pixmap = QtGui.QPixmap(image)
|
|
||||||
pixmap.save(buffie, "PNG")
|
|
||||||
# convert to base64 encoding so does not get missed!
|
# convert to base64 encoding so does not get missed!
|
||||||
return byte_array.toBase64()
|
return byte_array.toBase64()
|
||||||
|
|
||||||
@ -253,8 +250,11 @@ def resize_image(image, width, height, background=QtCore.Qt.black):
|
|||||||
The background colour defaults to black.
|
The background colour defaults to black.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
log.debug(u'resize_image')
|
log.debug(u'resize_image - start')
|
||||||
preview = QtGui.QImage(image)
|
if isinstance(image, QtGui.QImage):
|
||||||
|
preview = image
|
||||||
|
else:
|
||||||
|
preview = QtGui.QImage(image)
|
||||||
if not preview.isNull():
|
if not preview.isNull():
|
||||||
# Only resize if different size
|
# Only resize if different size
|
||||||
if preview.width() == width and preview.height == height:
|
if preview.width() == width and preview.height == height:
|
||||||
@ -263,6 +263,7 @@ def resize_image(image, width, height, background=QtCore.Qt.black):
|
|||||||
QtCore.Qt.SmoothTransformation)
|
QtCore.Qt.SmoothTransformation)
|
||||||
image_cache_key = u'%s%s%s' % (image, unicode(width), unicode(height))
|
image_cache_key = u'%s%s%s' % (image, unicode(width), unicode(height))
|
||||||
if image_cache_key in image_cache:
|
if image_cache_key in image_cache:
|
||||||
|
log.debug(u'resize_image - end cache')
|
||||||
return image_cache[image_cache_key]
|
return image_cache[image_cache_key]
|
||||||
realw = preview.width()
|
realw = preview.width()
|
||||||
realh = preview.height()
|
realh = preview.height()
|
||||||
@ -273,6 +274,7 @@ def resize_image(image, width, height, background=QtCore.Qt.black):
|
|||||||
painter = QtGui.QPainter(new_image)
|
painter = QtGui.QPainter(new_image)
|
||||||
painter.drawImage((width - realw) / 2, (height - realh) / 2, preview)
|
painter.drawImage((width - realw) / 2, (height - realh) / 2, preview)
|
||||||
image_cache[image_cache_key] = new_image
|
image_cache[image_cache_key] = new_image
|
||||||
|
log.debug(u'resize_image - end')
|
||||||
return new_image
|
return new_image
|
||||||
|
|
||||||
def check_item_selected(list_widget, message):
|
def check_item_selected(list_widget, message):
|
||||||
|
@ -25,7 +25,6 @@
|
|||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
import re
|
import re
|
||||||
import sys
|
|
||||||
try:
|
try:
|
||||||
import enchant
|
import enchant
|
||||||
from enchant import DictNotFoundError
|
from enchant import DictNotFoundError
|
||||||
@ -37,7 +36,7 @@ except ImportError:
|
|||||||
# http://john.nachtimwald.com/2009/08/22/qplaintextedit-with-in-line-spell-check/
|
# http://john.nachtimwald.com/2009/08/22/qplaintextedit-with-in-line-spell-check/
|
||||||
|
|
||||||
from PyQt4 import QtCore, QtGui
|
from PyQt4 import QtCore, QtGui
|
||||||
from openlp.core.lib import html_expands, translate, context_menu_action
|
from openlp.core.lib import html_expands, translate
|
||||||
|
|
||||||
class SpellTextEdit(QtGui.QPlainTextEdit):
|
class SpellTextEdit(QtGui.QPlainTextEdit):
|
||||||
def __init__(self, *args):
|
def __init__(self, *args):
|
||||||
|
@ -87,12 +87,12 @@ class ThemeLevel(object):
|
|||||||
Service = 2
|
Service = 2
|
||||||
Song = 3
|
Song = 3
|
||||||
|
|
||||||
boolean_list = [u'italics', u'override', u'outline', u'shadow', \
|
boolean_list = [u'italics', u'override', u'outline', u'shadow',
|
||||||
u'slide_transition']
|
u'slide_transition']
|
||||||
|
|
||||||
integer_list =[u'proportion', u'line_adjustment', u'x', u'height', u'y', \
|
integer_list = [u'proportion', u'line_adjustment', u'x', u'height', u'y',
|
||||||
u'width', u'shadow_size', u'outline_size', u'horizontal_align', \
|
u'width', u'shadow_size', u'outline_size', u'horizontal_align',
|
||||||
u'vertical_align', u'wrap_style' ]
|
u'vertical_align', u'wrap_style']
|
||||||
|
|
||||||
class ThemeXML(object):
|
class ThemeXML(object):
|
||||||
"""
|
"""
|
||||||
|
@ -39,7 +39,6 @@ class HideMode(object):
|
|||||||
|
|
||||||
from filerenameform import FileRenameForm
|
from filerenameform import FileRenameForm
|
||||||
from maindisplay import MainDisplay
|
from maindisplay import MainDisplay
|
||||||
from slidecontroller import HideMode
|
|
||||||
from servicenoteform import ServiceNoteForm
|
from servicenoteform import ServiceNoteForm
|
||||||
from serviceitemeditform import ServiceItemEditForm
|
from serviceitemeditform import ServiceItemEditForm
|
||||||
from screen import ScreenList
|
from screen import ScreenList
|
||||||
|
@ -24,7 +24,7 @@
|
|||||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
from PyQt4 import QtCore, QtGui
|
from PyQt4 import QtGui
|
||||||
|
|
||||||
from exceptiondialog import Ui_ExceptionDialog
|
from exceptiondialog import Ui_ExceptionDialog
|
||||||
|
|
||||||
|
@ -27,7 +27,6 @@
|
|||||||
from PyQt4 import QtCore, QtGui
|
from PyQt4 import QtCore, QtGui
|
||||||
|
|
||||||
from filerenamedialog import Ui_FileRenameDialog
|
from filerenamedialog import Ui_FileRenameDialog
|
||||||
from openlp.core.lib import translate
|
|
||||||
|
|
||||||
class FileRenameForm(QtGui.QDialog, Ui_FileRenameDialog):
|
class FileRenameForm(QtGui.QDialog, Ui_FileRenameDialog):
|
||||||
"""
|
"""
|
||||||
|
@ -90,6 +90,9 @@ class DisplayWidget(QtGui.QGraphicsView):
|
|||||||
event.ignore()
|
event.ignore()
|
||||||
|
|
||||||
class MainDisplay(DisplayWidget):
|
class MainDisplay(DisplayWidget):
|
||||||
|
"""
|
||||||
|
This is the display screen.
|
||||||
|
"""
|
||||||
|
|
||||||
def __init__(self, parent, screens, live):
|
def __init__(self, parent, screens, live):
|
||||||
DisplayWidget.__init__(self, live, parent=None)
|
DisplayWidget.__init__(self, live, parent=None)
|
||||||
@ -184,7 +187,7 @@ class MainDisplay(DisplayWidget):
|
|||||||
`slide`
|
`slide`
|
||||||
The slide text to be displayed
|
The slide text to be displayed
|
||||||
"""
|
"""
|
||||||
log.debug(u'text')
|
log.debug(u'text to display')
|
||||||
# Wait for the webview to update before displayiong text.
|
# Wait for the webview to update before displayiong text.
|
||||||
while not self.loaded:
|
while not self.loaded:
|
||||||
Receiver.send_message(u'openlp_process_events')
|
Receiver.send_message(u'openlp_process_events')
|
||||||
@ -199,7 +202,7 @@ class MainDisplay(DisplayWidget):
|
|||||||
`slide`
|
`slide`
|
||||||
The slide text to be displayed
|
The slide text to be displayed
|
||||||
"""
|
"""
|
||||||
log.debug(u'alert')
|
log.debug(u'alert to display')
|
||||||
if self.height() != self.screen[u'size'].height() \
|
if self.height() != self.screen[u'size'].height() \
|
||||||
or not self.isVisible() or self.videoWidget.isVisible():
|
or not self.isVisible() or self.videoWidget.isVisible():
|
||||||
shrink = True
|
shrink = True
|
||||||
@ -219,7 +222,7 @@ class MainDisplay(DisplayWidget):
|
|||||||
shrinkItem.setVisible(True)
|
shrinkItem.setVisible(True)
|
||||||
else:
|
else:
|
||||||
shrinkItem.setVisible(False)
|
shrinkItem.setVisible(False)
|
||||||
shrinkItem.resize(self.screen[u'size'].width(),
|
shrinkItem.resize(self.screen[u'size'].width(),
|
||||||
self.screen[u'size'].height())
|
self.screen[u'size'].height())
|
||||||
|
|
||||||
def image(self, image):
|
def image(self, image):
|
||||||
@ -230,9 +233,10 @@ class MainDisplay(DisplayWidget):
|
|||||||
`Image`
|
`Image`
|
||||||
The Image to be displayed can be QImage or QPixmap
|
The Image to be displayed can be QImage or QPixmap
|
||||||
"""
|
"""
|
||||||
log.debug(u'image')
|
log.debug(u'image to display')
|
||||||
image = resize_image(image, self.screen[u'size'].width(),
|
if not isinstance(image, QtGui.QImage):
|
||||||
self.screen[u'size'].height())
|
image = resize_image(image, self.screen[u'size'].width(),
|
||||||
|
self.screen[u'size'].height())
|
||||||
self.resetVideo()
|
self.resetVideo()
|
||||||
self.displayImage(image)
|
self.displayImage(image)
|
||||||
# show screen
|
# show screen
|
||||||
|
@ -179,23 +179,23 @@ class SlideController(QtGui.QWidget):
|
|||||||
self.HideMenu.setMenu(QtGui.QMenu(
|
self.HideMenu.setMenu(QtGui.QMenu(
|
||||||
translate('OpenLP.SlideController', 'Hide'), self.Toolbar))
|
translate('OpenLP.SlideController', 'Hide'), self.Toolbar))
|
||||||
self.BlankScreen = QtGui.QAction(QtGui.QIcon(
|
self.BlankScreen = QtGui.QAction(QtGui.QIcon(
|
||||||
u':/slides/slide_blank.png'),
|
u':/slides/slide_blank.png'),
|
||||||
translate('OpenLP.SlideController',
|
translate('OpenLP.SlideController',
|
||||||
'Blank Screen'), self.HideMenu)
|
'Blank Screen'), self.HideMenu)
|
||||||
self.BlankScreen.setCheckable(True)
|
self.BlankScreen.setCheckable(True)
|
||||||
QtCore.QObject.connect(self.BlankScreen,
|
QtCore.QObject.connect(self.BlankScreen,
|
||||||
QtCore.SIGNAL("triggered(bool)"), self.onBlankDisplay)
|
QtCore.SIGNAL("triggered(bool)"), self.onBlankDisplay)
|
||||||
self.ThemeScreen = QtGui.QAction(QtGui.QIcon(
|
self.ThemeScreen = QtGui.QAction(QtGui.QIcon(
|
||||||
u':/slides/slide_theme.png'),
|
u':/slides/slide_theme.png'),
|
||||||
translate('OpenLP.SlideController',
|
translate('OpenLP.SlideController',
|
||||||
'Blank to Theme'), self.HideMenu)
|
'Blank to Theme'), self.HideMenu)
|
||||||
self.ThemeScreen.setCheckable(True)
|
self.ThemeScreen.setCheckable(True)
|
||||||
QtCore.QObject.connect(self.ThemeScreen,
|
QtCore.QObject.connect(self.ThemeScreen,
|
||||||
QtCore.SIGNAL("triggered(bool)"), self.onThemeDisplay)
|
QtCore.SIGNAL("triggered(bool)"), self.onThemeDisplay)
|
||||||
if self.screens.display_count > 1:
|
if self.screens.display_count > 1:
|
||||||
self.DesktopScreen = QtGui.QAction(QtGui.QIcon(
|
self.DesktopScreen = QtGui.QAction(QtGui.QIcon(
|
||||||
u':/slides/slide_desktop.png'),
|
u':/slides/slide_desktop.png'),
|
||||||
translate('OpenLP.SlideController',
|
translate('OpenLP.SlideController',
|
||||||
'Show Desktop'), self.HideMenu)
|
'Show Desktop'), self.HideMenu)
|
||||||
self.DesktopScreen.setCheckable(True)
|
self.DesktopScreen.setCheckable(True)
|
||||||
QtCore.QObject.connect(self.DesktopScreen,
|
QtCore.QObject.connect(self.DesktopScreen,
|
||||||
@ -214,7 +214,7 @@ class SlideController(QtGui.QWidget):
|
|||||||
self.Toolbar.addToolbarSeparator(u'Close Separator')
|
self.Toolbar.addToolbarSeparator(u'Close Separator')
|
||||||
self.Toolbar.addToolbarButton(
|
self.Toolbar.addToolbarButton(
|
||||||
u'Edit Song', u':/general/general_edit.png',
|
u'Edit Song', u':/general/general_edit.png',
|
||||||
translate('OpenLP.SlideController',
|
translate('OpenLP.SlideController',
|
||||||
'Edit and reload song preview'),
|
'Edit and reload song preview'),
|
||||||
self.onEditSong)
|
self.onEditSong)
|
||||||
if isLive:
|
if isLive:
|
||||||
@ -584,11 +584,14 @@ class SlideController(QtGui.QWidget):
|
|||||||
else:
|
else:
|
||||||
label = QtGui.QLabel()
|
label = QtGui.QLabel()
|
||||||
label.setMargin(4)
|
label.setMargin(4)
|
||||||
pixmap = resize_image(frame[u'image'],
|
|
||||||
self.parent.RenderManager.width,
|
|
||||||
self.parent.RenderManager.height)
|
|
||||||
label.setScaledContents(True)
|
label.setScaledContents(True)
|
||||||
label.setPixmap(QtGui.QPixmap.fromImage(pixmap))
|
if isinstance(frame[u'image'], QtGui.QImage):
|
||||||
|
label.setPixmap(QtGui.QPixmap.fromImage(frame[u'image']))
|
||||||
|
else:
|
||||||
|
pixmap = resize_image(frame[u'image'],
|
||||||
|
self.parent.RenderManager.width,
|
||||||
|
self.parent.RenderManager.height)
|
||||||
|
label.setPixmap(QtGui.QPixmap.fromImage(pixmap))
|
||||||
self.PreviewListWidget.setCellWidget(framenumber, 0, label)
|
self.PreviewListWidget.setCellWidget(framenumber, 0, label)
|
||||||
slideHeight = width * self.parent.RenderManager.screen_ratio
|
slideHeight = width * self.parent.RenderManager.screen_ratio
|
||||||
row += 1
|
row += 1
|
||||||
@ -985,7 +988,7 @@ class SlideController(QtGui.QWidget):
|
|||||||
self.video.hide()
|
self.video.hide()
|
||||||
self.SlidePreview.clear()
|
self.SlidePreview.clear()
|
||||||
self.SlidePreview.show()
|
self.SlidePreview.show()
|
||||||
|
|
||||||
def onMediaClose(self):
|
def onMediaClose(self):
|
||||||
"""
|
"""
|
||||||
Respond to a request to close the Video
|
Respond to a request to close the Video
|
||||||
|
@ -34,9 +34,8 @@ from PyQt4 import QtCore, QtGui
|
|||||||
|
|
||||||
from openlp.core.ui import AmendThemeForm, FileRenameForm
|
from openlp.core.ui import AmendThemeForm, FileRenameForm
|
||||||
from openlp.core.theme import Theme
|
from openlp.core.theme import Theme
|
||||||
from openlp.core.lib import OpenLPToolbar, context_menu_action, \
|
from openlp.core.lib import OpenLPToolbar, ThemeXML, get_text_file_string, \
|
||||||
ThemeXML, str_to_bool, get_text_file_string, build_icon, Receiver, \
|
build_icon, Receiver, SettingsManager, translate, check_item_selected
|
||||||
context_menu_separator, SettingsManager, translate, check_item_selected
|
|
||||||
from openlp.core.utils import AppLocation, get_filesystem_encoding
|
from openlp.core.utils import AppLocation, get_filesystem_encoding
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
@ -267,7 +266,7 @@ class ThemeManager(QtGui.QWidget):
|
|||||||
filename = \
|
filename = \
|
||||||
os.path.split(unicode(oldThemeData.background_filename))[1]
|
os.path.split(unicode(oldThemeData.background_filename))[1]
|
||||||
new_theme.add_background_image(filename)
|
new_theme.add_background_image(filename)
|
||||||
save_to = os.path.join(self.path, theme_name, filename)
|
save_to = os.path.join(self.path, newThemeName, filename)
|
||||||
save_from = oldThemeData.background_filename
|
save_from = oldThemeData.background_filename
|
||||||
new_theme.add_font(unicode(oldThemeData.font_main_name),
|
new_theme.add_font(unicode(oldThemeData.font_main_name),
|
||||||
unicode(oldThemeData.font_main_color),
|
unicode(oldThemeData.font_main_color),
|
||||||
|
@ -28,7 +28,6 @@ The :mod:`languagemanager` module provides all the translation settings and
|
|||||||
language file loading for OpenLP.
|
language file loading for OpenLP.
|
||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
import os
|
|
||||||
|
|
||||||
from PyQt4 import QtCore, QtGui
|
from PyQt4 import QtCore, QtGui
|
||||||
|
|
||||||
|
@ -45,13 +45,15 @@ class AlertsPlugin(Plugin):
|
|||||||
self.icon = build_icon(u':/plugins/plugin_alerts.png')
|
self.icon = build_icon(u':/plugins/plugin_alerts.png')
|
||||||
self.alertsmanager = AlertsManager(self)
|
self.alertsmanager = AlertsManager(self)
|
||||||
self.manager = Manager(u'alerts', init_schema)
|
self.manager = Manager(u'alerts', init_schema)
|
||||||
self.alertForm = AlertForm(self)
|
visible_name = self.getString(StringContent.VisibleName)
|
||||||
|
self.alertForm = AlertForm(self, visible_name[u'title'])
|
||||||
|
|
||||||
def getSettingsTab(self):
|
def getSettingsTab(self):
|
||||||
"""
|
"""
|
||||||
Return the settings tab for the Alerts plugin
|
Return the settings tab for the Alerts plugin
|
||||||
"""
|
"""
|
||||||
self.alertsTab = AlertsTab(self)
|
visible_name = self.getString(StringContent.VisibleName)
|
||||||
|
self.alertsTab = AlertsTab(self, visible_name[u'title'])
|
||||||
return self.alertsTab
|
return self.alertsTab
|
||||||
|
|
||||||
def addToolsMenuItem(self, tools_menu):
|
def addToolsMenuItem(self, tools_menu):
|
||||||
@ -115,4 +117,3 @@ class AlertsPlugin(Plugin):
|
|||||||
self.textStrings[StringContent.VisibleName] = {
|
self.textStrings[StringContent.VisibleName] = {
|
||||||
u'title': translate('AlertsPlugin', 'Alerts')
|
u'title': translate('AlertsPlugin', 'Alerts')
|
||||||
}
|
}
|
||||||
|
|
@ -35,7 +35,7 @@ class AlertForm(QtGui.QDialog, Ui_AlertDialog):
|
|||||||
"""
|
"""
|
||||||
Provide UI for the alert system
|
Provide UI for the alert system
|
||||||
"""
|
"""
|
||||||
def __init__(self, title, visible_title):
|
def __init__(self, plugin, visible_title):
|
||||||
"""
|
"""
|
||||||
Initialise the alert form
|
Initialise the alert form
|
||||||
"""
|
"""
|
||||||
|
@ -24,6 +24,33 @@
|
|||||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
from importwizardform import ImportWizardForm
|
"""
|
||||||
|
Forms in OpenLP are made up of two classes. One class holds all the graphical
|
||||||
|
elements, like buttons and lists, and the other class holds all the functional
|
||||||
|
code, like slots and loading and saving.
|
||||||
|
|
||||||
__all__ = ['ImportWizardForm']
|
The first class, commonly known as the **Dialog** class, is typically named
|
||||||
|
``Ui_<name>Dialog``. It is a slightly modified version of the class that the
|
||||||
|
``pyuic4`` command produces from Qt4's .ui file. Typical modifications will be
|
||||||
|
converting most strings from "" to u'' and using OpenLP's ``translate()``
|
||||||
|
function for translating strings.
|
||||||
|
|
||||||
|
The second class, commonly known as the **Form** class, is typically named
|
||||||
|
``<name>Form``. This class is the one which is instantiated and used. It uses
|
||||||
|
dual inheritance to inherit from (usually) QtGui.QDialog and the Ui class
|
||||||
|
mentioned above, like so::
|
||||||
|
|
||||||
|
class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard):
|
||||||
|
|
||||||
|
def __init__(self, parent, manager, bibleplugin):
|
||||||
|
QtGui.QWizard.__init__(self, parent)
|
||||||
|
self.setupUi(self)
|
||||||
|
|
||||||
|
This allows OpenLP to use ``self.object`` for all the GUI elements while keeping
|
||||||
|
them separate from the functionality, so that it is easier to recreate the GUI
|
||||||
|
from the .ui files later if necessary.
|
||||||
|
"""
|
||||||
|
|
||||||
|
from bibleimportform import BibleImportForm
|
||||||
|
|
||||||
|
__all__ = ['BibleImportForm']
|
||||||
|
@ -54,7 +54,7 @@ class WebDownload(object):
|
|||||||
return cls.Names[name]
|
return cls.Names[name]
|
||||||
|
|
||||||
|
|
||||||
class ImportWizardForm(QtGui.QWizard, Ui_BibleImportWizard):
|
class BibleImportForm(QtGui.QWizard, Ui_BibleImportWizard):
|
||||||
"""
|
"""
|
||||||
This is the Bible Import Wizard, which allows easy importing of Bibles
|
This is the Bible Import Wizard, which allows easy importing of Bibles
|
||||||
into OpenLP from other formats like OSIS, CSV and OpenSong.
|
into OpenLP from other formats like OSIS, CSV and OpenSong.
|
@ -31,8 +31,7 @@ from PyQt4 import QtCore, QtGui
|
|||||||
|
|
||||||
from openlp.core.lib import MediaManagerItem, Receiver, BaseListWithDnD, \
|
from openlp.core.lib import MediaManagerItem, Receiver, BaseListWithDnD, \
|
||||||
ItemCapabilities, translate
|
ItemCapabilities, translate
|
||||||
from openlp.plugins.bibles.forms import ImportWizardForm
|
from openlp.plugins.bibles.forms import BibleImportForm
|
||||||
from openlp.plugins.bibles.lib.db import BibleDB
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -362,7 +361,7 @@ class BibleMediaItem(MediaManagerItem):
|
|||||||
|
|
||||||
def onImportClick(self):
|
def onImportClick(self):
|
||||||
if not hasattr(self, u'import_wizard'):
|
if not hasattr(self, u'import_wizard'):
|
||||||
self.import_wizard = ImportWizardForm(self, self.parent.manager,
|
self.import_wizard = BibleImportForm(self, self.parent.manager,
|
||||||
self.parent)
|
self.parent)
|
||||||
self.import_wizard.exec_()
|
self.import_wizard.exec_()
|
||||||
self.reloadBibles()
|
self.reloadBibles()
|
||||||
|
@ -6,8 +6,8 @@ Deut,Deuteronomy,Deut
|
|||||||
Josh,Joshua,Josh
|
Josh,Joshua,Josh
|
||||||
Judg,Judges,Judg
|
Judg,Judges,Judg
|
||||||
Ruth,Ruth,Ruth
|
Ruth,Ruth,Ruth
|
||||||
1Sam,1 Samual,1Sam
|
1Sam,1 Samuel,1Sam
|
||||||
2Sam,2 Samual,2Sam
|
2Sam,2 Samuel,2Sam
|
||||||
1Kgs,1 Kings,1Kgs
|
1Kgs,1 Kings,1Kgs
|
||||||
2Kgs,2 Kings,2Kgs
|
2Kgs,2 Kings,2Kgs
|
||||||
1Chr,1 Chronicles,1Chr
|
1Chr,1 Chronicles,1Chr
|
||||||
|
|
@ -28,7 +28,6 @@ import logging
|
|||||||
|
|
||||||
from PyQt4 import QtCore, QtGui
|
from PyQt4 import QtCore, QtGui
|
||||||
|
|
||||||
from openlp.core.lib import Receiver, translate
|
|
||||||
from editcustomslidedialog import Ui_CustomSlideEditDialog
|
from editcustomslidedialog import Ui_CustomSlideEditDialog
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
@ -169,7 +169,8 @@ class ImpressController(PresentationController):
|
|||||||
try:
|
try:
|
||||||
return Dispatch(u'com.sun.star.ServiceManager')
|
return Dispatch(u'com.sun.star.ServiceManager')
|
||||||
except pywintypes.com_error:
|
except pywintypes.com_error:
|
||||||
log.exception(u'Failed to get COM service manager')
|
log.warn(u'Failed to get COM service manager. '
|
||||||
|
u'Impress Controller has been disabled')
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def kill(self):
|
def kill(self):
|
||||||
|
@ -24,10 +24,37 @@
|
|||||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
|
||||||
|
"""
|
||||||
|
Forms in OpenLP are made up of two classes. One class holds all the graphical
|
||||||
|
elements, like buttons and lists, and the other class holds all the functional
|
||||||
|
code, like slots and loading and saving.
|
||||||
|
|
||||||
|
The first class, commonly known as the **Dialog** class, is typically named
|
||||||
|
``Ui_<name>Dialog``. It is a slightly modified version of the class that the
|
||||||
|
``pyuic4`` command produces from Qt4's .ui file. Typical modifications will be
|
||||||
|
converting most strings from "" to u'' and using OpenLP's ``translate()``
|
||||||
|
function for translating strings.
|
||||||
|
|
||||||
|
The second class, commonly known as the **Form** class, is typically named
|
||||||
|
``<name>Form``. This class is the one which is instantiated and used. It uses
|
||||||
|
dual inheritance to inherit from (usually) QtGui.QDialog and the Ui class
|
||||||
|
mentioned above, like so::
|
||||||
|
|
||||||
|
class AuthorsForm(QtGui.QDialog, Ui_AuthorsDialog):
|
||||||
|
|
||||||
|
def __init__(self, parent=None):
|
||||||
|
QtGui.QDialog.__init__(self, parent)
|
||||||
|
self.setupUi(self)
|
||||||
|
|
||||||
|
This allows OpenLP to use ``self.object`` for all the GUI elements while keeping
|
||||||
|
them separate from the functionality, so that it is easier to recreate the GUI
|
||||||
|
from the .ui files later if necessary.
|
||||||
|
"""
|
||||||
|
|
||||||
from authorsform import AuthorsForm
|
from authorsform import AuthorsForm
|
||||||
from topicsform import TopicsForm
|
from topicsform import TopicsForm
|
||||||
from songbookform import SongBookForm
|
from songbookform import SongBookForm
|
||||||
from editverseform import EditVerseForm
|
from editverseform import EditVerseForm
|
||||||
from editsongform import EditSongForm
|
from editsongform import EditSongForm
|
||||||
from songmaintenanceform import SongMaintenanceForm
|
from songmaintenanceform import SongMaintenanceForm
|
||||||
from songimportform import ImportWizardForm
|
from songimportform import SongImportForm
|
||||||
|
@ -35,7 +35,7 @@ from openlp.plugins.songs.lib.importer import SongFormat
|
|||||||
|
|
||||||
log = logging.getLogger(__name__)
|
log = logging.getLogger(__name__)
|
||||||
|
|
||||||
class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
|
class SongImportForm(QtGui.QWizard, Ui_SongImportWizard):
|
||||||
"""
|
"""
|
||||||
This is the Song Import Wizard, which allows easy importing of Songs
|
This is the Song Import Wizard, which allows easy importing of Songs
|
||||||
into OpenLP from other formats like OpenLyrics, OpenSong and CCLI.
|
into OpenLP from other formats like OpenLyrics, OpenSong and CCLI.
|
||||||
@ -248,7 +248,7 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
|
|||||||
# Progress page
|
# Progress page
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def getFileName(self, title, editbox,
|
def getFileName(self, title, editbox,
|
||||||
filters = '%s (*)' % translate('SongsPlugin.ImportWizardForm',
|
filters = '%s (*)' % translate('SongsPlugin.ImportWizardForm',
|
||||||
'All Files')):
|
'All Files')):
|
||||||
filename = QtGui.QFileDialog.getOpenFileName(self, title,
|
filename = QtGui.QFileDialog.getOpenFileName(self, title,
|
||||||
@ -260,7 +260,7 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
|
|||||||
self.plugin.settingsSection,
|
self.plugin.settingsSection,
|
||||||
os.path.split(unicode(filename))[0], 1)
|
os.path.split(unicode(filename))[0], 1)
|
||||||
|
|
||||||
def getFiles(self, title, listbox,
|
def getFiles(self, title, listbox,
|
||||||
filters = u'%s (*)' % translate('SongsPlugin.ImportWizardForm',
|
filters = u'%s (*)' % translate('SongsPlugin.ImportWizardForm',
|
||||||
'All Files')):
|
'All Files')):
|
||||||
filenames = QtGui.QFileDialog.getOpenFileNames(self, title,
|
filenames = QtGui.QFileDialog.getOpenFileNames(self, title,
|
||||||
@ -290,7 +290,7 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
|
|||||||
self.openLP2FilenameEdit,
|
self.openLP2FilenameEdit,
|
||||||
u'%s (*.sqlite);;%s (*)'
|
u'%s (*.sqlite);;%s (*)'
|
||||||
% (translate('SongsPlugin.ImportWizardForm',
|
% (translate('SongsPlugin.ImportWizardForm',
|
||||||
'OpenLP 2.0 Databases'),
|
'OpenLP 2.0 Databases'),
|
||||||
translate('SongsPlugin.ImportWizardForm',
|
translate('SongsPlugin.ImportWizardForm',
|
||||||
'All Files'))
|
'All Files'))
|
||||||
)
|
)
|
||||||
@ -299,10 +299,10 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
|
|||||||
self.getFileName(
|
self.getFileName(
|
||||||
translate('SongsPlugin.ImportWizardForm',
|
translate('SongsPlugin.ImportWizardForm',
|
||||||
'Select openlp.org 1.x Database File'),
|
'Select openlp.org 1.x Database File'),
|
||||||
self.openLP1FilenameEdit,
|
self.openLP1FilenameEdit,
|
||||||
u'%s (*.olp);;%s (*)'
|
u'%s (*.olp);;%s (*)'
|
||||||
% (translate('SongsPlugin.ImportWizardForm',
|
% (translate('SongsPlugin.ImportWizardForm',
|
||||||
'openlp.org v1.x Databases'),
|
'openlp.org v1.x Databases'),
|
||||||
translate('SongsPlugin.ImportWizardForm',
|
translate('SongsPlugin.ImportWizardForm',
|
||||||
'All Files'))
|
'All Files'))
|
||||||
)
|
)
|
||||||
@ -331,10 +331,10 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
|
|||||||
self.getFiles(
|
self.getFiles(
|
||||||
translate('SongsPlugin.ImportWizardForm',
|
translate('SongsPlugin.ImportWizardForm',
|
||||||
'Select Words of Worship Files'),
|
'Select Words of Worship Files'),
|
||||||
self.wordsOfWorshipFileListWidget,
|
self.wordsOfWorshipFileListWidget,
|
||||||
u'%s (*.wsg *.wow-song);;%s (*)'
|
u'%s (*.wsg *.wow-song);;%s (*)'
|
||||||
% (translate('SongsPlugin.ImportWizardForm',
|
% (translate('SongsPlugin.ImportWizardForm',
|
||||||
'Words Of Worship Song Files'),
|
'Words Of Worship Song Files'),
|
||||||
translate('SongsPlugin.ImportWizardForm',
|
translate('SongsPlugin.ImportWizardForm',
|
||||||
'All Files'))
|
'All Files'))
|
||||||
)
|
)
|
||||||
@ -356,10 +356,10 @@ class ImportWizardForm(QtGui.QWizard, Ui_SongImportWizard):
|
|||||||
self.getFiles(
|
self.getFiles(
|
||||||
translate('SongsPlugin.ImportWizardForm',
|
translate('SongsPlugin.ImportWizardForm',
|
||||||
'Select Songs of Fellowship Files'),
|
'Select Songs of Fellowship Files'),
|
||||||
self.songsOfFellowshipFileListWidget,
|
self.songsOfFellowshipFileListWidget,
|
||||||
u'%s (*.rtf);;%s (*)'
|
u'%s (*.rtf);;%s (*)'
|
||||||
% (translate('SongsPlugin.ImportWizardForm',
|
% (translate('SongsPlugin.ImportWizardForm',
|
||||||
'Songs Of Felloship Song Files'),
|
'Songs Of Felloship Song Files'),
|
||||||
translate('SongsPlugin.ImportWizardForm',
|
translate('SongsPlugin.ImportWizardForm',
|
||||||
'All Files'))
|
'All Files'))
|
||||||
)
|
)
|
||||||
|
@ -28,7 +28,6 @@ The :mod:`ewimport` module provides the functionality for importing
|
|||||||
EasyWorship song databases into the current installation database.
|
EasyWorship song databases into the current installation database.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import sys
|
|
||||||
import os
|
import os
|
||||||
import struct
|
import struct
|
||||||
|
|
||||||
@ -192,8 +191,9 @@ class EasyWorshipSongImport(SongImport):
|
|||||||
num_fields)
|
num_fields)
|
||||||
field_names.pop()
|
field_names.pop()
|
||||||
field_descs = []
|
field_descs = []
|
||||||
for i,field_name in enumerate(field_names):
|
for i, field_name in enumerate(field_names):
|
||||||
field_type, field_size = struct.unpack_from('BB', field_info, i * 2)
|
field_type, field_size = struct.unpack_from('BB',
|
||||||
|
field_info, i * 2)
|
||||||
field_descs.append(FieldDescEntry(field_name, field_type,
|
field_descs.append(FieldDescEntry(field_name, field_type,
|
||||||
field_size))
|
field_size))
|
||||||
self.set_record_struct(field_descs)
|
self.set_record_struct(field_descs)
|
||||||
@ -272,7 +272,7 @@ class EasyWorshipSongImport(SongImport):
|
|||||||
return success
|
return success
|
||||||
|
|
||||||
def find_field(self, field_name):
|
def find_field(self, field_name):
|
||||||
return [i for i,x in enumerate(self.field_descs) \
|
return [i for i, x in enumerate(self.field_descs) \
|
||||||
if x.name == field_name][0]
|
if x.name == field_name][0]
|
||||||
|
|
||||||
def set_record_struct(self, field_descs):
|
def set_record_struct(self, field_descs):
|
||||||
@ -331,7 +331,7 @@ class EasyWorshipSongImport(SongImport):
|
|||||||
# Memo or Blob
|
# Memo or Blob
|
||||||
block_start, blob_size = \
|
block_start, blob_size = \
|
||||||
struct.unpack_from('<II', field, len(field)-10)
|
struct.unpack_from('<II', field, len(field)-10)
|
||||||
sub_block = block_start & 0xff;
|
sub_block = block_start & 0xff
|
||||||
block_start &= ~0xff
|
block_start &= ~0xff
|
||||||
self.memo_file.seek(block_start)
|
self.memo_file.seek(block_start)
|
||||||
memo_block_type, = struct.unpack('b', self.memo_file.read(1))
|
memo_block_type, = struct.unpack('b', self.memo_file.read(1))
|
||||||
@ -339,12 +339,12 @@ class EasyWorshipSongImport(SongImport):
|
|||||||
self.memo_file.seek(8, os.SEEK_CUR)
|
self.memo_file.seek(8, os.SEEK_CUR)
|
||||||
elif memo_block_type == 3:
|
elif memo_block_type == 3:
|
||||||
if sub_block > 63:
|
if sub_block > 63:
|
||||||
return u'';
|
return u''
|
||||||
self.memo_file.seek(11 + (5 * sub_block), os.SEEK_CUR)
|
self.memo_file.seek(11 + (5 * sub_block), os.SEEK_CUR)
|
||||||
sub_block_start, = struct.unpack('B', self.memo_file.read(1))
|
sub_block_start, = struct.unpack('B', self.memo_file.read(1))
|
||||||
self.memo_file.seek(block_start + (sub_block_start * 16))
|
self.memo_file.seek(block_start + (sub_block_start * 16))
|
||||||
else:
|
else:
|
||||||
return u'';
|
return u''
|
||||||
return self.memo_file.read(blob_size)
|
return self.memo_file.read(blob_size)
|
||||||
else:
|
else:
|
||||||
return 0
|
return 0
|
||||||
|
@ -31,7 +31,7 @@ from PyQt4 import QtCore, QtGui
|
|||||||
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, Receiver, \
|
from openlp.core.lib import MediaManagerItem, BaseListWithDnD, Receiver, \
|
||||||
ItemCapabilities, translate, check_item_selected
|
ItemCapabilities, translate, check_item_selected
|
||||||
from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \
|
from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \
|
||||||
ImportWizardForm
|
SongImportForm
|
||||||
from openlp.plugins.songs.lib import SongXMLParser
|
from openlp.plugins.songs.lib import SongXMLParser
|
||||||
from openlp.plugins.songs.lib.db import Author, Song
|
from openlp.plugins.songs.lib.db import Author, Song
|
||||||
|
|
||||||
@ -254,7 +254,7 @@ class SongMediaItem(MediaManagerItem):
|
|||||||
|
|
||||||
def onImportClick(self):
|
def onImportClick(self):
|
||||||
if not hasattr(self, u'import_wizard'):
|
if not hasattr(self, u'import_wizard'):
|
||||||
self.import_wizard = ImportWizardForm(self, self.parent)
|
self.import_wizard = SongImportForm(self, self.parent)
|
||||||
self.import_wizard.exec_()
|
self.import_wizard.exec_()
|
||||||
Receiver.send_message(u'songs_load_list')
|
Receiver.send_message(u'songs_load_list')
|
||||||
|
|
||||||
|
@ -29,7 +29,6 @@ The :mod:`songbeamerimport` module provides the functionality for importing
|
|||||||
"""
|
"""
|
||||||
import logging
|
import logging
|
||||||
import os
|
import os
|
||||||
import re
|
|
||||||
import chardet
|
import chardet
|
||||||
import codecs
|
import codecs
|
||||||
|
|
||||||
|
@ -1,423 +0,0 @@
|
|||||||
# -*- coding: utf-8 -*-
|
|
||||||
# vim: autoindent shiftwidth=4 expandtab textwidth=80 tabstop=4 softtabstop=4
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
# OpenLP - Open Source Lyrics Projection #
|
|
||||||
# --------------------------------------------------------------------------- #
|
|
||||||
# Copyright (c) 2008-2010 Raoul Snyman #
|
|
||||||
# Portions copyright (c) 2008-2010 Tim Bentley, Jonathan Corwin, Michael #
|
|
||||||
# Gorven, Scott Guerrieri, Meinert Jordan, Andreas Preikschat, Christian #
|
|
||||||
# Richter, Philip Ridout, Maikel Stuivenberg, Martin Thompson, Jon Tibble, #
|
|
||||||
# Carsten Tinggaard, Frode Woldsund #
|
|
||||||
# --------------------------------------------------------------------------- #
|
|
||||||
# This program is free software; you can redistribute it and/or modify it #
|
|
||||||
# under the terms of the GNU General Public License as published by the Free #
|
|
||||||
# Software Foundation; version 2 of the License. #
|
|
||||||
# #
|
|
||||||
# This program is distributed in the hope that it will be useful, but WITHOUT #
|
|
||||||
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or #
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for #
|
|
||||||
# more details. #
|
|
||||||
# #
|
|
||||||
# You should have received a copy of the GNU General Public License along #
|
|
||||||
# with this program; if not, write to the Free Software Foundation, Inc., 59 #
|
|
||||||
# Temple Place, Suite 330, Boston, MA 02111-1307 USA #
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
import logging
|
|
||||||
|
|
||||||
from types import ListType
|
|
||||||
|
|
||||||
log = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
class SongException(Exception):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class SongTitleError(SongException):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class SongTypeError(SongException):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class SongSlideError(SongException):
|
|
||||||
pass
|
|
||||||
|
|
||||||
class SongFeatureError(SongException):
|
|
||||||
pass
|
|
||||||
|
|
||||||
# TODO: Song: Logging - not all, but enough
|
|
||||||
# TODO: Song: Handle OpenLP2 format
|
|
||||||
# TODO: Song: Import OpenLP1
|
|
||||||
# TODO: Song: Export OpenLP1
|
|
||||||
# TODO: Song: Export Song to CCLI
|
|
||||||
# TODO: Song: Export Song to OpenSong
|
|
||||||
# TODO: Song: Import ChangingSong
|
|
||||||
# TODO: Song: Export ChangingSong
|
|
||||||
|
|
||||||
class Song(object):
|
|
||||||
"""Handling song properties and methods
|
|
||||||
|
|
||||||
handles all conversions between various input and output formats
|
|
||||||
|
|
||||||
CCLI:
|
|
||||||
from_ccli_text_file
|
|
||||||
to_ccli_text_file
|
|
||||||
from_ccli_text_buffer
|
|
||||||
to_ccli_text_buffer
|
|
||||||
|
|
||||||
presentation (screen):
|
|
||||||
get_preview_slide
|
|
||||||
get_render_slide
|
|
||||||
|
|
||||||
openlp1:
|
|
||||||
from_openlp1_lyrics_buffer
|
|
||||||
to_openlp1_lyrics_buffer
|
|
||||||
set_author_list
|
|
||||||
get_author_list
|
|
||||||
|
|
||||||
editing and openlp2:
|
|
||||||
set_*
|
|
||||||
get_*
|
|
||||||
"""
|
|
||||||
|
|
||||||
def __init__(self, songid = 0):
|
|
||||||
"""Initialize song object
|
|
||||||
|
|
||||||
songid -- database id for this song
|
|
||||||
title -- title of the song
|
|
||||||
search_title -- title without punctuation chars
|
|
||||||
author_list -- list of authors
|
|
||||||
song_cclino -- CCLI number for this song
|
|
||||||
copyright -- copyright string
|
|
||||||
show_title -- 0: no show, 1: show
|
|
||||||
show_author_list -- 0: no show, 1: show
|
|
||||||
show_copyright -- 0: no show, 1: show
|
|
||||||
show_song_cclino -- 0: no show, 1: show
|
|
||||||
theme_name -- name of theme or blank
|
|
||||||
category_array -- list of user defined properties (hymn, gospel)
|
|
||||||
song_book -- name of originating book
|
|
||||||
song_number -- number of the song, related to a songbook
|
|
||||||
comments -- free comment
|
|
||||||
verse_order -- presentation order of the slides
|
|
||||||
lyrics -- text format
|
|
||||||
search_lyrics -- lowercase lyrics without punctuation
|
|
||||||
"""
|
|
||||||
self.songid = songid
|
|
||||||
self._reset()
|
|
||||||
|
|
||||||
def _reset(self):
|
|
||||||
"""Reset all song attributes"""
|
|
||||||
self.slideList = []
|
|
||||||
self.set_title(u'BlankSong')
|
|
||||||
self.author_list = None
|
|
||||||
self.song_cclino = ""
|
|
||||||
self.copyright = ""
|
|
||||||
self.show_author_list = 1
|
|
||||||
self.show_copyright = 1
|
|
||||||
self.show_song_cclino = 1
|
|
||||||
self.show_title = 1
|
|
||||||
self.theme_name = ""
|
|
||||||
self.category_array = None
|
|
||||||
self.song_book = ""
|
|
||||||
self.song_number = ""
|
|
||||||
self.comments = ""
|
|
||||||
self.verse_order = ""
|
|
||||||
self.set_lyrics(u'')
|
|
||||||
return
|
|
||||||
|
|
||||||
def _remove_punctuation(self, title):
|
|
||||||
"""Remove the puntuation chars from title
|
|
||||||
|
|
||||||
chars are: .,:;!?&%#/\@`$'|"^~*-
|
|
||||||
"""
|
|
||||||
punctuation = ".,:;!?&%#'\"/\\@`$|^~*-"
|
|
||||||
string = title
|
|
||||||
for char in punctuation:
|
|
||||||
string = string.replace(char, '')
|
|
||||||
return string
|
|
||||||
|
|
||||||
def set_title(self, title):
|
|
||||||
"""Set the song title
|
|
||||||
|
|
||||||
title (string)
|
|
||||||
raises SongTitleError if the title is empty
|
|
||||||
raises SongTitleError if the seach_title is empty
|
|
||||||
"""
|
|
||||||
self.title = title.strip()
|
|
||||||
self.search_title = self._remove_punctuation(title).strip()
|
|
||||||
if len(self.title) < 1:
|
|
||||||
raise SongTitleError(u'The title is empty')
|
|
||||||
if len(self.search_title) < 1:
|
|
||||||
raise SongTitleError(u'The searchable title is empty')
|
|
||||||
|
|
||||||
def from_ccli_text_buffer(self, textList):
|
|
||||||
"""
|
|
||||||
Create song from a list of texts (strings) - CCLI text format expected
|
|
||||||
|
|
||||||
textList (list of strings) -- the song
|
|
||||||
"""
|
|
||||||
self._reset()
|
|
||||||
# extract the following fields
|
|
||||||
# - name
|
|
||||||
# - author
|
|
||||||
# - CCLI no
|
|
||||||
sName = ""
|
|
||||||
sAuthor = ""
|
|
||||||
sCopyright = ""
|
|
||||||
sCcli = ""
|
|
||||||
lastpart = 0
|
|
||||||
lineCount = 0
|
|
||||||
metMisc = False
|
|
||||||
lyrics = []
|
|
||||||
for line in textList:
|
|
||||||
lineCount += 1
|
|
||||||
if lastpart > 0:
|
|
||||||
lastpart += 1
|
|
||||||
if lastpart == 2:
|
|
||||||
sCopyright = line[1:].strip()
|
|
||||||
if lastpart == 3:
|
|
||||||
sAuthor = line
|
|
||||||
elif line.startswith(u'CCLI Song'):
|
|
||||||
sCcli = line[13:].strip()
|
|
||||||
lastpart = 1
|
|
||||||
else:
|
|
||||||
if metMisc:
|
|
||||||
metMisc = False
|
|
||||||
if line.upper().startswith(u'(BRIDGE)'):
|
|
||||||
lyrics.append(u'# Bridge')
|
|
||||||
# otherwise unknown misc keyword
|
|
||||||
elif line.startswith(u'Misc'):
|
|
||||||
metMisc = True
|
|
||||||
elif line.startswith(u'Verse') or line.startswith(u'Chorus'):
|
|
||||||
lyrics.append(u'# %s' % line)
|
|
||||||
else:
|
|
||||||
# should we remove multiple blank lines?
|
|
||||||
if lineCount == 1:
|
|
||||||
sName = line
|
|
||||||
else:
|
|
||||||
lyrics.append(line)
|
|
||||||
# split on known separators
|
|
||||||
lst = sAuthor.split(u'/')
|
|
||||||
if len(lst) < 2:
|
|
||||||
lst = sAuthor.split(u'|')
|
|
||||||
author_list = u', '.join(lst)
|
|
||||||
self.set_title(sName)
|
|
||||||
self.set_author_list(author_list)
|
|
||||||
self.copyright = sCopyright
|
|
||||||
self.ccli_number = sCcli
|
|
||||||
self.set_lyrics(lyrics)
|
|
||||||
|
|
||||||
def from_ccli_text_file(self, textFileName):
|
|
||||||
"""
|
|
||||||
Create song from a list of texts read from given file
|
|
||||||
textFileName -- path to text file
|
|
||||||
"""
|
|
||||||
ccli_file = None
|
|
||||||
try:
|
|
||||||
ccli_file = open(textFileName, 'r')
|
|
||||||
lines = [orgline.rstrip() for orgline in ccli_file]
|
|
||||||
self.from_ccli_text_buffer(lines)
|
|
||||||
except IOError:
|
|
||||||
log.exception(u'Failed to load CCLI text file')
|
|
||||||
finally:
|
|
||||||
if ccli_file:
|
|
||||||
ccli_file.close()
|
|
||||||
|
|
||||||
def _assure_string(self, string_in):
|
|
||||||
"""Force a string is returned"""
|
|
||||||
if string_in is None:
|
|
||||||
string_out = ""
|
|
||||||
else:
|
|
||||||
string_out = unicode(string_in)
|
|
||||||
return string_out
|
|
||||||
|
|
||||||
def _split_to_list(self, aString):
|
|
||||||
"""Split a string into a list - comma separated"""
|
|
||||||
if aString:
|
|
||||||
list = aString.split(u',')
|
|
||||||
res = [item.strip() for item in list]
|
|
||||||
return res
|
|
||||||
|
|
||||||
def _list_to_string(self, strOrList):
|
|
||||||
"""Force a possibly list into a string"""
|
|
||||||
if isinstance(strOrList, basestring):
|
|
||||||
lst = self._split_to_list(strOrList)
|
|
||||||
elif isinstance(strOrList, ListType):
|
|
||||||
lst = strOrList
|
|
||||||
elif strOrList is None:
|
|
||||||
lst = []
|
|
||||||
else:
|
|
||||||
raise SongTypeError(u'Variable not String or List')
|
|
||||||
string = u', '.join(lst)
|
|
||||||
return string
|
|
||||||
|
|
||||||
def get_copyright(self):
|
|
||||||
"""Return copyright info string"""
|
|
||||||
return self._assure_string(self.copyright)
|
|
||||||
|
|
||||||
def get_ccli_number(self):
|
|
||||||
"""Return the songCclino"""
|
|
||||||
return self._assure_string(self.ccli_number)
|
|
||||||
|
|
||||||
def get_theme_name(self):
|
|
||||||
"""Return the theme name for the song"""
|
|
||||||
return self._assure_string(self.theme_name)
|
|
||||||
|
|
||||||
def get_song_book(self):
|
|
||||||
"""Return the song_book (string)"""
|
|
||||||
return self._assure_string(self.song_book)
|
|
||||||
|
|
||||||
def get_song_number(self):
|
|
||||||
"""Return the song_number (string)"""
|
|
||||||
return self._assure_string(self.song_number)
|
|
||||||
|
|
||||||
def get_comments(self):
|
|
||||||
"""Return the comments (string)"""
|
|
||||||
return self._assure_string(self.comments)
|
|
||||||
|
|
||||||
def get_verse_order(self):
|
|
||||||
"""Get the verseOrder (string) - preferably space delimited"""
|
|
||||||
return self._assure_string(self.verse_order)
|
|
||||||
|
|
||||||
def get_author_list(self, asOneString = True):
|
|
||||||
"""Return the list of authors as a string
|
|
||||||
|
|
||||||
``asOneString``
|
|
||||||
If ``True``, returns 'John Newton, A Parker'. If ``False``, returns
|
|
||||||
[u'John Newton', u'A Parker']
|
|
||||||
"""
|
|
||||||
if asOneString:
|
|
||||||
res = self._assure_string(self.author_list)
|
|
||||||
else:
|
|
||||||
res = self._split_to_list(self.author_list)
|
|
||||||
return res
|
|
||||||
|
|
||||||
def set_author_list(self, author_list):
|
|
||||||
"""Set the author_list
|
|
||||||
|
|
||||||
``author_list``
|
|
||||||
a string or list of strings
|
|
||||||
"""
|
|
||||||
if author_list is None:
|
|
||||||
self.author_list = None
|
|
||||||
else:
|
|
||||||
self.author_list = self._list_to_string(author_list)
|
|
||||||
|
|
||||||
def get_category_array(self, asOneString = True):
|
|
||||||
"""Return the list of categories as a string
|
|
||||||
|
|
||||||
``asOneString``
|
|
||||||
If ``True``, returns 'Hymn, Gospel'. If ``False``, returns
|
|
||||||
[u'Hymn', u'Gospel']
|
|
||||||
"""
|
|
||||||
if asOneString:
|
|
||||||
res = self._assure_string(self.category_array)
|
|
||||||
else:
|
|
||||||
res = self._split_to_list(self.category_array)
|
|
||||||
return res
|
|
||||||
|
|
||||||
def set_category_array(self, category_array):
|
|
||||||
"""Set the category_array
|
|
||||||
|
|
||||||
category_array -- a string or list of strings
|
|
||||||
"""
|
|
||||||
if category_array is None:
|
|
||||||
self.category_array = None
|
|
||||||
else:
|
|
||||||
self.category_array = self._list_to_string(category_array)
|
|
||||||
|
|
||||||
def set_lyrics(self, lyrics):
|
|
||||||
"""Set the lyrics as a list of strings"""
|
|
||||||
self.lyrics = lyrics
|
|
||||||
self._parse_lyrics()
|
|
||||||
|
|
||||||
def _parse_lyrics(self):
|
|
||||||
"""Parse lyrics into the slidelist"""
|
|
||||||
# TODO: check font formatting
|
|
||||||
self.slideList = []
|
|
||||||
tmpSlide = []
|
|
||||||
metContent = False
|
|
||||||
for lyric in self.lyrics:
|
|
||||||
if lyric:
|
|
||||||
metContent = True
|
|
||||||
tmpSlide.append(lyric)
|
|
||||||
else:
|
|
||||||
if metContent:
|
|
||||||
metContent = False
|
|
||||||
self.slideList.append(tmpSlide)
|
|
||||||
tmpSlide = []
|
|
||||||
if tmpSlide:
|
|
||||||
self.slideList.append(tmpSlide)
|
|
||||||
|
|
||||||
def get_preview_slide(self, slideNumber):
|
|
||||||
"""Return the preview text for specified slide number
|
|
||||||
|
|
||||||
slideNumber -- 0: all slides, 1..n: specific slide
|
|
||||||
a list of strings are returned
|
|
||||||
"""
|
|
||||||
num = len(self.slideList)
|
|
||||||
if num < 1:
|
|
||||||
raise SongSlideError(u'No slides in this song')
|
|
||||||
elif slideNumber > num:
|
|
||||||
raise SongSlideError(u'Slide number too high')
|
|
||||||
if slideNumber > 0:
|
|
||||||
# return this slide
|
|
||||||
res = self.slideList[slideNumber-1]
|
|
||||||
# find theme in this slide
|
|
||||||
else:
|
|
||||||
res = []
|
|
||||||
for i in range(num):
|
|
||||||
if i > 0:
|
|
||||||
res.append(u'')
|
|
||||||
res.extend()
|
|
||||||
# remove formattingincluding themes
|
|
||||||
return res
|
|
||||||
|
|
||||||
def get_render_slide(self, slideNumber):
|
|
||||||
"""Return the slide to be rendered including the additional
|
|
||||||
properties
|
|
||||||
|
|
||||||
slideNumber -- 1 .. numberOfSlides
|
|
||||||
|
|
||||||
Returns a list as:
|
|
||||||
[theme_name (string),
|
|
||||||
title (string),
|
|
||||||
authorlist (string),
|
|
||||||
copyright (string),
|
|
||||||
cclino (string),
|
|
||||||
lyric-part as a list of strings]
|
|
||||||
"""
|
|
||||||
num = len(self.slideList)
|
|
||||||
if num < 1:
|
|
||||||
raise SongSlideError(u'No slides in this song')
|
|
||||||
elif slideNumber > num:
|
|
||||||
raise SongSlideError(u'Slide number too high')
|
|
||||||
res = []
|
|
||||||
if self.show_title:
|
|
||||||
title = self.title
|
|
||||||
else:
|
|
||||||
title = ""
|
|
||||||
if self.show_author_list:
|
|
||||||
author = self.get_author_list(True)
|
|
||||||
else:
|
|
||||||
author = ""
|
|
||||||
if self.show_copyright:
|
|
||||||
cpright = self.get_copyright()
|
|
||||||
else:
|
|
||||||
cpright = ""
|
|
||||||
if self.show_ccli_number:
|
|
||||||
ccli = self.get_ccli_number()
|
|
||||||
else:
|
|
||||||
ccli = ""
|
|
||||||
theme_name = self.get_theme_name()
|
|
||||||
# examine the slide for a theme
|
|
||||||
res.append(theme_name)
|
|
||||||
res.append(title)
|
|
||||||
res.append(author)
|
|
||||||
res.append(cpright)
|
|
||||||
res.append(ccli)
|
|
||||||
# append the correct slide
|
|
||||||
return res
|
|
||||||
|
|
||||||
__all__ = ['SongException', 'SongTitleError', 'SongSlideError', 'SongTypeError',
|
|
||||||
'SongFeatureError', 'Song']
|
|
@ -6,8 +6,8 @@ Deut,Deuteronomy,Deut
|
|||||||
Josh,Joshua,Josh
|
Josh,Joshua,Josh
|
||||||
Judg,Judges,Judg
|
Judg,Judges,Judg
|
||||||
Ruth,Ruth,Ruth
|
Ruth,Ruth,Ruth
|
||||||
1Sam,1 Samual,1Sam
|
1Sam,1 Samuel,1Sam
|
||||||
2Sam,2 Samual,2Sam
|
2Sam,2 Samuel,2Sam
|
||||||
1Kgs,1 Kings,1Kgs
|
1Kgs,1 Kings,1Kgs
|
||||||
2Kgs,2 Kings,2Kgs
|
2Kgs,2 Kings,2Kgs
|
||||||
1Chr,1 Chronicles,1Chr
|
1Chr,1 Chronicles,1Chr
|
||||||
|