| ... | ... |
@@ -17,8 +17,7 @@ |
| 17 | 17 |
# |
| 18 | 18 |
|
| 19 | 19 |
|
| 20 |
-import gtk |
|
| 21 |
-import gtk.gdk |
|
| 20 |
+from gi.repository import Gtk |
|
| 22 | 21 |
|
| 23 | 22 |
import xdot |
| 24 | 23 |
|
| ... | ... |
@@ -27,12 +26,12 @@ class MyDotWindow(xdot.DotWindow): |
| 27 | 26 |
|
| 28 | 27 |
def __init__(self): |
| 29 | 28 |
xdot.DotWindow.__init__(self) |
| 30 |
- self.widget.connect('clicked', self.on_url_clicked)
|
|
| 29 |
+ self.dotwidget.connect('clicked', self.on_url_clicked)
|
|
| 31 | 30 |
|
| 32 | 31 |
def on_url_clicked(self, widget, url, event): |
| 33 |
- dialog = gtk.MessageDialog( |
|
| 32 |
+ dialog = Gtk.MessageDialog( |
|
| 34 | 33 |
parent = self, |
| 35 |
- buttons = gtk.BUTTONS_OK, |
|
| 34 |
+ buttons = Gtk.ButtonsType.OK, |
|
| 36 | 35 |
message_format="%s clicked" % url) |
| 37 | 36 |
dialog.connect('response', lambda dialog, response: dialog.destroy())
|
| 38 | 37 |
dialog.run() |
| ... | ... |
@@ -51,8 +50,8 @@ digraph G {
|
| 51 | 50 |
def main(): |
| 52 | 51 |
window = MyDotWindow() |
| 53 | 52 |
window.set_dotcode(dotcode) |
| 54 |
- window.connect('destroy', gtk.main_quit)
|
|
| 55 |
- gtk.main() |
|
| 53 |
+ window.connect('delete-event', Gtk.main_quit)
|
|
| 54 |
+ Gtk.main() |
|
| 56 | 55 |
|
| 57 | 56 |
|
| 58 | 57 |
if __name__ == '__main__': |
| ... | ... |
@@ -30,13 +30,14 @@ import time |
| 30 | 30 |
import re |
| 31 | 31 |
import optparse |
| 32 | 32 |
|
| 33 |
-import gobject |
|
| 34 |
-import gtk |
|
| 35 |
-import gtk.gdk |
|
| 36 |
-import gtk.keysyms |
|
| 33 |
+from gi.repository import GLib |
|
| 34 |
+from gi.repository import GObject |
|
| 35 |
+from gi.repository import Gtk |
|
| 36 |
+from gi.repository import Gdk |
|
| 37 |
+from gi.repository import GdkPixbuf |
|
| 38 |
+from gi.repository import Pango |
|
| 39 |
+from gi.repository import PangoCairo |
|
| 37 | 40 |
import cairo |
| 38 |
-import pango |
|
| 39 |
-import pangocairo |
|
| 40 | 41 |
|
| 41 | 42 |
|
| 42 | 43 |
# See http://www.graphviz.org/pub/scm/graphviz-cairo/plugin/cairo/gvrender_cairo.c |
| ... | ... |
@@ -119,27 +120,27 @@ class TextShape(Shape): |
| 119 | 120 |
try: |
| 120 | 121 |
layout = self.layout |
| 121 | 122 |
except AttributeError: |
| 122 |
- layout = cr.create_layout() |
|
| 123 |
+ context = Gdk.pango_context_get() |
|
| 124 |
+ layout = Pango.Layout(context) |
|
| 123 | 125 |
|
| 124 | 126 |
# set font options |
| 125 | 127 |
# see http://lists.freedesktop.org/archives/cairo/2007-February/009688.html |
| 126 |
- context = layout.get_context() |
|
| 127 | 128 |
fo = cairo.FontOptions() |
| 128 | 129 |
fo.set_antialias(cairo.ANTIALIAS_DEFAULT) |
| 129 | 130 |
fo.set_hint_style(cairo.HINT_STYLE_NONE) |
| 130 | 131 |
fo.set_hint_metrics(cairo.HINT_METRICS_OFF) |
| 131 | 132 |
try: |
| 132 |
- pangocairo.context_set_font_options(context, fo) |
|
| 133 |
+ PangoCairo.context_set_font_options(context, fo) |
|
| 133 | 134 |
except TypeError: |
| 134 | 135 |
# XXX: Some broken pangocairo bindings show the error |
| 135 | 136 |
# 'TypeError: font_options must be a cairo.FontOptions or None' |
| 136 | 137 |
pass |
| 137 | 138 |
|
| 138 | 139 |
# set font |
| 139 |
- font = pango.FontDescription() |
|
| 140 |
+ font = Pango.FontDescription() |
|
| 140 | 141 |
|
| 141 | 142 |
# https://developer.gnome.org/pango/stable/PangoMarkupFormat.html |
| 142 |
- markup = gobject.markup_escape_text(self.t) |
|
| 143 |
+ markup = GObject.markup_escape_text(self.t) |
|
| 143 | 144 |
if self.pen.bold: |
| 144 | 145 |
markup = '<b>' + markup + '</b>' |
| 145 | 146 |
if self.pen.italic: |
| ... | ... |
@@ -153,26 +154,27 @@ class TextShape(Shape): |
| 153 | 154 |
if self.pen.subscript: |
| 154 | 155 |
markup = '<sub><small>' + markup + '</small></sub>' |
| 155 | 156 |
|
| 156 |
- attrs, text, accel_char = pango.parse_markup(markup, u'\x00') |
|
| 157 |
+ success, attrs, text, accel_char = Pango.parse_markup(markup, -1, u'\x00') |
|
| 158 |
+ assert success |
|
| 157 | 159 |
layout.set_attributes(attrs) |
| 158 | 160 |
|
| 159 | 161 |
font.set_family(self.pen.fontname) |
| 160 |
- font.set_absolute_size(self.pen.fontsize*pango.SCALE) |
|
| 162 |
+ font.set_absolute_size(self.pen.fontsize*Pango.SCALE) |
|
| 161 | 163 |
layout.set_font_description(font) |
| 162 | 164 |
|
| 163 | 165 |
# set text |
| 164 |
- layout.set_text(text) |
|
| 166 |
+ layout.set_text(text, len(text)) |
|
| 165 | 167 |
|
| 166 | 168 |
# cache it |
| 167 | 169 |
self.layout = layout |
| 168 | 170 |
else: |
| 169 |
- cr.update_layout(layout) |
|
| 171 |
+ PangoCairo.update_layout(cr, layout) |
|
| 170 | 172 |
|
| 171 | 173 |
descent = 2 # XXX get descender from font metrics |
| 172 | 174 |
|
| 173 | 175 |
width, height = layout.get_size() |
| 174 |
- width = float(width)/pango.SCALE |
|
| 175 |
- height = float(height)/pango.SCALE |
|
| 176 |
+ width = float(width)/Pango.SCALE |
|
| 177 |
+ height = float(height)/Pango.SCALE |
|
| 176 | 178 |
|
| 177 | 179 |
# we know the width that dot thinks this text should have |
| 178 | 180 |
# we do not necessarily have a font with the same metrics |
| ... | ... |
@@ -201,7 +203,7 @@ class TextShape(Shape): |
| 201 | 203 |
cr.save() |
| 202 | 204 |
cr.scale(f, f) |
| 203 | 205 |
cr.set_source_rgba(*self.select_pen(highlight).color) |
| 204 |
- cr.show_layout(layout) |
|
| 206 |
+ PangoCairo.show_layout(cr, layout) |
|
| 205 | 207 |
cr.restore() |
| 206 | 208 |
|
| 207 | 209 |
if 0: # DEBUG |
| ... | ... |
@@ -233,15 +235,14 @@ class ImageShape(Shape): |
| 233 | 235 |
self.path = path |
| 234 | 236 |
|
| 235 | 237 |
def draw(self, cr, highlight=False): |
| 236 |
- cr2 = gtk.gdk.CairoContext(cr) |
|
| 237 |
- pixbuf = gtk.gdk.pixbuf_new_from_file(self.path) |
|
| 238 |
+ pixbuf = GdkPixbuf.Pixbuf.new_from_file(self.path) |
|
| 238 | 239 |
sx = float(self.w)/float(pixbuf.get_width()) |
| 239 | 240 |
sy = float(self.h)/float(pixbuf.get_height()) |
| 240 | 241 |
cr.save() |
| 241 | 242 |
cr.translate(self.x0, self.y0 - self.h) |
| 242 | 243 |
cr.scale(sx, sy) |
| 243 |
- cr2.set_source_pixbuf(pixbuf, 0, 0) |
|
| 244 |
- cr2.paint() |
|
| 244 |
+ Gdk.cairo_set_source_pixbuf(cr, pixbuf, 0, 0) |
|
| 245 |
+ cr.paint() |
|
| 245 | 246 |
cr.restore() |
| 246 | 247 |
|
| 247 | 248 |
|
| ... | ... |
@@ -622,7 +623,7 @@ class XDotAttrParser: |
| 622 | 623 |
|
| 623 | 624 |
def lookup_color(self, c): |
| 624 | 625 |
try: |
| 625 |
- color = gtk.gdk.color_parse(c) |
|
| 626 |
+ color = Gdk.color_parse(c) |
|
| 626 | 627 |
except ValueError: |
| 627 | 628 |
pass |
| 628 | 629 |
else: |
| ... | ... |
@@ -1304,12 +1305,12 @@ class Animation(object): |
| 1304 | 1305 |
self.timeout_id = None |
| 1305 | 1306 |
|
| 1306 | 1307 |
def start(self): |
| 1307 |
- self.timeout_id = gobject.timeout_add(int(self.step * 1000), self.tick) |
|
| 1308 |
+ self.timeout_id = GLib.timeout_add(int(self.step * 1000), self.tick) |
|
| 1308 | 1309 |
|
| 1309 | 1310 |
def stop(self): |
| 1310 | 1311 |
self.dot_widget.animation = NoAnimation(self.dot_widget) |
| 1311 | 1312 |
if self.timeout_id is not None: |
| 1312 |
- gobject.source_remove(self.timeout_id) |
|
| 1313 |
+ GLib.source_remove(self.timeout_id) |
|
| 1313 | 1314 |
self.timeout_id = None |
| 1314 | 1315 |
|
| 1315 | 1316 |
def tick(self): |
| ... | ... |
@@ -1397,7 +1398,7 @@ class DragAction(object): |
| 1397 | 1398 |
|
| 1398 | 1399 |
def on_motion_notify(self, event): |
| 1399 | 1400 |
if event.is_hint: |
| 1400 |
- x, y, state = event.window.get_pointer() |
|
| 1401 |
+ window, x, y, state = event.window.get_device_position(event.device) |
|
| 1401 | 1402 |
else: |
| 1402 | 1403 |
x, y, state = event.x, event.y, event.state |
| 1403 | 1404 |
deltax = self.prevmousex - x |
| ... | ... |
@@ -1431,7 +1432,7 @@ class NullAction(DragAction): |
| 1431 | 1432 |
|
| 1432 | 1433 |
def on_motion_notify(self, event): |
| 1433 | 1434 |
if event.is_hint: |
| 1434 |
- x, y, state = event.window.get_pointer() |
|
| 1435 |
+ window, x, y, state = event.window.get_device_position(event.device) |
|
| 1435 | 1436 |
else: |
| 1436 | 1437 |
x, y, state = event.x, event.y, event.state |
| 1437 | 1438 |
dot_widget = self.dot_widget |
| ... | ... |
@@ -1439,17 +1440,17 @@ class NullAction(DragAction): |
| 1439 | 1440 |
if item is None: |
| 1440 | 1441 |
item = dot_widget.get_jump(x, y) |
| 1441 | 1442 |
if item is not None: |
| 1442 |
- dot_widget.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.HAND2)) |
|
| 1443 |
+ dot_widget.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.HAND2)) |
|
| 1443 | 1444 |
dot_widget.set_highlight(item.highlight) |
| 1444 | 1445 |
else: |
| 1445 |
- dot_widget.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.ARROW)) |
|
| 1446 |
+ dot_widget.get_window().set_cursor(None) |
|
| 1446 | 1447 |
dot_widget.set_highlight(None) |
| 1447 | 1448 |
|
| 1448 | 1449 |
|
| 1449 | 1450 |
class PanAction(DragAction): |
| 1450 | 1451 |
|
| 1451 | 1452 |
def start(self): |
| 1452 |
- self.dot_widget.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.FLEUR)) |
|
| 1453 |
+ self.dot_widget.get_window().set_cursor(Gdk.Cursor(Gdk.CursorType.FLEUR)) |
|
| 1453 | 1454 |
|
| 1454 | 1455 |
def drag(self, deltax, deltay): |
| 1455 | 1456 |
self.dot_widget.x += deltax / self.dot_widget.zoom_ratio |
| ... | ... |
@@ -1457,7 +1458,7 @@ class PanAction(DragAction): |
| 1457 | 1458 |
self.dot_widget.queue_draw() |
| 1458 | 1459 |
|
| 1459 | 1460 |
def stop(self): |
| 1460 |
- self.dot_widget.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.ARROW)) |
|
| 1461 |
+ self.dot_widget.get_window().set_cursor(None) |
|
| 1461 | 1462 |
|
| 1462 | 1463 |
abort = stop |
| 1463 | 1464 |
|
| ... | ... |
@@ -1504,28 +1505,32 @@ class ZoomAreaAction(DragAction): |
| 1504 | 1505 |
self.dot_widget.queue_draw() |
| 1505 | 1506 |
|
| 1506 | 1507 |
|
| 1507 |
-class DotWidget(gtk.DrawingArea): |
|
| 1508 |
- """PyGTK widget that draws dot graphs.""" |
|
| 1508 |
+class DotWidget(Gtk.DrawingArea): |
|
| 1509 |
+ """GTK widget that draws dot graphs.""" |
|
| 1509 | 1510 |
|
| 1511 |
+ #TODO GTK3: Second argument has to be of type Gdk.EventButton instead of object. |
|
| 1510 | 1512 |
__gsignals__ = {
|
| 1511 |
- 'expose-event': 'override', |
|
| 1512 |
- 'clicked' : (gobject.SIGNAL_RUN_LAST, gobject.TYPE_NONE, (gobject.TYPE_STRING, gtk.gdk.Event)) |
|
| 1513 |
+ 'clicked' : (GObject.SIGNAL_RUN_LAST, None, (str, object)) |
|
| 1513 | 1514 |
} |
| 1514 | 1515 |
|
| 1515 | 1516 |
filter = 'dot' |
| 1516 | 1517 |
|
| 1517 | 1518 |
def __init__(self): |
| 1518 |
- gtk.DrawingArea.__init__(self) |
|
| 1519 |
+ Gtk.DrawingArea.__init__(self) |
|
| 1519 | 1520 |
|
| 1520 | 1521 |
self.graph = Graph() |
| 1521 | 1522 |
self.openfilename = None |
| 1522 | 1523 |
|
| 1523 |
- self.set_flags(gtk.CAN_FOCUS) |
|
| 1524 |
+ self.set_can_focus(True) |
|
| 1524 | 1525 |
|
| 1525 |
- self.add_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK) |
|
| 1526 |
+ self.connect("draw", self.on_draw)
|
|
| 1527 |
+ self.add_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK) |
|
| 1526 | 1528 |
self.connect("button-press-event", self.on_area_button_press)
|
| 1527 | 1529 |
self.connect("button-release-event", self.on_area_button_release)
|
| 1528 |
- self.add_events(gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.POINTER_MOTION_HINT_MASK | gtk.gdk.BUTTON_RELEASE_MASK) |
|
| 1530 |
+ self.add_events(Gdk.EventMask.POINTER_MOTION_MASK | |
|
| 1531 |
+ Gdk.EventMask.POINTER_MOTION_HINT_MASK | |
|
| 1532 |
+ Gdk.EventMask.BUTTON_RELEASE_MASK | |
|
| 1533 |
+ Gdk.EventMask.SCROLL_MASK) |
|
| 1529 | 1534 |
self.connect("motion-notify-event", self.on_area_motion_notify)
|
| 1530 | 1535 |
self.connect("scroll-event", self.on_area_scroll_event)
|
| 1531 | 1536 |
self.connect("size-allocate", self.on_area_size_allocate)
|
| ... | ... |
@@ -1533,7 +1538,7 @@ class DotWidget(gtk.DrawingArea): |
| 1533 | 1538 |
self.connect('key-press-event', self.on_key_press_event)
|
| 1534 | 1539 |
self.last_mtime = None |
| 1535 | 1540 |
|
| 1536 |
- gobject.timeout_add(1000, self.update) |
|
| 1541 |
+ GLib.timeout_add(1000, self.update) |
|
| 1537 | 1542 |
|
| 1538 | 1543 |
self.x, self.y = 0.0, 0.0 |
| 1539 | 1544 |
self.zoom_ratio = 1.0 |
| ... | ... |
@@ -1567,9 +1572,9 @@ class DotWidget(gtk.DrawingArea): |
| 1567 | 1572 |
if error: |
| 1568 | 1573 |
sys.stderr.write(error + '\n') |
| 1569 | 1574 |
if p.returncode != 0: |
| 1570 |
- dialog = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, |
|
| 1575 |
+ dialog = Gtk.MessageDialog(type=Gtk.MessageType.ERROR, |
|
| 1571 | 1576 |
message_format=error, |
| 1572 |
- buttons=gtk.BUTTONS_OK) |
|
| 1577 |
+ buttons=Gtk.ButtonsType.OK) |
|
| 1573 | 1578 |
dialog.set_title('Dot Viewer')
|
| 1574 | 1579 |
dialog.run() |
| 1575 | 1580 |
dialog.destroy() |
| ... | ... |
@@ -1586,9 +1591,9 @@ class DotWidget(gtk.DrawingArea): |
| 1586 | 1591 |
try: |
| 1587 | 1592 |
self.set_xdotcode(xdotcode) |
| 1588 | 1593 |
except ParseError as ex: |
| 1589 |
- dialog = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, |
|
| 1594 |
+ dialog = Gtk.MessageDialog(type=Gtk.MessageType.ERROR, |
|
| 1590 | 1595 |
message_format=str(ex), |
| 1591 |
- buttons=gtk.BUTTONS_OK) |
|
| 1596 |
+ buttons=Gtk.ButtonsType.OK) |
|
| 1592 | 1597 |
dialog.set_title('Dot Viewer')
|
| 1593 | 1598 |
dialog.run() |
| 1594 | 1599 |
dialog.destroy() |
| ... | ... |
@@ -1623,16 +1628,7 @@ class DotWidget(gtk.DrawingArea): |
| 1623 | 1628 |
self.reload() |
| 1624 | 1629 |
return True |
| 1625 | 1630 |
|
| 1626 |
- def do_expose_event(self, event): |
|
| 1627 |
- cr = self.window.cairo_create() |
|
| 1628 |
- |
|
| 1629 |
- # set a clip region for the expose event |
|
| 1630 |
- cr.rectangle( |
|
| 1631 |
- event.area.x, event.area.y, |
|
| 1632 |
- event.area.width, event.area.height |
|
| 1633 |
- ) |
|
| 1634 |
- cr.clip() |
|
| 1635 |
- |
|
| 1631 |
+ def on_draw(self, widget, cr): |
|
| 1636 | 1632 |
cr.set_source_rgba(1.0, 1.0, 1.0, 1.0) |
| 1637 | 1633 |
cr.paint() |
| 1638 | 1634 |
|
| ... | ... |
@@ -1728,59 +1724,59 @@ class DotWidget(gtk.DrawingArea): |
| 1728 | 1724 |
POS_INCREMENT = 100 |
| 1729 | 1725 |
|
| 1730 | 1726 |
def on_key_press_event(self, widget, event): |
| 1731 |
- if event.keyval == gtk.keysyms.Left: |
|
| 1727 |
+ if event.keyval == Gdk.KEY_Left: |
|
| 1732 | 1728 |
self.x -= self.POS_INCREMENT/self.zoom_ratio |
| 1733 | 1729 |
self.queue_draw() |
| 1734 | 1730 |
return True |
| 1735 |
- if event.keyval == gtk.keysyms.Right: |
|
| 1731 |
+ if event.keyval == Gdk.KEY_Right: |
|
| 1736 | 1732 |
self.x += self.POS_INCREMENT/self.zoom_ratio |
| 1737 | 1733 |
self.queue_draw() |
| 1738 | 1734 |
return True |
| 1739 |
- if event.keyval == gtk.keysyms.Up: |
|
| 1735 |
+ if event.keyval == Gdk.KEY_Up: |
|
| 1740 | 1736 |
self.y -= self.POS_INCREMENT/self.zoom_ratio |
| 1741 | 1737 |
self.queue_draw() |
| 1742 | 1738 |
return True |
| 1743 |
- if event.keyval == gtk.keysyms.Down: |
|
| 1739 |
+ if event.keyval == Gdk.KEY_Down: |
|
| 1744 | 1740 |
self.y += self.POS_INCREMENT/self.zoom_ratio |
| 1745 | 1741 |
self.queue_draw() |
| 1746 | 1742 |
return True |
| 1747 |
- if event.keyval in (gtk.keysyms.Page_Up, |
|
| 1748 |
- gtk.keysyms.plus, |
|
| 1749 |
- gtk.keysyms.equal, |
|
| 1750 |
- gtk.keysyms.KP_Add): |
|
| 1743 |
+ if event.keyval in (Gdk.KEY_Page_Up, |
|
| 1744 |
+ Gdk.KEY_plus, |
|
| 1745 |
+ Gdk.KEY_equal, |
|
| 1746 |
+ Gdk.KEY_KP_Add): |
|
| 1751 | 1747 |
self.zoom_image(self.zoom_ratio * self.ZOOM_INCREMENT) |
| 1752 | 1748 |
self.queue_draw() |
| 1753 | 1749 |
return True |
| 1754 |
- if event.keyval in (gtk.keysyms.Page_Down, |
|
| 1755 |
- gtk.keysyms.minus, |
|
| 1756 |
- gtk.keysyms.KP_Subtract): |
|
| 1750 |
+ if event.keyval in (Gdk.KEY_Page_Down, |
|
| 1751 |
+ Gdk.KEY_minus, |
|
| 1752 |
+ Gdk.KEY_KP_Subtract): |
|
| 1757 | 1753 |
self.zoom_image(self.zoom_ratio / self.ZOOM_INCREMENT) |
| 1758 | 1754 |
self.queue_draw() |
| 1759 | 1755 |
return True |
| 1760 |
- if event.keyval == gtk.keysyms.Escape: |
|
| 1756 |
+ if event.keyval == Gdk.KEY_Escape: |
|
| 1761 | 1757 |
self.drag_action.abort() |
| 1762 | 1758 |
self.drag_action = NullAction(self) |
| 1763 | 1759 |
return True |
| 1764 |
- if event.keyval == gtk.keysyms.r: |
|
| 1760 |
+ if event.keyval == Gdk.KEY_r: |
|
| 1765 | 1761 |
self.reload() |
| 1766 | 1762 |
return True |
| 1767 |
- if event.keyval == gtk.keysyms.f: |
|
| 1763 |
+ if event.keyval == Gdk.KEY_f: |
|
| 1768 | 1764 |
win = widget.get_toplevel() |
| 1769 | 1765 |
find_toolitem = win.uimanager.get_widget('/ToolBar/Find')
|
| 1770 | 1766 |
textentry = find_toolitem.get_children() |
| 1771 | 1767 |
win.set_focus(textentry[0]) |
| 1772 | 1768 |
return True |
| 1773 |
- if event.keyval == gtk.keysyms.q: |
|
| 1774 |
- gtk.main_quit() |
|
| 1769 |
+ if event.keyval == Gdk.KEY_q: |
|
| 1770 |
+ Gtk.main_quit() |
|
| 1775 | 1771 |
return True |
| 1776 |
- if event.keyval == gtk.keysyms.p: |
|
| 1772 |
+ if event.keyval == Gdk.KEY_p: |
|
| 1777 | 1773 |
self.on_print() |
| 1778 | 1774 |
return True |
| 1779 | 1775 |
return False |
| 1780 | 1776 |
|
| 1781 | 1777 |
print_settings = None |
| 1782 | 1778 |
def on_print(self, action=None): |
| 1783 |
- print_op = gtk.PrintOperation() |
|
| 1779 |
+ print_op = Gtk.PrintOperation() |
|
| 1784 | 1780 |
|
| 1785 | 1781 |
if self.print_settings != None: |
| 1786 | 1782 |
print_op.set_print_settings(self.print_settings) |
| ... | ... |
@@ -1788,10 +1784,9 @@ class DotWidget(gtk.DrawingArea): |
| 1788 | 1784 |
print_op.connect("begin_print", self.begin_print)
|
| 1789 | 1785 |
print_op.connect("draw_page", self.draw_page)
|
| 1790 | 1786 |
|
| 1791 |
- res = print_op.run(gtk.PRINT_OPERATION_ACTION_PRINT_DIALOG, self.parent.parent) |
|
| 1792 |
- |
|
| 1793 |
- if res == gtk.PRINT_OPERATION_RESULT_APPLY: |
|
| 1794 |
- print_settings = print_op.get_print_settings() |
|
| 1787 |
+ res = print_op.run(Gtk.PrintOperationAction.PRINT_DIALOG, self.get_toplevel()) |
|
| 1788 |
+ if res == Gtk.PrintOperationResult.APPLY: |
|
| 1789 |
+ self.print_settings = print_op.get_print_settings() |
|
| 1795 | 1790 |
|
| 1796 | 1791 |
def begin_print(self, operation, context): |
| 1797 | 1792 |
operation.set_n_pages(1) |
| ... | ... |
@@ -1810,9 +1805,10 @@ class DotWidget(gtk.DrawingArea): |
| 1810 | 1805 |
def get_drag_action(self, event): |
| 1811 | 1806 |
state = event.state |
| 1812 | 1807 |
if event.button in (1, 2): # left or middle button |
| 1813 |
- if state & gtk.gdk.CONTROL_MASK: |
|
| 1808 |
+ modifiers = Gtk.accelerator_get_default_mod_mask() |
|
| 1809 |
+ if state & modifiers == Gdk.ModifierType.CONTROL_MASK: |
|
| 1814 | 1810 |
return ZoomAction |
| 1815 |
- elif state & gtk.gdk.SHIFT_MASK: |
|
| 1811 |
+ elif state & modifiers == Gdk.ModifierType.SHIFT_MASK: |
|
| 1816 | 1812 |
return ZoomAreaAction |
| 1817 | 1813 |
else: |
| 1818 | 1814 |
return PanAction |
| ... | ... |
@@ -1830,7 +1826,7 @@ class DotWidget(gtk.DrawingArea): |
| 1830 | 1826 |
return False |
| 1831 | 1827 |
|
| 1832 | 1828 |
def is_click(self, event, click_fuzz=4, click_timeout=1.0): |
| 1833 |
- assert event.type == gtk.gdk.BUTTON_RELEASE |
|
| 1829 |
+ assert event.type == Gdk.EventType.BUTTON_RELEASE |
|
| 1834 | 1830 |
if self.presstime is None: |
| 1835 | 1831 |
# got a button release without seeing the press? |
| 1836 | 1832 |
return False |
| ... | ... |
@@ -1872,11 +1868,11 @@ class DotWidget(gtk.DrawingArea): |
| 1872 | 1868 |
return False |
| 1873 | 1869 |
|
| 1874 | 1870 |
def on_area_scroll_event(self, area, event): |
| 1875 |
- if event.direction == gtk.gdk.SCROLL_UP: |
|
| 1871 |
+ if event.direction == Gdk.ScrollDirection.UP: |
|
| 1876 | 1872 |
self.zoom_image(self.zoom_ratio * self.ZOOM_INCREMENT, |
| 1877 | 1873 |
pos=(event.x, event.y)) |
| 1878 | 1874 |
return True |
| 1879 |
- if event.direction == gtk.gdk.SCROLL_DOWN: |
|
| 1875 |
+ if event.direction == Gdk.ScrollDirection.DOWN: |
|
| 1880 | 1876 |
self.zoom_image(self.zoom_ratio / self.ZOOM_INCREMENT, |
| 1881 | 1877 |
pos=(event.x, event.y)) |
| 1882 | 1878 |
return True |
| ... | ... |
@@ -1917,15 +1913,14 @@ class DotWidget(gtk.DrawingArea): |
| 1917 | 1913 |
return self.graph.get_jump(x, y) |
| 1918 | 1914 |
|
| 1919 | 1915 |
|
| 1920 |
-class FindMenuToolAction(gtk.Action): |
|
| 1916 |
+class FindMenuToolAction(Gtk.Action): |
|
| 1921 | 1917 |
__gtype_name__ = "FindMenuToolAction" |
| 1922 | 1918 |
|
| 1923 |
- def __init__(self, *args, **kw): |
|
| 1924 |
- gtk.Action.__init__(self, *args, **kw) |
|
| 1925 |
- self.set_tool_item_type(gtk.ToolItem) |
|
| 1919 |
+ def do_create_tool_item(self): |
|
| 1920 |
+ return Gtk.ToolItem() |
|
| 1926 | 1921 |
|
| 1927 | 1922 |
|
| 1928 |
-class DotWindow(gtk.Window): |
|
| 1923 |
+class DotWindow(Gtk.Window): |
|
| 1929 | 1924 |
|
| 1930 | 1925 |
ui = ''' |
| 1931 | 1926 |
<ui> |
| ... | ... |
@@ -1947,7 +1942,7 @@ class DotWindow(gtk.Window): |
| 1947 | 1942 |
base_title = 'Dot Viewer' |
| 1948 | 1943 |
|
| 1949 | 1944 |
def __init__(self, widget=None): |
| 1950 |
- gtk.Window.__init__(self) |
|
| 1945 |
+ Gtk.Window.__init__(self) |
|
| 1951 | 1946 |
|
| 1952 | 1947 |
self.graph = Graph() |
| 1953 | 1948 |
|
| ... | ... |
@@ -1955,31 +1950,31 @@ class DotWindow(gtk.Window): |
| 1955 | 1950 |
|
| 1956 | 1951 |
window.set_title(self.base_title) |
| 1957 | 1952 |
window.set_default_size(512, 512) |
| 1958 |
- vbox = gtk.VBox() |
|
| 1953 |
+ vbox = Gtk.VBox() |
|
| 1959 | 1954 |
window.add(vbox) |
| 1960 | 1955 |
|
| 1961 |
- self.widget = widget or DotWidget() |
|
| 1956 |
+ self.dotwidget = widget or DotWidget() |
|
| 1962 | 1957 |
|
| 1963 | 1958 |
# Create a UIManager instance |
| 1964 |
- uimanager = self.uimanager = gtk.UIManager() |
|
| 1959 |
+ uimanager = self.uimanager = Gtk.UIManager() |
|
| 1965 | 1960 |
|
| 1966 | 1961 |
# Add the accelerator group to the toplevel window |
| 1967 | 1962 |
accelgroup = uimanager.get_accel_group() |
| 1968 | 1963 |
window.add_accel_group(accelgroup) |
| 1969 | 1964 |
|
| 1970 | 1965 |
# Create an ActionGroup |
| 1971 |
- actiongroup = gtk.ActionGroup('Actions')
|
|
| 1966 |
+ actiongroup = Gtk.ActionGroup('Actions')
|
|
| 1972 | 1967 |
self.actiongroup = actiongroup |
| 1973 | 1968 |
|
| 1974 | 1969 |
# Create actions |
| 1975 | 1970 |
actiongroup.add_actions(( |
| 1976 |
- ('Open', gtk.STOCK_OPEN, None, None, None, self.on_open),
|
|
| 1977 |
- ('Reload', gtk.STOCK_REFRESH, None, None, None, self.on_reload),
|
|
| 1978 |
- ('Print', gtk.STOCK_PRINT, None, None, "Prints the currently visible part of the graph", self.widget.on_print),
|
|
| 1979 |
- ('ZoomIn', gtk.STOCK_ZOOM_IN, None, None, None, self.widget.on_zoom_in),
|
|
| 1980 |
- ('ZoomOut', gtk.STOCK_ZOOM_OUT, None, None, None, self.widget.on_zoom_out),
|
|
| 1981 |
- ('ZoomFit', gtk.STOCK_ZOOM_FIT, None, None, None, self.widget.on_zoom_fit),
|
|
| 1982 |
- ('Zoom100', gtk.STOCK_ZOOM_100, None, None, None, self.widget.on_zoom_100),
|
|
| 1971 |
+ ('Open', Gtk.STOCK_OPEN, None, None, None, self.on_open),
|
|
| 1972 |
+ ('Reload', Gtk.STOCK_REFRESH, None, None, None, self.on_reload),
|
|
| 1973 |
+ ('Print', Gtk.STOCK_PRINT, None, None, "Prints the currently visible part of the graph", self.dotwidget.on_print),
|
|
| 1974 |
+ ('ZoomIn', Gtk.STOCK_ZOOM_IN, None, None, None, self.dotwidget.on_zoom_in),
|
|
| 1975 |
+ ('ZoomOut', Gtk.STOCK_ZOOM_OUT, None, None, None, self.dotwidget.on_zoom_out),
|
|
| 1976 |
+ ('ZoomFit', Gtk.STOCK_ZOOM_FIT, None, None, None, self.dotwidget.on_zoom_fit),
|
|
| 1977 |
+ ('Zoom100', Gtk.STOCK_ZOOM_100, None, None, None, self.dotwidget.on_zoom_100),
|
|
| 1983 | 1978 |
)) |
| 1984 | 1979 |
|
| 1985 | 1980 |
find_action = FindMenuToolAction("Find", None,
|
| ... | ... |
@@ -1994,18 +1989,18 @@ class DotWindow(gtk.Window): |
| 1994 | 1989 |
|
| 1995 | 1990 |
# Create a Toolbar |
| 1996 | 1991 |
toolbar = uimanager.get_widget('/ToolBar')
|
| 1997 |
- vbox.pack_start(toolbar, False) |
|
| 1992 |
+ vbox.pack_start(toolbar, False, False, 0) |
|
| 1998 | 1993 |
|
| 1999 |
- vbox.pack_start(self.widget) |
|
| 1994 |
+ vbox.pack_start(self.dotwidget, True, True, 0) |
|
| 2000 | 1995 |
|
| 2001 | 1996 |
self.last_open_dir = "." |
| 2002 | 1997 |
|
| 2003 |
- self.set_focus(self.widget) |
|
| 1998 |
+ self.set_focus(self.dotwidget) |
|
| 2004 | 1999 |
|
| 2005 | 2000 |
# Add Find text search |
| 2006 | 2001 |
find_toolitem = uimanager.get_widget('/ToolBar/Find')
|
| 2007 |
- self.textentry = gtk.Entry(max=20) |
|
| 2008 |
- self.textentry.set_icon_from_stock(0, gtk.STOCK_FIND) |
|
| 2002 |
+ self.textentry = Gtk.Entry(max_length=20) |
|
| 2003 |
+ self.textentry.set_icon_from_stock(0, Gtk.STOCK_FIND) |
|
| 2009 | 2004 |
find_toolitem.add(self.textentry) |
| 2010 | 2005 |
|
| 2011 | 2006 |
self.textentry.set_activates_default(True) |
| ... | ... |
@@ -2016,7 +2011,7 @@ class DotWindow(gtk.Window): |
| 2016 | 2011 |
|
| 2017 | 2012 |
def find_text(self, entry_text): |
| 2018 | 2013 |
found_items = [] |
| 2019 |
- dot_widget = self.widget |
|
| 2014 |
+ dot_widget = self.dotwidget |
|
| 2020 | 2015 |
regexp = re.compile(entry_text) |
| 2021 | 2016 |
for node in dot_widget.graph.nodes: |
| 2022 | 2017 |
if node.search_text(regexp): |
| ... | ... |
@@ -2025,7 +2020,7 @@ class DotWindow(gtk.Window): |
| 2025 | 2020 |
|
| 2026 | 2021 |
def textentry_changed(self, widget, entry): |
| 2027 | 2022 |
entry_text = entry.get_text() |
| 2028 |
- dot_widget = self.widget |
|
| 2023 |
+ dot_widget = self.dotwidget |
|
| 2029 | 2024 |
if not entry_text: |
| 2030 | 2025 |
dot_widget.set_highlight(None) |
| 2031 | 2026 |
return |
| ... | ... |
@@ -2035,7 +2030,7 @@ class DotWindow(gtk.Window): |
| 2035 | 2030 |
|
| 2036 | 2031 |
def textentry_activate(self, widget, entry): |
| 2037 | 2032 |
entry_text = entry.get_text() |
| 2038 |
- dot_widget = self.widget |
|
| 2033 |
+ dot_widget = self.dotwidget |
|
| 2039 | 2034 |
if not entry_text: |
| 2040 | 2035 |
dot_widget.set_highlight(None) |
| 2041 | 2036 |
return; |
| ... | ... |
@@ -2046,17 +2041,17 @@ class DotWindow(gtk.Window): |
| 2046 | 2041 |
dot_widget.animate_to(found_items[0].x, found_items[0].y) |
| 2047 | 2042 |
|
| 2048 | 2043 |
def set_filter(self, filter): |
| 2049 |
- self.widget.set_filter(filter) |
|
| 2044 |
+ self.dotwidget.set_filter(filter) |
|
| 2050 | 2045 |
|
| 2051 | 2046 |
def set_dotcode(self, dotcode, filename=None): |
| 2052 |
- if self.widget.set_dotcode(dotcode, filename): |
|
| 2047 |
+ if self.dotwidget.set_dotcode(dotcode, filename): |
|
| 2053 | 2048 |
self.update_title(filename) |
| 2054 |
- self.widget.zoom_to_fit() |
|
| 2049 |
+ self.dotwidget.zoom_to_fit() |
|
| 2055 | 2050 |
|
| 2056 | 2051 |
def set_xdotcode(self, xdotcode, filename=None): |
| 2057 |
- if self.widget.set_xdotcode(xdotcode): |
|
| 2052 |
+ if self.dotwidget.set_xdotcode(xdotcode): |
|
| 2058 | 2053 |
self.update_title(filename) |
| 2059 |
- self.widget.zoom_to_fit() |
|
| 2054 |
+ self.dotwidget.zoom_to_fit() |
|
| 2060 | 2055 |
|
| 2061 | 2056 |
def update_title(self, filename=None): |
| 2062 | 2057 |
if filename is None: |
| ... | ... |
@@ -2070,31 +2065,31 @@ class DotWindow(gtk.Window): |
| 2070 | 2065 |
self.set_dotcode(fp.read(), filename) |
| 2071 | 2066 |
fp.close() |
| 2072 | 2067 |
except IOError as ex: |
| 2073 |
- dlg = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, |
|
| 2068 |
+ dlg = Gtk.MessageDialog(type=Gtk.MessageType.ERROR, |
|
| 2074 | 2069 |
message_format=str(ex), |
| 2075 |
- buttons=gtk.BUTTONS_OK) |
|
| 2070 |
+ buttons=Gtk.ButtonsType.OK) |
|
| 2076 | 2071 |
dlg.set_title(self.base_title) |
| 2077 | 2072 |
dlg.run() |
| 2078 | 2073 |
dlg.destroy() |
| 2079 | 2074 |
|
| 2080 | 2075 |
def on_open(self, action): |
| 2081 |
- chooser = gtk.FileChooserDialog(title="Open dot File", |
|
| 2082 |
- action=gtk.FILE_CHOOSER_ACTION_OPEN, |
|
| 2083 |
- buttons=(gtk.STOCK_CANCEL, |
|
| 2084 |
- gtk.RESPONSE_CANCEL, |
|
| 2085 |
- gtk.STOCK_OPEN, |
|
| 2086 |
- gtk.RESPONSE_OK)) |
|
| 2087 |
- chooser.set_default_response(gtk.RESPONSE_OK) |
|
| 2076 |
+ chooser = Gtk.FileChooserDialog(title="Open dot File", |
|
| 2077 |
+ action=Gtk.FileChooserAction.OPEN, |
|
| 2078 |
+ buttons=(Gtk.STOCK_CANCEL, |
|
| 2079 |
+ Gtk.ResponseType.CANCEL, |
|
| 2080 |
+ Gtk.STOCK_OPEN, |
|
| 2081 |
+ Gtk.ResponseType.OK)) |
|
| 2082 |
+ chooser.set_default_response(Gtk.ResponseType.OK) |
|
| 2088 | 2083 |
chooser.set_current_folder(self.last_open_dir) |
| 2089 |
- filter = gtk.FileFilter() |
|
| 2084 |
+ filter = Gtk.FileFilter() |
|
| 2090 | 2085 |
filter.set_name("Graphviz dot files")
|
| 2091 | 2086 |
filter.add_pattern("*.dot")
|
| 2092 | 2087 |
chooser.add_filter(filter) |
| 2093 |
- filter = gtk.FileFilter() |
|
| 2088 |
+ filter = Gtk.FileFilter() |
|
| 2094 | 2089 |
filter.set_name("All files")
|
| 2095 | 2090 |
filter.add_pattern("*")
|
| 2096 | 2091 |
chooser.add_filter(filter) |
| 2097 |
- if chooser.run() == gtk.RESPONSE_OK: |
|
| 2092 |
+ if chooser.run() == Gtk.ResponseType.OK: |
|
| 2098 | 2093 |
filename = chooser.get_filename() |
| 2099 | 2094 |
self.last_open_dir = chooser.get_current_folder() |
| 2100 | 2095 |
chooser.destroy() |
| ... | ... |
@@ -2103,7 +2098,7 @@ class DotWindow(gtk.Window): |
| 2103 | 2098 |
chooser.destroy() |
| 2104 | 2099 |
|
| 2105 | 2100 |
def on_reload(self, action): |
| 2106 |
- self.widget.reload() |
|
| 2101 |
+ self.dotwidget.reload() |
|
| 2107 | 2102 |
|
| 2108 | 2103 |
|
| 2109 | 2104 |
class OptionParser(optparse.OptionParser): |
| ... | ... |
@@ -2147,14 +2142,14 @@ Shortcuts: |
| 2147 | 2142 |
parser.error('incorrect number of arguments')
|
| 2148 | 2143 |
|
| 2149 | 2144 |
win = DotWindow() |
| 2150 |
- win.connect('destroy', gtk.main_quit)
|
|
| 2145 |
+ win.connect('delete-event', Gtk.main_quit)
|
|
| 2151 | 2146 |
win.set_filter(options.filter) |
| 2152 | 2147 |
if len(args) >= 1: |
| 2153 | 2148 |
if args[0] == '-': |
| 2154 | 2149 |
win.set_dotcode(sys.stdin.read()) |
| 2155 | 2150 |
else: |
| 2156 | 2151 |
win.open_file(args[0]) |
| 2157 |
- gtk.main() |
|
| 2152 |
+ Gtk.main() |
|
| 2158 | 2153 |
|
| 2159 | 2154 |
|
| 2160 | 2155 |
# Apache-Style Software License for ColorBrewer software and ColorBrewer Color |