Ticket #3715: With-Help-Unscaled.diff
File With-Help-Unscaled.diff, 46.0 KB (added by humitos, 11 years ago) |
---|
-
activity/activity.info
diff --git a/activity/activity.info b/activity/activity.info index cbe5757..97896cb 100644
a b 1 1 [Activity] 2 name = Implode 2 name = Implode Gtk3 3 3 activity_version = 12 4 bundle_id = com.jotaro.ImplodeActivity4 bundle_id = git.ImplodeActivity 5 5 icon = activity-implode 6 6 exec = sugar-activity implodeactivity.ImplodeActivity 7 7 license = GPLv2+ -
anim.py
diff --git a/anim.py b/anim.py index 2c19a15..f34406e 100644
a b 16 16 # along with this program; if not, write to the Free Software 17 17 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 18 19 import gobject19 from gi.repository import GObject 20 20 21 21 # Animation timer interval (in msec) 22 22 _TIMER_INTERVAL = 20 … … class Anim(object): 34 34 def start(self): 35 35 self._animating = True 36 36 self._update_func() 37 gobject.timeout_add(_TIMER_INTERVAL, self._timer)37 GObject.timeout_add(_TIMER_INTERVAL, self._timer) 38 38 39 39 def stop(self): 40 40 if self._animating: -
gridwidget.py
diff --git a/gridwidget.py b/gridwidget.py index 8ee3aad..c3b6596 100644
a b import logging 20 20 _logger = logging.getLogger('implode-activity.gridwidget') 21 21 22 22 import cairo 23 import gobject 24 import gtk 23 from gi.repository import GObject 24 from gi.repository import Gtk 25 from gi.repository import Gdk 25 26 import math 26 27 import random 27 28 import time … … _ANIM_SCALE = 0.04 93 94 def _log_errors(func): 94 95 return func 95 96 96 class GridWidget( gtk.DrawingArea):97 class GridWidget(Gtk.DrawingArea): 97 98 """Gtk widget for rendering the game board.""" 98 99 99 100 __gsignals__ = { 100 'piece-selected' : (gobject.SIGNAL_RUN_LAST, None, (int, int)), 101 'undo-key-pressed': (gobject.SIGNAL_RUN_LAST, None, (int,)), 102 'redo-key-pressed': (gobject.SIGNAL_RUN_LAST, None, (int,)), 103 'new-key-pressed' : (gobject.SIGNAL_RUN_LAST, None, (int,)), 104 'button-press-event': 'override', 105 'key-press-event': 'override', 106 'expose-event': 'override', 107 'size-allocate': 'override', 108 'motion-notify-event': 'override', 101 'piece-selected': (GObject.SignalFlags.RUN_LAST, None, (int, int)), 102 'undo-key-pressed': (GObject.SignalFlags.RUN_LAST, None, (int,)), 103 'redo-key-pressed': (GObject.SignalFlags.RUN_LAST, None, (int,)), 104 'new-key-pressed': (GObject.SignalFlags.RUN_LAST, None, (int,)), 109 105 } 110 106 111 107 def __init__(self, *args, **kwargs): 112 108 super(GridWidget, self).__init__(*args, **kwargs) 113 self.set_events( gtk.gdk.BUTTON_PRESS_MASK114 | gtk.gdk.POINTER_MOTION_MASK115 | gtk.gdk.KEY_PRESS_MASK)116 self.set_ flags(gtk.CAN_FOCUS)109 self.set_events(Gdk.EventMask.BUTTON_PRESS_MASK 110 | Gdk.EventMask.POINTER_MOTION_MASK 111 | Gdk.EventMask.KEY_PRESS_MASK) 112 self.set_can_focus(True) 117 113 118 114 self._board_drawer = BoardDrawer(self._get_size, self._invalidate_rect) 119 115 self._win_drawer = WinDrawer(self._get_size, self._invalidate_rect) 120 116 self._removal_drawer = RemovalDrawer(self._get_size, self._invalidate_rect) 121 117 self._set_current_drawer(self._board_drawer) 122 118 119 self.connect('draw', self._draw_event_cb) 120 self.connect('configure-event', self._configure_event_cb) 121 self.connect('button-press-event', self._button_press_event_cb) 122 123 123 def _get_size(self): 124 return (self. allocation.width, self.allocation.height)124 return (self.get_allocated_width(), self.get_allocated_height()) 125 125 126 126 def _invalidate_rect(self, rect): 127 if self. window:128 self. window.invalidate_rect(rect, True)127 if self.get_window(): 128 self.get_window().invalidate_rect(rect, True) 129 129 130 130 def set_board(self, board): 131 131 self._board_drawer.set_board(board) … … class GridWidget(gtk.DrawingArea): 141 141 142 142 def _invalidate_board(self): 143 143 (width, height) = self._get_size() 144 self._invalidate_rect(gtk.gdk.Rectangle(0, 0, width, height)) 144 rect = Gdk.Rectangle() 145 rect.x, rect.y, rect.width, rect.height = (0, 0, width, height) 146 self._invalidate_rect(rect) 145 147 146 148 def get_win_draw_flag(self): 147 149 return (self._current_drawer is self._win_drawer) … … class GridWidget(gtk.DrawingArea): 160 162 self._board_drawer.select_center_cell() 161 163 162 164 @_log_errors 163 def do_button_press_event(self, event):165 def _button_press_event_cb(self, widget, event): 164 166 # Ignore mouse clicks while animating. 165 167 if self._is_animating(): 166 168 return True 167 169 # Ignore double- and triple-clicks. 168 if event.type != gtk.gdk.BUTTON_PRESS:170 if event.type != Gdk.EventType.BUTTON_PRESS: 169 171 return True 170 172 self.grab_focus() 171 173 self._board_drawer.set_mouse_selection(event.x, event.y) … … class GridWidget(gtk.DrawingArea): 219 221 else: 220 222 x = event.x 221 223 y = event.y 222 state = event. state224 state = event.get_state() 223 225 self._board_drawer.set_mouse_selection(x, y) 224 226 225 @_log_errors 226 def do_expose_event(self, event): 227 cr = self.window.cairo_create() 228 cr.rectangle(event.area.x, 229 event.area.y, 230 event.area.width, 231 event.area.height) 232 cr.clip() 233 (width, height) = self.window.get_size() 234 self._current_drawer.draw(cr, width, height) 227 def _draw_event_cb(self, widget, cr): 228 alloc = self.get_allocation() 229 self._current_drawer.draw(cr, alloc.width, alloc.height) 235 230 236 231 @_log_errors 237 def do_size_allocate(self, allocation): 238 super(GridWidget, self).do_size_allocate(self, allocation) 239 self._current_drawer.resize(allocation.width, allocation.height) 232 def _configure_event_cb(self, widget, event): 233 self._current_drawer.resize(event.width, event.height) 240 234 241 235 def _set_current_drawer(self, drawer): 242 236 self._current_drawer = drawer … … class BoardDrawer(object): 382 376 383 377 def _invalidate_board(self): 384 378 (width, height) = self._get_size_func() 385 rect = gtk.gdk.Rectangle(0, 0, width, height) 379 rect = Gdk.Rectangle() 380 rect.x, rect.y, rect.width, rect.height = (0, 0, width, height) 386 381 self._invalidate_rect_func(rect) 387 382 388 383 def _invalidate_selection(self, selection_coord): … … class BoardDrawer(object): 407 402 max_x2 = math.ceil( max(pt1[0], pt2[0])) + 1 408 403 min_y2 = math.floor(min(pt1[1], pt2[1])) - 1 409 404 max_y2 = math.ceil( max(pt1[1], pt2[1])) + 1 410 rect = gtk.gdk.Rectangle(int(min_x2),411 int(min_y2),412 int(max_x2 - min_x2),413 405 rect = Gdk.Rectangle() 406 rect.x, rect.y, rect.width, rect.height = ( 407 int(min_x2), int(min_y2), 408 int(max_x2 - min_x2), int(max_y2 - min_y2)) 414 409 self._invalidate_rect_func(rect) 415 410 416 411 def _display_to_cell(self, x, y): … … class BoardDrawer(object): 426 421 self._board_transform = _BoardTransform() 427 422 else: 428 423 self._board_transform = _BoardTransform() 429 self._board_transform.setup(width, 430 height, 431 self._board_width, 432 self._board_height) 424 self._board_transform.setup(width, height, self._board_width, 425 self._board_height) 433 426 434 427 def draw(self, cr, width, height): 435 428 # Draws the widget. … … class RemovalDrawer(object): 564 557 565 558 def _invalidate_board(self): 566 559 (width, height) = self._get_size_func() 567 rect = gtk.gdk.Rectangle(0, 0, width, height) 560 rect = Gdk.Rectangle() 561 rect.x, rect.y, rect.width, rect.height = (0, 0, width, height) 568 562 self._invalidate_rect_func(rect) 569 563 570 564 def _recalc_game_anim_frames(self): … … class WinDrawer(object): 810 804 811 805 def _invalidate_board(self): 812 806 (width, height) = self._get_size_func() 813 rect = gtk.gdk.Rectangle(0, 0, width, height) 807 rect = Gdk.Rectangle() 808 rect.x, rect.y, rect.width, rect.height = (0, 0, width, height) 814 809 self._invalidate_rect_func(rect) 815 810 816 811 def _get_win_tiles(self): -
helpwidget.py
diff --git a/helpwidget.py b/helpwidget.py index af205e6..a7b8930 100644
a b from __future__ import with_statement 21 21 from gettext import gettext as _ 22 22 23 23 import cairo 24 import gobject 25 import gtk 24 import logging 25 26 from gi.repository import GObject 27 from gi.repository import Gtk 28 from gi.repository import Gdk 29 from gi.repository import Rsvg 30 26 31 import math 27 32 import os 28 import rsvg29 33 import time 30 34 31 35 import board … … from anim import Anim 33 37 from gridwidget import BoardDrawer, RemovalDrawer, WinDrawer 34 38 35 39 if 'SUGAR_BUNDLE_PATH' in os.environ: 36 from sugar .graphics import style40 from sugar3.graphics import style 37 41 _DEFAULT_SPACING = style.DEFAULT_SPACING 38 42 _DEFAULT_PADDING = style.DEFAULT_PADDING 39 43 _BG_COLOR = tuple(style.COLOR_SELECTION_GREY.get_rgba()[:3]) … … _CLICK_SPEED = 0.2 75 79 # Speed of the mouse, in units (4x3 per screen) per second. 76 80 _MOUSE_SPEED = 0.5 77 81 78 class HelpWidget( gtk.EventBox):82 class HelpWidget(Gtk.EventBox): 79 83 def __init__(self, icon_file_func, *args, **kwargs): 80 84 super(HelpWidget, self).__init__(*args, **kwargs) 81 85 82 vbox = gtk.VBox()86 vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) 83 87 self.add(vbox) 84 88 85 89 self._stages = [ … … class HelpWidget(gtk.EventBox): 90 94 _HelpStage5(icon_file_func), 91 95 ] 92 96 self._stage_index = 0 93 self._notebook = gtk.Notebook()97 self._notebook = Gtk.Notebook() 94 98 self._notebook.set_show_tabs(False) 95 99 for stage in self._stages: 96 self._notebook.append_page(stage )97 vbox.pack_start(self._notebook )100 self._notebook.append_page(stage, None) 101 vbox.pack_start(self._notebook, True, True, 0) 98 102 99 103 self._reset_current_stage() 100 104 … … class HelpWidget(gtk.EventBox): 128 132 self._stages[self._stage_index].reset() 129 133 130 134 131 class _HelpStage( gtk.EventBox):135 class _HelpStage(Gtk.EventBox): 132 136 # An abstract parent class for objects that represent an animated help 133 137 # screen widget with a description. 134 138 def __init__(self, icon_file_func, *args, **kwargs): 135 139 super(_HelpStage, self).__init__(*args, **kwargs) 136 140 137 hbox = gtk.HBox()141 hbox = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) 138 142 self.add(hbox) 139 143 140 vbox = gtk.VBox() 141 hbox.pack_start(vbox, expand=True, padding=_DEFAULT_SPACING) 144 vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) 145 hbox.pack_start(vbox, expand=True, fill=False, 146 padding=_DEFAULT_SPACING) 142 147 143 148 self.preview = _PreviewWidget(icon_file_func) 144 vbox.pack_start(self.preview, expand=True, padding=_DEFAULT_PADDING) 149 vbox.pack_start(self.preview, expand=True, fill=False, 150 padding=_DEFAULT_PADDING) 145 151 146 label = gtk.Label(self.get_message())152 label = Gtk.Label(label=self.get_message()) 147 153 label.set_line_wrap(True) 148 vbox.pack_start(label, expand=False, padding=_DEFAULT_PADDING) 154 vbox.pack_start(label, expand=False, fill=False, 155 padding=_DEFAULT_PADDING) 149 156 150 157 self.board = None 151 158 self.undo_stack = [] … … def _undo(): 552 559 stage.next_action() 553 560 return action 554 561 555 class _PreviewWidget(gtk.DrawingArea): 556 __gsignals__ = { 557 'expose-event': 'override', 558 'size-allocate': 'override', 559 } 560 562 class _PreviewWidget(Gtk.DrawingArea): 561 563 def __init__(self, icon_file_func, *args, **kwargs): 562 564 super(_PreviewWidget, self).__init__(*args, **kwargs) 563 565 … … class _PreviewWidget(gtk.DrawingArea): 573 575 574 576 self._icon_file_func = icon_file_func 575 577 576 self._preview_rect = gtk.gdk.Rectangle(0, 0, 0, 0) 577 self._toolbar_rect = gtk.gdk.Rectangle(0, 0, 0, 0) 578 self._drawer_rect = gtk.gdk.Rectangle(0, 0, 0, 0) 578 self._preview_rect = Gdk.Rectangle() 579 self._preview_rect.x = self._preview_rect.y = \ 580 self._preview_rect.width = self._preview_rect.height = 0 581 582 self._toolbar_rect = Gdk.Rectangle() 583 self._toolbar_rect.x = self._toolbar_rect.y = \ 584 self._toolbar_rect.width = self._toolbar_rect.height = 0 585 586 self._drawer_rect = Gdk.Rectangle() 587 self._drawer_rect.x = self._drawer_rect.y = \ 588 self._drawer_rect.width = self._drawer_rect.height = 0 579 589 580 590 self._drawer = self.board_drawer 581 591 … … class _PreviewWidget(gtk.DrawingArea): 589 599 self._click_visible = False 590 600 self._cursor_visible = False 591 601 602 self.connect('draw', self._draw_event_cb) 603 self.connect('configure-event', self._configure_event_cb) 604 # self.connect('size-allocate', self._configure_event_cb) 605 592 606 def _get_drawer_size(self): 607 logging.debug('FUNC: _get_drawer_size() -> %s, %s', 608 self._drawer_rect.width, self._drawer_rect.height) 593 609 return (self._drawer_rect.width, self._drawer_rect.height) 594 610 595 611 def _invalidate_drawer_rect(self, rect): 596 if self. window:612 if self.get_window(): 597 613 (x, y) = (self._drawer_rect.x, self._drawer_rect.y) 598 offset_rect = gtk.gdk.Rectangle(rect.x + x, 599 rect.y + y, 600 rect.width, 601 rect.height) 602 self.window.invalidate_rect(offset_rect, True) 614 rect = Gdk.Rectangle() 615 rect.x, rect.y, rect.width, rect.height = ( 616 rect.x + x, rect.y + y, rect.width, rect.height) 617 self.get_window().invalidate_rect(rect, True) 603 618 604 619 def set_drawer(self, drawer): 605 620 self._drawer = drawer … … class _PreviewWidget(gtk.DrawingArea): 667 682 self._invalidate_client_rect(pixel_x - r, pixel_y - r, r2, r2) 668 683 669 684 def _invalidate_client_rect(self, x, y, width, height): 670 if self.window: 671 rect = gtk.gdk.Rectangle( 685 if self.get_window(): 686 rect = Gdk.Rectangle() 687 rect.x, rect.y, rect.width, rect.height = ( 672 688 int(math.floor(x)) + self._preview_rect.x, 673 689 int(math.floor(y)) + self._preview_rect.y, 674 690 int(math.ceil(width)) + 1, 675 691 int(math.ceil(height)) + 1) 676 self. window.invalidate_rect(rect, True)692 self.get_window().invalidate_rect(rect, True) 677 693 678 694 def _update_mouse_position(self): 679 695 (pixel_x, pixel_y) = self._get_cursor_pixel_coords() 680 696 (x, y) = (pixel_x, pixel_y - self._toolbar_rect.height) 681 697 self.board_drawer.set_mouse_selection(x, y) 682 698 683 def do_expose_event(self, event): 684 cr = self.window.cairo_create() 685 cr.rectangle(event.area.x, 686 event.area.y, 687 event.area.width, 688 event.area.height) 689 cr.clip() 690 (width, height) = self.window.get_size() 691 self._draw(cr, width, height) 699 def _size_allocate_cb(self, widget, rect): 700 self.width = rect.width 701 self.height = rect.height 702 703 def _draw_event_cb(self, widget, cr): 704 alloc = self.get_allocation() 705 cr.rectangle(0, 0, alloc.width, alloc.height) 706 self._draw(cr, alloc.width, alloc.height) 692 707 693 708 def _draw(self, cr, width, height): 694 709 cr.set_source_rgb(*_BG_COLOR) … … class _PreviewWidget(gtk.DrawingArea): 712 727 cr.restore() 713 728 714 729 def _draw_toolbar(self, cr): 730 logging.debug('FUNC: _draw_toolbar()') 715 731 cr.set_source_rgb(*_TOOLBAR_COLOR) 716 732 cr.rectangle(self._toolbar_rect.x, 717 733 self._toolbar_rect.y, … … class _PreviewWidget(gtk.DrawingArea): 730 746 cr.save() 731 747 cr.translate(self._toolbar_rect.x + i * icon_height, 732 748 self._toolbar_rect.y) 749 logging.debug('SCALE: %s', scale) 733 750 cr.scale(scale, scale) 734 751 handle.render_cairo(cr) 735 752 cr.restore() … … class _PreviewWidget(gtk.DrawingArea): 803 820 804 821 cr.restore() 805 822 806 def do_size_allocate(self, allocation):807 super(_PreviewWidget, self).do_size_allocate(self, allocation)808 (width, height) = ( allocation.width, allocation.height)823 def _configure_event_cb(self, widget, event): 824 logging.debug('FUNC: _configure_event_cb()') 825 (width, height) = (event.width, event.height) 809 826 810 827 avail_width = width - _DEFAULT_SPACING * 2 811 828 other_height = avail_width * 3 / 4 … … class _PreviewWidget(gtk.DrawingArea): 829 846 old_width = self._preview_rect.width 830 847 old_height = self._preview_rect.height 831 848 832 self._preview_rect = gtk.gdk.Rectangle(x_offset, 833 y_offset, 834 actual_width, 835 actual_height) 836 self._toolbar_rect = gtk.gdk.Rectangle(x_offset, 837 y_offset, 838 actual_width, 839 icon_height) 840 self._drawer_rect = gtk.gdk.Rectangle(x_offset, 841 y_offset + icon_height, 842 actual_width, 843 board_height) 849 self._preview_rect = Gdk.Rectangle() 850 self._preview_rect.x = x_offset 851 self._preview_rect.y = y_offset 852 self._preview_rect.width = actual_width 853 self._preview_rect.height = actual_height 854 855 self._toolbar_rect = Gdk.Rectangle() 856 self._toolbar_rect.x = x_offset 857 self._toolbar_rect.y = y_offset 858 self._toolbar_rect.width = actual_width 859 self._toolbar_rect.height = icon_height 860 861 self._drawer_rect = Gdk.Rectangle() 862 self._drawer_rect.x = x_offset 863 self._drawer_rect.y = y_offset + icon_height 864 self._drawer_rect.width = actual_width 865 self._drawer_rect.height = board_height 866 844 867 self.board_drawer.resize(actual_width, board_height) 845 868 self.removal_drawer.resize(actual_width, board_height) 846 869 self.win_drawer.resize(actual_width, board_height) … … def _get_icon_handle(file_path): 886 909 if file_path not in _icon_handles: 887 910 with open(file_path, 'r') as f: 888 911 data = f.read() 889 _icon_handles[file_path] = rsvg.Handle(data=data)912 _icon_handles[file_path] = Rsvg.Handle.new_from_data(data) 890 913 891 914 return _icon_handles[file_path] -
implodeactivity.py
diff --git a/implodeactivity.py b/implodeactivity.py index 3e4cb2f..c03d7fe 100644
a b _logger = logging.getLogger('implode-activity') 21 21 22 22 from gettext import gettext as _ 23 23 24 from sugar.activity.activity import Activity, get_bundle_path 25 from sugar.graphics import style 26 from sugar.graphics.icon import Icon 27 from sugar.graphics.radiotoolbutton import RadioToolButton 28 from sugar.graphics.toolbutton import ToolButton 29 30 try: 31 # 0.86+ toolbar widgets 32 from sugar.activity.widgets import ActivityToolbarButton, StopButton 33 from sugar.graphics.toolbarbox import ToolbarBox, ToolbarButton 34 _USE_OLD_TOOLBARS = False 35 except ImportError: 36 # Pre-0.86 toolbar widgets 37 from sugar.activity.activity import ActivityToolbox 38 _USE_OLD_TOOLBARS = True 24 from sugar3.activity.activity import Activity, get_bundle_path 25 from sugar3.graphics import style 26 from sugar3.graphics.icon import Icon 27 from sugar3.graphics.radiotoolbutton import RadioToolButton 28 from sugar3.graphics.toolbutton import ToolButton 29 30 from sugar3.activity.widgets import ActivityToolbarButton, StopButton 31 from sugar3.graphics.toolbarbox import ToolbarBox, ToolbarButton 39 32 40 33 from implodegame import ImplodeGame 41 34 from helpwidget import HelpWidget 42 35 43 36 import os 44 37 45 try: 46 import json 47 json.dumps 48 except (ImportError, AttributeError): 49 import simplejson as json 38 import json 50 39 from StringIO import StringIO 51 import gtk 52 import gobject 40 from gi.repository import Gtk 41 from gi.repository import GObject 42 from gi.repository import Gdk 53 43 54 44 from keymap import KEY_MAP 55 45 … … class ImplodeActivity(Activity): 63 53 64 54 self._game = ImplodeGame() 65 55 66 game_box = gtk.VBox()67 game_box.pack_start(self._game )56 game_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) 57 game_box.pack_start(self._game, True, True, 0) 68 58 self._stuck_strip = _StuckStrip() 69 59 70 60 self._configure_toolbars() … … class ImplodeActivity(Activity): 73 63 74 64 # Show everything except the stuck strip. 75 65 self.show_all() 76 game_box.pack_end(self._stuck_strip, expand=False )66 game_box.pack_end(self._stuck_strip, expand=False, fill=False, padding=0) 77 67 78 68 self._game.connect('show-stuck', self._show_stuck_cb) 79 69 self._stuck_strip.connect('undo-clicked', self._stuck_undo_cb) … … class ImplodeActivity(Activity): 96 86 file_data = json.load(io) 97 87 f.close() 98 88 99 print file_data100 _logger.debug(file_data)89 # print file_data 90 # _logger.debug(file_data) 101 91 (file_type, version, game_data) = file_data 102 92 if file_type == 'Implode save game' and version <= [1, 0]: 103 93 self._game.set_game_state(game_data) … … class ImplodeActivity(Activity): 121 111 if data: 122 112 self._stuck_strip.show_all() 123 113 else: 124 if self._stuck_strip. focus_child:114 if self._stuck_strip.get_focus_child(): 125 115 self._game.grab_focus() 126 116 self._stuck_strip.hide() 127 117 … … class ImplodeActivity(Activity): 133 123 action = KEY_MAP.get(event.keyval, None) 134 124 if action is None: 135 125 return False 136 if not self._stuck_strip. flags() & gtk.VISIBLE:126 if not self._stuck_strip.get_state_flags() & Gtk.AccelFlags.VISIBLE: 137 127 return True 138 if self._game. focus_child:128 if self._game.get_focus_child(): 139 129 if action == 'down': 140 130 self._stuck_strip.button.grab_focus() 141 131 return True 142 elif self._stuck_strip. focus_child:132 elif self._stuck_strip.get_focus_child(): 143 133 if action == 'up': 144 134 self._game.grab_focus() 145 135 elif action == 'select': … … class ImplodeActivity(Activity): 152 142 controls, difficulty selector, help button, and stop button. All 153 143 callbacks are locally defined.""" 154 144 155 if _USE_OLD_TOOLBARS: 156 toolbox = ActivityToolbox(self) 157 toolbar = gtk.Toolbar() 158 else: 159 toolbar_box = ToolbarBox() 160 toolbar = toolbar_box.toolbar 145 toolbar_box = ToolbarBox() 146 toolbar = toolbar_box.toolbar 161 147 162 163 164 148 activity_button = ActivityToolbarButton(self) 149 toolbar_box.toolbar.insert(activity_button, 0) 150 activity_button.show() 165 151 166 toolbar.add(gtk.SeparatorToolItem())152 toolbar.add(Gtk.SeparatorToolItem()) 167 153 168 154 def add_button(icon_name, tooltip, func): 169 155 def callback(source): … … class ImplodeActivity(Activity): 176 162 add_button('new-game' , _("New") , self._game.new_game) 177 163 add_button('replay-game', _("Replay"), self._game.replay_game) 178 164 179 toolbar.add( gtk.SeparatorToolItem())165 toolbar.add(Gtk.SeparatorToolItem()) 180 166 181 167 add_button('edit-undo' , _("Undo") , self._game.undo) 182 168 add_button('edit-redo' , _("Redo") , self._game.redo) 183 169 184 toolbar.add( gtk.SeparatorToolItem())170 toolbar.add(Gtk.SeparatorToolItem()) 185 171 186 172 self._levels_buttons = [] 187 173 def add_level_button(icon_name, tooltip, numeric_level): … … class ImplodeActivity(Activity): 217 203 # right now, however. 218 204 add_button('help-icon', _("Help"), _help_clicked_cb) 219 205 220 if _USE_OLD_TOOLBARS: 221 toolbox.add_toolbar(_("Game"), toolbar) 222 toolbox.set_current_toolbar(1) 206 stop_button = StopButton(self) 207 stop_button.props.accelerator = '<Ctrl><Shift>Q' 208 toolbar_box.toolbar.insert(stop_button, -1) 209 stop_button.show() 223 210 224 self.set_toolbox(toolbox) 225 toolbox.show() 226 else: 227 stop_button = StopButton(self) 228 stop_button.props.accelerator = '<Ctrl><Shift>Q' 229 toolbar_box.toolbar.insert(stop_button, -1) 230 stop_button.show() 231 232 self.set_toolbar_box(toolbar_box) 233 toolbar_box.show() 211 self.set_toolbar_box(toolbar_box) 212 toolbar_box.show() 234 213 235 214 def _add_expander(self, toolbar, expand=True): 236 215 """Insert a toolbar item which will expand to fill the available 237 216 space.""" 238 separator = gtk.SeparatorToolItem()217 separator = Gtk.SeparatorToolItem() 239 218 separator.props.draw = False 240 219 separator.set_expand(expand) 241 220 toolbar.insert(separator, -1) 242 221 separator.show() 243 222 244 223 245 class _DialogWindow( gtk.Window):224 class _DialogWindow(Gtk.Window): 246 225 # A base class for a modal dialog window. 247 226 def __init__(self, icon_name, title): 248 227 super(_DialogWindow, self).__init__() 249 228 250 229 self.set_border_width(style.LINE_WIDTH) 251 230 offset = style.GRID_CELL_SIZE 252 width = gtk.gdk.screen_width() / 2253 height = gtk.gdk.screen_height() / 2231 width = Gdk.Screen.width() / 2 232 height = Gdk.Screen.height() / 2 254 233 self.set_size_request(width, height) 255 self.set_position( gtk.WIN_POS_CENTER_ALWAYS)234 self.set_position(Gtk.WindowPosition.CENTER_ALWAYS) 256 235 self.set_decorated(False) 257 236 self.set_resizable(False) 258 237 self.set_modal(True) 259 238 260 vbox = gtk.VBox()239 vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) 261 240 self.add(vbox) 262 241 263 242 toolbar = _DialogToolbar(icon_name, title) 264 243 toolbar.connect('stop-clicked', self._stop_clicked_cb) 265 vbox.pack_start(toolbar, False)244 vbox.pack_start(toolbar, expand=False, fill=False, padding=0) 266 245 267 self.content_vbox = gtk.VBox()246 self.content_vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) 268 247 self.content_vbox.set_border_width(style.DEFAULT_SPACING) 269 248 vbox.add(self.content_vbox) 270 249 … … class _DialogWindow(gtk.Window): 274 253 self.destroy() 275 254 276 255 def _realize_cb(self, source): 277 self. window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)278 self. window.set_accept_focus(True)256 self.set_type_hint(Gdk.WindowTypeHint.DIALOG) 257 self.get_window().set_accept_focus(True) 279 258 280 259 281 260 class _HelpWindow(_DialogWindow): … … class _HelpWindow(_DialogWindow): 284 263 super(_HelpWindow, self).__init__('help-icon', _("Help")) 285 264 286 265 offset = style.GRID_CELL_SIZE 287 width = gtk.gdk.screen_width() - offset * 2288 height = gtk.gdk.screen_height() - offset * 2266 width = Gdk.Screen.width() - offset * 2 267 height = Gdk.Screen.height() - offset * 2 289 268 self.set_size_request(width, height) 290 269 291 270 self._help_widget = HelpWidget(self._icon_file) 292 self.content_vbox.pack_start(self._help_widget )271 self.content_vbox.pack_start(self._help_widget, True, True, 0) 293 272 294 273 self._help_nav_bar = _HelpNavBar() 295 self.content_vbox.pack_end(self._help_nav_bar, 296 expand=False, 297 padding=style.DEFAULT_SPACING) 274 self.content_vbox.pack_end(self._help_nav_bar, expand=False, 275 fill=False, padding=style.DEFAULT_SPACING) 298 276 299 277 for (signal_name, callback) in [ 300 278 ('forward-clicked', self._forward_clicked_cb), … … class _HelpWindow(_DialogWindow): 316 294 self._help_widget.replay_stage() 317 295 318 296 def _icon_file(self, icon_name): 319 theme = gtk.icon_theme_get_default()297 theme = Gtk.IconTheme.get_default() 320 298 info = theme.lookup_icon(icon_name, 0, 0) 321 299 return info.get_filename() 322 300 … … class _HelpWindow(_DialogWindow): 326 304 self._help_nav_bar.set_can_next_stage(hw.can_next_stage()) 327 305 328 306 329 class _DialogToolbar( gtk.Toolbar):307 class _DialogToolbar(Gtk.Toolbar): 330 308 # Displays a dialog window's toolbar, with title, icon, and close box. 331 309 __gsignals__ = { 332 'stop-clicked' : ( gobject.SIGNAL_RUN_LAST, None, ()),310 'stop-clicked' : (GObject.SignalFlags.RUN_LAST, None, ()), 333 311 } 334 312 def __init__(self, icon_name, title): 335 313 super(_DialogToolbar, self).__init__() 336 314 337 315 icon = Icon() 338 icon.set_from_icon_name(icon_name, gtk.ICON_SIZE_LARGE_TOOLBAR)316 icon.set_from_icon_name(icon_name, Gtk.IconSize.LARGE_TOOLBAR) 339 317 self._add_widget(icon) 340 318 341 319 self._add_separator() 342 320 343 label = gtk.Label(title)321 label = Gtk.Label(label=title) 344 322 self._add_widget(label) 345 323 346 324 self._add_separator(expand=True) … … class _DialogToolbar(gtk.Toolbar): 351 329 self.add(stop) 352 330 353 331 def _add_separator(self, expand=False): 354 separator = gtk.SeparatorToolItem()332 separator = Gtk.SeparatorToolItem() 355 333 separator.set_expand(expand) 356 334 separator.set_draw(False) 357 335 self.add(separator) 358 336 359 337 def _add_widget(self, widget): 360 tool_item = gtk.ToolItem()338 tool_item = Gtk.ToolItem() 361 339 tool_item.add(widget) 362 340 self.add(tool_item) 363 341 … … class _DialogToolbar(gtk.Toolbar): 365 343 self.emit('stop-clicked') 366 344 367 345 368 class _HelpNavBar( gtk.HButtonBox):346 class _HelpNavBar(Gtk.HButtonBox): 369 347 # A widget to display the navigation controls at the bottom of the help 370 348 # dialog. 371 349 __gsignals__ = { 372 'forward-clicked' : ( gobject.SIGNAL_RUN_LAST, None, ()),373 'back-clicked' : ( gobject.SIGNAL_RUN_LAST, None, ()),374 'reload-clicked' : ( gobject.SIGNAL_RUN_LAST, None, ()),350 'forward-clicked' : (GObject.SignalFlags.RUN_LAST, None, ()), 351 'back-clicked' : (GObject.SignalFlags.RUN_LAST, None, ()), 352 'reload-clicked' : (GObject.SignalFlags.RUN_LAST, None, ()), 375 353 } 376 354 377 355 def __init__(self): 378 356 super(_HelpNavBar, self).__init__() 379 357 380 self.set_layout( gtk.BUTTONBOX_SPREAD)358 self.set_layout(Gtk.ButtonBoxStyle.SPREAD) 381 359 382 360 def add_button(icon_name, tooltip, signal_name): 383 361 icon = Icon() 384 icon.set_from_icon_name(icon_name, gtk.ICON_SIZE_LARGE_TOOLBAR)385 button = gtk.Button()362 icon.set_from_icon_name(icon_name, Gtk.IconSize.LARGE_TOOLBAR) 363 button = Gtk.Button() 386 364 button.set_image(icon) 387 365 button.set_tooltip_text(tooltip) 388 366 self.add(button) … … class _HelpNavBar(gtk.HButtonBox): 404 382 self._forward_button.set_sensitive(can_next_stage) 405 383 406 384 407 class _StuckStrip( gtk.HBox):385 class _StuckStrip(Gtk.Box): 408 386 __gsignals__ = { 409 'undo-clicked' : ( gobject.SIGNAL_RUN_LAST, None, ()),387 'undo-clicked' : (GObject.SignalFlags.RUN_LAST, None, ()), 410 388 } 411 389 def __init__(self, *args, **kwargs): 412 390 super(_StuckStrip, self).__init__(*args, **kwargs) 413 391 414 spacer1 = gtk.Label('') 415 self.pack_start(spacer1, expand=True) 392 self.orientation = Gtk.Orientation.HORIZONTAL 393 394 spacer1 = Gtk.Label(label='') 395 self.pack_start(spacer1, True, True, 0) 416 396 417 spacer2 = gtk.Label('')418 self.pack_end(spacer2, expand=True )397 spacer2 = Gtk.Label(label='') 398 self.pack_end(spacer2, expand=True, fill=False, padding=0) 419 399 420 400 self.set_spacing(10) 421 401 422 402 self.set_border_width(10) 423 403 424 label = gtk.Label(_("Stuck? You can still solve the puzzle."))425 self.pack_start(label, expand=False)404 label = Gtk.Label(label=_("Stuck? You can still solve the puzzle.")) 405 self.pack_start(label, False, True, 0) 426 406 427 407 icon = Icon() 428 icon.set_from_icon_name('edit-undo', gtk.ICON_SIZE_LARGE_TOOLBAR)429 self.button = gtk.Button(stock=gtk.STOCK_UNDO)408 icon.set_from_icon_name('edit-undo', Gtk.IconSize.LARGE_TOOLBAR) 409 self.button = Gtk.Button(stock=Gtk.STOCK_UNDO) 430 410 self.button.set_image(icon) 431 411 self.button.set_label(_("Undo some moves")) 432 self.pack_end(self.button, expand=False )412 self.pack_end(self.button, expand=False, fill=False, padding=0) 433 413 434 414 def callback(source): 435 415 self.emit('undo-clicked') -
implodegame.py
diff --git a/implodegame.py b/implodegame.py index 60c507c..7841d69 100644
a b _logger = logging.getLogger('implode-activity.implodegame') 21 21 22 22 from gettext import gettext as _ 23 23 24 import gtk25 import gobject24 from gi.repository import Gtk 25 from gi.repository import GObject 26 26 import random 27 27 import time 28 28 … … _STUCK_DELAY = 0.5 39 39 # state after the player gets stuck, in seconds. 40 40 _UNDO_DELAY = 0.3 41 41 42 class ImplodeGame( gtk.EventBox):42 class ImplodeGame(Gtk.EventBox): 43 43 """Gtk widget for playing the implode game.""" 44 44 45 45 __gsignals__ = { 46 'show-stuck': ( gobject.SIGNAL_RUN_LAST, None, (int,)),46 'show-stuck': (GObject.SignalFlags.RUN_LAST, None, (int,)), 47 47 } 48 48 49 49 def __init__(self, *args, **kwargs): -
keymap.py
diff --git a/keymap.py b/keymap.py index b420ace..0322b22 100644
a b 16 16 # along with this program; if not, write to the Free Software 17 17 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 18 19 import gtk19 from gi.repository import Gdk 20 20 21 21 KEY_MAP = { 22 gtk.keysyms.KP_Up : 'up',23 gtk.keysyms.KP_Down : 'down',24 gtk.keysyms.KP_Left : 'left',25 gtk.keysyms.KP_Right : 'right',26 27 gtk.keysyms.w : 'up',28 gtk.keysyms.s : 'down',29 gtk.keysyms.a : 'left',30 gtk.keysyms.d : 'right',31 32 gtk.keysyms.KP_8 : 'up',33 gtk.keysyms.KP_2 : 'down',34 gtk.keysyms.KP_4 : 'left',35 gtk.keysyms.KP_6 : 'right',36 37 gtk.keysyms.Up : 'up',38 gtk.keysyms.Down : 'down',39 gtk.keysyms.Left : 'left',40 gtk.keysyms.Right : 'right',41 42 gtk.keysyms.uparrow : 'up',43 gtk.keysyms.downarrow : 'down',44 gtk.keysyms.leftarrow : 'left',45 gtk.keysyms.rightarrow : 'right',46 47 gtk.keysyms.Return : 'select',48 gtk.keysyms.KP_Space : 'select',49 gtk.keysyms.KP_Enter : 'select',50 gtk.keysyms.space : 'select',51 gtk.keysyms.End : 'select',52 gtk.keysyms.KP_End : 'select',53 gtk.keysyms.KP_1 : 'select',54 gtk.keysyms.q : 'select',55 56 gtk.keysyms.Home : 'new',57 gtk.keysyms.KP_Home : 'new',58 gtk.keysyms.Page_Down : 'redo',59 gtk.keysyms.KP_Page_Down : 'redo',60 gtk.keysyms.Page_Up : 'undo',61 gtk.keysyms.KP_Page_Up : 'undo',22 Gdk.KEY_KP_Up : 'up', 23 Gdk.KEY_KP_Down : 'down', 24 Gdk.KEY_KP_Left : 'left', 25 Gdk.KEY_KP_Right : 'right', 26 27 Gdk.KEY_w : 'up', 28 Gdk.KEY_s : 'down', 29 Gdk.KEY_a : 'left', 30 Gdk.KEY_d : 'right', 31 32 Gdk.KEY_KP_8 : 'up', 33 Gdk.KEY_KP_2 : 'down', 34 Gdk.KEY_KP_4 : 'left', 35 Gdk.KEY_KP_6 : 'right', 36 37 Gdk.KEY_Up : 'up', 38 Gdk.KEY_Down : 'down', 39 Gdk.KEY_Left : 'left', 40 Gdk.KEY_Right : 'right', 41 42 Gdk.KEY_uparrow : 'up', 43 Gdk.KEY_downarrow : 'down', 44 Gdk.KEY_leftarrow : 'left', 45 Gdk.KEY_rightarrow : 'right', 46 47 Gdk.KEY_Return : 'select', 48 Gdk.KEY_KP_Space : 'select', 49 Gdk.KEY_KP_Enter : 'select', 50 Gdk.KEY_space : 'select', 51 Gdk.KEY_End : 'select', 52 Gdk.KEY_KP_End : 'select', 53 Gdk.KEY_KP_1 : 'select', 54 Gdk.KEY_q : 'select', 55 56 Gdk.KEY_Home : 'new', 57 Gdk.KEY_KP_Home : 'new', 58 Gdk.KEY_Page_Down : 'redo', 59 Gdk.KEY_KP_Page_Down : 'redo', 60 Gdk.KEY_Page_Up : 'undo', 61 Gdk.KEY_KP_Page_Up : 'undo', 62 62 } -
setup.py
diff --git a/setup.py b/setup.py index 211f104..cbdf097 100644
a b 1 1 #!/usr/bin/env python 2 2 3 from sugar .activity import bundlebuilder3 from sugar3.activity import bundlebuilder 4 4 if __name__ == "__main__": 5 5 bundlebuilder.start() -
sugarless.py
diff --git a/sugarless.py b/sugarless.py index 6a9f3ea..cc6a4a5 100644
a b 19 19 # A stub file for running the application on a sugarless GTK, when the Activity 20 20 # framework is not available. 21 21 22 import pygtk 23 pygtk.require('2.0') 24 import gtk 25 import gobject 22 from gi.repository import Gtk 23 from gi.repository import Gdk 24 from gi.repository import GObject 26 25 27 26 import os 28 27 … … from keymap import KEY_MAP 32 31 33 32 _DEFAULT_SPACING = 15 34 33 35 class ImplodeWindow(gtk.Window): 34 import logging 35 LOG_FILENAME = '/tmp/logging_example.out' 36 logging.basicConfig(filename=LOG_FILENAME, level=logging.DEBUG) 37 38 logging.debug('This message should go to the log file') 39 40 41 class ImplodeWindow(Gtk.Window): 36 42 def __init__(self): 37 super(ImplodeWindow, self).__init__(gtk.WINDOW_TOPLEVEL) 38 self.set_geometry_hints(None, min_width=640, min_height=480) 43 super(ImplodeWindow, self).__init__(Gtk.WindowType.TOPLEVEL) 44 45 geometry = Gdk.Geometry() 46 geometry.min_width = 640 47 geometry.min_height = 480 48 49 self.set_geometry_hints(None, geometry, Gdk.WindowHints.MIN_SIZE) 39 50 self.set_title("Implode") 40 51 41 52 self.connect("delete_event", self._delete_event_cb) 42 53 43 toolbar = gtk.Toolbar()54 toolbar = Gtk.Toolbar() 44 55 self.game = implodegame.ImplodeGame() 45 56 46 57 def add_button(id, func): 47 button = gtk.ToolButton(id)58 button = Gtk.ToolButton(id) 48 59 toolbar.add(button) 49 60 50 61 def callback(source): … … class ImplodeWindow(gtk.Window): 53 64 54 65 return button 55 66 56 add_button( gtk.STOCK_NEW, self.game.new_game)57 add_button( gtk.STOCK_MEDIA_PREVIOUS, self.game.replay_game)58 add_button( gtk.STOCK_UNDO, self.game.undo)59 add_button( gtk.STOCK_REDO, self.game.redo)67 add_button(Gtk.STOCK_NEW, self.game.new_game) 68 add_button(Gtk.STOCK_MEDIA_PREVIOUS, self.game.replay_game) 69 add_button(Gtk.STOCK_UNDO, self.game.undo) 70 add_button(Gtk.STOCK_REDO, self.game.redo) 60 71 61 toolbar.add( gtk.SeparatorToolItem())72 toolbar.add(Gtk.SeparatorToolItem()) 62 73 63 74 radio_buttons = [] 64 75 def add_radio_button(label, func): 65 button = gtk.RadioToolButton()76 button = Gtk.RadioToolButton() 66 77 button.set_label(label) 67 78 toolbar.add(button) 68 79 radio_buttons.append(button) … … class ImplodeWindow(gtk.Window): 77 88 add_radio_button('easy', self._easy_clicked) 78 89 add_radio_button('medium', self._medium_clicked) 79 90 add_radio_button('hard', self._hard_clicked) 80 for button in radio_buttons[1:]: 81 button.set_group(radio_buttons[0]) 91 # FIXME: 92 # for button in radio_buttons[1:]: 93 # button.set_group(radio_buttons[0]) 82 94 83 separator = gtk.SeparatorToolItem()95 separator = Gtk.SeparatorToolItem() 84 96 separator.set_expand(True) 85 97 separator.set_draw(False) 86 98 toolbar.add(separator) 87 99 88 add_button( gtk.STOCK_HELP, self._help_clicked)100 add_button(Gtk.STOCK_HELP, self._help_clicked) 89 101 90 102 self._stuck_strip = _StuckStrip() 91 103 92 game_box = gtk.VBox() 93 game_box.pack_start(self.game) 94 game_box.pack_end(self._stuck_strip, expand=False) 104 game_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) 105 game_box.pack_start(self.game, True, True, 0) 106 game_box.pack_end(self._stuck_strip, expand=False, 107 fill=False, padding=0) 95 108 96 main_box = gtk.VBox()97 main_box.pack_start(toolbar, expand=False)98 main_box.pack_end(game_box )109 main_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) 110 main_box.pack_start(toolbar, False, True, 0) 111 main_box.pack_end(game_box, expand=False, fill=False, padding=0) 99 112 self.add(main_box) 100 113 101 114 # Show everything except the stuck strip. … … class ImplodeWindow(gtk.Window): 111 124 self.show() 112 125 113 126 def _delete_event_cb(self, window, event): 114 gtk.main_quit()127 Gtk.main_quit() 115 128 return False 116 129 117 130 def _easy_clicked(self): … … class ImplodeWindow(gtk.Window): 132 145 if data: 133 146 self._stuck_strip.show_all() 134 147 else: 135 if self._stuck_strip. focus_child:148 if self._stuck_strip.get_focus_child(): 136 149 self.game.grab_focus() 137 150 self._stuck_strip.hide() 138 151 … … class ImplodeWindow(gtk.Window): 144 157 action = KEY_MAP.get(event.keyval, None) 145 158 if action is None: 146 159 return False 147 if not self._stuck_strip. flags() & gtk.VISIBLE:160 if not self._stuck_strip.get_state_flags() & Gtk.AccelFlags.VISIBLE: 148 161 return True 149 if self.game. focus_child:162 if self.game.get_focus_child(): 150 163 if action == 'down': 151 164 self._stuck_strip.button.grab_focus() 152 165 return True 153 elif self._stuck_strip. focus_child:166 elif self._stuck_strip.get_focus_child(): 154 167 if action == 'up': 155 168 self.game.grab_focus() 156 169 elif action == 'select': … … class ImplodeWindow(gtk.Window): 158 171 return True 159 172 return True 160 173 161 class _HelpWindow( gtk.Window):174 class _HelpWindow(Gtk.Window): 162 175 def __init__(self): 163 176 super(_HelpWindow, self).__init__() 164 177 165 178 self.set_size_request(640, 480) 166 self.set_position( gtk.WIN_POS_CENTER_ON_PARENT)179 self.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) 167 180 self.set_modal(True) 168 181 169 vbox = gtk.VBox()182 vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) 170 183 self.add(vbox) 171 184 172 185 self._help_widget = HelpWidget(self._icon_file) 173 vbox.pack_start(self._help_widget )186 vbox.pack_start(self._help_widget, True, True, 0) 174 187 175 188 self._help_nav_bar = _HelpNavBar() 176 189 vbox.pack_end(self._help_nav_bar, 177 expand=False) 190 expand=False, fill=False, 191 padding=0) 178 192 179 193 for (signal_name, callback) in [ 180 194 ('forward-clicked', self._forward_clicked_cb), … … class _HelpWindow(gtk.Window): 207 221 self._help_nav_bar.set_can_next_stage(hw.can_next_stage()) 208 222 209 223 210 class _HelpNavBar( gtk.HButtonBox):224 class _HelpNavBar(Gtk.HButtonBox): 211 225 __gsignals__ = { 212 'forward-clicked' : ( gobject.SIGNAL_RUN_LAST, None, ()),213 'back-clicked' : ( gobject.SIGNAL_RUN_LAST, None, ()),214 'reload-clicked' : ( gobject.SIGNAL_RUN_LAST, None, ()),226 'forward-clicked' : (GObject.SignalFlags.RUN_LAST, None, ()), 227 'back-clicked' : (GObject.SignalFlags.RUN_LAST, None, ()), 228 'reload-clicked' : (GObject.SignalFlags.RUN_LAST, None, ()), 215 229 } 216 230 217 231 def __init__(self): 218 232 super(_HelpNavBar, self).__init__() 219 233 220 self.set_layout( gtk.BUTTONBOX_SPREAD)234 self.set_layout(Gtk.ButtonBoxStyle.SPREAD) 221 235 222 236 def add_button(id, signal_name): 223 button = gtk.Button(stock=id)237 button = Gtk.Button(stock=id) 224 238 self.add(button) 225 239 226 240 def callback(source): … … class _HelpNavBar(gtk.HButtonBox): 229 243 230 244 return button 231 245 232 self._back_button = add_button( gtk.STOCK_GO_BACK, 'back-clicked')233 add_button( gtk.STOCK_MEDIA_PLAY, 'reload-clicked')234 self._forward_button = add_button( gtk.STOCK_GO_FORWARD, 'forward-clicked')246 self._back_button = add_button(Gtk.STOCK_GO_BACK, 'back-clicked') 247 add_button(Gtk.STOCK_MEDIA_PLAY, 'reload-clicked') 248 self._forward_button = add_button(Gtk.STOCK_GO_FORWARD, 'forward-clicked') 235 249 236 250 def set_can_prev_stage(self, can_prev_stage): 237 251 self._back_button.set_sensitive(can_prev_stage) … … class _HelpNavBar(gtk.HButtonBox): 240 254 self._forward_button.set_sensitive(can_next_stage) 241 255 242 256 243 class _StuckStrip( gtk.HBox):257 class _StuckStrip(Gtk.Box): 244 258 __gsignals__ = { 245 'undo-clicked' : ( gobject.SIGNAL_RUN_LAST, None, ()),259 'undo-clicked' : (GObject.SignalFlags.RUN_LAST, None, ()), 246 260 } 247 261 def __init__(self, *args, **kwargs): 248 262 super(_StuckStrip, self).__init__(*args, **kwargs) 249 263 250 spacer1 = gtk.Label('') 251 self.pack_start(spacer1, expand=True) 264 self.orientation = Gtk.Orientation.HORIZONTAL 265 266 spacer1 = Gtk.Label(label='') 267 self.pack_start(spacer1, True, True, 0) 252 268 253 spacer2 = gtk.Label('')254 self.pack_end(spacer2, expand=True )269 spacer2 = Gtk.Label(label='') 270 self.pack_end(spacer2, expand=True, fill=False, padding=0) 255 271 256 272 self.set_spacing(10) 257 273 258 274 self.set_border_width(10) 259 275 260 label = gtk.Label("Stuck? You can still solve the puzzle.")261 self.pack_start(label, expand=False)276 label = Gtk.Label(label="Stuck? You can still solve the puzzle.") 277 self.pack_start(label, False, True, 0) 262 278 263 self.button = gtk.Button(stock=gtk.STOCK_UNDO)279 self.button = Gtk.Button(stock=Gtk.STOCK_UNDO) 264 280 self.button.set_label("Undo some moves") 265 self.pack_end(self.button, expand=False )281 self.pack_end(self.button, expand=False, fill=False, padding=0) 266 282 267 283 def callback(source): 268 284 self.emit('undo-clicked') … … class _StuckStrip(gtk.HBox): 271 287 272 288 def main(): 273 289 w = ImplodeWindow() 274 gtk.main()290 Gtk.main() 275 291 276 292 if __name__ == "__main__": 277 293 main()