From 8fed373b112b2f8c27a875e0a7a9a03d710ea55a Mon Sep 17 00:00:00 2001 From: Walter Bender Date: Sun, 30 Oct 2011 11:16:20 +0000 Subject: gtk3 patches --- diff --git a/abacus.py b/abacus.py index 596219b..7369e3a 100755 --- a/abacus.py +++ b/abacus.py @@ -13,7 +13,7 @@ # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 02111-1307, USA. -import gtk +from gi.repository import Gtk, Gdk from gettext import gettext as _ @@ -28,7 +28,7 @@ class AbacusMain: self.r = 0 self.tw = None - self.win = gtk.Window(gtk.WINDOW_TOPLEVEL) + self.win = Gtk.Window(type=Gtk.WindowType.TOPLEVEL) try: data_file = open('.abacusrc', 'r') except IOError: @@ -46,7 +46,7 @@ class AbacusMain: self.win.move(self.x, self.y) self.win.maximize() self.win.set_title(_('Abacus')) - self.win.connect('delete_event', lambda w, e: gtk.main_quit()) + self.win.connect('delete_event', lambda w, e: Gtk.main_quit()) ABACI = { 'c': _('Suanpan'), @@ -61,42 +61,42 @@ class AbacusMain: 'R': _('Rods') } - menu = gtk.Menu() + menu = Gtk.Menu() for k, v in ABACI.iteritems(): - menu_items = gtk.MenuItem(v) + menu_items = Gtk.MenuItem(v) menu.append(menu_items) menu_items.connect('activate', self._switch_abacus_cb, k) - menu_items = gtk.MenuItem(_('Reset')) + menu_items = Gtk.MenuItem(_('Reset')) menu.append(menu_items) menu_items.connect('activate', self._reset) - menu_items = gtk.MenuItem(_('Quit')) + menu_items = Gtk.MenuItem(_('Quit')) menu.append(menu_items) menu_items.connect('activate', self.destroy) menu_items.show() - root_menu = gtk.MenuItem('Tools') + root_menu = Gtk.MenuItem('Tools') root_menu.show() root_menu.set_submenu(menu) - vbox = gtk.VBox(False, 0) + vbox = Gtk.VBox(False, 0) self.win.add(vbox) vbox.show() - menu_bar = gtk.MenuBar() + menu_bar = Gtk.MenuBar() vbox.pack_start(menu_bar, False, False, 2) menu_bar.show() menu_bar.append(root_menu) - sw = gtk.ScrolledWindow() - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) + sw = Gtk.ScrolledWindow() + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) sw.show() - canvas = gtk.DrawingArea() - width = gtk.gdk.screen_width() - height = gtk.gdk.screen_height() + canvas = Gtk.DrawingArea() + width = Gdk.Screen.width() + height = Gdk.Screen.height() canvas.set_size_request(width, height) sw.add_with_viewport(canvas) canvas.show() - vbox.pack_end(sw, True, True) + vbox.pack_end(sw, True, True, 0) self.win.show_all() @@ -153,10 +153,10 @@ class AbacusMain: def destroy(self, event, data=None): ''' Callback for destroy event. ''' - gtk.main_quit() + Gtk.main_quit() def main(): - gtk.main() + Gtk.main() return 0 if __name__ == '__main__': diff --git a/abacus_window.py b/abacus_window.py index b340a8f..b88a24e 100644 --- a/abacus_window.py +++ b/abacus_window.py @@ -33,9 +33,9 @@ COLORS = ('#FFFFFF', '#FF0000', '#88FF00', '#FF00FF', '#FFFF00', LABELS = ('#000000', '#FFFFFF', '#000000', '#FFFFFF', '#000000', '#000000', '#FFFFFF', '#FFFFFF', '#000000', '#000000') -import pygtk -pygtk.require('2.0') -import gtk +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk, Gdk, GdkPixbuf from math import floor, ceil import locale @@ -97,7 +97,7 @@ readable-fractions/681534#681534 def _svg_str_to_pixbuf(svg_string): ''' Load pixbuf from SVG string ''' - pl = gtk.gdk.PixbufLoader('svg') + pl = GdkPixbuf.PixbufLoader.new_with_type('svg') pl.write(svg_string) pl.close() pixbuf = pl.get_pixbuf() @@ -645,19 +645,19 @@ class Abacus(): _logger.debug('bead colors %s %s', self.bead_colors[0], self.bead_colors[1]) - self.canvas.set_flags(gtk.CAN_FOCUS) - self.canvas.add_events(gtk.gdk.BUTTON_PRESS_MASK) - self.canvas.add_events(gtk.gdk.BUTTON_RELEASE_MASK) - self.canvas.add_events(gtk.gdk.POINTER_MOTION_MASK) - self.canvas.connect('expose-event', self._expose_cb) + self.canvas.set_can_focus(True) + self.canvas.add_events(Gdk.EventMask.BUTTON_PRESS_MASK) + self.canvas.add_events(Gdk.EventMask.BUTTON_RELEASE_MASK) + self.canvas.add_events(Gdk.EventMask.POINTER_MOTION_MASK) + self.canvas.connect('draw', self.__draw_cb) self.canvas.connect('button-press-event', self._button_press_cb) self.canvas.connect('button-release-event', self._button_release_cb) self.canvas.connect('motion-notify-event', self._mouse_move_cb) self.canvas.connect('key_press_event', self._keypress_cb) - self.width = gtk.gdk.screen_width() - self.height = gtk.gdk.screen_height() - GRID_CELL_SIZE + self.width = Gdk.Screen.width() + self.height = Gdk.Screen.height() - GRID_CELL_SIZE self.sprites = Sprites(self.canvas) - self.scale = 1.33 * gtk.gdk.screen_height() / 900.0 + self.scale = 1.33 * Gdk.Screen.height() / 900.0 self.dragpos = 0 self.press = None self.last = None @@ -800,7 +800,7 @@ class Abacus(): def _keypress_cb(self, area, event): ''' Keypress: moving the slides with the arrow keys ''' - k = gtk.gdk.keyval_name(event.keyval) + k = Gdk.keyval_name(event.keyval) if k in ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'period', 'minus', 'Return', 'BackSpace', 'comma']: if self.last == self.mode.label_bar: @@ -855,28 +855,13 @@ class Abacus(): newnum = oldnum sprite.set_label(newnum + CURSOR) - def _expose_cb(self, win, event): - ''' Callback to handle window expose events ''' - self.do_expose_event(event) - return True - # Handle the expose-event by drawing - def do_expose_event(self, event): - - # Create the cairo context - cr = self.canvas.window.cairo_create() - - # Restrict Cairo to the exposed area; avoid extra work - cr.rectangle(event.area.x, event.area.y, - event.area.width, event.area.height) - cr.clip() - - # Refresh sprite list + def __draw_cb(self, canvas, cr): self.sprites.redraw_sprites(cr=cr) def _destroy_cb(self, win, event): ''' Callback to handle quit ''' - gtk.main_quit() + Gtk.main_quit() def generate_label(self, sum_only=False): ''' The complexity below is to make the label as simple as possible ''' diff --git a/sprites.py b/sprites.py index 0f22891..23a631c 100644 --- a/sprites.py +++ b/sprites.py @@ -24,7 +24,7 @@ ''' sprites.py is a simple sprites library for managing graphics objects, -'sprites', on a gtk.DrawingArea. It manages multiple sprites with +'sprites', on a Gtk.DrawingArea. It manages multiple sprites with methods such as move, hide, set_layer, etc. There are two classes: @@ -68,7 +68,7 @@ Example usage: # method for converting SVG to a gtk pixbuf def svg_str_to_pixbuf(svg_string): - pl = gtk.gdk.PixbufLoader('svg') + pl = GdkPixbuf.PixbufLoader('svg') pl.write(svg_string) pl.close() pixbuf = pl.get_pixbuf() @@ -76,11 +76,10 @@ def svg_str_to_pixbuf(svg_string): ''' -import pygtk -pygtk.require('2.0') -import gtk -import pango -import pangocairo +import gi +gi.require_version('Gtk', '3.0') +from gi.repository import Gtk, GdkPixbuf +from gi.repository import Pango, PangoCairo class Sprites: @@ -158,7 +157,7 @@ class Sprite: def __init__(self, sprites, x, y, image): ''' Initialize an individual sprite ''' self._sprites = sprites - self.rect = gtk.gdk.Rectangle(int(x), int(y), 0, 0) + self.rect = [int(x), int(y), 0, 0] self._scale = [12] self._rescale = [True] self._horiz_align = ["center"] @@ -186,40 +185,40 @@ class Sprite: self.images[i] = image self._dx[i] = dx self._dy[i] = dy - if isinstance(self.images[i], gtk.gdk.Pixbuf): + if isinstance(self.images[i], GdkPixbuf.Pixbuf): w = self.images[i].get_width() h = self.images[i].get_height() else: w, h = self.images[i].get_size() if i == 0: # Always reset width and height when base image changes. - self.rect.width = w + dx - self.rect.height = h + dy + self.rect[2] = w + dx + self.rect[3] = h + dy else: - if w + dx > self.rect.width: - self.rect.width = w + dx - if h + dy > self.rect.height: - self.rect.height = h + dy + if w + dx > self.rect[2]: + self.rect[2] = w + dx + if h + dy > self.rect[3]: + self.rect[3] = h + dy def move(self, pos): ''' Move to new (x, y) position ''' self.inval() - self.rect.x, self.rect.y = int(pos[0]), int(pos[1]) + self.rect[0], self.rect[1] = int(pos[0]), int(pos[1]) self.inval() def move_relative(self, pos): ''' Move to new (x+dx, y+dy) position ''' self.inval() - self.rect.x += int(pos[0]) - self.rect.y += int(pos[1]) + self.rect[0] += int(pos[0]) + self.rect[1] += int(pos[1]) self.inval() def get_xy(self): ''' Return current (x, y) position ''' - return (self.rect.x, self.rect.y) + return (self.rect[0], self.rect[1]) def get_dimensions(self): ''' Return current size ''' - return (self.rect.width, self.rect.height) + return (self.rect[2], self.rect[3]) def get_layer(self): ''' Return current layer ''' @@ -272,7 +271,7 @@ class Sprite: def set_font(self, font): ''' Set the font for a label ''' - self._fd = pango.FontDescription(font) + self._fd = Pango.FontDescription(font) def set_label_color(self, rgb): ''' Set the font color for a label ''' @@ -306,10 +305,10 @@ class Sprite: def inval(self): ''' Invalidate a region for gtk ''' # self._sprites.window.invalidate_rect(self.rect, False) - self._sprites.widget.queue_draw_area(self.rect.x, - self.rect.y, - self.rect.width, - self.rect.height) + self._sprites.widget.queue_draw_area(self.rect[0], + self.rect[1], + self.rect[2], + self.rect[3]) def draw(self, cr=None): ''' Draw the sprite (and label) ''' @@ -319,14 +318,14 @@ class Sprite: print 'sprite.draw: no Cairo context.' return for i, img in enumerate(self.images): - if isinstance(img, gtk.gdk.Pixbuf): - cr.set_source_pixbuf(img, - self.rect.x + self._dx[i], - self.rect.y + self._dy[i]) - cr.rectangle(self.rect.x + self._dx[i], - self.rect.y + self._dy[i], - self.rect.width, - self.rect.height) + if isinstance(img, GdkPixbuf.Pixbuf): + Gdk.cairo_set_source_pixbuf(cr, img, + self.rect[0] + self._dx[i], + self.rect[1] + self._dy[i]) + cr.rectangle(self.rect[0] + self._dx[i], + self.rect[1] + self._dy[i], + self.rect[2], + self.rect[3]) cr.fill() else: print 'sprite.draw: source not a pixbuf (%s)' % (type(img)) @@ -336,64 +335,61 @@ class Sprite: def hit(self, pos): ''' Is (x, y) on top of the sprite? ''' x, y = pos - if x < self.rect.x: + if x < self.rect[0]: return False - if x > self.rect.x + self.rect.width: + if x > self.rect[0] + self.rect[2]: return False - if y < self.rect.y: + if y < self.rect[1]: return False - if y > self.rect.y + self.rect.height: + if y > self.rect[1] + self.rect[3]: return False return True def draw_label(self, cr): ''' Draw the label based on its attributes ''' - # Create a pangocairo context - cr = pangocairo.CairoContext(cr) - my_width = self.rect.width - self._margins[0] - self._margins[2] + my_width = self.rect[2] - self._margins[0] - self._margins[2] if my_width < 0: my_width = 0 - my_height = self.rect.height - self._margins[1] - self._margins[3] + my_height = self.rect[3] - self._margins[1] - self._margins[3] for i in range(len(self.labels)): - pl = cr.create_layout() - pl.set_text(str(self.labels[i])) - # pl = self._sprites.canvas.create_pango_layout(str(self.labels[i])) - self._fd.set_size(int(self._scale[i] * pango.SCALE)) + pl = PangoCairo.create_layout(cr) + pl.set_text(str(self.labels[i]), -1) + self._fd.set_size(int(self._scale[i] * Pango.SCALE)) pl.set_font_description(self._fd) - w = pl.get_size()[0] / pango.SCALE + w = pl.get_size()[0] / Pango.SCALE if w > my_width: if self._rescale[i]: self._fd.set_size( - int(self._scale[i] * pango.SCALE * my_width / w)) + int(self._scale[i] * Pango.SCALE * my_width / w)) pl.set_font_description(self._fd) - w = pl.get_size()[0] / pango.SCALE + w = pl.get_size()[0] / Pango.SCALE else: j = len(self.labels[i]) - 1 while(w > my_width and j > 0): pl.set_text( - "…" + self.labels[i][len(self.labels[i]) - j:]) - self._fd.set_size(int(self._scale[i] * pango.SCALE)) + "…" + self.labels[i][len(self.labels[i]) - j:], -1) + self._fd.set_size(int(self._scale[i] * Pango.SCALE)) pl.set_font_description(self._fd) - w = pl.get_size()[0] / pango.SCALE + w = pl.get_size()[0] / Pango.SCALE j -= 1 if self._horiz_align[i] == "center": - x = int(self.rect.x + self._margins[0] + (my_width - w) / 2) + x = int(self.rect[0] + self._margins[0] + (my_width - w) / 2) elif self._horiz_align[i] == 'left': - x = int(self.rect.x + self._margins[0]) + x = int(self.rect[0] + self._margins[0]) else: # right - x = int(self.rect.x + self.rect.width - w - self._margins[2]) - h = pl.get_size()[1] / pango.SCALE + x = int(self.rect[0] + self.rect[2] - w - self._margins[2]) + h = pl.get_size()[1] / Pango.SCALE if self._vert_align[i] == "middle": - y = int(self.rect.y + self._margins[1] + (my_height - h) / 2) + y = int(self.rect[1] + self._margins[1] + (my_height - h) / 2) elif self._vert_align[i] == "top": - y = int(self.rect.y + self._margins[1]) + y = int(self.rect[1] + self._margins[1]) else: # bottom - y = int(self.rect.y + self.rect.height - h - self._margins[3]) + y = int(self.rect[1] + self.rect[3] - h - self._margins[3]) cr.save() cr.translate(x, y) cr.set_source_rgb(self._color[0], self._color[1], self._color[2]) - cr.update_layout(pl) - cr.show_layout(pl) + PangoCairo.update_layout(cr, pl) + PangoCairo.show_layout(cr, pl) cr.restore() def label_width(self): @@ -401,20 +397,20 @@ class Sprite: max = 0 for i in range(len(self.labels)): pl = self._sprites.canvas.create_pango_layout(self.labels[i]) - self._fd.set_size(int(self._scale[i] * pango.SCALE)) + self._fd.set_size(int(self._scale[i] * Pango.SCALE)) pl.set_font_description(self._fd) - w = pl.get_size()[0] / pango.SCALE + w = pl.get_size()[0] / Pango.SCALE if w > max: max = w return max def label_safe_width(self): ''' Return maximum width for a label ''' - return self.rect.width - self._margins[0] - self._margins[2] + return self.rect[2] - self._margins[0] - self._margins[2] def label_safe_height(self): ''' Return maximum height for a label ''' - return self.rect.height - self._margins[1] - self._margins[3] + return self.rect[3] - self._margins[1] - self._margins[3] def label_left_top(self): ''' Return the upper-left corner of the label safe zone ''' @@ -423,8 +419,8 @@ class Sprite: def get_pixel(self, pos, i=0): ''' Return the pixl at (x, y) ''' x, y = pos - x = x - self.rect.x - y = y - self.rect.y + x = x - self.rect[0] + y = y - self.rect[1] if y > self.images[i].get_height() - 1: return(-1, -1, -1, -1) try: -- cgit v0.9.1