Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'gtk3'
- require 'pp'
- DELTA_X=20
- DELTA_Y=20
- RED = [0.7,0.0,0.1]
- GREEN= [0.1,0.9,0.1]
- BLUE = [0.1,0.0,0.7]
- BLACK= [0.0,0.0,0.0]
- class Rectangle
- attr_accessor :x,:y,:w,:h
- attr_accessor :color
- def initialize x,y,w,h
- @x,@y,@w,@h= x,y,w,h
- @color=BLUE
- end
- def draw ctx
- ctx.set_source_rgb *color
- ctx.rectangle x,y,w,h
- ctx.fill
- end
- end
- class Drawer
- def initialize
- init_gui
- @grobs=[]
- @on_rect=nil
- end
- def init_gui
- builder = Gtk::Builder.new
- builder.add_from_file('drawing.glade')
- @window = builder['applicationwindow2']
- @window.signal_connect('destroy'){Gtk.main_quit}
- @drawingArea = builder['drawingarea']
- init_event_handlers
- @window.present
- end
- def init_event_handlers
- @drawingArea.signal_connect "draw" do
- ctx=@drawingArea.window.create_cairo_context
- redraw
- end
- @drawingArea.signal_connect("button-press-event") do |widget, event|
- puts "mouse pressed"
- if @on_rect
- @moving=true
- else
- @grobs << Rectangle.new(event.x,event.y,50,50)
- redraw
- end
- end
- @drawingArea.signal_connect("motion-notify-event") do |widget, event|
- puts "moving rect" if @moving
- if @moving
- @on_rect.x=event.x+@dx
- @on_rect.y=event.y+@dy
- @drawingArea.queue_draw
- else
- @on_rect=on_rect?(event)
- if @on_rect
- @dx,@dy=@on_rect.x-event.x,@on_rect.y-event.y
- w,h=@on_rect.w,@on_rect.h
- @drawingArea.queue_draw
- end
- end
- end
- @drawingArea.signal_connect("button-release-event") do |widget, event|
- puts "mouse released"
- @moving=false
- @on_rect=nil
- redraw
- end
- def on_rect? event
- for rect in @grobs
- if event.x>rect.x && event.x < rect.x+rect.w
- if event.y>rect.y && event.y < rect.y+rect.h
- return rect
- end
- end
- end
- nil
- end
- end
- def redraw
- ctx=@drawingArea.window.create_cairo_context
- @grobs.each{|grob| grob.draw(ctx)}
- end
- end #class
- Drawer.new
- Gtk.main
Add Comment
Please, Sign In to add comment