diff options
Diffstat (limited to 'com/gmail')
14 files changed, 509 insertions, 0 deletions
diff --git a/com/gmail/__init__.py b/com/gmail/__init__.py new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/com/gmail/__init__.py diff --git a/com/gmail/bernabe/__init__.py b/com/gmail/bernabe/__init__.py new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/com/gmail/bernabe/__init__.py diff --git a/com/gmail/bernabe/laurent/__init__.py b/com/gmail/bernabe/laurent/__init__.py new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/com/gmail/bernabe/laurent/__init__.py diff --git a/com/gmail/bernabe/laurent/sugar_olpc/__init__.py b/com/gmail/bernabe/laurent/sugar_olpc/__init__.py new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/com/gmail/bernabe/laurent/sugar_olpc/__init__.py diff --git a/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/__init__.py b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/__init__.py new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/__init__.py diff --git a/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/gui/InputDialog.py b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/gui/InputDialog.py new file mode 100755 index 0000000..fc06d01 --- /dev/null +++ b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/gui/InputDialog.py @@ -0,0 +1,53 @@ +''' +Created on 13 mai 2011 + +@author: laurent_bernabe +''' + +import pygtk +pygtk.require('2.0') +import gtk + +class InputDialog(gtk.MessageDialog): + ''' + Creates an input dialog with + => a label (for the prompt) + => a text entry + => ok_button and cancel_button + ''' + + + def __init__(self, prompt, parent=None): + ''' + Constructor(prompt, parent=None) + prompt argument : the text of the dialog + parent : the parent control + ''' + gtk.MessageDialog.__init__(self, + parent, gtk.DIALOG_MODAL, gtk.MESSAGE_QUESTION, + gtk.BUTTONS_OK_CANCEL, prompt) + self.__entry = gtk.Entry() + self.vbox.pack_start(self.__entry, True, True, 0) + self.connect("delete-event", lambda widget, event : self.__close() ) + + def run(self): + ''' + Run() + Runs the dialog + ''' + self.show_all() + response = super(InputDialog,self).run() + if response == gtk.RESPONSE_OK : + text = self.__entry.get_text() + else : + text = None + self.destroy() + return text + + def __close(self): + ''' + __close() + Closes the dialog and returns None + ''' + self.destroy() + return None
\ No newline at end of file diff --git a/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/gui/MenuActions.py b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/gui/MenuActions.py new file mode 100755 index 0000000..b9b0dc8 --- /dev/null +++ b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/gui/MenuActions.py @@ -0,0 +1,72 @@ +''' +Created on 12 mai 2011 + +@author: laurent_bernabe +''' +from com.gmail.bernabe.laurent.sugar_olpc.learning_writing.gui.InputDialog import \ + InputDialog + +import pygtk +pygtk.require('2.0') +import gtk + +class MenuActions(object): + ''' + Wraps codes for the menu actions in both + pure pygtk mode and in sugar mode + ''' + + def __init__(self, wrappedDrawingArea): + ''' + Constructor + => wrappedDrawingArea argument : the instance of + TheDrawingAreaEventBox to act upon + => MenuActions(wrappedDrawingArea) + ''' + self.__wrappedDrawingArea = wrappedDrawingArea + + def manageDrawingWrite(self): + ''' + manageDrawingWrite() + Wraps code for menu Drawing->Write + ''' + dialog = InputDialog("Line thickness value ?\n(I advice you 5)") + user_value = dialog.run() + if user_value != None : + try: + line_thickness = int(user_value) + assert line_thickness > 0 + except (ValueError, AssertionError) : + message = "As you did not give an correct integer value,\n5 will be taken" + message_dialog = gtk.MessageDialog(None, + gtk.DIALOG_MODAL, + gtk.MESSAGE_ERROR, + gtk.BUTTONS_OK, + message) + message_dialog.run() + message_dialog.destroy() + line_thickness = 5 + self.__wrappedDrawingArea.setRecordingMode(line_thickness) + + def manageDrawingRead(self): + ''' + manageDrawingRead() + Wraps code for menu Drawing->Read + ''' + dialog = InputDialog("Steps drawing delays (milliseconds) ?\n(I advice you 10)") + user_value = dialog.run() + if user_value != None : + try: + delay_milliseconds = int(user_value) + assert delay_milliseconds > 0 + except (ValueError, AssertionError) : + message = "As you did not give an correct integer value,\n10 will be taken" + message_dialog = gtk.MessageDialog(None, + gtk.DIALOG_MODAL, + gtk.MESSAGE_ERROR, + gtk.BUTTONS_OK, + message) + message_dialog.run() + message_dialog.destroy() + delay_milliseconds = 10 + self.__wrappedDrawingArea.setReadingMode(delay_milliseconds)
\ No newline at end of file diff --git a/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/gui/TheDrawingAreaEventBox.py b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/gui/TheDrawingAreaEventBox.py new file mode 100755 index 0000000..cdd3319 --- /dev/null +++ b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/gui/TheDrawingAreaEventBox.py @@ -0,0 +1,217 @@ +''' +Created on 10 mai 2011 + +@author: laurent_bernabe +''' + +import pygtk +pygtk.require('2.0') +import gtk +import cairo +import gobject + +class TheDrawingAreaEventBox(gtk.EventBox): + ''' + A gtk.EventBox wrapping the DrawingArea (or canvas) of the application + We use an EventBox in order to pass events to the contained DrawingArea + ''' + __DARK_GREEN = (27.0/255.0, 103.0/255.0,46.0/255.0) + __WHITE = (1.0, 1.0, 1.0) + + + def __init__(self): + ''' + Simple constructor without argument + ''' + gtk.EventBox.__init__(self) + self.__setFields() + self.__setConnections() + + def __setFields(self): + ''' + Gives values to fields + ''' + self.__drawingArea = gtk.DrawingArea() + self.add(self.__drawingArea) + self.__figures = [] + self.__lineThickness = 1 + # number of steps (for the figures overall) currently drawn + # only used in reading mode (which is the starting mode) + self.__drawn_steps = -1 + # __overall_maximum_steps stores the steps of all the figures + # only used in reading mode (which is the starting mode) + self.__overall_maximum_steps = -1 + # __current_maximum_steps stores the maximum steps the updater thread + # is allowing to draw. In each cycle of the updater thread, this value + # is incremented, giving this impression of a tape reading + # only used in reading mode (which is the starting mode) + self.__current_maximum_steps = -1 + # the updater delay in milliseconds + # => at which intervals, in reading mode, + # the redraws should be done + self.__updater_delay_milliseconds = -1 + self.__mousePressed = False + self.__readingMode = False + + def __setConnections(self): + ''' + Define the events connections + ''' + self.__drawingArea.connect("expose-event", self.__paintSurface) + self.connect("motion-notify-event", self.__manageMouseMovedEvent) + self.connect("button-press-event", self.__manageButtonPressedEvent) + self.connect("button-release-event", self.__manageButtonReleasedEvent) + + def setRecordingMode(self, line_thickness): + ''' + Switch drawing area management to recording mode + => setRecordingMode(line_thickness) + where line_thickness is an integer + ''' + self.__readingMode = False + self.__figures = [] + self.__drawingArea.queue_draw() + self.__startNewFigure() + self.__setLineThickness(line_thickness) + + def setReadingMode(self, intervals_between_steps_milliseconds): + ''' + Switch drawing area management to reading mode + => intervals_between_steps argument is an integer saying delays + in millisecond between steps + => setReadingMode(intervals_between_steps_milliseconds) + => intervals_between_steps_milliseconds : integer + ''' + self.__updater_delay_milliseconds = intervals_between_steps_milliseconds + self.__drawn_steps = 0 + self.__current_maximum_steps = 0 + self.__computeOverallMaximumSteps() + self.__drawingArea.queue_draw() + self.__readingMode = True + self.__regularlyUpdatePaintForReadingMode() + + + def __setLineThickness(self, line_thickness): + ''' + Sets lines thickness. Only integers greater than 0 will be taken + in consideration. + => __setLineThickness(line_thickness) + where line_thickness is an integer + ''' + if isinstance(line_thickness, int) and line_thickness > 0: + self.__lineThickness = line_thickness + + def __paintSurface(self, widget, event): + ''' + Paint the whole drawing area + => __paintSurface(widget, event) + ''' + cairoContext = self.__drawingArea.window.cairo_create() + self.__drawBackground(cairoContext) + self.__drawFigures(cairoContext) + return True + + def __drawBackground(self, cairoContext): + ''' + Paints the background + => __drawBackground(cairoContext) + where cairoContext is a cairo context of the DrawingArea + ''' + cairoContext.set_source_rgb(*TheDrawingAreaEventBox.__DARK_GREEN) + cairoContext.rectangle( 0,0, *(self.window.get_size()) ) + cairoContext.fill() + + def __drawFigures(self, cairoContext): + ''' + Draws the figures + => __drawFigures(cairoContext) + where cairoContext is a cairo context of the DrawingArea + ''' + cairoContext.set_source_rgb(*TheDrawingAreaEventBox.__WHITE) + cairoContext.set_line_width(self.__lineThickness) + cairoContext.set_line_join(cairo.LINE_JOIN_ROUND) + cairoContext.set_line_cap(cairo.LINE_CAP_ROUND) + if self.__readingMode: + self.__drawn_steps = 0 + for current_figure in self.__figures: + if len(current_figure) > 0 : + startPoint = current_figure[0] + cairoContext.move_to(*startPoint) + if self.__readingMode: + self.__drawn_steps += 1 + for pointIndex in range(1, len(current_figure)): + if self.__readingMode and self.__drawn_steps >= self.__current_maximum_steps : + cairoContext.stroke() + return + endPoint = current_figure[pointIndex] + cairoContext.line_to(*endPoint) + startPoint = endPoint + if self.__readingMode : + self.__drawn_steps += 1 + cairoContext.stroke() + + def __startNewFigure(self): + ''' + Starts a new figure + ''' + self.__figures += [[]] + + def __addPointToCurrentFigure(self, pointTuple): + ''' + Adds a point to the current figure + ==> __addPointToCurrentFigure(pointTuple) + where pointTuple is a tuple of the point coordinates + ''' + self.__figures[len(self.__figures)-1] += [pointTuple] + + def __computeOverallMaximumSteps(self): + ''' + Computes the number of steps of all the Figures to draw + ''' + self.__overall_maximum_steps = 0 + for current_figure in self.__figures : + self.__overall_maximum_steps += len(current_figure) + + def __manageMouseMovedEvent(self, widget, event): + ''' + Manage mouse move event + => __manageMouseMovedEvent(widget, event) + ''' + if self.__mousePressed: + self.__addPointToCurrentFigure((event.x, event.y)) + self.__drawingArea.queue_draw() # repaint the drawing area + return True # we don't need further handling for this event + + def __manageButtonPressedEvent(self, widget, event): + ''' + Manage button pressed event + => __manageButtonPressedEvent(widget, event) + ''' + self.__startNewFigure() + self.__mousePressed = True + return True # we don't need further handling for this event + + def __manageButtonReleasedEvent(self, widget, event): + ''' + Manage button released event + => __manageButtonReleasedEvent(widget, event) + ''' + self.__mousePressed = False + return True # we don't need further handling for this event + + def __regularlyUpdatePaintForReadingMode(self): + ''' + Increases the current maximum drawn steps and repaint all, at + regular delays. (For reading mode) + => __regularlyUpdatePaintForReadingMode(regular_delay_milliseconds) + regular_delay_milliseconds : integer + ''' + if self.__readingMode: + self.__current_maximum_steps += 1 + self.__drawingArea.queue_draw() + if self.__current_maximum_steps < self.__overall_maximum_steps : + gobject.timeout_add( + self.__updater_delay_milliseconds, + self.__regularlyUpdatePaintForReadingMode + ) +
\ No newline at end of file diff --git a/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/gui/__init__.py b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/gui/__init__.py new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/gui/__init__.py diff --git a/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/pure_pygtk_launcher/PurePyGTKLauncher.py b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/pure_pygtk_launcher/PurePyGTKLauncher.py new file mode 100755 index 0000000..204552d --- /dev/null +++ b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/pure_pygtk_launcher/PurePyGTKLauncher.py @@ -0,0 +1,12 @@ +''' +Created on 10 mai 2011 + +@author: laurent_bernabe +''' + +import gtk +from com.gmail.bernabe.laurent.sugar_olpc.learning_writing.pure_pygtk_launcher.TheWindow import TheWindow + +if __name__ == '__main__': + TheWindow() + gtk.main()
\ No newline at end of file diff --git a/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/pure_pygtk_launcher/TheWindow.py b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/pure_pygtk_launcher/TheWindow.py new file mode 100755 index 0000000..d45e418 --- /dev/null +++ b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/pure_pygtk_launcher/TheWindow.py @@ -0,0 +1,69 @@ +''' +Created on 10 mai 2011 + +@author: laurent_bernabe +''' +import pygtk + +from com.gmail.bernabe.laurent.sugar_olpc.learning_writing.gui.MenuActions \ +import MenuActions + +pygtk.require('2.0') +import gtk + +from \ +com.gmail.bernabe.laurent.sugar_olpc.learning_writing.gui.TheDrawingAreaEventBox \ +import TheDrawingAreaEventBox + +class TheWindow(gtk.Window): + ''' + The Window of the application + ''' + + def __init__(self): + ''' + Simple constructor + ''' + gtk.Window.__init__(self) + self.__wrapped_drawing_area = TheDrawingAreaEventBox() + self.__menu_actions = MenuActions(self.__wrapped_drawing_area) + self.__vbox = gtk.VBox(False, 2) + self.add(self.__vbox) + self.__addMenuBar() + self.__vbox.pack_start(self.__wrapped_drawing_area) + self.set_size_request(300, 300) + self.connect("delete-event", lambda widget, event : gtk.main_quit()) + self.show_all() + + def __addMenuBar(self): + ''' + Adds a menu bar + ''' + menu_bar = gtk.MenuBar() + drawing_item = gtk.MenuItem("_Drawing") + menu_bar.append(drawing_item) + drawing_sub_menu = gtk.Menu() + drawing_write_item = gtk.RadioMenuItem(None, "_Write") + drawing_write_item.set_active(True) + drawing_write_item.connect("activate", self.__manageDrawingWrite) + drawing_read_item = gtk.RadioMenuItem(drawing_write_item, "_Read") + drawing_read_item.connect("activate", self.__manageDrawingRead) + drawing_sub_menu.append(drawing_write_item) + drawing_sub_menu.append(drawing_read_item) + drawing_item.set_submenu(drawing_sub_menu) + self.__vbox.pack_start(menu_bar, False, True) + menu_bar.show_all() + + def __manageDrawingWrite(self, menu_item): + ''' + Manages drawing->write menu + ''' + if menu_item.get_active() : + self.__menu_actions.manageDrawingWrite() + + def __manageDrawingRead(self, menu_item): + ''' + Manages drawing->read menu + ''' + if menu_item.get_active() : + self.__menu_actions.manageDrawingRead()
\ No newline at end of file diff --git a/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/pure_pygtk_launcher/__init__.py b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/pure_pygtk_launcher/__init__.py new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/pure_pygtk_launcher/__init__.py diff --git a/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/sugar_launcher/Launcher.py b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/sugar_launcher/Launcher.py new file mode 100755 index 0000000..84c1c5f --- /dev/null +++ b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/sugar_launcher/Launcher.py @@ -0,0 +1,86 @@ +''' +Created on 10 mai 2011 + +@author: laurent_bernabe +''' +from sugar.activity import activity + +from com.gmail.bernabe.laurent.sugar_olpc.learning_writing.gui.MenuActions \ +import MenuActions + +from com.gmail.bernabe.laurent.sugar_olpc.learning_writing.gui.TheDrawingAreaEventBox \ +import TheDrawingAreaEventBox + +import pygtk +pygtk.require('2.0') +import gtk + +class Launcher(activity.Activity): + ''' + Launcher for sugar bundle + ''' + + def __init__(self, handle): + ''' + Constructor + ''' + activity.Activity.__init__(self, handle) + # Be carefull on the callings order !!! + # => self.__wrapped_drawing_area is not defined before + # self.__createAndSetCanvas() call + # => self.__createAndSetToolbox need self.__menu_actions + self.__createAndSetCanvas() + self.__menu_actions = MenuActions(self.__wrapped_drawing_area) + self.__createAndSetToolbox() + + def __createAndSetToolbox(self): + ''' + Creates and sets the tool box + ''' + toolbox = activity.ActivityToolbox(self) + self.__addDrawingToolbarIn(toolbox) + self.set_toolbox(toolbox) + toolbox.show_all() + + def __createAndSetCanvas(self): + ''' + Creates and set the Canvas + ''' + self.__wrapped_drawing_area = TheDrawingAreaEventBox() + self.set_canvas(self.__wrapped_drawing_area) + self.show_all() + + def __manageDrawingWrite(self, menu_item): + ''' + Manages drawing->write menu + ''' + if menu_item.get_active() : + self.__menu_actions.manageDrawingWrite() + + def __manageDrawingRead(self, menu_item): + ''' + Manages drawing->read menu + ''' + if menu_item.get_active() : + self.__menu_actions.manageDrawingRead() + + def __addDrawingToolbarIn(self, toolbox): + ''' + Creates and add Drawing toolbar in toolbox + => __addDrawingToolbarIn(toolbox) + ''' + drawing_toolbar = gtk.Toolbar() + drawing_toolbar.set_style(gtk.TOOLBAR_ICONS) + #---------------------- + drawing_toolbar_write_button = gtk.RadioToolButton(None, gtk.STOCK_MEDIA_RECORD) + drawing_toolbar_write_button.set_active(True) + drawing_toolbar_write_button.connect("clicked", self.__manageDrawingWrite ) + drawing_toolbar.insert(drawing_toolbar_write_button, 0) + #--------------------- + drawing_toolbar_read_button = gtk.RadioToolButton(drawing_toolbar_write_button, gtk.STOCK_MEDIA_PLAY) + drawing_toolbar_read_button.set_active(False) + drawing_toolbar_read_button.connect("clicked", self.__manageDrawingRead ) + drawing_toolbar.insert(drawing_toolbar_read_button, 1) + #-------------------- + toolbox.add_toolbar('Drawing', drawing_toolbar) + drawing_toolbar.show_all()
\ No newline at end of file diff --git a/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/sugar_launcher/__init__.py b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/sugar_launcher/__init__.py new file mode 100755 index 0000000..e69de29 --- /dev/null +++ b/com/gmail/bernabe/laurent/sugar_olpc/learning_writing/sugar_launcher/__init__.py |