diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:24:48 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 18:24:48 +0000 |
commit | cca66b9ec4e494c1d919bff0f71a820d8afab1fa (patch) | |
tree | 146f39ded1c938019e1ed42d30923c2ac9e86789 /src/ui/dialog/filter-effects-dialog.h | |
parent | Initial commit. (diff) | |
download | inkscape-cca66b9ec4e494c1d919bff0f71a820d8afab1fa.tar.xz inkscape-cca66b9ec4e494c1d919bff0f71a820d8afab1fa.zip |
Adding upstream version 1.2.2.upstream/1.2.2upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r-- | src/ui/dialog/filter-effects-dialog.h | 333 |
1 files changed, 333 insertions, 0 deletions
diff --git a/src/ui/dialog/filter-effects-dialog.h b/src/ui/dialog/filter-effects-dialog.h new file mode 100644 index 0000000..3970c43 --- /dev/null +++ b/src/ui/dialog/filter-effects-dialog.h @@ -0,0 +1,333 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/** @file + * @brief Filter Effects dialog + */ +/* Authors: + * Nicholas Bishop <nicholasbishop@gmail.com> + * Rodrigo Kumpera <kumpera@gmail.com> + * insaner + * + * Copyright (C) 2007 Authors + * + * Released under GNU GPL v2+, read the file 'COPYING' for more information. + */ + +#ifndef INKSCAPE_UI_DIALOG_FILTER_EFFECTS_H +#define INKSCAPE_UI_DIALOG_FILTER_EFFECTS_H + +#include <glibmm/property.h> +#include <glibmm/propertyproxy.h> +#include <gtkmm/notebook.h> +#include <gtkmm/paned.h> +#include <gtkmm/scrolledwindow.h> +#include <memory> + +#include "attributes.h" +#include "display/nr-filter-types.h" +#include "helper/auto-connection.h" +#include "ui/dialog/dialog-base.h" +#include "ui/widget/combo-enums.h" +#include "ui/widget/spin-scale.h" +#include "xml/helper-observer.h" + +class SPFilter; +class SPFilterPrimitive; + +namespace Inkscape { +namespace UI { +namespace Dialog { + +class EntryAttr; +class FileOrElementChooser; +class DualSpinButton; +class MultiSpinButton; + +class FilterEffectsDialog : public DialogBase +{ +public: + FilterEffectsDialog(); + ~FilterEffectsDialog() override; + + static FilterEffectsDialog &getInstance() { return *new FilterEffectsDialog(); } + + void set_attrs_locked(const bool); +protected: + void show_all_vfunc() override; +private: + + void documentReplaced() override; + void selectionChanged(Inkscape::Selection *selection) override; + void selectionModified(Inkscape::Selection *selection, guint flags) override; + + Inkscape::auto_connection _resource_changed; + + friend class FileOrElementChooser; + + class FilterModifier : public Gtk::Box + { + public: + FilterModifier(FilterEffectsDialog&); + + void update_filters(); + void update_selection(Selection *); + + SPFilter* get_selected_filter(); + void select_filter(const SPFilter*); + + sigc::signal<void>& signal_filter_changed() + { + return _signal_filter_changed; + } + + private: + class Columns : public Gtk::TreeModel::ColumnRecord + { + public: + Columns() + { + add(filter); + add(label); + add(sel); + add(count); + } + + Gtk::TreeModelColumn<SPFilter*> filter; + Gtk::TreeModelColumn<Glib::ustring> label; + Gtk::TreeModelColumn<int> sel; + Gtk::TreeModelColumn<int> count; + }; + + void on_filter_selection_changed(); + void on_name_edited(const Glib::ustring&, const Glib::ustring&); + bool on_filter_move(const Glib::RefPtr<Gdk::DragContext>& /*context*/, int x, int y, guint /*time*/); + void on_selection_toggled(const Glib::ustring&); + + void update_counts(); + void filter_list_button_release(GdkEventButton*); + void add_filter(); + void remove_filter(); + void duplicate_filter(); + void rename_filter(); + void select_filter_elements(); + + FilterEffectsDialog& _dialog; + Gtk::TreeView _list; + Glib::RefPtr<Gtk::ListStore> _model; + Columns _columns; + Gtk::CellRendererToggle _cell_toggle; + Gtk::Button _add; + Gtk::Menu *_menu; + sigc::signal<void> _signal_filter_changed; + std::unique_ptr<Inkscape::XML::SignalObserver> _observer; + }; + + class PrimitiveColumns : public Gtk::TreeModel::ColumnRecord + { + public: + PrimitiveColumns() + { + add(primitive); + add(type_id); + add(type); + add(id); + } + + Gtk::TreeModelColumn<SPFilterPrimitive*> primitive; + Gtk::TreeModelColumn<Inkscape::Filters::FilterPrimitiveType> type_id; + Gtk::TreeModelColumn<Glib::ustring> type; + Gtk::TreeModelColumn<Glib::ustring> id; + }; + + class CellRendererConnection : public Gtk::CellRenderer + { + public: + CellRendererConnection(); + Glib::PropertyProxy<void*> property_primitive(); + + static const int size = 24; + + protected: + void get_preferred_width_vfunc(Gtk::Widget& widget, + int& minimum_width, + int& natural_width) const override; + + void get_preferred_width_for_height_vfunc(Gtk::Widget& widget, + int height, + int& minimum_width, + int& natural_width) const override; + + void get_preferred_height_vfunc(Gtk::Widget& widget, + int& minimum_height, + int& natural_height) const override; + + void get_preferred_height_for_width_vfunc(Gtk::Widget& widget, + int width, + int& minimum_height, + int& natural_height) const override; + private: + // void* should be SPFilterPrimitive*, some weirdness with properties prevents this + Glib::Property<void*> _primitive; + }; + + class PrimitiveList : public Gtk::TreeView + { + public: + PrimitiveList(FilterEffectsDialog&); + + sigc::signal<void>& signal_primitive_changed(); + + void update(); + void set_menu(Gtk::Widget &parent, + sigc::slot<void> dup, + sigc::slot<void> rem); + + SPFilterPrimitive* get_selected(); + void select(SPFilterPrimitive *prim); + void remove_selected(); + + int primitive_count() const; + int get_input_type_width() const; + + protected: + bool on_draw_signal(const Cairo::RefPtr<Cairo::Context> &cr); + + + bool on_button_press_event(GdkEventButton*) override; + bool on_motion_notify_event(GdkEventMotion*) override; + bool on_button_release_event(GdkEventButton*) override; + void on_drag_end(const Glib::RefPtr<Gdk::DragContext>&) override; + private: + void init_text(); + + void draw_connection_node(const Cairo::RefPtr<Cairo::Context>& cr, + const std::vector<Gdk::Point>& points, + const bool fill); + + bool do_connection_node(const Gtk::TreeIter& row, const int input, std::vector<Gdk::Point>& points, + const int ix, const int iy); + + const Gtk::TreeIter find_result(const Gtk::TreeIter& start, const SPAttr attr, int& src_id, const int pos); + int find_index(const Gtk::TreeIter& target); + void draw_connection(const Cairo::RefPtr<Cairo::Context>& cr, + const Gtk::TreeIter&, const SPAttr attr, const int text_start_x, + const int x1, const int y1, const int row_count, const int pos, + const Gdk::RGBA fg_color, const Gdk::RGBA mid_color); + void sanitize_connections(const Gtk::TreeIter& prim_iter); + void on_primitive_selection_changed(); + bool on_scroll_timeout(); + + FilterEffectsDialog& _dialog; + Glib::RefPtr<Gtk::ListStore> _model; + PrimitiveColumns _columns; + CellRendererConnection _connection_cell; + Gtk::Menu *_primitive_menu; + Glib::RefPtr<Pango::Layout> _vertical_layout; + int _in_drag; + SPFilterPrimitive* _drag_prim; + sigc::signal<void> _signal_primitive_changed; + sigc::connection _scroll_connection; + int _autoscroll_y; + int _autoscroll_x; + std::unique_ptr<Inkscape::XML::SignalObserver> _observer; + int _input_type_width; + int _input_type_height; + }; + + void init_settings_widgets(); + + // Handlers + void add_primitive(); + void remove_primitive(); + void duplicate_primitive(); + void convolve_order_changed(); + void image_x_changed(); + void image_y_changed(); + + void set_attr_direct(const UI::Widget::AttrWidget*); + void set_child_attr_direct(const UI::Widget::AttrWidget*); + void set_filternode_attr(const UI::Widget::AttrWidget*); + void set_attr(SPObject*, const SPAttr, const gchar* val); + void update_settings_view(); + void update_filter_general_settings_view(); + void update_settings_sensitivity(); + void update_color_matrix(); + void update_automatic_region(Gtk::CheckButton *btn); + void update_primitive_infobox(); + + // Primitives Info Box + Gtk::Label _infobox_desc; + Gtk::Image _infobox_icon; + Gtk::ScrolledWindow* _sw_infobox; + + // View/add primitives + Gtk::Paned* _primitive_box; + + UI::Widget::ComboBoxEnum<Inkscape::Filters::FilterPrimitiveType> _add_primitive_type; + Gtk::Button _add_primitive; + + // Bottom pane (filter effect primitive settings) + Gtk::Notebook _settings_tabs; + Gtk::Box _settings_tab2; + Gtk::Box _settings_tab1; + Gtk::Label _empty_settings; + Gtk::Label _no_filter_selected; + bool _settings_initialized; + + class Settings; + class MatrixAttr; + class ColorMatrixValues; + class ComponentTransferValues; + class LightSourceControl; + Settings* _settings; + Settings* _filter_general_settings; + + // General settings + MultiSpinButton *_region_pos, *_region_size; + + // Color Matrix + ColorMatrixValues* _color_matrix_values; + + // Component Transfer + ComponentTransferValues* _component_transfer_values; + + // Convolve Matrix + MatrixAttr* _convolve_matrix; + DualSpinButton* _convolve_order; + MultiSpinButton* _convolve_target; + + // Image + EntryAttr* _image_x; + EntryAttr* _image_y; + + // For controlling setting sensitivity + Gtk::Widget* _k1, *_k2, *_k3, *_k4; + + // To prevent unwanted signals + bool _locked; + bool _attr_lock; + + // These go last since they depend on the prior initialization of + // other FilterEffectsDialog members + FilterModifier _filter_modifier; + PrimitiveList _primitive_list; + + FilterEffectsDialog(FilterEffectsDialog const &d); + FilterEffectsDialog& operator=(FilterEffectsDialog const &d); +}; + +} // namespace Dialog +} // namespace UI +} // namespace Inkscape + +#endif // INKSCAPE_UI_DIALOG_FILTER_EFFECTS_H + +/* + 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 : |