1 /* This file is part of the hkl library.
3 * The hkl library is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
8 * The hkl library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with the hkl library. If not, see <http://www.gnu.org/licenses/>.
16 * Copyright (C) 2003-2013 Synchrotron SOLEIL
17 * L'Orme des Merisiers Saint-Aubin
18 * BP 48 91192 GIF-sur-YVETTE CEDEX
20 * Authors: Picca Frédéric-Emmanuel <picca@synchrotron-soleil.fr>
23 #include "hkl-gui-pseudoaxes.h"
31 G_DEFINE_TYPE (HklGuiEngine
, hkl_gui_engine
, G_TYPE_OBJECT
);
41 /* Keep a pointer to the properties definition */
42 static GParamSpec
*obj_properties
[N_PROPERTIES
] = { NULL
, };
50 static guint signals
[N_SIGNALS
] = { 0 };
52 struct _HklGuiEnginePrivate
{
60 GtkComboBox
* combobox1
;
61 GtkExpander
* expander1
;
62 GtkTreeView
* treeview1
;
65 GtkListStore
* store_mode
;
66 GtkListStore
* store_pseudo
;
67 GtkListStore
* store_mode_parameter
;
70 #define HKL_GUI_ENGINE_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), HKL_GUI_TYPE_ENGINE, HklGuiEnginePrivate))
73 set_property (GObject
*object
, guint prop_id
,
74 const GValue
*value
, GParamSpec
*pspec
)
76 HklGuiEngine
*self
= HKL_GUI_ENGINE (object
);
77 HklGuiEnginePrivate
*priv
= HKL_GUI_ENGINE_GET_PRIVATE(self
);
81 hkl_gui_engine_set_engine(self
, g_value_get_pointer (value
));
84 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
90 get_property (GObject
*object
, guint prop_id
,
91 GValue
*value
, GParamSpec
*pspec
)
93 HklGuiEngine
*self
= HKL_GUI_ENGINE (object
);
94 HklGuiEnginePrivate
*priv
= HKL_GUI_ENGINE_GET_PRIVATE(self
);
99 g_value_set_pointer (value
, hkl_gui_engine_get_engine (self
));
102 G_OBJECT_WARN_INVALID_PROPERTY_ID (object
, prop_id
, pspec
);
108 finalize (GObject
* object
)
110 HklGuiEnginePrivate
*priv
= HKL_GUI_ENGINE_GET_PRIVATE(object
);
112 g_object_unref(priv
->builder
);
114 G_OBJECT_CLASS (hkl_gui_engine_parent_class
)->finalize (object
);
119 hkl_gui_engine_new (HklEngine
* engine
)
121 return g_object_new (HKL_GUI_TYPE_ENGINE
,
128 hkl_gui_engine_get_engine (HklGuiEngine
*self
)
130 HklGuiEnginePrivate
*priv
= HKL_GUI_ENGINE_GET_PRIVATE(self
);
137 hkl_gui_engine_get_frame(HklGuiEngine
*self
)
139 HklGuiEnginePrivate
*priv
= HKL_GUI_ENGINE_GET_PRIVATE(self
);
146 update_pseudo_axis (HklGuiEngine
* self
)
148 HklGuiEnginePrivate
*priv
= HKL_GUI_ENGINE_GET_PRIVATE(self
);
149 GtkTreeIter iter
= {0};
150 darray_parameter
*parameters
;
151 HklParameter
**parameter
;
153 g_return_if_fail (self
!= NULL
);
155 gtk_list_store_clear (priv
->store_pseudo
);
156 parameters
= hkl_engine_pseudo_axes (priv
->engine
);
157 darray_foreach(parameter
, *parameters
){
158 gtk_list_store_append (priv
->store_pseudo
,
160 gtk_list_store_set (priv
->store_pseudo
,
162 PSEUDO_COL_NAME
, hkl_parameter_name_get (*parameter
),
163 PSEUDO_COL_VALUE
, hkl_parameter_value_unit_get (*parameter
),
164 PSEUDO_COL_PSEUDO
, *parameter
,
171 update_mode (HklGuiEngine
* self
)
173 HklGuiEnginePrivate
*priv
= HKL_GUI_ENGINE_GET_PRIVATE(self
);
174 GtkTreeIter iter
= {0};
175 GtkTreeIter current
= {0};
179 g_return_if_fail (self
!= NULL
);
181 modes
= hkl_engine_modes(priv
->engine
);
182 gtk_list_store_clear (priv
->store_mode
);
183 darray_foreach(mode
, *modes
){
184 gtk_list_store_append (priv
->store_mode
,
186 gtk_list_store_set (priv
->store_mode
,
188 MODE_COL_NAME
, hkl_mode_name(*mode
),
190 if(*mode
== hkl_engine_mode(priv
->engine
))
194 /* now set the active row with the current mode */
195 gtk_combo_box_set_active_iter(priv
->combobox1
, ¤t
);
200 update_mode_parameters (HklGuiEngine
* self
)
202 HklGuiEnginePrivate
*priv
= HKL_GUI_ENGINE_GET_PRIVATE(self
);
205 g_return_if_fail (self
!= NULL
);
207 mode
= hkl_engine_mode (priv
->engine
);
209 darray_parameter
*parameters
;
210 HklParameter
**parameter
;
212 parameters
= hkl_mode_parameters(mode
);
213 if(darray_size (*parameters
)){
214 GtkTreeIter iter
= {0};
216 gtk_list_store_clear (priv
->store_mode_parameter
);
217 darray_foreach (parameter
, *parameters
){
218 gtk_list_store_append (priv
->store_mode_parameter
, &iter
);
219 gtk_list_store_set (priv
->store_mode_parameter
,
221 PSEUDO_COL_NAME
, hkl_parameter_name_get (*parameter
),
222 PSEUDO_COL_VALUE
, hkl_parameter_value_unit_get (*parameter
),
225 gtk_expander_set_expanded (priv
->expander1
, TRUE
);
226 gtk_widget_show (GTK_WIDGET (priv
->expander1
));
228 gtk_widget_hide (GTK_WIDGET (priv
->expander1
));
230 gtk_widget_hide (GTK_WIDGET (priv
->expander1
));
235 hkl_gui_engine_update (HklGuiEngine
* self
)
237 HklGuiEnginePrivate
*priv
= HKL_GUI_ENGINE_GET_PRIVATE(self
);
238 GtkTreeViewColumn
* col
;
241 g_return_if_fail (self
!= NULL
);
243 update_pseudo_axis (self
);
245 col
= gtk_tree_view_get_column(priv
->treeview1
, 1);
246 cells
= gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(col
));
247 g_object_set (G_OBJECT(cells
->data
), "background", NULL
, NULL
);
252 void hkl_gui_engine_set_engine (HklGuiEngine
*self
,
255 HklGuiEnginePrivate
*priv
= HKL_GUI_ENGINE_GET_PRIVATE(self
);
257 g_return_if_fail (self
!= NULL
);
258 g_return_if_fail (engine
!= NULL
);
260 priv
->engine
= engine
;
262 gtk_label_set_label (priv
->label2
,
263 hkl_engine_name(priv
->engine
));
265 update_pseudo_axis (self
);
267 update_mode_parameters (self
);
269 hkl_gui_engine_update(self
);
273 combobox1_changed_cb (GtkComboBox
* combobox
, HklGuiEngine
* self
)
275 HklGuiEnginePrivate
*priv
= HKL_GUI_ENGINE_GET_PRIVATE(self
);
277 GtkTreeIter iter
= {0};
279 g_return_if_fail (self
!= NULL
);
280 g_return_if_fail (combobox
!= NULL
);
282 if(gtk_combo_box_get_active_iter(combobox
, &iter
)){
283 gtk_tree_model_get(GTK_TREE_MODEL(priv
->store_mode
),
285 MODE_COL_NAME
, &mode
,
287 hkl_engine_select_mode_by_name(priv
->engine
, mode
);
288 update_mode_parameters(self
);
293 _set_pseudo(GtkTreeModel
*model
,
298 HklParameter
*parameter
;
301 gtk_tree_model_get (model
, iter
,
302 PSEUDO_COL_PSEUDO
, ¶meter
,
303 PSEUDO_COL_VALUE
, &value
,
305 hkl_parameter_value_unit_set(parameter
, value
, NULL
);
311 button1_clicked_cb (GtkButton
* button
, HklGuiEngine
* self
)
313 HklGuiEnginePrivate
*priv
= HKL_GUI_ENGINE_GET_PRIVATE(self
);
315 g_return_if_fail (self
!= NULL
);
316 g_return_if_fail (button
!= NULL
);
318 gtk_tree_model_foreach(GTK_TREE_MODEL(priv
->store_pseudo
),
322 g_signal_emit(self
, signals
[CHANGED
], 0);
327 button2_clicked_cb (GtkButton
* button
, HklGuiEngine
* self
)
329 HklGuiEnginePrivate
*priv
= HKL_GUI_ENGINE_GET_PRIVATE(self
);
331 g_return_if_fail (self
!= NULL
);
332 g_return_if_fail (button
!= NULL
);
334 if(hkl_engine_initialize(priv
->engine
, NULL
)){
335 /* some init method update the parameters */
336 update_mode_parameters(self
);
342 cell_tree_view_pseudo_axis_value_edited_cb (GtkCellRendererText
* renderer
,
344 const gchar
* new_text
,
347 HklGuiEnginePrivate
*priv
= HKL_GUI_ENGINE_GET_PRIVATE(self
);
348 GtkTreeIter iter
= {0};
349 GtkListStore
* model
= NULL
;
351 g_return_if_fail (self
!= NULL
);
352 g_return_if_fail (renderer
!= NULL
);
353 g_return_if_fail (path
!= NULL
);
354 g_return_if_fail (new_text
!= NULL
);
356 if (gtk_tree_model_get_iter_from_string (GTK_TREE_MODEL(priv
->store_pseudo
),
359 HklPseudoAxis
* pseudo
= NULL
;
361 value
= atof(new_text
);
362 gtk_tree_model_get (GTK_TREE_MODEL(priv
->store_pseudo
),
364 PSEUDO_COL_PSEUDO
, &pseudo
, -1);
367 g_object_set (G_OBJECT(renderer
), "background", "red", NULL
, NULL
);
368 gtk_list_store_set (priv
->store_pseudo
,
370 PSEUDO_COL_VALUE
, value
,
376 static void hkl_gui_engine_class_init (HklGuiEngineClass
* class)
378 GObjectClass
*gobject_class
= G_OBJECT_CLASS (class);
380 g_type_class_add_private (class, sizeof (HklGuiEnginePrivate
));
382 /* virtual methods */
383 gobject_class
->finalize
= finalize
;
384 gobject_class
->set_property
= set_property
;
385 gobject_class
->get_property
= get_property
;
388 obj_properties
[PROP_ENGINE
] =
389 g_param_spec_pointer ("engine",
391 "The Hkl Engine used underneath",
392 G_PARAM_CONSTRUCT_ONLY
|
394 G_PARAM_STATIC_STRINGS
);
396 g_object_class_install_properties (gobject_class
,
402 g_signal_new ("changed",
405 0, /* class offset */
406 NULL
, /* accumulator */
407 NULL
, /* accu_data */
408 g_cclosure_marshal_VOID__VOID
,
409 G_TYPE_NONE
, /* return_type */
414 static void _connect_renderer(gpointer data
, gpointer user_data
)
416 GtkCellRenderer
*renderer
= GTK_CELL_RENDERER(data
);
417 HklGuiEngine
*self
= HKL_GUI_ENGINE(user_data
);
419 g_signal_connect_object (renderer
,
421 (GCallback
) cell_tree_view_pseudo_axis_value_edited_cb
,
425 static void hkl_gui_engine_init (HklGuiEngine
* self
)
427 HklGuiEnginePrivate
*priv
= HKL_GUI_ENGINE_GET_PRIVATE(self
);
429 GtkTreeViewColumn
* col
;
433 priv
->builder
= builder
= gtk_builder_new ();
435 gtk_builder_add_from_file (builder
, "pseudo.ui", NULL
);
437 priv
->frame1
= GTK_FRAME(gtk_builder_get_object(builder
, "frame1"));
438 priv
->label2
= GTK_LABEL(gtk_builder_get_object(builder
, "label2"));
439 priv
->combobox1
= GTK_COMBO_BOX(gtk_builder_get_object(builder
, "combobox1"));
440 priv
->expander1
= GTK_EXPANDER(gtk_builder_get_object(builder
, "expander1"));
441 priv
->treeview1
= GTK_TREE_VIEW(gtk_builder_get_object(builder
, "treeview1"));
442 priv
->button1
= GTK_BUTTON(gtk_builder_get_object(builder
, "button1"));
443 priv
->button2
= GTK_BUTTON(gtk_builder_get_object(builder
, "button2"));
445 priv
->store_mode
= GTK_LIST_STORE(gtk_builder_get_object (builder
, "liststore1"));
446 priv
->store_pseudo
= GTK_LIST_STORE(gtk_builder_get_object (builder
, "liststore2"));
447 priv
->store_mode_parameter
= GTK_LIST_STORE(gtk_builder_get_object (builder
, "liststore3"));
449 gtk_builder_connect_signals (builder
, self
);
451 g_signal_connect_object (priv
->combobox1
,
453 (GCallback
) combobox1_changed_cb
,
456 g_signal_connect_object (priv
->button1
,
458 (GCallback
) button1_clicked_cb
,
461 g_signal_connect_object (priv
->button2
,
463 (GCallback
) button2_clicked_cb
,
466 col
= gtk_tree_view_get_column (priv
->treeview1
, 1);
467 cells
= gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(col
));
468 g_list_foreach(cells
, _connect_renderer
, self
);