more graphviz based options
svn: r9562
This commit is contained in:
parent
30d87568d9
commit
e9ebd454cc
@ -1,3 +1,10 @@
|
||||
2007-12-22 Stéphane Charette <stephanecharette@gmail.com>
|
||||
* src/ReportBase/_GraphvizReportDialog.py:
|
||||
* src/PluginUtils/__init__.py:
|
||||
* src/PluginUtils/_MenuOptions.py:
|
||||
Work in progress to add some additional GraphViz options that can be
|
||||
used by any GraphViz-based plugin.
|
||||
|
||||
2007-12-21 Douglas S. Blank <dblank@cs.brynmawr.edu>
|
||||
* src/plugins/lineage.py: moved to new quick view format
|
||||
* src/docgen/TextBufDoc.py: fixed transient window issue
|
||||
|
@ -212,6 +212,7 @@ class NumberOption(Option):
|
||||
"""
|
||||
value = self.get_value()
|
||||
adj = gtk.Adjustment(1,self.get_min(),self.get_max(),1)
|
||||
|
||||
self.gobj = gtk.SpinButton(adj)
|
||||
self.gobj.set_value(value)
|
||||
|
||||
@ -222,6 +223,42 @@ class NumberOption(Option):
|
||||
return int(self.gobj.get_value_as_int())
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# FloatOption class
|
||||
#
|
||||
#-------------------------------------------------------------------------
|
||||
class FloatOption(NumberOption):
|
||||
"""
|
||||
This class performs like NumberOption, but allows for float values
|
||||
for the minimum/maximum/increment.
|
||||
"""
|
||||
def __init__(self, label, value, min, max):
|
||||
# Someone who knows python better than I will probably
|
||||
# want to add a parameter for the caller to specify how
|
||||
# many decimal points are needed.
|
||||
#
|
||||
# At the time this function was written, the only code
|
||||
# that needed this class required 2 decimals.
|
||||
NumberOption.__init__(self, label, value, min, max)
|
||||
|
||||
def make_gui_obj(self, gtk, dialog):
|
||||
"""
|
||||
Add a FloatOption to the dialog.
|
||||
"""
|
||||
value = self.get_value()
|
||||
adj = gtk.Adjustment(value, lower=self.get_min(), upper=self.get_max(), step_incr=0.01)
|
||||
|
||||
self.gobj = gtk.SpinButton(adjustment=adj, digits=2)
|
||||
self.gobj.set_value(value)
|
||||
|
||||
def parse(self):
|
||||
"""
|
||||
Parse the object and return.
|
||||
"""
|
||||
return float(self.gobj.get_value())
|
||||
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
#
|
||||
# TextOption class
|
||||
|
@ -28,7 +28,7 @@
|
||||
# the list as PluginUtils.PluginMgr, or use a function that returns the pointer
|
||||
# of the list.
|
||||
from _MenuOptions import MenuOptions, \
|
||||
NumberOption, BooleanOption, TextOption, \
|
||||
NumberOption, FloatOption, BooleanOption, TextOption, \
|
||||
EnumeratedListOption, FilterListOption, StringOption
|
||||
from _PluginMgr import \
|
||||
register_export, register_import, \
|
||||
|
@ -17,7 +17,7 @@
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
# $Id: $
|
||||
# $Id$
|
||||
|
||||
#------------------------------------------------------------------------
|
||||
#
|
||||
@ -48,7 +48,7 @@ import Config
|
||||
from _Constants import CATEGORY_GRAPHVIZ
|
||||
from _ReportDialog import ReportDialog
|
||||
from _PaperMenu import PaperFrame
|
||||
from PluginUtils import NumberOption, EnumeratedListOption, TextOption
|
||||
from PluginUtils import NumberOption, FloatOption, EnumeratedListOption, TextOption, BooleanOption
|
||||
|
||||
#-------------------------------------------------------------------------------
|
||||
#
|
||||
@ -108,26 +108,33 @@ class GVDocBase(BaseDoc.BaseDoc,BaseDoc.GVDoc):
|
||||
"""
|
||||
def __init__(self,options,paper_style):
|
||||
BaseDoc.BaseDoc.__init__(self,None,paper_style,None)
|
||||
|
||||
self.options = options.handler.options_dict
|
||||
self.dot = StringIO()
|
||||
self.paper = paper_style
|
||||
|
||||
self.fontfamily = _FONTS[ self.options['font_family'] ]['value']
|
||||
self.fontsize = self.options['font_size']
|
||||
self.rankdir = _RANKDIR[ self.options['rank_dir'] ]['value']
|
||||
self.pagedir = _PAGEDIR[ self.options['page_dir'] ]['value']
|
||||
self.hpages = self.options['h_pages']
|
||||
self.vpages = self.options['v_pages']
|
||||
self.ratio = _RATIO[ self.options['ratio'] ]['value']
|
||||
self.noteloc = self.options['noteloc']
|
||||
self.notesize = self.options['notesize']
|
||||
self.note = self.options['note']
|
||||
|
||||
paper_size = paper_style.get_size()
|
||||
pheight = paper_size.get_height_inches()
|
||||
pwidth = paper_size.get_width_inches()
|
||||
|
||||
|
||||
self.options = options.handler.options_dict
|
||||
self.dot = StringIO()
|
||||
self.paper = paper_style
|
||||
|
||||
self.dpi = self.options['dpi' ]
|
||||
self.fontfamily = _FONTS[ self.options['font_family' ]]['value']
|
||||
self.fontsize = self.options['font_size' ]
|
||||
self.hpages = self.options['h_pages' ]
|
||||
self.nodesep = self.options['nodesep' ]
|
||||
self.noteloc = self.options['noteloc' ]
|
||||
self.notesize = self.options['notesize' ]
|
||||
self.note = self.options['note' ]
|
||||
self.pagedir = _PAGEDIR[ self.options['page_dir' ]]['value']
|
||||
self.rankdir = _RANKDIR[ self.options['rank_dir' ]]['value']
|
||||
self.ranksep = self.options['ranksep' ]
|
||||
self.ratio = _RATIO[ self.options['ratio' ]]['value']
|
||||
self.usesubgraphs = self.options['usesubgraphs' ]
|
||||
self.vpages = self.options['v_pages' ]
|
||||
|
||||
paper_size = paper_style.get_size()
|
||||
pheight = paper_size.get_height_inches()
|
||||
pwidth = paper_size.get_width_inches()
|
||||
|
||||
if self.fontfamily == "":
|
||||
self.fontfamily = "FreeSans"
|
||||
|
||||
# graph size
|
||||
if self.paper.get_orientation() == BaseDoc.PAPER_LANDSCAPE:
|
||||
rotate = 90
|
||||
@ -150,18 +157,33 @@ class GVDocBase(BaseDoc.BaseDoc,BaseDoc.GVDoc):
|
||||
sizew = sizew * self.hpages
|
||||
sizeh = sizeh * self.vpages
|
||||
|
||||
self.dot.write( 'digraph GRAMPS_graph { \n' )
|
||||
self.dot.write( ' bgcolor=white; \n' )
|
||||
self.dot.write( ' center=1; \n' )
|
||||
self.dot.write( ' ratio=%s; \n' % self.ratio )
|
||||
self.dot.write( ' rankdir="%s"; \n' % self.rankdir )
|
||||
self.dot.write( ' mclimit=2.0; \n' )
|
||||
self.dot.write( ' pagedir="%s"; \n' % self.pagedir )
|
||||
self.dot.write( ' page="%3.2f,%3.2f"; \n' % ( pwidth, pheight ) )
|
||||
self.dot.write( ' size="%3.2f,%3.2f"; \n' % ( sizew, sizeh ) )
|
||||
self.dot.write( ' rotate=%d; \n' % rotate )
|
||||
self.dot.write( ' nodesep=0.25; \n' )
|
||||
|
||||
self.dot.write( 'digraph GRAMPS_graph\n' )
|
||||
self.dot.write( '{\n' )
|
||||
self.dot.write( ' bgcolor=white;\n' )
|
||||
self.dot.write( ' center="true"; \n' )
|
||||
self.dot.write( ' charset="iso-8859-1";\n' )
|
||||
self.dot.write( ' concentrate="false";\n' )
|
||||
self.dot.write( ' dpi="%d";\n' % self.dpi )
|
||||
self.dot.write( ' graph [fontsize=%d];\n' % self.fontsize )
|
||||
self.dot.write( ' mclimit="99";\n' )
|
||||
self.dot.write( ' nodesep="%.2f";\n' % self.nodesep )
|
||||
self.dot.write( ' outputorder="edgesfirst";\n' )
|
||||
self.dot.write( ' page="%3.2f,%3.2f"; \n' % (pwidth, pheight) )
|
||||
self.dot.write( ' pagedir="%s"; \n' % self.pagedir )
|
||||
self.dot.write( ' rankdir="%s"; \n' % self.rankdir )
|
||||
self.dot.write( ' ranksep="%.2f";\n' % self.ranksep )
|
||||
self.dot.write( ' ratio="%s"; \n' % self.ratio )
|
||||
self.dot.write( ' rotate="%d"; \n' % rotate )
|
||||
self.dot.write( ' searchsize="100";\n' )
|
||||
self.dot.write( ' size="%3.2f,%3.2f"; \n' % (sizew, sizeh) )
|
||||
self.dot.write( ' splines="true";\n' )
|
||||
self.dot.write( '\n' )
|
||||
# self.dot.write( ' edge [len=0.5 style=solid arrowhead=none arrowtail=normal fontsize=12];\n')
|
||||
# self.dot.write( ' node [style=filled fontname="FreeSans" fontsize=12];\n' )
|
||||
self.dot.write( ' edge [len=0.5 style=solid arrowhead=none arrowtail=normal fontsize=%d];\n' % self.fontsize )
|
||||
self.dot.write( ' node [style=filled fontname="%s" fontsize=%d];\n' % ( self.fontfamily, self.fontsize ) )
|
||||
self.dot.write( '\n' )
|
||||
|
||||
def open(self, filename):
|
||||
self.filename = os.path.normpath(os.path.abspath(filename))
|
||||
|
||||
@ -189,27 +211,22 @@ class GVDocBase(BaseDoc.BaseDoc,BaseDoc.GVDoc):
|
||||
Implementes BaseDoc.GVDoc.add_node().
|
||||
"""
|
||||
line = ' "%s" [' % id
|
||||
line += 'label="%s", ' % label
|
||||
line += 'label="%s"' % label
|
||||
|
||||
if shape:
|
||||
line += 'shape="%s", ' % shape
|
||||
line += ', shape="%s"' % shape
|
||||
|
||||
if color:
|
||||
line += 'color="%s", ' % color
|
||||
line += ', color="%s"' % color
|
||||
|
||||
if fillcolor:
|
||||
line += 'fillcolor="%s", ' % fillcolor
|
||||
|
||||
if self.fontfamily:
|
||||
line += 'fontname="%s", ' % self.fontfamily
|
||||
|
||||
line += 'fontsize="%0.1f", ' % self.fontsize
|
||||
line += ', fillcolor="%s"' % fillcolor
|
||||
|
||||
if style:
|
||||
line += 'style="%s", ' % style
|
||||
line += ', style="%s"' % style
|
||||
|
||||
if url:
|
||||
line += 'URL="%s", ' % url
|
||||
line += ', URL="%s"' % url
|
||||
|
||||
line += '];\n'
|
||||
|
||||
@ -221,17 +238,21 @@ class GVDocBase(BaseDoc.BaseDoc,BaseDoc.GVDoc):
|
||||
|
||||
Implementes BaseDoc.GVDoc.add_link().
|
||||
"""
|
||||
self.dot.write(' "%s" -> "%s" ' % (id1, id2))
|
||||
self.dot.write(' "%s" -> "%s"' % (id1, id2))
|
||||
|
||||
if style or head or tail:
|
||||
self.dot.write('[')
|
||||
self.dot.write(' [')
|
||||
|
||||
if style:
|
||||
self.dot.write('style=%s, ' % style)
|
||||
self.dot.write('style=%s' % style)
|
||||
if head:
|
||||
self.dot.write('arrowhead=%s, ' % head)
|
||||
if style:
|
||||
self.dot.write(', ')
|
||||
self.dot.write('arrowhead=%s' % head)
|
||||
if tail:
|
||||
self.dot.write('arrowtail=%s, ' % tail)
|
||||
if style or head:
|
||||
self.dot.write(', ')
|
||||
self.dot.write('arrowtail=%s' % tail)
|
||||
|
||||
self.dot.write(']')
|
||||
|
||||
@ -625,7 +646,7 @@ class GraphvizReportDialog(ReportDialog):
|
||||
"FreeSans is available from: "
|
||||
"http://www.nongnu.org/freefont/"))
|
||||
self.options.add_menu_option(category,"font_family",font_family)
|
||||
|
||||
|
||||
font_size = NumberOption(_("Font size"),14,8,128)
|
||||
font_size.set_help(_("The font size, in points."))
|
||||
self.options.add_menu_option(category,"font_size",font_size)
|
||||
@ -638,7 +659,30 @@ class GraphvizReportDialog(ReportDialog):
|
||||
rank_dir.set_help(_("Whether graph goes from top to bottom "
|
||||
"or left to right."))
|
||||
self.options.add_menu_option(category,"rank_dir",rank_dir)
|
||||
|
||||
|
||||
dpi = NumberOption(_("DPI"), 75, 20, 1200)
|
||||
dpi.set_help(_( "Dots per inch. When creating images such as "
|
||||
".gif or .png files for the web, try numbers "
|
||||
"such as 75 or 100 DPI. For desktop printing, "
|
||||
"try 300 or 600 DPI."))
|
||||
self.options.add_menu_option(category, "dpi", dpi)
|
||||
|
||||
nodesep = FloatOption(_("Node spacing"), 0.20, 0.01, 5.00)
|
||||
nodesep.set_help(_( "The minimum amount of free space, in inches, "
|
||||
"between individual nodes. For vertical graphs, "
|
||||
"this corresponds to spacing between columns. "
|
||||
"For horizontal graphs, this corresponds to "
|
||||
"spacing between rows."))
|
||||
self.options.add_menu_option(category, "nodesep", nodesep)
|
||||
|
||||
ranksep = FloatOption(_("Rank spacing"), 0.20, 0.01, 5.00)
|
||||
ranksep.set_help(_( "The minimum amount of free space, in inches, "
|
||||
"between ranks. For vertical graphs, this "
|
||||
"corresponds to spacing between rows. For "
|
||||
"horizontal graphs, this corresponds to spacing "
|
||||
"between columns."))
|
||||
self.options.add_menu_option(category, "ranksep", ranksep)
|
||||
|
||||
aspect_ratio = EnumeratedListOption(_("Aspect ratio"), 0)
|
||||
index = 0
|
||||
for item in _RATIO:
|
||||
@ -672,7 +716,14 @@ class GraphvizReportDialog(ReportDialog):
|
||||
"array of pages. This controls the number "
|
||||
"pages in the array vertically."))
|
||||
self.options.add_menu_option(category,"v_pages",v_pages)
|
||||
|
||||
|
||||
usesubgraphs = BooleanOption(_('Use subgraphs'), False)
|
||||
usesubgraphs.set_help(_("Subgraphs can help GraphViz position "
|
||||
"certain linked nodes closer together, "
|
||||
"but with non-trivial graphs will result "
|
||||
"in longer lines and larger graphs."))
|
||||
self.options.add_menu_option(category, "usesubgraphs", usesubgraphs)
|
||||
|
||||
################################
|
||||
category = _("Notes")
|
||||
################################
|
||||
|
Loading…
Reference in New Issue
Block a user