Andreas Preikschat has proposed merging lp:~googol/openlp/bug-827862 into
lp:openlp.
Requested reviews:
OpenLP Core (openlp-core)
Related bugs:
Bug #827862 in OpenLP: "Add Shortcut to change verse, chorus, ... in the
(live) controller"
https://bugs.launchpad.net/openlp/+bug/827862
For more details, see:
https://code.launchpad.net/~googol/openlp/bug-827862/+merge/80783
Hello,
- fixed bug #827862 (Add Shortcut to change verse, chorus, ... in the live
controller)
What exactly can yo do?
You can navigate/jump to any (!) slide in the slidecontrollers. In other words
you can navigate/jump to aother bible verse slide, presentation slide, image or
song verse. There is no limitation (e. g. you can also go from bible verse
slide 1 to slide 12.
How does it not work?
This does not use traditional shortcuts (shortcut = press one or more keys at
the same time).
Why does it work this way?
Shortcuts are limited. E. g. you cannot have "v+1" as shortcut. You can have
"v" or "1" as shortcut.
How does it work?
Imagine you want to jump to slide "v3". What do you do? First you press "v" and
then you press "4". But you have to be fast enough. (This might sound stupid to
you and you might want to criticise this, but remember that if we were using
shortcuts you had to press them at the same time.)
Unfortunately this adds an import from plugins to core. Also it adds plugin
specific shortcuts to core. I actually moved some code to the songs plugin, but
then decided that this is wrong as well. The reason is quite simple: Core has
to be able to display a song (from the service manager) even when the songs
plugin is disabled. (Note, when you have a service file with English Verse
Names, because the service file comes from an English OpenLP instance then this
will not work on a German OpenLP instance, because the verse names are not
translated!) Thus it is not plugin specific, but core. However, I made sure
that core won't break if the songs plugin is not available.
--
https://code.launchpad.net/~googol/openlp/bug-827862/+merge/80783
Your team OpenLP Core is requested to review the proposed merge of
lp:~googol/openlp/bug-827862 into lp:openlp.
=== modified file 'openlp/core/ui/slidecontroller.py'
--- openlp/core/ui/slidecontroller.py 2011-10-22 11:09:01 +0000
+++ openlp/core/ui/slidecontroller.py 2011-10-31 09:17:27 +0000
@@ -321,6 +321,94 @@
self.slidePreview.setObjectName(u'slidePreview')
self.slideLayout.insertWidget(0, self.slidePreview)
self.grid.addLayout(self.slideLayout, 0, 0, 1, 1)
+ if self.isLive:
+ self.current_shortcut = u''
+ self.shortcutTimer = QtCore.QTimer()
+ self.shortcutTimer.setObjectName(u'shortcutTimer')
+ self.shortcutTimer.setSingleShot(True)
+ self.verseShortcut = shortcut_action(self, u'verseShortcut',
+ [QtGui.QKeySequence(u'V')], self.slideShortcutActivated,
+ category=UiStrings().LiveToolbar,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.verseShortcut.setText(translate(
+ 'OpenLP.SlideController', 'Go to "Verse"'))
+ self.shortcut0 = shortcut_action(self, u'0',
+ [QtGui.QKeySequence(u'0')], self.slideShortcutActivated,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.shortcut1 = shortcut_action(self, u'1',
+ [QtGui.QKeySequence(u'1')], self.slideShortcutActivated,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.shortcut2 = shortcut_action(self, u'2',
+ [QtGui.QKeySequence(u'2')], self.slideShortcutActivated,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.shortcut3 = shortcut_action(self, u'3',
+ [QtGui.QKeySequence(u'3')], self.slideShortcutActivated,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.shortcut4 = shortcut_action(self, u'4',
+ [QtGui.QKeySequence(u'4')], self.slideShortcutActivated,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.shortcut5 = shortcut_action(self, u'5',
+ [QtGui.QKeySequence(u'5')], self.slideShortcutActivated,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.shortcut6 = shortcut_action(self, u'6',
+ [QtGui.QKeySequence(u'6')], self.slideShortcutActivated,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.shortcut7 = shortcut_action(self, u'7',
+ [QtGui.QKeySequence(u'7')], self.slideShortcutActivated,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.shortcut8 = shortcut_action(self, u'8',
+ [QtGui.QKeySequence(u'8')], self.slideShortcutActivated,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.shortcut9 = shortcut_action(self, u'9',
+ [QtGui.QKeySequence(u'9')], self.slideShortcutActivated,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.chorusShortcut = shortcut_action(self, u'chorusShortcut',
+ [QtGui.QKeySequence(u'C')], self.slideShortcutActivated,
+ category=UiStrings().LiveToolbar,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.chorusShortcut.setText(translate(
+ 'OpenLP.SlideController', 'Go to "Chorus"'))
+ self.bridgeShortcut = shortcut_action(self, u'bridgeShortcut',
+ [QtGui.QKeySequence(u'B')], self.slideShortcutActivated,
+ category=UiStrings().LiveToolbar,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.bridgeShortcut.setText(translate(
+ 'OpenLP.SlideController', 'Go to "Bridge"'))
+ self.preChorusShortcut = shortcut_action(self, u'preChorusShortcut',
+ [QtGui.QKeySequence(u'P')], self.slideShortcutActivated,
+ category=UiStrings().LiveToolbar,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.preChorusShortcut.setText(translate(
+ 'OpenLP.SlideController', 'Go to "Pre-Chorus"'))
+ self.introShortcut = shortcut_action(self, u'introShortcut',
+ [QtGui.QKeySequence(u'I')], self.slideShortcutActivated,
+ category=UiStrings().LiveToolbar,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.introShortcut.setText(translate(
+ 'OpenLP.SlideController', 'Go to "Intro"'))
+ self.endingShortcut = shortcut_action(self, u'endingShortcut',
+ [QtGui.QKeySequence(u'E')], self.slideShortcutActivated,
+ category=UiStrings().LiveToolbar,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.endingShortcut.setText(translate(
+ 'OpenLP.SlideController', 'Go to "Ending"'))
+ self.otherShortcut = shortcut_action(self, u'otherShortcut',
+ [QtGui.QKeySequence(u'O')], self.slideShortcutActivated,
+ category=UiStrings().LiveToolbar,
+ context=QtCore.Qt.WidgetWithChildrenShortcut)
+ self.otherShortcut.setText(translate(
+ 'OpenLP.SlideController', 'Go to "Other"'))
+ self.previewListWidget.addActions([
+ self.shortcut0, self.shortcut1, self.shortcut2, self.shortcut3,
+ self.shortcut4, self.shortcut5, self.shortcut6, self.shortcut7,
+ self.shortcut8, self.shortcut9, self.verseShortcut,
+ self.chorusShortcut, self.bridgeShortcut,
+ self.preChorusShortcut, self.introShortcut, self.endingShortcut,
+ self.otherShortcut
+ ])
+ QtCore.QObject.connect(
+ self.shortcutTimer, QtCore.SIGNAL(u'timeout()'),
+ self.slideShortcutActivated)
# Signals
QtCore.QObject.connect(self.previewListWidget,
QtCore.SIGNAL(u'clicked(QModelIndex)'), self.onSlideSelected)
@@ -367,6 +455,90 @@
QtCore.SIGNAL(u'slidecontroller_%s_unblank' % self.typePrefix),
self.onSlideUnblank)
+ def slideShortcutActivated(self):
+ """
+ Called, when a shortcut has been activated to jump to a chorus, verse,
+ etc.
+
+ **Note**: This implementation is based on shortcuts. But it rather works
+ like "key sequenes". You have to press one key after the other and
+ **not** at the same time.
+ For example to jump to "V3" you have to press "V" and afterwards but
+ within a time frame of 350ms you have to press "3".
+ """
+ try:
+ from openlp.plugins.songs.lib import VerseType
+ SONGS_PLUGIN_AVAILABLE = True
+ except ImportError:
+ SONGS_PLUGIN_AVAILABLE = False
+ verse_type = unicode(self.sender().objectName())
+ if verse_type.startswith(u'verseShortcut'):
+ if SONGS_PLUGIN_AVAILABLE:
+ self.current_shortcut = \
+ VerseType.TranslatedTags[VerseType.Verse]
+ else:
+ self.current_shortcut = u'V'
+ elif verse_type.startswith(u'chorusShortcut'):
+ if SONGS_PLUGIN_AVAILABLE:
+ self.current_shortcut = \
+ VerseType.TranslatedTags[VerseType.Chorus]
+ else:
+ self.current_shortcut = u'C'
+ elif verse_type.startswith(u'bridgeShortcut'):
+ if SONGS_PLUGIN_AVAILABLE:
+ self.current_shortcut = \
+ VerseType.TranslatedTags[VerseType.Bridge]
+ else:
+ self.current_shortcut = u'B'
+ elif verse_type.startswith(u'preChorusShortcut'):
+ if SONGS_PLUGIN_AVAILABLE:
+ self.current_shortcut = \
+ VerseType.TranslatedTags[VerseType.PreChorus]
+ else:
+ self.current_shortcut = u'P'
+ elif verse_type.startswith(u'introShortcut'):
+ if SONGS_PLUGIN_AVAILABLE:
+ self.current_shortcut = \
+ VerseType.TranslatedTags[VerseType.Intro]
+ else:
+ self.current_shortcut = u'I'
+ elif verse_type.startswith(u'endingShortcut'):
+ if SONGS_PLUGIN_AVAILABLE:
+ self.current_shortcut = \
+ VerseType.TranslatedTags[VerseType.Ending]
+ else:
+ self.current_shortcut = u'E'
+ elif verse_type.startswith(u'otherShortcut'):
+ if SONGS_PLUGIN_AVAILABLE:
+ self.current_shortcut = \
+ VerseType.TranslatedTags[VerseType.Other]
+ else:
+ self.current_shortcut = u'O'
+ elif verse_type.isnumeric():
+ self.current_shortcut += verse_type
+ self.current_shortcut = self.current_shortcut.upper()
+ keys = self.slideList.keys()
+ matches = [match for match in keys
+ if match.startswith(self.current_shortcut)]
+ if len(matches) == 1:
+ self.shortcutTimer.stop()
+ self.current_shortcut = u''
+ self.__checkUpdateSelectedSlide(self.slideList[matches[0]])
+ self.slideSelected()
+ elif verse_type != u'shortcutTimer':
+ # Start the time as we did not have any match.
+ self.shortcutTimer.start(350)
+ else:
+ # The timer timed out.
+ if self.current_shortcut in keys:
+ # We had more than one match for example "V1" and "V10", but
+ # "V1" was the slide we wanted to go.
+ self.__checkUpdateSelectedSlide(
+ self.slideList[self.current_shortcut])
+ self.slideSelected()
+ # Reset the shortcut.
+ self.current_shortcut = u''
+
def setPreviewHotkeys(self, parent=None):
self.previousItem.setObjectName(u'previousItemPreview')
self.nextItem.setObjectName(u'nextItemPreview')
@@ -643,13 +815,14 @@
verse_def = u'%s%s' % (verse_def[0], verse_def[1:])
two_line_def = u'%s\n%s' % (verse_def[0], verse_def[1:])
row = two_line_def
- if self.isLive:
- if verse_def not in self.slideList:
- self.slideList[verse_def] = framenumber
+ if verse_def not in self.slideList:
+ self.slideList[verse_def] = framenumber
+ if self.isLive:
self.songMenu.menu().addAction(verse_def,
self.onSongBarHandler)
else:
row += 1
+ self.slideList[unicode(row)] = row - 1
item.setText(frame[u'text'])
else:
label = QtGui.QLabel()
@@ -667,6 +840,7 @@
self.previewListWidget.setCellWidget(framenumber, 0, label)
slideHeight = width * self.parent().renderer.screen_ratio
row += 1
+ self.slideList[unicode(row)] = row - 1
text.append(unicode(row))
self.previewListWidget.setItem(framenumber, 0, item)
if slideHeight != 0:
_______________________________________________
Mailing list: https://launchpad.net/~openlp-core
Post to : [email protected]
Unsubscribe : https://launchpad.net/~openlp-core
More help : https://help.launchpad.net/ListHelp