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 #if defined(WIN32) || defined(__APPLE__)
16 # include <glibmm/i18n.h>
17 #endif
19 #include <gtkmm/ruler.h>
20 #include "helper/units.h"
21 #include "widgets/ruler.h"
22 #include "ui/widget/ruler.h"
24 #include "xml/repr.h"
25 #include "display/guideline.h"
26 #include "desktop.h"
27 #include "desktop-handles.h"
28 #include "document.h"
29 #include "sp-namedview.h"
31 namespace Inkscape {
32 namespace UI {
33 namespace Widget {
35 void
36 Ruler::init(SPDesktop *dt, Gtk::Widget &w)
37 {
38 _dt = dt;
39 _canvas_widget = &w;
40 _dragging = false;
41 _guide = 0;
42 sp_ruler_set_metric(GTK_RULER(_r->gobj()), SP_PT);
43 _r->set_range(-500, 500, 0, 1000);
44 }
46 void
47 Ruler::get_range(double &lo, double &up, double &pos, double &max)
48 {
49 _r->get_range(lo, up, pos, max);
50 }
52 void
53 Ruler::set_range(double lo, double up, double pos, double max)
54 {
55 _r->set_range(lo, up, pos, max);
56 }
58 /// Set metric from namedview
59 void
60 Ruler::update_metric()
61 {
62 if (!_dt) return;
63 sp_ruler_set_metric(GTK_RULER(_r->gobj()), _dt->namedview->getDefaultMetric());
64 }
66 /// Returns text to be used for tooltip for ruler.
67 /// \todo incorrect
68 Glib::ustring
69 Ruler::get_tip()
70 {
71 return gettext(sp_unit_get_plural( _dt
72 ? _dt->namedview->doc_units
73 : &sp_unit_get_by_id(SP_UNIT_PT) ));
74 }
76 /// Helper that gets mouse coordinates relative to canvas widget.
77 void
78 Ruler::canvas_get_pointer(int &x, int &y)
79 {
80 Gdk::ModifierType mask;
81 (void) _canvas_widget->get_window()->get_pointer(x, y, mask);
82 }
84 NR::Point
85 Ruler::get_event_dt()
86 {
87 int wx, wy;
88 canvas_get_pointer(wx, wy);
89 NR::Point const event_win(wx, wy);
90 NR::Point const event_w(sp_canvas_window_to_world(_dt->canvas, event_win));
91 return _dt->w2d(event_w);
92 }
94 bool
95 Ruler::on_button_press_event(GdkEventButton *evb)
96 {
97 g_assert(_dt);
98 NR::Point const &event_dt = get_event_dt();
99 Inkscape::XML::Node *repr = SP_OBJECT_REPR(_dt->namedview);
101 if (evb->button == 1) {
102 _dragging = true;
103 sp_repr_set_boolean(repr, "showguides", TRUE);
104 sp_repr_set_boolean(repr, "inkscape:guide-bbox", TRUE);
105 double const guide_pos_dt = event_dt[ _horiz_f ? NR::Y : NR::X ];
106 _guide = sp_guideline_new(_dt->guides, guide_pos_dt, !_horiz_f);
107 sp_guideline_set_color(SP_GUIDELINE(_guide), _dt->namedview->guidehicolor);
108 (void) get_window()->pointer_grab(false,
109 Gdk::BUTTON_RELEASE_MASK |
110 Gdk::POINTER_MOTION_MASK |
111 Gdk::POINTER_MOTION_HINT_MASK,
112 evb->time);
113 }
114 return false;
115 }
117 bool
118 Ruler::on_motion_notify_event(GdkEventMotion *)
119 {
120 g_assert(_dt);
121 NR::Point const &event_dt = get_event_dt();
123 if (_dragging) {
124 double const guide_pos_dt = event_dt[ _horiz_f ? NR::Y : NR::X ];
125 sp_guideline_set_position(SP_GUIDELINE(_guide), guide_pos_dt);
126 _dt->set_coordinate_status(event_dt);
127 _dt->setPosition(event_dt);
128 }
129 return false;
130 }
132 bool
133 Ruler::on_button_release_event(GdkEventButton *evb)
134 {
135 g_assert(_dt);
136 int wx, wy;
137 canvas_get_pointer(wx, wy);
138 NR::Point const &event_dt = get_event_dt();
140 if (_dragging && evb->button == 1) {
141 Gdk::Window::pointer_ungrab(evb->time);
142 gtk_object_destroy(GTK_OBJECT(_guide));
143 _guide = 0;
144 _dragging = false;
146 if ( (_horiz_f ? wy : wx ) >= 0 ) {
147 Inkscape::XML::Node *repr = sp_repr_new("sodipodi:guide");
148 repr->setAttribute("orientation", _horiz_f ? "horizontal" : "vertical");
149 double const guide_pos_dt = event_dt[ _horiz_f ? NR::Y : NR::X ];
150 sp_repr_set_svg_double(repr, "position", guide_pos_dt);
151 SP_OBJECT_REPR(_dt->namedview)->appendChild(repr);
152 Inkscape::GC::release(repr);
153 sp_document_done(SP_DT_DOCUMENT(_dt));
154 }
155 _dt->set_coordinate_status(event_dt);
156 }
157 return false;
158 }
160 //------------------------------------------------------------
161 HRuler::HRuler()
162 {
163 _dt = 0;
164 _r = static_cast<Gtk::HRuler*>(Glib::wrap(static_cast<GtkWidget*> (sp_hruler_new())));
165 add(*_r);
166 _horiz_f = true;
167 }
169 HRuler::~HRuler()
170 {
171 }
174 VRuler::VRuler()
175 {
176 _dt = 0;
177 _r = static_cast<Gtk::VRuler*>(Glib::wrap(static_cast<GtkWidget*> (sp_vruler_new())));
178 add(*_r);
179 _horiz_f = false;
180 }
182 VRuler::~VRuler()
183 {
184 }
186 }}}
188 /*
189 Local Variables:
190 mode:c++
191 c-file-style:"stroustrup"
192 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
193 indent-tabs-mode:nil
194 fill-column:99
195 End:
196 */
197 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :