Merge branch 'master' into cairocanvas
[ardour.git] / libs / canvas / test / gtk_drag.cc
1 #include <iostream>
2 #include <gtkmm.h>
3 #include "canvas/canvas.h"
4 #include "canvas/rectangle.h"
5 #include "canvas/pixbuf.h"
6
7 using namespace std;
8 using namespace ArdourCanvas;
9
10 Rectangle* rectangle = 0;
11
12 bool
13 event (GdkEvent* ev)
14 {
15         static bool dragging = false;
16         static Duple offset;
17         
18         if (ev->type == GDK_BUTTON_PRESS) {
19                 GdkEventButton* b = reinterpret_cast<GdkEventButton*> (ev);
20                 if (b->button == 1) {
21                         dragging = true;
22                         offset = Duple (b->x, b->y) - rectangle->position ();
23                         rectangle->grab ();
24                         cout << "Dragging offset=" << offset << "\n";
25                 }
26         } else if (ev->type == GDK_BUTTON_RELEASE) {
27                 GdkEventButton* b = reinterpret_cast<GdkEventButton*> (ev);
28                 cout << "Release.\n";
29                 if (b->button == 1) {
30                         dragging = false;
31                         rectangle->ungrab ();
32                         cout << "Drag complete.\n";
33                 }
34         } else if (ev->type == GDK_MOTION_NOTIFY) {
35                 GdkEventMotion* m = reinterpret_cast<GdkEventMotion*> (ev);
36                 if (dragging) {
37                         rectangle->set_position (Duple (m->x, m->y) - offset);
38                         cout << "Move to " << (Duple (m->x, m->y) - offset) << "\n";
39                 }
40         }
41                         
42         return true;
43 }
44
45 int main (int argc, char* argv[])
46 {
47         Gtk::Main kit (argc, argv);
48
49         Gtk::Window window;
50         window.set_title ("Hello world");
51         window.set_size_request (768, 768);
52
53         Gtk::Adjustment hadj (0, 0, 1e3);
54         Gtk::Adjustment vadj (0, 0, 1e3);
55         GtkCanvasViewport viewport (hadj, vadj);
56         GtkCanvas* canvas = viewport.canvas ();
57
58         rectangle = new Rectangle (canvas->root(), Rect (64, 64, 128, 128));
59         rectangle->set_outline_color (0xff0000aa);
60         rectangle->Event.connect (sigc::ptr_fun (event));
61
62         window.add (viewport);
63         canvas->show ();
64         window.show_all ();
65         
66         Gtk::Main::run (window);
67         return 0;
68 }