From ac440d9185892d1d22d7606d5a6eceae093098aa Mon Sep 17 00:00:00 2001 From: Jonathan Corwin Date: Sat, 8 Dec 2012 21:18:45 +0000 Subject: [PATCH 1/4] Fix sorting in song export --- openlp/plugins/songs/forms/songexportform.py | 7 ++-- openlp/plugins/songs/lib/__init__.py | 38 +++++++++++++++++- openlp/plugins/songs/lib/mediaitem.py | 41 +------------------- 3 files changed, 41 insertions(+), 45 deletions(-) diff --git a/openlp/plugins/songs/forms/songexportform.py b/openlp/plugins/songs/forms/songexportform.py index 52d63e964..4bdf3a700 100644 --- a/openlp/plugins/songs/forms/songexportform.py +++ b/openlp/plugins/songs/forms/songexportform.py @@ -34,11 +34,11 @@ import logging from PyQt4 import QtCore, QtGui -from openlp.core.lib import build_icon, Receiver, SettingsManager, translate, \ +from openlp.core.lib import build_icon, Receiver, translate, \ create_separated_list from openlp.core.lib.ui import UiStrings, critical_error_message_box from openlp.core.ui.wizard import OpenLPWizard, WizardStrings -from openlp.core.utils import locale_direct_compare +from openlp.plugins.songs.lib import natcmp from openlp.plugins.songs.lib.db import Song from openlp.plugins.songs.lib.openlyricsexport import OpenLyricsExport @@ -253,8 +253,7 @@ class SongExportForm(OpenLPWizard): # Load the list of songs. Receiver.send_message(u'cursor_busy') songs = self.plugin.manager.get_all_objects(Song) - songs.sort( - cmp=locale_direct_compare, key=lambda song: song.sort_string) + songs.sort(cmp=natcmp, key=lambda song: song.sort_key) for song in songs: # No need to export temporary songs. if song.temporary: diff --git a/openlp/plugins/songs/lib/__init__.py b/openlp/plugins/songs/lib/__init__.py index 67a6cd80a..14bd99a0e 100644 --- a/openlp/plugins/songs/lib/__init__.py +++ b/openlp/plugins/songs/lib/__init__.py @@ -28,10 +28,10 @@ ############################################################################### import re -from PyQt4 import QtGui +from PyQt4 import QtGui, QtCore from openlp.core.lib import translate -from openlp.core.utils import CONTROL_CHARS +from openlp.core.utils import CONTROL_CHARS, locale_direct_compare from db import Author from ui import SongStrings @@ -594,6 +594,40 @@ def strip_rtf(text, default_encoding=None): text = u''.join(out) return text, default_encoding +def natcmp(a, b): + """ + Natural string comparison which mimics the behaviour of Python's internal + cmp function. + """ + if len(a) <= len(b): + for i, key in enumerate(a): + if isinstance(key, int) and isinstance(b[i], int): + result = cmp(key, b[i]) + elif isinstance(key, int) and not isinstance(b[i], int): + result = locale_direct_compare(QtCore.QString(str(key)), b[i]) + elif not isinstance(key, int) and isinstance(b[i], int): + result = locale_direct_compare(key, QtCore.QString(str(b[i]))) + else: + result = locale_direct_compare(key, b[i]) + if result != 0: + return result + if len(a) == len(b): + return 0 + else: + return -1 + else: + for i, key in enumerate(b): + if isinstance(a[i], int) and isinstance(key, int): + result = cmp(a[i], key) + elif isinstance(a[i], int) and not isinstance(key, int): + result = locale_direct_compare(QtCore.QString(str(a[i])), key) + elif not isinstance(a[i], int) and isinstance(key, int): + result = locale_direct_compare(a[i], QtCore.QString(str(key))) + else: + result = locale_direct_compare(a[i], key) + if result != 0: + return result + return 1 from xml import OpenLyrics, SongXML from songstab import SongsTab diff --git a/openlp/plugins/songs/lib/mediaitem.py b/openlp/plugins/songs/lib/mediaitem.py index cb6933b6f..63a25c855 100644 --- a/openlp/plugins/songs/lib/mediaitem.py +++ b/openlp/plugins/songs/lib/mediaitem.py @@ -40,54 +40,17 @@ from openlp.core.lib import MediaManagerItem, Receiver, ItemCapabilities, \ check_directory_exists from openlp.core.lib.ui import UiStrings, create_widget_action from openlp.core.lib.settings import Settings -from openlp.core.utils import AppLocation, locale_direct_compare +from openlp.core.utils import AppLocation from openlp.plugins.songs.forms import EditSongForm, SongMaintenanceForm, \ SongImportForm, SongExportForm from openlp.plugins.songs.lib import OpenLyrics, SongXML, VerseType, \ - clean_string + clean_string, natcmp from openlp.plugins.songs.lib.db import Author, Song, Book, MediaFile from openlp.plugins.songs.lib.ui import SongStrings log = logging.getLogger(__name__) -def natcmp(a, b): - """ - Natural string comparison which mimics the behaviour of Python's internal - cmp function. - """ - log.debug('a: %s; b: %s', a, b) - if len(a) <= len(b): - for i, key in enumerate(a): - if isinstance(key, int) and isinstance(b[i], int): - result = cmp(key, b[i]) - elif isinstance(key, int) and not isinstance(b[i], int): - result = locale_direct_compare(QtCore.QString(str(key)), b[i]) - elif not isinstance(key, int) and isinstance(b[i], int): - result = locale_direct_compare(key, QtCore.QString(str(b[i]))) - else: - result = locale_direct_compare(key, b[i]) - if result != 0: - return result - if len(a) == len(b): - return 0 - else: - return -1 - else: - for i, key in enumerate(b): - if isinstance(a[i], int) and isinstance(key, int): - result = cmp(a[i], key) - elif isinstance(a[i], int) and not isinstance(key, int): - result = locale_direct_compare(QtCore.QString(str(a[i])), key) - elif not isinstance(a[i], int) and isinstance(key, int): - result = locale_direct_compare(a[i], QtCore.QString(str(key))) - else: - result = locale_direct_compare(a[i], key) - if result != 0: - return result - return 1 - - class SongSearch(object): """ An enumeration for song search methods. From 3a7cc40e4dc75351870b4313419b6cd2baabf3e5 Mon Sep 17 00:00:00 2001 From: M2j Date: Wed, 19 Dec 2012 14:07:24 +0100 Subject: [PATCH 2/4] fix wrong argument names in create_button method call --- openlp/plugins/custom/forms/editcustomdialog.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/plugins/custom/forms/editcustomdialog.py b/openlp/plugins/custom/forms/editcustomdialog.py index a9eba86c0..f91717a06 100644 --- a/openlp/plugins/custom/forms/editcustomdialog.py +++ b/openlp/plugins/custom/forms/editcustomdialog.py @@ -74,9 +74,9 @@ class Ui_CustomEditDialog(object): self.buttonLayout.addWidget(self.deleteButton) self.buttonLayout.addStretch() self.upButton = create_button(customEditDialog, u'upButton', role=u'up', - enable=False, click=customEditDialog.onUpButtonClicked) + enabled=False, click=customEditDialog.onUpButtonClicked) self.downButton = create_button(customEditDialog, u'downButton', - role=u'down', enable=False, + role=u'down', enabled=False, click=customEditDialog.onDownButtonClicked) self.buttonLayout.addWidget(self.upButton) self.buttonLayout.addWidget(self.downButton) From e7787ddd2dc24b6423e3e2ad3beb8096a77b2b28 Mon Sep 17 00:00:00 2001 From: Arjan Schrijver Date: Wed, 19 Dec 2012 17:26:53 +0100 Subject: [PATCH 3/4] fixed bug #1092121 'Interface unusable when run on XFce' Fixes: https://launchpad.net/bugs/1092121 --- openlp/core/ui/advancedtab.py | 3 +++ openlp/core/ui/maindisplay.py | 3 +++ 2 files changed, 6 insertions(+) diff --git a/openlp/core/ui/advancedtab.py b/openlp/core/ui/advancedtab.py index 93c8f4999..361baa5cb 100644 --- a/openlp/core/ui/advancedtab.py +++ b/openlp/core/ui/advancedtab.py @@ -490,6 +490,9 @@ class AdvancedTab(SettingsTab): # Default to False on Gnome. x11_bypass_default = bool(not os.environ.get(u'GNOME_DESKTOP_SESSION_ID')) + # Default to False on XFce + if os.environ.get(u'DESKTOP_SESSION') == 'xfce': + x11_bypass_default = False self.x11BypassCheckBox.setChecked(settings.value( u'x11 bypass wm', QtCore.QVariant(x11_bypass_default)).toBool()) self.defaultColor = settings.value(u'default color', diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 16ee19161..69b210e84 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -143,6 +143,9 @@ class MainDisplay(Display): # Default to False on Gnome. x11_bypass_default = bool(not os.environ.get(u'GNOME_DESKTOP_SESSION_ID')) + # Default to False on XFce + if os.environ.get(u'DESKTOP_SESSION') == 'xfce': + x11_bypass_default = False if Settings().value(u'advanced/x11 bypass wm', QtCore.QVariant(x11_bypass_default)).toBool(): windowFlags |= QtCore.Qt.X11BypassWindowManagerHint From e574466ebb0298c2117f9f80d2220dc927ec5f87 Mon Sep 17 00:00:00 2001 From: Arjan Schrijver Date: Thu, 20 Dec 2012 09:05:25 +0100 Subject: [PATCH 4/4] use unicode strings --- openlp/core/ui/advancedtab.py | 2 +- openlp/core/ui/maindisplay.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/openlp/core/ui/advancedtab.py b/openlp/core/ui/advancedtab.py index 361baa5cb..54bb69496 100644 --- a/openlp/core/ui/advancedtab.py +++ b/openlp/core/ui/advancedtab.py @@ -491,7 +491,7 @@ class AdvancedTab(SettingsTab): x11_bypass_default = bool(not os.environ.get(u'GNOME_DESKTOP_SESSION_ID')) # Default to False on XFce - if os.environ.get(u'DESKTOP_SESSION') == 'xfce': + if os.environ.get(u'DESKTOP_SESSION') == u'xfce': x11_bypass_default = False self.x11BypassCheckBox.setChecked(settings.value( u'x11 bypass wm', QtCore.QVariant(x11_bypass_default)).toBool()) diff --git a/openlp/core/ui/maindisplay.py b/openlp/core/ui/maindisplay.py index 69b210e84..eb0c3911b 100644 --- a/openlp/core/ui/maindisplay.py +++ b/openlp/core/ui/maindisplay.py @@ -144,7 +144,7 @@ class MainDisplay(Display): x11_bypass_default = bool(not os.environ.get(u'GNOME_DESKTOP_SESSION_ID')) # Default to False on XFce - if os.environ.get(u'DESKTOP_SESSION') == 'xfce': + if os.environ.get(u'DESKTOP_SESSION') == u'xfce': x11_bypass_default = False if Settings().value(u'advanced/x11 bypass wm', QtCore.QVariant(x11_bypass_default)).toBool():