g-window.cc 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
  2. /*
  3. * g-window.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 "main.h"
  20. #include <config.h>
  21. #include <gtk/gtk.h>
  22. #include <glib/gi18n.h>
  23. #include "g-window.h"
  24. #include "general-tab.h"
  25. #include "resource-tab.h"
  26. #include "stage-tab.h"
  27. #include "zone-tab.h"
  28. #include "merkator.h"
  29. #include <fstream>
  30. #include "generator.h"
  31. #include "utils.h"
  32. GWindow* gw=NULL;
  33. typedef struct _Private Private;
  34. struct _Private
  35. {
  36. /* ANJUTA: Widgets declaration for histodexc.ui - DO NOT REMOVE */
  37. };
  38. static void on_new (GtkMenuItem* app, gpointer user_data)
  39. {
  40. CallbackArg* r = (CallbackArg*) user_data;
  41. ((GWindow*)r->tab)->on_new ();
  42. }
  43. static void on_open (GtkMenuItem* app, gpointer user_data)
  44. {
  45. CallbackArg* r = (CallbackArg*) user_data;
  46. ((GWindow*)r->tab)->on_open ();
  47. }
  48. static void on_save (GtkMenuItem* app, gpointer user_data)
  49. {
  50. CallbackArg* r = (CallbackArg*) user_data;
  51. ((GWindow*)r->tab)->on_save ();
  52. }
  53. static void on_import (GtkMenuItem* app, gpointer user_data)
  54. {
  55. CallbackArg* r = (CallbackArg*) user_data;
  56. ((GWindow*)r->tab)->on_import ();
  57. }
  58. static void on_saveas (GtkMenuItem* app, gpointer user_data)
  59. {
  60. CallbackArg* r = (CallbackArg*) user_data;
  61. ((GWindow*)r->tab)->on_saveas ();
  62. }
  63. static void on_exit_win (GtkMenuItem* app, gpointer user_data)
  64. {
  65. CallbackArg* r = (CallbackArg*) user_data;
  66. ((GWindow*)r->tab)->on_exit ();
  67. }
  68. static void on_generate (GtkMenuItem* app, gpointer user_data)
  69. {
  70. CallbackArg* r = (CallbackArg*) user_data;
  71. ((GWindow*)r->tab)->on_generate ();
  72. }
  73. void
  74. on_window_destroy (GtkWidget *widget, gpointer data)
  75. {
  76. gtk_main_quit ();
  77. }
  78. GWindow::GWindow()
  79. {
  80. setlocale(LC_NUMERIC, "C");
  81. m_magic=1234;
  82. #if !defined(TEST) && defined(G_OS_WIN32)
  83. gchar *prefix = g_win32_get_package_installation_directory_of_module (NULL);
  84. gchar *datadir = g_build_filename (prefix, "share", PACKAGE, NULL);
  85. gchar *ui_file = g_build_filename (datadir, "ui", "histodexc.ui", NULL);
  86. #endif
  87. GError* error = NULL;
  88. /* Load UI from file */
  89. m_builder = gtk_builder_new ();
  90. if (!gtk_builder_add_from_file (m_builder, UI_FILE, &error))
  91. {
  92. g_critical ("Couldn't load builder file: %s", error->message);
  93. g_error_free (error);
  94. }
  95. /* Auto-connect signal handlers */
  96. gtk_builder_connect_signals (m_builder, NULL);
  97. /* Get the window object from the ui file */
  98. m_window = GTK_WIDGET (gtk_builder_get_object (m_builder, TOP_WINDOW));
  99. printf("1 M_WINDOWS: %d\n", m_window);
  100. if (!m_window)
  101. {
  102. g_critical ("Widget \"%s\" is missing in file %s.",
  103. TOP_WINDOW,
  104. UI_FILE);
  105. }
  106. m_priv = (Private*) g_malloc (sizeof (struct _Private));
  107. /* ANJUTA: Widgets initialization for histodexc.ui - DO NOT REMOVE */
  108. init_menu();
  109. /*#if !defined(TEST) && defined(G_OS_WIN32)
  110. g_free (prefix);
  111. g_free (datadir);
  112. g_free (ui_file);
  113. #endif*/
  114. gw=this;
  115. }
  116. GWindow::~GWindow()
  117. {
  118. g_object_unref (m_builder);
  119. g_free (m_priv);
  120. }
  121. void GWindow::show()
  122. {
  123. gtk_widget_show (m_window);
  124. }
  125. bool GWindow::checkSaved()
  126. {
  127. if(isModidified())
  128. {
  129. gint result;
  130. GtkDialogFlags flags = GTK_DIALOG_MODAL;
  131. GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW(m_window),
  132. flags,
  133. GTK_MESSAGE_QUESTION,
  134. GTK_BUTTONS_YES_NO,
  135. "Voulez-vous sauvegarder le fichier ?");
  136. gtk_window_set_title(GTK_WINDOW(dialog), "Sauvegarder");
  137. result=gtk_dialog_run (GTK_DIALOG (dialog));
  138. if (result==GTK_RESPONSE_YES)
  139. {
  140. on_save();
  141. return true;
  142. }
  143. else if (result==GTK_RESPONSE_NO)
  144. {
  145. return true;
  146. }else
  147. {
  148. return false;
  149. }
  150. gtk_widget_destroy (dialog);
  151. }
  152. }
  153. void window_start(int argc, char** argv)
  154. {
  155. GWindow* g = new GWindow ();
  156. g->show();
  157. if(argc>1)
  158. g->open(argv[1]);
  159. else
  160. g->on_new();
  161. }
  162. void GWindow::init_menu()
  163. {
  164. static CallbackArg* sm_args = new CallbackArg (this);
  165. m_resource = new ResourceTab (m_window, m_builder);
  166. m_zone = new ZoneTab (m_window, m_builder, m_resource);
  167. m_stage = new StageTab (m_window, m_builder, m_resource);
  168. m_general = new GeneralTab (m_window, m_builder, m_stage);
  169. m_generate=GTK_BUTTON(gtk_builder_get_object(m_builder,"gen_generate"));
  170. CONNECT(m_generate, "clicked", ::on_generate, new CallbackArg (this));
  171. m_new=GTK_IMAGE_MENU_ITEM(gtk_builder_get_object(m_builder,"menu_new"));
  172. m_open=GTK_IMAGE_MENU_ITEM(gtk_builder_get_object(m_builder,"menu_open"));
  173. m_import=GTK_MENU_ITEM(gtk_builder_get_object(m_builder,"menu_import"));
  174. m_save=GTK_IMAGE_MENU_ITEM(gtk_builder_get_object(m_builder,"menu_save"));
  175. m_saveas=GTK_IMAGE_MENU_ITEM(gtk_builder_get_object(m_builder,"menu_saveas"));
  176. m_exit=GTK_IMAGE_MENU_ITEM(gtk_builder_get_object(m_builder,"menu_exit"));
  177. m_log=GTK_TEXT_VIEW(gtk_builder_get_object(m_builder,"tv_log"));
  178. CONNECT(m_new, "activate", ::on_new, sm_args);
  179. CONNECT(m_open, "activate", ::on_open , sm_args);
  180. CONNECT(m_save, "activate", ::on_save, sm_args);
  181. CONNECT(m_saveas, "activate", ::on_saveas, sm_args);
  182. CONNECT(m_exit, "activate", ::on_exit_win, sm_args);
  183. CONNECT(m_import, "activate", ::on_import, sm_args);
  184. CONNECT(m_window, "destroy", on_exit_win,sm_args);
  185. }
  186. void GWindow::on_generate()
  187. {
  188. int w=0;
  189. int e=0;
  190. int ce=0;
  191. std::string sa ="Succès de la génération";
  192. std::string sb = "Rien à déclarer";
  193. General g = m_general->getGeneral();
  194. std::vector<Resource>& r= m_resource->getResources();
  195. std::vector<Area>& a= m_zone->getAreas();
  196. std::vector<Stage>& s= m_stage->getStages();
  197. Generator gen(g, a, r,s, this);
  198. std::string log;
  199. gen.generate();
  200. ce=gen.getCriticalErrorsCount ();
  201. e=gen.getErrorsCount ();
  202. w=gen.getWarningCount ();
  203. log=gen.getLog ();
  204. gtk_text_view_set_text (m_log, log.c_str());
  205. std::cout << "W=" << w << " E =" << e << std::endl;
  206. if(w && !e && !ce)
  207. {
  208. sa="Avertissement(s) lors de la génération";
  209. sb=tstr(w)+" avertisssments lors de la génération. Des problèmes peuvent apparaitre à l'éxecution";
  210. }
  211. if(e && ! ce)
  212. {
  213. sa="Erreur(s) lors de la génération";
  214. sb=tstr(e)+" erreurs et "+tstr(w)+" avertisssments lors de la génération. Des problèmes devraient apparaitre à l'éxecution";
  215. }
  216. if(ce)
  217. {
  218. sa="Erreur(s) critique(s) lors de la génération";
  219. sb=tstr(ce)+ " erreurs critiques " +tstr(e)+" erreurs et "+tstr(w)+" avertisssments lors de la génération. La génération a échouée";
  220. }
  221. GtkWidget* dialog = NULL;
  222. GtkDialogFlags flags = GTK_DIALOG_DESTROY_WITH_PARENT;
  223. dialog = gtk_message_dialog_new (GTK_WINDOW(m_window),
  224. flags,
  225. GTK_MESSAGE_INFO,
  226. GTK_BUTTONS_OK,
  227. sb.c_str());
  228. gtk_dialog_run (GTK_DIALOG (dialog));
  229. gtk_widget_destroy (dialog);
  230. }
  231. void GWindow::write(const std::string& file)
  232. {
  233. std::ofstream out(file);
  234. Json::Value j = m_general->getJson();
  235. //std::cout << j << std::endl;
  236. j["areas"] = m_zone->getJson();
  237. j["stages_list"] = m_stage->getJson();
  238. j["resources"] = m_resource->getJson();
  239. out << j;
  240. }
  241. Json::Value GWindow::getJson(bool genFinal)
  242. {
  243. Json::Value j = m_general->getJson(genFinal);
  244. std::cout << j << std::endl;
  245. j["areas"] = m_zone->getJson();
  246. j["stages_list"] = m_stage->getJson();
  247. if(!genFinal)
  248. j["resources"] = m_resource->getJson();
  249. else
  250. j["others"] = m_resource->getJsonOrphelin ();
  251. return j;
  252. }
  253. void GWindow::on_new()
  254. {
  255. Json::Value v(Json::arrayValue);
  256. m_currentFile="";
  257. m_resource->open(v);
  258. m_zone->open(v);
  259. m_general->open(v);
  260. m_stage->open(v);
  261. setModidified ();
  262. m_general->on_stage_changed();
  263. changeFile ("");
  264. }
  265. void GWindow::setModidified()
  266. {
  267. m_resource->setModified ();
  268. m_zone->setModified ();
  269. m_general->setModified ();
  270. m_stage->setModified ();
  271. }
  272. void GWindow::clearModidified()
  273. {
  274. m_resource->clearModified ();
  275. m_zone->clearModified ();
  276. m_general->clearModified ();
  277. m_stage->clearModified ();
  278. }
  279. bool GWindow::isModidified()
  280. {
  281. bool b= false;
  282. b|=m_resource->getModified ();
  283. b|=m_zone->getModified ();
  284. b|=m_general->getModified ();
  285. b|=m_stage->getModified ();
  286. return b;
  287. }
  288. void GWindow::on_open()
  289. {
  290. GtkWidget *dialog;
  291. GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN;
  292. gint res;
  293. printf("2 M_WINDOWS: %d\n", m_window);
  294. dialog = gtk_file_chooser_dialog_new ("Ouvrir le fichier de jeu",
  295. GTK_WINDOW(m_window),
  296. action,
  297. _("_Annuler"),
  298. GTK_RESPONSE_CANCEL,
  299. _("_Ouvrir"),
  300. GTK_RESPONSE_ACCEPT,
  301. NULL);
  302. res = gtk_dialog_run (GTK_DIALOG (dialog));
  303. if (res == GTK_RESPONSE_ACCEPT)
  304. {
  305. try{
  306. std::cout << gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog)) << std::endl;
  307. open(gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog)));
  308. changeFile(gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog)));
  309. clearModidified();
  310. }catch(std::exception& e)
  311. {
  312. std::cout << "Error:" << e.what() << std::endl;
  313. }
  314. }
  315. gtk_widget_destroy (dialog);
  316. }
  317. void GWindow::on_import()
  318. {
  319. GtkWidget *dialog;
  320. GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_OPEN;
  321. gint res;
  322. dialog = gtk_file_chooser_dialog_new ("Importer le fichier Merkaartor",
  323. GTK_WINDOW(m_window),
  324. action,
  325. _("_Annuler"),
  326. GTK_RESPONSE_CANCEL,
  327. _("_Ouvrir"),
  328. GTK_RESPONSE_ACCEPT,
  329. NULL);
  330. res = gtk_dialog_run (GTK_DIALOG (dialog));
  331. if (res == GTK_RESPONSE_ACCEPT)
  332. {
  333. try{
  334. std::cout << gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog)) << std::endl;
  335. Merkaartot m(gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog)));
  336. Json::Value v = m.getJson ();
  337. m_zone->open(v);
  338. }catch(std::exception& e)
  339. {
  340. std::cout << "Error:" << e.what() << std::endl;
  341. }
  342. }
  343. gtk_widget_destroy (dialog);
  344. }
  345. void GWindow::on_save()
  346. {
  347. if(m_currentFile=="")
  348. {
  349. on_saveas();
  350. }else
  351. {
  352. write(m_currentFile);
  353. clearModidified();
  354. }
  355. }
  356. void GWindow::on_saveas()
  357. {
  358. GtkWidget *dialog;
  359. GtkFileChooserAction action = GTK_FILE_CHOOSER_ACTION_SAVE;
  360. gint res;
  361. dialog = gtk_file_chooser_dialog_new ("Enregister le fichier de jeu",
  362. GTK_WINDOW(m_window),
  363. action,
  364. _("_Annuler"),
  365. GTK_RESPONSE_CANCEL,
  366. _("_Enregistrer"),
  367. GTK_RESPONSE_ACCEPT,
  368. NULL);
  369. gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (dialog), TRUE);
  370. res = gtk_dialog_run (GTK_DIALOG (dialog));
  371. if (res == GTK_RESPONSE_ACCEPT)
  372. {
  373. std::cout << gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog)) << std::endl;
  374. write(gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog)));
  375. changeFile(gtk_file_chooser_get_filename (GTK_FILE_CHOOSER(dialog)));
  376. clearModidified();
  377. }
  378. gtk_widget_destroy (dialog);
  379. }
  380. void GWindow::changeFile(const std::string& file)
  381. {
  382. std::string s = "File: "+file;
  383. m_currentFile=file;
  384. if(file=="")
  385. gtk_window_set_title (GTK_WINDOW(m_window),"*New File");
  386. else
  387. gtk_window_set_title (GTK_WINDOW(m_window),s.c_str());
  388. }
  389. void GWindow::open(const std::string& f)
  390. {
  391. if(checkSaved ())
  392. {
  393. Json::Value v;
  394. std::ifstream in(f);
  395. in >> v;
  396. m_resource->open(v["resources"]);
  397. m_zone->open(v["areas"]);
  398. m_stage->open(v["stages_list"]);
  399. m_general->open(v);
  400. changeFile (f);
  401. }
  402. }
  403. void GWindow::on_exit()
  404. {
  405. if(checkSaved ())
  406. {
  407. gtk_main_quit ();
  408. }
  409. }