forked from openlp/openlp
Make the "Song Maintenance" button on the SongEdit form to work; Include a merge from trunk.
This commit is contained in:
commit
2fb7ff511e
@ -167,32 +167,37 @@ class Renderer(object):
|
||||
#take the width work out approx how many characters and add 50%
|
||||
line_width = self._rect.width() - self._right_margin
|
||||
#number of lines on a page - adjust for rounding up.
|
||||
#print self._rect.height() , metrics.height(), int(self._rect.height() / metrics.height())
|
||||
page_length = int(self._rect.height() / metrics.height()) - 1
|
||||
ave_line_width = line_width / metrics.averageCharWidth()
|
||||
#print ave_line_width
|
||||
# print "A", ave_line_width
|
||||
ave_line_width = int(ave_line_width + (ave_line_width * 0.5))
|
||||
#print ave_line_width
|
||||
# print "B", ave_line_width
|
||||
split_pages = []
|
||||
page = []
|
||||
split_lines = []
|
||||
count = 0
|
||||
for line in text:
|
||||
#print line , len(line)
|
||||
# print "C", line , len(line)
|
||||
if len(line) > ave_line_width:
|
||||
while len(line) > 0:
|
||||
pos = line.find(u' ', ave_line_width)
|
||||
#print ave_line_width, pos, line[:pos]
|
||||
# print "D2", len(line), ave_line_width, pos, line[:pos]
|
||||
split_text = line[:pos]
|
||||
#print metrics.width(split_text, -1), line_width
|
||||
# print "E", metrics.width(split_text, -1), line_width
|
||||
while metrics.width(split_text, -1) > line_width:
|
||||
#Find the next space to the left
|
||||
pos = line[:pos].rfind(u' ')
|
||||
#print ave_line_width, pos, line[:pos]
|
||||
# print "F", ave_line_width, pos, line[:pos]
|
||||
#no more spaces found
|
||||
if pos == -1:
|
||||
if pos == 0:
|
||||
split_text = line
|
||||
while metrics.width(split_text, -1) > line_width:
|
||||
split_text = split_text[:-1]
|
||||
pos = len(split_text)
|
||||
else:
|
||||
split_text = line[:pos]
|
||||
# print "F1", split_text, line, pos
|
||||
split_lines.append(split_text)
|
||||
line = line[pos:]
|
||||
#Text fits in a line now
|
||||
@ -200,13 +205,14 @@ class Renderer(object):
|
||||
split_lines.append(line)
|
||||
line = u''
|
||||
# count += 1
|
||||
# if count == 50:
|
||||
# if count == 15:
|
||||
# a = c
|
||||
#print split_lines
|
||||
#print line
|
||||
# print "G", split_lines
|
||||
# print "H", line
|
||||
else:
|
||||
split_lines.append(line)
|
||||
line = u''
|
||||
#print "I", split_lines, page_length
|
||||
for line in split_lines:
|
||||
page.append(line)
|
||||
if len(page) == page_length:
|
||||
@ -306,72 +312,72 @@ class Renderer(object):
|
||||
QtCore.Qt.SmoothTransformation)
|
||||
log.debug(u'render background End')
|
||||
|
||||
def _split_set_of_lines(self, lines, footer):
|
||||
"""
|
||||
Given a list of lines, decide how to split them best if they don't all
|
||||
fit on the screen. This is done by splitting at 1/2, 1/3 or 1/4 of the
|
||||
set. If it doesn't fit, even at this size, just split at each
|
||||
opportunity. We'll do this by getting the bounding box of each line,
|
||||
and then summing them appropriately.
|
||||
|
||||
Returns a list of [lists of lines], one set for each screenful.
|
||||
|
||||
``lines``
|
||||
The lines of text to split.
|
||||
|
||||
``footer``
|
||||
The footer text.
|
||||
"""
|
||||
bboxes = []
|
||||
for line in lines:
|
||||
bboxes.append(self._render_and_wrap_single_line(line, footer))
|
||||
numlines = len(lines)
|
||||
bottom = self._rect.bottom()
|
||||
for ratio in (numlines, numlines/2, numlines/3, numlines/4):
|
||||
good = 1
|
||||
startline = 0
|
||||
endline = startline + ratio
|
||||
while (endline <= numlines and endline != 0):
|
||||
by = 0
|
||||
for (x,y) in bboxes[startline:endline]:
|
||||
by += y
|
||||
if by > bottom:
|
||||
good = 0
|
||||
break
|
||||
startline += ratio
|
||||
endline = startline + ratio
|
||||
if good == 1:
|
||||
break
|
||||
retval = []
|
||||
numlines_per_page = ratio
|
||||
if good:
|
||||
c = 0
|
||||
thislines = []
|
||||
while c < numlines:
|
||||
thislines.append(lines[c])
|
||||
c += 1
|
||||
if len(thislines) == numlines_per_page:
|
||||
retval.append(thislines)
|
||||
thislines = []
|
||||
if len(thislines) > 0:
|
||||
retval.append(thislines)
|
||||
else:
|
||||
# print "Just split where you can"
|
||||
retval = []
|
||||
startline = 0
|
||||
endline = startline + 1
|
||||
while (endline <= numlines):
|
||||
by = 0
|
||||
for (x,y) in bboxes[startline:endline]:
|
||||
by += y
|
||||
if by > bottom:
|
||||
retval.append(lines[startline:endline-1])
|
||||
startline = endline-1
|
||||
# gets incremented below
|
||||
endline = startline
|
||||
by = 0
|
||||
endline += 1
|
||||
return retval
|
||||
# def _split_set_of_lines(self, lines, footer):
|
||||
# """
|
||||
# Given a list of lines, decide how to split them best if they don't all
|
||||
# fit on the screen. This is done by splitting at 1/2, 1/3 or 1/4 of the
|
||||
# set. If it doesn't fit, even at this size, just split at each
|
||||
# opportunity. We'll do this by getting the bounding box of each line,
|
||||
# and then summing them appropriately.
|
||||
#
|
||||
# Returns a list of [lists of lines], one set for each screenful.
|
||||
#
|
||||
# ``lines``
|
||||
# The lines of text to split.
|
||||
#
|
||||
# ``footer``
|
||||
# The footer text.
|
||||
# """
|
||||
# bboxes = []
|
||||
# for line in lines:
|
||||
# bboxes.append(self._render_and_wrap_single_line(line, footer))
|
||||
# numlines = len(lines)
|
||||
# bottom = self._rect.bottom()
|
||||
# for ratio in (numlines, numlines/2, numlines/3, numlines/4):
|
||||
# good = 1
|
||||
# startline = 0
|
||||
# endline = startline + ratio
|
||||
# while (endline <= numlines and endline != 0):
|
||||
# by = 0
|
||||
# for (x,y) in bboxes[startline:endline]:
|
||||
# by += y
|
||||
# if by > bottom:
|
||||
# good = 0
|
||||
# break
|
||||
# startline += ratio
|
||||
# endline = startline + ratio
|
||||
# if good == 1:
|
||||
# break
|
||||
# retval = []
|
||||
# numlines_per_page = ratio
|
||||
# if good:
|
||||
# c = 0
|
||||
# thislines = []
|
||||
# while c < numlines:
|
||||
# thislines.append(lines[c])
|
||||
# c += 1
|
||||
# if len(thislines) == numlines_per_page:
|
||||
# retval.append(thislines)
|
||||
# thislines = []
|
||||
# if len(thislines) > 0:
|
||||
# retval.append(thislines)
|
||||
# else:
|
||||
# # print "Just split where you can"
|
||||
# retval = []
|
||||
# startline = 0
|
||||
# endline = startline + 1
|
||||
# while (endline <= numlines):
|
||||
# by = 0
|
||||
# for (x,y) in bboxes[startline:endline]:
|
||||
# by += y
|
||||
# if by > bottom:
|
||||
# retval.append(lines[startline:endline-1])
|
||||
# startline = endline-1
|
||||
# # gets incremented below
|
||||
# endline = startline
|
||||
# by = 0
|
||||
# endline += 1
|
||||
# return retval
|
||||
|
||||
def _correctAlignment(self, rect, bbox):
|
||||
"""
|
||||
|
@ -161,7 +161,7 @@ class ThemeXML(object):
|
||||
#Create Filename element
|
||||
self.child_element(background, u'filename', filename)
|
||||
|
||||
def add_font(self, name, color, proportion, override, fonttype=u'main', weight=u'Bold', italics=False,
|
||||
def add_font(self, name, color, proportion, override, fonttype=u'main', weight=u'Normal', italics=u'False',
|
||||
xpos=0, ypos=0, width=0, height=0):
|
||||
"""
|
||||
Add a Font.
|
||||
|
@ -60,6 +60,10 @@ class MainDisplay(QtGui.QWidget):
|
||||
Sets up the screen on a particular screen.
|
||||
@param (integer) screen This is the screen number.
|
||||
"""
|
||||
# Temporary fix until I can speak to Tim Bentley.
|
||||
if screenNumber not in self.screens:
|
||||
screenNumber = 0
|
||||
# /Temporary fix
|
||||
screen = self.screens[screenNumber]
|
||||
if screen[u'number'] != screenNumber:
|
||||
# We will most probably never actually hit this bit, but just in
|
||||
@ -82,7 +86,8 @@ class MainDisplay(QtGui.QWidget):
|
||||
painter_image.begin(self.InitialFrame)
|
||||
painter_image.fillRect(self.InitialFrame.rect(), QtCore.Qt.white)
|
||||
painter_image.drawImage((screen[u'size'].width() - splash_image.width()) / 2,
|
||||
(screen[u'size'].height() - splash_image.height()) / 2 , splash_image)
|
||||
(screen[u'size'].height() - splash_image.height()) / 2,
|
||||
splash_image)
|
||||
self.frameView(self.InitialFrame)
|
||||
#Build a Black screen
|
||||
painter = QtGui.QPainter()
|
||||
@ -98,7 +103,6 @@ class MainDisplay(QtGui.QWidget):
|
||||
``frame``
|
||||
Image frame to be rendered
|
||||
"""
|
||||
|
||||
self.frame = frame
|
||||
if self.timer_id != 0 :
|
||||
self.displayAlert()
|
||||
@ -131,7 +135,9 @@ class MainDisplay(QtGui.QWidget):
|
||||
alertframe = QtGui.QPixmap.fromImage(self.frame)
|
||||
painter = QtGui.QPainter(alertframe)
|
||||
top = alertframe.rect().height() * 0.9
|
||||
painter.fillRect(QtCore.QRect(0, top , alertframe.rect().width(), alertframe.rect().height() - top), QtGui.QColor(self.alertTab.bg_color))
|
||||
painter.fillRect(
|
||||
QtCore.QRect(0, top, alertframe.rect().width(), alertframe.rect().height() - top),
|
||||
QtGui.QColor(self.alertTab.bg_color))
|
||||
font = QtGui.QFont()
|
||||
font.setFamily(self.alertTab.font_face)
|
||||
font.setBold(True)
|
||||
@ -140,12 +146,13 @@ class MainDisplay(QtGui.QWidget):
|
||||
painter.setPen(QtGui.QColor(self.alertTab.font_color))
|
||||
x, y = (0, top)
|
||||
metrics=QtGui.QFontMetrics(font)
|
||||
painter.drawText(x, y+metrics.height()-metrics.descent()-1, self.alerttext)
|
||||
painter.drawText(
|
||||
x, y + metrics.height() - metrics.descent() - 1, self.alerttext)
|
||||
painter.end()
|
||||
self.display.setPixmap(alertframe)
|
||||
# check to see if we have a timer running
|
||||
if self.timer_id == 0:
|
||||
self.timer_id = self.startTimer(int(self.alertTab.timeout) * 1000)
|
||||
self.timer_id = self.startTimer(int(self.alertTab.timeout) * 1000)
|
||||
|
||||
def timerEvent(self, event):
|
||||
if event.timerId() == self.timer_id:
|
||||
|
@ -20,6 +20,7 @@ this program; if not, write to the Free Software Foundation, Inc., 59 Temple
|
||||
Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
"""
|
||||
import logging
|
||||
import time
|
||||
|
||||
from PyQt4 import QtCore, QtGui
|
||||
|
||||
@ -268,6 +269,8 @@ class BibleMediaItem(MediaManagerItem):
|
||||
def setQuickMsg2(self, text):
|
||||
self.QuickMsg2.setText(translate(u'BibleMediaItem', unicode(text)))
|
||||
Receiver().send_message(u'openlpprocessevents')
|
||||
#minor delay to get the events processed
|
||||
time.sleep(0.5)
|
||||
|
||||
def loadBibles(self):
|
||||
log.debug(u'Loading Bibles')
|
||||
|
@ -68,9 +68,12 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
QtCore.SIGNAL(u'activated(int)'), self.onSongBookComboChanged)
|
||||
QtCore.QObject.connect(self.ThemeSelectionComboItem,
|
||||
QtCore.SIGNAL(u'activated(int)'), self.onThemeComboChanged)
|
||||
QtCore.QObject.connect(self.MaintenanceButton,
|
||||
QtCore.SIGNAL(u'clicked()'), self.onMaintenanceButtonClicked)
|
||||
# Create other objects and forms
|
||||
self.songmanager = songmanager
|
||||
self.eventmanager = eventmanager
|
||||
self.parent = parent
|
||||
self.verse_form = EditVerseForm()
|
||||
self.initialise()
|
||||
self.AuthorsListView.setSortingEnabled(False)
|
||||
@ -177,7 +180,7 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
self.CCLNumberEdit.setText(u'')
|
||||
#lazy xml migration for now
|
||||
if self.song.lyrics.startswith(u'<?xml version='):
|
||||
songXML=SongXMLParser(self.song.lyrics)
|
||||
songXML = SongXMLParser(self.song.lyrics)
|
||||
verseList = songXML.get_verses()
|
||||
for verse in verseList:
|
||||
self.VerseListWidget.addItem(verse[1])
|
||||
@ -228,8 +231,6 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
item = int(self.SongTopicCombo.currentIndex())
|
||||
if item > -1:
|
||||
item_id = (self.SongTopicCombo.itemData(item)).toInt()[0]
|
||||
print item_id
|
||||
print self.TopicsListView
|
||||
topic = self.songmanager.get_topic(item_id)
|
||||
self.song.topics.append(topic)
|
||||
topic_item = QtGui.QListWidgetItem(unicode(topic.name))
|
||||
@ -333,6 +334,12 @@ class EditSongForm(QtGui.QDialog, Ui_EditSongDialog):
|
||||
self.CopyrightEditItem.setFocus()
|
||||
self.CopyrightEditItem.setCursorPosition(pos + 1)
|
||||
|
||||
def onMaintenanceButtonClicked(self):
|
||||
self.parent.song_maintenance_form.exec_()
|
||||
self.loadAuthors()
|
||||
self.loadBooks()
|
||||
self.loadTopics()
|
||||
|
||||
def onAccept(self):
|
||||
log.debug(u'OnAccept')
|
||||
if not self._validate_song():
|
||||
|
@ -71,15 +71,22 @@ class SongsPlugin(Plugin):
|
||||
self.ImportSongMenu.setTitle(translate(u'main_window', u'&Song'))
|
||||
self.ImportOpenSongItem.setText(translate(u'main_window', u'OpenSong'))
|
||||
self.ImportOpenlp1Item.setText(translate(u'main_window', u'openlp.org 1.0'))
|
||||
self.ImportOpenlp1Item.setToolTip(translate(u'main_window', u'Export songs in openlp.org 1.0 format'))
|
||||
self.ImportOpenlp1Item.setStatusTip(translate(u'main_window', u'Export songs in openlp.org 1.0 format'))
|
||||
self.ImportOpenlp1Item.setToolTip(
|
||||
translate(u'main_window', u'Export songs in openlp.org 1.0 format'))
|
||||
self.ImportOpenlp1Item.setStatusTip(
|
||||
translate(u'main_window', u'Export songs in openlp.org 1.0 format'))
|
||||
self.ImportOpenlp2Item.setText(translate(u'main_window', u'OpenLP 2.0'))
|
||||
self.ImportOpenlp2Item.setToolTip(translate(u'main_window', u'Export songs in OpenLP 2.0 format'))
|
||||
self.ImportOpenlp2Item.setStatusTip(translate(u'main_window', u'Export songs in OpenLP 2.0 format'))
|
||||
self.ImportOpenlp2Item.setToolTip(
|
||||
translate(u'main_window', u'Export songs in OpenLP 2.0 format'))
|
||||
self.ImportOpenlp2Item.setStatusTip(
|
||||
translate(u'main_window', u'Export songs in OpenLP 2.0 format'))
|
||||
# Signals and slots
|
||||
QtCore.QObject.connect(self.ImportOpenlp1Item, QtCore.SIGNAL(u'triggered()'), self.onImportOpenlp1ItemClick)
|
||||
QtCore.QObject.connect(self.ImportOpenlp2Item, QtCore.SIGNAL(u'triggered()'), self.onImportOpenlp1ItemClick)
|
||||
QtCore.QObject.connect(self.ImportOpenSongItem, QtCore.SIGNAL(u'triggered()'), self.onImportOpenSongItemClick)
|
||||
QtCore.QObject.connect(self.ImportOpenlp1Item,
|
||||
QtCore.SIGNAL(u'triggered()'), self.onImportOpenlp1ItemClick)
|
||||
QtCore.QObject.connect(self.ImportOpenlp2Item,
|
||||
QtCore.SIGNAL(u'triggered()'), self.onImportOpenlp1ItemClick)
|
||||
QtCore.QObject.connect(self.ImportOpenSongItem,
|
||||
QtCore.SIGNAL(u'triggered()'), self.onImportOpenSongItemClick)
|
||||
|
||||
def add_export_menu_item(self, export_menu):
|
||||
self.ExportSongMenu = QtGui.QMenu(export_menu)
|
||||
@ -101,8 +108,10 @@ class SongsPlugin(Plugin):
|
||||
self.ExportOpenlp1Item.setText(translate(u'main_window', u'openlp.org 1.0'))
|
||||
self.ExportOpenlp2Item.setText(translate(u'main_window', u'OpenLP 2.0'))
|
||||
# Signals and slots
|
||||
QtCore.QObject.connect(self.ExportOpenlp1Item, QtCore.SIGNAL(u'triggered()'), self.onExportOpenlp1ItemClicked)
|
||||
QtCore.QObject.connect(self.ExportOpenSongItem, QtCore.SIGNAL(u'triggered()'), self.onExportOpenSongItemClicked)
|
||||
QtCore.QObject.connect(self.ExportOpenlp1Item,
|
||||
QtCore.SIGNAL(u'triggered()'), self.onExportOpenlp1ItemClicked)
|
||||
QtCore.QObject.connect(self.ExportOpenSongItem,
|
||||
QtCore.SIGNAL(u'triggered()'), self.onExportOpenSongItemClicked)
|
||||
|
||||
def initialise(self):
|
||||
self.media_item.displayResultsSong(self.songmanager.get_songs())
|
||||
|
Loading…
Reference in New Issue
Block a user