From 80157a40582f1bd40b2eaa1f25109d415523f4bc Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Tue, 22 Sep 2020 21:51:47 -0300 Subject: [PATCH] Refactoring action list editor on a more standard way. --- pw3270.cbp | 3 +++ src/include/pw3270/actions.h | 2 +- src/include/pw3270/settings.h | 15 +++++++++++++++ src/objects/actions/view.c | 6 ++++-- src/objects/settings/actionview.c | 216 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ src/objects/toolbar/settings.c | 4 +++- src/objects/window/header-settings.c | 53 ++++++++++++++++++++++++++--------------------------- 7 files changed, 268 insertions(+), 31 deletions(-) create mode 100644 src/objects/settings/actionview.c diff --git a/pw3270.cbp b/pw3270.cbp index c57dd55..8736f16 100644 --- a/pw3270.cbp +++ b/pw3270.cbp @@ -136,6 +136,9 @@ + + diff --git a/src/include/pw3270/actions.h b/src/include/pw3270/actions.h index 03a7e55..0cab245 100644 --- a/src/include/pw3270/actions.h +++ b/src/include/pw3270/actions.h @@ -104,7 +104,7 @@ void pw3270_action_view_move_selected(GtkWidget *from, GtkWidget *to); void pw3270_action_view_append(GtkWidget *widget, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, const PW3270ActionViewFlag flags); gchar * pw3270_action_view_get_action_names(GtkWidget *widget); - GtkWidget * pw3270_action_view_extract_button_new(GtkWidget *widget, const gchar *icon_name); + GtkWidget * pw3270_action_view_move_button_new(GtkWidget *from, GtkWidget *to, const gchar *icon_name); Pw3270ActionList * pw3270_action_list_new(GtkApplication *application); Pw3270ActionList * pw3270_action_list_append(Pw3270ActionList *action_list, const gchar *label, GdkPixbuf *pixbuf, const gchar *action_name, const PW3270ActionViewFlag flags); diff --git a/src/include/pw3270/settings.h b/src/include/pw3270/settings.h index 2c99ac3..22ab92a 100644 --- a/src/include/pw3270/settings.h +++ b/src/include/pw3270/settings.h @@ -36,6 +36,7 @@ #endif // _WIN32 #include + #include G_BEGIN_DECLS @@ -91,4 +92,18 @@ G_END_DECLS +/*--[ PW3270 Action List Editor ]--------------------------------------------------------------------*/ + + #define GTK_TYPE_PW3270_SETTINGS_ACTIONS (PW3270SettingsActions_get_type()) + + typedef struct _PW3270SettingsActions PW3270SettingsActions; + typedef struct _PW3270SettingsActionsClass PW3270SettingsActionsClass; + + GType PW3270SettingsActions_get_type(void); + GtkWidget * pw3270_settings_actions_new(); + Pw3270ActionList * pw3270_settings_action_load(GtkWidget *widget, Pw3270ActionList *available, const gchar *value); + + G_END_DECLS + + #endif // V3270SETTINGS_H_INCLUDED diff --git a/src/objects/actions/view.c b/src/objects/actions/view.c index f079531..f847c76 100644 --- a/src/objects/actions/view.c +++ b/src/objects/actions/view.c @@ -436,16 +436,18 @@ } - GtkWidget * pw3270_action_view_extract_button_new(GtkWidget *widget, const gchar *icon_name) { + GtkWidget * pw3270_action_view_move_button_new(GtkWidget *from, GtkWidget *to, const gchar *icon_name) { GtkWidget * button = gtk_button_new_from_icon_name(icon_name,GTK_ICON_SIZE_DND); gtk_widget_set_focus_on_click(button,FALSE); gtk_button_set_relief(GTK_BUTTON(button),GTK_RELIEF_NONE); gtk_widget_set_sensitive(button,FALSE); + gtk_widget_set_hexpand(button,FALSE); + gtk_widget_set_vexpand(button,FALSE); g_signal_connect( - gtk_tree_view_get_selection(GTK_TREE_VIEW(widget)), + gtk_tree_view_get_selection(GTK_TREE_VIEW(from)), "changed", G_CALLBACK(selection_changed), button diff --git a/src/objects/settings/actionview.c b/src/objects/settings/actionview.c new file mode 100644 index 0000000..536e5bd --- /dev/null +++ b/src/objects/settings/actionview.c @@ -0,0 +1,216 @@ +/* + * "Software pw3270, desenvolvido com base nos códigos fontes do WC3270 e X3270 + * (Paul Mattes Paul.Mattes@usa.net), de emulação de terminal 3270 para acesso a + * aplicativos mainframe. Registro no INPI sob o nome G3270. + * + * Copyright (C) <2008> + * + * Este programa é software livre. Você pode redistribuí-lo e/ou modificá-lo sob + * os termos da GPL v.2 - Licença Pública Geral GNU, conforme publicado pela + * Free Software Foundation. + * + * Este programa é distribuído na expectativa de ser útil, mas SEM QUALQUER + * GARANTIA; sem mesmo a garantia implícita de COMERCIALIZAÇÃO ou de ADEQUAÇÃO + * A QUALQUER PROPÓSITO EM PARTICULAR. Consulte a Licença Pública Geral GNU para + * obter mais detalhes. + * + * Você deve ter recebido uma cópia da Licença Pública Geral GNU junto com este + * programa; se não, escreva para a Free Software Foundation, Inc., 51 Franklin + * St, Fifth Floor, Boston, MA 02110-1301 USA + * + * Este programa está nomeado como - e possui - linhas de código. + * + * Contatos: + * + * perry.werneck@gmail.com (Alexandre Perry de Souza Werneck) + * erico.mendonca@gmail.com (Erico Mascarenhas Mendonça) + * + */ + +#ifdef _WIN32 + #include + #include +#endif // _WIN32 + + #include + #include + #include + #include + #include + + struct _PW3270SettingsActions { + GtkGrid parent; + GtkWidget * views[3]; + GtkTreeModel * model; + }; + + struct _PW3270SettingsActionsClass { + GtkGridClass parent; + + int dunno; + }; + + G_DEFINE_TYPE(PW3270SettingsActions, PW3270SettingsActions, GTK_TYPE_GRID); + + static void PW3270SettingsActions_class_init(PW3270SettingsActionsClass *klass) { + + } + + static void PW3270SettingsActions_init(PW3270SettingsActions *grid) { + + size_t ix; + + static const struct View { + const gchar *label; + const gchar *tooltip; + } views[G_N_ELEMENTS(grid->views)] = { + { + .label = N_("Start"), + .tooltip = N_("Items packed from the start to the end") + }, + + { + .label = N_("Available"), + .tooltip = N_("List of the available and unpacked actions") + }, + + { + .label = N_("End"), + .tooltip = N_("Items packed from the end to the start") + } + }; + + gtk_grid_set_row_homogeneous(GTK_GRID(grid),FALSE); + gtk_grid_set_row_spacing(GTK_GRID(grid),12); + gtk_grid_set_column_spacing(GTK_GRID(grid),6); + + { + // Create views + GtkTreeSelection * selection; + GtkWidget *box; + + for(ix = 0; ix < G_N_ELEMENTS(grid->views); ix++) { + + // Create label. + GtkWidget * label = gtk_label_new(gettext(views[ix].label)); + gtk_widget_set_tooltip_markup(label,gettext(views[ix].tooltip)); + //gtk_label_set_xalign(GTK_LABEL(label),0); + gtk_widget_set_hexpand(label,TRUE); + gtk_widget_set_vexpand(label,FALSE); + + gtk_grid_attach( + GTK_GRID(grid), + label, + (ix*2),0, + 1,1 + ); + + // Create view + grid->views[ix] = pw3270_action_view_new(); + gtk_widget_set_hexpand(grid->views[ix],TRUE); + gtk_widget_set_vexpand(grid->views[ix],TRUE); + + selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(grid->views[ix])); + gtk_tree_selection_set_mode(selection, GTK_SELECTION_MULTIPLE); + + GtkWidget * box = gtk_scrolled_window_new(NULL,NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(box),GTK_POLICY_AUTOMATIC,GTK_POLICY_AUTOMATIC); + gtk_container_add(GTK_CONTAINER(box),grid->views[ix]); + + gtk_grid_attach( + GTK_GRID(grid), + box, + (ix*2),1, + 1,4 + ); + + } + + } + + // Create buttons + { + GtkWidget *buttons[] = { + pw3270_action_view_move_button_new(grid->views[1],grid->views[0],"go-previous"), + pw3270_action_view_move_button_new(grid->views[1],grid->views[2],"go-next"), + pw3270_action_view_move_button_new(grid->views[0],grid->views[1],"go-next"), + pw3270_action_view_move_button_new(grid->views[2],grid->views[1],"go-previous") + }; + + gtk_grid_attach(GTK_GRID(grid),buttons[0],1,1,1,1); + gtk_grid_attach(GTK_GRID(grid),buttons[1],3,1,1,1); + + gtk_grid_attach(GTK_GRID(grid),buttons[2],1,2,1,1); + gtk_grid_attach(GTK_GRID(grid),buttons[3],3,2,1,1); + + } + + } + + GtkWidget * pw3270_settings_actions_new() { + + return GTK_WIDGET(g_object_new( + GTK_TYPE_PW3270_SETTINGS_ACTIONS, + NULL + )); + + } + + Pw3270ActionList * pw3270_settings_action_load(GtkWidget *widget, Pw3270ActionList *action_list, const gchar *action_names) { + + PW3270SettingsActions *editor = (PW3270SettingsActions *) widget; + + static const unsigned short columns[] = { 0, 2 }; + unsigned short column; + size_t action; + + gchar **views = g_strsplit(action_names,":",-1); + + for(column = 0; column < G_N_ELEMENTS(columns); column++) { + + if(!views[column]) + break; + + gchar ** actions = g_strsplit(views[column],",",-1); + + for(action = 0; actions[action];action++) { + action_list = pw3270_action_list_move_action( + action_list, + actions[action], + editor->views[columns[column]] + ); + } + + g_strfreev(actions); + } + + g_strfreev(views); + + pw3270_action_view_set_actions(editor->views[1], action_list); + + return action_list; + } + + /* + static void remove_from_left(GtkButton G_GNUC_UNUSED(*button), PW3270SettingsPrivate *settings) { + debug("%s(%p)",__FUNCTION__,settings); + pw3270_action_view_move_selected(settings->views[0],settings->views[2]); + } + + static void add_to_left(GtkButton G_GNUC_UNUSED(*button), PW3270SettingsPrivate *settings) { + debug("%s(%p)",__FUNCTION__,settings); + pw3270_action_view_move_selected(settings->views[2],settings->views[0]); + } + + static void remove_from_right(GtkButton G_GNUC_UNUSED(*button), PW3270SettingsPrivate *settings) { + debug("%s(%p)",__FUNCTION__,settings); + pw3270_action_view_move_selected(settings->views[1],settings->views[2]); + } + + static void add_to_right(GtkButton G_GNUC_UNUSED(*button), PW3270SettingsPrivate *settings) { + debug("%s(%p)",__FUNCTION__,settings); + pw3270_action_view_move_selected(settings->views[2],settings->views[1]); + } + + +*/ diff --git a/src/objects/toolbar/settings.c b/src/objects/toolbar/settings.c index 74d8616..1f6639c 100644 --- a/src/objects/toolbar/settings.c +++ b/src/objects/toolbar/settings.c @@ -59,7 +59,7 @@ struct _PW3270SettingsPrivate { GtkWidget * views[2]; - GtkWidget * buttons[2]; +// GtkWidget * buttons[2]; GtkTreeModel * models[2]; GtkWidget * combos[G_N_ELEMENTS(comboboxes)]; }; @@ -150,6 +150,7 @@ gtk_widget_set_hexpand(box,FALSE); gtk_widget_set_vexpand(box,FALSE); + /* page->buttons[0] = pw3270_action_view_extract_button_new(page->views[0],"go-next"), page->buttons[1] = pw3270_action_view_extract_button_new(page->views[1],"go-previous"), @@ -169,6 +170,7 @@ G_CALLBACK(toolbar_insert), page ); + */ gtk_grid_attach( grid, diff --git a/src/objects/window/header-settings.c b/src/objects/window/header-settings.c index f80047f..6a4e87e 100644 --- a/src/objects/window/header-settings.c +++ b/src/objects/window/header-settings.c @@ -40,10 +40,14 @@ /*--[ Constants ]------------------------------------------------------------------------------------*/ struct _PW3270SettingsPrivate { + GtkWidget * editor; + /* GtkWidget * views[3]; GtkTreeModel * model; + */ }; + /* static const struct _views { const char * label; gint left; @@ -69,29 +73,10 @@ .height = 10 } }; + */ /*--[ Implement ]------------------------------------------------------------------------------------*/ - static void remove_from_left(GtkButton G_GNUC_UNUSED(*button), PW3270SettingsPrivate *settings) { - debug("%s(%p)",__FUNCTION__,settings); - pw3270_action_view_move_selected(settings->views[0],settings->views[2]); - } - - static void add_to_left(GtkButton G_GNUC_UNUSED(*button), PW3270SettingsPrivate *settings) { - debug("%s(%p)",__FUNCTION__,settings); - pw3270_action_view_move_selected(settings->views[2],settings->views[0]); - } - - static void remove_from_right(GtkButton G_GNUC_UNUSED(*button), PW3270SettingsPrivate *settings) { - debug("%s(%p)",__FUNCTION__,settings); - pw3270_action_view_move_selected(settings->views[1],settings->views[2]); - } - - static void add_to_right(GtkButton G_GNUC_UNUSED(*button), PW3270SettingsPrivate *settings) { - debug("%s(%p)",__FUNCTION__,settings); - pw3270_action_view_move_selected(settings->views[2],settings->views[1]); - } - GtkWidget * pw3270_header_settings_new() { size_t ix; @@ -106,6 +91,15 @@ // Create private data. PW3270SettingsPrivate * page = settings->settings = g_new0(PW3270SettingsPrivate,1); + page->editor = pw3270_settings_actions_new(); + + gtk_grid_attach( + GTK_GRID(settings), + v3270_dialog_section_new(_("Title bar actions"), _("Change the position of the title bar icons"), page->editor), + 0,0,4,3 + ); + + /* // Create dialog grid GtkGrid * grid = GTK_GRID(gtk_grid_new()); gtk_grid_set_row_homogeneous(grid,FALSE); @@ -222,7 +216,7 @@ } } - + */ gtk_widget_show_all(GTK_WIDGET(settings)); return GTK_WIDGET(settings); @@ -230,11 +224,10 @@ void load(GtkWidget *widget, PW3270SettingsPrivate *page) { - size_t view, action; - g_autoptr(GSettings) settings = pw3270_application_window_settings_new(); + g_autoptr(GSettings) settings = pw3270_application_window_settings_new(); - // Populate views - Pw3270ActionList * action_list = pw3270_action_list_new(GTK_APPLICATION(g_application_get_default())); + // Get avaliable actions. + Pw3270ActionList * action_list = pw3270_action_list_new(GTK_APPLICATION(g_application_get_default())); // Add standard menus { @@ -283,6 +276,10 @@ // Load settings g_autofree gchar * action_names = g_settings_get_string(settings,"header-action-names"); + + action_list = pw3270_settings_action_load(page->editor, action_list, action_names); + + /* gchar **views = g_strsplit(action_names,":",-1); for(view = 0; view < 2; view++) { @@ -303,12 +300,14 @@ pw3270_action_view_set_actions(page->views[2], action_list); - pw3270_action_list_free(action_list); + */ + pw3270_action_list_free(action_list); } void apply(GtkWidget *widget, PW3270SettingsPrivate *page) { + /* g_autofree gchar * left_names = pw3270_action_view_get_action_names(page->views[0]); g_autofree gchar * right_names = pw3270_action_view_get_action_names(page->views[1]); g_autofree gchar * action_names = g_strconcat(left_names,":",right_names,NULL); @@ -317,6 +316,6 @@ g_autoptr(GSettings) settings = pw3270_application_window_settings_new(); g_settings_set_string(settings,"header-action-names",action_names); - + */ } -- libgit2 0.21.2