From 2577d445ac39eb53da3dff8860dacfb8b5e8823a Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Fri, 23 Apr 2010 23:40:16 -0700 Subject: Temporary compile fix for GTK before 2.16.0 (bzr r9368) --- src/ink-comboboxentry-action.cpp | 184 ++++++++++++++++++++------------------- 1 file changed, 95 insertions(+), 89 deletions(-) (limited to 'src') diff --git a/src/ink-comboboxentry-action.cpp b/src/ink-comboboxentry-action.cpp index 61d6bb9c4..68cbe37b0 100644 --- a/src/ink-comboboxentry-action.cpp +++ b/src/ink-comboboxentry-action.cpp @@ -141,7 +141,7 @@ static void ink_comboboxentry_action_get_property (GObject *object, guint proper static void ink_comboboxentry_action_connect_proxy (GtkAction *action, - GtkWidget *proxy) + GtkWidget *proxy) { /* Override any proxy properties. */ // if (GTK_IS_MENU_ITEM (proxy)) { @@ -171,72 +171,72 @@ static void ink_comboboxentry_action_class_init (Ink_ComboBoxEntry_ActionClass * ink_comboboxentry_action_parent_class = GTK_ACTION_CLASS(g_type_class_peek_parent (klass) ); g_object_class_install_property ( - gobject_class, - PROP_MODEL, - g_param_spec_object ("model", - "Tree Model", - "Tree Model", - GTK_TYPE_TREE_MODEL, - (GParamFlags)G_PARAM_READWRITE)); + gobject_class, + PROP_MODEL, + g_param_spec_object ("model", + "Tree Model", + "Tree Model", + GTK_TYPE_TREE_MODEL, + (GParamFlags)G_PARAM_READWRITE)); g_object_class_install_property ( - gobject_class, - PROP_COMBOBOX, - g_param_spec_object ("combobox", - "GtkComboBoxEntry", - "GtkComboBoxEntry", - GTK_TYPE_WIDGET, - (GParamFlags)G_PARAM_READABLE)); + gobject_class, + PROP_COMBOBOX, + g_param_spec_object ("combobox", + "GtkComboBoxEntry", + "GtkComboBoxEntry", + GTK_TYPE_WIDGET, + (GParamFlags)G_PARAM_READABLE)); g_object_class_install_property ( - gobject_class, - PROP_ENTRY, - g_param_spec_object ("entry", - "GtkEntry", - "GtkEntry", - GTK_TYPE_WIDGET, - (GParamFlags)G_PARAM_READABLE)); + gobject_class, + PROP_ENTRY, + g_param_spec_object ("entry", + "GtkEntry", + "GtkEntry", + GTK_TYPE_WIDGET, + (GParamFlags)G_PARAM_READABLE)); g_object_class_install_property ( - gobject_class, - PROP_WIDTH, - g_param_spec_int ("width", - "EntryBox width", - "EntryBox width (characters)", - -1.0, 100, -1.0, - (GParamFlags)G_PARAM_READWRITE)); + gobject_class, + PROP_WIDTH, + g_param_spec_int ("width", + "EntryBox width", + "EntryBox width (characters)", + -1.0, 100, -1.0, + (GParamFlags)G_PARAM_READWRITE)); g_object_class_install_property ( - gobject_class, - PROP_CELL_DATA_FUNC, - g_param_spec_pointer ("cell_data_func", - "Cell Data Func", - "Cell Deta Function", - (GParamFlags)G_PARAM_READWRITE)); + gobject_class, + PROP_CELL_DATA_FUNC, + g_param_spec_pointer ("cell_data_func", + "Cell Data Func", + "Cell Deta Function", + (GParamFlags)G_PARAM_READWRITE)); g_object_class_install_property ( - gobject_class, - PROP_POPUP, - g_param_spec_boolean ("popup", - "Entry Popup", - "Entry Popup", - false, - (GParamFlags)G_PARAM_READWRITE)); + gobject_class, + PROP_POPUP, + g_param_spec_boolean ("popup", + "Entry Popup", + "Entry Popup", + false, + (GParamFlags)G_PARAM_READWRITE)); // We need to know when GtkComboBoxEvent or Menu ready for reading signals[CHANGED] = g_signal_new( "changed", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET(Ink_ComboBoxEntry_ActionClass, changed), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(Ink_ComboBoxEntry_ActionClass, changed), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); // Probably not needed... originally to keep track of key-presses. signals[ACTIVATED] = g_signal_new( "activated", - G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_FIRST, - G_STRUCT_OFFSET(Ink_ComboBoxEntry_ActionClass, activated), - NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); + G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_FIRST, + G_STRUCT_OFFSET(Ink_ComboBoxEntry_ActionClass, activated), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); } @@ -268,9 +268,9 @@ GType ink_comboboxentry_action_get_type () }; ink_comboboxentry_action_type = g_type_register_static (GTK_TYPE_ACTION, - "Ink_ComboBoxEntry_Action", - &ink_comboboxentry_action_info, - (GTypeFlags)0 ); + "Ink_ComboBoxEntry_Action", + &ink_comboboxentry_action_info, + (GTypeFlags)0 ); } return ink_comboboxentry_action_type; @@ -278,24 +278,24 @@ GType ink_comboboxentry_action_get_type () Ink_ComboBoxEntry_Action *ink_comboboxentry_action_new (const gchar *name, - const gchar *label, - const gchar *tooltip, - const gchar *stock_id, - GtkTreeModel *model, - gint width, - void *cell_data_func ) + const gchar *label, + const gchar *tooltip, + const gchar *stock_id, + GtkTreeModel *model, + gint width, + void *cell_data_func ) { g_return_val_if_fail (name != NULL, NULL); return (Ink_ComboBoxEntry_Action*)g_object_new (INK_COMBOBOXENTRY_TYPE_ACTION, - "name", name, - "label", label, - "tooltip", tooltip, - "stock-id", stock_id, - "model", model, - "width", width, - "cell_data_func", cell_data_func, - NULL); + "name", name, + "label", label, + "tooltip", tooltip, + "stock-id", stock_id, + "model", model, + "width", width, + "cell_data_func", cell_data_func, + NULL); } // Create a widget for a toolbar. @@ -311,7 +311,7 @@ GtkWidget* create_tool_item( GtkAction* action ) GtkWidget* comboBoxEntry = gtk_combo_box_entry_new_with_model( ink_comboboxentry_action->model, 0 ); - gtk_container_add( GTK_CONTAINER(item), comboBoxEntry ); + gtk_container_add( GTK_CONTAINER(item), comboBoxEntry ); ink_comboboxentry_action->combobox = GTK_COMBO_BOX_ENTRY(comboBoxEntry); @@ -325,8 +325,8 @@ GtkWidget* create_tool_item( GtkAction* action ) gtk_cell_layout_clear( GTK_CELL_LAYOUT( comboBoxEntry ) ); gtk_cell_layout_pack_start( GTK_CELL_LAYOUT( comboBoxEntry ), cell, true ); gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT( comboBoxEntry ), cell, - GtkCellLayoutDataFunc (ink_comboboxentry_action->cell_data_func), - NULL, NULL ); + GtkCellLayoutDataFunc (ink_comboboxentry_action->cell_data_func), + NULL, NULL ); } // Get reference to GtkEntry and fiddle a bit with it. @@ -336,12 +336,12 @@ GtkWidget* create_tool_item( GtkAction* action ) // Change width if( ink_comboboxentry_action->width > 0 ) { - gtk_entry_set_width_chars (GTK_ENTRY (child), ink_comboboxentry_action->width ); + gtk_entry_set_width_chars (GTK_ENTRY (child), ink_comboboxentry_action->width ); } // Add pop-up entry completion if required if( ink_comboboxentry_action->popup ) { - ink_comboboxentry_action_popup_enable( ink_comboboxentry_action ); + ink_comboboxentry_action_popup_enable( ink_comboboxentry_action ); } // Add signal for GtkEntry to check if finished typing. @@ -350,7 +350,7 @@ GtkWidget* create_tool_item( GtkAction* action ) } gtk_action_connect_proxy( GTK_ACTION( action ), item ); - + gtk_widget_show_all( item ); } else { @@ -358,7 +358,7 @@ GtkWidget* create_tool_item( GtkAction* action ) item = ink_comboboxentry_action_parent_class->create_tool_item( action ); } - + return item; } @@ -369,7 +369,7 @@ GtkWidget* create_menu_item( GtkAction* action ) item = ink_comboboxentry_action_parent_class->create_menu_item( action ); g_warning( "ink_comboboxentry_action: create_menu_item not implemented" ); - // One can easily modify ege-select-one-action routine to implement this. + // One can easily modify ege-select-one-action routine to implement this. return item; } @@ -412,18 +412,22 @@ gboolean ink_comboboxentry_action_set_active_text( Ink_ComboBoxEntry_Action* ink // Show or hide warning if( ink_comboboxentry_action->active == -1 && ink_comboboxentry_action->warning != NULL ) { +#if GTK_CHECK_VERSION(2,16,0) gtk_entry_set_icon_from_icon_name( ink_comboboxentry_action->entry, - GTK_ENTRY_ICON_SECONDARY, - GTK_STOCK_DIALOG_WARNING ); + GTK_ENTRY_ICON_SECONDARY, + GTK_STOCK_DIALOG_WARNING ); // Can't add tooltip until icon set gtk_entry_set_icon_tooltip_text( ink_comboboxentry_action->entry, - GTK_ENTRY_ICON_SECONDARY, - ink_comboboxentry_action->warning ); + GTK_ENTRY_ICON_SECONDARY, + ink_comboboxentry_action->warning ); +#endif // GTK_CHECK_VERSION(2,16,0) } else { +#if GTK_CHECK_VERSION(2,16,0) gtk_entry_set_icon_from_icon_name( GTK_ENTRY(ink_comboboxentry_action->entry), - GTK_ENTRY_ICON_SECONDARY, - NULL ); + GTK_ENTRY_ICON_SECONDARY, + NULL ); +#endif // GTK_CHECK_VERSION(2,16,0) } } @@ -482,9 +486,11 @@ void ink_comboboxentry_action_set_warning( Ink_ComboBoxEntry_Action* action, // Widget may not have been created.... if( action->entry ) { +#if GTK_CHECK_VERSION(2,16,0) gtk_entry_set_icon_tooltip_text( GTK_ENTRY(action->entry), - GTK_ENTRY_ICON_SECONDARY, - action->warning ); + GTK_ENTRY_ICON_SECONDARY, + action->warning ); +#endif // GTK_CHECK_VERSION(2,16,0) } } @@ -571,7 +577,7 @@ static void entry_activate_cb( GtkEntry* widget, gpointer data ) { } -static gboolean match_selected_cb( GtkEntryCompletion* widget, GtkTreeModel* model, GtkTreeIter* iter, gpointer data ) +static gboolean match_selected_cb( GtkEntryCompletion* /*widget*/, GtkTreeModel* model, GtkTreeIter* iter, gpointer data ) { // Get action Ink_ComboBoxEntry_Action *ink_comboboxentry_action = INK_COMBOBOXENTRY_ACTION( data ); @@ -583,7 +589,7 @@ static gboolean match_selected_cb( GtkEntryCompletion* widget, GtkTreeModel* mod // Set text in GtkEntry gtk_entry_set_text (GTK_ENTRY (entry), family ); - + // Set text in GtkAction g_free( ink_comboboxentry_action->text ); ink_comboboxentry_action->text = family; -- cgit v1.2.3 From c9f05231cf43faf9d7836fb63653efbfd7eb40b5 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Sat, 24 Apr 2010 11:13:24 +0200 Subject: Add alt-x shortcut to new text toolbar. (bzr r9369) --- src/ink-comboboxentry-action.cpp | 25 +++++++++++++++++++++---- src/ink-comboboxentry-action.h | 17 ++++++++++------- src/widgets/toolbox.cpp | 13 +++++++------ 3 files changed, 38 insertions(+), 17 deletions(-) (limited to 'src') diff --git a/src/ink-comboboxentry-action.cpp b/src/ink-comboboxentry-action.cpp index 68cbe37b0..85e9378c8 100644 --- a/src/ink-comboboxentry-action.cpp +++ b/src/ink-comboboxentry-action.cpp @@ -34,7 +34,7 @@ static GtkWidget* create_tool_item( GtkAction* action ); static GtkWidget* create_menu_item( GtkAction* action ); // Internal -static gint get_active_row_from_text( Ink_ComboBoxEntry_Action* action, gchar* target_text ); +static gint get_active_row_from_text( Ink_ComboBoxEntry_Action* action, const gchar* target_text ); // Callbacks static void combo_box_changed_cb( GtkComboBoxEntry* widget, gpointer data ); @@ -247,6 +247,7 @@ static void ink_comboboxentry_action_init (Ink_ComboBoxEntry_Action *action) action->entry_completion = NULL; action->popup = false; action->warning = NULL; + action->altx_name = NULL; } GType ink_comboboxentry_action_get_type () @@ -344,6 +345,11 @@ GtkWidget* create_tool_item( GtkAction* action ) ink_comboboxentry_action_popup_enable( ink_comboboxentry_action ); } + // Add altx_name if required + if( ink_comboboxentry_action->altx_name ) { + g_object_set_data( G_OBJECT( child ), ink_comboboxentry_action->altx_name, ink_comboboxentry_action->entry ); + } + // Add signal for GtkEntry to check if finished typing. g_signal_connect( G_OBJECT(child), "activate", G_CALLBACK(entry_activate_cb), action ); @@ -391,7 +397,7 @@ gchar* ink_comboboxentry_action_get_active_text( Ink_ComboBoxEntry_Action* actio return text; } -gboolean ink_comboboxentry_action_set_active_text( Ink_ComboBoxEntry_Action* ink_comboboxentry_action, gchar* text ) { +gboolean ink_comboboxentry_action_set_active_text( Ink_ComboBoxEntry_Action* ink_comboboxentry_action, const gchar* text ) { g_free( ink_comboboxentry_action->text ); ink_comboboxentry_action->text = g_strdup( text ); @@ -479,7 +485,7 @@ void ink_comboboxentry_action_popup_disable( Ink_ComboBoxEntry_Action* action ) } } -void ink_comboboxentry_action_set_warning( Ink_ComboBoxEntry_Action* action, gchar* warning ) { +void ink_comboboxentry_action_set_warning( Ink_ComboBoxEntry_Action* action, const gchar* warning ) { g_free( action->warning ); action->warning = g_strdup( warning ); @@ -494,10 +500,21 @@ void ink_comboboxentry_action_set_warning( Ink_ComboBoxEntry_Action* action, } } +void ink_comboboxentry_action_set_altx_name( Ink_ComboBoxEntry_Action* action, const gchar* altx_name ) { + + g_free( action->altx_name ); + action->altx_name = g_strdup( altx_name ); + + // Widget may not have been created.... + if( action->entry ) { + g_object_set_data( G_OBJECT(action->entry), action->altx_name, action->entry ); + } +} + // Internal --------------------------------------------------- // Return row of active text or -1 if not found. -gint get_active_row_from_text( Ink_ComboBoxEntry_Action* action, gchar* target_text ) { +gint get_active_row_from_text( Ink_ComboBoxEntry_Action* action, const gchar* target_text ) { // Check if text in list gint row = 0; diff --git a/src/ink-comboboxentry-action.h b/src/ink-comboboxentry-action.h index 433eb2fdc..b1228f749 100644 --- a/src/ink-comboboxentry-action.h +++ b/src/ink-comboboxentry-action.h @@ -49,11 +49,12 @@ struct _Ink_ComboBoxEntry_Action { gpointer cell_data_func; // drop-down menu format - gint active; // Index of active menu item (-1 if not in list). - gchar *text; // Text of active menu item or entry box. - gint width; // Width of GtkComboBoxEntry in characters. - gboolean popup; // Do we pop-up an entry-completion dialog? - gchar *warning; // Text for warning that entry isn't in list. + gint active; // Index of active menu item (-1 if not in list). + gchar *text; // Text of active menu item or entry box. + gint width; // Width of GtkComboBoxEntry in characters. + gboolean popup; // Do we pop-up an entry-completion dialog? + gchar *warning; // Text for warning that entry isn't in list. + gchar *altx_name; // Target for Alt-X keyboard shortcut. }; @@ -74,13 +75,15 @@ GtkTreeModel *ink_comboboxentry_action_get_model( Ink_ComboBoxEntry_Action* GtkComboBoxEntry *ink_comboboxentry_action_get_comboboxentry( Ink_ComboBoxEntry_Action* action ); gchar* ink_comboboxentry_action_get_active_text( Ink_ComboBoxEntry_Action* action ); -gboolean ink_comboboxentry_action_set_active_text( Ink_ComboBoxEntry_Action* action, gchar* text ); +gboolean ink_comboboxentry_action_set_active_text( Ink_ComboBoxEntry_Action* action, const gchar* text ); void ink_comboboxentry_action_set_width( Ink_ComboBoxEntry_Action* action, gint width ); void ink_comboboxentry_action_popup_enable( Ink_ComboBoxEntry_Action* action ); void ink_comboboxentry_action_popup_disable( Ink_ComboBoxEntry_Action* action ); -void ink_comboboxentry_action_set_warning( Ink_ComboBoxEntry_Action* action, gchar* warning ); +void ink_comboboxentry_action_set_warning( Ink_ComboBoxEntry_Action* action, const gchar* warning ); + +void ink_comboboxentry_action_set_altx_name( Ink_ComboBoxEntry_Action* action, const gchar* altx_name ); #endif /* SEEN_INK_COMBOBOXENTRY_ACTION */ diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index 826fabb06..493d1ecd7 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -7179,6 +7179,7 @@ static void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions ink_comboboxentry_action_popup_enable( act ); // Enable entry completion gchar *const warning = _("Font not found on system"); ink_comboboxentry_action_set_warning( act, warning ); // Show icon with tooltip if missing font + ink_comboboxentry_action_set_altx_name( act, "altx-text" ); // Set Alt-X keyboard shortcut g_signal_connect( G_OBJECT(act), "changed", G_CALLBACK(sp_text_fontfamily_value_changed), holder ); gtk_action_group_add_action( mainActions, GTK_ACTION(act) ); g_object_set_data( holder, "TextFontFamilyAction", act ); @@ -7349,8 +7350,8 @@ static void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions GTK_WIDGET(desktop->canvas), /* focusTarget */ NULL, /* unit selector */ holder, /* dataKludge */ - FALSE, /* altx? */ - NULL, /* altx_mark? */ + FALSE, /* set alt-x keyboard shortcut? */ + NULL, /* altx_mark */ 0.0, 10.0, 0.01, 0.10, /* lower, upper, step (arrow up/down), page up/down */ labels, values, G_N_ELEMENTS(labels), /* drop down menu */ sp_text_lineheight_value_changed, /* callback */ @@ -7379,8 +7380,8 @@ static void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions GTK_WIDGET(desktop->canvas), /* focusTarget */ NULL, /* unit selector */ holder, /* dataKludge */ - FALSE, /* altx? */ - NULL, /* altx_mark? */ + FALSE, /* set alt-x keyboard shortcut? */ + NULL, /* altx_mark */ -100.0, 100.0, 0.01, 0.10, /* lower, upper, step (arrow up/down), page up/down */ labels, values, G_N_ELEMENTS(labels), /* drop down menu */ sp_text_wordspacing_value_changed, /* callback */ @@ -7409,8 +7410,8 @@ static void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions GTK_WIDGET(desktop->canvas), /* focusTarget */ NULL, /* unit selector */ holder, /* dataKludge */ - FALSE, /* altx? */ - NULL, /* altx_mark? */ + FALSE, /* set alt-x keyboard shortcut? */ + NULL, /* altx_mark */ -100.0, 100.0, 0.01, 0.10, /* lower, upper, step (arrow up/down), page up/down */ labels, values, G_N_ELEMENTS(labels), /* drop down menu */ sp_text_letterspacing_value_changed, /* callback */ -- cgit v1.2.3 From 1f79261ddf905dfdc4c2dd90c63a747f7f01d2d5 Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Sun, 25 Apr 2010 01:56:03 -0700 Subject: Pack combo boxes into GtkAlignment for natural size when used in toolbars. (bzr r9370) --- src/ink-comboboxentry-action.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/ink-comboboxentry-action.cpp b/src/ink-comboboxentry-action.cpp index 85e9378c8..60332e02e 100644 --- a/src/ink-comboboxentry-action.cpp +++ b/src/ink-comboboxentry-action.cpp @@ -312,7 +312,11 @@ GtkWidget* create_tool_item( GtkAction* action ) GtkWidget* comboBoxEntry = gtk_combo_box_entry_new_with_model( ink_comboboxentry_action->model, 0 ); - gtk_container_add( GTK_CONTAINER(item), comboBoxEntry ); + { + GtkWidget *align = gtk_alignment_new(0, 0.5, 0, 0); + gtk_container_add( GTK_CONTAINER(align), comboBoxEntry ); + gtk_container_add( GTK_CONTAINER(item), align ); + } ink_comboboxentry_action->combobox = GTK_COMBO_BOX_ENTRY(comboBoxEntry); @@ -347,7 +351,7 @@ GtkWidget* create_tool_item( GtkAction* action ) // Add altx_name if required if( ink_comboboxentry_action->altx_name ) { - g_object_set_data( G_OBJECT( child ), ink_comboboxentry_action->altx_name, ink_comboboxentry_action->entry ); + g_object_set_data( G_OBJECT( child ), ink_comboboxentry_action->altx_name, ink_comboboxentry_action->entry ); } // Add signal for GtkEntry to check if finished typing. -- cgit v1.2.3 From df0b97d8308ca35a22b580e0756f57feefc39c35 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Sun, 25 Apr 2010 16:10:07 +0200 Subject: i18n. Fix for bug #425202 (script messages not translated). Fixed bugs: - https://launchpad.net/bugs/425202 (bzr r9371) --- src/extension/implementation/script.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/extension/implementation/script.cpp b/src/extension/implementation/script.cpp index 53a666e25..e075feb91 100644 --- a/src/extension/implementation/script.cpp +++ b/src/extension/implementation/script.cpp @@ -835,7 +835,13 @@ void Script::checkStderr (const Glib::ustring &data, textview->set_wrap_mode(Gtk::WRAP_WORD); textview->show(); - textview->get_buffer()->set_text(data.c_str()); + // Remove the last character + char *errormsg = (char*) data.c_str(); + while (*errormsg != '\0') errormsg++; + errormsg -= 1; + *errormsg = '\0'; + + textview->get_buffer()->set_text(_(data.c_str())); Gtk::ScrolledWindow * scrollwindow = new Gtk::ScrolledWindow(); scrollwindow->add(*textview); -- cgit v1.2.3 From 92347bef8cc2a8d8cc43deeafa17840d59712244 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Sun, 25 Apr 2010 18:35:35 +0200 Subject: Typo fix in preferences by Masato Hashimoto (bug #569339). Fixed bugs: - https://launchpad.net/bugs/569339 (bzr r9372) --- src/ui/dialog/inkscape-preferences.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/ui/dialog/inkscape-preferences.cpp b/src/ui/dialog/inkscape-preferences.cpp index 96f0a0f6e..9ff643e90 100644 --- a/src/ui/dialog/inkscape-preferences.cpp +++ b/src/ui/dialog/inkscape-preferences.cpp @@ -943,7 +943,7 @@ void InkscapePreferences::initPageCMS() _cms_proof_intent.init("/options/softproof/intent", intentLabels, intentValues, numIntents, 0); _page_cms.add_line( false, _("Device rendering intent:"), _cms_proof_intent, "", - _("The rendering intent to use to calibrate display output"), false); + _("The rendering intent to use to calibrate device output"), false); _cms_proof_blackpoint.init( _("Black point compensation"), "/options/softproof/bpc", false); _page_cms.add_line( false, "", _cms_proof_blackpoint, "", -- cgit v1.2.3 From de755b67163eb082bf839796713db368701de105 Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Mon, 26 Apr 2010 01:23:10 -0700 Subject: Add warning dialog for other than "newest" GTK. (bzr r9376) --- src/ink-comboboxentry-action.cpp | 24 +++++++++++++++++++++++- src/ink-comboboxentry-action.h | 20 ++++++++++++-------- 2 files changed, 35 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/ink-comboboxentry-action.cpp b/src/ink-comboboxentry-action.cpp index 60332e02e..de0af347c 100644 --- a/src/ink-comboboxentry-action.cpp +++ b/src/ink-comboboxentry-action.cpp @@ -7,6 +7,7 @@ * * Author(s): * Tavmjong Bah + * Jon A. Cruz * * Copyright (C) 2010 Authors * @@ -245,6 +246,9 @@ static void ink_comboboxentry_action_init (Ink_ComboBoxEntry_Action *action) action->active = -1; action->text = NULL; action->entry_completion = NULL; +#if !GTK_CHECK_VERSION(2,16,0) + action->indicator = NULL; +#endif action->popup = false; action->warning = NULL; action->altx_name = NULL; @@ -314,7 +318,15 @@ GtkWidget* create_tool_item( GtkAction* action ) { GtkWidget *align = gtk_alignment_new(0, 0.5, 0, 0); +#if GTK_CHECK_VERSION(2,16,0) gtk_container_add( GTK_CONTAINER(align), comboBoxEntry ); +#else // GTK_CHECK_VERSION(2,16,0) + GtkWidget *hbox = gtk_hbox_new( FALSE, 0 ); + ink_comboboxentry_action->indicator = gtk_image_new_from_stock(GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_SMALL_TOOLBAR); + gtk_box_pack_start( GTK_BOX(hbox), comboBoxEntry, TRUE, TRUE, 0 ); + gtk_box_pack_start( GTK_BOX(hbox), ink_comboboxentry_action->indicator, FALSE, FALSE, 0 ); + gtk_container_add( GTK_CONTAINER(align), hbox ); +#endif // GTK_CHECK_VERSION(2,16,0) gtk_container_add( GTK_CONTAINER(item), align ); } @@ -359,7 +371,9 @@ GtkWidget* create_tool_item( GtkAction* action ) } +#if GTK_CHECK_VERSION(2,16,0) gtk_action_connect_proxy( GTK_ACTION( action ), item ); +#endif gtk_widget_show_all( item ); @@ -430,13 +444,18 @@ gboolean ink_comboboxentry_action_set_active_text( Ink_ComboBoxEntry_Action* ink gtk_entry_set_icon_tooltip_text( ink_comboboxentry_action->entry, GTK_ENTRY_ICON_SECONDARY, ink_comboboxentry_action->warning ); - +#else // GTK_CHECK_VERSION(2,16,0) + gtk_image_set_from_stock( GTK_IMAGE(ink_comboboxentry_action->indicator), GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_SMALL_TOOLBAR); + gtk_widget_set_tooltip_text( ink_comboboxentry_action->indicator, ink_comboboxentry_action->warning ); #endif // GTK_CHECK_VERSION(2,16,0) } else { #if GTK_CHECK_VERSION(2,16,0) gtk_entry_set_icon_from_icon_name( GTK_ENTRY(ink_comboboxentry_action->entry), GTK_ENTRY_ICON_SECONDARY, NULL ); +#else // GTK_CHECK_VERSION(2,16,0) + gtk_image_set_from_stock( GTK_IMAGE(ink_comboboxentry_action->indicator), NULL, GTK_ICON_SIZE_SMALL_TOOLBAR); + gtk_widget_set_tooltip_text( ink_comboboxentry_action->indicator, NULL ); #endif // GTK_CHECK_VERSION(2,16,0) } } @@ -486,6 +505,7 @@ void ink_comboboxentry_action_popup_disable( Ink_ComboBoxEntry_Action* action ) if( action->entry_completion ) { gtk_object_destroy( GTK_OBJECT( action->entry_completion ) ); + action->entry_completion = 0; } } @@ -500,6 +520,8 @@ void ink_comboboxentry_action_set_warning( Ink_ComboBoxEntry_Action* action, gtk_entry_set_icon_tooltip_text( GTK_ENTRY(action->entry), GTK_ENTRY_ICON_SECONDARY, action->warning ); +#else // GTK_CHECK_VERSION(2,16,0) + gtk_image_set_from_stock( GTK_IMAGE(action->indicator), action->warning ? GTK_STOCK_DIALOG_WARNING : 0, GTK_ICON_SIZE_SMALL_TOOLBAR ); #endif // GTK_CHECK_VERSION(2,16,0) } } diff --git a/src/ink-comboboxentry-action.h b/src/ink-comboboxentry-action.h index b1228f749..031803d8a 100644 --- a/src/ink-comboboxentry-action.h +++ b/src/ink-comboboxentry-action.h @@ -7,6 +7,7 @@ * * Author(s): * Tavmjong Bah + * Jon A. Cruz * * Copyright (C) 2010 Authors * @@ -46,10 +47,13 @@ struct _Ink_ComboBoxEntry_Action { GtkComboBoxEntry *combobox; GtkEntry *entry; GtkEntryCompletion *entry_completion; +#if !GTK_CHECK_VERSION(2,16,0) + GtkWidget *indicator; +#endif gpointer cell_data_func; // drop-down menu format - gint active; // Index of active menu item (-1 if not in list). + gint active; // Index of active menu item (-1 if not in list). gchar *text; // Text of active menu item or entry box. gint width; // Width of GtkComboBoxEntry in characters. gboolean popup; // Do we pop-up an entry-completion dialog? @@ -62,14 +66,14 @@ GType ink_comboboxentry_action_get_type (void); /** * Creates a GtkAction subclass that wraps a GtkComboBoxEntry object. - */ + */ Ink_ComboBoxEntry_Action *ink_comboboxentry_action_new ( const gchar *name, - const gchar *label, - const gchar *tooltip, - const gchar *stock_id, - GtkTreeModel *model, - gint width = -1, - gpointer cell_data_func = NULL ); + const gchar *label, + const gchar *tooltip, + const gchar *stock_id, + GtkTreeModel *model, + gint width = -1, + gpointer cell_data_func = NULL ); GtkTreeModel *ink_comboboxentry_action_get_model( Ink_ComboBoxEntry_Action* action ); GtkComboBoxEntry *ink_comboboxentry_action_get_comboboxentry( Ink_ComboBoxEntry_Action* action ); -- cgit v1.2.3 From e04ef6b2a4fde8f839532e038d6ed71224df5e13 Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Tue, 27 Apr 2010 00:48:04 -0700 Subject: Correct desktop tracking for layers dialog. Fixes bug #427514. Fixed bugs: - https://launchpad.net/bugs/427514 (bzr r9380) --- src/document-subset.cpp | 2 +- src/layer-manager.cpp | 3 +- src/layer-manager.h | 4 +-- src/ui/dialog/layers.cpp | 84 ++++++++++++++++++++---------------------------- src/ui/dialog/layers.h | 10 +++--- 5 files changed, 46 insertions(+), 57 deletions(-) (limited to 'src') diff --git a/src/document-subset.cpp b/src/document-subset.cpp index eb7265b2d..1988865d1 100644 --- a/src/document-subset.cpp +++ b/src/document-subset.cpp @@ -301,7 +301,7 @@ void DocumentSubset::Relations::remove(SPObject *obj, bool subtree) { /* remove obj's record */ _doRemove(obj); } - + changed_signal.emit(); } diff --git a/src/layer-manager.cpp b/src/layer-manager.cpp index 8c45c7e53..db7384622 100644 --- a/src/layer-manager.cpp +++ b/src/layer-manager.cpp @@ -142,6 +142,7 @@ LayerManager::~LayerManager() _layer_connection.disconnect(); _document_connection.disconnect(); _resource_connection.disconnect(); + _document = 0; } void LayerManager::setCurrentLayer( SPObject* obj ) @@ -315,7 +316,7 @@ void LayerManager::_rebuild() { LayerWatcher *eye = new LayerWatcher(this, layer, connection); _watchers.push_back( eye ); SP_OBJECT_REPR(layer)->addObserver(*eye); - + _addOne(layer); } } diff --git a/src/layer-manager.h b/src/layer-manager.h index 81f75e002..5b5d25eb2 100644 --- a/src/layer-manager.h +++ b/src/layer-manager.h @@ -32,11 +32,11 @@ public: void renameLayer( SPObject* obj, gchar const *label, bool uniquify ); sigc::connection connectCurrentLayerChanged(const sigc::slot & slot) { - return _layer_changed_signal.connect(slot); + return _layer_changed_signal.connect(slot); } sigc::connection connectLayerDetailsChanged(const sigc::slot & slot) { - return _details_changed_signal.connect(slot); + return _details_changed_signal.connect(slot); } private: diff --git a/src/ui/dialog/layers.cpp b/src/ui/dialog/layers.cpp index 98bf236fc..ff3a13ab2 100644 --- a/src/ui/dialog/layers.cpp +++ b/src/ui/dialog/layers.cpp @@ -4,7 +4,7 @@ * Authors: * Jon A. Cruz * - * Copyright (C) 2006 Jon A. Cruz + * Copyright (C) 2006,2010 Jon A. Cruz * * Released under GNU GPL, read the file 'COPYING' for more information */ @@ -41,10 +41,9 @@ namespace Inkscape { namespace UI { -namespace Dialogs { +namespace Dialog { -LayersPanel& -LayersPanel::getInstance() +LayersPanel& LayersPanel::getInstance() { return *new LayersPanel(); } @@ -73,28 +72,6 @@ public: SPObject* _target; }; -static gboolean layers_panel_activated(Inkscape::Application * /*inkscape*/, SPDesktop *desktop, gpointer data ) -{ - if ( data ) - { - LayersPanel* panel = reinterpret_cast(data); - panel->setDesktop(desktop); - } - - return FALSE; -} - -static gboolean layers_panel_deactivated( GtkObject */*object*/, GdkEvent * /*event*/, gpointer data ) -{ - if ( data ) - { - LayersPanel* panel = reinterpret_cast(data); - panel->setDesktop(NULL); - } - - return FALSE; -} - void LayersPanel::_styleButton( Gtk::Button& btn, SPDesktop *desktop, unsigned int code, char const* iconName, char const* fallback ) { bool set = false; @@ -348,12 +325,12 @@ bool LayersPanel::_checkForSelected(const Gtk::TreePath &path, const Gtk::TreeIt void LayersPanel::_layersChanged() { // g_message("_layersChanged()"); - if(_desktop) { + if (_desktop) { SPDocument* document = _desktop->doc(); SPObject* root = document->root; if ( root ) { _selectedConnection.block(); - if ( _mgr && _mgr->includes( root ) ) { + if ( _desktop->layer_manager && _desktop->layer_manager->includes( root ) ) { SPObject* target = _desktop->currentLayer(); _store->clear(); @@ -369,10 +346,10 @@ void LayersPanel::_layersChanged() void LayersPanel::_addLayer( SPDocument* doc, SPObject* layer, Gtk::TreeModel::Row* parentRow, SPObject* target, int level ) { - if ( layer && (level < _maxNestDepth) ) { - unsigned int counter = _mgr->childCount(layer); + if ( _desktop && _desktop->layer_manager && layer && (level < _maxNestDepth) ) { + unsigned int counter = _desktop->layer_manager->childCount(layer); for ( unsigned int i = 0; i < counter; i++ ) { - SPObject *child = _mgr->nthChildOf(layer, i); + SPObject *child = _desktop->layer_manager->nthChildOf(layer, i); if ( child ) { #if DUMP_LAYERS g_message(" %3d layer:%p {%s} [%s]", level, child, child->id, child->label() ); @@ -416,15 +393,15 @@ SPObject* LayersPanel::_selectedLayer() void LayersPanel::_pushTreeSelectionToCurrent() { // TODO hunt down the possible API abuse in getting NULL - if ( _desktop && _desktop->currentRoot() ) { + if ( _desktop && _desktop->layer_manager && _desktop->currentRoot() ) { SPObject* inTree = _selectedLayer(); if ( inTree ) { SPObject* curr = _desktop->currentLayer(); if ( curr != inTree ) { - _mgr->setCurrentLayer( inTree ); + _desktop->layer_manager->setCurrentLayer( inTree ); } } else { - _mgr->setCurrentLayer( _desktop->doc()->root ); + _desktop->layer_manager->setCurrentLayer( _desktop->doc()->root ); } } } @@ -537,13 +514,13 @@ void LayersPanel::_handleButtonEvent(GdkEventButton* evt) void LayersPanel::_handleRowChange( Gtk::TreeModel::Path const& /*path*/, Gtk::TreeModel::iterator const& iter ) { Gtk::TreeModel::Row row = *iter; - if ( row ) { + if ( row && _desktop && _desktop->layer_manager) { SPObject* obj = row[_model->_colObject]; if ( obj ) { gchar const* oldLabel = obj->label(); Glib::ustring tmp = row[_model->_colLabel]; if ( oldLabel && oldLabel[0] && !tmp.empty() && (tmp != oldLabel) ) { - _mgr->renameLayer( obj, tmp.c_str(), FALSE ); + _desktop->layer_manager->renameLayer( obj, tmp.c_str(), FALSE ); row[_model->_colLabel] = obj->label(); } } @@ -583,13 +560,14 @@ bool LayersPanel::_rowSelectFunction( Glib::RefPtr const & /*mod */ LayersPanel::LayersPanel() : UI::Widget::Panel("", "/dialogs/layers", SP_VERB_DIALOG_LAYERS), + deskTrack(), _maxNestDepth(20), - _mgr(0), _desktop(0), _model(0), _pending(0), _toggleEvent(0), - _compositeSettings(SP_VERB_DIALOG_LAYERS, "layers", UI::Widget::SimpleFilterModifier::BLEND) + _compositeSettings(SP_VERB_DIALOG_LAYERS, "layers", UI::Widget::SimpleFilterModifier::BLEND), + desktopChangeConn() { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); _maxNestDepth = prefs->getIntLimited("/dialogs/layers/maxDepth", 20, 1, 1000); @@ -724,14 +702,15 @@ LayersPanel::LayersPanel() : (*it)->set_sensitive( false ); } - g_signal_connect( G_OBJECT(INKSCAPE), "activate_desktop", G_CALLBACK( layers_panel_activated ), this ); - g_signal_connect( G_OBJECT(INKSCAPE), "deactivate_desktop", G_CALLBACK( layers_panel_deactivated ), this ); - setDesktop( targetDesktop ); show_all_children(); // restorePanelPrefs(); + + // Connect this up last + desktopChangeConn = deskTrack.connectDesktopChanged( sigc::mem_fun(*this, &LayersPanel::setDesktop) ); + deskTrack.connect(GTK_WIDGET(gobj())); } LayersPanel::~LayersPanel() @@ -743,6 +722,12 @@ LayersPanel::~LayersPanel() if ( _model ) { delete _model; + _model = 0; + } + + if (_pending) { + delete _pending; + _pending = 0; } if ( _toggleEvent ) @@ -750,6 +735,9 @@ LayersPanel::~LayersPanel() gdk_event_free( _toggleEvent ); _toggleEvent = 0; } + + desktopChangeConn.disconnect(); + deskTrack.disconnect(); } @@ -761,9 +749,6 @@ void LayersPanel::setDesktop( SPDesktop* desktop ) _layerChangedConnection.disconnect(); _layerUpdatedConnection.disconnect(); _changedConnection.disconnect(); - if ( _mgr ) { - _mgr = 0; - } if ( _desktop ) { _desktop = 0; } @@ -772,11 +757,11 @@ void LayersPanel::setDesktop( SPDesktop* desktop ) if ( _desktop ) { //setLabel( _desktop->doc()->name ); - _mgr = _desktop->layer_manager; - if ( _mgr ) { - _layerChangedConnection = _mgr->connectCurrentLayerChanged( sigc::mem_fun(*this, &LayersPanel::_selectLayer) ); - _layerUpdatedConnection = _mgr->connectLayerDetailsChanged( sigc::mem_fun(*this, &LayersPanel::_updateLayer) ); - _changedConnection = _mgr->connectChanged( sigc::mem_fun(*this, &LayersPanel::_layersChanged) ); + LayerManager *mgr = _desktop->layer_manager; + if ( mgr ) { + _layerChangedConnection = mgr->connectCurrentLayerChanged( sigc::mem_fun(*this, &LayersPanel::_selectLayer) ); + _layerUpdatedConnection = mgr->connectLayerDetailsChanged( sigc::mem_fun(*this, &LayersPanel::_updateLayer) ); + _changedConnection = mgr->connectChanged( sigc::mem_fun(*this, &LayersPanel::_layersChanged) ); } _layersChanged(); @@ -790,6 +775,7 @@ void LayersPanel::setDesktop( SPDesktop* desktop ) g_message(" {%s} [%s]", layer->id, layer->label() ); } */ + deskTrack.setBase(desktop); } diff --git a/src/ui/dialog/layers.h b/src/ui/dialog/layers.h index 16b3be350..4f2a65435 100644 --- a/src/ui/dialog/layers.h +++ b/src/ui/dialog/layers.h @@ -4,7 +4,7 @@ * Authors: * Jon A. Cruz * - * Copyright (C) 2006 Jon A. Cruz + * Copyright (C) 2006,2010 Jon A. Cruz * * Released under GNU GPL, read the file 'COPYING' for more information */ @@ -25,6 +25,7 @@ //#include "ui/previewholder.h" #include "ui/widget/panel.h" #include "ui/widget/object-composite-settings.h" +#include "desktop-tracker.h" class SPObject; @@ -33,7 +34,7 @@ namespace Inkscape { class LayerManager; namespace UI { -namespace Dialogs { +namespace Dialog { /** @@ -46,7 +47,7 @@ public: virtual ~LayersPanel(); //virtual void setOrientation( Gtk::AnchorType how ); - + static LayersPanel& getInstance(); void setDesktop( SPDesktop* desktop ); @@ -100,8 +101,8 @@ private: // Internal sigc::connection _selectedConnection; + DesktopTracker deskTrack; int _maxNestDepth; - Inkscape::LayerManager* _mgr; SPDesktop* _desktop; ModelColumns* _model; InternalUIBounce* _pending; @@ -121,6 +122,7 @@ private: UI::Widget::StyleSubject::CurrentLayer _subject; UI::Widget::ObjectCompositeSettings _compositeSettings; + sigc::connection desktopChangeConn; }; -- cgit v1.2.3 From 5ab50b89b8205292712895dd8e88b06d46094ba1 Mon Sep 17 00:00:00 2001 From: buliabyak <> Date: Tue, 27 Apr 2010 14:11:55 -0300 Subject: some copyediting of labels (bzr r9383) --- src/widgets/toolbox.cpp | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index 493d1ecd7..978f19c4c 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -1507,7 +1507,7 @@ static void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions { InkToggleAction* act = ink_toggle_action_new( "NodesShowTransformHandlesAction", _("Show Transform Handles"), - _("Show node transformation handles"), + _("Show transformation handles for selected nodes"), "node-transform", secondarySize ); gtk_action_group_add_action( mainActions, GTK_ACTION( act ) ); @@ -1518,7 +1518,7 @@ static void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions { InkToggleAction* act = ink_toggle_action_new( "NodesShowHandlesAction", _("Show Handles"), - _("Show the Bezier handles of selected nodes"), + _("Show Bezier handles of selected nodes"), INKSCAPE_ICON_SHOW_NODE_HANDLES, secondarySize ); gtk_action_group_add_action( mainActions, GTK_ACTION( act ) ); @@ -1529,7 +1529,7 @@ static void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions { InkToggleAction* act = ink_toggle_action_new( "NodesShowHelperpath", _("Show Outline"), - _("Show the outline of the path"), + _("Show path outline (without path effects)"), INKSCAPE_ICON_SHOW_PATH_OUTLINE, secondarySize ); gtk_action_group_add_action( mainActions, GTK_ACTION( act ) ); @@ -1540,7 +1540,7 @@ static void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions { InkAction* inky = ink_action_new( "EditNextLPEParameterAction", _("Next path effect parameter"), - _("Show next path effect parameter for editing"), + _("Show next editable path effect parameter"), INKSCAPE_ICON_PATH_EFFECT_PARAMETER_NEXT, secondarySize ); g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_nextLPEparam), desktop ); @@ -1551,7 +1551,7 @@ static void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions { InkToggleAction* inky = ink_toggle_action_new( "ObjectEditClipPathAction", _("Edit clipping paths"), - _("Show editing controls for clipping paths of selected objects"), + _("Show clipping path(s) of selected object(s)"), INKSCAPE_ICON_PATH_CLIP_EDIT, secondarySize ); gtk_action_group_add_action( mainActions, GTK_ACTION(inky) ); @@ -1562,7 +1562,7 @@ static void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions { InkToggleAction* inky = ink_toggle_action_new( "ObjectEditMaskPathAction", _("Edit masks"), - _("Show editing controls for masks of selected objects"), + _("Show mask(s) of selected object(s)"), INKSCAPE_ICON_PATH_MASK_EDIT, secondarySize ); gtk_action_group_add_action( mainActions, GTK_ACTION(inky) ); -- cgit v1.2.3 From 409de448cfb250865b4958d1dd2c6e409e990443 Mon Sep 17 00:00:00 2001 From: Tavmjong Bah Date: Tue, 27 Apr 2010 20:24:44 +0200 Subject: inkscape-comboboxentry-action: Add option to add extra width to GtkComboBox. Add names to widgets so styles can be set with RC files. toolbox.cpp: Add extra width to font-family GtkComboBox. Change style of font-family drop-down from menu to list. (bzr r9384) --- src/ink-comboboxentry-action.cpp | 84 +++++++++++++++++++++++++++++++++------- src/ink-comboboxentry-action.h | 21 ++++++---- src/widgets/toolbox.cpp | 25 +++++++++--- 3 files changed, 102 insertions(+), 28 deletions(-) (limited to 'src') diff --git a/src/ink-comboboxentry-action.cpp b/src/ink-comboboxentry-action.cpp index de0af347c..cfaf09901 100644 --- a/src/ink-comboboxentry-action.cpp +++ b/src/ink-comboboxentry-action.cpp @@ -4,6 +4,8 @@ * Setting GtkEntryBox width in characters. * Passing a function for formatting cells. * Displaying a warning if text isn't in list. + * Setting names for GtkComboBoxEntry and GtkEntry (actionName_combobox, actionName_entry) + * to allow setting resources. * * Author(s): * Tavmjong Bah @@ -46,7 +48,8 @@ enum { PROP_MODEL = 1, PROP_COMBOBOX, PROP_ENTRY, - PROP_WIDTH, + PROP_ENTRY_WIDTH, + PROP_EXTRA_WIDTH, PROP_CELL_DATA_FUNC, PROP_POPUP }; @@ -87,8 +90,12 @@ static void ink_comboboxentry_action_set_property (GObject *object, guint proper action->entry = GTK_ENTRY( g_value_get_object( value )); break; - case PROP_WIDTH: - action->width = g_value_get_int( value ); + case PROP_ENTRY_WIDTH: + action->entry_width = g_value_get_int( value ); + break; + + case PROP_EXTRA_WIDTH: + action->extra_width = g_value_get_int( value ); break; case PROP_CELL_DATA_FUNC: @@ -123,8 +130,12 @@ static void ink_comboboxentry_action_get_property (GObject *object, guint proper g_value_set_object (value, action->entry); break; - case PROP_WIDTH: - g_value_set_int (value, action->width); + case PROP_ENTRY_WIDTH: + g_value_set_int (value, action->entry_width); + break; + + case PROP_EXTRA_WIDTH: + g_value_set_int (value, action->extra_width); break; case PROP_CELL_DATA_FUNC: @@ -197,13 +208,22 @@ static void ink_comboboxentry_action_class_init (Ink_ComboBoxEntry_ActionClass * (GParamFlags)G_PARAM_READABLE)); g_object_class_install_property ( gobject_class, - PROP_WIDTH, - g_param_spec_int ("width", + PROP_ENTRY_WIDTH, + g_param_spec_int ("entry_width", "EntryBox width", "EntryBox width (characters)", -1.0, 100, -1.0, (GParamFlags)G_PARAM_READWRITE)); + g_object_class_install_property ( + gobject_class, + PROP_EXTRA_WIDTH, + g_param_spec_int ("extra_width", + "Extra width", + "Extra width (px)", + -1.0, 500, -1.0, + (GParamFlags)G_PARAM_READWRITE)); + g_object_class_install_property ( gobject_class, PROP_CELL_DATA_FUNC, @@ -287,7 +307,8 @@ Ink_ComboBoxEntry_Action *ink_comboboxentry_action_new (const gchar *name, const gchar *tooltip, const gchar *stock_id, GtkTreeModel *model, - gint width, + gint entry_width, + gint extra_width, void *cell_data_func ) { g_return_val_if_fail (name != NULL, NULL); @@ -298,7 +319,8 @@ Ink_ComboBoxEntry_Action *ink_comboboxentry_action_new (const gchar *name, "tooltip", tooltip, "stock-id", stock_id, "model", model, - "width", width, + "entry_width", entry_width, + "extra_width", extra_width, "cell_data_func", cell_data_func, NULL); } @@ -312,9 +334,17 @@ GtkWidget* create_tool_item( GtkAction* action ) Ink_ComboBoxEntry_Action* ink_comboboxentry_action = INK_COMBOBOXENTRY_ACTION( action ); + gchar *action_name = g_strdup( gtk_action_get_name( action ) ); + gchar *combobox_name = g_strjoin( NULL, action_name, "_combobox", NULL ); + gchar *entry_name = g_strjoin( NULL, action_name, "_entry", NULL ); + g_free( action_name ); + item = GTK_WIDGET( gtk_tool_item_new() ); GtkWidget* comboBoxEntry = gtk_combo_box_entry_new_with_model( ink_comboboxentry_action->model, 0 ); + // Name it so we can muck with it using an RC file + gtk_widget_set_name( comboBoxEntry, combobox_name ); + g_free( combobox_name ); { GtkWidget *align = gtk_alignment_new(0, 0.5, 0, 0); @@ -346,14 +376,28 @@ GtkWidget* create_tool_item( GtkAction* action ) NULL, NULL ); } + // Optionally widen the combobox width... which widens the drop-down list in list mode. + if( ink_comboboxentry_action->extra_width > 0 ) { + GtkRequisition req; + gtk_widget_size_request( GTK_WIDGET( ink_comboboxentry_action->combobox ), &req ); + gtk_widget_set_size_request( GTK_WIDGET( ink_comboboxentry_action->combobox ), + req.width + ink_comboboxentry_action->extra_width, -1 ); + } + // Get reference to GtkEntry and fiddle a bit with it. GtkWidget *child = gtk_bin_get_child( GTK_BIN(comboBoxEntry) ); + + // Name it so we can muck with it using an RC file + gtk_widget_set_name( child, entry_name ); + g_free( entry_name ); + if( child && GTK_IS_ENTRY( child ) ) { + ink_comboboxentry_action->entry = GTK_ENTRY(child); // Change width - if( ink_comboboxentry_action->width > 0 ) { - gtk_entry_set_width_chars (GTK_ENTRY (child), ink_comboboxentry_action->width ); + if( ink_comboboxentry_action->entry_width > 0 ) { + gtk_entry_set_width_chars (GTK_ENTRY (child), ink_comboboxentry_action->entry_width ); } // Add pop-up entry completion if required @@ -465,13 +509,25 @@ gboolean ink_comboboxentry_action_set_active_text( Ink_ComboBoxEntry_Action* ink return found; } -void ink_comboboxentry_action_set_width( Ink_ComboBoxEntry_Action* action, gint width ) { +void ink_comboboxentry_action_set_entry_width( Ink_ComboBoxEntry_Action* action, gint entry_width ) { - action->width = width; + action->entry_width = entry_width; // Widget may not have been created.... if( action->entry ) { - gtk_entry_set_width_chars( GTK_ENTRY(action->entry), width ); + gtk_entry_set_width_chars( GTK_ENTRY(action->entry), entry_width ); + } +} + +void ink_comboboxentry_action_set_extra_width( Ink_ComboBoxEntry_Action* action, gint extra_width ) { + + action->extra_width = extra_width; + + // Widget may not have been created.... + if( action->combobox ) { + GtkRequisition req; + gtk_widget_size_request( GTK_WIDGET( action->combobox ), &req ); + gtk_widget_set_size_request( GTK_WIDGET( action->combobox ), req.width + action->extra_width, -1 ); } } diff --git a/src/ink-comboboxentry-action.h b/src/ink-comboboxentry-action.h index 031803d8a..e080e6cdf 100644 --- a/src/ink-comboboxentry-action.h +++ b/src/ink-comboboxentry-action.h @@ -4,6 +4,8 @@ * Setting GtkEntryBox width in characters. * Passing a function for formatting cells. * Displaying a warning if text isn't in list. + * Setting names for GtkComboBoxEntry and GtkEntry (actionName_combobox, actionName_entry) + * to allow setting resources. * * Author(s): * Tavmjong Bah @@ -55,7 +57,8 @@ struct _Ink_ComboBoxEntry_Action { gint active; // Index of active menu item (-1 if not in list). gchar *text; // Text of active menu item or entry box. - gint width; // Width of GtkComboBoxEntry in characters. + gint entry_width;// Width of GtkEntry in characters. + gint extra_width;// Extra Width of GtkComboBox.. to widen drop-down list in list mode. gboolean popup; // Do we pop-up an entry-completion dialog? gchar *warning; // Text for warning that entry isn't in list. gchar *altx_name; // Target for Alt-X keyboard shortcut. @@ -68,12 +71,13 @@ GType ink_comboboxentry_action_get_type (void); * Creates a GtkAction subclass that wraps a GtkComboBoxEntry object. */ Ink_ComboBoxEntry_Action *ink_comboboxentry_action_new ( const gchar *name, - const gchar *label, - const gchar *tooltip, - const gchar *stock_id, - GtkTreeModel *model, - gint width = -1, - gpointer cell_data_func = NULL ); + const gchar *label, + const gchar *tooltip, + const gchar *stock_id, + GtkTreeModel *model, + gint entry_width = -1, + gint extra_width = -1, + gpointer cell_data_func = NULL ); GtkTreeModel *ink_comboboxentry_action_get_model( Ink_ComboBoxEntry_Action* action ); GtkComboBoxEntry *ink_comboboxentry_action_get_comboboxentry( Ink_ComboBoxEntry_Action* action ); @@ -81,7 +85,8 @@ GtkComboBoxEntry *ink_comboboxentry_action_get_comboboxentry( Ink_ComboBoxEntry_ gchar* ink_comboboxentry_action_get_active_text( Ink_ComboBoxEntry_Action* action ); gboolean ink_comboboxentry_action_set_active_text( Ink_ComboBoxEntry_Action* action, const gchar* text ); -void ink_comboboxentry_action_set_width( Ink_ComboBoxEntry_Action* action, gint width ); +void ink_comboboxentry_action_set_entry_width( Ink_ComboBoxEntry_Action* action, gint entry_width ); +void ink_comboboxentry_action_set_extra_width( Ink_ComboBoxEntry_Action* action, gint extra_width ); void ink_comboboxentry_action_popup_enable( Ink_ComboBoxEntry_Action* action ); void ink_comboboxentry_action_popup_disable( Ink_ComboBoxEntry_Action* action ); diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index 978f19c4c..2cd96491e 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -6239,15 +6239,19 @@ static void cell_data_func(GtkCellLayout * /*cell_layout*/, Glib::ustring sample = prefs->getString("/tools/text/font_sample"); gchar *const sample_escaped = g_markup_escape_text(sample.data(), -1); - std::stringstream markup; - markup << family_escaped << " " << sample_escaped << ""; - g_object_set (G_OBJECT (cell), "markup", markup.str().c_str(), NULL); + std::stringstream markup; + markup << family_escaped << " " << sample_escaped << ""; + g_object_set (G_OBJECT (cell), "markup", markup.str().c_str(), NULL); g_free(sample_escaped); } else { g_object_set (G_OBJECT (cell), "markup", family_escaped, NULL); } + // This doesn't work for two reasons... it set both selected and not selected backgrounds + // to white.. which means that white foreground text is invisible. It also only effects + // the text region, leaving the padding untouched. + // g_object_set (G_OBJECT (cell), "cell-background", "white", "cell-background-set", true, NULL); g_free(family); g_free(family_escaped); @@ -7171,10 +7175,11 @@ static void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions Ink_ComboBoxEntry_Action* act = ink_comboboxentry_action_new( "TextFontFamilyAction", _("Font Family"), - _("Select Font Family"), + _("Select Font Family (Alt-X to access)"), NULL, GTK_TREE_MODEL(model), - -1, // Set width + -1, // Entry width + 50, // Extra list width (gpointer)cell_data_func ); // Cell layout ink_comboboxentry_action_popup_enable( act ); // Enable entry completion gchar *const warning = _("Font not found on system"); @@ -7183,6 +7188,14 @@ static void sp_text_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions g_signal_connect( G_OBJECT(act), "changed", G_CALLBACK(sp_text_fontfamily_value_changed), holder ); gtk_action_group_add_action( mainActions, GTK_ACTION(act) ); g_object_set_data( holder, "TextFontFamilyAction", act ); + + // Change style of drop-down from menu to list + gtk_rc_parse_string ( + "style \"dropdown-as-list-style\"\n" + "{\n" + " GtkComboBox::appears-as-list = 1\n" + "}\n" + "widget \"*.TextFontFamilyAction_combobox\" style \"dropdown-as-list-style\""); } /* Font size */ -- cgit v1.2.3 From 11909056ffd64934723ed775f8d4a959df0e96b1 Mon Sep 17 00:00:00 2001 From: "Johan B. C. Engelen" Date: Tue, 27 Apr 2010 22:01:10 +0200 Subject: Fix wrong bbox upon selecting clones of horizontal/vertical lines (related to bug #318726) Fixed bugs: - https://launchpad.net/bugs/318726 (bzr r9385) --- src/sp-use.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/sp-use.cpp b/src/sp-use.cpp index 7962390c2..9cd38e4b3 100644 --- a/src/sp-use.cpp +++ b/src/sp-use.cpp @@ -288,7 +288,14 @@ sp_use_bbox(SPItem const *item, NRRect *bbox, Geom::Matrix const &transform, uns * Geom::Translate(use->x.computed, use->y.computed) * transform ); - sp_item_invoke_bbox_full(child, bbox, ct, flags, FALSE); + Geom::OptRect optbbox; + sp_item_invoke_bbox_full(child, optbbox, ct, flags, FALSE); + if (optbbox) { + bbox->x0 = (*optbbox)[0][0]; + bbox->y0 = (*optbbox)[1][0]; + bbox->x1 = (*optbbox)[0][1]; + bbox->y1 = (*optbbox)[1][1]; + } } } -- cgit v1.2.3 From 40c3ef0c40d563a47f60bdb35d4f17beb847b7d7 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Wed, 28 Apr 2010 18:51:38 +0200 Subject: Unnecessary style selector removed from the Spray tool bar and preferences, and string disambiguation. (bzr r9386) --- src/ui/dialog/inkscape-preferences.cpp | 3 +-- src/widgets/toolbox.cpp | 12 +++++++++--- 2 files changed, 10 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/ui/dialog/inkscape-preferences.cpp b/src/ui/dialog/inkscape-preferences.cpp index 9ff643e90..524558155 100644 --- a/src/ui/dialog/inkscape-preferences.cpp +++ b/src/ui/dialog/inkscape-preferences.cpp @@ -469,9 +469,8 @@ void InkscapePreferences::initPageTools() AddSelcueCheckbox(_page_tweak, "/tools/tweak", true); AddGradientCheckbox(_page_tweak, "/tools/tweak", false); - //Spray + //Spray this->AddPage(_page_spray, _("Spray"), iter_tools, PREFS_PAGE_TOOLS_SPRAY); - this->AddNewObjectsStyle(_page_spray, "/tools/spray", _("Paint objects with:")); AddSelcueCheckbox(_page_spray, "/tools/spray", true); AddGradientCheckbox(_page_spray, "/tools/spray", false); diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index 2cd96491e..de97e9ea4 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -213,7 +213,7 @@ static struct { { "SPTweakContext", "tweak_toolbox", 0, sp_tweak_toolbox_prep, "TweakToolbar", SP_VERB_CONTEXT_TWEAK_PREFS, "/tools/tweak", N_("Color/opacity used for color tweaking")}, { "SPSprayContext", "spray_toolbox", 0, sp_spray_toolbox_prep, "SprayToolbar", - SP_VERB_CONTEXT_SPRAY_PREFS, "/tools/spray", N_("Color/opacity used for color spraying")}, + SP_VERB_INVALID, 0, 0}, { "SPZoomContext", "zoom_toolbox", 0, sp_zoom_toolbox_prep, "ZoomToolbar", SP_VERB_INVALID, 0, 0}, { "SPStarContext", "star_toolbox", 0, sp_star_toolbox_prep, "StarToolbar", @@ -4639,8 +4639,11 @@ static void sp_spray_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainAction /* Standard_deviation */ gchar const* labels[] = {_("(minimum scatter)"), 0, 0, _("(default)"), 0, 0, 0, _("(maximum scatter)")}; gdouble values[] = {1, 5, 10, 20, 30, 50, 70, 100}; + + //TRANSLATORS: only translate "string" in "context|string". + // For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS EgeAdjustmentAction *eact = create_adjustment_action( "SprayStandard_deviationAction", - _("Scatter"), _("Scatter:"), _("Increase to scatter sprayed objects."), + Q_("Toolbox|Scatter"), Q_("Toolbox|Scatter:"), _("Increase to scatter sprayed objects."), "/tools/spray/standard_deviation", 70, GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "spray-standard_deviation", 1, 100, 1.0, 10.0, @@ -4746,8 +4749,11 @@ static void sp_spray_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainAction { /* Scale */ gchar const* labels[] = {_("(low scale variation)"), 0, 0, _("(default)"), 0, 0, _("(high scale variation)")}; gdouble values[] = {10, 25, 35, 50, 60, 80, 100}; + + //TRANSLATORS: only translate "string" in "context|string". + // For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS EgeAdjustmentAction *eact = create_adjustment_action( "SprayScaleAction", - _("Scale"), _("Scale:"), + Q_("Toolbox|Scale"), Q_("Toolbox|Scale:"), // xgettext:no-c-format _("Variation in the scale of the sprayed objects. 0% for the same scale than the original object."), "/tools/spray/scale_variation", 0, -- cgit v1.2.3 From d1f3fa05f8230e081907888d71d506c3a8f71563 Mon Sep 17 00:00:00 2001 From: Nathan Hurst Date: Thu, 29 Apr 2010 14:54:37 +1000 Subject: moved some marshalling functions to generic glib calls (bzr r9389) --- src/helper/sp-marshal.list | 9 --------- src/inkscape.cpp | 16 ++++++++-------- src/knot.cpp | 8 ++++---- src/widgets/sp-xmlview-attr-list.cpp | 2 +- 4 files changed, 13 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/helper/sp-marshal.list b/src/helper/sp-marshal.list index 15ddb1ec4..1dc4dd65c 100644 --- a/src/helper/sp-marshal.list +++ b/src/helper/sp-marshal.list @@ -1,14 +1,5 @@ # marshallers for sodipodi -NONE:NONE -NONE:UINT -NONE:POINTER -NONE:POINTER,BOOLEAN NONE:POINTER,UINT -NONE:POINTER,DOUBLE -NONE:DOUBLE,DOUBLE -NONE:STRING,BOOL -BOOLEAN:NONE -BOOLEAN:UINT BOOLEAN:POINTER BOOLEAN:POINTER,UINT BOOLEAN:POINTER,POINTER diff --git a/src/inkscape.cpp b/src/inkscape.cpp index d0f9a11fc..d876be6ec 100644 --- a/src/inkscape.cpp +++ b/src/inkscape.cpp @@ -56,7 +56,7 @@ using Inkscape::Extension::Internal::PrintWin32; #include "extension/init.h" #include "extension/output.h" #include "extension/system.h" -#include "helper/sp-marshal.h" +//#include "helper/sp-marshal.h" #include "inkscape-private.h" #include "io/sys.h" #include "message-stack.h" @@ -193,7 +193,7 @@ inkscape_class_init (Inkscape::ApplicationClass * klass) G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (Inkscape::ApplicationClass, modify_selection), NULL, NULL, - sp_marshal_NONE__POINTER_UINT, + g_cclosure_marshal_VOID__UINT_POINTER, G_TYPE_NONE, 2, G_TYPE_POINTER, G_TYPE_UINT); inkscape_signals[CHANGE_SELECTION] = g_signal_new ("change_selection", @@ -201,7 +201,7 @@ inkscape_class_init (Inkscape::ApplicationClass * klass) G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (Inkscape::ApplicationClass, change_selection), NULL, NULL, - sp_marshal_NONE__POINTER, + g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); inkscape_signals[CHANGE_SUBSELECTION] = g_signal_new ("change_subselection", @@ -209,7 +209,7 @@ inkscape_class_init (Inkscape::ApplicationClass * klass) G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (Inkscape::ApplicationClass, change_subselection), NULL, NULL, - sp_marshal_NONE__POINTER, + g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); inkscape_signals[SET_SELECTION] = g_signal_new ("set_selection", @@ -217,7 +217,7 @@ inkscape_class_init (Inkscape::ApplicationClass * klass) G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (Inkscape::ApplicationClass, set_selection), NULL, NULL, - sp_marshal_NONE__POINTER, + g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); inkscape_signals[SET_EVENTCONTEXT] = g_signal_new ("set_eventcontext", @@ -225,7 +225,7 @@ inkscape_class_init (Inkscape::ApplicationClass * klass) G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (Inkscape::ApplicationClass, set_eventcontext), NULL, NULL, - sp_marshal_NONE__POINTER, + g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); inkscape_signals[ACTIVATE_DESKTOP] = g_signal_new ("activate_desktop", @@ -233,7 +233,7 @@ inkscape_class_init (Inkscape::ApplicationClass * klass) G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (Inkscape::ApplicationClass, activate_desktop), NULL, NULL, - sp_marshal_NONE__POINTER, + g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); inkscape_signals[DEACTIVATE_DESKTOP] = g_signal_new ("deactivate_desktop", @@ -241,7 +241,7 @@ inkscape_class_init (Inkscape::ApplicationClass * klass) G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (Inkscape::ApplicationClass, deactivate_desktop), NULL, NULL, - sp_marshal_NONE__POINTER, + g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE, 1, G_TYPE_POINTER); inkscape_signals[SHUTDOWN_SIGNAL] = g_signal_new ("shut_down", diff --git a/src/knot.cpp b/src/knot.cpp index 04520ed22..10672e048 100644 --- a/src/knot.cpp +++ b/src/knot.cpp @@ -116,7 +116,7 @@ static void sp_knot_class_init(SPKnotClass *klass) G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(SPKnotClass, clicked), NULL, NULL, - sp_marshal_NONE__UINT, + g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); @@ -125,7 +125,7 @@ static void sp_knot_class_init(SPKnotClass *klass) G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(SPKnotClass, doubleclicked), NULL, NULL, - sp_marshal_NONE__UINT, + g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); @@ -134,7 +134,7 @@ static void sp_knot_class_init(SPKnotClass *klass) G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(SPKnotClass, grabbed), NULL, NULL, - sp_marshal_NONE__UINT, + g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); @@ -143,7 +143,7 @@ static void sp_knot_class_init(SPKnotClass *klass) G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET(SPKnotClass, ungrabbed), NULL, NULL, - sp_marshal_NONE__UINT, + g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); diff --git a/src/widgets/sp-xmlview-attr-list.cpp b/src/widgets/sp-xmlview-attr-list.cpp index 008ad4970..535a4b534 100644 --- a/src/widgets/sp-xmlview-attr-list.cpp +++ b/src/widgets/sp-xmlview-attr-list.cpp @@ -115,7 +115,7 @@ sp_xmlview_attr_list_class_init (SPXMLViewAttrListClass * klass) G_SIGNAL_RUN_FIRST, G_STRUCT_OFFSET (SPXMLViewAttrListClass, row_changed), NULL, NULL, - sp_marshal_NONE__UINT, + g_cclosure_marshal_VOID__UINT, G_TYPE_NONE, 1, G_TYPE_UINT); } -- cgit v1.2.3 From daff0f9c639c619ade7eb31bf8c43a42e6051c9d Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Sun, 2 May 2010 01:37:34 -0700 Subject: Follow-up to bug 427514 specific to icon preview, which happened to fix bug #171918. Fixed bugs: - https://launchpad.net/bugs/171918 (bzr r9390) --- src/ui/dialog/icon-preview.cpp | 99 +++++++++++++++++++++++++++++++++++++++--- src/ui/dialog/icon-preview.h | 28 ++++++++++-- 2 files changed, 118 insertions(+), 9 deletions(-) (limited to 'src') diff --git a/src/ui/dialog/icon-preview.cpp b/src/ui/dialog/icon-preview.cpp index a210fe163..8b93bf340 100644 --- a/src/ui/dialog/icon-preview.cpp +++ b/src/ui/dialog/icon-preview.cpp @@ -7,7 +7,7 @@ * Other dudes from The Inkscape Organization * * Copyright (C) 2004 Bob Jamison - * Copyright (C) 2005 Jon A. Cruz + * Copyright (C) 2005,2010 Jon A. Cruz * * Released under GNU GPL, read the file 'COPYING' for more information */ @@ -42,7 +42,7 @@ sp_icon_doc_icon( SPDocument *doc, NRArenaItem *root, namespace Inkscape { namespace UI { -namespace Dialogs { +namespace Dialog { IconPreviewPanel &IconPreviewPanel::getInstance() @@ -80,9 +80,17 @@ void IconPreviewPanel::on_button_clicked(int which) */ IconPreviewPanel::IconPreviewPanel() : UI::Widget::Panel("", "/dialogs/iconpreview", SP_VERB_VIEW_ICON_PREVIEW), + deskTrack(), + desktop(0), + document(0), + timer(0), + pending(false), hot(1), refreshButton(0), - selectionButton(0) + selectionButton(0), + desktopChangeConn(), + docReplacedConn(), + docModConn() { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); numEntries = 0; @@ -191,6 +199,25 @@ IconPreviewPanel::IconPreviewPanel() : _getContents()->pack_start(iconBox, Gtk::PACK_EXPAND_WIDGET); show_all_children(); + + // Connect this up last + desktopChangeConn = deskTrack.connectDesktopChanged( sigc::mem_fun(*this, &IconPreviewPanel::setDesktop) ); + deskTrack.connect(GTK_WIDGET(gobj())); +} + +IconPreviewPanel::~IconPreviewPanel() +{ + setDesktop(0); + if (timer) { + timer->stop(); + delete timer; + timer = 0; + } + + docModConn.disconnect(); + docReplacedConn.disconnect(); + desktopChangeConn.disconnect(); + deskTrack.disconnect(); } //######################################################################### @@ -198,10 +225,47 @@ IconPreviewPanel::IconPreviewPanel() : //######################################################################### +void IconPreviewPanel::setDesktop( SPDesktop* desktop ) +{ + Panel::setDesktop(desktop); + + SPDocument *newDoc = (desktop) ? desktop->doc() : 0; + + if ( desktop != this->desktop ) { + docReplacedConn.disconnect(); + + this->desktop = Panel::getDesktop(); + if ( this->desktop ) { + docReplacedConn = this->desktop->connectDocumentReplaced(sigc::hide<0>(sigc::mem_fun(this, &IconPreviewPanel::setDocument))); + } + } + setDocument(newDoc); + deskTrack.setBase(desktop); +} + +void IconPreviewPanel::setDocument( SPDocument *document ) +{ + if (this->document != document) { + docModConn.disconnect(); + + this->document = document; + if (this->document) { + docModConn = this->document->connectModified(sigc::hide(sigc::mem_fun(this, &IconPreviewPanel::queueRefresh))); + queueRefresh(); + } + } +} + void IconPreviewPanel::refreshPreview() { SPDesktop *desktop = getDesktop(); - if ( desktop ) { + if (!timer) { + timer = new Glib::Timer(); + } + if (timer->elapsed() < 0.1) { + // Do not refresh too quickly + queueRefresh(); + } else if ( desktop ) { if ( selectionButton && selectionButton->get_active() ) { @@ -233,6 +297,32 @@ void IconPreviewPanel::refreshPreview() renderPreview(target); } } + timer->reset(); + } +} + +bool IconPreviewPanel::refreshCB() +{ + bool callAgain = true; + if (!timer) { + timer = new Glib::Timer(); + } + if ( timer->elapsed() > 0.1 ) { + callAgain = false; + refreshPreview(); + pending = false; + } + return callAgain; +} + +void IconPreviewPanel::queueRefresh() +{ + if (!pending) { + pending = true; + if (!timer) { + timer = new Glib::Timer(); + } + Glib::signal_idle().connect( sigc::mem_fun(this, &IconPreviewPanel::refreshCB), Glib::PRIORITY_DEFAULT_IDLE ); } } @@ -289,7 +379,6 @@ void IconPreviewPanel::updateMagnify() magnified.get_parent()->queue_draw(); } - } //namespace Dialogs } //namespace UI } //namespace Inkscape diff --git a/src/ui/dialog/icon-preview.h b/src/ui/dialog/icon-preview.h index 8f143725d..d90c2b173 100644 --- a/src/ui/dialog/icon-preview.h +++ b/src/ui/dialog/icon-preview.h @@ -7,6 +7,7 @@ * Other dudes from The Inkscape Organization * * Copyright (C) 2004,2005 The Inkscape Organization + * Copyright (C) 2010 Jon A. Cruz * * Released under GNU GPL, read the file 'COPYING' for more information */ @@ -23,12 +24,16 @@ #include #include "ui/widget/panel.h" +#include "desktop-tracker.h" struct SPObject; +namespace Glib { +class Timer; +} namespace Inkscape { namespace UI { -namespace Dialogs { +namespace Dialog { /** @@ -39,9 +44,11 @@ class IconPreviewPanel : public UI::Widget::Panel public: IconPreviewPanel(); //IconPreviewPanel(Glib::ustring const &label); + ~IconPreviewPanel(); static IconPreviewPanel& getInstance(); + void setDesktop( SPDesktop* desktop ); void refreshPreview(); void modeToggled(); @@ -50,9 +57,11 @@ private: IconPreviewPanel &operator=(IconPreviewPanel const &); // no assign - void on_button_clicked(int which); - void renderPreview( SPObject* obj ); - void updateMagnify(); + DesktopTracker deskTrack; + SPDesktop *desktop; + SPDocument *document; + Glib::Timer *timer; + bool pending; Gtk::Tooltips tips; @@ -73,6 +82,17 @@ private: Gtk::Image** images; Glib::ustring** labels; Gtk::ToggleToolButton** buttons; + sigc::connection desktopChangeConn; + sigc::connection docReplacedConn; + sigc::connection docModConn; + + + void setDocument( SPDocument *document ); + void on_button_clicked(int which); + void renderPreview( SPObject* obj ); + void updateMagnify(); + void queueRefresh(); + bool refreshCB(); }; } //namespace Dialogs -- cgit v1.2.3 From 7cd8eefb2bfd638ba334b2034e41c69b68677310 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Sun, 2 May 2010 14:02:35 +0200 Subject: Extensions. Use locale dependent string to float convertion for default values (Bug #571196). Fixed bugs: - https://launchpad.net/bugs/571196 (bzr r9391) --- src/extension/param/float.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/extension/param/float.cpp b/src/extension/param/float.cpp index 11e3a8d97..5dce0f9e3 100644 --- a/src/extension/param/float.cpp +++ b/src/extension/param/float.cpp @@ -26,11 +26,11 @@ namespace Extension { ParamFloat::ParamFloat (const gchar * name, const gchar * guitext, const gchar * desc, const Parameter::_scope_t scope, bool gui_hidden, const gchar * gui_tip, Inkscape::Extension::Extension * ext, Inkscape::XML::Node * xml) : Parameter(name, guitext, desc, scope, gui_hidden, gui_tip, ext), _value(0.0), _min(0.0), _max(10.0) { - const char * defaultval = NULL; + const gchar * defaultval = NULL; if (sp_repr_children(xml) != NULL) defaultval = sp_repr_children(xml)->content(); if (defaultval != NULL) { - _value = atof(defaultval); + _value = g_ascii_strtod (defaultval,NULL); } const char * maxval = xml->attribute("max"); -- cgit v1.2.3 From acb73df8e62c3869158a8dddf84d11bac130e4ad Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Tue, 4 May 2010 06:36:32 +0200 Subject: Extension. Fix XAML export crash (Bug #282421). Fixed bugs: - https://launchpad.net/bugs/282421 (bzr r9394) --- src/extension/implementation/xslt.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/extension/implementation/xslt.cpp b/src/extension/implementation/xslt.cpp index f34fea64a..143d72362 100644 --- a/src/extension/implementation/xslt.cpp +++ b/src/extension/implementation/xslt.cpp @@ -132,7 +132,7 @@ XSLT::unload(Inkscape::Extension::Extension *module) { if (!module->loaded()) { return; } xsltFreeStylesheet(_stylesheet); - xmlFreeDoc(_parsedDoc); + // No need to use xmlfreedoc(_parsedDoc), it's handled by xsltFreeStylesheet(_stylesheet); return; } -- cgit v1.2.3 From 2687a93e582134d6f9d3d04c6765ebb5110514f8 Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Wed, 5 May 2010 22:27:32 -0700 Subject: Switched icons to have frames, be square, and arranged more efficiently for space. Addressing bug #171376. Fixed bugs: - https://launchpad.net/bugs/171376 (bzr r9398) --- src/ui/dialog/icon-preview.cpp | 43 ++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/ui/dialog/icon-preview.cpp b/src/ui/dialog/icon-preview.cpp index 8b93bf340..f768df4f3 100644 --- a/src/ui/dialog/icon-preview.cpp +++ b/src/ui/dialog/icon-preview.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -150,8 +151,11 @@ IconPreviewPanel::IconPreviewPanel() : magBox->pack_start( magLabel, Gtk::PACK_SHRINK ); - Gtk::VBox * verts = new Gtk::VBox(); - for ( int i = 0; i < numEntries; i++ ) { + Gtk::VBox *verts = new Gtk::VBox(); + Gtk::HBox *horiz = 0; + int previous = 0; + int avail = 0; + for ( int i = numEntries - 1; i >= 0; --i ) { pixMem[i] = new guchar[4 * sizes[i] * sizes[i]]; memset( pixMem[i], 0x00, 4 * sizes[i] * sizes[i] ); @@ -161,14 +165,45 @@ IconPreviewPanel::IconPreviewPanel() : Glib::ustring label(*labels[i]); buttons[i] = new Gtk::ToggleToolButton(label); buttons[i]->set_active( i == hot ); - buttons[i]->set_icon_widget(*images[i]); + Gtk::Frame *frame = new Gtk::Frame(); + frame->set_shadow_type(Gtk::SHADOW_ETCHED_IN); + frame->add(*images[i]); + buttons[i]->set_icon_widget(*Gtk::manage(frame)); tips.set_tip((*buttons[i]), label); buttons[i]->signal_clicked().connect( sigc::bind( sigc::mem_fun(*this, &IconPreviewPanel::on_button_clicked), i) ); - verts->add(*buttons[i]); + Gtk::Alignment *align = Gtk::manage(new Gtk::Alignment(0.5, 0.5, 0, 0)); + align->add(*buttons[i]); + + int pad = 12; + if ((avail == 0) && (previous == 0)) { + verts->pack_end(*align, Gtk::PACK_SHRINK); + previous = sizes[i]; + avail = sizes[i]; + } else { + if ((avail < pad) || ((sizes[i] > avail) && (sizes[i] < previous))) { + horiz = 0; + } + if ((horiz == 0) && (sizes[i] <= previous)) { + avail = previous; + } + if (sizes[i] <= avail) { + if (!horiz) { + horiz = Gtk::manage(new Gtk::HBox()); + avail = previous; + verts->pack_end(*horiz, Gtk::PACK_SHRINK); + } + horiz->pack_start(*align, Gtk::PACK_EXPAND_WIDGET); + avail -= sizes[i]; + avail -= pad; // a little extra for padding + } else { + horiz = 0; + verts->pack_end(*align, Gtk::PACK_SHRINK); + } + } } iconBox.pack_start(splitter); -- cgit v1.2.3 From 45b9fddee7eed5c5360a08317c0e8c73af818e3b Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Thu, 6 May 2010 00:20:39 -0700 Subject: Removed redundant refresh button, ui cleanup, added frames, etc. for bug #171376. Fixed bugs: - https://launchpad.net/bugs/171376 (bzr r9399) --- src/ui/dialog/icon-preview.cpp | 32 +++++++++++--------------------- src/ui/dialog/icon-preview.h | 12 +++++++++++- 2 files changed, 22 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/ui/dialog/icon-preview.cpp b/src/ui/dialog/icon-preview.cpp index f768df4f3..946eed4ca 100644 --- a/src/ui/dialog/icon-preview.cpp +++ b/src/ui/dialog/icon-preview.cpp @@ -87,7 +87,6 @@ IconPreviewPanel::IconPreviewPanel() : timer(0), pending(false), hot(1), - refreshButton(0), selectionButton(0), desktopChangeConn(), docReplacedConn(), @@ -147,7 +146,10 @@ IconPreviewPanel::IconPreviewPanel() : Gtk::VBox* magBox = new Gtk::VBox(); - magBox->pack_start( magnified ); + Gtk::Frame *magFrame = Gtk::manage(new Gtk::Frame(_("Magnified:"))); + magFrame->add( magnified ); + + magBox->pack_start( *magFrame, Gtk::PACK_EXPAND_WIDGET ); magBox->pack_start( magLabel, Gtk::PACK_SHRINK ); @@ -208,30 +210,21 @@ IconPreviewPanel::IconPreviewPanel() : iconBox.pack_start(splitter); splitter.pack1( *magBox, true, true ); - splitter.pack2( *verts, false, false ); - - - //## The Refresh button + Gtk::Frame *actuals = Gtk::manage(new Gtk::Frame(_("Actual Size:"))); + actuals->add(*verts); + splitter.pack2( *actuals, false, false ); - Gtk::HButtonBox* holder = new Gtk::HButtonBox( Gtk::BUTTONBOX_END ); - _getContents()->pack_end(*holder, false, false); - - selectionButton = new Gtk::ToggleButton(_("Selection")); // , GTK_RESPONSE_APPLY - holder->pack_start( *selectionButton, false, false ); + selectionButton = new Gtk::CheckButton(_("Selection")); // , GTK_RESPONSE_APPLY + magBox->pack_start( *selectionButton, Gtk::PACK_SHRINK ); tips.set_tip((*selectionButton), _("Selection only or whole document")); selectionButton->signal_clicked().connect( sigc::mem_fun(*this, &IconPreviewPanel::modeToggled) ); gint val = prefs->getBool("/iconpreview/selectionOnly"); selectionButton->set_active( val != 0 ); - refreshButton = new Gtk::Button(Gtk::Stock::REFRESH); // , GTK_RESPONSE_APPLY - holder->pack_end( *refreshButton, false, false ); - tips.set_tip((*refreshButton), _("Refresh the icons")); - refreshButton->signal_clicked().connect( sigc::mem_fun(*this, &IconPreviewPanel::refreshPreview) ); - - _getContents()->pack_start(iconBox, Gtk::PACK_EXPAND_WIDGET); + _getContents()->pack_start(iconBox, Gtk::PACK_SHRINK); show_all_children(); @@ -301,7 +294,6 @@ void IconPreviewPanel::refreshPreview() // Do not refresh too quickly queueRefresh(); } else if ( desktop ) { - if ( selectionButton && selectionButton->get_active() ) { Inkscape::Selection * sel = sp_desktop_selection(desktop); @@ -324,9 +316,7 @@ void IconPreviewPanel::refreshPreview() renderPreview(target); } } - } - else - { + } else { SPObject *target = desktop->currentRoot(); if ( target ) { renderPreview(target); diff --git a/src/ui/dialog/icon-preview.h b/src/ui/dialog/icon-preview.h index d90c2b173..a0f813b94 100644 --- a/src/ui/dialog/icon-preview.h +++ b/src/ui/dialog/icon-preview.h @@ -75,7 +75,6 @@ private: Gtk::Image magnified; Gtk::Label magLabel; - Gtk::Button *refreshButton; Gtk::ToggleButton *selectionButton; guchar** pixMem; @@ -102,3 +101,14 @@ private: #endif // SEEN_ICON_PREVIEW_H + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 : -- cgit v1.2.3 From 068f4be893b5e014f4ad39d1eb234e0286c71f93 Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Thu, 6 May 2010 01:49:03 -0700 Subject: Track selection changes for updating in icon preview. (bzr r9400) --- src/ui/dialog/icon-preview.cpp | 8 +++++++- src/ui/dialog/icon-preview.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/ui/dialog/icon-preview.cpp b/src/ui/dialog/icon-preview.cpp index 946eed4ca..9a46254ab 100644 --- a/src/ui/dialog/icon-preview.cpp +++ b/src/ui/dialog/icon-preview.cpp @@ -90,7 +90,8 @@ IconPreviewPanel::IconPreviewPanel() : selectionButton(0), desktopChangeConn(), docReplacedConn(), - docModConn() + docModConn(), + selChangedConn() { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); numEntries = 0; @@ -242,6 +243,7 @@ IconPreviewPanel::~IconPreviewPanel() timer = 0; } + selChangedConn.disconnect(); docModConn.disconnect(); docReplacedConn.disconnect(); desktopChangeConn.disconnect(); @@ -261,10 +263,14 @@ void IconPreviewPanel::setDesktop( SPDesktop* desktop ) if ( desktop != this->desktop ) { docReplacedConn.disconnect(); + selChangedConn.disconnect(); this->desktop = Panel::getDesktop(); if ( this->desktop ) { docReplacedConn = this->desktop->connectDocumentReplaced(sigc::hide<0>(sigc::mem_fun(this, &IconPreviewPanel::setDocument))); + if (this->desktop->selection) { + selChangedConn = desktop->selection->connectChanged(sigc::hide(sigc::mem_fun(this, &IconPreviewPanel::queueRefresh))); + } } } setDocument(newDoc); diff --git a/src/ui/dialog/icon-preview.h b/src/ui/dialog/icon-preview.h index a0f813b94..9de882569 100644 --- a/src/ui/dialog/icon-preview.h +++ b/src/ui/dialog/icon-preview.h @@ -84,6 +84,7 @@ private: sigc::connection desktopChangeConn; sigc::connection docReplacedConn; sigc::connection docModConn; + sigc::connection selChangedConn; void setDocument( SPDocument *document ); -- cgit v1.2.3 From f9ab8626b2915e99acb6c5d759f5fa5d9e350a89 Mon Sep 17 00:00:00 2001 From: Diederik van Lierop Date: Sat, 8 May 2010 23:27:22 +0200 Subject: Fix bounding box snapping (LP562205, comment 6, issue II) (bzr r9402) --- src/display/canvas-axonomgrid.cpp | 4 ++-- src/display/canvas-axonomgrid.h | 2 +- src/display/canvas-grid.cpp | 4 ++-- src/display/canvas-grid.h | 2 +- src/gradient-drag.cpp | 2 +- src/guide-snapper.cpp | 8 ++++---- src/guide-snapper.h | 4 ++-- src/line-snapper.cpp | 8 ++++---- src/line-snapper.h | 4 ++-- src/object-snapper.cpp | 4 ++-- src/snap.cpp | 9 +++------ src/snapped-curve.cpp | 4 ++-- src/snapped-line.cpp | 8 ++++---- src/snapped-point.cpp | 20 ++++++++++++-------- src/snapped-point.h | 8 +++++--- 15 files changed, 47 insertions(+), 44 deletions(-) (limited to 'src') diff --git a/src/display/canvas-axonomgrid.cpp b/src/display/canvas-axonomgrid.cpp index cf2883116..37469fa73 100644 --- a/src/display/canvas-axonomgrid.cpp +++ b/src/display/canvas-axonomgrid.cpp @@ -794,9 +794,9 @@ void CanvasAxonomGridSnapper::_addSnappedLine(SnappedConstraints &sc, Geom::Poin sc.grid_lines.push_back(dummy); } -void CanvasAxonomGridSnapper::_addSnappedPoint(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num) const +void CanvasAxonomGridSnapper::_addSnappedPoint(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const { - SnappedPoint dummy = SnappedPoint(snapped_point, source, source_num, Inkscape::SNAPTARGET_GRID, snapped_distance, getSnapperTolerance(), getSnapperAlwaysSnap(), true); + SnappedPoint dummy = SnappedPoint(snapped_point, source, source_num, Inkscape::SNAPTARGET_GRID, snapped_distance, getSnapperTolerance(), getSnapperAlwaysSnap(), constrained_snap, true); sc.points.push_back(dummy); } diff --git a/src/display/canvas-axonomgrid.h b/src/display/canvas-axonomgrid.h index 4b1cd4834..58185e2e6 100644 --- a/src/display/canvas-axonomgrid.h +++ b/src/display/canvas-axonomgrid.h @@ -79,7 +79,7 @@ public: private: LineList _getSnapLines(Geom::Point const &p) const; void _addSnappedLine(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, Geom::Point const normal_to_line, const Geom::Point point_on_line) const; - void _addSnappedPoint(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num) const; + void _addSnappedPoint(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const; CanvasAxonomGrid *grid; }; diff --git a/src/display/canvas-grid.cpp b/src/display/canvas-grid.cpp index 3532c504a..a79a6b610 100644 --- a/src/display/canvas-grid.cpp +++ b/src/display/canvas-grid.cpp @@ -1030,9 +1030,9 @@ void CanvasXYGridSnapper::_addSnappedLine(SnappedConstraints &sc, Geom::Point co sc.grid_lines.push_back(dummy); } -void CanvasXYGridSnapper::_addSnappedPoint(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num) const +void CanvasXYGridSnapper::_addSnappedPoint(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const { - SnappedPoint dummy = SnappedPoint(snapped_point, source, source_num, Inkscape::SNAPTARGET_GRID, snapped_distance, getSnapperTolerance(), getSnapperAlwaysSnap(), true); + SnappedPoint dummy = SnappedPoint(snapped_point, source, source_num, Inkscape::SNAPTARGET_GRID, snapped_distance, getSnapperTolerance(), getSnapperAlwaysSnap(), constrained_snap, true); sc.points.push_back(dummy); } diff --git a/src/display/canvas-grid.h b/src/display/canvas-grid.h index daf28c15c..a11d77d1d 100644 --- a/src/display/canvas-grid.h +++ b/src/display/canvas-grid.h @@ -167,7 +167,7 @@ public: private: LineList _getSnapLines(Geom::Point const &p) const; void _addSnappedLine(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, Geom::Point const normal_to_line, const Geom::Point point_on_line) const; - void _addSnappedPoint(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num) const; + void _addSnappedPoint(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const; CanvasXYGrid *grid; }; diff --git a/src/gradient-drag.cpp b/src/gradient-drag.cpp index 9796fc5da..11de93d68 100644 --- a/src/gradient-drag.cpp +++ b/src/gradient-drag.cpp @@ -665,7 +665,7 @@ gr_knot_moved_handler(SPKnot *knot, Geom::Point const &ppointer, guint state, gp s.setTransformation(s.getPoint() - p); sc.points.push_back(s); } else { - Inkscape::SnappedPoint dummy(p + *snap_vector, Inkscape::SNAPSOURCE_OTHER_HANDLE, 0, Inkscape::SNAPTARGET_CONSTRAINED_ANGLE, Geom::L2(*snap_vector), 10000, true, false); + Inkscape::SnappedPoint dummy(p + *snap_vector, Inkscape::SNAPSOURCE_OTHER_HANDLE, 0, Inkscape::SNAPTARGET_CONSTRAINED_ANGLE, Geom::L2(*snap_vector), 10000, true, true, false); dummy.setTransformation(*snap_vector); sc.points.push_back(dummy); } diff --git a/src/guide-snapper.cpp b/src/guide-snapper.cpp index 9121e3ee2..4f70521e0 100644 --- a/src/guide-snapper.cpp +++ b/src/guide-snapper.cpp @@ -74,16 +74,16 @@ void Inkscape::GuideSnapper::_addSnappedLine(SnappedConstraints &sc, Geom::Point sc.guide_lines.push_back(dummy); } -void Inkscape::GuideSnapper::_addSnappedLinesOrigin(SnappedConstraints &sc, Geom::Point const origin, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num) const +void Inkscape::GuideSnapper::_addSnappedLinesOrigin(SnappedConstraints &sc, Geom::Point const origin, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const { - SnappedPoint dummy = SnappedPoint(origin, source, source_num, Inkscape::SNAPTARGET_GUIDE_ORIGIN, snapped_distance, getSnapperTolerance(), getSnapperAlwaysSnap(), true); + SnappedPoint dummy = SnappedPoint(origin, source, source_num, Inkscape::SNAPTARGET_GUIDE_ORIGIN, snapped_distance, getSnapperTolerance(), getSnapperAlwaysSnap(), constrained_snap, true); sc.points.push_back(dummy); } -void Inkscape::GuideSnapper::_addSnappedPoint(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num) const +void Inkscape::GuideSnapper::_addSnappedPoint(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const { - SnappedPoint dummy = SnappedPoint(snapped_point, source, source_num, Inkscape::SNAPTARGET_GUIDE, snapped_distance, getSnapperTolerance(), getSnapperAlwaysSnap(), true); + SnappedPoint dummy = SnappedPoint(snapped_point, source, source_num, Inkscape::SNAPTARGET_GUIDE, snapped_distance, getSnapperTolerance(), getSnapperAlwaysSnap(), constrained_snap, true); sc.points.push_back(dummy); } diff --git a/src/guide-snapper.h b/src/guide-snapper.h index 5adac6e22..5de1b56a4 100644 --- a/src/guide-snapper.h +++ b/src/guide-snapper.h @@ -35,8 +35,8 @@ public: private: LineList _getSnapLines(Geom::Point const &p) const; void _addSnappedLine(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, Geom::Point const normal_to_line, Geom::Point const point_on_line) const; - void _addSnappedLinesOrigin(SnappedConstraints &sc, Geom::Point const origin, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num) const; - void _addSnappedPoint(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num) const; + void _addSnappedLinesOrigin(SnappedConstraints &sc, Geom::Point const origin, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const; + void _addSnappedPoint(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const; }; } diff --git a/src/line-snapper.cpp b/src/line-snapper.cpp index f2f025332..fc40643c8 100644 --- a/src/line-snapper.cpp +++ b/src/line-snapper.cpp @@ -50,7 +50,7 @@ void Inkscape::LineSnapper::freeSnap(SnappedConstraints &sc, // discern between grids and guides here Geom::Coord const dist_p1 = Geom::L2(p1 - p.getPoint()); if (dist_p1 < getSnapperTolerance()) { - _addSnappedLinesOrigin(sc, p1, dist_p1, p.getSourceType(), p.getSourceNum()); + _addSnappedLinesOrigin(sc, p1, dist_p1, p.getSourceType(), p.getSourceNum(), false); // Only relevant for guides; grids don't have an origin per line // Therefore _addSnappedLinesOrigin() will only be implemented for guides } @@ -104,13 +104,13 @@ void Inkscape::LineSnapper::constrainedSnap(SnappedConstraints &sc, // This snappoint is therefore fully constrained, so there's no need // to look for additional intersections; just return the snapped point // and forget about the line - _addSnappedPoint(sc, t, dist, p.getSourceType(), p.getSourceNum()); + _addSnappedPoint(sc, t, dist, p.getSourceType(), p.getSourceNum(), true); // For any line that's within range, we will also look at it's "point on line" p1. For guides // this point coincides with its origin; for grids this is of no use, but we cannot // discern between grids and guides here Geom::Coord const dist_p1 = Geom::L2(p1 - p.getPoint()); if (dist_p1 < getSnapperTolerance()) { - _addSnappedLinesOrigin(sc, p1, dist_p1, p.getSourceType(), p.getSourceNum()); + _addSnappedLinesOrigin(sc, p1, dist_p1, p.getSourceType(), p.getSourceNum(), true); // Only relevant for guides; grids don't have an origin per line // Therefore _addSnappedLinesOrigin() will only be implemented for guides } @@ -122,7 +122,7 @@ void Inkscape::LineSnapper::constrainedSnap(SnappedConstraints &sc, // Will only be overridden in the guide-snapper class, because grid lines don't have an origin; the // grid-snapper classes will use this default empty method -void Inkscape::LineSnapper::_addSnappedLinesOrigin(SnappedConstraints &/*sc*/, Geom::Point const /*origin*/, Geom::Coord const /*snapped_distance*/, SnapSourceType const &/*source_type*/, long /*source_num*/) const +void Inkscape::LineSnapper::_addSnappedLinesOrigin(SnappedConstraints &/*sc*/, Geom::Point const /*origin*/, Geom::Coord const /*snapped_distance*/, SnapSourceType const &/*source_type*/, long /*source_num*/, bool /*constrained_snap*/) const { } diff --git a/src/line-snapper.h b/src/line-snapper.h index 429139421..1aa3526cc 100644 --- a/src/line-snapper.h +++ b/src/line-snapper.h @@ -52,9 +52,9 @@ private: virtual void _addSnappedLine(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, Geom::Point const normal_to_line, Geom::Point const point_on_line) const = 0; // Will only be implemented for guide lines, because grid lines don't have an origin - virtual void _addSnappedLinesOrigin(SnappedConstraints &sc, Geom::Point const origin, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num) const; + virtual void _addSnappedLinesOrigin(SnappedConstraints &sc, Geom::Point const origin, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const; - virtual void _addSnappedPoint(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num) const = 0; + virtual void _addSnappedPoint(SnappedConstraints &sc, Geom::Point const snapped_point, Geom::Coord const snapped_distance, SnapSourceType const &source, long source_num, bool constrained_snap) const = 0; }; } diff --git a/src/object-snapper.cpp b/src/object-snapper.cpp index 77449ddc3..536affb82 100644 --- a/src/object-snapper.cpp +++ b/src/object-snapper.cpp @@ -265,7 +265,7 @@ void Inkscape::ObjectSnapper::_snapNodes(SnappedConstraints &sc, for (std::vector::const_iterator k = _points_to_snap_to->begin(); k != _points_to_snap_to->end(); k++) { Geom::Coord dist = Geom::L2((*k).getPoint() - p.getPoint()); if (dist < getSnapperTolerance() && dist < s.getSnapDistance()) { - s = SnappedPoint((*k).getPoint(), p.getSourceType(), p.getSourceNum(), (*k).getTargetType(), dist, getSnapperTolerance(), getSnapperAlwaysSnap(), true, (*k).getTargetBBox()); + s = SnappedPoint((*k).getPoint(), p.getSourceType(), p.getSourceNum(), (*k).getTargetType(), dist, getSnapperTolerance(), getSnapperAlwaysSnap(), false, true, (*k).getTargetBBox()); success = true; } } @@ -299,7 +299,7 @@ void Inkscape::ObjectSnapper::_snapTranslatingGuideToNodes(SnappedConstraints &s Geom::Coord dist = Geom::L2((*k).getPoint() - p_proj); // distance from node to the guide Geom::Coord dist2 = Geom::L2(p - p_proj); // distance from projection of node on the guide, to the mouse location if ((dist < tol && dist2 < tol) || getSnapperAlwaysSnap()) { - s = SnappedPoint((*k).getPoint(), SNAPSOURCE_GUIDE, 0, (*k).getTargetType(), dist, tol, getSnapperAlwaysSnap(), true, (*k).getTargetBBox()); + s = SnappedPoint((*k).getPoint(), SNAPSOURCE_GUIDE, 0, (*k).getTargetType(), dist, tol, getSnapperAlwaysSnap(), false, true, (*k).getTargetBBox()); sc.points.push_back(s); } } diff --git a/src/snap.cpp b/src/snap.cpp index 8704ce3bb..c47f93ff1 100644 --- a/src/snap.cpp +++ b/src/snap.cpp @@ -201,7 +201,7 @@ Inkscape::SnappedPoint SnapManager::freeSnap(Inkscape::SnapCandidatePoint const Geom::OptRect const &bbox_to_snap) const { if (!someSnapperMightSnap()) { - return Inkscape::SnappedPoint(p, Inkscape::SNAPTARGET_UNDEFINED, NR_HUGE, 0, false, false); + return Inkscape::SnappedPoint(p, Inkscape::SNAPTARGET_UNDEFINED, NR_HUGE, 0, false, false, false); } SnappedConstraints sc; @@ -365,7 +365,7 @@ Inkscape::SnappedPoint SnapManager::constrainedSnap(Inkscape::SnapCandidatePoint // First project the mouse pointer onto the constraint Geom::Point pp = constraint.projection(p.getPoint()); - Inkscape::SnappedPoint no_snap = Inkscape::SnappedPoint(pp, p.getSourceType(), p.getSourceNum(), Inkscape::SNAPTARGET_CONSTRAINT, Geom::L2(pp - p.getPoint()), 0, false, false); + Inkscape::SnappedPoint no_snap = Inkscape::SnappedPoint(pp, p.getSourceType(), p.getSourceNum(), Inkscape::SNAPTARGET_CONSTRAINT, Geom::L2(pp - p.getPoint()), 0, false, true, false); if (!someSnapperMightSnap()) { // Always return point on constraint @@ -648,7 +648,7 @@ Inkscape::SnappedPoint SnapManager::_snapTransformed( // the origin of the scaling, then it will scale purely in X or Y // We can therefore only calculate the scaling in this direction // and the scaling factor for the other direction should remain - // untouched (unless scaling is uniform ofcourse) + // untouched (unless scaling is uniform of course) for (int index = 0; index < 2; index++) { if (fabs(b[index]) > 1e-6) { // if SCALING CAN occur in this direction if (fabs(fabs(a[index]/b[index]) - fabs(transformation[index])) > 1e-12) { // if SNAPPING DID occur in this direction @@ -697,9 +697,6 @@ Inkscape::SnappedPoint SnapManager::_snapTransformed( g_assert_not_reached(); } - // When scaling, we're considering the best transformation in each direction separately. We will have a metric in each - // direction, whereas for all other transformation we only a single one-dimensional metric. That's why we need to handle - // the scaling metric differently if (best_snapped_point.isOtherSnapBetter(snapped_point, true)) { best_transformation = result; best_snapped_point = snapped_point; diff --git a/src/snapped-curve.cpp b/src/snapped-curve.cpp index d4ef0a83f..e7df3cfad 100644 --- a/src/snapped-curve.cpp +++ b/src/snapped-curve.cpp @@ -87,12 +87,12 @@ Inkscape::SnappedPoint Inkscape::SnappedCurve::intersect(SnappedCurve const &cur // TODO: Investigate whether it is possible to use document coordinates everywhere // in the snapper code. Only the mouse position should be in desktop coordinates, I guess. // All paths are already in document coords and we are certainly not going to change THAT. - return SnappedPoint(best_p, Inkscape::SNAPSOURCE_UNDEFINED, primaryC->getSourceNum(), Inkscape::SNAPTARGET_PATH_INTERSECTION, primaryDist, primaryC->getTolerance(), primaryC->getAlwaysSnap(), true, true, + return SnappedPoint(best_p, Inkscape::SNAPSOURCE_UNDEFINED, primaryC->getSourceNum(), Inkscape::SNAPTARGET_PATH_INTERSECTION, primaryDist, primaryC->getTolerance(), primaryC->getAlwaysSnap(), true, false, true, secondaryDist, secondaryC->getTolerance(), secondaryC->getAlwaysSnap()); } // No intersection - return SnappedPoint(Geom::Point(NR_HUGE, NR_HUGE), SNAPSOURCE_UNDEFINED, 0, SNAPTARGET_UNDEFINED, NR_HUGE, 0, false, false, false, NR_HUGE, 0, false); + return SnappedPoint(Geom::Point(NR_HUGE, NR_HUGE), SNAPSOURCE_UNDEFINED, 0, SNAPTARGET_UNDEFINED, NR_HUGE, 0, false, false, false, false, NR_HUGE, 0, false); } // search for the closest snapped line diff --git a/src/snapped-line.cpp b/src/snapped-line.cpp index 9dde22a4e..da17ff81a 100644 --- a/src/snapped-line.cpp +++ b/src/snapped-line.cpp @@ -80,12 +80,12 @@ Inkscape::SnappedPoint Inkscape::SnappedLineSegment::intersect(SnappedLineSegmen Inkscape::SnappedLineSegment const *secondarySLS = use_this_as_primary ? &line : this; Geom::Coord primaryDist = use_this_as_primary ? Geom::L2(inters_pt - this->getPoint()) : Geom::L2(inters_pt - line.getPoint()); Geom::Coord secondaryDist = use_this_as_primary ? Geom::L2(inters_pt - line.getPoint()) : Geom::L2(inters_pt - this->getPoint()); - return SnappedPoint(inters_pt, SNAPSOURCE_UNDEFINED, primarySLS->getSourceNum(), SNAPTARGET_PATH_INTERSECTION, primaryDist, primarySLS->getTolerance(), primarySLS->getAlwaysSnap(), true, true, + return SnappedPoint(inters_pt, SNAPSOURCE_UNDEFINED, primarySLS->getSourceNum(), SNAPTARGET_PATH_INTERSECTION, primaryDist, primarySLS->getTolerance(), primarySLS->getAlwaysSnap(), true, false, true, secondaryDist, secondarySLS->getTolerance(), secondarySLS->getAlwaysSnap()); } // No intersection - return SnappedPoint(Geom::Point(NR_HUGE, NR_HUGE), SNAPSOURCE_UNDEFINED, 0, SNAPTARGET_UNDEFINED, NR_HUGE, 0, false, false, false, NR_HUGE, 0, false); + return SnappedPoint(Geom::Point(NR_HUGE, NR_HUGE), SNAPSOURCE_UNDEFINED, 0, SNAPTARGET_UNDEFINED, NR_HUGE, 0, false, false, false, false, NR_HUGE, 0, false); }; @@ -161,14 +161,14 @@ Inkscape::SnappedPoint Inkscape::SnappedLine::intersect(SnappedLine const &line) Inkscape::SnappedLine const *secondarySL = use_this_as_primary ? &line : this; Geom::Coord primaryDist = use_this_as_primary ? Geom::L2(inters_pt - this->getPoint()) : Geom::L2(inters_pt - line.getPoint()); Geom::Coord secondaryDist = use_this_as_primary ? Geom::L2(inters_pt - line.getPoint()) : Geom::L2(inters_pt - this->getPoint()); - return SnappedPoint(inters_pt, Inkscape::SNAPSOURCE_UNDEFINED, primarySL->getSourceNum(), Inkscape::SNAPTARGET_UNDEFINED, primaryDist, primarySL->getTolerance(), primarySL->getAlwaysSnap(), true, true, + return SnappedPoint(inters_pt, Inkscape::SNAPSOURCE_UNDEFINED, primarySL->getSourceNum(), Inkscape::SNAPTARGET_UNDEFINED, primaryDist, primarySL->getTolerance(), primarySL->getAlwaysSnap(), true, false, true, secondaryDist, secondarySL->getTolerance(), secondarySL->getAlwaysSnap()); // The type of the snap target is yet undefined, as we cannot tell whether // we're snapping to grid or the guide lines; must be set by on a higher level } // No intersection - return SnappedPoint(Geom::Point(NR_HUGE, NR_HUGE), SNAPSOURCE_UNDEFINED, 0, SNAPTARGET_UNDEFINED, NR_HUGE, 0, false, false, false, NR_HUGE, 0, false); + return SnappedPoint(Geom::Point(NR_HUGE, NR_HUGE), SNAPSOURCE_UNDEFINED, 0, SNAPTARGET_UNDEFINED, NR_HUGE, 0, false, false, false, false, NR_HUGE, 0, false); } // search for the closest snapped line segment diff --git a/src/snapped-point.cpp b/src/snapped-point.cpp index 508ec8f62..352f2dd1e 100644 --- a/src/snapped-point.cpp +++ b/src/snapped-point.cpp @@ -14,11 +14,12 @@ #include "preferences.h" // overloaded constructor -Inkscape::SnappedPoint::SnappedPoint(Geom::Point const &p, SnapSourceType const &source, long source_num, SnapTargetType const &target, Geom::Coord const &d, Geom::Coord const &t, bool const &a, bool const &fully_constrained, Geom::OptRect target_bbox) +Inkscape::SnappedPoint::SnappedPoint(Geom::Point const &p, SnapSourceType const &source, long source_num, SnapTargetType const &target, Geom::Coord const &d, Geom::Coord const &t, bool const &a, bool const &constrained_snap, bool const &fully_constrained, Geom::OptRect target_bbox) : _point(p), _source(source), _source_num(source_num), _target(target), _distance(d), _tolerance(std::max(t,1.0)), _always_snap(a), _target_bbox(target_bbox) { // tolerance should never be smaller than 1 px, as it is used for normalization in isOtherSnapBetter. We don't want a division by zero. _at_intersection = false; + _constrained_snap = constrained_snap; _fully_constrained = fully_constrained; _second_distance = NR_HUGE; _second_tolerance = 1; @@ -27,13 +28,14 @@ Inkscape::SnappedPoint::SnappedPoint(Geom::Point const &p, SnapSourceType const _pointer_distance = NR_HUGE; } -Inkscape::SnappedPoint::SnappedPoint(Inkscape::SnapCandidatePoint const &p, SnapTargetType const &target, Geom::Coord const &d, Geom::Coord const &t, bool const &a, bool const &fully_constrained) +Inkscape::SnappedPoint::SnappedPoint(Inkscape::SnapCandidatePoint const &p, SnapTargetType const &target, Geom::Coord const &d, Geom::Coord const &t, bool const &a, bool const &constrained_snap, bool const &fully_constrained) : _target(target), _distance(d), _tolerance(std::max(t,1.0)), _always_snap(a) { _point = p.getPoint(); _source = p.getSourceType(); _source_num = p.getSourceNum(); _at_intersection = false; + _constrained_snap = constrained_snap; _fully_constrained = fully_constrained; _second_distance = NR_HUGE; _second_tolerance = 1; @@ -44,8 +46,8 @@ Inkscape::SnappedPoint::SnappedPoint(Inkscape::SnapCandidatePoint const &p, Snap } -Inkscape::SnappedPoint::SnappedPoint(Geom::Point const &p, SnapSourceType const &source, long source_num, SnapTargetType const &target, Geom::Coord const &d, Geom::Coord const &t, bool const &a, bool const &at_intersection, bool const &fully_constrained, Geom::Coord const &d2, Geom::Coord const &t2, bool const &a2) - : _point(p), _source(source), _source_num(source_num), _target(target), _at_intersection(at_intersection), _fully_constrained(fully_constrained), _distance(d), _tolerance(std::max(t,1.0)), _always_snap(a), +Inkscape::SnappedPoint::SnappedPoint(Geom::Point const &p, SnapSourceType const &source, long source_num, SnapTargetType const &target, Geom::Coord const &d, Geom::Coord const &t, bool const &a, bool const &at_intersection, bool const &constrained_snap, bool const &fully_constrained, Geom::Coord const &d2, Geom::Coord const &t2, bool const &a2) + : _point(p), _source(source), _source_num(source_num), _target(target), _at_intersection(at_intersection), _constrained_snap(constrained_snap), _fully_constrained(fully_constrained), _distance(d), _tolerance(std::max(t,1.0)), _always_snap(a), _second_distance(d2), _second_tolerance(std::max(t2,1.0)), _second_always_snap(a2) { // tolerance should never be smaller than 1 px, as it is used for normalization in @@ -62,6 +64,7 @@ Inkscape::SnappedPoint::SnappedPoint() _source_num = 0, _target = SNAPTARGET_UNDEFINED, _at_intersection = false; + _constrained_snap = false; _fully_constrained = false; _distance = NR_HUGE; _tolerance = 1; @@ -155,7 +158,8 @@ bool Inkscape::SnappedPoint::isOtherSnapBetter(Inkscape::SnappedPoint const &oth // however be very large. To compare these in a fair way, we will have to normalize these metrics first // The closest pointer distance will be normalized to 1.0; the other one will be > 1.0 // The snap distance will be normalized to 1.0 if it's equal to the snapper tolerance - double const norm_p = std::min(dist_pointer_this, dist_pointer_other); + double const norm_p = std::min(dist_pointer_this, dist_pointer_other) + 1; + // make sure norm_p is never too close to zero (e.g. when snapping the bbox-corner that was grabbed), by incr. with 1 double const norm_t_other = std::min(50.0, other_one.getTolerance()); double const norm_t_this = std::min(50.0, getTolerance()); dist_other = w * dist_pointer_other / norm_p + (1-w) * dist_other / norm_t_other; @@ -180,9 +184,9 @@ bool Inkscape::SnappedPoint::isOtherSnapBetter(Inkscape::SnappedPoint const &oth // But in no case fall back from a snapper with "always snap" on to one with "always snap" off bool c2n = !other_one.getAlwaysSnap() && getAlwaysSnap(); // or, if we have a fully constrained snappoint (e.g. to a node or an intersection), while the previous one was only partly constrained (e.g. to a line) - bool c3 = other_one.getFullyConstrained() && !getFullyConstrained(); + bool c3 = (other_one.getFullyConstrained() && !other_one.getConstrainedSnap()) && !getFullyConstrained(); // Do not consider constrained snaps here, because these will always be fully constrained anyway // But in no case fall back; (has less priority than c3n, so it is allowed to fall back when c3 is true, see below) - bool c3n = !other_one.getFullyConstrained() && getFullyConstrained(); + bool c3n = !other_one.getFullyConstrained() && (getFullyConstrained() && !getConstrainedSnap()); // When both are fully constrained AND coincident, then prefer nodes over intersections bool d = other_one.getFullyConstrained() && getFullyConstrained() && (Geom::L2(other_one.getPoint() - getPoint()) < 1e-9); @@ -192,7 +196,7 @@ bool Inkscape::SnappedPoint::isOtherSnapBetter(Inkscape::SnappedPoint const &oth // or, if it's just as close then consider the second distance bool c5a = (dist_other == dist_this); - bool c5b = other_one.getSecondSnapDistance() < getSecondSnapDistance(); + bool c5b = (other_one.getSecondSnapDistance() < getSecondSnapDistance()) && (getSecondSnapDistance() < NR_HUGE); // std::cout << other_one.getPoint() << " (Other one, dist = " << dist_other << ") vs. " << getPoint() << " (this one, dist = " << dist_this << ") ---> "; // std::cout << "c1 = " << c1 << " | c2 = " << c2 << " | c2n = " << c2n << " | c3 = " << c3 << " | c3n = " << c3n << " | c4 = " << c4 << " | c4n = " << c4n << " | c5a = " << c5a << " | c5b = " << c5b << std::endl; diff --git a/src/snapped-point.h b/src/snapped-point.h index 10d36f57e..05e954e1e 100644 --- a/src/snapped-point.h +++ b/src/snapped-point.h @@ -28,9 +28,9 @@ class SnappedPoint public: SnappedPoint(); SnappedPoint(Geom::Point const &p); - SnappedPoint(Geom::Point const &p, SnapSourceType const &source, long source_num, SnapTargetType const &target, Geom::Coord const &d, Geom::Coord const &t, bool const &a, bool const &at_intersection, bool const &fully_constrained, Geom::Coord const &d2, Geom::Coord const &t2, bool const &a2); - SnappedPoint(Geom::Point const &p, SnapSourceType const &source, long source_num, SnapTargetType const &target, Geom::Coord const &d, Geom::Coord const &t, bool const &a, bool const &fully_constrained, Geom::OptRect target_bbox = Geom::OptRect()); - SnappedPoint(SnapCandidatePoint const &p, SnapTargetType const &target, Geom::Coord const &d, Geom::Coord const &t, bool const &a, bool const &fully_constrained); + SnappedPoint(Geom::Point const &p, SnapSourceType const &source, long source_num, SnapTargetType const &target, Geom::Coord const &d, Geom::Coord const &t, bool const &a, bool const &at_intersection, bool const &constrained_snap, bool const &fully_constrained, Geom::Coord const &d2, Geom::Coord const &t2, bool const &a2); + SnappedPoint(Geom::Point const &p, SnapSourceType const &source, long source_num, SnapTargetType const &target, Geom::Coord const &d, Geom::Coord const &t, bool const &a, bool const &constrained_snap, bool const &fully_constrained, Geom::OptRect target_bbox = Geom::OptRect()); + SnappedPoint(SnapCandidatePoint const &p, SnapTargetType const &target, Geom::Coord const &d, Geom::Coord const &t, bool const &a, bool const &constrained_snap, bool const &fully_constrained); ~SnappedPoint(); Geom::Coord getSnapDistance() const {return _distance;} @@ -61,6 +61,7 @@ public: bool getAtIntersection() const {return _at_intersection;} bool getFullyConstrained() const {return _fully_constrained;} + bool getConstrainedSnap() const {return _constrained_snap;} bool getSnapped() const {return _distance < NR_HUGE;} Geom::Point getTransformation() const {return _transformation;} void setTransformation(Geom::Point const t) {_transformation = t;} @@ -97,6 +98,7 @@ protected: long _source_num; // Sequence number of the source point that snapped, if that point is part of a set of points. (starting at zero) SnapTargetType _target; // Describes to what we've snapped to bool _at_intersection; // If true, the snapped point is at an intersection + bool _constrained_snap; // If true, then the snapped point was found when looking for a constrained snap bool _fully_constrained; // When snapping for example to a node, then the snap will be "fully constrained". // When snapping to a line however, the snap is only partly constrained (i.e. only in one dimension) -- cgit v1.2.3 From 4c4369a9d7f39c0ca9461c877316a7e01c5348f2 Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Sun, 9 May 2010 10:02:52 +0200 Subject: Fix tooltip error in the preferences (Bug #446723). Fixed bugs: - https://launchpad.net/bugs/446723 (bzr r9403) --- src/ui/dialog/inkscape-preferences.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/ui/dialog/inkscape-preferences.cpp b/src/ui/dialog/inkscape-preferences.cpp index 524558155..3c48a7972 100644 --- a/src/ui/dialog/inkscape-preferences.cpp +++ b/src/ui/dialog/inkscape-preferences.cpp @@ -1095,7 +1095,7 @@ void InkscapePreferences::initPageSVGOutput() _page_svgoutput.add_group_header( _("Numbers")); _svgoutput_numericprecision.init("/options/svgoutput/numericprecision", 1.0, 16.0, 1.0, 2.0, 8.0, true, false); - _page_svgoutput.add_line( false, _("Numeric precision:"), _svgoutput_numericprecision, "", _("How many digits to write after the decimal dot"), false); + _page_svgoutput.add_line( false, _("Numeric precision:"), _svgoutput_numericprecision, "", _("Significant figures of the values written to the SVG file"), false); _svgoutput_minimumexponent.init("/options/svgoutput/minimumexponent", -32.0, -1, 1.0, 2.0, -8.0, true, false); _page_svgoutput.add_line( false, _("Minimum exponent:"), _svgoutput_minimumexponent, "", _("The smallest number written to SVG is 10 to the power of this exponent; anything smaller is written as zero"), false); -- cgit v1.2.3