X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fui%2Fdialog%2Ffilter-effects-dialog.h;h=743ce02395784cb6ebbed8950366a7e6c6fdd18a;hb=da15593ce819c0c0fa2c2adaddebde9de7e0f62c;hp=199e7d9ca712d63c059a0a3e69c6c5ff86a832cc;hpb=02df4842dc780e15999cae54bad38b11ed197b90;p=inkscape.git diff --git a/src/ui/dialog/filter-effects-dialog.h b/src/ui/dialog/filter-effects-dialog.h index 199e7d9ca..743ce0239 100644 --- a/src/ui/dialog/filter-effects-dialog.h +++ b/src/ui/dialog/filter-effects-dialog.h @@ -27,8 +27,7 @@ #include "attributes.h" #include "dialog.h" #include "sp-filter.h" -#include "ui/widget/filter-effect-chooser.h" -#include "ui/widget/notebook-page.h" +#include "ui/widget/combo-enums.h" #include "ui/widget/spin-slider.h" using namespace Inkscape::UI::Widget; @@ -37,31 +36,101 @@ namespace Inkscape { namespace UI { namespace Dialog { +class DualSpinButton; +class MultiSpinButton; class FilterEffectsDialog : public Dialog { public: - FilterEffectsDialog(); - virtual ~FilterEffectsDialog(); - static FilterEffectsDialog *create() { return new FilterEffectsDialog(); } + FilterEffectsDialog(Behavior::BehaviorFactory behavior_factory); + ~FilterEffectsDialog(); + + static FilterEffectsDialog *create(Behavior::BehaviorFactory behavior_factory) + { return new FilterEffectsDialog(behavior_factory); } + + void set_attrs_locked(const bool); private: - class FilterModifier : public Gtk::VBox, public FilterEffectChooser + class SignalObserver; + + class FilterModifier : public Gtk::VBox { public: - FilterModifier(); + FilterModifier(FilterEffectsDialog&); + ~FilterModifier(); + + SPFilter* get_selected_filter(); + void select_filter(const SPFilter*); - virtual SPFilter* get_selected_filter(); - virtual void select_filter(const SPFilter*); - virtual Glib::SignalProxy0 signal_selection_changed(); + sigc::signal& signal_filter_changed() + { + return _signal_filter_changed; + } private: + class Columns : public Gtk::TreeModel::ColumnRecord + { + public: + Columns() + { + add(filter); + add(label); + add(sel); + } + + Gtk::TreeModelColumn filter; + Gtk::TreeModelColumn label; + Gtk::TreeModelColumn sel; + }; + + class CellRendererSel : public Gtk::CellRenderer + { + public: + CellRendererSel(); + + Glib::PropertyProxy property_sel() + { + return _sel.get_proxy(); + } + protected: + virtual void get_size_vfunc(Gtk::Widget&, const Gdk::Rectangle*, + int*, int*, int*, int*) const; + virtual void render_vfunc(const Glib::RefPtr& win, Gtk::Widget& w, + const Gdk::Rectangle& bg_area, const Gdk::Rectangle& cell_area, + const Gdk::Rectangle& expose_area, Gtk::CellRendererState flags); + private: + const int _size; + Glib::Property _sel; + }; + + static void on_activate_desktop(Application*, SPDesktop*, FilterModifier*); + void on_document_replaced(SPDesktop*, SPDocument*) + { + update_filters(); + } + + static void on_inkscape_change_selection(Application *, Selection *, FilterModifier*); + + void update_selection(Selection *); + void on_filter_selection_changed(); + + void update_filters(); + void filter_list_button_press(GdkEventButton*); void filter_list_button_release(GdkEventButton*); void add_filter(); void remove_filter(); void duplicate_filter(); - void filter_name_edited(const Glib::ustring& path, const Glib::ustring& text); + void rename_filter(); + sigc::connection _doc_replaced; + sigc::connection _resource_changed; + + FilterEffectsDialog& _dialog; Gtk::TreeView _list; + Glib::RefPtr _model; + Columns _columns; + CellRendererSel _cell_sel; Gtk::Button _add; Glib::RefPtr _menu; + sigc::signal _signal_filter_changed; + std::auto_ptr _observer; }; class PrimitiveColumns : public Gtk::TreeModel::ColumnRecord @@ -86,15 +155,18 @@ private: public: CellRendererConnection(); Glib::PropertyProxy property_primitive(); - static int input_count(const SPFilterPrimitive* prim); static const int size = 24; + + void set_text_width(const int w); + int get_text_width() const; protected: virtual void get_size_vfunc(Gtk::Widget& widget, const Gdk::Rectangle* cell_area, int* x_offset, int* y_offset, int* width, int* height) const; private: // void* should be SPFilterPrimitive*, some weirdness with properties prevents this Glib::Property _primitive; + int _text_width; }; class PrimitiveList : public Gtk::TreeView @@ -102,7 +174,7 @@ private: public: PrimitiveList(FilterEffectsDialog&); - Glib::SignalProxy0 signal_selection_changed(); + sigc::signal& signal_primitive_changed(); void update(); void set_menu(Glib::RefPtr); @@ -111,48 +183,54 @@ private: void select(SPFilterPrimitive *prim); int primitive_count() const; - bool is_first(const SPFilterPrimitive*) const; protected: - bool on_expose_event(GdkEventExpose*); + bool on_expose_signal(GdkEventExpose*); bool on_button_press_event(GdkEventButton*); bool on_motion_notify_event(GdkEventMotion*); bool on_button_release_event(GdkEventButton*); void on_drag_end(const Glib::RefPtr&); private: + int init_text(); + bool do_connection_node(const Gtk::TreeIter& row, const int input, std::vector& points, const int ix, const int iy); - const Gtk::TreeIter find_result(const Gtk::TreeIter& start, const SPAttributeEnum attr); + const Gtk::TreeIter find_result(const Gtk::TreeIter& start, const int attr, int& src_id); int find_index(const Gtk::TreeIter& target); - void draw_connection(const Gtk::TreeIter&, const int x1, const int y1, const int row_count); + void draw_connection(const Gtk::TreeIter&, const int attr, const int text_start_x, + const int x1, const int y1, const int row_count); + void sanitize_connections(const Gtk::TreeIter& prim_iter); + void on_primitive_selection_changed(); + bool on_scroll_timeout(); FilterEffectsDialog& _dialog; Glib::RefPtr _model; PrimitiveColumns _columns; + CellRendererConnection _connection_cell; Glib::RefPtr _primitive_menu; + Glib::RefPtr _vertical_layout; int _in_drag; + SPFilterPrimitive* _drag_prim; + sigc::signal _signal_primitive_changed; + sigc::connection _scroll_connection; + int _autoscroll; + std::auto_ptr _observer; }; - class SettingsGroup : public Gtk::VBox - { - public: - SettingsGroup(); - - void init(Gtk::VBox& box, Glib::RefPtr sg); - void add_setting(Gtk::Widget& w, const Glib::ustring& label = ""); - void add_setting(std::vector& w, const Glib::ustring& label = ""); - private: - Glib::RefPtr _sizegroup; - }; - + FilterEffectsDialog(); void init_settings_widgets(); // Handlers void add_primitive(); void remove_primitive(); void duplicate_primitive(); + void convolve_order_changed(); - void set_attr(const SPAttributeEnum); + void set_attr_direct(const AttrWidget*); + void set_child_attr_direct(const AttrWidget*); + void set_attr(SPObject*, const SPAttributeEnum, const gchar* val); void update_settings_view(); + void update_settings_sensitivity(); + void update_color_matrix(); // Filter effect selection FilterModifier _filter_modifier; @@ -163,60 +241,32 @@ private: UI::Widget::ComboBoxEnum _add_primitive_type; Gtk::Button _add_primitive; - // Right pane (filter effect primitive settings) - Gtk::VBox _settings; - Glib::RefPtr _settings_labels; + // Bottom pane (filter effect primitive settings) + Gtk::VBox _settings_box; Gtk::Label _empty_settings; - // Generic settings - SettingsGroup _generic_settings; - Gtk::ComboBoxText _primitive_input1; - - SettingsGroup _blend; - UI::Widget::ComboBoxEnum _blend_mode; - - SettingsGroup _colormatrix; - Gtk::ComboBoxText _colormatrix_type; - - SettingsGroup _componenttransfer; - - SettingsGroup _composite; - - SettingsGroup _convolvematrix; - - SettingsGroup _diffuselighting; - - SettingsGroup _displacementmap; - - SettingsGroup _flood; - - SettingsGroup _gaussianblur; - SpinSlider _gaussianblur_stddeviation; - - SettingsGroup _image; - - SettingsGroup _merge; - - SettingsGroup _morphology; - Gtk::ComboBoxText _morphology_operator; - SpinSlider _morphology_radius; + class Settings; + class MatrixAttr; + class ColorMatrixValues; + class LightSourceControl; + Settings* _settings; + Glib::RefPtr _sizegroup; - SettingsGroup _offset; - SpinSlider _offset_dx; - SpinSlider _offset_dy; + // Color Matrix + ColorMatrixValues* _color_matrix_values; - SettingsGroup _specularlighting; + // Convolve Matrix + MatrixAttr* _convolve_matrix; + DualSpinButton* _convolve_order; + MultiSpinButton* _convolve_target; - SettingsGroup _tile; + // For controlling setting sensitivity + Gtk::Widget* _k1, *_k2, *_k3, *_k4; + Gtk::Widget* _ct_table, *_ct_slope, *_ct_intercept, *_ct_amplitude, *_ct_exponent, *_ct_offset; - SettingsGroup _turbulence; - SpinSlider _turbulence_basefrequency; - SpinSlider _turbulence_numoctaves; - SpinSlider _turbulence_seed; - Gtk::CheckButton _turbulence_stitchtiles; - Gtk::RadioButton::Group _turbulence_type; - Gtk::RadioButton _turbulence_fractalnoise; - Gtk::RadioButton _turbulence_turbulence; + // To prevent unwanted signals + bool _locked; + bool _attr_lock; FilterEffectsDialog(FilterEffectsDialog const &d); FilterEffectsDialog& operator=(FilterEffectsDialog const &d);