sessionsetupmanager.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  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. (void) instanciated;
  37. qDebug() << "SessionSetupManager : initializing";
  38. _mainWindow = mainWindow;
  39. _sessionStateSettings = 0;
  40. instanciated = true;
  41. }
  42. SessionSetupManager::~SessionSetupManager()
  43. {
  44. delete _sessionStateSettings;
  45. }
  46. bool SessionSetupManager::saveSessionSetup(QString sessionSetupName)
  47. {
  48. QString fileName = SESSION_SETUPS_DIR + "/" + sessionSetupName
  49. + SESSION_SETUPS_FILEEXT;
  50. if (QFile(fileName).exists() == true)
  51. {
  52. if (QFile(fileName).remove() == false)
  53. {
  54. qDebug()
  55. << "SessionSetupManager : "
  56. "coudln't reinitialize session setup file before saving !";
  57. return false;
  58. }
  59. }
  60. // Init settings
  61. delete _sessionStateSettings;
  62. _sessionStateSettings = new QSettings(fileName, QSettings::IniFormat);
  63. qDebug() << "SessionSetupManager : saving session setup to"
  64. << _sessionStateSettings->fileName();
  65. // Save data setup
  66. _sessionStateSettings->beginWriteArray("datadescriptions",
  67. _mainWindow->dataDescriptions()->count());
  68. for (int i = 0; i < _mainWindow->dataDescriptions()->count(); i++)
  69. {
  70. _sessionStateSettings->setArrayIndex(i);
  71. int dataId = _mainWindow->dataDescriptions()->at(i)->id;
  72. DataType type = _mainWindow->dataDescriptions()->at(i)->type;
  73. DataWidgetType widget = _mainWindow->dataDescriptions()->at(i)->widget;
  74. _sessionStateSettings->setValue("id", dataId);
  75. _sessionStateSettings->setValue("type", (int) type);
  76. _sessionStateSettings->setValue("widget", (int) widget);
  77. }
  78. _sessionStateSettings->endArray();
  79. // Save parameters setup
  80. _sessionStateSettings->beginWriteArray("paramdescriptions",
  81. _mainWindow->paramDescriptions()->count());
  82. for (int i = 0; i < _mainWindow->paramDescriptions()->count(); i++)
  83. {
  84. _sessionStateSettings->setArrayIndex(i);
  85. int paramId = _mainWindow->paramDescriptions()->at(i)->id;
  86. ParamType type = _mainWindow->paramDescriptions()->at(i)->type;
  87. InteractiveWidgetType widget =
  88. _mainWindow->paramDescriptions()->at(i)->widget;
  89. _sessionStateSettings->setValue("id", paramId);
  90. _sessionStateSettings->setValue("type", (int) type);
  91. _sessionStateSettings->setValue("widget", (int) widget);
  92. }
  93. _sessionStateSettings->endArray();
  94. // Save main window setup
  95. _sessionStateSettings->beginGroup("mainwindow");
  96. _sessionStateSettings->setValue("displaymode",
  97. (int) _mainWindow->displayMode());
  98. _sessionStateSettings->setValue("geometry", _mainWindow->saveGeometry());
  99. _sessionStateSettings->endGroup();
  100. // Save parameters dock setup
  101. _sessionStateSettings->beginGroup("parametersdock");
  102. _sessionStateSettings->setValue("floating",
  103. _mainWindow->parametersDock()->isFloating());
  104. _sessionStateSettings->setValue("geometry",
  105. _mainWindow->parametersDock()->saveGeometry());
  106. _sessionStateSettings->endGroup();
  107. // Save widget windows setup
  108. _sessionStateSettings->beginWriteArray("widgetwindows",
  109. _mainWindow->widgetWindowsManager()
  110. ->widgetWindows().count());
  111. for (int i = 0; i
  112. < _mainWindow->widgetWindowsManager()->widgetWindows().count(); i++)
  113. {
  114. _sessionStateSettings->setArrayIndex(i);
  115. // Retrive general information to save
  116. bool
  117. inside =
  118. _mainWindow->widgetWindowsManager()->widgetWindows().at(
  119. i)->isInside();
  120. QByteArray windowGeometry;
  121. if (inside == false)
  122. {
  123. windowGeometry
  124. = _mainWindow->widgetWindowsManager()
  125. ->widgetWindows().at(i)->saveGeometry();
  126. }
  127. else
  128. { // Save the geometry of the parent subwindow, not the widget itself
  129. windowGeometry
  130. = _mainWindow->widgetWindowsManager()
  131. ->widgetWindows().at(i)->parentWidget()->saveGeometry();
  132. }
  133. DataWidget *dataWidget = qobject_cast<DataWidget*> (
  134. _mainWindow->widgetWindowsManager()->widgetWindows().at(i));
  135. if (dataWidget != 0)
  136. { // Data widgets
  137. // Retrieve specific information to save
  138. int dataId = dataWidget->description()->id;
  139. // Save information
  140. _sessionStateSettings->beginGroup("datawidget");
  141. _sessionStateSettings->setValue("inside", inside);
  142. _sessionStateSettings->setValue("geometry", windowGeometry);
  143. _sessionStateSettings->setValue("dataid", dataId);
  144. _sessionStateSettings->endGroup();
  145. }
  146. else
  147. { // Data aggregator widgets
  148. DataAggregatorWidget *dataAggregatorWidget = qobject_cast<
  149. DataAggregatorWidget*> (
  150. _mainWindow->widgetWindowsManager()->widgetWindows().at(i));
  151. // Retrieve specific information to save
  152. QList<int> aggregatedData = dataAggregatorWidget->aggregatedData();
  153. QString aggregatedDataString;
  154. for (int i = 0; i < aggregatedData.count(); i++)
  155. {
  156. aggregatedDataString.append(
  157. QString::number(aggregatedData.at(i)) + ",");
  158. }
  159. // Save information
  160. _sessionStateSettings->beginGroup("dataaggregatorwidget");
  161. _sessionStateSettings->setValue("inside", inside);
  162. _sessionStateSettings->setValue("geometry", windowGeometry);
  163. _sessionStateSettings->setValue("dataids", aggregatedDataString);
  164. _sessionStateSettings->endGroup();
  165. }
  166. }
  167. _sessionStateSettings->endArray();
  168. // Write the session setup
  169. _sessionStateSettings->sync();
  170. return true;
  171. }
  172. bool SessionSetupManager::loadSessionSetup(QString sessionName)
  173. {
  174. QString fileName = SESSION_SETUPS_DIR + "/" + sessionName
  175. + SESSION_SETUPS_FILEEXT;
  176. if (QFile(fileName).exists() == false)
  177. {
  178. qDebug() << "SessionSetupManager : session setup file doesn't exist !";
  179. return false;
  180. }
  181. delete _sessionStateSettings;
  182. _sessionStateSettings = new QSettings(fileName, QSettings::IniFormat);
  183. qDebug() << "SessionSetupManager : loading session setup from"
  184. << _sessionStateSettings->fileName();
  185. // Load data descriptions setup
  186. QList < DataDescriptionSetup > dataDescriptionsSetup;
  187. int size = _sessionStateSettings->beginReadArray("datadescriptions");
  188. for (int i = 0; i < size; i++)
  189. {
  190. _sessionStateSettings->setArrayIndex(i);
  191. DataDescriptionSetup dataDescriptionSetup;
  192. bool ok = false;
  193. dataDescriptionSetup.id = _sessionStateSettings->value("id").toInt(&ok);
  194. if (ok == false)
  195. {
  196. qDebug()
  197. << "SessionSetupManager : "
  198. "attempted to load incorrect data widget !";
  199. return false;
  200. }
  201. dataDescriptionSetup.type = (DataType) _sessionStateSettings->value(
  202. "type").toInt(&ok);
  203. if (ok == false)
  204. {
  205. qDebug()
  206. << "SessionSetupManager : "
  207. "attempted to load incorrect data widget !";
  208. return false;
  209. }
  210. if (dataDescriptionSetup.type != _mainWindow->dataDescriptionFromId(
  211. dataDescriptionSetup.id)->type)
  212. {
  213. qDebug()
  214. << "SessionSetupManager : "
  215. "incompatible data types between the sessions !";
  216. return false;
  217. }
  218. dataDescriptionSetup.widget
  219. = (DataWidgetType) _sessionStateSettings->value("widget").toInt(
  220. &ok);
  221. if (ok == false)
  222. {
  223. qDebug()
  224. << "SessionSetupManager : "
  225. "attempted to load incorrect data widget !";
  226. return false;
  227. }
  228. dataDescriptionsSetup.append(dataDescriptionSetup);
  229. }
  230. _sessionStateSettings->endArray();
  231. // Load param descriptions setup
  232. QList < ParamDescriptionSetup > paramDescriptionsSetup;
  233. size = _sessionStateSettings->beginReadArray("paramdescriptions");
  234. for (int i = 0; i < size; i++)
  235. {
  236. _sessionStateSettings->setArrayIndex(i);
  237. ParamDescriptionSetup paramDescriptionSetup;
  238. bool ok = false;
  239. paramDescriptionSetup.id
  240. = _sessionStateSettings->value("id").toInt(&ok);
  241. if (ok == false)
  242. {
  243. qDebug()
  244. << "SessionSetupManager : "
  245. "attempted to load incorrect param id !";
  246. return false;
  247. }
  248. paramDescriptionSetup.type = (ParamType) _sessionStateSettings->value(
  249. "type").toInt(&ok);
  250. if (ok == false)
  251. {
  252. qDebug()
  253. << "SessionSetupManager : "
  254. "attempted to load incorrect param type !";
  255. return false;
  256. }
  257. if (paramDescriptionSetup.type != _mainWindow->paramDescriptionFromId(
  258. paramDescriptionSetup.id)->type)
  259. {
  260. qDebug()
  261. << "SessionSetupManager : "
  262. "incompatible data types between the sessions !";
  263. return false;
  264. }
  265. paramDescriptionSetup.widget
  266. = (InteractiveWidgetType) _sessionStateSettings
  267. ->value("widget").toInt(&ok);
  268. if (ok == false)
  269. {
  270. qDebug()
  271. << "SessionSetupManager : "
  272. "attempted to load incorrect param widget !";
  273. return false;
  274. }
  275. paramDescriptionsSetup.append(paramDescriptionSetup);
  276. }
  277. _sessionStateSettings->endArray();
  278. emit descriptionsSetupLoaded(dataDescriptionsSetup, paramDescriptionsSetup);
  279. // Load main window setup
  280. MainWindowSetup mainWindowSetup;
  281. _sessionStateSettings->beginGroup("mainwindow");
  282. mainWindowSetup.geometry
  283. = _sessionStateSettings->value("geometry").toByteArray();
  284. bool ok = false;
  285. mainWindowSetup.displayMode = (DisplayMode) _sessionStateSettings->value(
  286. "displaymode").toInt(&ok);
  287. if (ok == false)
  288. {
  289. qDebug()
  290. << "SessionSetupManager : "
  291. "attempted to load incorrect main window display mode !";
  292. return false;
  293. }
  294. _sessionStateSettings->endGroup();
  295. emit mainWindowSetupLoaded(mainWindowSetup);
  296. // Load main window setup
  297. ParametersDockSetup parametersDockSetup;
  298. _sessionStateSettings->beginGroup("mainwindow");
  299. parametersDockSetup.floating
  300. = _sessionStateSettings->value("floating").toBool();
  301. parametersDockSetup.geometry
  302. = _sessionStateSettings->value("geometry").toByteArray();
  303. _sessionStateSettings->endGroup();
  304. emit parametersDockSetupLoaded(parametersDockSetup);
  305. // Load widget windows setup
  306. QList < DataWidgetSetup > dataWidgetsSetup;
  307. QList < DataAggregatorWidgetSetup > dataAggregatorWidgetsSetup;
  308. size = _sessionStateSettings->beginReadArray("widgetwindows");
  309. for (int i = 0; i < size; i++)
  310. {
  311. _sessionStateSettings->setArrayIndex(i);
  312. QString currentGroup = _sessionStateSettings->childGroups().at(0);
  313. if (currentGroup.compare("datawidget") == 0)
  314. {
  315. _sessionStateSettings->beginGroup("datawidget");
  316. DataWidgetSetup dataWidgetSetup;
  317. dataWidgetSetup.inside
  318. = _sessionStateSettings->value("inside").toBool();
  319. dataWidgetSetup.geometry
  320. = _sessionStateSettings->value("geometry").toByteArray();
  321. bool ok = false;
  322. dataWidgetSetup.dataId
  323. = _sessionStateSettings->value("dataid").toInt(&ok);
  324. if (ok == false)
  325. {
  326. qDebug()
  327. << "SessionSetupManager : "
  328. "attempted to load incorrect data id for the data widget !";
  329. return false;
  330. }
  331. dataWidgetsSetup.append(dataWidgetSetup);
  332. _sessionStateSettings->endGroup();
  333. }
  334. else if (currentGroup.compare("dataaggregatorwidget") == 0)
  335. {
  336. _sessionStateSettings->beginGroup("dataaggregatorwidget");
  337. DataAggregatorWidgetSetup dataAggregatorWidgetSetup;
  338. dataAggregatorWidgetSetup.inside = _sessionStateSettings->value(
  339. "inside").toBool();
  340. dataAggregatorWidgetSetup.geometry = _sessionStateSettings->value(
  341. "geometry").toByteArray();
  342. QString dataIdsString =
  343. _sessionStateSettings->value("dataids").toString();
  344. QStringList dataIdsStringParts = dataIdsString.split(",",
  345. QString::SkipEmptyParts);
  346. QList<int> dataIds;
  347. for (int i = 0; i < dataIdsStringParts.count(); i++)
  348. {
  349. QString dataIdsStringPart = dataIdsStringParts.at(i);
  350. bool ok = false;
  351. dataIds.append(dataIdsStringPart.toInt(&ok));
  352. if (ok == false)
  353. {
  354. qDebug()
  355. << "SessionSetupManager : "
  356. "attempted to load incorrect data id for data aggregator widget !";
  357. return false;
  358. }
  359. }
  360. dataAggregatorWidgetSetup.dataIds = dataIds;
  361. dataAggregatorWidgetsSetup.append(dataAggregatorWidgetSetup);
  362. _sessionStateSettings->endGroup();
  363. }
  364. else
  365. {
  366. qDebug()
  367. << "SessionSetupManager : "
  368. "attempted to load unknow window widget type !";
  369. return false;
  370. }
  371. }
  372. _sessionStateSettings->endArray();
  373. emit widgetWindowsSetupLoaded(dataWidgetsSetup, dataAggregatorWidgetsSetup);
  374. return true;
  375. }