summaryrefslogtreecommitdiffstats
path: root/src/ui/widget/unit-menu.h
blob: 1f10cc246495877e07cd66b50eab194d92fb648d (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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Author:
 *   Bryce Harrington <bryce@bryceharrington.org>
 *
 * Copyright (C) 2004 Bryce Harrington
 *
 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
 */

#ifndef INKSCAPE_UI_WIDGET_UNIT_H
#define INKSCAPE_UI_WIDGET_UNIT_H

#include <gtkmm/comboboxtext.h>
#include <gtkmm.h>
#include "util/units.h"

using namespace Inkscape::Util;

namespace Inkscape {
namespace UI {
namespace Widget {

/**
 * A drop down menu for choosing unit types.
 */
class UnitMenu : public Gtk::ComboBoxText
{
public:

    /**
     *    Construct a UnitMenu
     */
    UnitMenu();

    /* GtkBuilder constructor */
    UnitMenu(BaseObjectType* cobject, const Glib::RefPtr<Gtk::Builder>& refGlade):Gtk::ComboBoxText(cobject){
        UnitMenu();
    };

    ~UnitMenu() override;

    /**
     * Adds the unit type to the widget.  This extracts the corresponding
     * units from the unit map matching the given type, and appends them
     * to the dropdown widget.  It causes the primary unit for the given
     * unit_type to be selected.
     */
    bool          setUnitType(UnitType unit_type);

    /**
     * Removes all unit entries, then adds the unit type to the widget.
     * This extracts the corresponding
     * units from the unit map matching the given type, and appends them
     * to the dropdown widget.  It causes the primary unit for the given
     * unit_type to be selected.
     */
    bool          resetUnitType(UnitType unit_type);

    /**
     * Adds a unit, possibly user-defined, to the menu.
     */
    void          addUnit(Unit const& u);

    /**
     * Sets the dropdown widget to the given unit abbreviation. 
     * Returns true if the unit was selectable, false if not 
     * (i.e., if the unit was not present in the widget).
     */
    bool          setUnit(Glib::ustring const &unit);

    /**
     * Returns the Unit object corresponding to the current selection
     * in the dropdown widget.
     */
    Unit const *  getUnit() const;

    /**
     * Returns the abbreviated unit name of the selected unit.
     */
    Glib::ustring getUnitAbbr() const;

    /**
     * Returns the UnitType of the selected unit.
     */
    UnitType      getUnitType() const;

    /**
     * Returns the unit factor for the selected unit.
     */
    double        getUnitFactor() const;

    /**
     * Returns the recommended number of digits for displaying
     *  numbers of this unit type.  
     */
    int           getDefaultDigits() const;

    /**
     * Returns the recommended step size in spin buttons
     *  displaying units of this type.
     */
    double        getDefaultStep() const;

    /**
     * Returns the recommended page size (when hitting pgup/pgdn)
     *  in spin buttons displaying units of this type.
     */
    double        getDefaultPage() const;

    /**
     *  Returns the conversion factor required to convert values
     *  of the currently selected unit into units of type
     *  new_unit_abbr.
     */
    double        getConversion(Glib::ustring const &new_unit_abbr, Glib::ustring const &old_unit_abbr = "no_unit") const;

    /**
     * Returns true if the selected unit is not dimensionless 
     *  (false for %, true for px, pt, cm, etc).
     */
    bool          isAbsolute() const;

    /**
     * Returns true if the selected unit is radial (deg or rad).
     */
    bool          isRadial() const;

protected:
    UnitType          _type;
    /**
     * block scroll from widget if is inside a scrolled window.
     */
    bool on_scroll_event(GdkEventScroll *event) override;

    Gtk::ComboBoxText* _combo;
};

} // namespace Widget
} // namespace UI
} // namespace Inkscape

#endif // INKSCAPE_UI_WIDGET_UNIT_H

/*
  Local Variables:
  mode:c++
  c-file-style:"stroustrup"
  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
  indent-tabs-mode:nil
  fill-column:99
  End:
*/
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :