atomes 1.3.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
w_spiner.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
21
22/*
23* This file: 'w_spiner.c'
24*
25* Contains:
26*
27
28 - The functions to create the 'Spin' window
29
30*
31* List of functions:
32
33 gboolean spin (gpointer data);
34
35 static gboolean spin_wait_for_stop (gpointer data);
36
37 G_MODULE_EXPORT void spin_go (GtkButton * but, gpointer data);
38 G_MODULE_EXPORT void spin_stop (GtkButton * but, gpointer data);
39 G_MODULE_EXPORT void window_spinner (GtkWidget * widg, gpointer data);
40
41*/
42
43#include "global.h"
44#include "glview.h"
45
46extern void save_rotation_quaternion (glwin * view);
47extern void rotate_x_y (glwin * view, double angle_x, double angle_y);
48
56gboolean spin (gpointer data)
57{
58 tint * val = (tint *) data;
59 project * this_proj = get_project_by_id(val -> a);
60#ifdef DEBUG
61// g_debug (":: SPIN:: a= %d, c= %d", val -> a, val -> c);
62// g_debug (":: SPIN:: speed[c]= %d", this_proj -> modelgl -> spin_speed[val -> c]);
63#endif
64 // The next 2 tests are required if a spinning project is closed
65 // For some reason even after ending the spin the signal is not
66 // terminated before deleting the project's glwin.
67 if (this_proj)
68 {
69 if (this_proj -> modelgl)
70 {
71 if (this_proj -> modelgl -> spin[val -> c])
72 {
73 save_rotation_quaternion (this_proj -> modelgl);
74 double cameraAngle[2] = {0.0, 0.0};
75 cameraAngle[val -> c] = 0.1 * this_proj -> modelgl -> spin_speed[val -> c];
76 rotate_x_y (this_proj -> modelgl, cameraAngle[0], cameraAngle[1]);
77 update (this_proj -> modelgl);
78 return TRUE;
79 }
80 else
81 {
82 return FALSE;
83 }
84 }
85 else
86 {
87 return FALSE;
88 }
89 }
90 else
91 {
92 return FALSE;
93 }
94}
95
103static gboolean spin_wait_for_stop (gpointer data)
104{
105 tint * val = (tint *) data;
106 if (get_project_by_id(val -> a) -> modelgl -> spin[val -> c])
107 {
108 return TRUE;
109 }
110 else
111 {
112 return FALSE;
113 }
114}
115
124G_MODULE_EXPORT void spin_go (GtkButton * but, gpointer data)
125{
126 tint * val = (tint *) data;
127 glwin * view = get_project_by_id(val -> a) -> modelgl;
128
129 int s = val -> b - 2;
130#ifdef DEBUG
131// g_debug (":: SPIN_GO:: a= %d, b= %d, c= %d, d=%d", val -> a, val -> b, val -> c, s);
132// g_debug (":: SPIN_GO:: speed[b]= %d", view -> spin_speed[val -> c]);
133#endif
134 view -> spin_speed[val -> c] += s;
135 if (view -> spin_speed[val -> c] == 0)
136 {
137 view -> spin[val -> c] = FALSE;
138 g_timeout_add (REFRESH, (GSourceFunc) spin_wait_for_stop, data);
139 }
140 else if (! view -> spin[val -> c])
141 {
142 view -> spin[val -> c] = TRUE;
143 g_timeout_add (REFRESH, (GSourceFunc) spin, data);
144 }
145}
146
155G_MODULE_EXPORT void spin_stop (GtkButton * but, gpointer data)
156{
157 glwin * view = (glwin *) data;
158 int i;
159 for (i=0; i<2; i++)
160 {
161 view -> spin[i] = FALSE;
162 view -> spin_speed[i] = 0;
163 }
164 //set_sensitive_coord_menu (view, TRUE);
165}
166
175G_MODULE_EXPORT void window_spinner (GtkWidget * widg, gpointer data)
176{
177 glwin * view = (glwin *) data;
178 if (view -> spiner == NULL)
179 {
180 view -> spiner = g_malloc0(sizeof*view -> spiner);
181 gchar * str = g_strdup_printf (_("%s - spin"), prepare_for_title(get_project_by_id(view -> proj) -> name));
182 view -> spiner -> win = create_win (str, view -> win, FALSE, FALSE);
183 g_free (str);
184 GtkWidget * table = gtk_grid_new ();
185 add_container_child (CONTAINER_WIN, view -> spiner -> win, table);
186 view -> spiner -> right = create_button (_("Right"), IMG_STOCK, GO_RIGHT, -1, -1, GTK_RELIEF_NONE, G_CALLBACK(spin_go), & view -> colorp[1][1]);
187 view -> spiner -> left = create_button (_("Left"), IMG_STOCK, GO_LEFT, -1, -1, GTK_RELIEF_NONE, G_CALLBACK(spin_go), & view -> colorp[3][1]);
188 view -> spiner -> stop = create_button (_("Stop"), IMG_STOCK, MEDIA_STOP, -1, -1, GTK_RELIEF_NONE, G_CALLBACK(spin_stop), view);
189 view -> spiner -> up = create_button (_("Up"), IMG_STOCK, GO_UP, -1, -1, GTK_RELIEF_NONE, G_CALLBACK(spin_go), & view -> colorp[3][0]);
190 view -> spiner -> down = create_button (_("Down"), IMG_STOCK, GO_DOWN, -1, -1, GTK_RELIEF_NONE, G_CALLBACK(spin_go), & view -> colorp[1][0]);
191 gtk_grid_attach (GTK_GRID (table), view -> spiner -> right, 2,1,1,1);
192 gtk_grid_attach (GTK_GRID (table), view -> spiner -> left, 0,1,1,1);
193 gtk_grid_attach (GTK_GRID (table), view -> spiner -> stop, 1,1,1,1);
194 gtk_grid_attach (GTK_GRID (table), view -> spiner -> up, 1,0,1,1);
195 gtk_grid_attach (GTK_GRID (table), view -> spiner -> down, 1,2,1,1);
196 add_gtk_close_event (view -> spiner -> win, G_CALLBACK(hide_this_window), NULL);
197 show_the_widgets (view -> spiner -> win);
198 gtk_window_set_resizable (GTK_WINDOW(view -> spiner -> win), FALSE);
199 }
200 else
201 {
202 show_the_widgets (view -> spiner -> win);
203 }
204}
color colorp[64]
float val
Definition dlp_init.c:117
dint up
Global variable declarations Global convenience function declarations Global data structure defin...
@ IMG_STOCK
Definition global.h:280
#define GO_RIGHT
Definition global.h:209
GtkWidget * create_win(gchar *str, GtkWidget *parent, gboolean modal, gboolean resiz)
create a new GtkWindow
Definition gtk-misc.c:486
project * proj
G_MODULE_EXPORT gboolean hide_this_window(GtkWidget *win, GdkEvent *event, gpointer data)
hide a GtkWindow
Definition gtk-misc.c:2541
void add_gtk_close_event(GtkWidget *widg, GCallback handler, gpointer data)
add a close event signal and callback to a GtkWidget
Definition gtk-misc.c:2557
@ CONTAINER_WIN
Definition global.h:266
#define GO_LEFT
Definition global.h:210
GtkWidget * create_button(gchar *text, int image_format, gchar *image, int dimx, int dimy, int relief, GCallback handler, gpointer data)
create a simple button
Definition gtk-misc.c:1999
#define GO_DOWN
Definition global.h:212
gchar * prepare_for_title(gchar *init)
prepare a string for a window title, getting rid of all markup
Definition tools.c:71
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:267
#define GO_UP
Definition global.h:211
#define MEDIA_STOP
Definition global.h:204
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
void update(glwin *view)
update the rendering of the OpenGL window
Definition glview.c:461
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
#define REFRESH
Refresh time for spinning the OpenGL window in milliseconds.
Definition glview.h:139
G_MODULE_EXPORT void spin_go(GtkWidget *widg, gpointer data)
gboolean spin(gpointer data)
spin
Definition w_spiner.c:56
G_MODULE_EXPORT void spin_stop(GtkButton *but, gpointer data)
stop spin
Definition w_spiner.c:155
Definition glwin.h:967
Definition global.h:118
G_MODULE_EXPORT void spin_go(GtkButton *but, gpointer data)
start spin
Definition w_spiner.c:124
void save_rotation_quaternion(glwin *view)
save the rotation quaternion of the last image
Definition glview.c:565
G_MODULE_EXPORT void window_spinner(GtkWidget *widg, gpointer data)
create the spin window callback
Definition w_spiner.c:175
gboolean spin(gpointer data)
spin
Definition w_spiner.c:56
void rotate_x_y(glwin *view, double angle_x, double angle_y)
rotate the OpenGL camera
Definition glview.c:1103
G_MODULE_EXPORT void spin_stop(GtkButton *but, gpointer data)
stop spin
Definition w_spiner.c:155