diff options
| author | Jabier Arraiza <jabier.arraiza@marker.es> | 2018-12-24 13:19:30 +0000 |
|---|---|---|
| committer | Jabiertxof <jabier.arraiza@marker.es> | 2018-12-26 11:46:56 +0000 |
| commit | bc0ad0c871071256edca595cc45d9ec040ae621c (patch) | |
| tree | c1706e8836ba37fd45b15e8d2177a4d70b628360 /src/ui/widget/ink-flow-box.cpp | |
| parent | fix crash with missing image xlink:href attribute (diff) | |
| download | inkscape-bc0ad0c871071256edca595cc45d9ec040ae621c.tar.gz inkscape-bc0ad0c871071256edca595cc45d9ec040ae621c.zip | |
Add inkFlowBox widget and apply to XML inspector
Diffstat (limited to 'src/ui/widget/ink-flow-box.cpp')
| -rw-r--r-- | src/ui/widget/ink-flow-box.cpp | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/src/ui/widget/ink-flow-box.cpp b/src/ui/widget/ink-flow-box.cpp new file mode 100644 index 000000000..b96c922cf --- /dev/null +++ b/src/ui/widget/ink-flow-box.cpp @@ -0,0 +1,142 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Notebook page widget. + * + * Author: + * Bryce Harrington <bryce@bryceharrington.org> + * + * Copyright (C) 2004 Bryce Harrington + * + * Released under GNU GPL v2+, read the file 'COPYING' for more information. + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" // only include where actually required! +#endif + +#include "preferences.h" +#include "ui/widget/ink-flow-box.h" +#include "ui/icon-loader.h" +#include <gtkmm/adjustment.h> + +namespace Inkscape { +namespace UI { +namespace Widget { + +InkFlowBox::InkFlowBox(const gchar * name) +{ + set_name(name); + //_flowbox.set_homogeneous(); + this->pack_start(_controller, false, false, 0); + this->pack_start(_flowbox, true, true, 0); + _flowbox.set_activate_on_single_click(true); + Gtk::ToggleButton *tbutton = new Gtk::ToggleButton("", false); + tbutton->set_always_show_image(true); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + tbutton->set_active(prefs->getBool(Glib::ustring("/dialogs/") + get_name() + Glib::ustring("/flowbox/lock/"), true)); + Glib::ustring iconname = "object-unlocked"; + if(tbutton->get_active()) { + iconname = "object-locked"; + } + tbutton->set_image(*sp_get_icon_image(iconname, Gtk::ICON_SIZE_MENU)); + tbutton->signal_toggled().connect(sigc::bind< Gtk::ToggleButton* >(sigc::mem_fun (*this, &InkFlowBox::on_global_toggle), tbutton) ); + _controller.pack_start(*tbutton); + tbutton->show(); + showing = 0; + sensitive = true; +} + +InkFlowBox::~InkFlowBox() {} + +Glib::ustring +InkFlowBox::getPrefsPath(gint pos) { + return Glib::ustring("/dialogs/") + get_name() + Glib::ustring("/flowbox/index_") + std::to_string(pos); +} + +bool +InkFlowBox::on_filter(Gtk::FlowBoxChild* child) { + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + if(prefs->getBool(getPrefsPath(child->get_index()), true)) { + showing ++; + return true; + } + return false; +} + +void +InkFlowBox::on_toggle(gint pos, Gtk::ToggleButton *tbutton) { + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + bool global = prefs->getBool(Glib::ustring("/dialogs/") + get_name() + Glib::ustring("/flowbox/lock"), true); + if (global && sensitive) { + sensitive = false; + bool active = true; + for (auto child:tbutton->get_parent()->get_children()) { + if (tbutton != child) { + dynamic_cast<Gtk::ToggleButton *>(child)->set_active(active); + active = false; + } + } + prefs->setBool(getPrefsPath(pos), true); + tbutton->set_active(true); + sensitive = true; + } else { + prefs->setBool(getPrefsPath(pos), tbutton->get_active()); + } + showing = 0; + _flowbox.set_filter_func(sigc::mem_fun (*this, &InkFlowBox::on_filter)); + _flowbox.set_max_children_per_line(showing); +} + +void +InkFlowBox::on_global_toggle(Gtk::ToggleButton *tbutton) { + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setBool(Glib::ustring("/dialogs/") + get_name() + Glib::ustring("/flowbox/lock"), tbutton->get_active()); + sensitive = true; + if (tbutton->get_active()) { + sensitive = false; + bool active = true; + for (auto child:tbutton->get_parent()->get_children()) { + if (tbutton != child) { + dynamic_cast<Gtk::ToggleButton *>(child)->set_active(active); + active = false; + } + } + } + Glib::ustring iconname = "object-unlocked"; + if(tbutton->get_active()) { + iconname = "object-locked"; + } + tbutton->set_image(*sp_get_icon_image(iconname, Gtk::ICON_SIZE_MENU)); + sensitive = true; +} + +void +InkFlowBox::insert(Gtk::Widget *widget, Glib::ustring label, gint pos, bool active, int minwidth){ + Gtk::ToggleButton *tbutton = new Gtk::ToggleButton(label, true); + tbutton->set_active(active); + tbutton->signal_toggled().connect(sigc::bind<gint, Gtk::ToggleButton* >(sigc::mem_fun (*this, &InkFlowBox::on_toggle),pos, tbutton) ); + _controller.pack_start(*tbutton); + tbutton->show(); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setBool(getPrefsPath(pos), active); + widget->set_size_request(minwidth,-1); + _flowbox.insert(*widget, pos); + showing = 0; + _flowbox.set_filter_func(sigc::mem_fun (*this, &InkFlowBox::on_filter) ); + _flowbox.set_max_children_per_line(showing); +} + +} // namespace Widget +} // namespace UI +} // namespace Inkscape + +/* + 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 : |
