sessionsetupmanager.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433
  1. /*
  2. = StarPU-Top for StarPU =
  3. Copyright (C) 2011
  4. William Braik
  5. Yann Courtois
  6. Jean-Marie Couteyen
  7. Anthony Roy
  8. This library is free software; you can redistribute it and/or
  9. modify it under the terms of the GNU Lesser General Public
  10. License as published by the Free Software Foundation; either
  11. version 2.1 of the License, or (at your option) any later version.
  12. This library is distributed in the hope that it will be useful,
  13. but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  15. Lesser General Public License for more details.
  16. You should have received a copy of the GNU Lesser General Public
  17. License along with this library; if not, write to the Free Software
  18. Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. #include "sessionsetupmanager.h"
  21. #include "mainwindow.h"
  22. #include "widgetwindowsmanager.h"
  23. #include "abstractwidgetwindow.h"
  24. #include "datawidget.h"
  25. #include "dataaggregatorwidget.h"
  26. #include <QDebug>
  27. #include <QString>
  28. #include <QFile>
  29. #include <QDockWidget>
  30. SessionSetupManager::SessionSetupManager(MainWindow *mainWindow)
  31. {
  32. static bool instanciated = false;
  33. Q_ASSERT_X(instanciated == false, "SessionSetupManager's' constructor",
  34. "Singleton pattern violated - "
  35. "SessionSetupManager instanciated more than once");
  36. qDebug() << "SessionSetupManager : initializing";
  37. _mainWindow = mainWindow;
  38. _sessionStateSettings = 0;
  39. instanciated = true;
  40. }
  41. SessionSetupManager::~SessionSetupManager()
  42. {
  43. delete _sessionStateSettings;
  44. }
  45. bool SessionSetupManager::saveSessionSetup(QString sessionSetupName)
  46. {
  47. QString fileName = SESSION_SETUPS_DIR + "/" + sessionSetupName
  48. + SESSION_SETUPS_FILEEXT;
  49. if (QFile(fileName).exists() == true)
  50. {
  51. if (QFile(fileName).remove() == false)
  52. {
  53. qDebug()
  54. << "SessionSetupManager : "
  55. "coudln't reinitialize session setup file before saving !";
  56. return false;
  57. }
  58. }
  59. // Init settings
  60. delete _sessionStateSettings;
  61. _sessionStateSettings = new QSettings(fileName, QSettings::IniFormat);
  62. qDebug() << "SessionSetupManager : saving session setup to"
  63. << _sessionStateSettings->fileName();
  64. // Save data setup
  65. _sessionStateSettings->beginWriteArray("datadescriptions",
  66. _mainWindow->dataDescriptions()->count());
  67. for (int i = 0; i < _mainWindow->dataDescriptions()->count(); i++)
  68. {
  69. _sessionStateSettings->setArrayIndex(i);
  70. int dataId = _mainWindow->dataDescriptions()->at(i)->id;
  71. DataType type = _mainWindow->dataDescriptions()->at(i)->type;
  72. DataWidgetType widget = _mainWindow->dataDescriptions()->at(i)->widget;
  73. _sessionStateSettings->setValue("id", dataId);
  74. _sessionStateSettings->setValue("type", (int) type);
  75. _sessionStateSettings->setValue("widget", (int) widget);
  76. }
  77. _sessionStateSettings->endArray();
  78. // Save parameters setup
  79. _sessionStateSettings->beginWriteArray("paramdescriptions",
  80. _mainWindow->paramDescriptions()->count());
  81. for (int i = 0; i < _mainWindow->paramDescriptions()->count(); i++)
  82. {
  83. _sessionStateSettings->setArrayIndex(i);
  84. int paramId = _mainWindow->paramDescriptions()->at(i)->id;
  85. ParamType type = _mainWindow->paramDescriptions()->at(i)->type;
  86. InteractiveWidgetType widget =
  87. _mainWindow->paramDescriptions()->at(i)->widget;
  88. _sessionStateSettings->setValue("id", paramId);
  89. _sessionStateSettings->setValue("type", (int) type);
  90. _sessionStateSettings->setValue("widget", (int) widget);
  91. }
  92. _sessionStateSettings->endArray();
  93. // Save main window setup
  94. _sessionStateSettings->beginGroup("mainwindow");
  95. _sessionStateSettings->setValue("displaymode",
  96. (int) _mainWindow->displayMode());
  97. _sessionStateSettings->setValue("geometry", _mainWindow->saveGeometry());
  98. _sessionStateSettings->endGroup();
  99. // Save parameters dock setup
  100. _sessionStateSettings->beginGroup("parametersdock");
  101. _sessionStateSettings->setValue("floating",
  102. _mainWindow->parametersDock()->isFloating());
  103. _sessionStateSettings->setValue("geometry",
  104. _mainWindow->parametersDock()->saveGeometry());
  105. _sessionStateSettings->endGroup();
  106. // Save widget windows setup
  107. _sessionStateSettings->beginWriteArray("widgetwindows",
  108. _mainWindow->widgetWindowsManager()
  109. ->widgetWindows().count());
  110. for (int i = 0; i
  111. < _mainWindow->widgetWindowsManager()->widgetWindows().count(); i++)
  112. {
  113. _sessionStateSettings->setArrayIndex(i);
  114. // Retrive general information to save
  115. bool
  116. inside =
  117. _mainWindow->widgetWindowsManager()->widgetWindows().at(
  118. i)->isInside();
  119. QByteArray windowGeometry;
  120. if (inside == false)
  121. {
  122. windowGeometry
  123. = _mainWindow->widgetWindowsManager()
  124. ->widgetWindows().at(i)->saveGeometry();
  125. }
  126. else
  127. { // Save the geometry of the parent subwindow, not the widget itself
  128. windowGeometry
  129. = _mainWindow->widgetWindowsManager()
  130. ->widgetWindows().at(i)->parentWidget()->saveGeometry();
  131. }
  132. DataWidget *dataWidget = qobject_cast<DataWidget*> (
  133. _mainWindow->widgetWindowsManager()->widgetWindows().at(i));
  134. if (dataWidget != 0)
  135. { // Data widgets
  136. // Retrieve specific information to save
  137. int dataId = dataWidget->description()->id;
  138. // Save information
  139. _sessionStateSettings->beginGroup("datawidget");
  140. _sessionStateSettings->setValue("inside", inside);
  141. _sessionStateSettings->setValue("geometry", windowGeometry);
  142. _sessionStateSettings->setValue("dataid", dataId);
  143. _sessionStateSettings->endGroup();
  144. }
  145. else
  146. { // Data aggregator widgets
  147. DataAggregatorWidget *dataAggregatorWidget = qobject_cast<
  148. DataAggregatorWidget*> (
  149. _mainWindow->widgetWindowsManager()->widgetWindows().at(i));
  150. // Retrieve specific information to save
  151. QList<int> aggregatedData = dataAggregatorWidget->aggregatedData();
  152. QString aggregatedDataString;
  153. for (int i = 0; i < aggregatedData.count(); i++)
  154. {
  155. aggregatedDataString.append(
  156. QString::number(aggregatedData.at(i)) + ",");
  157. }
  158. // Save information
  159. _sessionStateSettings->beginGroup("dataaggregatorwidget");
  160. _sessionStateSettings->setValue("inside", inside);
  161. _sessionStateSettings->setValue("geometry", windowGeometry);
  162. _sessionStateSettings->setValue("dataids", aggregatedDataString);
  163. _sessionStateSettings->endGroup();
  164. }
  165. }
  166. _sessionStateSettings->endArray();
  167. // Write the session setup
  168. _sessionStateSettings->sync();
  169. return true;
  170. }
  171. bool SessionSetupManager::loadSessionSetup(QString sessionName)
  172. {
  173. QString fileName = SESSION_SETUPS_DIR + "/" + sessionName
  174. + SESSION_SETUPS_FILEEXT;
  175. if (QFile(fileName).exists() == false)
  176. {
  177. qDebug() << "SessionSetupManager : session setup file doesn't exist !";
  178. return false;
  179. }
  180. delete _sessionStateSettings;
  181. _sessionStateSettings = new QSettings(fileName, QSettings::IniFormat);
  182. qDebug() << "SessionSetupManager : loading session setup from"
  183. << _sessionStateSettings->fileName();
  184. // Load data descriptions setup
  185. QList < DataDescriptionSetup > dataDescriptionsSetup;
  186. int size = _sessionStateSettings->beginReadArray("datadescriptions");
  187. for (int i = 0; i < size; i++)
  188. {
  189. _sessionStateSettings->setArrayIndex(i);
  190. DataDescriptionSetup dataDescriptionSetup;
  191. bool ok = false;
  192. dataDescriptionSetup.id = _sessionStateSettings->value("id").toInt(&ok);
  193. if (ok == false)
  194. {
  195. qDebug()
  196. << "SessionSetupManager : "
  197. "attempted to load incorrect data widget !";
  198. return false;
  199. }
  200. dataDescriptionSetup.type = (DataType) _sessionStateSettings->value(
  201. "type").toInt(&ok);
  202. if (ok == false)
  203. {
  204. qDebug()
  205. << "SessionSetupManager : "
  206. "attempted to load incorrect data widget !";
  207. return false;
  208. }
  209. if (dataDescriptionSetup.type != _mainWindow->dataDescriptionFromId(
  210. dataDescriptionSetup.id)->type)
  211. {
  212. qDebug()
  213. << "SessionSetupManager : "
  214. "incompatible data types between the sessions !";
  215. return false;
  216. }
  217. dataDescriptionSetup.widget
  218. = (DataWidgetType) _sessionStateSettings->value("widget").toInt(
  219. &ok);
  220. if (ok == false)
  221. {
  222. qDebug()
  223. << "SessionSetupManager : "
  224. "attempted to load incorrect data widget !";
  225. return false;
  226. }
  227. dataDescriptionsSetup.append(dataDescriptionSetup);
  228. }
  229. _sessionStateSettings->endArray();
  230. // Load param descriptions setup
  231. QList < ParamDescriptionSetup > paramDescriptionsSetup;
  232. size = _sessionStateSettings->beginReadArray("paramdescriptions");
  233. for (int i = 0; i < size; i++)
  234. {
  235. _sessionStateSettings->setArrayIndex(i);
  236. ParamDescriptionSetup paramDescriptionSetup;
  237. bool ok = false;
  238. paramDescriptionSetup.id
  239. = _sessionStateSettings->value("id").toInt(&ok);
  240. if (ok == false)
  241. {
  242. qDebug()
  243. << "SessionSetupManager : "
  244. "attempted to load incorrect param id !";
  245. return false;
  246. }
  247. paramDescriptionSetup.type = (ParamType) _sessionStateSettings->value(
  248. "type").toInt(&ok);
  249. if (ok == false)
  250. {
  251. qDebug()
  252. << "SessionSetupManager : "
  253. "attempted to load incorrect param type !";
  254. return false;
  255. }
  256. if (paramDescriptionSetup.type != _mainWindow->paramDescriptionFromId(
  257. paramDescriptionSetup.id)->type)
  258. {
  259. qDebug()
  260. << "SessionSetupManager : "
  261. "incompatible data types between the sessions !";
  262. return false;
  263. }
  264. paramDescriptionSetup.widget
  265. = (InteractiveWidgetType) _sessionStateSettings
  266. ->value("widget").toInt(&ok);
  267. if (ok == false)
  268. {
  269. qDebug()
  270. << "SessionSetupManager : "
  271. "attempted to load incorrect param widget !";
  272. return false;
  273. }
  274. paramDescriptionsSetup.append(paramDescriptionSetup);
  275. }
  276. _sessionStateSettings->endArray();
  277. emit descriptionsSetupLoaded(dataDescriptionsSetup, paramDescriptionsSetup);
  278. // Load main window setup
  279. MainWindowSetup mainWindowSetup;
  280. _sessionStateSettings->beginGroup("mainwindow");
  281. mainWindowSetup.geometry
  282. = _sessionStateSettings->value("geometry").toByteArray();
  283. bool ok = false;
  284. mainWindowSetup.displayMode = (DisplayMode) _sessionStateSettings->value(
  285. "displaymode").toInt(&ok);
  286. if (ok == false)
  287. {
  288. qDebug()
  289. << "SessionSetupManager : "
  290. "attempted to load incorrect main window display mode !";
  291. return false;
  292. }
  293. _sessionStateSettings->endGroup();
  294. emit mainWindowSetupLoaded(mainWindowSetup);
  295. // Load main window setup
  296. ParametersDockSetup parametersDockSetup;
  297. _sessionStateSettings->beginGroup("mainwindow");
  298. parametersDockSetup.floating
  299. = _sessionStateSettings->value("floating").toBool();
  300. parametersDockSetup.geometry
  301. = _sessionStateSettings->value("geometry").toByteArray();
  302. _sessionStateSettings->endGroup();
  303. emit parametersDockSetupLoaded(parametersDockSetup);
  304. // Load widget windows setup
  305. QList < DataWidgetSetup > dataWidgetsSetup;
  306. QList < DataAggregatorWidgetSetup > dataAggregatorWidgetsSetup;
  307. size = _sessionStateSettings->beginReadArray("widgetwindows");
  308. for (int i = 0; i < size; i++)
  309. {
  310. _sessionStateSettings->setArrayIndex(i);
  311. QString currentGroup = _sessionStateSettings->childGroups().at(0);
  312. if (currentGroup.compare("datawidget") == 0)
  313. {
  314. _sessionStateSettings->beginGroup("datawidget");
  315. DataWidgetSetup dataWidgetSetup;
  316. dataWidgetSetup.inside
  317. = _sessionStateSettings->value("inside").toBool();
  318. dataWidgetSetup.geometry
  319. = _sessionStateSettings->value("geometry").toByteArray();
  320. bool ok = false;
  321. dataWidgetSetup.dataId
  322. = _sessionStateSettings->value("dataid").toInt(&ok);
  323. if (ok == false)
  324. {
  325. qDebug()
  326. << "SessionSetupManager : "
  327. "attempted to load incorrect data id for the data widget !";
  328. return false;
  329. }
  330. dataWidgetsSetup.append(dataWidgetSetup);
  331. _sessionStateSettings->endGroup();
  332. }
  333. else if (currentGroup.compare("dataaggregatorwidget") == 0)
  334. {
  335. _sessionStateSettings->beginGroup("dataaggregatorwidget");
  336. DataAggregatorWidgetSetup dataAggregatorWidgetSetup;
  337. dataAggregatorWidgetSetup.inside = _sessionStateSettings->value(
  338. "inside").toBool();
  339. dataAggregatorWidgetSetup.geometry = _sessionStateSettings->value(
  340. "geometry").toByteArray();
  341. QString dataIdsString =
  342. _sessionStateSettings->value("dataids").toString();
  343. QStringList dataIdsStringParts = dataIdsString.split(",",
  344. QString::SkipEmptyParts);
  345. QList<int> dataIds;
  346. for (int i = 0; i < dataIdsStringParts.count(); i++)
  347. {
  348. QString dataIdsStringPart = dataIdsStringParts.at(i);
  349. bool ok = false;
  350. dataIds.append(dataIdsStringPart.toInt(&ok));
  351. if (ok == false)
  352. {
  353. qDebug()
  354. << "SessionSetupManager : "
  355. "attempted to load incorrect data id for data aggregator widget !";
  356. return false;
  357. }
  358. }
  359. dataAggregatorWidgetSetup.dataIds = dataIds;
  360. dataAggregatorWidgetsSetup.append(dataAggregatorWidgetSetup);
  361. _sessionStateSettings->endGroup();
  362. }
  363. else
  364. {
  365. qDebug()
  366. << "SessionSetupManager : "
  367. "attempted to load unknow window widget type !";
  368. return false;
  369. }
  370. }
  371. _sessionStateSettings->endArray();
  372. emit widgetWindowsSetupLoaded(dataWidgetsSetup, dataAggregatorWidgetsSetup);
  373. return true;
  374. }