0bd47b52ffed401d486750247c8622ff805d0a96
1 /**
2 * \brief Filter Effects dialog
3 *
4 * Authors:
5 * Nicholas Bishop <nicholasbishop@gmail.com>
6 * Rodrigo Kumpera <kumpera@gmail.com>
7 *
8 * Copyright (C) 2007 Authors
9 *
10 * Released under GNU GPL. Read the file 'COPYING' for more information.
11 */
13 #ifndef INKSCAPE_UI_DIALOG_FILTER_EFFECTS_H
14 #define INKSCAPE_UI_DIALOG_FILTER_EFFECTS_H
16 #include <memory>
18 #include <gtkmm/adjustment.h>
19 #include <gtkmm/alignment.h>
20 #include <gtkmm/box.h>
21 #include <gtkmm/buttonbox.h>
22 #include <gtkmm/comboboxtext.h>
23 #include <gtkmm/drawingarea.h>
24 #include <gtkmm/frame.h>
25 #include <gtkmm/liststore.h>
26 #include <gtkmm/menu.h>
27 #include <gtkmm/notebook.h>
28 #include <gtkmm/sizegroup.h>
29 #include <gtkmm/treeview.h>
31 #include "attributes.h"
32 #include "ui/widget/panel.h"
33 #include "sp-filter.h"
34 #include "ui/widget/combo-enums.h"
35 #include "ui/widget/spin-slider.h"
37 using namespace Inkscape::UI::Widget;
39 namespace Inkscape {
40 namespace UI {
41 namespace Dialog {
43 class DualSpinButton;
44 class MultiSpinButton;
45 class FilterEffectsDialog : public UI::Widget::Panel {
46 public:
48 FilterEffectsDialog();
49 ~FilterEffectsDialog();
51 static FilterEffectsDialog &getInstance()
52 { return *new FilterEffectsDialog(); }
54 void set_attrs_locked(const bool);
55 protected:
56 virtual void show_all_vfunc();
57 private:
58 class SignalObserver;
60 class FilterModifier : public Gtk::VBox
61 {
62 public:
63 FilterModifier(FilterEffectsDialog&);
64 ~FilterModifier();
66 SPFilter* get_selected_filter();
67 void select_filter(const SPFilter*);
69 sigc::signal<void>& signal_filter_changed()
70 {
71 return _signal_filter_changed;
72 }
73 private:
74 class Columns : public Gtk::TreeModel::ColumnRecord
75 {
76 public:
77 Columns()
78 {
79 add(filter);
80 add(label);
81 add(sel);
82 }
84 Gtk::TreeModelColumn<SPFilter*> filter;
85 Gtk::TreeModelColumn<Glib::ustring> label;
86 Gtk::TreeModelColumn<int> sel;
87 };
89 static void on_activate_desktop(Application*, SPDesktop*, FilterModifier*);
90 void on_document_replaced(SPDesktop*, SPDocument*)
91 {
92 update_filters();
93 }
95 static void on_inkscape_change_selection(Application *, Selection *, FilterModifier*);
97 void update_selection(Selection *);
98 void on_filter_selection_changed();
100 void on_name_edited(const Glib::ustring&, const Glib::ustring&);
101 void on_selection_toggled(const Glib::ustring&);
103 void update_filters();
104 void filter_list_button_release(GdkEventButton*);
105 void add_filter();
106 void remove_filter();
107 void duplicate_filter();
108 void rename_filter();
110 sigc::connection _doc_replaced;
111 sigc::connection _resource_changed;
113 FilterEffectsDialog& _dialog;
114 Gtk::TreeView _list;
115 Glib::RefPtr<Gtk::ListStore> _model;
116 Columns _columns;
117 Gtk::CellRendererToggle _cell_toggle;
118 Gtk::Button _add;
119 Glib::RefPtr<Gtk::Menu> _menu;
120 sigc::signal<void> _signal_filter_changed;
121 std::auto_ptr<SignalObserver> _observer;
122 };
124 class PrimitiveColumns : public Gtk::TreeModel::ColumnRecord
125 {
126 public:
127 PrimitiveColumns()
128 {
129 add(primitive);
130 add(type_id);
131 add(type);
132 add(id);
133 }
135 Gtk::TreeModelColumn<SPFilterPrimitive*> primitive;
136 Gtk::TreeModelColumn<NR::FilterPrimitiveType> type_id;
137 Gtk::TreeModelColumn<Glib::ustring> type;
138 Gtk::TreeModelColumn<Glib::ustring> id;
139 };
141 class CellRendererConnection : public Gtk::CellRenderer
142 {
143 public:
144 CellRendererConnection();
145 Glib::PropertyProxy<void*> property_primitive();
147 static const int size = 24;
149 void set_text_width(const int w);
150 int get_text_width() const;
151 protected:
152 virtual void get_size_vfunc(Gtk::Widget& widget, const Gdk::Rectangle* cell_area,
153 int* x_offset, int* y_offset, int* width, int* height) const;
154 private:
155 // void* should be SPFilterPrimitive*, some weirdness with properties prevents this
156 Glib::Property<void*> _primitive;
157 int _text_width;
158 };
160 class PrimitiveList : public Gtk::TreeView
161 {
162 public:
163 PrimitiveList(FilterEffectsDialog&);
165 sigc::signal<void>& signal_primitive_changed();
167 void update();
168 void set_menu(Glib::RefPtr<Gtk::Menu>);
170 SPFilterPrimitive* get_selected();
171 void select(SPFilterPrimitive *prim);
172 void remove_selected();
174 int primitive_count() const;
175 protected:
176 bool on_expose_signal(GdkEventExpose*);
177 bool on_button_press_event(GdkEventButton*);
178 bool on_motion_notify_event(GdkEventMotion*);
179 bool on_button_release_event(GdkEventButton*);
180 void on_drag_end(const Glib::RefPtr<Gdk::DragContext>&);
181 private:
182 int init_text();
184 bool do_connection_node(const Gtk::TreeIter& row, const int input, std::vector<Gdk::Point>& points,
185 const int ix, const int iy);
186 const Gtk::TreeIter find_result(const Gtk::TreeIter& start, const int attr, int& src_id);
187 int find_index(const Gtk::TreeIter& target);
188 void draw_connection(const Gtk::TreeIter&, const int attr, const int text_start_x,
189 const int x1, const int y1, const int row_count);
190 void sanitize_connections(const Gtk::TreeIter& prim_iter);
191 void on_primitive_selection_changed();
192 bool on_scroll_timeout();
194 FilterEffectsDialog& _dialog;
195 Glib::RefPtr<Gtk::ListStore> _model;
196 PrimitiveColumns _columns;
197 CellRendererConnection _connection_cell;
198 Glib::RefPtr<Gtk::Menu> _primitive_menu;
199 Glib::RefPtr<Pango::Layout> _vertical_layout;
200 int _in_drag;
201 SPFilterPrimitive* _drag_prim;
202 sigc::signal<void> _signal_primitive_changed;
203 sigc::connection _scroll_connection;
204 int _autoscroll;
205 std::auto_ptr<SignalObserver> _observer;
206 };
208 void init_settings_widgets();
210 // Handlers
211 void add_primitive();
212 void remove_primitive();
213 void duplicate_primitive();
214 void convolve_order_changed();
216 void set_attr_direct(const AttrWidget*);
217 void set_child_attr_direct(const AttrWidget*);
218 void set_filternode_attr(const AttrWidget*);
219 void set_attr(SPObject*, const SPAttributeEnum, const gchar* val);
220 void update_settings_view();
221 void update_filter_general_settings_view();
222 void update_settings_sensitivity();
223 void update_color_matrix();
224 void update_primitive_infobox();
226 // Filter effect selection
227 FilterModifier _filter_modifier;
229 // Primitives Info Box
230 Gtk::Label _infobox_desc;
231 Gtk::Image _infobox_icon;
233 // View/add primitives
234 Gtk::VBox _primitive_box;
235 PrimitiveList _primitive_list;
236 UI::Widget::ComboBoxEnum<NR::FilterPrimitiveType> _add_primitive_type;
237 Gtk::Button _add_primitive;
239 // Bottom pane (filter effect primitive settings)
240 Gtk::Notebook _settings_tabs;
241 Gtk::VBox _settings_tab2;
242 Gtk::VBox _settings_tab1;
243 Gtk::Label _empty_settings;
244 Gtk::Label _no_filter_selected;
245 bool _settings_initialized;
246 class Settings;
247 class MatrixAttr;
248 class ColorMatrixValues;
249 class LightSourceControl;
250 Settings* _settings;
251 Settings* _filter_general_settings;
252 Glib::RefPtr<Gtk::SizeGroup> _sizegroup;
254 // Color Matrix
255 ColorMatrixValues* _color_matrix_values;
257 // Convolve Matrix
258 MatrixAttr* _convolve_matrix;
259 DualSpinButton* _convolve_order;
260 MultiSpinButton* _convolve_target;
262 // For controlling setting sensitivity
263 Gtk::Widget* _k1, *_k2, *_k3, *_k4;
264 Gtk::Widget* _ct_table, *_ct_slope, *_ct_intercept, *_ct_amplitude, *_ct_exponent, *_ct_offset;
266 // To prevent unwanted signals
267 bool _locked;
268 bool _attr_lock;
270 FilterEffectsDialog(FilterEffectsDialog const &d);
271 FilterEffectsDialog& operator=(FilterEffectsDialog const &d);
272 };
274 } // namespace Dialog
275 } // namespace UI
276 } // namespace Inkscape
278 #endif // INKSCAPE_UI_DIALOG_FILTER_EFFECTS_H
280 /*
281 Local Variables:
282 mode:c++
283 c-file-style:"stroustrup"
284 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
285 indent-tabs-mode:nil
286 fill-column:99
287 End:
288 */
289 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :