13#include <glibmm/i18n.h>
15#include <gtkmm/button.h>
16#include <gtkmm/cellrenderertext.h>
17#include <gtkmm/cellrenderertoggle.h>
18#include <gtkmm/image.h>
19#include <gtkmm/scrolledwindow.h>
20#include <gtkmm/treemodel.h>
21#include <gtkmm/treestore.h>
22#include <gtkmm/treeview.h>
36class SatelliteArrayParam::ModelColumns :
public Gtk::TreeModel::ColumnRecord
46 Gtk::TreeModelColumn<Glib::ustring> _colObject;
47 Gtk::TreeModelColumn<Glib::ustring> _colLabel;
48 Gtk::TreeModelColumn<bool> _colActive;
80 _tree = std::make_unique<Gtk::TreeView>();
81 _model = std::make_unique<ModelColumns>();
85 _tree->set_reorderable(
true);
86 _tree->enable_model_drag_dest(Gdk::DragAction::MOVE);
88 auto const toggle_active = Gtk::make_managed<Gtk::CellRendererToggle>();
89 int activeColNum =
_tree->append_column(_(
"Active"), *toggle_active) - 1;
90 Gtk::TreeViewColumn *col_active =
_tree->get_column(activeColNum);
91 toggle_active->set_activatable(
true);
93 col_active->add_attribute(toggle_active->property_active(),
_model->_colActive);
95 auto const text_renderer = Gtk::make_managed<Gtk::CellRendererText>();
96 int nameColNum =
_tree->append_column(_(
"Name"), *text_renderer) - 1;
97 auto const name_column =
_tree->get_column(nameColNum);
98 name_column->add_attribute(text_renderer->property_text(),
_model->_colLabel);
100 _tree->set_expander_column(*
_tree->get_column(nameColNum));
103 _scroller = std::make_unique<Gtk::ScrolledWindow>();
107 _scroller->set_policy(Gtk::PolicyType::AUTOMATIC, Gtk::PolicyType::AUTOMATIC);
116 if (
ref &&
ref->isAttached()) {
117 auto item = cast<SPItem>(
ref->getObject());
133 if (!
_updating && (!SP_ACTIVE_DESKTOP || SP_ACTIVE_DESKTOP->getSelection()->includes(linked_obj)) &&
137 flags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG |
138 SP_OBJECT_CHILD_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG))
164 if (
w &&
w->isAttached() &&
w->getObject()) {
165 auto row = *
_store->get_iter(std::to_string(i));
166 Glib::ustring
id =
w->getObject()->getId() ?
w->getObject()->getId() :
"";
167 if (
id == row.get_value(
_model->_colObject)) {
168 auto active = row[
_model->_colActive];
170 w->setActive(active);
195 if (tmpsuccessor && tmpsuccessor->
getId()) {
196 link(tmpsuccessor,pos);
209 auto const iter =
_store->append();
210 Gtk::TreeModel::Row row = *iter;
211 if (
auto obj =
w->getObject()) {
212 row[
_model->_colObject] = Glib::ustring(obj->getId());
213 row[
_model->_colLabel] = obj->label() ? obj->label() : obj->getId();
214 row[
_model->_colActive] =
w->getActive();
230 _tree->get_selection()->select(iter);
238 auto const iter_selected =
_tree->get_selection()->get_selected();
239 if (!iter_selected)
return;
243 if (
w &&
w->isAttached() &&
w->getObject()) {
244 auto const iter =
_store->get_iter(std::to_string(i));
245 if (iter_selected == iter && i > 0) {
273 auto const iter =
_tree->get_selection()->get_selected();
275 Gtk::TreeModel::Row row = *iter;
285 std::vector<Glib::ustring> itemsid;
287 std::vector<Glib::ustring> itemsids = cm->
getElementsOfType(SP_ACTIVE_DESKTOP,
"*", 2);
288 std::vector<Glib::ustring> containers = cm->
getElementsOfType(SP_ACTIVE_DESKTOP,
"*", 1);
290 for (
auto &&
item : std::move(itemsids)) {
292 for (
auto const &citems : containers) {
293 if (citems ==
item) {
298 itemsid.push_back(std::move(
item));
302 if (itemsid.empty()) {
307 if (hreflist.size()) {
308 auto sp_lpe_item = cast<SPLPEItem>(*hreflist.begin());
310 for (
auto &&itemid : std::move(itemsid)) {
312 if (added && sp_lpe_item != added) {
313 itemid.insert(itemid.begin(),
'#');
314 auto satellitereference =
318 satellitereference->setActive(
true);
319 _vector.push_back(std::move(satellitereference));
321 g_warning(
"%s", e.what());
322 satellitereference->detach();
337 auto const vbox = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL);
338 auto const hbox = Gtk::make_managed<Gtk::Box>(Gtk::Orientation::HORIZONTAL);
349 auto const pIcon = Gtk::manage(
sp_get_icon_image(
"edit-clone", Gtk::IconSize::NORMAL));
350 auto const pButton = Gtk::make_managed<Gtk::Button>();
351 pButton->set_has_frame(
false);
352 pButton->set_child(*pIcon);
355 pButton->set_tooltip_text(_(
"Link to item"));
359 auto const pIcon = Gtk::manage(
sp_get_icon_image(
"list-remove", Gtk::IconSize::NORMAL));
360 auto const pButton = Gtk::make_managed<Gtk::Button>();
361 pButton->set_has_frame(
false);
362 pButton->set_child(*pIcon);
365 pButton->set_tooltip_text(_(
"Remove Item"));
369 auto const pIcon = Gtk::manage(
sp_get_icon_image(
"go-down", Gtk::IconSize::NORMAL));
370 auto const pButton = Gtk::make_managed<Gtk::Button>();
371 pButton->set_has_frame(
false);
372 pButton->set_child(*pIcon);
375 pButton->set_tooltip_text(_(
"Move Down"));
379 auto const pIcon = Gtk::manage(
sp_get_icon_image(
"go-up", Gtk::IconSize::NORMAL));
380 auto const pButton = Gtk::make_managed<Gtk::Button>();
381 pButton->set_has_frame(
false);
382 pButton->set_child(*pIcon);
385 pButton->set_tooltip_text(_(
"Move Up"));
395 std::vector<SPObject *> objs;
397 if (iter && iter->isAttached()) {
414 if (obj && obj->
getId()) {
415 Glib::ustring itemid =
"#";
416 itemid += obj->
getId();
417 auto satellitereference =
422 satellitereference->setActive(
true);
424 if (
_vector.size() == pos || pos == Glib::ustring::npos) {
425 _vector.push_back(std::move(satellitereference));
427 _vector[pos] = std::move(satellitereference);
430 g_warning(
"%s", e.what());
431 satellitereference->detach();
443 [=](
auto const &
w){ return w && w->getObject() == obj; });
444 if (it !=
_vector.end()) it->reset();
Glib::ustring param_getSVGValue() const override
std::vector< std::shared_ptr< SatelliteReference > > _vector
bool param_readSVGValue(char const *const strvalue) override
virtual void processObjects(LPEAction lpe_action)
std::vector< SPLPEItem * > getCurrrentLPEItems() const
void makeUndoDone(Glib::ustring message)
LivePathEffectObject * getLPEObj()
virtual void param_widget_is_visible(bool is_visible)
Inkscape::Display::TemporaryItem * ownerlocator
void param_write_to_repr(const char *svgd)
~SatelliteArrayParam() override
Glib::RefPtr< Gtk::TreeStore > _store
void on_down_button_click()
SatelliteArrayParam(const Glib::ustring &label, const Glib::ustring &tip, const Glib::ustring &key, Inkscape::UI::Widget::Registry *wr, Effect *effect, bool visible)
void on_active_toggled(const Glib::ustring &item)
void on_link_button_click()
bool param_readSVGValue(char const *strvalue) override
std::unique_ptr< Gtk::TreeView > _tree
Gtk::Widget * param_newWidget() override
bool _selectIndex(const Gtk::TreeModel::iterator &iter, int *i)
void link(SPObject *to, size_t pos=Glib::ustring::npos)
std::unique_ptr< Gtk::ScrolledWindow > _scroller
std::unique_ptr< ModelColumns > _model
void on_up_button_click()
void unlink(std::shared_ptr< SatelliteReference > const &to)
void linked_modified(SPObject *linked_obj, guint flags)
void move_up_down(int delta, Glib::ustring const &word)
std::vector< SPObject * > param_get_satellites() override
void on_remove_button_click()
std::vector< sigc::scoped_connection > linked_connections
System-wide clipboard manager.
virtual std::vector< Glib::ustring > getElementsOfType(SPDesktop *desktop, gchar const *type="*", gint maxdepth=-1)=0
static ClipboardManager * get()
Represents an URI as per RFC 2396.
To do: update description of desktop.
SPObject * getObjectById(std::string const &id) const
sigc::connection connectTransformed(sigc::slot< void(Geom::Affine const *, SPItem *)> slot)
SPObject is an abstract base class of all of the document nodes at the SVG document level.
char const * getId() const
Returns the objects current ID string.
sigc::connection connectRelease(sigc::slot< void(SPObject *)> slot)
Connects to the release request signal.
std::list< SPObject * > hrefList
sigc::connection connectModified(sigc::slot< void(SPObject *, unsigned int)> slot)
Connects to the modification notification signal.
System-wide clipboard management - class declaration.
Gtk::Image * sp_get_icon_image(Glib::ustring const &icon_name, int size)
Macro for icon names used in Inkscape.
void pack_end(Gtk::Box &box, Gtk::Widget &child, bool const expand, bool const fill, unsigned const padding)
Adds child to box, packed with reference to the end of box.
void pack_start(Gtk::Box &box, Gtk::Widget &child, bool const expand, bool const fill, unsigned const padding)
Adds child to box, packed with reference to the start of box.
static cairo_user_data_key_t key
Helpers for using Gtk::Boxes, encapsulating large changes between GTK3 & GTK4.
Base class for live path effect items.