diff options
| author | Jabier Arraiza <jabier.arraiza@marker.es> | 2019-02-03 01:11:32 +0000 |
|---|---|---|
| committer | Jabier Arraiza <jabier.arraiza@marker.es> | 2019-02-18 21:18:27 +0000 |
| commit | 7d9c5a51c80a0c044558eb941a6bd86a0a9b49d3 (patch) | |
| tree | f4880739f68c371c85625a13482c25cb3b84de95 /src | |
| parent | Added all Ramón Miranda symbolic icons to LPE selector (diff) | |
| download | inkscape-7d9c5a51c80a0c044558eb941a6bd86a0a9b49d3.tar.gz inkscape-7d9c5a51c80a0c044558eb941a6bd86a0a9b49d3.zip | |
add sorting and favorites
Diffstat (limited to 'src')
| -rw-r--r-- | src/live_effects/effect-enum.h | 21 | ||||
| -rw-r--r-- | src/live_effects/effect.cpp | 55 | ||||
| -rw-r--r-- | src/ui/dialog/livepatheffect-add.cpp | 164 | ||||
| -rw-r--r-- | src/ui/dialog/livepatheffect-add.h | 13 |
4 files changed, 236 insertions, 17 deletions
diff --git a/src/live_effects/effect-enum.h b/src/live_effects/effect-enum.h index b160aa161..2939766fd 100644 --- a/src/live_effects/effect-enum.h +++ b/src/live_effects/effect-enum.h @@ -88,6 +88,7 @@ struct EnumEffectData { const bool on_use; const bool on_image; const bool on_text; + const bool experimental; }; const Glib::ustring empty_string(""); @@ -188,7 +189,7 @@ class EnumEffectDataConverter { return empty_string; } - const bool &get_on_path(const E id) const + const bool get_on_path(const E id) const { for (unsigned int i = 0; i < _length; ++i) { if (_data[i].id == id) @@ -198,7 +199,7 @@ class EnumEffectDataConverter { return false; } - const bool &get_on_shape(const E id) const + const bool get_on_shape(const E id) const { for (unsigned int i = 0; i < _length; ++i) { if (_data[i].id == id) @@ -208,7 +209,7 @@ class EnumEffectDataConverter { return false; } - const bool &get_on_group(const E id) const + const bool get_on_group(const E id) const { for (unsigned int i = 0; i < _length; ++i) { if (_data[i].id == id) @@ -218,7 +219,7 @@ class EnumEffectDataConverter { return false; } - const bool &get_on_text(const E id) const + const bool get_on_text(const E id) const { for (unsigned int i = 0; i < _length; ++i) { if (_data[i].id == id) @@ -228,7 +229,7 @@ class EnumEffectDataConverter { return false; } - const bool &get_on_use(const E id) const + const bool get_on_use(const E id) const { for (unsigned int i = 0; i < _length; ++i) { if (_data[i].id == id) @@ -238,6 +239,16 @@ class EnumEffectDataConverter { return false; } + const bool get_experimental(const E id) const + { + for (unsigned int i = 0; i < _length; ++i) { + if (_data[i].id == id) + return _data[i].experimental; + } + + return false; + } + const EnumEffectData<E> &data(const unsigned int i) const { return _data[i]; } const unsigned int _length; diff --git a/src/live_effects/effect.cpp b/src/live_effects/effect.cpp index 87f943ee2..0bc576ecb 100644 --- a/src/live_effects/effect.cpp +++ b/src/live_effects/effect.cpp @@ -109,6 +109,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { GEARS @@ -122,6 +123,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , false //on_use , false //on_image , false //on_text + , false //experimental }, { PATTERN_ALONG_PATH @@ -135,6 +137,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, // for historic reasons, this effect is called skeletal(strokes) in Inkscape:SVG { CURVE_STITCH @@ -148,6 +151,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, /* 0.47 */ { @@ -162,6 +166,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { KNOT @@ -175,6 +180,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { CONSTRUCT_GRID @@ -188,6 +194,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { SPIRO @@ -201,6 +208,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { ENVELOPE @@ -214,6 +222,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { INTERPOLATE @@ -227,6 +236,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { ROUGH_HATCHES @@ -240,6 +250,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { SKETCH @@ -253,6 +264,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { RULER @@ -266,6 +278,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, /* 0.91 */ { @@ -280,6 +293,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { CLONE_ORIGINAL @@ -293,6 +307,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, /* 0.92 */ { @@ -307,6 +322,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { LATTICE2 @@ -320,6 +336,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { PERSPECTIVE_ENVELOPE @@ -333,6 +350,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { INTERPOLATE_POINTS @@ -346,6 +364,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { TRANSFORM_2PTS @@ -359,6 +378,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { SHOW_HANDLES @@ -372,6 +392,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { ROUGHEN @@ -385,6 +406,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { BSPLINE @@ -398,6 +420,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { JOIN_TYPE @@ -411,6 +434,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { TAPER_STROKE @@ -424,6 +448,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { MIRROR_SYMMETRY @@ -437,6 +462,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { COPY_ROTATE @@ -450,6 +476,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, /* Ponyscape -> Inkscape 0.92*/ { @@ -464,6 +491,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { FILL_BETWEEN_STROKES @@ -477,6 +505,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { FILL_BETWEEN_MANY @@ -490,6 +519,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { ELLIPSE_5PTS @@ -503,6 +533,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { BOUNDING_BOX @@ -516,6 +547,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, /* 1.0 */ { @@ -530,6 +562,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { FILLET_CHAMFER @@ -543,6 +576,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { BOOL_OP @@ -556,6 +590,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { EMBRODERY_STITCH @@ -569,6 +604,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { POWERCLIP @@ -582,6 +618,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { POWERMASK @@ -595,6 +632,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { PTS2ELLIPSE @@ -608,6 +646,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { OFFSET @@ -621,6 +660,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, { DASH_STROKE @@ -634,6 +674,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , false //experimental }, #ifdef LPE_ENABLE_TEST_EFFECTS { @@ -648,6 +689,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , true //experimental }, { ANGLE_BISECTOR @@ -661,6 +703,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , true //experimental }, { CIRCLE_WITH_RADIUS @@ -674,6 +717,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , true //experimental }, { CIRCLE_3PTS @@ -687,6 +731,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , true //experimental }, { DYNASTROKE @@ -700,6 +745,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , true //experimental }, { EXTRUDE @@ -713,6 +759,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , true //experimental }, { LATTICE @@ -726,6 +773,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , true //experimental }, { LINE_SEGMENT @@ -739,6 +787,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , true //experimental }, { PARALLEL @@ -752,6 +801,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , true //experimental }, { PATH_LENGTH @@ -765,6 +815,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , true //experimental }, { PERP_BISECTOR @@ -778,6 +829,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , true //experimental }, { RECURSIVE_SKELETON @@ -791,6 +843,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , true //experimental }, { TANGENT_TO_CURVE @@ -804,6 +857,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , true //experimental }, { TEXT_LABEL @@ -817,6 +871,7 @@ const EnumEffectData<EffectType> LPETypeData[] = { , true //on_use , false //on_image , false //on_text + , true //experimental }, #endif diff --git a/src/ui/dialog/livepatheffect-add.cpp b/src/ui/dialog/livepatheffect-add.cpp index e72ca745d..9137f529d 100644 --- a/src/ui/dialog/livepatheffect-add.cpp +++ b/src/ui/dialog/livepatheffect-add.cpp @@ -18,15 +18,45 @@ #include "live_effects/effect.h" #include "livepatheffect-add.h" #include <glibmm/i18n.h> +#include "preferences.h" namespace Inkscape { namespace UI { namespace Dialog { +bool sp_has_fav(Glib::ustring effect){ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + Glib::ustring favlist = prefs->getString("/dialogs/livepatheffect/favs"); + size_t pos = favlist.find(effect); + if (pos != std::string::npos){ + return true; + } + return false; +} + +void sp_add_fav(Glib::ustring effect){ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + Glib::ustring favlist = prefs->getString("/dialogs/livepatheffect/favs"); + if (!sp_has_fav(effect)) { + prefs->setString("/dialogs/livepatheffect/favs", favlist + effect + ";"); + } +} + +void sp_remove_fav(Glib::ustring effect){ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + Glib::ustring favlist = prefs->getString("/dialogs/livepatheffect/favs"); + effect += ";"; + size_t pos = favlist.find(effect); + if (pos != std::string::npos) + { + favlist.erase(pos, effect.length()); + prefs->setString("/dialogs/livepatheffect/favs", favlist); + } +} + LivePathEffectAdd::LivePathEffectAdd() : converter(Inkscape::LivePathEffect::LPETypeConverter) { - add_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::ENTER_NOTIFY_MASK | Gdk::LEAVE_NOTIFY_MASK ); Glib::ustring gladefile = get_filename(Inkscape::IO::Resource::UIS, "dialog-livepatheffect-add.ui"); try { _builder = Gtk::Builder::create_from_file(gladefile); @@ -39,6 +69,8 @@ LivePathEffectAdd::LivePathEffectAdd() _builder->get_widget("LPESelectorEffectInfo", _LPESelectorEffectInfo); _builder->get_widget("LPEFilter", _LPEFilter); _builder->get_widget("LPEInfo", _LPEInfo); + _builder->get_widget("LPEExperimentals", _LPEExperimentals); + _builder->get_widget("LPEScrolled", _LPEScrolled); _LPEFilter->signal_search_changed().connect(sigc::mem_fun(*this, &LivePathEffectAdd::on_search)); Glib::ustring effectgladefile = get_filename(Inkscape::IO::Resource::UIS, "dialog-livepatheffect-add-effect.ui"); for (int i = 0; i < static_cast<int>(converter._length); ++i) { @@ -49,6 +81,8 @@ LivePathEffectAdd::LivePathEffectAdd() g_warning("Glade file loading failed for filter effect dialog"); return; } + Gtk::Box *LPESelectorEffect; + builder_effect->get_widget("LPESelectorEffect", LPESelectorEffect); const LivePathEffect::EnumEffectData<LivePathEffect::EffectType> *data = &converter.data(i); Gtk::Label *LPEName; builder_effect->get_widget("LPEName", LPEName); @@ -56,21 +90,32 @@ LivePathEffectAdd::LivePathEffectAdd() Gtk::Label *LPEDescription; builder_effect->get_widget("LPEDescription", LPEDescription); LPEDescription->set_text(converter.get_description(data->id)); + Gtk::ToggleButton *LPEExperimental; + builder_effect->get_widget("LPEExperimental", LPEExperimental); + bool active = converter.get_experimental(data->id)?true:false; + LPEExperimental->set_active(active); Gtk::Image *LPEIcon; builder_effect->get_widget("LPEIcon", LPEIcon); LPEIcon->set_from_icon_name(converter.get_icon(data->id), Gtk::BuiltinIconSize(Gtk::ICON_SIZE_DIALOG)); Gtk::EventBox *LPESelectorEffectInfoLauncher; builder_effect->get_widget("LPESelectorEffectInfoLauncher", LPESelectorEffectInfoLauncher); LPESelectorEffectInfoLauncher->signal_button_press_event().connect(sigc::bind<Glib::RefPtr<Gtk::Builder> >(sigc::mem_fun(*this, &LivePathEffectAdd::pop_description), builder_effect)); - Gtk::Box *LPESelectorEffect; - builder_effect->get_widget("LPESelectorEffect", LPESelectorEffect); + Gtk::EventBox *LPESelectorEffectFavLauncher; + builder_effect->get_widget("LPESelectorEffectFavLauncher", LPESelectorEffectFavLauncher); + Gtk::EventBox *LPESelectorEffectFavLauncherTop; + builder_effect->get_widget("LPESelectorEffectFavLauncherTop", LPESelectorEffectFavLauncherTop); + LPESelectorEffectFavLauncher ->signal_button_press_event().connect(sigc::bind<Glib::RefPtr<Gtk::Builder> >(sigc::mem_fun(*this, &LivePathEffectAdd::fav_toggler), builder_effect)); + LPESelectorEffectFavLauncherTop->signal_button_press_event().connect(sigc::bind<Glib::RefPtr<Gtk::Builder> >(sigc::mem_fun(*this, &LivePathEffectAdd::fav_toggler), builder_effect)); _LPESelectorFlowBox->insert(*LPESelectorEffect, i); } _visiblelpe = _LPESelectorFlowBox->get_children().size(); _LPESelectorFlowBox->signal_child_activated().connect(sigc::mem_fun(*this, &LivePathEffectAdd::on_activate)); - _LPEDialogSelector->set_title(_("Live Efects Selector")); _LPEDialogSelector->show_all_children(); + _LPEDialogSelector->add_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK | Gdk::BUTTON_RELEASE_MASK | Gdk::ENTER_NOTIFY_MASK | Gdk::LEAVE_NOTIFY_MASK ); _LPEInfo->set_visible(false); + _LPESelectorFlowBox->set_sort_func(sigc::mem_fun(*this, &LivePathEffectAdd::on_sort)); + _LPESelectorFlowBox->set_filter_func(sigc::mem_fun(*this, &LivePathEffectAdd::on_filter)); + _LPEExperimentals->property_active().signal_changed().connect(sigc::mem_fun(*this, &LivePathEffectAdd::reload_effect_list)); } void LivePathEffectAdd::on_activate(Gtk::FlowBoxChild *child) @@ -83,7 +128,7 @@ void LivePathEffectAdd::on_activate(Gtk::FlowBoxChild *child) Gtk::Box *box = dynamic_cast<Gtk::Box *>(leitem->get_child()); if (box) { std::vector<Gtk::Widget *> contents = box->get_children(); - Gtk::Box *actions = dynamic_cast<Gtk::Box *>(contents[3]); + Gtk::Box *actions = dynamic_cast<Gtk::Box *>(contents[4]); if (actions) { actions->set_visible(false); } @@ -125,15 +170,55 @@ bool LivePathEffectAdd::pop_description(GdkEventButton* evt, Glib::RefPtr<Gtk::B return true; } -bool LivePathEffectAdd::on_filter(Gtk::FlowBoxChild *child) +bool LivePathEffectAdd::fav_toggler(GdkEventButton* evt, Glib::RefPtr<Gtk::Builder> builder_effect) { - if (_LPEFilter->get_text().length() < 4) { - _visiblelpe = _LPESelectorFlowBox->get_children().size(); - return true; + Gtk::Box *LPESelectorEffect; + builder_effect->get_widget("LPESelectorEffect", LPESelectorEffect); + Gtk::Label *LPEName; + builder_effect->get_widget("LPEName", LPEName); + Gtk::EventBox *LPESelectorEffectFavLauncher; + builder_effect->get_widget("LPESelectorEffectFavLauncher", LPESelectorEffectFavLauncher); + Gtk::Image *favimg = dynamic_cast<Gtk::Image *>(LPESelectorEffectFavLauncher->get_child()); + Gtk::EventBox *LPESelectorEffectFavLauncherTop; + builder_effect->get_widget("LPESelectorEffectFavLauncherTop", LPESelectorEffectFavLauncherTop); + Gtk::Image *favimgtop = dynamic_cast<Gtk::Image *>(LPESelectorEffectFavLauncherTop->get_child()); + if (favimg && favimgtop) { + if (sp_has_fav(LPEName->get_text())){ + //favimg->set_from_icon_name("draw-star-outline", Gtk::IconSize(30)); + LPESelectorEffectFavLauncherTop->set_visible(false); + LPESelectorEffectFavLauncherTop->hide(); + sp_remove_fav(LPEName->get_text()); + LPESelectorEffect->get_parent()->get_style_context()->remove_class("lpefav"); + _LPESelectorFlowBox->invalidate_sort(); + } else { + //favimg->set_from_icon_name("draw-star", Gtk::IconSize(30)); + LPESelectorEffectFavLauncherTop->set_visible(true); + LPESelectorEffectFavLauncherTop->show(); + sp_add_fav(LPEName->get_text()); + LPESelectorEffect->get_parent()->get_style_context()->add_class("lpefav"); + Glib::RefPtr< Gtk::Adjustment > vadjust = _LPEScrolled->get_vadjustment(); + vadjust->set_value(vadjust->get_lower()); + _LPESelectorFlowBox->invalidate_sort(); + } } + return true; +} + +bool LivePathEffectAdd::on_filter(Gtk::FlowBoxChild *child) +{ Gtk::Box *box = dynamic_cast<Gtk::Box *>(child->get_child()); if (box) { std::vector<Gtk::Widget *> contents = box->get_children(); + Gtk::ToggleButton *experimental = dynamic_cast<Gtk::ToggleButton *>(contents[3]); + if (experimental) { + if (experimental->get_active() && !_LPEExperimentals->get_active()) { + return false; + } + } + if (_LPEFilter->get_text().length() < 1) { + _visiblelpe++; + return true; + } Gtk::Label *lpename = dynamic_cast<Gtk::Label *>(contents[1]); if (lpename) { size_t s = lpename->get_text().uppercase().find(_LPEFilter->get_text().uppercase(), 0); @@ -154,10 +239,15 @@ bool LivePathEffectAdd::on_filter(Gtk::FlowBoxChild *child) return false; } +void LivePathEffectAdd::reload_effect_list() +{ + _LPESelectorFlowBox->invalidate_filter(); +} + void LivePathEffectAdd::on_search() { _visiblelpe = 0; - _LPESelectorFlowBox->set_filter_func(sigc::mem_fun(*this, &LivePathEffectAdd::on_filter)); + _LPESelectorFlowBox->invalidate_filter(); if (_visiblelpe == 0) { _LPEInfo->set_text(_("Your search do a empty result, please try again")); _LPEInfo->set_visible(true); @@ -168,6 +258,55 @@ void LivePathEffectAdd::on_search() } } +int LivePathEffectAdd::on_sort(Gtk::FlowBoxChild *child1, Gtk::FlowBoxChild *child2) +{ + Glib::ustring name1 = ""; + Glib::ustring name2 = ""; + Gtk::Box *box = dynamic_cast<Gtk::Box *>(child1->get_child()); + if (box) { + std::vector<Gtk::Widget *> contents = box->get_children(); + Gtk::Label *lpename = dynamic_cast<Gtk::Label *>(contents[1]); + name1 = lpename->get_text(); + Gtk::Overlay *overlay = dynamic_cast<Gtk::Overlay *>(contents[0]); + if (overlay) { + std::vector<Gtk::Widget *> contents_overlay = overlay->get_children(); + Gtk::EventBox *LPESelectorEffectFavLauncherTop = dynamic_cast<Gtk::EventBox *>(contents_overlay[1]); + if (LPESelectorEffectFavLauncherTop) { + if (sp_has_fav(name1)){ + LPESelectorEffectFavLauncherTop->set_visible(true); + LPESelectorEffectFavLauncherTop->show(); + child1->get_style_context()->add_class("lpefav"); + } else { + LPESelectorEffectFavLauncherTop->set_visible(false); + LPESelectorEffectFavLauncherTop->hide(); + child1->get_style_context()->remove_class("lpefav"); + } + } + } + } + box = dynamic_cast<Gtk::Box *>(child2->get_child()); + if (box) { + std::vector<Gtk::Widget *> contents = box->get_children(); + Gtk::Label *lpename = dynamic_cast<Gtk::Label *>(contents[1]); + name2 = lpename->get_text(); + } + + std::vector<Glib::ustring> effect; + effect.push_back(name1); + effect.push_back(name2); + sort(effect.begin(), effect.end()); + if (sp_has_fav(name1) && sp_has_fav(name2)) { + return effect[0] == name1?-1:1; + } + if (sp_has_fav(name1)) { + return -1; + } + if (effect[0] == name1 && !sp_has_fav(name2)) { + return -1; + } + return 1; +} + void LivePathEffectAdd::onAdd() { onClose(); @@ -188,7 +327,12 @@ void LivePathEffectAdd::onKeyEvent(GdkEventKey* evt) void LivePathEffectAdd::show(SPDesktop *desktop) { LivePathEffectAdd &dial = instance(); + dial._LPESelectorFlowBox->invalidate_filter(); + dial._LPESelectorFlowBox->invalidate_sort(); + Glib::RefPtr< Gtk::Adjustment > vadjust = dial._LPEScrolled->get_vadjustment(); + vadjust->set_value(vadjust->get_lower()); dial._LPEDialogSelector->run(); + dial._LPEDialogSelector->hide(); } } // namespace Dialog diff --git a/src/ui/dialog/livepatheffect-add.h b/src/ui/dialog/livepatheffect-add.h index d6369a314..b99c40ece 100644 --- a/src/ui/dialog/livepatheffect-add.h +++ b/src/ui/dialog/livepatheffect-add.h @@ -20,10 +20,14 @@ #include <gtkmm/dialog.h> #include <gtkmm/popover.h> #include <gtkmm/flowbox.h> +#include <gtkmm/switch.h> #include <gtkmm/flowboxchild.h> +#include <gtkmm/scrolledwindow.h> #include <gtkmm/label.h> #include <gtkmm/searchentry.h> #include <gtkmm/stylecontext.h> +#include <gtkmm/overlay.h> +#include <gtkmm/adjustment.h> class SPDesktop; @@ -35,10 +39,10 @@ namespace Dialog { * A dialog widget to list the live path effects that can be added * */ -class LivePathEffectAdd : public Gtk::Dialog { +class LivePathEffectAdd { public: LivePathEffectAdd(); - ~LivePathEffectAdd() override = default; + ~LivePathEffectAdd(){}; /** * Show the dialog @@ -54,9 +58,12 @@ public: */ void onClose(); bool on_filter(Gtk::FlowBoxChild *child); + int on_sort(Gtk::FlowBoxChild *child1, Gtk::FlowBoxChild *child2); void on_search(); void on_activate(Gtk::FlowBoxChild *child); bool pop_description(GdkEventButton* evt, Glib::RefPtr<Gtk::Builder> builder_effect); + bool fav_toggler(GdkEventButton* evt, Glib::RefPtr<Gtk::Builder> builder_effect); + void reload_effect_list(); /** * Add button was clicked */ @@ -77,7 +84,9 @@ private: Glib::RefPtr<Gtk::Builder> _builder; Gtk::FlowBox *_LPESelectorFlowBox; Gtk::Popover *_LPESelectorEffectInfo; + Gtk::Switch * _LPEExperimentals; Gtk::SearchEntry *_LPEFilter; + Gtk::ScrolledWindow *_LPEScrolled; Gtk::Label *_LPEInfo; Gtk::Box *_LPESelector; guint _visiblelpe; |
