1 /** \file
2 * Gtkmm facade/wrapper around SPRuler code that formerly lived
3 * in desktop-events.cpp
4 */
5 /*
6 * Authors:
7 * Ralf Stephan <ralf@ark.in-berlin.de>
8 * Lauris Kaplinski
9 *
10 * Copyright (C) 2005 Ralf Stephan
11 *
12 * Released under GNU GPL, read the file 'COPYING' for more information
13 */
15 extern "C" { // glib-2.4 needs this
16 #include <libintl.h>
17 }
19 #include <glibmm/i18n.h>
21 #include <gtkmm/ruler.h>
22 #include "helper/units.h"
23 #include "widgets/ruler.h"
24 #include "ui/widget/ruler.h"
26 #include "xml/repr.h"
27 #include "display/guideline.h"
28 #include "desktop.h"
29 #include "desktop-handles.h"
30 #include "document.h"
31 #include "sp-namedview.h"
33 namespace Inkscape {
34 namespace UI {
35 namespace Widget {
37 void
38 Ruler::init(SPDesktop *dt, Gtk::Widget &w)
39 {
40 _dt = dt;
41 _canvas_widget = &w;
42 _dragging = false;
43 _guide = 0;
44 sp_ruler_set_metric(GTK_RULER(_r->gobj()), SP_PT);
45 _r->set_range(-500, 500, 0, 1000);
46 }
48 void
49 Ruler::get_range(double &lo, double &up, double &pos, double &max)
50 {
51 _r->get_range(lo, up, pos, max);
52 }
54 void
55 Ruler::set_range(double lo, double up, double pos, double max)
56 {
57 _r->set_range(lo, up, pos, max);
58 }
60 /// Set metric from namedview
61 void
62 Ruler::update_metric()
63 {
64 if (!_dt) return;
65 sp_ruler_set_metric(GTK_RULER(_r->gobj()), _dt->namedview->getDefaultMetric());
66 }
68 /// Returns text to be used for tooltip for ruler.
69 /// \todo incorrect
70 Glib::ustring
71 Ruler::get_tip()
72 {
73 return gettext(sp_unit_get_plural( _dt
74 ? _dt->namedview->doc_units
75 : &sp_unit_get_by_id(SP_UNIT_PT) ));
76 }
78 /// Helper that gets mouse coordinates relative to canvas widget.
79 void
80 Ruler::canvas_get_pointer(int &x, int &y)
81 {
82 Gdk::ModifierType mask;
83 (void) _canvas_widget->get_window()->get_pointer(x, y, mask);
84 }
86 NR::Point
87 Ruler::get_event_dt()
88 {
89 int wx, wy;
90 canvas_get_pointer(wx, wy);
91 NR::Point const event_win(wx, wy);
92 NR::Point const event_w(sp_canvas_window_to_world(_dt->canvas, event_win));
93 return _dt->w2d(event_w);
94 }
96 bool
97 Ruler::on_button_press_event(GdkEventButton *evb)
98 {
99 g_assert(_dt);
100 NR::Point const &event_dt = get_event_dt();
101 Inkscape::XML::Node *repr = SP_OBJECT_REPR(_dt->namedview);
103 if (evb->button == 1) {
104 _dragging = true;
105 sp_repr_set_boolean(repr, "showguides", TRUE);
106 sp_repr_set_boolean(repr, "inkscape:guide-bbox", TRUE);
107 double const guide_pos_dt = event_dt[ _horiz_f ? NR::Y : NR::X ];
108 _guide = sp_guideline_new(_dt->guides, guide_pos_dt, !_horiz_f);
109 sp_guideline_set_color(SP_GUIDELINE(_guide), _dt->namedview->guidehicolor);
110 (void) get_window()->pointer_grab(false,
111 Gdk::BUTTON_RELEASE_MASK |
112 Gdk::POINTER_MOTION_MASK |
113 Gdk::POINTER_MOTION_HINT_MASK,
114 evb->time);
115 }
116 return false;
117 }
119 bool
120 Ruler::on_motion_notify_event(GdkEventMotion *)
121 {
122 g_assert(_dt);
123 NR::Point const &event_dt = get_event_dt();
125 if (_dragging) {
126 double const guide_pos_dt = event_dt[ _horiz_f ? NR::Y : NR::X ];
127 sp_guideline_set_position(SP_GUIDELINE(_guide), guide_pos_dt);
128 _dt->set_coordinate_status(event_dt);
129 _dt->setPosition(event_dt);
130 }
131 return false;
132 }
134 bool
135 Ruler::on_button_release_event(GdkEventButton *evb)
136 {
137 g_assert(_dt);
138 int wx, wy;
139 canvas_get_pointer(wx, wy);
140 NR::Point const &event_dt = get_event_dt();
142 if (_dragging && evb->button == 1) {
143 Gdk::Window::pointer_ungrab(evb->time);
144 gtk_object_destroy(GTK_OBJECT(_guide));
145 _guide = 0;
146 _dragging = false;
148 if ( (_horiz_f ? wy : wx ) >= 0 ) {
149 Inkscape::XML::Node *repr = sp_repr_new("sodipodi:guide");
150 repr->setAttribute("orientation", _horiz_f ? "horizontal" : "vertical");
151 double const guide_pos_dt = event_dt[ _horiz_f ? NR::Y : NR::X ];
152 sp_repr_set_svg_double(repr, "position", guide_pos_dt);
153 SP_OBJECT_REPR(_dt->namedview)->appendChild(repr);
154 Inkscape::GC::release(repr);
155 sp_document_done(sp_desktop_document(_dt));
156 }
157 _dt->set_coordinate_status(event_dt);
158 }
159 return false;
160 }
162 //------------------------------------------------------------
163 HRuler::HRuler()
164 {
165 _dt = 0;
166 _r = static_cast<Gtk::HRuler*>(Glib::wrap(static_cast<GtkWidget*> (sp_hruler_new())));
167 add(*_r);
168 _horiz_f = true;
169 }
171 HRuler::~HRuler()
172 {
173 }
176 VRuler::VRuler()
177 {
178 _dt = 0;
179 _r = static_cast<Gtk::VRuler*>(Glib::wrap(static_cast<GtkWidget*> (sp_vruler_new())));
180 add(*_r);
181 _horiz_f = false;
182 }
184 VRuler::~VRuler()
185 {
186 }
188 }}}
190 /*
191 Local Variables:
192 mode:c++
193 c-file-style:"stroustrup"
194 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
195 indent-tabs-mode:nil
196 fill-column:99
197 End:
198 */
199 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :