Guest User

Untitled

a guest
Jul 19th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.86 KB | None | 0 0
  1. require 'gtk3'
  2. require 'pp'
  3.  
  4. DELTA_X=20
  5. DELTA_Y=20
  6.  
  7. RED = [0.7,0.0,0.1]
  8. GREEN= [0.1,0.9,0.1]
  9. BLUE = [0.1,0.0,0.7]
  10. BLACK= [0.0,0.0,0.0]
  11.  
  12. class Rectangle
  13. attr_accessor :x,:y,:w,:h
  14. attr_accessor :color
  15. def initialize x,y,w,h
  16. @x,@y,@w,@h= x,y,w,h
  17. @color=BLUE
  18. end
  19.  
  20. def draw ctx
  21. ctx.set_source_rgb *color
  22. ctx.rectangle x,y,w,h
  23. ctx.fill
  24. end
  25. end
  26.  
  27. class Drawer
  28.  
  29. def initialize
  30. init_gui
  31. @grobs=[]
  32. @on_rect=nil
  33. end
  34.  
  35. def init_gui
  36. builder = Gtk::Builder.new
  37. builder.add_from_file('drawing.glade')
  38. @window = builder['applicationwindow2']
  39. @window.signal_connect('destroy'){Gtk.main_quit}
  40.  
  41. @drawingArea = builder['drawingarea']
  42. init_event_handlers
  43. @window.present
  44. end
  45.  
  46. def init_event_handlers
  47.  
  48. @drawingArea.signal_connect "draw" do
  49. ctx=@drawingArea.window.create_cairo_context
  50. redraw
  51. end
  52.  
  53. @drawingArea.signal_connect("button-press-event") do |widget, event|
  54. puts "mouse pressed"
  55. if @on_rect
  56. @moving=true
  57. else
  58. @grobs << Rectangle.new(event.x,event.y,50,50)
  59. redraw
  60. end
  61. end
  62.  
  63. @drawingArea.signal_connect("motion-notify-event") do |widget, event|
  64. puts "moving rect" if @moving
  65. if @moving
  66. @on_rect.x=event.x+@dx
  67. @on_rect.y=event.y+@dy
  68. @drawingArea.queue_draw
  69. else
  70. @on_rect=on_rect?(event)
  71. if @on_rect
  72. @dx,@dy=@on_rect.x-event.x,@on_rect.y-event.y
  73. w,h=@on_rect.w,@on_rect.h
  74. @drawingArea.queue_draw
  75. end
  76. end
  77. end
  78.  
  79. @drawingArea.signal_connect("button-release-event") do |widget, event|
  80. puts "mouse released"
  81. @moving=false
  82. @on_rect=nil
  83. redraw
  84. end
  85.  
  86. def on_rect? event
  87. for rect in @grobs
  88. if event.x>rect.x && event.x < rect.x+rect.w
  89. if event.y>rect.y && event.y < rect.y+rect.h
  90. return rect
  91. end
  92. end
  93. end
  94. nil
  95. end
  96. end
  97.  
  98. def redraw
  99. ctx=@drawingArea.window.create_cairo_context
  100. @grobs.each{|grob| grob.draw(ctx)}
  101. end
  102.  
  103.  
  104. end #class
  105.  
  106. Drawer.new
  107. Gtk.main
Add Comment
Please, Sign In to add comment