From 9026f2088d1e223b44dd5ce06a2fb04a69e42844 Mon Sep 17 00:00:00 2001
From: Edward Hennessy <[EMAIL PROTECTED]>
Date: Sun, 3 Aug 2008 20:11:06 -0700
Subject: [PATCH] Converted toolbar to use GtkAction.
* Added GtkAction/s for all toolbar functions. Placed drawing functions into
a radio group.
* Toolbar items now generated from GtkAction/s. Removed calls to deprecated
gtk_toolbar_append_item().
* Modified i_toolbar_update() to keep radio actions in sync with event_state.
* Added new toolbar actions for copy, mirror, move, and rotate.
---
gschem/include/Makefile.am | 2 +-
gschem/include/gschem_struct.h | 9 +-
gschem/include/i_basic.h | 55 +++++
gschem/include/prototype.h | 20 +--
gschem/include/x_icons.h | 4 +
gschem/src/gschem_toplevel.c | 9 +-
gschem/src/i_basic.c | 142 +++++++++----
gschem/src/i_callbacks.c | 104 ++++++++-
gschem/src/x_icons.c | 4 +
gschem/src/x_window.c | 451 +++++++++++++++++++++++++---------------
10 files changed, 544 insertions(+), 256 deletions(-)
create mode 100644 gschem/include/i_basic.h
diff --git a/gschem/include/Makefile.am b/gschem/include/Makefile.am
index 1392507..6ee5cee 100644
--- a/gschem/include/Makefile.am
+++ b/gschem/include/Makefile.am
@@ -5,7 +5,7 @@
noinst_HEADERS = \
globals.h i_vars.h prototype.h x_dialog.h x_states.h \
gettext.h \
- x_compselect.h x_icons.h \
+ x_compselect.h x_icons.h i_basic.h \
x_log.h x_multiattrib.h x_pagesel.h x_print.h x_preview.h \
gschem_dialog.h \
gschem_struct.h
diff --git a/gschem/include/gschem_struct.h b/gschem/include/gschem_struct.h
index c238d7e..534110f 100644
--- a/gschem/include/gschem_struct.h
+++ b/gschem/include/gschem_struct.h
@@ -26,10 +26,6 @@ struct st_gschem_toplevel {
GtkWidget *grid_label;
GtkWidget *status_label;
- GtkWidget *toolbar_select;
- GtkWidget *toolbar_net;
- GtkWidget *toolbar_bus;
-
gchar *keyaccel_string; /* visual feedback when pressing
keyboard accelerators */
@@ -60,6 +56,11 @@ struct st_gschem_toplevel {
GtkWidget *coord_world; /* World coordinate label */
GtkWidget *coord_screen; /* Screen coordinate window */
+ /* ------- */
+ /* Actions */
+ /* ------- */
+ GtkActionGroup *actions;
+
/* ----------------- */
/* Picture placement */
/* ----------------- */
diff --git a/gschem/include/i_basic.h b/gschem/include/i_basic.h
new file mode 100644
index 0000000..0db16e8
--- /dev/null
+++ b/gschem/include/i_basic.h
@@ -0,0 +1,55 @@
+/**
+ * Names for all Gschem's actions.
+ */
+#define GSCHEM_ACTION_ADD_ARC "add-arc"
+#define GSCHEM_ACTION_ADD_BOX "add-box"
+#define GSCHEM_ACTION_ADD_BUS "add-bus"
+#define GSCHEM_ACTION_ADD_CIRCLE "add-circle"
+#define GSCHEM_ACTION_ADD_COMPONENT "add-component"
+#define GSCHEM_ACTION_ADD_LINE "add-line"
+#define GSCHEM_ACTION_ADD_NET "add-net"
+#define GSCHEM_ACTION_ADD_PIN "add-pin"
+#define GSCHEM_ACTION_ADD_TEXT "add-text"
+#define GSCHEM_ACTION_EDIT_COPY "edit-copy"
+#define GSCHEM_ACTION_EDIT_MIRROR "edit-mirror"
+#define GSCHEM_ACTION_EDIT_MOVE "edit-move"
+#define GSCHEM_ACTION_EDIT_REDO "edit-redo"
+#define GSCHEM_ACTION_EDIT_ROTATE "edit-rotate"
+#define GSCHEM_ACTION_EDIT_SELECT "edit-select"
+#define GSCHEM_ACTION_EDIT_UNDO "edit-undo"
+#define GSCHEM_ACTION_FILE_NEW "file-new"
+#define GSCHEM_ACTION_FILE_OPEN "file-open"
+#define GSCHEM_ACTION_FILE_SAVE "file-save"
+#define GSCHEM_ACTION_HIERARCHY_DOWN_SCHEMATIC "hierarchy-down-schematic"
+#define GSCHEM_ACTION_HIERARCHY_DOWN_SYMBOL "hierarchy-down-symbol"
+#define GSCHEM_ACTION_HIERARCHY_UP "hierarchy-up"
+#define GSCHEM_ACTION_NULL "null-action"
+#define GSCHEM_ACTION_VIEW_ZOOM_IN "view-zoom-in"
+#define GSCHEM_ACTION_VIEW_ZOOM_OUT "view-zoom-out"
+
+/**
+ * Enumerate all the tools (drawing modes) for a GtkRadioAction group.
+ *
+ * TOOL_OTHER, not a real tool, provides a mechanism to cancel all other radio
+ * actions.
+ */
+#define TOOL_SELECT 0
+
+#define TOOL_ARC 1
+#define TOOL_BOX 2
+#define TOOL_BUS 3
+#define TOOL_CIRCLE 4
+#define TOOL_COMPONENT 5
+#define TOOL_COPY 6
+#define TOOL_LINE 7
+#define TOOL_MIRROR 8
+#define TOOL_MOVE 9
+#define TOOL_NET 10
+#define TOOL_PICTURE 11
+#define TOOL_PIN 12
+#define TOOL_ROTATE 13
+#define TOOL_TEXT 14
+#define TOOL_ZOOM 15
+
+#define TOOL_OTHER 99
+
diff --git a/gschem/include/prototype.h b/gschem/include/prototype.h
index e3a1234..917a2b8 100644
--- a/gschem/include/prototype.h
+++ b/gschem/include/prototype.h
@@ -305,13 +305,10 @@ void i_set_filename(GSCHEM_TOPLEVEL *w_current, const
gchar *string);
void i_set_grid(GSCHEM_TOPLEVEL *w_current, int visible_grid);
/* i_callbacks.c */
void i_callback_file_new(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
-void i_callback_action_file_new(GtkWidget *widget, gpointer data);
void i_callback_file_new_window(SCM rest, gpointer data, guint
callback_action, GtkWidget *widget);
void i_callback_file_open(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
-void i_callback_action_file_open(GtkWidget *widget, gpointer data);
void i_callback_file_script(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
void i_callback_file_save(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
-void i_callback_action_file_save(GtkWidget *widget, gpointer data);
void i_callback_file_save_all(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
void i_callback_file_save_as(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
void i_callback_file_print(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
@@ -320,9 +317,7 @@ void i_callback_file_close(SCM rest, gpointer data, guint
callback_action, GtkWi
int i_callback_close(gpointer data, guint callback_action, GtkWidget *widget);
void i_callback_file_quit(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
void i_callback_edit_undo(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
-void i_callback_action_edit_undo(GtkWidget *widget, gpointer data);
void i_callback_edit_redo(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
-void i_callback_action_edit_redo(GtkWidget *widget, gpointer data);
void i_callback_edit_select(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
void i_callback_action_edit_select(GtkWidget *widget, gpointer data);
void i_callback_edit_copy(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
@@ -400,17 +395,13 @@ void i_callback_buffer_paste3_hotkey(SCM rest, gpointer
data, guint callback_act
void i_callback_buffer_paste4_hotkey(SCM rest, gpointer data, guint
callback_action, GtkWidget *widget);
void i_callback_buffer_paste5_hotkey(SCM rest, gpointer data, guint
callback_action, GtkWidget *widget);
void i_callback_add_component(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
-void i_callback_action_add_component(GtkWidget *widget, gpointer data);
void i_callback_add_attribute(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
void i_callback_add_attribute_hotkey(SCM rest, gpointer data, guint
callback_action, GtkWidget *widget);
void i_callback_add_net(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
void i_callback_add_net_hotkey(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
-void i_callback_action_add_net(GtkWidget *widget, gpointer data);
void i_callback_add_bus(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
void i_callback_add_bus_hotkey(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
-void i_callback_action_add_bus(GtkWidget *widget, gpointer data);
void i_callback_add_text(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
-void i_callback_action_add_text(GtkWidget *widget, gpointer data);
void i_callback_add_line(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
void i_callback_add_line_hotkey(SCM rest, gpointer data, guint
callback_action, GtkWidget *widget);
void i_callback_add_box(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
@@ -452,16 +443,7 @@ void i_callback_help_about(SCM rest, gpointer data, guint
callback_action, GtkWi
void i_callback_help_hotkeys(SCM rest, gpointer data, guint callback_action,
GtkWidget *widget);
void i_callback_options_show_coord_window(SCM rest, gpointer data, guint
callback_action, GtkWidget *widget);
gboolean i_callback_close_wm(GtkWidget *widget, GdkEvent *event, gpointer
data);
-void i_callback_action_add_arc(GtkWidget *widget, gpointer data);
-void i_callback_action_add_box(GtkWidget *widget, gpointer data);
-void i_callback_action_add_circle(GtkWidget *widget, gpointer data);
-void i_callback_action_add_line(GtkWidget *widget, gpointer data);
-void i_callback_action_add_pin(GtkWidget *widget, gpointer data);
-void i_callback_action_hierarchy_down_schematic(GtkWidget *widget, gpointer
data);
-void i_callback_action_hierarchy_down_symbol(GtkWidget *widget, gpointer data);
-void i_callback_action_hierarchy_up(GtkWidget *widget, gpointer data);
-void i_callback_action_view_zoom_in(GtkWidget *widget, gpointer data);
-void i_callback_action_view_zoom_out(GtkWidget *widget, gpointer data);
+void i_callback_connect_signals(GSCHEM_TOPLEVEL *w_current);
/* i_vars.c */
void i_vars_set(GSCHEM_TOPLEVEL *w_current);
/* o_arc.c */
diff --git a/gschem/include/x_icons.h b/gschem/include/x_icons.h
index 7194505..cb42e42 100644
--- a/gschem/include/x_icons.h
+++ b/gschem/include/x_icons.h
@@ -5,12 +5,16 @@
#define GSCHEM_STOCK_BUS "gschem-bus"
#define GSCHEM_STOCK_CIRCLE "gschem-circle"
#define GSCHEM_STOCK_COMPONENT "gschem-component"
+#define GSCHEM_STOCK_COPY "gschem-copy"
#define GSCHEM_STOCK_DOWN_SCHEMATIC "gschem-down-schematic"
#define GSCHEM_STOCK_DOWN_SYMBOL "gschem-down-symbol"
#define GSCHEM_STOCK_LINE "gschem-line"
#define GSCHEM_STOCK_NET "gschem-net"
+#define GSCHEM_STOCK_MIRROR "gschem-mirror"
+#define GSCHEM_STOCK_MOVE "gschem-move"
#define GSCHEM_STOCK_PICTURE "gschem-picture"
#define GSCHEM_STOCK_PIN "gschem-pin"
+#define GSCHEM_STOCK_ROTATE "gschem-rotate"
#define GSCHEM_STOCK_SELECT "gschem-select"
#define GSCHEM_STOCK_TEXT "gschem-text"
#define GSCHEM_STOCK_UP "gschem-up"
diff --git a/gschem/src/gschem_toplevel.c b/gschem/src/gschem_toplevel.c
index c05c933..b993334 100644
--- a/gschem/src/gschem_toplevel.c
+++ b/gschem/src/gschem_toplevel.c
@@ -49,10 +49,6 @@ GSCHEM_TOPLEVEL *gschem_toplevel_new ()
w_current->grid_label = NULL;
w_current->status_label = NULL;
- w_current->toolbar_select = NULL;
- w_current->toolbar_net = NULL;
- w_current->toolbar_bus = NULL;
-
w_current->keyaccel_string = NULL;
/* ------------ */
@@ -82,6 +78,11 @@ GSCHEM_TOPLEVEL *gschem_toplevel_new ()
w_current->coord_world = NULL;
w_current->coord_screen = NULL;
+ /* ------- */
+ /* Actions */
+ /* ------- */
+ w_current->actions = NULL;
+
/* ----------------- */
/* Picture placement */
/* ----------------- */
diff --git a/gschem/src/i_basic.c b/gschem/src/i_basic.c
index 2c43eb2..cd1b888 100644
--- a/gschem/src/i_basic.c
+++ b/gschem/src/i_basic.c
@@ -27,6 +27,7 @@
#include "../include/gschem_struct.h"
#include "../include/globals.h"
+#include "../include/i_basic.h"
#include "../include/prototype.h"
#ifdef HAVE_LIBDMALLOC
@@ -283,80 +284,127 @@ void i_update_middle_button(GSCHEM_TOPLEVEL *w_current,
}
}
-/*! \todo Finish function documentation!!!
- * \brief
- * \param [in] w_current GSCHEM_TOPLEVEL structure
+/*! \brief Updates radio actions on the toolbar to reflect the current state.
+ *
+ * The tool state can be changed by other means besides activating the
+ * GtkAction. This function updates the toolbar to ensure the radio actions
+ * stay in sync with the current state.
*
+ * \param [in] w_current GSCHEM_TOPLEVEL structure
*/
void i_update_toolbar(GSCHEM_TOPLEVEL *w_current)
{
- if (!w_current->toolbars)
- return;
+ GtkRadioAction *action;
+
+ g_assert(w_current != NULL);
+ g_assert(w_current->actions != NULL);
+
+ action = GTK_RADIO_ACTION(gtk_action_group_get_action(
+ w_current->actions, GSCHEM_ACTION_EDIT_SELECT));
switch(w_current->event_state) {
case(NONE):
case(SELECT):
case(STARTSELECT):
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
- w_current->toolbar_select), TRUE);
+ case(GRIPS):
+ gtk_radio_action_set_current_value(action, TOOL_SELECT);
break;
- case(DRAWNET):
- case(STARTDRAWNET):
- case(NETCONT):
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
- w_current->toolbar_net), TRUE);
+ case(DRAWARC):
+ case(ENDARC):
+ gtk_radio_action_set_current_value(action, TOOL_ARC);
break;
-
+
+ case(DRAWBOX):
+ case(ENDBOX):
+ gtk_radio_action_set_current_value(action, TOOL_BOX);
+ break;
+
case(DRAWBUS):
case(STARTDRAWBUS):
case(BUSCONT):
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
- w_current->toolbar_bus), TRUE);
+ gtk_radio_action_set_current_value(action, TOOL_BUS);
+ break;
+
+ case(DRAWCIRCLE):
+ case(ENDCIRCLE):
+ gtk_radio_action_set_current_value(action, TOOL_CIRCLE);
+ break;
+
+ case(DRAWCOMP):
+ case(ENDCOMP):
+ gtk_radio_action_set_current_value(action, TOOL_COMPONENT);
+ break;
+
+ case(DRAWLINE):
+ case(ENDLINE):
+ gtk_radio_action_set_current_value(action, TOOL_LINE);
+ break;
+
+ case(DRAWNET):
+ case(STARTDRAWNET):
+ case(NETCONT):
+ gtk_radio_action_set_current_value(action, TOOL_NET);
break;
- case(DRAWCOMP): /*! \todo */
- case(DRAWLINE): /*! \todo */
- case(DRAWBOX): /*! \todo */
case(DRAWPICTURE): /*! \todo */
- case(DRAWPIN): /*! \todo */
- case(DRAWCIRCLE): /*! \todo */
- case(DRAWARC): /*! \todo */
- case(MOVE): /*! \todo */
- case(COPY): /*! \todo */
- case(ZOOM): /*! \todo */
- case(PAN): /*! \todo */
- case(STARTPAN): /*! \todo */
- case(STARTCOPY): /*! \todo */
- case(STARTMOVE): /*! \todo */
- case(ENDCOPY): /*! \todo */
- case(ENDMOVE): /*! \todo */
- case(ENDLINE): /*! \todo */
- case(ENDBOX): /*! \todo */
case(ENDPICTURE): /*! \todo */
- case(ENDCIRCLE): /*! \todo */
- case(ENDARC): /*! \todo */
- case(ENDPIN): /*! \todo */
- case(ENDCOMP): /*! \todo */
- case(DRAWTEXT): /*! \todo */
- case(ENDTEXT): /*! \todo */
- case(ENDROTATEP): /*! \todo */
- case(ENDMIRROR): /*! \todo */
- case(ZOOMBOXSTART): /*! \todo */
- case(ZOOMBOXEND): /*! \todo */
+ gtk_radio_action_set_current_value(action, TOOL_OTHER);
+ break;
+
+ case(DRAWPIN):
+ case(ENDPIN):
+ gtk_radio_action_set_current_value(action, TOOL_PIN);
+ break;
+
+ case(DRAWTEXT):
+ case(ENDTEXT):
+ gtk_radio_action_set_current_value(action, TOOL_TEXT);
+ break;
+
+ case(STARTMOVE):
+ case(MOVE):
+ case(ENDMOVE):
+ gtk_radio_action_set_current_value(action, TOOL_MOVE);
+ break;
+
+ case(STARTCOPY):
+ case(COPY):
+ case(ENDCOPY):
+ gtk_radio_action_set_current_value(action, TOOL_COPY);
+ break;
+
+ case(STARTPAN): /*! \todo */
+ case(PAN): /*! \todo */
+ gtk_radio_action_set_current_value(action, TOOL_OTHER);
+ break;
+
+ case(ENDROTATEP):
+ gtk_radio_action_set_current_value(action, TOOL_ROTATE);
+ break;
+
+ case(ENDMIRROR):
+ gtk_radio_action_set_current_value(action, TOOL_MIRROR);
+ break;
+
+ case(ZOOMBOXSTART):
+ case(ZOOM):
+ case(ZOOMBOXEND):
+ gtk_radio_action_set_current_value(action, TOOL_OTHER);
+ break;
+
case(STARTROUTENET): /*! \todo */
case(ENDROUTENET): /*! \todo */
case(MOUSEPAN): /*! \todo */
case(STARTPASTE): /*! \todo */
case(ENDPASTE): /*! \todo */
- case(GRIPS): /*! \todo */
- case(MCOPY): /*! \todo */
+
case(STARTMCOPY): /*! \todo */
+ case(MCOPY): /*! \todo */
case(ENDMCOPY): /*! \todo */
+
default:
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(
- w_current->toolbar_select), TRUE);
- break;
+ gtk_radio_action_set_current_value(action, TOOL_OTHER);
}
}
diff --git a/gschem/src/i_callbacks.c b/gschem/src/i_callbacks.c
index 22e9e1f..8c59afd 100644
--- a/gschem/src/i_callbacks.c
+++ b/gschem/src/i_callbacks.c
@@ -31,6 +31,7 @@
#include "../include/gschem_struct.h"
#include "../include/globals.h"
+#include "../include/i_basic.h"
#include "../include/prototype.h"
#ifdef HAVE_LIBDMALLOC
@@ -149,9 +150,13 @@ static void initiate_gschemdoc(const char*
documentation,const char *device,
/* Create adapters for GtkAction "activate" signal handlers. These functions
* adapt the GtkAction "activate" function signature to the classic i_callback
* function signature.
+ *
+ * GtkRadioAction handlers requires a special function. The GtkRadioAction
+ * emits a "activate" signal both when activated and deactivated. The classic
+ * i_callback function must only be called when the action is activated.
*/
#define ACTION_ADAPTER(name) \
-void i_callback_action_ ## name (GtkWidget *widget, gpointer data) \
+static void i_callback_action_ ## name (GtkWidget *widget, gpointer data) \
{ \
GSCHEM_TOPLEVEL *w_current; \
g_assert(data != NULL); \
@@ -161,13 +166,32 @@ void i_callback_action_ ## name (GtkWidget *widget,
gpointer data) \
} \
}
-ACTION_ADAPTER(add_arc)
-ACTION_ADAPTER(add_box)
-ACTION_ADAPTER(add_circle)
-ACTION_ADAPTER(add_component)
-ACTION_ADAPTER(add_line)
-ACTION_ADAPTER(add_pin)
-ACTION_ADAPTER(add_text)
+#define RADIO_ACTION_ADAPTER(name) \
+static void i_callback_action_ ## name (GtkWidget *widget, gpointer data) \
+{ \
+ GSCHEM_TOPLEVEL *w_current; \
+ g_assert(data != NULL); \
+ g_assert(widget != NULL); \
+ if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(widget))) { \
+ w_current = (GSCHEM_TOPLEVEL*) data; \
+ if (w_current->window != NULL) { \
+ i_callback_ ## name (SCM_EOL, data, 0, NULL); \
+ } \
+ } \
+}
+
+RADIO_ACTION_ADAPTER(add_arc)
+RADIO_ACTION_ADAPTER(add_box)
+RADIO_ACTION_ADAPTER(add_circle)
+RADIO_ACTION_ADAPTER(add_component)
+RADIO_ACTION_ADAPTER(add_line)
+RADIO_ACTION_ADAPTER(add_pin)
+RADIO_ACTION_ADAPTER(add_text)
+RADIO_ACTION_ADAPTER(edit_copy)
+RADIO_ACTION_ADAPTER(edit_mirror)
+RADIO_ACTION_ADAPTER(edit_move)
+RADIO_ACTION_ADAPTER(edit_rotate_90)
+
ACTION_ADAPTER(edit_redo)
ACTION_ADAPTER(edit_undo)
ACTION_ADAPTER(file_new)
@@ -503,7 +527,7 @@ void i_callback_action_edit_select(GtkWidget* widget,
gpointer data)
exit_if_null(w_current);
if (!w_current->window) return;
- if (GTK_TOGGLE_BUTTON (widget)->active) {
+ if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(widget))) {
if (!o_erase_rubber(w_current)) {
i_callback_cancel(SCM_EOL, w_current, 0, NULL);
}
@@ -526,6 +550,7 @@ DEFINE_I_CALLBACK(edit_copy)
if (o_select_return_first_object(w_current)) {
o_redraw_cleanstates(w_current);
i_set_state(w_current, STARTCOPY);
+ i_update_toolbar(w_current);
} else {
i_set_state_msg(w_current, SELECT, _("Select objs first"));
}
@@ -616,6 +641,7 @@ DEFINE_I_CALLBACK(edit_move)
if (o_select_return_first_object(w_current)) {
o_redraw_cleanstates(w_current);
i_set_state(w_current, STARTMOVE);
+ i_update_toolbar(w_current);
} else {
i_set_state_msg(w_current, SELECT, _("Select objs first"));
}
@@ -775,6 +801,7 @@ DEFINE_I_CALLBACK(edit_rotate_90)
i_set_state(w_current, ENDROTATEP);
i_update_middle_button(w_current, i_callback_edit_rotate_90, _("Rotate"));
+ i_update_toolbar(w_current);
}
/*! \todo Finish function documentation!!!
@@ -843,6 +870,7 @@ DEFINE_I_CALLBACK(edit_mirror)
i_set_state(w_current, ENDMIRROR);
i_update_middle_button(w_current, i_callback_edit_mirror, _("Mirror"));
+ i_update_toolbar(w_current);
}
/*! \todo Finish function documentation!!!
@@ -2330,7 +2358,7 @@ void i_callback_action_add_net(GtkWidget* widget,
gpointer data)
exit_if_null(w_current);
if (!w_current->window) return;
- if (GTK_TOGGLE_BUTTON (widget)->active) {
+ if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(widget))) {
i_callback_add_net(SCM_EOL, data, 0, NULL);
}
}
@@ -2401,7 +2429,7 @@ void i_callback_action_add_bus(GtkWidget* widget,
gpointer data)
exit_if_null(w_current);
if (!w_current->window) return;
- if (GTK_TOGGLE_BUTTON (widget)->active) {
+ if (gtk_toggle_action_get_active(GTK_TOGGLE_ACTION(widget))) {
i_callback_add_bus(SCM_EOL, data, 0, NULL);
}
}
@@ -3543,3 +3571,57 @@ gboolean i_callback_close_wm ( GtkWidget *widget,
GdkEvent *event,
/* do */
return TRUE;
}
+
+
+struct _handler_entry
+{
+ gchar *action_name;
+ void (*handler)(GtkWidget*,gpointer);
+};
+
+static const struct _handler_entry handler_table[] =
+{
+ { GSCHEM_ACTION_ADD_ARC, i_callback_action_add_arc },
+ { GSCHEM_ACTION_ADD_BOX, i_callback_action_add_box },
+ { GSCHEM_ACTION_ADD_BUS, i_callback_action_add_bus },
+ { GSCHEM_ACTION_ADD_CIRCLE, i_callback_action_add_circle },
+ { GSCHEM_ACTION_ADD_COMPONENT, i_callback_action_add_component },
+ { GSCHEM_ACTION_ADD_LINE, i_callback_action_add_line },
+ { GSCHEM_ACTION_ADD_NET, i_callback_action_add_net },
+ { GSCHEM_ACTION_ADD_PIN, i_callback_action_add_pin },
+ { GSCHEM_ACTION_ADD_TEXT, i_callback_action_add_text },
+ { GSCHEM_ACTION_EDIT_COPY, i_callback_action_edit_copy },
+ { GSCHEM_ACTION_EDIT_MIRROR, i_callback_action_edit_mirror },
+ { GSCHEM_ACTION_EDIT_MOVE, i_callback_action_edit_move },
+ { GSCHEM_ACTION_EDIT_REDO, i_callback_action_edit_redo },
+ { GSCHEM_ACTION_EDIT_ROTATE, i_callback_action_edit_rotate_90 },
+ { GSCHEM_ACTION_EDIT_SELECT, i_callback_action_edit_select },
+ { GSCHEM_ACTION_EDIT_UNDO, i_callback_action_edit_undo },
+ { GSCHEM_ACTION_FILE_NEW, i_callback_action_file_new },
+ { GSCHEM_ACTION_FILE_OPEN, i_callback_action_file_open },
+ { GSCHEM_ACTION_FILE_SAVE, i_callback_action_file_save },
+ { GSCHEM_ACTION_HIERARCHY_DOWN_SCHEMATIC,
i_callback_action_hierarchy_down_schematic },
+ { GSCHEM_ACTION_HIERARCHY_DOWN_SYMBOL,
i_callback_action_hierarchy_down_symbol },
+ { GSCHEM_ACTION_HIERARCHY_UP, i_callback_action_hierarchy_up
},
+ { GSCHEM_ACTION_VIEW_ZOOM_IN, i_callback_action_view_zoom_in },
+ { GSCHEM_ACTION_VIEW_ZOOM_OUT, i_callback_action_view_zoom_out },
+};
+
+#define HANDLER_SIZE (sizeof(handler_table)/sizeof(struct _handler_entry))
+
+void i_callback_connect_signals(GSCHEM_TOPLEVEL *w_current)
+{
+ int i;
+
+ g_assert(w_current != NULL);
+ g_assert(w_current->actions != NULL);
+
+ for ( i=0; i<HANDLER_SIZE; i++ ) {
+ g_signal_connect(gtk_action_group_get_action(w_current->actions,
+ handler_table[i].action_name),
+ "activate",
+ G_CALLBACK(handler_table[i].handler),
+ w_current);
+ }
+}
+
diff --git a/gschem/src/x_icons.c b/gschem/src/x_icons.c
index c42b473..a7f27ab 100644
--- a/gschem/src/x_icons.c
+++ b/gschem/src/x_icons.c
@@ -52,11 +52,15 @@ static const icon_entry icon_table[] =
{ GSCHEM_STOCK_BUS, "gschem-bus.xpm" },
{ GSCHEM_STOCK_CIRCLE, "gschem-circle.svg" },
{ GSCHEM_STOCK_COMPONENT, "gschem-comp.xpm" },
+ { GSCHEM_STOCK_COPY, "gschem-copy.xpm" },
{ GSCHEM_STOCK_DOWN_SCHEMATIC, "gschem-down-schematic.svg" },
{ GSCHEM_STOCK_DOWN_SYMBOL, "gschem-down-symbol.svg" },
{ GSCHEM_STOCK_LINE, "gschem-line.svg" },
+ { GSCHEM_STOCK_MIRROR, "gschem-mirror.xpm" },
+ { GSCHEM_STOCK_MOVE, "gschem-move.xpm" },
{ GSCHEM_STOCK_NET, "gschem-net.xpm" },
{ GSCHEM_STOCK_PIN, "gschem-pin.svg" },
+ { GSCHEM_STOCK_ROTATE, "gschem-rotate.xpm" },
{ GSCHEM_STOCK_SELECT, "gschem-select.xpm" },
{ GSCHEM_STOCK_TEXT, "gschem-text.xpm" },
{ GSCHEM_STOCK_UP, "gschem-up.svg" },
diff --git a/gschem/src/x_window.c b/gschem/src/x_window.c
index 2aa6da1..08c180e 100644
--- a/gschem/src/x_window.c
+++ b/gschem/src/x_window.c
@@ -24,6 +24,7 @@
#include <libgeda/libgeda.h>
#include "../include/gschem_struct.h"
+#include "../include/i_basic.h"
#include "../include/i_vars.h"
#include "../include/globals.h"
#include "../include/prototype.h"
@@ -33,6 +34,7 @@
#include <dmalloc.h>
#endif
+GtkActionGroup *x_window_create_action_group(void);
static GtkWidget *x_window_create_toolbar(GSCHEM_TOPLEVEL *w_current);
/*! \todo Finish function documentation!!!
@@ -303,6 +305,11 @@ void x_window_create_main(GSCHEM_TOPLEVEL *w_current)
handlebox = gtk_handle_box_new ();
gtk_box_pack_start (GTK_BOX (main_box), handlebox, FALSE, FALSE, 0);
}
+
+ if (w_current->actions == NULL ) {
+ w_current->actions = x_window_create_action_group();
+ i_callback_connect_signals(w_current);
+ }
if (w_current->toolbars) {
toolbar = x_window_create_toolbar(w_current);
@@ -314,7 +321,6 @@ void x_window_create_main(GSCHEM_TOPLEVEL *w_current)
}
}
-
/* Try to create popup menu (appears in right mouse button */
w_current->popup_menu = (GtkWidget *) get_main_popup(w_current);
@@ -554,6 +560,8 @@ void x_window_close(GSCHEM_TOPLEVEL *w_current)
/* finally close the main window */
gtk_widget_destroy(w_current->main_window);
+ g_object_unref(w_current->actions);
+
s_toplevel_delete (toplevel);
global_window_list = g_list_remove (global_window_list, w_current);
g_free (w_current);
@@ -869,205 +877,308 @@ x_window_close_page (GSCHEM_TOPLEVEL *w_current, PAGE
*page)
}
}
-/*! \brief Create this application's main toolbar.
+/*! \brief Create this application's main action group.
*
- * \param [in] w_current The GSCHEM_TOPLEVEL. This pointer gets provided to
- * this menu's signal handlers. This function also stores references to
- * specific menu items within the GSCHEM_TOPLEVEL.
+ * \returns A pointer to this application's main action group with a ref
+ * count of 1.
*/
-static GtkWidget *x_window_create_toolbar(GSCHEM_TOPLEVEL *w_current)
+GtkActionGroup *x_window_create_action_group(void)
{
- GtkToolbar *toolbar = GTK_TOOLBAR(gtk_toolbar_new());
-
- gtk_toolbar_set_orientation(toolbar, GTK_ORIENTATION_HORIZONTAL);
-
- gtk_toolbar_set_style(toolbar, GTK_TOOLBAR_ICONS);
+ GtkAction *action;
+ GtkActionGroup *actions = gtk_action_group_new("gschem");
+ GtkRadioAction *radio;
+ GSList *group = NULL;
- gtk_toolbar_append_item(toolbar,
+ if (actions != NULL) {
+ action=gtk_action_new(GSCHEM_ACTION_FILE_NEW,
_("New"),
- _("New file"),
- "toolbar/new",
- x_icons_new_toolbar_pixmap(GTK_STOCK_NEW),
- (GtkSignalFunc) i_callback_action_file_new,
- w_current);
-
- gtk_toolbar_append_item(toolbar,
+ _("New file"),
+ GTK_STOCK_NEW);
+ gtk_action_group_add_action(actions, action);
+ g_object_unref(action);
+
+ action=gtk_action_new(GSCHEM_ACTION_FILE_OPEN,
_("Open"),
_("Open file..."),
- "toolbar/open",
- x_icons_new_toolbar_pixmap(GTK_STOCK_OPEN),
- (GtkSignalFunc) i_callback_action_file_open,
- w_current);
+ GTK_STOCK_OPEN);
+ gtk_action_group_add_action(actions, action);
+ g_object_unref(action);
- gtk_toolbar_append_item(toolbar,
+ action=gtk_action_new(GSCHEM_ACTION_FILE_SAVE,
_("Save"),
_("Save file"),
- "toolbar/save",
- x_icons_new_toolbar_pixmap(GTK_STOCK_SAVE),
- (GtkSignalFunc) i_callback_action_file_save,
- w_current);
-
- gtk_toolbar_append_space(toolbar);
+ GTK_STOCK_SAVE);
+ gtk_action_group_add_action(actions, action);
+ g_object_unref(action);
- gtk_toolbar_append_item(toolbar,
+ action=gtk_action_new(GSCHEM_ACTION_EDIT_UNDO,
_("Undo"),
_("Undo last operation"),
- "toolbar/undo",
- x_icons_new_toolbar_pixmap(GTK_STOCK_UNDO),
- (GtkSignalFunc) i_callback_action_edit_undo,
- w_current);
+ GTK_STOCK_UNDO);
+ gtk_action_group_add_action(actions, action);
+ g_object_unref(action);
- gtk_toolbar_append_item(toolbar,
+ action=gtk_action_new(GSCHEM_ACTION_EDIT_REDO,
_("Redo"),
_("Redo last undo"),
- "toolbar/redo",
- x_icons_new_toolbar_pixmap(GTK_STOCK_REDO),
- (GtkSignalFunc) i_callback_action_edit_redo,
- w_current);
-
- gtk_toolbar_append_space(toolbar);
-
- /* not part of any radio button group */
- gtk_toolbar_append_item(toolbar,
- _("Component"),
- _("Add component...\nSelect library and component
from list, move the mouse into main window, click to place\nRight mouse button
to cancel"),
- "toolbar/component",
- x_icons_new_toolbar_pixmap(GSCHEM_STOCK_COMPONENT),
- (GtkSignalFunc) i_callback_action_add_component,
- w_current);
-
- w_current->toolbar_net =
- gtk_toolbar_append_element(toolbar,
- GTK_TOOLBAR_CHILD_RADIOBUTTON,
- NULL,
- _("Nets"),
- _("Add nets mode\nRight mouse button to
cancel"),
- "toolbar/nets",
- x_icons_new_toolbar_pixmap(GSCHEM_STOCK_NET),
- (GtkSignalFunc) i_callback_action_add_net,
- w_current);
-
- w_current->toolbar_bus =
- gtk_toolbar_append_element(toolbar,
- GTK_TOOLBAR_CHILD_RADIOBUTTON,
- w_current->toolbar_net,
- _("Bus"),
- _("Add buses mode\nRight mouse button to
cancel"),
- "toolbar/bus",
- x_icons_new_toolbar_pixmap(GSCHEM_STOCK_BUS),
- (GtkSignalFunc) i_callback_action_add_bus,
- w_current);
-
- /* not part of any radio button group */
- gtk_toolbar_append_item(toolbar,
- _("Text"),
- _("Add Text..."),
- "toolbar/text",
- x_icons_new_toolbar_pixmap(GSCHEM_STOCK_TEXT),
- (GtkSignalFunc) i_callback_action_add_text,
- w_current);
-
- gtk_toolbar_append_space(toolbar);
-
- w_current->toolbar_select =
- gtk_toolbar_append_element(toolbar,
- GTK_TOOLBAR_CHILD_RADIOBUTTON,
- w_current->toolbar_bus,
- _("Select"),
- _("Select mode"),
- "toolbar/select",
- x_icons_new_toolbar_pixmap(GSCHEM_STOCK_SELECT),
- (GtkSignalFunc) i_callback_action_edit_select,
- w_current);
-
- gtk_toolbar_append_space(toolbar);
-
- gtk_toolbar_append_item(toolbar,
- _("Arc"),
- _("Add Arc"),
- "toolbar/arc",
- x_icons_new_toolbar_pixmap(GSCHEM_STOCK_ARC),
- (GtkSignalFunc) i_callback_action_add_arc,
- w_current);
-
- gtk_toolbar_append_item(toolbar,
- _("Box"),
- _("Add Box"),
- "toolbar/box",
- x_icons_new_toolbar_pixmap(GSCHEM_STOCK_BOX),
- (GtkSignalFunc) i_callback_action_add_box,
- w_current);
-
- gtk_toolbar_append_item(toolbar,
- _("Circle"),
- _("Add Circle"),
- "toolbar/circle",
- x_icons_new_toolbar_pixmap(GSCHEM_STOCK_CIRCLE),
- (GtkSignalFunc) i_callback_action_add_circle,
- w_current);
-
- gtk_toolbar_append_item(toolbar,
- _("Line"),
- _("Add Line"),
- "toolbar/line",
- x_icons_new_toolbar_pixmap(GSCHEM_STOCK_LINE),
- (GtkSignalFunc) i_callback_action_add_line,
- w_current);
-
- gtk_toolbar_append_item(toolbar,
- _("Pin"),
- _("Add Pin"),
- "toolbar/pin",
- x_icons_new_toolbar_pixmap(GSCHEM_STOCK_PIN),
- (GtkSignalFunc) i_callback_action_add_pin,
- w_current);
-
- gtk_toolbar_append_space(toolbar);
-
- gtk_toolbar_append_item(toolbar,
- _("Up Hierarchy"),
- _("Up Hierarchy"),
- "toolbar/up-hierarchy",
- x_icons_new_toolbar_pixmap(GSCHEM_STOCK_UP),
- (GtkSignalFunc) i_callback_action_hierarchy_up,
- w_current);
+ GTK_STOCK_REDO);
+ gtk_action_group_add_action(actions, action);
+ g_object_unref(action);
- gtk_toolbar_append_item(toolbar,
+ action=gtk_action_new(GSCHEM_ACTION_HIERARCHY_DOWN_SCHEMATIC,
_("Down Schematic"),
_("Down Schematic"),
- "toolbar/down-schematic",
-
x_icons_new_toolbar_pixmap(GSCHEM_STOCK_DOWN_SCHEMATIC),
- (GtkSignalFunc)
i_callback_action_hierarchy_down_schematic,
- w_current);
+ GSCHEM_STOCK_DOWN_SCHEMATIC);
+ gtk_action_group_add_action(actions, action);
+ g_object_unref(action);
- gtk_toolbar_append_item(toolbar,
+ action=gtk_action_new(GSCHEM_ACTION_HIERARCHY_DOWN_SYMBOL,
_("Down Symbol"),
_("Down Symbol"),
- "toolbar/down-symbol",
- x_icons_new_toolbar_pixmap(GSCHEM_STOCK_DOWN_SYMBOL),
- (GtkSignalFunc)
i_callback_action_hierarchy_down_symbol,
- w_current);
+ GSCHEM_STOCK_DOWN_SYMBOL);
+ gtk_action_group_add_action(actions, action);
+ g_object_unref(action);
- gtk_toolbar_append_space(toolbar);
+ action=gtk_action_new(GSCHEM_ACTION_HIERARCHY_UP,
+ _("Up"),
+ _("Up Hierarchy"),
+ GSCHEM_STOCK_UP);
+ gtk_action_group_add_action(actions, action);
+ g_object_unref(action);
- gtk_toolbar_append_item(toolbar,
+ action=gtk_action_new(GSCHEM_ACTION_VIEW_ZOOM_IN,
_("Zoom In"),
_("Zoom In"),
- "toolbar/zoom-in",
- x_icons_new_toolbar_pixmap(GTK_STOCK_ZOOM_IN),
- (GtkSignalFunc) i_callback_action_view_zoom_in,
- w_current);
+ GTK_STOCK_ZOOM_IN);
+ gtk_action_group_add_action(actions, action);
+ g_object_unref(action);
- gtk_toolbar_append_item(toolbar,
+ action=gtk_action_new(GSCHEM_ACTION_VIEW_ZOOM_OUT,
_("Zoom Out"),
_("Zoom Out"),
- "toolbar/zoom-out",
- x_icons_new_toolbar_pixmap(GTK_STOCK_ZOOM_OUT),
- (GtkSignalFunc) i_callback_action_view_zoom_out,
- w_current);
+ GTK_STOCK_ZOOM_OUT);
+ gtk_action_group_add_action(actions, action);
+ g_object_unref(action);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(w_current->toolbar_select),
- TRUE);
+ /* GtkRadioAction for tools */
+ radio=gtk_radio_action_new(GSCHEM_ACTION_EDIT_SELECT,
+ _("Select"),
+ _("Select mode"),
+ GSCHEM_STOCK_SELECT,
+ TOOL_SELECT);
+ gtk_action_group_add_action(actions, GTK_ACTION(radio));
+ gtk_radio_action_set_group(radio, group);
+ group = gtk_radio_action_get_group(radio);
+ g_object_unref(radio);
+
+ radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_ARC,
+ _("Arc"),
+ _("Add Arc"),
+ GSCHEM_STOCK_ARC,
+ TOOL_ARC);
+ gtk_action_group_add_action(actions, GTK_ACTION(radio));
+ gtk_radio_action_set_group(radio, group);
+ group = gtk_radio_action_get_group(radio);
+ g_object_unref(radio);
+
+ radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_BOX,
+ _("Box"),
+ _("Add Box"),
+ GSCHEM_STOCK_BOX,
+ TOOL_BOX);
+ gtk_action_group_add_action(actions, GTK_ACTION(radio));
+ gtk_radio_action_set_group(radio, group);
+ group = gtk_radio_action_get_group(radio);
+ g_object_unref(radio);
+
+ radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_BUS,
+ _("Bus"),
+ _("Add buses mode\nRight mouse button to
cancel"),
+ GSCHEM_STOCK_BUS,
+ TOOL_BUS);
+ gtk_action_group_add_action(actions, GTK_ACTION(radio));
+ gtk_radio_action_set_group(radio, group);
+ group = gtk_radio_action_get_group(radio);
+ g_object_unref(radio);
+
+ radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_CIRCLE,
+ _("Circle"),
+ _("Add Circle"),
+ GSCHEM_STOCK_CIRCLE,
+ TOOL_CIRCLE);
+ gtk_action_group_add_action(actions, GTK_ACTION(radio));
+ gtk_radio_action_set_group(radio, group);
+ group = gtk_radio_action_get_group(radio);
+ g_object_unref(radio);
+
+ radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_COMPONENT,
+ _("Component"),
+ _("Add component...\nSelect library and
component from list, move the mouse into main window, click to place\nRight
mouse button to cancel"),
+ GSCHEM_STOCK_COMPONENT,
+ TOOL_COMPONENT);
+ gtk_action_group_add_action(actions, GTK_ACTION(radio));
+ gtk_radio_action_set_group(radio, group);
+ group = gtk_radio_action_get_group(radio);
+ g_object_unref(radio);
+
+ radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_LINE,
+ _("Line"),
+ _("Add Line"),
+ GSCHEM_STOCK_LINE,
+ TOOL_LINE);
+ gtk_action_group_add_action(actions, GTK_ACTION(radio));
+ gtk_radio_action_set_group(radio, group);
+ group = gtk_radio_action_get_group(radio);
+ g_object_unref(radio);
+
+ radio=gtk_radio_action_new(GSCHEM_ACTION_EDIT_COPY,
+ _("Copy"),
+ _("Copy Mode"),
+ GSCHEM_STOCK_COPY,
+ TOOL_COPY);
+ gtk_action_group_add_action(actions, GTK_ACTION(radio));
+ gtk_radio_action_set_group(radio, group);
+ group = gtk_radio_action_get_group(radio);
+ g_object_unref(radio);
+
+ radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_NET,
+ _("Nets"),
+ _("Add nets mode\nRight mouse button to
cancel"),
+ GSCHEM_STOCK_NET,
+ TOOL_NET);
+ gtk_action_group_add_action(actions, GTK_ACTION(radio));
+ gtk_radio_action_set_group(radio, group);
+ group = gtk_radio_action_get_group(radio);
+ g_object_unref(radio);
+
+ radio=gtk_radio_action_new(GSCHEM_ACTION_EDIT_MIRROR,
+ _("Mirror"),
+ _("Mirror Mode"),
+ GSCHEM_STOCK_MIRROR,
+ TOOL_MIRROR);
+ gtk_action_group_add_action(actions, GTK_ACTION(radio));
+ gtk_radio_action_set_group(radio, group);
+ group = gtk_radio_action_get_group(radio);
+ g_object_unref(radio);
+
+ radio=gtk_radio_action_new(GSCHEM_ACTION_EDIT_MOVE,
+ _("Move"),
+ _("Move Mode"),
+ GSCHEM_STOCK_MOVE,
+ TOOL_MOVE);
+ gtk_action_group_add_action(actions, GTK_ACTION(radio));
+ gtk_radio_action_set_group(radio, group);
+ group = gtk_radio_action_get_group(radio);
+ g_object_unref(radio);
+
+ radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_PIN,
+ _("Pin"),
+ _("Add Pin"),
+ GSCHEM_STOCK_PIN,
+ TOOL_PIN);
+ gtk_action_group_add_action(actions, GTK_ACTION(radio));
+ gtk_radio_action_set_group(radio, group);
+ group = gtk_radio_action_get_group(radio);
+ g_object_unref(radio);
+
+ radio=gtk_radio_action_new(GSCHEM_ACTION_EDIT_ROTATE,
+ _("Rotate"),
+ _("Rotate Mode"),
+ GSCHEM_STOCK_ROTATE,
+ TOOL_ROTATE);
+ gtk_action_group_add_action(actions, GTK_ACTION(radio));
+ gtk_radio_action_set_group(radio, group);
+ group = gtk_radio_action_get_group(radio);
+ g_object_unref(radio);
+
+ radio=gtk_radio_action_new(GSCHEM_ACTION_ADD_TEXT,
+ _("Text"),
+ _("Add Text..."),
+ GSCHEM_STOCK_TEXT,
+ TOOL_TEXT);
+ gtk_action_group_add_action(actions,GTK_ACTION(radio));
+ gtk_radio_action_set_group(radio, group);
+ group = gtk_radio_action_get_group(radio);
+ g_object_unref(radio);
+
+ /* A dummy action to cancel other actions in the radio group */
+
+ radio=gtk_radio_action_new(GSCHEM_ACTION_NULL,
+ "",
+ "",
+ NULL,
+ TOOL_OTHER);
+ gtk_action_group_add_action(actions,GTK_ACTION(radio));
+ gtk_radio_action_set_group(radio, group);
+ g_object_unref(radio);
+ }
+ return actions;
+}
+
+/*! \brief Create this application's main toolbar.
+ *
+ * \param [in] w_current The GSCHEM_TOPLEVEL. This pointer gets provided to
+ * this menu's signal handlers.
+ */
+static GtkWidget *x_window_create_toolbar(GSCHEM_TOPLEVEL *w_current)
+{
+ static const gchar *tool_table[] = {
+ GSCHEM_ACTION_FILE_NEW,
+ GSCHEM_ACTION_FILE_OPEN,
+ GSCHEM_ACTION_FILE_SAVE,
+ "",
+ GSCHEM_ACTION_EDIT_UNDO,
+ GSCHEM_ACTION_EDIT_REDO,
+ "",
+ GSCHEM_ACTION_VIEW_ZOOM_IN,
+ GSCHEM_ACTION_VIEW_ZOOM_OUT,
+ "",
+ GSCHEM_ACTION_EDIT_SELECT,
+ GSCHEM_ACTION_ADD_COMPONENT,
+ GSCHEM_ACTION_ADD_NET,
+ GSCHEM_ACTION_ADD_BUS,
+ GSCHEM_ACTION_ADD_TEXT,
+ "",
+ GSCHEM_ACTION_ADD_ARC,
+ GSCHEM_ACTION_ADD_BOX,
+ GSCHEM_ACTION_ADD_CIRCLE,
+ GSCHEM_ACTION_ADD_LINE,
+ GSCHEM_ACTION_ADD_PIN,
+ "",
+ GSCHEM_ACTION_HIERARCHY_UP,
+ GSCHEM_ACTION_HIERARCHY_DOWN_SCHEMATIC,
+ GSCHEM_ACTION_HIERARCHY_DOWN_SYMBOL,
+ "",
+ GSCHEM_ACTION_EDIT_COPY,
+ GSCHEM_ACTION_EDIT_MIRROR,
+ GSCHEM_ACTION_EDIT_MOVE,
+ GSCHEM_ACTION_EDIT_ROTATE,
+ NULL
+ };
+
+ GtkToolbar *toolbar;
+
+ toolbar = GTK_TOOLBAR(gtk_toolbar_new());
+
+ if ( toolbar !=NULL ) {
+ const gchar **tool;
+
+ gtk_toolbar_set_orientation(toolbar, GTK_ORIENTATION_HORIZONTAL);
+
+ gtk_toolbar_set_style(toolbar, GTK_TOOLBAR_ICONS);
+
+ for (tool = tool_table; *tool != NULL; tool++) {
+ if (**tool == '\0') {
+ gtk_toolbar_insert(toolbar, gtk_separator_tool_item_new(), -1);
+ }
+ else {
+ gtk_toolbar_insert(toolbar,
+ GTK_TOOL_ITEM(gtk_action_create_tool_item(
+ gtk_action_group_get_action(w_current->actions, *tool))),
+ -1);
+ }
+ }
+ }
return GTK_WIDGET(toolbar);
}
--
1.5.6
_______________________________________________
geda-dev mailing list
[email protected]
http://www.seul.org/cgi-bin/mailman/listinfo/geda-dev