diff options
Diffstat (limited to 'src/widgets')
| -rw-r--r-- | src/widgets/desktop-widget.cpp | 37 | ||||
| -rw-r--r-- | src/widgets/eek-preview.cpp | 35 | ||||
| -rw-r--r-- | src/widgets/font-selector.cpp | 39 | ||||
| -rw-r--r-- | src/widgets/gradient-selector.cpp | 10 | ||||
| -rw-r--r-- | src/widgets/gradient-toolbar.cpp | 11 | ||||
| -rw-r--r-- | src/widgets/gradient-vector.cpp | 31 | ||||
| -rw-r--r-- | src/widgets/paint-selector.cpp | 51 | ||||
| -rw-r--r-- | src/widgets/select-toolbar.cpp | 5 | ||||
| -rw-r--r-- | src/widgets/shrink-wrap-button.cpp | 4 | ||||
| -rw-r--r-- | src/widgets/sp-color-notebook.cpp | 5 | ||||
| -rw-r--r-- | src/widgets/sp-color-slider.cpp | 32 | ||||
| -rw-r--r-- | src/widgets/sp-widget.cpp | 2 | ||||
| -rw-r--r-- | src/widgets/sp-xmlview-attr-list.cpp | 58 | ||||
| -rw-r--r-- | src/widgets/sp-xmlview-attr-list.h | 4 | ||||
| -rw-r--r-- | src/widgets/sp-xmlview-tree.cpp | 546 | ||||
| -rw-r--r-- | src/widgets/sp-xmlview-tree.h | 14 | ||||
| -rw-r--r-- | src/widgets/stroke-marker-selector.cpp | 31 | ||||
| -rw-r--r-- | src/widgets/toolbox.cpp | 31 |
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 > Pattern > 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); } |
