From: jucablues Date: Thu, 24 Jan 2008 02:31:30 +0000 (+0000) Subject: * implemented feImage Settings UI X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=6242234aa1e72febb8d84767b4ff4a46912d8b9f;p=inkscape.git * implemented feImage Settings UI * created feImage icon * added CC licensing info on feConvolveMatrix-icon --- diff --git a/share/icons/Makefile.am b/share/icons/Makefile.am index ec8c3d383..0c666d212 100644 --- a/share/icons/Makefile.am +++ b/share/icons/Makefile.am @@ -19,6 +19,8 @@ pixmaps = \ feFlood-icon.svg \ feGaussianBlur-icon.png \ feGaussianBlur-icon.svg \ + feImage-icon.png \ + feImage-icon.svg \ feMerge-icon.png \ feMerge-icon.svg \ feMorphology-icon.png \ diff --git a/share/icons/feConvolveMatrix-icon.svg b/share/icons/feConvolveMatrix-icon.svg index c4bbd2666..4bfeb5ad4 100644 --- a/share/icons/feConvolveMatrix-icon.svg +++ b/share/icons/feConvolveMatrix-icon.svg @@ -18,11 +18,32 @@ sodipodi:docbase="/home/tsoots/ohj/translations/po" version="1.0" inkscape:output_extension="org.inkscape.output.svg.inkscape" - inkscape:export-filename="/home/felipe/devel/inkscape/inkscape/share/icons/feConvolveMatrix.png" + inkscape:export-filename="/home/felipe/devel/inkscape/inkscape/share/icons/feConvolveMatrix-icon.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90"> + + + Felipe Corrêa da Silva Sanches - - - - - + + http://www.flickr.com/photos/dariosanches + + + - + This file is derived from ticotico.jpg which is: +(C) 2007 Dario Sanches under the CC by-sa license + @@ -172,7 +195,7 @@ height="124.7063" width="168.06779" sodipodi:absref="ticotico.jpg" - xlink:href="/home/felipe/Desktop/ticotico.jpg" + xlink:href="./ticotico.jpg" style="filter:url(#filter2688)" /> + + + + + + + + + + + + + + + + + + image/svg+xml + + + feImage filter primitive example + 23 Jan 2008 + + + Felipe Corrêa da Silva Sanches + + + + + Felipe Corrêa da Silva Sanches + + + + + Image filter primitive example + + + this is an image originaly intended to be used in Inkscape + + + Felipe Corrêa da Silva Sanches + + + + http://www.flickr.com/photos/dariosanches + + + + + + This file is derived from ticotico.jpg which is: +(C) 2007 Dario Sanches under the CC by-sa license + + + + + + + + + + + + + + + + + + + diff --git a/src/ui/dialog/filter-effects-dialog.cpp b/src/ui/dialog/filter-effects-dialog.cpp index a120b6a40..b3dd1a7d0 100644 --- a/src/ui/dialog/filter-effects-dialog.cpp +++ b/src/ui/dialog/filter-effects-dialog.cpp @@ -29,12 +29,14 @@ #include "desktop.h" #include "desktop-handles.h" #include "dialog-manager.h" +#include "dir-util.h" #include "document.h" #include "filter-chemistry.h" #include "filter-effects-dialog.h" #include "filter-enums.h" #include "inkscape.h" #include "path-prefix.h" +#include "prefs-utils.h" #include "selection.h" #include "sp-feblend.h" #include "sp-fecolormatrix.h" @@ -53,12 +55,14 @@ #include "style.h" #include "svg/svg-color.h" +#include "ui/dialog/filedialog.h" #include "verbs.h" #include "xml/node.h" #include "xml/node-observer.h" #include "xml/repr.h" #include +#include "io/sys.h" #include using namespace NR; @@ -545,6 +549,126 @@ private: double _angle_store; }; +static Inkscape::UI::Dialog::FileOpenDialog * selectFeImageFileInstance = NULL; + +//Displays a chooser for feImage input +//It may be a filename or the id for an SVG Element +//described in xlink:href syntax +class FileOrElementChooser : public Gtk::HBox, public AttrWidget +{ +public: + FileOrElementChooser(const SPAttributeEnum a) + : AttrWidget(a) + { + pack_start(_entry, false, false); + pack_start(_fromFile, false, false); + //pack_start(_fromSVGElement, false, false); + + _fromFile.set_label(_("Image File")); + _fromFile.signal_clicked().connect(sigc::mem_fun(*this, &FileOrElementChooser::select_file)); + + _fromSVGElement.set_label(_("Selected SVG Element")); + _fromSVGElement.signal_clicked().connect(sigc::mem_fun(*this, &FileOrElementChooser::select_svg_element)); + + _entry.signal_changed().connect(signal_attr_changed().make_slot()); + + show_all(); + + } + + // Returns the element in xlink:href form. + Glib::ustring get_as_attribute() const + { + return _entry.get_text(); + } + + + void set_from_attribute(SPObject* o) + { + const gchar* val = attribute_value(o); + if(val) { + _entry.set_text(val); + } + } + + void set_desktop(SPDesktop* d){ + _desktop = d; + } + +private: + void select_svg_element(){ + Inkscape::Selection* sel = sp_desktop_selection(_desktop); + if (sel->isEmpty()) return; + Inkscape::XML::Node* node = (Inkscape::XML::Node*) g_slist_nth_data((GSList *)sel->reprList(), 0); + if (!node || !node->matchAttributeName("id")) return; + + std::ostringstream xlikhref; + xlikhref << "#(" << node->attribute("id") << ")"; + _entry.set_text(xlikhref.str()); + } + + void select_file(){ + + //# Get the current directory for finding files + Glib::ustring open_path; + char *attr = (char *)prefs_get_string_attribute("dialogs.open", "path"); + if (attr) + open_path = attr; + + //# Test if the open_path directory exists + if (!Inkscape::IO::file_test(open_path.c_str(), + (GFileTest)(G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR))) + open_path = ""; + + //# If no open path, default to our home directory + if (open_path.size() < 1) + { + open_path = g_get_home_dir(); + open_path.append(G_DIR_SEPARATOR_S); + } + + //# Create a dialog if we don't already have one + if (!selectFeImageFileInstance) { + selectFeImageFileInstance = + Inkscape::UI::Dialog::FileOpenDialog::create( + *_desktop->getToplevel(), + open_path, + Inkscape::UI::Dialog::SVG_TYPES,/*TODO: any image, not justy svg*/ + (char const *)_("Select an image to be used as feImage input")); + } + + //# Show the dialog + bool const success = selectFeImageFileInstance->show(); + if (!success) + return; + + //# User selected something. Get name and type + Glib::ustring fileName = selectFeImageFileInstance->getFilename(); + + if (fileName.size() > 0) { + + Glib::ustring newFileName = Glib::filename_to_utf8(fileName); + + if ( newFileName.size() > 0) + fileName = newFileName; + else + g_warning( "ERROR CONVERTING OPEN FILENAME TO UTF-8" ); + + open_path = fileName; + open_path.append(G_DIR_SEPARATOR_S); + prefs_set_string_attribute("dialogs.open", "path", open_path.c_str()); + + _entry.set_text(fileName); + } + return; + } + + Gtk::Entry _entry; + Gtk::Button _fromFile; + Gtk::Button _fromSVGElement; + SPDesktop* _desktop; +}; + class FilterEffectsDialog::Settings { public: @@ -676,7 +800,7 @@ public: add_attr_widget(dsb); return dsb; } - + // MultiSpinButton MultiSpinButton* add_multispinbutton(const SPAttributeEnum attr1, const SPAttributeEnum attr2, const Glib::ustring& label, const double lo, const double hi, @@ -705,6 +829,16 @@ public: add_attr_widget(msb->get_spinbuttons()[i]); return msb; } + + // FileOrElementChooser + FileOrElementChooser* add_fileorelement(const SPAttributeEnum attr, const Glib::ustring& label) + { + FileOrElementChooser* foech = new FileOrElementChooser(attr); + foech->set_desktop(_dialog.getDesktop()); + add_widget(foech, label); + add_attr_widget(foech); + return foech; + } // ComboBoxEnum template ComboBoxEnum* add_combo(const SPAttributeEnum attr, @@ -1883,7 +2017,6 @@ FilterEffectsDialog::FilterEffectsDialog() _sizegroup = Gtk::SizeGroup::create(Gtk::SIZE_GROUP_HORIZONTAL); _sizegroup->set_ignore_hidden(); - _add_primitive_type.remove_row(NR_FILTER_IMAGE); _add_primitive_type.remove_row(NR_FILTER_TILE); _add_primitive_type.remove_row(NR_FILTER_COMPONENTTRANSFER); @@ -2017,8 +2150,10 @@ void FilterEffectsDialog::init_settings_widgets() _settings->add_dualspinslider(SP_ATTR_RADIUS, _("Radius"), 0, 100, 1, 0.01, 1); _settings->type(NR_FILTER_IMAGE); - _settings->add_notimplemented(); - + _settings->add_fileorelement(SP_ATTR_XLINK_HREF, _("Source of Image")); + _settings->add_multispinbutton(SP_ATTR_X, SP_ATTR_Y, _("Coordinates"), -10000, 10000, 1, 1, 0); + _settings->add_multispinbutton(SP_ATTR_WIDTH, SP_ATTR_HEIGHT, _("Dimensions"), 0, 10000, 1, 1, 0); + _settings->type(NR_FILTER_OFFSET); _settings->add_spinslider(SP_ATTR_DX, _("Delta X"), -100, 100, 1, 0.01, 1); _settings->add_spinslider(SP_ATTR_DY, _("Delta Y"), -100, 100, 1, 0.01, 1);