File: Item.hpp

package info (click to toggle)
ganv 0~svn4468~dfsg0-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 1,232 kB
  • sloc: python: 12,014; ansic: 6,656; cpp: 2,437; sh: 40; makefile: 23
file content (91 lines) | stat: -rw-r--r-- 2,146 bytes parent folder | download
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
/* This file is part of Ganv.
 * Copyright 2007-2012 David Robillard <http://drobilla.net>
 *
 * Ganv is free software: you can redistribute it and/or modify it under the
 * terms of the GNU General Public License as published by the Free Software
 * Foundation, either version 3 of the License, or any later version.
 *
 * Ganv is distributed in the hope that it will be useful, but WITHOUT ANY
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU General Public License for details.
 *
 * You should have received a copy of the GNU General Public License along
 * with Ganv.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef GANV_ITEM_HPP
#define GANV_ITEM_HPP

#include <assert.h>

#include <glib.h>

#include <sigc++/signal.h>
#include <sigc++/trackable.h>

#include "ganv/canvas-base.h"
#include "ganv/wrap.hpp"
#include "ganv/Canvas.hpp"

namespace Ganv {

class Canvas;

/** An item on the canvas.
 */
class Item : public sigc::trackable {
public:
	Item(GanvItem* gobj)
		: _gobj(gobj)
	{
		GQuark wrapper_key = g_quark_from_string("ganvmm");
		if (gobj && gobj->parent) {
			g_object_set_qdata(G_OBJECT(_gobj), wrapper_key, this);
			g_signal_connect(G_OBJECT(_gobj),
			                 "event", G_CALLBACK(on_item_event), this);
		}
	}

	virtual ~Item() {
		gtk_object_destroy(GTK_OBJECT(_gobj));
	}

	RW_PROPERTY(double, x)
	RW_PROPERTY(double, y)

	METHOD0(ganv_item, show);
	METHOD0(ganv_item, hide);
	METHOD0(ganv_item, raise_to_top);
	METHOD2(ganv_item, move, double, dx, double, dy);

	GanvItem* property_parent() const {
		GanvItem* parent;
		g_object_get(G_OBJECT(_gobj), "parent", &parent, NULL);
		return parent;
	}

	Canvas* canvas() const {
		return Glib::wrap(GANV_CANVAS(_gobj->canvas));
	}

	GanvItem* gobj() const { return _gobj; }

	SIGNAL1(event, GdkEvent*)
	SIGNAL1(click, GdkEventButton*)

protected:
	GanvItem* const _gobj;

private:
	static gboolean
	on_item_event(GanvItem* canvasitem,
	              GdkEvent* ev,
	              void*     item)
	{
		return ((Item*)item)->on_event(ev);
	}
};

} // namespace Ganv

#endif // GANV_ITEM_HPP