From e17ecb8ed14ad55b0ac2d1a45ae78b8452c8db18 Mon Sep 17 00:00:00 2001 From: Harishankar Date: Tue, 7 Dec 2010 14:44:49 +0530 Subject: [PATCH] Added exception handling to opening file in player Added exception handling to opening file in GetAClue player. Also added assertion for frozen/unfrozen grid. --- crosswordpuzzle.py | 32 ++++++++++++++----------- player_mainwindow.py | 56 +++++++++++++++++++++++++++++++++++++++----- playerwindow.glade | 22 ++++++++++++++++- 3 files changed, 89 insertions(+), 21 deletions(-) diff --git a/crosswordpuzzle.py b/crosswordpuzzle.py index a02f469..d02890b 100644 --- a/crosswordpuzzle.py +++ b/crosswordpuzzle.py @@ -136,8 +136,7 @@ class CrosswordPuzzle: def export_image (self, pngfile, htmlfile=None, puztitle="Crossword Puzzle", solution=True): # don't export if grid is not frozen - if self.frozen_grid is False: - raise FrozenGridException + self.assert_frozen_grid () # create cairo image surface and context px = 30 @@ -226,8 +225,7 @@ class CrosswordPuzzle: # get the AcrossLite(TM) data for exporting def export_acrosslite (self, title, author, copyright): # don't export if grid is not frozen - if self.frozen_grid is False: - raise FrozenGridException + self.assert_frozen_grid () across_data = [] across_data.append ("\r\n") @@ -373,9 +371,8 @@ class CrosswordPuzzle: # setting a down word def set_word_down (self, row, col, word): - # if the grid is frozen the abort - if self.frozen_grid is True: - raise FrozenGridException + # if the grid is frozen then abort + self.assert_unfrozen_grid () # if the word length greater than totalrows - startrow if len(word) > self.rows - row: @@ -428,9 +425,8 @@ class CrosswordPuzzle: # setting an across word def set_word_across (self, row, col, word): - # if the grid is frozen the abort - if self.frozen_grid is True: - raise FrozenGridException + # if the grid is frozen then abort + self.assert_unfrozen_grid () # is the word length greater than totalcols - startcol? if len(word) > self.cols - col: @@ -511,6 +507,16 @@ class CrosswordPuzzle: self.frozen_grid = False + # raise an exception if the grid is frozen + def assert_unfrozen_grid (self): + if self.frozen_grid is True: + raise FrozenGridException + + # raise an exception if the grid is NOT frozen + def assert_frozen_grid (self): + if self.frozen_grid is False: + raise FrozenGridException + # reset the entire grid def reset_grid (self): # run through the grid @@ -524,8 +530,7 @@ class CrosswordPuzzle: # remove an across word at position def remove_word_across (self, row, col): # if grid is frozen don't allow removal of word - if self.frozen_grid is True: - raise FrozenGridException + assert_unfrozen_grid () word, brow, bcol, l = self.get_word_across (row, col) @@ -541,8 +546,7 @@ class CrosswordPuzzle: # remove a down word at position def remove_word_down (self, row, col): # if grid is frozen don't allow removal of word - if self.frozen_grid is True: - raise FrozenGridException + self.assert_unfrozen_grid () word, brow, bcol, l = self.get_word_down (row, col) # traverse from the beginn to end of the word and erase it diff --git a/player_mainwindow.py b/player_mainwindow.py index 4524106..3ea5420 100644 --- a/player_mainwindow.py +++ b/player_mainwindow.py @@ -13,10 +13,23 @@ import crosswordpuzzle class MainWindow: def gtk_main_quit (self, *args): + if self.puzzle: + dlg = gtk.MessageDialog (self.window, gtk.DIALOG_MODAL, + gtk.MESSAGE_QUESTION, gtk.BUTTONS_YES_NO, + "Puzzle is open. Are you sure you wish to quit?") + if dlg.run () == gtk.RESPONSE_NO: + dlg.destroy () + return + dlg.destroy () + gtk.main_quit () + # callback for menu item quit activated event + def on_quit_activate (self, menuitem): + self.gtk_main_quit () + # callback for puzzle grid mouse button release event - def on_puzzlegrid_button_release_event (self, drawarea, event): + def on_puzzlegrid_button_press_event (self, drawarea, event): self.window.set_focus (drawarea) return True @@ -153,11 +166,42 @@ class MainWindow: clue]) def open_file (self, file): - self.puzzle = cPickle.load (open (file, "rb")) - self.selected_row = 0 - self.selected_col = 0 - self.window.set_title ("GetAClue player - " + file) - self.load_clues () + # try to open the file + try: + # load the puzzle + self.puzzle = cPickle.load (open (file, "rb")) + # assert that it is unfrozen otherwise raise frozen grid exception + self.puzzle.assert_frozen_grid () + + # set selected initial row and column to 0 + self.selected_row = 0 + self.selected_col = 0 + self.window.set_title ("GetAClue player - " + file) + # load the clues + self.load_clues () + # handle unpickling, and file errors + except (cPickle.UnpicklingError, IOError, OSError): + dlg = gtk.MessageDialog (self.window, gtk.DIALOG_MODAL, + gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, + "Invalid file. Cannot be loaded") + dlg.run () + dlg.destroy () + # if the puzzle has no words, then it cannot be played obviously + except crosswordpuzzle.NoWordsException: + self.puzzle = None + dlg = gtk.MessageDialog (self.window, gtk.DIALOG_MODAL, + gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, + "Word grid has no words. Cannot play") + dlg.run () + dlg.destroy () + # if the puzzle is not frozen then it cannot be played + except crosswordpuzzle.FrozenGridException: + self.puzzle = None + dlg = gtk.MessageDialog (self.window, gtk.DIALOG_MODAL, + gtk.MESSAGE_ERROR, gtk.BUTTONS_CLOSE, + "Word grid is not finalized/frozen. Cannot play") + dlg.run () + dlg.destroy () def __init__ (self, file_to_play = None): # load the user interface diff --git a/playerwindow.glade b/playerwindow.glade index d13e901..9fc4a78 100644 --- a/playerwindow.glade +++ b/playerwindow.glade @@ -66,6 +66,7 @@ True _Quit True + @@ -95,6 +96,25 @@ True + + + True + _Hide solution + True + + + + + True + + + + + True + _Verify your board... + True + + @@ -144,9 +164,9 @@ True GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_STRUCTURE_MASK + - -- 2.20.1