summaryrefslogtreecommitdiffstats
path: root/src/widgets
diff options
context:
space:
mode:
Diffstat (limited to 'src/widgets')
-rw-r--r--src/widgets/desktop-widget.cpp37
-rw-r--r--src/widgets/eek-preview.cpp35
-rw-r--r--src/widgets/font-selector.cpp39
-rw-r--r--src/widgets/gradient-selector.cpp10
-rw-r--r--src/widgets/gradient-toolbar.cpp11
-rw-r--r--src/widgets/gradient-vector.cpp31
-rw-r--r--src/widgets/paint-selector.cpp51
-rw-r--r--src/widgets/select-toolbar.cpp5
-rw-r--r--src/widgets/shrink-wrap-button.cpp4
-rw-r--r--src/widgets/sp-color-notebook.cpp5
-rw-r--r--src/widgets/sp-color-slider.cpp32
-rw-r--r--src/widgets/sp-widget.cpp2
-rw-r--r--src/widgets/sp-xmlview-attr-list.cpp58
-rw-r--r--src/widgets/sp-xmlview-attr-list.h4
-rw-r--r--src/widgets/sp-xmlview-tree.cpp546
-rw-r--r--src/widgets/sp-xmlview-tree.h14
-rw-r--r--src/widgets/stroke-marker-selector.cpp31
-rw-r--r--src/widgets/toolbox.cpp31
18 files changed, 711 insertions, 235 deletions
diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp
index bb1a0908c..44d3c2f9a 100644
--- a/src/widgets/desktop-widget.cpp
+++ b/src/widgets/desktop-widget.cpp
@@ -253,7 +253,14 @@ Geom::Point
SPDesktopWidget::window_get_pointer()
{
gint x,y;
- gdk_window_get_pointer(gtk_widget_get_window(GTK_WIDGET(canvas)), &x, &y, NULL);
+ GdkWindow *window = gtk_widget_get_window(GTK_WIDGET(canvas));
+
+#if GTK_CHECK_VERSION(3,0,0)
+ GdkDisplay *display = gdk_window_get_display(window);
+ gdk_window_get_device_position(window, display->core_pointer, &x, &y, NULL);
+#else
+ gdk_window_get_pointer(window, &x, &y, NULL);
+#endif
return Geom::Point(x,y);
}
@@ -325,10 +332,20 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
dtw->_interaction_disabled_counter = 0;
/* Main table */
+#if GTK_CHECK_VERSION(3,0,0)
+ dtw->vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_new(GTK_BOX(dtw->vbox), FALSE);
+#else
dtw->vbox = gtk_vbox_new (FALSE, 0);
+#endif
gtk_container_add( GTK_CONTAINER(dtw), GTK_WIDGET(dtw->vbox) );
+#if GTK_CHECK_VERSION(3,0,0)
+ dtw->statusbar = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(dtw->statusbar), FALSE);
+#else
dtw->statusbar = gtk_hbox_new (FALSE, 0);
+#endif
//gtk_widget_set_usize (dtw->statusbar, -1, BOTTOM_BAR_HEIGHT);
gtk_box_pack_end (GTK_BOX (dtw->vbox), dtw->statusbar, FALSE, TRUE, 0);
@@ -336,11 +353,16 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
using Inkscape::UI::Dialogs::SwatchesPanel;
dtw->panels = new SwatchesPanel("/embedded/swatches");
- dtw->panels->setOrientation( Gtk::ANCHOR_SOUTH );
+ dtw->panels->setOrientation(SP_ANCHOR_SOUTH);
gtk_box_pack_end( GTK_BOX( dtw->vbox ), GTK_WIDGET(dtw->panels->gobj()), FALSE, TRUE, 0 );
}
+#if GTK_CHECK_VERSION(3,0,0)
+ dtw->hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(dtw->hbox), FALSE);
+#else
dtw->hbox = gtk_hbox_new(FALSE, 0);
+#endif
gtk_box_pack_end( GTK_BOX (dtw->vbox), dtw->hbox, TRUE, TRUE, 0 );
gtk_widget_show(dtw->hbox);
@@ -395,7 +417,12 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
gtk_table_attach (GTK_TABLE (canvas_tbl), dtw->hscrollbar, 1, 2, 2, 3, (GtkAttachOptions)(GTK_FILL), (GtkAttachOptions)(GTK_SHRINK), 0, 0);
/* Vertical scrollbar and the sticky zoom button */
+#if GTK_CHECK_VERSION(3,0,0)
+ dtw->vscrollbar_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_new(GTK_BOX(dtw->vscrollbar_box), FALSE);
+#else
dtw->vscrollbar_box = gtk_vbox_new (FALSE, 0);
+#endif
dtw->sticky_zoom = sp_button_new_from_data ( Inkscape::ICON_SIZE_DECORATION,
SP_BUTTON_TYPE_TOGGLE,
NULL,
@@ -573,7 +600,13 @@ void SPDesktopWidget::init( SPDesktopWidget *dtw )
gtk_label_set_markup (GTK_LABEL (dtw->select_status), _("<b>Welcome to Inkscape!</b> Use shape or freehand tools to create objects; use selector (arrow) to move or transform them."));
// space label 2 pixels from left edge
gtk_container_add (GTK_CONTAINER (dtw->select_status_eventbox), dtw->select_status);
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_box_pack_start(GTK_BOX(dtw->statusbar),
+ gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0),
+ FALSE, FALSE, 2);
+#else
gtk_box_pack_start (GTK_BOX (dtw->statusbar), gtk_hbox_new(FALSE, 0), FALSE, FALSE, 2);
+#endif
gtk_box_pack_start (GTK_BOX (dtw->statusbar), dtw->select_status_eventbox, TRUE, TRUE, 0);
gtk_widget_show_all (dtw->vbox);
diff --git a/src/widgets/eek-preview.cpp b/src/widgets/eek-preview.cpp
index 36281f4d8..134cf9342 100644
--- a/src/widgets/eek-preview.cpp
+++ b/src/widgets/eek-preview.cpp
@@ -233,28 +233,38 @@ gboolean eek_preview_expose_event( GtkWidget* widget, GdkEventExpose* event )
allocation.width, allocation.height);
}
- GdkGC *gc = gdk_gc_new( gtk_widget_get_window (widget) );
EekPreview* preview = EEK_PREVIEW(widget);
GdkColor fg = {0, preview->_r, preview->_g, preview->_b};
gdk_colormap_alloc_color( gdk_colormap_get_system(), &fg, FALSE, TRUE );
- gdk_gc_set_foreground( gc, &fg );
gtk_widget_get_allocation (widget, &allocation);
+ cairo_t* cr = gdk_cairo_create(gtk_widget_get_window(widget));
- gdk_draw_rectangle( gtk_widget_get_window (widget),
- gc,
- TRUE,
- insetX, insetY,
- allocation.width - (insetX * 2), allocation.height - (insetY * 2) );
+ GdkRectangle rect = {insetX,
+ insetY,
+ allocation.width - (insetX * 2),
+ allocation.height - (insetY * 2)};
+
+ gdk_cairo_set_source_color(cr, &fg);
+ gdk_cairo_rectangle(cr, &rect);
+ cairo_paint(cr);
+ cairo_destroy(cr);
if ( preview->_previewPixbuf ) {
GtkDrawingArea* da = &(preview->drawing);
- GdkDrawable* drawable = (GdkDrawable*) gtk_widget_get_window(GTK_WIDGET(da));
+ GdkWindow* window = gtk_widget_get_window(GTK_WIDGET(da));
+ GdkDrawable* drawable = (GdkDrawable*) window;
gint w = 0;
gint h = 0;
- gdk_drawable_get_size(drawable, &w, &h);
- if ((w != preview->_scaledW) || (h != preview->_scaledH)) {
+#if GTK_CHECK_VERSION(2,24,0)
+ w = gdk_window_get_width(window);
+ h = gdk_window_get_height(window);
+#else
+ gdk_drawable_get_size(drawable, &w, &h);
+#endif
+
+ if ((w != preview->_scaledW) || (h != preview->_scaledH)) {
if (preview->_scaled) {
g_object_unref(preview->_scaled);
}
@@ -264,7 +274,10 @@ gboolean eek_preview_expose_event( GtkWidget* widget, GdkEventExpose* event )
}
GdkPixbuf* pix = (preview->_scaled) ? preview->_scaled : preview->_previewPixbuf;
- gdk_draw_pixbuf( drawable, 0, pix, 0, 0, 0, 0, w, h, GDK_RGB_DITHER_NONE, 0, 0 );
+ cairo_t* cr2 = gdk_cairo_create(drawable);
+ gdk_cairo_set_source_pixbuf(cr2, pix, 0, 0);
+ cairo_paint(cr2);
+ cairo_destroy(cr);
}
diff --git a/src/widgets/font-selector.cpp b/src/widgets/font-selector.cpp
index 5aa8d3d00..ff361a6b8 100644
--- a/src/widgets/font-selector.cpp
+++ b/src/widgets/font-selector.cpp
@@ -176,7 +176,12 @@ static void sp_font_selector_init(SPFontSelector *fsel)
gtk_widget_show(f);
gtk_box_pack_start(GTK_BOX (fsel), f, TRUE, TRUE, 0);
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *vb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
+ gtk_box_new(GTK_BOX(vb), FALSE);
+#else
GtkWidget *vb = gtk_vbox_new(FALSE, 4);
+#endif
gtk_widget_show(vb);
gtk_container_set_border_width(GTK_CONTAINER (vb), 4);
gtk_container_add(GTK_CONTAINER(f), vb);
@@ -201,11 +206,26 @@ static void sp_font_selector_init(SPFontSelector *fsel)
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW(fsel->style_treeview));
g_signal_connect (G_OBJECT(selection), "changed", G_CALLBACK (sp_font_selector_style_select_row), fsel);
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, 4);
+#endif
gtk_widget_show(hb);
gtk_box_pack_start(GTK_BOX(vb), hb, FALSE, FALSE, 0);
+/*
+This would introduce dependency on gtk version 2.24 which is currently not available in
+Trisquel GNU/Linux 4.5.1 (released on May 25th, 2011)
+This conditional and its #else block can be deleted in the future.
+*/
+#if GTK_CHECK_VERSION(2, 24,0)
+ fsel->size = gtk_combo_box_text_new_with_entry ();
+#else
fsel->size = gtk_combo_box_entry_new_text ();
+#endif
+
gtk_widget_set_tooltip_text (fsel->size, _("Font size (px)"));
gtk_widget_set_size_request(fsel->size, 90, -1);
g_signal_connect (G_OBJECT(fsel->size), "changed", G_CALLBACK (sp_font_selector_size_changed), fsel);
@@ -216,9 +236,13 @@ static void sp_font_selector_init(SPFontSelector *fsel)
gtk_box_pack_end(GTK_BOX (hb), l, FALSE, FALSE, 0);
for (unsigned int n = 0; sizes[n]; ++n)
- {
- gtk_combo_box_append_text (GTK_COMBO_BOX(fsel->size), sizes[n]);
- }
+ {
+#if GTK_CHECK_VERSION(2, 24,0)
+ gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(fsel->size), sizes[n]);
+#else
+ gtk_combo_box_append_text (GTK_COMBO_BOX(fsel->size), sizes[n]);
+#endif
+ }
gtk_widget_show_all (fsel->size);
@@ -304,7 +328,12 @@ static void sp_font_selector_style_select_row (GtkTreeSelection *selection,
static void sp_font_selector_size_changed( GtkComboBox */*cbox*/, SPFontSelector *fsel )
{
- char *text = gtk_combo_box_get_active_text (GTK_COMBO_BOX (fsel->size));
+ char *text = NULL;
+#if GTK_CHECK_VERSION(2, 24,0)
+ text = gtk_combo_box_text_get_active_text (GTK_COMBO_BOX_TEXT (fsel->size));
+#else
+ text = gtk_combo_box_get_active_text (GTK_COMBO_BOX (fsel->size));
+#endif
gfloat old_size = fsel->fontsize;
gchar *endptr;
@@ -375,7 +404,7 @@ static void sp_font_selector_emit_set (SPFontSelector *fsel)
fsel->font->Unref();
}
fsel->font = font;
- gtk_signal_emit(GTK_OBJECT(fsel), fs_signals[FONT_SET], fsel->font);
+ g_signal_emit(GTK_OBJECT(fsel), fs_signals[FONT_SET], 0, fsel->font);
}
fsel->fontsize_dirty = false;
if (font) {
diff --git a/src/widgets/gradient-selector.cpp b/src/widgets/gradient-selector.cpp
index e67d93388..e820beac6 100644
--- a/src/widgets/gradient-selector.cpp
+++ b/src/widgets/gradient-selector.cpp
@@ -133,7 +133,12 @@ static void sp_gradient_selector_init(SPGradientSelector *sel)
g_signal_connect (G_OBJECT (sel->vectors), "vector_set", G_CALLBACK (sp_gradient_selector_vector_set), sel);
/* Create box for buttons */
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new( FALSE, 0 );
+#endif
sel->nonsolid.push_back(hb);
gtk_box_pack_start( GTK_BOX(sel), hb, FALSE, FALSE, 0 );
@@ -152,7 +157,12 @@ static void sp_gradient_selector_init(SPGradientSelector *sel)
gtk_widget_show_all(hb);
/* Spread selector */
+#if GTK_CHECK_VERSION(3,0,0)
+ hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
hb = gtk_hbox_new( FALSE, 0 );
+#endif
sel->nonsolid.push_back(hb);
gtk_widget_show(hb);
gtk_box_pack_start( GTK_BOX(sel), hb, FALSE, FALSE, 0 );
diff --git a/src/widgets/gradient-toolbar.cpp b/src/widgets/gradient-toolbar.cpp
index 465c426fc..e239457fd 100644
--- a/src/widgets/gradient-toolbar.cpp
+++ b/src/widgets/gradient-toolbar.cpp
@@ -16,8 +16,8 @@
# include "config.h"
#endif
+#include "ui/widget/color-preview.h"
#include "verbs.h"
-#include <gtk/gtk.h>
#include "macros.h"
#include "widgets/button.h"
@@ -51,7 +51,6 @@
#include "../ink-comboboxentry-action.h"
#include "sp-stop.h"
-#include "ui/widget/color-preview.h"
#include "svg/css-ostringstream.h"
#include "svg/svg-color.h"
#include "desktop-style.h"
@@ -176,7 +175,6 @@ gboolean gr_vector_list(GtkWidget *combo_box, SPDesktop *desktop, bool selection
gl = g_slist_reverse (gl);
guint pos = 0;
- guint idx = 0;
if (!gl) {
// The document has no gradients
@@ -206,6 +204,7 @@ gboolean gr_vector_list(GtkWidget *combo_box, SPDesktop *desktop, bool selection
sensitive = FALSE;
}
+ guint idx = 0;
while (gl) {
SPGradient *gradient = SP_GRADIENT (gl->data);
gl = g_slist_remove (gl, gradient);
@@ -940,14 +939,14 @@ static void gr_stop_set_offset (GtkComboBox */*widget*/, GtkWidget *data)
* Callback functions for user actions
*/
-static void gr_new_type_changed( EgeSelectOneAction *act, GObject *tbl )
+static void gr_new_type_changed( EgeSelectOneAction *act, GObject * /*tbl*/ )
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
gint typemode = ege_select_one_action_get_active( act ) == 0 ? SP_GRADIENT_TYPE_LINEAR : SP_GRADIENT_TYPE_RADIAL;
prefs->setInt("/tools/gradient/newgradient", typemode);
}
-static void gr_new_fillstroke_changed( EgeSelectOneAction *act, GObject *tbl )
+static void gr_new_fillstroke_changed( EgeSelectOneAction *act, GObject * /*tbl*/ )
{
Inkscape::Preferences *prefs = Inkscape::Preferences::get();
bool fillmode = ege_select_one_action_get_active( act ) == 0;
@@ -1011,7 +1010,7 @@ void gr_spread_change (EgeSelectOneAction *act, GtkWidget *widget)
/*
* User selected a stop from the combobox
*/
-static void gr_stop_combo_changed (GtkComboBox *widget, GtkWidget *data)
+static void gr_stop_combo_changed (GtkComboBox * /*widget*/, GtkWidget *data)
{
if (blocked) {
return;
diff --git a/src/widgets/gradient-vector.cpp b/src/widgets/gradient-vector.cpp
index 3d6d5a8f2..8348f7045 100644
--- a/src/widgets/gradient-vector.cpp
+++ b/src/widgets/gradient-vector.cpp
@@ -289,7 +289,6 @@ static void sp_gvs_rebuild_gui_full(SPGradientVectorSelector *gvs)
gl = g_slist_reverse(gl);
gint pos = 0;
- gint idx = 0;
if (!gvs->doc) {
gtk_list_store_append (gvs->store, &iter);
@@ -307,6 +306,7 @@ static void sp_gvs_rebuild_gui_full(SPGradientVectorSelector *gvs)
gtk_widget_set_sensitive (gvs->combo_box, FALSE);
} else {
+ gint idx = 0;
while (gl) {
SPGradient *gr;
gr = SP_GRADIENT(gl->data);
@@ -457,7 +457,7 @@ static gboolean blocked = FALSE;
static void grad_edit_dia_stop_added_or_removed(Inkscape::XML::Node */*repr*/, Inkscape::XML::Node */*child*/, Inkscape::XML::Node */*ref*/, gpointer data)
{
GtkWidget *vb = GTK_WIDGET(data);
- SPGradient *gradient = (SPGradient *)g_object_get_data(G_OBJECT(vb), "gradient");
+ SPGradient *gradient = static_cast<SPGradient *>(g_object_get_data(G_OBJECT(vb), "gradient"));
update_stop_list(vb, gradient, NULL);
}
@@ -596,7 +596,7 @@ static void update_stop_list( GtkWidget *vb, SPGradient *gradient, SPStop *new_s
// user selected existing stop from list
-static void sp_grad_edit_combo_box_changed (GtkComboBox *widget, GtkWidget *tbl)
+static void sp_grad_edit_combo_box_changed (GtkComboBox * /*widget*/, GtkWidget *tbl)
{
SPStop *stop = get_selected_stop(tbl);
if (!stop) {
@@ -792,7 +792,12 @@ static GtkWidget * sp_gradient_vector_widget_new(SPGradient *gradient, SPStop *s
g_return_val_if_fail(!gradient || SP_IS_GRADIENT(gradient), NULL);
+#if GTK_CHECK_VERSION(3,0,0)
+ vb = gtk_box_new(GTK_ORIENTATION_VERTICAL, PAD);
+ gtk_box_set_homogeneous(GTK_BOX(vb), FALSE);
+#else
vb = gtk_vbox_new(FALSE, PAD);
+#endif
g_signal_connect(G_OBJECT(vb), "destroy", G_CALLBACK(sp_gradient_vector_widget_destroy), NULL);
w = sp_gradient_image_new(gradient);
@@ -825,7 +830,12 @@ static GtkWidget * sp_gradient_vector_widget_new(SPGradient *gradient, SPStop *s
g_signal_connect(G_OBJECT(combo_box), "changed", G_CALLBACK(sp_grad_edit_combo_box_changed), vb);
/* Add and Remove buttons */
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
+#endif
// TRANSLATORS: "Stop" means: a "phase" of a gradient
GtkWidget *b = gtk_button_new_with_label(_("Add stop"));
gtk_widget_show(b);
@@ -842,7 +852,12 @@ static GtkWidget * sp_gradient_vector_widget_new(SPGradient *gradient, SPStop *s
gtk_box_pack_start(GTK_BOX(vb),hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
/* Offset Slider and stuff */
+#if GTK_CHECK_VERSION(3,0,0)
+ hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
hb = gtk_hbox_new(FALSE, 0);
+#endif
/* Label */
GtkWidget *l = gtk_label_new(_("Offset:"));
@@ -863,7 +878,11 @@ static GtkWidget * sp_gradient_vector_widget_new(SPGradient *gradient, SPStop *s
gtk_adjustment_set_value(Offset_adj, stop->offset);
/* Slider */
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *slider = gtk_scale_new(GTK_ORIENTATION_HORIZONTAL, Offset_adj);
+#else
GtkWidget *slider = gtk_hscale_new(Offset_adj);
+#endif
gtk_scale_set_draw_value( GTK_SCALE(slider), FALSE );
gtk_widget_show(slider);
gtk_box_pack_start(GTK_BOX(hb),slider, TRUE, TRUE, AUX_BETWEEN_BUTTON_GROUPS);
@@ -996,14 +1015,14 @@ static void sp_gradient_vector_widget_load_gradient(GtkWidget *widget, SPGradien
SPGradient *old;
- old = (SPGradient*)g_object_get_data(G_OBJECT(widget), "gradient");
+ old = static_cast<SPGradient*>(g_object_get_data(G_OBJECT(widget), "gradient"));
if (old != gradient) {
sigc::connection *release_connection;
sigc::connection *modified_connection;
- release_connection = (sigc::connection *)g_object_get_data(G_OBJECT(widget), "gradient_release_connection");
- modified_connection = (sigc::connection *)g_object_get_data(G_OBJECT(widget), "gradient_modified_connection");
+ release_connection = static_cast<sigc::connection *>(g_object_get_data(G_OBJECT(widget), "gradient_release_connection"));
+ modified_connection = static_cast<sigc::connection *>(g_object_get_data(G_OBJECT(widget), "gradient_modified_connection"));
if (old) {
g_assert( release_connection != NULL );
diff --git a/src/widgets/paint-selector.cpp b/src/widgets/paint-selector.cpp
index d67160483..3f34c8ad1 100644
--- a/src/widgets/paint-selector.cpp
+++ b/src/widgets/paint-selector.cpp
@@ -167,7 +167,7 @@ sp_paint_selector_class_init(SPPaintSelectorClass *klass)
G_STRUCT_OFFSET(SPPaintSelectorClass, mode_changed),
NULL, NULL,
g_cclosure_marshal_VOID__UINT,
- G_TYPE_NONE, 1, GTK_TYPE_UINT);
+ G_TYPE_NONE, 1, G_TYPE_UINT);
psel_signals[GRABBED] = g_signal_new("grabbed",
G_TYPE_FROM_CLASS(object_class),
(GSignalFlags)(G_SIGNAL_RUN_FIRST | G_SIGNAL_NO_RECURSE),
@@ -202,7 +202,7 @@ sp_paint_selector_class_init(SPPaintSelectorClass *klass)
G_STRUCT_OFFSET(SPPaintSelectorClass, fillrule_changed),
NULL, NULL,
g_cclosure_marshal_VOID__UINT,
- G_TYPE_NONE, 1, GTK_TYPE_UINT);
+ G_TYPE_NONE, 1, G_TYPE_UINT);
object_class->destroy = sp_paint_selector_destroy;
}
@@ -216,7 +216,12 @@ sp_paint_selector_init(SPPaintSelector *psel)
psel->mode = static_cast<SPPaintSelector::Mode>(-1); // huh? do you mean 0xff? -- I think this means "not in the enum"
/* Paint style button box */
+#if GTK_CHECK_VERSION(3,0,0)
+ psel->style = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(psel->style), FALSE);
+#else
psel->style = gtk_hbox_new(FALSE, 0);
+#endif
gtk_widget_show(psel->style);
gtk_container_set_border_width(GTK_CONTAINER(psel->style), 4);
gtk_box_pack_start(GTK_BOX(psel), psel->style, FALSE, FALSE, 0);
@@ -239,7 +244,12 @@ sp_paint_selector_init(SPPaintSelector *psel)
/* Fillrule */
{
+#if GTK_CHECK_VERSION(3,0,0)
+ psel->fillrulebox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(psel->fillrulebox), FALSE);
+#else
psel->fillrulebox = gtk_hbox_new(FALSE, 0);
+#endif
gtk_box_pack_end(GTK_BOX(psel->style), psel->fillrulebox, FALSE, FALSE, 0);
GtkWidget *w;
@@ -268,12 +278,22 @@ sp_paint_selector_init(SPPaintSelector *psel)
/* Frame */
psel->label = gtk_label_new("");
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *lbbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
+ gtk_box_set_homogeneous(GTK_BOX(lbbox), FALSE);
+#else
GtkWidget *lbbox = gtk_hbox_new(FALSE, 4);
+#endif
gtk_widget_show(psel->label);
gtk_box_pack_start(GTK_BOX(lbbox), psel->label, false, false, 4);
gtk_box_pack_start(GTK_BOX(psel), lbbox, false, false, 4);
+#if GTK_CHECK_VERSION(3,0,0)
+ psel->frame = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
+ gtk_box_new(GTK_BOX(psel->frame), FALSE);
+#else
psel->frame = gtk_vbox_new(FALSE, 4);
+#endif
gtk_widget_show(psel->frame);
//gtk_container_set_border_width(GTK_CONTAINER(psel->frame), 0);
gtk_box_pack_start(GTK_BOX(psel), psel->frame, TRUE, TRUE, 0);
@@ -657,7 +677,12 @@ static void sp_paint_selector_set_mode_color(SPPaintSelector *psel, SPPaintSelec
sp_paint_selector_clear_frame(psel);
/* Create new color selector */
/* Create vbox */
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *vb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
+ gtk_box_new(GTK_BOX(vb), FALSE);
+#else
GtkWidget *vb = gtk_vbox_new(FALSE, 4);
+#endif
gtk_widget_show(vb);
/* Color selector */
@@ -820,7 +845,12 @@ sp_pattern_menu_build (GtkWidget *m, GSList *pattern_list, SPDocument */*source*
gchar const *patid = repr->attribute("id");
g_object_set_data (G_OBJECT(i), "pattern", (void *) patid);
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 4);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, 4);
+#endif
gtk_widget_show(hb);
// create label
@@ -955,7 +985,7 @@ void SPPaintSelector::updatePatternList( SPPattern *pattern )
GtkMenu *m = GTK_MENU(gtk_option_menu_get_menu(GTK_OPTION_MENU(mnu)));
- GList *kids = GTK_MENU_SHELL(m)->children;
+ GList *kids = gtk_container_get_children(GTK_CONTAINER(m));
int patpos = 0;
int i = 0;
@@ -993,11 +1023,21 @@ static void sp_paint_selector_set_mode_pattern(SPPaintSelector *psel, SPPaintSel
sp_paint_selector_clear_frame(psel);
/* Create vbox */
+#if GTK_CHECK_VERSION(3,0,0)
+ tbl = gtk_box_new(GTK_ORIENTATION_VERTICAL, 4);
+ gtk_box_new(GTK_BOX(tbl), FALSE);
+#else
tbl = gtk_vbox_new(FALSE, 4);
+#endif
gtk_widget_show(tbl);
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 1);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
+#endif
GtkWidget *mnu = gtk_option_menu_new();
ink_pattern_menu(mnu);
@@ -1011,7 +1051,12 @@ static void sp_paint_selector_set_mode_pattern(SPPaintSelector *psel, SPPaintSel
}
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *hb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(hb), FALSE);
+#else
GtkWidget *hb = gtk_hbox_new(FALSE, 0);
+#endif
GtkWidget *l = gtk_label_new(NULL);
gtk_label_set_markup(GTK_LABEL(l), _("Use the <b>Node tool</b> to adjust position, scale, and rotation of the pattern on canvas. Use <b>Object &gt; Pattern &gt; Objects to Pattern</b> to create a new pattern from selection."));
gtk_label_set_line_wrap(GTK_LABEL(l), true);
diff --git a/src/widgets/select-toolbar.cpp b/src/widgets/select-toolbar.cpp
index 3185e7373..e23d4f84b 100644
--- a/src/widgets/select-toolbar.cpp
+++ b/src/widgets/select-toolbar.cpp
@@ -470,7 +470,12 @@ void sp_select_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GOb
g_object_set_data(G_OBJECT(spw), "dtw", sp_desktop_canvas(desktop));
// The vb frame holds all other widgets and is used to set sensitivity depending on selection state.
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *vb = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(vb), FALSE);
+#else
GtkWidget *vb = gtk_hbox_new(FALSE, 0);
+#endif
gtk_widget_show(vb);
gtk_container_add(GTK_CONTAINER(spw), vb);
diff --git a/src/widgets/shrink-wrap-button.cpp b/src/widgets/shrink-wrap-button.cpp
index ba422034e..8d5bad21c 100644
--- a/src/widgets/shrink-wrap-button.cpp
+++ b/src/widgets/shrink-wrap-button.cpp
@@ -21,7 +21,11 @@ void minimum_size(GtkWidget *widget, GtkRequisition *requisition, void *) {
GtkWidget *child(gtk_bin_get_child(GTK_BIN(widget)));
if (child) {
+#if GTK_CHECK_VERSION(3,0,0)
+ gtk_widget_get_preferred_size(child, requisition, NULL);
+#else
gtk_widget_size_request(child, requisition);
+#endif
} else {
requisition->width = 0;
requisition->height = 0;
diff --git a/src/widgets/sp-color-notebook.cpp b/src/widgets/sp-color-notebook.cpp
index f9cda297f..863e8b762 100644
--- a/src/widgets/sp-color-notebook.cpp
+++ b/src/widgets/sp-color-notebook.cpp
@@ -323,7 +323,12 @@ void ColorNotebook::init()
row++;
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *rgbabox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(rgbabox), FALSE);
+#else
GtkWidget *rgbabox = gtk_hbox_new (FALSE, 0);
+#endif
#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
/* Create color management icons */
diff --git a/src/widgets/sp-color-slider.cpp b/src/widgets/sp-color-slider.cpp
index 5ec6d57df..b74be502b 100644
--- a/src/widgets/sp-color-slider.cpp
+++ b/src/widgets/sp-color-slider.cpp
@@ -171,7 +171,7 @@ sp_color_slider_destroy (GtkObject *object)
if (slider->adjustment) {
g_signal_handlers_disconnect_matched (G_OBJECT (slider->adjustment), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, slider);
- gtk_object_unref (GTK_OBJECT (slider->adjustment));
+ g_object_unref (slider->adjustment);
slider->adjustment = NULL;
}
@@ -343,11 +343,11 @@ void sp_color_slider_set_adjustment(SPColorSlider *slider, GtkAdjustment *adjust
if (slider->adjustment != adjustment) {
if (slider->adjustment) {
g_signal_handlers_disconnect_matched (G_OBJECT (slider->adjustment), G_SIGNAL_MATCH_DATA, 0, 0, NULL, NULL, slider);
- gtk_object_unref (GTK_OBJECT (slider->adjustment));
+ g_object_unref (slider->adjustment);
}
slider->adjustment = adjustment;
- gtk_object_ref (GTK_OBJECT (adjustment));
+ g_object_ref (adjustment);
g_object_ref_sink (adjustment);
g_signal_connect (G_OBJECT (adjustment), "changed",
@@ -585,30 +585,40 @@ sp_color_slider_paint (SPColorSlider *slider, GdkRectangle *area)
if (gdk_rectangle_intersect (area, &aarea, &apaint)) {
/* Draw arrow */
gdk_rectangle_intersect (&carea, &apaint, &apaint);
- gdk_gc_set_clip_rectangle(style->white_gc, &apaint);
- gdk_gc_set_clip_rectangle(style->black_gc, &apaint);
+ cairo_t* cr = gdk_cairo_create(window);
+ gdk_cairo_rectangle(cr, &apaint);
+ cairo_clip(cr);
x = aarea.x;
y1 = carea.y;
y2 = aarea.y + aarea.height - 1;
w = aarea.width;
+ cairo_set_line_width(cr, 1.0);
+
while ( w > 0 )
{
- gdk_draw_line(window, style->white_gc, x, y1, x + w - 1, y1 );
- gdk_draw_line(window, style->white_gc, x, y2, x + w - 1, y2 );
+ gdk_cairo_set_source_color(cr, &style->white);
+ cairo_move_to(cr, x - 0.5, y1 + 0.5);
+ cairo_line_to(cr, x + w - 1 + 0.5, y1 + 0.5);
+ cairo_move_to(cr, x - 0.5, y2 + 0.5);
+ cairo_line_to(cr, x + w - 1 + 0.5, y2 + 0.5);
+ cairo_stroke(cr);
w -=2;
x++;
if ( w > 0 )
{
- gdk_draw_line(window, style->black_gc, x, y1, x + w - 1, y1 );
- gdk_draw_line(window, style->black_gc, x, y2, x + w - 1, y2 );
+ gdk_cairo_set_source_color(cr, &style->black);
+ cairo_move_to(cr, x - 0.5, y1 + 0.5);
+ cairo_line_to(cr, x + w - 1 + 0.5, y1 + 0.5);
+ cairo_move_to(cr, x - 0.5, y2 + 0.5);
+ cairo_line_to(cr, x + w - 1 + 0.5, y2 + 0.5);
+ cairo_stroke(cr);
}
y1++;
y2--;
}
- gdk_gc_set_clip_rectangle(style->white_gc, NULL);
- gdk_gc_set_clip_rectangle(style->black_gc, NULL);
+ cairo_destroy(cr);
}
}
diff --git a/src/widgets/sp-widget.cpp b/src/widgets/sp-widget.cpp
index aa4c85851..8645d90f7 100644
--- a/src/widgets/sp-widget.cpp
+++ b/src/widgets/sp-widget.cpp
@@ -234,7 +234,7 @@ sp_widget_new_global (Inkscape::Application *inkscape)
spw = (SPWidget*)g_object_new (SP_TYPE_WIDGET, NULL);
if (!sp_widget_construct_global (spw, inkscape)) {
- gtk_object_unref (GTK_OBJECT (spw));
+ g_object_unref (spw);
return NULL;
}
diff --git a/src/widgets/sp-xmlview-attr-list.cpp b/src/widgets/sp-xmlview-attr-list.cpp
index 1c92476fa..0b4dcce32 100644
--- a/src/widgets/sp-xmlview-attr-list.cpp
+++ b/src/widgets/sp-xmlview-attr-list.cpp
@@ -36,8 +36,6 @@ static Inkscape::XML::NodeEventVector repr_events = {
NULL /* order_changed */
};
-enum {COL_NAME=0, COL_VALUE, COL_ATTR};
-
GtkWidget *
sp_xmlview_attr_list_new (Inkscape::XML::Node * repr)
{
@@ -45,20 +43,24 @@ sp_xmlview_attr_list_new (Inkscape::XML::Node * repr)
attr_list = (SPXMLViewAttrList*)g_object_new (SP_TYPE_XMLVIEW_ATTR_LIST, NULL);
- attr_list->store = gtk_list_store_new (3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_POINTER);
+ attr_list->store = gtk_list_store_new (ATTR_N_COLS, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING );
gtk_tree_view_set_model (GTK_TREE_VIEW(attr_list), GTK_TREE_MODEL(attr_list->store));
+ // Attribute name column
+ int colpos = 0;
GtkCellRenderer *cell = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(attr_list), COL_NAME, _("Attribute"), cell, "text", 0, NULL);
- GtkTreeViewColumn *column = gtk_tree_view_get_column (GTK_TREE_VIEW(attr_list), COL_NAME);
+ gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(attr_list), colpos, _("Name"), cell, "text", ATTR_COL_NAME, NULL);
+ GtkTreeViewColumn *column = gtk_tree_view_get_column (GTK_TREE_VIEW(attr_list), colpos);
gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- gtk_tree_view_column_set_sort_column_id (column, COL_NAME);
- gtk_tree_sortable_set_sort_column_id ( GTK_TREE_SORTABLE(attr_list->store), COL_NAME, GTK_SORT_ASCENDING);
+ gtk_tree_view_column_set_sort_column_id (column, colpos);
+ gtk_tree_sortable_set_sort_column_id ( GTK_TREE_SORTABLE(attr_list->store), ATTR_COL_NAME, GTK_SORT_ASCENDING);
gtk_cell_renderer_set_padding (cell, 2, 0);
+ // Attribute value column
+ colpos = 1;
cell = gtk_cell_renderer_text_new ();
- gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(attr_list), COL_VALUE, _("Value"), cell, "text", COL_VALUE, NULL);
- column = gtk_tree_view_get_column (GTK_TREE_VIEW(attr_list), COL_VALUE);
+ gtk_tree_view_insert_column_with_attributes(GTK_TREE_VIEW(attr_list), colpos, _("Value"), cell, "text", ATTR_COL_VALUE, NULL);
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW(attr_list), colpos);
gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
gtk_cell_renderer_set_padding (cell, 2, 0);
@@ -117,14 +119,14 @@ sp_xmlview_attr_list_class_init (SPXMLViewAttrListClass * klass)
parent_class = (GtkTreeViewClass*)g_type_class_peek_parent (klass);
- g_signal_new ( "row-value-changed",
- G_TYPE_FROM_CLASS(klass),
- G_SIGNAL_RUN_FIRST,
- G_STRUCT_OFFSET (SPXMLViewAttrListClass, row_changed),
- NULL, NULL,
- g_cclosure_marshal_VOID__UINT,
- G_TYPE_NONE, 1,
- G_TYPE_UINT);
+ g_signal_new ( "row-value-changed",
+ G_TYPE_FROM_CLASS(klass),
+ G_SIGNAL_RUN_FIRST,
+ G_STRUCT_OFFSET (SPXMLViewAttrListClass, row_changed),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__STRING,
+ G_TYPE_NONE, 1,
+ G_TYPE_STRING);
}
void
@@ -141,24 +143,28 @@ sp_xmlview_attr_list_destroy (GtkObject * object)
list = SP_XMLVIEW_ATTR_LIST (object);
+ g_object_unref(list->store);
sp_xmlview_attr_list_set_repr (list, NULL);
GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
-void sp_xmlview_attr_list_select_row_by_key(SPXMLViewAttrList * list, gchar *name)
+void sp_xmlview_attr_list_select_row_by_key(SPXMLViewAttrList * list, const gchar *name)
{
GtkTreeIter iter;
- const gchar *n;
gboolean match = false;
gboolean valid = gtk_tree_model_get_iter_first( GTK_TREE_MODEL(list->store), &iter );
while ( valid ) {
- gtk_tree_model_get (GTK_TREE_MODEL(list->store), &iter, COL_NAME, &n, -1);
+ gchar *n = 0;
+ gtk_tree_model_get (GTK_TREE_MODEL(list->store), &iter, ATTR_COL_NAME, &n, -1);
if (!strcmp(n, name)) {
match = true;
break;
}
valid = gtk_tree_model_iter_next (GTK_TREE_MODEL(list->store), &iter);
+ if (n) {
+ g_free(n);
+ }
}
if (match) {
@@ -181,29 +187,31 @@ event_attr_changed (Inkscape::XML::Node * /*repr*/,
list = SP_XMLVIEW_ATTR_LIST (data);
GtkTreeIter iter;
- const gchar *n;
gboolean valid = gtk_tree_model_get_iter_first( GTK_TREE_MODEL(list->store), &iter );
gboolean match = false;
while ( valid ) {
- gtk_tree_model_get (GTK_TREE_MODEL(list->store), &iter, COL_NAME, &n, -1);
+ gchar *n = 0;
+ gtk_tree_model_get (GTK_TREE_MODEL(list->store), &iter, ATTR_COL_NAME, &n, -1);
if (!strcmp(n, name)) {
match = true;
break;
}
row++;
valid = gtk_tree_model_iter_next (GTK_TREE_MODEL(list->store), &iter);
+ if (n) {
+ g_free(n);
+ }
}
if (match) {
if (new_value) {
- gtk_list_store_set (list->store, &iter, COL_NAME, name, COL_VALUE, new_value, COL_ATTR, GINT_TO_POINTER (g_quark_from_string (name)), -1);
+ gtk_list_store_set (list->store, &iter, ATTR_COL_NAME, name, ATTR_COL_VALUE, new_value, ATTR_COL_ATTR, g_quark_from_string (name), -1);
} else {
gtk_list_store_remove (list->store, &iter);
}
} else if (new_value != NULL) {
gtk_list_store_append (list->store, &iter);
- gtk_list_store_set (list->store, &iter, COL_NAME, name, COL_VALUE, new_value, COL_ATTR, GINT_TO_POINTER (g_quark_from_string (name)), -1);
-
+ gtk_list_store_set (list->store, &iter, ATTR_COL_NAME, name, ATTR_COL_VALUE, new_value, ATTR_COL_ATTR, g_quark_from_string (name), -1);
}
// send a "changed" signal so widget owners will know I've updated
diff --git a/src/widgets/sp-xmlview-attr-list.h b/src/widgets/sp-xmlview-attr-list.h
index 485ea0114..8b1dae49b 100644
--- a/src/widgets/sp-xmlview-attr-list.h
+++ b/src/widgets/sp-xmlview-attr-list.h
@@ -45,7 +45,9 @@ GtkWidget * sp_xmlview_attr_list_new (Inkscape::XML::Node * repr);
#define SP_XMLVIEW_ATTR_LIST_GET_REPR(list) (SP_XMLVIEW_ATTR_LIST (list)->repr)
void sp_xmlview_attr_list_set_repr (SPXMLViewAttrList * list, Inkscape::XML::Node * repr);
-void sp_xmlview_attr_list_select_row_by_key(SPXMLViewAttrList * list, gchar *name);
+void sp_xmlview_attr_list_select_row_by_key(SPXMLViewAttrList * list, const gchar *name);
+/* Attribute list store columns */
+enum {ATTR_COL_NAME=0, ATTR_COL_ATTR=1, ATTR_COL_VALUE=2, ATTR_N_COLS=3 };
#endif
diff --git a/src/widgets/sp-xmlview-tree.cpp b/src/widgets/sp-xmlview-tree.cpp
index b867b1044..ade5bec39 100644
--- a/src/widgets/sp-xmlview-tree.cpp
+++ b/src/widgets/sp-xmlview-tree.cpp
@@ -1,7 +1,7 @@
#define __SP_XMLVIEW_TREE_C__
/*
- * Specialization of GtkCTree for the XML tree view
+ * Specialization of GtkTreeView for the XML tree view
*
* Authors:
* MenTaLguY <mental@rydia.net>
@@ -19,20 +19,20 @@
struct NodeData {
SPXMLViewTree * tree;
- GtkCTreeNode * node;
+ GtkTreeRowReference *rowref;
Inkscape::XML::Node * repr;
};
-#define NODE_DATA(node) ((NodeData *)(GTK_CTREE_ROW ((node))->row.data))
+enum { STORE_TEXT_COL = 0, STORE_DATA_COL, STORE_REPR_COL, STORE_N_COLS };
static void sp_xmlview_tree_class_init (SPXMLViewTreeClass * klass);
static void sp_xmlview_tree_init (SPXMLViewTree * tree);
static void sp_xmlview_tree_destroy (GtkObject * object);
-static NodeData * node_data_new (SPXMLViewTree * tree, GtkCTreeNode * node, Inkscape::XML::Node * repr);
+static NodeData * node_data_new (SPXMLViewTree * tree, GtkTreeIter * node, GtkTreeRowReference *rowref, Inkscape::XML::Node * repr);
static void node_data_free (gpointer data);
-static GtkCTreeNode * add_node (SPXMLViewTree * tree, GtkCTreeNode * parent, GtkCTreeNode * before, Inkscape::XML::Node * repr);
+static GtkTreeRowReference * add_node (SPXMLViewTree * tree, GtkTreeIter * parent, GtkTreeIter * before, Inkscape::XML::Node * repr);
static void element_child_added (Inkscape::XML::Node * repr, Inkscape::XML::Node * child, Inkscape::XML::Node * ref, gpointer data);
static void element_attr_changed (Inkscape::XML::Node * repr, const gchar * key, const gchar * old_value, const gchar * new_value, bool is_interactive, gpointer data);
@@ -43,15 +43,19 @@ static void text_content_changed (Inkscape::XML::Node * repr, const gchar * old_
static void comment_content_changed (Inkscape::XML::Node * repr, const gchar * old_content, const gchar * new_content, gpointer data);
static void pi_content_changed (Inkscape::XML::Node * repr, const gchar * old_content, const gchar * new_content, gpointer data);
-static void tree_move (GtkCTree * tree, GtkCTreeNode * node, GtkCTreeNode * new_parent, GtkCTreeNode * new_sibling);
+static void ref_to_sibling (NodeData *node, Inkscape::XML::Node * ref, GtkTreeIter *);
+static void repr_to_child (NodeData *node, Inkscape::XML::Node * repr, GtkTreeIter *);
+static Inkscape::XML::Node * sibling_to_ref (GtkTreeView * tree, GtkTreeIter * parent, GtkTreeIter * sibling);
+static gboolean tree_model_iter_compare(GtkTreeModel* store, GtkTreeIter * iter1, GtkTreeIter * iter2);
+GtkTreeRowReference *tree_iter_to_ref (SPXMLViewTree * tree, GtkTreeIter* iter);
+static void tree_ref_to_iter (SPXMLViewTree * tree, GtkTreeIter* iter, GtkTreeRowReference *ref);
-static gboolean check_drag (GtkCTree * tree, GtkCTreeNode * node, GtkCTreeNode * new_parent, GtkCTreeNode * new_sibling);
+gboolean search_equal_func (GtkTreeModel *model, gint column, const gchar *key, GtkTreeIter *iter, gpointer search_data);
+gboolean foreach_func (GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data);
-static GtkCTreeNode * ref_to_sibling (GtkCTreeNode * parent, Inkscape::XML::Node * ref);
-static GtkCTreeNode * repr_to_child (GtkCTreeNode * parent, Inkscape::XML::Node * repr);
-static Inkscape::XML::Node * sibling_to_ref (GtkCTreeNode * parent, GtkCTreeNode * sibling);
-
-static gint match_node_data_by_repr(gconstpointer data_p, gconstpointer repr);
+void on_row_changed(GtkTreeModel *tree_model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data);
+void on_drag_data_received(GtkWidget *wgt, GdkDragContext *context, int x, int y, GtkSelectionData *seldata, guint info, guint time, gpointer userdata);
+gboolean do_drag_motion(GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint time, gpointer user_data);
static const Inkscape::XML::NodeEventVector element_repr_events = {
element_child_added,
@@ -85,44 +89,35 @@ static const Inkscape::XML::NodeEventVector pi_repr_events = {
NULL /* order_changed */
};
-static GtkCTreeClass * parent_class = NULL;
+static GtkTreeViewClass * parent_class = NULL;
GtkWidget *
sp_xmlview_tree_new (Inkscape::XML::Node * repr, void * /*factory*/, void * /*data*/)
{
SPXMLViewTree * tree;
- tree = (SPXMLViewTree*)g_object_new (SP_TYPE_XMLVIEW_TREE, "n_columns", 1, "tree_column", 0, NULL);
+ tree = (SPXMLViewTree*)g_object_new (SP_TYPE_XMLVIEW_TREE, NULL);
- gtk_clist_column_titles_hide (GTK_CLIST (tree));
- gtk_ctree_set_line_style (GTK_CTREE (tree), GTK_CTREE_LINES_NONE);
- gtk_ctree_set_expander_style (GTK_CTREE (tree), GTK_CTREE_EXPANDER_TRIANGLE);
- gtk_clist_set_column_auto_resize (GTK_CLIST (tree), 0, TRUE);
- gtk_clist_set_reorderable (GTK_CLIST (tree), TRUE);
- gtk_ctree_set_drag_compare_func (GTK_CTREE (tree), check_drag);
+ tree->store = gtk_tree_store_new (STORE_N_COLS, G_TYPE_STRING, G_TYPE_POINTER, G_TYPE_POINTER);
+ gtk_tree_view_set_model (GTK_TREE_VIEW(tree), GTK_TREE_MODEL(tree->store));
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW(tree), FALSE);
+ gtk_tree_view_set_reorderable (GTK_TREE_VIEW(tree), TRUE);
+ gtk_tree_view_set_enable_search (GTK_TREE_VIEW(tree), TRUE);
+ gtk_tree_view_set_search_equal_func (GTK_TREE_VIEW(tree), search_equal_func, NULL, NULL);
- sp_xmlview_tree_set_repr (tree, repr);
+ GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
+ GtkTreeViewColumn *column = gtk_tree_view_column_new_with_attributes ("", renderer, "text", STORE_TEXT_COL, NULL);
+ gtk_tree_view_append_column (GTK_TREE_VIEW (tree), column);
+ gtk_cell_renderer_set_padding (renderer, 2, 0);
+ gtk_tree_view_column_set_sizing (column, GTK_TREE_VIEW_COLUMN_AUTOSIZE);
- return (GtkWidget *) tree;
-}
+ sp_xmlview_tree_set_repr (tree, repr);
-void
-sp_xmlview_tree_set_repr (SPXMLViewTree * tree, Inkscape::XML::Node * repr)
-{
- if ( tree->repr == repr ) return;
- gtk_clist_freeze (GTK_CLIST (tree));
- if (tree->repr) {
- gtk_clist_clear (GTK_CLIST (tree));
- Inkscape::GC::release(tree->repr);
- }
- tree->repr = repr;
- if (repr) {
- GtkCTreeNode * node;
- Inkscape::GC::anchor(repr);
- node = add_node (tree, NULL, NULL, repr);
- gtk_ctree_expand (GTK_CTREE (tree), node);
- }
- gtk_clist_thaw (GTK_CLIST (tree));
+ g_signal_connect(G_OBJECT(tree->store), "row-changed", G_CALLBACK(on_row_changed), tree);
+ g_signal_connect(GTK_TREE_VIEW(tree), "drag_data_received", G_CALLBACK(on_drag_data_received), tree);
+ g_signal_connect(GTK_TREE_VIEW(tree), "drag-motion", G_CALLBACK(do_drag_motion), tree);
+
+ return (GtkWidget *) tree;
}
GType
@@ -141,9 +136,10 @@ sp_xmlview_tree_get_type (void)
(GInstanceInitFunc) sp_xmlview_tree_init,
NULL
};
- type = g_type_register_static (GTK_TYPE_CTREE, "SPXMLViewTree", &info, (GTypeFlags)0);
+ type = g_type_register_static (GTK_TYPE_TREE_VIEW, "SPXMLViewTree", &info, (GTypeFlags)0);
}
+
return type;
}
@@ -153,9 +149,17 @@ sp_xmlview_tree_class_init (SPXMLViewTreeClass * klass)
GtkObjectClass * object_class;
object_class = (GtkObjectClass *) klass;
- parent_class = (GtkCTreeClass *) g_type_class_peek_parent (klass);
-
- GTK_CTREE_CLASS (object_class)->tree_move = tree_move;
+ parent_class = (GtkTreeViewClass *) g_type_class_peek_parent (klass);
+
+ // Signal for when a tree drag and drop has completed
+ g_signal_new ( "tree_move",
+ G_TYPE_FROM_CLASS(klass),
+ G_SIGNAL_RUN_FIRST,
+ 0,
+ NULL, NULL,
+ g_cclosure_marshal_VOID__UINT,
+ G_TYPE_NONE, 1,
+ G_TYPE_UINT);
object_class->destroy = sp_xmlview_tree_destroy;
}
@@ -165,6 +169,7 @@ sp_xmlview_tree_init (SPXMLViewTree * tree)
{
tree->repr = NULL;
tree->blocked = 0;
+ tree->dndactive = FALSE;
}
void
@@ -179,24 +184,31 @@ sp_xmlview_tree_destroy (GtkObject * object)
GTK_OBJECT_CLASS (parent_class)->destroy (object);
}
-GtkCTreeNode *
-add_node (SPXMLViewTree * tree, GtkCTreeNode * parent, GtkCTreeNode * before, Inkscape::XML::Node * repr)
+/*
+ * Add a new row to the tree
+ */
+GtkTreeRowReference *
+add_node (SPXMLViewTree * tree, GtkTreeIter *parent, GtkTreeIter *before, Inkscape::XML::Node * repr)
{
- NodeData * data;
- GtkCTreeNode * node;
+ NodeData * data = NULL;
const Inkscape::XML::NodeEventVector * vec;
static const gchar *default_text[] = { "???" };
g_assert (tree != NULL);
g_assert (repr != NULL);
- node = gtk_ctree_insert_node (GTK_CTREE (tree), parent, before, (gchar **)default_text, 2, NULL, NULL, NULL, NULL, ( repr->type() != Inkscape::XML::ELEMENT_NODE ), FALSE);
- g_assert (node != NULL);
+ if (before && !gtk_tree_store_iter_is_valid(tree->store, before)) {
+ before = NULL;
+ }
+
+ GtkTreeIter iter;
+ gtk_tree_store_insert_before (tree->store, &iter, parent, before);
- data = node_data_new (tree, node, repr);
- g_assert (data != NULL);
+ GtkTreeRowReference *rowref = tree_iter_to_ref (tree, &iter);
+ data = node_data_new (tree, &iter, rowref, repr);
+ g_assert (data != NULL);
- gtk_ctree_node_set_row_data_full (GTK_CTREE (tree), data->node, data, node_data_free);
+ gtk_tree_store_set (tree->store, &iter, STORE_TEXT_COL, default_text, STORE_DATA_COL, data, STORE_REPR_COL, repr, -1);
if ( repr->type() == Inkscape::XML::TEXT_NODE ) {
vec = &text_repr_events;
@@ -211,29 +223,25 @@ add_node (SPXMLViewTree * tree, GtkCTreeNode * parent, GtkCTreeNode * before, In
}
if (vec) {
- gtk_clist_freeze (GTK_CLIST (tree));
- /* cheat a little to get the id upated properly */
+ /* cheat a little to get the id updated properly */
if (repr->type() == Inkscape::XML::ELEMENT_NODE) {
element_attr_changed (repr, "id", NULL, NULL, false, data);
}
sp_repr_add_listener (repr, vec, data);
sp_repr_synthesize_events (repr, vec, data);
- gtk_clist_thaw (GTK_CLIST (tree));
}
- return node;
+ return rowref;
}
-NodeData *
-node_data_new (SPXMLViewTree * tree, GtkCTreeNode * node, Inkscape::XML::Node * repr)
+NodeData *node_data_new(SPXMLViewTree * tree, GtkTreeIter * /*node*/, GtkTreeRowReference *rowref, Inkscape::XML::Node *repr)
{
- NodeData * data;
- data = g_new (NodeData, 1);
- data->tree = tree;
- data->node = node;
- data->repr = repr;
- Inkscape::GC::anchor(repr);
- return data;
+ NodeData *data = g_new(NodeData, 1);
+ data->tree = tree;
+ data->rowref = rowref;
+ data->repr = repr;
+ Inkscape::GC::anchor(repr);
+ return data;
}
void
@@ -250,15 +258,17 @@ void
element_child_added (Inkscape::XML::Node * /*repr*/, Inkscape::XML::Node * child, Inkscape::XML::Node * ref, gpointer ptr)
{
NodeData * data;
- GtkCTreeNode * before;
+ GtkTreeIter before;
data = (NodeData *) ptr;
if (data->tree->blocked) return;
- before = ref_to_sibling (data->node, ref);
+ ref_to_sibling (data, ref, &before);
- add_node (data->tree, data->node, before, child);
+ GtkTreeIter data_iter;
+ tree_ref_to_iter(data->tree, &data_iter, data->rowref);
+ add_node (data->tree, &data_iter, &before, child);
}
void
@@ -285,7 +295,10 @@ element_attr_changed (Inkscape::XML::Node * repr, const gchar * key, const gchar
} else {
label = g_strdup_printf ("<%s>", repr->name());
}
- gtk_ctree_node_set_text (GTK_CTREE (data->tree), data->node, 0, label);
+
+ GtkTreeIter iter;
+ tree_ref_to_iter(data->tree, &iter, data->rowref);
+ gtk_tree_store_set (GTK_TREE_STORE(data->tree->store), &iter, STORE_TEXT_COL, label, -1);
g_free (label);
}
@@ -293,30 +306,34 @@ void
element_child_removed (Inkscape::XML::Node * /*repr*/, Inkscape::XML::Node * child, Inkscape::XML::Node * /*ref*/, gpointer ptr)
{
NodeData * data;
-
data = (NodeData *) ptr;
if (data->tree->blocked) return;
- gtk_ctree_remove_node (GTK_CTREE (data->tree), repr_to_child (data->node, child));
+ GtkTreeIter iter;
+ repr_to_child (data, child, &iter);
+ gtk_tree_store_remove (GTK_TREE_STORE(data->tree->store), &iter);
+
}
void
element_order_changed (Inkscape::XML::Node * /*repr*/, Inkscape::XML::Node * child, Inkscape::XML::Node * /*oldref*/, Inkscape::XML::Node * newref, gpointer ptr)
{
NodeData * data;
- GtkCTreeNode * before, * node;
-
+ GtkTreeIter before, node;
data = (NodeData *) ptr;
if (data->tree->blocked) return;
- before = ref_to_sibling (data->node, newref);
- node = repr_to_child (data->node, child);
-
- if ( before == node ) before = GTK_CTREE_ROW (before)->sibling;
+ ref_to_sibling (data, newref, &before);
+ repr_to_child (data, child, &node);
- parent_class->tree_move (GTK_CTREE (data->tree), node, data->node, before);
+ if (gtk_tree_store_iter_is_valid(data->tree->store, &before)) {
+ gtk_tree_store_move_before (data->tree->store, &node, &before);
+ } else {
+ repr_to_child (data, newref, &before);
+ gtk_tree_store_move_after (data->tree->store, &node, &before);
+ }
}
void
@@ -330,7 +347,10 @@ text_content_changed (Inkscape::XML::Node * /*repr*/, const gchar * /*old_conten
if (data->tree->blocked) return;
label = g_strdup_printf ("\"%s\"", new_content);
- gtk_ctree_node_set_text (GTK_CTREE (data->tree), data->node, 0, label);
+ GtkTreeIter iter;
+ tree_ref_to_iter(data->tree, &iter, data->rowref);
+ gtk_tree_store_set (GTK_TREE_STORE(data->tree->store), &iter, STORE_TEXT_COL, label, -1);
+
g_free (label);
}
@@ -345,7 +365,10 @@ comment_content_changed (Inkscape::XML::Node */*repr*/, const gchar * /*old_cont
if (data->tree->blocked) return;
label = g_strdup_printf ("<!--%s-->", new_content);
- gtk_ctree_node_set_text (GTK_CTREE (data->tree), data->node, 0, label);
+ GtkTreeIter iter;
+ tree_ref_to_iter(data->tree, &iter, data->rowref);
+ gtk_tree_store_set (GTK_TREE_STORE(data->tree->store), &iter, STORE_TEXT_COL, label, -1);
+
g_free (label);
}
@@ -360,102 +383,339 @@ pi_content_changed(Inkscape::XML::Node *repr, const gchar * /*old_content*/, con
if (data->tree->blocked) return;
label = g_strdup_printf ("<?%s %s?>", repr->name(), new_content);
- gtk_ctree_node_set_text (GTK_CTREE (data->tree), data->node, 0, label);
+ GtkTreeIter iter;
+ tree_ref_to_iter(data->tree, &iter, data->rowref);
+ gtk_tree_store_set (GTK_TREE_STORE(data->tree->store), &iter, STORE_TEXT_COL, label, -1);
+
g_free (label);
}
-void
-tree_move (GtkCTree * tree, GtkCTreeNode * node, GtkCTreeNode * new_parent, GtkCTreeNode * new_sibling)
+
+/*
+ * Save the source path on drag start, will need it in on_row_changed() when moving a row
+ */
+void on_drag_data_received(GtkWidget * /*wgt*/, GdkDragContext * /*context*/, int /*x*/, int /*y*/,
+ GtkSelectionData * /*seldata*/, guint /*info*/, guint /*time*/,
+ gpointer userdata)
{
- GtkCTreeNode * old_parent;
- Inkscape::XML::Node * ref;
+ SPXMLViewTree *tree = static_cast<SPXMLViewTree *>(userdata);
+ if (!tree) {
+ return;
+ }
+
+ if (tree->dndactive) {
+ return;
+ }
+
+ GtkTreeModel *model = 0;
+ GtkTreeIter iter;
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
+ if (gtk_tree_selection_get_selected(selection, &model, &iter)) {
+
+ tree->dndactive = TRUE;
+
+ GtkTreeIter parent_iter;
+ GtkTreeRowReference *parent_ref = NULL;
+ if (gtk_tree_model_iter_parent(model, &parent_iter, &iter)) {
+ parent_ref = tree_iter_to_ref (tree, &parent_iter);
+ }
+
+ g_object_set_data(G_OBJECT(tree), "drag-src-path", parent_ref);
+ }
+}
- old_parent = GTK_CTREE_ROW (node)->parent;
- if ( !old_parent || !new_parent ) return;
+/*
+ * Main drag & drop function
+ * Get the old and new paths, and change the Inkscape::XML::Node repr's
+ */
+void on_row_changed(GtkTreeModel *tree_model, GtkTreePath *path, GtkTreeIter *iter, gpointer user_data)
+{
+ SPXMLViewTree *tree = (SPXMLViewTree *)user_data;
+
+ if (!tree->dndactive) {
+ return;
+ }
+ tree->dndactive = FALSE;
+
+ Inkscape::XML::Node *repr = sp_xmlview_tree_node_get_repr(GTK_TREE_VIEW(tree), iter);
+ GtkTreeIter new_parent;
+ if (!gtk_tree_model_iter_parent(tree_model, &new_parent, iter)) {
+ //No parent of drop location
+ g_signal_emit_by_name(G_OBJECT (tree), "tree_move", GUINT_TO_POINTER(0) );
+ return;
+ }
+
+ GtkTreeRowReference *old_parent_ref = (GtkTreeRowReference *)g_object_get_data (G_OBJECT (tree), "drag-src-path");
+ if (!old_parent_ref) {
+ //No drag source location
+ g_signal_emit_by_name(G_OBJECT (tree), "tree_move", GUINT_TO_POINTER(0) );
+ return;
+ }
+
+ GtkTreeIter old_parent;
+ tree_ref_to_iter(tree, &old_parent, old_parent_ref);
+ if (!gtk_tree_store_iter_is_valid(GTK_TREE_STORE(tree_model), &old_parent)){
+ //Drag source parent is not valid
+ g_signal_emit_by_name(G_OBJECT (tree), "tree_move", GUINT_TO_POINTER(0) );
+ return;
+ }
+
+ // Find the sibling node before iter
+ GtkTreeIter before_iter;
+ Inkscape::XML::Node *before_repr = NULL;
+ GtkTreeIter tmp_iter;
+
+ gboolean valid = gtk_tree_model_iter_children(tree_model, &tmp_iter, &new_parent);
+ while (valid && tree_model_iter_compare (tree_model, &tmp_iter, iter)) {
+ before_iter = tmp_iter;
+ valid = gtk_tree_model_iter_next(tree_model, &tmp_iter);
+ }
+
+ // If before_iter is invalid, before_repr stays as NULL which is ok
+ if (gtk_tree_store_iter_is_valid(GTK_TREE_STORE(tree_model), &before_iter)) {
+ gtk_tree_model_get (tree_model, &before_iter, STORE_REPR_COL, &before_repr, -1);
+ }
+
+ // Drop onto oneself causes assert in changeOrder() below, ignore
+ if (repr == before_repr)
+ return;
+
+ SP_XMLVIEW_TREE (tree)->blocked++;
+ if (!tree_model_iter_compare (tree_model, &new_parent, &old_parent)) {
+ sp_xmlview_tree_node_get_repr (GTK_TREE_VIEW(tree), &old_parent)->changeOrder(repr, before_repr);
+ } else {
+ sp_xmlview_tree_node_get_repr (GTK_TREE_VIEW(tree), &old_parent)->removeChild(repr);
+ sp_xmlview_tree_node_get_repr (GTK_TREE_VIEW(tree), &new_parent)->addChild(repr, before_repr);
+ }
+ SP_XMLVIEW_TREE (tree)->blocked--;
+
+ // Reselect the dragged row
+ GtkTreeSelection *selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(tree));
+ gtk_tree_view_expand_to_path (GTK_TREE_VIEW(tree), path);
+ //gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(tree), path, NULL, true, 0.66, 0.0);
+ gtk_tree_selection_select_iter(selection, iter);
+
+ // Signal that a drag and drop has completed successfully
+ g_signal_emit_by_name(G_OBJECT (tree), "tree_move", GUINT_TO_POINTER(1) );
+}
- ref = sibling_to_ref (new_parent, new_sibling);
+/*
+ * Set iter to ref or node data's child with the same repr or first child
+ */
+void ref_to_sibling (NodeData *data, Inkscape::XML::Node *repr, GtkTreeIter *iter)
+{
+ if (repr) {
+ repr_to_child (data, repr, iter);
+ gtk_tree_model_iter_next (GTK_TREE_MODEL(data->tree->store), iter);
+ } else {
+ GtkTreeIter data_iter;
+ tree_ref_to_iter(data->tree, &data_iter, data->rowref);
+ gtk_tree_model_iter_children(GTK_TREE_MODEL(data->tree->store), iter, &data_iter);
+ }
+}
- gtk_clist_freeze (GTK_CLIST (tree));
+/*
+ * Set iter to the node data's child with the same repr
+ */
+void repr_to_child (NodeData *data, Inkscape::XML::Node * repr, GtkTreeIter *iter)
+{
+ GtkTreeIter data_iter;
+ tree_ref_to_iter(data->tree, &data_iter, data->rowref);
- SP_XMLVIEW_TREE (tree)->blocked++;
- if (new_parent == old_parent) {
- NODE_DATA (old_parent)->repr->changeOrder(NODE_DATA (node)->repr, ref);
- } else {
- NODE_DATA (old_parent)->repr->removeChild(NODE_DATA (node)->repr);
- NODE_DATA (new_parent)->repr->addChild(NODE_DATA (node)->repr, ref);
+ gboolean valid = gtk_tree_model_iter_children(GTK_TREE_MODEL(data->tree->store), iter, &data_iter);
+ while (valid && sp_xmlview_tree_node_get_repr (GTK_TREE_VIEW(data->tree), iter) != repr) {
+ valid = gtk_tree_model_iter_next(GTK_TREE_MODEL(data->tree->store), iter);
}
- SP_XMLVIEW_TREE (tree)->blocked--;
+}
- parent_class->tree_move (tree, node, new_parent, new_sibling);
+/*
+ * Get a matching GtkTreeRowReference for a GtkTreeIter
+ */
+GtkTreeRowReference *tree_iter_to_ref (SPXMLViewTree * tree, GtkTreeIter* iter)
+{
+ GtkTreePath* path = gtk_tree_model_get_path(GTK_TREE_MODEL(tree->store), iter);
+ GtkTreeRowReference *ref = gtk_tree_row_reference_new(GTK_TREE_MODEL(tree->store), path);
+ gtk_tree_path_free(path);
- gtk_clist_thaw (GTK_CLIST (tree));
+ return ref;
}
-GtkCTreeNode *
-ref_to_sibling (GtkCTreeNode * parent, Inkscape::XML::Node * ref)
+/*
+ * Get a matching GtkTreeIter for a GtkTreeRowReference
+ */
+void tree_ref_to_iter (SPXMLViewTree * tree, GtkTreeIter* iter, GtkTreeRowReference *ref)
{
- if (ref) {
- GtkCTreeNode * before;
- before = repr_to_child (parent, ref);
- g_assert (before != NULL);
- before = GTK_CTREE_ROW (before)->sibling;
- return before;
- } else {
- return GTK_CTREE_ROW (parent)->children;
- }
+ GtkTreePath* path = gtk_tree_row_reference_get_path(ref);
+ gtk_tree_model_get_iter(GTK_TREE_MODEL(tree->store), iter, path);
}
-GtkCTreeNode *
-repr_to_child (GtkCTreeNode * parent, Inkscape::XML::Node * repr)
+/*
+ * Compare 2 GtkTreeIter and return 0 if they are equal
+ */
+gboolean tree_model_iter_compare(GtkTreeModel* store, GtkTreeIter * iter1, GtkTreeIter * iter2)
{
- GtkCTreeNode * child;
- child = GTK_CTREE_ROW (parent)->children;
- while ( child && NODE_DATA (child)->repr != repr ) {
- child = GTK_CTREE_ROW (child)->sibling;
- }
- return child;
+ GtkTreePath *path1 = gtk_tree_model_get_path(store, iter1);
+ GtkTreePath *path2 = gtk_tree_model_get_path(store, iter2);
+
+ gboolean result = gtk_tree_path_compare( path1, path2);
+
+ gtk_tree_path_free(path1);
+ gtk_tree_path_free(path2);
+
+ return result;
+
}
+/*
+ * Return the node of parent iter's child sibling or NULL if sibling is the first child
+ */
Inkscape::XML::Node *
-sibling_to_ref (GtkCTreeNode * parent, GtkCTreeNode * sibling)
+sibling_to_ref (GtkTreeView * tree, GtkTreeIter * parent, GtkTreeIter * sibling)
{
- GtkCTreeNode * child;
- child = GTK_CTREE_ROW (parent)->children;
- if ( child == sibling ) return NULL;
- while ( child && GTK_CTREE_ROW (child)->sibling != sibling ) {
- child = GTK_CTREE_ROW (child)->sibling;
+ GtkTreeIter child;
+ GtkTreeModel* store = gtk_tree_view_get_model(tree);
+
+ gboolean valid = gtk_tree_model_iter_children(store, &child, parent);
+
+ if (! tree_model_iter_compare(store, &child, sibling)) {
+ return NULL;
}
- return NODE_DATA (child)->repr;
-}
-gboolean
-check_drag (GtkCTree * /*tree*/, GtkCTreeNode * node, GtkCTreeNode * new_parent, GtkCTreeNode * /*new_sibling*/)
-{
- GtkCTreeNode * old_parent;
+ while (valid && tree_model_iter_compare(store, &child, sibling)) {
+ valid = gtk_tree_model_iter_next(store, &child);
+ }
- old_parent = GTK_CTREE_ROW (node)->parent;
+ if (!gtk_tree_store_iter_is_valid(GTK_TREE_STORE(store), &child)) {
+ return NULL;
+ }
- if (!old_parent || !new_parent) return FALSE;
- if (NODE_DATA (new_parent)->repr->type() != Inkscape::XML::ELEMENT_NODE) return FALSE;
+ return sp_xmlview_tree_node_get_repr (tree, &child);
+}
- /* fixme: we need add_child/remove_child/etc repr events without side-effects, so we can check here and give better visual feedback */
+/*
+ * Disable drag and drop target on : root node and non-element nodes
+ */
+gboolean do_drag_motion(GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint time, gpointer user_data)
+{
+ GtkTreePath *path = NULL;
+ GtkTreeViewDropPosition pos;
+ gtk_tree_view_get_dest_row_at_pos (GTK_TREE_VIEW(widget), x, y, &path, &pos);
+
+ int action = 0;
+
+ if (path) {
+ action = GDK_ACTION_MOVE;
+
+ SPXMLViewTree *tree = (SPXMLViewTree *)user_data;
+ GtkTreeIter iter;
+ gtk_tree_model_get_iter(GTK_TREE_MODEL(tree->store), &iter, path);
+ if (sp_xmlview_tree_node_get_repr (GTK_TREE_VIEW(widget), &iter)->type() != Inkscape::XML::ELEMENT_NODE) {
+ action = 0;
+ }
+
+ if (!gtk_tree_path_up(path)) {
+ action = 0;
+ }
+ if (!gtk_tree_path_up(path)) {
+ action = 0;
+ }
+ if (!path) {
+ action = 0;
+ }
+ }
+
+ gtk_tree_path_free(path);
+ gdk_drag_status (context, (GdkDragAction)action, time);
+
+ return (action == 0);
+}
- return TRUE;
+/*
+ * Set the tree selection and scroll to the row with the given repr
+ */
+void
+sp_xmlview_tree_set_repr (SPXMLViewTree * tree, Inkscape::XML::Node * repr)
+{
+ if ( tree->repr == repr ) return;
+ if (tree->repr) {
+ gtk_tree_store_clear(tree->store);
+ Inkscape::GC::release(tree->repr);
+ }
+ tree->repr = repr;
+ if (repr) {
+ GtkTreeRowReference * rowref;
+ Inkscape::GC::anchor(repr);
+ rowref = add_node (tree, NULL, NULL, repr);
+ GtkTreePath *path = gtk_tree_row_reference_get_path(rowref);
+ gtk_tree_view_expand_to_path (GTK_TREE_VIEW(tree), path);
+ gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW(tree), path, NULL, true, 0.5, 0.0);
+ gtk_tree_path_free(path);
+ }
}
+/*
+ * Return the repr at a given GtkTreeIter position
+ */
Inkscape::XML::Node *
-sp_xmlview_tree_node_get_repr (SPXMLViewTree * /*tree*/, GtkCTreeNode * node)
+sp_xmlview_tree_node_get_repr (GtkTreeView *tree, GtkTreeIter * iter)
{
- return NODE_DATA (node)->repr;
+ Inkscape::XML::Node *repr;
+ GtkTreeModel *model = gtk_tree_view_get_model(tree);
+ gtk_tree_model_get (model, iter, STORE_REPR_COL, &repr, -1);
+
+ return repr;
}
-GtkCTreeNode *
-sp_xmlview_tree_get_repr_node (SPXMLViewTree * tree, Inkscape::XML::Node * repr)
+
+/*
+ * Find a GtkTreeIter position in the tree by repr
+ */
+gboolean
+sp_xmlview_tree_get_repr_node (SPXMLViewTree * tree, Inkscape::XML::Node * repr, GtkTreeIter *iter)
{
- return gtk_ctree_find_by_row_data_custom (GTK_CTREE (tree), NULL, repr, match_node_data_by_repr);
+ /*
+ * Use a NodeData here to pass in the repr to the foreach function and store a rowref if found,
+ * if found we can return the iter
+ */
+ NodeData anode;
+ anode.tree = tree;
+ anode.repr = repr;
+ anode.rowref = NULL;
+
+ gtk_tree_model_foreach(GTK_TREE_MODEL(tree->store), foreach_func, &anode);
+ if (anode.rowref != NULL) {
+ tree_ref_to_iter(tree, iter, anode.rowref);
+ return TRUE;
+ }
+
+ return FALSE;
}
-gint
-match_node_data_by_repr(gconstpointer data_p, gconstpointer repr)
+gboolean foreach_func(GtkTreeModel *model, GtkTreePath * /*path*/, GtkTreeIter *iter, gpointer user_data)
{
- return ((const NodeData *)data_p)->repr != (const Inkscape::XML::Node *)repr;
+ NodeData *anode = static_cast<NodeData *>(user_data);
+ Inkscape::XML::Node *iter_repr;
+ gtk_tree_model_get (model, iter, STORE_REPR_COL, &iter_repr, -1);
+ if (anode->repr == iter_repr) {
+ GtkTreeRowReference *rowref = tree_iter_to_ref (anode->tree, iter);
+ anode->rowref = rowref;
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/*
+ * Callback function for string searches in the tree
+ * Return a match on any substring
+ */
+gboolean search_equal_func(GtkTreeModel *model, gint /*column*/, const gchar *key, GtkTreeIter *iter, gpointer /*search_data*/)
+{
+ gchar *text = 0;
+ gtk_tree_model_get(model, iter, STORE_TEXT_COL, &text, -1);
+
+ gboolean match = (strstr(text, key) != NULL);
+
+ g_free(text);
+
+ return !match;
}
diff --git a/src/widgets/sp-xmlview-tree.h b/src/widgets/sp-xmlview-tree.h
index 5d228f982..36b76f5d9 100644
--- a/src/widgets/sp-xmlview-tree.h
+++ b/src/widgets/sp-xmlview-tree.h
@@ -2,7 +2,7 @@
#define __SP_XMLVIEW_TREE_H__
/*
- * Specialization of GtkCTree for the XML editor
+ * Specialization of GtkTreeView for the XML editor
*
* Authors:
* MenTaLguY <mental@rydia.net>
@@ -29,15 +29,16 @@ struct SPXMLViewTreeClass;
struct SPXMLViewTree
{
- GtkCTree tree;
-
+ GtkTreeView tree;
+ GtkTreeStore *store;
Inkscape::XML::Node * repr;
gint blocked;
+ gboolean dndactive;
};
struct SPXMLViewTreeClass
{
- GtkCTreeClass parent_class;
+ GtkTreeViewClass parent_class;
};
GType sp_xmlview_tree_get_type (void);
@@ -47,9 +48,8 @@ GtkWidget * sp_xmlview_tree_new (Inkscape::XML::Node * repr, void * factory, voi
void sp_xmlview_tree_set_repr (SPXMLViewTree * tree, Inkscape::XML::Node * repr);
-Inkscape::XML::Node * sp_xmlview_tree_node_get_repr (SPXMLViewTree * tree, GtkCTreeNode * node);
-GtkCTreeNode * sp_xmlview_tree_get_repr_node (SPXMLViewTree * tree, Inkscape::XML::Node * repr);
-
+Inkscape::XML::Node * sp_xmlview_tree_node_get_repr (GtkTreeView * tree, GtkTreeIter * node);
+gboolean sp_xmlview_tree_get_repr_node (SPXMLViewTree * tree, Inkscape::XML::Node * repr, GtkTreeIter *node);
#endif
diff --git a/src/widgets/stroke-marker-selector.cpp b/src/widgets/stroke-marker-selector.cpp
index a39ebf8be..9b2c3bb42 100644
--- a/src/widgets/stroke-marker-selector.cpp
+++ b/src/widgets/stroke-marker-selector.cpp
@@ -177,14 +177,21 @@ const gchar * MarkerComboBox::get_active_marker_uri()
gchar const *marker = "";
if (strcmp(markid, "none")) {
- bool stockid = get_active()->get_value(marker_columns.isstock);
-
- gchar *markurn = g_strdup(markid);
- if (stockid) markurn = g_strconcat("urn:inkscape:marker:",markid,NULL);
- SPObject *mark = get_stock_item(markurn);
- g_free(markurn);
- if (mark) {
- Inkscape::XML::Node *repr = mark->getRepr();
+ bool stockid = get_active()->get_value(marker_columns.isstock);
+
+ gchar *markurn;
+ if (stockid)
+ {
+ markurn = g_strconcat("urn:inkscape:marker:",markid,NULL);
+ }
+ else
+ {
+ markurn = g_strdup(markid);
+ }
+ SPObject *mark = get_stock_item(markurn);
+ g_free(markurn);
+ if (mark) {
+ Inkscape::XML::Node *repr = mark->getRepr();
marker = g_strconcat("url(#", repr->attribute("id"), ")", NULL);
}
} else {
@@ -211,7 +218,7 @@ void MarkerComboBox::set_selected(const gchar *name) {
iter != marker_store->children().end(); ++iter) {
Gtk::TreeModel::Row row = (*iter);
if (row[marker_columns.marker] &&
- !strcmp(row[marker_columns.marker], name)) {
+ !strcmp(row[marker_columns.marker], name)) {
set_active(iter);
if (strcmp(name, "none"))
set_history(row);
@@ -373,15 +380,13 @@ MarkerComboBox::create_marker_image(unsigned psize, gchar const *mname,
}
/* Update to renderable state */
- double sf = 0.8;
-
gchar *cache_name = g_strconcat(combo_id, mname, NULL);
Glib::ustring key = svg_preview_cache.cache_key(source->getURI(), cache_name, psize);
g_free (cache_name);
Glib::RefPtr<Gdk::Pixbuf> pixbuf = Glib::wrap(svg_preview_cache.get_preview_from_cache(key));
if (!pixbuf) {
- pixbuf = Glib::wrap(render_pixbuf(drawing, sf, *dbox, psize));
+ pixbuf = Glib::wrap(render_pixbuf(drawing, 0.8, *dbox, psize));
svg_preview_cache.set_preview_in_cache(key, pixbuf->gobj());
}
@@ -405,7 +410,7 @@ void MarkerComboBox::prepareImageRenderer( Gtk::TreeModel::const_iterator const
image_renderer.property_pixbuf() = empty_image->get_pixbuf();
}
-gboolean MarkerComboBox::separator_cb (GtkTreeModel *model, GtkTreeIter *iter, gpointer data) {
+gboolean MarkerComboBox::separator_cb (GtkTreeModel *model, GtkTreeIter *iter, gpointer /*data*/) {
gboolean sep = FALSE;
gtk_tree_model_get(model, iter, 5, &sep, -1);
diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp
index 38a581cdc..58c7958ba 100644
--- a/src/widgets/toolbox.cpp
+++ b/src/widgets/toolbox.cpp
@@ -113,6 +113,10 @@
#include "toolbox.h"
#include <gtk/gtk.h>
+#if !GTK_CHECK_VERSION(2,22,0)
+#define GDK_KEY_VoidSymbol 0xffffff
+#endif
+
//#define DEBUG_TEXT
using Inkscape::UnitTracker;
@@ -860,7 +864,7 @@ GtkWidget * sp_toolbox_button_new_from_verb_with_doubleclick(GtkWidget *t, Inksc
unsigned int shortcut = sp_shortcut_get_primary(verb);
- if (shortcut != GDK_VoidSymbol) {
+ if (shortcut != GDK_KEY_VoidSymbol) {
gchar *key = sp_shortcut_get_label(shortcut);
gchar *tip = g_strdup_printf ("%s (%s)", action->tip, key);
if ( t ) {
@@ -1058,14 +1062,24 @@ static GtkWidget* toolboxNewCommon( GtkWidget* tb, BarId id, GtkPositionType han
GtkWidget *ToolboxFactory::createToolToolbox()
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *tb = gtk_box_new(GTK_ORIENTATION, 0);
+ gtk_box_new(GTK_BOX(tb), FALSE);
+#else
GtkWidget *tb = gtk_vbox_new(FALSE, 0);
+#endif
return toolboxNewCommon( tb, BAR_TOOL, GTK_POS_TOP );
}
GtkWidget *ToolboxFactory::createAuxToolbox()
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *tb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_new(GTK_BOX(tb), FALSE);
+#else
GtkWidget *tb = gtk_vbox_new(FALSE, 0);
+#endif
return toolboxNewCommon( tb, BAR_AUX, GTK_POS_LEFT );
}
@@ -1076,14 +1090,24 @@ GtkWidget *ToolboxFactory::createAuxToolbox()
GtkWidget *ToolboxFactory::createCommandsToolbox()
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *tb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_new(GTK_BOX(tb), FALSE);
+#else
GtkWidget *tb = gtk_vbox_new(FALSE, 0);
+#endif
return toolboxNewCommon( tb, BAR_COMMANDS, GTK_POS_LEFT );
}
GtkWidget *ToolboxFactory::createSnapToolbox()
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *tb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0);
+ gtk_box_new(GTK_BOX(tb), FALSE);
+#else
GtkWidget *tb = gtk_vbox_new(FALSE, 0);
+#endif
return toolboxNewCommon( tb, BAR_SNAP, GTK_POS_LEFT );
}
@@ -3091,7 +3115,12 @@ static void sp_stb_defaults( GtkWidget * /*widget*/, GObject *dataKludge )
// public:
void sp_toolbox_add_label(GtkWidget *tbl, gchar const *title, bool wide)
{
+#if GTK_CHECK_VERSION(3,0,0)
+ GtkWidget *boxl = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
+ gtk_box_set_homogeneous(GTK_BOX(boxl), FALSE);
+#else
GtkWidget *boxl = gtk_hbox_new(FALSE, 0);
+#endif
if (wide) {
gtk_widget_set_size_request(boxl, MODE_LABEL_WIDTH, -1);
}