CEBL  2.1
WidgetUtils.cpp
Go to the documentation of this file.
1 
8 #include "WidgetUtils.hpp"
9 #include <string>
10 #include <iostream>
11 #include "../model/FileUtils.hpp"
12 #include "../model/Timer.hpp"
13 //boost includes
14 #define BOOST_FILESYSTEM_VERSION 2
15 #include <boost/filesystem/operations.hpp>
16 #include <boost/filesystem/convenience.hpp>
17 #include <boost/filesystem/fstream.hpp>
18 #include <boost/filesystem/path.hpp>
19 
20 
21 using std::cout;
22 using std::string;
23 namespace fs = boost::filesystem;
24 
25 //reference static members
26 GtkWidget * WidgetUtils::main_window;
27 bool WidgetUtils::wait_box_open = false;
28 bool WidgetUtils::wait_box_cancelled = false;
29 GtkWidget * WidgetUtils::wait_box_btn_cancel = NULL;
30 GtkWidget * WidgetUtils::wait_box_label_text = NULL;
31 double WidgetUtils::wait_box_progress = -1.0;
32 
33 //static methods
34 void WidgetUtils::Alert(const char *title, const char *text, GtkMessageType type)
35 {
36  cout << text << "\n";
37  GtkWidget *alert_dialog;
38  alert_dialog = gtk_message_dialog_new(GTK_WINDOW(main_window),
39  GTK_DIALOG_DESTROY_WITH_PARENT,
40  type,
41  GTK_BUTTONS_CLOSE,
42  "%s",
43  text);
44  gtk_window_set_title(GTK_WINDOW(alert_dialog),title);
45  gtk_dialog_run(GTK_DIALOG (alert_dialog));
46  gtk_widget_destroy(alert_dialog);
47 }
48 void WidgetUtils::Alert(const string title, const string text, GtkMessageType type)
49 {
50  WidgetUtils::Alert(title.c_str(),text.c_str(),type);
51 }
52 
53 void WidgetUtils::AlertWarning(const char *title, const char *text)
54 {
55  WidgetUtils::Alert(title,text,GTK_MESSAGE_INFO);
56 }
57 void WidgetUtils::AlertWarning(const string title, const string text)
58 {
59  WidgetUtils::AlertWarning(title.c_str(),text.c_str());
60 }
61 void WidgetUtils::AlertError(const char *title, const char *text)
62 {
63  WidgetUtils::Alert(title,text,GTK_MESSAGE_ERROR);
64 }
65 void WidgetUtils::AlertError(const string title, const string text)
66 {
67  WidgetUtils::AlertError(title.c_str(),text.c_str());
68 }
69 
70 bool WidgetUtils::Confirm(const char *title, const char *text, GtkMessageType type)
71 {
72  GtkWidget *confirm_dialog;
73  confirm_dialog = gtk_message_dialog_new(GTK_WINDOW(main_window),
74  GTK_DIALOG_DESTROY_WITH_PARENT,
75  type,
76  GTK_BUTTONS_YES_NO,
77  "%s",
78  text);
79  gtk_window_set_title(GTK_WINDOW(confirm_dialog),title);
80  gint response = gtk_dialog_run(GTK_DIALOG (confirm_dialog));
81  gtk_widget_destroy(confirm_dialog);
82  return response==GTK_RESPONSE_YES;
83 }
84 
85 bool WidgetUtils::Confirm(const char *title, const char *text)
86 {
87  return WidgetUtils::Confirm(title,text,GTK_MESSAGE_QUESTION);
88 }
89 bool WidgetUtils::Confirm(const string title, const string text)
90 {
91  return WidgetUtils::Confirm(title.c_str(),text.c_str());
92 }
93 bool WidgetUtils::Confirm(const string title, const string text, GtkMessageType type)
94 {
95  return WidgetUtils::Confirm(title.c_str(),text.c_str(), type);
96 }
97 
98 
99 //----------------------------------------------------------------------
100 
101 string WidgetUtils::selectSaveFile(string extension)
102 {
103  string ret_filename;
104  GtkWidget *dialog;
105  dialog = gtk_file_chooser_dialog_new ("Save As",
106  GTK_WINDOW(WidgetUtils::getMainWindow()),
107  GTK_FILE_CHOOSER_ACTION_SAVE,
108  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
109  GTK_STOCK_SAVE, GTK_RESPONSE_OK,
110  NULL);
111  gtk_widget_set_size_request(dialog,400,600);
112 
113  while (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
114  {
115  char *tmp;
116  tmp = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
117  string filename = tmp;
118  g_free(tmp);
119 
120 
121  //add extension
122  if(extension != "")
123  {
124  fs::path full_path;
125  full_path = fs::system_complete(fs::path(filename, fs::native));
126  string leaf = full_path.leaf();
127  int dot = leaf.find(".");
128  string ext = "";
129  if(dot == -1)
130  ext = "."+extension;
131  filename += ext;
132  }
133 
134 
135  if(FileUtils::fileExists(filename))
136  {
137  //file already exists
138  if(!WidgetUtils::Confirm("Overwrite file?","\"" + filename + "\" exists. Overwrite?"))
139  {
140  continue;
141  }
142  }
143  ret_filename = filename;
144  break;
145  }
146  gtk_widget_destroy (dialog);
147  return ret_filename;
148 }
149 
150 
151 //----------------------------------------------------------------------
152 
154 {
155  string ret_filename;
156 
157  GtkWidget *dialog;
158  dialog = gtk_file_chooser_dialog_new ("Load",
159  GTK_WINDOW(WidgetUtils::getMainWindow()),
160  GTK_FILE_CHOOSER_ACTION_OPEN,
161  GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
162  GTK_STOCK_OPEN, GTK_RESPONSE_OK,
163  NULL);
164  gtk_widget_set_size_request(dialog,400,600);
165 
166  while (gtk_dialog_run (GTK_DIALOG (dialog)) == GTK_RESPONSE_OK)
167  {
168  char *filename;
169 
170  filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (dialog));
171 
172  ret_filename = filename;
173  g_free (filename);
174  break;
175  }
176 
177  gtk_widget_destroy (dialog);
178 
179  return ret_filename;
180 }
181 
182 
183 
184 
185 //----------------------------------------------------------------------
186 // WaitBox
187 
188 void WidgetUtils::waitBoxShow(const char * text, bool show_progress_bar)
189 {
190  wait_box_progress = -1.0;
191  WidgetUtils::waitBox(true, text, show_progress_bar);
192 }
193 
195 {
196  WidgetUtils::waitBox(false, NULL);
197 }
198 
199 void WidgetUtils::waitBoxSetProgress(double progress)
200 {
201  wait_box_progress = progress;
202 }
203 
205 {
206  return wait_box_cancelled;
207 }
208 
209 void WidgetUtils::waitBoxSetText(const char *text)
210 {
211  string str_text = "<small>"+string(text)+"</small>";
212  if(GTK_IS_LABEL(wait_box_label_text))
213  gtk_label_set_markup(GTK_LABEL(wait_box_label_text),str_text.c_str());
214 }
215 
217 {
218  if(GTK_IS_BUTTON(wait_box_btn_cancel))
219  {
220  if(a)
221  gtk_widget_show(wait_box_btn_cancel);
222  else
223  gtk_widget_hide(wait_box_btn_cancel);
224  }
225  wait_box_cancelled = false;
226 }
227 void WidgetUtils::CB_waitBoxCancel(GtkWidget *w, gpointer data)
228 {
229  WidgetUtils::wait_box_cancelled = true;
230 }
231 
232 gint WidgetUtils::pulseProgressBar(gpointer progress)
233 {
234  bool is_progress = GTK_IS_PROGRESS_BAR(progress);
235  if(is_progress)
236  {
237  if(wait_box_progress < 0)
238  gtk_progress_bar_pulse(GTK_PROGRESS_BAR(progress));
239  else
240  gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(progress),
241  wait_box_progress);
242  }
243  return is_progress;
244 }
245 
246 void WidgetUtils::waitBox(bool show, const char * text, bool show_progress_bar)
247 {
248  static GtkWidget *dialog;
249  if(show && !wait_box_open)
250  {
251  wait_box_open = true;
252  wait_box_cancelled = false;
253 
254  gtk_widget_set_sensitive(main_window,false);
255 
256  dialog = gtk_window_new(GTK_WINDOW_POPUP);
257  gtk_window_set_title(GTK_WINDOW(dialog), "Wait");
258  gtk_window_set_position(GTK_WINDOW(dialog),GTK_WIN_POS_CENTER_ON_PARENT);
259  gtk_window_set_transient_for(GTK_WINDOW(dialog),GTK_WINDOW(main_window));
260  gtk_window_set_destroy_with_parent(GTK_WINDOW(dialog), true);
261  gtk_window_set_default_size(GTK_WINDOW(dialog),250,150);
262 
263 
264  //create container and add text
265  GtkWidget * container = gtk_vbox_new(false, 0);
266  wait_box_label_text = gtk_label_new(text);
267  waitBoxSetText(text);
268  gtk_box_pack_start(GTK_BOX(container),
269  wait_box_label_text,true, true, 0);
270 
271  //add progress bar
272  if(show_progress_bar)
273  {
274  GtkWidget * progress = gtk_progress_bar_new();
275  gtk_box_pack_start(GTK_BOX(container),
276  progress, false, false, 10);
277  gtk_widget_set_size_request(progress,200,30);
278  g_timeout_add(150, pulseProgressBar, gpointer(progress));
279  }
280  //add cancel button
281  wait_box_btn_cancel = gtk_button_new_with_label("Cancel");
282  g_signal_connect(G_OBJECT(wait_box_btn_cancel),
283  "clicked",
284  G_CALLBACK(CB_waitBoxCancel),
285  NULL);
286 
287  GtkWidget * cancel_btn_box = gtk_hbutton_box_new();
288  gtk_button_box_set_layout(GTK_BUTTON_BOX(cancel_btn_box),GTK_BUTTONBOX_CENTER);
289  gtk_widget_set_size_request(wait_box_btn_cancel,60,25);
290  gtk_box_pack_start(GTK_BOX(cancel_btn_box),
291  wait_box_btn_cancel,false, false, 5);
292  gtk_box_pack_start(GTK_BOX(container),
293  cancel_btn_box,false, false, 5);
294  gtk_widget_hide(wait_box_btn_cancel);
295 
296  //show widgets
297  GtkWidget * container_frame = gtk_viewport_new(NULL,NULL);
298  gtk_container_border_width(GTK_CONTAINER(container_frame),2);
299  gtk_container_add(GTK_CONTAINER(container_frame), container);
300  gtk_container_add(GTK_CONTAINER(dialog), container_frame);
301  gtk_widget_show_all(dialog);
302  gtk_widget_hide(wait_box_btn_cancel);
303 
304  //update gui
305  while(gtk_events_pending())
306  {
307  gtk_main_iteration();
308  }
309  }
310  else if(!show && wait_box_open)
311  {
312  gtk_widget_destroy(dialog);
313  gtk_widget_set_sensitive(main_window,true);
314  wait_box_open = false;
315  }
316 }
317