Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
tweak-toolbar.cpp
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-or-later
5/* Authors:
6 * MenTaLguY <mental@rydia.net>
7 * Lauris Kaplinski <lauris@kaplinski.com>
8 * bulia byak <buliabyak@users.sf.net>
9 * Frank Felfe <innerspace@iname.com>
10 * John Cliff <simarilius@yahoo.com>
11 * David Turner <novalis@gnu.org>
12 * Josh Andler <scislac@scislac.com>
13 * Jon A. Cruz <jon@joncruz.org>
14 * Maximilian Albert <maximilian.albert@gmail.com>
15 * Tavmjong Bah <tavmjong@free.fr>
16 * Abhishek Sharma
17 * Kris De Gussem <Kris.DeGussem@gmail.com>
18 * Vaibhav Malik <vaibhavmalik2018@gmail.com>
19 *
20 * Copyright (C) 2004 David Turner
21 * Copyright (C) 2003 MenTaLguY
22 * Copyright (C) 1999-2011 authors
23 * Copyright (C) 2001-2002 Ximian, Inc.
24 *
25 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
26 */
27
28#include "tweak-toolbar.h"
29
30#include <glibmm/i18n.h>
31#include <gtkmm/adjustment.h>
32#include <gtkmm/togglebutton.h>
33
34#include "desktop.h"
35#include "ui/builder-utils.h"
36#include "ui/tools/tweak-tool.h"
37#include "ui/util.h"
39
40namespace Inkscape::UI::Toolbar {
41
45
46TweakToolbar::TweakToolbar(Glib::RefPtr<Gtk::Builder> const &builder)
47 : Toolbar{get_widget<Gtk::Box>(builder, "tweak-toolbar")}
48 , _width_item{get_derived_widget<UI::Widget::SpinButton>(builder, "_width_item")}
49 , _force_item{get_derived_widget<UI::Widget::SpinButton>(builder, "_force_item")}
50 , _fidelity_box{get_widget<Gtk::Box>(builder, "_fidelity_box")}
51 , _fidelity_item{get_derived_widget<UI::Widget::SpinButton>(builder, "_fidelity_item")}
52 , _pressure_btn{get_widget<Gtk::ToggleButton>(builder, "_pressure_btn")}
53 , _channels_box{get_widget<Gtk::Box>(builder, "_channels_box")}
54 , _doh_btn{get_widget<Gtk::ToggleButton>(builder, "_doh_btn")}
55 , _dos_btn{get_widget<Gtk::ToggleButton>(builder, "_dos_btn")}
56 , _dol_btn{get_widget<Gtk::ToggleButton>(builder, "_dol_btn")}
57 , _doo_btn{get_widget<Gtk::ToggleButton>(builder, "_doo_btn")}
58{
62
64 {1, _("(pinch tweak)")},
65 {2, ""},
66 {3, ""},
67 {5, ""},
68 {10, ""},
69 {15, _("(default)")},
70 {30, ""},
71 {50, ""},
72 {75, ""},
73 {100, _("(broad tweak)")}
74 });
75
77 {1, _("(minimum force)")},
78 {5, ""},
79 {10, ""},
80 {20, _("(default)")},
81 {30, ""},
82 {50, ""},
83 {70, ""},
84 {100, _("(maximum force)")}
85 });
86
88 {10, _("(rough, simplified)")},
89 {25, ""},
90 {35, ""},
91 {50, _("(default)")},
92 {60, ""},
93 {80, ""},
94 {100, _("(fine, but many nodes)")}
95 });
96
97 // Configure mode buttons
98 int btn_index = 0;
99 for_each_child(get_widget<Gtk::Box>(builder, "mode_buttons_box"), [&](Gtk::Widget &item){
100 auto &btn = dynamic_cast<Gtk::ToggleButton &>(item);
101 _mode_buttons.push_back(&btn);
102 btn.signal_clicked().connect(sigc::bind(sigc::mem_fun(*this, &TweakToolbar::mode_changed), btn_index++));
104 });
105
106 auto prefs = Inkscape::Preferences::get();
107
108 // Pressure button.
109 _pressure_btn.signal_toggled().connect(sigc::mem_fun(*this, &TweakToolbar::pressure_state_changed));
110 _pressure_btn.set_active(prefs->getBool("/tools/tweak/usepressure", true));
111
112 // Set initial mode.
113 int mode = prefs->getIntLimited("/tools/tweak/mode", 0, 0, _mode_buttons.size() - 1);
114 mode = std::clamp<int>(mode, 0, _mode_buttons.size() - 1);
115 _mode_buttons[mode]->set_active();
116
117 // Configure channel buttons.
118 // TRANSLATORS: H, S, L, and O stands for:
119 // Hue, Saturation, Lighting and Opacity respectively.
120 _doh_btn.signal_toggled().connect(sigc::mem_fun(*this, &TweakToolbar::toggle_doh));
121 _doh_btn.set_active(prefs->getBool("/tools/tweak/doh", true));
122 _dos_btn.signal_toggled().connect(sigc::mem_fun(*this, &TweakToolbar::toggle_dos));
123 _dos_btn.set_active(prefs->getBool("/tools/tweak/dos", true));
124 _dol_btn.signal_toggled().connect(sigc::mem_fun(*this, &TweakToolbar::toggle_dol));
125 _dol_btn.set_active(prefs->getBool("/tools/tweak/dol", true));
126 _doo_btn.signal_toggled().connect(sigc::mem_fun(*this, &TweakToolbar::toggle_doo));
127 _doo_btn.set_active(prefs->getBool("/tools/tweak/doo", true));
128
129 // Elements must be hidden after being initially visible.
131 _fidelity_box.set_visible(false);
132 } else {
133 _channels_box.set_visible(false);
134 }
135
137}
138
140
142 double default_value, ValueChangedMemFun value_changed_mem_fun)
143{
144 auto const path = "/tools/tweak/" + name;
145 auto const val = Preferences::get()->getDouble(path, default_value);
146
147 auto adj = btn.get_adjustment();
148 adj->set_value(val);
149 adj->signal_value_changed().connect(sigc::mem_fun(*this, value_changed_mem_fun));
150
151 btn.setDefocusTarget(this);
152}
153
155{
156 _mode_buttons[mode]->set_active();
157}
158
160{
161 Preferences::get()->setDouble("/tools/tweak/width", _width_item.get_adjustment()->get_value() * 0.01);
162}
163
165{
166 Preferences::get()->setDouble("/tools/tweak/force", _force_item.get_adjustment()->get_value() * 0.01);
167}
168
170{
171 Preferences::get()->setInt("/tools/tweak/mode", mode);
172
175
176 _channels_box.set_visible(flag);
177
178 _fidelity_box.set_visible(!flag);
179}
180
182{
183 Preferences::get()->setDouble("/tools/tweak/fidelity", _fidelity_item.get_adjustment()->get_value() * 0.01);
184}
185
187{
188 Preferences::get()->setBool("/tools/tweak/usepressure", _pressure_btn.get_active());
189}
190
192{
193 Preferences::get()->setBool("/tools/tweak/doh", _doh_btn.get_active());
194}
195
197{
198 Preferences::get()->setBool("/tools/tweak/dos", _dos_btn.get_active());
199}
200
202{
203 Preferences::get()->setBool("/tools/tweak/dol", _dol_btn.get_active());
204}
205
207{
208 Preferences::get()->setBool("/tools/tweak/doo", _doo_btn.get_active());
209}
210
211} // namespace Inkscape::UI::Toolbar
212
213/*
214 Local Variables:
215 mode:c++
216 c-file-style:"stroustrup"
217 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
218 indent-tabs-mode:nil
219 fill-column:99
220 End:
221*/
222// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
Gtk builder utilities.
double getDouble(Glib::ustring const &pref_path, double def=0.0, Glib::ustring const &unit="")
Retrieve a floating point value.
static Preferences * get()
Access the singleton Preferences object.
void setDouble(Glib::ustring const &pref_path, double value)
Set a floating point value.
void setInt(Glib::ustring const &pref_path, int value)
Set an integer value.
void setBool(Glib::ustring const &pref_path, bool value)
Set a Boolean value.
Base class for all tool toolbars.
Definition toolbar.h:72
UI::Widget::SpinButton & _fidelity_item
std::vector< Gtk::ToggleButton * > _mode_buttons
UI::Widget::SpinButton & _force_item
UI::Widget::SpinButton & _width_item
void setup_derived_spin_button(UI::Widget::SpinButton &btn, Glib::ustring const &name, double default_value, ValueChangedMemFun value_changed_mem_fun)
void(TweakToolbar::*)() ValueChangedMemFun
SpinButton widget, that allows entry of simple math expressions (also units, when linked with UnitMen...
Definition spinbutton.h:52
void setDefocusTarget(decltype(_defocus_target) target)
Definition spinbutton.h:127
void set_custom_numeric_menu_data(NumericMenuData &&custom_menu_data)
Editable view implementation.
SPItem * item
Definition desktop.h:50
W & get_widget(const Glib::RefPtr< Gtk::Builder > &builder, const char *id)
Gtk::Widget * for_each_child(Gtk::Widget &widget, Func &&func, bool const plus_self=false, bool const recurse=false, int const level=0)
Call Func with a reference to each child of parent, until it returns _break.
Definition util.h:90
W & get_derived_widget(const Glib::RefPtr< Gtk::Builder > &builder, const char *id, Args &&... args)
Glib::RefPtr< Gtk::Builder > create_builder(const char *filename)
int mode
Glib::ustring name
Definition toolbars.cpp:55
Glib::RefPtr< Gtk::Builder > builder