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

preferencesAboutTextFull
Ivan Ilyin 12 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/desktop/desktop.pri)
include(src/web/web.pri)
include(src/softwareupdate/softwareupdate.pri)
include(src/transition/transition.pri)
include(src/customWidgets/customWidgets.pri)
include(src/interfaces/interfaces.pri)
@ -137,7 +136,7 @@ macx {
LIBS += -framework AppKit
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
# because the Quicktime components used by this application

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

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation>التصدير لمتصفح الويب</translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1857,11 +1922,104 @@ Do you want to ignore these errors for this host?</source>
</message>
</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>
<source>Document title</source>
<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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation>Eksport til webbrowser</translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1863,11 +1928,104 @@ Do you want to ignore these errors for this host?</source>
</message>
</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>
<source>Document title</source>
<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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation>In Web-Browser exportieren</translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1863,11 +1928,104 @@ Möchten Sie diese Fehler auf diesem Computer ignorieren?</translation>
</message>
</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>
<source>Document title</source>
<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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation type="unfinished"></translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1857,11 +1922,104 @@ Do you want to ignore these errors for this host?</source>
</message>
</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>Document title</source>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation type="unfinished"></translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1857,11 +1922,104 @@ Do you want to ignore these errors for this host?</source>
</message>
</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>Document title</source>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation>Importar viejos documentos de Sankore o Uniboard</translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation>Exportar al explorador web</translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1863,11 +1928,104 @@ Do you want to ignore these errors for this host?</source>
</message>
</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>
<source>Document title</source>
<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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation>Importer les anciens documents Sankoré et Uniboard</translation>
</message>
<message>
<source>Gtorup items</source>
<translation>Groupe les éléments</translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1331,6 +1335,67 @@
<translation>Exporter vers un navigateur Web</translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1801,33 +1866,33 @@ Voulez-vous ignorer les erreurs pour ce serveur?</translation>
<name>UBTGActionWidget</name>
<message>
<source>Teacher</source>
<translation type="unfinished"></translation>
<translation>Professeur</translation>
</message>
<message>
<source>Student</source>
<translation type="unfinished"></translation>
<translation>Elève</translation>
</message>
<message>
<source>Type task here ...</source>
<translation type="unfinished"></translation>
<translation>Ajouter une action</translation>
</message>
</context>
<context>
<name>UBTGMediaWidget</name>
<message>
<source>drop media here ...</source>
<translation type="unfinished"></translation>
<translation>Glisser un média ici ...</translation>
</message>
<message>
<source>Type title here...</source>
<translation type="unfinished"></translation>
<translation>Titre de l&apos;activité</translation>
</message>
</context>
<context>
<name>UBTGUrlWidget</name>
<message>
<source>Insert link title here...</source>
<translation type="unfinished"></translation>
<translation>Titre</translation>
</message>
</context>
<context>
@ -1841,39 +1906,132 @@ Voulez-vous ignorer les erreurs pour ce serveur?</translation>
<name>UBTeacherGuideEditionWidget</name>
<message>
<source>Type title here ...</source>
<translation type="unfinished"></translation>
<translation>Titre</translation>
</message>
<message>
<source>Type comment here ...</source>
<translation type="unfinished"></translation>
<translation>Commentaire, descriptif</translation>
</message>
<message>
<source>Add an action</source>
<translation type="unfinished"></translation>
<translation>Ajouter une action</translation>
</message>
<message>
<source>Add a media</source>
<translation type="unfinished"></translation>
<translation>Ajouter un média</translation>
</message>
<message>
<source>Add a link</source>
<translation type="unfinished"></translation>
<translation>Ajouter un lien</translation>
</message>
<message>
<source>Page: %0</source>
<translation type="unfinished"></translation>
<translation>Page: %0</translation>
</message>
</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>
<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>
</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>
</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>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation>Importer les anciens documents Sankoré et Uniboard</translation>
</message>
<message>
<source>Gtorup items</source>
<translation>Groupe les éléments</translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1196,8 +1200,8 @@
<message numerus="yes">
<source>%1 pages copied</source>
<translation>
<numerusform>%1 page(s) copiée(s)</numerusform>
<numerusform></numerusform>
<numerusform>%1 page copiée</numerusform>
<numerusform>%1 pages copiées</numerusform>
</translation>
</message>
</context>
@ -1331,6 +1335,67 @@
<translation>Exporter vers un navigateur Web</translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1473,7 +1538,7 @@
<name>UBKeyboardPalette</name>
<message>
<source>Enter</source>
<translation type="unfinished"></translation>
<translation>Retour</translation>
</message>
</context>
<context>
@ -1801,33 +1866,33 @@ Voulez-vous ignorer les erreurs pour ce serveur?</translation>
<name>UBTGActionWidget</name>
<message>
<source>Teacher</source>
<translation type="unfinished"></translation>
<translation>Professeur</translation>
</message>
<message>
<source>Student</source>
<translation type="unfinished"></translation>
<translation>Elève</translation>
</message>
<message>
<source>Type task here ...</source>
<translation type="unfinished"></translation>
<translation>Ajouter une action</translation>
</message>
</context>
<context>
<name>UBTGMediaWidget</name>
<message>
<source>drop media here ...</source>
<translation type="unfinished"></translation>
<translation>Glisser un média ici ...</translation>
</message>
<message>
<source>Type title here...</source>
<translation type="unfinished"></translation>
<translation>Titre de l&apos;activité</translation>
</message>
</context>
<context>
<name>UBTGUrlWidget</name>
<message>
<source>Insert link title here...</source>
<translation type="unfinished"></translation>
<translation>Titre</translation>
</message>
</context>
<context>
@ -1841,39 +1906,132 @@ Voulez-vous ignorer les erreurs pour ce serveur?</translation>
<name>UBTeacherGuideEditionWidget</name>
<message>
<source>Type title here ...</source>
<translation type="unfinished"></translation>
<translation>Titre</translation>
</message>
<message>
<source>Type comment here ...</source>
<translation type="unfinished"></translation>
<translation>Commentaire, descriptif</translation>
</message>
<message>
<source>Add an action</source>
<translation type="unfinished"></translation>
<translation>Ajouter une action</translation>
</message>
<message>
<source>Add a media</source>
<translation type="unfinished"></translation>
<translation>Ajouter un média</translation>
</message>
<message>
<source>Add a link</source>
<translation type="unfinished"></translation>
<translation>Ajouter un lien</translation>
</message>
<message>
<source>Page: %0</source>
<translation type="unfinished"></translation>
<translation>Page: %0</translation>
</message>
</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>
<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>
</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>
</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>
<name>UBThumbnailAdaptor</name>
@ -2567,27 +2725,27 @@ p, li { white-space: pre-wrap; }
</message>
<message>
<source>Multi display</source>
<translation type="unfinished"></translation>
<translation>Multi-écran</translation>
</message>
<message>
<source>Swap control display and view display</source>
<translation type="unfinished"></translation>
<translation>Inverser les écrans</translation>
</message>
<message>
<source>Mode</source>
<translation type="unfinished"></translation>
<translation>Mode</translation>
</message>
<message>
<source>Mode to start in:</source>
<translation type="unfinished"></translation>
<translation>Démarrer en mode:</translation>
</message>
<message>
<source>Board</source>
<translation type="unfinished">Tableau</translation>
<translation>Tableau</translation>
</message>
<message>
<source>Desktop</source>
<translation type="unfinished"></translation>
<translation>Bureau</translation>
</message>
<message>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation>Importa i vecchi documenti Sankoré o Uniboard</translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1331,6 +1335,67 @@
<translation>Esporta nel browser web</translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1865,11 +1930,104 @@ Vuoi ignorare gli errori per questo host?</translation>
</message>
</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>
<source>Document title</source>
<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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation>ייצא לדפדפן </translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1857,11 +1922,104 @@ Do you want to ignore these errors for this host?</source>
</message>
</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>
<source>Document title</source>
<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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation></translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1864,11 +1929,104 @@ Do you want to ignore these errors for this host?</source>
</message>
</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>
<source>Document title</source>
<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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation> </translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1863,11 +1928,104 @@ Do you want to ignore these errors for this host?</source>
</message>
</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>
<source>Document title</source>
<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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1330,6 +1334,67 @@
<translation>Eksporter til nettleser</translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1858,11 +1923,104 @@ Do you want to ignore these errors for this host?</source>
</message>
</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>
<source>Document title</source>
<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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation>Exporteren naar Web Browser</translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1857,11 +1922,104 @@ Do you want to ignore these errors for this host?</source>
</message>
</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>
<source>Document title</source>
<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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -800,6 +800,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1330,6 +1334,67 @@
<translation>Eksportowanie do przeglądarki sieci Web</translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1864,11 +1929,104 @@ Czy chcesz ignorować te błędy dla tego hosta?</translation>
</message>
</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>
<source>Document title</source>
<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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation type="unfinished"></translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1857,11 +1922,104 @@ Do you want to ignore these errors for this host?</source>
</message>
</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>Document title</source>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation type="unfinished"></translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1857,11 +1922,104 @@ Do you want to ignore these errors for this host?</source>
</message>
</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>Document title</source>
<source>Type authors here ...</source>
<translation type="unfinished"></translation>
</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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation>Exportare în browser web</translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1863,11 +1928,104 @@ Doriţi să ignoraţi aceste erori pentru acest host?</translation>
</message>
</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>
<source>Document title</source>
<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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1331,6 +1335,67 @@
<translation>Экспорт в веб-браузер</translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1865,11 +1930,104 @@ Do you want to ignore these errors for this host?</source>
</message>
</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>
<source>Document title</source>
<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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Erase Annotation</source>
<translation>Vymazať anotáciu</translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1333,6 +1337,67 @@
<translation>Exportovať do webového prehliadača</translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1867,11 +1932,104 @@ Chcete ignorovať tieto chyby na tomto serveri?</translation>
</message>
</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>
<source>Document title</source>
<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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation>Exportera till Webläsare</translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1863,11 +1928,104 @@ Vill du ignorera felen för den här värden?</translation>
</message>
</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>
<source>Document title</source>
<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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

@ -799,6 +799,10 @@
<source>Import old Sankore or Uniboard documents</source>
<translation type="unfinished"></translation>
</message>
<message>
<source>Gtorup items</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>PasswordDialog</name>
@ -1329,6 +1333,67 @@
<translation></translation>
</message>
</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>
<name>UBGraphicsItemDelegate</name>
<message>
@ -1863,11 +1928,104 @@ Do you want to ignore these errors for this host?</source>
</message>
</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>
<source>Document title</source>
<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>
<source>Page: %0</source>
<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>
<translation type="unfinished"></translation>
</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>
<name>trapFlashDialog</name>

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

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

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

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

@ -111,12 +111,13 @@ void UBMetadataDcSubsetAdaptor::persist(UBDocumentProxy* proxy)
xmlWriter.writeTextElement(UBSettings::uniboardDocumentNamespaceUri, "updated-at", UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTimeUtc()));
// introduced in OpenSankore 1.40.00
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::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(); //RDF
@ -222,36 +223,42 @@ QMap<QString, QVariant> UBMetadataDcSubsetAdaptor::load(QString pPath)
{
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)
{
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)
{
metadata.insert(UBSettings::sessionLicence, xml.readElementText());
metadata.insert(UBSettings::sessionObjectives, xml.readElementText());
}
else if (xml.name() == UBSettings::sessionKeywords // introduced in OpenSankore 1.40.00
&& xml.namespaceUri() == UBSettings::uniboardDocumentNamespaceUri)
{
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)
{
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)
{
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)
{
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);
}
@ -291,7 +298,6 @@ QMap<QString, QVariant> UBMetadataDcSubsetAdaptor::load(QString pPath)
metadata.insert(UBSettings::documentDate, QVariant(date));
return metadata;
}

@ -54,6 +54,8 @@
#include "core/UBPersistenceManager.h"
#include "core/UBApplication.h"
#include "interfaces/IDataStorage.h"
#include "pdf/PDFRenderer.h"
#include "core/memcheck.h"
@ -69,8 +71,7 @@ const QString UBSvgSubsetAdaptor::sPixelUnit = "px";
const QString UBSvgSubsetAdaptor::sFontWeightPrefix = "font-weight:";
const QString UBSvgSubsetAdaptor::sFontStylePrefix = "font-style:";
const QString UBSvgSubsetAdaptor::sFormerUniboardDocumentNamespaceUri = "http://www.mnemis.com/uniboard";
QMap<QString,IDataStorage*> UBSvgSubsetAdaptor::additionalElementToStore;
QString UBSvgSubsetAdaptor::toSvgTransform(const QMatrix& matrix)
{
@ -110,7 +111,6 @@ QMatrix UBSvgSubsetAdaptor::fromSvgTransform(const QString& transform)
static bool itemZIndexComp(const QGraphicsItem* item1,
const QGraphicsItem* item2)
{
// return item1->zValue() < item2->zValue();
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)
{
QString fileName = proxy->persistencePath() +
UBFileSystemUtils::digitFileFormat("/page%1.svg", pPageIndex + 1);
QString fileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg",pPageIndex);
QFile file(fileName);
QDomDocument doc("page");
@ -158,8 +157,7 @@ QDomDocument UBSvgSubsetAdaptor::loadSceneDocument(UBDocumentProxy* proxy, const
void UBSvgSubsetAdaptor::setSceneUuid(UBDocumentProxy* proxy, const int pageIndex, QUuid pUuid)
{
QString fileName = proxy->persistencePath() +
UBFileSystemUtils::digitFileFormat("/page%1.svg", pageIndex + 1);
QString fileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg",pageIndex);
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)
{
@ -217,8 +225,7 @@ QString UBSvgSubsetAdaptor::uniboardDocumentNamespaceUriFromVersion(int mFileVer
UBGraphicsScene* UBSvgSubsetAdaptor::loadScene(UBDocumentProxy* proxy, const int pageIndex)
{
QString fileName = proxy->persistencePath() +
UBFileSystemUtils::digitFileFormat("/page%1.svg", pageIndex + 1);
QString fileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", pageIndex);
QFile file(fileName);
@ -243,8 +250,7 @@ UBGraphicsScene* UBSvgSubsetAdaptor::loadScene(UBDocumentProxy* proxy, const int
QUuid UBSvgSubsetAdaptor::sceneUuid(UBDocumentProxy* proxy, const int pageIndex)
{
QString fileName = proxy->persistencePath() +
UBFileSystemUtils::digitFileFormat("/page%1.svg", pageIndex + 1);
QString fileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", pageIndex);
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)
: mXmlReader(pXmlData)
, mProxy(pProxy)
@ -317,6 +370,7 @@ UBGraphicsScene* UBSvgSubsetAdaptor::UBSvgSubsetReader::loadScene()
UBGraphicsStrokesGroup* strokesGroup = 0;
UBDrawingController* dc = UBDrawingController::drawingController();
while (!mXmlReader.atEnd())
{
mXmlReader.readNext();
@ -431,13 +485,13 @@ UBGraphicsScene* UBSvgSubsetAdaptor::UBSvgSubsetReader::loadScene()
else if (mXmlReader.name() == "g")
{
// Create new stroke, if its NULL or already has polygons
if (annotationGroup)
{
if (!annotationGroup->polygons().empty())
annotationGroup = new UBGraphicsStroke();
}
else
annotationGroup = new UBGraphicsStroke();
if (annotationGroup)
{
if (!annotationGroup->polygons().empty())
annotationGroup = new UBGraphicsStroke();
}
else
annotationGroup = new UBGraphicsStroke();
if(eDrawingMode_Vector == dc->drawingMode()){
strokesGroup = new UBGraphicsStrokesGroup();
@ -711,7 +765,7 @@ UBGraphicsScene* UBSvgSubsetAdaptor::UBSvgSubsetReader::loadScene()
UBGraphicsItem::assignZValue(triangle, zFromSvg);
}
}
else if(mXmlReader.name() == "cache")
else if (mXmlReader.name() == "cache")
{
UBGraphicsCache* cache = cacheFromSvg();
if(cache)
@ -832,6 +886,18 @@ UBGraphicsScene* UBSvgSubsetAdaptor::UBSvgSubsetReader::loadScene()
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
{
// NOOP
@ -846,15 +912,24 @@ UBGraphicsScene* UBSvgSubsetAdaptor::UBSvgSubsetReader::loadScene()
//graphicsItemFromSvg(strokesGroup);
}
if (annotationGroup)
{
if (!annotationGroup->polygons().empty())
annotationGroup = 0;
}
if (annotationGroup)
{
if (!annotationGroup->polygons().empty())
annotationGroup = 0;
}
mGroupHasInfo = false;
mGroupDarkBackgroundColor = 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)
{
UBSvgSubsetWriter writer(proxy, pScene, pageIndex);
writer.persistScene();
writer.persistScene(pageIndex);
}
@ -928,7 +1003,7 @@ void UBSvgSubsetAdaptor::UBSvgSubsetWriter::writeSvgElement()
mXmlWriter.writeEndElement();
}
bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene()
bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene(int pageIndex)
{
@ -1166,8 +1241,28 @@ bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene()
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();
QString fileName = mDocumentPath + UBFileSystemUtils::digitFileFormat("/page%1.svg", mPageIndex + 1);
QString fileName = mDocumentPath + UBFileSystemUtils::digitFileFormat("/page%1.svg", mPageIndex);
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
@ -1182,7 +1277,7 @@ bool UBSvgSubsetAdaptor::UBSvgSubsetWriter::persistScene()
}
else
{
qDebug() << "ignoring unmodified page" << mPageIndex + 1;
qDebug() << "ignoring unmodified page" << UBApplication::boardController->pageFromSceneIndex(mPageIndex);
}
return true;
@ -2518,7 +2613,7 @@ void UBSvgSubsetAdaptor::UBSvgSubsetWriter::curtainItemToSvg(UBGraphicsCurtainIt
mXmlWriter.writeAttribute("width", QString("%1").arg(curtainItem->boundingRect().width()));
mXmlWriter.writeAttribute("height", QString("%1").arg(curtainItem->boundingRect().height()));
mXmlWriter.writeAttribute("transform", toSvgTransform(curtainItem->sceneMatrix()));
//graphicsItemToSvg(curtainItem);
QString zs;
zs.setNum(curtainItem->zValue(), 'f'); // 'f' keeps precision

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

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

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

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

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

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

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

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

@ -32,6 +32,10 @@
#include "adaptors/UBThumbnailAdaptor.h"
#include "adaptors/UBMetadataDcSubsetAdaptor.h"
#include "board/UBBoardController.h"
#include "interfaces/IDataStorage.h"
#include "core/memcheck.h"
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::videoDirectory = "videos"; // added to UBPersistenceManager::mAllDirectories
const QString UBPersistenceManager::audioDirectory = "audios"; // added to
const QString UBPersistenceManager::teacherGuideDirectory = "teacherGuideObjects";
UBPersistenceManager * UBPersistenceManager::sSingleton = 0;
@ -52,6 +57,7 @@ UBPersistenceManager::UBPersistenceManager(QObject *pParent)
mDocumentSubDirectories << widgetDirectory;
mDocumentSubDirectories << videoDirectory;
mDocumentSubDirectories << audioDirectory;
mDocumentSubDirectories << teacherGuideDirectory;
documentProxies = allDocumentProxies();
emit proxyListChanged();
@ -83,7 +89,6 @@ UBPersistenceManager::~UBPersistenceManager()
}
}
QList<QPointer<UBDocumentProxy> > UBPersistenceManager::allDocumentProxies()
{
mDocumentRepositoryPath = UBSettings::userDocumentDirectory();
@ -363,7 +368,7 @@ UBDocumentProxy* UBPersistenceManager::duplicateDocument(UBDocumentProxy* pDocum
void UBPersistenceManager::deleteDocumentScenes(UBDocumentProxy* proxy, const QList<int>& indexes)
{
checkIfDocumentRepositoryExists();
checkIfDocumentRepositoryExists();
int pageCount = UBPersistenceManager::persistenceManager()->sceneCount(proxy);
@ -422,17 +427,15 @@ void UBPersistenceManager::deleteDocumentScenes(UBDocumentProxy* proxy, const QL
foreach(int index, compactedIndexes)
{
QString svgFileName = proxy->persistencePath() +
UBFileSystemUtils::digitFileFormat("/page%1.svg", index + 1);
QString svgFileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", index);
QFile::remove(svgFileName);
QString thumbFileName = proxy->persistencePath() +
UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", index + 1);
QString thumbFileName = proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", index);
QFile::remove(thumbFileName);
mSceneCache.removeScene(proxy, index);
mSceneCache.removeScene(proxy, index);
proxy->decPageCount();
@ -482,7 +485,7 @@ void UBPersistenceManager::duplicateDocumentScene(UBDocumentProxy* proxy, int in
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);
for(int i = count - 1; i >= index; i--)
{
renamePage(proxy, i , i + 1);
}
mSceneCache.shiftUpScenes(proxy, index, count -1);
@ -543,11 +544,11 @@ void UBPersistenceManager::moveSceneToIndex(UBDocumentProxy* proxy, int source,
if (source == target)
return;
QFile svgTmp(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", source + 1));
svgTmp.rename(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.tmp", target + 1));
QFile svgTmp(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", source));
svgTmp.rename(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.tmp", target));
QFile thumbTmp(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", source + 1));
thumbTmp.rename(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.tmp", target + 1));
QFile thumbTmp(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", source));
thumbTmp.rename(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.tmp", 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));
svg.rename(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", target + 1));
QFile svg(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.tmp", target));
svg.rename(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", target));
QFile thumb(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.tmp", target + 1));
thumb.rename(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", target + 1));
QFile thumb(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.tmp", target));
thumb.rename(proxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", target));
mSceneCache.moveScene(proxy, source, target);
@ -579,12 +580,9 @@ void UBPersistenceManager::moveSceneToIndex(UBDocumentProxy* proxy, int source,
UBGraphicsScene* UBPersistenceManager::loadDocumentScene(UBDocumentProxy* proxy, int sceneIndex)
{
if (mSceneCache.contains(proxy, sceneIndex))
{
//qDebug() << "scene" << sceneIndex << "retrieved from cache ...";
return mSceneCache.value(proxy, sceneIndex);
}
else
{
else {
qDebug() << "scene" << sceneIndex << "retrieved from file ...";
UBGraphicsScene* scene = UBSvgSubsetAdaptor::loadScene(proxy, sceneIndex);
if (scene)
@ -636,23 +634,23 @@ UBDocumentProxy* UBPersistenceManager::persistDocumentMetadata(UBDocumentProxy*
void UBPersistenceManager::renamePage(UBDocumentProxy* pDocumentProxy, const int sourceIndex, const int targetIndex)
{
QFile svg(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", sourceIndex + 1));
svg.rename(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", targetIndex + 1));
QFile svg(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", sourceIndex));
svg.rename(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", targetIndex));
QFile thumb(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", sourceIndex + 1));
thumb.rename(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", targetIndex + 1));
QFile thumb(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", sourceIndex));
thumb.rename(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", targetIndex));
}
void UBPersistenceManager::copyPage(UBDocumentProxy* pDocumentProxy, const int sourceIndex, const int targetIndex)
{
QFile svg(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", sourceIndex + 1));
svg.copy(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", targetIndex + 1));
QFile svg(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg",sourceIndex));
svg.copy(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", targetIndex));
UBSvgSubsetAdaptor::setSceneUuid(pDocumentProxy, targetIndex, QUuid::createUuid());
QFile thumb(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", sourceIndex + 1));
thumb.copy(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", targetIndex + 1));
QFile thumb(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", sourceIndex));
thumb.copy(pDocumentProxy->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", targetIndex));
}
@ -665,10 +663,11 @@ int UBPersistenceManager::sceneCountInDir(const QString& pPath)
{
int pageIndex = 0;
bool moreToProcess = true;
bool addedMissingZeroPage = false;
while (moreToProcess)
{
QString fileName = pPath + UBFileSystemUtils::digitFileFormat("/page%1.svg", pageIndex + 1);
QString fileName = pPath + UBFileSystemUtils::digitFileFormat("/page%1.svg", pageIndex);
QFile file(fileName);
@ -678,10 +677,24 @@ int UBPersistenceManager::sceneCountInDir(const QString& pPath)
}
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;
}
@ -716,13 +729,13 @@ void UBPersistenceManager::addDirectoryContentToDocument(const QString& document
{
int targetIndex = targetPageCount + sourceIndex;
QFile svg(documentRootFolder + UBFileSystemUtils::digitFileFormat("/page%1.svg", sourceIndex + 1));
svg.copy(pDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", targetIndex + 1));
QFile svg(documentRootFolder + UBFileSystemUtils::digitFileFormat("/page%1.svg", sourceIndex));
svg.copy(pDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.svg", targetIndex));
UBSvgSubsetAdaptor::setSceneUuid(pDocument, targetIndex, QUuid::createUuid());
QFile thumb(documentRootFolder + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", sourceIndex + 1));
thumb.copy(pDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", targetIndex + 1));
QFile thumb(documentRootFolder + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", sourceIndex));
thumb.copy(pDocument->persistencePath() + UBFileSystemUtils::digitFileFormat("/page%1.thumbnail.jpg", targetIndex));
}
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)
{

@ -41,11 +41,12 @@ class UBPersistenceManager : public QObject
static const QString videoDirectory;
static const QString audioDirectory;
static const QString widgetDirectory;
static const QString teacherGuideDirectory;
static UBPersistenceManager* persistenceManager();
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* persistDocumentMetadata(UBDocumentProxy* pDocumentProxy);
@ -80,6 +81,9 @@ class UBPersistenceManager : public QObject
virtual QString generateUniqueDocumentPath();
QString teacherGuideAbsoluteObjectPath(UBDocumentProxy* pDocumentProxy);
QString addObjectToTeacherGuideDirectory(UBDocumentProxy* proxy, QString pPath);
virtual void addDirectoryContentToDocument(const QString& documentRootFolder, UBDocumentProxy* pDocument);
virtual void upgradeDocumentIfNeeded(UBDocumentProxy* pDocumentProxy);
@ -153,6 +157,8 @@ class UBPersistenceManager : public QObject
QString mDocumentRepositoryPath;
QHash<int,QString>teacherBarNodeString;
private slots:
void documentRepositoryChanged(const QString& path);

@ -37,12 +37,13 @@ QString UBSettings::documentIdentifer = QString("ID");
QString UBSettings::documentVersion = QString("Version");
QString UBSettings::documentUpdatedAt = QString("UpdatedAt");
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::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::trashedDocumentGroupNamePrefix = QString("_Trash:");
@ -54,7 +55,7 @@ QString UBSettings::uniboardApplicationNamespaceUri = "http://uniboard.mnemis.co
const int UBSettings::sDefaultFontPixelSize = 36;
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::crossLightBackground = QColor(165, 225, 255);
@ -381,6 +382,8 @@ void UBSettings::init()
angleTolerance = new UBSetting(this, "App", "AngleTolerance", 4);
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 documentVersion;
static QString documentUpdatedAt;
static QString sessionTitle;
static QString sessionTarget;
static QString sessionLicence;
static QString sessionKeywords;
static QString sessionLevel;
static QString sessionTopic;
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 trashedDocumentGroupNamePrefix;
@ -330,6 +333,8 @@ class UBSettings : public QObject
UBSetting* angleTolerance;
UBSetting* historyLimit;
UBSetting* teacherGuidePageZeroActivated;
UBSetting* teacherGuideLessonPagesActivated;
public slots:

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

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

@ -12,6 +12,7 @@
* 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 "UBDocumentController.h"
#include <QtCore>
@ -289,9 +290,9 @@ void UBDocumentController::refreshDocumentThumbnailsView()
}
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);
if (selection)
{
disconnect(mDocumentUI->thumbnailWidget->scene(), SIGNAL(selectionChanged()),
this, SLOT(pageSelectionChanged()));
if (selection) {
disconnect(mDocumentUI->thumbnailWidget->scene(), SIGNAL(selectionChanged()), this, SLOT(pageSelectionChanged()));
UBSceneThumbnailPixmap *currentScene = dynamic_cast<UBSceneThumbnailPixmap*>(selection);
if (currentScene)
mDocumentUI->thumbnailWidget->hightlightItem(currentScene->sceneIndex());
connect(mDocumentUI->thumbnailWidget->scene(), SIGNAL(selectionChanged()),
this, SLOT(pageSelectionChanged()));
connect(mDocumentUI->thumbnailWidget->scene(), SIGNAL(selectionChanged()), this, SLOT(pageSelectionChanged()));
}
emit refreshThumbnails();
@ -1640,7 +1638,7 @@ int UBDocumentController::getSelectedItemIndex()
if (selectedItems.count() > 0)
{
UBSceneThumbnailPixmap* thumb = dynamic_cast<UBSceneThumbnailPixmap*> (selectedItems.last());
UBSceneThumbnailPixmap* thumb = dynamic_cast<UBSceneThumbnailPixmap*> (selectedItems.last());
return thumb->sceneIndex();
}
else return -1;

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

@ -50,13 +50,15 @@ void UBDocumentProxy::init()
setDefaultDocumentSize(UBSettings::settings()->pageSize->get().toSize());
setSessionTitle("");
setSessionTarget("");
setSessionLicence("");
setSessionKeywords("");
setSessionLevel("");
setSessionTopic("");
setSessionAuthor("");
//teacherGuide metadata
setMetaData(UBSettings::sessionTitle,"");
setMetaData(UBSettings::sessionAuthors,"");
setMetaData(UBSettings::sessionObjectives,"");
setMetaData(UBSettings::sessionKeywords,"");
setMetaData(UBSettings::sessionGradeLevel,"");
setMetaData(UBSettings::sessionSubjects,"");
setMetaData(UBSettings::sessionType,"");
setMetaData(UBSettings::sessionLicence,"");
}
@ -204,101 +206,9 @@ void UBDocumentProxy::setUuid(const QUuid& 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()
{
qDebug()<< UBSettings::documentDate;
qDebug()<<mMetaDatas;
if(mMetaDatas.contains(UBSettings::documentDate))
return UBStringUtils::fromUtcIsoDate(metaData(UBSettings::documentDate).toString());
return QDateTime::currentDateTime();

@ -45,20 +45,6 @@ class UBDocumentProxy : public QObject
QString name() 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 lastUpdate();

@ -444,15 +444,15 @@ bool UBGraphicsScene::inputDevicePress(const QPointF& scenePos, const qreal& pre
mAddedItems.clear();
mRemovedItems.clear();
if (UBDrawingController::drawingController()->mActiveRuler)
if (UBDrawingController::drawingController()->mActiveRuler)
{
UBDrawingController::drawingController()->mActiveRuler->StartLine(scenePos, width);
}
else
{
moveTo(scenePos);
}
else
{
moveTo(scenePos);
drawLineTo(scenePos, width, UBDrawingController::drawingController()->stylusTool() == UBStylusTool::Line);
}
}
accepted = true;
}
else if (currentTool == UBStylusTool::Eraser)
@ -638,8 +638,8 @@ bool UBGraphicsScene::inputDeviceRelease()
mCurrentStroke = 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
void UBGraphicsScene::DisposeMagnifierQWidgets()
{
if(magniferControlViewWidget)
if(magniferControlViewWidget)
{
magniferControlViewWidget->hide();
magniferControlViewWidget->setParent(0);
@ -710,7 +710,7 @@ void UBGraphicsScene::DisposeMagnifierQWidgets()
magniferControlViewWidget = NULL;
}
if(magniferDisplayViewWidget)
if(magniferDisplayViewWidget)
{
magniferDisplayViewWidget->hide();
magniferDisplayViewWidget->setParent(0);
@ -727,7 +727,7 @@ void UBGraphicsScene::DisposeMagnifierQWidgets()
catch (...)
{
}
}
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);
@ -784,7 +784,7 @@ void UBGraphicsScene::drawLineTo(const QPointF &pEndPoint, const qreal &pWidth,
mPreviousPolygonItems.append(polygonItem);
if (!bLineStyle)
if (!bLineStyle)
{
mPreviousPoint = pEndPoint;
mPreviousWidth = pWidth;
@ -1617,6 +1617,33 @@ UBGraphicsTextItem* UBGraphicsScene::addText(const QString& pString, const QPoin
, 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
, int pointSize, const QString& fontFamily, bool bold, bool italic)
@ -2069,11 +2096,11 @@ void UBGraphicsScene::addCache()
}
void UBGraphicsScene::addMask(const QPointF &center)
{
{
UBGraphicsCurtainItem* curtain = new UBGraphicsCurtainItem(); // mem : owned and destroyed by the scene
mTools << curtain;
addItem(curtain);
addItem(curtain);
QRectF rect = UBApplication::boardController->activeScene()->normalizedSceneRect();
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)
{
{
item->setZValue(mZLayerController->generateZLevel(itemLayerType::SelectedItem));
}
void UBGraphicsScene::setOwnZlevel(QGraphicsItem *item)
@ -2323,7 +2350,7 @@ void UBGraphicsScene::keyReleaseEvent(QKeyEvent * keyEvent)
UBGraphicsW3CWidgetItem *wc3_widget = dynamic_cast<UBGraphicsW3CWidgetItem*>(item);
if (0 != wc3_widget)
if (!wc3_widget->hasFocus())
wc3_widget->remove();
wc3_widget->remove();
break;
}
case UBGraphicsAppleWidgetItem::Type:
@ -2331,7 +2358,7 @@ void UBGraphicsScene::keyReleaseEvent(QKeyEvent * keyEvent)
UBGraphicsAppleWidgetItem *Apple_widget = dynamic_cast<UBGraphicsAppleWidgetItem*>(item);
if (0 !=Apple_widget)
if (!Apple_widget->hasFocus())
Apple_widget->remove();
Apple_widget->remove();
break;
}
case UBGraphicsTextItem::Type:
@ -2339,7 +2366,7 @@ void UBGraphicsScene::keyReleaseEvent(QKeyEvent * keyEvent)
UBGraphicsTextItem *text_item = dynamic_cast<UBGraphicsTextItem*>(item);
if (0 != text_item)
if (!text_item->hasFocus())
text_item->remove();
text_item->remove();
break;
}
@ -2349,7 +2376,7 @@ void UBGraphicsScene::keyReleaseEvent(QKeyEvent * keyEvent)
if (0 != ubgi)
ubgi->remove();
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));
UBGraphicsSvgItem* addSvg(const QUrl& pSvgFileUrl, const QPointF& pPos = 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)
, int pointSize = -1, const QString& fontFamily = "", bool bold = false, bool italic = false);
@ -280,10 +281,10 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem
mTools << item;
}
const QPointF& previousPoint()
{
return mPreviousPoint;
}
const QPointF& previousPoint()
{
return mPreviousPoint;
}
void setSelectedZLevel(QGraphicsItem *item);
void setOwnZlevel(QGraphicsItem *item);

@ -246,6 +246,8 @@ QString UBW3CWidget::createNPAPIWrapperInDir(const QString& pUrl, const QDir& pD
const QString& pName)
{
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;
QFileInfo fi(url);
@ -299,9 +301,11 @@ QString UBW3CWidget::createNPAPIWrapperInDir(const QString& pUrl, const QDir& pD
}
widgetLibraryDir.mkpath(widgetLibraryPath);
if (fi.exists()) {
if (fi.exists()){
QString target = widgetLibraryPath + "/" + fi.fileName();
QFile::copy(pUrl, target);
QString source = pUrl;
source.replace("file://","");
QFile::copy(source, target);
}
QFile configFile(widgetLibraryPath + "/config.xml");

@ -16,6 +16,11 @@
#include "UBFileSystemUtils.h"
#include <QtGui>
#include "core/UBApplication.h"
#include "board/UBBoardController.h"
#include "globals/UBGlobals.h"
THIRD_PARTY_WARNINGS_DISABLE
@ -313,7 +318,8 @@ QString UBFileSystemUtils::normalizeFilePath(const QString& pFilePath)
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 "core/UBApplication.h"
#include "core/UBSettings.h"
#include "softwareupdate/UBSoftwareUpdate.h"
#include "softwareupdate/UBSoftwareUpdateController.h"
#include "frameworks/UBFileSystemUtils.h"
#include <QWidget>

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

@ -56,6 +56,7 @@ UBDocumentNavigator::UBDocumentNavigator(QWidget *parent, const char *name):QGra
setFrameShadow(QFrame::Plain);
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(UBApplication::boardController, SIGNAL(documentReorganized(int)), this, SLOT(onMovedToIndex(int)));
connect(UBApplication::boardController, SIGNAL(scrollToSelectedPage()), this, SLOT(onScrollToSelectedPage()));
@ -113,7 +114,7 @@ void UBDocumentNavigator::generateThumbnails()
{
QPixmap pix = thumbs.at(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);
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
//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());
QFile::remove(to);
QFile::copy(from, to);
@ -452,4 +452,4 @@ bool UBDocumentGroupTreeItem::isDefaultFolder() const
void UBDocumentTreeWidget::autoScroll()
{
this->verticalScrollBar()->setValue(this->verticalScrollBar()->value() + mScrollMagnitude);
}
}

@ -33,8 +33,7 @@ UBNavigatorPalette::UBNavigatorPalette(QWidget *parent, const char *name):
{
setOrientation(eUBDockOrientation_Left);
setMaximumWidth(300);
//mCollapsedIcon = QPixmap(":images/pages_open.png");
//mIcon = QPixmap(":images/pages_close.png");
resize(UBSettings::settings()->navigPaletteWidth->get().toInt(), height());
mLastWidth = 300;
@ -129,7 +128,7 @@ void UBNavigatorPalette::changeCurrentPage()
if(NO_PAGESELECTED != iPage)
{
// 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)
{
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 "adaptors/UBSvgSubsetAdaptor.h"
#include "core/UBApplication.h"
#include "core/UBPersistenceManager.h"
#include "core/UBSettings.h"
#include "globals/UBGlobals.h"
@ -40,10 +43,21 @@
#include "document/UBDocumentProxy.h"
#include "document/UBDocumentController.h"
#include "domain/UBGraphicsTextItem.h"
#include "core/memcheck.h"
#define UBTG_SEPARATOR_FIXED_HEIGHT 3
typedef enum
{
eUBTGAddSubItemWidgetType_None,
eUBTGAddSubItemWidgetType_Action ,
eUBTGAddSubItemWidgetType_Media,
eUBTGAddSubItemWidgetType_Url
}eUBTGAddSubItemWidgetType;
/***************************************************************************
* class UBTeacherGuideEditionWidget *
@ -62,20 +76,21 @@ UBTeacherGuideEditionWidget::UBTeacherGuideEditionWidget(QWidget *parent, const
, mpAddAnActionItem(NULL)
, mpAddAMediaItem(NULL)
, mpAddALinkItem(NULL)
, mpTreeDelegate(NULL)
{
setObjectName(name);
mpLayout = new QVBoxLayout(this);
mpPageNumberLabel = new QLabel(this);
mpPageNumberLabel->setAlignment(Qt::AlignRight);
mpPageNumberLabel->setObjectName("UBTGEditionPageNumberLabel");
mpPageNumberLabel->setObjectName("UBTGPageNumberLabel");
mpLayout->addWidget(mpPageNumberLabel);
// tree basic configuration
mpDocumentTitle = new QLabel(this);
mpDocumentTitle->setText("Document title");
mpDocumentTitle->setObjectName("UBTGEditionDocumentTitle");
mpLayout->addWidget(mpDocumentTitle);
if(UBSettings::settings()->teacherGuidePageZeroActivated->get().toBool()){
mpDocumentTitle = new QLabel(this);
mpDocumentTitle->setObjectName("UBTGPresentationDocumentTitle");
mpLayout->addWidget(mpDocumentTitle);
}
mpPageTitle = new UBTGAdaptableText(0,this);
mpPageTitle->setObjectName("UBTGEditionPageTitle");
@ -95,10 +110,7 @@ UBTeacherGuideEditionWidget::UBTeacherGuideEditionWidget(QWidget *parent, const
mpTreeWidget = new QTreeWidget(this);
mpLayout->addWidget(mpTreeWidget);
mpTreeDelegate = new UBTGWidgetTreeDelegate();
mpRootWidgetItem = mpTreeWidget->invisibleRootItem();
//mpTreeWidget->setItemDelegate(mpTreeDelegate);
mpTreeWidget->setRootIsDecorated(false);
mpTreeWidget->setIndentation(0);
mpTreeWidget->setDropIndicatorShown(false);
@ -120,6 +132,11 @@ UBTeacherGuideEditionWidget::UBTeacherGuideEditionWidget(QWidget *parent, const
mpRootWidgetItem->addChild(mpAddAnActionItem);
mpRootWidgetItem->addChild(mpAddAMediaItem);
mpRootWidgetItem->addChild(mpAddALinkItem);
if(UBSettings::settings()->teacherGuideLessonPagesActivated->get().toBool()){
UBSvgSubsetAdaptor::addElementToBeStored(QString("teacherGuide"),this);
connect(UBApplication::boardController,SIGNAL(activeDocumentChanged()),this,SLOT(onActiveDocumentChanged()));
}
}
UBTeacherGuideEditionWidget::~UBTeacherGuideEditionWidget()
@ -132,23 +149,103 @@ UBTeacherGuideEditionWidget::~UBTeacherGuideEditionWidget()
DELETEPTR(mpAddAnActionItem);
DELETEPTR(mpAddAMediaItem);
DELETEPTR(mpAddALinkItem);
DELETEPTR(mpTreeDelegate);
DELETEPTR(mpTreeWidget)
DELETEPTR(mpLayout);
}
void UBTeacherGuideEditionWidget::showEvent(QShowEvent* event)
{
mpPageTitle->setFocus();
mpComment->setFocus();
setFocus();
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();
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()
@ -162,7 +259,6 @@ void UBTeacherGuideEditionWidget::cleanData()
foreach(QTreeWidgetItem* item, children){
DELETEPTR(item);
}
}
QList<QTreeWidgetItem*> UBTeacherGuideEditionWidget::getChildrenList(QTreeWidgetItem* widgetItem)
@ -177,12 +273,12 @@ QVector<tUBGEElementNode*> UBTeacherGuideEditionWidget::getPageAndCommentData()
{
QVector<tUBGEElementNode*>result;
tUBGEElementNode* pageTitle = new tUBGEElementNode();
pageTitle->type = "pageTitle";
pageTitle->name = "pageTitle";
pageTitle->attributes.insert("value",mpPageTitle->text());
result << pageTitle;
tUBGEElementNode* comment = new tUBGEElementNode();
comment->type = "comment";
comment->name = "comment";
comment->attributes.insert("value",mpComment->text());
result << comment;
return result;
@ -196,32 +292,42 @@ QVector<tUBGEElementNode*> UBTeacherGuideEditionWidget::getData()
children << getChildrenList(mpAddALinkItem);
result << getPageAndCommentData();
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)
result << node;
}
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();
if(column == 0 && addSubItemWidgetType != eUBTGAddSubItemWidgetType_None){
if(addSubItemWidgetType != eUBTGAddSubItemWidgetType_None){
QTreeWidgetItem* newWidgetItem = new QTreeWidgetItem(widget);
newWidgetItem->setData(column,Qt::UserRole,eUBTGAddSubItemWidgetType_None);
newWidgetItem->setData(1,Qt::UserRole,eUBTGAddSubItemWidgetType_None);
newWidgetItem->setIcon(1,QIcon(":images/close.svg"));
switch(addSubItemWidgetType)
{
case eUBTGAddSubItemWidgetType_Action:
mpTreeWidget->setItemWidget(newWidgetItem,0,new UBTGActionWidget(widget));
case eUBTGAddSubItemWidgetType_Action:{
UBTGActionWidget* actionWidget = new UBTGActionWidget(widget);
if(element) actionWidget->initializeWithDom(*element);
mpTreeWidget->setItemWidget(newWidgetItem,0,actionWidget);
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;
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;
}
default:
delete newWidgetItem;
qCritical() << "onAddItemClicked no action set";
@ -237,6 +343,8 @@ void UBTeacherGuideEditionWidget::onAddItemClicked(QTreeWidgetItem* widget, int
}
}
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();
QTreeWidgetItem* toBeDeletedWidgetItem = widget->parent()->takeChild(index);
delete toBeDeletedWidgetItem;
@ -280,7 +388,7 @@ UBTeacherGuidePresentationWidget::UBTeacherGuidePresentationWidget(QWidget *pare
mpPageNumberLabel = new QLabel(this);
mpPageNumberLabel->setAlignment(Qt::AlignRight);
mpPageNumberLabel->setObjectName("UBTGPresentationPageNumberLabel");
mpPageNumberLabel->setObjectName("UBTGPageNumberLabel");
mpLayout->addWidget(mpPageNumberLabel);
@ -289,15 +397,16 @@ UBTeacherGuidePresentationWidget::UBTeacherGuidePresentationWidget(QWidget *pare
mpModePushButton = new QPushButton(this);
mpModePushButton->setIcon(QIcon(":images/pencil.svg"));
mpModePushButton->setMaximumWidth(32);
mpModePushButton->installEventFilter(this);
connect(mpModePushButton,SIGNAL(clicked()),parentWidget(),SLOT(changeMode()));
mpDocumentTitle = new QLabel(this);
mpDocumentTitle->setObjectName("UBTGPresentationDocumentTitle");
mpDocumentTitle->setText(tr("Document title"));
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);
@ -318,10 +427,11 @@ UBTeacherGuidePresentationWidget::UBTeacherGuidePresentationWidget(QWidget *pare
mpSeparator->setObjectName("UBTGSepartor");
mpLayout->addWidget(mpSeparator);
mpTreeWidget = new QTreeWidget(this);
mpTreeWidget = new UBTGDraggableTreeItem(this);
mpLayout->addWidget(mpTreeWidget);
mpRootWidgetItem = mpTreeWidget->invisibleRootItem();
mpTreeWidget->setDragEnabled(true);
mpTreeWidget->setRootIsDecorated(false);
mpTreeWidget->setIndentation(0);
mpTreeWidget->setDropIndicatorShown(false);
@ -345,6 +455,14 @@ UBTeacherGuidePresentationWidget::~UBTeacherGuidePresentationWidget()
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()
{
mpPageTitle->showText("");
@ -361,15 +479,16 @@ void UBTeacherGuidePresentationWidget::cleanData()
void UBTeacherGuidePresentationWidget::onActiveSceneChanged()
{
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()
{
if(!mpMediaSwitchItem){
//create the media button
mpMediaSwitchItem = new QTreeWidgetItem(mpRootWidgetItem);
//mpMediaSwitchItem->setIcon(0,QIcon(":images/plus.svg"));
mpMediaSwitchItem->setText(0,"+");
mpMediaSwitchItem->setExpanded(false);
mpMediaSwitchItem->setData(0,tUBTGTreeWidgetItemRole_HasAnAction,tUBTGActionAssociateOnClickItem_EXPAND);
@ -386,13 +505,14 @@ void UBTeacherGuidePresentationWidget::showData(QVector<tUBGEElementNode*> data)
cleanData();
foreach(tUBGEElementNode* element, data){
if(element->type == "pageTitle")
if(element->name == "pageTitle")
mpPageTitle->showText(element->attributes.value("value"));
else if (element->type == "comment")
else if (element->name == "comment")
mpComment->showText(element->attributes.value("value"));
else if(element->type == "action"){
else if(element->name == "action"){
QTreeWidgetItem* newWidgetItem = new QTreeWidgetItem(mpRootWidgetItem);
newWidgetItem->setText(0,element->attributes.value("task"));
newWidgetItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
QString colorString = element->attributes.value("owner").toInt() == 0 ? "red":"green";
UBTGAdaptableText* textWidget = new UBTGAdaptableText(newWidgetItem,0);
textWidget->bottomMargin(14);
@ -403,13 +523,15 @@ void UBTeacherGuidePresentationWidget::showData(QVector<tUBGEElementNode*> data)
mpRootWidgetItem->addChild(newWidgetItem);
}
else if(element->type == "media"){
else if(element->name == "media"){
createMediaButtonItem();
QTreeWidgetItem* newWidgetItem = new QTreeWidgetItem(mpMediaSwitchItem);
newWidgetItem->setIcon(0,QIcon(":images/teacherGuide/"+ element->attributes.value("mediaType") +".png"));
newWidgetItem->setText(0,element->attributes.value("title"));
newWidgetItem->setData(0,tUBTGTreeWidgetItemRole_HasAnAction,tUBTGActionAssociateOnClickItem_MEDIA);
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);
QTreeWidgetItem* mediaItem = new QTreeWidgetItem(newWidgetItem);
@ -418,7 +540,7 @@ void UBTeacherGuidePresentationWidget::showData(QVector<tUBGEElementNode*> data)
newWidgetItem->setExpanded(false);
mpTreeWidget->setItemWidget(mediaItem,0,mediaWidget);
}
else if(element->type == "link"){
else if(element->name == "link"){
createMediaButtonItem();
QTreeWidgetItem* newWidgetItem = new QTreeWidgetItem(mpMediaSwitchItem);
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_HasAnUrl,QVariant(element->attributes.value("url")));
newWidgetItem->setData(0,Qt::FontRole, QVariant(QFont(QApplication::font().family(),11)));
newWidgetItem->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable);
mpRootWidgetItem->addChild(newWidgetItem);
}
}
@ -461,7 +584,7 @@ void UBTeacherGuidePresentationWidget::onAddItemClicked(QTreeWidgetItem* widget,
/***************************************************************************
* class UBTeacherGuidePageZeroEditionWidget *
***************************************************************************/
UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget* parent, const char* name): QWidget(parent)
UBTeacherGuidePageZeroWidget::UBTeacherGuidePageZeroWidget(QWidget* parent, const char* name): QWidget(parent)
, mpLayout(NULL)
, mpButtonTitleLayout(NULL)
, mpModePushButton(NULL)
@ -473,18 +596,18 @@ UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget
, mpSeparatorAuthors(NULL)
, mpCreationLabel(NULL)
, mpLastModifiedLabel(NULL)
, mpGoalsLabel(NULL)
, mpGoals(NULL)
, mpSeparatorGoals(NULL)
, mpObjectivesLabel(NULL)
, mpObjectives(NULL)
, mpSeparatorObjectives(NULL)
, mpIndexLabel(NULL)
, mpKeywordsLabel(NULL)
, mpKeywords(NULL)
, mpSchoolLevelItemLabel(NULL)
, mpSchoolLevelBox(NULL)
, mpSchoolLevelValueLabel(NULL)
, mpSchoolBranchItemLabel(NULL)
, mpSchoolBranchBox(NULL)
, mpSchoolBranchValueLabel(NULL)
, mpSchoolSubjectsItemLabel(NULL)
, mpSchoolSubjectsBox(NULL)
, mpSchoolSubjectsValueLabel(NULL)
, mpSchoolTypeItemLabel(NULL)
, mpSchoolTypeBox(NULL)
, mpSchoolTypeValueLabel(NULL)
@ -493,13 +616,15 @@ UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget
, mpLicenceBox(NULL)
, mpLicenceIcon(NULL)
, mpLicenceLayout(NULL)
, mpSceneItemSessionTitle(NULL)
{
setObjectName(name);
mpLayout = new QVBoxLayout(this);
QString chapterStyle("QLabel {font-size:16px; font-weight:bold;}");
mpLayout = new QVBoxLayout(0);
setLayout(mpLayout);
mpPageNumberLabel = new QLabel(this);
mpPageNumberLabel->setAlignment(Qt::AlignRight);
mpPageNumberLabel->setObjectName("UBTGPresentationPageNumberLabel");
mpPageNumberLabel->setObjectName("UBTGPageNumberLabel");
mpPageNumberLabel->setText(tr("Page 0"));
mpLayout->addWidget(mpPageNumberLabel);
@ -508,12 +633,12 @@ UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget
mpModePushButton = new QPushButton(this);
mpModePushButton->setIcon(QIcon(":images/pencil.svg"));
mpModePushButton->setMaximumWidth(32);
mpModePushButton->installEventFilter(this);
mpButtonTitleLayout->addWidget(mpModePushButton);
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->setObjectName("UBTGEditionModeSessionTitle");
mpButtonTitleLayout->addWidget(mpSessionTitle);
mpLayout->addLayout(mpButtonTitleLayout);
@ -526,6 +651,7 @@ UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget
mpAuthorsLabel = new QLabel(this);
mpAuthorsLabel->setObjectName("UBTGZeroPageEditionModeTitle");
mpAuthorsLabel->setText(tr("Author(s)"));
mpAuthorsLabel->setStyleSheet(chapterStyle);
mpLayout->addWidget(mpAuthorsLabel);
mpAuthors = new UBTGAdaptableText(0,this);
@ -546,29 +672,32 @@ UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget
mpSeparatorAuthors->setObjectName("UBTGSeparator");
mpLayout->addWidget(mpSeparatorAuthors);
mpGoalsLabel = new QLabel(this);
mpGoalsLabel->setObjectName("UBTGZeroPageEditionModeTitle");
mpGoalsLabel->setText(tr("Goal(s)"));
mpLayout->addWidget(mpGoalsLabel);
mpObjectivesLabel = new QLabel(this);
mpObjectivesLabel->setObjectName("UBTGZeroPageEditionModeTitle");
mpObjectivesLabel->setText(tr("Objective(s)"));
mpObjectivesLabel->setStyleSheet(chapterStyle);
mpLayout->addWidget(mpObjectivesLabel);
mpGoals = new UBTGAdaptableText(0,this);
mpGoals->setObjectName("UBTGZeroPageInputText");
mpGoals->setPlaceHolderText(tr("Type goals here..."));
mpLayout->addWidget(mpGoals);
mpObjectives = new UBTGAdaptableText(0,this);
mpObjectives->setObjectName("UBTGZeroPageInputText");
mpObjectives->setPlaceHolderText(tr("Type objectives here..."));
mpLayout->addWidget(mpObjectives);
mpSeparatorGoals = new QFrame(this);
mpSeparatorGoals->setFixedHeight(UBTG_SEPARATOR_FIXED_HEIGHT);
mpSeparatorGoals->setObjectName("UBTGSeparator");
mpLayout->addWidget(mpSeparatorGoals);
mpSeparatorObjectives = new QFrame(this);
mpSeparatorObjectives->setFixedHeight(UBTG_SEPARATOR_FIXED_HEIGHT);
mpSeparatorObjectives->setObjectName("UBTGSeparator");
mpLayout->addWidget(mpSeparatorObjectives);
mpIndexLabel = new QLabel(this);
mpIndexLabel->setObjectName("UBTGZeroPageEditionModeTitle");
mpIndexLabel->setText(tr("Resource indexing"));
mpIndexLabel->setStyleSheet(chapterStyle);
mpLayout->addWidget(mpIndexLabel);
mpKeywordsLabel = new QLabel(this);
mpKeywordsLabel->setObjectName("UBTGZeroPageItemLabel");
mpKeywordsLabel->setText(tr("Keywords:"));
mpKeywordsLabel->setStyleSheet(chapterStyle);
mpLayout->addWidget(mpKeywordsLabel);
mpKeywords = new UBTGAdaptableText(0,this);
mpKeywords->setPlaceHolderText(tr("Type keywords here ..."));
@ -577,29 +706,35 @@ UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget
mpSchoolLevelItemLabel = new QLabel(this);
mpSchoolLevelItemLabel->setObjectName("UBTGZeroPageItemLabel");
mpSchoolLevelItemLabel->setText(tr("Level:"));
mpSchoolLevelItemLabel->setStyleSheet(chapterStyle);
mpLayout->addWidget(mpSchoolLevelItemLabel);
mpSchoolLevelBox = new QComboBox(this);
mpSchoolLevelBox->setMinimumHeight(22);
mpSchoolLevelBox->setObjectName("DockPaletteWidgetComboBox");
connect(mpSchoolLevelBox,SIGNAL(currentIndexChanged(QString)),this,SLOT(onSchoolLevelChanged(QString)));
mpLayout->addWidget(mpSchoolLevelBox);
mpSchoolLevelValueLabel = new QLabel(this);
mpLayout->addWidget(mpSchoolLevelValueLabel);
mpSchoolBranchItemLabel = new QLabel(this);
mpSchoolBranchItemLabel->setObjectName("UBTGZeroPageItemLabel");
mpSchoolBranchItemLabel->setText(tr("Branch:"));
mpLayout->addWidget(mpSchoolBranchItemLabel);
mpSchoolBranchBox = new QComboBox(this);
mpSchoolBranchBox->setObjectName("DockPaletteWidgetComboBox");
mpLayout->addWidget(mpSchoolBranchBox);
mpSchoolBranchValueLabel = new QLabel(this);
mpLayout->addWidget(mpSchoolBranchValueLabel);
mpSchoolSubjectsItemLabel = new QLabel(this);
mpSchoolSubjectsItemLabel->setObjectName("UBTGZeroPageItemLabel");
mpSchoolSubjectsItemLabel->setText(tr("Subjects:"));
mpSchoolSubjectsItemLabel->setStyleSheet(chapterStyle);
mpLayout->addWidget(mpSchoolSubjectsItemLabel);
mpSchoolSubjectsBox = new QComboBox(this);
mpSchoolSubjectsBox->setMinimumHeight(22);
mpSchoolSubjectsBox->setObjectName("DockPaletteWidgetComboBox");
mpLayout->addWidget(mpSchoolSubjectsBox);
mpSchoolSubjectsValueLabel = new QLabel(this);
mpLayout->addWidget(mpSchoolSubjectsValueLabel);
mpSchoolTypeItemLabel = new QLabel(this);
mpSchoolTypeItemLabel->setObjectName("UBTGZeroPageItemLabel");
mpSchoolTypeItemLabel->setText(tr("Type:"));
mpSchoolTypeItemLabel->setStyleSheet(chapterStyle);
mpLayout->addWidget(mpSchoolTypeItemLabel);
mpSchoolTypeBox = new QComboBox(this);
mpSchoolTypeBox->setMinimumHeight(22);
mpSchoolTypeBox->setObjectName("DockPaletteWidgetComboBox");
mpLayout->addWidget(mpSchoolTypeBox);
mpSchoolTypeValueLabel = new QLabel(this);
@ -612,9 +747,11 @@ UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget
mpLicenceLabel = new QLabel(this);
mpLicenceLabel->setObjectName("UBTGZeroPageItemLabel");
mpLicenceLabel->setText(tr("Licence:"));
mpLicenceLabel->setText(tr("Licence"));
mpLicenceLabel->setStyleSheet(chapterStyle);
mpLayout->addWidget(mpLicenceLabel);
mpLicenceBox = new QComboBox(this);
mpLicenceBox->setMinimumHeight(22);
mpLicenceBox->setObjectName("DockPaletteWidgetComboBox");
mpLayout->addWidget(mpLicenceBox);
mpLicenceLayout = new QHBoxLayout(0);
@ -624,11 +761,13 @@ UBTeacherGuidePageZeroEditionWidget::UBTeacherGuidePageZeroEditionWidget(QWidget
mpLicenceLayout->addWidget(mpLicenceValueLabel);
mpLayout->addLayout(mpLicenceLayout);
mpLayout->addStretch(1);
connect(UBApplication::boardController,SIGNAL(activeSceneChanged()), this, SLOT(onActiveSceneChanged()));
fillComboBoxes();
}
UBTeacherGuidePageZeroEditionWidget::~UBTeacherGuidePageZeroEditionWidget()
UBTeacherGuidePageZeroWidget::~UBTeacherGuidePageZeroWidget()
{
DELETEPTR(mpPageNumberLabel);
DELETEPTR(mpSessionTitle);
@ -638,16 +777,16 @@ UBTeacherGuidePageZeroEditionWidget::~UBTeacherGuidePageZeroEditionWidget()
DELETEPTR(mpSeparatorAuthors);
DELETEPTR(mpCreationLabel);
DELETEPTR(mpLastModifiedLabel);
DELETEPTR(mpGoalsLabel);
DELETEPTR(mpGoals);
DELETEPTR(mpSeparatorGoals);
DELETEPTR(mpObjectivesLabel);
DELETEPTR(mpObjectives);
DELETEPTR(mpSeparatorObjectives);
DELETEPTR(mpIndexLabel);
DELETEPTR(mpKeywordsLabel);
DELETEPTR(mpKeywords);
DELETEPTR(mpSchoolLevelItemLabel);
DELETEPTR(mpSchoolLevelBox);
DELETEPTR(mpSchoolBranchItemLabel);
DELETEPTR(mpSchoolBranchBox);
DELETEPTR(mpSchoolSubjectsItemLabel);
DELETEPTR(mpSchoolSubjectsBox);
DELETEPTR(mpSchoolTypeItemLabel);
DELETEPTR(mpSchoolTypeBox);
DELETEPTR(mpSeparatorIndex);
@ -661,7 +800,15 @@ UBTeacherGuidePageZeroEditionWidget::~UBTeacherGuidePageZeroEditionWidget()
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";
QFile parametersFile(parametersConfigFilePath);
@ -702,49 +849,111 @@ void UBTeacherGuidePageZeroEditionWidget::fillComboBoxes()
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");
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));
mpSchoolBranchBox->clear();
mpSchoolSubjectsBox->clear();
if(subjects.count()){
mpSchoolBranchItemLabel->setEnabled(true);
mpSchoolBranchBox->setEnabled(true);
mpSchoolBranchBox->addItems(subjects);
mpSchoolSubjectsItemLabel->setEnabled(true);
mpSchoolSubjectsBox->setEnabled(true);
mpSchoolSubjectsBox->addItems(subjects);
}
else{
mpSchoolBranchItemLabel->setDisabled(true);
mpSchoolBranchBox->setDisabled(true);
mpSchoolSubjectsItemLabel->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;
if(UBApplication::documentController && UBApplication::boardController->activeSceneIndex() == 0){
// QDateTime creationDate = documentProxy->documentDate();
// mpCreationLabel->setText(tr("Created the:") + creationDate.toString(Qt::SystemLocaleShortDate));
// QDateTime updatedDate = documentProxy->lastUpdate();
// mpLastModifiedLabel->setText(tr("Updated the:") + updatedDate.toString(Qt::SystemLocaleShortDate));
UBDocumentProxy* documentProxy = UBApplication::boardController->activeDocument();
mpSessionTitle->setText(documentProxy->metaData(UBSettings::sessionTitle).toString());
mpAuthors->setText(documentProxy->metaData(UBSettings::sessionAuthors).toString());
mpObjectives->setText(documentProxy->metaData(UBSettings::sessionObjectives).toString());
mpKeywords->setText(documentProxy->metaData(UBSettings::sessionKeywords).toString());
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){
QString inputStyleSheet("QTextEdit { background: white; border-radius: 10px; border: 2px;}");
mpModePushButton->hide();
mpSessionTitle->setReadOnly(false);
mpSessionTitle->setStyleSheet(inputStyleSheet);
QFont titleFont(QApplication::font().family(),11,-1);
mpSessionTitle->document()->setDefaultFont(titleFont);
mpAuthors->setReadOnly(false);
mpGoals->setReadOnly(false);
mpAuthors->setStyleSheet(inputStyleSheet);
mpObjectives->setReadOnly(false);
mpObjectives->setStyleSheet(inputStyleSheet);
mpKeywords->setReadOnly(false);
mpKeywords->setStyleSheet(inputStyleSheet);
mpSchoolLevelValueLabel->hide();
mpSchoolLevelBox->show();
mpSchoolBranchValueLabel->hide();
mpSchoolBranchBox->show();
mpSchoolSubjectsValueLabel->hide();
mpSchoolSubjectsBox->show();
mpSchoolTypeValueLabel->hide();
mpSchoolTypeBox->show();
mpLicenceIcon->hide();
@ -752,84 +961,94 @@ void UBTeacherGuidePageZeroEditionWidget::switchToMode(tUBTGZeroPageMode mode)
mpLicenceBox->show();
}
else{
QString inputStyleSheet("QTextEdit { background: transparent; border: none;}");
mpModePushButton->show();
mpSessionTitle->setReadOnly(true);
mpAuthors->setReadOnly(true);
mpGoals->setReadOnly(true);
mpKeywords->setReadOnly(true);
mpSessionTitle->showText(mpSessionTitle->text());
mpSessionTitle->setStyleSheet(inputStyleSheet);
updateSceneTitle();
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->show();
mpSchoolLevelBox->hide();
mpSchoolBranchValueLabel->setText(mpSchoolBranchBox->currentText());
mpSchoolBranchValueLabel->show();
mpSchoolBranchBox->hide();
mpSchoolSubjectsValueLabel->setText(mpSchoolSubjectsBox->currentText());
mpSchoolSubjectsValueLabel->show();
mpSchoolSubjectsBox->hide();
mpSchoolTypeValueLabel->setText(mpSchoolTypeBox->currentText());
mpSchoolTypeValueLabel->show();
mpSchoolTypeBox->hide();
mpLicenceValueLabel->setText(mpLicenceBox->currentText());
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";
int licenceBoxCurrentIndex = mpLicenceBox->currentIndex();
// -1 is return if there is no values on the box
if(licenceBoxCurrentIndex > 0 && licenceBoxCurrentIndex < licenceIconList.count()){
mpLicenceIcon->setPixmap(licenceIconList.at(licenceBoxCurrentIndex));
QString licenceIconPath = mpLicenceBox->itemData(mpLicenceBox->currentIndex()).toString();
if(!licenceIconPath.isEmpty()){
mpLicenceIcon->setPixmap(QPixmap(licenceIconPath));
mpLicenceIcon->show();
}
mpLicenceValueLabel->show();
mpLicenceBox->hide();
persistData();
}
update();
}
QVector<tUBGEElementNode*> UBTeacherGuidePageZeroEditionWidget::getData()
QVector<tUBGEElementNode*> UBTeacherGuidePageZeroWidget::getData()
{
QVector<tUBGEElementNode*>result;
tUBGEElementNode* elementNode = new tUBGEElementNode();
elementNode->type = "sessionTitle";
elementNode->name = "sessionTitle";
elementNode->attributes.insert("value",mpSessionTitle->text());
result << elementNode;
elementNode = new tUBGEElementNode();
elementNode->type = "authors";
elementNode->name = "authors";
elementNode->attributes.insert("value",mpAuthors->text());
result << elementNode;
elementNode = new tUBGEElementNode();
elementNode->type = "creationDate";
elementNode->name = "creationDate";
elementNode->attributes.insert("value",mpCreationLabel->text());
result << elementNode;
elementNode = new tUBGEElementNode();
elementNode->type = "lastModifiedDate";
elementNode->name = "lastModifiedDate";
elementNode->attributes.insert("value",mpLastModifiedLabel->text());
result << elementNode;
elementNode = new tUBGEElementNode();
elementNode->type = "goals";
elementNode->attributes.insert("value",mpGoals->text());
elementNode->name = "goals";
elementNode->attributes.insert("value",mpObjectives->text());
result << elementNode;
elementNode = new tUBGEElementNode();
elementNode->type = "keywords";
elementNode->name = "keywords";
elementNode->attributes.insert("value",mpKeywords->text());
result << elementNode;
elementNode = new tUBGEElementNode();
elementNode->type = "schoolLevel";
elementNode->name = "schoolLevel";
elementNode->attributes.insert("value",mpSchoolLevelBox->currentText());
result << elementNode;
elementNode = new tUBGEElementNode();
elementNode->type = "schoolBranch";
elementNode->attributes.insert("value",mpSchoolBranchBox->currentText());
elementNode->name = "schoolBranch";
elementNode->attributes.insert("value",mpSchoolSubjectsBox->currentText());
result << elementNode;
elementNode = new tUBGEElementNode();
elementNode->type = "schoolType";
elementNode->name = "schoolType";
elementNode->attributes.insert("value",mpSchoolTypeBox->currentText());
result << elementNode;
elementNode = new tUBGEElementNode();
elementNode->type = "licence";
elementNode->name = "licence";
elementNode->attributes.insert("value",mpLicenceBox->currentText());
result << elementNode;
return result;
@ -839,46 +1058,59 @@ QVector<tUBGEElementNode*> UBTeacherGuidePageZeroEditionWidget::getData()
* class UBTeacherGuideWidget *
***************************************************************************/
UBTeacherGuideWidget::UBTeacherGuideWidget(QWidget* parent, const char* name): QStackedWidget(parent)
, mpPageZeroEditonWidget(NULL)
, mpPageZeroWidget(NULL)
, mpEditionWidget(NULL)
, mpPresentationWidget(NULL)
{
setObjectName(name);
mpPageZeroEditonWidget = new UBTeacherGuidePageZeroEditionWidget(this);
addWidget(mpPageZeroEditonWidget);
setCurrentWidget(mpPageZeroEditonWidget);
// mpEditionWidget = new UBTeacherGuideEditionWidget(this);
// addWidget(mpEditionWidget);
// mpPresentationWidget = new UBTeacherGuidePresentationWidget(this);
// addWidget(mpPresentationWidget);
// setCurrentWidget(mpPresentationWidget);
if(UBSettings::settings()->teacherGuidePageZeroActivated->get().toBool()){
mpPageZeroWidget = new UBTeacherGuidePageZeroWidget(this);
addWidget(mpPageZeroWidget);
}
if(UBSettings::settings()->teacherGuideLessonPagesActivated->get().toBool()){
mpEditionWidget = new UBTeacherGuideEditionWidget(this);
addWidget(mpEditionWidget);
mpPresentationWidget = new UBTeacherGuidePresentationWidget(this);
addWidget(mpPresentationWidget);
}
connect(UBApplication::boardController->controlView(),SIGNAL(clickOnBoard()),this,SLOT(showPresentationMode()));
connectToStylusPalette();
connect(UBApplication::boardController,SIGNAL(activeSceneChanged()),this,SLOT(onActiveSceneChanged()));
}
UBTeacherGuideWidget::~UBTeacherGuideWidget()
{
DELETEPTR(mpPageZeroWidget);
DELETEPTR(mpEditionWidget);
DELETEPTR(mpPresentationWidget);
}
void UBTeacherGuideWidget::onActiveSceneChanged()
{
if(UBApplication::boardController->currentPage() == 0){
setCurrentWidget(mpPageZeroWidget);
mpPageZeroWidget->switchToMode(tUBTGZeroPageMode_EDITION);
}else
setCurrentWidget(mpEditionWidget);
}
void UBTeacherGuideWidget::connectToStylusPalette()
{
if(UBApplication::boardController->paletteManager())
connect(UBApplication::boardController->paletteManager()->stylusPalette(),SIGNAL(itemOnActionPaletteChanged()),this,SLOT(showPresentationMode()));
else
QTimer::singleShot(500,this,SLOT(connectToStylusPalette()));
QTimer::singleShot(100,this,SLOT(connectToStylusPalette()));
}
void UBTeacherGuideWidget::showPresentationMode()
{
if(currentWidget()==mpPageZeroEditonWidget){
mCurrentData = mpPageZeroEditonWidget->getData();
mpPageZeroEditonWidget->switchToMode(tUBTGZeroPageMode_PRESENTATION);
if(currentWidget()==mpPageZeroWidget){
mCurrentData = mpPageZeroWidget->getData();
mpPageZeroWidget->switchToMode(tUBTGZeroPageMode_PRESENTATION);
}
else if(currentWidget()==mpEditionWidget){
mCurrentData = mpEditionWidget->getData();

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

@ -21,12 +21,16 @@
#include <QDebug>
#include <QUrl>
#include <QWebSettings>
#include <QDomElement>
#include <QDomDocument>
#include <QApplication>
#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"
@ -77,8 +81,8 @@ UBTGActionWidget::UBTGActionWidget(QTreeWidgetItem* widget, QWidget* parent, con
mpTask->setAcceptRichText(true);
mpTask->setTextColor(QColor().green());
mpTask->setObjectName("ActionWidgetTaskTextEdit");
mpLayout->addWidget(mpOwner,0);
mpLayout->addWidget(mpTask,1);
mpLayout->addWidget(mpOwner);
mpLayout->addWidget(mpTask);
}
UBTGActionWidget::~UBTGActionWidget()
@ -88,10 +92,16 @@ UBTGActionWidget::~UBTGActionWidget()
DELETEPTR(mpLayout);
}
void UBTGActionWidget::initializeWithDom(QDomElement element)
{
mpOwner->setCurrentIndex(element.attribute("owner").toInt());
mpTask->setInitialText(element.attribute("task"));
}
tUBGEElementNode* UBTGActionWidget::saveData()
{
tUBGEElementNode* result = new tUBGEElementNode();
result->type = "action";
result->name = "action";
result->attributes.insert("owner",QString("%0").arg(mpOwner->currentIndex()));
result->attributes.insert("task",mpTask->text());
return result;
@ -103,16 +113,18 @@ tUBGEElementNode* UBTGActionWidget::saveData()
UBTGAdaptableText::UBTGAdaptableText(QTreeWidgetItem* widget, QWidget* parent, const char* name):QTextEdit(parent)
, mBottomMargin(5)
, mpTreeWidgetItem(widget)
, mMinimumHeight(20)
, mMinimumHeight(0)
, mHasPlaceHolder(false)
, mIsUpdatingSize(false)
{
setObjectName(name);
setStyleSheet( "QWidget {background: white; border:1 solid #999999; border-radius : 10px; padding: 2px;}");
connect(this,SIGNAL(textChanged()),this,SLOT(onTextChanged()));
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
mMinimumHeight = document()->size().height() + mBottomMargin;
setMinimumHeight(mMinimumHeight);
}
void UBTGAdaptableText::setPlaceHolderText(QString text)
@ -128,10 +140,17 @@ void UBTGAdaptableText::setPlaceHolderText(QString text)
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){
setTextColor(QColor(Qt::black));
setPlainText("");
}
setTextColor(QColor(Qt::black));
QTextEdit::keyPressEvent(e);
}
@ -150,6 +169,8 @@ void UBTGAdaptableText::showEvent(QShowEvent* e)
Q_UNUSED(e);
if(!mIsUpdatingSize && mHasPlaceHolder && toPlainText().isEmpty())
setPlainText(mPlaceHolderText);
else
onTextChanged();
}
QString UBTGAdaptableText::text()
@ -163,31 +184,39 @@ QString UBTGAdaptableText::text()
void UBTGAdaptableText::onTextChanged()
{
qreal documentSize = document()->size().height();
if(height() == documentSize + mBottomMargin)
return;
mIsUpdatingSize = true;
if(document()->size().height() < mMinimumHeight)
if(documentSize < mMinimumHeight)
setFixedHeight(mMinimumHeight);
else
setFixedHeight(document()->size().height()+mBottomMargin);
setFixedHeight(documentSize+mBottomMargin);
updateGeometry();
//to trig the widget item to resize it
//to trig a resize on the tree widget item
if(mpTreeWidgetItem){
mpTreeWidgetItem->setExpanded(false);
mpTreeWidgetItem->setDisabled(true);
mpTreeWidgetItem->setExpanded(true);
mpTreeWidgetItem->setDisabled(false);
setFocus();
}
mIsUpdatingSize = false;
}
void UBTGAdaptableText::setInitialText(const QString& text)
{
setText(text);
setReadOnly(false);
onTextChanged();
}
void UBTGAdaptableText::showText(const QString & text)
{
setText(text);
//A first rendering has to be done to calculate the text's size.
show();
hide();
setReadOnly(true);
onTextChanged();
if(isHidden())
show();
}
void UBTGAdaptableText::bottomMargin(int newValue)
@ -196,10 +225,49 @@ void UBTGAdaptableText::bottomMargin(int newValue)
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);
QTimer::singleShot(100,this,SLOT(onTextChanged()));
mDragStartPosition = event->pos();
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)
, mpMediaWidget(NULL)
, mpWebView(NULL)
, mRelativePath(QString(""))
, mMediaPath(QString(""))
, mIsPresentationMode(false)
, mIsInitializationMode(false)
{
setObjectName(name);
mpDropMeWidget = new QLabel();
@ -225,10 +294,10 @@ UBTGMediaWidget::UBTGMediaWidget(QTreeWidgetItem* widget, QWidget* parent,const
setAcceptDrops(true);
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)
, mpDropMeWidget(NULL)
, mpWorkWidget(NULL)
@ -237,14 +306,15 @@ UBTGMediaWidget::UBTGMediaWidget(QString relativePath, QTreeWidgetItem* widget,
, mpMediaLabelWidget(NULL)
, mpMediaWidget(NULL)
, mpWebView(NULL)
, mRelativePath(relativePath)
, mIsPresentationMode(true)
, mMediaType("")
, mIsInitializationMode(false)
{
setObjectName(name);
mMediaPath = UBApplication::boardController->activeDocument()->persistencePath()+ "/" + mediaPath;
setAcceptDrops(false);
createWorkWidget(mRelativePath);
setMinimumHeight(200);
createWorkWidget();
setFixedHeight(200);
}
UBTGMediaWidget::~UBTGMediaWidget()
@ -261,14 +331,50 @@ UBTGMediaWidget::~UBTGMediaWidget()
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()
{
if(!mpTitle)
return 0;
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("relativePath",mRelativePath);
result->attributes.insert("relativePath",relativePath);
result->attributes.insert("mediaType",mMediaType);
return result;
}
@ -278,27 +384,40 @@ void UBTGMediaWidget::dragEnterEvent(QDragEnterEvent *event)
event->accept();
}
void UBTGMediaWidget::createWorkWidget(QString& path)
void UBTGMediaWidget::createWorkWidget()
{
QString mimeType = UBFileSystemUtils::mimeTypeFromFileName(path);
qDebug() << mimeType;
QString mimeType = UBFileSystemUtils::mimeTypeFromFileName(mMediaPath);
bool setMedia = true;
UBDocumentProxy* proxyDocument = UBApplication::boardController->activeDocument();
if(mimeType.contains("audio") || mimeType.contains("video")){
mMediaType = mimeType.contains("audio")? "audio":"movie";
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")){
mMediaType = "image";
if(!(mIsPresentationMode || mIsInitializationMode))
mMediaPath = UBPersistenceManager::persistenceManager()->addObjectToTeacherGuideDirectory(proxyDocument, mMediaPath);
mpMediaLabelWidget = new QLabel();
QPixmap pixmap = QPixmap(QUrl(path).toLocalFile());
QPixmap pixmap = QPixmap(mMediaPath);
pixmap = pixmap.scaledToWidth(mpTreeWidgetItem->treeWidget()->size().width());
mpMediaLabelWidget->setPixmap(pixmap);
mpMediaLabelWidget->setScaledContents(true);
}
else if(mimeType.contains("application")){
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->settings()->setAttribute(QWebSettings::JavaEnabled, 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::JavascriptCanAccessClipboard, true);
mpWebView->settings()->setAttribute(QWebSettings::DnsPrefetchEnabled, true);
mpWebView->load(QUrl(path));
mpWebView->show();
mpWebView->load(QUrl(mMediaPath+"/index.htm"));
}
else{
qDebug() << "createWorkWidget mime type not handled" << mimeType;
@ -316,45 +435,44 @@ void UBTGMediaWidget::createWorkWidget(QString& path)
}
if(setMedia){
mRelativePath = path;
setAcceptDrops(false);
mpWorkWidget = new QWidget(this);
mpLayout = new QVBoxLayout(mpWorkWidget);
if(!mIsPresentationMode){
mpTitle = new UBTGAdaptableText(mpTreeWidgetItem,mpWorkWidget);
mpTitle->setPlaceHolderText(tr("Type title here..."));
mpLayout->addWidget(mpTitle,1);
mpLayout->addWidget(mpTitle);
}
if(mpMediaLabelWidget){
mpMediaLabelWidget->setMaximumHeight(width());
mpMediaLabelWidget->setParent(mpWorkWidget);
mpLayout->addWidget(mpMediaLabelWidget);
}
else if (mpMediaWidget){
mpMediaWidget->setMaximumHeight(mpTreeWidgetItem->treeWidget()->size().width());
mpMediaWidget->setMaximumHeight(width());
mpMediaWidget->setParent(mpWorkWidget);
mpLayout->addWidget(mpMediaWidget);
}
else if (mpWebView){
mpWebView->setMaximumHeight(mpTreeWidgetItem->treeWidget()->size().width());
mpWebView->setMaximumHeight(width());
mpWebView->setParent(mpWorkWidget);
mpLayout->addWidget(mpWebView);
mpWebView->show();
}
mpWorkWidget->setLayout(mpLayout);
addWidget(mpWorkWidget);
setCurrentWidget(mpWorkWidget);
updateSize();
}
}
void UBTGMediaWidget::parseMimeData(const QMimeData* pMimeData)
{
QString path;
if(pMimeData){
if(pMimeData->hasText()){
path = QUrl::fromLocalFile(pMimeData->text()).toString();
mMediaPath = QUrl::fromLocalFile(pMimeData->text()).toString();
}
else if(pMimeData->hasUrls()){
path = pMimeData->urls().at(0).toString();
mMediaPath = pMimeData->urls().at(0).toString();
}
else if(pMimeData->hasImage()){
qDebug() << "Not yet implemented";
@ -363,7 +481,7 @@ void UBTGMediaWidget::parseMimeData(const QMimeData* pMimeData)
else
qDebug() << "No mime data present";
createWorkWidget(path);
createWorkWidget();
}
void UBTGMediaWidget::dropEvent(QDropEvent* event)
@ -379,9 +497,9 @@ void UBTGMediaWidget::mousePressEvent(QMouseEvent *event)
else{
QDrag *drag = new QDrag(this);
QMimeData *mimeData = new QMimeData;
QMimeData *mimeData = new QMimeData();
QList<QUrl> urlList;
urlList << QUrl(mRelativePath);
urlList << QUrl(mMediaPath);
mimeData->setUrls(urlList);
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)
, mpLayout(NULL)
@ -428,11 +536,35 @@ UBTGUrlWidget::~UBTGUrlWidget()
DELETEPTR(mpLayout);
}
void UBTGUrlWidget::initializeWithDom(QDomElement element)
{
mpTitle->setText(element.attribute("title"));
mpUrl->setText(element.attribute("url"));
}
tUBGEElementNode* UBTGUrlWidget::saveData()
{
tUBGEElementNode* result = new tUBGEElementNode();
result->type = "link";
result->name = "link";
result->attributes.insert("title",mpTitle->text());
result->attributes.insert("url",mpUrl->text());
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"
#define TG_USER_ROLE_MIME_TYPE (Qt::UserRole+50)
class QTreeWidget;
class QVBoxLayout;
class QComboBox;
@ -39,12 +42,12 @@ class QDomElement;
typedef struct
{
QString type;
QString name;
QMap<QString,QString> attributes;
}tUBGEElementNode;
class iUBTGSavableData
class iUBTGSaveData
{
public:
virtual tUBGEElementNode* saveData() = 0;
@ -62,7 +65,7 @@ signals:
public slots:
};
class UBTGActionWidget : public QWidget, public iUBTGSavableData
class UBTGActionWidget : public QWidget, public iUBTGSaveData
{
Q_OBJECT
@ -71,6 +74,7 @@ public:
~UBTGActionWidget();
void update();
tUBGEElementNode* saveData();
void initializeWithDom(QDomElement element);
private:
QVBoxLayout* mpLayout;
@ -91,6 +95,7 @@ public:
void bottomMargin(int newValue);
void setPlaceHolderText(QString text);
QString text();
void setInitialText(const QString& text);
public slots:
void onTextChanged();
@ -99,7 +104,6 @@ protected:
void keyPressEvent(QKeyEvent* e);
void keyReleaseEvent(QKeyEvent* e);
void showEvent(QShowEvent* e);
void resizeEvent(QResizeEvent* e);
private:
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
public:
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();
tUBGEElementNode* saveData();
void initializeWithDom(QDomElement element);
void removeSource();
protected:
void dragEnterEvent(QDragEnterEvent* event);
void dropEvent(QDropEvent* event);
void mousePressEvent(QMouseEvent* event);
void hideEvent(QHideEvent* event);
void showEvent(QShowEvent* event);
private:
void parseMimeData(const QMimeData* pMimeData);
void createWorkWidget(QString& path);
void createWorkWidget();
void updateSize();
QTreeWidgetItem* mpTreeWidgetItem;
@ -137,25 +161,36 @@ private:
UBTGAdaptableText* mpTitle;
QLabel* mpMediaLabelWidget;
UBMediaWidget* mpMediaWidget;
QWebView* mpWebView;
QString mRelativePath;
UBDraggableWeb* mpWebView;
QString mMediaPath;
bool mIsPresentationMode;
QString mMediaType;
bool mIsInitializationMode;
};
class UBTGUrlWidget : public QWidget , public iUBTGSavableData
class UBTGUrlWidget : public QWidget , public iUBTGSaveData
{
Q_OBJECT
public:
UBTGUrlWidget(QWidget* parent = 0, const char* name = "UBTGUrlWidget");
~UBTGUrlWidget();
tUBGEElementNode* saveData();
void initializeWithDom(QDomElement element);
private:
QVBoxLayout* mpLayout;
QLineEdit* mpTitle;
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

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

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

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