CEBL  2.1
CEBLGtkWidgetDetachable.cpp
Go to the documentation of this file.
1 /* CEBLGtkWidgetDetachable.cpp
2  * \author Jeshua Bratman
3  *
4  * Sublclass to CEBLGtkWidget which automatically adds
5  * detach button and functionality to create detachable
6  * widgets.
7  */
8 
9 
11 #include "WidgetUtils.hpp"
12 
14 {
15  this->is_detached = false;
16  this->outer_container = gtk_vbox_new(false, 0);
17  this->inner_container = gtk_vbox_new(false, 0);
18  //pack parent class' container into the inner container
19  gtk_box_pack_start(GTK_BOX(this->inner_container),this->cebl_gtk_widget_container,true,true,0);
20  //pack inner container into outer container for now (until it is detached)
21  gtk_box_pack_start(GTK_BOX(this->outer_container),this->inner_container,true,true,0);
22 
23  //reference widget to keep it alive
24  g_object_ref(this->outer_container);
25  g_object_ref(this->inner_container);
26 
27 
28  //detached toggle
29  GtkWidget *box_controls = gtk_hbox_new(false, 0);
30  toggle_detached = gtk_check_button_new();
31 
32  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle_detached),false);
33  g_signal_connect(G_OBJECT(toggle_detached),
34  "toggled",
35  G_CALLBACK(CB_toggleDetached),
36  (gpointer) this);
37 
38  gtk_box_pack_end(GTK_BOX(box_controls),gtk_label_new(") "),false,false,2);
39  gtk_box_pack_end(GTK_BOX(box_controls),toggle_detached,false,false,2);
40  gtk_box_pack_end(GTK_BOX(box_controls),gtk_label_new(" Detach ("),false,false,2);
41  gtk_box_pack_end(GTK_BOX(inner_container),box_controls,false,false,5);
42  gtk_widget_show_all(outer_container);
43 }
44 
45 //destructor
47 {
48  //dereference widgets so they get freed
49  g_object_unref(this->outer_container);
50  g_object_unref(this->inner_container);
51 }
52 
54 {
55  if(this->is_detached)
56  {
57  // this->CB_toggleDetached(NULL,this);
58  gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(this->toggle_detached),false);
59  }
60  gtk_widget_hide(this->cebl_gtk_widget_container);
61 }
62 
63 //--------------------------------------------------
64 
65 
66 void CEBLGtkWidgetDetachable::CB_toggleDetached(GtkWidget *w, gpointer data)
67 {
69 
70  if(!widget->is_detached)
71  //OPEN WINDOW
72  {
73  //open window
74  widget->detached_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
75  GtkWidget * window = widget->detached_window;
76  g_signal_connect(G_OBJECT(window), "delete_event",
77  G_CALLBACK(CB_windowDelete), widget);
78  //set window options
79  gtk_window_set_title(GTK_WINDOW(window), "Detached CEBL View");
80  gtk_window_set_position(GTK_WINDOW(window),GTK_WIN_POS_CENTER);
81  // gtk_window_set_transient_for(GTK_WINDOW(window),GTK_WINDOW(WidgetUtils::getMainWindow()));
82  gtk_window_set_destroy_with_parent(GTK_WINDOW(window), true);
83  gtk_window_set_default_size(GTK_WINDOW(window),800,600);
84 
85 
86  //remove interface box from main window and put it in this window
87  gtk_widget_ref(widget->inner_container);
88  gtk_container_remove(GTK_CONTAINER(widget->outer_container),widget->inner_container);
89  gtk_container_add(GTK_CONTAINER(window),widget->inner_container);
90  gtk_widget_unref(widget->inner_container);
91 
92  //SHOW WINDOW
93  gtk_widget_show_all(window);
94 
95  //set flag
96  widget->is_detached = true;
97  }
98  else
99  {
100  //remove interface box from window and put it in the main window
101  gtk_widget_ref(widget->inner_container);
102  gtk_container_remove(GTK_CONTAINER(widget->detached_window),widget->inner_container);
103  gtk_container_add(GTK_CONTAINER(widget->outer_container),widget->inner_container);
104  gtk_widget_unref(widget->inner_container);
105 
106  gtk_widget_destroy(widget->detached_window);
107  widget->detached_window=NULL;
108 
109  //set flag
110  widget->is_detached = false;
111  }
112 }
113 
114 gboolean CEBLGtkWidgetDetachable::CB_windowDelete(GtkWidget *w, GdkEvent *event, gpointer data)
115 {
117  widget->CB_toggleDetached(w, data);
118  return true;
119 }
120 
121