summaryrefslogtreecommitdiffstats
path: root/src/ui/widget/style-swatch.cpp
diff options
context:
space:
mode:
authorMenTaLguY <mental@rydia.net>2006-01-16 02:36:01 +0000
committermental <mental@users.sourceforge.net>2006-01-16 02:36:01 +0000
commit179fa413b047bede6e32109e2ce82437c5fb8d34 (patch)
treea5a6ac2c1708bd02288fbd8edb2ff500ff2e0916 /src/ui/widget/style-swatch.cpp
downloadinkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.tar.gz
inkscape-179fa413b047bede6e32109e2ce82437c5fb8d34.zip
moving trunk for module inkscape
(bzr r1)
Diffstat (limited to 'src/ui/widget/style-swatch.cpp')
-rw-r--r--src/ui/widget/style-swatch.cpp244
1 files changed, 244 insertions, 0 deletions
diff --git a/src/ui/widget/style-swatch.cpp b/src/ui/widget/style-swatch.cpp
new file mode 100644
index 000000000..5d4623c19
--- /dev/null
+++ b/src/ui/widget/style-swatch.cpp
@@ -0,0 +1,244 @@
+/**
+ * \brief Static style swatch (fill, stroke, opacity)
+ *
+ * Author:
+ * buliabyak@gmail.com
+ *
+ * Copyright (C) 2005 author
+ *
+ * Released under GNU GPL. Read the file 'COPYING' for more information.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include "style-swatch.h"
+
+#include "widgets/spw-utilities.h"
+#include "ui/widget/color-preview.h"
+
+#include "style.h"
+#include "sp-linear-gradient-fns.h"
+#include "sp-radial-gradient-fns.h"
+#include "sp-pattern.h"
+#include "xml/repr.h"
+#include "widgets/widget-sizes.h"
+#include "helper/units.h"
+
+enum {
+ SS_FILL,
+ SS_STROKE
+};
+
+
+namespace Inkscape {
+namespace UI {
+namespace Widget {
+
+StyleSwatch::StyleSwatch(SPCSSAttr *css)
+ : _css (NULL),
+
+ _table(2, 6),
+
+ _sw_unit(NULL),
+
+ _tooltips ()
+{
+ _label[SS_FILL].set_markup(_("F:"));
+ _label[SS_STROKE].set_markup(_("S:"));
+
+ for (int i = SS_FILL; i <= SS_STROKE; i++) {
+ _label[i].set_alignment(0.0, 0.5);
+ _label[i].set_padding(0, 0);
+
+ _color_preview[i] = new Inkscape::UI::Widget::ColorPreview (0);
+ }
+
+ _opacity_value.set_alignment(0.0, 0.5);
+ _opacity_value.set_padding(0, 0);
+
+ _table.set_col_spacings (2);
+ _table.set_row_spacings (0);
+
+ _stroke.pack_start(_place[SS_STROKE]);
+ _stroke_width_place.add(_stroke_width);
+ _stroke.pack_start(_stroke_width_place, Gtk::PACK_SHRINK);
+
+ _table.attach(_label[SS_FILL], 0,1, 0,1, Gtk::SHRINK, Gtk::SHRINK);
+ _table.attach(_label[SS_STROKE], 0,1, 1,2, Gtk::SHRINK, Gtk::SHRINK);
+
+ _table.attach(_place[SS_FILL], 1,2, 0,1);
+ _table.attach(_stroke, 1,2, 1,2);
+
+ _opacity_place.add(_opacity_value);
+ _table.attach(_opacity_place, 2,3, 0,2, Gtk::SHRINK, Gtk::SHRINK);
+
+ pack_start(_table, true, true, 0);
+
+ set_size_request (STYLE_SWATCH_WIDTH, -1);
+
+ sp_set_font_size_smaller (GTK_WIDGET(_opacity_value.gobj()));
+ sp_set_font_size_smaller (GTK_WIDGET(_stroke_width.gobj()));
+ for (int i = SS_FILL; i <= SS_STROKE; i++) {
+ sp_set_font_size_smaller (GTK_WIDGET(_value[i].gobj()));
+ sp_set_font_size_smaller (GTK_WIDGET(_place[i].gobj()));
+ sp_set_font_size_smaller (GTK_WIDGET(_label[i].gobj()));
+ }
+
+ setStyle (css);
+}
+
+StyleSwatch::~StyleSwatch()
+{
+ if (_css)
+ sp_repr_css_attr_unref (_css);
+
+ for (int i = SS_FILL; i <= SS_STROKE; i++) {
+ delete _color_preview[i];
+ }
+}
+
+void
+StyleSwatch::setStyle(SPCSSAttr *css)
+{
+ if (_css)
+ sp_repr_css_attr_unref (_css);
+ _css = sp_repr_css_attr_new();
+ sp_repr_css_merge(_css, css);
+
+ gchar const *css_string = sp_repr_css_write_string (_css);
+ SPStyle *temp_spstyle = sp_style_new();
+ sp_style_merge_from_style_string (temp_spstyle, css_string);
+
+ setStyle (temp_spstyle);
+
+ sp_style_unref (temp_spstyle);
+}
+
+void
+StyleSwatch::setStyle(SPStyle *query)
+{
+ _place[SS_FILL].remove();
+ _place[SS_STROKE].remove();
+
+ bool has_stroke = true;
+
+ for (int i = SS_FILL; i <= SS_STROKE; i++) {
+ Gtk::EventBox *place = &(_place[i]);
+
+ SPIPaint *paint;
+ if (i == SS_FILL) {
+ paint = &(query->fill);
+ } else {
+ paint = &(query->stroke);
+ }
+
+ if (paint->set && paint->type == SP_PAINT_TYPE_COLOR) {
+ guint32 color = sp_color_get_rgba32_falpha (&(paint->value.color),
+ SP_SCALE24_TO_FLOAT ((i == SS_FILL)? query->fill_opacity.value : query->stroke_opacity.value));
+ ((Inkscape::UI::Widget::ColorPreview*)_color_preview[i])->setRgba32 (color);
+ _color_preview[i]->show_all();
+ place->add(*_color_preview[i]);
+ gchar *tip;
+ if (i == SS_FILL) {
+ tip = g_strdup_printf ("Fill: %06x/%.3g", color >> 8, SP_RGBA32_A_F(color));
+ } else {
+ tip = g_strdup_printf ("Stroke: %06x/%.3g", color >> 8, SP_RGBA32_A_F(color));
+ }
+ _tooltips.set_tip(*place, tip);
+ g_free (tip);
+ } else if (paint->set && paint->type == SP_PAINT_TYPE_PAINTSERVER) {
+ SPPaintServer *server = (i == SS_FILL)? SP_STYLE_FILL_SERVER (query) : SP_STYLE_STROKE_SERVER (query);
+
+ if (SP_IS_LINEARGRADIENT (server)) {
+ _value[i].set_markup(_("L Gradient"));
+ place->add(_value[i]);
+ _tooltips.set_tip(*place, (i == SS_FILL)? (_("Linear gradient fill")) : (_("Linear gradient stroke")));
+ } else if (SP_IS_RADIALGRADIENT (server)) {
+ _value[i].set_markup(_("R Gradient"));
+ place->add(_value[i]);
+ _tooltips.set_tip(*place, (i == SS_FILL)? (_("Radial gradient fill")) : (_("Radial gradient stroke")));
+ } else if (SP_IS_PATTERN (server)) {
+ _value[i].set_markup(_("Pattern"));
+ place->add(_value[i]);
+ _tooltips.set_tip(*place, (i == SS_FILL)? (_("Pattern fill")) : (_("Pattern stroke")));
+ }
+
+ } else if (paint->set && paint->type == SP_PAINT_TYPE_NONE) {
+ _value[i].set_markup(_("None"));
+ place->add(_value[i]);
+ _tooltips.set_tip(*place, (i == SS_FILL)? (_("No fill")) : (_("No stroke")));
+ if (i == SS_STROKE) has_stroke = false;
+ } else if (!paint->set) {
+ _value[i].set_markup(_("Unset"));
+ place->add(_value[i]);
+ _tooltips.set_tip(*place, (i == SS_FILL)? (_("Unset fill")) : (_("Unset stroke")));
+ if (i == SS_STROKE) has_stroke = false;
+ }
+ }
+
+// Now query stroke_width
+ if (has_stroke) {
+ double w;
+ if (_sw_unit) {
+ w = sp_pixels_get_units(query->stroke_width.computed, *_sw_unit);
+ } else {
+ w = query->stroke_width.computed;
+ }
+
+ {
+ gchar *str = g_strdup_printf(" %.3g", w);
+ _stroke_width.set_markup(str);
+ g_free (str);
+ }
+ {
+ gchar *str = g_strdup_printf(_("Stroke width: %.5g%s"),
+ w,
+ _sw_unit? sp_unit_get_abbreviation(_sw_unit) : "px");
+ _tooltips.set_tip(_stroke_width_place, str);
+ g_free (str);
+ }
+ } else {
+ _tooltips.unset_tip(_stroke_width_place);
+ _stroke_width.set_markup ("");
+ }
+
+ gdouble op = SP_SCALE24_TO_FLOAT(query->opacity.value);
+ if (op != 1) {
+ {
+ gchar *str;
+ if (op == 0)
+ str = g_strdup_printf(_("0:%.3g"), op);
+ else
+ str = g_strdup_printf(_("0:.%d"), (int) (op*10));
+ _opacity_value.set_markup (str);
+ g_free (str);
+ }
+ {
+ gchar *str = g_strdup_printf(_("Opacity: %.3g"), op);
+ _tooltips.set_tip(_opacity_place, str);
+ g_free (str);
+ }
+ } else {
+ _tooltips.unset_tip(_opacity_place);
+ _opacity_value.set_markup ("");
+ }
+
+ show_all();
+}
+
+} // namespace Widget
+} // namespace UI
+} // namespace Inkscape
+
+/*
+ Local Variables:
+ mode:c++
+ c-file-style:"stroustrup"
+ c-file-offsets:((innamespace . 0)(inline-open . 0))
+ indent-tabs-mode:nil
+ fill-column:99
+ End:
+*/
+// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :