[Xword-commits] r20 - trunk

terrencegf at garage.maemo.org terrencegf at garage.maemo.org
Tue Apr 22 00:55:47 EEST 2008


Author: terrencegf
Date: 2008-04-22 00:55:45 +0300 (Tue, 22 Apr 2008)
New Revision: 20

Modified:
   trunk/xword
Log:
TONS of modifications since the initial check in and hildonization.
See the changelog for more information.


Modified: trunk/xword
===================================================================
--- trunk/xword	2008-04-19 02:40:19 UTC (rev 19)
+++ trunk/xword	2008-04-21 21:55:45 UTC (rev 20)
@@ -1,6 +1,6 @@
 #!/usr/bin/python
 
-__version__ = "1.0"
+__version__ = "1.0.4"
 
 __license__ = """
 Copyright (c) 2005-2006,
@@ -96,6 +96,15 @@
     ('Top and Bottom', ('V', 'across', 150, ('V', 'puzzle', 300, 'down')))
     ]
 
+toolbar_layouts = [
+    ('Off', 'puzzle', 'N'),
+    ('Checks on Left', 'checks','L'),
+    ('Checks on Right', 'checks','R'),
+    ('Keyboard on Left', 'keyboard','L'),
+    ('Keyboard on Right', 'keyboard','R')
+    ]
+
+
 def time_str(t):
     total = int(t)
     secs = total % 60
@@ -1183,6 +1192,7 @@
 
         self.skip_filled = False
         self.layout = 0
+        self.toolbar_layout = 0
         self.window_size = (900, 600)
         self.maximized = False
         self.fullscreen = False
@@ -1208,33 +1218,40 @@
         win.resize(self.window_size[0], self.window_size[1])
         if self.maximized: win.maximize()
 
-        box = gtk.HBox()
-        win.add(box)
-        box = box
-
         self.cur_layout = None
+        self.letterbar1 = None
 
+        menubox = gtk.VBox()
         self.menubar = self.create_menubar()
+        menubox.pack_start(self.menubar, False, False, 0)
+
+        win.add(menubox)
+
+        self.box = gtk.HBox()
+        menubox.pack_start(self.box, True, True, 0)
+
+        self.toolbox = gtk.HBox()
+        self.box.pack_start(self.toolbox, False, False, 0)
+
         self.toolbar = self.create_toolbar()
-        box.pack_start(self.toolbar, False, False, 0)
+        self.letterbar1 = self.create_letterbar(
+            ['A','D','G','J','M','P','S','V','Y','ISO_Left_Tab','Left'])
+        self.letterbar2 = self.create_letterbar(
+            ['B','E','H','K','N','Q','T','W','Z','Up','Return','Down'])
+        self.letterbar3 = self.create_letterbar(
+            ['C','F','I','L','O','R','U','X','BackSpace','Tab','Right'])
 
         self.create_widgets()
         self.setup_controller()
 
         self.vbox = gtk.VBox()
-        box.pack_start(self.vbox, True, True, 0)
+        self.box.pack_start(self.vbox, True, True, 0)
 
         self.cur_layout = self.generate_layout(self.positions)
         self.vbox.pack_start(self.cur_layout, True, True, 0)
 
-        self.status_bar = gtk.Statusbar()
+        self.set_toolbar_layout(self.toolbar_layout)
 
-        #Put "status bar" into toolbar since it's mostly just wasting space
-        self.status_bar.set_has_resize_grip(False)
-        toolitem = gtk.ToolItem()
-        toolitem.add(self.status_bar)
-        self.toolbar.insert(toolitem, -1)
-
         gobject.timeout_add(500, self.idle_event)
         win.connect('key-press-event', self.key_event)
 
@@ -1246,10 +1263,6 @@
                 child.reparent(menu)
             self.win.set_menu(menu)
             self.menubar.destroy()
-        else:
-            toolitem = gtk.ToolItem()
-            toolitem.add(self.menubar)
-            self.toolbar.insert(toolitem, 0)
 
         win.show_all()
 
@@ -1338,7 +1351,11 @@
         except IOError: return
 
         if not start_over:
-            self.load_puzzle(fname, f)
+            opts = ['Start Over', 'Continue']
+            msg = ('This puzzle has been opened before. Would you like to ' +
+                   'continue where you left off?')
+            if has_hildon or self.ask(msg, opts) == 1:
+                self.load_puzzle(fname, f)
 
     def write_puzzle(self):
         if not self.puzzle: return
@@ -1430,7 +1447,10 @@
         self.about_dialog.set_version(__version__)
         self.about_dialog.set_comments('The Crossword puzzle player.')
         self.about_dialog.set_license(__license__)
-        self.about_dialog.set_authors(['Bill McCloskey <bill.mccloskey at gmail.com>\nMaemo Port: Bradley Bell <bradleyb at u.washington.edu>'])
+        self.about_dialog.set_authors(
+            ['Bill McCloskey <bill.mccloskey at gmail.com>\n' +
+             'Maemo Port: Bradley Bell <bradleyb at u.washington.edu>\n' +
+             'and Terrence Fleury <terrencegf at gmail.com>'])
 #        gtk.about_dialog_set_url_hook(self.show_website, "http://xword.garage.maemo.org")
         self.about_dialog.set_website_label("http://xword.garage.maemo.org")
         icon_path = ABOUT_ICON
@@ -1524,6 +1544,27 @@
             for (name, w) in self.widgets.items():
                 if w is widget: return name
 
+    def set_toolbar_layout(self, index):
+        if not self.letterbar1: return
+
+        self.toolbar_layout = index
+        for child in self.toolbox.get_children():
+            self.toolbox.remove(child)
+
+        if toolbar_layouts[index][1] == 'checks':
+            self.toolbox.pack_start(self.toolbar,False,False,0)
+        elif toolbar_layouts[index][1] == 'keyboard':
+            self.toolbox.pack_start(self.letterbar1,False,False,0)
+            self.toolbox.pack_start(self.letterbar2,False,False,0)
+            self.toolbox.pack_start(self.letterbar3,False,False,0)
+
+        if toolbar_layouts[index][2] == 'L':
+            self.box.reorder_child(self.toolbox,0)
+        elif toolbar_layouts[index][2] == 'R':
+            self.box.reorder_child(self.toolbox,-1)
+
+        self.win.show_all()
+
     def state_event(self, w, event):
         state = int(event.new_window_state)
         self.maximized = (state & gtk.gdk.WINDOW_STATE_MAXIMIZED) <> 0
@@ -1596,6 +1637,22 @@
         append(menu, 'skip-filled',
                create_menu_item('Skip Filled', MENU_SKIP, None,
                                 gtk.CheckMenuItem, self.skip_filled))
+
+        item = create_menu_item('Toolbar Layout', 0)
+        append(menu, 'toolbar', item)
+
+        menu1 = gtk.Menu()
+        item.set_submenu(menu1)
+
+        g = None
+        i = -1
+        for (name, layout, side) in toolbar_layouts:
+            item = create_radio_item(name, i-10, g, -(i+1)==self.toolbar_layout)
+            menu1.append(item)
+            if not g: item.set_active(True)
+            g = item
+            i -= 1
+
         item = create_menu_item('Word List Layout', 0)
         append(menu, 'layout', item)
         
@@ -1647,6 +1704,10 @@
             self.show_properties()
         elif action == 'about':
             self.show_about()
+        elif action < -10:
+            toolbar_layout = -(action+11)
+            if toolbar_layout <> self.toolbar_layout:
+                self.set_toolbar_layout(toolbar_layout)
         elif action < 0:
             layout = -(action+1)
             if layout <> self.layout: self.set_layout(layout)
@@ -1700,7 +1761,8 @@
         toolbar.set_orientation(gtk.ORIENTATION_VERTICAL)
         self.toolbar = toolbar
 
-        #self.create_toolbar_item('Quit', gtk.STOCK_QUIT, 'Quit')
+        if not has_hildon:
+            self.create_toolbar_item('Quit', gtk.STOCK_QUIT, 'Quit')
         self.create_toolbar_item('Open', gtk.STOCK_OPEN, 'Open')
         self.create_toolbar_item('Check Word', CHECK_ICON,
                                  'Check a word')
@@ -1716,6 +1778,41 @@
 
         return toolbar
 
+    def load_icon(self,filename):
+        img = gtk.Image()
+        img.set_from_file(filename)
+        return img
+
+    def create_letterbar(self,itemlist):
+        letterbar = gtk.Toolbar()
+        letterbar.set_style(gtk.TOOLBAR_ICONS)
+        letterbar.set_orientation(gtk.ORIENTATION_VERTICAL)
+
+        for item in itemlist:
+            if item == 'Left': button = gtk.ToolButton(
+                         self.load_icon(HOME_PATH+'/left.xpm'),None)
+            elif item == 'Right': button = gtk.ToolButton(
+                         self.load_icon(HOME_PATH+'/right.xpm'),None)
+            elif item == 'Up': button = gtk.ToolButton(
+                         self.load_icon(HOME_PATH+'/up.xpm'),None)
+            elif item == 'Down': button = gtk.ToolButton(
+                         self.load_icon(HOME_PATH+'/down.xpm'),None)
+            elif item == 'BackSpace': button = gtk.ToolButton(
+                         self.load_icon(HOME_PATH+'/backspace.xpm'),None)
+            elif item == 'Return': button = gtk.ToolButton(
+                         self.load_icon(HOME_PATH+'/swap.xpm'),None)
+            elif item == 'Tab': button = gtk.ToolButton(
+                         self.load_icon(HOME_PATH+'/nextword.xpm'),None)
+            elif item == 'ISO_Left_Tab': button = gtk.ToolButton(
+                         self.load_icon(HOME_PATH+'/prevword.xpm'),None)
+            else:
+                button = gtk.ToolButton(None,item)
+
+            button.connect('clicked',self.letterbar_event,item)
+            letterbar.insert(button,-1)
+
+        return letterbar
+
     def create_list(self, mode):
         if mode == ACROSS: label = 'Across'
         else: label = 'Down'
@@ -1792,9 +1889,19 @@
             else:
                 self.clock_time += (time.time() - self.clock_start)
 
+    def letterbar_event(self, widget, event):
+        keypress = gtk.gdk.Event(gtk.gdk.KEY_PRESS)
+        keypress.keyval = int(gtk.gdk.keyval_from_name(event))
+        if len(event) is 1 and event.isalpha():
+            self.puzzle_key_event('',keypress)
+        else:
+            self.key_event('',keypress)
+
     def button_event(self, widget, event, puzzle):
         if event.type is gtk.gdk.BUTTON_PRESS:
-            (x, y) = puzzle.translate_position(event.x, event.y)
+            (x, y) = puzzle.translate_position(
+                         event.x+puzzle.widget.get_hadjustment().get_value(), 
+                         event.y+puzzle.widget.get_vadjustment().get_value())
             if x == self.control.x and y == self.control.y:
                 self.control.switch_mode()
             else:
@@ -1811,7 +1918,8 @@
         elif name == 'Up': c.move(DOWN, -1)
         elif name == 'Down': c.move(DOWN, 1)
         elif name == 'BackSpace': c.back_space()
-        elif name == 'Return' or name == 'Tab': c.next_word(1)
+        elif name == 'Return': c.switch_mode()
+        elif name == 'Tab': c.next_word(1)
         elif name == 'ISO_Left_Tab': c.next_word(-1)
         elif name == 'F6':
             if self.fullscreen:
@@ -1820,6 +1928,7 @@
                 self.win.fullscreen()
         elif name == 'F7': c.next_word(1)
         elif name == 'F8': c.next_word(-1)
+        elif name == 'Escape': c.check_word()
         else: return False
 
         return True
@@ -1839,11 +1948,10 @@
             self.clock_button.set_active(False)
 
     def check_result(self, correct):
-        if correct: msg = 'No mistakes found'
+        if correct: msg = 'No mistakes found.'
         else: msg = 'Incorrect.'
 
-        if not has_hildon:
-            self.status_bar.push(self.status_bar.get_context_id('stat'), msg)
+        self.notify(msg)
 
     def open_file(self):
         def open_cb(w, open_dlg):
@@ -1923,6 +2031,8 @@
                 self.skip_filled = c.getboolean('options', 'skip_filled')
             if c.has_option('options', 'layout'):
                 self.layout = c.getint('options', 'layout')
+            if c.has_option('options', 'toolbar_layout'):
+                self.toolbar_layout = c.getint('options', 'toolbar_layout')
             if c.has_option('options', 'positions'):
                 self.positions = eval(c.get('options', 'positions'))
             if c.has_option('options', 'window_size'):
@@ -1939,6 +2049,7 @@
         c.add_section('options')
         c.set('options', 'skip_filled', self.skip_filled)
         c.set('options', 'layout', self.layout)
+        c.set('options', 'toolbar_layout', self.toolbar_layout)
         c.set('options', 'positions', repr(self.get_layout(self.cur_layout)))
         c.set('options', 'window_size', repr(self.window_size))
         c.set('options', 'maximized', repr(self.maximized))
@@ -1946,6 +2057,7 @@
         c.set('options', 'last_file', repr(self.last_file))
         c.write(file(os.path.expanduser('~/.crossword.cfg'), 'w'))
 
+
 if __name__ == '__main__':
     if len(sys.argv) <> 2:
         p = None



More information about the Xword-commits mailing list