Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
paintbucket-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 "paintbucket-toolbar.h"
29
30#include <glibmm/i18n.h>
31#include <gtkmm/adjustment.h>
32#include <gtkmm/box.h>
33#include <gtkmm/button.h>
34#include <gtkmm/liststore.h>
35#include <gtkmm/treemodel.h>
36
37#include "desktop.h"
38#include "preferences.h"
39#include "ui/builder-utils.h"
40#include "ui/tools/flood-tool.h"
41#include "ui/util.h"
45
46namespace Inkscape::UI::Toolbar {
47
51
52PaintbucketToolbar::PaintbucketToolbar(Glib::RefPtr<Gtk::Builder> const &builder)
53 : Toolbar{get_widget<Gtk::Box>(builder, "paintbucket-toolbar")}
54 , _tracker{std::make_unique<UI::Widget::UnitTracker>(Inkscape::Util::UNIT_TYPE_LINEAR)}
55 , _threshold_item(get_derived_widget<UI::Widget::SpinButton>(builder, "_threshold_item"))
56 , _offset_item(get_derived_widget<UI::Widget::SpinButton>(builder, "_offset_item"))
57{
58 auto prefs = Preferences::get();
59
60 // Setup the spin buttons.
63
64 // Values auto-calculated.
67
68 // Channel
69 {
71
72 Glib::RefPtr<Gtk::ListStore> store = Gtk::ListStore::create(columns);
73
75 Gtk::TreeModel::Row row = *store->append();
76 row[columns.col_label ] = _(item);
77 row[columns.col_sensitive] = true;
78 }
79
80 _channels_item = Gtk::manage(UI::Widget::ComboToolItem::create(_("Fill by"), "", "Not Used", store));
82
83 int channels = prefs->getInt("/tools/paintbucket/channels", 0);
84 _channels_item->set_active(channels);
85
87 get_widget<Gtk::Box>(builder, "channels_box").append(*_channels_item);
88
89 // Create the units menu.
90 Glib::ustring stored_unit = prefs->getString("/tools/paintbucket/offsetunits");
91 if (!stored_unit.empty()) {
92 auto const u = Util::UnitTable::get().getUnit(stored_unit);
93 _tracker->setActiveUnit(u);
94 }
95 }
96
97 // Auto Gap
98 {
100
101 Glib::RefPtr<Gtk::ListStore> store = Gtk::ListStore::create(columns);
102
104 Gtk::TreeModel::Row row = *store->append();
105 row[columns.col_label ] = g_dpgettext2(nullptr, "Flood autogap", item);
106 row[columns.col_sensitive] = true;
107 }
108
109 _autogap_item = Gtk::manage(UI::Widget::ComboToolItem::create(_("Close gaps"), Glib::ustring(), "Not Used", store));
111
112 int autogap = prefs->getInt("/tools/paintbucket/autogap", 0);
113 _autogap_item->set_active(autogap);
114
115 _autogap_item->signal_changed().connect(sigc::mem_fun(*this, &PaintbucketToolbar::autogap_changed));
116 get_widget<Gtk::Box>(builder, "autogap_box").append(*_autogap_item);
117
118 auto units_menu = _tracker->create_tool_item(_("Units"), "");
119 get_widget<Gtk::Box>(builder, "unit_menu_box").append(*units_menu);
120 }
121
122 // Signals.
123 get_widget<Gtk::Button>(builder, "reset_btn")
124 .signal_clicked()
125 .connect(sigc::mem_fun(*this, &PaintbucketToolbar::defaults));
126
128}
129
131
133{
134 _tracker->setActiveUnit(unit);
135}
136
138 double default_value, ValueChangedMemFun const value_changed_mem_fun)
139{
140 auto const path = "/tools/painbucket/" + name;
141 auto const val = Preferences::get()->getDouble(path, default_value);
142
143 auto adj = btn.get_adjustment();
144 adj->set_value(val);
145 adj->signal_value_changed().connect(sigc::mem_fun(*this, value_changed_mem_fun));
146
147 if (name == "offset") {
148 _tracker->addAdjustment(adj->gobj());
149 btn.addUnitTracker(_tracker.get());
150 }
151
152 btn.setDefocusTarget(this);
153}
154
159
161{
162 Preferences::get()->setInt("/tools/paintbucket/threshold", _threshold_item.get_adjustment()->get_value());
163}
164
166{
167 auto const unit = _tracker->getActiveUnit();
168 auto const prefs = Preferences::get();
169
170 // Don't adjust the offset value because we're saving the
171 // unit and it'll be correctly handled on load.
172 prefs->setDouble("/tools/paintbucket/offset", (gdouble)_offset_item.get_adjustment()->get_value());
173
174 prefs->setString("/tools/paintbucket/offsetunits", unit->abbr);
175}
176
178{
179 Preferences::get()->setInt("/tools/paintbucket/autogap", autogap);
180}
181
183{
184 // FIXME: make defaults settable via Inkscape Options
185 _threshold_item.get_adjustment()->set_value(15);
186 _offset_item.get_adjustment()->set_value(0.0);
187
190}
191
192} // namespace Inkscape::UI::Toolbar
193
194/*
195 Local Variables:
196 mode:c++
197 c-file-style:"stroustrup"
198 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
199 indent-tabs-mode:nil
200 fill-column:99
201 End:
202*/
203// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
Gtk builder utilities.
Fragment store
Definition canvas.cpp:155
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 setInt(Glib::ustring const &pref_path, int value)
Set an integer value.
void(PaintbucketToolbar::*)() ValueChangedMemFun
std::unique_ptr< UI::Widget::UnitTracker > _tracker
void setActiveUnit(Util::Unit const *unit) override
void setup_derived_spin_button(UI::Widget::SpinButton &btn, Glib::ustring const &name, double default_value, ValueChangedMemFun const value_changed_mem_fun)
Base class for all tool toolbars.
Definition toolbar.h:72
static std::vector< char const * > const channel_list
Definition flood-tool.h:36
static std::vector< char const * > const gap_list
Definition flood-tool.h:37
static void set_channels(int channels)
Gtk::TreeModelColumn< bool > col_sensitive
Gtk::TreeModelColumn< Glib::ustring > col_label
void use_group_label(bool use_group_label)
static ComboToolItem * create(const Glib::ustring &label, const Glib::ustring &tooltip, const Glib::ustring &stock_id, Glib::RefPtr< Gtk::ListStore > store, bool has_entry=false)
sigc::signal< void(int)> signal_changed()
SpinButton widget, that allows entry of simple math expressions (also units, when linked with UnitMen...
Definition spinbutton.h:52
void addUnitTracker(UnitTracker *ut)
Definition spinbutton.h:68
void setDefocusTarget(decltype(_defocus_target) target)
Definition spinbutton.h:127
void set_custom_numeric_menu_data(NumericMenuData &&custom_menu_data)
static UnitTable & get()
Definition units.cpp:441
Unit const * getUnit(Glib::ustring const &name) const
Retrieve a given unit based on its string identifier.
Definition units.cpp:316
A combobox that can be displayed in a toolbar.
Editable view implementation.
SPItem * item
Definition desktop.h:50
W & get_widget(const Glib::RefPtr< Gtk::Builder > &builder, const char *id)
W & get_derived_widget(const Glib::RefPtr< Gtk::Builder > &builder, const char *id, Args &&... args)
Glib::RefPtr< Gtk::Builder > create_builder(const char *filename)
Miscellaneous supporting code.
Definition document.h:93
Helper class to stream background task notifications as a series of messages.
STL namespace.
Singleton class to access the preferences file in a convenient way.
Glib::ustring name
Definition toolbars.cpp:55
Glib::RefPtr< Gtk::Builder > builder