1 /*! \file <gtk-pcb-route-style-selector.c>
2 * \brief Implementation of GHidRouteStyleSelector widget
4 * Please write description here.
8 #include <glib-object.h>
9 #include <gdk/gdkkeysyms.h>
15 #include "pcb-printf.h"
17 #include "ghid-route-style-selector.h"
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 */
35 /*! \brief Columns used for internal data store */
42 static GtkVBox
*ghid_route_style_selector_parent_class
;
43 static guint ghid_route_style_selector_signals
[LAST_SIGNAL
] = { 0 };
45 struct _GHidRouteStyleSelector
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
;
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
);
74 GtkRadioAction
*action
;
77 GtkTreeRowReference
*rref
;
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
));
94 /*! \brief Callback for user selection of a route style */
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
);
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
122 * \param [in] combo The combobox
123 * \param [in] dialog The rest of the widgets to be updated
126 dialog_style_changed_cb (GtkComboBox
*combo
, struct _dialog
*dialog
)
128 struct _route_style
*style
;
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);
136 gtk_entry_set_text (GTK_ENTRY (dialog
->name_entry
),
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
),
144 ghid_coord_entry_set_value (GHID_COORD_ENTRY (dialog
->via_hole_entry
),
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 */
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 */
170 ghid_route_style_selector_edit_dialog (GHidRouteStyleSelector
*rss
)
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
));
178 GtkWidget
*content_area
;
179 GtkWidget
*vbox
, *hbox
, *sub_vbox
, *table
;
180 GtkWidget
*label
, *select_box
, *check_box
;
183 dialog
= gtk_dialog_new_with_buttons (_("Edit Route Styles"),
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"),
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"),
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);
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
)
256 struct _route_style
*style
;
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);
262 rst
= g_malloc (sizeof *rst
);
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
));
282 style
= ghid_route_style_selector_real_add_route_style
286 gtk_action_set_label (GTK_ACTION (style
->action
), rst
->Name
);
287 gtk_list_store_set (rss
->model
, &iter
, TEXT_COL
, rst
->Name
, -1);
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
);
296 (rss
, ghid_route_style_selector_signals
[STYLE_EDITED_SIGNAL
],
301 gtk_widget_destroy (dialog
);
302 gtk_list_store_remove (rss
->model
, &tmp_iter
);
305 /* end EDIT DIALOG */
308 edit_button_cb (GtkButton
*btn
, GHidRouteStyleSelector
*rss
)
310 ghid_route_style_selector_edit_dialog (rss
);
315 ghid_route_style_selector_init (GHidRouteStyleSelector
*rss
)
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
),
332 g_cclosure_marshal_VOID__POINTER
, G_TYPE_NONE
,
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
),
340 g_cclosure_marshal_VOID__BOOLEAN
, G_TYPE_NONE
,
343 object_class
->finalize
= ghid_route_style_selector_finalize
;
346 /*! \brief Clean up object before garbage collection
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 */
363 ghid_route_style_selector_get_type (void)
365 static GType rss_type
= 0;
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
),
379 (GInstanceInitFunc
) ghid_route_style_selector_init
,
382 rss_type
= g_type_register_static (GTK_TYPE_VBOX
,
383 "GHidRouteStyleSelector",
391 /*! \brief Create a new GHidRouteStyleSelector
393 * \return a freshly-allocated GHidRouteStyleSelector.
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", "",
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
,
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
),
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
),
468 gtk_action_group_add_action_with_accel (rss
->action_group
,
469 GTK_ACTION (new_style
->action
),
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
),
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
);
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
493 * \param [in] rss The selector to be acted on
494 * \param [in] data PCB's route style object describing the style
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
518 ghid_route_style_selector_install_items (GHidRouteStyleSelector
*rss
,
519 GtkMenuShell
*shell
, gint pos
)
524 gtk_tree_model_get_iter_first (GTK_TREE_MODEL (rss
->model
), &iter
);
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
);
537 while (gtk_tree_model_iter_next (GTK_TREE_MODEL (rss
->model
), &iter
));
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
550 ghid_route_style_selector_select_style (GHidRouteStyleSelector
*rss
,
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
;
568 (rss
, ghid_route_style_selector_signals
[SELECT_STYLE_SIGNAL
],
569 0, rss
->active_style
->rst
);
573 while (gtk_tree_model_iter_next (GTK_TREE_MODEL (rss
->model
), &iter
));
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
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
605 ghid_route_style_selector_sync (GHidRouteStyleSelector
*rss
,
606 Coord Thick
, Coord Hole
,
607 Coord Diameter
, Coord Keepaway
)
609 gboolean found_match
= FALSE
;
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
;
630 while (gtk_tree_model_iter_next (GTK_TREE_MODEL (rss
->model
), &iter
));
633 gtk_radio_action_set_current_value (rss
->null_action
, -1);
636 /*! \brief Removes all styles from a route style selector */
638 ghid_route_style_selector_empty (GHidRouteStyleSelector
*rss
)
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);
649 gtk_action_group_remove_action (rss
->action_group
,
650 GTK_ACTION (rsdata
->action
));
651 g_object_unref (G_OBJECT (rsdata
->action
));
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
);
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
);