diff options
| author | Nicholas Bishop <nicholasbishop@gmail.com> | 2007-07-14 20:55:43 +0000 |
|---|---|---|
| committer | nicholasbishop <nicholasbishop@users.sourceforge.net> | 2007-07-14 20:55:43 +0000 |
| commit | 28d142f1596cfa9e4dd6b63509205d528394c779 (patch) | |
| tree | f0285a821f510a0193ff2c78bd5e6627e3c2f075 /src/ui | |
| parent | Move check for unlinked paths of 3D box faces to the correct location (diff) | |
| download | inkscape-28d142f1596cfa9e4dd6b63509205d528394c779.tar.gz inkscape-28d142f1596cfa9e4dd6b63509205d528394c779.zip | |
Filter effects:
* As coded by Johan Engelen, made the filter-effect-enums code more generic; the data and conversion classes are now in src/util, filter-specific data is in filter-enums.h
* Improved filter_add_primitive so that default values are filled in appropriately to prevent errors or possible crashes
(bzr r3241)
Diffstat (limited to 'src/ui')
| -rw-r--r-- | src/ui/dialog/filter-effects-dialog.cpp | 53 | ||||
| -rw-r--r-- | src/ui/dialog/filter-effects-dialog.h | 2 | ||||
| -rw-r--r-- | src/ui/widget/Makefile_insert | 2 | ||||
| -rw-r--r-- | src/ui/widget/combo-enums.h | 94 | ||||
| -rw-r--r-- | src/ui/widget/filter-effect-chooser.cpp | 43 | ||||
| -rw-r--r-- | src/ui/widget/filter-effect-chooser.h | 3 | ||||
| -rw-r--r-- | src/ui/widget/filter-effect-enums.h | 161 |
7 files changed, 104 insertions, 254 deletions
diff --git a/src/ui/dialog/filter-effects-dialog.cpp b/src/ui/dialog/filter-effects-dialog.cpp index cd6aa986a..a2ae18f6f 100644 --- a/src/ui/dialog/filter-effects-dialog.cpp +++ b/src/ui/dialog/filter-effects-dialog.cpp @@ -283,7 +283,7 @@ void FilterEffectsDialog::PrimitiveList::update() if(prim) { Gtk::TreeModel::Row row = *_model->append(); row[_columns.primitive] = prim; - row[_columns.type_id] = FPConverter.get_id_from_name(prim->repr->name()); + row[_columns.type_id] = FPConverter.get_id_from_key(prim->repr->name()); row[_columns.type] = FPConverter.get_label(row[_columns.type_id]); row[_columns.id] = SP_OBJECT_ID(prim); @@ -824,52 +824,9 @@ void FilterEffectsDialog::init_settings_widgets() void FilterEffectsDialog::add_primitive() { SPFilter* filter = _filter_modifier.get_selected_filter(); - const EnumData<NR::FilterPrimitiveType>* data = _add_primitive_type.get_active_data(); - if(filter && data) { - SPFilterPrimitive* prim = filter_add_primitive(filter, data->name.c_str()); - - // Set default values - switch(data->id) { - case NR::NR_FILTER_BLEND: - sp_object_set(prim, SP_ATTR_MODE, BlendModeConverter.get_name(NR::BLEND_NORMAL).c_str()); - break; - case NR::NR_FILTER_COLORMATRIX: - break; - case NR::NR_FILTER_COMPONENTTRANSFER: - break; - case NR::NR_FILTER_COMPOSITE: - break; - case NR::NR_FILTER_CONVOLVEMATRIX: - break; - case NR::NR_FILTER_DIFFUSELIGHTING: - break; - case NR::NR_FILTER_DISPLACEMENTMAP: - break; - case NR::NR_FILTER_FLOOD: - break; - case NR::NR_FILTER_GAUSSIANBLUR: - sp_object_set(prim, SP_ATTR_STDDEVIATION, "1"); - break; - case NR::NR_FILTER_IMAGE: - break; - case NR::NR_FILTER_MERGE: - break; - case NR::NR_FILTER_MORPHOLOGY: - break; - case NR::NR_FILTER_OFFSET: - sp_object_set(prim, SP_ATTR_DX, "0"); - sp_object_set(prim, SP_ATTR_DY, "0"); - break; - case NR::NR_FILTER_SPECULARLIGHTING: - break; - case NR::NR_FILTER_TILE: - break; - case NR::NR_FILTER_TURBULENCE: - break; - default: - break; - } + if(filter) { + SPFilterPrimitive* prim = filter_add_primitive(filter, _add_primitive_type.get_active_data()->id); _primitive_list.update(); _primitive_list.select(prim); @@ -979,7 +936,7 @@ void FilterEffectsDialog::update_settings_view() _empty_settings.show(); if(prim) { - const NR::FilterPrimitiveType tid = FPConverter.get_id_from_name(prim->repr->name()); + const NR::FilterPrimitiveType tid = FPConverter.get_id_from_key(prim->repr->name()); _generic_settings.show_all(); _primitive_input1.set_active_input(SP_OBJECT_REPR(prim)->attribute("in")); @@ -989,7 +946,7 @@ void FilterEffectsDialog::update_settings_view() _blend.show_all(); const gchar* val = prim->repr->attribute("mode"); if(val) - _blend_mode.set_active(BlendModeConverter.get_id_from_name(val)); + _blend_mode.set_active(BlendModeConverter.get_id_from_key(val)); } else if(tid == NR::NR_FILTER_COLORMATRIX) _colormatrix.show_all(); diff --git a/src/ui/dialog/filter-effects-dialog.h b/src/ui/dialog/filter-effects-dialog.h index 78b2eeb38..ab30268dd 100644 --- a/src/ui/dialog/filter-effects-dialog.h +++ b/src/ui/dialog/filter-effects-dialog.h @@ -171,7 +171,7 @@ private: template<typename T> void set_attr_comboboxenum(const SPAttributeEnum attr, ComboBoxEnum<T>* input) { if(input->is_sensitive()) - set_attr(attr, input->get_active_data()->name.c_str()); + set_attr(attr, input->get_active_data()->key.c_str()); } void set_attr_special(const SPAttributeEnum); void set_attr(const SPAttributeEnum, const gchar* val); diff --git a/src/ui/widget/Makefile_insert b/src/ui/widget/Makefile_insert index 72fb9cfc2..11c18738c 100644 --- a/src/ui/widget/Makefile_insert +++ b/src/ui/widget/Makefile_insert @@ -12,6 +12,7 @@ ui_widget_libuiwidget_a_SOURCES = \ ui/widget/color-picker.h \ ui/widget/color-preview.cpp \ ui/widget/color-preview.h \ + ui/widget/combo-enums.h \ ui/widget/combo-text.cpp \ ui/widget/combo-text.h \ ui/widget/entity-entry.cpp \ @@ -20,7 +21,6 @@ ui_widget_libuiwidget_a_SOURCES = \ ui/widget/entry.h \ ui/widget/filter-effect-chooser.h \ ui/widget/filter-effect-chooser.cpp \ - ui/widget/filter-effect-enums.h \ ui/widget/handlebox.cpp \ ui/widget/handlebox.h \ ui/widget/icon-widget.cpp \ diff --git a/src/ui/widget/combo-enums.h b/src/ui/widget/combo-enums.h new file mode 100644 index 000000000..826f13e69 --- /dev/null +++ b/src/ui/widget/combo-enums.h @@ -0,0 +1,94 @@ +/** + * \brief Simplified management of enumerations in the UI as combobox. + * + * Authors: + * Nicholas Bishop <nicholasbishop@gmail.com> + * Johan Engelen <j.b.c.engelen@ewi.utwente.nl> + * + * Copyright (C) 2007 Authors + * + * Released under GNU GPL. Read the file 'COPYING' for more information. + */ + +#ifndef INKSCAPE_UI_WIDGET_COMBO_ENUMS_H +#define INKSCAPE_UI_WIDGET_COMBO_ENUMS_H + +#include <gtkmm/combobox.h> +#include <gtkmm/liststore.h> +#include "util/enums.h" + +namespace Inkscape { +namespace UI { +namespace Widget { + +template<typename E> class ComboBoxEnum : public Gtk::ComboBox +{ +public: + ComboBoxEnum(const Util::EnumDataConverter<E>& c) + : _converter(c) + { + _model = Gtk::ListStore::create(_columns); + set_model(_model); + + pack_start(_columns.label); + + // Initialize list + for(int i = 0; i < _converter.end; ++i) { + Gtk::TreeModel::Row row = *_model->append(); + const Util::EnumData<E>* data = &_converter.data(i); + row[_columns.data] = data; + row[_columns.label] = _converter.get_label(data->id); + } + + set_active(0); + } + + const Util::EnumData<E>* get_active_data() + { + Gtk::TreeModel::iterator i = this->get_active(); + if(i) + return (*i)[_columns.data]; + return 0; + } + + void add_row(const Glib::ustring& s) + { + Gtk::TreeModel::Row row = *_model->append(); + row[_columns.data] = 0; + row[_columns.label] = s; + } +private: + class Columns : public Gtk::TreeModel::ColumnRecord + { + public: + Columns() + { + add(data); + add(label); + } + + Gtk::TreeModelColumn<const Util::EnumData<E>*> data; + Gtk::TreeModelColumn<Glib::ustring> label; + }; + + Columns _columns; + Glib::RefPtr<Gtk::ListStore> _model; + const Util::EnumDataConverter<E>& _converter; +}; + +} +} +} + +#endif + +/* + 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:encoding=utf-8:textwidth=99 : diff --git a/src/ui/widget/filter-effect-chooser.cpp b/src/ui/widget/filter-effect-chooser.cpp index 005e2c2dc..9cc235895 100644 --- a/src/ui/widget/filter-effect-chooser.cpp +++ b/src/ui/widget/filter-effect-chooser.cpp @@ -155,7 +155,7 @@ sigc::signal<void>& SimpleFilterModifier::signal_blend_blur_changed() const Glib::ustring SimpleFilterModifier::get_blend_mode() { - return _blend.get_active_row_number() == 5 ? "filter" : _blend.get_active_data()->name; + return _blend.get_active_row_number() == 5 ? "filter" : _blend.get_active_data()->key; } void SimpleFilterModifier::set_blend_mode(const int val) @@ -215,47 +215,6 @@ void SimpleFilterModifier::blend_mode_changed() } } -/*** From filter-effect-enums.h ***/ -const EnumData<NR::FilterPrimitiveType> FPData[NR::NR_FILTER_ENDPRIMITIVETYPE] = { - {NR::NR_FILTER_BLEND, _("Blend"), "svg:feBlend"}, - {NR::NR_FILTER_COLORMATRIX, _("Color Matrix"), "svg:feColorMatrix"}, - {NR::NR_FILTER_COMPONENTTRANSFER, _("Component Transfer"), "svg:feComponentTransfer"}, - {NR::NR_FILTER_COMPOSITE, _("Composite"), "svg:feComposite"}, - {NR::NR_FILTER_CONVOLVEMATRIX, _("Convolve Matrix"), "svg:feConvolveMatrix"}, - {NR::NR_FILTER_DIFFUSELIGHTING, _("Diffuse Lighting"), "svg:feDiffuseLighting"}, - {NR::NR_FILTER_DISPLACEMENTMAP, _("Displacement Map"), "svg:feDisplacementMap"}, - {NR::NR_FILTER_FLOOD, _("Flood"), "svg:feFlood"}, - {NR::NR_FILTER_GAUSSIANBLUR, _("Gaussian Blur"), "svg:feGaussianBlur"}, - {NR::NR_FILTER_IMAGE, _("Image"), "svg:feImage"}, - {NR::NR_FILTER_MERGE, _("Merge"), "svg:feMerge"}, - {NR::NR_FILTER_MORPHOLOGY, _("Morphology"), "svg:feMorphology"}, - {NR::NR_FILTER_OFFSET, _("Offset"), "svg:feOffset"}, - {NR::NR_FILTER_SPECULARLIGHTING, _("Specular Lighting"), "svg:feSpecularLighting"}, - {NR::NR_FILTER_TILE, _("Tile"), "svg:feTile"}, - {NR::NR_FILTER_TURBULENCE, _("Turbulence"), "svg:feTurbulence"} -}; -const Converter<NR::FilterPrimitiveType> FPConverter(FPData, NR::NR_FILTER_ENDPRIMITIVETYPE); - -const EnumData<NR::FilterBlendMode> BlendModeData[NR::BLEND_ENDMODE] = { - {NR::BLEND_NORMAL, _("Normal"), "normal"}, - {NR::BLEND_MULTIPLY, _("Multiply"), "multiply"}, - {NR::BLEND_SCREEN, _("Screen"), "screen"}, - {NR::BLEND_DARKEN, _("Darken"), "darken"}, - {NR::BLEND_LIGHTEN, _("Lighten"), "lighten"} -}; -const Converter<NR::FilterBlendMode> BlendModeConverter(BlendModeData, NR::BLEND_ENDMODE); - -const EnumData<FeCompositeOperator> CompositeOperatorData[COMPOSITE_ENDOPERATOR] = { - {COMPOSITE_DEFAULT, _("Default"), ""}, - {COMPOSITE_OVER, _("Over"), "over"}, - {COMPOSITE_IN, _("In"), "in"}, - {COMPOSITE_OUT, _("Out"), "out"}, - {COMPOSITE_ATOP, _("Atop"), "atop"}, - {COMPOSITE_XOR, _("XOR"), "xor"}, - {COMPOSITE_ARITHMETIC, _("Arithmetic"), "arithmetic"} -}; -const Converter<FeCompositeOperator> CompositeOperatorConverter(CompositeOperatorData, COMPOSITE_ENDOPERATOR); - } } } diff --git a/src/ui/widget/filter-effect-chooser.h b/src/ui/widget/filter-effect-chooser.h index 05f9faf32..3410e0146 100644 --- a/src/ui/widget/filter-effect-chooser.h +++ b/src/ui/widget/filter-effect-chooser.h @@ -17,7 +17,8 @@ #include <gtkmm/liststore.h> #include <gtkmm/treeview.h> -#include "filter-effect-enums.h" +#include "combo-enums.h" +#include "filter-enums.h" #include "labelled.h" #include "spin-slider.h" #include "sp-filter.h" diff --git a/src/ui/widget/filter-effect-enums.h b/src/ui/widget/filter-effect-enums.h deleted file mode 100644 index ec9dcc851..000000000 --- a/src/ui/widget/filter-effect-enums.h +++ /dev/null @@ -1,161 +0,0 @@ -/** - * \brief Simplified management of enumerations for filter effects - * - * Authors: - * Nicholas Bishop <nicholasbishop@gmail.com> - * - * Copyright (C) 2007 Authors - * - * Released under GNU GPL. Read the file 'COPYING' for more information. - */ - -#ifndef INKSCAPE_UI_WIDGET_FILTER_EFFECT_ENUMS_H -#define INKSCAPE_UI_WIDGET_FILTER_EFFECT_ENUMS_H - -#include "sp-fecomposite.h" -#include "display/nr-filter-blend.h" -#include "display/nr-filter-types.h" - -namespace Inkscape { -namespace UI { -namespace Widget { - -template<typename E> struct EnumData -{ - E id; - const Glib::ustring label; - const Glib::ustring name; -}; - -template<typename E> class Converter -{ -public: - typedef EnumData<E> Data; - - Converter(const EnumData<E>* cd, const int endval) - : end(endval), _data(cd) - {} - - E get_id_from_label(const Glib::ustring& label) const - { - for(int i = 0; i < end; ++i) { - if(_data[i].label == label) - return (E)i; - } - - return (E)0; - } - - E get_id_from_name(const Glib::ustring& name) const - { - for(int i = 0; i < end; ++i) { - if(_data[i].name == name) - return (E)i; - } - - return (E)0; - } - - const Glib::ustring& get_label(const E e) const - { - return _data[e].label; - } - - const Glib::ustring& get_name(const E e) const - { - return _data[e].name; - } - - const EnumData<E>& data(const int i) const - { - return _data[i]; - } - - const int end; -private: - const EnumData<E>* _data; -}; - -template<typename E> class ComboBoxEnum : public Gtk::ComboBox -{ -public: - ComboBoxEnum(const Converter<E>& c) - : _converter(c) - { - _model = Gtk::ListStore::create(_columns); - set_model(_model); - - pack_start(_columns.label); - - // Initialize list - for(int i = 0; i < _converter.end; ++i) { - Gtk::TreeModel::Row row = *_model->append(); - const EnumData<E>* data = &_converter.data(i); - row[_columns.data] = data; - row[_columns.label] = _converter.get_label(data->id); - } - - set_active(0); - } - - const EnumData<E>* get_active_data() - { - Gtk::TreeModel::iterator i = this->get_active(); - if(i) - return (*i)[_columns.data]; - return 0; - } - - void add_row(const Glib::ustring& s) - { - Gtk::TreeModel::Row row = *_model->append(); - row[_columns.data] = 0; - row[_columns.label] = s; - } -private: - class Columns : public Gtk::TreeModel::ColumnRecord - { - public: - Columns() - { - add(data); - add(label); - } - - Gtk::TreeModelColumn<const EnumData<E>*> data; - Gtk::TreeModelColumn<Glib::ustring> label; - }; - - Columns _columns; - Glib::RefPtr<Gtk::ListStore> _model; - const Converter<E>& _converter; -}; - -/*** Filter Primitives ***/ -extern const EnumData<NR::FilterPrimitiveType> FPData[NR::NR_FILTER_ENDPRIMITIVETYPE]; -extern const Converter<NR::FilterPrimitiveType> FPConverter; - -/*** feBlend Mode ***/ -extern const EnumData<NR::FilterBlendMode> BlendModeData[NR::BLEND_ENDMODE]; -extern const Converter<NR::FilterBlendMode> BlendModeConverter; - -/*** feComposite Operator ***/ -extern const EnumData<FeCompositeOperator> CompositeOperatorData[COMPOSITE_ENDOPERATOR]; -extern const Converter<FeCompositeOperator> CompositeOperatorConverter; - -} -} -} - -#endif - -/* - 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:encoding=utf-8:textwidth=99 : |
