summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabier Arraiza Cenoz <jabier.arraiza@marker.es>2015-11-11 19:50:35 +0000
committerjabiertxof <jabier.arraiza@marker.es>2015-11-11 19:50:35 +0000
commit1bdb2511c92fd5390527aa51a9aa45de01421d2b (patch)
tree015e3ad2b3e0e372c656c5ec82c41c1611f3abde /src
parentRefactor of code, minor bugs fixed. (diff)
downloadinkscape-1bdb2511c92fd5390527aa51a9aa45de01421d2b.tar.gz
inkscape-1bdb2511c92fd5390527aa51a9aa45de01421d2b.zip
Add erase mode to spray. Bugfixes.
(bzr r14459)
Diffstat (limited to 'src')
-rw-r--r--src/ui/tools/spray-tool.cpp39
-rw-r--r--src/ui/tools/spray-tool.h3
-rw-r--r--src/widgets/spray-toolbar.cpp42
3 files changed, 65 insertions, 19 deletions
diff --git a/src/ui/tools/spray-tool.cpp b/src/ui/tools/spray-tool.cpp
index 10a10f49f..84b0ad431 100644
--- a/src/ui/tools/spray-tool.cpp
+++ b/src/ui/tools/spray-tool.cpp
@@ -252,6 +252,15 @@ void SprayTool::setup() {
this->is_drawing = false;
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ prefs->setBool("/dialogs/clonetiler/dotrace", false);
+ if (prefs->getBool("/tools/spray/selcue")) {
+ this->enableSelectionCue();
+ }
+ if (prefs->getBool("/tools/spray/gradientdrag")) {
+ this->enableGrDrag();
+ }
+
sp_event_context_read(this, "distrib");
sp_event_context_read(this, "width");
sp_event_context_read(this, "ratio");
@@ -276,14 +285,6 @@ void SprayTool::setup() {
sp_event_context_read(this, "over_no_transparent");
sp_event_context_read(this, "over_transparent");
sp_event_context_read(this, "no_overlap");
-
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- if (prefs->getBool("/tools/spray/selcue")) {
- this->enableSelectionCue();
- }
- if (prefs->getBool("/tools/spray/gradientdrag")) {
- this->enableGrDrag();
- }
}
void SprayTool::setCloneTilerPrefs() {
@@ -491,6 +492,7 @@ static bool fit_item(SPDesktop *desktop,
Geom::OptRect bbox,
Geom::Point &move,
Geom::Point center,
+ gint mode,
double angle,
double &_scale,
double scale,
@@ -604,7 +606,11 @@ static bool fit_item(SPDesktop *desktop,
(item_down->getAttribute("inkscape:spray-origin") &&
strcmp(item_down->getAttribute("inkscape:spray-origin"),spray_origin) == 0 ))
{
- if(no_overlap){
+ if(mode == SPRAY_MODE_ERASER){
+ if(strcmp(item_down_sharp, spray_origin) != 0 ){
+ item_down->deleteObject();
+ }
+ }else if(no_overlap){
if(!(offset_width < 0 && offset_height < 0 && std::abs(bbox_left - bbox_left_main) > std::abs(offset_width) &&
std::abs(bbox_top - bbox_top_main) > std::abs(offset_height))){
if(!no_overlap && (picker || over_transparent || over_no_transparent)){
@@ -619,6 +625,12 @@ static bool fit_item(SPDesktop *desktop,
}
}
}
+ if(mode == SPRAY_MODE_ERASER){
+ if(!no_overlap && (picker || over_transparent || over_no_transparent)){
+ showHidden(items_down);
+ }
+ return false;
+ }
if(picker || over_transparent || over_no_transparent){
if(!no_overlap){
doc->ensureUpToDate();
@@ -743,6 +755,7 @@ static bool fit_item(SPDesktop *desktop,
, bbox
, move
, center
+ , mode
, angle
, _scale
, scale
@@ -818,11 +831,11 @@ static bool fit_item(SPDesktop *desktop,
if (pick_inverse_value) {
r = 1 - SP_RGBA32_R_F(rgba);
g = 1 - SP_RGBA32_G_F(rgba);
- b = 1 - SP_RGBA32_G_F(rgba);
+ b = 1 - SP_RGBA32_B_F(rgba);
} else {
r = SP_RGBA32_R_F(rgba);
g = SP_RGBA32_G_F(rgba);
- b = SP_RGBA32_G_F(rgba);
+ b = SP_RGBA32_B_F(rgba);
}
rgba = SP_RGBA32_F_COMPOSE(r, g, b, a);
sp_svg_write_color(color_string, sizeof(color_string), rgba);
@@ -900,7 +913,7 @@ static bool sp_spray_recursive(SPDesktop *desktop,
random_position( dr, dp, mean, standard_deviation, _distrib );
dr=dr*radius;
- if (mode == SPRAY_MODE_COPY) {
+ if (mode == SPRAY_MODE_COPY || mode == SPRAY_MODE_ERASER) {
Geom::OptRect a = item->documentVisualBounds();
if (a) {
if(_fid <= population)
@@ -921,6 +934,7 @@ static bool sp_spray_recursive(SPDesktop *desktop,
, a
, move
, center
+ , mode
, angle
, _scale
, scale
@@ -1056,6 +1070,7 @@ static bool sp_spray_recursive(SPDesktop *desktop,
, a
, move
, center
+ , mode
, angle
, _scale
, scale
diff --git a/src/ui/tools/spray-tool.h b/src/ui/tools/spray-tool.h
index 438318bf4..c81110b37 100644
--- a/src/ui/tools/spray-tool.h
+++ b/src/ui/tools/spray-tool.h
@@ -47,7 +47,8 @@ namespace Tools {
enum {
SPRAY_MODE_COPY,
SPRAY_MODE_CLONE,
- SPRAY_MODE_SINGLE_PATH,
+ SPRAY_MODE_SINGLE_PATH,
+ SPRAY_MODE_ERASER,
SPRAY_OPTION,
};
diff --git a/src/widgets/spray-toolbar.cpp b/src/widgets/spray-toolbar.cpp
index 1ef0ca9f1..8866cf11e 100644
--- a/src/widgets/spray-toolbar.cpp
+++ b/src/widgets/spray-toolbar.cpp
@@ -68,13 +68,14 @@ static void sp_stb_sensitivize( GObject *tbl )
GtkAdjustment *adj_scale = ege_adjustment_action_get_adjustment( EGE_ADJUSTMENT_ACTION(spray_scale) );
GtkToggleAction *no_overlap = GTK_TOGGLE_ACTION( g_object_get_data(tbl, "no_overlap") );
GtkToggleAction *picker = GTK_TOGGLE_ACTION( g_object_get_data(tbl, "picker") );
+ GtkAction* picker_action = GTK_ACTION( g_object_get_data(tbl, "picker") );
GtkToggleAction *usepressurescale = GTK_TOGGLE_ACTION( g_object_get_data(tbl, "usepressurescale") );
GtkAction *pick_fill = GTK_ACTION( g_object_get_data(tbl, "pick_fill") );
GtkAction *pick_stroke = GTK_ACTION( g_object_get_data(tbl, "pick_stroke") );
GtkAction *pick_inverse_value = GTK_ACTION( g_object_get_data(tbl, "pick_inverse_value") );
GtkAction *pick_center = GTK_ACTION( g_object_get_data(tbl, "pick_center") );
gtk_adjustment_set_value( adj_offset, 100.0 );
- if (gtk_toggle_action_get_active(no_overlap)) {
+ if (gtk_toggle_action_get_active(no_overlap) && gtk_action_get_sensitive(picker_action)) {
gtk_action_set_sensitive( offset, TRUE );
} else {
gtk_action_set_sensitive( offset, FALSE );
@@ -85,7 +86,7 @@ static void sp_stb_sensitivize( GObject *tbl )
} else {
gtk_action_set_sensitive( spray_scale, TRUE );
}
- if(gtk_toggle_action_get_active(picker)){
+ if(gtk_toggle_action_get_active(picker) && gtk_action_get_sensitive(picker_action)){
gtk_action_set_sensitive( pick_fill, TRUE );
gtk_action_set_sensitive( pick_stroke, TRUE );
gtk_action_set_sensitive( pick_inverse_value, TRUE );
@@ -98,6 +99,21 @@ static void sp_stb_sensitivize( GObject *tbl )
}
}
+static void sp_spray_erase_sensitivize( GObject *tbl, bool sensitive){
+ gtk_action_set_sensitive( GTK_ACTION( g_object_get_data(tbl, "rotate") ), sensitive );
+ gtk_action_set_sensitive( GTK_ACTION( g_object_get_data(tbl, "no_overlap") ), sensitive );
+ gtk_action_set_sensitive( GTK_ACTION( g_object_get_data(tbl, "over_no_transparent") ), sensitive );
+ gtk_action_set_sensitive( GTK_ACTION( g_object_get_data(tbl, "over_transparent") ), sensitive );
+ gtk_action_set_sensitive( GTK_ACTION( g_object_get_data(tbl, "pick_no_overlap") ), sensitive );
+ gtk_action_set_sensitive( GTK_ACTION( g_object_get_data(tbl, "pick_stroke") ), sensitive );
+ gtk_action_set_sensitive( GTK_ACTION( g_object_get_data(tbl, "pick_fill") ), sensitive );
+ gtk_action_set_sensitive( GTK_ACTION( g_object_get_data(tbl, "pick_inverse_value") ), sensitive );
+ gtk_action_set_sensitive( GTK_ACTION( g_object_get_data(tbl, "pick_center") ), sensitive );
+ gtk_action_set_sensitive( GTK_ACTION( g_object_get_data(tbl, "picker") ), sensitive );
+ gtk_action_set_sensitive( GTK_ACTION( g_object_get_data(tbl, "offset") ), sensitive );
+ sp_stb_sensitivize( tbl );
+}
+
Inkscape::UI::Dialog::CloneTiler *get_clone_tiler_panel(SPDesktop *desktop)
{
if (Inkscape::UI::Dialog::PanelDialogBase *panel_dialog =
@@ -133,11 +149,16 @@ static void sp_spray_standard_deviation_value_changed( GtkAdjustment *adj, GObje
gtk_adjustment_get_value(adj));
}
-static void sp_spray_mode_changed( EgeSelectOneAction *act, GObject * /*tbl*/ )
+static void sp_spray_mode_changed( EgeSelectOneAction *act, GObject * tbl )
{
int mode = ege_select_one_action_get_active( act );
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
prefs->setInt("/tools/spray/mode", mode);
+ if(mode != 3){
+ sp_spray_erase_sensitivize(tbl, true);
+ } else {
+ sp_spray_erase_sensitivize(tbl, false);
+ }
}
static void sp_spray_population_value_changed( GtkAdjustment *adj, GObject * /*tbl*/ )
@@ -210,7 +231,7 @@ static void sp_toggle_picker( GtkToggleAction* act, gpointer data )
gboolean active = gtk_toggle_action_get_active(act);
prefs->setBool("/tools/spray/picker", active);
if(active == true){
- prefs->setBool("/dialogs/clonetiler/dotrace", true);
+ prefs->setBool("/dialogs/clonetiler/dotrace", false);
SPDesktop *dt = SP_ACTIVE_DESKTOP;
if (Inkscape::UI::Dialog::CloneTiler *ct = get_clone_tiler_panel(dt)){
dt->_dlg_mgr->showDialog("CloneTiler");
@@ -323,7 +344,7 @@ void sp_spray_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObj
/* Mode */
{
- GtkListStore* model = gtk_list_store_new( 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING );
+ GtkListStore* model = gtk_list_store_new( 4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING );
GtkTreeIter iter;
gtk_list_store_append( model, &iter );
@@ -339,6 +360,7 @@ void sp_spray_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObj
1, _("Spray clones of the initial selection"),
2, INKSCAPE_ICON("spray-mode-clone"),
-1 );
+
#ifdef ENABLE_SPRAY_MODE_SINGLE_PATH
gtk_list_store_append( model, &iter );
gtk_list_store_set( model, &iter,
@@ -347,6 +369,14 @@ void sp_spray_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObj
2, INKSCAPE_ICON("spray-mode-union"),
-1 );
#endif
+
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter,
+ 0, _("Delete sprayed items"),
+ 1, _("Delete sprayed items from selection"),
+ 2, INKSCAPE_ICON("draw-eraser"),
+ -1 );
+
EgeSelectOneAction* act = ege_select_one_action_new( "SprayModeAction", _("Mode"), (""), NULL, GTK_TREE_MODEL(model) );
g_object_set( act, "short_label", _("Mode:"), NULL );
gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
@@ -575,7 +605,7 @@ void sp_spray_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObj
g_object_set_data( holder, "offset", eact );
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
}
- sp_stb_sensitivize(holder);
+ sp_spray_erase_sensitivize(holder, prefs->getInt("/tools/spray/mode") != 3);
}