--- xdot.py.orig 2016-03-07 15:58:48 UTC +++ xdot.py @@ -30,13 +30,13 @@ import time import re import optparse -from gi.repository import GLib -from gi.repository import GObject -from gi.repository import Gtk -from gi.repository import Gdk -from gi.repository import GdkPixbuf -from gi.repository import Pango -from gi.repository import PangoCairo +import glib +import gobject +import gtk +import gtk.gdk +import gtk.keysyms +import pango +import pangocairo import cairo @@ -120,7 +120,7 @@ class TextShape(Shape): try: layout = self.layout except AttributeError: - layout = PangoCairo.create_layout(cr) + layout = pangcairo.create_layout(cr) # set font options # see http://lists.freedesktop.org/archives/cairo/2007-February/009688.html @@ -130,21 +130,21 @@ class TextShape(Shape): fo.set_hint_style(cairo.HINT_STYLE_NONE) fo.set_hint_metrics(cairo.HINT_METRICS_OFF) try: - PangoCairo.context_set_font_options(context, fo) + pangcairo.context_set_font_options(context, fo) except TypeError: # XXX: Some broken pangocairo bindings show the error # 'TypeError: font_options must be a cairo.FontOptions or None' pass except KeyError: - # cairo.FontOptions is not registered as a foreign struct in older PyGObject versions. + # cairo.FontOptions is not registered as a foreign struct in older Pygobject versions. # https://git.gnome.org/browse/pygobject/commit/?id=b21f66d2a399b8c9a36a1758107b7bdff0ec8eaa pass # set font - font = Pango.FontDescription() + font = pango.FontDescription() - # https://developer.gnome.org/pango/stable/PangoMarkupFormat.html - markup = GObject.markup_escape_text(self.t) + # https://developer.gnome.org/pango/stable/pangoMarkupFormat.html + markup = gobject.markup_escape_text(self.t) if self.pen.bold: markup = '' + markup + '' if self.pen.italic: @@ -158,12 +158,12 @@ class TextShape(Shape): if self.pen.subscript: markup = '' + markup + '' - success, attrs, text, accel_char = Pango.parse_markup(markup, -1, '\x00') + success, attrs, text, accel_char = pango.parse_markup(markup, -1, '\x00') assert success layout.set_attributes(attrs) font.set_family(self.pen.fontname) - font.set_absolute_size(self.pen.fontsize*Pango.SCALE) + font.set_absolute_size(self.pen.fontsize*pango.SCALE) layout.set_font_description(font) # set text @@ -172,13 +172,13 @@ class TextShape(Shape): # cache it self.layout = layout else: - PangoCairo.update_layout(cr, layout) + pangcairo.update_layout(cr, layout) descent = 2 # XXX get descender from font metrics width, height = layout.get_size() - width = float(width)/Pango.SCALE - height = float(height)/Pango.SCALE + width = float(width)/pango.SCALE + height = float(height)/pango.SCALE # we know the width that dot thinks this text should have # we do not necessarily have a font with the same metrics @@ -207,7 +207,7 @@ class TextShape(Shape): cr.save() cr.scale(f, f) cr.set_source_rgba(*self.select_pen(highlight).color) - PangoCairo.show_layout(cr, layout) + pangcairo.show_layout(cr, layout) cr.restore() if 0: # DEBUG @@ -239,13 +239,13 @@ class ImageShape(Shape): self.path = path def draw(self, cr, highlight=False): - pixbuf = GdkPixbuf.Pixbuf.new_from_file(self.path) + pixbuf = gtk.gdk.pixbuf_new_from_file(self.path) sx = float(self.w)/float(pixbuf.get_width()) sy = float(self.h)/float(pixbuf.get_height()) cr.save() cr.translate(self.x0, self.y0 - self.h) cr.scale(sx, sy) - Gdk.cairo_set_source_pixbuf(cr, pixbuf, 0, 0) + gdk.cairo_set_source_pixbuf(cr, pixbuf, 0, 0) cr.paint() cr.restore() @@ -631,7 +631,7 @@ class XDotAttrParser: def lookup_color(self, c): try: - color = Gdk.color_parse(c) + color = gdk.color_parse(c) except ValueError: pass else: @@ -1318,12 +1318,12 @@ class Animation(object): self.timeout_id = None def start(self): - self.timeout_id = GLib.timeout_add(int(self.step * 1000), self.tick) + self.timeout_id = glib.timeout_add(int(self.step * 1000), self.tick) def stop(self): self.dot_widget.animation = NoAnimation(self.dot_widget) if self.timeout_id is not None: - GLib.source_remove(self.timeout_id) + glib.source_remove(self.timeout_id) self.timeout_id = None def tick(self): @@ -1453,7 +1453,7 @@ class NullAction(DragAction): if item is None: item = dot_widget.get_jump(x, y) if item is not None: - dot_widget.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.HAND2)) + dot_widget.get_window().set_cursor(gdk.Cursor(gdk.CursorType.HAND2)) dot_widget.set_highlight(item.highlight) else: dot_widget.get_window().set_cursor(None) @@ -1463,7 +1463,7 @@ class NullAction(DragAction): class PanAction(DragAction): def start(self): - self.dot_widget.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.FLEUR)) + self.dot_widget.get_window().set_cursor(gdk.Cursor(gdk.CursorType.FLEUR)) def drag(self, deltax, deltay): self.dot_widget.x += deltax / self.dot_widget.zoom_ratio @@ -1518,18 +1518,18 @@ class ZoomAreaAction(DragAction): self.dot_widget.queue_draw() -class DotWidget(Gtk.DrawingArea): +class DotWidget(gtk.DrawingArea): """GTK widget that draws dot graphs.""" - #TODO GTK3: Second argument has to be of type Gdk.EventButton instead of object. + #TODO GTK3: Second argument has to be of type gdk.EventButton instead of object. __gsignals__ = { - 'clicked' : (GObject.SIGNAL_RUN_LAST, None, (str, object)) + 'clicked' : (gobject.SIGNAL_RUN_LAST, None, (str, object)) } filter = 'dot' def __init__(self): - Gtk.DrawingArea.__init__(self) + gtk.DrawingArea.__init__(self) self.graph = Graph() self.openfilename = None @@ -1537,13 +1537,13 @@ class DotWidget(Gtk.DrawingArea): self.set_can_focus(True) self.connect("draw", self.on_draw) - self.add_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK) + self.add_events(gdk.EventMask.BUTTON_PRESS_MASK | gdk.EventMask.BUTTON_RELEASE_MASK) self.connect("button-press-event", self.on_area_button_press) self.connect("button-release-event", self.on_area_button_release) - self.add_events(Gdk.EventMask.POINTER_MOTION_MASK | - Gdk.EventMask.POINTER_MOTION_HINT_MASK | - Gdk.EventMask.BUTTON_RELEASE_MASK | - Gdk.EventMask.SCROLL_MASK) + self.add_events(gdk.EventMask.POINTER_MOTION_MASK | + gdk.EventMask.POINTER_MOTION_HINT_MASK | + gdk.EventMask.BUTTON_RELEASE_MASK | + gdk.EventMask.SCROLL_MASK) self.connect("motion-notify-event", self.on_area_motion_notify) self.connect("scroll-event", self.on_area_scroll_event) self.connect("size-allocate", self.on_area_size_allocate) @@ -1551,7 +1551,7 @@ class DotWidget(Gtk.DrawingArea): self.connect('key-press-event', self.on_key_press_event) self.last_mtime = None - GLib.timeout_add(1000, self.update) + glib.timeout_add(1000, self.update) self.x, self.y = 0.0, 0.0 self.zoom_ratio = 1.0 @@ -1729,59 +1729,59 @@ class DotWidget(Gtk.DrawingArea): POS_INCREMENT = 100 def on_key_press_event(self, widget, event): - if event.keyval == Gdk.KEY_Left: + if event.keyval == gdk.KEY_Left: self.x -= self.POS_INCREMENT/self.zoom_ratio self.queue_draw() return True - if event.keyval == Gdk.KEY_Right: + if event.keyval == gdk.KEY_Right: self.x += self.POS_INCREMENT/self.zoom_ratio self.queue_draw() return True - if event.keyval == Gdk.KEY_Up: + if event.keyval == gdk.KEY_Up: self.y -= self.POS_INCREMENT/self.zoom_ratio self.queue_draw() return True - if event.keyval == Gdk.KEY_Down: + if event.keyval == gdk.KEY_Down: self.y += self.POS_INCREMENT/self.zoom_ratio self.queue_draw() return True - if event.keyval in (Gdk.KEY_Page_Up, - Gdk.KEY_plus, - Gdk.KEY_equal, - Gdk.KEY_KP_Add): + if event.keyval in (gdk.KEY_Page_Up, + gdk.KEY_plus, + gdk.KEY_equal, + gdk.KEY_KP_Add): self.zoom_image(self.zoom_ratio * self.ZOOM_INCREMENT) self.queue_draw() return True - if event.keyval in (Gdk.KEY_Page_Down, - Gdk.KEY_minus, - Gdk.KEY_KP_Subtract): + if event.keyval in (gdk.KEY_Page_Down, + gdk.KEY_minus, + gdk.KEY_KP_Subtract): self.zoom_image(self.zoom_ratio / self.ZOOM_INCREMENT) self.queue_draw() return True - if event.keyval == Gdk.KEY_Escape: + if event.keyval == gdk.KEY_Escape: self.drag_action.abort() self.drag_action = NullAction(self) return True - if event.keyval == Gdk.KEY_r: + if event.keyval == gdk.KEY_r: self.reload() return True - if event.keyval == Gdk.KEY_f: + if event.keyval == gdk.KEY_f: win = widget.get_toplevel() find_toolitem = win.uimanager.get_widget('/ToolBar/Find') textentry = find_toolitem.get_children() win.set_focus(textentry[0]) return True - if event.keyval == Gdk.KEY_q: - Gtk.main_quit() + if event.keyval == gdk.KEY_q: + gtk.main_quit() return True - if event.keyval == Gdk.KEY_p: + if event.keyval == gdk.KEY_p: self.on_print() return True return False print_settings = None def on_print(self, action=None): - print_op = Gtk.PrintOperation() + print_op = gtk.PrintOperation() if self.print_settings != None: print_op.set_print_settings(self.print_settings) @@ -1789,8 +1789,8 @@ class DotWidget(Gtk.DrawingArea): print_op.connect("begin_print", self.begin_print) print_op.connect("draw_page", self.draw_page) - res = print_op.run(Gtk.PrintOperationAction.PRINT_DIALOG, self.get_toplevel()) - if res == Gtk.PrintOperationResult.APPLY: + res = print_op.run(gtk.PrintOperationAction.PRINT_DIALOG, self.get_toplevel()) + if res == gtk.PrintOperationResult.APPLY: self.print_settings = print_op.get_print_settings() def begin_print(self, operation, context): @@ -1810,10 +1810,10 @@ class DotWidget(Gtk.DrawingArea): def get_drag_action(self, event): state = event.state if event.button in (1, 2): # left or middle button - modifiers = Gtk.accelerator_get_default_mod_mask() - if state & modifiers == Gdk.ModifierType.CONTROL_MASK: + modifiers = gtk.accelerator_get_default_mod_mask() + if state & modifiers == gdk.ModifierType.CONTROL_MASK: return ZoomAction - elif state & modifiers == Gdk.ModifierType.SHIFT_MASK: + elif state & modifiers == gdk.ModifierType.SHIFT_MASK: return ZoomAreaAction else: return PanAction @@ -1831,7 +1831,7 @@ class DotWidget(Gtk.DrawingArea): return False def is_click(self, event, click_fuzz=4, click_timeout=1.0): - assert event.type == Gdk.EventType.BUTTON_RELEASE + assert event.type == gdk.EventType.BUTTON_RELEASE if self.presstime is None: # got a button release without seeing the press? return False @@ -1873,11 +1873,11 @@ class DotWidget(Gtk.DrawingArea): return False def on_area_scroll_event(self, area, event): - if event.direction == Gdk.ScrollDirection.UP: + if event.direction == gdk.ScrollDirection.UP: self.zoom_image(self.zoom_ratio * self.ZOOM_INCREMENT, pos=(event.x, event.y)) return True - if event.direction == Gdk.ScrollDirection.DOWN: + if event.direction == gdk.ScrollDirection.DOWN: self.zoom_image(self.zoom_ratio / self.ZOOM_INCREMENT, pos=(event.x, event.y)) return True @@ -1918,14 +1918,14 @@ class DotWidget(Gtk.DrawingArea): return self.graph.get_jump(x, y) -class FindMenuToolAction(Gtk.Action): +class FindMenuToolAction(gtk.Action): __gtype_name__ = "FindMenuToolAction" def do_create_tool_item(self): - return Gtk.ToolItem() + return gtk.ToolItem() -class DotWindow(Gtk.Window): +class DotWindow(gtk.Window): ui = ''' @@ -1947,7 +1947,7 @@ class DotWindow(Gtk.Window): base_title = 'Dot Viewer' def __init__(self, widget=None): - Gtk.Window.__init__(self) + gtk.Window.__init__(self) self.graph = Graph() @@ -1955,31 +1955,31 @@ class DotWindow(Gtk.Window): window.set_title(self.base_title) window.set_default_size(512, 512) - vbox = Gtk.VBox() + vbox = gtk.VBox() window.add(vbox) self.dotwidget = widget or DotWidget() # Create a UIManager instance - uimanager = self.uimanager = Gtk.UIManager() + uimanager = self.uimanager = gtk.UIManager() # Add the accelerator group to the toplevel window accelgroup = uimanager.get_accel_group() window.add_accel_group(accelgroup) # Create an ActionGroup - actiongroup = Gtk.ActionGroup('Actions') + actiongroup = gtk.ActionGroup('Actions') self.actiongroup = actiongroup # Create actions actiongroup.add_actions(( - ('Open', Gtk.STOCK_OPEN, None, None, None, self.on_open), - ('Reload', Gtk.STOCK_REFRESH, None, None, None, self.on_reload), - ('Print', Gtk.STOCK_PRINT, None, None, "Prints the currently visible part of the graph", self.dotwidget.on_print), - ('ZoomIn', Gtk.STOCK_ZOOM_IN, None, None, None, self.dotwidget.on_zoom_in), - ('ZoomOut', Gtk.STOCK_ZOOM_OUT, None, None, None, self.dotwidget.on_zoom_out), - ('ZoomFit', Gtk.STOCK_ZOOM_FIT, None, None, None, self.dotwidget.on_zoom_fit), - ('Zoom100', Gtk.STOCK_ZOOM_100, None, None, None, self.dotwidget.on_zoom_100), + ('Open', gtk.STOCK_OPEN, None, None, None, self.on_open), + ('Reload', gtk.STOCK_REFRESH, None, None, None, self.on_reload), + ('Print', gtk.STOCK_PRINT, None, None, "Prints the currently visible part of the graph", self.dotwidget.on_print), + ('ZoomIn', gtk.STOCK_ZOOM_IN, None, None, None, self.dotwidget.on_zoom_in), + ('ZoomOut', gtk.STOCK_ZOOM_OUT, None, None, None, self.dotwidget.on_zoom_out), + ('ZoomFit', gtk.STOCK_ZOOM_FIT, None, None, None, self.dotwidget.on_zoom_fit), + ('Zoom100', gtk.STOCK_ZOOM_100, None, None, None, self.dotwidget.on_zoom_100), )) find_action = FindMenuToolAction("Find", None, @@ -2004,8 +2004,8 @@ class DotWindow(Gtk.Window): # Add Find text search find_toolitem = uimanager.get_widget('/ToolBar/Find') - self.textentry = Gtk.Entry(max_length=20) - self.textentry.set_icon_from_stock(0, Gtk.STOCK_FIND) + self.textentry = gtk.Entry(max_length=20) + self.textentry.set_icon_from_stock(0, gtk.STOCK_FIND) find_toolitem.add(self.textentry) self.textentry.set_activates_default(True) @@ -2073,23 +2073,23 @@ class DotWindow(Gtk.Window): self.error_dialog(str(ex)) def on_open(self, action): - chooser = Gtk.FileChooserDialog(title="Open dot File", - action=Gtk.FileChooserAction.OPEN, - buttons=(Gtk.STOCK_CANCEL, - Gtk.ResponseType.CANCEL, - Gtk.STOCK_OPEN, - Gtk.ResponseType.OK)) - chooser.set_default_response(Gtk.ResponseType.OK) + chooser = gtk.FileChooserDialog(title="Open dot File", + action=gtk.FileChooserAction.OPEN, + buttons=(gtk.STOCK_CANCEL, + gtk.ResponseType.CANCEL, + gtk.STOCK_OPEN, + gtk.ResponseType.OK)) + chooser.set_default_response(gtk.ResponseType.OK) chooser.set_current_folder(self.last_open_dir) - filter = Gtk.FileFilter() + filter = gtk.FileFilter() filter.set_name("Graphviz dot files") filter.add_pattern("*.dot") chooser.add_filter(filter) - filter = Gtk.FileFilter() + filter = gtk.FileFilter() filter.set_name("All files") filter.add_pattern("*") chooser.add_filter(filter) - if chooser.run() == Gtk.ResponseType.OK: + if chooser.run() == gtk.ResponseType.OK: filename = chooser.get_filename() self.last_open_dir = chooser.get_current_folder() chooser.destroy() @@ -2101,9 +2101,9 @@ class DotWindow(Gtk.Window): self.dotwidget.reload() def error_dialog(self, message): - dlg = Gtk.MessageDialog(type=Gtk.MessageType.ERROR, + dlg = gtk.MessageDialog(type=gtk.MessageType.ERROR, message_format=message, - buttons=Gtk.ButtonsType.OK) + buttons=gtk.ButtonsType.OK) dlg.set_title(self.base_title) dlg.run() dlg.destroy() @@ -2150,14 +2150,14 @@ Shortcuts: parser.error('incorrect number of arguments') win = DotWindow() - win.connect('delete-event', Gtk.main_quit) + win.connect('delete-event', gtk.main_quit) win.set_filter(options.filter) if len(args) >= 1: if args[0] == '-': win.set_dotcode(sys.stdin.read()) else: win.open_file(args[0]) - Gtk.main() + gtk.main() # Apache-Style Software License for ColorBrewer software and ColorBrewer Color