diff options
| author | John Smith <john.smith7545@yahoo.com> | 2012-07-25 02:42:34 +0000 |
|---|---|---|
| committer | John Smith <john.smith7545@yahoo.com> | 2012-07-25 02:42:34 +0000 |
| commit | d71d34161792bd83064081bda825ef9579825b78 (patch) | |
| tree | 03d50df0b06563d4f479330b6a53da9c7f55a81a /src | |
| parent | Fix for 1028425 : Gradient Stop Alpha value not correct in Fill/Stroke dialog (diff) | |
| download | inkscape-d71d34161792bd83064081bda825ef9579825b78.tar.gz inkscape-d71d34161792bd83064081bda825ef9579825b78.zip | |
Fix for 722625 : Select Same by Object Type
(bzr r11573)
Diffstat (limited to 'src')
| -rw-r--r-- | src/interface.cpp | 65 | ||||
| -rw-r--r-- | src/interface.h | 4 | ||||
| -rw-r--r-- | src/menus-skeleton.h | 1 | ||||
| -rw-r--r-- | src/selection-chemistry.cpp | 105 | ||||
| -rw-r--r-- | src/selection-chemistry.h | 3 | ||||
| -rw-r--r-- | src/verbs.cpp | 5 | ||||
| -rw-r--r-- | src/verbs.h | 1 |
7 files changed, 179 insertions, 5 deletions
diff --git a/src/interface.cpp b/src/interface.cpp index c97d84082..25799b7b8 100644 --- a/src/interface.cpp +++ b/src/interface.cpp @@ -1711,16 +1711,51 @@ void ContextMenu::MakeItemMenu (void) mi->show(); append(*mi); - /* Select same fill and stroke */ - mi = manage(new Gtk::MenuItem(_("_Select Same Fill and Stroke"),1)); + + + mi = manage(new Gtk::MenuItem(_("Select Same"))); + mi->show(); + Gtk::Menu *select_same_submenu = manage(new Gtk::Menu()); if (_desktop->selection->isEmpty()) { mi->set_sensitive(FALSE); - } else { - mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::SelectSameFillStroke)); } + mi->set_submenu(*select_same_submenu); + append(*mi); + + /* Select same fill and stroke */ + mi = manage(new Gtk::MenuItem(_("Fill and Stroke"),1)); + mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::SelectSameFillStroke)); mi->set_sensitive(!SP_IS_ANCHOR(_item)); mi->show(); - append(*mi); + select_same_submenu->append(*mi); + + /* Select same fill color */ + mi = manage(new Gtk::MenuItem(_("Fill Color"),1)); + mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::SelectSameFillColor)); + mi->set_sensitive(!SP_IS_ANCHOR(_item)); + mi->show(); + select_same_submenu->append(*mi); + + /* Select same stroke color */ + mi = manage(new Gtk::MenuItem(_("Stroke Color"),1)); + mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::SelectSameStrokeColor)); + mi->set_sensitive(!SP_IS_ANCHOR(_item)); + mi->show(); + select_same_submenu->append(*mi); + + /* Select same stroke style */ + mi = manage(new Gtk::MenuItem(_("Stroke Style"),1)); + mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::SelectSameStrokeStyle)); + mi->set_sensitive(!SP_IS_ANCHOR(_item)); + mi->show(); + select_same_submenu->append(*mi); + + /* Select same stroke style */ + mi = manage(new Gtk::MenuItem(_("Object type"),1)); + mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::SelectSameObjectType)); + mi->set_sensitive(!SP_IS_ANCHOR(_item)); + mi->show(); + select_same_submenu->append(*mi); /* Create link */ mi = manage(new Gtk::MenuItem(_("_Create Link"),1)); @@ -1795,6 +1830,26 @@ void ContextMenu::SelectSameFillStroke(void) sp_select_same_fill_stroke_style(_desktop, true, true, true); } +void ContextMenu::SelectSameFillColor(void) +{ + sp_select_same_fill_stroke_style(_desktop, true, false, false); +} + +void ContextMenu::SelectSameStrokeColor(void) +{ + sp_select_same_fill_stroke_style(_desktop, false, true, false); +} + +void ContextMenu::SelectSameStrokeStyle(void) +{ + sp_select_same_stroke_style(_desktop); +} + +void ContextMenu::SelectSameObjectType(void) +{ + sp_select_same_object_type(_desktop); +} + void ContextMenu::ItemProperties(void) { _desktop->selection->set(_item); diff --git a/src/interface.h b/src/interface.h index 029bb4154..931a2c1b3 100644 --- a/src/interface.h +++ b/src/interface.h @@ -172,6 +172,10 @@ class ContextMenu : public Gtk::Menu void ItemProperties(void); void ItemSelectThis(void); void SelectSameFillStroke(void); + void SelectSameFillColor(void); + void SelectSameStrokeColor(void); + void SelectSameStrokeStyle(void); + void SelectSameObjectType(void); void ItemCreateLink(void); void SetMask(void); void ReleaseMask(void); diff --git a/src/menus-skeleton.h b/src/menus-skeleton.h index af6e8034d..21e25c6dc 100644 --- a/src/menus-skeleton.h +++ b/src/menus-skeleton.h @@ -81,6 +81,7 @@ static char const menus_skeleton[] = " <verb verb-id=\"EditSelectSameFillColor\" />\n" " <verb verb-id=\"EditSelectSameStrokeColor\" />\n" " <verb verb-id=\"EditSelectSameStrokeStyle\" />\n" +" <verb verb-id=\"EditSelectSameObjectType\" />\n" " </submenu>\n" " <verb verb-id=\"EditInvert\" />\n" " <verb verb-id=\"EditDeselect\" />\n" diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index d70435df6..041bc4b2d 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -48,6 +48,12 @@ SPCycleType SP_CYCLING = SP_CYCLE_FOCUS; #include "sp-flowtext.h" #include "sp-flowregion.h" #include "sp-image.h" +#include "sp-rect.h" +#include "sp-ellipse.h" +#include "sp-star.h" +#include "sp-spiral.h" +#include "sp-polyline.h" +#include "sp-line.h" #include "text-editing.h" #include "text-context.h" #include "connector-context.h" @@ -172,6 +178,11 @@ void SelectionHelper::selectSameStrokeStyle(SPDesktop *dt) sp_select_same_stroke_style(dt); } +void SelectionHelper::selectSameObjectType(SPDesktop *dt) +{ + sp_select_same_object_type(dt); +} + void SelectionHelper::invert(SPDesktop *dt) { if (tools_isactive(dt, TOOLS_NODES)) { @@ -1699,6 +1710,45 @@ void sp_select_same_fill_stroke_style(SPDesktop *desktop, gboolean fill, gboolea /* + * Selects all the visible items with the same object type as the items in the current selection + * + * Params: + * desktop - set the selection on this desktop + */ +void sp_select_same_object_type(SPDesktop *desktop) +{ + if (!desktop) { + return; + } + + + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + bool onlyvisible = prefs->getBool("/options/kbselection/onlyvisible", true); + bool onlysensitive = prefs->getBool("/options/kbselection/onlysensitive", true); + bool ingroups = TRUE; + + GSList *all_list = get_all_items(NULL, desktop->currentRoot(), desktop, onlyvisible, onlysensitive, ingroups, NULL); + GSList *matches = all_list; + + Inkscape::Selection *selection = sp_desktop_selection (desktop); + + for (GSList const* sel_iter = selection->itemList(); sel_iter; sel_iter = sel_iter->next) { + SPItem *sel = SP_ITEM(sel_iter->data); + matches = sp_get_same_object_type(sel, matches); + } + + selection->clear(); + selection->setList(matches); + + if (matches) { + g_slist_free(matches); + } + if (all_list) { + g_slist_free(all_list); + } +} + +/* * Selects all the visible items with the same stroke style as the items in the current selection * * Params: @@ -1795,6 +1845,61 @@ GSList *sp_get_same_fill_or_stroke_color(SPItem *sel, GSList *src, SPSelectStrok return matches; } +bool item_type_match (SPItem *i, SPItem *j) +{ + if ( SP_IS_RECT(i)) { + return ( SP_IS_RECT(j) ); + + } else if (SP_IS_GENERICELLIPSE(i) || SP_IS_ELLIPSE(i) || SP_IS_ARC(i) || SP_IS_CIRCLE(i)) { + return (SP_IS_GENERICELLIPSE(j) || SP_IS_ELLIPSE(j) || SP_IS_ARC(j) || SP_IS_CIRCLE(j)); + + } else if (SP_IS_STAR(i) || SP_IS_POLYGON(i)) { + return (SP_IS_STAR(j) || SP_IS_POLYGON(j)) ; + + } else if (SP_IS_SPIRAL(i)) { + return (SP_IS_SPIRAL(j)); + + } else if (SP_IS_PATH(i) || SP_IS_LINE(i) || SP_IS_POLYLINE(i)) { + return (SP_IS_PATH(j) || SP_IS_LINE(j) || SP_IS_POLYLINE(j)); + + } else if (SP_IS_TEXT(i) || SP_IS_FLOWTEXT(i) || SP_IS_TSPAN(i) || SP_IS_TREF(i) || SP_IS_STRING(i)) { + return (SP_IS_TEXT(j) || SP_IS_FLOWTEXT(j) || SP_IS_TSPAN(j) || SP_IS_TREF(j) || SP_IS_STRING(j)); + + } else if (SP_IS_USE(i)) { + return (SP_IS_USE(j)) ; + + } else if (SP_IS_IMAGE(i)) { + return (SP_IS_IMAGE(j)); + + } else if (SP_IS_OFFSET(i) && SP_OFFSET(i)->sourceHref) { // Linked offset + return (SP_IS_OFFSET(j) && SP_OFFSET(j)->sourceHref); + + } else if (SP_IS_OFFSET(i) && !SP_OFFSET(i)->sourceHref) { // Dynamic offset + return (SP_IS_OFFSET(j) && !SP_OFFSET(j)->sourceHref); + + } + + return false; +} + +/* + * Find all items in src list that have the same object type as sel by type + * Return the list of matching items + */ +GSList *sp_get_same_object_type(SPItem *sel, GSList *src) +{ + GSList *matches = NULL; + + for (GSList *i = src; i != NULL; i = i->next) { + SPItem *item = SP_ITEM(i->data); + if (item_type_match (sel, item)) { + matches = g_slist_prepend (matches, item); + } + } + + return matches; +} + /* * Find all items in src list that have the same stroke style as sel by type * Return the list of matching items diff --git a/src/selection-chemistry.h b/src/selection-chemistry.h index e1c8501dd..0ae2a9b06 100644 --- a/src/selection-chemistry.h +++ b/src/selection-chemistry.h @@ -40,6 +40,7 @@ namespace Inkscape { static void selectSameFillColor(SPDesktop *dt); static void selectSameStrokeColor(SPDesktop *dt); static void selectSameStrokeStyle(SPDesktop *dt); + static void selectSameObjectType(SPDesktop *dt); static void invert(SPDesktop *desktop); static void invertAllInAll(SPDesktop *desktop); static void reverse(SPDesktop *dt); @@ -134,8 +135,10 @@ enum SPSelectStrokeStyleType { void sp_select_same_fill_stroke_style(SPDesktop *desktop, gboolean fill, gboolean strok, gboolean style); void sp_select_same_stroke_style(SPDesktop *desktop); +void sp_select_same_object_type(SPDesktop *desktop); GSList *sp_get_same_fill_or_stroke_color(SPItem *sel, GSList *src, SPSelectStrokeStyleType type); GSList *sp_get_same_stroke_style(SPItem *sel, GSList *src, SPSelectStrokeStyleType type); +GSList *sp_get_same_object_type(SPItem *sel, GSList *src); void scroll_to_show_item(SPDesktop *desktop, SPItem *item); diff --git a/src/verbs.cpp b/src/verbs.cpp index effa49e4e..ae9e53cbe 100644 --- a/src/verbs.cpp +++ b/src/verbs.cpp @@ -973,6 +973,9 @@ void EditVerb::perform(SPAction *action, void *data) case SP_VERB_EDIT_SELECT_SAME_STROKE_STYLE: SelectionHelper::selectSameStrokeStyle(dt); break; + case SP_VERB_EDIT_SELECT_SAME_OBJECT_TYPE: + SelectionHelper::selectSameObjectType(dt); + break; case SP_VERB_EDIT_INVERT: SelectionHelper::invert(dt); break; @@ -2327,6 +2330,8 @@ Verb *Verb::_base_verbs[] = { N_("Select all objects with the same stroke as the selected objects"), GTK_STOCK_SELECT_ALL), new EditVerb(SP_VERB_EDIT_SELECT_SAME_STROKE_STYLE, "EditSelectSameStrokeStyle", N_("Stroke St_yle"), N_("Select all objects with the same stroke style (width, dash, markers) as the selected objects"), GTK_STOCK_SELECT_ALL), + new EditVerb(SP_VERB_EDIT_SELECT_SAME_OBJECT_TYPE, "EditSelectSameObjectType", N_("_Object Type"), + N_("Select all objects with the same object type (rect, arc, text, path, bitmap etc) as the selected objects"), GTK_STOCK_SELECT_ALL), new EditVerb(SP_VERB_EDIT_INVERT, "EditInvert", N_("In_vert Selection"), N_("Invert selection (unselect what is selected and select everything else)"), INKSCAPE_ICON("edit-select-invert")), new EditVerb(SP_VERB_EDIT_INVERT_IN_ALL_LAYERS, "EditInvertInAllLayers", N_("Invert in All Layers"), diff --git a/src/verbs.h b/src/verbs.h index 87547b37c..70d65c583 100644 --- a/src/verbs.h +++ b/src/verbs.h @@ -91,6 +91,7 @@ enum { SP_VERB_EDIT_SELECT_SAME_FILL_COLOR, SP_VERB_EDIT_SELECT_SAME_STROKE_COLOR, SP_VERB_EDIT_SELECT_SAME_STROKE_STYLE, + SP_VERB_EDIT_SELECT_SAME_OBJECT_TYPE, SP_VERB_EDIT_INVERT, SP_VERB_EDIT_INVERT_IN_ALL_LAYERS, SP_VERB_EDIT_SELECT_NEXT, |
