atomes 1.3.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
work_menu.c
Go to the documentation of this file.
1/* This file is part of the 'atomes' software
2
3'atomes' is free software: you can redistribute it and/or modify it under the terms
4of the GNU Affero General Public License as published by the Free Software Foundation,
5either version 3 of the License, or (at your option) any later version.
6
7'atomes' is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
8without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9See the GNU General Public License for more details.
10
11You should have received a copy of the GNU Affero General Public License along with 'atomes'.
12If not, see <https://www.gnu.org/licenses/>
13
14Copyright (C) 2022-2026 by CNRS and University of Strasbourg */
15
22
23/*
24* This file: 'work_menu.c'
25*
26* Contains:
27*
28
29 - The workspace menu GTK3 version
30 - Callbacks for the workspace menu
31
32*
33* List of functions:
34
35 G_MODULE_EXPORT void on_create_new_project (GtkWidget * widg, gpointer data);
36 G_MODULE_EXPORT void leaving_from_menu (GtkWidget * widg, gpointer data);
37 G_MODULE_EXPORT void compute_this_prop (GtkWidget * widg, gpointer data);
38
39 GtkWidget * this_work_menu (int p, int c);
40 GtkWidget * work_menu (int p, int c);
41
42*/
43
44#include "global.h"
45#include "callbacks.h"
46#include "interface.h"
47#include "project.h"
48#include "workspace.h"
49#include "glview.h"
50
51extern G_MODULE_EXPORT void on_calc_activate (GtkWidget * widg, gpointer data);
52extern G_MODULE_EXPORT void set_mode (GtkWidget * widg, gpointer data);
53
62G_MODULE_EXPORT void on_create_new_project (GtkWidget * widg, gpointer data)
63{
64 init_project (TRUE);
67 apply_project (FALSE);
68#ifdef GTK3
69 // GTK3 Menu Action To Check
70 gtk_check_menu_item_set_active ((GtkCheckMenuItem *)active_project -> modelgl -> ogl_mode[1], TRUE);
71 set_mode (active_project -> modelgl -> ogl_mode[1], & active_project -> modelgl -> colorp[1][0]);
72#else
73 set_mode (NULL, & active_project -> modelgl -> colorp[1][0]);
74#endif
76}
77
86G_MODULE_EXPORT void leaving_from_menu (GtkWidget * widg, gpointer data)
87{
88#ifdef GTK4
89 leaving_question (NULL, NULL);
90#else
91 leaving_question (NULL, NULL, NULL);
92#endif
93}
94
96
105G_MODULE_EXPORT void compute_this_prop (GtkWidget * widg, gpointer data)
106{
107 activate_project (NULL, data);
108 on_calc_activate (NULL, GINT_TO_POINTER(calc_to_compute));
109}
110
111#ifdef GTK3
120GtkWidget * this_work_menu (int p, int c)
121{
122 GtkWidget * menu;
123 GtkWidget * port;
124 GtkWidget * dmenu;
125 menu = gtk_menu_new ();
126 GtkAccelGroup * accel_group = gtk_accel_group_new ();
127 gtk_window_add_accel_group (GTK_WINDOW (MainWindow), accel_group);
129 {
130 widget_set_sensitive (gtk3_menu_item (menu, _("Workspace"), IMG_FILE, (gpointer)PACKAGE_TD, NULL, NULL, FALSE, 0, 0, FALSE, FALSE, FALSE), 0);
131 add_menu_separator (menu);
132 gtk3_menu_item (menu, _("Open"), IMG_STOCK, (gpointer)FOPEN, G_CALLBACK(on_open_save_activate), GINT_TO_POINTER(2), TRUE, GDK_KEY_w, GDK_CONTROL_MASK, FALSE, FALSE, FALSE);
133 gtk3_menu_item (menu, _("Save"), IMG_STOCK, (gpointer)FSAVE, G_CALLBACK(on_open_save_activate), GINT_TO_POINTER(3), FALSE, 0, 0, FALSE, FALSE, FALSE);
134 gtk3_menu_item (menu, _("Save As"), IMG_STOCK, (gpointer)FSAVEAS, G_CALLBACK(on_save_as_activate), GINT_TO_POINTER(3), TRUE, GDK_KEY_s, GDK_CONTROL_MASK, FALSE, FALSE, FALSE);
135 gtk3_menu_item (menu, _("Close"), IMG_STOCK, (gpointer)FCLOSE, G_CALLBACK(on_close_workspace), GINT_TO_POINTER(1), TRUE, GDK_KEY_c, GDK_CONTROL_MASK, FALSE, FALSE, FALSE);
136 add_menu_separator (menu);
137 }
138 if (p == -1)
139 {
140 widget_set_sensitive (gtk3_menu_item (menu, _("Project(s)"), IMG_FILE, (gpointer)PACKAGE_TD, NULL, NULL, FALSE, 0, 0, FALSE, FALSE, FALSE), FALSE);
141 add_menu_separator (menu);
143 {
144 gtk3_menu_item (menu, _("New"), IMG_STOCK, (gpointer)FNEW, G_CALLBACK(on_create_new_project), NULL, TRUE, GDK_KEY_n, GDK_CONTROL_MASK, FALSE, FALSE, FALSE);
145 gtk3_menu_item (menu, _("Open"), IMG_STOCK, (gpointer)FSAVE, G_CALLBACK(on_open_save_activate), GINT_TO_POINTER(0), TRUE, GDK_KEY_o, GDK_CONTROL_MASK, FALSE, FALSE, FALSE);
146 }
147 gtk3_menu_item (menu, _("Save"), IMG_STOCK, (gpointer)FSAVE, G_CALLBACK(on_open_save_activate), GINT_TO_POINTER(1), FALSE, 0, 0, FALSE, FALSE, FALSE);
148 gtk3_menu_item (menu, _("Save As"), IMG_STOCK, (gpointer)FSAVEAS, G_CALLBACK(on_save_as_activate), GINT_TO_POINTER(1), FALSE, 0, 0, FALSE, FALSE, FALSE);
150 {
151 gtk3_menu_item (menu, _("Close"), IMG_STOCK, (gpointer)FCLOSE, G_CALLBACK(on_close_activate), GINT_TO_POINTER(activep), FALSE, 0, 0, FALSE, FALSE, FALSE);
152 }
153 port = gtk3_menu_item (menu, _("Export"), IMG_FILE, (gpointer)PACKAGE_CON, NULL, NULL, FALSE, 0, 0, FALSE, FALSE, FALSE);
154 dmenu = gtk_menu_new ();
155 gtk3_menu_item (dmenu, _("ISAACS Project File '*.ipf'"), IMG_FILE, (gpointer)PACKAGE_MOL, G_CALLBACK(on_isaacs_port), GINT_TO_POINTER(1), FALSE, 0, 0, FALSE, FALSE, FALSE);
156 gtk3_menu_item (dmenu, _("Atomic Coordinates"), IMG_FILE, (gpointer)PACKAGE_CON, G_CALLBACK(on_coord_port), GINT_TO_POINTER(1), FALSE, 0, 0, FALSE, FALSE, FALSE);
157 gtk_menu_item_set_submenu ((GtkMenuItem *)port, dmenu);
158 }
159 else
160 {
161 gchar * pname = g_strdup_printf ("<b>%s</b>", get_project_by_id(p) -> name);
162 widget_set_sensitive (gtk3_menu_item (menu, pname, IMG_FILE, (gpointer)PACKAGE_TD, NULL, NULL, FALSE, 0, 0, FALSE, FALSE, FALSE), 0);
163 g_free (pname);
164 add_menu_separator (menu);
165 if (p != activep)
166 {
167 gtk3_menu_item (menu, _("Make Active"), IMG_STOCK, (gpointer)YES, G_CALLBACK(activate_project), GINT_TO_POINTER(p), FALSE, 0, 0, FALSE, FALSE, FALSE);
168 }
169 if (c > -1)
170 {
171 gchar * str = g_strdup_printf (_("Analyze: %s"), graph_name[c]);
172 widget_set_sensitive (gtk3_menu_item (menu, str, IMG_FILE, (gpointer)graph_img[c], G_CALLBACK(compute_this_prop), GINT_TO_POINTER(p), FALSE, 0, 0, FALSE, FALSE, FALSE), get_project_by_id(p) -> analysis[c] -> avail_ok);
173 g_free (str);
174 }
175 gtk3_menu_item (menu, _("Edit Name"), IMG_STOCK, (gpointer)EDITA, G_CALLBACK(change_project_name), GINT_TO_POINTER(p), FALSE, 0, 0, FALSE, FALSE, FALSE);
176 gtk3_menu_item (menu, _("Save"), IMG_STOCK, (gpointer)FSAVE, G_CALLBACK(on_open_save_activate), GINT_TO_POINTER(1), FALSE, 0, 0, FALSE, FALSE, FALSE);
177 gtk3_menu_item (menu, _("Save As"), IMG_STOCK, (gpointer)FSAVEAS, G_CALLBACK(on_save_as_activate), GINT_TO_POINTER(1), FALSE, 0, 0, FALSE, FALSE, FALSE);
179 {
180 gtk3_menu_item (menu, _("Close"), IMG_STOCK, (gpointer)FCLOSE, G_CALLBACK(on_close_activate), GINT_TO_POINTER(p), FALSE, 0, 0, FALSE, FALSE, FALSE);
181 }
182 port = gtk3_menu_item (menu, _("Export"), IMG_FILE, (gpointer)PACKAGE_CON, NULL, NULL, FALSE, 0, 0, FALSE, FALSE, FALSE);
183 dmenu = gtk_menu_new ();
184 gtk3_menu_item (dmenu, _("ISAACS Project File '*.ipf'"), IMG_FILE, (gpointer)PACKAGE_MOL, G_CALLBACK(on_isaacs_port), GINT_TO_POINTER(1), FALSE, 0, 0, FALSE, FALSE, FALSE);
185 gtk3_menu_item (dmenu, _("Atomic Coordinates"), IMG_FILE, (gpointer)PACKAGE_CON, G_CALLBACK(on_coord_port), GINT_TO_POINTER(1), FALSE, 0, 0, FALSE, FALSE, FALSE);
186 gtk_menu_item_set_submenu ((GtkMenuItem *)port, dmenu);
187 }
189 {
190 add_menu_separator (menu);
191 port = gtk3_menu_item (menu, _("Import"), IMG_FILE, (gpointer)PACKAGE_IMP, NULL, NULL, FALSE, 0, 0, FALSE, FALSE, FALSE);
192 dmenu = gtk_menu_new ();
193 gtk_menu_item_set_submenu ((GtkMenuItem *)port, dmenu);
194 gtk3_menu_item (dmenu, _("ISAACS Project File '*.ipf'"), IMG_FILE, (gpointer)PACKAGE_MOL, G_CALLBACK(on_isaacs_port), GINT_TO_POINTER(0), FALSE, 0, 0, FALSE, FALSE, FALSE);
195 gtk3_menu_item (dmenu, _("Atomic Coordinates"), IMG_FILE, (gpointer)PACKAGE_IMP, G_CALLBACK(on_coord_port), GINT_TO_POINTER(0), FALSE, 0, 0, FALSE, FALSE, FALSE);
196 }
197 add_menu_separator (menu);
198 gtk3_menu_item (menu, _("Quit"), IMG_STOCK, (gpointer)FEXIT, G_CALLBACK(leaving_from_menu), NULL, TRUE, GDK_KEY_q, GDK_CONTROL_MASK, FALSE, FALSE, FALSE);
199 show_the_widgets (menu);
200 return menu;
201}
202#endif
203
204extern void atomes_menu_bar_action (GSimpleAction * action, GVariant * parameter, gpointer data);
205extern GMenu * create_workspace_menu (gchar * act, int pop_up, int proj, int calc);
206extern GSimpleAction * pop_act[7];
207
216GtkWidget * work_menu (int p, int c)
217{
218 GtkWidget * menu;
219
220 GSimpleActionGroup * action_popup = g_simple_action_group_new ();
221 GSimpleAction * pop_act[17];
222 pop_act[0] = g_simple_action_new ("workspace.open", NULL);
223 pop_act[1] = g_simple_action_new ("workspace.save", NULL);
224 pop_act[2] = g_simple_action_new ("workspace.save-as", NULL);
225 pop_act[3] = g_simple_action_new ("workspace.close", NULL);
226 pop_act[4] = g_simple_action_new ("project.active", NULL);
227 pop_act[5] = g_simple_action_new ("project.compute", NULL);
228 pop_act[6] = g_simple_action_new ("project.edit", NULL);
229 pop_act[7] = g_simple_action_new ("project.new", NULL);
230 pop_act[8] = g_simple_action_new ("project.open", NULL);
231 pop_act[9] = g_simple_action_new ("project.save", NULL);
232 pop_act[10] = g_simple_action_new ("project.save-as", NULL);
233 pop_act[11] = g_simple_action_new ("project.close", NULL);
234 pop_act[12] = g_simple_action_new ("export.isaacs", NULL);
235 pop_act[13] = g_simple_action_new ("export.coordinates", NULL);
236 pop_act[14] = g_simple_action_new ("import.isaacs", NULL);
237 pop_act[15] = g_simple_action_new ("import.coordinates", NULL);
238 pop_act[16] = g_simple_action_new ("program.quit", NULL);
239
240 int i;
241 for (i=0; i<17; i++) g_action_map_add_action (G_ACTION_MAP(action_popup), G_ACTION(pop_act[i]));
242 g_signal_connect (pop_act[0], "activate", G_CALLBACK(atomes_menu_bar_action), GINT_TO_POINTER(2));
243 g_signal_connect (pop_act[1], "activate", G_CALLBACK(atomes_menu_bar_action), GINT_TO_POINTER(3));
244 g_signal_connect (pop_act[2], "activate", G_CALLBACK(atomes_menu_bar_action), GINT_TO_POINTER(3));
245 g_signal_connect (pop_act[3], "activate", G_CALLBACK(atomes_menu_bar_action), GINT_TO_POINTER(1));
246 g_signal_connect (pop_act[4], "activate", G_CALLBACK(atomes_menu_bar_action), GINT_TO_POINTER(p));
247 g_signal_connect (pop_act[5], "activate", G_CALLBACK(atomes_menu_bar_action), GINT_TO_POINTER(p));
248 g_signal_connect (pop_act[6], "activate", G_CALLBACK(atomes_menu_bar_action), GINT_TO_POINTER(p));
249 g_signal_connect (pop_act[7], "activate", G_CALLBACK(atomes_menu_bar_action), NULL);
250 g_signal_connect (pop_act[8], "activate", G_CALLBACK(atomes_menu_bar_action), GINT_TO_POINTER(0));
251 g_signal_connect (pop_act[9], "activate", G_CALLBACK(atomes_menu_bar_action), GINT_TO_POINTER(1));
252 g_signal_connect (pop_act[10], "activate", G_CALLBACK(atomes_menu_bar_action), GINT_TO_POINTER(1));
253 g_signal_connect (pop_act[11], "activate", G_CALLBACK(atomes_menu_bar_action), GINT_TO_POINTER(p));
254 g_signal_connect (pop_act[12], "activate", G_CALLBACK(atomes_menu_bar_action), GINT_TO_POINTER(1));
255 g_signal_connect (pop_act[13], "activate", G_CALLBACK(atomes_menu_bar_action), GINT_TO_POINTER(1));
256 g_signal_connect (pop_act[14], "activate", G_CALLBACK(atomes_menu_bar_action), GINT_TO_POINTER(0));
257 g_signal_connect (pop_act[15], "activate", G_CALLBACK(atomes_menu_bar_action), GINT_TO_POINTER(0));
258 g_signal_connect (pop_act[16], "activate", G_CALLBACK(atomes_menu_bar_action), NULL);
259
260 calc_to_compute = (c < ANG) ? c : c - 1;
261#ifdef GTK3
262 menu = this_work_menu (p, c);
263 // GMenu * popup = create_workspace_menu ("pop", 1, p, c);
264 // gtk_menu_new_from_model (G_MENU_MODEL(popup));
265#else
266 GMenu * popup = create_workspace_menu ("pop", 1, p, c);
267 menu = gtk_popover_menu_new_from_model_full (G_MENU_MODEL(popup), GTK_POPOVER_MENU_NESTED);
268 i = (nprojects) ? ((p > -1) ? 250 : 95) : 0;
269 gtk_widget_set_size_request (menu, -1, 310 + i);
270/* I need to use the ' gtk_popover_menu_new_from_model_full' command here,
271 the menu created using the 'gtk_popover_menu_new_from_model' does not behave properly,
272 that might be a bug, some items of the menu having the same name,
273 It is not possible to navigate the menu properly and some elements remains inaccessible,
274 this was solved with this '_full' command.
275 menu = gtk_popover_menu_new_from_model (G_MENU_MODEL(popup)); */
276#endif
277 gtk_widget_insert_action_group (menu, "pop", G_ACTION_GROUP(action_popup));
278
279 return menu;
280}
G_MODULE_EXPORT void on_close_workspace(GtkWidget *widg, gpointer data)
close the active workspace
Definition callbacks.c:126
G_MODULE_EXPORT void on_open_save_activate(GtkWidget *widg, gpointer data)
open or save an atomes file - prepare the dialog
Definition callbacks.c:549
void apply_project(gboolean showtools)
get project ready for calculation and initialize the OpenGL window
Definition callbacks.c:794
G_MODULE_EXPORT void on_isaacs_port(GtkWidget *widg, gpointer data)
open or write ISAACS XML file - prepare the dialog
Definition callbacks.c:904
G_MODULE_EXPORT void on_coord_port(GtkWidget *widg, gpointer data)
export or import atomic coordinates: prepare dialog
Definition callbacks.c:1763
G_MODULE_EXPORT void on_save_as_activate(GtkWidget *widg, gpointer data)
open or save, choosing a file name
Definition callbacks.c:747
Callback declarations for main window.
G_MODULE_EXPORT void on_close_activate(GtkWidget *widg, gpointer cdata)
signal to close a project
Definition close_p.c:503
color colorp[64]
int mol_update
Definition global.c:175
int activep
Definition global.c:162
gchar * PACKAGE_IMP
Definition global.c:90
gchar * PACKAGE_CON
Definition global.c:91
int nprojects
Definition global.c:161
int frag_update
Definition global.c:174
GtkWidget * MainWindow
Definition global.c:207
gchar * PACKAGE_TD
Definition global.c:101
gchar * PACKAGE_MOL
Definition global.c:102
gboolean atomes_from_libreoffice
Definition global.c:195
Global variable declarations Global convenience function declarations Global data structure defin...
@ IMG_STOCK
Definition global.h:280
@ IMG_FILE
Definition global.h:279
GtkWidget * gtk3_menu_item(GtkWidget *menu, gchar *name, int icon_format, gpointer item_icon, GCallback handler, gpointer data, gboolean accel, guint key, GdkModifierType mod, gboolean check, gboolean radio, gboolean status)
project * proj
gchar * graph_img[NCALCS]
Definition gui.c:106
char * graph_name[]
Definition gui.c:123
#define EDITA
Definition global.h:218
#define FEXIT
Definition global.h:228
#define FOPEN
Definition global.h:224
#define YES
Definition global.h:217
#define ANG
Definition global.h:342
#define FNEW
Definition global.h:223
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:247
#define FSAVE
Definition global.h:225
void add_menu_separator(GtkWidget *menu)
#define FCLOSE
Definition global.h:227
project * active_project
Definition project.c:47
#define FSAVEAS
Definition global.h:226
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:202
project * get_project_by_id(int p)
get project pointer using id number
Definition project.c:120
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
action
Definition glview.h:198
G_MODULE_EXPORT void compute_this_prop(GtkWidget *widg, gpointer data)
to compute the 'calc_to_compute'
Definition work_menu.c:105
G_MODULE_EXPORT void leaving_from_menu(GtkWidget *widg, gpointer data)
leaving atomes ?
Definition work_menu.c:86
G_MODULE_EXPORT void atomes_menu_bar_action(GSimpleAction *action, GVariant *parameter, gpointer data)
atomes menu bar actions
Definition gui.c:417
G_MODULE_EXPORT void on_create_new_project(GtkWidget *widg, gpointer data)
create a new project
Definition work_menu.c:62
void init_project(gboolean alloc_box)
initialize a new project
Definition init_p.c:273
G_MODULE_EXPORT gboolean leaving_question(GtkWidget *widget, GdkEvent *event, gpointer data)
Leaving atomes ?
Definition interface.c:482
Messaging function declarations.
void prep_calc_actions()
prepare analysis widgets
Definition update_p.c:59
Function declarations for reading atomes project file Function declarations for saving atomes proje...
G_MODULE_EXPORT void compute_this_prop(GtkWidget *widg, gpointer data)
to compute the 'calc_to_compute'
Definition work_menu.c:105
void atomes_menu_bar_action(GSimpleAction *action, GVariant *parameter, gpointer data)
atomes menu bar actions
Definition gui.c:417
GMenu * create_workspace_menu(gchar *act, int pop_up, int proj, int calc)
create atomes 'workspace' menu
Definition gui.c:945
GSimpleAction * pop_act[7]
G_MODULE_EXPORT void leaving_from_menu(GtkWidget *widg, gpointer data)
leaving atomes ?
Definition work_menu.c:86
G_MODULE_EXPORT void on_calc_activate(GtkWidget *widg, gpointer data)
create a calculation dialog - prepare the dialog
Definition calc_menu.c:2049
GtkWidget * work_menu(int p, int c)
create the workspace popup menu
Definition work_menu.c:216
G_MODULE_EXPORT void set_mode(GtkWidget *widg, gpointer data)
set mouse mode callback
Definition m_tools.c:180
int calc_to_compute
Definition work_menu.c:95
G_MODULE_EXPORT void on_create_new_project(GtkWidget *widg, gpointer data)
create a new project
Definition work_menu.c:62
void add_project_to_workspace()
add project(s) to the workspace tree
Definition workspace.c:597
G_MODULE_EXPORT void activate_project(GtkWidget *widg, gpointer data)
activate a project
Definition workspace.c:179
G_MODULE_EXPORT void change_project_name(GtkWidget *wid, gpointer edata)
change project name
Definition workspace.c:344
Function declarations for workspace managment.