[Xword-commits] r32 - branches/letterbars
btb at garage.maemo.org
btb at garage.maemo.org
Tue Apr 22 16:14:05 EEST 2008
Author: btb
Date: 2008-04-22 16:14:01 +0300 (Tue, 22 Apr 2008)
New Revision: 32
Modified:
branches/letterbars/xword
Log:
new experiment, just one toolbox using gtk.Table
Modified: branches/letterbars/xword
===================================================================
--- branches/letterbars/xword 2008-04-22 06:42:20 UTC (rev 31)
+++ branches/letterbars/xword 2008-04-22 13:14:01 UTC (rev 32)
@@ -1,6 +1,6 @@
#!/usr/bin/python
-__version__ = "1.0"
+__version__ = "1.0.4"
__license__ = """
Copyright (c) 2005-2006,
@@ -68,7 +68,7 @@
TIMER_ICON = HOME_PATH + '/crossword-clock.png'
ABOUT_ICON = HOME_PATH + '/xword-logo2.png'
-MIN_BOX_SIZE = 18
+MIN_BOX_SIZE = 20
ACROSS = 0
DOWN = 1
@@ -96,6 +96,13 @@
('Top and Bottom', ('V', 'across', 150, ('V', 'puzzle', 300, 'down')))
]
+toolbox_layouts = [
+ ('Off', 'N'),
+ ('On Left', 'L'),
+ ('On Right', 'R')
+ ]
+
+
def time_str(t):
total = int(t)
secs = total % 60
@@ -1183,7 +1190,8 @@
self.skip_filled = False
self.layout = 0
- self.window_size = (900, 600)
+ self.toolbox_layout = 0
+ self.window_size = (800, 480)
self.maximized = False
self.fullscreen = False
self.positions = layouts[self.layout][1]
@@ -1208,38 +1216,32 @@
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()
- self.toolbar = self.create_toolbar()
- box.pack_start(self.toolbar, False, False, 0)
+ menubox.pack_start(self.menubar, False, False, 0)
- self.letterbar = self.create_letterbar1()
- box.pack_start(self.letterbar, False, False, 0)
- self.letterbar = self.create_letterbar2()
- box.pack_start(self.letterbar, False, False, 0)
+ win.add(menubox)
+ self.box = gtk.HBox()
+ menubox.pack_start(self.box, True, True, 0)
+
+ self.toolbox = self.create_toolbox()
+ self.box.pack_start(self.toolbox, False, False, 0)
+
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_toolbox_layout(self.toolbox_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)
@@ -1251,17 +1253,14 @@
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()
self.control.signal()
self.puzzle_widget.area.grab_focus()
- if self.last_file: self.do_open_file(self.last_file)
+ if self.last_file and os.path.exists(self.last_file):
+ self.do_open_file(self.last_file)
def enable_controls(self, enabled):
def enable(w): w.set_property('sensitive', enabled)
@@ -1270,9 +1269,9 @@
enable(self.menu_items['properties'])
if has_print:
enable(self.menu_items['print'])
- enable(self.toolbar_items['Check Word'])
- enable(self.toolbar_items['Check Puzzle'])
- enable(self.toolbar_items['Solve Word'])
+ #enable(self.toolbox_items['Check Word'])
+ #enable(self.toolbox_items['Check Puzzle'])
+ #enable(self.toolbox_items['Solve Word'])
enable(self.clock_button)
def setup_controller(self):
@@ -1435,7 +1434,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
@@ -1529,6 +1531,19 @@
for (name, w) in self.widgets.items():
if w is widget: return name
+ def set_toolbox_layout(self, index):
+ try: self.toolbox
+ except: return
+
+ self.toolbox_layout = index
+
+ if toolbox_layouts[index][1] == 'L':
+ self.box.reorder_child(self.toolbox, 0)
+ elif toolbox_layouts[index][1] == '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
@@ -1601,6 +1616,22 @@
append(menu, 'skip-filled',
create_menu_item('Skip Filled', MENU_SKIP, None,
gtk.CheckMenuItem, self.skip_filled))
+
+ item = create_menu_item('Toolbox Layout', 0)
+ append(menu, 'toolbox', item)
+
+ menu1 = gtk.Menu()
+ item.set_submenu(menu1)
+
+ g = None
+ i = -1
+ for (name, side) in toolbox_layouts:
+ item = create_radio_item(name, i-10, g, -(i+1)==self.toolbox_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)
@@ -1652,105 +1683,94 @@
self.show_properties()
elif action == 'about':
self.show_about()
+ elif action < -10:
+ toolbox_layout = -(action+11)
+ if toolbox_layout <> self.toolbox_layout:
+ self.set_toolbox_layout(toolbox_layout)
elif action < 0:
layout = -(action+1)
if layout <> self.layout: self.set_layout(layout)
- def create_toolbar_item(self, label, icon, tooltip, is_toggle=False):
+ def load_icon(self,filename):
+ img = gtk.Image()
+ img.set_from_file(filename)
+ return img
+
+ def create_toolbox_item(self, icon, is_toggle = False):
+ if is_toggle:
+ item = gtk.ToggleButton()
+ else:
+ item = gtk.Button()
+
+ item.set_relief(gtk.RELIEF_NONE)
+
if icon:
img = gtk.Image()
if icon[-4:] == '.png': img.set_from_file(icon)
- else: img.set_from_stock(icon, gtk.ICON_SIZE_SMALL_TOOLBAR)
- else:
- img = None
+ elif icon[-4:] == '.xpm': img.set_from_file(icon)
+ else: img.set_from_stock(icon, gtk.ICON_SIZE_BUTTON)
+ item.set_image(img)
- if gtk.pygtk_version >= (2,3,90):
- if is_toggle:
- item = gtk.ToggleToolButton()
- item.set_label(label)
- item.set_icon_widget(img)
- else:
- item = gtk.ToolButton(img, label)
+ return item
- item.connect('clicked', self.toolbar_event, label)
- self.toolbar.insert(item, -1)
- self.toolbar_items[label] = item
- return item
- else:
- if is_toggle:
- x = self.toolbar.append_element(gtk.TOOLBAR_CHILD_TOGGLEBUTTON,
- None, label, tooltip, tooltip,
- img, self.toolbar_event, label)
- else:
- x = self.toolbar.append_item(label, tooltip, tooltip, img,
- self.toolbar_event, label)
- self.toolbar_items[label] = x
- return x
- def create_separator_toolitem(self):
- if gtk.pygtk_version >= (2,3,90):
- item = gtk.SeparatorToolItem()
- item.set_draw(False)
- item.set_expand(True)
- self.toolbar.insert(item, -1)
- else:
- # I don't know how to do this
- pass
+ def create_toolbox(self):
+ toolbox = gtk.Table(14, 3, True)
- def create_toolbar(self):
- self.toolbar_items = {}
+ button = self.create_toolbox_item(gtk.STOCK_OPEN)
+ button.connect('clicked', self.toolbox_event, 'Open')
+ toolbox.attach(button, 0, 1, 0, 1)
+
+ button = self.create_toolbox_item(gtk.STOCK_QUIT)
+ button.connect('clicked', self.toolbox_event, 'Quit')
+ toolbox.attach(button, 2, 3, 0, 1)
- toolbar = gtk.Toolbar()
- toolbar.set_style(gtk.TOOLBAR_BOTH)
- toolbar.set_orientation(gtk.ORIENTATION_VERTICAL)
- self.toolbar = toolbar
- #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')
- self.create_toolbar_item('Check Puzzle', CHECK_ALL_ICON,
- 'Check all words in the puzzle')
- self.create_toolbar_item('Solve Word', SOLVE_ICON,
- 'Cheat to get a word')
- self.create_toolbar_item('Backspace', gtk.STOCK_CLEAR, 'Backspace')
+ itemlist = [
+ ['A','D','G','J','M','P','S','V','Y','ISO_Left_Tab','Left','F12'],
+ ['B','E','H','K','N','Q','T','W','Z','Up','Return','Down'],
+ ['C','F','I','L','O','R','U','X','BackSpace','Tab','Right','Escape']
+ ]
- self.create_separator_toolitem()
- b = self.create_toolbar_item('', TIMER_ICON,
- 'Enable or disable the clock', True)
- self.clock_button = b
- self.idle_event()
+ x = 0
+ for column in itemlist:
+ y = 1
+ for item in column:
+ if item == 'Left':
+ button = self.create_toolbox_item(HOME_PATH+'/left.xpm')
+ elif item == 'Right':
+ button = self.create_toolbox_item(HOME_PATH+'/right.xpm')
+ elif item == 'Up':
+ button = self.create_toolbox_item(HOME_PATH+'/up.xpm')
+ elif item == 'Down':
+ button = self.create_toolbox_item(HOME_PATH+'/down.xpm')
+ elif item == 'BackSpace':
+ button = self.create_toolbox_item(HOME_PATH+'/backspace.xpm')
+ elif item == 'Return':
+ button = self.create_toolbox_item(HOME_PATH+'/swap.xpm')
+ elif item == 'Tab':
+ button = self.create_toolbox_item(HOME_PATH+'/nextword.xpm')
+ elif item == 'ISO_Left_Tab':
+ button = self.create_toolbox_item(HOME_PATH+'/prevword.xpm')
+ elif item == 'Escape':
+ button = self.create_toolbox_item(HOME_PATH+'/check.xpm')
+ elif item == 'F12':
+ button = self.create_toolbox_item(HOME_PATH+'/solve.xpm')
+ else:
+ button = gtk.Button(item)
+ button.set_relief(gtk.RELIEF_NONE)
- return toolbar
+ button.connect('clicked', self.toolbox_event, item)
+ toolbox.attach(button, x, x+1, y, y+1)
+ y += 1
+ x += 1
- def create_letterbar1(self):
- letterbar = gtk.Toolbar()
- letterbar.set_style(gtk.TOOLBAR_TEXT)
- letterbar.set_orientation(gtk.ORIENTATION_VERTICAL)
- self.letterbar = letterbar
+ self.clock_button = self.create_toolbox_item(TIMER_ICON, True)
+ self.clock_button.connect('clicked', self.toolbox_event, 'Timer')
+ toolbox.attach(self.clock_button, 0, 3, y, y+1)
- for i in range(13):
- letter = chr(ord('A') + i)
- item = gtk.ToolButton(None, letter)
- item.connect('clicked', self.letterbar_event, letter)
- letterbar.insert(item, -1)
+ return toolbox
- return letterbar
-
- def create_letterbar2(self):
- letterbar = gtk.Toolbar()
- letterbar.set_style(gtk.TOOLBAR_TEXT)
- letterbar.set_orientation(gtk.ORIENTATION_VERTICAL)
- self.letterbar = letterbar
-
- for i in range(13):
- letter = chr(ord('N') + i)
- item = gtk.ToolButton(None, letter)
- item.connect('clicked', self.letterbar_event, letter)
- letterbar.insert(item, -1)
-
- return letterbar
-
def create_list(self, mode):
if mode == ACROSS: label = 'Across'
else: label = 'Down'
@@ -1809,7 +1829,7 @@
return True
- def toolbar_event(self, widget, event):
+ def toolbox_event(self, widget, event):
if event == 'Quit':
self.exit()
elif event == 'Open':
@@ -1820,22 +1840,25 @@
self.control.check_puzzle()
elif event == 'Solve Word':
self.control.solve_word()
- elif event == 'Backspace':
- self.control.back_space()
- else: # it must be the clock
+ elif event == 'Timer':
self.clock_running = not self.clock_running
if self.clock_running:
self.clock_start = time.time()
else:
self.clock_time += (time.time() - self.clock_start)
+ else:
+ 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 letterbar_event(self, widget, event):
- c = self.control
- c.input_char(self.skip_filled, event)
-
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:
@@ -1852,7 +1875,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:
@@ -1861,6 +1885,8 @@
self.win.fullscreen()
elif name == 'F7': c.next_word(1)
elif name == 'F8': c.next_word(-1)
+ elif name == 'Escape': c.check_word()
+ elif name == 'F12': c.solve_word()
else: return False
return True
@@ -1880,11 +1906,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):
@@ -1964,6 +1989,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', 'toolbox_layout'):
+ self.toolbox_layout = c.getint('options', 'toolbox_layout')
if c.has_option('options', 'positions'):
self.positions = eval(c.get('options', 'positions'))
if c.has_option('options', 'window_size'):
@@ -1980,6 +2007,7 @@
c.add_section('options')
c.set('options', 'skip_filled', self.skip_filled)
c.set('options', 'layout', self.layout)
+ c.set('options', 'toolbox_layout', self.toolbox_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))
@@ -1987,6 +2015,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