17#include <glibmm/i18n.h>
18#include <glibmm/main.h>
19#include <gtkmm/eventcontroller.h>
20#include <gtkmm/eventcontrollerkey.h>
21#include <gtkmm/gestureclick.h>
42 , _close_button(_(
"_Cancel"), true)
44 set_name(
"LayerPropertiesDialog");
75 _close_button.signal_clicked().connect([
this] { destroy(); });
101 dialog->_setLayer(layer);
105 dialog->set_modal(
true);
107 dialog->property_destroy_with_parent() =
true;
206 set_title(_(
"Add Layer"));
215 set_title(_(
"Move to Layer"));
224 set_title(_(
"Rename Layer"));
264 auto &vbox = *Gtk::make_managed<Gtk::Box>(Gtk::Orientation::VERTICAL, 3);
277 _tree.set_headers_visible(
false);
279 auto const eyeRenderer = Gtk::make_managed<UI::Widget::ImageToggler>(INKSCAPE_ICON(
"object-visible"),
280 INKSCAPE_ICON(
"object-hidden"));
281 int visibleColNum =
_tree.append_column(
"vis", *eyeRenderer) - 1;
282 Gtk::TreeViewColumn *col =
_tree.get_column(visibleColNum);
284 col->add_attribute(eyeRenderer->property_active(),
_model.
visible);
287 auto const renderer = Gtk::make_managed<UI::Widget::ImageToggler>(INKSCAPE_ICON(
"object-locked"),
288 INKSCAPE_ICON(
"object-unlocked"));
289 int lockedColNum =
_tree.append_column(
"lock", *renderer) - 1;
290 col =
_tree.get_column(lockedColNum);
292 col->add_attribute(renderer->property_active(),
_model.
locked);
295 auto const _text_renderer = Gtk::make_managed<Gtk::CellRendererText>();
296 int nameColNum =
_tree.append_column(
"Name", *_text_renderer) - 1;
297 Gtk::TreeView::Column *_name_column =
_tree.get_column(nameColNum);
298 _name_column->add_attribute(_text_renderer->property_text(),
_model.
label);
300 _tree.set_expander_column(*
_tree.get_column(nameColNum));
302 auto const key = Gtk::EventControllerKey::create();
306 auto const click = Gtk::GestureClick::create();
307 click->set_button(1);
309 _tree.add_controller(click);
312 _scroller.set_policy(Gtk::PolicyType::AUTOMATIC, Gtk::PolicyType::AUTOMATIC);
331 _scroller.set_propagate_natural_width(
true);
332 _scroller.set_propagate_natural_height(
true);
340 constexpr int max_nest_depth = 20;
341 if (!
_desktop || !layer || level >= max_nest_depth) {
342 g_warn_message(
"Inkscape", __FILE__, __LINE__, __func__,
"Maximum layer nesting reached.");
347 for (
unsigned int i = 0; i <
counter; i++) {
353 g_message(
" %3d layer:%p {%s} [%s]", level,
child,
child->id,
child->label() );
356 Gtk::TreeModel::iterator iter = parentRow ?
_store->prepend(parentRow->children()) :
_store->prepend();
357 Gtk::TreeModel::Row row = *iter;
363 if (target &&
child == target) {
365 Glib::RefPtr<Gtk::TreeSelection> select =
_tree.get_selection();
366 select->select(iter);
375 if (
auto iter =
_tree.get_selection()->get_selected()) {
383 unsigned keyval,
unsigned keycode, Gdk::ModifierType state)
386 switch (latin_keyval) {
388 case GDK_KEY_KP_Enter: {
400 return Gtk::EventSequenceState::CLAIMED;
402 return Gtk::EventSequenceState::NONE;
SPObject * nthChildOf(SPObject *obj, unsigned n) const
unsigned childCount(SPObject *obj) const
static void done(SPDocument *document, Glib::ustring const &event_description, Glib::ustring const &undo_icon, unsigned int object_modified_tag=0)
void renameLayer(SPObject *obj, char const *label, bool uniquify)
void setCurrentLayer(SPObject *object, bool clear=false)
Sets the current layer of the desktop.
SPGroup * currentLayer() const
Returns current top layer.
unsigned getLayerCount() const
Glib::ustring getNextLayerName(SPObject *obj, char const *label)
MessageId flash(MessageType type, char const *message)
Temporarily pushes a message onto the stack.
void clear()
Unselects all selected objects.
void toLayer(SPObject *layer)
Move selection to group moveto, after the last child of moveto (if it has any children).
static Preferences * get()
Access the singleton Preferences object.
void setInt(Glib::ustring const &pref_path, int value)
Set an integer value.
int getIntLimited(Glib::ustring const &pref_path, int def=0, int min=INT_MIN, int max=INT_MAX)
Retrieve a limited integer.
Gtk::EventSequenceState on_click_pressed(int n_press, double x, double y)
Gtk::Button _close_button
void _doCreate()
Creates a new layer based on the input entered in the dialog window.
SPObject * _selectedLayer()
void _doRename()
Renames a layer based on the user input in the dialog window.
void _setLayer(SPObject *layer)
Gtk::Entry _layer_name_entry
static void _showDialog(LayerPropertiesDialogType type, SPDesktop *desktop, SPObject *layer)
Static member function which displays a modal dialog of the given type.
Gtk::Label _layer_position_label
LayerPropertiesDialog(LayerPropertiesDialogType type)
void _setup_layers_controls()
Sets up the tree view of current layers.
Gtk::CellRendererText _label_renderer
bool on_key_pressed(Gtk::EventControllerKey const &controller, unsigned keyval, unsigned keycode, Gdk::ModifierType state)
void _setup_position_controls()
Sets up the combo box for choosing the relative position of the new layer.
void _setup()
Sets up the dialog depending on its type.
PositionDropdownColumns _dropdown_columns
void _setDesktop(SPDesktop *desktop)
~LayerPropertiesDialog() override
Gtk::ScrolledWindow _scroller
Gtk::Button _apply_button
void _doMove()
Moves selection to the chosen layer.
void _apply()
Performs an action depending on the type of the dialog.
void _addLayer(SPObject *layer, Gtk::TreeModel::Row *parentRow, SPObject *target, int level)
Inserts the new layer into the document.
LayerPropertiesDialogType _type
void _prepareLabelRenderer(Gtk::TreeModel::const_iterator const &iter)
Formats the label for a given layer row.
Gtk::CheckButton _layer_position_radio[3]
Glib::RefPtr< Gtk::TreeStore > _store
Gtk::Label _layer_name_label
To do: update description of desktop.
SPDocument * getDocument() const
Inkscape::MessageStack * messageStack() const
Inkscape::Selection * getSelection() const
void setWindowTransient(Gtk::Window &window, int transient_policy=1)
Inkscape::LayerManager & layerManager()
Typed SVG document implementation.
SPRoot * getRoot()
Returns our SPRoot.
Inkscape::Colors::Color highlight_color() const override
Generate a highlight colour if one isn't set and return it.
void setHighlight(Inkscape::Colors::Color color)
bool isHighlightSet() const
SPObject is an abstract base class of all of the document nodes at the SVG document level.
char const * label() const
Gets the author-visible label property for the object or a default if no label is defined.
Utilities to more easily use Gtk::EventController & subclasses like Gesture.
Editable view implementation.
TODO: insert short description here.
Macro for icon names used in Inkscape.
Dialog for renaming layers.
Raw stack of active status messages.
auto use_state(Slot &&slot)
LayerPropertiesDialogType
SPObject * create_layer(SPObject *root, SPObject *layer, LayerRelativePosition position)
Creates a new layer.
static cairo_user_data_key_t key
Singleton class to access the preferences file in a convenient way.
SPObject * sp_object_unref(SPObject *object, SPObject *owner)
Decrease reference count of object, with possible debugging and finalization.
SPObject * sp_object_ref(SPObject *object, SPObject *owner)
Increase reference count of object, with possible debugging.
SPRoot: SVG <svg> implementation.
Gtk::TreeModelColumn< SPObject * > object
Gtk::TreeModelColumn< bool > visible
Gtk::TreeModelColumn< Glib::ustring > label
Gtk::TreeModelColumn< bool > locked
Gtk::TreeModelColumn< Glib::ustring > name