find.c: Use SetThing, rather than open-coding assignments to thing_*
[geda-pcb/pcjc2.git] / src / hid / gtk / ghid-route-style-selector.c
blob01f2a962e912578aa13351d1d2ff89c8bc0b3fde
1 /*! \file <gtk-pcb-route-style-selector.c>
2 * \brief Implementation of GHidRouteStyleSelector widget
3 * \par Description
4 * Please write description here.
5 */
7 #include <glib.h>
8 #include <glib-object.h>
9 #include <gdk/gdkkeysyms.h>
10 #include <gtk/gtk.h>
12 #include "global.h"
13 #include "gtkhid.h"
14 #include "gui.h"
15 #include "pcb-printf.h"
17 #include "ghid-route-style-selector.h"
19 /* Forward dec'ls */
20 struct _route_style;
21 struct _route_style *ghid_route_style_selector_real_add_route_style
22 (GHidRouteStyleSelector *, RouteStyleType *, gboolean temp);
23 static void ghid_route_style_selector_finalize (GObject *object);
25 /*! \brief Global action creation counter */
26 static gint action_count;
28 /*! \brief Signals exposed by the widget */
29 enum {
30 SELECT_STYLE_SIGNAL,
31 STYLE_EDITED_SIGNAL,
32 LAST_SIGNAL
35 /*! \brief Columns used for internal data store */
36 enum {
37 TEXT_COL,
38 DATA_COL,
39 N_COLS
42 static GtkVBox *ghid_route_style_selector_parent_class;
43 static guint ghid_route_style_selector_signals[LAST_SIGNAL] = { 0 };
45 struct _GHidRouteStyleSelector
47 GtkVBox parent;
49 GSList *button_radio_group;
50 GSList *action_radio_group;
51 GtkWidget *edit_button;
53 GtkActionGroup *action_group;
54 GtkAccelGroup *accel_group;
55 GtkRadioAction *null_action;
56 GtkWidget *null_button;
57 gint shortcut_key_idx;
59 GtkListStore *model;
60 struct _route_style *active_style;
63 struct _GHidRouteStyleSelectorClass
65 GtkVBoxClass parent_class;
67 void (* select_style) (GHidRouteStyleSelector *, RouteStyleType *);
68 void (* style_edited) (GHidRouteStyleSelector *, gboolean);
71 struct _route_style
73 gboolean temporary;
74 GtkRadioAction *action;
75 GtkWidget *button;
76 GtkWidget *menu_item;
77 GtkTreeRowReference *rref;
78 RouteStyleType *rst;
79 gulong sig_id;
82 static void
83 init_radio_groups (GHidRouteStyleSelector *rss)
85 gtk_radio_action_set_group (rss->null_action, rss->action_radio_group);
86 rss->action_radio_group = gtk_radio_action_get_group (rss->null_action);
87 gtk_radio_button_set_group (GTK_RADIO_BUTTON (rss->null_button),
88 rss->button_radio_group);
89 rss->button_radio_group = gtk_radio_button_get_group
90 (GTK_RADIO_BUTTON (rss->null_button));
93 /* SIGNAL HANDLERS */
94 /*! \brief Callback for user selection of a route style */
95 static void
96 radio_select_cb (GtkToggleAction *action, GHidRouteStyleSelector *rss)
98 rss->active_style = g_object_get_data (G_OBJECT (action), "route-style");
99 if (gtk_toggle_action_get_active (action))
100 g_signal_emit (rss, ghid_route_style_selector_signals[SELECT_STYLE_SIGNAL],
101 0, rss->active_style->rst);
104 /* EDIT DIALOG */
105 struct _dialog
107 GHidRouteStyleSelector *rss;
108 GtkWidget *name_entry;
109 GtkWidget *line_entry;
110 GtkWidget *via_hole_entry;
111 GtkWidget *via_size_entry;
112 GtkWidget *clearance_entry;
115 /*! \brief Callback for dialog box's combobox being changed
116 * \par Function Description
117 * When a different layer is selected, this function loads
118 * that layer's data into the dialog. Alternately, if the
119 * "New layer" option is selected, this loads a new name
120 * but no other data.
122 * \param [in] combo The combobox
123 * \param [in] dialog The rest of the widgets to be updated
125 static void
126 dialog_style_changed_cb (GtkComboBox *combo, struct _dialog *dialog)
128 struct _route_style *style;
129 GtkTreeIter iter;
130 gtk_combo_box_get_active_iter (combo, &iter);
131 gtk_tree_model_get (GTK_TREE_MODEL (dialog->rss->model),
132 &iter, DATA_COL, &style, -1);
134 if (style == NULL)
136 gtk_entry_set_text (GTK_ENTRY (dialog->name_entry),
137 _("New Style"));
138 return;
141 gtk_entry_set_text (GTK_ENTRY (dialog->name_entry), style->rst->Name);
142 ghid_coord_entry_set_value (GHID_COORD_ENTRY (dialog->line_entry),
143 style->rst->Thick);
144 ghid_coord_entry_set_value (GHID_COORD_ENTRY (dialog->via_hole_entry),
145 style->rst->Hole);
146 ghid_coord_entry_set_value (GHID_COORD_ENTRY (dialog->via_size_entry),
147 style->rst->Diameter);
148 ghid_coord_entry_set_value (GHID_COORD_ENTRY (dialog->clearance_entry),
149 style->rst->Keepaway);
153 /* \brief Helper for edit_button_cb */
154 static void
155 _table_attach (GtkWidget *table, gint row, const gchar *label,
156 GtkWidget **entry, Coord min, Coord max)
158 GtkWidget *label_w = gtk_label_new (label);
159 gtk_misc_set_alignment (GTK_MISC (label_w), 1.0, 0.5);
161 *entry = ghid_coord_entry_new (min, max, 0, Settings.grid_unit, CE_SMALL);
162 gtk_table_attach (GTK_TABLE (table), label_w, 0, 1, row, row + 1,
163 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 2, 2);
164 gtk_table_attach (GTK_TABLE (table), *entry, 1, 2, row, row + 1,
165 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 2, 2);
168 /* \brief Builds and runs the "edit route styles" dialog */
169 void
170 ghid_route_style_selector_edit_dialog (GHidRouteStyleSelector *rss)
172 GtkTreePath *path;
173 GtkTreeIter iter, tmp_iter;
174 struct _dialog dialog_data;
175 GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();
176 GtkWidget *window = gtk_widget_get_toplevel (GTK_WIDGET (rss));
177 GtkWidget *dialog;
178 GtkWidget *content_area;
179 GtkWidget *vbox, *hbox, *sub_vbox, *table;
180 GtkWidget *label, *select_box, *check_box;
182 /* Build dialog */
183 dialog = gtk_dialog_new_with_buttons (_("Edit Route Styles"),
184 GTK_WINDOW (window),
185 GTK_DIALOG_DESTROY_WITH_PARENT,
186 GTK_STOCK_CANCEL, GTK_RESPONSE_NONE,
187 GTK_STOCK_OK, GTK_RESPONSE_OK, NULL);
189 label = gtk_label_new (_("Edit Style:"));
190 gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
192 select_box = gtk_combo_box_new_with_model (GTK_TREE_MODEL (rss->model));
193 gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (select_box), renderer, TRUE);
194 gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT(select_box), renderer,
195 "text", TEXT_COL, NULL);
197 content_area = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
199 hbox = gtk_hbox_new (FALSE, 4);
200 gtk_box_pack_start (GTK_BOX (content_area), hbox, TRUE, TRUE, 4);
201 vbox = gtk_vbox_new (FALSE, 4);
202 gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 4);
204 hbox = gtk_hbox_new (FALSE, 4);
205 gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 4);
206 gtk_box_pack_start (GTK_BOX (hbox), label, TRUE, TRUE, 0);
207 gtk_box_pack_start (GTK_BOX (hbox), select_box, TRUE, TRUE, 0);
209 sub_vbox = ghid_category_vbox (vbox, _("Route Style Data"),
210 4, 2, TRUE, TRUE);
211 table = gtk_table_new (5, 2, FALSE);
212 gtk_box_pack_start (GTK_BOX (sub_vbox), table, TRUE, TRUE, 4);
213 label = gtk_label_new (_("Name:"));
214 gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
215 dialog_data.name_entry = gtk_entry_new ();
216 gtk_table_attach (GTK_TABLE (table), label, 0, 1, 0, 1,
217 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 2, 2);
218 gtk_table_attach (GTK_TABLE (table), dialog_data.name_entry, 1, 2, 0, 1,
219 GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 2, 2);
221 _table_attach (table, 1, _("Line width:"),
222 &dialog_data.line_entry,
223 MIN_LINESIZE, MAX_LINESIZE);
224 _table_attach (table, 2, _("Via hole size:"),
225 &dialog_data.via_hole_entry,
226 MIN_PINORVIAHOLE, MAX_PINORVIASIZE - MIN_PINORVIACOPPER);
227 _table_attach (table, 3, _("Via ring size:"),
228 &dialog_data.via_size_entry,
229 MIN_PINORVIAHOLE + MIN_PINORVIACOPPER, MAX_PINORVIASIZE);
230 _table_attach (table, 4, _("Clearance:"),
231 &dialog_data.clearance_entry,
232 MIN_LINESIZE, MAX_LINESIZE);
234 sub_vbox = ghid_category_vbox (vbox, _("Set as Default"),
235 4, 2, TRUE, TRUE);
236 check_box = gtk_check_button_new_with_label
237 (_("Save route style settings as default"));
238 gtk_box_pack_start (GTK_BOX (sub_vbox), check_box, TRUE, TRUE, 0);
240 /* Add "new style" option to list */
241 gtk_list_store_append (rss->model, &tmp_iter);
242 gtk_list_store_set (rss->model, &tmp_iter, TEXT_COL,
243 _("New (this session only)"), DATA_COL, NULL, -1);
245 /* Display dialog */
246 dialog_data.rss = rss;
247 path = gtk_tree_row_reference_get_path (rss->active_style->rref);
248 gtk_tree_model_get_iter (GTK_TREE_MODEL (rss->model), &iter, path);
249 g_signal_connect (G_OBJECT (select_box), "changed",
250 G_CALLBACK (dialog_style_changed_cb), &dialog_data);
251 gtk_combo_box_set_active_iter (GTK_COMBO_BOX (select_box), &iter);
252 gtk_widget_show_all (dialog);
253 if (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
255 RouteStyleType *rst;
256 struct _route_style *style;
257 gboolean save;
258 gtk_combo_box_get_active_iter (GTK_COMBO_BOX (select_box), &iter);
259 gtk_tree_model_get (GTK_TREE_MODEL (rss->model),
260 &iter, DATA_COL, &style, -1);
261 if (style == NULL)
262 rst = g_malloc (sizeof *rst);
263 else
265 rst = style->rst;
266 free (rst->Name);
269 rst->Name = StripWhiteSpaceAndDup
270 (gtk_entry_get_text (GTK_ENTRY (dialog_data.name_entry)));
271 rst->Thick = ghid_coord_entry_get_value
272 (GHID_COORD_ENTRY (dialog_data.line_entry));
273 rst->Hole = ghid_coord_entry_get_value
274 (GHID_COORD_ENTRY (dialog_data.via_hole_entry));
275 rst->Diameter = ghid_coord_entry_get_value
276 (GHID_COORD_ENTRY (dialog_data.via_size_entry));
277 rst->Keepaway = ghid_coord_entry_get_value
278 (GHID_COORD_ENTRY (dialog_data.clearance_entry));
279 save = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (check_box));
281 if (style == NULL)
282 style = ghid_route_style_selector_real_add_route_style
283 (rss, rst, TRUE);
284 else
286 gtk_action_set_label (GTK_ACTION (style->action), rst->Name);
287 gtk_list_store_set (rss->model, &iter, TEXT_COL, rst->Name, -1);
290 /* Cleanup */
291 gtk_widget_destroy (dialog);
292 gtk_list_store_remove (rss->model, &tmp_iter);
293 /* Emit change signals */
294 ghid_route_style_selector_select_style (rss, rst);
295 g_signal_emit
296 (rss, ghid_route_style_selector_signals[STYLE_EDITED_SIGNAL],
297 0, save);
299 else
301 gtk_widget_destroy (dialog);
302 gtk_list_store_remove (rss->model, &tmp_iter);
305 /* end EDIT DIALOG */
307 static void
308 edit_button_cb (GtkButton *btn, GHidRouteStyleSelector *rss)
310 ghid_route_style_selector_edit_dialog (rss);
313 /* CONSTRUCTOR */
314 static void
315 ghid_route_style_selector_init (GHidRouteStyleSelector *rss)
319 static void
320 ghid_route_style_selector_class_init (GHidRouteStyleSelectorClass *klass)
322 GObjectClass *object_class = (GObjectClass *) klass;
324 ghid_route_style_selector_parent_class = g_type_class_peek_parent (klass);
326 ghid_route_style_selector_signals[SELECT_STYLE_SIGNAL] =
327 g_signal_new ("select-style",
328 G_TYPE_FROM_CLASS (klass),
329 G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
330 G_STRUCT_OFFSET (GHidRouteStyleSelectorClass, select_style),
331 NULL, NULL,
332 g_cclosure_marshal_VOID__POINTER, G_TYPE_NONE,
333 1, G_TYPE_POINTER);
334 ghid_route_style_selector_signals[STYLE_EDITED_SIGNAL] =
335 g_signal_new ("style-edited",
336 G_TYPE_FROM_CLASS (klass),
337 G_SIGNAL_RUN_FIRST | G_SIGNAL_ACTION,
338 G_STRUCT_OFFSET (GHidRouteStyleSelectorClass, style_edited),
339 NULL, NULL,
340 g_cclosure_marshal_VOID__BOOLEAN, G_TYPE_NONE,
341 1, G_TYPE_BOOLEAN);
343 object_class->finalize = ghid_route_style_selector_finalize;
346 /*! \brief Clean up object before garbage collection
348 static void
349 ghid_route_style_selector_finalize (GObject *object)
351 GHidRouteStyleSelector *rss = (GHidRouteStyleSelector *) object;
353 ghid_route_style_selector_empty (rss);
355 g_object_unref (rss->accel_group);
356 g_object_unref (rss->action_group);
358 G_OBJECT_CLASS (ghid_route_style_selector_parent_class)->finalize (object);
361 /* PUBLIC FUNCTIONS */
362 GType
363 ghid_route_style_selector_get_type (void)
365 static GType rss_type = 0;
367 if (!rss_type)
369 const GTypeInfo rss_info =
371 sizeof (GHidRouteStyleSelectorClass),
372 NULL, /* base_init */
373 NULL, /* base_finalize */
374 (GClassInitFunc) ghid_route_style_selector_class_init,
375 NULL, /* class_finalize */
376 NULL, /* class_data */
377 sizeof (GHidRouteStyleSelector),
378 0, /* n_preallocs */
379 (GInstanceInitFunc) ghid_route_style_selector_init,
382 rss_type = g_type_register_static (GTK_TYPE_VBOX,
383 "GHidRouteStyleSelector",
384 &rss_info,
388 return rss_type;
391 /*! \brief Create a new GHidRouteStyleSelector
393 * \return a freshly-allocated GHidRouteStyleSelector.
395 GtkWidget *
396 ghid_route_style_selector_new ()
398 GHidRouteStyleSelector *rss =
399 g_object_new (GHID_ROUTE_STYLE_SELECTOR_TYPE, NULL);
401 rss->active_style = NULL;
402 rss->action_radio_group = NULL;
403 rss->button_radio_group = NULL;
404 rss->model = gtk_list_store_new (N_COLS, G_TYPE_STRING, G_TYPE_POINTER);
406 rss->accel_group = gtk_accel_group_new ();
407 rss->action_group = gtk_action_group_new ("RouteStyleSelector");
408 rss->null_action = gtk_radio_action_new ("RouteStyleXX", "",
409 NULL, NULL, -1);
410 rss->null_button = gtk_radio_button_new (rss->button_radio_group);
411 init_radio_groups (rss);
412 gtk_activatable_set_related_action (GTK_ACTIVATABLE (rss->null_button),
413 GTK_ACTION (rss->null_action));
414 rss->shortcut_key_idx = 1;
416 /* Create edit button */
417 rss->edit_button = gtk_button_new_with_label (_("Route Styles"));
418 g_signal_connect (G_OBJECT (rss->edit_button), "clicked",
419 G_CALLBACK (edit_button_cb), rss);
420 gtk_box_pack_start (GTK_BOX (rss), rss->edit_button, FALSE, FALSE, 0);
422 return GTK_WIDGET (rss);
425 /*! \brief Create a new GHidRouteStyleSelector
427 * \param [in] rss The selector to be acted on
428 * \param [in] data PCB's route style object that will be edited
429 * \param [in] temp Whether the style is "real" or session-only
431 struct _route_style *
432 ghid_route_style_selector_real_add_route_style (GHidRouteStyleSelector *rss,
433 RouteStyleType *data,
434 gboolean temp)
436 GtkTreeIter iter;
437 GtkTreePath *path;
438 gchar *action_name = g_strdup_printf ("RouteStyle%d", action_count);
439 struct _route_style *new_style = g_malloc (sizeof (*new_style));
441 /* Key the route style data with the RouteStyleType it controls */
442 new_style->rst = data;
443 new_style->temporary = temp;
444 new_style->action = gtk_radio_action_new (action_name, data->Name,
445 NULL, NULL, action_count);
446 gtk_radio_action_set_group (new_style->action, rss->action_radio_group);
447 rss->action_radio_group = gtk_radio_action_get_group (new_style->action);
448 new_style->button = gtk_radio_button_new (rss->button_radio_group);
449 rss->button_radio_group = gtk_radio_button_get_group
450 (GTK_RADIO_BUTTON (new_style->button));
451 gtk_activatable_set_related_action (GTK_ACTIVATABLE (new_style->button),
452 GTK_ACTION (new_style->action));
454 gtk_list_store_append (rss->model, &iter);
455 gtk_list_store_set (rss->model, &iter, TEXT_COL, data->Name,
456 DATA_COL, new_style, -1);
457 path = gtk_tree_model_get_path (GTK_TREE_MODEL (rss->model), &iter);
458 new_style->rref = gtk_tree_row_reference_new (GTK_TREE_MODEL (rss->model),
459 path);
460 gtk_tree_path_free (path);
462 /* Setup accelerator */
463 if (rss->shortcut_key_idx < 12)
465 gchar *accel = g_strdup_printf ("<Ctrl>F%d", rss->shortcut_key_idx);
466 gtk_action_set_accel_group (GTK_ACTION (new_style->action),
467 rss->accel_group);
468 gtk_action_group_add_action_with_accel (rss->action_group,
469 GTK_ACTION (new_style->action),
470 accel);
471 g_free (accel);
472 ++rss->shortcut_key_idx;
475 /* Hookup and install radio button */
476 g_object_set_data (G_OBJECT (new_style->action), "route-style", new_style);
477 new_style->sig_id = g_signal_connect (G_OBJECT (new_style->action),
478 "activate",
479 G_CALLBACK (radio_select_cb), rss);
480 gtk_box_pack_start (GTK_BOX (rss), new_style->button, FALSE, FALSE, 0);
482 g_free (action_name);
483 ++action_count;
484 return new_style;
487 /*! \brief Adds a route style to a GHidRouteStyleSelector
488 * \par Function Description
489 * Adds a new route style to be managed by this selector. Note
490 * that the route style object passed to this function will be
491 * updated directly.
493 * \param [in] rss The selector to be acted on
494 * \param [in] data PCB's route style object describing the style
496 void
497 ghid_route_style_selector_add_route_style (GHidRouteStyleSelector *rss,
498 RouteStyleType *data)
500 ghid_route_style_selector_real_add_route_style (rss, data, FALSE);
504 /*! \brief Install the "Route Style" menu items
505 * \par Function Description
506 * Takes a menu shell and installs menu items for route style selection in
507 * the shell, at the given position. Note that we aren't really guaranteed
508 * the ordering of these items, since our internal data structure is a hash
509 * table. This shouldn't be a problem.
511 * \param [in] rss The selector to be acted on
512 * \param [in] shell The menu to install the items in
513 * \param [in] pos The position in the menu to install items
515 * \return the number of items installed
517 gint
518 ghid_route_style_selector_install_items (GHidRouteStyleSelector *rss,
519 GtkMenuShell *shell, gint pos)
521 gint n = 0;
522 GtkTreeIter iter;
524 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (rss->model), &iter);
527 GtkAction *action;
528 struct _route_style *style;
530 gtk_tree_model_get (GTK_TREE_MODEL (rss->model),
531 &iter, DATA_COL, &style, -1);
532 action = GTK_ACTION (style->action);
533 style->menu_item = gtk_action_create_menu_item (action);
534 gtk_menu_shell_insert (shell, style->menu_item, pos + n);
535 ++n;
537 while (gtk_tree_model_iter_next (GTK_TREE_MODEL (rss->model), &iter));
539 return n;
542 /*! \brief Selects a route style and emits a select-style signal
544 * \param [in] rss The selector to be acted on
545 * \param [in] rst The style to select
547 * \return TRUE if a style was selected, FALSE otherwise
549 gboolean
550 ghid_route_style_selector_select_style (GHidRouteStyleSelector *rss,
551 RouteStyleType *rst)
553 GtkTreeIter iter;
554 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (rss->model), &iter);
557 struct _route_style *style;
558 gtk_tree_model_get (GTK_TREE_MODEL (rss->model),
559 &iter, DATA_COL, &style, -1);
560 if (style->rst == rst)
562 g_signal_handler_block (G_OBJECT (style->action), style->sig_id);
563 gtk_toggle_action_set_active
564 (GTK_TOGGLE_ACTION (style->action), TRUE);
565 g_signal_handler_unblock (G_OBJECT (style->action), style->sig_id);
566 rss->active_style = style;
567 g_signal_emit
568 (rss, ghid_route_style_selector_signals[SELECT_STYLE_SIGNAL],
569 0, rss->active_style->rst);
570 return TRUE;
573 while (gtk_tree_model_iter_next (GTK_TREE_MODEL (rss->model), &iter));
575 return FALSE;
578 /*! \brief Returns the GtkAccelGroup of a route style selector
579 * \par Function Description
581 * \param [in] rss The selector to be acted on
583 * \return the accel group of the selector
585 GtkAccelGroup *
586 ghid_route_style_selector_get_accel_group (GHidRouteStyleSelector *rss)
588 return rss->accel_group;
591 /*! \brief Sets a GHidRouteStyleSelector selection to given values
592 * \par Function Description
593 * Given the line thickness, via size and clearance values of a route
594 * style, this function selects a route style with the given values.
595 * If there is no such style registered with the selector, nothing
596 * will happen. This function does not emit any signals.
598 * \param [in] rss The selector to be acted on
599 * \param [in] Thick Coord to match selection to
600 * \param [in] Hole Coord to match selection to
601 * \param [in] Diameter Coord to match selection to
602 * \param [in] Keepaway Coord to match selection to
604 void
605 ghid_route_style_selector_sync (GHidRouteStyleSelector *rss,
606 Coord Thick, Coord Hole,
607 Coord Diameter, Coord Keepaway)
609 gboolean found_match = FALSE;
610 GtkTreeIter iter;
611 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (rss->model), &iter);
614 struct _route_style *style;
615 gtk_tree_model_get (GTK_TREE_MODEL (rss->model),
616 &iter, DATA_COL, &style, -1);
617 if (style->rst->Thick == Thick &&
618 style->rst->Hole == Hole &&
619 style->rst->Diameter == Diameter &&
620 style->rst->Keepaway == Keepaway)
622 g_signal_handler_block (G_OBJECT (style->action), style->sig_id);
623 gtk_toggle_action_set_active
624 (GTK_TOGGLE_ACTION (style->action), TRUE);
625 g_signal_handler_unblock (G_OBJECT (style->action), style->sig_id);
626 rss->active_style = style;
627 found_match = TRUE;
630 while (gtk_tree_model_iter_next (GTK_TREE_MODEL (rss->model), &iter));
632 if (!found_match)
633 gtk_radio_action_set_current_value (rss->null_action, -1);
636 /*! \brief Removes all styles from a route style selector */
637 void
638 ghid_route_style_selector_empty (GHidRouteStyleSelector *rss)
640 GtkTreeIter iter;
641 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (rss->model), &iter);
644 struct _route_style *rsdata;
645 gtk_tree_model_get (GTK_TREE_MODEL (rss->model),
646 &iter, DATA_COL, &rsdata, -1);
647 if (rsdata->action)
649 gtk_action_group_remove_action (rss->action_group,
650 GTK_ACTION (rsdata->action));
651 g_object_unref (G_OBJECT (rsdata->action));
653 if (rsdata->button)
654 gtk_widget_destroy (GTK_WIDGET (rsdata->button));
655 if (rsdata->menu_item)
656 gtk_widget_destroy (GTK_WIDGET (rsdata->menu_item));
657 if (rsdata->temporary)
659 free (rsdata->rst->Name);
660 g_free (rsdata->rst);
662 gtk_tree_row_reference_free (rsdata->rref);
663 free (rsdata);
665 while (gtk_list_store_remove (rss->model, &iter));
666 rss->action_radio_group = NULL;
667 rss->button_radio_group = NULL;
668 rss->shortcut_key_idx = 1;
669 init_radio_groups (rss);