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-2010 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>
22 #include "hkl-gui-pseudoaxes.h"
24 PseudoAxesFrame::PseudoAxesFrame(HklPseudoAxisEngine
*engine
)
26 Gtk::CellRenderer
* renderer
;
31 _refGlade
= Gtk::Builder::create();
33 _refGlade
->add_from_file("pseudo.ui");
35 std::string filename
= Glib::build_filename(PKGDATA
, "pseudo.ui");
36 if(!_refGlade
->add_from_file(filename
))
41 _refGlade
->get_widget("frame1", _frame1
);
42 _refGlade
->get_widget("label2", _label2
);
43 _refGlade
->get_widget("combobox1", _combobox1
);
44 _refGlade
->get_widget("expander1", _expander1
);
45 _refGlade
->get_widget("treeview1", _treeview1
);
46 _refGlade
->get_widget("treeview2", _treeview2
);
47 _refGlade
->get_widget("button1", _button1
);
48 _refGlade
->get_widget("button2", _button2
);
51 _mode_ListStore
= Glib::RefPtr
<Gtk::ListStore
>::cast_dynamic(
52 _refGlade
->get_object("liststore1"));
53 _pseudoAxis_ListStore
= Glib::RefPtr
<Gtk::ListStore
>::cast_dynamic(
54 _refGlade
->get_object("liststore2"));
55 _mode_parameter_ListStore
= Glib::RefPtr
<Gtk::ListStore
>::cast_dynamic(
56 _refGlade
->get_object("liststore3"));
59 _label2
->set_label(_engine
->info
->name
);
61 // update all the liststore
62 this->updatePseudoAxis();
64 this->updateModeParameters();
67 _combobox1
->signal_changed().connect(
68 sigc::mem_fun(*this, &PseudoAxesFrame::on_combobox1_changed
) );
70 renderer
= _treeview1
->get_column_cell_renderer(1); // 1 is the index of the value column
71 dynamic_cast<Gtk::CellRendererText
*>(renderer
)->signal_edited().connect(
72 sigc::mem_fun(*this, &PseudoAxesFrame::on_cell_TreeView_pseudoAxis_value_edited
));
74 _button1
->signal_clicked ().connect (
75 sigc::mem_fun (*this, &PseudoAxesFrame::on_button1_clicked
) );
77 _button2
->signal_clicked ().connect (
78 sigc::mem_fun (*this, &PseudoAxesFrame::on_button2_clicked
) );
80 renderer
= _treeview2
->get_column_cell_renderer(1); // 1 is the index of the value column
81 dynamic_cast<Gtk::CellRendererText
*>(renderer
)->signal_edited().connect(
82 sigc::mem_fun(*this, &PseudoAxesFrame::on_cell_treeview2_mode_parameter_value_edited
));
87 PseudoAxesFrame::~PseudoAxesFrame(void)
91 void PseudoAxesFrame::update(void)
93 Gtk::CellRenderer
*renderer
;
94 this->updatePseudoAxis();
96 renderer
= _treeview1
->get_column_cell_renderer(1); // 1 is the index of the value column
97 renderer
->property_cell_background().set_value("white");
104 void PseudoAxesFrame::on_combobox1_changed(void)
106 Gtk::TreeModel::iterator iter
= _combobox1
->get_active();
107 Gtk::ListStore::Row row
= *(iter
);
108 hkl_pseudo_axis_engine_select_mode(_engine
, row
[_mode_columns
.mode
]);
109 this->updateModeParameters();
110 this->_signal_changed();
113 void PseudoAxesFrame::on_cell_TreeView_pseudoAxis_value_edited(Glib::ustring
const & spath
,
114 Glib::ustring
const & newText
)
117 HklPseudoAxis
*pseudo
;
119 Gtk::TreePath
path(spath
);
120 Gtk::TreeModel::iterator iter
= _pseudoAxis_ListStore
->get_iter(path
);
121 Gtk::ListStore::Row row
= *(iter
);
123 sscanf(newText
.c_str(), "%lf", &value
);
125 pseudo
= row
[_pseudoAxis_columns
.pseudo
];
127 Gtk::CellRenderer
*renderer
;
129 renderer
= _treeview1
->get_column_cell_renderer(1); // 1 is the index of the value column
130 renderer
->property_cell_background().set_value("red");
131 hkl_parameter_set_value_unit((HklParameter
*)pseudo
, value
);
132 row
[_pseudoAxis_columns
.value
] = value
;
136 void PseudoAxesFrame::on_button1_clicked(void)
138 if(hkl_pseudo_axis_engine_set(_engine
, NULL
)){
139 HklGeometryListItem
*top
;
141 top
= list_top(&_engine
->engines
->geometries
->items
,
142 HklGeometryListItem
, node
);
143 hkl_geometry_init_geometry(_engine
->engines
->geometry
, top
->geometry
);
144 this->_signal_changed();
148 void PseudoAxesFrame::on_button2_clicked(void)
150 if(hkl_pseudo_axis_engine_initialize(_engine
, NULL
))
151 this->updateModeParameters(); //some initialize function modify the parameters
154 void PseudoAxesFrame::on_cell_treeview2_mode_parameter_value_edited(Glib::ustring
const & spath
,
155 Glib::ustring
const & newText
)
158 HklParameter
*parameter
;
160 Gtk::TreePath
path(spath
);
161 Gtk::TreeModel::iterator iter
= _mode_parameter_ListStore
->get_iter(path
);
162 Gtk::ListStore::Row row
= *(iter
);
164 sscanf(newText
.c_str(), "%lf", &value
);
166 parameter
= row
[_mode_parameter_columns
.parameter
];
168 hkl_parameter_set_value_unit(parameter
, value
);
169 row
[_mode_parameter_columns
.value
] = value
;
177 void PseudoAxesFrame::updatePseudoAxis(void)
179 HklPseudoAxis
*pseudo_axis
;
181 _pseudoAxis_ListStore
->clear();
182 list_for_each(&_engine
->pseudo_axes
, pseudo_axis
, list
){
183 Gtk::TreeRow row
= *(_pseudoAxis_ListStore
->append());
184 row
[_pseudoAxis_columns
.name
] = pseudo_axis
->parameter
.name
;
185 row
[_pseudoAxis_columns
.value
] = hkl_parameter_get_value_unit(&pseudo_axis
->parameter
);
186 row
[_pseudoAxis_columns
.pseudo
] = pseudo_axis
;
190 void PseudoAxesFrame::updateMode(void)
192 HklPseudoAxisEngineMode
*mode
;;
194 _mode_ListStore
->clear();
195 list_for_each(&this->_engine
->modes
, mode
, list
){
196 Gtk::TreeRow row
= *(_mode_ListStore
->append());
197 row
[_mode_columns
.name
] = mode
->info
->name
;
198 row
[_mode_columns
.mode
] = mode
;
202 void PseudoAxesFrame::updateModeParameters(void)
207 size_t len
= _engine
->mode
->parameters_len
;
209 _mode_parameter_ListStore
->clear();
210 for(i
=0; i
<len
; ++i
){
211 Gtk::TreeRow row
= *(_mode_parameter_ListStore
->append());
212 row
[_mode_parameter_columns
.name
] = _engine
->mode
->parameters
[i
].name
;
213 row
[_mode_parameter_columns
.value
] = hkl_parameter_get_value_unit(&_engine
->mode
->parameters
[i
]);
214 row
[_mode_parameter_columns
.parameter
] = &_engine
->mode
->parameters
[i
];
216 _expander1
->set_expanded(1);
228 PseudoAxesFrame::type_signal_changed
PseudoAxesFrame::signal_changed(void)
230 return _signal_changed
;