summaryrefslogtreecommitdiff
path: root/libs/canvas/test/gtk_drag.cc
blob: 6e20352199feff04402396775959dfd07a991703 (plain)
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
#include <iostream>
#include <gtkmm.h>
#include "canvas/canvas.h"
#include "canvas/rectangle.h"
#include "canvas/pixbuf.h"

using namespace std;
using namespace ArdourCanvas;

Rectangle* rectangle = 0;

bool
event (GdkEvent* ev)
{
	static bool dragging = false;
	static Duple offset;

	if (ev->type == GDK_BUTTON_PRESS) {
		GdkEventButton* b = reinterpret_cast<GdkEventButton*> (ev);
		if (b->button == 1) {
			dragging = true;
			offset = Duple (b->x, b->y) - rectangle->position ();
			rectangle->grab ();
			cout << "Dragging offset=" << offset << "\n";
		}
	} else if (ev->type == GDK_BUTTON_RELEASE) {
		GdkEventButton* b = reinterpret_cast<GdkEventButton*> (ev);
		cout << "Release.\n";
		if (b->button == 1) {
			dragging = false;
			rectangle->ungrab ();
			cout << "Drag complete.\n";
		}
	} else if (ev->type == GDK_MOTION_NOTIFY) {
		GdkEventMotion* m = reinterpret_cast<GdkEventMotion*> (ev);
		if (dragging) {
			rectangle->set_position (Duple (m->x, m->y) - offset);
			cout << "Move to " << (Duple (m->x, m->y) - offset) << "\n";
		}
	}

	return true;
}

int main (int argc, char* argv[])
{
	Gtk::Main kit (argc, argv);

	Gtk::Window window;
	window.set_title ("Hello world");
	window.set_size_request (768, 768);

	Gtk::Adjustment hadj (0, 0, 1e3);
	Gtk::Adjustment vadj (0, 0, 1e3);
	GtkCanvasViewport viewport (hadj, vadj);
	GtkCanvas* canvas = viewport.canvas ();

	rectangle = new Rectangle (canvas->root(), Rect (64, 64, 128, 128));
	rectangle->set_outline_color (0xff0000aa);
	rectangle->Event.connect (sigc::ptr_fun (event));

	window.add (viewport);
	canvas->show ();
	window.show_all ();

	Gtk::Main::run (window);
	return 0;
}