Code

107f4e8c6ef248088299a21f9094b280f5b2dee1
[inkscape.git] / src / ui / widget / ruler.cpp
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  *   Jon A. Cruz <jon@joncruz.org>
10  *   Abhishek Sharma
11  *
12  * Copyright (C) 2005 Ralf Stephan
13  *
14  * Released under GNU GPL, read the file 'COPYING' for more information
15  */
17 #ifdef HAVE_CONFIG_H
18 #include "config.h"
19 #endif
21 #include <glibmm/i18n.h>
23 #include <gtkmm/ruler.h>
24 #include "helper/units.h"
25 #include "widgets/ruler.h"
26 #include "ui/widget/ruler.h"
28 #include "xml/repr.h"
29 #include "display/guideline.h"
30 #include "desktop.h"
31 #include "desktop-handles.h"
32 #include "document.h"
33 #include "sp-namedview.h"
34 #include "verbs.h"
36 namespace Inkscape {
37 namespace UI {
38 namespace Widget {
40 void
41 Ruler::init(SPDesktop *dt, Gtk::Widget &w)
42 {
43     _dt = dt;
44     _canvas_widget = &w;
45     _dragging = false;
46     _guide = 0;
47     sp_ruler_set_metric(GTK_RULER(_r->gobj()), SP_PT);
48     _r->set_range(-500, 500, 0, 1000);
49 }
51 void
52 Ruler::get_range(double &lo, double &up, double &pos, double &max)
53 {
54     _r->get_range(lo, up, pos, max);
55 }
57 void
58 Ruler::set_range(double lo, double up, double pos, double max)
59 {
60     _r->set_range(lo, up, pos, max);
61 }
63 /// Set metric from namedview
64 void
65 Ruler::update_metric()
66 {
67     if (!_dt) return;
68     sp_ruler_set_metric(GTK_RULER(_r->gobj()), _dt->namedview->getDefaultMetric());
69 }
71 /// Returns text to be used for tooltip for ruler.
72 /// \todo incorrect
73 Glib::ustring
74 Ruler::get_tip()
75 {
76     return gettext(sp_unit_get_plural( _dt
77                                        ? _dt->namedview->doc_units
78                                        : &sp_unit_get_by_id(SP_UNIT_PT) ));
79 }
81 /// Helper that gets mouse coordinates relative to canvas widget.
82 void
83 Ruler::canvas_get_pointer(int &x, int &y)
84 {
85     Gdk::ModifierType mask;
86     (void) _canvas_widget->get_window()->get_pointer(x, y, mask);
87 }
89 Geom::Point
90 Ruler::get_event_dt()
91 {
92     int wx, wy;
93     canvas_get_pointer(wx, wy);
94     Geom::Point const event_win(wx, wy);
95     Geom::Point const event_w(sp_canvas_window_to_world(_dt->canvas, event_win));
96     return _dt->w2d(event_w);
97 }
99 bool
100 Ruler::on_button_press_event(GdkEventButton *evb)
102     g_assert(_dt);
103     Geom::Point const &event_dt = get_event_dt();
104     Inkscape::XML::Node *repr = SP_OBJECT_REPR(_dt->namedview);
106     if (evb->button == 1) {
107         _dragging = true;
108         sp_repr_set_boolean(repr, "showguides", TRUE);
109         sp_repr_set_boolean(repr, "inkscape:guide-bbox", TRUE);
110         _guide = sp_guideline_new(_dt->guides, event_dt, _horiz_f ? Geom::Point(0.,1.) : Geom::Point(1.,0.));
111         sp_guideline_set_color(SP_GUIDELINE(_guide), _dt->namedview->guidehicolor);
112         (void) get_window()->pointer_grab(false,
113                         Gdk::BUTTON_RELEASE_MASK |
114                         Gdk::POINTER_MOTION_MASK |
115                         Gdk::POINTER_MOTION_HINT_MASK,
116                         evb->time);
117     }
118     return false;
121 bool
122 Ruler::on_motion_notify_event(GdkEventMotion *)
124     g_assert(_dt);
125     Geom::Point const &event_dt = get_event_dt();
127     if (_dragging) {
128         sp_guideline_set_position(SP_GUIDELINE(_guide), event_dt);
129         _dt->set_coordinate_status(event_dt);
130         _dt->setPosition(event_dt);
131     }
132     return false;
135 bool
136 Ruler::on_button_release_event(GdkEventButton *evb)
138     g_assert(_dt);
139     int wx, wy;
140     canvas_get_pointer(wx, wy);
141     Geom::Point const &event_dt = get_event_dt();
143     if (_dragging && evb->button == 1) {
144         Gdk::Window::pointer_ungrab(evb->time);
145         gtk_object_destroy(GTK_OBJECT(_guide));
146         _guide = 0;
147         _dragging = false;
149         if ( (_horiz_f ? wy : wx ) >= 0 ) {
150             Inkscape::XML::Document *xml_doc = _dt->doc()->getReprDoc();
151             Inkscape::XML::Node *repr = xml_doc->createElement("sodipodi:guide");
152             repr->setAttribute("orientation", _horiz_f ? "horizontal" : "vertical");
153             double const guide_pos_dt = event_dt[ _horiz_f ? Geom::Y : Geom::X ];
154             sp_repr_set_svg_double(repr, "position", guide_pos_dt);
155             SP_OBJECT_REPR(_dt->namedview)->appendChild(repr);
156             Inkscape::GC::release(repr);
157             DocumentUndo::done(sp_desktop_document(_dt), SP_VERB_NONE, 
158                                /* TODO: annotate */ "ruler.cpp:157");
159         }
160         _dt->set_coordinate_status(event_dt);
161     }
162     return false;
165 //------------------------------------------------------------
166 HRuler::HRuler()
168     _dt = 0;
169     _r = static_cast<Gtk::HRuler*>(Glib::wrap(static_cast<GtkWidget*> (sp_hruler_new())));
170     add(*_r);
171     _horiz_f = true;
174 HRuler::~HRuler()
179 VRuler::VRuler()
181     _dt = 0;
182     _r = static_cast<Gtk::VRuler*>(Glib::wrap(static_cast<GtkWidget*> (sp_vruler_new())));
183     add(*_r);
184     _horiz_f = false;
187 VRuler::~VRuler()
191 }}}
193 /*
194   Local Variables:
195   mode:c++
196   c-file-style:"stroustrup"
197   c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
198   indent-tabs-mode:nil
199   fill-column:99
200   End:
201 */
202 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :