Pārlūkot izejas kodu

better bouncing balls example

Simon Van Mierlo 9 gadi atpakaļ
vecāks
revīzija
2091c5a8f3

+ 2 - 1
.gitignore

@@ -8,4 +8,5 @@ RemoteSystemsTempFiles
 csharp_tests/test-results
 csharp_tests/bin
 src/build
-**/*target*
+**/*target*
+**/*.lprof

+ 4 - 4
examples/bouncingballs/python/sccd.xml

@@ -104,8 +104,8 @@
         <constructor>
             <body>
                 <![CDATA[
-                self.field_window = ui.new_window(400,450);
-                self.canvas = ui.append_canvas(self.field_window,400,400,{'background':'#eee'});
+                self.field_window = ui.new_window(800,600,"BouncingBalls");
+                self.canvas = ui.append_canvas(self.field_window,800,600,{'background':'#eee'});
                 ui.bind_event(self.field_window, ui.EVENTS.WINDOW_CLOSE, self.controller, 'window_close', self.inports['field_ui']);
                 ui.bind_event(self.field_window, ui.EVENTS.KEY_PRESS, self.controller, 'key_press', self.inports['field_ui']);
                 ui.bind_event(self.canvas.element, ui.EVENTS.MOUSE_RIGHT_CLICK,    self.controller, 'right_click', self.inports['field_ui']);
@@ -321,9 +321,9 @@
                         <script>
                             <![CDATA[
                             pos = self.element.get_position();    
-                            if pos.x-self.r <= 0 or pos.x+self.r >= self.canvas.width :
+                            if pos.x-self.r <= 0 or pos.x+self.r >= self.canvas.get_width():
                                 self.vel['x'] = -self.vel['x'];
-                            if pos.y-self.r <= 0 or pos.y+self.r >= self.canvas.height :
+                            if pos.y-self.r <= 0 or pos.y+self.r >= self.canvas.get_height():
                                 self.vel['y'] = -self.vel['y'];
                             self.element.move(self.vel['x'], self.vel['y']);
                             ]]>                            

+ 6 - 0
src/python_sccd/python_sccd_runtime/libs/drawing.py

@@ -26,6 +26,12 @@ class drawing:
 
         def remove_element(self, element):
             self.element.delete(element.element_id)
+            
+        def get_width(self):
+            return self.element.winfo_width()
+            
+        def get_height(self):
+            return self.element.winfo_height()
 
 
     class ui_element_wrapper:

+ 68 - 66
src/python_sccd/python_sccd_runtime/libs/ui.py

@@ -15,94 +15,96 @@ from sccd.runtime.statecharts_core import Event
 
 
 class ui:
-	window = None
-	__nextWindowId = 0
+    window = None
+    __nextWindowId = 0
 
-	EVENTS = utils._bunch(
-		KEY_PRESS = 			'<Key>',
-		MOUSE_CLICK = 			'<Button>',
-		MOUSE_MOVE = 			'<Motion>',
-		MOUSE_PRESS =			'<ButtonPress>',
-		MOUSE_RELEASE =		'<ButtonRelease>',
-		MOUSE_RIGHT_CLICK =	'<Button-3>',
-		WINDOW_CLOSE = 		'WM_DELETE_WINDOW');
+    EVENTS = utils._bunch(
+        KEY_PRESS =             '<Key>',
+        MOUSE_CLICK =             '<Button>',
+        MOUSE_MOVE =             '<Motion>',
+        MOUSE_PRESS =            '<ButtonPress>',
+        MOUSE_RELEASE =        '<ButtonRelease>',
+        MOUSE_RIGHT_CLICK =    '<Button-3>',
+        WINDOW_CLOSE =         'WM_DELETE_WINDOW');
 
-	MOUSE_BUTTONS = utils._bunch(
-		LEFT		= 1,
-		MIDDLE	= 2,
-		RIGHT		= 3);
+    MOUSE_BUTTONS = utils._bunch(
+        LEFT        = 1,
+        MIDDLE    = 2,
+        RIGHT        = 3);
 
-	KEYCODES	= utils._bunch(
-		DELETE	= 46);
+    KEYCODES    = utils._bunch(
+        DELETE    = 46);
 
-	@staticmethod
-	def append_button(_window,text):
-		button = tk.Button(_window, text=text)
-		button.pack()
-		return ui.wrap_element(button)
+    @staticmethod
+    def append_button(_window,text):
+        button = tk.Button(_window, text=text)
+        button.pack(fill=tk.BOTH, expand=1)
+        return ui.wrap_element(button)
 
 
-	@staticmethod
-	def append_canvas(_window,width,height,style):
-		canvas = tk.Canvas(_window,width=width,height=height)
-		canvas.config(**style)
-		canvas.pack()
-		return drawing.canvas_wrapper(canvas)
+    @staticmethod
+    def append_canvas(_window,width,height,style):
+        canvas = tk.Canvas(_window,width=width,height=height)
+        canvas.config(**style)
+        canvas.pack(fill=tk.BOTH, expand=1)
+        return drawing.canvas_wrapper(canvas)
 
 
-	@staticmethod
-	def bind_event(source,event,controller,raise_name,port="ui"):
+    @staticmethod
+    def bind_event(source,event,controller,raise_name,port="ui"):
 
-		def __handle_event(ev=None):
-			if event == ui.EVENTS.KEY_PRESS :
-				controller.addInput(Event(raise_name, port, [ev.keycode,source]))
+        def __handle_event(ev=None):
+            if event == ui.EVENTS.KEY_PRESS :
+                controller.addInput(Event(raise_name, port, [ev.keycode,source]))
 
-			elif event == ui.EVENTS.MOUSE_CLICK or \
-				  event == ui.EVENTS.MOUSE_MOVE or \
-				  event == ui.EVENTS.MOUSE_PRESS or \
-				  event == ui.EVENTS.MOUSE_RELEASE or \
-		  		  event == ui.EVENTS.MOUSE_RIGHT_CLICK :
-				controller.addInput(Event(raise_name, port, [ev.x, ev.y, ev.num]))
+            elif event == ui.EVENTS.MOUSE_CLICK or \
+                  event == ui.EVENTS.MOUSE_MOVE or \
+                  event == ui.EVENTS.MOUSE_PRESS or \
+                  event == ui.EVENTS.MOUSE_RELEASE or \
+                    event == ui.EVENTS.MOUSE_RIGHT_CLICK :
+                controller.addInput(Event(raise_name, port, [ev.x, ev.y, ev.num]))
 
-			elif event == ui.EVENTS.WINDOW_CLOSE :
-				controller.addInput(Event(raise_name, port, [source]))
+            elif event == ui.EVENTS.WINDOW_CLOSE :
+                controller.addInput(Event(raise_name, port, [source]))
 
-			else :
-				raise Exception('Unsupported event');
-	
-		if event == ui.EVENTS.WINDOW_CLOSE :
-			source.protocol(event, __handle_event)
+            else :
+                raise Exception('Unsupported event');
+    
+        if event == ui.EVENTS.WINDOW_CLOSE :
+            source.protocol(event, __handle_event)
 
-		elif issubclass(drawing.ui_element_wrapper,source.__class__) :
-			source.canvas_wrapper.element.tag_bind(source.element_id, event, __handle_event)
+        elif issubclass(drawing.ui_element_wrapper,source.__class__) :
+            source.canvas_wrapper.element.tag_bind(source.element_id, event, __handle_event)
 
-		else :
-			source.bind(event, __handle_event)
+        else :
+            source.bind(event, __handle_event)
 
 
-	@staticmethod
-	def close_window(_window):
-		_window.destroy()
+    @staticmethod
+    def close_window(_window):
+        _window.destroy()
 
 
-	@staticmethod
-	def log(value):
-		print(value)
+    @staticmethod
+    def log(value):
+        print(value)
 
 
-	@staticmethod
-	def new_window(width,height):
-		_window = tk.Toplevel(ui.window)
-		_window.geometry(str(width)+"x"+str(height)+"+300+300")
-		return _window
+    @staticmethod
+    def new_window(width,height,title=None):
+        _window = tk.Toplevel(ui.window)
+        if title:
+            _window.title(title)
+        _window.geometry(str(width)+"x"+str(height)+"+300+300")
+        return _window
 
 
-	@staticmethod
-	def println(value,target):
-		raise Exception('Not implemented yet');
+    @staticmethod
+    def println(value,target):
+        raise Exception('Not implemented yet');
 
 
-	@staticmethod
-	def wrap_element(element):
-		return utils._bunch(element=element)
+    @staticmethod
+    def wrap_element(element):
+        return utils._bunch(element=element)
 

+ 2 - 0
src/python_sccd/python_sccd_runtime/statecharts_core.py

@@ -712,6 +712,7 @@ class Transition:
                     self.enabled_event = event
                     return True
     
+    # @profile
     def fire(self):
         # exit states...
         targets = self.__getEffectiveTargetStates()
@@ -952,6 +953,7 @@ class RuntimeClassBase(object):
                 enabledTransitions.append(t)
         return enabledTransitions
 
+    # @profile
     def smallStep(self):        
         def __younger_than(x, y):
             if x.source in y.source.ancestors: