CEBL  2.1
InterfaceCombo.cpp
Go to the documentation of this file.
1 
9 #include "CEBLViewGTK.hpp"
10 
11 #include "InterfaceCombo.hpp"
12 #include "Exceptions.hpp"
15 #include "interfaces/RobotPie.hpp"
16 #include "interfaces/CursorPie.hpp"
17 
18 using namespace std;
19 
20 
21 //constructor
23 {
24  this->view = view;
25  this->updating_view = false;
26  this->selected_interface = 0;
27 
28  //currently list of interfaces is hardcoded in here
29  //eventually this should change if we make a plugin
30  //based system for the interfaces
31  this->interfaces.push_back("Simple Pie");
32  this->interface_pointers.push_back(NULL);
33  this->interfaces.push_back("Keyboard Pie");
34  this->interface_pointers.push_back(NULL);
35  this->interfaces.push_back("Robot Pie");
36  this->interface_pointers.push_back(NULL);
37  this->interfaces.push_back("Cursor Pie");
38  this->interface_pointers.push_back(NULL);
39 }
40 
42 {
43  //delete all created interfaces
44  for(unsigned int i=0;i < interface_pointers.size();i++)
45  {
46  if(this->interface_pointers[this->selected_interface] != NULL)
47  delete this->interface_pointers[i];
48  }
49 }
50 
51 //get pointer to selected interface
52 //and creates the interface if it doesn't already exist
53 
55 {
56  EEGInterface * ret = this->interface_pointers[this->selected_interface];
57  //create a pointer to the interface if it doesn't yet exist
58  if(ret == NULL)
59  {
60  if(this->interfaces[this->selected_interface] == "Simple Pie")
61  {
62  this->interface_pointers[this->selected_interface] = new PieInterface();
63  }
64  else if(this->interfaces[this->selected_interface] == "Keyboard Pie")
65  {
66  this->interface_pointers[this->selected_interface] = new KeyboardPie();
67  }
68  else if(this->interfaces[this->selected_interface] == "Robot Pie")
69  {
70  this->interface_pointers[this->selected_interface] = new RobotPie();
71  }
72  else if(this->interfaces[this->selected_interface] == "Cursor Pie")
73  {
74  this->interface_pointers[this->selected_interface] = new CursorPie();
75  }
76  ret = this->interface_pointers[this->selected_interface];
77  }
78  CEBLModel * model = view->getModel();
79  ret->setNumClasses(model->trainingGetNumClasses());
81  return ret;
82 }
83 
84 //create a new combo widget
86 {
87  GtkWidget* combo = gtk_combo_box_new_text();
88 
89  this->combos.push_back(combo);
90  this->num_interfaces.push_back(0);
91  this->updateComboBox(combos.size()-1);
92 
93  g_signal_connect(G_OBJECT(combo),
94  "changed",
95  G_CALLBACK(CB_changeInterface),
96  (gpointer) this);
97  return combo;
98 }
99 
100 //update the view from the model
102 {
103  this->updating_view = true;
104  for (unsigned int i=0;i<combos.size();i++)
105  {
106  this->updateComboBox(i);
107  }
108  this->updating_view = false;
109 }
110 
111 
112 //update a combo box from the model
113 void InterfaceCombo::updateComboBox(int index)
114 {
115  GtkWidget * combo = combos[index];
116  int num_interfaces = this->num_interfaces[index];
117 
118  //remove all the previous interfaces
119  for(int i=num_interfaces-1;i>=0;i--)
120  {
121  gtk_combo_box_remove_text(GTK_COMBO_BOX(combo),i);
122  }
123 
124  //eventually we might want to update interfaces
125  //vector here if its going to change.
126  //currently this whole function is a little unnecessary
127  //because interfaces are not changing dynamically
128  num_interfaces = interfaces.size();
129 
130  int selected = this->selected_interface;
131  for(int i=0;i<num_interfaces;i++)
132  {
133  gtk_combo_box_append_text(GTK_COMBO_BOX(combo),interfaces[i].c_str());
134  }
135  gtk_combo_box_set_active(GTK_COMBO_BOX(combo),selected);
136  this->num_interfaces[index] = num_interfaces;
137 }
138 
139 //returns the selected interface ID
141 {
142  return this->selected_interface;
143 }
144 
145 //CALLBACKS
146 void InterfaceCombo::CB_changeInterface(GtkWidget * w, gpointer data)
147 {
148  InterfaceCombo * d = (InterfaceCombo*)data;
149  if(!d->updating_view)
150  {
151  string selected_text = gtk_combo_box_get_active_text(GTK_COMBO_BOX(w));
152  for(unsigned int i=0; i < d->interfaces.size();i++)
153  if(selected_text==d->interfaces[i])
154  d->selected_interface = i;
155  d->view->updateView();
156  d->updateView();
157  }
158 }
159 
160