X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fextension%2Feffect.cpp;h=1fef1a9db9f0f8032099dd84a45504417cf13636;hb=74cb47e95220bd0140b3d40fd56063c73c364a0e;hp=43bd81830b4e549ff4563eeccb7ec048ee45153d;hpb=cec5731da8c49542b06cbd831ba35a2b7ed7fd5d;p=inkscape.git diff --git a/src/extension/effect.cpp b/src/extension/effect.cpp index 43bd81830..1fef1a9db 100644 --- a/src/extension/effect.cpp +++ b/src/extension/effect.cpp @@ -2,7 +2,7 @@ * Authors: * Ted Gould * - * Copyright (C) 2002-2005 Authors + * Copyright (C) 2002-2006 Authors * * Released under GNU GPL, read the file 'COPYING' for more information */ @@ -26,22 +26,146 @@ Inkscape::XML::Node * Effect::_effects_list = NULL; Effect::Effect (Inkscape::XML::Node * in_repr, Implementation::Implementation * in_imp) : Extension(in_repr, in_imp), _verb(get_id(), get_name(), NULL, NULL, this), _menu_node(NULL) { + Inkscape::XML::Node * local_effects_menu = NULL; + + // This is a weird hack + if (!strcmp(this->get_id(), "org.inkscape.filter.dropshadow")) + return; + + bool hidden = false; + + no_doc = false; + + if (repr != NULL) { + + for (Inkscape::XML::Node *child = sp_repr_children(repr); child != NULL; child = child->next()) { + if (!strcmp(child->name(), "effect")) { + if (child->attribute("needs-document") && !strcmp(child->attribute("needs-document"), "no")) { + no_doc = true; + } + for (Inkscape::XML::Node *effect_child = sp_repr_children(child); effect_child != NULL; effect_child = effect_child->next()) { + if (!strcmp(effect_child->name(), "effects-menu")) { + // printf("Found local effects menu in %s\n", this->get_name()); + local_effects_menu = sp_repr_children(effect_child); + if (effect_child->attribute("hidden") && !strcmp(effect_child->attribute("hidden"), "yes")) { + hidden = true; + } + } + if (!strcmp(effect_child->name(), "menu-name") || + !strcmp(effect_child->name(), "_menu-name")) { + // printf("Found local effects menu in %s\n", this->get_name()); + _verb.set_name(sp_repr_children(effect_child)->content()); + } + if (!strcmp(effect_child->name(), "menu-tip") || + !strcmp(effect_child->name(), "_menu-tip")) { + // printf("Found local effects menu in %s\n", this->get_name()); + _verb.set_tip(sp_repr_children(effect_child)->content()); + } + } // children of "effect" + break; // there can only be one effect + } // find "effect" + } // children of "inkscape-extension" + } // if we have an XML file + if (_effects_list == NULL) find_effects_list(inkscape_get_menus(INKSCAPE)); if (_effects_list != NULL) { - unsigned start_pos = _effects_list->position(); - - _menu_node = sp_repr_new("verb"); + Inkscape::XML::Document *xml_doc; + xml_doc = _effects_list->document(); + _menu_node = xml_doc->createElement("verb"); _menu_node->setAttribute("verb-id", this->get_id(), false); - _effects_list->parent()->appendChild(_menu_node); - _menu_node->setPosition(start_pos + 1); + if (!hidden) + merge_menu(_effects_list->parent(), _effects_list, local_effects_menu, _menu_node); + } + + return; +} - Inkscape::GC::release(_menu_node); - } /*else { - printf("Effect %s not added\n", get_name()); - }*/ +void +Effect::merge_menu (Inkscape::XML::Node * base, + Inkscape::XML::Node * start, + Inkscape::XML::Node * patern, + Inkscape::XML::Node * mergee) { + Glib::ustring mergename; + Inkscape::XML::Node * tomerge = NULL; + Inkscape::XML::Node * submenu = NULL; + + /* printf("Merge menu with '%s' '%s' '%s'\n", + base != NULL ? base->name() : "NULL", + patern != NULL ? patern->name() : "NULL", + mergee != NULL ? mergee->name() : "NULL"); */ + + if (patern == NULL) { + // Merge the verb name + tomerge = mergee; + mergename = _(this->get_name()); + } else { + gchar const * menuname = patern->attribute("name"); + if (menuname == NULL) menuname = patern->attribute("_name"); + if (menuname == NULL) return; + + Inkscape::XML::Document *xml_doc; + xml_doc = base->document(); + tomerge = xml_doc->createElement("submenu"); + tomerge->setAttribute("name", menuname, false); + + mergename = _(menuname); + } + + int position = -1; + + if (start != NULL) { + Inkscape::XML::Node * menupass; + for (menupass = start->next(); menupass != NULL; menupass = menupass->next()) { + gchar const * compare_char = NULL; + if (!strcmp(menupass->name(), "verb")) { + gchar const * verbid = menupass->attribute("verb-id"); + Inkscape::Verb * verb = Inkscape::Verb::getbyid(verbid); + if (verb == NULL) { + continue; + } + compare_char = verb->get_name(); + } else if (!strcmp(menupass->name(), "submenu")) { + compare_char = menupass->attribute("name"); + if (compare_char == NULL) + compare_char = menupass->attribute("_name"); + } + + /* This will cause us to skip tags we don't understand */ + if (compare_char == NULL) { + continue; + } + + Glib::ustring compare(_(compare_char)); + + if (mergename == compare) { + Inkscape::GC::release(tomerge); + tomerge = NULL; + submenu = menupass; + break; + } + + if (mergename < compare) { + position = menupass->position(); + break; + } + } // for menu items + } // start != NULL + + if (tomerge != NULL) { + base->appendChild(tomerge); + Inkscape::GC::release(tomerge); + if (position != -1) + tomerge->setPosition(position); + } + + if (patern != NULL) { + if (submenu == NULL) + submenu = tomerge; + merge_menu(submenu, submenu->firstChild(), patern->firstChild(), mergee); + } return; } @@ -81,7 +205,7 @@ Effect::prefs (Inkscape::UI::View::View * doc) return true; } - PrefDialog * dialog = new PrefDialog(this->get_name(), controls); + PrefDialog * dialog = new PrefDialog(this->get_name(), this->get_help(), controls); int response = dialog->run(); dialog->hide(); @@ -112,7 +236,7 @@ Effect::effect (Inkscape::UI::View::View * doc) set_last_effect(this); imp->effect(this, doc); - sp_document_done(doc->doc()); + sp_document_done(doc->doc(), SP_VERB_NONE, _(this->get_name())); return; } @@ -153,6 +277,12 @@ Effect::find_effects_list (Inkscape::XML::Node * menustruct) return false; } +Gtk::VBox * +Effect::get_info_widget(void) +{ + return Extension::get_info_widget(); +} + /** \brief Create an action for a \c EffectVerb \param view Which view the action should be created for \return The built action. @@ -188,7 +318,7 @@ Effect::EffectVerb::perform (SPAction *action, void * data, void *pdata) * is called. */ SPActionEventVector Effect::EffectVerb::vector = - {{NULL},Effect::EffectVerb::perform, NULL, NULL, NULL}; + {{NULL}, Effect::EffectVerb::perform, NULL, NULL, NULL, NULL}; } } /* namespace Inkscape, Extension */