index 6274215cfd413c8ccaec71eae5ce659acc67465a..284a8a59676086daf05ef6df619bf913cd8ab9a2 100644 (file)
-#define __SP_DASH_SELECTOR_C__
+#define __SP_DASH_SELECTOR_NEW_C__
-/*
- * Optionmenu for selecting dash patterns
- *
- * Author:
+/** @file
+ * @brief Option menu for selecting dash patterns - implementation
+ */
+/* Author:
* Lauris Kaplinski <lauris@kaplinski.com>
* bulia byak <buliabyak@users.sf.net>
+ * Maximilian Albert <maximilian.albert@gmail.com>
*
* Copyright (C) 2002 Lauris Kaplinski
*
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
+
+#include <cstring>
+#include <string>
#include <libnr/nr-macros.h>
#include <gtk/gtk.h>
-
#include <glibmm/i18n.h>
-#include "../style.h"
-#include "../dialogs/dialog-events.h"
-
-#include "dash-selector.h"
-enum {CHANGED, LAST_SIGNAL};
+#include "style.h"
+#include "dialogs/dialog-events.h"
+#include "preferences.h"
-struct SPDashSelector {
- GtkHBox hbox;
+#include <gtkmm/optionmenu.h>
+#include <gtkmm/adjustment.h>
+#include <gtkmm/spinbutton.h>
- GtkWidget *dash;
- GtkObject *offset;
-};
-struct SPDashSelectorClass {
- GtkHBoxClass parent_class;
+#include "dash-selector.h"
- void (* changed) (SPDashSelector *dsel);
-};
+gchar const *const SPDashSelector::_prefs_path = "/palette/dashes";
-double dash_0[] = {-1.0};
-double dash_1_1[] = {1.0, 1.0, -1.0};
-double dash_2_1[] = {2.0, 1.0, -1.0};
-double dash_4_1[] = {4.0, 1.0, -1.0};
-double dash_1_2[] = {1.0, 2.0, -1.0};
-double dash_1_4[] = {1.0, 4.0, -1.0};
+static double dash_0[] = {-1.0};
+static double dash_1_1[] = {1.0, 1.0, -1.0};
+static double dash_2_1[] = {2.0, 1.0, -1.0};
+static double dash_4_1[] = {4.0, 1.0, -1.0};
+static double dash_1_2[] = {1.0, 2.0, -1.0};
+static double dash_1_4[] = {1.0, 4.0, -1.0};
-double *builtin_dashes[] = {dash_0, dash_1_1, dash_2_1, dash_4_1, dash_1_2, dash_1_4, NULL};
+static double *builtin_dashes[] = {dash_0, dash_1_1, dash_2_1, dash_4_1, dash_1_2, dash_1_4, NULL};
static double **dashes = NULL;
-static void sp_dash_selector_class_init (SPDashSelectorClass *klass);
-static void sp_dash_selector_init (SPDashSelector *dsel);
-static GtkWidget *sp_dash_selector_menu_item_new (SPDashSelector *dsel, double *pattern);
-static void sp_dash_selector_dash_activate (GtkObject *object, SPDashSelector *dsel);
-static void sp_dash_selector_offset_value_changed (GtkAdjustment *adj, SPDashSelector *dsel);
+static void sp_dash_selector_menu_item_image_realize(Gtk::Image *px, double *pattern);
-static GtkHBoxClass *parent_class;
-static guint signals[LAST_SIGNAL] = {0};
+SPDashSelector::SPDashSelector() {
+ // TODO: find something more sensible here!!
+ init_dashes();
-GtkType
-sp_dash_selector_get_type (void)
-{
- static GtkType type = 0;
- if (!type) {
- GtkTypeInfo info = {
- "SPDashSelector",
- sizeof (SPDashSelector),
- sizeof (SPDashSelectorClass),
- (GtkClassInitFunc) sp_dash_selector_class_init,
- (GtkObjectInitFunc) sp_dash_selector_init,
- NULL, NULL, NULL
- };
- type = gtk_type_unique (GTK_TYPE_HBOX, &info);
- }
- return type;
-}
+ Gtk::Tooltips *tt = new Gtk::Tooltips();
-static void
-sp_dash_selector_class_init (SPDashSelectorClass *klass)
-{
- parent_class = (GtkHBoxClass*)gtk_type_class (GTK_TYPE_HBOX);
-
- signals[CHANGED] = gtk_signal_new ("changed",
- (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
- G_TYPE_FROM_CLASS (klass),
- GTK_SIGNAL_OFFSET (SPDashSelectorClass, changed),
- gtk_marshal_NONE__NONE,
- GTK_TYPE_NONE, 0);
-}
+ dash = new Gtk::OptionMenu();
+ tt->set_tip(*dash, _("Dash pattern"));
+ dash->show();
+ this->pack_start(*dash, false, false, 0);
-static void
-sp_dash_selector_init (SPDashSelector *dsel)
-{
- GtkTooltips *tt = gtk_tooltips_new();
-
- dsel->dash = gtk_option_menu_new ();
- gtk_tooltips_set_tip (tt, dsel->dash, _("Dash pattern"), NULL);
- gtk_widget_show (dsel->dash);
- gtk_box_pack_start (GTK_BOX (dsel), dsel->dash, FALSE, FALSE, 0);
-
- GtkWidget *m = gtk_menu_new ();
- gtk_widget_show (m);
- for (int i = 0; dashes[i]; i++) {
- GtkWidget *mi = sp_dash_selector_menu_item_new (dsel, dashes[i]);
- gtk_widget_show (mi);
- gtk_menu_append (GTK_MENU (m), mi);
- }
- gtk_option_menu_set_menu (GTK_OPTION_MENU (dsel->dash), m);
+ Gtk::Menu *m = new Gtk::Menu();
+ m->show();
+ for (int i = 0; dashes[i]; i++) {
+ Gtk::MenuItem *mi = menu_item_new(dashes[i]);
+ mi->show();
+ m->append(*mi);
+ }
+ dash->set_menu(*m);
- dsel->offset = gtk_adjustment_new (0.0, 0.0, 10.0, 0.1, 1.0, 1.0);
- GtkWidget *sb = gtk_spin_button_new (GTK_ADJUSTMENT (dsel->offset), 0.1, 2);
- gtk_tooltips_set_tip (tt, sb, _("Pattern offset"), NULL);
+ offset = new Gtk::Adjustment(0.0, 0.0, 10.0, 0.1, 1.0, 1.0);
+ Gtk::SpinButton *sb = new Gtk::SpinButton(*offset, 0.1, 2);
+ tt->set_tip(*sb, _("Pattern offset"));
- sp_dialog_defocus_on_enter (sb);
- gtk_widget_show (sb);
- gtk_box_pack_start (GTK_BOX (dsel), sb, FALSE, FALSE, 0);
- gtk_signal_connect (dsel->offset, "value_changed", GTK_SIGNAL_FUNC (sp_dash_selector_offset_value_changed), dsel);
+ sp_dialog_defocus_on_enter_cpp(sb);
+ sb->show();
+ this->pack_start(*sb, false, false, 0);
+ offset->signal_value_changed().connect(sigc::mem_fun(*this, &SPDashSelector::offset_value_changed));
- gtk_object_set_data (GTK_OBJECT (dsel), "pattern", dashes[0]);
+ this->set_data("pattern", dashes[0]);
}
-GtkWidget *
-sp_dash_selector_new (Inkscape::XML::Node *drepr)
-{
- if (!dashes) {
- int ndashes = 0;
- if (drepr) {
- for (Inkscape::XML::Node *dr = drepr->firstChild(); dr; dr = dr->next()) {
- if (!strcmp (dr->name(), "dash"))
- ndashes += 1;
- }
- }
-
- if (ndashes > 0) {
- int pos = 0;
- SPStyle *style = sp_style_new ();
- dashes = g_new (double *, ndashes + 1);
- for (Inkscape::XML::Node *dr = drepr->firstChild(); dr; dr = dr->next()) {
- if (!strcmp (dr->name(), "dash")) {
- sp_style_read_from_repr (style, dr);
- if (style->stroke_dash.n_dash > 0) {
- dashes[pos] = g_new (double, style->stroke_dash.n_dash + 1);
- double *d = dashes[pos];
- int i = 0;
- for (; i < style->stroke_dash.n_dash; i++) {
- d[i] = style->stroke_dash.dash[i];
- }
- d[i] = -1;
- } else {
- dashes[pos] = dash_0;
- }
- pos += 1;
- }
- }
- sp_style_unref (style);
- dashes[pos] = NULL;
- } else {
- dashes = builtin_dashes;
- }
- }
-
- GtkWidget *dsel = (GtkWidget*)gtk_type_new (SP_TYPE_DASH_SELECTOR);
+SPDashSelector::~SPDashSelector() {
+ // FIXME: for some reason this doesn't get called; does the call to manage() in
+ // sp_stroke_style_line_widget_new() not processed correctly?
+ delete dash;
+ delete offset;
+}
- return dsel;
+void
+SPDashSelector::init_dashes() {
+ if (!dashes) {
+
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ std::vector<Glib::ustring> dash_prefs = prefs->getAllDirs(_prefs_path);
+
+ if (!dash_prefs.empty()) {
+ int pos = 0;
+ SPStyle *style = sp_style_new (NULL);
+ dashes = g_new (double *, dash_prefs.size() + 1);
+
+ for (std::vector<Glib::ustring>::iterator i = dash_prefs.begin(); i != dash_prefs.end(); ++i) {
+ sp_style_read_from_prefs(style, *i);
+
+ if (style->stroke_dash.n_dash > 0) {
+ dashes[pos] = g_new (double, style->stroke_dash.n_dash + 1);
+ double *d = dashes[pos];
+ int i = 0;
+ for (; i < style->stroke_dash.n_dash; i++) {
+ d[i] = style->stroke_dash.dash[i];
+ }
+ d[i] = -1;
+ } else {
+ dashes[pos] = dash_0;
+ }
+ pos += 1;
+ }
+ } else {
+ dashes = builtin_dashes;
+ }
+ }
}
void
-sp_dash_selector_set_dash (SPDashSelector *dsel, int ndash, double *dash, double offset)
+SPDashSelector::set_dash (int ndash, double *dash, double o)
{
- int pos = 0;
- if (ndash > 0) {
- double delta = 0.0;
- for (int i = 0; i < ndash; i++)
- delta += dash[i];
- delta /= 1000.0;
-
- for (int i = 0; dashes[i]; i++) {
- double *pattern = dashes[i];
- int np = 0;
- while (pattern[np] >= 0.0)
- np += 1;
- if (np == ndash) {
- int j;
- for (j = 0; j < ndash; j++) {
- if (!NR_DF_TEST_CLOSE (dash[j], pattern[j], delta))
- break;
- }
- if (j == ndash) {
- pos = i;
- break;
- }
- }
- }
- }
-
- gtk_object_set_data (GTK_OBJECT (dsel), "pattern", dashes[pos]);
- gtk_option_menu_set_history (GTK_OPTION_MENU (dsel->dash), pos);
- gtk_adjustment_set_value (GTK_ADJUSTMENT (dsel->offset), offset);
+ int pos = 0;
+ if (ndash > 0) {
+ double delta = 0.0;
+ for (int i = 0; i < ndash; i++)
+ delta += dash[i];
+ delta /= 1000.0;
+
+ for (int i = 0; dashes[i]; i++) {
+ double *pattern = dashes[i];
+ int np = 0;
+ while (pattern[np] >= 0.0)
+ np += 1;
+ if (np == ndash) {
+ int j;
+ for (j = 0; j < ndash; j++) {
+ if (!NR_DF_TEST_CLOSE (dash[j], pattern[j], delta))
+ break;
+ }
+ if (j == ndash) {
+ pos = i;
+ break;
+ }
+ }
+ }
+ }
+
+ this->set_data("pattern", dashes[pos]);
+ this->dash->set_history(pos);
+ this->offset->set_value(o);
}
void
-sp_dash_selector_get_dash (SPDashSelector *dsel, int *ndash, double **dash, double *offset)
+SPDashSelector::get_dash(int *ndash, double **dash, double *off)
{
- double *pattern = (double*)gtk_object_get_data (GTK_OBJECT (dsel), "pattern");
-
- int nd = 0;
- while (pattern[nd] >= 0.0)
- nd += 1;
-
- if (nd > 0) {
- if (ndash)
- *ndash = nd;
- if (dash) {
- *dash = g_new (double, nd);
- memcpy (*dash, pattern, nd * sizeof (double));
- }
- if (offset)
- *offset = GTK_ADJUSTMENT (dsel->offset)->value;
- } else {
- if (ndash)
- *ndash = 0;
- if (dash)
- *dash = NULL;
- if (offset)
- *offset = 0.0;
- }
+ double *pattern = (double*) this->get_data("pattern");
+
+ int nd = 0;
+ while (pattern[nd] >= 0.0)
+ nd += 1;
+
+ if (nd > 0) {
+ if (ndash)
+ *ndash = nd;
+ if (dash) {
+ *dash = g_new (double, nd);
+ memcpy (*dash, pattern, nd * sizeof (double));
+ }
+ if (off)
+ *off = offset->get_value();
+ } else {
+ if (ndash)
+ *ndash = 0;
+ if (dash)
+ *dash = NULL;
+ if (off)
+ *off = 0.0;
+ }
}
-bool
+Gtk::MenuItem *
+SPDashSelector::menu_item_new(double *pattern)
+{
+ Gtk::MenuItem *mi = new Gtk::MenuItem();
+ Gtk::Image *px = new Gtk::Image();
+
+ px->show();
+ mi->add(*px);
+
+ mi->set_data("pattern", pattern);
+ mi->set_data("px", px);
+ mi->signal_activate().connect(sigc::bind(sigc::mem_fun(*this, &SPDashSelector::dash_activate), mi));
+
+ px->signal_realize().connect(sigc::bind(sigc::ptr_fun(&sp_dash_selector_menu_item_image_realize), px, pattern));
+
+ return mi;
+}
+
+static bool
all_even_are_zero (double *pattern, int n)
{
for (int i = 0; i < n; i += 2) {
return true;
}
-bool
+static bool
all_odd_are_zero (double *pattern, int n)
{
for (int i = 1; i < n; i += 2) {
return true;
}
-static GtkWidget *
-sp_dash_selector_menu_item_new (SPDashSelector *dsel, double *pattern)
-{
- GtkWidget *mi = gtk_menu_item_new ();
-
- GdkPixmap *pixmap = gdk_pixmap_new (GTK_WIDGET (dsel)->window, DASH_PREVIEW_LENGTH + 4, 16, gdk_visual_get_best_depth ());
- GdkGC *gc = gdk_gc_new (pixmap);
-
- gdk_rgb_gc_set_foreground (gc, 0xffffffff);
- gdk_draw_rectangle (pixmap, gc, TRUE, 0, 0, DASH_PREVIEW_LENGTH + 4, 16);
-
- // FIXME: all of the below twibblering is due to the limitations of gdk_gc_set_dashes (only integers, no zeroes).
- // Perhaps would make sense to rework this with manually drawn dashes.
-
- // Fill in the integer array of pixel-lengths, for display
- gint8 pixels_i[64];
- gdouble pixels_d[64];
- int n_source_dashes = 0;
- int n_pixel_dashes = 0;
-
- signed int i_s, i_p;
- for (i_s = 0, i_p = 0; pattern[i_s] >= 0.0; i_s ++, i_p ++) {
- pixels_d[i_p] = 0.0;
- }
-
- n_source_dashes = i_s;
-
- for (i_s = 0, i_p = 0; i_s < n_source_dashes; i_s ++, i_p ++) {
-
- // calculate the pixel length corresponding to the current dash
- gdouble pixels = DASH_PREVIEW_WIDTH * pattern[i_s];
-
- if (pixels > 0.0)
- pixels_d [i_p] += pixels;
- else {
- if (i_p >= 1) {
- // dash is zero, skip this element in the array, and set pointer backwards so the next dash is added to the previous
- i_p -= 2;
- } else {
- // the first dash is zero; bad luck, gdk cannot start pattern with non-stroke, so we put a 1-pixel stub here
- // (it may turn out not shown, though, see special cases below)
- pixels_d [i_p] = 1.0;
- }
- }
- }
-
- n_pixel_dashes = i_p;
-
- gdouble longest_dash = 0.0;
-
- // after summation, convert double dash lengths to ints
- for (i_p = 0; i_p < n_pixel_dashes; i_p ++) {
- pixels_i [i_p] = (gint8) (pixels_d [i_p] + 0.5);
- // zero-length dashes are already eliminated, so the <1 dash is short but not zero;
- // we approximate it with a one-pixel mark
- if (pixels_i [i_p] < 1)
- pixels_i [i_p] = 1;
- if (i_p % 2 == 0) { // it's a dash
- if (pixels_d [i_p] > longest_dash)
- longest_dash = pixels_d [i_p];
- }
- }
-
- if (longest_dash > 1e-18 && longest_dash < 0.5) {
- // fake "shortening" of one-pixel marks by painting them lighter-than-black
- gint rgb = 255 - (gint) (255 * longest_dash / 0.5);
- gdk_rgb_gc_set_foreground (gc, SP_RGBA32_U_COMPOSE (rgb, rgb, rgb, rgb));
- } else {
- gdk_rgb_gc_set_foreground (gc, 0x00000000);
- }
-
- if (n_source_dashes > 0) {
- // special cases:
- if (all_even_are_zero (pattern, n_source_dashes)) {
- ; // do not draw anything, only gaps are non-zero
- } else if (all_odd_are_zero (pattern, n_source_dashes)) {
- // draw solid line, only dashes are non-zero
- gdk_gc_set_line_attributes (gc, DASH_PREVIEW_WIDTH,
- GDK_LINE_SOLID, GDK_CAP_BUTT,
- GDK_JOIN_MITER);
- gdk_draw_line (pixmap, gc, 4, 8, DASH_PREVIEW_LENGTH, 8);
- } else {
- // regular pattern with both gaps and dashes non-zero
- gdk_gc_set_line_attributes (gc, DASH_PREVIEW_WIDTH,
- GDK_LINE_ON_OFF_DASH, GDK_CAP_BUTT,
- GDK_JOIN_MITER);
- gdk_gc_set_dashes (gc, 0, pixels_i, n_pixel_dashes);
- gdk_draw_line (pixmap, gc, 4, 8, DASH_PREVIEW_LENGTH, 8);
- }
- } else {
- // no pattern, draw solid line
- gdk_gc_set_line_attributes (gc, DASH_PREVIEW_WIDTH,
- GDK_LINE_SOLID, GDK_CAP_BUTT,
- GDK_JOIN_MITER);
- gdk_draw_line (pixmap, gc, 4, 8, DASH_PREVIEW_LENGTH, 8);
- }
-
- gdk_gc_unref (gc);
-
- GtkWidget *px = gtk_pixmap_new (pixmap, NULL);
-
- gdk_pixmap_unref (pixmap);
-
- gtk_widget_show (px);
- gtk_container_add (GTK_CONTAINER (mi), px);
-
- gtk_object_set_data (GTK_OBJECT (mi), "pattern", pattern);
- gtk_signal_connect (GTK_OBJECT (mi), "activate", G_CALLBACK (sp_dash_selector_dash_activate), dsel);
-
- return mi;
+static void sp_dash_selector_menu_item_image_realize(Gtk::Image *px, double *pattern) {
+ Glib::RefPtr<Gdk::Pixmap> pixmap = Gdk::Pixmap::create(px->get_window(), DASH_PREVIEW_LENGTH + 4, 16, -1);
+ Glib::RefPtr<Gdk::GC> gc = Gdk::GC::create(pixmap);
+
+ gc->set_rgb_fg_color(Gdk::Color("#ffffff"));
+ pixmap->draw_rectangle(gc, true, 0, 0, DASH_PREVIEW_LENGTH + 4, 16);
+
+ // FIXME: all of the below twibblering is due to the limitations of gdk_gc_set_dashes (only integers, no zeroes).
+ // Perhaps would make sense to rework this with manually drawn dashes.
+
+ // Fill in the integer array of pixel-lengths, for display
+ gint8 pixels_i[64];
+ gdouble pixels_d[64];
+ int n_source_dashes = 0;
+ int n_pixel_dashes = 0;
+
+ signed int i_s, i_p;
+ for (i_s = 0, i_p = 0; pattern[i_s] >= 0.0; i_s ++, i_p ++) {
+ pixels_d[i_p] = 0.0;
+ }
+
+ n_source_dashes = i_s;
+
+ for (i_s = 0, i_p = 0; i_s < n_source_dashes; i_s ++, i_p ++) {
+ // calculate the pixel length corresponding to the current dash
+ gdouble pixels = DASH_PREVIEW_WIDTH * pattern[i_s];
+
+ if (pixels > 0.0)
+ pixels_d [i_p] += pixels;
+ else {
+ if (i_p >= 1) {
+ // dash is zero, skip this element in the array, and set pointer backwards
+ // so the next dash is added to the previous
+ i_p -= 2;
+ } else {
+ // the first dash is zero; bad luck, gdk cannot start pattern with non-stroke, so we
+ // put a 1-pixel stub here (it may turn out not shown, though, see special cases below)
+ pixels_d [i_p] = 1.0;
+ }
+ }
+ }
+
+ n_pixel_dashes = i_p;
+
+ gdouble longest_dash = 0.0;
+
+ // after summation, convert double dash lengths to ints
+ for (i_p = 0; i_p < n_pixel_dashes; i_p ++) {
+ pixels_i [i_p] = (gint8) (pixels_d [i_p] + 0.5);
+ // zero-length dashes are already eliminated, so the <1 dash is short but not zero;
+ // we approximate it with a one-pixel mark
+ if (pixels_i [i_p] < 1)
+ pixels_i [i_p] = 1;
+ if (i_p % 2 == 0) { // it's a dash
+ if (pixels_d [i_p] > longest_dash)
+ longest_dash = pixels_d [i_p];
+ }
+ }
+
+ Gdk::Color color;
+ if (longest_dash > 1e-18 && longest_dash < 0.5) {
+ // fake "shortening" of one-pixel marks by painting them lighter-than-black
+ gint rgb = 0xffff - (gint) (0xffff * longest_dash / 0.5);
+ color.set_rgb(rgb, rgb, rgb);
+ gc->set_rgb_fg_color(color);
+ } else {
+ color.set_rgb(0, 0, 0);
+ gc->set_rgb_fg_color(color);
+ }
+
+ if (n_source_dashes > 0) {
+ // special cases:
+ if (all_even_are_zero (pattern, n_source_dashes)) {
+ ; // do not draw anything, only gaps are non-zero
+ } else if (all_odd_are_zero (pattern, n_source_dashes)) {
+ // draw solid line, only dashes are non-zero
+ gc->set_line_attributes(DASH_PREVIEW_WIDTH,
+ Gdk::LINE_SOLID, Gdk::CAP_BUTT,
+ Gdk::JOIN_MITER);
+ pixmap->draw_line(gc, 4, 8, DASH_PREVIEW_LENGTH, 8);
+ } else {
+ // regular pattern with both gaps and dashes non-zero
+ gc->set_line_attributes(DASH_PREVIEW_WIDTH, Gdk::LINE_ON_OFF_DASH, Gdk::CAP_BUTT, Gdk::JOIN_MITER);
+ gc->set_dashes(0, pixels_i, n_pixel_dashes);
+ pixmap->draw_line(gc, 4, 8, DASH_PREVIEW_LENGTH, 8);
+ }
+ } else {
+ // no pattern, draw solid line
+ gc->set_line_attributes(DASH_PREVIEW_WIDTH, Gdk::LINE_SOLID, Gdk::CAP_BUTT, Gdk::JOIN_MITER);
+ pixmap->draw_line(gc, 4, 8, DASH_PREVIEW_LENGTH, 8);
+ }
+
+ Glib::RefPtr<Gdk::Bitmap> null_ptr;
+ px->set(pixmap, null_ptr);
}
-static void
-sp_dash_selector_dash_activate (GtkObject *object, SPDashSelector *dsel)
+void
+SPDashSelector::dash_activate (Gtk::MenuItem *mi)
{
- double *pattern = (double*)gtk_object_get_data (object, "pattern");
- gtk_object_set_data (GTK_OBJECT (dsel), "pattern", pattern);
+ double *pattern = (double*) mi->get_data("pattern");
+ this->set_data ("pattern", pattern);
- gtk_signal_emit (GTK_OBJECT (dsel), signals[CHANGED]);
+ changed_signal.emit();
}
-static void
-sp_dash_selector_offset_value_changed (GtkAdjustment *adj, SPDashSelector *dsel)
+
+void
+SPDashSelector::offset_value_changed()
{
- gtk_signal_emit (GTK_OBJECT (dsel), signals[CHANGED]);
+ changed_signal.emit();
}
+
+/*
+ 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 :