summaryrefslogtreecommitdiffstats
path: root/src/ui/dialog/attrdialog.h
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 11:50:49 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-13 11:50:49 +0000
commitc853ffb5b2f75f5a889ed2e3ef89b818a736e87a (patch)
tree7d13a0883bb7936b84d6ecdd7bc332b41ed04bee /src/ui/dialog/attrdialog.h
parentInitial commit. (diff)
downloadinkscape-c853ffb5b2f75f5a889ed2e3ef89b818a736e87a.tar.xz
inkscape-c853ffb5b2f75f5a889ed2e3ef89b818a736e87a.zip
Adding upstream version 1.3+ds.upstream/1.3+dsupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/ui/dialog/attrdialog.h')
-rw-r--r--src/ui/dialog/attrdialog.h153
1 files changed, 153 insertions, 0 deletions
diff --git a/src/ui/dialog/attrdialog.h b/src/ui/dialog/attrdialog.h
new file mode 100644
index 0000000..e85d42d
--- /dev/null
+++ b/src/ui/dialog/attrdialog.h
@@ -0,0 +1,153 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/** @file
+ * @brief A dialog for XML attributes based on Gtk TreeView
+ */
+/* Authors:
+ * Martin Owens
+ *
+ * Copyright (C) Martin Owens 2018 <doctormo@gmail.com>
+ *
+ * Released under GNU GPLv2 or later, read the file 'COPYING' for more information
+ */
+
+#ifndef SEEN_UI_DIALOGS_ATTRDIALOG_H
+#define SEEN_UI_DIALOGS_ATTRDIALOG_H
+
+#include <gtkmm/builder.h>
+#include <gtkmm/dialog.h>
+#include <gtkmm/liststore.h>
+#include <gtkmm/popover.h>
+#include <gtkmm/scrolledwindow.h>
+#include <gtkmm/textview.h>
+#include <gtkmm/treeview.h>
+#include <memory>
+
+#include "helper/auto-connection.h"
+#include "inkscape-application.h"
+#include "message.h"
+#include "ui/dialog/dialog-base.h"
+#include "ui/syntax.h"
+#include "xml/node-observer.h"
+
+namespace Inkscape {
+class MessageStack;
+class MessageContext;
+namespace UI {
+namespace Dialog {
+
+/**
+ * @brief The AttrDialog class
+ * This dialog allows to add, delete and modify XML attributes created in the
+ * xml editor.
+ */
+class AttrDialog
+ : public DialogBase
+ , private XML::NodeObserver
+{
+public:
+ AttrDialog();
+ ~AttrDialog() override;
+
+ void setRepr(Inkscape::XML::Node * repr);
+ Gtk::ScrolledWindow& get_scrolled_window() { return _scrolled_window; }
+ Gtk::Box& get_status_box() { return _status_box; }
+ void adjust_popup_edit_size();
+ void set_mono_font(bool mono);
+
+private:
+ // builder comes first, so it is initialized before other data members
+ Glib::RefPtr<Gtk::Builder> _builder;
+
+ // Data structure
+ class AttrColumns : public Gtk::TreeModel::ColumnRecord
+ {
+ public:
+ AttrColumns()
+ {
+ add(_attributeName);
+ add(_attributeValue);
+ add(_attributeValueRender);
+ }
+ Gtk::TreeModelColumn<Glib::ustring> _attributeName;
+ Gtk::TreeModelColumn<Glib::ustring> _attributeValue;
+ Gtk::TreeModelColumn<Glib::ustring> _attributeValueRender;
+ };
+ AttrColumns _attrColumns;
+
+ // TreeView
+ Gtk::TreeView& _treeView;
+ Glib::RefPtr<Gtk::ListStore> _store;
+ Gtk::CellRendererText *_nameRenderer;
+ Gtk::CellRendererText *_valueRenderer;
+ Gtk::TreeViewColumn *_nameCol;
+ Gtk::TreeViewColumn *_valueCol;
+ Gtk::Popover *_popover;
+ Glib::ustring _value_path;
+ Glib::ustring _value_editing;
+ // Status bar
+ std::shared_ptr<Inkscape::MessageStack> _message_stack;
+ std::unique_ptr<Inkscape::MessageContext> _message_context;
+ // Widgets
+ Gtk::ScrolledWindow& _scrolled_window;
+ Gtk::ScrolledWindow& _scrolled_text_view;
+ // Variables - Inkscape
+ Inkscape::XML::Node* _repr{nullptr};
+ Gtk::Box& _status_box;
+ Gtk::Label& _status;
+ bool _updating = true;
+
+ // Helper functions
+ void setUndo(Glib::ustring const &event_description);
+ /**
+ * Sets the XML status bar, depending on which attr is selected.
+ */
+ void attr_reset_context(gint attr);
+
+ /**
+ * Signal handlers
+ */
+ auto_connection _message_changed_connection;
+ bool onNameKeyPressed(GdkEventKey *event, Gtk::Entry *entry);
+ bool onValueKeyPressed(GdkEventKey *event, Gtk::Entry *entry);
+ void onAttrDelete(Glib::ustring path);
+ bool onAttrCreate(GdkEventButton *event);
+ bool onKeyPressed(GdkEventKey *event);
+ void truncateDigits() const;
+ void popClosed();
+ void startNameEdit(Gtk::CellEditable *cell, const Glib::ustring &path);
+ void startValueEdit(Gtk::CellEditable *cell, const Glib::ustring &path);
+ void nameEdited(const Glib::ustring &path, const Glib::ustring &name);
+ void valueEdited(const Glib::ustring &path, const Glib::ustring &value);
+ void valueEditedPop();
+ void storeMoveToNext(Gtk::TreeModel::Path modelpath);
+
+private:
+ // Text/comment nodes
+ Gtk::ScrolledWindow& _content_sw;
+ std::unique_ptr<Syntax::TextEditView> _text_edit; // text content editing (plain text)
+ std::unique_ptr<Syntax::TextEditView> _style_edit; // embedded CSS style (with syntax coloring)
+
+ // Attribute value editing
+ std::unique_ptr<Syntax::TextEditView> _css_edit; // in-line CSS style
+ std::unique_ptr<Syntax::TextEditView> _svgd_edit; // SVG path data
+ std::unique_ptr<Syntax::TextEditView> _points_edit; // points in a <polygon> or <polyline>
+ std::unique_ptr<Syntax::TextEditView> _attr_edit; // all other attributes (plain text)
+ Syntax::TextEditView* _current_text_edit = nullptr; // current text edit for attribute value editing
+ auto_connection _adjust_size;
+ auto_connection _close_popup;
+ int _rounding_precision = 0;
+
+ bool key_callback(GdkEventKey* event);
+ void notifyAttributeChanged(XML::Node &repr, GQuark name, Util::ptr_shared old_value, Util::ptr_shared new_value) final;
+ void notifyContentChanged(XML::Node &node, Util::ptr_shared old_content, Util::ptr_shared new_content) final;
+ static Glib::ustring round_numbers(const Glib::ustring& text, int precision);
+ Gtk::TextView &_activeTextView() const;
+ void set_current_textedit(Syntax::TextEditView* edit);
+ static std::unique_ptr<Syntax::TextEditView> init_text_view(AttrDialog* owner, Syntax::SyntaxMode coloring, bool map);
+};
+
+} // namespace Dialog
+} // namespace UI
+} // namespace Inkscape
+
+#endif // SEEN_UI_DIALOGS_ATTRDIALOG_H