# Main window class for GetAClue player
+import sys
+import os.path
import cPickle
import pygtk
pygtk.require20 ()
# typing mode constants
ACROSS = 1
DOWN = 2
+ # license text to be displayed in the about dialog
+ LICENSE_TEXT = """GetAClue is free software: you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
- # callback for menu item open activated event
- def on_open_activate (self, menuitem):
- dlg = gtk.FileChooserDialog ("Open a GetAClue puzzle", self.window,
- gtk.FILE_CHOOSER_ACTION_OPEN,
- (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
-
- if dlg.run () == gtk.RESPONSE_OK:
- puzzlefile = dlg.get_filename ()
- self.open_file (puzzlefile)
+GetAClue is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
- dlg.destroy ()
+You should have received a copy of the GNU General Public License
+along with GetAClue. If not, see <http://www.gnu.org/licenses/>."""
# quit verification
def verify_quit (self):
dlg.destroy ()
return True
+ # callback for menu item open activated event
+ def on_open_activate (self, menuitem):
+ dlg = gtk.FileChooserDialog ("Open a GetAClue puzzle", self.window,
+ gtk.FILE_CHOOSER_ACTION_OPEN,
+ (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OPEN, gtk.RESPONSE_OK))
+
+ if dlg.run () == gtk.RESPONSE_OK:
+ puzzlefile = dlg.get_filename ()
+ self.open_file (puzzlefile)
+
+ dlg.destroy ()
+
+ # callback for menu item save as activated event
+ def on_save_as_activate (self, menuitem):
+ if self.puzzle:
+ dlg = gtk.FileChooserDialog ("Save GetAClue puzzle as", self.window,
+ gtk.FILE_CHOOSER_ACTION_SAVE,
+ (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE,
+ gtk.RESPONSE_OK))
+ if dlg.run () == gtk.RESPONSE_OK:
+ puzzlefile = dlg.get_filename ()
+ self.save_file (puzzlefile)
+
+ dlg.destroy ()
# callback for main window destroy
def on_mainwindow_destroy (self, args):
puzgrid.queue_draw ()
dlg.destroy ()
+ # callback for menu help about activated event
+ def on_about_activate (self, menu_item):
+ # display the about dialog
+ self.about ()
# function to set the selected row/col based on the number clicked
# on the clues list and also set the typing mode
if self.puzzle:
# set a guess only if not revealed
if self.puzzle.data[self.selected_row][self.selected_col].revealed is False:
- self.puzzle.data[self.selected_row][self.selected_col].guess = guess_char.upper ()
+ self.puzzle.data[self.selected_row][self.selected_col].guess = guess_char
# across mode typing
if self.typing_mode == self.ACROSS:
# move by one character across but only if there is no block
drawarea.queue_draw ()
# if it is A-Z or a-z then
elif len (key) == 1 and key.isalpha ():
- self.set_guess (key)
+ guess_char = key.upper ()
+ self.set_guess (guess_char)
drawarea.queue_draw ()
# if it is the delete key then delete character at selected row/col
- elif key == "delete" or key == "space":
+ elif key == "delete":
self.puzzle.data[self.selected_row][self.selected_col].guess = None
drawarea.queue_draw ()
+ # if the key is space key then delete character and move across or
+ # down one step depending on the mode
+ elif key == "space":
+ self.set_guess (None)
+ drawarea.queue_draw ()
# if it is backspace key then delete character at previous row/col
# depending on the input mode. If across editing mode, then delete
# at previous column else at previous row
down.append ([ str(self.puzzle.data[word[1]][word[2]].numbered),
clue])
+ def save_file (self, file):
+ # try to save the file
+ try:
+ cPickle.dump (self.puzzle, open (file, "wb"), cPickle.HIGHEST_PROTOCOL)
+ except (IOError, OSError, cPickle.PicklingError):
+ dlg = gtk.MessageDialog (self.window, gtk.DIALOG_MODAL,
+ gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE,
+ "Error in saving puzzle")
+ dlg.run ()
+ dlg.destroy ()
+
+ # open a file
def open_file (self, file):
# try to open the file
try:
dlg.run ()
dlg.destroy ()
+ # about dialog
+ def about (self):
+ dlg = gtk.AboutDialog ()
+ dlg.set_name ("GetAClue Player")
+ dlg.set_copyright ("Copyright 2010 V.Harishankar")
+ dlg.set_website ("http://harishankar.org/software")
+ dlg.set_authors (("Harishankar",))
+ dlg.set_logo (self.window.get_icon())
+ dlg.set_license (self.LICENSE_TEXT)
+ dlg.set_comments ("Create and play Crossword puzzles")
+ dlg.run ()
+ dlg.destroy ()
+
def __init__ (self, file_to_play = None):
# load the user interface
self.ui = gtk.Builder ()
- self.ui.add_from_file ("playerwindow.glade")
+
+ # Path for the interface file - change this if you are distributing
+ # the application and put the icon, interface file in a different
+ # location!!
+ gladepath = os.path.join (sys.path[0], "playerwindow.glade")
+ self.ui.add_from_file (gladepath)
# window object
self.window = self.ui.get_object ("mainwindow")