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'),
|
||||||
]
|
]
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
.. _plugins-images:
|
||||||
|
|
||||||
|
Images Plugin
|
||||||
|
=============
|
||||||
|
|
||||||
|
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:
|
|
@ -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."
|
|
@ -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
|
|
@ -0,0 +1,202 @@
|
||||||
|
# -*- 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
|
|
@ -0,0 +1,127 @@
|
||||||
|
==================
|
||||||
|
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 FN
|
||||||
|
key and another key is required to enable the second monitor on laptops.
|
||||||
|
|
||||||
|
Some computers also incorporate the use of S-Video or HDMI 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 the **Windows key and tap P**.
|
||||||
|
|
||||||
|
The more traditional way is also fairly straight forward. Go to the control
|
||||||
|
panel and click on display. This will open up the Display options. You can
|
||||||
|
also bypass this step by right click on a blank area on your desktop and
|
||||||
|
selecting **resolution**.
|
||||||
|
|
||||||
|
.. image:: pics/winsevendisplay.png
|
||||||
|
|
||||||
|
Then click on the Screen Resolution from the left pane.
|
||||||
|
|
||||||
|
.. image:: pics/winsevenresolution.png
|
||||||
|
|
||||||
|
Then enable your projector and ensure your desktop is extended.
|
||||||
|
|
||||||
|
Windows Vista
|
||||||
|
^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
From the control panel click on personalize, or right click a blank place on
|
||||||
|
the desktop and click personalization.
|
||||||
|
|
||||||
|
.. image:: pics/vistapersonalize.png
|
||||||
|
|
||||||
|
From the **Personalization** window click on Display Settings.
|
||||||
|
|
||||||
|
.. image:: pics/vistadisplaysettings.png
|
||||||
|
|
||||||
|
Then enable the montior that represents your projector an make sure your
|
||||||
|
you have checked Extend the desktop.
|
||||||
|
|
||||||
|
Windows XP
|
||||||
|
^^^^^^^^^^
|
||||||
|
|
||||||
|
From the control panel select Display, or right click on a blank area of the
|
||||||
|
desktop and select properties. From the properties window click on the settings
|
||||||
|
tab.
|
||||||
|
|
||||||
|
.. image:: pics/xpdisplaysettings.png
|
||||||
|
|
||||||
|
Then enable the monitor that represents your projector an make sure your
|
||||||
|
you have checked Extend the desktop.
|
||||||
|
|
||||||
|
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 System --> Preferences --> Display Settings (Monitors)
|
||||||
|
|
||||||
|
.. image:: pics/gnome.png
|
||||||
|
|
||||||
|
Setup your projector with the correct resolution and make sure you do **not**
|
||||||
|
have mirrored desktop enabled (same image on all monitors).
|
||||||
|
|
||||||
|
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 **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.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
==================
|
==================
|
After Width: | Height: | Size: 19 KiB |
After Width: | Height: | Size: 33 KiB |
After Width: | Height: | Size: 64 KiB |
After Width: | Height: | Size: 112 KiB |
After Width: | Height: | Size: 123 KiB |
After Width: | Height: | Size: 104 KiB |
After Width: | Height: | Size: 22 KiB |
After Width: | Height: | Size: 18 KiB |
After Width: | Height: | Size: 90 KiB |
After Width: | Height: | Size: 31 KiB |
After Width: | Height: | Size: 7.2 KiB |
After Width: | Height: | Size: 51 KiB |
After Width: | Height: | Size: 139 KiB |
After Width: | Height: | Size: 155 KiB |
After Width: | Height: | Size: 141 KiB |
After Width: | Height: | Size: 24 KiB |
|
@ -1,8 +0,0 @@
|
||||||
.. _plugins-images:
|
|
||||||
|
|
||||||
Images Plugin
|
|
||||||
=============
|
|
||||||
|
|
||||||
.. automodule:: openlp.plugins.images
|
|
||||||
: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):
|
||||||
|
|
|
@ -399,6 +399,6 @@ class ServiceItem(object):
|
||||||
|
|
||||||
def get_frame_path(self, row=0):
|
def get_frame_path(self, row=0):
|
||||||
"""
|
"""
|
||||||
Returns the title of the raw frame
|
Returns the path of the raw frame
|
||||||
"""
|
"""
|
||||||
return self._raw_frames[row][u'path']
|
return self._raw_frames[row][u'path']
|
||||||
|
|
|
@ -184,7 +184,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 +199,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 +219,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,7 +230,7 @@ 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(),
|
image = resize_image(image, self.screen[u'size'].width(),
|
||||||
self.screen[u'size'].height())
|
self.screen[u'size'].height())
|
||||||
self.resetVideo()
|
self.resetVideo()
|
||||||
|
|
|
@ -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,8 @@ 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))
|
label.setPixmap(QtGui.QPixmap.fromImage(frame[u'image']))
|
||||||
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 +982,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
|
||||||
|
@ -999,4 +996,3 @@ class SlideController(QtGui.QWidget):
|
||||||
self.video.hide()
|
self.video.hide()
|
||||||
self.SlidePreview.clear()
|
self.SlidePreview.clear()
|
||||||
self.SlidePreview.show()
|
self.SlidePreview.show()
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -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):
|
||||||
|
|
|
@ -53,6 +53,9 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog):
|
||||||
QtCore.QObject.connect(self.verseTextEdit,
|
QtCore.QObject.connect(self.verseTextEdit,
|
||||||
QtCore.SIGNAL(u'cursorPositionChanged()'),
|
QtCore.SIGNAL(u'cursorPositionChanged()'),
|
||||||
self.onCursorPositionChanged)
|
self.onCursorPositionChanged)
|
||||||
|
QtCore.QObject.connect(self.verseTypeComboBox,
|
||||||
|
QtCore.SIGNAL(u'currentIndexChanged(int)'),
|
||||||
|
self.onVerseTypeComboBoxChanged)
|
||||||
self.verse_regex = re.compile(r'---\[([-\w]+):([\d]+)\]---')
|
self.verse_regex = re.compile(r'---\[([-\w]+):([\d]+)\]---')
|
||||||
|
|
||||||
def contextMenu(self, point):
|
def contextMenu(self, point):
|
||||||
|
@ -71,6 +74,33 @@ class EditVerseForm(QtGui.QDialog, Ui_EditVerseDialog):
|
||||||
self.insertVerse(VerseType.to_string(verse_type),
|
self.insertVerse(VerseType.to_string(verse_type),
|
||||||
self.verseNumberBox.value())
|
self.verseNumberBox.value())
|
||||||
|
|
||||||
|
def onVerseTypeComboBoxChanged(self):
|
||||||
|
"""
|
||||||
|
Adjusts the verse number SpinBox in regard to the selected verse type
|
||||||
|
and the cursor's position.
|
||||||
|
"""
|
||||||
|
position = self.verseTextEdit.textCursor().position()
|
||||||
|
text = unicode(self.verseTextEdit.toPlainText())
|
||||||
|
verse_type = VerseType.to_string(self.verseTypeComboBox.currentIndex())
|
||||||
|
if not text:
|
||||||
|
return
|
||||||
|
position = text.rfind(u'---[%s' % verse_type, 0, position)
|
||||||
|
if position == -1:
|
||||||
|
self.verseNumberBox.setValue(1)
|
||||||
|
return
|
||||||
|
text = text[position:]
|
||||||
|
position = text.find(u']---')
|
||||||
|
if position == -1:
|
||||||
|
return
|
||||||
|
text = text[:position + 4]
|
||||||
|
match = self.verse_regex.match(text)
|
||||||
|
if match:
|
||||||
|
verse_type = match.group(1)
|
||||||
|
verse_number = int(match.group(2))
|
||||||
|
verse_type_index = VerseType.from_string(verse_type)
|
||||||
|
if verse_type_index is not None:
|
||||||
|
self.verseNumberBox.setValue(verse_number)
|
||||||
|
|
||||||
def onCursorPositionChanged(self):
|
def onCursorPositionChanged(self):
|
||||||
"""
|
"""
|
||||||
Determines the previous verse type and number in regard to the cursor's
|
Determines the previous verse type and number in regard to the cursor's
|
||||||
|
|
|
@ -35,7 +35,7 @@ import struct
|
||||||
from openlp.core.lib import translate
|
from openlp.core.lib import translate
|
||||||
from songimport import SongImport
|
from songimport import SongImport
|
||||||
|
|
||||||
def strip_rtf(blob):
|
def strip_rtf(blob, encoding):
|
||||||
depth = 0
|
depth = 0
|
||||||
control = False
|
control = False
|
||||||
clear_text = []
|
clear_text = []
|
||||||
|
@ -69,12 +69,42 @@ def strip_rtf(blob):
|
||||||
if control_str == 'par' or control_str == 'line':
|
if control_str == 'par' or control_str == 'line':
|
||||||
clear_text.append(u'\n')
|
clear_text.append(u'\n')
|
||||||
elif control_str == 'tab':
|
elif control_str == 'tab':
|
||||||
clear_text.append(u'\n')
|
clear_text.append(u'\t')
|
||||||
|
# Prefer the encoding specified by the RTF data to that
|
||||||
|
# specified by the Paradox table header
|
||||||
|
# West European encoding
|
||||||
|
elif control_str == 'fcharset0':
|
||||||
|
encoding = u'cp1252'
|
||||||
|
# Greek encoding
|
||||||
|
elif control_str == 'fcharset161':
|
||||||
|
encoding = u'cp1253'
|
||||||
|
# Turkish encoding
|
||||||
|
elif control_str == 'fcharset162':
|
||||||
|
encoding = u'cp1254'
|
||||||
|
# Vietnamese encoding
|
||||||
|
elif control_str == 'fcharset163':
|
||||||
|
encoding = u'cp1258'
|
||||||
|
# Hebrew encoding
|
||||||
|
elif control_str == 'fcharset177':
|
||||||
|
encoding = u'cp1255'
|
||||||
|
# Arabic encoding
|
||||||
|
elif control_str == 'fcharset178':
|
||||||
|
encoding = u'cp1256'
|
||||||
|
# Baltic encoding
|
||||||
|
elif control_str == 'fcharset186':
|
||||||
|
encoding = u'cp1257'
|
||||||
|
# Cyrillic encoding
|
||||||
|
elif control_str == 'fcharset204':
|
||||||
|
encoding = u'cp1251'
|
||||||
|
# Thai encoding
|
||||||
|
elif control_str == 'fcharset222':
|
||||||
|
encoding = u'cp874'
|
||||||
|
# Central+East European encoding
|
||||||
|
elif control_str == 'fcharset238':
|
||||||
|
encoding = u'cp1250'
|
||||||
elif control_str[0] == '\'':
|
elif control_str[0] == '\'':
|
||||||
# Really should take RTF character set into account but
|
|
||||||
# for now assume ANSI (Windows-1252) and call it good
|
|
||||||
s = chr(int(control_str[1:3], 16))
|
s = chr(int(control_str[1:3], 16))
|
||||||
clear_text.append(s.decode(u'windows-1252'))
|
clear_text.append(s.decode(encoding))
|
||||||
del control_word[:]
|
del control_word[:]
|
||||||
if c == '\\' and new_control:
|
if c == '\\' and new_control:
|
||||||
control = True
|
control = True
|
||||||
|
@ -126,6 +156,30 @@ class EasyWorshipSongImport(SongImport):
|
||||||
db_file.close()
|
db_file.close()
|
||||||
self.memo_file.close()
|
self.memo_file.close()
|
||||||
return False
|
return False
|
||||||
|
# Take a stab at how text is encoded
|
||||||
|
self.encoding = u'cp1252'
|
||||||
|
db_file.seek(106)
|
||||||
|
code_page, = struct.unpack('<h', db_file.read(2))
|
||||||
|
if code_page == 852:
|
||||||
|
self.encoding = u'cp1250'
|
||||||
|
# The following codepage to actual encoding mappings have not been
|
||||||
|
# observed, but merely guessed. Actual example files are needed.
|
||||||
|
#if code_page == 737:
|
||||||
|
# self.encoding = u'cp1253'
|
||||||
|
#if code_page == 775:
|
||||||
|
# self.encoding = u'cp1257'
|
||||||
|
#if code_page == 855:
|
||||||
|
# self.encoding = u'cp1251'
|
||||||
|
#if code_page == 857:
|
||||||
|
# self.encoding = u'cp1254'
|
||||||
|
#if code_page == 866:
|
||||||
|
# self.encoding = u'cp1251'
|
||||||
|
#if code_page == 869:
|
||||||
|
# self.encoding = u'cp1253'
|
||||||
|
#if code_page == 862:
|
||||||
|
# self.encoding = u'cp1255'
|
||||||
|
#if code_page == 874:
|
||||||
|
# self.encoding = u'cp874'
|
||||||
# There does not appear to be a _reliable_ way of getting the number
|
# There does not appear to be a _reliable_ way of getting the number
|
||||||
# of songs/records, so let's use file blocks for measuring progress.
|
# of songs/records, so let's use file blocks for measuring progress.
|
||||||
total_blocks = (db_size - header_size) / (block_size * 1024)
|
total_blocks = (db_size - header_size) / (block_size * 1024)
|
||||||
|
@ -204,7 +258,7 @@ class EasyWorshipSongImport(SongImport):
|
||||||
self.add_author(author_name.strip())
|
self.add_author(author_name.strip())
|
||||||
if words:
|
if words:
|
||||||
# Format the lyrics
|
# Format the lyrics
|
||||||
words = strip_rtf(words)
|
words = strip_rtf(words, self.encoding)
|
||||||
for verse in words.split(u'\n\n'):
|
for verse in words.split(u'\n\n'):
|
||||||
self.add_verse(verse.strip(), u'V')
|
self.add_verse(verse.strip(), u'V')
|
||||||
if self.stop_import_flag:
|
if self.stop_import_flag:
|
||||||
|
@ -263,7 +317,7 @@ class EasyWorshipSongImport(SongImport):
|
||||||
# Format the field depending on the field type
|
# Format the field depending on the field type
|
||||||
if field_desc.type == 1:
|
if field_desc.type == 1:
|
||||||
# string
|
# string
|
||||||
return field.rstrip('\0').decode(u'windows-1252')
|
return field.rstrip('\0').decode(self.encoding)
|
||||||
elif field_desc.type == 3:
|
elif field_desc.type == 3:
|
||||||
# 16-bit int
|
# 16-bit int
|
||||||
return field ^ 0x8000
|
return field ^ 0x8000
|
||||||
|
|
|
@ -127,11 +127,10 @@ class SongBeamerImport(SongImport):
|
||||||
self.import_wizard.incrementProgressBar(
|
self.import_wizard.incrementProgressBar(
|
||||||
"Importing %s" % (self.file_name))
|
"Importing %s" % (self.file_name))
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def parse_tags(self, line):
|
def parse_tags(self, line):
|
||||||
tag_val = line.split('=')
|
tag_val = line.split('=')
|
||||||
if len(tag_val[0]) == 0 or \
|
if len(tag_val[0]) == 0 or len(tag_val[1]) == 0:
|
||||||
len(tag_val[1]) == 0:
|
|
||||||
return True
|
return True
|
||||||
if tag_val[0] == '#(c)':
|
if tag_val[0] == '#(c)':
|
||||||
self.add_copyright(tag_val[1])
|
self.add_copyright(tag_val[1])
|
||||||
|
@ -225,11 +224,10 @@ class SongBeamerImport(SongImport):
|
||||||
else:
|
else:
|
||||||
pass
|
pass
|
||||||
return True
|
return True
|
||||||
|
|
||||||
def check_verse_marks(self, line):
|
def check_verse_marks(self, line):
|
||||||
marks = line.split(' ')
|
marks = line.split(' ')
|
||||||
if len(marks) <= 2 and \
|
if len(marks) <= 2 and marks[0] in SongBeamerTypes.MarkTypes:
|
||||||
marks[0] in SongBeamerTypes.MarkTypes:
|
|
||||||
self.current_verse_type = SongBeamerTypes.MarkTypes[marks[0]]
|
self.current_verse_type = SongBeamerTypes.MarkTypes[marks[0]]
|
||||||
if len(marks) == 2:
|
if len(marks) == 2:
|
||||||
#TODO: may check, because of only digits are allowed
|
#TODO: may check, because of only digits are allowed
|
||||||
|
|