Subversion Repositories Scribus

Compare Revisions

Ignore whitespace Rev 11839 → Rev 11840

/branches/Version133x/Scribus/scribus/plugins/scriptplugin/scripts/InfoBox.py
1,5 → 1,5
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
 
# ****************************************************************************
# This program is free software; you can redistribute it and/or modify
19,34 → 19,36
# ****************************************************************************
 
 
"""
(C) 2005 by Thomas R. Koll, <tomk32@gmx.de>, http://verlag.tomk32.de
# Craig Bradney, Scribus Team
# 10/3/08: Added to Scribus 1.3.3.12svn distribution "as was" from Scribus wiki for bug #6826, script is GPLd
(c) 2008 modifications, additional features by Gregory Pittman
# Craig Bradney, Scribus Team
# 20/3/08: Replaced previous version in Scribus 1.3.3.12svn distribution from Scribus wiki for bug #6869
 
"""
(C) 2005 by Thomas R. Koll, <tomk32@gmx.de>, http://verlag.tomk32.de
 
A simple script for exact placment of a textbox (infobox)
A simple script for exact placement of a frame (infobox)
over the current textbox, asking the user for the width
of the infobox and in which column to place it.
I normally use it for a table-like box above the regular text.
Some enhancements:
* You can now create a text frame or an image frame, and also load
an image.
* More than one infobox can be added to a text frame
* Height and Y-Pos of top of infobox can be specified
* Works with any page unit - pts, mm, in, and picas
* Infobox has Text Flows Around Frame activated, also
Scale Image to Frame for images
 
USAGE
Select a textframe, start the script and have phun
Default name for the infobox is 'infobox' + name_of_selected_frame
Default name for the infobox is 'infobox' + name_of_selected_frame,
but this can be changed.
 
TODO
* ask for height
* ask for name
* ask for content?
 
"""
 
import sys
import re
import string
 
try:
from scribus import *
import scribus
except ImportError:
print "Unable to import the 'scribus' module. This script will only run within"
print "the Python interpreter embedded in Scribus. Try Script->Execute Script."
53,55 → 55,92
sys.exit(1)
 
def main(argv):
unit = getUnit()
setUnit(UNIT_MILLIMETERS)
if selectionCount() == 0:
messageBox('Scribus - Script Error',
unit = scribus.getUnit()
units = [' pts','mm',' inches',' picas','cm',' ciceros']
unitlabel = units[unit]
if scribus.selectionCount() == 0:
scribus.messageBox('Scribus - Script Error',
"There is no object selected.\nPlease select a text frame and try again.",
ICON_WARNING, BUTTON_OK)
scribus.ICON_WARNING, scribus.BUTTON_OK)
sys.exit(2)
try:
textbox = getSelectedObject()
left, top = getPosition(textbox)
o_width, o_height = getSize(textbox)
o_cols = int(getColumns(textbox))
o_gap = getColumnGap(textbox)
except:
messageBox('Scribus - Script Error',
"Can't get size of object, maybe not a textframe", ICON_WARNING, BUTTON_OK)
if scribus.selectionCount() > 1:
scribus.messageBox('Scribus - Script Error',
"You have more than one object selected.\nPlease select one text frame and try again.",
scribus.ICON_WARNING, scribus.BUTTON_OK)
sys.exit(2)
textbox = scribus.getSelectedObject()
pageitems = scribus.getPageItems()
boxcount = 1
for item in pageitems:
if (item[0] == textbox):
if (item[1] != 4):
scribus.messageBox('Scribus - Script Error',
"This is not a textframe. Try again.", scribus.ICON_WARNING, scribus.BUTTON_OK)
sys.exit(2)
 
# While we're finding out what kind of frame is selected, we'll also make sure we
# will come up with a unique name for our infobox frame - it's possible we may want
# more than one for a multicolumn frame.
if (item[0] == ("infobox" + str(boxcount) + textbox)):
boxcount += 1
left, top = scribus.getPosition(textbox)
o_width, o_height = scribus.getSize(textbox)
o_cols = int(scribus.getColumns(textbox))
o_gap = scribus.getColumnGap(textbox)
columns_width = 0
column_pos = 1
column_pos = 0
o_colwidth = (o_width - ((o_cols - 1) * o_gap)) / o_cols
if (o_cols > 1):
while (columns_width > o_cols or columns_width < 1):
columns_width = valueDialog('Width',
columns_width = scribus.valueDialog('Width',
'How many columns width shall the '+
'box be (max ' + str(o_cols) + ')?')
'box be (max ' + str(o_cols) + ')?','1')
columns_width = int(columns_width)
if (columns_width < o_cols):
max = o_cols - columns_width
while (column_pos <= max and column_pos <= 1):
column_pos = valueDialog('Placement',
column_pos = scribus.valueDialog('Placement',
'In which column do you want '
'to place the box (1 to ' +
str(o_cols) + ')?')
str(o_cols) + ')?','1')
column_pos = int(column_pos) - 1
if (o_cols == 1):
columns_width = 1
new_height = 0
while (new_height == 0):
new_height = scribus.valueDialog('Height','Your frame height is '+ str(o_height) +
unitlabel +'. How tall\n do you want your ' +
'infobox to be in '+ unitlabel +'?', str(o_height))
new_top = -1
while (new_top < 0):
new_top = scribus.valueDialog('Y-Pos','The top of your infobox is currently\n'+ str(top) +
unitlabel +'. Where do you want \n' +
'the top to be in '+ unitlabel +'?', str(top))
framename = scribus.valueDialog('Name of Frame','Name your frame or use this default name',"infobox" + str(boxcount) + textbox)
frametype = 'text'
frametype = scribus.valueDialog('Frame Type','Change to anything other\n than "text" for image frame.\nEnter "imageL" to also load an image',frametype)
new_width = columns_width * o_colwidth + (columns_width-1) * o_gap
new_left = left + ((column_pos) * o_colwidth) + ((column_pos) * o_gap)
new_textbox = createText(new_left, top, new_width, o_height,
"infobox " + textbox)
setColumnGap(0, new_textbox)
setColumns(1, new_textbox)
setUnit(unit)
 
if (frametype == 'text'):
new_textbox = scribus.createText(new_left, float(new_top), new_width, float(new_height),framename)
scribus.setColumnGap(0, new_textbox)
scribus.setColumns(1, new_textbox)
scribus.textFlowsAroundFrame(new_textbox, 1)
else:
new_image = scribus.createImage(new_left, float(new_top), new_width, float(new_height),framename)
if (frametype == 'imageL'):
imageload = scribus.fileDialog('Load image','Images(*.jpg *.png *.tif)',haspreview=1)
scribus.loadImage(imageload, new_image)
scribus.textFlowsAroundFrame(new_image, 1)
scribus.setScaleImageToFrame(scaletoframe=1, proportional=1, name=new_image)
if __name__ == '__main__':
# This script makes no sense without a document open
if not haveDoc():
messageBox('Scribus - Script Error', "No document open", ICON_WARNING, BUTTON_OK)
if not scribus.haveDoc():
scribus.messageBox('Scribus - Script Error', "No document open", scribus.ICON_WARNING, scribus.BUTTON_OK)
sys.exit(1)
# Disable redraws
setRedraw(False)
scribus.setRedraw(False)
# Run the main script, ensuring redraws are re-enabled even if the
# script aborts with an exception, and don't fail with an exception
# even if the document is closed while the script runs.
109,6 → 148,7
main(sys.argv)
finally:
try:
setRedraw(True)
scribus.setRedraw(True)
except:
pass
pass