summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNathan Lee <2431820-nathanal@users.noreply.gitlab.com>2019-02-24 00:40:22 +0000
committerMartin Owens <doctormo@gmail.com>2019-03-06 01:25:44 +0000
commit1fb5264d8fced1ce3ec91093a83bab3f36f1ce8b (patch)
treef45f1e2799ce12372ab83452bb0d496e3af29aca /src
parentRevert modal fix to fix #108 (diff)
downloadinkscape-1fb5264d8fced1ce3ec91093a83bab3f36f1ce8b.tar.gz
inkscape-1fb5264d8fced1ce3ec91093a83bab3f36f1ce8b.zip
Allows 'none' palette to be drag and dropped onto Selected Style
Switches drag_target from x_color to x_oswb_color x_color only accepts RGB, while x_oswb_color has None and Clear as distinct types. Fixes https://gitlab.com/inkscape/inbox/issues/79
Diffstat (limited to 'src')
-rw-r--r--src/ui/widget/selected-style.cpp57
1 files changed, 33 insertions, 24 deletions
diff --git a/src/ui/widget/selected-style.cpp b/src/ui/widget/selected-style.cpp
index 149b70f6f..b7437c031 100644
--- a/src/ui/widget/selected-style.cpp
+++ b/src/ui/widget/selected-style.cpp
@@ -47,6 +47,7 @@
#include "ui/tools/tool-base.h"
#include "ui/widget/color-preview.h"
+#include "widgets/ege-paint-def.h"
#include "widgets/gradient-image.h"
#include "widgets/spinbutton-events.h"
#include "widgets/spw-utilities.h"
@@ -98,7 +99,7 @@ struct DropTracker {
/* Drag and Drop */
enum ui_drop_target_info {
- APP_X_COLOR
+ APP_OSWB_COLOR
};
//TODO: warning: deprecated conversion from string constant to ‘gchar*’
@@ -108,7 +109,7 @@ enum ui_drop_target_info {
// code, those warnings are actually desired. They say "Hey! Fix this". We
// definitely don't want to hide/ignore them. --JonCruz
static const GtkTargetEntry ui_drop_target_entries [] = {
- {g_strdup("application/x-color"), 0, APP_X_COLOR}
+ {g_strdup("application/x-oswb-color"), 0, APP_OSWB_COLOR}
};
static guint nui_drop_target_entries = G_N_ELEMENTS(ui_drop_target_entries);
@@ -508,30 +509,38 @@ void SelectedStyle::dragDataReceived( GtkWidget */*widget*/,
{
DropTracker* tracker = (DropTracker*)user_data;
- switch ( (int)tracker->item ) {
- case SS_FILL:
- case SS_STROKE:
- {
- if (gtk_selection_data_get_length(data) == 8 ) {
- gchar c[64];
- // Careful about endian issues.
- guint16* dataVals = (guint16*)gtk_selection_data_get_data(data);
- sp_svg_write_color( c, sizeof(c),
- SP_RGBA32_U_COMPOSE(
- 0x0ff & (dataVals[0] >> 8),
- 0x0ff & (dataVals[1] >> 8),
- 0x0ff & (dataVals[2] >> 8),
- 0xff // can't have transparency in the color itself
- //0x0ff & (data->data[3] >> 8),
- ));
- SPCSSAttr *css = sp_repr_css_attr_new();
- sp_repr_css_set_property( css, (tracker->item == SS_FILL) ? "fill":"stroke", c );
- sp_desktop_set_style( tracker->parent->_desktop, css );
- sp_repr_css_attr_unref( css );
- DocumentUndo::done( tracker->parent->_desktop->getDocument(), SP_VERB_NONE, _("Drop color"));
+ // copied from drag-and-drop.cpp, case APP_OSWB_COLOR
+ bool worked = false;
+ Glib::ustring colorspec;
+ if (gtk_selection_data_get_format(data) == 8) {
+ ege::PaintDef color;
+ worked = color.fromMIMEData("application/x-oswb-color",
+ reinterpret_cast<char const *>(gtk_selection_data_get_data(data)),
+ gtk_selection_data_get_length(data),
+ gtk_selection_data_get_format(data));
+ if (worked) {
+ if (color.getType() == ege::PaintDef::CLEAR) {
+ colorspec = ""; // TODO check if this is sufficient
+ } else if (color.getType() == ege::PaintDef::NONE) {
+ colorspec = "none";
+ } else {
+ unsigned int r = color.getR();
+ unsigned int g = color.getG();
+ unsigned int b = color.getB();
+
+ gchar* tmp = g_strdup_printf("#%02x%02x%02x", r, g, b);
+ colorspec = tmp;
+ g_free(tmp);
}
}
- break;
+ }
+ if (worked) {
+ SPCSSAttr *css = sp_repr_css_attr_new();
+ sp_repr_css_set_property(css, (tracker->item == SS_FILL) ? "fill":"stroke", colorspec.c_str());
+
+ sp_desktop_set_style(tracker->parent->_desktop, css);
+ sp_repr_css_attr_unref(css);
+ DocumentUndo::done(tracker->parent->_desktop->getDocument(), SP_VERB_NONE, _("Drop color"));
}
}