stage-tab.cc 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
  2. /*
  3. * stage-tab.cc
  4. * Copyright (C) 2017 Unknown <francois@gautrais.eu>
  5. *
  6. * histodexc is free software: you can redistribute it and/or modify it
  7. * under the terms of the GNU General Public License as published by the
  8. * Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * histodexc is distributed in the hope that it will be useful, but
  12. * WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  14. * See the GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License along
  17. * with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #include "stage-tab.h"
  20. #include "stage.h"
  21. #include "g-window.h"
  22. #include "resource-tab.h"
  23. #include "utils.h"
  24. #include <cstdlib>
  25. static void on_save_clicked(GtkWidget* gtk, gpointer ud)
  26. {
  27. //printf("Save clicked\n");
  28. StageTab* z = (StageTab*) ((CallbackArg*)ud)->tab;
  29. z->on_save_clicked ();
  30. }
  31. static void on_click_res(GtkButton* gtk, gpointer ud)
  32. {
  33. //printf("Click res\n");
  34. StageTab* z = (StageTab*) ((CallbackArg*)ud)->tab;
  35. z->on_click_res ();
  36. }
  37. static void on_select(GtkTreeView* b, gpointer ud)
  38. {
  39. //printf("Select\n");
  40. StageTab* z = (StageTab*) ((CallbackArg*)ud)->tab;
  41. z->on_select ();
  42. }
  43. static void on_select_res(GtkTreeView* b, gpointer ud)
  44. {
  45. //printf("Select res\n");
  46. StageTab* z = (StageTab*) ((CallbackArg*)ud)->tab;
  47. z->on_select_res ();
  48. }
  49. StageTab::StageTab(GtkWidget *window, GtkBuilder *builder, ResourceTab* tab)
  50. : Tab(window, builder)
  51. {
  52. CallbackArg* mca = new CallbackArg (this);
  53. m_lock = false;
  54. m_resTab=tab;
  55. m_root=GTK_BOX(gtk_builder_get_object(m_builder, "box_root"));
  56. m_list=GTK_TREE_VIEW(gtk_builder_get_object(m_builder, "tv_stage"));
  57. m_listRes=GTK_TREE_VIEW(gtk_builder_get_object(m_builder, "tv_stage_res"));
  58. m_devRes=GTK_BUTTON(gtk_builder_get_object(m_builder, "stage_dev_res"));
  59. m_resource=GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_sta_resource"));
  60. m_nRes=GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spin_sta_res"));
  61. CONNECT(m_devRes, "clicked", ::on_click_res, mca);
  62. CONNECT(m_nRes, "value-changed", ::on_save_clicked, mca);
  63. CONNECT(m_resource, "changed", ::on_save_clicked, mca);
  64. m_listStore=GTK_LIST_STORE(gtk_builder_get_object(m_builder, "liststore3"));
  65. m_listResStore=m_resTab->getModel();
  66. gtk_tree_view_set_model (m_listRes, GTK_TREE_MODEL(m_listResStore));
  67. CONNECT(m_list, "cursor-changed", ::on_select, mca);
  68. CONNECT(m_listRes, "cursor-changed", ::on_select_res, mca);
  69. gtk_widget_hide(GTK_WIDGET(m_listRes));
  70. }
  71. StageTab::~StageTab()
  72. {
  73. }
  74. void StageTab::on_click_res()
  75. {
  76. if(gtk_widget_is_visible (GTK_WIDGET(m_listRes)))
  77. gtk_widget_hide(GTK_WIDGET(m_listRes));
  78. else
  79. gtk_widget_show(GTK_WIDGET(m_listRes));
  80. }
  81. void StageTab::on_select_res()
  82. {
  83. bool exists;
  84. std::string name;
  85. name=gtk_tree_view_get_str_selected(m_listRes, &exists);
  86. if(exists)
  87. {
  88. gtk_entry_set_text (m_resource, name.c_str());
  89. gtk_widget_show_all (GTK_WIDGET(m_root));
  90. }
  91. else
  92. {
  93. }
  94. }
  95. void StageTab::on_save_clicked()
  96. {
  97. bool exists;
  98. std::string old;
  99. old=gtk_tree_view_get_str_selected(m_list, &exists);
  100. Stage* s=NULL;
  101. if(m_lock) return ;
  102. for(int i=0; i< m_stages.size(); i++)
  103. {
  104. char tmp[16];
  105. sprintf(tmp, "%d", i+1);
  106. if(old==tmp)
  107. {
  108. s=&m_stages[i];
  109. //std::cout << " Stage " << m_stages[i].getResource() << std::endl;
  110. s->setResource (gtk_entry_get_text(m_resource));
  111. s->setNRes (gtk_spin_button_get_value (m_nRes));
  112. }
  113. }
  114. }
  115. void StageTab::on_select()
  116. {
  117. bool exists;
  118. std::string name;
  119. name=gtk_tree_view_get_str_selected(m_list, &exists);
  120. if(exists)
  121. {
  122. int x = atoi(name.c_str())-1;
  123. setupTab(m_stages[x]);
  124. gtk_widget_show_all (GTK_WIDGET(m_root));
  125. }
  126. else
  127. {
  128. gtk_widget_hide (GTK_WIDGET(m_root));
  129. }
  130. }
  131. void StageTab::open(Json::Value& val)
  132. {
  133. gtk_list_store_clear (m_listStore);
  134. m_stages.clear();
  135. gtk_widget_hide (GTK_WIDGET(m_root));
  136. for (Json::Value::iterator it = val.begin(); it != val.end(); ++it) {
  137. Json::Value v = (*it);
  138. Stage r(v);
  139. insert(v["stage"].asInt(), &r);
  140. }
  141. gtk_widget_hide (GTK_WIDGET(m_root));
  142. }
  143. Json::Value StageTab::getJson(bool b)
  144. {
  145. Json::Value v(Json::arrayValue);
  146. for(int i=0; i<m_stages.size(); i++)
  147. v[i]=m_stages[i].getJson();
  148. return v;
  149. }
  150. void StageTab::setNStage(int n)
  151. {
  152. if(n>m_stages.size())
  153. {
  154. while( n>m_stages.size() )
  155. {
  156. Stage s;
  157. s.setStage(m_stages.size()+1);
  158. s.setResource ("");
  159. insert (m_stages.size()+1, &s);
  160. }
  161. }else if(n<m_stages.size())
  162. {
  163. while( n<m_stages.size() )
  164. removeLast();
  165. }
  166. }
  167. void StageTab::setupTab(Data& _s)
  168. {
  169. Stage& s = Stage::cast(_s);
  170. m_lock = true;
  171. gtk_spin_button_set_value(m_nRes, s.getNRes ());
  172. gtk_entry_set_text(m_resource, s.getResource ().c_str());
  173. m_lock = false;
  174. }
  175. void StageTab::insert(int n, Stage* ra)
  176. {
  177. GtkTreeSelection* sel = gtk_tree_view_get_selection (m_list);
  178. GtkTreeIter app;
  179. Stage r;
  180. gtk_tree_model_get_iter_last (GTK_TREE_MODEL(m_listStore), &app);
  181. r.setStage(n);
  182. if(!ra) ra=&r;
  183. gtk_list_store_append(m_listStore, &app);
  184. gtk_list_store_set(m_listStore, &app, 0, tstr(n).c_str(), -1);
  185. m_stages.push_back(*ra);
  186. gtk_tree_selection_select_iter(sel, &app);
  187. on_select();
  188. }
  189. void StageTab::removeLast()
  190. {
  191. GtkTreeIter iter;
  192. int n;
  193. n=gtk_tree_model_iter_n_children (GTK_TREE_MODEL(m_listStore), NULL);
  194. if(gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(m_listStore), &iter, NULL, n-1))
  195. {
  196. gtk_list_store_remove (m_listStore, &iter);
  197. m_stages.erase(m_stages.begin() + m_stages.size()-1);
  198. }
  199. }
  200. Data& StageTab::getTab(bool& b)
  201. {
  202. static Stage s;
  203. return s;
  204. }
  205. void StageTab::write(const std::string& file)
  206. {
  207. }