widget_private_ports.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. '''
  2. Created on 27-jul.-2014
  3. @author: Simon
  4. '''
  5. import Tkinter as tk
  6. from sccd.runtime.statecharts_core import Event
  7. class Widget:
  8. controller = None
  9. def __init__(self, configure_later=False, inport="input", outport="output"):
  10. if not configure_later:
  11. self.set_bindable_and_tagorid(None, None)
  12. self.inport = inport
  13. self.outport = outport
  14. def set_bindable_and_tagorid(self, bindable=None, tagorid=None):
  15. if bindable is None:
  16. bindable = self
  17. self.bindable = bindable
  18. self.mytagorid = tagorid
  19. if isinstance(self, tk.Toplevel):
  20. self.protocol("WM_DELETE_WINDOW", self.window_close)
  21. if tagorid is not None:
  22. if not isinstance(tagorid, list):
  23. tagorid = [tagorid]
  24. for t in tagorid:
  25. self.bindable.tag_bind(t, "<Button>", self.on_click)
  26. self.bindable.tag_bind(t, "<ButtonRelease>", self.on_release)
  27. self.bindable.tag_bind(t, "<Motion>", self.on_motion)
  28. self.bindable.tag_bind(t, "<Enter>", self.on_enter)
  29. self.bindable.tag_bind(t, "<Leave>", self.on_leave)
  30. self.bindable.tag_bind(t, "<Key>", self.on_key)
  31. self.bindable.tag_bind(t, "<KeyRelease>", self.on_key_release)
  32. else:
  33. self.bindable.bind("<Button>", self.on_click)
  34. self.bindable.bind("<ButtonRelease>", self.on_release)
  35. self.bindable.bind("<Motion>", self.on_motion)
  36. self.bindable.bind("<Enter>", self.on_enter)
  37. self.bindable.bind("<Leave>", self.on_leave)
  38. self.bindable.bind("<Key>", self.on_key)
  39. self.bindable.bind("<KeyRelease>", self.on_key_release)
  40. self.last_x = 50
  41. self.last_y = 50
  42. self.selected_type = None
  43. def on_click(self, event):
  44. event_name = None
  45. if event.num == 1:
  46. event_name = "left-click"
  47. elif event.num == 2:
  48. event_name = "middle-click"
  49. elif event.num == 3:
  50. event_name = "right-click"
  51. if event_name:
  52. self.last_x = event.x
  53. self.last_y = event.y
  54. Widget.controller.addInput(Event(event_name, self.inport))
  55. def on_release(self, event):
  56. event_name = None
  57. if event.num == 1:
  58. event_name = "left-release"
  59. elif event.num == 2:
  60. event_name = "middle-release"
  61. elif event.num == 3:
  62. event_name = "right-release"
  63. if event_name:
  64. self.last_x = event.x
  65. self.last_y = event.y
  66. Widget.controller.addInput(Event(event_name, self.inport))
  67. def on_motion(self, event):
  68. self.last_x = event.x
  69. self.last_y = event.y
  70. Widget.controller.addInput(Event("motion", self.inport))
  71. def on_enter(self, event):
  72. Widget.controller.addInput(Event("enter", self.inport))
  73. def on_leave(self, event):
  74. Widget.controller.addInput(Event("leave", self.inport))
  75. def on_key(self, event):
  76. event_name = None
  77. if event.keysym == 'Escape':
  78. event_name = "escape"
  79. elif event.keysym == 'Return':
  80. event_name = "return"
  81. elif event.keysym == 'Delete':
  82. event_name = "delete"
  83. elif event.keysym == 'Shift_L':
  84. event_name = "shift"
  85. elif event.keysym == 'Control_L':
  86. event_name = "control"
  87. if event_name:
  88. Widget.controller.addInput(Event(event_name, self.inport))
  89. def on_key_release(self, event):
  90. event_name = None
  91. if event.keysym == 'Escape':
  92. event_name = "escape-release"
  93. elif event.keysym == 'Return':
  94. event_name = "return-release"
  95. elif event.keysym == 'Delete':
  96. event_name = "delete-release"
  97. elif event.keysym == 'Shift_L':
  98. event_name = "shift-release"
  99. elif event.keysym == 'Control_L':
  100. event_name = "control-release"
  101. if event_name:
  102. Widget.controller.addInput(Event(event_name, self.inport))
  103. def window_close(self):
  104. event = Event("close_window", self.inport)
  105. Widget.controller.addInput(event)