Merge branch 'master' of github.com:Sankore/Sankore-3.1

preferencesAboutTextFull
Ivan Ilyin 13 years ago
commit 5b5a2ce613
  1. 3
      Sankore_3.1.pro
  2. 4
      resources/forms/mainWindow.ui
  3. 177
      resources/i18n/sankore_ar.ts
  4. 177
      resources/i18n/sankore_da.ts
  5. 177
      resources/i18n/sankore_de.ts
  6. 177
      resources/i18n/sankore_en.ts
  7. 177
      resources/i18n/sankore_en_UK.ts
  8. 177
      resources/i18n/sankore_es.ts
  9. 203
      resources/i18n/sankore_fr.ts
  10. 221
      resources/i18n/sankore_fr_CH.ts
  11. 177
      resources/i18n/sankore_it.ts
  12. 177
      resources/i18n/sankore_iw.ts
  13. 177
      resources/i18n/sankore_ja.ts
  14. 177
      resources/i18n/sankore_ko.ts
  15. 177
      resources/i18n/sankore_nb.ts
  16. 177
      resources/i18n/sankore_nl.ts
  17. 177
      resources/i18n/sankore_pl.ts
  18. 177
      resources/i18n/sankore_pt.ts
  19. 177
      resources/i18n/sankore_rm.ts
  20. 177
      resources/i18n/sankore_ro.ts
  21. 177
      resources/i18n/sankore_ru.ts
  22. 177
      resources/i18n/sankore_sk.ts
  23. 177
      resources/i18n/sankore_sv.ts
  24. 177
      resources/i18n/sankore_zh.ts
  25. 15
      resources/style.qss
  26. 2
      src/adaptors/UBCFFSubsetAdaptor.cpp
  27. 1
      src/adaptors/UBImportImage.cpp
  28. 1
      src/adaptors/UBImportPDF.cpp
  29. 38
      src/adaptors/UBMetadataDcSubsetAdaptor.cpp
  30. 153
      src/adaptors/UBSvgSubsetAdaptor.cpp
  31. 15
      src/adaptors/UBSvgSubsetAdaptor.h
  32. 50
      src/adaptors/UBThumbnailAdaptor.cpp
  33. 12
      src/adaptors/publishing/UBDocumentPublisher.cpp
  34. 44
      src/board/UBBoardController.cpp
  35. 5
      src/board/UBBoardController.h
  36. 14
      src/board/UBBoardPaletteManager.cpp
  37. 15
      src/board/UBBoardView.cpp
  38. 3
      src/core/UBApplicationController.cpp
  39. 116
      src/core/UBPersistenceManager.cpp
  40. 8
      src/core/UBPersistenceManager.h
  41. 15
      src/core/UBSettings.cpp
  42. 15
      src/core/UBSettings.h
  43. 100
      src/customWidgets/UBMediaWidget.cpp
  44. 11
      src/customWidgets/UBMediaWidget.h
  45. 16
      src/document/UBDocumentController.cpp
  46. 3
      src/document/UBDocumentController.h
  47. 108
      src/document/UBDocumentProxy.cpp
  48. 14
      src/document/UBDocumentProxy.h
  49. 67
      src/domain/UBGraphicsScene.cpp
  50. 9
      src/domain/UBGraphicsScene.h
  51. 8
      src/domain/UBW3CWidget.cpp
  52. 8
      src/frameworks/UBFileSystemUtils.cpp
  53. 2
      src/frameworks/UBPlatformUtils_mac.mm
  54. 2
      src/gui/UBDockTeacherGuideWidget.cpp
  55. 3
      src/gui/UBDocumentNavigator.cpp
  56. 4
      src/gui/UBDocumentTreeWidget.cpp
  57. 5
      src/gui/UBNavigatorPalette.cpp
  58. 2
      src/gui/UBPageNavigationWidget.cpp
  59. 36
      src/gui/UBTGWidgetTreeDelegate.cpp
  60. 35
      src/gui/UBTGWidgetTreeDelegate.h
  61. 6
      src/gui/UBTeacherGuideDelegate.cpp
  62. 10
      src/gui/UBTeacherGuideDelegate.h
  63. 518
      src/gui/UBTeacherGuideWidget.cpp
  64. 51
      src/gui/UBTeacherGuideWidget.h
  65. 252
      src/gui/UBTeacherGuideWidgetsTools.cpp
  66. 55
      src/gui/UBTeacherGuideWidgetsTools.h
  67. 16
      src/gui/UBThumbnailWidget.cpp
  68. 8
      src/gui/gui.pri
  69. 40
      src/interfaces/IDataStorage.h
  70. 21
      src/interfaces/IDropable.h
  71. 15
      src/interfaces/IResizeable.h
  72. 5
      src/interfaces/interfaces.pri
  73. 142
      src/softwareupdate/UBRssHandler.cpp
  74. 59
      src/softwareupdate/UBRssHandler.h
  75. 52
      src/softwareupdate/UBSoftwareUpdate.cpp
  76. 261
      src/softwareupdate/UBSoftwareUpdateController.cpp
  77. 61
      src/softwareupdate/UBSoftwareUpdateController.h
  78. 8
      src/softwareupdate/softwareupdate.pri

@ -52,7 +52,6 @@ include(src/podcast/podcast.pri)
include(src/tools/tools.pri) include(src/tools/tools.pri)
include(src/desktop/desktop.pri) include(src/desktop/desktop.pri)
include(src/web/web.pri) include(src/web/web.pri)
include(src/softwareupdate/softwareupdate.pri)
include(src/transition/transition.pri) include(src/transition/transition.pri)
include(src/customWidgets/customWidgets.pri) include(src/customWidgets/customWidgets.pri)
include(src/interfaces/interfaces.pri) include(src/interfaces/interfaces.pri)
@ -137,7 +136,7 @@ macx {
LIBS += -framework AppKit LIBS += -framework AppKit
LIBS += -framework WebKit LIBS += -framework WebKit
CONFIG(release, debug|release):CONFIG += x86 ppc CONFIG(release, debug|release):CONFIG += x86
# [03-02-2011] We must use the 32bit version for the moment # [03-02-2011] We must use the 32bit version for the moment
# because the Quicktime components used by this application # because the Quicktime components used by this application

@ -1643,10 +1643,10 @@
<normaloff>:/images/toolbar/library.png</normaloff>:/images/toolbar/library.png</iconset> <normaloff>:/images/toolbar/library.png</normaloff>:/images/toolbar/library.png</iconset>
</property> </property>
<property name="text"> <property name="text">
<string>Gtorup items</string> <string>Group Items</string>
</property> </property>
<property name="toolTip"> <property name="toolTip">
<string>Erase Content</string> <string>Group items</string>
</property> </property>
</action> </action>
</widget> </widget>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation>التصدير لمتصفح الويب</translation> <translation>التصدير لمتصفح الويب</translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished">الاضافة الى الصفحة</translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished">تعيين كخلفية</translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished">الاضافة الى المكتبة</translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished">معلومات حول الأشياء</translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished">الاضافة الى المفضلة</translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished">تقاسم</translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished">بحث</translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished">حذف</translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished">العودة الى المجلد</translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished">الحذف المفضلة</translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished">انشاء مجلد جديد</translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished">مقفل</translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished">مرئي على الشاشة الكبيرة</translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1857,11 +1922,104 @@ Do you want to ignore these errors for this host?</source>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type goals here...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2833,6 +2991,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation>Eksport til webbrowser</translation> <translation>Eksport til webbrowser</translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished">Tilføj til side</translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished">Brug som baggrund</translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished">Tilføj til bibliotek</translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished">Oplysninger om objekt</translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished">Tilføj til favoritter</translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished">Del</translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished">Søg</translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished">Slet</translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished">Tilbage til mappe</translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished">Fjern fra favoritter</translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished">Opret ny mappe</translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished">Låst</translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished">Synlig udvidet skærm</translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1863,11 +1928,104 @@ Do you want to ignore these errors for this host?</source>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type goals here...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2840,6 +2998,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation>In Web-Browser exportieren</translation> <translation>In Web-Browser exportieren</translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished">Zur Seite hinzufügen</translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished">Als Hintergrund festlegen</translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished">Zur Bibliothek hinzufügen</translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished">Objektinformationen</translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished">Zu Favoriten hinzufügen</translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished">Teilen</translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished">Suchen</translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished">Löschen</translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished">Zurück zum Ordner</translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished">Aus Favoritenliste entfernen</translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished">Neuen Ordner erstellen</translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished">Gesperrt</translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished">Auf erweitertem Bildschirm sichtbar</translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1863,11 +1928,104 @@ Möchten Sie diese Fehler auf diesem Computer ignorieren?</translation>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type goals here...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2840,6 +2998,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1857,11 +1922,104 @@ Do you want to ignore these errors for this host?</source>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type authors here ...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type goals here...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2833,6 +2991,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1857,11 +1922,104 @@ Do you want to ignore these errors for this host?</source>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type authors here ...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type goals here...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2833,6 +2991,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation>Importar viejos documentos de Sankore o Uniboard</translation> <translation>Importar viejos documentos de Sankore o Uniboard</translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation>Exportar al explorador web</translation> <translation>Exportar al explorador web</translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished">Añadir a la página</translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished">Definir como fondo</translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished">Añadir a biblioteca</translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished">Información del objeto</translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished">Añadir a favoritos</translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished">Compartir</translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished">Eliminar</translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished">Regresar a la carpeta</translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished">Eliminar de favoritos</translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished">Crear nueva carpeta</translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished">Bloqueado</translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished">Visible en pantalla extendida</translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1863,11 +1928,104 @@ Do you want to ignore these errors for this host?</source>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type goals here...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2844,6 +3002,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation>Importer les anciens documents Sankoré et Uniboard</translation> <translation>Importer les anciens documents Sankoré et Uniboard</translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation>Groupe les éléments</translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1331,6 +1335,67 @@
<translation>Exporter vers un navigateur Web</translation> <translation>Exporter vers un navigateur Web</translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation>Ajouter à la page</translation>
</message>
<message>
<source>Set as background</source>
<translation>Ajouter en arrière plan</translation>
</message>
<message>
<source>Add to library</source>
<translation>Ajouter à la librarie</translation>
</message>
<message>
<source>Object informations</source>
<translation>Informations</translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation>Ajouter aux favoris</translation>
</message>
<message>
<source>Share</source>
<translation>Partager</translation>
</message>
<message>
<source>Search</source>
<translation>Rechercher</translation>
</message>
<message>
<source>Delete</source>
<translation>Supprimer</translation>
</message>
<message>
<source>Back to folder</source>
<translation>Retour au répertoire</translation>
</message>
<message>
<source>Remove from favorites</source>
<translation>Supprimer des favoris</translation>
</message>
<message>
<source>Create new folder</source>
<translation>Créer un nouveau dossier</translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation>Verrouillé</translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation>Visible sur l&apos;écran de projection</translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1801,33 +1866,33 @@ Voulez-vous ignorer les erreurs pour ce serveur?</translation>
<name>UBTGActionWidget</name> <name>UBTGActionWidget</name>
<message> <message>
<source>Teacher</source> <source>Teacher</source>
<translation type="unfinished"></translation> <translation>Professeur</translation>
</message> </message>
<message> <message>
<source>Student</source> <source>Student</source>
<translation type="unfinished"></translation> <translation>Elève</translation>
</message> </message>
<message> <message>
<source>Type task here ...</source> <source>Type task here ...</source>
<translation type="unfinished"></translation> <translation>Ajouter une action</translation>
</message> </message>
</context> </context>
<context> <context>
<name>UBTGMediaWidget</name> <name>UBTGMediaWidget</name>
<message> <message>
<source>drop media here ...</source> <source>drop media here ...</source>
<translation type="unfinished"></translation> <translation>Glisser un média ici ...</translation>
</message> </message>
<message> <message>
<source>Type title here...</source> <source>Type title here...</source>
<translation type="unfinished"></translation> <translation>Titre de l&apos;activité</translation>
</message> </message>
</context> </context>
<context> <context>
<name>UBTGUrlWidget</name> <name>UBTGUrlWidget</name>
<message> <message>
<source>Insert link title here...</source> <source>Insert link title here...</source>
<translation type="unfinished"></translation> <translation>Titre</translation>
</message> </message>
</context> </context>
<context> <context>
@ -1841,39 +1906,132 @@ Voulez-vous ignorer les erreurs pour ce serveur?</translation>
<name>UBTeacherGuideEditionWidget</name> <name>UBTeacherGuideEditionWidget</name>
<message> <message>
<source>Type title here ...</source> <source>Type title here ...</source>
<translation type="unfinished"></translation> <translation>Titre</translation>
</message> </message>
<message> <message>
<source>Type comment here ...</source> <source>Type comment here ...</source>
<translation type="unfinished"></translation> <translation>Commentaire, descriptif</translation>
</message> </message>
<message> <message>
<source>Add an action</source> <source>Add an action</source>
<translation type="unfinished"></translation> <translation>Ajouter une action</translation>
</message> </message>
<message> <message>
<source>Add a media</source> <source>Add a media</source>
<translation type="unfinished"></translation> <translation>Ajouter un média</translation>
</message> </message>
<message> <message>
<source>Add a link</source> <source>Add a link</source>
<translation type="unfinished"></translation> <translation>Ajouter un lien</translation>
</message> </message>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation>Page: %0</translation>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation>Titre de la séance</translation>
</message>
<message>
<source>Author(s)</source>
<translation>Auteur(s)</translation>
</message>
<message>
<source>Type authors here ...</source>
<translation>Auteur(s)</translation>
</message>
<message>
<source>Goal(s)</source>
<translation>Objectif(s)</translation>
</message>
<message>
<source>Type goals here...</source>
<translation>Objectifs</translation>
</message>
<message>
<source>Resource indexing</source>
<translation>Indexation de la ressource</translation>
</message>
<message>
<source>Keywords:</source>
<translation>Mots clé(s)</translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation>Mots clés</translation>
</message>
<message>
<source>Level:</source>
<translation>Niveau scolaire</translation>
</message>
<message>
<source>Branch:</source>
<translation>Discipline</translation>
</message>
<message> <message>
<source>Document title</source> <source>Type:</source>
<translation>Type</translation>
</message>
<message>
<source>Licence</source>
<translation>Licence</translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Page: %0</source> <source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation>Crée le: </translation>
</message>
<message>
<source>Updated the:
</source>
<translation>Modifié le: </translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message>
<source>Page: %0</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>UBThumbnailAdaptor</name> <name>UBThumbnailAdaptor</name>
@ -2842,6 +3000,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation>Importer les anciens documents Sankoré et Uniboard</translation> <translation>Importer les anciens documents Sankoré et Uniboard</translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation>Groupe les éléments</translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1196,8 +1200,8 @@
<message numerus="yes"> <message numerus="yes">
<source>%1 pages copied</source> <source>%1 pages copied</source>
<translation> <translation>
<numerusform>%1 page(s) copiée(s)</numerusform> <numerusform>%1 page copiée</numerusform>
<numerusform></numerusform> <numerusform>%1 pages copiées</numerusform>
</translation> </translation>
</message> </message>
</context> </context>
@ -1331,6 +1335,67 @@
<translation>Exporter vers un navigateur Web</translation> <translation>Exporter vers un navigateur Web</translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation>Ajouter à la page</translation>
</message>
<message>
<source>Set as background</source>
<translation>Ajouter en arrière plan</translation>
</message>
<message>
<source>Add to library</source>
<translation>Ajouter à la librarie</translation>
</message>
<message>
<source>Object informations</source>
<translation>Informations</translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation>Ajouter aux favoris</translation>
</message>
<message>
<source>Share</source>
<translation>Partager</translation>
</message>
<message>
<source>Search</source>
<translation>Rechercher</translation>
</message>
<message>
<source>Delete</source>
<translation>Supprimer</translation>
</message>
<message>
<source>Back to folder</source>
<translation>Retour au répertoire</translation>
</message>
<message>
<source>Remove from favorites</source>
<translation>Supprimer des favoris</translation>
</message>
<message>
<source>Create new folder</source>
<translation>Créer un nouveau dossier</translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation>Verrouillé</translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation>Visible sur l&apos;écran de projection</translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1473,7 +1538,7 @@
<name>UBKeyboardPalette</name> <name>UBKeyboardPalette</name>
<message> <message>
<source>Enter</source> <source>Enter</source>
<translation type="unfinished"></translation> <translation>Retour</translation>
</message> </message>
</context> </context>
<context> <context>
@ -1801,33 +1866,33 @@ Voulez-vous ignorer les erreurs pour ce serveur?</translation>
<name>UBTGActionWidget</name> <name>UBTGActionWidget</name>
<message> <message>
<source>Teacher</source> <source>Teacher</source>
<translation type="unfinished"></translation> <translation>Professeur</translation>
</message> </message>
<message> <message>
<source>Student</source> <source>Student</source>
<translation type="unfinished"></translation> <translation>Elève</translation>
</message> </message>
<message> <message>
<source>Type task here ...</source> <source>Type task here ...</source>
<translation type="unfinished"></translation> <translation>Ajouter une action</translation>
</message> </message>
</context> </context>
<context> <context>
<name>UBTGMediaWidget</name> <name>UBTGMediaWidget</name>
<message> <message>
<source>drop media here ...</source> <source>drop media here ...</source>
<translation type="unfinished"></translation> <translation>Glisser un média ici ...</translation>
</message> </message>
<message> <message>
<source>Type title here...</source> <source>Type title here...</source>
<translation type="unfinished"></translation> <translation>Titre de l&apos;activité</translation>
</message> </message>
</context> </context>
<context> <context>
<name>UBTGUrlWidget</name> <name>UBTGUrlWidget</name>
<message> <message>
<source>Insert link title here...</source> <source>Insert link title here...</source>
<translation type="unfinished"></translation> <translation>Titre</translation>
</message> </message>
</context> </context>
<context> <context>
@ -1841,39 +1906,132 @@ Voulez-vous ignorer les erreurs pour ce serveur?</translation>
<name>UBTeacherGuideEditionWidget</name> <name>UBTeacherGuideEditionWidget</name>
<message> <message>
<source>Type title here ...</source> <source>Type title here ...</source>
<translation type="unfinished"></translation> <translation>Titre</translation>
</message> </message>
<message> <message>
<source>Type comment here ...</source> <source>Type comment here ...</source>
<translation type="unfinished"></translation> <translation>Commentaire, descriptif</translation>
</message> </message>
<message> <message>
<source>Add an action</source> <source>Add an action</source>
<translation type="unfinished"></translation> <translation>Ajouter une action</translation>
</message> </message>
<message> <message>
<source>Add a media</source> <source>Add a media</source>
<translation type="unfinished"></translation> <translation>Ajouter un média</translation>
</message> </message>
<message> <message>
<source>Add a link</source> <source>Add a link</source>
<translation type="unfinished"></translation> <translation>Ajouter un lien</translation>
</message> </message>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation>Page: %0</translation>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation>Titre de la séance</translation>
</message>
<message>
<source>Author(s)</source>
<translation>Auteur(s)</translation>
</message>
<message>
<source>Type authors here ...</source>
<translation>Auteur(s)</translation>
</message>
<message>
<source>Goal(s)</source>
<translation>Objectif(s)</translation>
</message>
<message>
<source>Type goals here...</source>
<translation>Objectifs</translation>
</message>
<message>
<source>Resource indexing</source>
<translation>Indexation de la ressource</translation>
</message>
<message>
<source>Keywords:</source>
<translation>Mots clé(s)</translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation>Mots clés</translation>
</message>
<message>
<source>Level:</source>
<translation>Niveau scolaire</translation>
</message>
<message>
<source>Branch:</source>
<translation>Discipline</translation>
</message>
<message> <message>
<source>Document title</source> <source>Type:</source>
<translation>Type</translation>
</message>
<message>
<source>Licence</source>
<translation>Licence</translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Page: %0</source> <source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation>Crée le: </translation>
</message>
<message>
<source>Updated the:
</source>
<translation>Modifié le: </translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message>
<source>Page: %0</source>
<translation></translation>
</message>
</context> </context>
<context> <context>
<name>UBThumbnailAdaptor</name> <name>UBThumbnailAdaptor</name>
@ -2567,27 +2725,27 @@ p, li { white-space: pre-wrap; }
</message> </message>
<message> <message>
<source>Multi display</source> <source>Multi display</source>
<translation type="unfinished"></translation> <translation>Multi-écran</translation>
</message> </message>
<message> <message>
<source>Swap control display and view display</source> <source>Swap control display and view display</source>
<translation type="unfinished"></translation> <translation>Inverser les écrans</translation>
</message> </message>
<message> <message>
<source>Mode</source> <source>Mode</source>
<translation type="unfinished"></translation> <translation>Mode</translation>
</message> </message>
<message> <message>
<source>Mode to start in:</source> <source>Mode to start in:</source>
<translation type="unfinished"></translation> <translation>Démarrer en mode:</translation>
</message> </message>
<message> <message>
<source>Board</source> <source>Board</source>
<translation type="unfinished">Tableau</translation> <translation>Tableau</translation>
</message> </message>
<message> <message>
<source>Desktop</source> <source>Desktop</source>
<translation type="unfinished"></translation> <translation>Bureau</translation>
</message> </message>
<message> <message>
<source>Proxy User:</source> <source>Proxy User:</source>
@ -2842,6 +3000,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation>Importa i vecchi documenti Sankoré o Uniboard</translation> <translation>Importa i vecchi documenti Sankoré o Uniboard</translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1331,6 +1335,67 @@
<translation>Esporta nel browser web</translation> <translation>Esporta nel browser web</translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished">Aggiungi alla pagina</translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished">Imposta come sfondo</translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished">Aggiungi alla libreria</translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished">Informazioni sull&apos;oggetto</translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished">Aggiungi ai preferiti</translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished">Condividi</translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished">Cancella</translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished">Torna alla cartella</translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished">Rimuovi dai preferiti</translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished">Crea nuova cartella</translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished">Bloccato</translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished">Visibile sullo schermo esteso</translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1865,11 +1930,104 @@ Vuoi ignorare gli errori per questo host?</translation>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type goals here...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2846,6 +3004,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation>ייצא לדפדפן </translation> <translation>ייצא לדפדפן </translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished">הוסף לדף</translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished">קבע כרקע</translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished">הוסף לספרייה</translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished">מידע על האובייקט</translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished">הוסף למועדפים</translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished">שתף</translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished">מחק</translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished">חזרה לקובץ</translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished">הסר מהמועדפים</translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished">צור תיקייה חדשה</translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished">נעול</translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished">ניתן לראותו במסך רחב</translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1857,11 +1922,104 @@ Do you want to ignore these errors for this host?</source>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type goals here...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2834,6 +2992,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation></translation> <translation></translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished"> </translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished"> </translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1864,11 +1929,104 @@ Do you want to ignore these errors for this host?</source>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type goals here...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2841,6 +2999,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation> </translation> <translation> </translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished"> </translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished"> </translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished"> </translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished"> </translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished"> </translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished"> </translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished"> </translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished"> </translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished"> </translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1863,11 +1928,104 @@ Do you want to ignore these errors for this host?</source>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type goals here...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2844,6 +3002,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1330,6 +1334,67 @@
<translation>Eksporter til nettleser</translation> <translation>Eksporter til nettleser</translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished">Legg til side</translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished">Bruk som bakgrunn</translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished">Legg til bibliotek</translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished">Objektopplysninger</translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished">Legg til favoritter</translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished">Del</translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished">Søk</translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished">Tilbake til mappe</translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished">Fjern fra favoritter</translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished">Opprett ny mappe</translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished">Låst</translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished">Synlig utvidet skjerm</translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1858,11 +1923,104 @@ Do you want to ignore these errors for this host?</source>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type goals here...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2838,6 +2996,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation>Exporteren naar Web Browser</translation> <translation>Exporteren naar Web Browser</translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished">Aan pagina toevoegen</translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished">Als achtergrond gebruiken</translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished">Aan bibliotheek toevoegen</translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished">Object informaties</translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished">Aan favorieten toevoegen</translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished">Delen</translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished">Zoeken</translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished">Verwijderen</translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished">Terug naar map</translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished">Uit favorieten verwijderen</translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished">Nieuwe map maken</translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished">Vergrendeld</translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished">Weergeven op Verbreed scherm</translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1857,11 +1922,104 @@ Do you want to ignore these errors for this host?</source>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type goals here...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2833,6 +2991,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -800,6 +800,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1330,6 +1334,67 @@
<translation>Eksportowanie do przeglądarki sieci Web</translation> <translation>Eksportowanie do przeglądarki sieci Web</translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished">Dodaj do strony</translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished">Ustaw jako tło</translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished">Dodaj do biblioteki</translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished">Informacje o obiekcie</translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished">Dodaj do ulubionych</translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished">Udostępniaj</translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished">Szukaj</translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished">Usuń</translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished">Powrót do folderu</translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished">Usuń z ulubionych</translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished">Utwórz nowy folder</translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished">Zablokowane</translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished">Widoczne na ekranie rozszerzonym</translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1864,11 +1929,104 @@ Czy chcesz ignorować te błędy dla tego hosta?</translation>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type goals here...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2846,6 +3004,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1857,11 +1922,104 @@ Do you want to ignore these errors for this host?</source>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type authors here ...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type goals here...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2833,6 +2991,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1857,11 +1922,104 @@ Do you want to ignore these errors for this host?</source>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type authors here ...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type goals here...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2833,6 +2991,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation>Exportare în browser web</translation> <translation>Exportare în browser web</translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished">Adăugare la pagină</translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished">Setare ca fundal</translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished">Adăugare la bibliotecă</translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished">Informaţii despre obiect</translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished">Adăugare la favorite</translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished">Distribuire</translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished">Căutare</translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished">Ştergere</translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished">Înapoi la folder</translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished">Eliminare din favorite</translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished">Creare folder nou</translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished">Blocat</translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished">Vizibil pe ecran extins</translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1863,11 +1928,104 @@ Doriţi să ignoraţi aceste erori pentru acest host?</translation>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type goals here...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2844,6 +3002,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1331,6 +1335,67 @@
<translation>Экспорт в веб-браузер</translation> <translation>Экспорт в веб-браузер</translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished">Добавить на страницу</translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished">Сделать фоновым изображением</translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished">Добавить в библиотеку</translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished">Информация об объекте</translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished">Добавить в избранное</translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished">Совместный доступ</translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished">Поиск</translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished">Удалить</translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished">Назад в папку</translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished">Удалить из избранного</translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished">Создать новую папку</translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished">Заблокированный</translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished">Видимый на втором экране</translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1865,11 +1930,104 @@ Do you want to ignore these errors for this host?</source>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type goals here...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2846,6 +3004,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Erase Annotation</source> <source>Erase Annotation</source>
<translation>Vymazať anotáciu</translation> <translation>Vymazať anotáciu</translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1333,6 +1337,67 @@
<translation>Exportovať do webového prehliadača</translation> <translation>Exportovať do webového prehliadača</translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished">Pridať na stránku</translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished">Nastaviť ako pozadie</translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished">Pridať do knižnice</translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished">Informácie o objekte</translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished">Ajouter au favoris</translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished">Partager</translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished">Retour au répertoire</translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished">Supprimer des favoris</translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished">Créer un nouveau dossier</translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished">Zamknuté</translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished">Vidieť to na rozšírenej obrazovke</translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1867,11 +1932,104 @@ Chcete ignorovať tieto chyby na tomto serveri?</translation>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type goals here...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2848,6 +3006,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation>Exportera till Webläsare</translation> <translation>Exportera till Webläsare</translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished">Lägg till sida</translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished">Infoga som bakgrund</translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished">Lägg till bibliotek</translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished">Objekt information</translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished">Lägg till favoriter</translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished">Dela</translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished">Sök</translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished">Radera</translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished">Tillbaka till mapp</translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished">Ta bort från favoriter</translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished">Skapa ny mapp</translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished">Låst</translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished">Synlig utvidgad skärm</translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1863,11 +1928,104 @@ Vill du ignorera felen för den här värden?</translation>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type goals here...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2844,6 +3002,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source> <source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>PasswordDialog</name> <name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation></translation> <translation></translation>
</message> </message>
</context> </context>
<context>
<name>UBFeatureProperties</name>
<message>
<source>Add to page</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Set as background</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Add to library</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Object informations</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBFeaturesActionBar</name>
<message>
<source>Add to favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Share</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Search</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Back to folder</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Remove from favorites</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Create new folder</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBGraphicsGroupContainerItemDelegate</name>
<message>
<source>Locked</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Visible on Extended Screen</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>UBGraphicsItemDelegate</name> <name>UBGraphicsItemDelegate</name>
<message> <message>
@ -1863,11 +1928,104 @@ Do you want to ignore these errors for this host?</source>
</message> </message>
</context> </context>
<context> <context>
<name>UBTeacherGuidePresentationWidget</name> <name>UBTeacherGuidePageZeroWidget</name>
<message>
<source>Page 0</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type session title here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Author(s)</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Goal(s)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<source>Document title</source> <source>Type goals here...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Resource indexing</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Keywords:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type keywords here ...</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Level:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Branch:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Type:</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Licence</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution CC BY</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NoDerivs CC BY-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-ShareAlike CC BY-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial CC BY-NC</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-NoDerivs CC BY-NC-ND</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Attribution-NonCommercial-ShareAlike CC BY-NC-SA</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Public domain</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Copyright</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Created the:
</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Updated the:
</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>UBTeacherGuidePresentationWidget</name>
<message> <message>
<source>Page: %0</source> <source>Page: %0</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
@ -2840,6 +2998,21 @@ p, li { white-space: pre-wrap; }
&lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p align=&quot;justify&quot; style=&quot; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;GIPENA&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Délégation Interministérielle à l&apos;Education Numérique en Afrique&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;20 Avenue Ségur Paris 75007&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;Téléphone : 01 43 17 68 08&lt;/span&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style=&quot; font-size:9pt; color:#3c3c3c;&quot;&gt;email: &lt;/span&gt;&lt;a href=&quot;mailto:contact@sankore.org&quot;&gt;&lt;span style=&quot; font-size:9pt; text-decoration: underline; color:#0000ff;&quot;&gt;contact@sankore.org&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-size:9pt;&quot;&gt; &lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<source>Credits</source>
<translation type="unfinished"></translation>
</message>
<message utf8="true">
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Ubuntu&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; font-size:12pt; font-weight:600;&quot;&gt;Fonts&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Thanks to Henri ROGELET for Script-École 2, ScriptCase-École, Alphonetic (&lt;/span&gt;&lt;a href=&quot;http://pointecole.free.fr/polices.html&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; text-decoration: underline; color:#0000ff;&quot;&gt;http://pointecole.free.fr/polices.html&lt;/span&gt;&lt;/a&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;).&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:12px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;;&quot;&gt;- Andika Copyright (c) 2004-2011, SIL International (http://www.sil.org/). Licensed under the SIL Open Font License, Version 1.1 (http://scripts.sil.org/OFL), with Reserved Font Names &amp;quot;Andika&amp;quot; and &amp;quot;SIL&amp;quot;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot; margin-top:0px; margin-bottom:12px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;span style=&quot; font-family:&apos;Arial&apos;; color:#000000;&quot;&gt;- Ecolier CC BY-NC-ND 2.0 (JM Douteau)&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation>
</message>
</context> </context>
<context> <context>
<name>trapFlashDialog</name> <name>trapFlashDialog</name>

@ -234,19 +234,13 @@ QLabel#UBTGPresentationDocumentTitle
font-weight:bold; font-weight:bold;
} }
QLabel#UBTGEditionPageNumberLabel QLabel#UBTGPageNumberLabel
{ {
color: black; color: black;
font-size : 12px; font-size : 12px;
font-weight:bold; font-weight:bold;
} }
QLabel#UBTGPresentationPageNumberLabel
{
color: black;
font-size : 12px;
}
UBTGAdaptableText#UBTGEditionPageTitle, UBTGAdaptableText#UBTGEditionPageTitle,
UBTGAdaptableText#UBTGEditionComment UBTGAdaptableText#UBTGEditionComment
{ {
@ -273,3 +267,10 @@ QFrame#UBTGSeparator
{ {
background-color: #cccccc; background-color: #cccccc;
} }
UBTGAdaptableText {
background-color: white;
border:1 solid #999999;
border-radius : 10px;
padding: 2px;
}

@ -17,7 +17,9 @@
#include <QSvgRenderer> #include <QSvgRenderer>
#include "core/UBPersistenceManager.h" #include "core/UBPersistenceManager.h"
#include "document/UBDocumentProxy.h" #include "document/UBDocumentProxy.h"
#include "domain/UBItem.h" #include "domain/UBItem.h"
#include "domain/UBGraphicsPolygonItem.h" #include "domain/UBGraphicsPolygonItem.h"
#include "domain/UBGraphicsStroke.h" #include "domain/UBGraphicsStroke.h"

@ -14,7 +14,6 @@
*/ */
#include "UBImportImage.h" #include "UBImportImage.h"
#include "UBSvgSubsetAdaptor.h"
#include "document/UBDocumentProxy.h" #include "document/UBDocumentProxy.h"

@ -14,7 +14,6 @@
*/ */
#include "UBImportPDF.h" #include "UBImportPDF.h"
#include "UBSvgSubsetAdaptor.h"
#include "document/UBDocumentProxy.h" #include "document/UBDocumentProxy.h"

@ -111,12 +111,13 @@ void UBMetadataDcSubsetAdaptor::persist(UBDocumentProxy* proxy)
xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri, "updated-at", UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTimeUtc())); xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri, "updated-at", UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTimeUtc()));
// introduced in OpenSankore 1.40.00 // introduced in OpenSankore 1.40.00
xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri,UBSettings::sessionTitle,proxy->metaData(UBSettings::sessionTitle).toString()); xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri,UBSettings::sessionTitle,proxy->metaData(UBSettings::sessionTitle).toString());
xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri,UBSettings::sessionTarget,proxy->metaData(UBSettings::sessionTarget).toString());
xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri,UBSettings::sessionLicence,proxy->metaData(UBSettings::sessionLicence).toString());
xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri,UBSettings::sessionKeywords,proxy->metaData(UBSettings::sessionKeywords).toString());
xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri,UBSettings::sessionLevel,proxy->metaData(UBSettings::sessionLevel).toString());
xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri,UBSettings::sessionTopic,proxy->metaData(UBSettings::sessionTopic).toString());
xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri,UBSettings::sessionAuthors,proxy->metaData(UBSettings::sessionAuthors).toString()); xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri,UBSettings::sessionAuthors,proxy->metaData(UBSettings::sessionAuthors).toString());
xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri,UBSettings::sessionObjectives,proxy->metaData(UBSettings::sessionObjectives).toString());
xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri,UBSettings::sessionKeywords,proxy->metaData(UBSettings::sessionKeywords).toString());
xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri,UBSettings::sessionGradeLevel,proxy->metaData(UBSettings::sessionGradeLevel).toString());
xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri,UBSettings::sessionSubjects,proxy->metaData(UBSettings::sessionSubjects).toString());
xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri,UBSettings::sessionType,proxy->metaData(UBSettings::sessionType).toString());
xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri,UBSettings::sessionLicence,proxy->metaData(UBSettings::sessionLicence).toString());
xmlWriter.writeEndElement(); //dc:Description xmlWriter.writeEndElement(); //dc:Description
xmlWriter.writeEndElement(); //RDF xmlWriter.writeEndElement(); //RDF
@ -222,36 +223,42 @@ QMap<QString, QVariant> UBMetadataDcSubsetAdaptor::load(QString pPath)
{ {
metadata.insert(UBSettings::sessionTitle, xml.readElementText()); metadata.insert(UBSettings::sessionTitle, xml.readElementText());
} }
else if (xml.name() == UBSettings::sessionTarget // introduced in OpenSankore 1.40.00 else if (xml.name() == UBSettings::sessionAuthors // introduced in OpenSankore 1.40.00
&& xml.namespaceUri() == UBSettings::uniboardDocumentNamespaceUri) && xml.namespaceUri() == UBSettings::uniboardDocumentNamespaceUri)
{ {
metadata.insert(UBSettings::sessionTarget, xml.readElementText()); metadata.insert(UBSettings::sessionAuthors, xml.readElementText());
} }
else if (xml.name() == UBSettings::sessionLicence // introduced in OpenSankore 1.40.00 else if (xml.name() == UBSettings::sessionObjectives // introduced in OpenSankore 1.40.00
&& xml.namespaceUri() == UBSettings::uniboardDocumentNamespaceUri) && xml.namespaceUri() == UBSettings::uniboardDocumentNamespaceUri)
{ {
metadata.insert(UBSettings::sessionLicence, xml.readElementText()); metadata.insert(UBSettings::sessionObjectives, xml.readElementText());
} }
else if (xml.name() == UBSettings::sessionKeywords // introduced in OpenSankore 1.40.00 else if (xml.name() == UBSettings::sessionKeywords // introduced in OpenSankore 1.40.00
&& xml.namespaceUri() == UBSettings::uniboardDocumentNamespaceUri) && xml.namespaceUri() == UBSettings::uniboardDocumentNamespaceUri)
{ {
metadata.insert(UBSettings::sessionKeywords, xml.readElementText()); metadata.insert(UBSettings::sessionKeywords, xml.readElementText());
} }
else if (xml.name() == UBSettings::sessionLevel // introduced in OpenSankore 1.40.00 else if (xml.name() == UBSettings::sessionGradeLevel // introduced in OpenSankore 1.40.00
&& xml.namespaceUri() == UBSettings::uniboardDocumentNamespaceUri) && xml.namespaceUri() == UBSettings::uniboardDocumentNamespaceUri)
{ {
metadata.insert(UBSettings::sessionLevel, xml.readElementText()); metadata.insert(UBSettings::sessionGradeLevel, xml.readElementText());
} }
else if (xml.name() == UBSettings::sessionTopic // introduced in OpenSankore 1.40.00 else if (xml.name() == UBSettings::sessionSubjects // introduced in OpenSankore 1.40.00
&& xml.namespaceUri() == UBSettings::uniboardDocumentNamespaceUri) && xml.namespaceUri() == UBSettings::uniboardDocumentNamespaceUri)
{ {
metadata.insert(UBSettings::sessionTopic, xml.readElementText()); metadata.insert(UBSettings::sessionSubjects, xml.readElementText());
} }
else if (xml.name() == UBSettings::sessionAuthors // introduced in OpenSankore 1.40.00 else if (xml.name() == UBSettings::sessionType // introduced in OpenSankore 1.40.00
&& xml.namespaceUri() == UBSettings::uniboardDocumentNamespaceUri) && xml.namespaceUri() == UBSettings::uniboardDocumentNamespaceUri)
{ {
metadata.insert(UBSettings::sessionAuthors, xml.readElementText()); metadata.insert(UBSettings::sessionType, xml.readElementText());
}
else if (xml.name() == UBSettings::sessionLicence // introduced in OpenSankore 1.40.00
&& xml.namespaceUri() == UBSettings::uniboardDocumentNamespaceUri)
{
metadata.insert(UBSettings::sessionLicence, xml.readElementText());
} }
metadata.insert(UBSettings::documentVersion, docVersion); metadata.insert(UBSettings::documentVersion, docVersion);
} }
@ -291,7 +298,6 @@ QMap<QString, QVariant> UBMetadataDcSubsetAdaptor::load(QString pPath)
metadata.insert(UBSettings::documentDate, QVariant(date)); metadata.insert(UBSettings::documentDate, QVariant(date));
return metadata; return metadata;
} }

@ -54,6 +54,8 @@
#include "core/UBPersistenceManager.h" #include "core/UBPersistenceManager.h"
#include "core/UBApplication.h" #include "core/UBApplication.h"
#include "interfaces/IDataStorage.h"
#include "pdf/PDFRenderer.h" #include "pdf/PDFRenderer.h"
#include "core/memcheck.h" #include "core/memcheck.h"
@ -69,8 +71,7 @@ const QString UBSvgSubsetAdaptor::sPixelUnit = "px";
const QString UBSvgSubsetAdaptor::sFontWeightPrefix = "font-weight:"; const QString UBSvgSubsetAdaptor::sFontWeightPrefix = "font-weight:";
const QString UBSvgSubsetAdaptor::sFontStylePrefix = "font-style:"; const QString UBSvgSubsetAdaptor::sFontStylePrefix = "font-style:";
const QString UBSvgSubsetAdaptor::sFormerUniboardDocumentNamespaceUri = "http://www.mnemis.com/uniboard"; const QString UBSvgSubsetAdaptor::sFormerUniboardDocumentNamespaceUri = "http://www.mnemis.com/uniboard";
QMap<QString,IDataStorage*> UBSvgSubsetAdaptor::additionalElementToStore;
QString UBSvgSubsetAdaptor::toSvgTransform(const QMatrix& matrix) QString UBSvgSubsetAdaptor::toSvgTransform(const QMatrix& matrix)
{ {
@ -110,7 +111,6 @@ QMatrix UBSvgSubsetAdaptor::fromSvgTransform(const QString& transform)
static bool itemZIndexComp(const QGraphicsItem* item1, static bool itemZIndexComp(const QGraphicsItem* item1,
const QGraphicsItem* item2) const QGraphicsItem* item2)
{ {
// return item1->zValue() < item2->zValue();
return item1->data(UBGraphicsItemData::ItemOwnZValue).toReal() < item2->data(UBGraphicsItemData::ItemOwnZValue).toReal(); return item1->data(UBGraphicsItemData::ItemOwnZValue).toReal() < item2->data(UBGraphicsItemData::ItemOwnZValue).toReal();
} }
@ -134,8 +134,7 @@ void UBSvgSubsetAdaptor::upgradeScene(UBDocumentProxy* proxy, const int pageInde
QDomDocument UBSvgSubsetAdaptor::loadSceneDocument(UBDocumentProxy* proxy, const int pPageIndex) QDomDocument UBSvgSubsetAdaptor::loadSceneDocument(UBDocumentProxy* proxy, const int pPageIndex)
{ {
QString fileName = proxy->persistencePath() + QString fileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg",pPageIndex);
UBFileSystemUtils::digitFileFormat("/page%1.svg", pPageIndex + 1);
QFile file(fileName); QFile file(fileName);
QDomDocument doc("page"); QDomDocument doc("page");
@ -158,8 +157,7 @@ QDomDocument UBSvgSubsetAdaptor::loadSceneDocument(UBDocumentProxy* proxy, const
void UBSvgSubsetAdaptor::setSceneUuid(UBDocumentProxy* proxy, const int pageIndex, QUuid pUuid) void UBSvgSubsetAdaptor::setSceneUuid(UBDocumentProxy* proxy, const int pageIndex, QUuid pUuid)
{ {
QString fileName = proxy->persistencePath() + QString fileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg",pageIndex);
UBFileSystemUtils::digitFileFormat("/page%1.svg", pageIndex + 1);
QFile file(fileName); QFile file(fileName);
@ -208,6 +206,16 @@ void UBSvgSubsetAdaptor::setSceneUuid(UBDocumentProxy* proxy, const int pageInde
} }
} }
bool UBSvgSubsetAdaptor::addElementToBeStored(QString domName, IDataStorage *dataStorageClass)
{
if(domName.isEmpty() || additionalElementToStore.contains(domName)){
qWarning() << "Error adding the element that should persist";
return false;
}
additionalElementToStore.insert(domName,dataStorageClass);
return true;
}
QString UBSvgSubsetAdaptor::uniboardDocumentNamespaceUriFromVersion(int mFileVersion) QString UBSvgSubsetAdaptor::uniboardDocumentNamespaceUriFromVersion(int mFileVersion)
{ {
@ -217,8 +225,7 @@ QString UBSvgSubsetAdaptor::uniboardDocumentNamespaceUriFromVersion(int mFileVer
UBGraphicsScene* UBSvgSubsetAdaptor::loadScene(UBDocumentProxy* proxy, const int pageIndex) UBGraphicsScene* UBSvgSubsetAdaptor::loadScene(UBDocumentProxy* proxy, const int pageIndex)
{ {
QString fileName = proxy->persistencePath() + QString fileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", pageIndex);
UBFileSystemUtils::digitFileFormat("/page%1.svg", pageIndex + 1);
QFile file(fileName); QFile file(fileName);
@ -243,8 +250,7 @@ UBGraphicsScene* UBSvgSubsetAdaptor::loadScene(UBDocumentProxy* proxy, const int
QUuid UBSvgSubsetAdaptor::sceneUuid(UBDocumentProxy* proxy, const int pageIndex) QUuid UBSvgSubsetAdaptor::sceneUuid(UBDocumentProxy* proxy, const int pageIndex)
{ {
QString fileName = proxy->persistencePath() + QString fileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", pageIndex);
UBFileSystemUtils::digitFileFormat("/page%1.svg", pageIndex + 1);
QFile file(fileName); QFile file(fileName);
@ -296,6 +302,53 @@ UBGraphicsScene* UBSvgSubsetAdaptor::loadScene(UBDocumentProxy* proxy, const QBy
} }
QString UBSvgSubsetAdaptor::readTeacherGuideNode(int sceneIndex)
{
QString result;
QString fileName = UBApplication::boardController->activeDocument()->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", sceneIndex);
QFile file(fileName);
file.open(QIODevice::ReadOnly);
QByteArray fileByteArray=file.readAll();
file.close();
QXmlStreamReader mXmlReader(fileByteArray);
while (!mXmlReader.atEnd())
{
mXmlReader.readNext();
if (mXmlReader.isStartElement())
{
if (mXmlReader.name() == "teacherBar" || mXmlReader.name() == "teacherGuide"){
result.clear();
result += "<teacherGuide version=\"" + mXmlReader.attributes().value("version").toString() + "\">";
result += "\n";
}
else if (mXmlReader.name() == "media" || mXmlReader.name() == "link" || mXmlReader.name() == "title" || mXmlReader.name() == "comment" || mXmlReader.name() == "action")
{
result += "<" + mXmlReader.name().toString() + " ";
foreach(QXmlStreamAttribute attribute, mXmlReader.attributes())
result += attribute.name().toString() + "=\"" + attribute.value().toString() + "\" ";
result += " />\n";
}
else
{
// NOOP
}
}
else if (mXmlReader.isEndElement() && (mXmlReader.name() == "teacherBar" || mXmlReader.name() == "teacherGuide")){
result += "</teacherGuide>";
}
}
if (mXmlReader.hasError())
{
qWarning() << "error parsing Sankore file " << mXmlReader.errorString();
}
return result;
}
UBSvgSubsetAdaptor::UBSvgSubsetReader::UBSvgSubsetReader(UBDocumentProxy* pProxy, const QByteArray& pXmlData) UBSvgSubsetAdaptor::UBSvgSubsetReader::UBSvgSubsetReader(UBDocumentProxy* pProxy, const QByteArray& pXmlData)
: mXmlReader(pXmlData) : mXmlReader(pXmlData)
, mProxy(pProxy) , mProxy(pProxy)
@ -317,6 +370,7 @@ UBGraphicsScene* UBSvgSubsetAdaptor::UBSvgSubsetReader::loadScene()
UBGraphicsStrokesGroup* strokesGroup = 0; UBGraphicsStrokesGroup* strokesGroup = 0;
UBDrawingController* dc = UBDrawingController::drawingController(); UBDrawingController* dc = UBDrawingController::drawingController();
while (!mXmlReader.atEnd()) while (!mXmlReader.atEnd())
{ {
mXmlReader.readNext(); mXmlReader.readNext();
@ -431,13 +485,13 @@ UBGraphicsScene* UBSvgSubsetAdaptor::UBSvgSubsetReader::loadScene()
else if (mXmlReader.name() == "g") else if (mXmlReader.name() == "g")
{ {
// Create new stroke, if its NULL or already has polygons // Create new stroke, if its NULL or already has polygons
if (annotationGroup) if (annotationGroup)
{ {
if (!annotationGroup->polygons().empty()) if (!annotationGroup->polygons().empty())
annotationGroup = new UBGraphicsStroke(); annotationGroup = new UBGraphicsStroke();
} }
else else
annotationGroup = new UBGraphicsStroke(); annotationGroup = new UBGraphicsStroke();
if(eDrawingMode_Vector == dc->drawingMode()){ if(eDrawingMode_Vector == dc->drawingMode()){
strokesGroup = new UBGraphicsStrokesGroup(); strokesGroup = new UBGraphicsStrokesGroup();
@ -711,7 +765,7 @@ UBGraphicsScene* UBSvgSubsetAdaptor::UBSvgSubsetReader::loadScene()
UBGraphicsItem::assignZValue(triangle, zFromSvg); UBGraphicsItem::assignZValue(triangle, zFromSvg);
} }
} }
else if(mXmlReader.name() == "cache") else if (mXmlReader.name() == "cache")
{ {
UBGraphicsCache* cache = cacheFromSvg(); UBGraphicsCache* cache = cacheFromSvg();
if(cache) if(cache)
@ -832,6 +886,18 @@ UBGraphicsScene* UBSvgSubsetAdaptor::UBSvgSubsetReader::loadScene()
currentWidget->setDatastoreEntry(key, value); currentWidget->setDatastoreEntry(key, value);
} }
// else if (mXmlReader.name() == "teacherBar" || mXmlReader.name() == "teacherGuide"){
// sTeacherGuideNode.clear();
// sTeacherGuideNode += "<teacherGuide version=\"" + mXmlReader.attributes().value("version").toString() + "\">";
// sTeacherGuideNode += "\n";
// }
// else if (mXmlReader.name() == "media" || mXmlReader.name() == "link" || mXmlReader.name() == "title" || mXmlReader.name() == "comment" || mXmlReader.name() == "action")
// {
// sTeacherGuideNode += "<" + mXmlReader.name().toString() + " ";
// foreach(QXmlStreamAttribute attribute, mXmlReader.attributes())
// sTeacherGuideNode += attribute.name().toString() + "=\"" + attribute.value().toString() + "\" ";
// sTeacherGuideNode += " />\n";
// }
else else
{ {
// NOOP // NOOP
@ -846,15 +912,24 @@ UBGraphicsScene* UBSvgSubsetAdaptor::UBSvgSubsetReader::loadScene()
//graphicsItemFromSvg(strokesGroup); //graphicsItemFromSvg(strokesGroup);
} }
if (annotationGroup) if (annotationGroup)
{ {
if (!annotationGroup->polygons().empty()) if (!annotationGroup->polygons().empty())
annotationGroup = 0; annotationGroup = 0;
} }
mGroupHasInfo = false; mGroupHasInfo = false;
mGroupDarkBackgroundColor = QColor(); mGroupDarkBackgroundColor = QColor();
mGroupLightBackgroundColor = QColor(); mGroupLightBackgroundColor = QColor();
} }
// else if (mXmlReader.name() == "teacherBar" || mXmlReader.name() == "teacherGuide"){
// sTeacherGuideNode += "</teacherGuide>";
// qDebug() << sTeacherGuideNode;
// QMap<QString,IDataStorage*> elements = getAdditionalElementToStore();
// IDataStorage* storageClass = elements.value("teacherGuide");
// if(storageClass){
// storageClass->load(sTeacherGuideNode);
// }
// }
} }
} }
@ -880,7 +955,7 @@ UBGraphicsScene* UBSvgSubsetAdaptor::UBSvgSubsetReader::loadScene()
void UBSvgSubsetAdaptor::persistScene(UBDocumentProxy* proxy, UBGraphicsScene* pScene, const int pageIndex) void UBSvgSubsetAdaptor::persistScene(UBDocumentProxy* proxy, UBGraphicsScene* pScene, const int pageIndex)
{ {
UBSvgSubsetWriter writer(proxy, pScene, pageIndex); UBSvgSubsetWriter writer(proxy, pScene, pageIndex);
writer.persistScene(); writer.persistScene(pageIndex);
} }
@ -928,7 +1003,7 @@ void UBSvgSubsetAdaptor::UBSvgSubsetWriter::writeSvgElement()
mXmlWriter.writeEndElement(); mXmlWriter.writeEndElement();
} }
bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene() bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene(int pageIndex)
{ {
@ -1166,8 +1241,28 @@ bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene()
openStroke = 0; openStroke = 0;
} }
QMap<QString,IDataStorage*> elements = getAdditionalElementToStore();
QVector<tIDataStorage*> dataStorageItems = elements.value("teacherGuide")->save(pageIndex);
foreach(tIDataStorage* eachItem, dataStorageItems){
if(eachItem->type == eElementType_START){
mXmlWriter.writeStartElement(eachItem->name);
foreach(QString key,eachItem->attributes.keys())
mXmlWriter.writeAttribute(key,eachItem->attributes.value(key));
}
else if (eachItem->type == eElementType_END)
mXmlWriter.writeEndElement();
else if (eachItem->type == eElementType_UNIQUE){
mXmlWriter.writeStartElement(eachItem->name);
foreach(QString key,eachItem->attributes.keys())
mXmlWriter.writeAttribute(key,eachItem->attributes.value(key));
mXmlWriter.writeEndElement();
}
else
qWarning() << "unknown type";
}
mXmlWriter.writeEndDocument(); mXmlWriter.writeEndDocument();
QString fileName = mDocumentPath + UBFileSystemUtils::digitFileFormat("/page%1.svg", mPageIndex + 1); QString fileName = mDocumentPath + UBFileSystemUtils::digitFileFormat("/page%1.svg", mPageIndex);
QFile file(fileName); QFile file(fileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate)) if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
@ -1182,7 +1277,7 @@ bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene()
} }
else else
{ {
qDebug() << "ignoring unmodified page" << mPageIndex + 1; qDebug() << "ignoring unmodified page" << UBApplication::boardController->pageFromSceneIndex(mPageIndex);
} }
return true; return true;
@ -2518,7 +2613,7 @@ void UBSvgSubsetAdaptor::UBSvgSubsetWriter::curtainItemToSvg(UBGraphicsCurtainIt
mXmlWriter.writeAttribute("width", QString("%1").arg(curtainItem->boundingRect().width())); mXmlWriter.writeAttribute("width", QString("%1").arg(curtainItem->boundingRect().width()));
mXmlWriter.writeAttribute("height", QString("%1").arg(curtainItem->boundingRect().height())); mXmlWriter.writeAttribute("height", QString("%1").arg(curtainItem->boundingRect().height()));
mXmlWriter.writeAttribute("transform", toSvgTransform(curtainItem->sceneMatrix())); mXmlWriter.writeAttribute("transform", toSvgTransform(curtainItem->sceneMatrix()));
//graphicsItemToSvg(curtainItem); //graphicsItemToSvg(curtainItem);
QString zs; QString zs;
zs.setNum(curtainItem->zValue(), 'f'); // 'f' keeps precision zs.setNum(curtainItem->zValue(), 'f'); // 'f' keeps precision

@ -41,6 +41,7 @@ class UBGraphicsStroke;
class UBPersistenceManager; class UBPersistenceManager;
class UBGraphicsTriangle; class UBGraphicsTriangle;
class UBGraphicsCache; class UBGraphicsCache;
class IDataStorage;
class UBSvgSubsetAdaptor class UBSvgSubsetAdaptor
{ {
@ -58,9 +59,13 @@ class UBSvgSubsetAdaptor
static QUuid sceneUuid(UBDocumentProxy* proxy, const int pageIndex); static QUuid sceneUuid(UBDocumentProxy* proxy, const int pageIndex);
static void setSceneUuid(UBDocumentProxy* proxy, const int pageIndex, QUuid pUuid); static void setSceneUuid(UBDocumentProxy* proxy, const int pageIndex, QUuid pUuid);
static bool addElementToBeStored(QString domName,IDataStorage* dataStorageClass);
static void convertPDFObjectsToImages(UBDocumentProxy* proxy); static void convertPDFObjectsToImages(UBDocumentProxy* proxy);
static void convertSvgImagesToImages(UBDocumentProxy* proxy); static void convertSvgImagesToImages(UBDocumentProxy* proxy);
static QMap<QString,IDataStorage*> getAdditionalElementToStore() { return additionalElementToStore;}
static const QString nsSvg; static const QString nsSvg;
static const QString nsXLink; static const QString nsXLink;
static const QString nsXHtml; static const QString nsXHtml;
@ -73,6 +78,7 @@ class UBSvgSubsetAdaptor
static const QString sFontWeightPrefix; static const QString sFontWeightPrefix;
static const QString sFontStylePrefix; static const QString sFontStylePrefix;
static QString readTeacherGuideNode(int sceneIndex);
private: private:
static UBGraphicsScene* loadScene(UBDocumentProxy* proxy, const QByteArray& pArray); static UBGraphicsScene* loadScene(UBDocumentProxy* proxy, const QByteArray& pArray);
@ -86,6 +92,9 @@ class UBSvgSubsetAdaptor
static QString toSvgTransform(const QMatrix& matrix); static QString toSvgTransform(const QMatrix& matrix);
static QMatrix fromSvgTransform(const QString& transform); static QMatrix fromSvgTransform(const QString& transform);
static QMap<QString,IDataStorage*> additionalElementToStore;
class UBSvgSubsetReader class UBSvgSubsetReader
{ {
public: public:
@ -155,7 +164,7 @@ class UBSvgSubsetAdaptor
UBSvgSubsetWriter(UBDocumentProxy* proxy, UBGraphicsScene* pScene, const int pageIndex); UBSvgSubsetWriter(UBDocumentProxy* proxy, UBGraphicsScene* pScene, const int pageIndex);
bool persistScene(); bool persistScene(int pageIndex);
virtual ~UBSvgSubsetWriter(){} virtual ~UBSvgSubsetWriter(){}
@ -188,9 +197,9 @@ class UBSvgSubsetAdaptor
QLocale loc(QLocale::C); QLocale loc(QLocale::C);
sBuf = sBuf.arg(loc.toFloat(temp1)).arg(loc.toFloat(temp2)); sBuf = sBuf.arg(loc.toFloat(temp1)).arg(loc.toFloat(temp2));
svgPoints.insert(length, sBuf); svgPoints.insert(length, sBuf);
length += sBuf.length(); length += sBuf.length();
} }
return svgPoints; return svgPoints;
} }

@ -23,6 +23,8 @@
#include "core/UBApplication.h" #include "core/UBApplication.h"
#include "core/UBSettings.h" #include "core/UBSettings.h"
#include "board/UBBoardController.h"
#include "document/UBDocumentProxy.h" #include "document/UBDocumentProxy.h"
#include "domain/UBGraphicsScene.h" #include "domain/UBGraphicsScene.h"
@ -35,16 +37,14 @@ QList<QPixmap> UBThumbnailAdaptor::load(UBDocumentProxy* proxy)
{ {
QList<QPixmap> thumbnails; QList<QPixmap> thumbnails;
if (!proxy || proxy->persistencePath().size() == 0) if (!proxy || proxy->persistencePath().isEmpty())
return thumbnails; return thumbnails;
//compatibility with older formats (<= 4.0.b.2.0) : generate missing thumbnails //compatibility with older formats (<= 4.0.b.2.0) : generate missing thumbnails
int existingPageCount = proxy->pageCount(); int existingPageCount = proxy->pageCount();
QString thumbFileName = proxy->persistencePath() + QString thumbFileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", existingPageCount);
UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", existingPageCount);
QFile thumbFile(thumbFileName); QFile thumbFile(thumbFileName);
if (!thumbFile.exists()) if (!thumbFile.exists())
@ -62,10 +62,20 @@ QList<QPixmap> UBThumbnailAdaptor::load(UBDocumentProxy* proxy)
thumbCount++; thumbCount++;
if (displayMessage && thumbCount == 1) if (displayMessage && thumbCount == 1)
UBApplication::showMessage(tr("Generating preview thumbnails ...")); UBApplication::showMessage(tr("Generating preview thumbnails ..."));
persistScene(proxy->persistencePath(), scene, i); persistScene(proxy->persistencePath(), scene, i);
} }
else{
if(i==0){
// we are working a document without zero page but on a system that enable it
// we have to create an empty zero scene
scene = new UBGraphicsScene(proxy);
UBSvgSubsetAdaptor::persistScene(proxy,scene,0);
persistScene(proxy->persistencePath(),scene,i);
thumbCount++;
}
}
} }
if (displayMessage && thumbCount > 0) if (displayMessage && thumbCount > 0)
@ -76,12 +86,11 @@ QList<QPixmap> UBThumbnailAdaptor::load(UBDocumentProxy* proxy)
//end compatibility with older format //end compatibility with older format
bool moreToProcess = true; bool moreToProcess = true;
int pageCount = 0; int pageCount = UBApplication::boardController->sceneIndexFromPage(0);
while (moreToProcess) { while (moreToProcess) {
pageCount++; pageCount++;
QString fileName = proxy->persistencePath() + QString fileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", pageCount);
UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", pageCount);
QFile file(fileName); QFile file(fileName);
if (file.exists()) { if (file.exists()) {
@ -104,12 +113,11 @@ QPixmap UBThumbnailAdaptor::load(UBDocumentProxy* proxy, int index)
{ {
int existingPageCount = proxy->pageCount(); int existingPageCount = proxy->pageCount();
if (!proxy || proxy->persistencePath().size() == 0 || index < 0 || index >= existingPageCount) if (!proxy || proxy->persistencePath().size() == 0 || index < 0 || index >= existingPageCount)
return QPixmap(); return QPixmap();
//compatibility with older formats (<= 4.0.b.2.0) : generate missing thumbnails //compatibility with older formats (<= 4.0.b.2.0) : generate missing thumbnails
QString thumbFileName = proxy->persistencePath() + QString thumbFileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", existingPageCount);
UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", existingPageCount);
QFile thumbFile(thumbFileName); QFile thumbFile(thumbFileName);
@ -128,7 +136,7 @@ QPixmap UBThumbnailAdaptor::load(UBDocumentProxy* proxy, int index)
thumbCount++; thumbCount++;
if (displayMessage && thumbCount == 1) if (displayMessage && thumbCount == 1)
UBApplication::showMessage(tr("Generating preview thumbnails ...")); UBApplication::showMessage(tr("Generating preview thumbnails ..."));
persistScene(proxy->persistencePath(), scene, i); persistScene(proxy->persistencePath(), scene, i);
} }
@ -140,12 +148,11 @@ QPixmap UBThumbnailAdaptor::load(UBDocumentProxy* proxy, int index)
} }
//end compatibility with older format //end compatibility with older format
QString fileName = proxy->persistencePath() + QString fileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", index);
UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", index + 1);
QFile file(fileName); QFile file(fileName);
if (file.exists()) if (file.exists())
{ {
QPixmap pix; QPixmap pix;
//Warning. Works only with modified Qt //Warning. Works only with modified Qt
#ifdef Q_WS_X11 #ifdef Q_WS_X11
@ -153,14 +160,14 @@ QPixmap UBThumbnailAdaptor::load(UBDocumentProxy* proxy, int index)
#else #else
pix.load(fileName, 0, Qt::AutoColor, false); pix.load(fileName, 0, Qt::AutoColor, false);
#endif #endif
return pix; return pix;
} }
return QPixmap(); return QPixmap();
} }
void UBThumbnailAdaptor::persistScene(const QString& pDocPath, UBGraphicsScene* pScene, int pageIndex, bool overrideModified) void UBThumbnailAdaptor::persistScene(const QString& pDocPath, UBGraphicsScene* pScene, int pageIndex, bool overrideModified)
{ {
QString fileName = pDocPath + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", pageIndex + 1); QString fileName = pDocPath + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", pageIndex);
QFile thumbFile(fileName); QFile thumbFile(fileName);
@ -206,8 +213,7 @@ void UBThumbnailAdaptor::persistScene(const QString& pDocPath, UBGraphicsScene*
QUrl UBThumbnailAdaptor::thumbnailUrl(UBDocumentProxy* proxy, int pageIndex) QUrl UBThumbnailAdaptor::thumbnailUrl(UBDocumentProxy* proxy, int pageIndex)
{ {
QString fileName = proxy->persistencePath() + QString fileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", pageIndex);
UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", pageIndex + 1);
return QUrl::fromLocalFile(fileName); return QUrl::fromLocalFile(fileName);
} }

@ -28,6 +28,8 @@
#include "core/UBPersistenceManager.h" #include "core/UBPersistenceManager.h"
#include "core/UBApplicationController.h" #include "core/UBApplicationController.h"
#include "board/UBBoardController.h"
#include "gui/UBMainWindow.h" #include "gui/UBMainWindow.h"
#include "document/UBDocumentProxy.h" #include "document/UBDocumentProxy.h"
@ -131,7 +133,7 @@ void UBDocumentPublisher::buildUbwFile()
// remove all useless files // remove all useless files
for (int pageIndex = 0; pageIndex < mPublishingDocument->pageCount(); pageIndex++) { for (int pageIndex = 0; pageIndex < mPublishingDocument->pageCount(); pageIndex++) {
QString filename = mPublishingDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", pageIndex + 1); QString filename = mPublishingDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg",pageIndex);
QFile::remove(filename); QFile::remove(filename);
} }
@ -187,11 +189,11 @@ void UBDocumentPublisher::rasterizeScenes()
for (int pageIndex = 0; pageIndex < mPublishingDocument->pageCount(); pageIndex++) for (int pageIndex = 0; pageIndex < mPublishingDocument->pageCount(); pageIndex++)
{ {
UBApplication::showMessage(tr("Converting page %1/%2 ...").arg(pageIndex + 1).arg(mPublishingDocument->pageCount()), true); UBApplication::showMessage(tr("Converting page %1/%2 ...").arg(UBApplication::boardController->pageFromSceneIndex(pageIndex)).arg(mPublishingDocument->pageCount()), true);
UBSvgSubsetRasterizer rasterizer(mPublishingDocument, pageIndex); UBSvgSubsetRasterizer rasterizer(mPublishingDocument, pageIndex);
QString filename = mPublishingDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.jpg", pageIndex + 1); QString filename = mPublishingDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.jpg",pageIndex);
rasterizer.rasterizeToFile(filename); rasterizer.rasterizeToFile(filename);
@ -250,12 +252,12 @@ void UBDocumentPublisher::upgradeDocumentForPublishing()
UBGraphicsW3CWidgetItem *widgetItem = dynamic_cast<UBGraphicsW3CWidgetItem*>(item); UBGraphicsW3CWidgetItem *widgetItem = dynamic_cast<UBGraphicsW3CWidgetItem*>(item);
if(widgetItem){ if(widgetItem){
generateWidgetPropertyScript(widgetItem, pageIndex + 1); generateWidgetPropertyScript(widgetItem, UBApplication::boardController->pageFromSceneIndex(pageIndex));
widgets << widgetItem; widgets << widgetItem;
} }
} }
QString filename = mPublishingDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.json", pageIndex + 1); QString filename = mPublishingDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.json",pageIndex);
QFile jsonFile(filename); QFile jsonFile(filename);
if (jsonFile.open(QIODevice::WriteOnly | QIODevice::Truncate)) if (jsonFile.open(QIODevice::WriteOnly | QIODevice::Truncate))

@ -62,9 +62,12 @@
#include "podcast/UBPodcastController.h" #include "podcast/UBPodcastController.h"
#include "adaptors/UBMetadataDcSubsetAdaptor.h" #include "adaptors/UBMetadataDcSubsetAdaptor.h"
#include "adaptors/UBSvgSubsetAdaptor.h"
#include "UBBoardPaletteManager.h" #include "UBBoardPaletteManager.h"
#include "core/UBSettings.h"
#include "core/memcheck.h" #include "core/memcheck.h"
//#include <typeinfo> //#include <typeinfo>
@ -147,6 +150,27 @@ UBBoardController::~UBBoardController()
} }
int UBBoardController::currentPage()
{
if(UBSettings::settings()->teacherGuidePageZeroActivated->get().toBool())
return mActiveSceneIndex;
return mActiveSceneIndex + 1;
}
int UBBoardController::pageFromSceneIndex(int sceneIndex)
{
if(UBSettings::settings()->teacherGuidePageZeroActivated->get().toBool())
return sceneIndex;
return sceneIndex+1;
}
int UBBoardController::sceneIndexFromPage(int page)
{
if(UBSettings::settings()->teacherGuidePageZeroActivated->get().toBool())
return page-1;
return page;
}
void UBBoardController::setupViews() void UBBoardController::setupViews()
{ {
mControlContainer = new QWidget(mMainWindow->centralWidget()); mControlContainer = new QWidget(mMainWindow->centralWidget());
@ -670,7 +694,7 @@ void UBBoardController::zoom(const qreal ratio, QPointF scenePoint)
void UBBoardController::handScroll(qreal dx, qreal dy) void UBBoardController::handScroll(qreal dx, qreal dy)
{ {
mControlView->translate(dx, dy); mControlView->translate(dx, dy);
UBApplication::applicationController->adjustDisplayView(); UBApplication::applicationController->adjustDisplayView();
emit controlViewportChanged(); emit controlViewportChanged();
@ -1535,17 +1559,17 @@ void UBBoardController::updateSystemScaleFactor()
if (mActiveScene) if (mActiveScene)
{ {
QSize pageNominalSize = mActiveScene->nominalSize(); QSize pageNominalSize = mActiveScene->nominalSize();
//we're going to keep scale factor untouched if the size is custom //we're going to keep scale factor untouched if the size is custom
QMap<DocumentSizeRatio::Enum, QSize> sizesMap = UBSettings::settings()->documentSizes; QMap<DocumentSizeRatio::Enum, QSize> sizesMap = UBSettings::settings()->documentSizes;
if(pageNominalSize == sizesMap.value(DocumentSizeRatio::Ratio16_9) || pageNominalSize == sizesMap.value(DocumentSizeRatio::Ratio4_3)) if(pageNominalSize == sizesMap.value(DocumentSizeRatio::Ratio16_9) || pageNominalSize == sizesMap.value(DocumentSizeRatio::Ratio4_3))
{ {
QSize controlSize = controlViewport(); QSize controlSize = controlViewport();
qreal hFactor = ((qreal)controlSize.width()) / ((qreal)pageNominalSize.width()); qreal hFactor = ((qreal)controlSize.width()) / ((qreal)pageNominalSize.width());
qreal vFactor = ((qreal)controlSize.height()) / ((qreal)pageNominalSize.height()); qreal vFactor = ((qreal)controlSize.height()) / ((qreal)pageNominalSize.height());
newScaleFactor = qMin(hFactor, vFactor); newScaleFactor = qMin(hFactor, vFactor);
} }
} }
if (mSystemScaleFactor != newScaleFactor) if (mSystemScaleFactor != newScaleFactor)

@ -57,6 +57,11 @@ class UBBoardController : public QObject
QRectF controlGeometry(); QRectF controlGeometry();
void closing(); void closing();
int currentPage();
int pageFromSceneIndex(int sceneIndex);
int sceneIndexFromPage(int page);
UBDocumentProxy* activeDocument() UBDocumentProxy* activeDocument()
{ {
return mActiveDocument; return mActiveDocument;

@ -141,24 +141,26 @@ void UBBoardPaletteManager::setupDockPaletteWidgets()
mpCachePropWidget = new UBCachePropertiesWidget(); mpCachePropWidget = new UBCachePropertiesWidget();
mpDownloadWidget = new UBDockDownloadWidget(); mpDownloadWidget = new UBDockDownloadWidget();
mpTeacherGuideWidget = new UBDockTeacherGuideWidget();
mpFeaturesWidget = new UBFeaturesWidget();
// Add the dock palettes // Add the dock palettes
mLeftPalette = new UBLeftPalette(mContainer); mLeftPalette = new UBLeftPalette(mContainer);
// LEFT palette widgets // LEFT palette widgets
mpPageNavigWidget = new UBPageNavigationWidget();
mLeftPalette->registerWidget(mpPageNavigWidget); mLeftPalette->registerWidget(mpPageNavigWidget);
mLeftPalette->addTab(mpPageNavigWidget); mLeftPalette->addTab(mpPageNavigWidget);
mLeftPalette->registerWidget(mpTeacherGuideWidget); if(UBSettings::settings()->teacherGuidePageZeroActivated || UBSettings::settings()->teacherGuideLessonPagesActivated){
mLeftPalette->addTab(mpTeacherGuideWidget); mpTeacherGuideWidget = new UBDockTeacherGuideWidget();
mLeftPalette->registerWidget(mpTeacherGuideWidget);
mLeftPalette->addTab(mpTeacherGuideWidget);
}
mLeftPalette->connectSignals(); mLeftPalette->connectSignals();
mRightPalette = new UBRightPalette(mContainer); mRightPalette = new UBRightPalette(mContainer);
// RIGHT palette widgets // RIGHT palette widgets
mpFeaturesWidget = new UBFeaturesWidget();
mRightPalette->registerWidget(mpFeaturesWidget); mRightPalette->registerWidget(mpFeaturesWidget);
mRightPalette->addTab(mpFeaturesWidget); mRightPalette->addTab(mpFeaturesWidget);
@ -542,7 +544,7 @@ void UBBoardPaletteManager::activeSceneChanged()
if (mpPageNavigWidget) if (mpPageNavigWidget)
{ {
mpPageNavigWidget->setPageNumber(pageIndex + 1, activeScene->document()->pageCount()); mpPageNavigWidget->setPageNumber(UBApplication::boardController->pageFromSceneIndex(pageIndex), activeScene->document()->pageCount());
} }
if (mZoomPalette) if (mZoomPalette)

@ -586,9 +586,9 @@ UBBoardView::mouseMoveEvent (QMouseEvent *event)
else QGraphicsView::mouseMoveEvent (event); else QGraphicsView::mouseMoveEvent (event);
} }
else if ((UBDrawingController::drawingController()->isDrawingTool()) else if ((UBDrawingController::drawingController()->isDrawingTool())
&& !mMouseButtonIsPressed) && !mMouseButtonIsPressed)
{ {
QGraphicsView::mouseMoveEvent (event); QGraphicsView::mouseMoveEvent (event);
} }
else if (currentTool == UBStylusTool::Text || currentTool == UBStylusTool::Capture) else if (currentTool == UBStylusTool::Text || currentTool == UBStylusTool::Capture)
{ {
@ -850,11 +850,12 @@ void UBBoardView::dropEvent (QDropEvent *event)
graphicsWidget->processDropEvent(event); graphicsWidget->processDropEvent(event);
event->acceptProposedAction(); event->acceptProposedAction();
} else if (!event->source() } else if (!event->source()
|| dynamic_cast<UBThumbnailWidget *>(event->source()) || dynamic_cast<UBThumbnailWidget *>(event->source())
|| dynamic_cast<QWebView*>(event->source()) || dynamic_cast<QWebView*>(event->source())
|| dynamic_cast<UBTGMediaWidget*>(event->source()) || dynamic_cast<UBTGMediaWidget*>(event->source())
|| dynamic_cast<QListView *>(event->source()) ) { || dynamic_cast<QListView *>(event->source())
|| dynamic_cast<UBTGDraggableTreeItem*>(event->source())) {
mController->processMimeData (event->mimeData (), mapToScene (event->pos ())); mController->processMimeData (event->mimeData (), mapToScene (event->pos ()));
event->acceptProposedAction(); event->acceptProposedAction();

@ -24,9 +24,6 @@
#include "core/UBDocumentManager.h" #include "core/UBDocumentManager.h"
#include "core/UBDisplayManager.h" #include "core/UBDisplayManager.h"
#include "softwareupdate/UBSoftwareUpdateController.h"
#include "softwareupdate/UBSoftwareUpdate.h"
#include "board/UBBoardView.h" #include "board/UBBoardView.h"
#include "board/UBBoardController.h" #include "board/UBBoardController.h"
#include "board/UBBoardPaletteManager.h" #include "board/UBBoardPaletteManager.h"

@ -32,6 +32,10 @@
#include "adaptors/UBThumbnailAdaptor.h" #include "adaptors/UBThumbnailAdaptor.h"
#include "adaptors/UBMetadataDcSubsetAdaptor.h" #include "adaptors/UBMetadataDcSubsetAdaptor.h"
#include "board/UBBoardController.h"
#include "interfaces/IDataStorage.h"
#include "core/memcheck.h" #include "core/memcheck.h"
const QString UBPersistenceManager::imageDirectory = "images"; // added to UBPersistenceManager::mAllDirectories const QString UBPersistenceManager::imageDirectory = "images"; // added to UBPersistenceManager::mAllDirectories
@ -39,6 +43,7 @@ const QString UBPersistenceManager::objectDirectory = "objects"; // added to UBP
const QString UBPersistenceManager::widgetDirectory = "widgets"; // added to UBPersistenceManager::mAllDirectories const QString UBPersistenceManager::widgetDirectory = "widgets"; // added to UBPersistenceManager::mAllDirectories
const QString UBPersistenceManager::videoDirectory = "videos"; // added to UBPersistenceManager::mAllDirectories const QString UBPersistenceManager::videoDirectory = "videos"; // added to UBPersistenceManager::mAllDirectories
const QString UBPersistenceManager::audioDirectory = "audios"; // added to const QString UBPersistenceManager::audioDirectory = "audios"; // added to
const QString UBPersistenceManager::teacherGuideDirectory = "teacherGuideObjects";
UBPersistenceManager * UBPersistenceManager::sSingleton = 0; UBPersistenceManager * UBPersistenceManager::sSingleton = 0;
@ -52,6 +57,7 @@ UBPersistenceManager::UBPersistenceManager(QObject *pParent)
mDocumentSubDirectories << widgetDirectory; mDocumentSubDirectories << widgetDirectory;
mDocumentSubDirectories << videoDirectory; mDocumentSubDirectories << videoDirectory;
mDocumentSubDirectories << audioDirectory; mDocumentSubDirectories << audioDirectory;
mDocumentSubDirectories << teacherGuideDirectory;
documentProxies = allDocumentProxies(); documentProxies = allDocumentProxies();
emit proxyListChanged(); emit proxyListChanged();
@ -83,7 +89,6 @@ UBPersistenceManager::~UBPersistenceManager()
} }
} }
QList<QPointer<UBDocumentProxy> > UBPersistenceManager::allDocumentProxies() QList<QPointer<UBDocumentProxy> > UBPersistenceManager::allDocumentProxies()
{ {
mDocumentRepositoryPath = UBSettings::userDocumentDirectory(); mDocumentRepositoryPath = UBSettings::userDocumentDirectory();
@ -363,7 +368,7 @@ UBDocumentProxy* UBPersistenceManager::duplicateDocument(UBDocumentProxy* pDocum
void UBPersistenceManager::deleteDocumentScenes(UBDocumentProxy* proxy, const QList<int>& indexes) void UBPersistenceManager::deleteDocumentScenes(UBDocumentProxy* proxy, const QList<int>& indexes)
{ {
checkIfDocumentRepositoryExists(); checkIfDocumentRepositoryExists();
int pageCount = UBPersistenceManager::persistenceManager()->sceneCount(proxy); int pageCount = UBPersistenceManager::persistenceManager()->sceneCount(proxy);
@ -422,17 +427,15 @@ void UBPersistenceManager::deleteDocumentScenes(UBDocumentProxy* proxy, const QL
foreach(int index, compactedIndexes) foreach(int index, compactedIndexes)
{ {
QString svgFileName = proxy->persistencePath() + QString svgFileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", index);
UBFileSystemUtils::digitFileFormat("/page%1.svg", index + 1);
QFile::remove(svgFileName); QFile::remove(svgFileName);
QString thumbFileName = proxy->persistencePath() + QString thumbFileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", index);
UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", index + 1);
QFile::remove(thumbFileName); QFile::remove(thumbFileName);
mSceneCache.removeScene(proxy, index); mSceneCache.removeScene(proxy, index);
proxy->decPageCount(); proxy->decPageCount();
@ -482,7 +485,7 @@ void UBPersistenceManager::duplicateDocumentScene(UBDocumentProxy* proxy, int in
proxy->incPageCount(); proxy->incPageCount();
emit documentSceneCreated(proxy, index + 1); emit documentSceneCreated(proxy, index + 1);
} }
@ -491,9 +494,7 @@ UBGraphicsScene* UBPersistenceManager::createDocumentSceneAt(UBDocumentProxy* pr
int count = sceneCount(proxy); int count = sceneCount(proxy);
for(int i = count - 1; i >= index; i--) for(int i = count - 1; i >= index; i--)
{
renamePage(proxy, i , i + 1); renamePage(proxy, i , i + 1);
}
mSceneCache.shiftUpScenes(proxy, index, count -1); mSceneCache.shiftUpScenes(proxy, index, count -1);
@ -543,11 +544,11 @@ void UBPersistenceManager::moveSceneToIndex(UBDocumentProxy* proxy, int source,
if (source == target) if (source == target)
return; return;
QFile svgTmp(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", source + 1)); QFile svgTmp(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", source));
svgTmp.rename(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.tmp", target + 1)); svgTmp.rename(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.tmp", target));
QFile thumbTmp(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", source + 1)); QFile thumbTmp(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", source));
thumbTmp.rename(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.tmp", target + 1)); thumbTmp.rename(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.tmp", target));
if (source < target) if (source < target)
{ {
@ -564,11 +565,11 @@ void UBPersistenceManager::moveSceneToIndex(UBDocumentProxy* proxy, int source,
} }
} }
QFile svg(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.tmp", target + 1)); QFile svg(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.tmp", target));
svg.rename(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", target + 1)); svg.rename(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", target));
QFile thumb(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.tmp", target + 1)); QFile thumb(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.tmp", target));
thumb.rename(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", target + 1)); thumb.rename(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", target));
mSceneCache.moveScene(proxy, source, target); mSceneCache.moveScene(proxy, source, target);
@ -579,12 +580,9 @@ void UBPersistenceManager::moveSceneToIndex(UBDocumentProxy* proxy, int source,
UBGraphicsScene* UBPersistenceManager::loadDocumentScene(UBDocumentProxy* proxy, int sceneIndex) UBGraphicsScene* UBPersistenceManager::loadDocumentScene(UBDocumentProxy* proxy, int sceneIndex)
{ {
if (mSceneCache.contains(proxy, sceneIndex)) if (mSceneCache.contains(proxy, sceneIndex))
{
//qDebug() << "scene" << sceneIndex << "retrieved from cache ...";
return mSceneCache.value(proxy, sceneIndex); return mSceneCache.value(proxy, sceneIndex);
} else {
else qDebug() << "scene" << sceneIndex << "retrieved from file ...";
{
UBGraphicsScene* scene = UBSvgSubsetAdaptor::loadScene(proxy, sceneIndex); UBGraphicsScene* scene = UBSvgSubsetAdaptor::loadScene(proxy, sceneIndex);
if (scene) if (scene)
@ -636,23 +634,23 @@ UBDocumentProxy* UBPersistenceManager::persistDocumentMetadata(UBDocumentProxy*
void UBPersistenceManager::renamePage(UBDocumentProxy* pDocumentProxy, const int sourceIndex, const int targetIndex) void UBPersistenceManager::renamePage(UBDocumentProxy* pDocumentProxy, const int sourceIndex, const int targetIndex)
{ {
QFile svg(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", sourceIndex + 1)); QFile svg(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", sourceIndex));
svg.rename(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", targetIndex + 1)); svg.rename(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", targetIndex));
QFile thumb(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", sourceIndex + 1)); QFile thumb(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", sourceIndex));
thumb.rename(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", targetIndex + 1)); thumb.rename(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", targetIndex));
} }
void UBPersistenceManager::copyPage(UBDocumentProxy* pDocumentProxy, const int sourceIndex, const int targetIndex) void UBPersistenceManager::copyPage(UBDocumentProxy* pDocumentProxy, const int sourceIndex, const int targetIndex)
{ {
QFile svg(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", sourceIndex + 1)); QFile svg(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg",sourceIndex));
svg.copy(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", targetIndex + 1)); svg.copy(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", targetIndex));
UBSvgSubsetAdaptor::setSceneUuid(pDocumentProxy, targetIndex, QUuid::createUuid()); UBSvgSubsetAdaptor::setSceneUuid(pDocumentProxy, targetIndex, QUuid::createUuid());
QFile thumb(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", sourceIndex + 1)); QFile thumb(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", sourceIndex));
thumb.copy(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", targetIndex + 1)); thumb.copy(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", targetIndex));
} }
@ -665,10 +663,11 @@ int UBPersistenceManager::sceneCountInDir(const QString& pPath)
{ {
int pageIndex = 0; int pageIndex = 0;
bool moreToProcess = true; bool moreToProcess = true;
bool addedMissingZeroPage = false;
while (moreToProcess) while (moreToProcess)
{ {
QString fileName = pPath + UBFileSystemUtils::digitFileFormat("/page%1.svg", pageIndex + 1); QString fileName = pPath + UBFileSystemUtils::digitFileFormat("/page%1.svg", pageIndex);
QFile file(fileName); QFile file(fileName);
@ -678,10 +677,24 @@ int UBPersistenceManager::sceneCountInDir(const QString& pPath)
} }
else else
{ {
moreToProcess = false; if(UBSettings::settings()->teacherGuidePageZeroActivated && pageIndex == 0){
// the document has no zero file but doesn't means that it hasn't any file
// at all. Just importing a document without the first page using a configuartion
// that enables zero page.
pageIndex++;
addedMissingZeroPage = true;
}
else
moreToProcess = false;
} }
} }
if(pageIndex == 1 && addedMissingZeroPage){
// increment is done only to check if there are other pages than the missing zero page
// This situation means -> no pages on the document
return 0;
}
return pageIndex; return pageIndex;
} }
@ -716,13 +729,13 @@ void UBPersistenceManager::addDirectoryContentToDocument(const QString& document
{ {
int targetIndex = targetPageCount + sourceIndex; int targetIndex = targetPageCount + sourceIndex;
QFile svg(documentRootFolder + UBFileSystemUtils::digitFileFormat("/page%1.svg", sourceIndex + 1)); QFile svg(documentRootFolder + UBFileSystemUtils::digitFileFormat("/page%1.svg", sourceIndex));
svg.copy(pDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", targetIndex + 1)); svg.copy(pDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", targetIndex));
UBSvgSubsetAdaptor::setSceneUuid(pDocument, targetIndex, QUuid::createUuid()); UBSvgSubsetAdaptor::setSceneUuid(pDocument, targetIndex, QUuid::createUuid());
QFile thumb(documentRootFolder + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", sourceIndex + 1)); QFile thumb(documentRootFolder + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", sourceIndex));
thumb.copy(pDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", targetIndex + 1)); thumb.copy(pDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", targetIndex));
} }
foreach(QString dir, mDocumentSubDirectories) foreach(QString dir, mDocumentSubDirectories)
@ -828,6 +841,35 @@ void UBPersistenceManager::purgeEmptyDocuments()
} }
} }
QString UBPersistenceManager::teacherGuideAbsoluteObjectPath(UBDocumentProxy* pDocumentProxy)
{
return pDocumentProxy->persistencePath() + "/" + teacherGuideDirectory;
}
QString UBPersistenceManager::addObjectToTeacherGuideDirectory(UBDocumentProxy* pDocumentProxy, QString pPath)
{
QFileInfo fi(pPath.replace("file://",""));
QString uuid = QUuid::createUuid();
if (!fi.exists() || !pDocumentProxy)
return "";
QString fileName = UBPersistenceManager::teacherGuideDirectory + "/" + uuid + "." + fi.suffix();
QString destPath = pDocumentProxy->persistencePath() + "/" + fileName;
if (!QFile::exists(destPath)){
QDir dir;
dir.mkdir(pDocumentProxy->persistencePath() + "/" + UBPersistenceManager::teacherGuideDirectory);
QFile source(pPath);
source.copy(destPath);
}
return destPath;
}
QString UBPersistenceManager::addVideoFileToDocument(UBDocumentProxy* pDocumentProxy, QString path, QUuid objectUuid) QString UBPersistenceManager::addVideoFileToDocument(UBDocumentProxy* pDocumentProxy, QString path, QUuid objectUuid)
{ {

@ -41,11 +41,12 @@ class UBPersistenceManager : public QObject
static const QString videoDirectory; static const QString videoDirectory;
static const QString audioDirectory; static const QString audioDirectory;
static const QString widgetDirectory; static const QString widgetDirectory;
static const QString teacherGuideDirectory;
static UBPersistenceManager* persistenceManager(); static UBPersistenceManager* persistenceManager();
static void destroy(); static void destroy();
virtual UBDocumentProxy* createDocument(const QString& pGroupName = "", const QString& pName = "", bool withEmptyPage = true); virtual UBDocumentProxy* createDocument(const QString& pGroupName = "", const QString& pName = "", bool withEmptyPage = true);
virtual UBDocumentProxy* createDocumentFromDir(const QString& pDocumentDirectory, const QString& pGroupName = "", const QString& pName = "", bool withEmptyPage = false); virtual UBDocumentProxy* createDocumentFromDir(const QString& pDocumentDirectory, const QString& pGroupName = "", const QString& pName = "", bool withEmptyPage = false);
virtual UBDocumentProxy* persistDocumentMetadata(UBDocumentProxy* pDocumentProxy); virtual UBDocumentProxy* persistDocumentMetadata(UBDocumentProxy* pDocumentProxy);
@ -80,6 +81,9 @@ class UBPersistenceManager : public QObject
virtual QString generateUniqueDocumentPath(); virtual QString generateUniqueDocumentPath();
QString teacherGuideAbsoluteObjectPath(UBDocumentProxy* pDocumentProxy);
QString addObjectToTeacherGuideDirectory(UBDocumentProxy* proxy, QString pPath);
virtual void addDirectoryContentToDocument(const QString& documentRootFolder, UBDocumentProxy* pDocument); virtual void addDirectoryContentToDocument(const QString& documentRootFolder, UBDocumentProxy* pDocument);
virtual void upgradeDocumentIfNeeded(UBDocumentProxy* pDocumentProxy); virtual void upgradeDocumentIfNeeded(UBDocumentProxy* pDocumentProxy);
@ -153,6 +157,8 @@ class UBPersistenceManager : public QObject
QString mDocumentRepositoryPath; QString mDocumentRepositoryPath;
QHash<int,QString>teacherBarNodeString;
private slots: private slots:
void documentRepositoryChanged(const QString& path); void documentRepositoryChanged(const QString& path);

@ -37,12 +37,13 @@ QString UBSettings::documentIdentifer = QString("ID");
QString UBSettings::documentVersion = QString("Version"); QString UBSettings::documentVersion = QString("Version");
QString UBSettings::documentUpdatedAt = QString("UpdatedAt"); QString UBSettings::documentUpdatedAt = QString("UpdatedAt");
QString UBSettings::sessionTitle = QString("sessionTitle"); QString UBSettings::sessionTitle = QString("sessionTitle");
QString UBSettings::sessionTarget = QString("sessionTarget");
QString UBSettings::sessionLicence = QString("sessionLicence");
QString UBSettings::sessionKeywords = QString("sessionKeywords");
QString UBSettings::sessionLevel = QString("sessionLevel");
QString UBSettings::sessionTopic = QString("sessionTopic");
QString UBSettings::sessionAuthors = QString("sessionAuthors"); QString UBSettings::sessionAuthors = QString("sessionAuthors");
QString UBSettings::sessionObjectives = QString("sessionObjectives");
QString UBSettings::sessionKeywords = QString("sessionKeywords");
QString UBSettings::sessionGradeLevel = QString("sessionGradeLevel");
QString UBSettings::sessionSubjects = QString("sessionSubjects");
QString UBSettings::sessionType = QString("sessionType");
QString UBSettings::sessionLicence = QString("sessionLicence");
QString UBSettings::documentDate = QString("date"); QString UBSettings::documentDate = QString("date");
QString UBSettings::trashedDocumentGroupNamePrefix = QString("_Trash:"); QString UBSettings::trashedDocumentGroupNamePrefix = QString("_Trash:");
@ -54,7 +55,7 @@ QString UBSettings::uniboardApplicationNamespaceUri = "http://uniboard.mnemis.co
const int UBSettings::sDefaultFontPixelSize = 36; const int UBSettings::sDefaultFontPixelSize = 36;
const char *UBSettings::sDefaultFontFamily = "Arial"; const char *UBSettings::sDefaultFontFamily = "Arial";
QString UBSettings::currentFileVersion = "4.5.0"; QString UBSettings::currentFileVersion = "4.6.0";
QColor UBSettings::crossDarkBackground = QColor(44, 44, 44, 200); QColor UBSettings::crossDarkBackground = QColor(44, 44, 44, 200);
QColor UBSettings::crossLightBackground = QColor(165, 225, 255); QColor UBSettings::crossLightBackground = QColor(165, 225, 255);
@ -381,6 +382,8 @@ void UBSettings::init()
angleTolerance = new UBSetting(this, "App", "AngleTolerance", 4); angleTolerance = new UBSetting(this, "App", "AngleTolerance", 4);
historyLimit = new UBSetting(this, "Web", "HistoryLimit", 15); historyLimit = new UBSetting(this, "Web", "HistoryLimit", 15);
teacherGuidePageZeroActivated = new UBSetting(this,"DockPalette","TeacherGuideActivatePageZero",true);
teacherGuideLessonPagesActivated = new UBSetting(this,"DockPalette","TeacherGuideActivateLessonPages",true);
} }

@ -153,13 +153,16 @@ class UBSettings : public QObject
static QString documentIdentifer; static QString documentIdentifer;
static QString documentVersion; static QString documentVersion;
static QString documentUpdatedAt; static QString documentUpdatedAt;
static QString sessionTitle; static QString sessionTitle;
static QString sessionTarget;
static QString sessionLicence;
static QString sessionKeywords;
static QString sessionLevel;
static QString sessionTopic;
static QString sessionAuthors; static QString sessionAuthors;
static QString sessionObjectives;
static QString sessionKeywords;
static QString sessionGradeLevel;
static QString sessionSubjects;
static QString sessionType;
static QString sessionLicence;
static QString documentDate; static QString documentDate;
static QString trashedDocumentGroupNamePrefix; static QString trashedDocumentGroupNamePrefix;
@ -330,6 +333,8 @@ class UBSettings : public QObject
UBSetting* angleTolerance; UBSetting* angleTolerance;
UBSetting* historyLimit; UBSetting* historyLimit;
UBSetting* teacherGuidePageZeroActivated;
UBSetting* teacherGuideLessonPagesActivated;
public slots: public slots:

@ -28,6 +28,8 @@ UBMediaWidget::UBMediaWidget(eMediaType type, QWidget *parent, const char *name)
, mpMediaObject(NULL) , mpMediaObject(NULL)
, mpVideoWidget(NULL) , mpVideoWidget(NULL)
, mpAudioOutput(NULL) , mpAudioOutput(NULL)
, mpLayout(NULL)
, mpSeekerLayout(NULL)
, mpPlayStopButton(NULL) , mpPlayStopButton(NULL)
, mpPauseButton(NULL) , mpPauseButton(NULL)
, mpSlider(NULL) , mpSlider(NULL)
@ -35,15 +37,15 @@ UBMediaWidget::UBMediaWidget(eMediaType type, QWidget *parent, const char *name)
, mGeneratingThumbnail(false) , mGeneratingThumbnail(false)
, mBorder(5) , mBorder(5)
, mpMediaContainer(NULL) , mpMediaContainer(NULL)
, mMediaLayout(NULL)
, mpCover(NULL) , mpCover(NULL)
// , mpVideoStackedWidget(NULL)
// , mpSnapshotVideoWidget(NULL)
{ {
SET_STYLE_SHEET(); SET_STYLE_SHEET();
addAction(eAction_Close); addAction(eAction_Close);
mType = type; mType = type;
setLayout(&mLayout); mpLayout = new QVBoxLayout(this);
setLayout(mpLayout);
mpPlayStopButton = new UBMediaButton(this); mpPlayStopButton = new UBMediaButton(this);
mpPlayStopButton->setPixmap(QPixmap(":images/play.svg")); mpPlayStopButton->setPixmap(QPixmap(":images/play.svg"));
@ -55,10 +57,11 @@ UBMediaWidget::UBMediaWidget(eMediaType type, QWidget *parent, const char *name)
mpSlider->setMinimum(0); mpSlider->setMinimum(0);
mpSlider->setMaximum(0); mpSlider->setMaximum(0);
mSeekerLayout.addWidget(mpPlayStopButton, 0); mpSeekerLayout = new QHBoxLayout();
mSeekerLayout.addWidget(mpPauseButton, 0); mpSeekerLayout->addWidget(mpPlayStopButton, 0);
mSeekerLayout.addWidget(mpSlider, 1); mpSeekerLayout->addWidget(mpPauseButton, 0);
mSeekerLayout.setContentsMargins(0, 0, 0, 0); mpSeekerLayout->addWidget(mpSlider, 1);
mpSeekerLayout->setContentsMargins(0, 0, 0, 0);
connect(mpPlayStopButton, SIGNAL(clicked()), this, SLOT(onPlayStopClicked())); connect(mpPlayStopButton, SIGNAL(clicked()), this, SLOT(onPlayStopClicked()));
connect(mpPauseButton, SIGNAL(clicked()), this, SLOT(onPauseClicked())); connect(mpPauseButton, SIGNAL(clicked()), this, SLOT(onPauseClicked()));
@ -71,15 +74,16 @@ UBMediaWidget::UBMediaWidget(eMediaType type, QWidget *parent, const char *name)
UBMediaWidget::~UBMediaWidget() UBMediaWidget::~UBMediaWidget()
{ {
unsetActionsParent(); unsetActionsParent();
DELETEPTR(mpMediaObject);
DELETEPTR(mpSlider); DELETEPTR(mpSlider);
DELETEPTR(mpPauseButton); DELETEPTR(mpPauseButton);
DELETEPTR(mpPlayStopButton); DELETEPTR(mpPlayStopButton);
DELETEPTR(mpAudioOutput); DELETEPTR(mpAudioOutput);
DELETEPTR(mpVideoWidget); DELETEPTR(mpVideoWidget);
// DELETEPTR(mpVideoStackedWidget);
// DELETEPTR(mpSnapshotVideoWidget);
DELETEPTR(mpMediaObject);
DELETEPTR(mpCover); DELETEPTR(mpCover);
DELETEPTR(mpMediaContainer);
DELETEPTR(mpSeekerLayout);
DELETEPTR(mpLayout);
} }
/** /**
@ -112,9 +116,9 @@ void UBMediaWidget::showEvent(QShowEvent* event)
{ {
if(!mpVideoWidget){ if(!mpVideoWidget){
mpVideoWidget = new Phonon::VideoWidget(this); mpVideoWidget = new Phonon::VideoWidget(this);
mMediaLayout.addStretch(1); mMediaLayout->addStretch(1);
mMediaLayout.addWidget(mpVideoWidget, 0); mMediaLayout->addWidget(mpVideoWidget);
mMediaLayout.addStretch(1); mMediaLayout->addStretch(1);
Phonon::createPath(mpMediaObject, mpVideoWidget); Phonon::createPath(mpMediaObject, mpVideoWidget);
adaptSizeToVideo(); adaptSizeToVideo();
mpMediaObject->play(); mpMediaObject->play();
@ -135,43 +139,37 @@ void UBMediaWidget::hideEvent(QHideEvent* event)
*/ */
void UBMediaWidget::createMediaPlayer() void UBMediaWidget::createMediaPlayer()
{ {
mpMediaContainer = new QWidget(this); mpMediaContainer = new QWidget();
mpMediaContainer->setObjectName("UBMediaVideoContainer"); mpMediaContainer->setObjectName("UBMediaVideoContainer");
mpMediaContainer->setLayout(&mMediaLayout); mMediaLayout = new QHBoxLayout();
mpMediaContainer->setLayout(mMediaLayout);
if(eMediaType_Video == mType){ if(eMediaType_Video == mType){
mMediaLayout.setContentsMargins(10, 10, 10, 10); mMediaLayout->setContentsMargins(10, 10, 10, 10);
if(isVisible()){ if(isVisible()){
mpVideoWidget = new Phonon::VideoWidget(this); mpVideoWidget = new Phonon::VideoWidget(this);
mMediaLayout.addStretch(1); mMediaLayout->addStretch(1);
mMediaLayout->addWidget(mpVideoWidget);
// mpVideoStackedWidget = new QStackedWidget(this); mMediaLayout->addStretch(1);
// mpVideoStackedWidget->addWidget(mpVideoWidget);
// mpSnapshotVideoWidget = new QLabel(this);
// mpVideoStackedWidget->addWidget(mpSnapshotVideoWidget);
// mMediaLayout.addWidget(mpVideoStackedWidget,0);
mMediaLayout.addWidget(mpVideoWidget, 0);
mMediaLayout.addStretch(1);
Phonon::createPath(mpMediaObject, mpVideoWidget); Phonon::createPath(mpMediaObject, mpVideoWidget);
adaptSizeToVideo(); adaptSizeToVideo();
} }
mpAudioOutput = new Phonon::AudioOutput(Phonon::VideoCategory, this); mpAudioOutput = new Phonon::AudioOutput(Phonon::VideoCategory, this);
Phonon::createPath(mpMediaObject, mpAudioOutput); Phonon::createPath(mpMediaObject, mpAudioOutput);
}else if(eMediaType_Audio == mType){ }else if(eMediaType_Audio == mType){
mMediaLayout.setContentsMargins(10, 10, 10, 10); mMediaLayout->setContentsMargins(10, 10, 10, 10);
mpCover = new QLabel(mpMediaContainer); mpCover = new QLabel(mpMediaContainer);
mpMediaContainer->setStyleSheet(QString("background: none;")); mpMediaContainer->setStyleSheet(QString("background: none;"));
setAudioCover(":images/libpalette/soundIcon.svg"); setAudioCover(":images/libpalette/soundIcon.svg");
mpCover->setScaledContents(true); mpCover->setScaledContents(true);
mMediaLayout.addStretch(1); mMediaLayout->addStretch(1);
mMediaLayout.addWidget(mpCover, 0); mMediaLayout->addWidget(mpCover, 0);
mMediaLayout.addStretch(1); mMediaLayout->addStretch(1);
mpAudioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this); mpAudioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);
Phonon::createPath(mpMediaObject, mpAudioOutput); Phonon::createPath(mpMediaObject, mpAudioOutput);
} }
mLayout.addWidget(mpMediaContainer, 1); mpLayout->addWidget(mpMediaContainer, 1);
mLayout.addLayout(&mSeekerLayout, 0); mpLayout->addLayout(mpSeekerLayout, 0);
setActionsParent(mpMediaContainer); setActionsParent(mpMediaContainer);
} }
@ -190,22 +188,6 @@ void UBMediaWidget::adaptSizeToVideo()
} }
} }
//void UBMediaWidget::updateView(Phonon::State nextState)
//{
// if(eMediaType_Video == mType){
// if(nextState != Phonon::PlayingState){
// const QPixmap& snapshot = QPixmap::grabWindow(mpVideoWidget->winId());
// if(snapshot.size().width()!= 0){
// mpSnapshotVideoWidget->setPixmap(snapshot);
// mpVideoStackedWidget->setCurrentWidget(mpSnapshotVideoWidget);
// }
// }
// else
// mpVideoStackedWidget->setCurrentWidget(mpVideoWidget);
// }
//}
/** /**
* \brief Handle the media state change notification * \brief Handle the media state change notification
* @param newState as the new state * @param newState as the new state
@ -234,8 +216,10 @@ void UBMediaWidget::onStateChanged(Phonon::State newState, Phonon::State oldStat
mpPauseButton->setEnabled(false); mpPauseButton->setEnabled(false);
mpSlider->setValue(0); mpSlider->setValue(0);
} }
//updateView(newState);
} }
// if(mType == eMediaType_Video)
// updateView(newState);
} }
/** /**
@ -275,16 +259,16 @@ void UBMediaWidget::onSliderChanged(int value)
void UBMediaWidget::onPlayStopClicked() void UBMediaWidget::onPlayStopClicked()
{ {
switch(mpMediaObject->state()){ switch(mpMediaObject->state()){
case Phonon::PlayingState: case Phonon::PlayingState:
mpMediaObject->stop(); mpMediaObject->stop();
break; break;
case Phonon::StoppedState: case Phonon::StoppedState:
case Phonon::PausedState: case Phonon::PausedState:
mpMediaObject->play(); mpMediaObject->play();
break; break;
default: default:
break; break;
} }
} }

@ -27,7 +27,6 @@
#include <phonon/VideoWidget> #include <phonon/VideoWidget>
#include <phonon/AudioOutput> #include <phonon/AudioOutput>
#include "interfaces/IResizeable.h"
#include "UBActionableWidget.h" #include "UBActionableWidget.h"
#define UBMEDIABUTTON_SIZE 32 #define UBMEDIABUTTON_SIZE 32
@ -91,7 +90,6 @@ private slots:
private: private:
void createMediaPlayer(); void createMediaPlayer();
void adaptSizeToVideo(); void adaptSizeToVideo();
// void updateView(Phonon::State nextState);
/** The current media type */ /** The current media type */
eMediaType mType; eMediaType mType;
@ -102,9 +100,9 @@ private:
/** The audio renderer */ /** The audio renderer */
Phonon::AudioOutput* mpAudioOutput; Phonon::AudioOutput* mpAudioOutput;
/** The principal layout of this widget */ /** The principal layout of this widget */
QVBoxLayout mLayout; QVBoxLayout* mpLayout;
/** The seeker layout */ /** The seeker layout */
QHBoxLayout mSeekerLayout; QHBoxLayout* mpSeekerLayout;
/** The play-stop button */ /** The play-stop button */
UBMediaButton* mpPlayStopButton; UBMediaButton* mpPlayStopButton;
/** The pause button */ /** The pause button */
@ -120,14 +118,11 @@ private:
/** A widget that will contain the media */ /** A widget that will contain the media */
QWidget* mpMediaContainer; QWidget* mpMediaContainer;
/** The media layout */ /** The media layout */
QHBoxLayout mMediaLayout; QHBoxLayout* mMediaLayout;
/** The audio cover */ /** The audio cover */
QLabel* mpCover; QLabel* mpCover;
/** The media url */ /** The media url */
QString mUrl; QString mUrl;
// QStackedWidget* mpVideoStackedWidget;
// QLabel* mpSnapshotVideoWidget;
}; };
#endif // UBMEDIAWIDGET_H #endif // UBMEDIAWIDGET_H

@ -12,6 +12,7 @@
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "UBDocumentController.h" #include "UBDocumentController.h"
#include <QtCore> #include <QtCore>
@ -289,9 +290,9 @@ void UBDocumentController::refreshDocumentThumbnailsView()
} }
items << pixmapItem; items << pixmapItem;
labels << tr("Page %1").arg(i + 1); labels << tr("Page %1").arg(UBApplication::boardController->pageFromSceneIndex(i));
itemsPath.append(QUrl::fromLocalFile(proxy->persistencePath() + QString("/pages/%1").arg(i + 1))); itemsPath.append(QUrl::fromLocalFile(proxy->persistencePath() + QString("/pages/%1").arg(UBApplication::boardController->pageFromSceneIndex(i))));
} }
} }
@ -305,15 +306,12 @@ void UBDocumentController::refreshDocumentThumbnailsView()
mDocumentUI->thumbnailWidget->ensureVisible(0, 0, 10, 10); mDocumentUI->thumbnailWidget->ensureVisible(0, 0, 10, 10);
if (selection) if (selection) {
{ disconnect(mDocumentUI->thumbnailWidget->scene(), SIGNAL(selectionChanged()), this, SLOT(pageSelectionChanged()));
disconnect(mDocumentUI->thumbnailWidget->scene(), SIGNAL(selectionChanged()),
this, SLOT(pageSelectionChanged()));
UBSceneThumbnailPixmap *currentScene = dynamic_cast<UBSceneThumbnailPixmap*>(selection); UBSceneThumbnailPixmap *currentScene = dynamic_cast<UBSceneThumbnailPixmap*>(selection);
if (currentScene) if (currentScene)
mDocumentUI->thumbnailWidget->hightlightItem(currentScene->sceneIndex()); mDocumentUI->thumbnailWidget->hightlightItem(currentScene->sceneIndex());
connect(mDocumentUI->thumbnailWidget->scene(), SIGNAL(selectionChanged()), connect(mDocumentUI->thumbnailWidget->scene(), SIGNAL(selectionChanged()), this, SLOT(pageSelectionChanged()));
this, SLOT(pageSelectionChanged()));
} }
emit refreshThumbnails(); emit refreshThumbnails();
@ -1640,7 +1638,7 @@ int UBDocumentController::getSelectedItemIndex()
if (selectedItems.count() > 0) if (selectedItems.count() > 0)
{ {
UBSceneThumbnailPixmap* thumb = dynamic_cast<UBSceneThumbnailPixmap*> (selectedItems.last()); UBSceneThumbnailPixmap* thumb = dynamic_cast<UBSceneThumbnailPixmap*> (selectedItems.last());
return thumb->sceneIndex(); return thumb->sceneIndex();
} }
else return -1; else return -1;

@ -112,9 +112,6 @@ class UBDocumentController : public QObject
UBDocumentProxy* mCurrentDocument; UBDocumentProxy* mCurrentDocument;
QList<QPixmap> mDocumentThumbs; QList<QPixmap> mDocumentThumbs;
// UBKeyboardPalette *mKeyboardPalette;
private slots: private slots:
void documentZoomSliderValueChanged (int value); void documentZoomSliderValueChanged (int value);
void loadDocumentProxies(); void loadDocumentProxies();

@ -50,13 +50,15 @@ void UBDocumentProxy::init()
setDefaultDocumentSize(UBSettings::settings()->pageSize->get().toSize()); setDefaultDocumentSize(UBSettings::settings()->pageSize->get().toSize());
setSessionTitle(""); //teacherGuide metadata
setSessionTarget(""); setMetaData(UBSettings::sessionTitle,"");
setSessionLicence(""); setMetaData(UBSettings::sessionAuthors,"");
setSessionKeywords(""); setMetaData(UBSettings::sessionObjectives,"");
setSessionLevel(""); setMetaData(UBSettings::sessionKeywords,"");
setSessionTopic(""); setMetaData(UBSettings::sessionGradeLevel,"");
setSessionAuthor(""); setMetaData(UBSettings::sessionSubjects,"");
setMetaData(UBSettings::sessionType,"");
setMetaData(UBSettings::sessionLicence,"");
} }
@ -204,101 +206,9 @@ void UBDocumentProxy::setUuid(const QUuid& uuid)
UBSettings::uniboardDocumentNamespaceUri + "/" + UBStringUtils::toCanonicalUuid(uuid)); UBSettings::uniboardDocumentNamespaceUri + "/" + UBStringUtils::toCanonicalUuid(uuid));
} }
QString UBDocumentProxy::sessionTitle() const
{
if(mMetaDatas.contains(UBSettings::sessionTitle))
return metaData(UBSettings::sessionTitle).toString();
else
return QString();
}
void UBDocumentProxy::setSessionTitle(const QString & sessionTitle)
{
setMetaData(UBSettings::sessionTitle,QVariant(sessionTitle));
}
QString UBDocumentProxy::sessionTarget() const
{
if(mMetaDatas.contains(UBSettings::sessionTarget))
return metaData(UBSettings::sessionTarget).toString();
else
return QString();
}
void UBDocumentProxy::setSessionTarget(const QString & sessionTarget)
{
setMetaData(UBSettings::sessionTarget,QVariant(sessionTarget));
}
QString UBDocumentProxy::sessionLicence() const
{
if(mMetaDatas.contains(UBSettings::sessionLicence))
return metaData(UBSettings::sessionLicence).toString();
else
return QString();
}
void UBDocumentProxy::setSessionLicence(const QString & sessionLicence)
{
setMetaData(UBSettings::sessionLicence,QVariant(sessionLicence));
}
void UBDocumentProxy::setSessionKeywords(const QString &kw)
{
setMetaData(UBSettings::sessionKeywords,QVariant(kw));
}
QString UBDocumentProxy::sessionKeywords()
{
if(mMetaDatas.contains(UBSettings::sessionKeywords))
return metaData(UBSettings::sessionKeywords).toString();
else
return QString();
}
void UBDocumentProxy::setSessionLevel(const QString &level)
{
setMetaData(UBSettings::sessionLevel,QVariant(level));
}
QString UBDocumentProxy::sessionLevel()
{
if(mMetaDatas.contains(UBSettings::sessionLevel))
return metaData(UBSettings::sessionLevel).toString();
else
return QString();
}
void UBDocumentProxy::setSessionTopic(const QString &topic)
{
setMetaData(UBSettings::sessionTopic,QVariant(topic));
}
QString UBDocumentProxy::sessionTopic()
{
if(mMetaDatas.contains(UBSettings::sessionTopic))
return metaData(UBSettings::sessionTopic).toString();
else
return QString();
}
void UBDocumentProxy::setSessionAuthor(const QString &authors)
{
setMetaData(UBSettings::sessionAuthors,QVariant(authors));
}
QString UBDocumentProxy::sessionAuthors()
{
if(mMetaDatas.contains(UBSettings::sessionAuthors))
return metaData(UBSettings::sessionAuthors).toString();
else
return QString();
}
QDateTime UBDocumentProxy::documentDate() QDateTime UBDocumentProxy::documentDate()
{ {
qDebug()<< UBSettings::documentDate;
qDebug()<<mMetaDatas;
if(mMetaDatas.contains(UBSettings::documentDate)) if(mMetaDatas.contains(UBSettings::documentDate))
return UBStringUtils::fromUtcIsoDate(metaData(UBSettings::documentDate).toString()); return UBStringUtils::fromUtcIsoDate(metaData(UBSettings::documentDate).toString());
return QDateTime::currentDateTime(); return QDateTime::currentDateTime();

@ -45,20 +45,6 @@ class UBDocumentProxy : public QObject
QString name() const; QString name() const;
QString groupName() const; QString groupName() const;
QString sessionTitle() const;
void setSessionTitle(const QString& sessionTitle);
QString sessionTarget() const;
void setSessionTarget(const QString& sessionTarget);
QString sessionLicence() const;
void setSessionLicence(const QString& sessionLicence);
void setSessionKeywords(const QString& kw);
QString sessionKeywords();
void setSessionLevel(const QString& level);
QString sessionLevel();
void setSessionTopic(const QString& topic);
QString sessionTopic();
void setSessionAuthor(const QString& authors);
QString sessionAuthors();
QDateTime documentDate(); QDateTime documentDate();
QDateTime lastUpdate(); QDateTime lastUpdate();

@ -444,15 +444,15 @@ bool UBGraphicsScene::inputDevicePress(const QPointF& scenePos, const qreal& pre
mAddedItems.clear(); mAddedItems.clear();
mRemovedItems.clear(); mRemovedItems.clear();
if (UBDrawingController::drawingController()->mActiveRuler) if (UBDrawingController::drawingController()->mActiveRuler)
{ {
UBDrawingController::drawingController()->mActiveRuler->StartLine(scenePos, width); UBDrawingController::drawingController()->mActiveRuler->StartLine(scenePos, width);
} }
else else
{ {
moveTo(scenePos); moveTo(scenePos);
drawLineTo(scenePos, width, UBDrawingController::drawingController()->stylusTool() == UBStylusTool::Line); drawLineTo(scenePos, width, UBDrawingController::drawingController()->stylusTool() == UBStylusTool::Line);
} }
accepted = true; accepted = true;
} }
else if (currentTool == UBStylusTool::Eraser) else if (currentTool == UBStylusTool::Eraser)
@ -638,8 +638,8 @@ bool UBGraphicsScene::inputDeviceRelease()
mCurrentStroke = 0; mCurrentStroke = 0;
} }
} }
} }
if (mRemovedItems.size() > 0 || mAddedItems.size() > 0) if (mRemovedItems.size() > 0 || mAddedItems.size() > 0)
{ {
@ -702,7 +702,7 @@ void UBGraphicsScene::drawPointer(const QPointF &pPoint, bool isFirstDraw)
// call this function when user release mouse button in Magnifier mode // call this function when user release mouse button in Magnifier mode
void UBGraphicsScene::DisposeMagnifierQWidgets() void UBGraphicsScene::DisposeMagnifierQWidgets()
{ {
if(magniferControlViewWidget) if(magniferControlViewWidget)
{ {
magniferControlViewWidget->hide(); magniferControlViewWidget->hide();
magniferControlViewWidget->setParent(0); magniferControlViewWidget->setParent(0);
@ -710,7 +710,7 @@ void UBGraphicsScene::DisposeMagnifierQWidgets()
magniferControlViewWidget = NULL; magniferControlViewWidget = NULL;
} }
if(magniferDisplayViewWidget) if(magniferDisplayViewWidget)
{ {
magniferDisplayViewWidget->hide(); magniferDisplayViewWidget->hide();
magniferDisplayViewWidget->setParent(0); magniferDisplayViewWidget->setParent(0);
@ -727,7 +727,7 @@ void UBGraphicsScene::DisposeMagnifierQWidgets()
catch (...) catch (...)
{ {
} }
} }
void UBGraphicsScene::moveTo(const QPointF &pPoint) void UBGraphicsScene::moveTo(const QPointF &pPoint)
@ -759,7 +759,7 @@ void UBGraphicsScene::drawLineTo(const QPointF &pEndPoint, const qreal &pWidth,
} }
} }
if (bLineStyle) if (bLineStyle)
{ {
QSetIterator<QGraphicsItem*> itItems(mAddedItems); QSetIterator<QGraphicsItem*> itItems(mAddedItems);
@ -784,7 +784,7 @@ void UBGraphicsScene::drawLineTo(const QPointF &pEndPoint, const qreal &pWidth,
mPreviousPolygonItems.append(polygonItem); mPreviousPolygonItems.append(polygonItem);
if (!bLineStyle) if (!bLineStyle)
{ {
mPreviousPoint = pEndPoint; mPreviousPoint = pEndPoint;
mPreviousWidth = pWidth; mPreviousWidth = pWidth;
@ -1617,6 +1617,33 @@ UBGraphicsTextItem* UBGraphicsScene::addText(const QString& pString, const QPoin
, UBSettings::settings()->isItalicFont()); , UBSettings::settings()->isItalicFont());
} }
UBGraphicsTextItem* UBGraphicsScene::textForObjectName(const QString& pString, const QString& objectName)
{
UBGraphicsTextItem* textItem = 0;
bool found = false;
//looking for a previous such item text
for(int i=0; i < mFastAccessItems.count() && !found ; i += 1){
UBGraphicsTextItem* currentItem = dynamic_cast<UBGraphicsTextItem*>(mFastAccessItems.at(i));
if(currentItem && (currentItem->objectName() == objectName || currentItem->toPlainText() == pString)){
// The second condition is necessary because the object name isn't stored. On reopeining the file we
// need another rule than the objectName
textItem = currentItem;
found=true;
if(currentItem->objectName() != objectName)
textItem->setObjectName(objectName);
}
}
if(!textItem){
textItem = addTextWithFont(pString,QPointF(0,0) ,72,UBSettings::settings()->fontFamily(),true,false);
textItem->setObjectName(objectName);
}
textItem->setPlainText(pString);
textItem->adjustSize();
QSizeF size = textItem->size();
textItem->setPos(QPointF(-size.width()/2.0,-size.height()/2.0));
return textItem;
}
UBGraphicsTextItem* UBGraphicsScene::addTextWithFont(const QString& pString, const QPointF& pTopLeft UBGraphicsTextItem* UBGraphicsScene::addTextWithFont(const QString& pString, const QPointF& pTopLeft
, int pointSize, const QString& fontFamily, bool bold, bool italic) , int pointSize, const QString& fontFamily, bool bold, bool italic)
@ -2069,11 +2096,11 @@ void UBGraphicsScene::addCache()
} }
void UBGraphicsScene::addMask(const QPointF &center) void UBGraphicsScene::addMask(const QPointF &center)
{ {
UBGraphicsCurtainItem* curtain = new UBGraphicsCurtainItem(); // mem : owned and destroyed by the scene UBGraphicsCurtainItem* curtain = new UBGraphicsCurtainItem(); // mem : owned and destroyed by the scene
mTools << curtain; mTools << curtain;
addItem(curtain); addItem(curtain);
QRectF rect = UBApplication::boardController->activeScene()->normalizedSceneRect(); QRectF rect = UBApplication::boardController->activeScene()->normalizedSceneRect();
rect.setRect(center.x() - rect.width()/4, center.y() - rect.height()/4, rect.width()/2 , rect.height()/2); rect.setRect(center.x() - rect.width()/4, center.y() - rect.height()/4, rect.width()/2 , rect.height()/2);
@ -2153,7 +2180,7 @@ void UBGraphicsScene::setNominalSize(int pWidth, int pHeight)
} }
void UBGraphicsScene::setSelectedZLevel(QGraphicsItem * item) void UBGraphicsScene::setSelectedZLevel(QGraphicsItem * item)
{ {
item->setZValue(mZLayerController->generateZLevel(itemLayerType::SelectedItem)); item->setZValue(mZLayerController->generateZLevel(itemLayerType::SelectedItem));
} }
void UBGraphicsScene::setOwnZlevel(QGraphicsItem *item) void UBGraphicsScene::setOwnZlevel(QGraphicsItem *item)
@ -2323,7 +2350,7 @@ void UBGraphicsScene::keyReleaseEvent(QKeyEvent * keyEvent)
UBGraphicsW3CWidgetItem *wc3_widget = dynamic_cast<UBGraphicsW3CWidgetItem*>(item); UBGraphicsW3CWidgetItem *wc3_widget = dynamic_cast<UBGraphicsW3CWidgetItem*>(item);
if (0 != wc3_widget) if (0 != wc3_widget)
if (!wc3_widget->hasFocus()) if (!wc3_widget->hasFocus())
wc3_widget->remove(); wc3_widget->remove();
break; break;
} }
case UBGraphicsAppleWidgetItem::Type: case UBGraphicsAppleWidgetItem::Type:
@ -2331,7 +2358,7 @@ void UBGraphicsScene::keyReleaseEvent(QKeyEvent * keyEvent)
UBGraphicsAppleWidgetItem *Apple_widget = dynamic_cast<UBGraphicsAppleWidgetItem*>(item); UBGraphicsAppleWidgetItem *Apple_widget = dynamic_cast<UBGraphicsAppleWidgetItem*>(item);
if (0 !=Apple_widget) if (0 !=Apple_widget)
if (!Apple_widget->hasFocus()) if (!Apple_widget->hasFocus())
Apple_widget->remove(); Apple_widget->remove();
break; break;
} }
case UBGraphicsTextItem::Type: case UBGraphicsTextItem::Type:
@ -2339,7 +2366,7 @@ void UBGraphicsScene::keyReleaseEvent(QKeyEvent * keyEvent)
UBGraphicsTextItem *text_item = dynamic_cast<UBGraphicsTextItem*>(item); UBGraphicsTextItem *text_item = dynamic_cast<UBGraphicsTextItem*>(item);
if (0 != text_item) if (0 != text_item)
if (!text_item->hasFocus()) if (!text_item->hasFocus())
text_item->remove(); text_item->remove();
break; break;
} }
@ -2349,7 +2376,7 @@ void UBGraphicsScene::keyReleaseEvent(QKeyEvent * keyEvent)
if (0 != ubgi) if (0 != ubgi)
ubgi->remove(); ubgi->remove();
else else
UBCoreGraphicsScene::removeItem(item); UBCoreGraphicsScene::removeItem(item);
} }
} }
} }

@ -133,6 +133,7 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem
UBGraphicsAudioItem* addAudio(const QUrl& pAudioFileUrl, bool shouldPlayAsap, const QPointF& pPos = QPointF(0, 0)); UBGraphicsAudioItem* addAudio(const QUrl& pAudioFileUrl, bool shouldPlayAsap, const QPointF& pPos = QPointF(0, 0));
UBGraphicsSvgItem* addSvg(const QUrl& pSvgFileUrl, const QPointF& pPos = QPointF(0, 0)); UBGraphicsSvgItem* addSvg(const QUrl& pSvgFileUrl, const QPointF& pPos = QPointF(0, 0));
UBGraphicsTextItem* addText(const QString& pString, const QPointF& pTopLeft = QPointF(0, 0)); UBGraphicsTextItem* addText(const QString& pString, const QPointF& pTopLeft = QPointF(0, 0));
UBGraphicsTextItem* textForObjectName(const QString& pString, const QString &objectName = "UBTGZeroPageSessionTitle");
UBGraphicsTextItem* addTextWithFont(const QString& pString, const QPointF& pTopLeft = QPointF(0, 0) UBGraphicsTextItem* addTextWithFont(const QString& pString, const QPointF& pTopLeft = QPointF(0, 0)
, int pointSize = -1, const QString& fontFamily = "", bool bold = false, bool italic = false); , int pointSize = -1, const QString& fontFamily = "", bool bold = false, bool italic = false);
@ -280,10 +281,10 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem
mTools << item; mTools << item;
} }
const QPointF& previousPoint() const QPointF& previousPoint()
{ {
return mPreviousPoint; return mPreviousPoint;
} }
void setSelectedZLevel(QGraphicsItem *item); void setSelectedZLevel(QGraphicsItem *item);
void setOwnZlevel(QGraphicsItem *item); void setOwnZlevel(QGraphicsItem *item);

@ -246,6 +246,8 @@ QString UBW3CWidget::createNPAPIWrapperInDir(const QString& pUrl, const QDir& pD
const QString& pName) const QString& pName)
{ {
QString url = pUrl; QString url = pUrl;
// if the file name start with file:// it has be removed because QFileInfo doesn't support this form
url = url.replace("file://","");
QString name = pName; QString name = pName;
QFileInfo fi(url); QFileInfo fi(url);
@ -299,9 +301,11 @@ QString UBW3CWidget::createNPAPIWrapperInDir(const QString& pUrl, const QDir& pD
} }
widgetLibraryDir.mkpath(widgetLibraryPath); widgetLibraryDir.mkpath(widgetLibraryPath);
if (fi.exists()) { if (fi.exists()){
QString target = widgetLibraryPath + "/" + fi.fileName(); QString target = widgetLibraryPath + "/" + fi.fileName();
QFile::copy(pUrl, target); QString source = pUrl;
source.replace("file://","");
QFile::copy(source, target);
} }
QFile configFile(widgetLibraryPath + "/config.xml"); QFile configFile(widgetLibraryPath + "/config.xml");

@ -16,6 +16,11 @@
#include "UBFileSystemUtils.h" #include "UBFileSystemUtils.h"
#include <QtGui> #include <QtGui>
#include "core/UBApplication.h"
#include "board/UBBoardController.h"
#include "globals/UBGlobals.h" #include "globals/UBGlobals.h"
THIRD_PARTY_WARNINGS_DISABLE THIRD_PARTY_WARNINGS_DISABLE
@ -313,7 +318,8 @@ QString UBFileSystemUtils::normalizeFilePath(const QString& pFilePath)
QString UBFileSystemUtils::digitFileFormat(const QString& s, int digit) QString UBFileSystemUtils::digitFileFormat(const QString& s, int digit)
{ {
return s.arg(digit, 3, 10, QLatin1Char('0')); int pageDigit = UBApplication::boardController->pageFromSceneIndex(digit);
return s.arg(pageDigit, 3, 10, QLatin1Char('0'));
} }

@ -3,8 +3,6 @@
#include "UBPlatformUtils.h" #include "UBPlatformUtils.h"
#include "core/UBApplication.h" #include "core/UBApplication.h"
#include "core/UBSettings.h" #include "core/UBSettings.h"
#include "softwareupdate/UBSoftwareUpdate.h"
#include "softwareupdate/UBSoftwareUpdateController.h"
#include "frameworks/UBFileSystemUtils.h" #include "frameworks/UBFileSystemUtils.h"
#include <QWidget> #include <QWidget>

@ -27,7 +27,7 @@ UBDockTeacherGuideWidget::UBDockTeacherGuideWidget(QWidget* parent, const char*
, mpTeacherGuideWidget(NULL) , mpTeacherGuideWidget(NULL)
{ {
mName = "TeacherGuide"; mName = "TeacherGuide";
mVisibleState = true;
SET_STYLE_SHEET(); SET_STYLE_SHEET();
mIconToLeft = QPixmap(":images/teacher_open.png"); mIconToLeft = QPixmap(":images/teacher_open.png");

@ -56,6 +56,7 @@ UBDocumentNavigator::UBDocumentNavigator(QWidget *parent, const char *name):QGra
setFrameShadow(QFrame::Plain); setFrameShadow(QFrame::Plain);
connect(UBApplication::boardController, SIGNAL(activeSceneChanged()), this, SLOT(addNewPage())); connect(UBApplication::boardController, SIGNAL(activeSceneChanged()), this, SLOT(addNewPage()));
connect(UBApplication::boardController, SIGNAL(setDocOnPageNavigator(UBDocumentProxy*)), this, SLOT(generateThumbnails()));
connect(mScene, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); connect(mScene, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
connect(UBApplication::boardController, SIGNAL(documentReorganized(int)), this, SLOT(onMovedToIndex(int))); connect(UBApplication::boardController, SIGNAL(documentReorganized(int)), this, SLOT(onMovedToIndex(int)));
connect(UBApplication::boardController, SIGNAL(scrollToSelectedPage()), this, SLOT(onScrollToSelectedPage())); connect(UBApplication::boardController, SIGNAL(scrollToSelectedPage()), this, SLOT(onScrollToSelectedPage()));
@ -113,7 +114,7 @@ void UBDocumentNavigator::generateThumbnails()
{ {
QPixmap pix = thumbs.at(i); QPixmap pix = thumbs.at(i);
QGraphicsPixmapItem* pixmapItem = new UBSceneThumbnailNavigPixmap(pix, mCrntDoc, i); QGraphicsPixmapItem* pixmapItem = new UBSceneThumbnailNavigPixmap(pix, mCrntDoc, i);
UBThumbnailTextItem *labelItem = new UBThumbnailTextItem(tr("Page %0").arg(i + 1)); UBThumbnailTextItem *labelItem = new UBThumbnailTextItem(tr("Page %0").arg(UBApplication::boardController->pageFromSceneIndex(i)));
UBImgTextThumbnailElement thumbWithText(pixmapItem, labelItem); UBImgTextThumbnailElement thumbWithText(pixmapItem, labelItem);
thumbWithText.setBorder(border()); thumbWithText.setBorder(border());

@ -327,7 +327,7 @@ void UBDocumentTreeWidget::dropEvent(QDropEvent *event)
//due to incorrect generation of thumbnails of invisible scene I've used direct copying of thumbnail files //due to incorrect generation of thumbnails of invisible scene I've used direct copying of thumbnail files
//it's not universal and good way but it's faster //it's not universal and good way but it's faster
QString from = sourceItem.documentProxy()->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", sourceItem.sceneIndex() + 1); QString from = sourceItem.documentProxy()->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", sourceItem.sceneIndex());
QString to = targetDocProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", targetDocProxy->pageCount()); QString to = targetDocProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", targetDocProxy->pageCount());
QFile::remove(to); QFile::remove(to);
QFile::copy(from, to); QFile::copy(from, to);
@ -452,4 +452,4 @@ bool UBDocumentGroupTreeItem::isDefaultFolder() const
void UBDocumentTreeWidget::autoScroll() void UBDocumentTreeWidget::autoScroll()
{ {
this->verticalScrollBar()->setValue(this->verticalScrollBar()->value() + mScrollMagnitude); this->verticalScrollBar()->setValue(this->verticalScrollBar()->value() + mScrollMagnitude);
} }

@ -33,8 +33,7 @@ UBNavigatorPalette::UBNavigatorPalette(QWidget *parent, const char *name):
{ {
setOrientation(eUBDockOrientation_Left); setOrientation(eUBDockOrientation_Left);
setMaximumWidth(300); setMaximumWidth(300);
//mCollapsedIcon = QPixmap(":images/pages_open.png");
//mIcon = QPixmap(":images/pages_close.png");
resize(UBSettings::settings()->navigPaletteWidth->get().toInt(), height()); resize(UBSettings::settings()->navigPaletteWidth->get().toInt(), height());
mLastWidth = 300; mLastWidth = 300;
@ -129,7 +128,7 @@ void UBNavigatorPalette::changeCurrentPage()
if(NO_PAGESELECTED != iPage) if(NO_PAGESELECTED != iPage)
{ {
// Display the selected page // Display the selected page
UBApplication::boardController->setActiveDocumentScene(mNavigator->currentDoc(), iPage); UBApplication::boardController->setActiveDocumentScene(mNavigator->currentDoc(), iPage);
} }
} }

@ -176,7 +176,7 @@ void UBPageNavigationWidget::updateTime()
*/ */
void UBPageNavigationWidget::setPageNumber(int current, int total) void UBPageNavigationWidget::setPageNumber(int current, int total)
{ {
mPageNbr->setText(QString("%1 / %2").arg(current).arg(total)); mPageNbr->setText(QString("%1 / %2").arg(current).arg(UBApplication::boardController->sceneIndexFromPage(total)));
} }
/** /**

@ -1,36 +0,0 @@
#include <QApplication>
#include <QStyleOptionButton>
#include <QStyledItemDelegate>
#include <QStyleOptionViewItem>
#include <QPainter>
#include <QModelIndex>
#include "UBTGWidgetTreeDelegate.h"
#include "core/memcheck.h"
UBTGWidgetTreeDelegate::UBTGWidgetTreeDelegate(QObject *parent) :
QStyledItemDelegate(parent)
{
//NOOP
}
void UBTGWidgetTreeDelegate::paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const
{
if(index.data(Qt::UserRole) != eUBTGAddSubItemWidgetType_None){
painter->setBackgroundMode(Qt::OpaqueMode);
painter->setBackground(QBrush(QColor(Qt::red)));
QStyleOptionButton styleButton;
styleButton.text = "pipo";
styleButton.rect = option.rect;
QApplication::style()->drawControl(QStyle::CE_PushButtonLabel,&styleButton,painter);
}
else
QStyledItemDelegate::paint(painter,option,index);
}
QSize UBTGWidgetTreeDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
{
QSize size = QStyledItemDelegate::sizeHint(option,index);
return size;
}

@ -1,35 +0,0 @@
#ifndef UBTGWIDGETTREEDELEGATE_H
#define UBTGWIDGETTREEDELEGATE_H
class QPainter;
class QStyleOptionViewItem;
class QModelIndex;
#include <QStyledItemDelegate>
typedef enum
{
eUBTGAddSubItemWidgetType_None,
eUBTGAddSubItemWidgetType_Action ,
eUBTGAddSubItemWidgetType_Media,
eUBTGAddSubItemWidgetType_Url
}eUBTGAddSubItemWidgetType;
class UBTGWidgetTreeDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
explicit UBTGWidgetTreeDelegate(QObject *parent = 0);
virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
signals:
public slots:
};
#endif // UBTGWIDGETTREEDELEGATE_H

@ -1,6 +0,0 @@
#include "UBTeacherGuideDelegate.h"
#include "core/memcheck.h"
UBTeacherGuideDelegate::UBTeacherGuideDelegate()
{
}

@ -1,10 +0,0 @@
#ifndef UBTEACHERGUIDEDELEGATE_H
#define UBTEACHERGUIDEDELEGATE_H
class UBTeacherGuideDelegate
{
public:
UBTeacherGuideDelegate();
};
#endif // UBTEACHERGUIDEDELEGATE_H

@ -23,8 +23,11 @@
#include "UBTeacherGuideWidget.h" #include "UBTeacherGuideWidget.h"
#include "adaptors/UBSvgSubsetAdaptor.h"
#include "core/UBApplication.h" #include "core/UBApplication.h"
#include "core/UBPersistenceManager.h" #include "core/UBPersistenceManager.h"
#include "core/UBSettings.h"
#include "globals/UBGlobals.h" #include "globals/UBGlobals.h"
@ -40,10 +43,21 @@
#include "document/UBDocumentProxy.h" #include "document/UBDocumentProxy.h"
#include "document/UBDocumentController.h" #include "document/UBDocumentController.h"
#include "domain/UBGraphicsTextItem.h"
#include "core/memcheck.h" #include "core/memcheck.h"
#define UBTG_SEPARATOR_FIXED_HEIGHT 3 #define UBTG_SEPARATOR_FIXED_HEIGHT 3
typedef enum
{
eUBTGAddSubItemWidgetType_None,
eUBTGAddSubItemWidgetType_Action ,
eUBTGAddSubItemWidgetType_Media,
eUBTGAddSubItemWidgetType_Url
}eUBTGAddSubItemWidgetType;
/*************************************************************************** /***************************************************************************
* class UBTeacherGuideEditionWidget * * class UBTeacherGuideEditionWidget *
@ -62,20 +76,21 @@ UBTeacherGuideEditionWidget::UBTeacherGuideEditionWidget(QWidget *parent, const
, mpAddAnActionItem(NULL) , mpAddAnActionItem(NULL)
, mpAddAMediaItem(NULL) , mpAddAMediaItem(NULL)
, mpAddALinkItem(NULL) , mpAddALinkItem(NULL)
, mpTreeDelegate(NULL)
{ {
setObjectName(name); setObjectName(name);
mpLayout = new QVBoxLayout(this); mpLayout = new QVBoxLayout(this);
mpPageNumberLabel = new QLabel(this); mpPageNumberLabel = new QLabel(this);
mpPageNumberLabel->setAlignment(Qt::AlignRight); mpPageNumberLabel->setAlignment(Qt::AlignRight);
mpPageNumberLabel->setObjectName("UBTGEditionPageNumberLabel"); mpPageNumberLabel->setObjectName("UBTGPageNumberLabel");
mpLayout->addWidget(mpPageNumberLabel); mpLayout->addWidget(mpPageNumberLabel);
// tree basic configuration // tree basic configuration
mpDocumentTitle = new QLabel(this);
mpDocumentTitle->setText("Document title"); if(UBSettings::settings()->teacherGuidePageZeroActivated->get().toBool()){
mpDocumentTitle->setObjectName("UBTGEditionDocumentTitle"); mpDocumentTitle = new QLabel(this);
mpLayout->addWidget(mpDocumentTitle); mpDocumentTitle->setObjectName("UBTGPresentationDocumentTitle");
mpLayout->addWidget(mpDocumentTitle);
}
mpPageTitle = new UBTGAdaptableText(0,this); mpPageTitle = new UBTGAdaptableText(0,this);
mpPageTitle->setObjectName("UBTGEditionPageTitle"); mpPageTitle->setObjectName("UBTGEditionPageTitle");
@ -95,10 +110,7 @@ UBTeacherGuideEditionWidget::UBTeacherGuideEditionWidget(QWidget *parent, const
mpTreeWidget = new QTreeWidget(this); mpTreeWidget = new QTreeWidget(this);
mpLayout->addWidget(mpTreeWidget); mpLayout->addWidget(mpTreeWidget);
mpTreeDelegate = new UBTGWidgetTreeDelegate();
mpRootWidgetItem = mpTreeWidget->invisibleRootItem(); mpRootWidgetItem = mpTreeWidget->invisibleRootItem();
//mpTreeWidget->setItemDelegate(mpTreeDelegate);
mpTreeWidget->setRootIsDecorated(false); mpTreeWidget->setRootIsDecorated(false);
mpTreeWidget->setIndentation(0); mpTreeWidget->setIndentation(0);
mpTreeWidget->setDropIndicatorShown(false); mpTreeWidget->setDropIndicatorShown(false);
@ -120,6 +132,11 @@ UBTeacherGuideEditionWidget::UBTeacherGuideEditionWidget(QWidget *parent, const
mpRootWidgetItem->addChild(mpAddAnActionItem); mpRootWidgetItem->addChild(mpAddAnActionItem);
mpRootWidgetItem->addChild(mpAddAMediaItem); mpRootWidgetItem->addChild(mpAddAMediaItem);
mpRootWidgetItem->addChild(mpAddALinkItem); mpRootWidgetItem->addChild(mpAddALinkItem);
if(UBSettings::settings()->teacherGuideLessonPagesActivated->get().toBool()){
UBSvgSubsetAdaptor::addElementToBeStored(QString("teacherGuide"),this);
connect(UBApplication::boardController,SIGNAL(activeDocumentChanged()),this,SLOT(onActiveDocumentChanged()));
}
} }
UBTeacherGuideEditionWidget::~UBTeacherGuideEditionWidget() UBTeacherGuideEditionWidget::~UBTeacherGuideEditionWidget()
@ -132,23 +149,103 @@ UBTeacherGuideEditionWidget::~UBTeacherGuideEditionWidget()
DELETEPTR(mpAddAnActionItem); DELETEPTR(mpAddAnActionItem);
DELETEPTR(mpAddAMediaItem); DELETEPTR(mpAddAMediaItem);
DELETEPTR(mpAddALinkItem); DELETEPTR(mpAddALinkItem);
DELETEPTR(mpTreeDelegate);
DELETEPTR(mpTreeWidget) DELETEPTR(mpTreeWidget)
DELETEPTR(mpLayout); DELETEPTR(mpLayout);
} }
void UBTeacherGuideEditionWidget::showEvent(QShowEvent* event) void UBTeacherGuideEditionWidget::showEvent(QShowEvent* event)
{ {
mpPageTitle->setFocus();
mpComment->setFocus();
setFocus(); setFocus();
QWidget::showEvent(event); QWidget::showEvent(event);
} }
void UBTeacherGuideEditionWidget::onActiveSceneChanged() void UBTeacherGuideEditionWidget::onActiveDocumentChanged()
{
int activeSceneIndex = UBApplication::boardController->activeSceneIndex();
if(UBApplication::boardController->pageFromSceneIndex(activeSceneIndex) != 0)
load(UBSvgSubsetAdaptor::readTeacherGuideNode(activeSceneIndex));
}
void UBTeacherGuideEditionWidget::load(QString element)
{ {
cleanData(); cleanData();
mpPageNumberLabel->setText(tr("Page: %0").arg(UBApplication::boardController->activeSceneIndex() + 1)); QDomDocument doc("TeacherGuide");
doc.setContent(element);
for(QDomElement element = doc.documentElement().firstChildElement(); !element.isNull(); element = element.nextSiblingElement()) {
QString tagName = element.tagName();
if(tagName == "title")
mpPageTitle->setInitialText(element.attribute("value"));
else if(tagName == "comment")
mpComment->setInitialText(element.attribute("value"));
else if(tagName == "media")
onAddItemClicked(mpAddAMediaItem,0,&element);
else if(tagName == "link")
onAddItemClicked(mpAddALinkItem,0,&element);
else if(tagName == "action")
onAddItemClicked(mpAddAnActionItem,0,&element);
}
}
QVector<tIDataStorage*> UBTeacherGuideEditionWidget::save(int pageIndex)
{
QVector<tIDataStorage*> result;
if(pageIndex != UBApplication::boardController->currentPage())
return result;
tIDataStorage* data = new tIDataStorage();
data->name = "teacherGuide";
data->type = eElementType_START;
data->attributes.insert("version","1.50");
result << data;
data = new tIDataStorage();
data->name = "title";
data->type = eElementType_UNIQUE;
data->attributes.insert("value",mpPageTitle->text());
result << data;
data = new tIDataStorage();
data->name = "comment";
data->type = eElementType_UNIQUE;
data->attributes.insert("value",mpComment->text());
result << data;
QList<QTreeWidgetItem*> children = getChildrenList(mpAddAnActionItem);
children << getChildrenList(mpAddAMediaItem);
children << getChildrenList(mpAddALinkItem);
foreach(QTreeWidgetItem* widgetItem, children){
tUBGEElementNode* node = dynamic_cast<iUBTGSaveData*>(mpTreeWidget->itemWidget(widgetItem,0))->saveData();
if(node){
data = new tIDataStorage();
data->name = node->name;
data->type = eElementType_UNIQUE;
foreach(QString currentKey, node->attributes.keys())
data->attributes.insert(currentKey,node->attributes.value(currentKey));
result << data;
}
}
data = new tIDataStorage();
data->name = "teacherGuide";
data->type = eElementType_END;
result << data;
return result;
}
void UBTeacherGuideEditionWidget::onActiveSceneChanged()
{
int currentPage = UBApplication::boardController->currentPage();
if(currentPage > 0){
cleanData();
load(UBSvgSubsetAdaptor::readTeacherGuideNode(UBApplication::boardController->activeSceneIndex()));
mpPageNumberLabel->setText(tr("Page: %0").arg(currentPage));
UBDocumentProxy* documentProxy = UBApplication::boardController->activeDocument();
if(mpDocumentTitle)
mpDocumentTitle->setText(documentProxy->metaData(UBSettings::sessionTitle).toString());
}
} }
void UBTeacherGuideEditionWidget::cleanData() void UBTeacherGuideEditionWidget::cleanData()
@ -162,7 +259,6 @@ void UBTeacherGuideEditionWidget::cleanData()
foreach(QTreeWidgetItem* item, children){ foreach(QTreeWidgetItem* item, children){
DELETEPTR(item); DELETEPTR(item);
} }
} }
QList<QTreeWidgetItem*> UBTeacherGuideEditionWidget::getChildrenList(QTreeWidgetItem* widgetItem) QList<QTreeWidgetItem*> UBTeacherGuideEditionWidget::getChildrenList(QTreeWidgetItem* widgetItem)
@ -177,12 +273,12 @@ QVector<tUBGEElementNode*> UBTeacherGuideEditionWidget::getPageAndCommentData()
{ {
QVector<tUBGEElementNode*>result; QVector<tUBGEElementNode*>result;
tUBGEElementNode* pageTitle = new tUBGEElementNode(); tUBGEElementNode* pageTitle = new tUBGEElementNode();
pageTitle->type = "pageTitle"; pageTitle->name = "pageTitle";
pageTitle->attributes.insert("value",mpPageTitle->text()); pageTitle->attributes.insert("value",mpPageTitle->text());
result << pageTitle; result << pageTitle;
tUBGEElementNode* comment = new tUBGEElementNode(); tUBGEElementNode* comment = new tUBGEElementNode();
comment->type = "comment"; comment->name = "comment";
comment->attributes.insert("value",mpComment->text()); comment->attributes.insert("value",mpComment->text());
result << comment; result << comment;
return result; return result;
@ -196,32 +292,42 @@ QVector<tUBGEElementNode*> UBTeacherGuideEditionWidget::getData()
children << getChildrenList(mpAddALinkItem); children << getChildrenList(mpAddALinkItem);
result << getPageAndCommentData(); result << getPageAndCommentData();
foreach(QTreeWidgetItem* widgetItem, children){ foreach(QTreeWidgetItem* widgetItem, children){
tUBGEElementNode* node = dynamic_cast<iUBTGSavableData*>(mpTreeWidget->itemWidget(widgetItem,0))->saveData(); tUBGEElementNode* node = dynamic_cast<iUBTGSaveData*>(mpTreeWidget->itemWidget(widgetItem,0))->saveData();
if(node) if(node)
result << node; result << node;
} }
return result; return result;
} }
void UBTeacherGuideEditionWidget::onAddItemClicked(QTreeWidgetItem* widget, int column) void UBTeacherGuideEditionWidget::onAddItemClicked(QTreeWidgetItem* widget, int column, QDomElement *element)
{ {
int addSubItemWidgetType = widget->data(column,Qt::UserRole).toInt(); int addSubItemWidgetType = widget->data(column,Qt::UserRole).toInt();
if(column == 0 && addSubItemWidgetType != eUBTGAddSubItemWidgetType_None){ if(addSubItemWidgetType != eUBTGAddSubItemWidgetType_None){
QTreeWidgetItem* newWidgetItem = new QTreeWidgetItem(widget); QTreeWidgetItem* newWidgetItem = new QTreeWidgetItem(widget);
newWidgetItem->setData(column,Qt::UserRole,eUBTGAddSubItemWidgetType_None); newWidgetItem->setData(column,Qt::UserRole,eUBTGAddSubItemWidgetType_None);
newWidgetItem->setData(1,Qt::UserRole,eUBTGAddSubItemWidgetType_None); newWidgetItem->setData(1,Qt::UserRole,eUBTGAddSubItemWidgetType_None);
newWidgetItem->setIcon(1,QIcon(":images/close.svg")); newWidgetItem->setIcon(1,QIcon(":images/close.svg"));
switch(addSubItemWidgetType) switch(addSubItemWidgetType)
{ {
case eUBTGAddSubItemWidgetType_Action: case eUBTGAddSubItemWidgetType_Action:{
mpTreeWidget->setItemWidget(newWidgetItem,0,new UBTGActionWidget(widget)); UBTGActionWidget* actionWidget = new UBTGActionWidget(widget);
if(element) actionWidget->initializeWithDom(*element);
mpTreeWidget->setItemWidget(newWidgetItem,0,actionWidget);
break; break;
case eUBTGAddSubItemWidgetType_Media: }
mpTreeWidget->setItemWidget(newWidgetItem,0,new UBTGMediaWidget(widget)); case eUBTGAddSubItemWidgetType_Media:{
UBTGMediaWidget* mediaWidget = new UBTGMediaWidget(widget);
if(element) mediaWidget->initializeWithDom(*element);
mpTreeWidget->setItemWidget(newWidgetItem,0,mediaWidget);
break; break;
case eUBTGAddSubItemWidgetType_Url: }
mpTreeWidget->setItemWidget(newWidgetItem,0,new UBTGUrlWidget()); case eUBTGAddSubItemWidgetType_Url:{
UBTGUrlWidget* urlWidget = new UBTGUrlWidget();
if(element) urlWidget->initializeWithDom(*element);
mpTreeWidget->setItemWidget(newWidgetItem,0,urlWidget);
break; break;
}
default: default:
delete newWidgetItem; delete newWidgetItem;
qCritical() << "onAddItemClicked no action set"; qCritical() << "onAddItemClicked no action set";
@ -237,6 +343,8 @@ void UBTeacherGuideEditionWidget::onAddItemClicked(QTreeWidgetItem* widget, int
} }
} }
else if(column == 1 && addSubItemWidgetType == eUBTGAddSubItemWidgetType_None){ else if(column == 1 && addSubItemWidgetType == eUBTGAddSubItemWidgetType_None){
UBTGMediaWidget* media = dynamic_cast<UBTGMediaWidget*>(mpTreeWidget->itemWidget(widget,0));
if(media) media->removeSource();
int index = mpTreeWidget->currentIndex().row(); int index = mpTreeWidget->currentIndex().row();
QTreeWidgetItem* toBeDeletedWidgetItem = widget->parent()->takeChild(index); QTreeWidgetItem* toBeDeletedWidgetItem = widget->parent()->takeChild(index);
delete toBeDeletedWidgetItem; delete toBeDeletedWidgetItem;
@ -280,7 +388,7 @@ UBTeacherGuidePresentationWidget::UBTeacherGuidePresentationWidget(QWidget *pare
mpPageNumberLabel = new QLabel(this); mpPageNumberLabel = new QLabel(this);
mpPageNumberLabel->setAlignment(Qt::AlignRight); mpPageNumberLabel->setAlignment(Qt::AlignRight);
mpPageNumberLabel->setObjectName("UBTGPresentationPageNumberLabel"); mpPageNumberLabel->setObjectName("UBTGPageNumberLabel");
mpLayout->addWidget(mpPageNumberLabel); mpLayout->addWidget(mpPageNumberLabel);
@ -289,15 +397,16 @@ UBTeacherGuidePresentationWidget::UBTeacherGuidePresentationWidget(QWidget *pare
mpModePushButton = new QPushButton(this); mpModePushButton = new QPushButton(this);
mpModePushButton->setIcon(QIcon(":images/pencil.svg")); mpModePushButton->setIcon(QIcon(":images/pencil.svg"));
mpModePushButton->setMaximumWidth(32); mpModePushButton->setMaximumWidth(32);
mpModePushButton->installEventFilter(this);
connect(mpModePushButton,SIGNAL(clicked()),parentWidget(),SLOT(changeMode())); connect(mpModePushButton,SIGNAL(clicked()),parentWidget(),SLOT(changeMode()));
mpDocumentTitle = new QLabel(this);
mpDocumentTitle->setObjectName("UBTGPresentationDocumentTitle");
mpDocumentTitle->setText(tr("Document title"));
mpButtonTitleLayout->addWidget(mpModePushButton); mpButtonTitleLayout->addWidget(mpModePushButton);
mpButtonTitleLayout->addWidget(mpDocumentTitle);
if(UBSettings::settings()->teacherGuidePageZeroActivated->get().toBool()){
mpDocumentTitle = new QLabel(this);
mpDocumentTitle->setObjectName("UBTGPresentationDocumentTitle");
mpButtonTitleLayout->addWidget(mpDocumentTitle);
}
mpLayout->addLayout(mpButtonTitleLayout); mpLayout->addLayout(mpButtonTitleLayout);
@ -318,10 +427,11 @@ UBTeacherGuidePresentationWidget::UBTeacherGuidePresentationWidget(QWidget *pare
mpSeparator->setObjectName("UBTGSepartor"); mpSeparator->setObjectName("UBTGSepartor");
mpLayout->addWidget(mpSeparator); mpLayout->addWidget(mpSeparator);
mpTreeWidget = new QTreeWidget(this); mpTreeWidget = new UBTGDraggableTreeItem(this);
mpLayout->addWidget(mpTreeWidget); mpLayout->addWidget(mpTreeWidget);
mpRootWidgetItem = mpTreeWidget->invisibleRootItem(); mpRootWidgetItem = mpTreeWidget->invisibleRootItem();
mpTreeWidget->setDragEnabled(true);
mpTreeWidget->setRootIsDecorated(false); mpTreeWidget->setRootIsDecorated(false);
mpTreeWidget->setIndentation(0); mpTreeWidget->setIndentation(0);
mpTreeWidget->setDropIndicatorShown(false); mpTreeWidget->setDropIndicatorShown(false);
@ -345,6 +455,14 @@ UBTeacherGuidePresentationWidget::~UBTeacherGuidePresentationWidget()
DELETEPTR(mpLayout); DELETEPTR(mpLayout);
} }
bool UBTeacherGuidePresentationWidget::eventFilter(QObject* object, QEvent* event)
{
Q_UNUSED(object);
if(event->type() == QEvent::HoverEnter || event->type() == QEvent::HoverMove || event->type() == QEvent::HoverLeave)
return true;
return false;
}
void UBTeacherGuidePresentationWidget::cleanData() void UBTeacherGuidePresentationWidget::cleanData()
{ {
mpPageTitle->showText(""); mpPageTitle->showText("");
@ -361,15 +479,16 @@ void UBTeacherGuidePresentationWidget::cleanData()
void UBTeacherGuidePresentationWidget::onActiveSceneChanged() void UBTeacherGuidePresentationWidget::onActiveSceneChanged()
{ {
cleanData(); cleanData();
mpPageNumberLabel->setText(tr("Page: %0").arg(UBApplication::boardController->activeSceneIndex() + 1)); mpPageNumberLabel->setText(tr("Page: %0").arg(UBApplication::boardController->currentPage()));
UBDocumentProxy* documentProxy = UBApplication::boardController->activeDocument();
if(mpDocumentTitle)
mpDocumentTitle->setText(documentProxy->metaData(UBSettings::sessionTitle).toString());
} }
void UBTeacherGuidePresentationWidget::createMediaButtonItem() void UBTeacherGuidePresentationWidget::createMediaButtonItem()
{ {
if(!mpMediaSwitchItem){ if(!mpMediaSwitchItem){
//create the media button
mpMediaSwitchItem = new QTreeWidgetItem(mpRootWidgetItem); mpMediaSwitchItem = new QTreeWidgetItem(mpRootWidgetItem);
//mpMediaSwitchItem->setIcon(0,QIcon(":images/plus.svg"));
mpMediaSwitchItem->setText(0,"+"); mpMediaSwitchItem->setText(0,"+");
mpMediaSwitchItem->setExpanded(false); mpMediaSwitchItem->setExpanded(false);
mpMediaSwitchItem->setData(0,tUBTGTreeWidgetItemRole_HasAnAction,tUBTGActionAssociateOnClickItem_EXPAND); mpMediaSwitchItem->setData(0,tUBTGTreeWidgetItemRole_HasAnAction,tUBTGActionAssociateOnClickItem_EXPAND);
@ -386,13 +505,14 @@ void UBTeacherGuidePresentationWidget::showData(QVector<tUBGEElementNode*> data)
cleanData(); cleanData();
foreach(tUBGEElementNode* element, data){ foreach(tUBGEElementNode* element, data){
if(element->type == "pageTitle") if(element->name == "pageTitle")
mpPageTitle->showText(element->attributes.value("value")); mpPageTitle->showText(element->attributes.value("value"));
else if (element->type == "comment") else if (element->name == "comment")
mpComment->showText(element->attributes.value("value")); mpComment->showText(element->attributes.value("value"));
else if(element->type == "action"){ else if(element->name == "action"){
QTreeWidgetItem* newWidgetItem = new QTreeWidgetItem(mpRootWidgetItem); QTreeWidgetItem* newWidgetItem = new QTreeWidgetItem(mpRootWidgetItem);
newWidgetItem->setText(0,element->attributes.value("task")); newWidgetItem->setText(0,element->attributes.value("task"));
newWidgetItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
QString colorString = element->attributes.value("owner").toInt() == 0 ? "red":"green"; QString colorString = element->attributes.value("owner").toInt() == 0 ? "red":"green";
UBTGAdaptableText* textWidget = new UBTGAdaptableText(newWidgetItem,0); UBTGAdaptableText* textWidget = new UBTGAdaptableText(newWidgetItem,0);
textWidget->bottomMargin(14); textWidget->bottomMargin(14);
@ -403,13 +523,15 @@ void UBTeacherGuidePresentationWidget::showData(QVector<tUBGEElementNode*> data)
mpRootWidgetItem->addChild(newWidgetItem); mpRootWidgetItem->addChild(newWidgetItem);
} }
else if(element->type == "media"){ else if(element->name == "media"){
createMediaButtonItem(); createMediaButtonItem();
QTreeWidgetItem* newWidgetItem = new QTreeWidgetItem(mpMediaSwitchItem); QTreeWidgetItem* newWidgetItem = new QTreeWidgetItem(mpMediaSwitchItem);
newWidgetItem->setIcon(0,QIcon(":images/teacherGuide/"+ element->attributes.value("mediaType") +".png")); newWidgetItem->setIcon(0,QIcon(":images/teacherGuide/"+ element->attributes.value("mediaType") +".png"));
newWidgetItem->setText(0,element->attributes.value("title")); newWidgetItem->setText(0,element->attributes.value("title"));
newWidgetItem->setData(0,tUBTGTreeWidgetItemRole_HasAnAction,tUBTGActionAssociateOnClickItem_MEDIA); newWidgetItem->setData(0,tUBTGTreeWidgetItemRole_HasAnAction,tUBTGActionAssociateOnClickItem_MEDIA);
newWidgetItem->setData(0,Qt::FontRole, QVariant(QFont(QApplication::font().family(),11))); newWidgetItem->setData(0,Qt::FontRole, QVariant(QFont(QApplication::font().family(),11)));
newWidgetItem->setData(0, TG_USER_ROLE_MIME_TYPE, UBApplication::boardController->activeDocument()->persistencePath()+ "/" + element->attributes.value("relativePath"));
newWidgetItem->setFlags(Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsSelectable);
mpRootWidgetItem->addChild(newWidgetItem); mpRootWidgetItem->addChild(newWidgetItem);
QTreeWidgetItem* mediaItem = new QTreeWidgetItem(newWidgetItem); QTreeWidgetItem* mediaItem = new QTreeWidgetItem(newWidgetItem);
@ -418,7 +540,7 @@ void UBTeacherGuidePresentationWidget::showData(QVector<tUBGEElementNode*> data)
newWidgetItem->setExpanded(false); newWidgetItem->setExpanded(false);
mpTreeWidget->setItemWidget(mediaItem,0,mediaWidget); mpTreeWidget->setItemWidget(mediaItem,0,mediaWidget);
} }
else if(element->type == "link"){ else if(element->name == "link"){
createMediaButtonItem(); createMediaButtonItem();
QTreeWidgetItem* newWidgetItem = new QTreeWidgetItem(mpMediaSwitchItem); QTreeWidgetItem* newWidgetItem = new QTreeWidgetItem(mpMediaSwitchItem);
newWidgetItem->setIcon(0,QIcon(":images/teacherGuide/link.png")); newWidgetItem->setIcon(0,QIcon(":images/teacherGuide/link.png"));
@ -426,6 +548,7 @@ void UBTeacherGuidePresentationWidget::showData(QVector<tUBGEElementNode*> data)
newWidgetItem->setData(0,tUBTGTreeWidgetItemRole_HasAnAction,tUBTGActionAssociateOnClickItem_URL); newWidgetItem->setData(0,tUBTGTreeWidgetItemRole_HasAnAction,tUBTGActionAssociateOnClickItem_URL);
newWidgetItem->setData(0,tUBTGTreeWidgetItemRole_HasAnUrl,QVariant(element->attributes.value("url"))); newWidgetItem->setData(0,tUBTGTreeWidgetItemRole_HasAnUrl,QVariant(element->attributes.value("url")));
newWidgetItem->setData(0,Qt::FontRole, QVariant(QFont(QApplication::font().family(),11))); newWidgetItem->setData(0,Qt::FontRole, QVariant(QFont(QApplication::font().family(),11)));
newWidgetItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
mpRootWidgetItem->addChild(newWidgetItem); mpRootWidgetItem->addChild(newWidgetItem);
} }
} }
@ -461,7 +584,7 @@ void UBTeacherGuidePresentationWidget::onAddItemClicked(QTreeWidgetItem* widget,
/*************************************************************************** /***************************************************************************
* class UBTeacherGuidePageZeroEditionWidget * * class UBTeacherGuidePageZeroEditionWidget *
***************************************************************************/ ***************************************************************************/
UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget* parent, const char* name): QWidget(parent) UBTeacherGuidePageZeroWidget::UBTeacherGuidePageZeroWidget(QWidget* parent, const char* name): QWidget(parent)
, mpLayout(NULL) , mpLayout(NULL)
, mpButtonTitleLayout(NULL) , mpButtonTitleLayout(NULL)
, mpModePushButton(NULL) , mpModePushButton(NULL)
@ -473,18 +596,18 @@ UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget
, mpSeparatorAuthors(NULL) , mpSeparatorAuthors(NULL)
, mpCreationLabel(NULL) , mpCreationLabel(NULL)
, mpLastModifiedLabel(NULL) , mpLastModifiedLabel(NULL)
, mpGoalsLabel(NULL) , mpObjectivesLabel(NULL)
, mpGoals(NULL) , mpObjectives(NULL)
, mpSeparatorGoals(NULL) , mpSeparatorObjectives(NULL)
, mpIndexLabel(NULL) , mpIndexLabel(NULL)
, mpKeywordsLabel(NULL) , mpKeywordsLabel(NULL)
, mpKeywords(NULL) , mpKeywords(NULL)
, mpSchoolLevelItemLabel(NULL) , mpSchoolLevelItemLabel(NULL)
, mpSchoolLevelBox(NULL) , mpSchoolLevelBox(NULL)
, mpSchoolLevelValueLabel(NULL) , mpSchoolLevelValueLabel(NULL)
, mpSchoolBranchItemLabel(NULL) , mpSchoolSubjectsItemLabel(NULL)
, mpSchoolBranchBox(NULL) , mpSchoolSubjectsBox(NULL)
, mpSchoolBranchValueLabel(NULL) , mpSchoolSubjectsValueLabel(NULL)
, mpSchoolTypeItemLabel(NULL) , mpSchoolTypeItemLabel(NULL)
, mpSchoolTypeBox(NULL) , mpSchoolTypeBox(NULL)
, mpSchoolTypeValueLabel(NULL) , mpSchoolTypeValueLabel(NULL)
@ -493,13 +616,15 @@ UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget
, mpLicenceBox(NULL) , mpLicenceBox(NULL)
, mpLicenceIcon(NULL) , mpLicenceIcon(NULL)
, mpLicenceLayout(NULL) , mpLicenceLayout(NULL)
, mpSceneItemSessionTitle(NULL)
{ {
setObjectName(name); setObjectName(name);
QString chapterStyle("QLabel {font-size:16px; font-weight:bold;}");
mpLayout = new QVBoxLayout(this); mpLayout = new QVBoxLayout(0);
setLayout(mpLayout);
mpPageNumberLabel = new QLabel(this); mpPageNumberLabel = new QLabel(this);
mpPageNumberLabel->setAlignment(Qt::AlignRight); mpPageNumberLabel->setAlignment(Qt::AlignRight);
mpPageNumberLabel->setObjectName("UBTGPresentationPageNumberLabel"); mpPageNumberLabel->setObjectName("UBTGPageNumberLabel");
mpPageNumberLabel->setText(tr("Page 0")); mpPageNumberLabel->setText(tr("Page 0"));
mpLayout->addWidget(mpPageNumberLabel); mpLayout->addWidget(mpPageNumberLabel);
@ -508,12 +633,12 @@ UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget
mpModePushButton = new QPushButton(this); mpModePushButton = new QPushButton(this);
mpModePushButton->setIcon(QIcon(":images/pencil.svg")); mpModePushButton->setIcon(QIcon(":images/pencil.svg"));
mpModePushButton->setMaximumWidth(32); mpModePushButton->setMaximumWidth(32);
mpModePushButton->installEventFilter(this);
mpButtonTitleLayout->addWidget(mpModePushButton); mpButtonTitleLayout->addWidget(mpModePushButton);
connect(mpModePushButton,SIGNAL(clicked()),this,SLOT(switchToMode())); connect(mpModePushButton,SIGNAL(clicked()),this,SLOT(switchToMode()));
mpSessionTitle = new UBTGAdaptableText(0,this); mpSessionTitle = new UBTGAdaptableText(0,this,"UBTGSessionTitle");
mpSessionTitle->setPlaceHolderText(tr("Type session title here ...")); mpSessionTitle->setPlaceHolderText(tr("Type session title here ..."));
mpSessionTitle->setObjectName("UBTGEditionModeSessionTitle");
mpButtonTitleLayout->addWidget(mpSessionTitle); mpButtonTitleLayout->addWidget(mpSessionTitle);
mpLayout->addLayout(mpButtonTitleLayout); mpLayout->addLayout(mpButtonTitleLayout);
@ -526,6 +651,7 @@ UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget
mpAuthorsLabel = new QLabel(this); mpAuthorsLabel = new QLabel(this);
mpAuthorsLabel->setObjectName("UBTGZeroPageEditionModeTitle"); mpAuthorsLabel->setObjectName("UBTGZeroPageEditionModeTitle");
mpAuthorsLabel->setText(tr("Author(s)")); mpAuthorsLabel->setText(tr("Author(s)"));
mpAuthorsLabel->setStyleSheet(chapterStyle);
mpLayout->addWidget(mpAuthorsLabel); mpLayout->addWidget(mpAuthorsLabel);
mpAuthors = new UBTGAdaptableText(0,this); mpAuthors = new UBTGAdaptableText(0,this);
@ -546,29 +672,32 @@ UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget
mpSeparatorAuthors->setObjectName("UBTGSeparator"); mpSeparatorAuthors->setObjectName("UBTGSeparator");
mpLayout->addWidget(mpSeparatorAuthors); mpLayout->addWidget(mpSeparatorAuthors);
mpGoalsLabel = new QLabel(this); mpObjectivesLabel = new QLabel(this);
mpGoalsLabel->setObjectName("UBTGZeroPageEditionModeTitle"); mpObjectivesLabel->setObjectName("UBTGZeroPageEditionModeTitle");
mpGoalsLabel->setText(tr("Goal(s)")); mpObjectivesLabel->setText(tr("Objective(s)"));
mpLayout->addWidget(mpGoalsLabel); mpObjectivesLabel->setStyleSheet(chapterStyle);
mpLayout->addWidget(mpObjectivesLabel);
mpGoals = new UBTGAdaptableText(0,this); mpObjectives = new UBTGAdaptableText(0,this);
mpGoals->setObjectName("UBTGZeroPageInputText"); mpObjectives->setObjectName("UBTGZeroPageInputText");
mpGoals->setPlaceHolderText(tr("Type goals here...")); mpObjectives->setPlaceHolderText(tr("Type objectives here..."));
mpLayout->addWidget(mpGoals); mpLayout->addWidget(mpObjectives);
mpSeparatorGoals = new QFrame(this); mpSeparatorObjectives = new QFrame(this);
mpSeparatorGoals->setFixedHeight(UBTG_SEPARATOR_FIXED_HEIGHT); mpSeparatorObjectives->setFixedHeight(UBTG_SEPARATOR_FIXED_HEIGHT);
mpSeparatorGoals->setObjectName("UBTGSeparator"); mpSeparatorObjectives->setObjectName("UBTGSeparator");
mpLayout->addWidget(mpSeparatorGoals); mpLayout->addWidget(mpSeparatorObjectives);
mpIndexLabel = new QLabel(this); mpIndexLabel = new QLabel(this);
mpIndexLabel->setObjectName("UBTGZeroPageEditionModeTitle"); mpIndexLabel->setObjectName("UBTGZeroPageEditionModeTitle");
mpIndexLabel->setText(tr("Resource indexing")); mpIndexLabel->setText(tr("Resource indexing"));
mpIndexLabel->setStyleSheet(chapterStyle);
mpLayout->addWidget(mpIndexLabel); mpLayout->addWidget(mpIndexLabel);
mpKeywordsLabel = new QLabel(this); mpKeywordsLabel = new QLabel(this);
mpKeywordsLabel->setObjectName("UBTGZeroPageItemLabel"); mpKeywordsLabel->setObjectName("UBTGZeroPageItemLabel");
mpKeywordsLabel->setText(tr("Keywords:")); mpKeywordsLabel->setText(tr("Keywords:"));
mpKeywordsLabel->setStyleSheet(chapterStyle);
mpLayout->addWidget(mpKeywordsLabel); mpLayout->addWidget(mpKeywordsLabel);
mpKeywords = new UBTGAdaptableText(0,this); mpKeywords = new UBTGAdaptableText(0,this);
mpKeywords->setPlaceHolderText(tr("Type keywords here ...")); mpKeywords->setPlaceHolderText(tr("Type keywords here ..."));
@ -577,29 +706,35 @@ UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget
mpSchoolLevelItemLabel = new QLabel(this); mpSchoolLevelItemLabel = new QLabel(this);
mpSchoolLevelItemLabel->setObjectName("UBTGZeroPageItemLabel"); mpSchoolLevelItemLabel->setObjectName("UBTGZeroPageItemLabel");
mpSchoolLevelItemLabel->setText(tr("Level:")); mpSchoolLevelItemLabel->setText(tr("Level:"));
mpSchoolLevelItemLabel->setStyleSheet(chapterStyle);
mpLayout->addWidget(mpSchoolLevelItemLabel); mpLayout->addWidget(mpSchoolLevelItemLabel);
mpSchoolLevelBox = new QComboBox(this); mpSchoolLevelBox = new QComboBox(this);
mpSchoolLevelBox->setMinimumHeight(22);
mpSchoolLevelBox->setObjectName("DockPaletteWidgetComboBox"); mpSchoolLevelBox->setObjectName("DockPaletteWidgetComboBox");
connect(mpSchoolLevelBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(onSchoolLevelChanged(QString))); connect(mpSchoolLevelBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(onSchoolLevelChanged(QString)));
mpLayout->addWidget(mpSchoolLevelBox); mpLayout->addWidget(mpSchoolLevelBox);
mpSchoolLevelValueLabel = new QLabel(this); mpSchoolLevelValueLabel = new QLabel(this);
mpLayout->addWidget(mpSchoolLevelValueLabel); mpLayout->addWidget(mpSchoolLevelValueLabel);
mpSchoolBranchItemLabel = new QLabel(this); mpSchoolSubjectsItemLabel = new QLabel(this);
mpSchoolBranchItemLabel->setObjectName("UBTGZeroPageItemLabel"); mpSchoolSubjectsItemLabel->setObjectName("UBTGZeroPageItemLabel");
mpSchoolBranchItemLabel->setText(tr("Branch:")); mpSchoolSubjectsItemLabel->setText(tr("Subjects:"));
mpLayout->addWidget(mpSchoolBranchItemLabel); mpSchoolSubjectsItemLabel->setStyleSheet(chapterStyle);
mpSchoolBranchBox = new QComboBox(this); mpLayout->addWidget(mpSchoolSubjectsItemLabel);
mpSchoolBranchBox->setObjectName("DockPaletteWidgetComboBox"); mpSchoolSubjectsBox = new QComboBox(this);
mpLayout->addWidget(mpSchoolBranchBox); mpSchoolSubjectsBox->setMinimumHeight(22);
mpSchoolBranchValueLabel = new QLabel(this); mpSchoolSubjectsBox->setObjectName("DockPaletteWidgetComboBox");
mpLayout->addWidget(mpSchoolBranchValueLabel); mpLayout->addWidget(mpSchoolSubjectsBox);
mpSchoolSubjectsValueLabel = new QLabel(this);
mpLayout->addWidget(mpSchoolSubjectsValueLabel);
mpSchoolTypeItemLabel = new QLabel(this); mpSchoolTypeItemLabel = new QLabel(this);
mpSchoolTypeItemLabel->setObjectName("UBTGZeroPageItemLabel"); mpSchoolTypeItemLabel->setObjectName("UBTGZeroPageItemLabel");
mpSchoolTypeItemLabel->setText(tr("Type:")); mpSchoolTypeItemLabel->setText(tr("Type:"));
mpSchoolTypeItemLabel->setStyleSheet(chapterStyle);
mpLayout->addWidget(mpSchoolTypeItemLabel); mpLayout->addWidget(mpSchoolTypeItemLabel);
mpSchoolTypeBox = new QComboBox(this); mpSchoolTypeBox = new QComboBox(this);
mpSchoolTypeBox->setMinimumHeight(22);
mpSchoolTypeBox->setObjectName("DockPaletteWidgetComboBox"); mpSchoolTypeBox->setObjectName("DockPaletteWidgetComboBox");
mpLayout->addWidget(mpSchoolTypeBox); mpLayout->addWidget(mpSchoolTypeBox);
mpSchoolTypeValueLabel = new QLabel(this); mpSchoolTypeValueLabel = new QLabel(this);
@ -612,9 +747,11 @@ UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget
mpLicenceLabel = new QLabel(this); mpLicenceLabel = new QLabel(this);
mpLicenceLabel->setObjectName("UBTGZeroPageItemLabel"); mpLicenceLabel->setObjectName("UBTGZeroPageItemLabel");
mpLicenceLabel->setText(tr("Licence:")); mpLicenceLabel->setText(tr("Licence"));
mpLicenceLabel->setStyleSheet(chapterStyle);
mpLayout->addWidget(mpLicenceLabel); mpLayout->addWidget(mpLicenceLabel);
mpLicenceBox = new QComboBox(this); mpLicenceBox = new QComboBox(this);
mpLicenceBox->setMinimumHeight(22);
mpLicenceBox->setObjectName("DockPaletteWidgetComboBox"); mpLicenceBox->setObjectName("DockPaletteWidgetComboBox");
mpLayout->addWidget(mpLicenceBox); mpLayout->addWidget(mpLicenceBox);
mpLicenceLayout = new QHBoxLayout(0); mpLicenceLayout = new QHBoxLayout(0);
@ -624,11 +761,13 @@ UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget
mpLicenceLayout->addWidget(mpLicenceValueLabel); mpLicenceLayout->addWidget(mpLicenceValueLabel);
mpLayout->addLayout(mpLicenceLayout); mpLayout->addLayout(mpLicenceLayout);
mpLayout->addStretch(1); mpLayout->addStretch(1);
connect(UBApplication::boardController,SIGNAL(activeSceneChanged()), this, SLOT(onActiveSceneChanged())); connect(UBApplication::boardController,SIGNAL(activeSceneChanged()), this, SLOT(onActiveSceneChanged()));
fillComboBoxes(); fillComboBoxes();
} }
UBTeacherGuidePageZeroEditionWidget::~UBTeacherGuidePageZeroEditionWidget() UBTeacherGuidePageZeroWidget::~UBTeacherGuidePageZeroWidget()
{ {
DELETEPTR(mpPageNumberLabel); DELETEPTR(mpPageNumberLabel);
DELETEPTR(mpSessionTitle); DELETEPTR(mpSessionTitle);
@ -638,16 +777,16 @@ UBTeacherGuidePageZeroEditionWidget::~UBTeacherGuidePageZeroEditionWidget()
DELETEPTR(mpSeparatorAuthors); DELETEPTR(mpSeparatorAuthors);
DELETEPTR(mpCreationLabel); DELETEPTR(mpCreationLabel);
DELETEPTR(mpLastModifiedLabel); DELETEPTR(mpLastModifiedLabel);
DELETEPTR(mpGoalsLabel); DELETEPTR(mpObjectivesLabel);
DELETEPTR(mpGoals); DELETEPTR(mpObjectives);
DELETEPTR(mpSeparatorGoals); DELETEPTR(mpSeparatorObjectives);
DELETEPTR(mpIndexLabel); DELETEPTR(mpIndexLabel);
DELETEPTR(mpKeywordsLabel); DELETEPTR(mpKeywordsLabel);
DELETEPTR(mpKeywords); DELETEPTR(mpKeywords);
DELETEPTR(mpSchoolLevelItemLabel); DELETEPTR(mpSchoolLevelItemLabel);
DELETEPTR(mpSchoolLevelBox); DELETEPTR(mpSchoolLevelBox);
DELETEPTR(mpSchoolBranchItemLabel); DELETEPTR(mpSchoolSubjectsItemLabel);
DELETEPTR(mpSchoolBranchBox); DELETEPTR(mpSchoolSubjectsBox);
DELETEPTR(mpSchoolTypeItemLabel); DELETEPTR(mpSchoolTypeItemLabel);
DELETEPTR(mpSchoolTypeBox); DELETEPTR(mpSchoolTypeBox);
DELETEPTR(mpSeparatorIndex); DELETEPTR(mpSeparatorIndex);
@ -661,7 +800,15 @@ UBTeacherGuidePageZeroEditionWidget::~UBTeacherGuidePageZeroEditionWidget()
DELETEPTR(mpLayout); DELETEPTR(mpLayout);
} }
void UBTeacherGuidePageZeroEditionWidget::fillComboBoxes() bool UBTeacherGuidePageZeroWidget::eventFilter(QObject* object, QEvent* event)
{
Q_UNUSED(object);
if(event->type() == QEvent::HoverEnter || event->type() == QEvent::HoverMove || event->type() == QEvent::HoverLeave)
return true;
return false;
}
void UBTeacherGuidePageZeroWidget::fillComboBoxes()
{ {
QString parametersConfigFilePath = UBSettings::settings()->applicationCustomizationDirectory() + "/teacherGuide/indexingParameters.xml"; QString parametersConfigFilePath = UBSettings::settings()->applicationCustomizationDirectory() + "/teacherGuide/indexingParameters.xml";
QFile parametersFile(parametersConfigFilePath); QFile parametersFile(parametersConfigFilePath);
@ -702,49 +849,111 @@ void UBTeacherGuidePageZeroEditionWidget::fillComboBoxes()
QStringList licences; QStringList licences;
licences << tr("Attribution CC BY") << tr("Attribution-NoDerivs CC BY-ND") << tr("Attribution-ShareAlike CC BY-SA") << tr("Attribution-NonCommercial CC BY-NC") << tr("Attribution-NonCommercial-NoDerivs CC BY-NC-ND") << tr("Attribution-NonCommercial-ShareAlike CC BY-NC-SA") << tr("Public domain") << tr("Copyright"); licences << tr("Attribution CC BY") << tr("Attribution-NoDerivs CC BY-ND") << tr("Attribution-ShareAlike CC BY-SA") << tr("Attribution-NonCommercial CC BY-NC") << tr("Attribution-NonCommercial-NoDerivs CC BY-NC-ND") << tr("Attribution-NonCommercial-ShareAlike CC BY-NC-SA") << tr("Public domain") << tr("Copyright");
mpLicenceBox->addItems(licences); mpLicenceBox->addItems(licences);
QStringList licenceIconList;
licenceIconList << ":images/licenses/ccby.png" << ":images/licenses/ccbynd.png" << ":images/licenses/ccbysa.png" << ":images/licenses/ccbync.png" << ":images/licenses/ccbyncnd.png" << ":images/licenses/ccbyncsa.png";
for(int i = 0; i < licenceIconList.count(); i+=1)
mpLicenceBox->setItemData(i,licenceIconList.at(i));
} }
void UBTeacherGuidePageZeroEditionWidget::onSchoolLevelChanged(QString schoolLevel) void UBTeacherGuidePageZeroWidget::onSchoolLevelChanged(QString schoolLevel)
{ {
QStringList subjects = mSubjects.value(mGradeLevelsMap.value(schoolLevel)); QStringList subjects = mSubjects.value(mGradeLevelsMap.value(schoolLevel));
mpSchoolBranchBox->clear(); mpSchoolSubjectsBox->clear();
if(subjects.count()){ if(subjects.count()){
mpSchoolBranchItemLabel->setEnabled(true); mpSchoolSubjectsItemLabel->setEnabled(true);
mpSchoolBranchBox->setEnabled(true); mpSchoolSubjectsBox->setEnabled(true);
mpSchoolBranchBox->addItems(subjects); mpSchoolSubjectsBox->addItems(subjects);
} }
else{ else{
mpSchoolBranchItemLabel->setDisabled(true); mpSchoolSubjectsItemLabel->setDisabled(true);
mpSchoolBranchBox->setDisabled(true); mpSchoolSubjectsBox->setDisabled(true);
}
}
void UBTeacherGuidePageZeroWidget::onActiveSceneChanged()
{
UBDocumentProxy* documentProxy = UBApplication::boardController->activeDocument();
if(documentProxy && UBApplication::boardController->currentPage() == 0){
QDateTime creationDate = documentProxy->documentDate();
mpCreationLabel->setText(tr("Created the:\n") + creationDate.toString(Qt::DefaultLocaleShortDate));
QDateTime updatedDate = documentProxy->lastUpdate();
mpLastModifiedLabel->setText(tr("Updated the:\n") + updatedDate.toString(Qt::DefaultLocaleShortDate));
loadData();
updateSceneTitle();
} }
} }
void UBTeacherGuidePageZeroEditionWidget::onActiveSceneChanged() void UBTeacherGuidePageZeroWidget::hideEvent ( QHideEvent * event )
{
persistData();
QWidget::hideEvent(event);
}
void UBTeacherGuidePageZeroWidget::loadData()
{ {
UBDocumentProxy* documentProxy = UBApplication::documentController ? UBApplication::documentController->getCurrentDocument() : 0; UBDocumentProxy* documentProxy = UBApplication::boardController->activeDocument();
if(UBApplication::documentController && UBApplication::boardController->activeSceneIndex() == 0){ mpSessionTitle->setText(documentProxy->metaData(UBSettings::sessionTitle).toString());
// QDateTime creationDate = documentProxy->documentDate(); mpAuthors->setText(documentProxy->metaData(UBSettings::sessionAuthors).toString());
// mpCreationLabel->setText(tr("Created the:") + creationDate.toString(Qt::SystemLocaleShortDate)); mpObjectives->setText(documentProxy->metaData(UBSettings::sessionObjectives).toString());
// QDateTime updatedDate = documentProxy->lastUpdate(); mpKeywords->setText(documentProxy->metaData(UBSettings::sessionKeywords).toString());
// mpLastModifiedLabel->setText(tr("Updated the:") + updatedDate.toString(Qt::SystemLocaleShortDate));
int currentIndex = mpSchoolLevelBox->findText(documentProxy->metaData(UBSettings::sessionGradeLevel).toString());
mpSchoolLevelBox->setCurrentIndex((currentIndex!=-1) ? currentIndex : 0);
currentIndex = mpSchoolSubjectsBox->findText(documentProxy->metaData(UBSettings::sessionSubjects).toString());
mpSchoolSubjectsBox->setCurrentIndex((currentIndex!=-1) ? currentIndex : 0);
currentIndex = mpSchoolTypeBox->findText(documentProxy->metaData(UBSettings::sessionType).toString());
mpSchoolTypeBox->setCurrentIndex((currentIndex!=-1) ? currentIndex : 0);
currentIndex = mpLicenceBox->findText(documentProxy->metaData(UBSettings::sessionLicence).toString());
mpLicenceBox->setCurrentIndex((currentIndex!=-1) ? currentIndex : 0);
}
void UBTeacherGuidePageZeroWidget::persistData()
{
// check necessary because at document closing hide event is send after boardcontroller set
// to NULL
if(UBApplication::boardController){
UBDocumentProxy* documentProxy = UBApplication::boardController->activeDocument();
documentProxy->setMetaData(UBSettings::sessionTitle,mpSessionTitle->text());
documentProxy->setMetaData(UBSettings::sessionAuthors, mpAuthors->text());
documentProxy->setMetaData(UBSettings::sessionObjectives,mpObjectives->text());
documentProxy->setMetaData(UBSettings::sessionKeywords,mpKeywords->text());
documentProxy->setMetaData(UBSettings::sessionGradeLevel,mpSchoolLevelBox->currentText());
documentProxy->setMetaData(UBSettings::sessionSubjects,mpSchoolSubjectsBox->currentText());
documentProxy->setMetaData(UBSettings::sessionType,mpSchoolTypeBox->currentText());
documentProxy->setMetaData(UBSettings::sessionLicence,mpLicenceBox->currentText());
} }
} }
void UBTeacherGuidePageZeroWidget::updateSceneTitle()
{
QString sessionTitle = mpSessionTitle->text();
if(!sessionTitle.isEmpty())
UBApplication::boardController->activeScene()->textForObjectName(mpSessionTitle->text());
}
void UBTeacherGuidePageZeroEditionWidget::switchToMode(tUBTGZeroPageMode mode) void UBTeacherGuidePageZeroWidget::switchToMode(tUBTGZeroPageMode mode)
{ {
if(mode == tUBTGZeroPageMode_EDITION){ if(mode == tUBTGZeroPageMode_EDITION){
QString inputStyleSheet("QTextEdit { background: white; border-radius: 10px; border: 2px;}");
mpModePushButton->hide(); mpModePushButton->hide();
mpSessionTitle->setReadOnly(false); mpSessionTitle->setReadOnly(false);
mpSessionTitle->setStyleSheet(inputStyleSheet);
QFont titleFont(QApplication::font().family(),11,-1);
mpSessionTitle->document()->setDefaultFont(titleFont);
mpAuthors->setReadOnly(false); mpAuthors->setReadOnly(false);
mpGoals->setReadOnly(false); mpAuthors->setStyleSheet(inputStyleSheet);
mpObjectives->setReadOnly(false);
mpObjectives->setStyleSheet(inputStyleSheet);
mpKeywords->setReadOnly(false); mpKeywords->setReadOnly(false);
mpKeywords->setStyleSheet(inputStyleSheet);
mpSchoolLevelValueLabel->hide(); mpSchoolLevelValueLabel->hide();
mpSchoolLevelBox->show(); mpSchoolLevelBox->show();
mpSchoolBranchValueLabel->hide(); mpSchoolSubjectsValueLabel->hide();
mpSchoolBranchBox->show(); mpSchoolSubjectsBox->show();
mpSchoolTypeValueLabel->hide(); mpSchoolTypeValueLabel->hide();
mpSchoolTypeBox->show(); mpSchoolTypeBox->show();
mpLicenceIcon->hide(); mpLicenceIcon->hide();
@ -752,84 +961,94 @@ void UBTeacherGuidePageZeroEditionWidget::switchToMode(tUBTGZeroPageMode mode)
mpLicenceBox->show(); mpLicenceBox->show();
} }
else{ else{
QString inputStyleSheet("QTextEdit { background: transparent; border: none;}");
mpModePushButton->show(); mpModePushButton->show();
mpSessionTitle->setReadOnly(true); mpSessionTitle->showText(mpSessionTitle->text());
mpAuthors->setReadOnly(true); mpSessionTitle->setStyleSheet(inputStyleSheet);
mpGoals->setReadOnly(true); updateSceneTitle();
mpKeywords->setReadOnly(true); QFont titleFont(QApplication::font().family(),14,1);
mpSessionTitle->document()->setDefaultFont(titleFont);
mpAuthors->setStyleSheet(inputStyleSheet);
mpAuthors->setTextColor(QColor(Qt::black));
mpAuthors->showText(mpAuthors->text());
mpObjectives->setStyleSheet(inputStyleSheet);
mpObjectives->setTextColor(QColor(Qt::black));
mpObjectives->showText(mpObjectives->text());
mpKeywords->setStyleSheet(inputStyleSheet);
mpKeywords->setTextColor(QColor(Qt::black));
mpKeywords->showText(mpKeywords->text());
mpSchoolLevelValueLabel->setText(mpSchoolLevelBox->currentText()); mpSchoolLevelValueLabel->setText(mpSchoolLevelBox->currentText());
mpSchoolLevelValueLabel->show(); mpSchoolLevelValueLabel->show();
mpSchoolLevelBox->hide(); mpSchoolLevelBox->hide();
mpSchoolBranchValueLabel->setText(mpSchoolBranchBox->currentText()); mpSchoolSubjectsValueLabel->setText(mpSchoolSubjectsBox->currentText());
mpSchoolBranchValueLabel->show(); mpSchoolSubjectsValueLabel->show();
mpSchoolBranchBox->hide(); mpSchoolSubjectsBox->hide();
mpSchoolTypeValueLabel->setText(mpSchoolTypeBox->currentText()); mpSchoolTypeValueLabel->setText(mpSchoolTypeBox->currentText());
mpSchoolTypeValueLabel->show(); mpSchoolTypeValueLabel->show();
mpSchoolTypeBox->hide(); mpSchoolTypeBox->hide();
mpLicenceValueLabel->setText(mpLicenceBox->currentText()); mpLicenceValueLabel->setText(mpLicenceBox->currentText());
QStringList licenceIconList; QString licenceIconPath = mpLicenceBox->itemData(mpLicenceBox->currentIndex()).toString();
licenceIconList << ":images/licenses/ccby.png" << ":images/licenses/ccbynd.png" << ":images/licenses/ccbysa.png" << ":images/licenses/ccbync.png" << ":images/licenses/ccbyncnd.png" << ":images/licenses/ccbyncsa.png"; if(!licenceIconPath.isEmpty()){
int licenceBoxCurrentIndex = mpLicenceBox->currentIndex(); mpLicenceIcon->setPixmap(QPixmap(licenceIconPath));
// -1 is return if there is no values on the box
if(licenceBoxCurrentIndex > 0 && licenceBoxCurrentIndex < licenceIconList.count()){
mpLicenceIcon->setPixmap(licenceIconList.at(licenceBoxCurrentIndex));
mpLicenceIcon->show(); mpLicenceIcon->show();
} }
mpLicenceValueLabel->show(); mpLicenceValueLabel->show();
mpLicenceBox->hide(); mpLicenceBox->hide();
persistData();
} }
update();
} }
QVector<tUBGEElementNode*> UBTeacherGuidePageZeroEditionWidget::getData() QVector<tUBGEElementNode*> UBTeacherGuidePageZeroWidget::getData()
{ {
QVector<tUBGEElementNode*>result; QVector<tUBGEElementNode*>result;
tUBGEElementNode* elementNode = new tUBGEElementNode(); tUBGEElementNode* elementNode = new tUBGEElementNode();
elementNode->type = "sessionTitle"; elementNode->name = "sessionTitle";
elementNode->attributes.insert("value",mpSessionTitle->text()); elementNode->attributes.insert("value",mpSessionTitle->text());
result << elementNode; result << elementNode;
elementNode = new tUBGEElementNode(); elementNode = new tUBGEElementNode();
elementNode->type = "authors"; elementNode->name = "authors";
elementNode->attributes.insert("value",mpAuthors->text()); elementNode->attributes.insert("value",mpAuthors->text());
result << elementNode; result << elementNode;
elementNode = new tUBGEElementNode(); elementNode = new tUBGEElementNode();
elementNode->type = "creationDate"; elementNode->name = "creationDate";
elementNode->attributes.insert("value",mpCreationLabel->text()); elementNode->attributes.insert("value",mpCreationLabel->text());
result << elementNode; result << elementNode;
elementNode = new tUBGEElementNode(); elementNode = new tUBGEElementNode();
elementNode->type = "lastModifiedDate"; elementNode->name = "lastModifiedDate";
elementNode->attributes.insert("value",mpLastModifiedLabel->text()); elementNode->attributes.insert("value",mpLastModifiedLabel->text());
result << elementNode; result << elementNode;
elementNode = new tUBGEElementNode(); elementNode = new tUBGEElementNode();
elementNode->type = "goals"; elementNode->name = "goals";
elementNode->attributes.insert("value",mpGoals->text()); elementNode->attributes.insert("value",mpObjectives->text());
result << elementNode; result << elementNode;
elementNode = new tUBGEElementNode(); elementNode = new tUBGEElementNode();
elementNode->type = "keywords"; elementNode->name = "keywords";
elementNode->attributes.insert("value",mpKeywords->text()); elementNode->attributes.insert("value",mpKeywords->text());
result << elementNode; result << elementNode;
elementNode = new tUBGEElementNode(); elementNode = new tUBGEElementNode();
elementNode->type = "schoolLevel"; elementNode->name = "schoolLevel";
elementNode->attributes.insert("value",mpSchoolLevelBox->currentText()); elementNode->attributes.insert("value",mpSchoolLevelBox->currentText());
result << elementNode; result << elementNode;
elementNode = new tUBGEElementNode(); elementNode = new tUBGEElementNode();
elementNode->type = "schoolBranch"; elementNode->name = "schoolBranch";
elementNode->attributes.insert("value",mpSchoolBranchBox->currentText()); elementNode->attributes.insert("value",mpSchoolSubjectsBox->currentText());
result << elementNode; result << elementNode;
elementNode = new tUBGEElementNode(); elementNode = new tUBGEElementNode();
elementNode->type = "schoolType"; elementNode->name = "schoolType";
elementNode->attributes.insert("value",mpSchoolTypeBox->currentText()); elementNode->attributes.insert("value",mpSchoolTypeBox->currentText());
result << elementNode; result << elementNode;
elementNode = new tUBGEElementNode(); elementNode = new tUBGEElementNode();
elementNode->type = "licence"; elementNode->name = "licence";
elementNode->attributes.insert("value",mpLicenceBox->currentText()); elementNode->attributes.insert("value",mpLicenceBox->currentText());
result << elementNode; result << elementNode;
return result; return result;
@ -839,46 +1058,59 @@ QVector<tUBGEElementNode*> UBTeacherGuidePageZeroEditionWidget::getData()
* class UBTeacherGuideWidget * * class UBTeacherGuideWidget *
***************************************************************************/ ***************************************************************************/
UBTeacherGuideWidget::UBTeacherGuideWidget(QWidget* parent, const char* name): QStackedWidget(parent) UBTeacherGuideWidget::UBTeacherGuideWidget(QWidget* parent, const char* name): QStackedWidget(parent)
, mpPageZeroEditonWidget(NULL) , mpPageZeroWidget(NULL)
, mpEditionWidget(NULL) , mpEditionWidget(NULL)
, mpPresentationWidget(NULL) , mpPresentationWidget(NULL)
{ {
setObjectName(name); setObjectName(name);
if(UBSettings::settings()->teacherGuidePageZeroActivated->get().toBool()){
mpPageZeroEditonWidget = new UBTeacherGuidePageZeroEditionWidget(this); mpPageZeroWidget = new UBTeacherGuidePageZeroWidget(this);
addWidget(mpPageZeroEditonWidget); addWidget(mpPageZeroWidget);
setCurrentWidget(mpPageZeroEditonWidget); }
// mpEditionWidget = new UBTeacherGuideEditionWidget(this); if(UBSettings::settings()->teacherGuideLessonPagesActivated->get().toBool()){
// addWidget(mpEditionWidget); mpEditionWidget = new UBTeacherGuideEditionWidget(this);
// mpPresentationWidget = new UBTeacherGuidePresentationWidget(this); addWidget(mpEditionWidget);
// addWidget(mpPresentationWidget); mpPresentationWidget = new UBTeacherGuidePresentationWidget(this);
// setCurrentWidget(mpPresentationWidget); addWidget(mpPresentationWidget);
}
connect(UBApplication::boardController->controlView(),SIGNAL(clickOnBoard()),this,SLOT(showPresentationMode())); connect(UBApplication::boardController->controlView(),SIGNAL(clickOnBoard()),this,SLOT(showPresentationMode()));
connectToStylusPalette(); connectToStylusPalette();
connect(UBApplication::boardController,SIGNAL(activeSceneChanged()),this,SLOT(onActiveSceneChanged()));
} }
UBTeacherGuideWidget::~UBTeacherGuideWidget() UBTeacherGuideWidget::~UBTeacherGuideWidget()
{ {
DELETEPTR(mpPageZeroWidget);
DELETEPTR(mpEditionWidget); DELETEPTR(mpEditionWidget);
DELETEPTR(mpPresentationWidget); DELETEPTR(mpPresentationWidget);
} }
void UBTeacherGuideWidget::onActiveSceneChanged()
{
if(UBApplication::boardController->currentPage() == 0){
setCurrentWidget(mpPageZeroWidget);
mpPageZeroWidget->switchToMode(tUBTGZeroPageMode_EDITION);
}else
setCurrentWidget(mpEditionWidget);
}
void UBTeacherGuideWidget::connectToStylusPalette() void UBTeacherGuideWidget::connectToStylusPalette()
{ {
if(UBApplication::boardController->paletteManager()) if(UBApplication::boardController->paletteManager())
connect(UBApplication::boardController->paletteManager()->stylusPalette(),SIGNAL(itemOnActionPaletteChanged()),this,SLOT(showPresentationMode())); connect(UBApplication::boardController->paletteManager()->stylusPalette(),SIGNAL(itemOnActionPaletteChanged()),this,SLOT(showPresentationMode()));
else else
QTimer::singleShot(500,this,SLOT(connectToStylusPalette())); QTimer::singleShot(100,this,SLOT(connectToStylusPalette()));
} }
void UBTeacherGuideWidget::showPresentationMode() void UBTeacherGuideWidget::showPresentationMode()
{ {
if(currentWidget()==mpPageZeroEditonWidget){ if(currentWidget()==mpPageZeroWidget){
mCurrentData = mpPageZeroEditonWidget->getData(); mCurrentData = mpPageZeroWidget->getData();
mpPageZeroEditonWidget->switchToMode(tUBTGZeroPageMode_PRESENTATION); mpPageZeroWidget->switchToMode(tUBTGZeroPageMode_PRESENTATION);
} }
else if(currentWidget()==mpEditionWidget){ else if(currentWidget()==mpEditionWidget){
mCurrentData = mpEditionWidget->getData(); mCurrentData = mpEditionWidget->getData();

@ -22,9 +22,12 @@ class QLabel;
class QVBoxLayout; class QVBoxLayout;
class QPushButton; class QPushButton;
class UBDocumentProxy; class UBDocumentProxy;
class UBGraphicsTextItem;
#include "UBTeacherGuideWidgetsTools.h" #include "UBTeacherGuideWidgetsTools.h"
#include "UBTGWidgetTreeDelegate.h"
#include "interfaces/IDataStorage.h"
typedef enum typedef enum
{ {
@ -35,7 +38,7 @@ typedef enum
/*************************************************************************** /***************************************************************************
* class UBTeacherGuideEditionWidget * * class UBTeacherGuideEditionWidget *
***************************************************************************/ ***************************************************************************/
class UBTeacherGuideEditionWidget : public QWidget class UBTeacherGuideEditionWidget : public QWidget , public IDataStorage
{ {
Q_OBJECT Q_OBJECT
public: public:
@ -44,8 +47,11 @@ public:
void cleanData(); void cleanData();
QVector<tUBGEElementNode*> getData(); QVector<tUBGEElementNode*> getData();
void load(QString element);
QVector<tIDataStorage*> save(int pageIndex);
public slots: public slots:
void onAddItemClicked(QTreeWidgetItem* widget, int column); void onAddItemClicked(QTreeWidgetItem* widget, int column, QDomElement* element = 0);
void onActiveSceneChanged(); void onActiveSceneChanged();
void showEvent(QShowEvent* event); void showEvent(QShowEvent* event);
@ -64,7 +70,9 @@ private:
UBAddItem* mpAddAnActionItem; UBAddItem* mpAddAnActionItem;
UBAddItem* mpAddAMediaItem; UBAddItem* mpAddAMediaItem;
UBAddItem* mpAddALinkItem; UBAddItem* mpAddALinkItem;
UBTGWidgetTreeDelegate* mpTreeDelegate;
private slots:
void onActiveDocumentChanged();
}; };
@ -86,6 +94,8 @@ public slots:
void onActiveSceneChanged(); void onActiveSceneChanged();
private: private:
bool eventFilter(QObject* object, QEvent* event);
void createMediaButtonItem(); void createMediaButtonItem();
UBTGAdaptableText* mpPageTitle; UBTGAdaptableText* mpPageTitle;
@ -96,22 +106,22 @@ private:
QLabel* mpPageNumberLabel; QLabel* mpPageNumberLabel;
QFrame* mpSeparator; QFrame* mpSeparator;
QPushButton* mpModePushButton; QPushButton* mpModePushButton;
QTreeWidget* mpTreeWidget; UBTGDraggableTreeItem* mpTreeWidget;
QTreeWidgetItem* mpRootWidgetItem; QTreeWidgetItem* mpRootWidgetItem;
QTreeWidgetItem* mpMediaSwitchItem; QTreeWidgetItem* mpMediaSwitchItem;
}; };
/*************************************************************************** /***************************************************************************
* class UBTeacherGuidePageZeroPresentationWidget * * class UBTeacherGuidePageZeroWidget *
***************************************************************************/ ***************************************************************************/
class UBTeacherGuidePageZeroEditionWidget : public QWidget class UBTeacherGuidePageZeroWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit UBTeacherGuidePageZeroEditionWidget(QWidget* parent, const char* name = "UBTeacherGuidePageZeroEditionWidget"); explicit UBTeacherGuidePageZeroWidget(QWidget* parent, const char* name = "UBTeacherGuidePageZeroEditionWidget");
~UBTeacherGuidePageZeroEditionWidget(); ~UBTeacherGuidePageZeroWidget();
QVector<tUBGEElementNode*> getData(); QVector<tUBGEElementNode*> getData();
@ -122,6 +132,10 @@ public slots:
private: private:
void fillComboBoxes(); void fillComboBoxes();
void loadData();
void hideEvent(QHideEvent* event);
bool eventFilter(QObject* object, QEvent* event);
void updateSceneTitle();
QVBoxLayout* mpLayout; QVBoxLayout* mpLayout;
QHBoxLayout* mpButtonTitleLayout; QHBoxLayout* mpButtonTitleLayout;
@ -136,9 +150,9 @@ private:
QLabel* mpCreationLabel; QLabel* mpCreationLabel;
QLabel* mpLastModifiedLabel; QLabel* mpLastModifiedLabel;
QLabel* mpGoalsLabel; QLabel* mpObjectivesLabel;
UBTGAdaptableText* mpGoals; UBTGAdaptableText* mpObjectives;
QFrame* mpSeparatorGoals; QFrame* mpSeparatorObjectives;
QLabel* mpIndexLabel; QLabel* mpIndexLabel;
QLabel* mpKeywordsLabel; QLabel* mpKeywordsLabel;
@ -148,9 +162,9 @@ private:
QComboBox* mpSchoolLevelBox; QComboBox* mpSchoolLevelBox;
QLabel* mpSchoolLevelValueLabel; QLabel* mpSchoolLevelValueLabel;
QLabel* mpSchoolBranchItemLabel; QLabel* mpSchoolSubjectsItemLabel;
QComboBox* mpSchoolBranchBox; QComboBox* mpSchoolSubjectsBox;
QLabel* mpSchoolBranchValueLabel; QLabel* mpSchoolSubjectsValueLabel;
QLabel* mpSchoolTypeItemLabel; QLabel* mpSchoolTypeItemLabel;
QComboBox* mpSchoolTypeBox; QComboBox* mpSchoolTypeBox;
@ -163,11 +177,14 @@ private:
QLabel* mpLicenceIcon; QLabel* mpLicenceIcon;
QHBoxLayout* mpLicenceLayout; QHBoxLayout* mpLicenceLayout;
UBGraphicsTextItem* mpSceneItemSessionTitle;
QMap<QString,QString> mGradeLevelsMap; QMap<QString,QString> mGradeLevelsMap;
QMap<QString,QStringList> mSubjects; QMap<QString,QStringList> mSubjects;
private slots: private slots:
void onSchoolLevelChanged(QString schoolLevel); void onSchoolLevelChanged(QString schoolLevel);
void persistData();
}; };
/*************************************************************************** /***************************************************************************
@ -185,13 +202,13 @@ public slots:
void changeMode(); void changeMode();
void showPresentationMode(); void showPresentationMode();
void connectToStylusPalette(); void connectToStylusPalette();
void onActiveSceneChanged();
private: private:
UBTeacherGuidePageZeroEditionWidget* mpPageZeroEditonWidget; UBTeacherGuidePageZeroWidget* mpPageZeroWidget;
UBTeacherGuideEditionWidget* mpEditionWidget; UBTeacherGuideEditionWidget* mpEditionWidget;
UBTeacherGuidePresentationWidget* mpPresentationWidget; UBTeacherGuidePresentationWidget* mpPresentationWidget;
QVector<tUBGEElementNode*>mCurrentData; QVector<tUBGEElementNode*>mCurrentData;
}; };
#endif // UBTEACHERGUIDEWIDGET_H #endif // UBTEACHERGUIDEWIDGET_H

@ -21,12 +21,16 @@
#include <QDebug> #include <QDebug>
#include <QUrl> #include <QUrl>
#include <QWebSettings> #include <QWebSettings>
#include <QDomElement>
#include <QDomDocument>
#include <QApplication> #include <QApplication>
#include "UBTeacherGuideWidgetsTools.h" #include "UBTeacherGuideWidgetsTools.h"
#include "UBTGWidgetTreeDelegate.h"
#include "core/UBPersistenceManager.h"
#include "core/UBApplication.h"
#include "board/UBBoardController.h"
#include "domain/UBW3CWidget.h"
#include "globals/UBGlobals.h" #include "globals/UBGlobals.h"
@ -77,8 +81,8 @@ UBTGActionWidget::UBTGActionWidget(QTreeWidgetItem* widget, QWidget* parent, con
mpTask->setAcceptRichText(true); mpTask->setAcceptRichText(true);
mpTask->setTextColor(QColor().green()); mpTask->setTextColor(QColor().green());
mpTask->setObjectName("ActionWidgetTaskTextEdit"); mpTask->setObjectName("ActionWidgetTaskTextEdit");
mpLayout->addWidget(mpOwner,0); mpLayout->addWidget(mpOwner);
mpLayout->addWidget(mpTask,1); mpLayout->addWidget(mpTask);
} }
UBTGActionWidget::~UBTGActionWidget() UBTGActionWidget::~UBTGActionWidget()
@ -88,10 +92,16 @@ UBTGActionWidget::~UBTGActionWidget()
DELETEPTR(mpLayout); DELETEPTR(mpLayout);
} }
void UBTGActionWidget::initializeWithDom(QDomElement element)
{
mpOwner->setCurrentIndex(element.attribute("owner").toInt());
mpTask->setInitialText(element.attribute("task"));
}
tUBGEElementNode* UBTGActionWidget::saveData() tUBGEElementNode* UBTGActionWidget::saveData()
{ {
tUBGEElementNode* result = new tUBGEElementNode(); tUBGEElementNode* result = new tUBGEElementNode();
result->type = "action"; result->name = "action";
result->attributes.insert("owner",QString("%0").arg(mpOwner->currentIndex())); result->attributes.insert("owner",QString("%0").arg(mpOwner->currentIndex()));
result->attributes.insert("task",mpTask->text()); result->attributes.insert("task",mpTask->text());
return result; return result;
@ -103,16 +113,18 @@ tUBGEElementNode* UBTGActionWidget::saveData()
UBTGAdaptableText::UBTGAdaptableText(QTreeWidgetItem* widget, QWidget* parent, const char* name):QTextEdit(parent) UBTGAdaptableText::UBTGAdaptableText(QTreeWidgetItem* widget, QWidget* parent, const char* name):QTextEdit(parent)
, mBottomMargin(5) , mBottomMargin(5)
, mpTreeWidgetItem(widget) , mpTreeWidgetItem(widget)
, mMinimumHeight(20) , mMinimumHeight(0)
, mHasPlaceHolder(false) , mHasPlaceHolder(false)
, mIsUpdatingSize(false) , mIsUpdatingSize(false)
{ {
setObjectName(name); setObjectName(name);
setStyleSheet( "QWidget {background: white; border:1 solid #999999; border-radius : 10px; padding: 2px;}");
connect(this,SIGNAL(textChanged()),this,SLOT(onTextChanged())); connect(this,SIGNAL(textChanged()),this,SLOT(onTextChanged()));
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
mMinimumHeight = document()->size().height() + mBottomMargin;
setMinimumHeight(mMinimumHeight); setMinimumHeight(mMinimumHeight);
} }
void UBTGAdaptableText::setPlaceHolderText(QString text) void UBTGAdaptableText::setPlaceHolderText(QString text)
@ -128,10 +140,17 @@ void UBTGAdaptableText::setPlaceHolderText(QString text)
void UBTGAdaptableText::keyPressEvent(QKeyEvent* e) void UBTGAdaptableText::keyPressEvent(QKeyEvent* e)
{ {
if(isReadOnly()){
// this is important if you set a placeholder. In this case even if the text field is readonly the
// keypressed event came here. So if you don't ignore it you'll have a flick on the text zone
e->ignore();
return;
}
if(toPlainText() == mPlaceHolderText){ if(toPlainText() == mPlaceHolderText){
setTextColor(QColor(Qt::black));
setPlainText(""); setPlainText("");
} }
setTextColor(QColor(Qt::black));
QTextEdit::keyPressEvent(e); QTextEdit::keyPressEvent(e);
} }
@ -150,6 +169,8 @@ void UBTGAdaptableText::showEvent(QShowEvent* e)
Q_UNUSED(e); Q_UNUSED(e);
if(!mIsUpdatingSize && mHasPlaceHolder && toPlainText().isEmpty()) if(!mIsUpdatingSize && mHasPlaceHolder && toPlainText().isEmpty())
setPlainText(mPlaceHolderText); setPlainText(mPlaceHolderText);
else
onTextChanged();
} }
QString UBTGAdaptableText::text() QString UBTGAdaptableText::text()
@ -163,31 +184,39 @@ QString UBTGAdaptableText::text()
void UBTGAdaptableText::onTextChanged() void UBTGAdaptableText::onTextChanged()
{ {
qreal documentSize = document()->size().height();
if(height() == documentSize + mBottomMargin)
return;
mIsUpdatingSize = true; mIsUpdatingSize = true;
if(document()->size().height() < mMinimumHeight)
if(documentSize < mMinimumHeight)
setFixedHeight(mMinimumHeight); setFixedHeight(mMinimumHeight);
else else
setFixedHeight(document()->size().height()+mBottomMargin); setFixedHeight(documentSize+mBottomMargin);
updateGeometry(); updateGeometry();
//to trig the widget item to resize it //to trig a resize on the tree widget item
if(mpTreeWidgetItem){ if(mpTreeWidgetItem){
mpTreeWidgetItem->setExpanded(false); mpTreeWidgetItem->setDisabled(true);
mpTreeWidgetItem->setExpanded(true); mpTreeWidgetItem->setExpanded(true);
mpTreeWidgetItem->setDisabled(false);
setFocus(); setFocus();
} }
mIsUpdatingSize = false; mIsUpdatingSize = false;
} }
void UBTGAdaptableText::setInitialText(const QString& text)
{
setText(text);
setReadOnly(false);
onTextChanged();
}
void UBTGAdaptableText::showText(const QString & text) void UBTGAdaptableText::showText(const QString & text)
{ {
setText(text); setText(text);
//A first rendering has to be done to calculate the text's size.
show();
hide();
setReadOnly(true); setReadOnly(true);
onTextChanged(); onTextChanged();
if(isHidden())
show();
} }
void UBTGAdaptableText::bottomMargin(int newValue) void UBTGAdaptableText::bottomMargin(int newValue)
@ -196,10 +225,49 @@ void UBTGAdaptableText::bottomMargin(int newValue)
onTextChanged(); onTextChanged();
} }
void UBTGAdaptableText::resizeEvent(QResizeEvent* e)
/***************************************************************************
* class UBTGDraggableWeb *
***************************************************************************/
UBDraggableWeb::UBDraggableWeb(QString& relativePath, QWidget* parent): QWebView(parent)
, mRelativePath(relativePath)
, mDragStartPosition(QPoint(-1,-1))
, mDragStarted(false)
{
//NOOP
}
void UBDraggableWeb::mousePressEvent(QMouseEvent* event)
{ {
QTextEdit::resizeEvent(e); mDragStartPosition = event->pos();
QTimer::singleShot(100,this,SLOT(onTextChanged())); mDragStarted = true;
QWebView::mousePressEvent(event);
}
void UBDraggableWeb::mouseReleaseEvent(QMouseEvent* event)
{
mDragStarted = false;
QWebView::mouseReleaseEvent(event);
}
void UBDraggableWeb::mouseMoveEvent(QMouseEvent* event)
{
if(mDragStarted && (event->pos() - mDragStartPosition).manhattanLength() > QApplication::startDragDistance()){
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
QList<QUrl> urlList;
urlList << QUrl(mRelativePath);
mimeData->setUrls(urlList);
drag->setMimeData(mimeData);
drag->exec();
event->accept();
mDragStarted = false;
}
else
QWebView::mouseMoveEvent(event);
} }
/*************************************************************************** /***************************************************************************
@ -214,8 +282,9 @@ UBTGMediaWidget::UBTGMediaWidget(QTreeWidgetItem* widget, QWidget* parent,const
, mpMediaLabelWidget(NULL) , mpMediaLabelWidget(NULL)
, mpMediaWidget(NULL) , mpMediaWidget(NULL)
, mpWebView(NULL) , mpWebView(NULL)
, mRelativePath(QString("")) , mMediaPath(QString(""))
, mIsPresentationMode(false) , mIsPresentationMode(false)
, mIsInitializationMode(false)
{ {
setObjectName(name); setObjectName(name);
mpDropMeWidget = new QLabel(); mpDropMeWidget = new QLabel();
@ -225,10 +294,10 @@ UBTGMediaWidget::UBTGMediaWidget(QTreeWidgetItem* widget, QWidget* parent,const
setAcceptDrops(true); setAcceptDrops(true);
addWidget(mpDropMeWidget); addWidget(mpDropMeWidget);
setMinimumHeight(200); setMinimumHeight(250);
} }
UBTGMediaWidget::UBTGMediaWidget(QString relativePath, QTreeWidgetItem* widget, QWidget* parent,const char* name): QStackedWidget(parent) UBTGMediaWidget::UBTGMediaWidget(QString mediaPath, QTreeWidgetItem* widget, QWidget* parent,const char* name): QStackedWidget(parent)
, mpTreeWidgetItem(widget) , mpTreeWidgetItem(widget)
, mpDropMeWidget(NULL) , mpDropMeWidget(NULL)
, mpWorkWidget(NULL) , mpWorkWidget(NULL)
@ -237,14 +306,15 @@ UBTGMediaWidget::UBTGMediaWidget(QString relativePath, QTreeWidgetItem* widget,
, mpMediaLabelWidget(NULL) , mpMediaLabelWidget(NULL)
, mpMediaWidget(NULL) , mpMediaWidget(NULL)
, mpWebView(NULL) , mpWebView(NULL)
, mRelativePath(relativePath)
, mIsPresentationMode(true) , mIsPresentationMode(true)
, mMediaType("") , mMediaType("")
, mIsInitializationMode(false)
{ {
setObjectName(name); setObjectName(name);
mMediaPath = UBApplication::boardController->activeDocument()->persistencePath()+ "/" + mediaPath;
setAcceptDrops(false); setAcceptDrops(false);
createWorkWidget(mRelativePath); createWorkWidget();
setMinimumHeight(200); setFixedHeight(200);
} }
UBTGMediaWidget::~UBTGMediaWidget() UBTGMediaWidget::~UBTGMediaWidget()
@ -261,14 +331,50 @@ UBTGMediaWidget::~UBTGMediaWidget()
DELETEPTR(mpWorkWidget); DELETEPTR(mpWorkWidget);
} }
void UBTGMediaWidget::initializeWithDom(QDomElement element)
{
mIsInitializationMode = true;
setAcceptDrops(false);
mMediaPath = UBApplication::boardController->activeDocument()->persistencePath() + "/" + element.attribute("relativePath");
createWorkWidget();
setFixedHeight(200);
mpTitle->setInitialText(element.attribute("title"));
mIsInitializationMode = false;
}
void UBTGMediaWidget::removeSource()
{
QFileInfo fileInfo(mMediaPath);
if(fileInfo.isFile())
QFile(mMediaPath).remove();
else
UBFileSystemUtils::deleteDir(mMediaPath);
}
void UBTGMediaWidget::hideEvent(QHideEvent* event)
{
if(mpWebView)
mpWebView->page()->mainFrame()->setContent(UBW3CWidget::freezedWidgetPage().toAscii());
QWidget::hideEvent(event);
}
void UBTGMediaWidget::showEvent(QShowEvent* event)
{
QWidget::showEvent(event);
if(mpWebView)
mpWebView->load(QUrl(mMediaPath + "/index.htm"));
}
tUBGEElementNode* UBTGMediaWidget::saveData() tUBGEElementNode* UBTGMediaWidget::saveData()
{ {
if(!mpTitle) if(!mpTitle)
return 0; return 0;
tUBGEElementNode* result = new tUBGEElementNode(); tUBGEElementNode* result = new tUBGEElementNode();
result->type = "media"; QString relativePath = mMediaPath;
relativePath = relativePath.replace(UBApplication::boardController->activeDocument()->persistencePath()+"/","");
result->name = "media";
result->attributes.insert("title",mpTitle->text()); result->attributes.insert("title",mpTitle->text());
result->attributes.insert("relativePath",mRelativePath); result->attributes.insert("relativePath",relativePath);
result->attributes.insert("mediaType",mMediaType); result->attributes.insert("mediaType",mMediaType);
return result; return result;
} }
@ -278,27 +384,40 @@ void UBTGMediaWidget::dragEnterEvent(QDragEnterEvent *event)
event->accept(); event->accept();
} }
void UBTGMediaWidget::createWorkWidget(QString& path) void UBTGMediaWidget::createWorkWidget()
{ {
QString mimeType = UBFileSystemUtils::mimeTypeFromFileName(path); QString mimeType = UBFileSystemUtils::mimeTypeFromFileName(mMediaPath);
qDebug() << mimeType;
bool setMedia = true; bool setMedia = true;
UBDocumentProxy* proxyDocument = UBApplication::boardController->activeDocument();
if(mimeType.contains("audio") || mimeType.contains("video")){ if(mimeType.contains("audio") || mimeType.contains("video")){
mMediaType = mimeType.contains("audio")? "audio":"movie"; mMediaType = mimeType.contains("audio")? "audio":"movie";
mpMediaWidget = new UBMediaWidget(mimeType.contains("audio")?eMediaType_Audio:eMediaType_Video); mpMediaWidget = new UBMediaWidget(mimeType.contains("audio")?eMediaType_Audio:eMediaType_Video);
mpMediaWidget->setFile(path); if(mIsPresentationMode || mIsInitializationMode){
mpMediaWidget->setFile(mMediaPath);
}
else{
mMediaPath = UBPersistenceManager::persistenceManager()->addObjectToTeacherGuideDirectory(proxyDocument, mMediaPath);
mpMediaWidget->setFile(mMediaPath);
}
} }
else if(mimeType.contains("image")){ else if(mimeType.contains("image")){
mMediaType = "image"; mMediaType = "image";
if(!(mIsPresentationMode || mIsInitializationMode))
mMediaPath = UBPersistenceManager::persistenceManager()->addObjectToTeacherGuideDirectory(proxyDocument, mMediaPath);
mpMediaLabelWidget = new QLabel(); mpMediaLabelWidget = new QLabel();
QPixmap pixmap = QPixmap(QUrl(path).toLocalFile()); QPixmap pixmap = QPixmap(mMediaPath);
pixmap = pixmap.scaledToWidth(mpTreeWidgetItem->treeWidget()->size().width()); pixmap = pixmap.scaledToWidth(mpTreeWidgetItem->treeWidget()->size().width());
mpMediaLabelWidget->setPixmap(pixmap); mpMediaLabelWidget->setPixmap(pixmap);
mpMediaLabelWidget->setScaledContents(true); mpMediaLabelWidget->setScaledContents(true);
} }
else if(mimeType.contains("application")){ else if(mimeType.contains("application")){
mMediaType = "w3c"; mMediaType = "w3c";
mpWebView = new QWebView(0); if(!(mIsPresentationMode || mIsInitializationMode)){
QDir baseW3CDirectory(UBPersistenceManager::persistenceManager()->teacherGuideAbsoluteObjectPath(proxyDocument));
mMediaPath = UBW3CWidget::createNPAPIWrapperInDir(mMediaPath,baseW3CDirectory,mimeType,QSize(100,100),QUuid::createUuid());
}
mpWebView = new UBDraggableWeb(mMediaPath);
mpWebView->setAcceptDrops(false); mpWebView->setAcceptDrops(false);
mpWebView->settings()->setAttribute(QWebSettings::JavaEnabled, true); mpWebView->settings()->setAttribute(QWebSettings::JavaEnabled, true);
mpWebView->settings()->setAttribute(QWebSettings::PluginsEnabled, true); mpWebView->settings()->setAttribute(QWebSettings::PluginsEnabled, true);
@ -307,8 +426,8 @@ void UBTGMediaWidget::createWorkWidget(QString& path)
mpWebView->settings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true); mpWebView->settings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true);
mpWebView->settings()->setAttribute(QWebSettings::JavascriptCanAccessClipboard, true); mpWebView->settings()->setAttribute(QWebSettings::JavascriptCanAccessClipboard, true);
mpWebView->settings()->setAttribute(QWebSettings::DnsPrefetchEnabled, true); mpWebView->settings()->setAttribute(QWebSettings::DnsPrefetchEnabled, true);
mpWebView->load(QUrl(path));
mpWebView->show(); mpWebView->load(QUrl(mMediaPath+"/index.htm"));
} }
else{ else{
qDebug() << "createWorkWidget mime type not handled" << mimeType; qDebug() << "createWorkWidget mime type not handled" << mimeType;
@ -316,45 +435,44 @@ void UBTGMediaWidget::createWorkWidget(QString& path)
} }
if(setMedia){ if(setMedia){
mRelativePath = path;
setAcceptDrops(false); setAcceptDrops(false);
mpWorkWidget = new QWidget(this); mpWorkWidget = new QWidget(this);
mpLayout = new QVBoxLayout(mpWorkWidget); mpLayout = new QVBoxLayout(mpWorkWidget);
if(!mIsPresentationMode){ if(!mIsPresentationMode){
mpTitle = new UBTGAdaptableText(mpTreeWidgetItem,mpWorkWidget); mpTitle = new UBTGAdaptableText(mpTreeWidgetItem,mpWorkWidget);
mpTitle->setPlaceHolderText(tr("Type title here...")); mpTitle->setPlaceHolderText(tr("Type title here..."));
mpLayout->addWidget(mpTitle,1); mpLayout->addWidget(mpTitle);
} }
if(mpMediaLabelWidget){ if(mpMediaLabelWidget){
mpMediaLabelWidget->setMaximumHeight(width());
mpMediaLabelWidget->setParent(mpWorkWidget); mpMediaLabelWidget->setParent(mpWorkWidget);
mpLayout->addWidget(mpMediaLabelWidget); mpLayout->addWidget(mpMediaLabelWidget);
} }
else if (mpMediaWidget){ else if (mpMediaWidget){
mpMediaWidget->setMaximumHeight(mpTreeWidgetItem->treeWidget()->size().width()); mpMediaWidget->setMaximumHeight(width());
mpMediaWidget->setParent(mpWorkWidget); mpMediaWidget->setParent(mpWorkWidget);
mpLayout->addWidget(mpMediaWidget); mpLayout->addWidget(mpMediaWidget);
} }
else if (mpWebView){ else if (mpWebView){
mpWebView->setMaximumHeight(mpTreeWidgetItem->treeWidget()->size().width()); mpWebView->setMaximumHeight(width());
mpWebView->setParent(mpWorkWidget); mpWebView->setParent(mpWorkWidget);
mpLayout->addWidget(mpWebView); mpLayout->addWidget(mpWebView);
mpWebView->show();
} }
mpWorkWidget->setLayout(mpLayout); mpWorkWidget->setLayout(mpLayout);
addWidget(mpWorkWidget); addWidget(mpWorkWidget);
setCurrentWidget(mpWorkWidget); setCurrentWidget(mpWorkWidget);
updateSize();
} }
} }
void UBTGMediaWidget::parseMimeData(const QMimeData* pMimeData) void UBTGMediaWidget::parseMimeData(const QMimeData* pMimeData)
{ {
QString path;
if(pMimeData){ if(pMimeData){
if(pMimeData->hasText()){ if(pMimeData->hasText()){
path = QUrl::fromLocalFile(pMimeData->text()).toString(); mMediaPath = QUrl::fromLocalFile(pMimeData->text()).toString();
} }
else if(pMimeData->hasUrls()){ else if(pMimeData->hasUrls()){
path = pMimeData->urls().at(0).toString(); mMediaPath = pMimeData->urls().at(0).toString();
} }
else if(pMimeData->hasImage()){ else if(pMimeData->hasImage()){
qDebug() << "Not yet implemented"; qDebug() << "Not yet implemented";
@ -363,7 +481,7 @@ void UBTGMediaWidget::parseMimeData(const QMimeData* pMimeData)
else else
qDebug() << "No mime data present"; qDebug() << "No mime data present";
createWorkWidget(path); createWorkWidget();
} }
void UBTGMediaWidget::dropEvent(QDropEvent* event) void UBTGMediaWidget::dropEvent(QDropEvent* event)
@ -379,9 +497,9 @@ void UBTGMediaWidget::mousePressEvent(QMouseEvent *event)
else{ else{
QDrag *drag = new QDrag(this); QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData; QMimeData *mimeData = new QMimeData();
QList<QUrl> urlList; QList<QUrl> urlList;
urlList << QUrl(mRelativePath); urlList << QUrl(mMediaPath);
mimeData->setUrls(urlList); mimeData->setUrls(urlList);
drag->setMimeData(mimeData); drag->setMimeData(mimeData);
@ -390,18 +508,8 @@ void UBTGMediaWidget::mousePressEvent(QMouseEvent *event)
} }
} }
void UBTGMediaWidget::updateSize()
{
if(mpTreeWidgetItem){
mpTreeWidgetItem->setExpanded(false);
mpTreeWidgetItem->setExpanded(true);
if(!mIsPresentationMode)
mpTitle->setFocus();
}
}
/*************************************************************************** /***************************************************************************
* class UBTGUrlWdiget * * class UBTGUrlWidget *
***************************************************************************/ ***************************************************************************/
UBTGUrlWidget::UBTGUrlWidget(QWidget* parent, const char* name ):QWidget(parent) UBTGUrlWidget::UBTGUrlWidget(QWidget* parent, const char* name ):QWidget(parent)
, mpLayout(NULL) , mpLayout(NULL)
@ -428,11 +536,35 @@ UBTGUrlWidget::~UBTGUrlWidget()
DELETEPTR(mpLayout); DELETEPTR(mpLayout);
} }
void UBTGUrlWidget::initializeWithDom(QDomElement element)
{
mpTitle->setText(element.attribute("title"));
mpUrl->setText(element.attribute("url"));
}
tUBGEElementNode* UBTGUrlWidget::saveData() tUBGEElementNode* UBTGUrlWidget::saveData()
{ {
tUBGEElementNode* result = new tUBGEElementNode(); tUBGEElementNode* result = new tUBGEElementNode();
result->type = "link"; result->name = "link";
result->attributes.insert("title",mpTitle->text()); result->attributes.insert("title",mpTitle->text());
result->attributes.insert("url",mpUrl->text()); result->attributes.insert("url",mpUrl->text());
return result; return result;
} }
/***************************************************************************
* class UBTGDraggableTreeItem *
***************************************************************************/
UBTGDraggableTreeItem::UBTGDraggableTreeItem(QWidget* parent, const char* name) : QTreeWidget(parent)
{
setObjectName(name);
}
QMimeData* UBTGDraggableTreeItem::mimeData(const QList<QTreeWidgetItem *> items) const
{
QMimeData* result = new QMimeData();
QList<QUrl> urls;
urls << QUrl(items.at(0)->data(0,TG_USER_ROLE_MIME_TYPE).toString());
result->setUrls(urls);
return result;
}

@ -29,6 +29,9 @@
#include "customWidgets/UBMediaWidget.h" #include "customWidgets/UBMediaWidget.h"
#define TG_USER_ROLE_MIME_TYPE (Qt::UserRole+50)
class QTreeWidget; class QTreeWidget;
class QVBoxLayout; class QVBoxLayout;
class QComboBox; class QComboBox;
@ -39,12 +42,12 @@ class QDomElement;
typedef struct typedef struct
{ {
QString type; QString name;
QMap<QString,QString> attributes; QMap<QString,QString> attributes;
}tUBGEElementNode; }tUBGEElementNode;
class iUBTGSavableData class iUBTGSaveData
{ {
public: public:
virtual tUBGEElementNode* saveData() = 0; virtual tUBGEElementNode* saveData() = 0;
@ -62,7 +65,7 @@ signals:
public slots: public slots:
}; };
class UBTGActionWidget : public QWidget, public iUBTGSavableData class UBTGActionWidget : public QWidget, public iUBTGSaveData
{ {
Q_OBJECT Q_OBJECT
@ -71,6 +74,7 @@ public:
~UBTGActionWidget(); ~UBTGActionWidget();
void update(); void update();
tUBGEElementNode* saveData(); tUBGEElementNode* saveData();
void initializeWithDom(QDomElement element);
private: private:
QVBoxLayout* mpLayout; QVBoxLayout* mpLayout;
@ -91,6 +95,7 @@ public:
void bottomMargin(int newValue); void bottomMargin(int newValue);
void setPlaceHolderText(QString text); void setPlaceHolderText(QString text);
QString text(); QString text();
void setInitialText(const QString& text);
public slots: public slots:
void onTextChanged(); void onTextChanged();
@ -99,7 +104,6 @@ protected:
void keyPressEvent(QKeyEvent* e); void keyPressEvent(QKeyEvent* e);
void keyReleaseEvent(QKeyEvent* e); void keyReleaseEvent(QKeyEvent* e);
void showEvent(QShowEvent* e); void showEvent(QShowEvent* e);
void resizeEvent(QResizeEvent* e);
private: private:
int mBottomMargin; int mBottomMargin;
@ -111,23 +115,43 @@ private:
}; };
class UBTGMediaWidget : public QStackedWidget , public iUBTGSavableData class UBDraggableWeb : public QWebView
{
Q_OBJECT
public:
explicit UBDraggableWeb(QString& relativePath, QWidget* parent = 0);
private:
void mousePressEvent(QMouseEvent* event);
void mouseMoveEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event);
QString mRelativePath;
QPoint mDragStartPosition;
bool mDragStarted;
};
class UBTGMediaWidget : public QStackedWidget , public iUBTGSaveData
{ {
Q_OBJECT Q_OBJECT
public: public:
UBTGMediaWidget(QTreeWidgetItem* widget = 0, QWidget* parent = 0, const char* name = "UBTGMediaWidget"); UBTGMediaWidget(QTreeWidgetItem* widget = 0, QWidget* parent = 0, const char* name = "UBTGMediaWidget");
UBTGMediaWidget(QString relativePath, QTreeWidgetItem* widget = 0, QWidget* parent = 0, const char* name = "UBTGMediaWidget"); UBTGMediaWidget(QString mediaPath, QTreeWidgetItem* widget = 0, QWidget* parent = 0, const char* name = "UBTGMediaWidget");
~UBTGMediaWidget(); ~UBTGMediaWidget();
tUBGEElementNode* saveData(); tUBGEElementNode* saveData();
void initializeWithDom(QDomElement element);
void removeSource();
protected: protected:
void dragEnterEvent(QDragEnterEvent* event); void dragEnterEvent(QDragEnterEvent* event);
void dropEvent(QDropEvent* event); void dropEvent(QDropEvent* event);
void mousePressEvent(QMouseEvent* event); void mousePressEvent(QMouseEvent* event);
void hideEvent(QHideEvent* event);
void showEvent(QShowEvent* event);
private: private:
void parseMimeData(const QMimeData* pMimeData); void parseMimeData(const QMimeData* pMimeData);
void createWorkWidget(QString& path); void createWorkWidget();
void updateSize(); void updateSize();
QTreeWidgetItem* mpTreeWidgetItem; QTreeWidgetItem* mpTreeWidgetItem;
@ -137,25 +161,36 @@ private:
UBTGAdaptableText* mpTitle; UBTGAdaptableText* mpTitle;
QLabel* mpMediaLabelWidget; QLabel* mpMediaLabelWidget;
UBMediaWidget* mpMediaWidget; UBMediaWidget* mpMediaWidget;
QWebView* mpWebView; UBDraggableWeb* mpWebView;
QString mRelativePath; QString mMediaPath;
bool mIsPresentationMode; bool mIsPresentationMode;
QString mMediaType; QString mMediaType;
bool mIsInitializationMode;
}; };
class UBTGUrlWidget : public QWidget , public iUBTGSavableData class UBTGUrlWidget : public QWidget , public iUBTGSaveData
{ {
Q_OBJECT Q_OBJECT
public: public:
UBTGUrlWidget(QWidget* parent = 0, const char* name = "UBTGUrlWidget"); UBTGUrlWidget(QWidget* parent = 0, const char* name = "UBTGUrlWidget");
~UBTGUrlWidget(); ~UBTGUrlWidget();
tUBGEElementNode* saveData(); tUBGEElementNode* saveData();
void initializeWithDom(QDomElement element);
private: private:
QVBoxLayout* mpLayout; QVBoxLayout* mpLayout;
QLineEdit* mpTitle; QLineEdit* mpTitle;
QLineEdit* mpUrl; QLineEdit* mpUrl;
}; };
class UBTGDraggableTreeItem : public QTreeWidget
{
Q_OBJECT
public:
UBTGDraggableTreeItem(QWidget* parent = 0, const char* name = "UBTGDraggableTreeItem");
private:
QMimeData* mimeData(const QList<QTreeWidgetItem *> items) const;
};
#endif // UBTEACHERGUIDEWIDGETSTOOLS_H #endif // UBTEACHERGUIDEWIDGETSTOOLS_H

@ -18,6 +18,8 @@
#include "UBThumbnailWidget.h" #include "UBThumbnailWidget.h"
#include "UBRubberBand.h" #include "UBRubberBand.h"
#include "board/UBBoardController.h"
#include "core/UBSettings.h" #include "core/UBSettings.h"
#include "core/UBApplication.h" #include "core/UBApplication.h"
@ -354,7 +356,7 @@ void UBThumbnailWidget::mouseMoveEvent(QMouseEvent *event)
// for vertical moving // for vertical moving
QSet<QGraphicsItem*> incSelectedItemsY = scene()->items(incrementYSelection, Qt::IntersectsItemBoundingRect).toSet(); QSet<QGraphicsItem*> incSelectedItemsY = scene()->items(incrementYSelection, Qt::IntersectsItemBoundingRect).toSet();
foreach (QGraphicsItem *lassoSelectedItem, incSelectedItemsY) foreach (QGraphicsItem *lassoSelectedItem, incSelectedItemsY)
{ {
if (lassoSelectedItem) if (lassoSelectedItem)
@ -389,7 +391,7 @@ void UBThumbnailWidget::mouseMoveEvent(QMouseEvent *event)
{ {
item->setSelected(false); item->setSelected(false);
} }
mSelectedThumbnailItems += lassoSelectedThumbnailItems; mSelectedThumbnailItems += lassoSelectedThumbnailItems;
mPrevLassoRect = lassoRect; mPrevLassoRect = lassoRect;
@ -749,8 +751,10 @@ UBSceneThumbnailNavigPixmap::UBSceneThumbnailNavigPixmap(const QPixmap& pix, UBD
, bCanMoveUp(false) , bCanMoveUp(false)
, bCanMoveDown(false) , bCanMoveDown(false)
{ {
setAcceptsHoverEvents(true); if(UBApplication::boardController->pageFromSceneIndex(pSceneIndex)){
setFlag(QGraphicsItem::ItemIsSelectable, true); setAcceptsHoverEvents(true);
setFlag(QGraphicsItem::ItemIsSelectable, true);
}
} }
UBSceneThumbnailNavigPixmap::~UBSceneThumbnailNavigPixmap() UBSceneThumbnailNavigPixmap::~UBSceneThumbnailNavigPixmap()
@ -822,7 +826,7 @@ void UBSceneThumbnailNavigPixmap::updateButtonsState()
bCanMoveDown = false; bCanMoveDown = false;
UBDocumentProxy* p = proxy(); UBDocumentProxy* p = proxy();
if(NULL != p) if(NULL != p && UBApplication::boardController->pageFromSceneIndex(sceneIndex()))
{ {
int iNbPages = p->pageCount(); int iNbPages = p->pageCount();
if(1 < iNbPages) if(1 < iNbPages)
@ -838,6 +842,8 @@ void UBSceneThumbnailNavigPixmap::updateButtonsState()
} }
} }
} }
if(UBSettings::settings()->teacherGuidePageZeroActivated and sceneIndex()<=1)
bCanMoveUp = false;
if(bCanDelete || bCanMoveUp || bCanMoveDown) if(bCanDelete || bCanMoveUp || bCanMoveDown)
{ {

@ -50,9 +50,7 @@ HEADERS += src/gui/UBThumbnailView.h \
src/gui/UBFeaturesActionBar.h \ src/gui/UBFeaturesActionBar.h \
src/gui/UBDockTeacherGuideWidget.h \ src/gui/UBDockTeacherGuideWidget.h \
src/gui/UBTeacherGuideWidget.h \ src/gui/UBTeacherGuideWidget.h \
src/gui/UBTeacherGuideWidgetsTools.h \ src/gui/UBTeacherGuideWidgetsTools.h
src/gui/UBTeacherGuideDelegate.h \
src/gui/UBTGWidgetTreeDelegate.h
SOURCES += src/gui/UBThumbnailView.cpp \ SOURCES += src/gui/UBThumbnailView.cpp \
src/gui/UBFloatingPalette.cpp \ src/gui/UBFloatingPalette.cpp \
@ -105,9 +103,7 @@ SOURCES += src/gui/UBThumbnailView.cpp \
src/gui/UBFeaturesActionBar.cpp \ src/gui/UBFeaturesActionBar.cpp \
src/gui/UBDockTeacherGuideWidget.cpp \ src/gui/UBDockTeacherGuideWidget.cpp \
src/gui/UBTeacherGuideWidget.cpp \ src/gui/UBTeacherGuideWidget.cpp \
src/gui/UBTeacherGuideWidgetsTools.cpp \ src/gui/UBTeacherGuideWidgetsTools.cpp
src/gui/UBTeacherGuideDelegate.cpp \
src/gui/UBTGWidgetTreeDelegate.cpp
win32 { win32 {

@ -13,28 +13,30 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef UBSOFTWAREUPDATE_H_ #ifndef IDATASTORAGE_H
#define UBSOFTWAREUPDATE_H_ #define IDATASTORAGE_H
#include <QtCore> #include <QString>
#include <QMap>
#include "frameworks/UBVersion.h" typedef enum
class UBSoftwareUpdate
{ {
public: eElementType_START,
UBSoftwareUpdate(); eElementType_END,
UBSoftwareUpdate(UBVersion& version, const QString &downloadUrl); eElementType_UNIQUE
virtual ~UBSoftwareUpdate(); }eElementType;
UBVersion version() const;
QString downloadUrl() const;
bool operator==(const UBSoftwareUpdate &other) const; typedef struct
{
QString name;
QMap<QString,QString> attributes;
eElementType type;
}tIDataStorage;
private: class IDataStorage
UBVersion mVersion; {
QString mDownloadUrl; public:
//virtual void load(QString element) = 0;
virtual QVector<tIDataStorage*>save(int pageIndex) = 0 ;
}; };
#endif // IDATASTORAGE_H
#endif // UBSOFTWAREUPDATE_H_

@ -1,21 +0,0 @@
#ifndef IDROPABLE_H
#define IDROPABLE_H
#include <QDropEvent>
#include <QDragEnterEvent>
#include <QDragLeaveEvent>
#include <QDragMoveEvent>
class IDropable
{
public:
virtual ~IDropable(){}
protected:
virtual void dropEvent(QDropEvent* pEvent) = 0;
virtual void dragEnterEvent(QDragEnterEvent* pEvent) = 0;
virtual void dragMoveEvent(QDragMoveEvent* pEvent) = 0;
virtual void dragLeaveEvent(QDragLeaveEvent* pEvent) = 0;
};
#endif // IDROPABLE_H

@ -1,15 +0,0 @@
#ifndef IRESIZEABLE_H
#define IRESIZEABLE_H
#include <QResizeEvent>
class IResizeable
{
public:
~IResizeable();
protected:
virtual void resizeEvent(QResizeEvent* pEvent) = 0;
};
#endif // IRESIZEABLE_H

@ -1,3 +1,2 @@
HEADERS += src/interfaces/IDropable.h \ HEADERS += \
src/interfaces/IDropable.h \ src/interfaces/IDataStorage.h
src/interfaces/IResizeable.h

@ -1,142 +0,0 @@
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "frameworks/UBVersion.h"
#include "UBRssHandler.h"
#include "UBSoftwareUpdate.h"
#include "core/memcheck.h"
const QString UBRssHandler::sRssItemElementName = "item";
const QString UBRssHandler::sRssLinkElementName = "link";
const QString UBRssHandler::sUniboardVersionElementName = "ub:version"; // TODO UB 4.x map properly ub namespace
UBRssHandler::UBRssHandler()
: mRssTagParsed(false)
, mInItem(false)
, mInVersion(false)
{
// NOOP
}
UBRssHandler::~UBRssHandler(void)
{
while (!mSoftwareUpdates.isEmpty())
{
delete mSoftwareUpdates.takeFirst();
}
}
bool UBRssHandler::startElement(
const QString & /* namespaceURI */,
const QString & /* localName */,
const QString &qualifiedName,
const QXmlAttributes &attributes)
{
bool ok = true;
if (!mRssTagParsed && qualifiedName != "rss")
{
mError = "This file is not a RSS source.";
ok = false;
}
else if (qualifiedName == "rss")
{
QString version = attributes.value("version");
if (!version.isEmpty() && version != "2.0")
{
mError = "Can only handle RSS 2.0.";
ok = false;
}
else
{
mRssTagParsed = true;
}
}
else if (qualifiedName == sRssItemElementName)
{
mInItem = true;
}
else if (qualifiedName == sUniboardVersionElementName)
{
mInVersion = true;
}
mCurrentText = "";
return ok;
}
bool UBRssHandler::characters(const QString &str)
{
mCurrentText += str;
return true;
}
bool UBRssHandler::endElement(
const QString & /* namespaceURI */,
const QString & /* localName */,
const QString &qualifiedName)
{
bool ok = true;
if (qualifiedName == sRssItemElementName)
{
mInItem = false;
if (mVersion.isValid() && !mDownloadUrl.isEmpty())
{
UBSoftwareUpdate *softwareUpdate = new UBSoftwareUpdate(mVersion, mDownloadUrl);
mSoftwareUpdates.append(softwareUpdate);
}
mVersion = UBVersion();
mDownloadUrl = "";
}
else if (qualifiedName == sRssLinkElementName)
{
if (mInItem)
{
QUrl url(mCurrentText);
if (url.isValid())
mDownloadUrl = mCurrentText;
else
ok = false;
}
}
else if (qualifiedName == sUniboardVersionElementName)
{
if (mInItem)
{
mVersion.setString(mCurrentText);
ok = mVersion.isValid();
mInVersion = false;
}
}
return ok;
}
bool UBRssHandler::fatalError(const QXmlParseException &exception)
{
qWarning() << "Fatal error at line " << exception.lineNumber()
<< ", column " << exception.columnNumber() << ": "
<< exception.message() << mError;
return false;
}
QString UBRssHandler::error() const
{
return mError;
}
QList<UBSoftwareUpdate *> UBRssHandler::softwareUpdates() const
{
return mSoftwareUpdates;
}

@ -1,59 +0,0 @@
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef UBRSSHANDLER_H_
#define UBRSSHANDLER_H_
#include <QtXml>
#include <QList>
#include "frameworks/UBVersion.h"
class UBSoftwareUpdate;
class UBRssHandler: public QXmlDefaultHandler
{
public:
UBRssHandler();
virtual ~UBRssHandler(void);
// QXmlDefaultHandler
virtual bool startElement(const QString &namespaceURI,
const QString &localName, const QString &qualifiedName,
const QXmlAttributes &attributes);
virtual bool endElement(const QString &namespaceURI,
const QString &localName, const QString &qualifiedName);
virtual bool characters(const QString &str);
virtual bool fatalError(const QXmlParseException &exception);
// UBRssHandler
QString error() const;
QList<UBSoftwareUpdate *> softwareUpdates() const;
private:
QList<UBSoftwareUpdate *> mSoftwareUpdates;
bool mRssTagParsed;
bool mInItem;
bool mInVersion;
QString mError;
QString mCurrentText;
UBVersion mVersion;
QString mDownloadUrl;
static const QString sRssItemElementName;
static const QString sRssLinkElementName;
static const QString sUniboardVersionElementName;
};
#endif /* UBRSSHANDLER_H_ */

@ -1,52 +0,0 @@
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "frameworks/UBVersion.h"
#include "UBSoftwareUpdate.h"
#include "core/memcheck.h"
UBSoftwareUpdate::UBSoftwareUpdate()
{
// NOOP
}
UBSoftwareUpdate::UBSoftwareUpdate(UBVersion& version, const QString &downloadUrl)
: mVersion(version)
, mDownloadUrl(downloadUrl)
{
// NOOP
}
UBSoftwareUpdate::~UBSoftwareUpdate()
{
// NOOP
}
UBVersion UBSoftwareUpdate::version() const
{
return mVersion;
}
QString UBSoftwareUpdate::downloadUrl() const
{
return mDownloadUrl;
}
bool UBSoftwareUpdate::operator==(const UBSoftwareUpdate &other) const
{
return version() == other.version();
}

@ -1,261 +0,0 @@
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//#include "frameworks/UBVersion.h"
//#include "frameworks/UBFileSystemUtils.h"
//#include "frameworks/UBPlatformUtils.h"
//#include "UBSoftwareUpdateController.h"
//#include "UBRssHandler.h"
//#include "UBSoftwareUpdate.h"
//#include "core/UBApplication.h"
//#include "core/UBSettings.h"
//#include "core/UBSetting.h"
//#include "board/UBBoardController.h"
//#include "document/UBDocumentProxy.h"
//#include "network/UBHttpGet.h"
//#include "network/UBServerXMLHttpRequest.h"
//#include "network/UBNetworkAccessManager.h"
//const qreal UBSoftwareUpdateController::sProgressPercentageStep = 1;
//const int UBSoftwareUpdateController::sMinDisplayedDownloadedSizeInBytes = 2 * 1024 * 1024;
//UBSoftwareUpdateController::UBSoftwareUpdateController(QObject *parent)
// : QObject(parent)
// , mHttp(0)
//{
// // NOOP
//}
//UBSoftwareUpdateController::~UBSoftwareUpdateController()
//{
// delete mHttp;
//}
//void UBSoftwareUpdateController::beginRssDownload(const QUrl &url)
//{
// UBServerXMLHttpRequest * request = new UBServerXMLHttpRequest(UBNetworkAccessManager::defaultAccessManager());
// connect(request, SIGNAL(finished(bool, const QByteArray &)), this, SLOT(rssDownloadFinished(bool, const QByteArray &)));
// request->get(url);
//}
//void UBSoftwareUpdateController::beginInstallerDownload(const QUrl &url)
//{
// delete mHttp;
// mHttp = new UBHttpGet();
// connect(mHttp, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(installerDownloadProgress(qint64, qint64)));
// connect(mHttp, SIGNAL(downloadFinished(bool, QUrl, QString, QByteArray, QPointF, QSize, bool)),
// this, SLOT(installerDownloadFinished(bool, QUrl, QString, QByteArray)));
// mLastDisplayedProgress = 0;
// UBApplication::showMessage(tr("Downloading software update (%1%)").arg(0), true);
// mHttp->get(url, QPointF(), QSize());
//}
//void UBSoftwareUpdateController::rssDownloadFinished(bool success, const QByteArray &payload)
//{
// if (!success)
// {
// qWarning() << "Failed to download RSS file.";
// failedToRetrieveSoftwareUpdateInfo();
// return;
// }
// parseRss(payload);
//}
//void UBSoftwareUpdateController::installerDownloadProgress(qint64 receivedBytes, qint64 bytesTotal)
//{
// if (bytesTotal > sMinDisplayedDownloadedSizeInBytes)
// {
// qreal progress = ((qreal)(receivedBytes * 100) / bytesTotal);
// if (progress >= mLastDisplayedProgress + sProgressPercentageStep || receivedBytes == bytesTotal)
// {
// mLastDisplayedProgress = progress;
// UBApplication::showMessage(tr("Downloading software update (%1%)").arg(progress, 0, 'f', 0), true);
// }
// }
//}
//void UBSoftwareUpdateController::installerDownloadFinished(bool success, QUrl sourceUrl, QString contentTypeHeader, QByteArray data)
//{
// Q_UNUSED(contentTypeHeader);
// if (!success)
// {
// UBApplication::showMessage(tr("Downloading software update failed"));
// return;
// }
// UBApplication::showMessage(tr("Download finished"));
// QStringList urlParts = sourceUrl.toString().split("/");
// QString installerFileName = urlParts.last();
// QString tempDirPath = UBFileSystemUtils::createTempDir(UBFileSystemUtils::defaultTempDirName(), false);
// QString installerFilePath = tempDirPath + "/" + installerFileName;
// QFile file(installerFilePath);
// if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
// {
// qCritical() << "Cannot open " << installerFilePath << " for writing...";
// return;
// }
// file.write(data);
// file.flush();
// file.close();
// if (QMessageBox::question(
// QApplication::activeWindow(),
// tr("Software Update"),
// tr("Are you sure you want to install this new version of Uniboard now?\nThis session will close as soon as installation begins."),
// QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes)
// {
// UBDocumentProxy* document = UBApplication::boardController->activeDocument();
// int sceneIndex = UBApplication::boardController->activeSceneIndex();
// if (document)
// {
// UBSettings::settings()->appLastSessionDocumentUUID->set(UBStringUtils::toCanonicalUuid(document->uuid()));
// UBSettings::settings()->appLastSessionPageIndex->set(sceneIndex);
// }
// UBSettings::settings()->appIsInSoftwareUpdateProcess->set(true);
// UBPlatformUtils::runInstaller(installerFilePath);
// UBApplication::quit();
// }
//}
//void UBSoftwareUpdateController::parseRss(const QByteArray &rssContent)
//{
// UBRssHandler rssHandler;
// QXmlSimpleReader xmlReader;
// xmlReader.setContentHandler(&rssHandler);
// xmlReader.setErrorHandler(&rssHandler);
// QXmlInputSource source;
// source.setData(rssContent);
// if (!xmlReader.parse(source))
// {
// failedToRetrieveSoftwareUpdateInfo();
// return;
// }
// if (rssHandler.error().length() > 0)
// {
// qWarning() << "Failed to parse RSS file. Reason: " << rssHandler.error();
// failedToRetrieveSoftwareUpdateInfo();
// return;
// }
// if (rssHandler.softwareUpdates().isEmpty())
// {
// qWarning() << "RSS file does not contain software update info.";
// failedToRetrieveSoftwareUpdateInfo();
// return;
// }
// UBVersion installedVersion(qApp->applicationVersion());
// if (!installedVersion.isValid())
// {
// qWarning() << "Failed to parse installed version format: " << qApp->applicationVersion();
// failedToRetrieveSoftwareUpdateInfo();
// return;
// }
// QList<UBSoftwareUpdate *> softwareUpdates = rssHandler.softwareUpdates();
// const UBSoftwareUpdate *mostRecentSoftwareUpdate = searchForMoreRecentAndAsStableSoftwareUpdate(installedVersion, softwareUpdates);
// if (mostRecentSoftwareUpdate)
// {
// emit softwareUpdateAvailable(installedVersion, *mostRecentSoftwareUpdate);
// }
// else
// {
// emit noSoftwareUpdateAvailable();
// }
//}
//const UBSoftwareUpdate* UBSoftwareUpdateController::searchForMoreRecentAndAsStableSoftwareUpdate(const UBVersion &installedVersion, const QList<UBSoftwareUpdate *> &softwareUpdates)
//{
// const UBSoftwareUpdate *mostRecentSoftwareUpdate = 0;
// foreach (const UBSoftwareUpdate *softwareUpdate, softwareUpdates)
// {
// bool moreRecentAndAsStable = false;
// if (Alpha == installedVersion.releaseStage())
// {
// if (installedVersion < softwareUpdate->version() &&
// installedVersion.platformNumber() == softwareUpdate->version().platformNumber())
// {
// moreRecentAndAsStable = true;
// }
// }
// else if (Beta == installedVersion.releaseStage())
// {
// if (Alpha != softwareUpdate->version().releaseStage() &&
// installedVersion < softwareUpdate->version() &&
// installedVersion.platformNumber() == softwareUpdate->version().platformNumber())
// {
// moreRecentAndAsStable = true;
// }
// }
// else
// {
// if (ReleaseCandidate == softwareUpdate->version().releaseStage() &&
// installedVersion < softwareUpdate->version() &&
// installedVersion.platformNumber() == softwareUpdate->version().platformNumber())
// {
// moreRecentAndAsStable = true;
// }
// }
// if (moreRecentAndAsStable)
// {
// if (mostRecentSoftwareUpdate)
// {
// if (mostRecentSoftwareUpdate->version() < softwareUpdate->version())
// {
// mostRecentSoftwareUpdate = softwareUpdate;
// }
// }
// else
// {
// mostRecentSoftwareUpdate = softwareUpdate;
// }
// }
// }
// return mostRecentSoftwareUpdate;
//}

@ -1,61 +0,0 @@
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
//#ifndef UBSOFTWAREUPDATECONTROLLER_H_
//#define UBSOFTWAREUPDATECONTROLLER_H_
//#include <QObject>
//#include <QUrl>
//class UBVersion;
//class UBSoftwareUpdate;
//class UBHttpGet;
//class UBSoftwareUpdateController : public QObject
//{
// Q_OBJECT;
// public:
// UBSoftwareUpdateController(QObject *parent = 0);
// virtual ~UBSoftwareUpdateController();
// void beginRssDownload(const QUrl &url);
// void beginInstallerDownload(const QUrl &url);
// static const UBSoftwareUpdate* searchForMoreRecentAndAsStableSoftwareUpdate(const UBVersion &installedVersion,
// const QList<UBSoftwareUpdate *> &softwareUpdates);
// signals:
// void softwareUpdateAvailable(const UBVersion &installedVersion, const UBSoftwareUpdate &softwareUpdate);
// void noSoftwareUpdateAvailable();
// void failedToRetrieveSoftwareUpdateInfo();
// private slots:
// void rssDownloadFinished(bool success, const QByteArray &payload);
// void installerDownloadProgress(qint64 receivedBytes, qint64 bytesTotal);
// void installerDownloadFinished(bool success, QUrl sourceUrl, QString header, QByteArray data);
// private:
// // Helpers
// void parseRss(const QByteArray &rssContent);
// UBHttpGet *mHttp;
// qreal mLastDisplayedProgress;
// static const int sMinDisplayedDownloadedSizeInBytes;
// static const qreal sProgressPercentageStep;
//};
//#endif // UBSOFTWAREUPDATECONTROLLER_H_

@ -1,8 +0,0 @@
HEADERS += src/softwareupdate/UBSoftwareUpdateController.h \
src/softwareupdate/UBRssHandler.h \
src/softwareupdate/UBSoftwareUpdate.h
SOURCES += src/softwareupdate/UBSoftwareUpdateController.cpp \
src/softwareupdate/UBRssHandler.cpp \
src/softwareupdate/UBSoftwareUpdate.cpp
Loading…
Cancel
Save