GtkButtonGrid.py 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. import math
  2. import gi
  3. from gi.repository import Gdk
  4. gi.require_version('Gtk', '3.0')
  5. from gi.repository import Gtk
  6. def rad(n): return n/360*(2*3.1415)
  7. class ButtonWrapper(Gtk.Button):
  8. def __init__(self, *args, **kwds):
  9. super().__init__(*args, **kwds)
  10. self.connect("clicked", self.on_click)
  11. self.select()
  12. self.sel=None
  13. self.definition=None
  14. self.color=0
  15. self.index=0
  16. self.colors=[(0x20/0xff,0x20/0xff,0x20/0xff), (0x20/0xff,0xE0/0xff,0xE0/0xff)]
  17. self.is_selected=False
  18. self._btn_selected=None
  19. self._btn_unselected=None
  20. self.show=True
  21. self.show_all()
  22. def on_click(self, x):
  23. if self.is_selected:
  24. if self._btn_unselected: self._btn_unselected(self.index, self)
  25. else:
  26. if self._btn_selected: self._btn_selected(self.index, self)
  27. def do_draw(self, cr):
  28. if not self.show: return
  29. allocation = self.get_allocation()
  30. fg_color = self.get_style_context().get_color(Gtk.StateFlags.NORMAL)
  31. cr.set_source_rgba(*self.colors[0]);
  32. cr.rectangle(4,4,allocation.width-8, allocation.height-8)
  33. cr.stroke()
  34. cr.set_source_rgba(*self.colors[self.color]);
  35. cr.rectangle(6,6,allocation.width-12, allocation.height-12)
  36. cr.fill()
  37. def select(self):
  38. self.is_selected=True
  39. self.color=1
  40. def unselect(self):
  41. self.is_selected=False
  42. self.color=0
  43. @staticmethod
  44. def new(sel, mat, index):
  45. btn = ButtonWrapper()
  46. btn.sel=sel
  47. btn.definition=mat
  48. btn.index=index
  49. return btn
  50. class GtkButtonGrid(Gtk.Grid):
  51. def __init__(self, *args, **kwds):
  52. super().__init__(*args, **kwds)
  53. self.width=0
  54. self.height=0
  55. self.map=[]
  56. self.x=0
  57. self.y=0
  58. self.sel=None
  59. self.type=None
  60. self._btn_selected=None
  61. self._btn_unselected=None
  62. self.set_hexpand(True)
  63. self.set_vexpand(True)
  64. self.set_row_homogeneous(True)
  65. self.set_column_homogeneous(True)
  66. def set_on_select(self, b): self._btn_selected=b
  67. def set_on_unselect(self, b): self._btn_unselected=b
  68. def unselect_all(self):
  69. for k in self.map:
  70. k.unselect()
  71. def new(self, x, y, sel, t):
  72. btn = GtkButtonGrid()
  73. btn.x=x
  74. btn.y=y
  75. btn.sel=sel
  76. btn.type=type
  77. return btn
  78. def update(self):
  79. self.queue_draw()
  80. def select(self, i, j=-1):
  81. if j>=0: i+=j*self.width
  82. if self.map[i]: self.map[i].select()
  83. def unselect(self, i, j=-1):
  84. if j>=0: i+=j*self.width
  85. if self.map[i]: self.map[i].unselect()
  86. def set_grid_size(self, x, y):
  87. for i in range(self.width): self.remove_column(0)
  88. for i in range(self.height): self.remove_row(0)
  89. self.width=x
  90. self.height=y
  91. self.map=[]
  92. for i in range(x*y): self.map.append(None)
  93. for i in range(self.width): self.insert_column(0)
  94. for i in range(self.height): self.insert_row(0)
  95. self.show_all()
  96. def __getitem__(self, item):
  97. if isinstance(item, (tuple, list)): item=item[0]+item[1]*self.width
  98. return self.map[item]
  99. def __setitem__(self, key, value):
  100. if isinstance(key, (tuple, list)): key=key[0]+key[1]*self.width
  101. x=key%self.width
  102. y=math.floor(key/self.width)
  103. if(value[1]):
  104. self.map[key]=ButtonWrapper.new(value[0], value[1], value[2])
  105. self.map[key]._btn_selected=self._btn_selected
  106. self.map[key]._btn_unselected=self._btn_unselected
  107. self.attach(self.map[key], x,y,1,1)
  108. else:
  109. self.map[key]=ButtonWrapper.new(value[0], value[1], value[2])
  110. self.map[key].show=False
  111. self.attach(self.map[key], x,y,1,1)
  112. return self.map[key]