Commit ebfb096a authored by SVN-Git Migration's avatar SVN-Git Migration

Imported Upstream version 2.0.5+ds1

parent ce6f8e9c
......@@ -2,6 +2,127 @@ ChangeLog of Frescobaldi, http://www.frescobaldi.org/
=====================================================
Changes in 2.0.5 -- April 25th, 2012
* Translations:
- updated: fr, nl, es
* New features:
- Regions of text can be collapsed/expanded (View->Folding->Enable Folding)
- Files can be opened in running instance, if enabled in settings
- New document variable: 'output' which can be set to the basename, folder, or
list of names or folders to look for output documents. Overrides the default
behaviour of parsing the document for all the included files and LilyPond
commands that specify the output file name.
- New snippet action to recover changed or deleted built-in snippets
- New snippet action to configure keyboard shortcut without opening editor
- Alt+Up and Alt+Down jump between blank lines (implemented as snippets),
with Shift they select text
- New command in View->Music View and Music View contextmenu: "Original Size"
- Optionally scroll Music View while highlighting objects text cursor is at
- In-place editing by Shift-clicking a note or right-click->Edit in Place
* Improvements:
- Copied images from Music View carry correct DPI information
- Autocomplete also looks for variable definitions in \include files
- Running convert-ly (or undoing it) does not erase point and click positions
anymore
- Saving a template now shows existing template names in a popup and warns
when (but allows) overwriting an existing template
- Much better default background color for the Music View
- When dragging the time slider in a MIDI file, program and controller changes
are followed (issue #26)
- On Windows, better try to find LilyPond even if it is not in the PATH
- Snippet editor warns when closing modified snippet
- Accelerators (the underlined characters) in menus such as Recent Files,
Session and Insert that are are automatically created, are determined in
a smarter way
* Bugfixes:
- fix Ctrl+K deleting a line too much in some cases
- fix RuntimeError on Ctrl+N, Ctrl+F, Ctrl+W
- fix TypeError on running convert-ly with English messages on Windows
* For Linux distribution packagers:
- The CC-licensed zoom-{in,out} icons are now replaced with GPLled ones
Changes in 2.0.4 -- March 7th, 2012
* Translations:
- updated: pl, nl, cs
* New features:
- view->line numbers
- in the documents list, it is now possible to right-click a group of selected
documents (or a directory name, if grouping is enabled), to close or save
multiple documents at once.
- automatic completion in the snippet editor
- python snippets may now define a main() function that can do everything
- new delete-lines snippet, bound by default to Ctrl-K
- splash screen on startup (can be turned off in the preferences)
* Improvements:
- opening many documents (e.g. a large session) is now much faster
- waiting for LilyPond to return information on Settings->Ok now does not
block the user interface anymore and shows progress if it takes some time
- built-in manual now documents settings and session dialog
* Bug fixes:
- fix icon theme index files not in source tarball (regression since 2.0.3)
- fix hyphenation dictionaries not in source tarball
- fixed memory leak (closed documents that had been shown remained in memory)
Changes in 2.0.3 -- February 17th, 2012
* Translations:
- New translation: Brazillian, by Édio Mazera, thanks!
- updated translations: es, fr, it, nl
* New features:
- pager in musicview toolbar
- tools->open command prompt to open a terminal window
* Improvements:
- improved "Comment" snippet; add "Uncomment"
- Home and Shift+Home now move the cursor to the first non-space character
- Shift+Return now does not enter a line separator anymore, which could
cause wrong point and click locations
- blinking rectangle highlights new cursor position on point and click
* Bug fixes:
- fix zooming Music View out while on last page (issue #32)
- changing keyboard shortcuts in preferences now works on Mac OS X
- fix { } or << >> inside lyricmode
- in doc browser, don't display bogus versions when network is inaccessible
* For Linux distribution packagers:
- the bundled Tango icon set is now used as an icon theme, which makes it
possible for distribution packagers to remove the icons/Tango directory and
instead make Frescobaldi depend on the tango-icon-theme package.
Changes in 2.0.2 -- January 16th, 2012
* New features:
- optionally run LilyPond with English (untranslated) messages
- print button in help browser and documentation browser
* Improvements:
- "Manage templates" command added in File->templates menu
- more snippets in Insert menu
- context menu on snippet list
- enlarged some too small icons
- added some more hyphenation dictionaries
- file entry fields (like in preferences) are faster
- on non-X11 platforms the maximized state of the window is remembered
* Bug fixes:
- make terminating LilyPond work under Windows
- make convert-ly work under Windows
- snippet import/export now works in the Windows-installer binary
- PDF now correctly updates when "Save document on compile" is enabled
Changes in 2.0.1 -- January 8th, 2012
* Updated translations: cs, de
* Bug fixes:
- fix accented letters in filenames on Windows
* Improvements:
- some hyphenation dictionaries are now bundled
- font preference for documentation browser
- new self-contained installer for MS Windows
Changes in 2.0.0 -- December 26th, 2011
* Updated translations: fr, nl, es, it, cs
......
......@@ -62,3 +62,31 @@ Optional:
Of course you'll need to install one or more versions of LilyPond!
"Freeze" installer:
===================
The freeze.py script can create a self-contained Windows-installer, bundling all
of Python, PyQt4, popplerqt4 and pypm (from pygame) when used on MS Windows.
To use the script you need cx_Freeze and Inno Setup.
For Linux distribution packagers:
=================================
Frescobaldi contains some files by default which are also available in other
packages often used in Linux distributions. It is possible to remove those
files after installing/packaging and make Frescobaldi depend on the package
containing those files. This makes the filesystem less cluttered, and copyright
files simpler.
Icons:
You can remove the frescobaldi_app/icons/Tango directory, and make Frescobaldi
depend on the tango-icon-theme package instead.
Hyphentation dictionaries:
You can remove the hyph_*.dic files from frescobaldi_app/hyphdicts, and make
Frescobaldi depend on a package that installs hyphenation dictionaries in
/usr/share/hyphen/ (or another dictionary listed by default in frescobaldi_app/
hyphendialog.py).
include README* COPYING THANKS INSTALL TODO ChangeLog
include frescobaldi.desktop
include frescobaldi.pot
include *.py
include frescobaldi-wininst.bmp
recursive-include frescobaldi_app README*
recursive-include frescobaldi_app *.png *.svg *.ico
recursive-include frescobaldi_app *.png *.svg *.ico index.theme
recursive-include frescobaldi_app *.ly *.ily Makefile
recursive-include frescobaldi_app *.po *.mo
recursive-include frescobaldi_app *.pot *.po *.mo
recursive-include frescobaldi_app *.dic
global-exclude *~
......@@ -19,7 +19,7 @@ Features:
- Built-in LilyPond documentation browser and built-in help
- Modern user iterface with configurable colors, fonts and keyboard shortcuts
- Translated into the following languages: Dutch, English, French, German,
Italian, Czech, Russian, Spanish, Galician, Turkish and Polish
Italian, Czech, Russian, Spanish, Galician, Turkish, Polish and Brazillian.
Music functions:
......
......@@ -48,15 +48,15 @@ classes with an ever-growing number of unrelated groups of methods, a different
approach is chosen: the plugin module.
This keeps all classes small and only have methods that direcly apply to
themselves and not to other parts of Frescobaldi.
themselves and not to other parts of Frescobaldi (separation of concerns).
So e.g. the resultfiles, highlighter or documentinfo modules contain classes
for objects that coexist with a Document, and providing their own relevant
methods, while keeping a weak reference to the Document.
Exchange of messages is done as much as possible using signals (PyQt4 signals
or from the signals module), so adding new features changes as less existing
code as possible.
or from the signals module), or event filters, so adding new features changes as
less existing code as possible.
Some important modules:
......@@ -77,7 +77,8 @@ plugin: A simple way to extend objects without them knowing it
ly: LilyPond and the LY file format, tokenizer for LY and related
metainfo: Stores (optionally) meta information about the document, such
as last cursor position, whether to enable auto indent, etc
panels: Both the base class for dock widgets and the manager of them
panel: The base class of all dock widgets
panelmanager: Add new dock widget tools here
symbols: Provides icons of LilyPond-generated SVG files that draw
themselves in the default text color.
......@@ -88,8 +89,10 @@ LilyPond):
qpopplerview: PDF viewer widget using the popplerqt4 binding to Poppler-Qt4
signals: An alternative to Qt signals that allows for connections to have
priorities, and objects don't have to be Qt objects
cachedproperty: Caches properties that can be asynchronously computed
slexer: A Stateful Lexer, used to build regular expression-based parsers
hyphenator: Hyphenate text using hyphenation dictionaries
node: A list-like type to build tree structures with
cursortools: Some useful functions manipulating QTextCursor instances
portmidi: Access the PortMidi library in different ways
midifile: Load and play MIDI files
......
README for developers and translators
=====================================
Frescobaldi is translated using GNU Gettext. The 'update-pot.py' script creates
a POT file from all the Python source files. The POT file is written in the top
directory of the Frescobaldi package as 'frescobaldi.pot'.
Frescobaldi is translated using GNU Gettext.
The PO files live in frescobaldi_app/po/.
The translations (in PO files) and the template file ('frescobaldi.pot') live in
the frescobaldi_app/po directory. The 'update-pot.py' script creates a POT file
from all the Python source files. This script must be run if new translatable
strings are added to Frescobaldi.
For developers:
......@@ -54,11 +55,11 @@ You should create or update a PO file for your language.
If you want to translate Frescobaldi to your current locale, simply enter:
$ cd frescobaldi_app/po/
$ msginit -i ../../frescobaldi.pot
$ msginit -i frescobaldi.pot
otherwise specify the desired language with:
$ msginit -i ../../frescobaldi.pot -l xx_CC
$ msginit -i frescobaldi.pot -l xx_CC
where 'xx_CC' is e.g. 'nl_NL' (or simply 'nl').
......
......@@ -36,6 +36,7 @@ Italian translation:
German translation:
* Henrik Evers
* Georg Hennig
* Markus W. Kropp
Czech translation:
* Pavel Fric
......@@ -46,6 +47,9 @@ Polish translation:
Galician translation:
* Manuel A. Vázquez
Brazillian translation:
* Édio Mazera
Finding lots of bugs:
* Mario Moles
TODO for Frescobaldi 2.x
========================
- Text editor context menu
TODO and wishes for Frescobaldi 2.x
===================================
- LilyPond context help
- wizard to download and unpack LilyPond documentation and/or LilyPond itself
- Edit->Select Block
- Load .ly file specifying other encoding than UTF-8
- interface for running lilypond-book
- Midi input and import. Probably using a basic sequencer, allowing changes,
corrections and quantizing touchups before putting the LilyPond representation
in the editor.
- define and extend api for script snippets
- tool to separate out things from music and attach them to invisible rests (s)
in a separate expression
......@@ -36,4 +35,12 @@ Other ideas/wishes
- play from cursor: plays music to MIDI output
- editor:
* context menu (with help, open filename, etc)
* if matching brace out of view, popup a small display of it (idea:
Franciso Vila)
* vi-mode
- define and extend api for script snippets
#! python
"""
This script generates HTML pages from the built-in Frescobaldi manual,
for publication on the Frescobaldi web site.
Simply run this from the toplevel frescobaldi directory:
python export-help.py
It creates a help/ directory (by default) and puts the HTML and images there.
"""
from __future__ import unicode_literals
import os
import re
import glob
import time
import shutil
### set output directory here:
output_dir = os.path.abspath('help')
### languages to export help pages for:
export_languages = 'C nl es fr it cs'.split()
### HTML templates for every page to be generated:
templates = {
'C': """\
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
<head>
<title>{page_title} - Frescobaldi Project</title>
<link rel="stylesheet" type="text/css" href="/style/1/style.css" />
<link rel="shortcut icon" type="image/png" href="/favicon.png" />
<meta http-equiv="Content-Type" content="application/xhtml+xml;charset=utf-8" />
<meta name="author" content="Wilbert Berendsen" />
<meta name="description" content="Frescobaldi is a LilyPond sheet music editor" />
<meta name="keywords" content="lilypond, music notation, ide" />
</head>
<body>
<div id="header">
<h1>{page_title}</h1>
</div>
<div id="sidebar">
<a accesskey="h" href="/"><u>H</u>ome</a>
<a accesskey="s" href="screenshots"><u>S</u>creenshots</a>
<a accesskey="d" href="download"><u>D</u>ownload</a>
<a accesskey="u" href="uguide" class="selected"><u>U</u>ser Guide</a>
<a accesskey="v" href="development">De<u>v</u>elopment</a>
<a accesskey="l" href="links"><u>L</u>inks</a>
</div>
<div id="maincontents">
<p>(<a href="uguide-1">Frescobaldi 1.x User Guide</a>)</p>
{page_contents}
<address>
{page_address}
</address>
</div>
</body>
</html>
""",
"nl": """\
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="nl" xml:lang="nl">
<head>
<title>{page_title} - Frescobaldi Project</title>
<link rel="stylesheet" type="text/css" href="/style/1/style.css" />
<link rel="shortcut icon" type="image/png" href="/favicon.png" />
<meta http-equiv="Content-Type" content="application/xhtml+xml;charset=utf-8" />
<meta name="author" content="Wilbert Berendsen" />
<meta name="description" content="Frescobaldi is een LilyPond muziek-editor" />
<meta name="keywords" content="lilypond, music notation, ide" />
</head>
<body>
<div id="header">
<h1>{page_title}</h1>
</div>
<div id="sidebar">
<a accesskey="h" href="/"><u>H</u>ome</a>
<a accesskey="s" href="screenshots"><u>S</u>chermafbeeldingen</a>
<a accesskey="d" href="download"><u>D</u>ownloaden</a>
<a accesskey="u" href="uguide" class="selected">Gebr<u>u</u>ikershandleiding</a>
<a accesskey="o" href="development"><u>O</u>ntwikkeling</a>
<a accesskey="l" href="links"><u>L</u>inks</a>
</div>
<div id="maincontents">
<p>(<a href="uguide-1">Frescobaldi 1.x User Guide</a>)</p>
{page_contents}
<address>
{page_address}
</address>
</div>
</body>
</html>
""",
}
import sip
sip.setapi("QString", 2)
sip.setapi("QVariant", 2)
# make directory
if not os.path.isdir(output_dir):
os.makedirs(output_dir)
# copy images
images = []
images_dir = os.path.join(output_dir, 'images')
images_prefix = 'uguide_'
if not os.path.isdir(images_dir):
os.makedirs(images_dir)
for img in glob.glob('frescobaldi_app/help/*.png'):
name = os.path.basename(img)
images.append(name)
shutil.copy(img, os.path.join(images_dir, images_prefix + name))
# regexp to adjust links to images in html
images_re = re.compile(
r'''([Ss][Rr][Cc]\s*=\s*'''
r'''['"])((?:''' + '|'.join(map(re.escape, images)) + r''')['"])''')
# avoid reading settings
os.environ["XDG_CONFIG_HOME"] = ""
# make frescobaldi_app accessible
import frescobaldi_app.toplevel
import po
import help.helpimpl
import help.contents
import language_names
po.install(None)
# create a MainWindow because of the keyboard shortcuts!
import mainwindow
w = mainwindow.MainWindow()
def set_language(lang):
"""Sets the language. If "C", all text is untranslated."""
po.install(None if lang == "C" else po.find(lang))
def make_filename(name, lang):
"""Adds the language name to the filename (which must have an extension)."""
if lang not in ("C", None):
name = name.replace('.', '.' + lang + '.')
return name
def make_page(lang):
"""Makes the HTML user guide for the given language."""
html = []
seen = set()
def add(page, children=None, level=1):
seen.add(page)
html.append(
'<h{1} id="help_{0}"><a name="help_{0}"></a>{2}</h{1}>\n'
.format(page.name, min(5, level+1), page.title()))
html.append(help.helpimpl.markexternal(page.body()))
if page.seealso():
html.append('<p>')
html.append(_("See also:") + " ")
html.append(', '.join(p.link() for p in page.seealso()))
html.append('</p>\n')
for p in children or page.children():
add(p, None, level+1)
set_language(lang)
page = help.contents.contents
# toc at start
children = list(page.children())
children.insert(0, children.pop())
add(page, children)
left = [page for page in help.helpimpl.all_pages.values()
if page not in seen and page.name not in ('nohelp', 'page')]
# add pages not in the toc structure
if left:
html.append('\n\n<hr />\n\n')
for page in left:
add(page, None, 2)
html = ''.join(html)
# make image links work
html = images_re.sub(
lambda m: m.group(1) + 'images/' + images_prefix + m.group(2), html)
# make help links work
html = html.replace('<a href="help:', '<a href="#help_')
others = []
for l in export_languages:
if l is not lang:
others.append('<a href="{0}">{1}</a>'.format(
make_filename('uguide.html', l),
"English" if l == "C" else language_names.languageName(l, l),
))
footer = ', '.join(others)
footer += ' | '
footer += _("Last Modified: {date}").format(date=time.strftime('%d %b %Y'))
html = templates.get(lang, templates['C']).format(
page_title = _("Frescobaldi Manual"),
page_contents = html,
page_address = footer)
filename = os.path.join(output_dir, make_filename('uguide.html', lang))
print 'Exporting to:', filename
with open(filename, 'w') as f:
f.write(html.encode('utf-8'))
for lang in export_languages:
make_page(lang)
#! python
# This script freezes Frescobaldi to a standalone application without
# needing to install any dependencies.
#
# Usage:
# C:\Python27\Python freeze.py
#
# How it works:
# It creates, using cx_Freeze, a frescobaldi executable inside the frozen/
# directory, along with all used (manually specified) Python modules.
# Then the whole frescobaldi_app directory is copied and the Python scripts
# byte-compiled.
# Finally, an installer is created using the Inno Setup console-mode compiler.
# the Inno Setup console-mode compiler
iscc = 'c:\\Program Files\\Inno Setup 5\\ISCC'
# where to build the frozen program folder
target_dir = 'frozen'
# import standard modules and cx_Freeze
import imp
import os
import py_compile
import shutil
import subprocess
import sys
from cx_Freeze import Executable, Freezer
# access meta-information such as version, etc.