132 lines
2.5 KiB
Ruby
132 lines
2.5 KiB
Ruby
|
=begin
|
||
|
drag-move.rb - Move widget by drag sample script.
|
||
|
|
||
|
Copyright (C) 2006 Kouhei Sutou
|
||
|
This program is licenced under the same licence as Ruby-GNOME2.
|
||
|
|
||
|
$Date: 2006/06/17 13:18:12 $
|
||
|
$Id: drag-move.rb,v 1.2 2006/06/17 13:18:12 mutoh Exp $
|
||
|
=end
|
||
|
|
||
|
require 'gtk2'
|
||
|
|
||
|
class DraggableWidget < Gtk::EventBox
|
||
|
def initialize
|
||
|
super
|
||
|
set_visible_window(false)
|
||
|
@dragging = false
|
||
|
@drag_button = 1
|
||
|
set_button_press_event
|
||
|
set_button_release_event
|
||
|
set_motion_notify_event
|
||
|
end
|
||
|
|
||
|
def layout
|
||
|
parent
|
||
|
end
|
||
|
|
||
|
def move(x, y)
|
||
|
if layout
|
||
|
layout.move(self, x, y)
|
||
|
true
|
||
|
else
|
||
|
false
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def dragging?
|
||
|
@dragging
|
||
|
end
|
||
|
|
||
|
private
|
||
|
def set_button_press_event
|
||
|
signal_connect("button_press_event") do |widget, event|
|
||
|
if event.button == @drag_button
|
||
|
Gtk.grab_add(widget)
|
||
|
x, y, w, h = widget.allocation.to_a
|
||
|
drag_start(x, y, event.x_root, event.y_root)
|
||
|
else
|
||
|
false
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def set_motion_notify_event
|
||
|
signal_connect("motion_notify_event") do |widget, event|
|
||
|
if dragging?
|
||
|
drag_motion(event.x_root, event.y_root)
|
||
|
else
|
||
|
false
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def set_button_release_event
|
||
|
signal_connect("button_release_event") do |widget, event|
|
||
|
if event.button == @drag_button
|
||
|
Gtk.grab_remove(widget)
|
||
|
drag_end
|
||
|
else
|
||
|
false
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def set_drag_move_position_event
|
||
|
signal_connect("drag_move_position") do |widget, x, y|
|
||
|
if layout
|
||
|
layout.move(widget, x, y)
|
||
|
true
|
||
|
else
|
||
|
false
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def drag_start(x, y, base_x, base_y)
|
||
|
@dragging = true
|
||
|
@drag_x = x
|
||
|
@drag_y = y
|
||
|
@drag_base_x = base_x
|
||
|
@drag_base_y = base_y
|
||
|
true
|
||
|
end
|
||
|
|
||
|
def drag_motion(base_x, base_y)
|
||
|
delta_x = base_x - @drag_base_x
|
||
|
delta_y = base_y - @drag_base_y
|
||
|
if delta_x != 0 and delta_y != 0
|
||
|
move(@drag_x + delta_x, @drag_y + delta_y)
|
||
|
else
|
||
|
false
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def drag_end
|
||
|
@dragging = false
|
||
|
true
|
||
|
end
|
||
|
end
|
||
|
|
||
|
window = Gtk::Window.new("Draggable Widget sample")
|
||
|
window.signal_connect("destroy"){Gtk.main_quit}
|
||
|
|
||
|
layout = Gtk::Layout.new
|
||
|
|
||
|
draggable_widget = DraggableWidget.new
|
||
|
draggable_widget.set_size_request(50, 50)
|
||
|
layout.put(draggable_widget, 75, 75)
|
||
|
|
||
|
draggable_widget.signal_connect("expose_event") do |widget, event|
|
||
|
x, y, w, h = widget.allocation.to_a
|
||
|
fg = Gdk::GC.new(widget.window)
|
||
|
widget.window.draw_arc(fg, true, x, y, w, h, 0 * 64, 360 * 64)
|
||
|
false
|
||
|
end
|
||
|
|
||
|
window.add(layout)
|
||
|
|
||
|
window.show_all
|
||
|
|
||
|
Gtk.main
|