gui.rb 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. class PaintGUI
  2. attr_reader :workspace, :selector_window
  3. def initialize()
  4. @gui = GUIManager.new()
  5. @editor_map = EditorMapComponent.new($screen_rect, @gui.get_component())
  6. @workspace = @editor_map.get_workspace()
  7. @editor_map.set_workspace(@workspace)
  8. @workspace.set_tool(0, $sketch_stroke_tool.to_tool());
  9. @workspace.set_tool(1, $sketch_stroke_tool.to_tool());
  10. @workspace.set_tool(2, $workspace_move_tool.to_tool())
  11. # @workspace.set_tool(2, $layer_move_tool.to_tool());
  12. @selector_window_main = Window.new(CL_Rect.new(CL_Point.new($screen_rect.get_width()-160, 5),
  13. CL_Size.new(128 + 6 + 10, 658)),
  14. "ColorPicker",
  15. @gui.get_component())
  16. @selector_window = @selector_window_main.get_client_area()
  17. @colorpicker = ColorPicker.new(CL_Rect.new(CL_Point.new(3, 3), CL_Size.new(128, 128)),
  18. @selector_window)
  19. connect_v1_Color(@colorpicker.sig_color_change(), proc{|color|
  20. DrawerProperties.current().set_color(color)
  21. })
  22. @bgcolorpicker = ColorPicker.new(CL_Rect.new(CL_Point.new(3, 300), CL_Size.new(128, 128)),
  23. @selector_window)
  24. connect_v1_Color(@bgcolorpicker.sig_color_change(), proc{|color|
  25. @workspace.get_map().set_background_color(color)
  26. })
  27. @size_slider = Slider.new(CL_Rect.new(CL_Point.new(3, 150), CL_Size.new(128, 16)), @selector_window)
  28. @size_slider.set_range(0.01, 2.0) # FIXME: using 0 size brush makes clanlib crashi
  29. @size_slider.set_value(1.0)
  30. connect_v1_float(@size_slider.sig_on_change, proc{|value|
  31. # puts "Value: #{value}"
  32. DrawerProperties.current().set_size(value)
  33. })
  34. @brush_hardness = Slider.new(CL_Rect.new(CL_Point.new(3, 170), CL_Size.new(128, 16)),
  35. @selector_window)
  36. @brush_hardness.set_range(0.0, 1.0)
  37. @brush_hardness.set_value(0.75)
  38. connect_v1_float(@brush_hardness.sig_on_change, proc{|value|
  39. GeneratedBrush.new(DrawerProperties.current().get_brush()).set_hardness(value)
  40. })
  41. @brush_spikes = Slider.new(CL_Rect.new(CL_Point.new(3, 190), CL_Size.new(128, 16)),
  42. @selector_window)
  43. @brush_spikes.set_range(2, 20)
  44. @brush_spikes.set_value(2)
  45. connect_v1_float(@brush_spikes.sig_on_change, proc{|value|
  46. GeneratedBrush.new(DrawerProperties.current().get_brush()).set_spikes(value.to_i)
  47. })
  48. @brush_aspects = Slider.new(CL_Rect.new(CL_Point.new(3, 210), CL_Size.new(128, 16)),
  49. @selector_window)
  50. @brush_aspects.set_range(0.1, 10)
  51. @brush_aspects.set_value(1)
  52. connect_v1_float(@brush_aspects.sig_on_change, proc{|value|
  53. GeneratedBrush.new(DrawerProperties.current().get_brush()).set_aspect_ratio(value)
  54. })
  55. @brush_angles = Slider.new(CL_Rect.new(CL_Point.new(3, 230), CL_Size.new(128, 16)),
  56. @selector_window)
  57. @brush_angles.set_range(0, 360)
  58. @brush_angles.set_value(0)
  59. connect_v1_float(@brush_angles.sig_on_change, proc{|value|
  60. GeneratedBrush.new(DrawerProperties.current().get_brush()).set_angle(value)
  61. })
  62. @spacing_slider = Slider.new(CL_Rect.new(CL_Point.new(3, 600), CL_Size.new(128, 16)),
  63. @selector_window)
  64. @spacing_slider.set_range(1, 250)
  65. @spacing_slider.set_value(20)
  66. connect_v1_float(@spacing_slider.sig_on_change, proc{|value|
  67. DrawerProperties.current().set_spacing(value)
  68. })
  69. @brush_shape_circle = CL_Button.new(CL_Rect.new(CL_Point.new(5, 250), CL_Size.new(40, 25)), "Circ", @selector_window)
  70. @brush_shape_rect = CL_Button.new(CL_Rect.new(CL_Point.new(45, 250), CL_Size.new(40, 25)), "Squa", @selector_window)
  71. @brush_shape_diamond = CL_Button.new(CL_Rect.new(CL_Point.new(85, 250), CL_Size.new(40, 25)), "Diam", @selector_window)
  72. connect(@brush_shape_circle.sig_clicked(), proc{
  73. GeneratedBrush.new(DrawerProperties.current().get_brush()).set_shape(BRUSH_SHAPE_CIRCLE)
  74. })
  75. connect(@brush_shape_rect.sig_clicked(), proc{
  76. GeneratedBrush.new(DrawerProperties.current().get_brush()).set_shape(BRUSH_SHAPE_SQUARE)
  77. })
  78. connect(@brush_shape_diamond.sig_clicked(), proc{
  79. GeneratedBrush.new(DrawerProperties.current().get_brush()).set_shape(BRUSH_SHAPE_DIAMOND)
  80. })
  81. # @zoom_slider = Slider.new(CL_Rect.new(CL_Point.new(3, 182), CL_Size.new(128, 16)), @selector_window)
  82. # @zoom_slider.set_range(0.25, 10.0) # FIXME: using 0 size brush makes clanlib crashi
  83. # @zoom_slider.set_value(1.0)
  84. # connect_v1_float(@zoom_slider.sig_on_change, proc{|value|
  85. # # puts "Value: #{value}"
  86. # self.gui_set_zoom(value)
  87. # })
  88. connect_v2(@editor_map.sig_on_key("a"), proc{ |x,y|
  89. gc = @editor_map.get_workspace().get_gc_state()
  90. gc.set_zoom(CL_Pointf.new(x, y), gc.get_zoom() * 1.25)
  91. })
  92. connect_v2(@editor_map.sig_on_key("o"), proc{ |x,y|
  93. gc = @editor_map.get_workspace().get_gc_state()
  94. gc.set_zoom(CL_Pointf.new(x, y), gc.get_zoom() / 1.25)
  95. })
  96. connect_v2(@editor_map.sig_on_key("escape"), proc{ |x, y| puts "bye, bye"})
  97. connect_v2(@editor_map.sig_on_key("esc"), proc{ |x, y| puts "bye, bye2"})
  98. connect_v2(@editor_map.sig_on_key("q"), proc{ |x, y| $gui.quit()})
  99. connect_v2(@editor_map.sig_on_key("s"), proc{ |x, y|
  100. CL_ProviderFactory.save(BitmapLayer.current().get_pixeldata(), "/tmp/bla.png")
  101. # $image.save("/tmp/test.scm")
  102. })
  103. connect_v2(@editor_map.sig_on_key("l"), proc{ |x, y|
  104. $image = Image.new("/tmp/test.scm")
  105. $image.activate($gui.workspace())
  106. })
  107. connect_v2(@editor_map.sig_on_key("1"), proc{ |x, y| $animation.previous_frame()})
  108. connect_v2(@editor_map.sig_on_key("2"), proc{ |x, y| $animation.next_frame()})
  109. connect_v2(@editor_map.sig_on_key("g"), proc{ |x, y|
  110. $gui.workspace.get_gc_state.set_rotation($gui.workspace.get_gc_state.get_rotation() - 10)
  111. })
  112. connect_v2(@editor_map.sig_on_key("c"), proc{ |x, y|
  113. $gui.workspace.get_gc_state.set_rotation($gui.workspace.get_gc_state.get_rotation() + 10)
  114. })
  115. @normal_mode = CL_Button.new(CL_Rect.new(CL_Point.new(5, 500), CL_Size.new(40, 25)), "Norm", @selector_window)
  116. @erase_mode = CL_Button.new(CL_Rect.new(CL_Point.new(45, 500), CL_Size.new(40, 25)), "Erase", @selector_window)
  117. @add_mode = CL_Button.new(CL_Rect.new(CL_Point.new(85, 500), CL_Size.new(40, 25)), "Add", @selector_window)
  118. @shader_mode = CL_Button.new(CL_Rect.new(CL_Point.new(5, 525), CL_Size.new(40, 25)), "Shad", @selector_window)
  119. @smudge_mode = CL_Button.new(CL_Rect.new(CL_Point.new(45, 525), CL_Size.new(40, 25)), "Smudge", @selector_window)
  120. connect(@normal_mode.sig_clicked(), proc{
  121. drawer = SpriteStrokeDrawer.new($sketch_stroke_tool.get_drawer())
  122. drawer.set_mode(SpriteStrokeDrawer::DM_NORMAL)
  123. })
  124. connect(@erase_mode.sig_clicked(), proc{
  125. drawer = SpriteStrokeDrawer.new($sketch_stroke_tool.get_drawer())
  126. drawer.set_mode(SpriteStrokeDrawer::DM_ERASE)
  127. })
  128. connect(@add_mode.sig_clicked(), proc{
  129. drawer = SpriteStrokeDrawer.new($sketch_stroke_tool.get_drawer())
  130. drawer.set_mode(SpriteStrokeDrawer::DM_ADDITION)
  131. })
  132. connect(@shader_mode.sig_clicked(), proc{
  133. drawer = SpriteStrokeDrawer.new($sketch_stroke_tool.get_drawer())
  134. drawer.set_mode(SpriteStrokeDrawer::DM_SHADER)
  135. })
  136. connect(@smudge_mode.sig_clicked(), proc{
  137. drawer = SpriteStrokeDrawer.new($sketch_stroke_tool.get_drawer())
  138. drawer.set_mode(SpriteStrokeDrawer::DM_SMUDGE)
  139. })
  140. button_panel = ButtonPanel.new(0, 0, 33, 33*4, false, @gui.get_component)
  141. button_panel.add_icon($flexlay_datadir + "/images/tools/stock-tool-pencil-22.png", proc{
  142. @workspace.set_tool(0, $sketch_stroke_tool.to_tool())
  143. })
  144. button_panel.add_icon($flexlay_datadir + "/images/tools/stock-tool-zoom-22.png", proc{
  145. @workspace.set_tool(0, $zoom_tool.to_tool())
  146. })
  147. button_panel.add_icon($flexlay_datadir + "/images/tools/stock-tool-move-22.png", proc{
  148. @workspace.set_tool(0, $layer_move_tool.to_tool())
  149. })
  150. button_panel.add_icon($flexlay_datadir + "/images/tools/stock-tool-clone-22.png", proc{
  151. @workspace.set_tool(0, $objmap_select_tool.to_tool())
  152. })
  153. anim_panel = ButtonPanel.new($screen_rect.get_width()/2 - (32*3)/2-16-32, 0, 32*3+1+16, 33,
  154. true, @gui.get_component)
  155. anim_panel.add_icon($flexlay_datadir + "/images/icons24/stock_new.png",
  156. proc{ $animation.add_frame() })
  157. anim_panel.add_separator()
  158. #anim_panel.add_icon($flexlay_datadir + "/images/icons24/anim_skipbackward.png")
  159. #anim_panel.add_icon($flexlay_datadir + "/images/icons24/anim_fastbackward.png")
  160. #anim_panel.add_icon($flexlay_datadir + "/images/icons24/anim_playbackward.png")
  161. #anim_panel.add_icon($flexlay_datadir + "/images/icons24/anim_slowmotionbackward.png")
  162. anim_panel.add_icon($flexlay_datadir + "/images/icons24/anim_previous.png",
  163. proc{ $animation.previous_frame()})
  164. anim_panel.add_icon($flexlay_datadir + "/images/icons24/anim_next.png",
  165. proc{ $animation.next_frame()})
  166. #anim_panel.add_icon($flexlay_datadir + "/images/icons24/anim_slowmotion.png")
  167. #anim_panel.add_icon($flexlay_datadir + "/images/icons24/anim_play.png")
  168. #anim_panel.add_icon($flexlay_datadir + "/images/icons24/anim_fastforward.png")
  169. #anim_panel.add_icon($flexlay_datadir + "/images/icons24/anim_skipforward.png")
  170. end
  171. def quit()
  172. @gui.quit()
  173. end
  174. def run()
  175. @gui.run()
  176. end
  177. def on_map_change()
  178. end
  179. end
  180. # EOF #