File: drag-move.rb

package info (click to toggle)
ruby-gnome2 2.2.0-5
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 11,360 kB
  • ctags: 14,222
  • sloc: ansic: 85,875; ruby: 38,232; sh: 80; xml: 41; makefile: 22
file content (139 lines) | stat: -rw-r--r-- 2,794 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
=begin
  drag-move.rb - Move widget by drag sample script.

  Copyright (C) 2011-2014 Ruby-GNOME2 Project Team
  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 "gtk3"

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("draw") do |widget, context|
  width  = widget.width_request
  height = widget.height_request
  context.fill do
    center_x = width / 2
    center_y = height / 2
    radius   = width / 2
    start_angle = 0 * Math::PI
    stop_angle  = 2 * Math::PI
    context.arc(center_x, center_y, radius, start_angle, stop_angle)
  end
  false
end

window.add(layout)

window.show_all

Gtk.main