Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/com/gmail
diff options
context:
space:
mode:
Diffstat (limited to 'com/gmail')
-rwxr-xr-xcom/gmail/__init__.py0
-rwxr-xr-xcom/gmail/bernabe/__init__.py0
-rwxr-xr-xcom/gmail/bernabe/laurent/__init__.py0
-rwxr-xr-xcom/gmail/bernabe/laurent/sugar_olpc/__init__.py0
-rwxr-xr-xcom/gmail/bernabe/laurent/sugar_olpc/learning_writing/__init__.py0
-rwxr-xr-xcom/gmail/bernabe/laurent/sugar_olpc/learning_writing/gui/InputDialog.py53
-rwxr-xr-xcom/gmail/bernabe/laurent/sugar_olpc/learning_writing/gui/MenuActions.py72
-rwxr-xr-xcom/gmail/bernabe/laurent/sugar_olpc/learning_writing/gui/TheDrawingAreaEventBox.py217
-rwxr-xr-xcom/gmail/bernabe/laurent/sugar_olpc/learning_writing/gui/__init__.py0
-rwxr-xr-xcom/gmail/bernabe/laurent/sugar_olpc/learning_writing/pure_pygtk_launcher/PurePyGTKLauncher.py12
-rwxr-xr-xcom/gmail/bernabe/laurent/sugar_olpc/learning_writing/pure_pygtk_launcher/TheWindow.py69
-rwxr-xr-xcom/gmail/bernabe/laurent/sugar_olpc/learning_writing/pure_pygtk_launcher/__init__.py0
-rwxr-xr-xcom/gmail/bernabe/laurent/sugar_olpc/learning_writing/sugar_launcher/Launcher.py86
-rwxr-xr-xcom/gmail/bernabe/laurent/sugar_olpc/learning_writing/sugar_launcher/__init__.py0
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