summaryrefslogtreecommitdiffstats
path: root/src/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/fill-style.cpp30
-rw-r--r--src/widgets/gradient-vector.cpp2
-rw-r--r--src/widgets/paint-selector.cpp74
-rw-r--r--src/widgets/paint-selector.h82
-rw-r--r--src/widgets/stroke-style.cpp8
5 files changed, 148 insertions, 48 deletions
diff --git a/src/widgets/fill-style.cpp b/src/widgets/fill-style.cpp
index 5e9d30bcd..0b08f36b5 100644
--- a/src/widgets/fill-style.cpp
+++ b/src/widgets/fill-style.cpp
@@ -184,7 +184,7 @@ sp_fill_style_widget_update (SPWidget *spw)
// create temporary style
SPStyle *query = sp_style_new (SP_ACTIVE_DOCUMENT);
// query style from desktop into it. This returns a result flag and fills query with the style of subselection, if any, or selection
- int result = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FILL);
+ int result = sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FILL);
switch (result) {
case QUERY_STYLE_NOTHING:
@@ -196,12 +196,12 @@ sp_fill_style_widget_update (SPWidget *spw)
case QUERY_STYLE_SINGLE:
case QUERY_STYLE_MULTIPLE_AVERAGED: // TODO: treat this slightly differently, e.g. display "averaged" somewhere in paint selector
- case QUERY_STYLE_MULTIPLE_SAME:
+ case QUERY_STYLE_MULTIPLE_SAME:
{
SPPaintSelectorMode pselmode = sp_style_determine_paint_selector_mode (query, true);
sp_paint_selector_set_mode (psel, pselmode);
- sp_paint_selector_set_fillrule (psel, query->fill_rule.computed == ART_WIND_RULE_NONZERO?
+ sp_paint_selector_set_fillrule (psel, query->fill_rule.computed == ART_WIND_RULE_NONZERO?
SP_PAINT_SELECTOR_FILLRULE_NONZERO : SP_PAINT_SELECTOR_FILLRULE_EVENODD);
if (query->fill.set && query->fill.isColor()) {
@@ -210,7 +210,9 @@ sp_fill_style_widget_update (SPWidget *spw)
SPPaintServer *server = SP_STYLE_FILL_SERVER (query);
- if (SP_IS_LINEARGRADIENT (server)) {
+ if (server && server->isSwatch()) {
+ sp_paint_selector_set_swatch( psel, server );
+ } else if (SP_IS_LINEARGRADIENT (server)) {
SPGradient *vector = sp_gradient_get_vector (SP_GRADIENT (server), FALSE);
sp_paint_selector_set_gradient_linear (psel, vector);
@@ -279,7 +281,7 @@ sp_fill_style_widget_fillrule_changed ( SPPaintSelector */*psel*/,
sp_repr_css_attr_unref (css);
- sp_document_done (SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_FILL_STROKE,
+ sp_document_done (SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_FILL_STROKE,
_("Change fill rule"));
}
@@ -305,8 +307,8 @@ sp_fill_style_widget_paint_dragged (SPPaintSelector *psel, SPWidget *spw)
}
if (g_object_get_data (G_OBJECT (spw), "local")) {
- // previous local flag not cleared yet;
- // this means dragged events come too fast, so we better skip this one to speed up display
+ // previous local flag not cleared yet;
+ // this means dragged events come too fast, so we better skip this one to speed up display
// (it's safe to do this in any case)
return;
}
@@ -319,7 +321,7 @@ sp_fill_style_widget_paint_dragged (SPPaintSelector *psel, SPWidget *spw)
case SP_PAINT_SELECTOR_MODE_COLOR_CMYK:
{
sp_paint_selector_set_flat_color (psel, SP_ACTIVE_DESKTOP, "fill", "fill-opacity");
- sp_document_maybe_done (sp_desktop_document(SP_ACTIVE_DESKTOP), undo_label, SP_VERB_DIALOG_FILL_STROKE,
+ sp_document_maybe_done (sp_desktop_document(SP_ACTIVE_DESKTOP), undo_label, SP_VERB_DIALOG_FILL_STROKE,
_("Set fill color"));
g_object_set_data (G_OBJECT (spw), "local", GINT_TO_POINTER (TRUE)); // local change, do not update from selection
break;
@@ -381,7 +383,7 @@ sp_fill_style_widget_paint_changed ( SPPaintSelector *psel,
sp_repr_css_attr_unref (css);
- sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE,
+ sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE,
_("Remove fill"));
break;
}
@@ -462,7 +464,7 @@ sp_fill_style_widget_paint_changed ( SPPaintSelector *psel,
sp_repr_css_attr_unref (css);
- sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE,
+ sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE,
_("Set gradient on fill"));
}
break;
@@ -509,13 +511,17 @@ sp_fill_style_widget_paint_changed ( SPPaintSelector *psel,
} // end if
- sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE,
+ sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE,
_("Set pattern on fill"));
} // end if
break;
+ case SP_PAINT_SELECTOR_MODE_SWATCH:
+ // TODO
+ break;
+
case SP_PAINT_SELECTOR_MODE_UNSET:
if (items) {
SPCSSAttr *css = sp_repr_css_attr_new ();
@@ -524,7 +530,7 @@ sp_fill_style_widget_paint_changed ( SPPaintSelector *psel,
sp_desktop_set_style (desktop, css);
sp_repr_css_attr_unref (css);
- sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE,
+ sp_document_done (document, SP_VERB_DIALOG_FILL_STROKE,
_("Unset fill"));
}
break;
diff --git a/src/widgets/gradient-vector.cpp b/src/widgets/gradient-vector.cpp
index 0a53cfb3e..8ffacb9f5 100644
--- a/src/widgets/gradient-vector.cpp
+++ b/src/widgets/gradient-vector.cpp
@@ -1170,7 +1170,7 @@ sp_gradient_vector_color_changed (SPColorSelector *csel, GtkObject *object)
/* Set start parameters */
/* We rely on normalized vector, i.e. stops HAVE to exist */
- g_return_if_fail (sp_first_stop(ngr) != NULL);
+ g_return_if_fail(ngr->getFirstStop() != NULL);
GtkOptionMenu *mnu = (GtkOptionMenu *)g_object_get_data (G_OBJECT(object), "stopmenu");
SPStop *stop = SP_STOP(g_object_get_data (G_OBJECT(gtk_menu_get_active (GTK_MENU(gtk_option_menu_get_menu (mnu)))), "stop"));
diff --git a/src/widgets/paint-selector.cpp b/src/widgets/paint-selector.cpp
index a101b9eeb..b91f24105 100644
--- a/src/widgets/paint-selector.cpp
+++ b/src/widgets/paint-selector.cpp
@@ -1,13 +1,16 @@
-#define __SP_PAINT_SELECTOR_C__
-
/** \file
* SPPaintSelector: Generic paint selector widget.
*/
/*
- * Copyright (C) Lauris Kaplinski 2002
+ * Authors:
+ * Lauris Kaplinski
* bulia byak <buliabyak@users.sf.net>
* John Cliff <simarilius@yahoo.com>
+ * Jon A. Cruz <jon@joncruz.org>
+ *
+ * Copyright (C) Lauris Kaplinski 2002
+ * Copyright (C) 2010 Authors
*/
#define noSP_PS_VERBOSE
@@ -80,6 +83,7 @@ static void sp_paint_selector_set_mode_none(SPPaintSelector *psel);
static void sp_paint_selector_set_mode_color(SPPaintSelector *psel, SPPaintSelectorMode mode);
static void sp_paint_selector_set_mode_gradient(SPPaintSelector *psel, SPPaintSelectorMode mode);
static void sp_paint_selector_set_mode_pattern(SPPaintSelector *psel, SPPaintSelectorMode mode);
+static void sp_paint_selector_set_mode_swatch(SPPaintSelector *psel, SPPaintSelectorMode mode);
static void sp_paint_selector_set_mode_unset(SPPaintSelector *psel);
@@ -187,6 +191,8 @@ sp_paint_selector_init(SPPaintSelector *psel)
SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL, tt, _("Radial gradient"));
psel->pattern = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_PATTERN,
SP_PAINT_SELECTOR_MODE_PATTERN, tt, _("Pattern"));
+ psel->swatch = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_SWATCH,
+ SP_PAINT_SELECTOR_MODE_SWATCH, tt, _("Swatch"));
psel->unset = sp_paint_selector_style_button_add(psel, INKSCAPE_ICON_PAINT_UNKNOWN,
SP_PAINT_SELECTOR_MODE_UNSET, tt, _("Unset paint (make it undefined so it can be inherited)"));
@@ -347,6 +353,9 @@ sp_paint_selector_set_mode(SPPaintSelector *psel, SPPaintSelectorMode mode)
case SP_PAINT_SELECTOR_MODE_PATTERN:
sp_paint_selector_set_mode_pattern(psel, mode);
break;
+ case SP_PAINT_SELECTOR_MODE_SWATCH:
+ sp_paint_selector_set_mode_swatch(psel, mode);
+ break;
case SP_PAINT_SELECTOR_MODE_UNSET:
sp_paint_selector_set_mode_unset(psel);
break;
@@ -398,6 +407,14 @@ sp_paint_selector_set_color_alpha(SPPaintSelector *psel, SPColor const *color, f
csel->base->setColorAlpha( *color, alpha );
}
+void sp_paint_selector_set_swatch(SPPaintSelector *psel, SPPaintServer */*server*/ )
+{
+#ifdef SP_PS_VERBOSE
+ g_print("PaintSelector set SWATCH\n");
+#endif
+ sp_paint_selector_set_mode(psel, SP_PAINT_SELECTOR_MODE_SWATCH);
+}
+
void
sp_paint_selector_set_gradient_linear(SPPaintSelector *psel, SPGradient *vector)
{
@@ -722,6 +739,7 @@ sp_paint_selector_set_style_buttons(SPPaintSelector *psel, GtkWidget *active)
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->gradient), (active == psel->gradient));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->radial), (active == psel->radial));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->pattern), (active == psel->pattern));
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->swatch), (active == psel->swatch));
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(psel->unset), (active == psel->unset));
}
@@ -1039,6 +1057,49 @@ sp_paint_selector_get_pattern(SPPaintSelector *psel)
return NULL;
}
+static void sp_paint_selector_set_mode_swatch(SPPaintSelector *psel, SPPaintSelectorMode mode)
+{
+ if (mode == SP_PAINT_SELECTOR_MODE_SWATCH) {
+ sp_paint_selector_set_style_buttons(psel, psel->swatch); // TODO swatch
+ }
+
+ gtk_widget_set_sensitive(psel->style, TRUE);
+
+ GtkWidget *tbl = NULL;
+
+ if (psel->mode == SP_PAINT_SELECTOR_MODE_SWATCH){
+ /* Already have pattern menu */
+ tbl = (GtkWidget*)gtk_object_get_data(GTK_OBJECT(psel->selector), "swatch-selector");
+ } else {
+ sp_paint_selector_clear_frame(psel);
+
+ /* Create vbox */
+ tbl = gtk_vbox_new(FALSE, 4);
+ gtk_widget_show(tbl);
+
+ {
+ GtkWidget *hb = gtk_hbox_new(FALSE, 0);
+ GtkWidget *l = gtk_label_new(NULL);
+ gtk_label_set_markup(GTK_LABEL(l), _("Represents a swatch fill."));
+ gtk_label_set_line_wrap(GTK_LABEL(l), true);
+ gtk_widget_set_size_request(l, 180, -1);
+ gtk_box_pack_start(GTK_BOX(hb), l, TRUE, TRUE, AUX_BETWEEN_BUTTON_GROUPS);
+ gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
+ }
+
+ gtk_widget_show_all(tbl);
+
+ gtk_container_add(GTK_CONTAINER(psel->frame), tbl);
+ psel->selector = tbl;
+ gtk_object_set_data(GTK_OBJECT(psel->selector), "swatch-selector", tbl);
+
+ gtk_frame_set_label(GTK_FRAME(psel->frame), _("Swatch fill"));
+ }
+#ifdef SP_PS_VERBOSE
+ g_print("Swatch req\n");
+#endif
+}
+
void
sp_paint_selector_set_flat_color(SPPaintSelector *psel, SPDesktop *desktop, gchar const *color_property, gchar const *opacity_property)
{
@@ -1068,8 +1129,7 @@ sp_paint_selector_set_flat_color(SPPaintSelector *psel, SPDesktop *desktop, gcha
sp_repr_css_attr_unref(css);
}
-SPPaintSelectorMode
-sp_style_determine_paint_selector_mode(SPStyle *style, bool isfill)
+SPPaintSelectorMode sp_style_determine_paint_selector_mode(SPStyle *style, bool isfill)
{
SPPaintSelectorMode mode = SP_PAINT_SELECTOR_MODE_UNSET;
SPIPaint& target = isfill ? style->fill : style->stroke;
@@ -1079,7 +1139,9 @@ sp_style_determine_paint_selector_mode(SPStyle *style, bool isfill)
} else if ( target.isPaintserver() ) {
SPPaintServer *server = isfill? SP_STYLE_FILL_SERVER(style) : SP_STYLE_STROKE_SERVER(style);
- if (SP_IS_LINEARGRADIENT(server)) {
+ if (server && server->isSwatch()) {
+ mode = SP_PAINT_SELECTOR_MODE_SWATCH;
+ } else if (SP_IS_LINEARGRADIENT(server)) {
mode = SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR;
} else if (SP_IS_RADIALGRADIENT(server)) {
mode = SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL;
diff --git a/src/widgets/paint-selector.h b/src/widgets/paint-selector.h
index de8bbf46a..82dee4d16 100644
--- a/src/widgets/paint-selector.h
+++ b/src/widgets/paint-selector.h
@@ -1,16 +1,22 @@
-#ifndef __SP_PAINT_SELECTOR_H__
-#define __SP_PAINT_SELECTOR_H__
+#ifndef SEEN_SP_PAINT_SELECTOR_H
+#define SEEN_SP_PAINT_SELECTOR_H
/** \file
* Generic paint selector widget
*
+ * Authors:
+ * Lauris
+ * Jon A. Cruz <jon@joncruz.org>
+ *
* Copyright (C) Lauris 2002
+ * Copyright (C) 2010 Authors
*
*/
#include <glib.h>
#include "sp-gradient-spread.h"
#include "sp-gradient-units.h"
+
class SPGradient;
#define SP_TYPE_PAINT_SELECTOR (sp_paint_selector_get_type ())
@@ -26,53 +32,60 @@ class SPGradient;
#include <libnr/nr-forward.h>
typedef enum {
- SP_PAINT_SELECTOR_MODE_EMPTY,
- SP_PAINT_SELECTOR_MODE_MULTIPLE,
- SP_PAINT_SELECTOR_MODE_NONE,
- SP_PAINT_SELECTOR_MODE_COLOR_RGB,
- SP_PAINT_SELECTOR_MODE_COLOR_CMYK,
- SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR,
+ SP_PAINT_SELECTOR_MODE_EMPTY,
+ SP_PAINT_SELECTOR_MODE_MULTIPLE,
+ SP_PAINT_SELECTOR_MODE_NONE,
+ SP_PAINT_SELECTOR_MODE_COLOR_RGB,
+ SP_PAINT_SELECTOR_MODE_COLOR_CMYK,
+ SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR,
SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL,
SP_PAINT_SELECTOR_MODE_PATTERN,
+ SP_PAINT_SELECTOR_MODE_SWATCH,
SP_PAINT_SELECTOR_MODE_UNSET
} SPPaintSelectorMode;
typedef enum {
- SP_PAINT_SELECTOR_FILLRULE_NONZERO,
- SP_PAINT_SELECTOR_FILLRULE_EVENODD
+ SP_PAINT_SELECTOR_FILLRULE_NONZERO,
+ SP_PAINT_SELECTOR_FILLRULE_EVENODD
} SPPaintSelectorFillRule;
/// Generic paint selector widget
struct SPPaintSelector {
- GtkVBox vbox;
+ GtkVBox vbox;
- guint update : 1;
+ guint update : 1;
- SPPaintSelectorMode mode;
+ SPPaintSelectorMode mode;
- GtkWidget *style;
- GtkWidget *none, *solid, *gradient, *radial, *pattern, *unset;
+ GtkWidget *style;
+ GtkWidget *none;
+ GtkWidget *solid;
+ GtkWidget *gradient;
+ GtkWidget *radial;
+ GtkWidget *pattern;
+ GtkWidget *swatch;
+ GtkWidget *unset;
- GtkWidget *fillrulebox;
- GtkWidget *evenodd, *nonzero;
+ GtkWidget *fillrulebox;
+ GtkWidget *evenodd, *nonzero;
- GtkWidget *frame, *selector;
+ GtkWidget *frame, *selector;
- SPColor color;
- float alpha;
+ SPColor color;
+ float alpha;
};
/// The SPPaintSelector vtable
struct SPPaintSelectorClass {
- GtkVBoxClass parent_class;
+ GtkVBoxClass parent_class;
- void (* mode_changed) (SPPaintSelector *psel, SPPaintSelectorMode mode);
+ void (* mode_changed) (SPPaintSelector *psel, SPPaintSelectorMode mode);
- void (* grabbed) (SPPaintSelector *psel);
- void (* dragged) (SPPaintSelector *psel);
- void (* released) (SPPaintSelector *psel);
- void (* changed) (SPPaintSelector *psel);
- void (* fillrule_changed) (SPPaintSelector *psel, SPPaintSelectorFillRule fillrule);
+ void (* grabbed) (SPPaintSelector *psel);
+ void (* dragged) (SPPaintSelector *psel);
+ void (* released) (SPPaintSelector *psel);
+ void (* changed) (SPPaintSelector *psel);
+ void (* fillrule_changed) (SPPaintSelector *psel, SPPaintSelectorFillRule fillrule);
};
GtkType sp_paint_selector_get_type (void);
@@ -88,6 +101,8 @@ void sp_paint_selector_set_gradient_linear (SPPaintSelector *psel, SPGradient *v
void sp_paint_selector_set_gradient_radial (SPPaintSelector *psel, SPGradient *vector);
+void sp_paint_selector_set_swatch(SPPaintSelector *psel, SPPaintServer *server );
+
void sp_paint_selector_set_gradient_properties (SPPaintSelector *psel, SPGradientUnits units, SPGradientSpread spread);
void sp_paint_selector_get_gradient_properties (SPPaintSelector *psel, SPGradientUnits *units, SPGradientSpread *spread);
@@ -107,4 +122,15 @@ void sp_paint_selector_set_flat_color (SPPaintSelector *psel, SPDesktop *desktop
SPPaintSelectorMode sp_style_determine_paint_selector_mode (SPStyle *style, bool isfill);
-#endif
+#endif // SEEN_SP_PAINT_SELECTOR_H
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
diff --git a/src/widgets/stroke-style.cpp b/src/widgets/stroke-style.cpp
index f502f87d3..51e70807c 100644
--- a/src/widgets/stroke-style.cpp
+++ b/src/widgets/stroke-style.cpp
@@ -204,7 +204,9 @@ sp_stroke_style_paint_update (SPWidget *spw)
SPPaintServer *server = SP_STYLE_STROKE_SERVER (query);
- if (SP_IS_LINEARGRADIENT (server)) {
+ if (server && server->isSwatch()) {
+ sp_paint_selector_set_swatch( psel, server );
+ } else if (SP_IS_LINEARGRADIENT (server)) {
SPGradient *vector = sp_gradient_get_vector (SP_GRADIENT (server), FALSE);
sp_paint_selector_set_gradient_linear (psel, vector);
@@ -443,6 +445,10 @@ sp_stroke_style_paint_changed(SPPaintSelector *psel, SPWidget *spw)
break;
+ case SP_PAINT_SELECTOR_MODE_SWATCH:
+ // TODO
+ break;
+
case SP_PAINT_SELECTOR_MODE_UNSET:
if (items) {
SPCSSAttr *css = sp_repr_css_attr_new ();