resource-tab.cc 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
  2. /*
  3. * resource-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 "resource-tab.h"
  20. #include <fstream>
  21. static ResourceTab* gr = NULL;
  22. const char* typetostring(int i)
  23. {
  24. if(i==0) return "3D";
  25. if(i==1) return "Image";
  26. if(i==2) return "Audio";
  27. return "Video" ;
  28. }
  29. int stringtotype(const std::string & a)
  30. {
  31. if(a=="3D") return 0;
  32. if(a=="Image") return 1;
  33. if(a=="Audio") return 2;
  34. return 3;
  35. }
  36. static void on_save_clicked (GtkApplication* app, gpointer user_data)
  37. {
  38. CallbackArg* r = (CallbackArg*) user_data;
  39. ((ResourceTab*)r->tab)->on_save_clicked ();
  40. }
  41. static void on_type_changed (GtkToggleButton *togglebutton, gpointer user_data)
  42. {
  43. CallbackArg* r = (CallbackArg*) user_data;
  44. printf("%d\n", r->data);
  45. ((ResourceTab*)r->tab)->on_type_changed ((long)r->data);
  46. }
  47. static void on_add (GtkApplication* app, gpointer user_data)
  48. {
  49. CallbackArg* r = (CallbackArg*) user_data;
  50. ((ResourceTab*)r->tab)->on_add ();
  51. }
  52. static void on_remove (GtkApplication* app, gpointer user_data)
  53. {
  54. CallbackArg* r = (CallbackArg*) user_data;
  55. ((ResourceTab*)r->tab)->on_remove ();
  56. }
  57. static void on_select (GtkTreeView* app, gpointer user_data)
  58. {
  59. CallbackArg* r = (CallbackArg*) user_data;
  60. ((ResourceTab*)r->tab)->on_select ();
  61. }
  62. ResourceTab::ResourceTab(GtkWidget *window, GtkBuilder *builder)
  63. : Tab (window, builder)
  64. {
  65. gr=this;
  66. m_isLoading=false;
  67. m_name=GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_res_name"));
  68. m_stage=GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spin_res_stage"));
  69. CONNECT(m_stage, "value-changed", ::on_save_clicked, new CallbackArg(this));
  70. CONNECT(m_stage, "changed", ::on_save_clicked, new CallbackArg(this));
  71. CONNECT(m_name, "changed", ::on_save_clicked, new CallbackArg(this));
  72. m_type[0]=GTK_RADIO_BUTTON(gtk_builder_get_object(m_builder, "radio_res_3d"));
  73. m_type[1]=GTK_RADIO_BUTTON(gtk_builder_get_object(m_builder, "radio_res_image"));
  74. m_type[2]=GTK_RADIO_BUTTON(gtk_builder_get_object(m_builder, "radio_res_audio"));
  75. m_type[3]=GTK_RADIO_BUTTON(gtk_builder_get_object(m_builder, "radio_res_video"));
  76. for(int i=0; i<4; i++)
  77. CONNECT(m_type[i], "toggled", ::on_type_changed,
  78. (gpointer*)new CallbackArg(this,(gpointer*)i));
  79. m_comments=GTK_TEXT_VIEW(gtk_builder_get_object(m_builder, "textview_res_comments"));
  80. m_title=GTK_ENTRY(gtk_builder_get_object(m_builder, "entry_res_title"));
  81. CONNECT(m_title, "changed", ::on_save_clicked, new CallbackArg(this));
  82. m_position[0]=GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spin_res_posiiton_x"));
  83. m_position[1]=GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spin_res_posiiton_y"));
  84. m_position[2]=GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spin_res_posiiton_z"));
  85. CONNECT(m_position[0], "value-changed", ::on_save_clicked, new CallbackArg(this));
  86. CONNECT(m_position[1], "value-changed", ::on_save_clicked, new CallbackArg(this));
  87. CONNECT(m_position[2], "value-changed", ::on_save_clicked, new CallbackArg(this));
  88. m_rotation[0]=GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spin_res_rotation_x"));
  89. m_rotation[1]=GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spin_res_rotation_y"));
  90. m_rotation[2]=GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spin_res_rotation_z"));
  91. CONNECT(m_rotation[0], "value-changed", ::on_save_clicked, new CallbackArg(this));
  92. CONNECT(m_rotation[1], "value-changed", ::on_save_clicked, new CallbackArg(this));
  93. CONNECT(m_rotation[2], "value-changed", ::on_save_clicked, new CallbackArg(this));
  94. m_scale[0]=GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spin_res_scale_x"));
  95. m_scale[1]=GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spin_res_scale_y"));
  96. m_scale[2]=GTK_SPIN_BUTTON(gtk_builder_get_object(m_builder, "spin_res_scale_z"));
  97. CONNECT(m_scale[0], "value-changed", ::on_save_clicked, new CallbackArg(this));
  98. CONNECT(m_scale[1], "value-changed", ::on_save_clicked, new CallbackArg(this));
  99. CONNECT(m_scale[2], "value-changed", ::on_save_clicked, new CallbackArg(this));
  100. m_add=GTK_BUTTON(gtk_builder_get_object(m_builder, "button_res_add"));
  101. CONNECT(m_add, "clicked", ::on_add, new CallbackArg(this));
  102. m_delete=GTK_BUTTON(gtk_builder_get_object(m_builder, "button_res_del"));
  103. CONNECT(m_delete, "clicked", ::on_remove, new CallbackArg(this));
  104. m_files[0]=GTK_FILE_CHOOSER_BUTTON(gtk_builder_get_object(m_builder, "fcb_res_3d"));
  105. m_files[1]=GTK_FILE_CHOOSER_BUTTON(gtk_builder_get_object(m_builder, "fcb_res_image"));
  106. m_files[2]=GTK_FILE_CHOOSER_BUTTON(gtk_builder_get_object(m_builder, "fcb_res_audio"));
  107. m_files[3]=GTK_FILE_CHOOSER_BUTTON(gtk_builder_get_object(m_builder, "fcb_res_video"));
  108. CONNECT(m_files[0], "selection-changed", ::on_save_clicked, new CallbackArg(this));
  109. CONNECT(m_files[1], "selection-changed", ::on_save_clicked, new CallbackArg(this));
  110. CONNECT(m_files[2], "selection-changed", ::on_save_clicked, new CallbackArg(this));
  111. CONNECT(m_files[3], "selection-changed", ::on_save_clicked, new CallbackArg(this));
  112. m_layout[0]=GTK_GRID(gtk_builder_get_object(m_builder, "box_res_root_0"));
  113. m_layout[1]=GTK_GRID(gtk_builder_get_object(m_builder, "box_res_root_1"));
  114. m_layout[2]=GTK_GRID(gtk_builder_get_object(m_builder, "box_res_root_2"));
  115. m_layout[3]=GTK_GRID(gtk_builder_get_object(m_builder, "box_res_root_3"));
  116. m_root=GTK_BOX(gtk_builder_get_object(m_builder, "box_res_root"));
  117. m_list=GTK_TREE_VIEW(gtk_builder_get_object(m_builder, "treeview_res"));
  118. m_listStore=GTK_LIST_STORE(gtk_builder_get_object(m_builder, "ls_res"));
  119. //Gtk::TreeModel::iterator it = m_listStore->append();
  120. //m_listStore->insert(it);
  121. //m_listStore->insert(0, "C");
  122. CONNECT(m_list, "cursor-changed", ::on_select, new CallbackArg(this));
  123. m_activeTab=0;
  124. //open(val);
  125. //gtk_widget_hide (GTK_WIDGET(m_root));
  126. printf("Init %p\n", (void*)this);
  127. }
  128. ResourceTab::~ResourceTab()
  129. {
  130. }
  131. void ResourceTab::write(const std::string& file)
  132. {
  133. std::ofstream out(file);
  134. Json::Value v(Json::objectValue);
  135. v["resources"] = getJson();
  136. out << v;
  137. }
  138. Json::Value ResourceTab::getJson(bool genFinal)
  139. {
  140. Json::Value r(Json::arrayValue);
  141. for(int i=0; i<m_resources.size(); i++)
  142. {
  143. r[i] = m_resources[i].getJson();
  144. }
  145. return r;
  146. }
  147. Json::Value ResourceTab::getJsonOrphelin()
  148. {
  149. Json::Value r(Json::arrayValue);
  150. int j=0;
  151. for(int i=0; i<m_resources.size(); i++)
  152. {
  153. if(!m_resources[i].getStage ())
  154. r[j++] = m_resources[i].getName ();
  155. }
  156. return r;
  157. }
  158. void ResourceTab::on_save_clicked()
  159. {
  160. std::string old;
  161. bool selected, b;
  162. if(m_isLoading) return;
  163. old = gtk_tree_view_get_str_selected(m_list, &selected);
  164. Resource* m = findResource (old);
  165. Resource r = Resource::cast(getTab(b));
  166. if(b)
  167. {
  168. insert(r.getName(),&r);
  169. }
  170. else if(m)
  171. {
  172. *m=r;
  173. }
  174. }
  175. Data& ResourceTab::getTab(bool& insert)
  176. {
  177. static Resource t;
  178. GtkTextBuffer * buffer=NULL;
  179. std::string old = gtk_entry_get_text(m_name);
  180. bool exists;
  181. gtk_tree_view_get_str_selected (m_list, &exists);
  182. if(exists)
  183. {
  184. gtk_tree_view_set_str_selected(m_list, gtk_entry_get_text(m_name));
  185. old=gtk_entry_get_text(m_name);
  186. insert=false;
  187. }else if(findResource (gtk_entry_get_text(m_name))==0)
  188. {
  189. insert=true;
  190. }
  191. t.setComments (gtk_text_view_get_text (m_comments));
  192. t.setName (gtk_entry_get_text(m_name));
  193. t.setType (typetostring (m_activeTab));
  194. t.setTitle (gtk_entry_get_text(m_title));
  195. t.setPosition (Number3d(
  196. gtk_spin_button_get_value(m_position[0]),
  197. gtk_spin_button_get_value(m_position[1]),
  198. gtk_spin_button_get_value(m_position[2])
  199. ));
  200. t.setRotation (Number3d(
  201. gtk_spin_button_get_value(m_rotation[0]),
  202. gtk_spin_button_get_value(m_rotation[1]),
  203. gtk_spin_button_get_value(m_rotation[2])
  204. ));
  205. t.setScale (Number3d(
  206. gtk_spin_button_get_value(m_scale[0]),
  207. gtk_spin_button_get_value(m_scale[1]),
  208. gtk_spin_button_get_value(m_scale[2])
  209. ));
  210. std::cout << "Rotation " << t.getRotation ().toString() << std::endl;
  211. //std::cout << "Rotation ui (" << m_rotation[0]->get_value() << ", " << m_rotation[1]->get_value() << ", "
  212. // << m_rotation[2]->get_value() << ")" << std::endl;
  213. std::cout << std::endl;
  214. t.setStage ( gtk_spin_button_get_value(m_stage));
  215. char * x = gtk_file_chooser_get_filename (
  216. GTK_FILE_CHOOSER(m_files[m_activeTab]));
  217. std::string file="";
  218. if(x) file=x;
  219. t.setFile (file);
  220. return t;
  221. }
  222. void ResourceTab::setupTab(Data& _a)
  223. {
  224. Resource& r = Resource::cast(_a);
  225. m_isLoading=true;
  226. gtk_text_view_set_text(m_comments, r.getComments ().c_str());
  227. gtk_entry_set_text(m_name, r.getName ().c_str());
  228. gtk_entry_set_text(m_title, r.getTitle ().c_str());
  229. m_activeTab = stringtotype (r.getType ());
  230. gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(m_type[m_activeTab]), TRUE);
  231. gtk_spin_button_set_value (m_position[0], r.getPosition ().m_x);
  232. gtk_spin_button_set_value (m_position[1], r.getPosition ().m_y);
  233. gtk_spin_button_set_value (m_position[2], r.getPosition ().m_z);
  234. gtk_spin_button_set_value (m_rotation[0], r.getRotation ().m_x);
  235. gtk_spin_button_set_value (m_rotation[1], r.getRotation ().m_y);
  236. gtk_spin_button_set_value (m_rotation[2], r.getRotation ().m_z);
  237. gtk_spin_button_set_value (m_scale[0], r.getScale ().m_x);
  238. gtk_spin_button_set_value (m_scale[1], r.getScale ().m_y);
  239. gtk_spin_button_set_value (m_scale[2], r.getScale ().m_z);
  240. gtk_spin_button_set_value (m_stage, r.getStage ());
  241. gtk_file_chooser_set_filename (GTK_FILE_CHOOSER(m_files[m_activeTab]),
  242. r.getFile ().c_str());
  243. m_isLoading=false;
  244. }
  245. Resource* ResourceTab::findResource(const std::string& name)
  246. {
  247. for(int i=0; i<m_resources.size(); i++)
  248. {
  249. if(m_resources[i].getName() == name)
  250. {
  251. return &m_resources[i];
  252. }
  253. }
  254. return 0;
  255. }
  256. void ResourceTab::on_type_changed(int i)
  257. {
  258. if(gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(m_type[i])))
  259. {
  260. set_layout(i);
  261. }
  262. on_save_clicked();
  263. }
  264. void ResourceTab::on_select()
  265. {
  266. bool exists;
  267. std::string name;
  268. name=gtk_tree_view_get_str_selected(m_list, &exists);
  269. if(exists)
  270. {
  271. //name = iter->get_value(m_Columns.m_col_name);
  272. Resource * r = findResource (name);
  273. setupTab(*r);
  274. gtk_widget_show_all (GTK_WIDGET(m_root));
  275. set_layout();
  276. }
  277. else
  278. {
  279. gtk_widget_hide(GTK_WIDGET(m_root));
  280. }
  281. }
  282. void ResourceTab::remove(std::string name)
  283. {
  284. GtkTreeIter child;
  285. gchar *cname = NULL;
  286. bool hasChild;
  287. int nchild = gtk_tree_model_iter_n_children (GTK_TREE_MODEL(m_listStore), NULL);
  288. for(int i=0; i<nchild; i++)
  289. {
  290. gtk_tree_model_iter_nth_child (GTK_TREE_MODEL(m_listStore),
  291. &child,
  292. NULL,
  293. i);
  294. gtk_tree_model_get(GTK_TREE_MODEL(m_listStore),
  295. &child, 0, &cname, -1);
  296. printf("'%s' == '%s'\n", cname, name.c_str());
  297. if(cname && name == cname)
  298. {
  299. gtk_list_store_remove (m_listStore, &child);
  300. break;
  301. }
  302. }
  303. }
  304. void ResourceTab::on_remove()
  305. {
  306. bool exists;
  307. std::string name;
  308. name=gtk_tree_view_get_str_selected(m_list, &exists);
  309. if(exists) //If anything is selected
  310. {
  311. for(int i= 0; i<m_resources.size(); i++)
  312. if(m_resources[i].getName() == name)
  313. {
  314. m_resources.erase(m_resources.begin()+i);
  315. break;
  316. }
  317. remove(name);
  318. }
  319. }
  320. void ResourceTab::on_add()
  321. {
  322. insert("");
  323. }
  324. void ResourceTab::open(Json::Value& val)
  325. {
  326. m_isModified=false;
  327. gtk_list_store_clear (m_listStore);
  328. m_resources.clear();
  329. gtk_widget_hide (GTK_WIDGET(m_root));
  330. for (Json::Value::iterator it = val.begin(); it != val.end(); ++it) {
  331. Json::Value v = (*it);
  332. //std::cout << "Open " << v << std::endl;
  333. Resource r(v);
  334. insert(v["name"].asString(), &r);
  335. }
  336. gtk_widget_hide (GTK_WIDGET(m_root));
  337. }
  338. void ResourceTab::set_layout(int i)
  339. {
  340. std::cout << "OK\n";
  341. if(i==-1)
  342. for(int j=0; j<4; j++)
  343. if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(m_type[j])))
  344. i=j;
  345. for(int j=0; j<4; j++)
  346. gtk_widget_hide(GTK_WIDGET(m_layout[j]));
  347. gtk_widget_show_all(GTK_WIDGET(m_layout[i]));
  348. m_activeTab=i;
  349. }
  350. void ResourceTab::insert(std::string name, Resource* ra)
  351. {
  352. if(findResource (name)==0)
  353. {
  354. GtkTreeSelection* sel = gtk_tree_view_get_selection (m_list);
  355. GtkTreeIter app;
  356. Resource r;
  357. gtk_tree_model_get_iter_last (GTK_TREE_MODEL(m_listStore), &app);
  358. r.setName(name);
  359. if(!ra) ra=&r;
  360. gtk_list_store_append(m_listStore, &app);
  361. gtk_list_store_set(m_listStore, &app, 0, name.c_str(), -1);
  362. m_resources.push_back(*ra);
  363. gtk_tree_selection_select_iter(sel, &app);
  364. on_select();
  365. }
  366. else
  367. {
  368. dialog_error("Une ressource existe déja avec ce nom");
  369. }
  370. }
  371. GtkListStore* ResourceTab::getModel()
  372. {
  373. return m_listStore;
  374. }