summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJohn Smith <john.smith7545@yahoo.com>2012-07-25 02:42:34 +0000
committerJohn Smith <john.smith7545@yahoo.com>2012-07-25 02:42:34 +0000
commitd71d34161792bd83064081bda825ef9579825b78 (patch)
tree03d50df0b06563d4f479330b6a53da9c7f55a81a /src
parentFix for 1028425 : Gradient Stop Alpha value not correct in Fill/Stroke dialog (diff)
downloadinkscape-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.cpp65
-rw-r--r--src/interface.h4
-rw-r--r--src/menus-skeleton.h1
-rw-r--r--src/selection-chemistry.cpp105
-rw-r--r--src/selection-chemistry.h3
-rw-r--r--src/verbs.cpp5
-rw-r--r--src/verbs.h1
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,