diff --git a/plugins/cffadaptor/src/UBCFFAdaptor.cpp b/plugins/cffadaptor/src/UBCFFAdaptor.cpp
index af8b4f1b..2068dd38 100644
--- a/plugins/cffadaptor/src/UBCFFAdaptor.cpp
+++ b/plugins/cffadaptor/src/UBCFFAdaptor.cpp
@@ -639,29 +639,30 @@ QDomElement UBCFFAdaptor::UBToCFFConverter::parseSvgPageSection(const QDomElemen
void UBCFFAdaptor::UBToCFFConverter::writeQDomElementToXML(const QDomNode &node)
{
- if (!node.isNull())
- if (node.isText())
- {
- mIWBContentWriter->writeCharacters(node.nodeValue());
- }
- else
- {
- mIWBContentWriter->writeStartElement(node.namespaceURI(), node.toElement().tagName());
-
- for (int i = 0; i < node.toElement().attributes().count(); i++)
+ if (!node.isNull()){
+ if (node.isText())
{
- QDomAttr attr = node.toElement().attributes().item(i).toAttr();
- mIWBContentWriter->writeAttribute(attr.name(), attr.value());
+ mIWBContentWriter->writeCharacters(node.nodeValue());
}
- QDomNode child = node.firstChild();
- while(!child.isNull())
+ else
{
- writeQDomElementToXML(child);
- child = child.nextSibling();
- }
+ mIWBContentWriter->writeStartElement(node.namespaceURI(), node.toElement().tagName());
- mIWBContentWriter->writeEndElement();
- }
+ for (int i = 0; i < node.toElement().attributes().count(); i++)
+ {
+ QDomAttr attr = node.toElement().attributes().item(i).toAttr();
+ mIWBContentWriter->writeAttribute(attr.name(), attr.value());
+ }
+ QDomNode child = node.firstChild();
+ while(!child.isNull())
+ {
+ writeQDomElementToXML(child);
+ child = child.nextSibling();
+ }
+
+ mIWBContentWriter->writeEndElement();
+ }
+ }
}
bool UBCFFAdaptor::UBToCFFConverter::writeExtendedIwbSection()
@@ -1322,7 +1323,7 @@ QDomNode UBCFFAdaptor::UBToCFFConverter::findNodeByTagName(const QDomNode &node,
if (!iterNode.firstChildElement().isNull())
{
QDomNode foundNode = findNodeByTagName(iterNode.firstChildElement(), tagName);
- if (!foundNode.isNull())
+ if (!foundNode.isNull()){
if (foundNode.isElement())
{
if (tagName == foundNode.toElement().tagName())
@@ -1330,6 +1331,7 @@ QDomNode UBCFFAdaptor::UBToCFFConverter::findNodeByTagName(const QDomNode &node,
}
else
break;
+ }
}
}
diff --git a/resources/images/teacherGuide/audio.png b/resources/images/teacherGuide/audio.png
new file mode 100644
index 00000000..ffb8fbf1
Binary files /dev/null and b/resources/images/teacherGuide/audio.png differ
diff --git a/resources/images/teacherGuide/image.png b/resources/images/teacherGuide/image.png
new file mode 100644
index 00000000..d07dda6d
Binary files /dev/null and b/resources/images/teacherGuide/image.png differ
diff --git a/resources/images/teacherGuide/link.png b/resources/images/teacherGuide/link.png
new file mode 100644
index 00000000..893643db
Binary files /dev/null and b/resources/images/teacherGuide/link.png differ
diff --git a/resources/images/teacherGuide/movie.png b/resources/images/teacherGuide/movie.png
new file mode 100644
index 00000000..9150c659
Binary files /dev/null and b/resources/images/teacherGuide/movie.png differ
diff --git a/resources/images/teacherGuide/w3c.png b/resources/images/teacherGuide/w3c.png
new file mode 100644
index 00000000..028cd087
Binary files /dev/null and b/resources/images/teacherGuide/w3c.png differ
diff --git a/resources/sankore.qrc b/resources/sankore.qrc
index d81ac808..f94729e7 100644
--- a/resources/sankore.qrc
+++ b/resources/sankore.qrc
@@ -347,5 +347,10 @@
images/licenses/ccbyncsa.png
images/licenses/ccbynd.png
images/licenses/ccbysa.png
+ images/teacherGuide/audio.png
+ images/teacherGuide/image.png
+ images/teacherGuide/link.png
+ images/teacherGuide/movie.png
+ images/teacherGuide/w3c.png
diff --git a/resources/style.qss b/resources/style.qss
index c542d934..38eeecbc 100644
--- a/resources/style.qss
+++ b/resources/style.qss
@@ -4,22 +4,13 @@ QWidget#UBLibPathViewer,
QWidget#UBLibNavigatorWidget,
QWidget#UBLibItemProperties,
QWidget#UBDownloadWidget,
-QWidget#UBWidgetList,
-QWidget#UBTeacherBarDropMediaZone,
-QWidget#UBTBMediaContainer
+QWidget#UBTeacherGuideWidget
{
background: #EEEEEE;
border-radius: 10px;
border: 2px solid #999999;
}
-QFrame#UBTBSeparator
-{
- background: #DDDDDD;
- border-radius: 2px;
- border: 1px solid #DDDDDD;
-}
-
QWidget#UBMediaVideoContainer
{
background: #000000;
@@ -27,40 +18,6 @@ QWidget#UBMediaVideoContainer
border: 2px solid #999999;
}
-
-QWidget#UBTBPreviewWidget
-{
- background: #FFFFFF;
- border-radius: 10px;
- border: 2px solid #999999;
-}
-
-QLabel#UBTBPreviewSessionTitle
-{
- font-size: 12px;
-}
-
-QLabel#UBTeacherBarPreviewTitle
-{
- color: #555555;
- font-size : 20px;
- font-weight:bold;
- padding-left:5px;
-}
-
-QLabel#UBMediaPlayerButton
-{
- padding: 0px 0px 0px 0px;
-}
-
-QLabel#UBTeacherBarPreviewSubtitle
-{
- color: #555555;
- font-size : 15px;
- font-weight:bold;
- padding-left:5px;
-}
-
QWidget#UBLibWebView
{
background: #EEEEEE;
@@ -68,30 +25,6 @@ QWidget#UBLibWebView
border: 2px solid #999999;
}
-QWidget#UBActionPreviewOwner
-{
- color: #555555;
- font-size : 12px;
- font-weight: bold;
-}
-
-QWidget#UBTeacherBarPreviewComments,
-QWidget#UBTeacherBarTargetBox
-{
- border-radius: 10px;
- border: white 2px solid;
- padding: 5px 5px 5px 5px;
- background-color: white;
-}
-
-QWidget#UBActionPreviewContent,
-QTextEdit#UBCommentPreview
-{
- border-radius : 10px;
- border: 2px solid #999999;
- padding: 5px 5px 5px 5px;
-}
-
QWebView#SearchEngineView
{
background:white;
@@ -109,9 +42,11 @@ QLabel#DockPaletteWidgetTitle
font-weight:bold;
}
-QLineEdit#DockPaletteWidgetLineEdit
+QLineEdit#UBTGLineEdit,
+QLabel#UBTGMediaDropMeLabel
{
background: white;
+ border: 1 solid #999999;
border-radius : 10px;
padding: 2px;
}
@@ -268,4 +203,59 @@ QSlider::groove::horizontal
height:10px;
border-radius:5px;
border:1px solid #555555;
-}
\ No newline at end of file
+}
+
+QLabel#UBTGEditionDocumentTitle
+{
+ color: black;
+ font-size : 14px;
+ font-weight:bold;
+}
+
+QLabel#UBTGPresentationDocumentTitle
+{
+ color: black;
+ font-size : 12px;
+ font-weight:bold;
+}
+
+QLabel#UBTGEditionPageNumberLabel
+{
+ color: black;
+ font-size : 12px;
+ font-weight:bold;
+}
+
+QLabel#UBTGPresentationPageNumberLabel
+{
+ color: black;
+ font-size : 12px;
+}
+
+UBTGAdaptableText#UBTGEditionPageTitle,
+UBTGAdaptableText#UBTGEditionComment
+{
+ color: black;
+ font-size : 12px;
+}
+
+UBTGAdaptableText#UBTGPresentationPageTitle
+{
+ color: black;
+ font-size:16px;
+ font-weight:bold;
+ border : none;
+}
+
+UBTGAdaptableText#UBTGPresentationComment
+{
+ color: black;
+ font-size:12px;
+ border : none;
+}
+
+QFrame#UBTGEditionSeparator,
+QFrame#UBTGPresentationSepartor
+{
+ background-color: #cccccc;
+}
diff --git a/src/adaptors/UBImportDocument.cpp b/src/adaptors/UBImportDocument.cpp
index 7d43feee..27ba6673 100644
--- a/src/adaptors/UBImportDocument.cpp
+++ b/src/adaptors/UBImportDocument.cpp
@@ -191,7 +191,7 @@ UBDocumentProxy* UBImportDocument::importFile(const QFile& pFile, const QString&
return 0;
}
else{
- UBDocumentProxy* newDocument = UBPersistenceManager::persistenceManager()->createDocumentFromDir(documentRootFolder);
+ UBDocumentProxy* newDocument = UBPersistenceManager::persistenceManager()->createDocumentFromDir(documentRootFolder, pGroup);
UBApplication::showMessage(tr("Import successful."));
return newDocument;
}
diff --git a/src/board/UBBoardPaletteManager.cpp b/src/board/UBBoardPaletteManager.cpp
index 1585df84..f21c089b 100644
--- a/src/board/UBBoardPaletteManager.cpp
+++ b/src/board/UBBoardPaletteManager.cpp
@@ -31,6 +31,7 @@
#include "gui/UBZoomPalette.h"
#include "gui/UBActionPalette.h"
#include "gui/UBFavoriteToolPalette.h"
+#include "gui/UBDockTeacherGuideWidget.h"
#include "web/UBWebPage.h"
@@ -84,6 +85,7 @@ UBBoardPaletteManager::UBBoardPaletteManager(QWidget* container, UBBoardControll
, mpCachePropWidget(NULL)
, mpDownloadWidget(NULL)
, mpDesktopLibWidget(NULL)
+ , mpTeacherGuideWidget(NULL)
, mDownloadInProgress(false)
{
setupPalettes();
@@ -135,6 +137,7 @@ void UBBoardPaletteManager::setupDockPaletteWidgets()
mpCachePropWidget = new UBCachePropertiesWidget();
mpDownloadWidget = new UBDockDownloadWidget();
+ mpTeacherGuideWidget = new UBDockTeacherGuideWidget();
// Add the dock palettes
mLeftPalette = new UBLeftPalette(mContainer);
@@ -143,6 +146,9 @@ void UBBoardPaletteManager::setupDockPaletteWidgets()
mLeftPalette->registerWidget(mpPageNavigWidget);
mLeftPalette->addTab(mpPageNavigWidget);
+ mLeftPalette->registerWidget(mpTeacherGuideWidget);
+ mLeftPalette->addTab(mpTeacherGuideWidget);
+
mLeftPalette->connectSignals();
mRightPalette = new UBRightPalette(mContainer);
@@ -170,7 +176,7 @@ void UBBoardPaletteManager::slot_changeMainMode(UBApplicationController::MainMod
switch( mainMode )
{
- case UBApplicationController::Board:
+ case UBApplicationController::Board:
{
// call changeMode only when switch NOT from desktop mode
if(!UBApplication::applicationController->isShowingDesktop())
@@ -205,7 +211,7 @@ void UBBoardPaletteManager::slot_changeMainMode(UBApplicationController::MainMod
void UBBoardPaletteManager::slot_changeDesktopMode(bool isDesktop)
{
UBApplicationController::MainMode currMode = UBApplication::applicationController->displayMode();
- if(!isDesktop)
+ if(!isDesktop)
{
switch( currMode )
{
@@ -232,6 +238,7 @@ void UBBoardPaletteManager::setupPalettes()
#endif
}
+
setupDockPaletteWidgets();
@@ -735,8 +742,8 @@ void UBBoardPaletteManager::changeMode(eUBDockPaletteWidgetMode newMode, bool is
mKeyboardPalette->show();
}
else
- mKeyboardPalette->setParent(UBApplication::documentController->controlView());
- }
+ mKeyboardPalette->setParent(UBApplication::documentController->controlView());
+ }
}
break;
@@ -787,7 +794,7 @@ void UBBoardPaletteManager::addItem(const QPixmap& pPixmap, const QPointF& pos,
void UBBoardPaletteManager::addItemToCurrentPage()
{
- UBApplication::applicationController->showBoard();
+ UBApplication::applicationController->showBoard();
mAddItemPalette->hide();
if(mPixmap.isNull())
UBApplication::boardController->downloadURL(mItemUrl);
diff --git a/src/board/UBBoardPaletteManager.h b/src/board/UBBoardPaletteManager.h
index e90e9ed5..4e5e5d99 100644
--- a/src/board/UBBoardPaletteManager.h
+++ b/src/board/UBBoardPaletteManager.h
@@ -40,6 +40,7 @@ class UBServerXMLHttpRequest;
class UBKeyboardPalette;
class UBMainWindow;
class UBApplicationController;
+class UBDockTeacherGuideWidget;
class UBBoardPaletteManager : public QObject
{
@@ -52,6 +53,7 @@ class UBBoardPaletteManager : public QObject
void setupLayout();
UBLeftPalette* leftPalette(){return mLeftPalette;}
UBRightPalette* rightPalette(){return mRightPalette;}
+ UBStylusPalette* stylusPalette(){return mStylusPalette;}
void showVirtualKeyboard(bool show = true);
void initPalettesPosAtStartup();
void connectToDocumentController();
@@ -134,6 +136,8 @@ class UBBoardPaletteManager : public QObject
// lib widget!
UBLibWidget* mpDesktopLibWidget;
+ UBDockTeacherGuideWidget* mpTeacherGuideWidget;
+
bool mDownloadInProgress;
private slots:
diff --git a/src/board/UBBoardView.cpp b/src/board/UBBoardView.cpp
index 46ec93a4..1e493cc2 100644
--- a/src/board/UBBoardView.cpp
+++ b/src/board/UBBoardView.cpp
@@ -35,8 +35,8 @@
#include "gui/UBToolWidget.h"
#include "gui/UBResources.h"
#include "gui/UBMainWindow.h"
-#include "gui/UBMediaPlayer.h"
#include "gui/UBThumbnailWidget.h"
+#include "gui/UBTeacherGuideWidgetsTools.h"
#include "board/UBBoardController.h"
@@ -49,9 +49,6 @@
#include "document/UBDocumentProxy.h"
-#include "customWidgets/UBDraggableLabel.h"
-#include "customWidgets/UBDraggableMedia.h"
-
#include "tools/UBGraphicsCompass.h"
#include "tools/UBGraphicsCache.h"
#include "tools/UBGraphicsTriangle.h"
@@ -379,41 +376,43 @@ void UBBoardView::tabletEvent (QTabletEvent * event)
}
-void
-UBBoardView::mousePressEvent (QMouseEvent *event)
+void UBBoardView::mousePressEvent (QMouseEvent *event)
{
- if (isAbsurdPoint (event->pos ()))
+ if (isAbsurdPoint (event->pos ()))
{
- event->accept ();
- return;
+ event->accept ();
+ return;
}
- mMouseDownPos = event->pos ();
+ mMouseDownPos = event->pos ();
+
+ emit clickOnBoard();
- if (event->button () == Qt::LeftButton && isInteractive ())
+ if (event->button () == Qt::LeftButton && isInteractive ())
{
- UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController ()->stylusTool ();
- if (!mTabletStylusIsPressed)
- mMouseButtonIsPressed = true;
+ UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController ()->stylusTool ();
- if (currentTool == UBStylusTool::ZoomIn)
+ if (!mTabletStylusIsPressed)
+ mMouseButtonIsPressed = true;
+
+ if (currentTool == UBStylusTool::ZoomIn)
{
- mController->zoomIn (mapToScene (event->pos ()));
- event->accept ();
+ mController->zoomIn (mapToScene (event->pos ()));
+ event->accept ();
}
- else if (currentTool == UBStylusTool::ZoomOut)
+ else if (currentTool == UBStylusTool::ZoomOut)
{
- mController->zoomOut (mapToScene (event->pos ()));
- event->accept ();
+ mController->zoomOut (mapToScene (event->pos ()));
+ event->accept ();
}
- else if (currentTool == UBStylusTool::Hand)
+ else if (currentTool == UBStylusTool::Hand)
{
- viewport ()->setCursor (QCursor (Qt::ClosedHandCursor));
- mPreviousPoint = event->posF ();
- event->accept ();
+ viewport ()->setCursor (QCursor (Qt::ClosedHandCursor));
+ mPreviousPoint = event->posF ();
+ event->accept ();
}
- else if (currentTool == UBStylusTool::Selector)
+ else if (currentTool == UBStylusTool::Selector)
{
QSet existingTools = scene()->tools();
@@ -443,67 +442,67 @@ UBBoardView::mousePressEvent (QMouseEvent *event)
}
suspendedMousePressEvent = new QMouseEvent(event->type(), event->pos(), event->button(), event->buttons(), event->modifiers()); // удалить
}
-
+
event->accept();
}
- else if (currentTool == UBStylusTool::Text)
+ else if (currentTool == UBStylusTool::Text)
{
- int frameWidth = UBSettings::settings ()->objectFrameWidth;
- QRectF fuzzyRect (0, 0, frameWidth * 4, frameWidth * 4);
- fuzzyRect.moveCenter (mapToScene (mMouseDownPos));
+ int frameWidth = UBSettings::settings ()->objectFrameWidth;
+ QRectF fuzzyRect (0, 0, frameWidth * 4, frameWidth * 4);
+ fuzzyRect.moveCenter (mapToScene (mMouseDownPos));
- UBGraphicsTextItem* foundTextItem = 0;
- QListIterator it (scene ()->items (fuzzyRect));
+ UBGraphicsTextItem* foundTextItem = 0;
+ QListIterator it (scene ()->items (fuzzyRect));
- while (it.hasNext () && !foundTextItem)
+ while (it.hasNext () && !foundTextItem)
{
- foundTextItem = qgraphicsitem_cast(it.next ());
+ foundTextItem = qgraphicsitem_cast(it.next ());
}
- if (foundTextItem)
+ if (foundTextItem)
{
- mIsCreatingTextZone = false;
- QGraphicsView::mousePressEvent (event);
+ mIsCreatingTextZone = false;
+ QGraphicsView::mousePressEvent (event);
}
- else
+ else
{
- scene ()->deselectAllItems ();
+ scene ()->deselectAllItems ();
- if (!mRubberBand)
- mRubberBand = new UBRubberBand (QRubberBand::Rectangle, this);
+ if (!mRubberBand)
+ mRubberBand = new UBRubberBand (QRubberBand::Rectangle, this);
- mRubberBand->setGeometry (QRect (mMouseDownPos, QSize ()));
- mRubberBand->show ();
- mIsCreatingTextZone = true;
+ mRubberBand->setGeometry (QRect (mMouseDownPos, QSize ()));
+ mRubberBand->show ();
+ mIsCreatingTextZone = true;
- event->accept ();
+ event->accept ();
}
}
- else if (currentTool == UBStylusTool::Capture)
+ else if (currentTool == UBStylusTool::Capture)
{
- scene ()->deselectAllItems ();
+ scene ()->deselectAllItems ();
- if (!mRubberBand)
- mRubberBand = new UBRubberBand (QRubberBand::Rectangle, this);
+ if (!mRubberBand)
+ mRubberBand = new UBRubberBand (QRubberBand::Rectangle, this);
- mRubberBand->setGeometry (QRect (mMouseDownPos, QSize ()));
- mRubberBand->show ();
- mIsCreatingSceneGrabZone = true;
+ mRubberBand->setGeometry (QRect (mMouseDownPos, QSize ()));
+ mRubberBand->show ();
+ mIsCreatingSceneGrabZone = true;
- event->accept ();
+ event->accept ();
}
- else
+ else
+ {
+ if(UBDrawingController::drawingController()->mActiveRuler==NULL)
{
- if(UBDrawingController::drawingController()->mActiveRuler==NULL)
- {
- viewport()->setCursor (QCursor (Qt::BlankCursor));
- }
+ viewport()->setCursor (QCursor (Qt::BlankCursor));
+ }
- if (scene () && !mTabletStylusIsPressed)
- {
- scene ()->inputDevicePress (mapToScene (UBGeometryUtils::pointConstrainedInRect (event->pos (), rect ())));
- }
- event->accept ();
+ if (scene () && !mTabletStylusIsPressed)
+ {
+ scene ()->inputDevicePress (mapToScene (UBGeometryUtils::pointConstrainedInRect (event->pos (), rect ())));
+ }
+ event->accept ();
}
}
}
@@ -533,7 +532,7 @@ UBBoardView::mouseMoveEvent (QMouseEvent *event)
if((event->pos() - mLastPressedMousePos).manhattanLength() < QApplication::startDragDistance()) {
return;
}
-
+
if (movingItem && (mMouseButtonIsPressed || mTabletStylusIsPressed))
{
QPointF scenePos = mapToScene(event->pos());
@@ -591,7 +590,7 @@ UBBoardView::mouseReleaseEvent (QMouseEvent *event)
mWidgetMoved = false;
movingItem = NULL;
}
- else if (movingItem && suspendedMousePressEvent)
+ else if (movingItem && suspendedMousePressEvent)
{
QGraphicsView::mousePressEvent(suspendedMousePressEvent); // suspendedMousePressEvent is deleted by old Qt event loop
movingItem = NULL;
@@ -703,7 +702,7 @@ UBBoardView::wheelEvent (QWheelEvent *wheelEvent)
QList selItemsList = scene()->selectedItems();
// if NO have selected items, than no need process mouse wheel. just exist
- if( selItemsList.count() > 0 )
+ if( selItemsList.count() > 0 )
{
// only one selected item possible, so we will work with first item only
QGraphicsItem * selItem = selItemsList[0];
@@ -711,7 +710,7 @@ UBBoardView::wheelEvent (QWheelEvent *wheelEvent)
// get items list under mouse cursor
QPointF scenePos = mapToScene(wheelEvent->pos());
QList itemsList = scene()->items(scenePos);
-
+
QBool isSlectedAndMouseHower = itemsList.contains(selItem);
if(isSlectedAndMouseHower)
{
@@ -765,11 +764,6 @@ UBBoardView::drawItems (QPainter *painter, int numItems,
}
}
-//void UBBoardView::dragEnterEvent (QDragEnterEvent *event)
-//{
-// // TODO UB 4.x be smarter with drag accept code .... we cannot handle everything ...
-// event->acceptProposedAction ();
-//}
void UBBoardView::dragMoveEvent (QDragMoveEvent *event)
{
@@ -806,15 +800,17 @@ void UBBoardView::dropEvent (QDropEvent *event)
QGraphicsItem* graphicsItemAtPos = itemAt(event->pos().x(),event->pos().y());
UBGraphicsWidgetItem* graphicsWidget = dynamic_cast(graphicsItemAtPos);
- if (graphicsWidget && graphicsWidget->acceptDrops()) {
+ qDebug() << event->source();
+ if (graphicsWidget && graphicsWidget->acceptDrops()) {
graphicsWidget->processDropEvent(event);
event->acceptProposedAction();
- } else if (!event->source() || dynamic_cast(event->source())
- || dynamic_cast(event->source()) || dynamic_cast(event->source())
- || dynamic_cast(event->source()) || dynamic_cast(event->source())) {
-
+ }
+ else if (!event->source()
+ || dynamic_cast(event->source())
+ || dynamic_cast(event->source())
+ || dynamic_cast(event->source())) {
mController->processMimeData (event->mimeData (), mapToScene (event->pos ()));
event->acceptProposedAction();
}
@@ -966,7 +962,7 @@ UBBoardView::setToolCursor (int tool)
controlViewport->setCursor (UBResources::resources ()->penCursor);
break;
case UBStylusTool::Eraser:
- controlViewport->setCursor (UBResources::resources ()->eraserCursor);
+ controlViewport->setCursor (UBResources::resources ()->eraserCursor);
break;
case UBStylusTool::Marker:
controlViewport->setCursor (UBResources::resources ()->markerCursor);
diff --git a/src/board/UBBoardView.h b/src/board/UBBoardView.h
index 16280790..1d54ed36 100644
--- a/src/board/UBBoardView.h
+++ b/src/board/UBBoardView.h
@@ -46,6 +46,7 @@ class UBBoardView : public QGraphicsView
void resized(QResizeEvent* event);
void hidden();
void shown();
+ void clickOnBoard();
protected:
diff --git a/src/core/UBApplication.cpp b/src/core/UBApplication.cpp
index b8a3e257..05e5f8fb 100644
--- a/src/core/UBApplication.cpp
+++ b/src/core/UBApplication.cpp
@@ -257,10 +257,10 @@ int UBApplication::exec(const QString& pFileToImport)
applicationController = new UBApplicationController(boardController->controlView(), boardController->displayView(), mainWindow, staticMemoryCleaner);
- connect(applicationController, SIGNAL(mainModeChanged(UBApplicationController::MainMode)),
+ connect(applicationController, SIGNAL(mainModeChanged(UBApplicationController::MainMode)),
boardController->paletteManager(), SLOT(slot_changeMainMode(UBApplicationController::MainMode)));
- connect(applicationController, SIGNAL(desktopMode(bool)),
+ connect(applicationController, SIGNAL(desktopMode(bool)),
boardController->paletteManager(), SLOT(slot_changeDesktopMode(bool)));
@@ -283,8 +283,8 @@ int UBApplication::exec(const QString& pFileToImport)
connect(mainWindow->actionSankoreEditor, SIGNAL(triggered()), applicationController, SLOT(showSankoreEditor()));
connect(mainWindow->actionCheckUpdate, SIGNAL(triggered()), applicationController, SLOT(checkUpdateRequest()));
-
-
+
+
toolBarPositionChanged(UBSettings::settings()->appToolBarPositionedAtTop->get());
bool bUseMultiScreen = UBSettings::settings()->appUseMultiscreen->get().toBool();
@@ -645,29 +645,13 @@ void UBStyle::drawItemText(QPainter *painter, const QRect &rect, int alignment,
painter->setPen(savedPen);
}
-QString UBApplication::globalStyleSheet()
-{
- QString style;
-
- QFile f(":style.qss");
- if(f.exists())
- {
- if(f.open(QIODevice::ReadOnly))
- {
- style = QString(f.readAll());
- }
- }
-
- return style;
-}
-
QString UBApplication::urlFromHtml(QString html)
{
QString _html;
QRegExp comments("\\");
QString url;
QDomDocument domDoc;
-
+
// We remove all the comments & CRLF of this html
_html = html.remove(comments);
domDoc.setContent(_html.remove(QRegExp("[\\0]")));
diff --git a/src/core/UBApplication.h b/src/core/UBApplication.h
index 0ca7ac37..ee4dba22 100644
--- a/src/core/UBApplication.h
+++ b/src/core/UBApplication.h
@@ -78,7 +78,6 @@ class UBApplication : public QtSingleApplication
static void setDisabled(bool disable);
static QObject* staticMemoryCleaner;
- static QString globalStyleSheet();
void decorateActionMenu(QAction* action);
void insertSpaceToToolbarBeforeAction(QToolBar* toolbar, QAction* action, int width = -1);
diff --git a/src/core/UBApplicationController.cpp b/src/core/UBApplicationController.cpp
index 0ee793e1..89af16fa 100644
--- a/src/core/UBApplicationController.cpp
+++ b/src/core/UBApplicationController.cpp
@@ -337,6 +337,9 @@ void UBApplicationController::showBoard()
mMainWindow->tutorialToolBar->hide();
mMainWindow->boardToolBar->show();
+ if (mMainMode == Document && UBApplication::documentController->getSelectedItemIndex() != -1)
+ UBApplication::boardController->setActiveDocumentScene(UBApplication::documentController->getCurrentDocument(), UBApplication::documentController->getSelectedItemIndex());
+
mMainMode = Board;
adaptToolBar();
diff --git a/src/core/UBPersistenceManager.cpp b/src/core/UBPersistenceManager.cpp
index 23b5e3c3..8d0e1952 100644
--- a/src/core/UBPersistenceManager.cpp
+++ b/src/core/UBPersistenceManager.cpp
@@ -254,13 +254,23 @@ UBDocumentProxy* UBPersistenceManager::createDocument(const QString& pGroupName,
return doc;
}
-
-UBDocumentProxy* UBPersistenceManager::createDocumentFromDir(const QString& pDocumentDirectory)
+UBDocumentProxy* UBPersistenceManager::createDocumentFromDir(const QString& pDocumentDirectory, const QString& pGroupName, const QString& pName, bool withEmptyPage)
{
checkIfDocumentRepositoryExists();
UBDocumentProxy* doc = new UBDocumentProxy(pDocumentDirectory); // deleted in UBPersistenceManager::destructor
+ if (pGroupName.length() > 0)
+ {
+ doc->setMetaData(UBSettings::documentGroupName, pGroupName);
+ }
+
+ if (pName.length() > 0)
+ {
+ doc->setMetaData(UBSettings::documentName, pName);
+ }
+ if (withEmptyPage) createDocumentSceneAt(doc, 0);
+
QMap metadatas = UBMetadataDcSubsetAdaptor::load(pDocumentDirectory);
foreach(QString key, metadatas.keys())
diff --git a/src/core/UBPersistenceManager.h b/src/core/UBPersistenceManager.h
index 7a7bdd87..b9c53579 100644
--- a/src/core/UBPersistenceManager.h
+++ b/src/core/UBPersistenceManager.h
@@ -46,7 +46,7 @@ class UBPersistenceManager : public QObject
static void destroy();
virtual UBDocumentProxy* createDocument(const QString& pGroupName = "", const QString& pName = "", bool withEmptyPage = true);
- virtual UBDocumentProxy* createDocumentFromDir(const QString& pDocumentDirectory);
+ virtual UBDocumentProxy* createDocumentFromDir(const QString& pDocumentDirectory, const QString& pGroupName = "", const QString& pName = "", bool withEmptyPage = false);
virtual UBDocumentProxy* persistDocumentMetadata(UBDocumentProxy* pDocumentProxy);
diff --git a/src/customWidgets/UBActionableWidget.cpp b/src/customWidgets/UBActionableWidget.cpp
index 65e440a3..78d8ea6b 100644
--- a/src/customWidgets/UBActionableWidget.cpp
+++ b/src/customWidgets/UBActionableWidget.cpp
@@ -1,3 +1,18 @@
+/*
+ * 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 .
+ */
+
#include
#include
diff --git a/src/customWidgets/UBActionableWidget.h b/src/customWidgets/UBActionableWidget.h
index 683463df..23a2478c 100644
--- a/src/customWidgets/UBActionableWidget.h
+++ b/src/customWidgets/UBActionableWidget.h
@@ -1,3 +1,18 @@
+/*
+ * 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 .
+ */
+
#ifndef UBACTIONABLEWIDGET_H
#define UBACTIONABLEWIDGET_H
diff --git a/src/customWidgets/UBDraggableLabel.cpp b/src/customWidgets/UBDraggableLabel.cpp
deleted file mode 100644
index 200205b9..00000000
--- a/src/customWidgets/UBDraggableLabel.cpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#include
-#include
-#include
-
-#include "UBDraggableLabel.h"
-
-
-UBDraggableLabel::UBDraggableLabel(QWidget *parent) :
- QLabel(parent)
-{
-}
-
-UBDraggableLabel::~UBDraggableLabel()
-{
- //NOOP
-}
-
-void UBDraggableLabel::loadImage(QString imagePath)
-{
- mSourcePath = imagePath;
- QPixmap pix = QPixmap(mSourcePath);
- setPixmap(pix);
- setScaledContents(true);
-}
-
-void UBDraggableLabel::mousePressEvent(QMouseEvent *event)
-{
- Q_UNUSED(event);
- QMimeData *mimeData = new QMimeData;
- QList urls;
- urls << QUrl::fromLocalFile(mSourcePath);
- mimeData->setUrls(urls);
- mimeData->setText(mSourcePath);
-
-
- QDrag *drag = new QDrag(this);
- drag->setMimeData(mimeData);
- drag->start();
-}
diff --git a/src/customWidgets/UBDraggableLabel.h b/src/customWidgets/UBDraggableLabel.h
deleted file mode 100644
index 384b313e..00000000
--- a/src/customWidgets/UBDraggableLabel.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef UBDRAGGABLELABEL_H
-#define UBDRAGGABLELABEL_H
-
-#include
-
-class UBDraggableLabel : public QLabel
-{
- Q_OBJECT
-public:
- UBDraggableLabel(QWidget *parent = 0);
- ~UBDraggableLabel();
- void loadImage(QString imagePath);
-signals:
-
-public slots:
-
-protected:
- QString mSourcePath;
- void mousePressEvent(QMouseEvent *event);
-
-};
-
-#endif // UBDRAGGABLELABEL_H
diff --git a/src/customWidgets/UBDraggableMedia.cpp b/src/customWidgets/UBDraggableMedia.cpp
deleted file mode 100644
index 4136f742..00000000
--- a/src/customWidgets/UBDraggableMedia.cpp
+++ /dev/null
@@ -1,42 +0,0 @@
-#include
-#include
-
-#include "UBDraggableMedia.h"
-
-UBDraggableMedia::UBDraggableMedia(eMediaType type, QWidget *parent, const char *name):UBMediaWidget(type, parent, name)
-{
- removeAllActions();
-}
-
-UBDraggableMedia::~UBDraggableMedia()
-{
-
-}
-
-void UBDraggableMedia::mousePressEvent(QMouseEvent* ev)
-{
- if(Qt::LeftButton == ev->button()){
- mDragStartPos = ev->pos();
- }
-}
-
-void UBDraggableMedia::mouseMoveEvent(QMouseEvent* ev)
-{
- if(!(ev->buttons() & Qt::LeftButton)){
- return;
- }
- if((ev->pos() - mDragStartPos).manhattanLength() < QApplication::startDragDistance()){
- return;
- }
- QDrag *drag = new QDrag(this);
- QMimeData *mimeData = new QMimeData;
-
- QList urls;
- urls << QUrl(mFilePath);
- mimeData->setText(mFilePath);
- mimeData->setUrls(urls);
-
- drag->setMimeData(mimeData);
-
- drag->exec(Qt::CopyAction | Qt::MoveAction);
-}
diff --git a/src/customWidgets/UBDraggableMedia.h b/src/customWidgets/UBDraggableMedia.h
deleted file mode 100644
index b45c9391..00000000
--- a/src/customWidgets/UBDraggableMedia.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#ifndef UBDRAGGABLEMEDIA_H
-#define UBDRAGGABLEMEDIA_H
-
-#include "UBMediaWidget.h"
-
-class UBDraggableMedia : public UBMediaWidget
-{
-public:
- UBDraggableMedia(eMediaType type = eMediaType_Video, QWidget* parent=0, const char* name="UBDraggableMedia");
- ~UBDraggableMedia();
-protected:
- void mousePressEvent(QMouseEvent* ev);
- void mouseMoveEvent(QMouseEvent* ev);
-
-private:
- QPoint mDragStartPos;
-};
-
-#endif // UBDRAGGABLEMEDIA_H
diff --git a/src/customWidgets/UBMediaWidget.cpp b/src/customWidgets/UBMediaWidget.cpp
index 4bef693b..cbc0b842 100644
--- a/src/customWidgets/UBMediaWidget.cpp
+++ b/src/customWidgets/UBMediaWidget.cpp
@@ -34,9 +34,10 @@ UBMediaWidget::UBMediaWidget(eMediaType type, QWidget *parent, const char *name)
, mBorder(5)
, mpMediaContainer(NULL)
, mpCover(NULL)
+// , mpVideoStackedWidget(NULL)
+// , mpSnapshotVideoWidget(NULL)
{
- setAttribute(Qt::WA_StyledBackground, true);
- setStyleSheet(UBApplication::globalStyleSheet());
+ SET_STYLE_SHEET();
addAction(eAction_Close);
mType = type;
@@ -73,6 +74,8 @@ UBMediaWidget::~UBMediaWidget()
DELETEPTR(mpPlayStopButton);
DELETEPTR(mpAudioOutput);
DELETEPTR(mpVideoWidget);
+// DELETEPTR(mpVideoStackedWidget);
+// DELETEPTR(mpSnapshotVideoWidget);
DELETEPTR(mpMediaObject);
DELETEPTR(mpCover);
}
@@ -118,6 +121,13 @@ void UBMediaWidget::showEvent(QShowEvent* event)
QWidget::showEvent(event);
}
+void UBMediaWidget::hideEvent(QHideEvent* event)
+{
+ if(mpMediaObject->state() == Phonon::PlayingState)
+ mpMediaObject->stop();
+ UBActionableWidget::hideEvent(event);
+}
+
/**
* \brief Create the media player
*/
@@ -128,10 +138,17 @@ void UBMediaWidget::createMediaPlayer()
mpMediaContainer->setLayout(&mMediaLayout);
if(eMediaType_Video == mType){
- mMediaLayout.setContentsMargins(10, 10, 25, 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);
Phonon::createPath(mpMediaObject, mpVideoWidget);
@@ -171,6 +188,22 @@ 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
@@ -199,6 +232,7 @@ void UBMediaWidget::onStateChanged(Phonon::State newState, Phonon::State oldStat
mpPauseButton->setEnabled(false);
mpSlider->setValue(0);
}
+ //updateView(newState);
}
}
diff --git a/src/customWidgets/UBMediaWidget.h b/src/customWidgets/UBMediaWidget.h
index dbc85b78..0d4db8f0 100644
--- a/src/customWidgets/UBMediaWidget.h
+++ b/src/customWidgets/UBMediaWidget.h
@@ -21,6 +21,7 @@
#include
#include
#include
+#include
#include
#include
@@ -75,6 +76,7 @@ public:
protected:
void resizeEvent(QResizeEvent* ev);
void showEvent(QShowEvent* event);
+ void hideEvent(QHideEvent* event);
/** The current media file path */
QString mFilePath;
@@ -89,6 +91,7 @@ private slots:
private:
void createMediaPlayer();
void adaptSizeToVideo();
+// void updateView(Phonon::State nextState);
/** The current media type */
eMediaType mType;
@@ -122,6 +125,9 @@ private:
QLabel* mpCover;
/** The media url */
QString mUrl;
+
+// QStackedWidget* mpVideoStackedWidget;
+// QLabel* mpSnapshotVideoWidget;
};
#endif // UBMEDIAWIDGET_H
diff --git a/src/customWidgets/UBWidgetList.cpp b/src/customWidgets/UBWidgetList.cpp
deleted file mode 100644
index a9e9a305..00000000
--- a/src/customWidgets/UBWidgetList.cpp
+++ /dev/null
@@ -1,229 +0,0 @@
-#include
-#include
-#include
-#include
-
-#include "globals/UBGlobals.h"
-#include "UBWidgetList.h"
-
-UBWidgetList::UBWidgetList(QWidget* parent, eWidgetListOrientation orientation, const char* name):QScrollArea(parent)
- , mCanRemove(true)
- , mpLayout(NULL)
- , mpContainer(NULL)
- , mMargin(10)
- , mListElementsSpacing(10)
- , mpEmptyLabel(NULL)
- , mpCurrentWidget(NULL)
-{
- setObjectName(name);
- mOrientation = orientation;
- mpContainer = new QWidget(this);
- mpEmptyLabel = new QLabel(this);
- mpEmptyLabel->setObjectName("emptyString");
- mpEmptyLabel->setWordWrap(true);
- mpEmptyLabel->setAlignment(Qt::AlignCenter);
-
- if(eWidgetListOrientation_Vertical == orientation){
- setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
- setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- mpLayout = new QVBoxLayout(mpContainer);
- }
- else{
- setHorizontalScrollBarPolicy(Qt::ScrollBarAsNeeded);
- setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- mpLayout = new QHBoxLayout(mpContainer);
- }
- mpLayout->setContentsMargins(margin(), margin(), margin(), margin());
- mpContainer->setLayout(mpLayout);
- setWidget(mpContainer);
-}
-
-UBWidgetList::~UBWidgetList()
-{
- DELETEPTR(mpEmptyLabel);
- DELETEPTR(mpLayout);
- DELETEPTR(mpContainer);
-}
-
-void UBWidgetList::addWidget(QWidget *widget)
-{
- if(NULL != mpLayout && NULL != widget){
- widget->setParent(mpContainer);
- mpEmptyLabel->setVisible(false);
- mWidgetInfo[widget] = widget->size();
- updateView(size());
- mpLayout->addWidget(widget);
-
- // This call is used only to refresh the size of the widgets
- updateSizes();
- }
-}
-
-void UBWidgetList::removeWidget(QWidget *widget)
-{
- if(NULL != mpLayout && NULL != widget){
- mpLayout->removeWidget(widget);
- mWidgetInfo.remove(widget);
- widget->setVisible(false);
- updateView(size());
- if(0 == mpLayout->count()){
- mpEmptyLabel->setVisible(true);
- }
- if(mpCurrentWidget == widget){
- mpCurrentWidget = NULL;
- }
- }
-}
-
-
-int UBWidgetList::scaleWidgets(QSize pSize)
-{
- // to remove the first spacing that shouldn't be there.
- int result = -mListElementsSpacing;
- foreach(QWidget* eachWidget, mWidgetInfo.keys()){
- qreal scaleFactor = 0;
- int newWidgetWidth = pSize.width();
- int newWidgetHeight = pSize.height();
- if(eWidgetListOrientation_Vertical == mOrientation){
- scaleFactor = (float)mWidgetInfo[eachWidget].width() / (float)pSize.width();
- newWidgetHeight = mWidgetInfo[eachWidget].height()/scaleFactor;
- result += newWidgetHeight;
- eachWidget->setMinimumHeight(newWidgetHeight- 1);
- eachWidget->setMaximumHeight(newWidgetHeight);
- }
- else{
- scaleFactor = (float)mWidgetInfo[eachWidget].height() / (float)pSize.height();
- newWidgetWidth = mWidgetInfo[eachWidget].width()/scaleFactor;
- result += newWidgetWidth;
- eachWidget->setMinimumWidth(newWidgetWidth - 1);
- eachWidget->setMaximumWidth(newWidgetWidth);
- }
- //Adding a vertical/horizontal space between each element of the list
- result += mListElementsSpacing;
- }
- return result;
-}
-
-void UBWidgetList::scaleContainer(QSize pSize, int updateValue)
-{
- if(eWidgetListOrientation_Vertical == mOrientation)
- mpContainer->resize(pSize.width(), updateValue);
- else
- mpContainer->resize(updateValue, pSize.height());
-}
-
-
-void UBWidgetList::updateView(QSize pSize)
-{
- // Widgets on list are resized automatically to fit the mpcontainer.
- // so if you want to keep the aspect ratio you have to calculate
- // the sum of the new widget height and give it to the mpContainer.
- // The container resize will trig the widgets resize and the good
- // height permits to respect the aspect ratio.
- int updatedValue = scaleWidgets(pSize);
- scaleContainer(pSize,updatedValue);
-}
-
-
-
-void UBWidgetList::resizeEvent(QResizeEvent *ev)
-{
- Q_UNUSED(ev);
- mpEmptyLabel->setGeometry((width() - mpEmptyLabel->width()) / 2,
- (height() - mpEmptyLabel->height()) /2,
- mpEmptyLabel->width(),
- mpEmptyLabel->height());
- updateView(size());
- updateSizes();
-}
-
-void UBWidgetList::mousePressEvent(QMouseEvent *ev)
-{
- Q_UNUSED(ev);
- if(mCanRemove){
- QWidget* pWAt = widgetAt(ev->pos());
- if(NULL != mpCurrentWidget){
- if(pWAt != mpCurrentWidget){
- mpCurrentWidget->setActionsVisible(false);
- update();
- }
- }
- mpCurrentWidget = dynamic_cast(pWAt);
- if(NULL != mpCurrentWidget){
- mpCurrentWidget->setActionsVisible(true);
- update();
- }
- }
- update();
-}
-
-QWidget* UBWidgetList::widgetAt(QPoint p)
-{
- QWidget* pW = NULL;
- pW = childAt(p);
- if(NULL != pW){
- do{
- if( "UBTeacherStudentAction" == pW->objectName() ||
- "UBUrlWidget" == pW->objectName() ||
- "UBTBMediaPicture" == pW->objectName() ||
- "UBMediaWidget" == pW->objectName()){
- return pW;
- }else{
- pW = pW->parentWidget();
- }
- }while(NULL != pW && this != pW);
- }
-
- return pW;
-}
-
-void UBWidgetList::updateSizes()
-{
- // Resize all the widgets
- foreach(QWidget* eachWidget, mWidgetInfo.keys()){
- if(NULL != eachWidget){
- QSize originalSize = mWidgetInfo[eachWidget];
- int currentWidth = mpContainer->width();
- int currentHeight = mpContainer->height();
- if(eWidgetListOrientation_Vertical == mOrientation){
- if(verticalScrollBar()->isVisible()){
- currentWidth -= verticalScrollBar()->width();
- eachWidget->setStyleSheet(QString("margin-right:%0;").arg(verticalScrollBar()->width()));
- }
- float scaleFactor = (float)currentWidth/(float)originalSize.width();
- currentHeight = originalSize.height()*scaleFactor;
- }else{
- if(horizontalScrollBar()->isVisible()){
- currentHeight -= horizontalScrollBar()->height();
- eachWidget->setStyleSheet(QString("padding-bottom:%0;").arg(horizontalScrollBar()->height()));
- }
- float scaleFactor = (float)currentHeight/(float)originalSize.height();
- currentWidth = originalSize.width()*scaleFactor;
- }
-
- eachWidget->resize(currentWidth, currentHeight);
- }
- }
-}
-
-void UBWidgetList::setMargin(int margin)
-{
- mMargin = margin;
-}
-
-int UBWidgetList::margin()
-{
- return mMargin;
-}
-
-void UBWidgetList::setEmptyText(const QString &text)
-{
- if(NULL != mpEmptyLabel){
- mpEmptyLabel->setText(text);
- }
-}
-
-bool UBWidgetList::empty()
-{
- return mWidgetInfo.empty();
-}
diff --git a/src/customWidgets/UBWidgetList.h b/src/customWidgets/UBWidgetList.h
deleted file mode 100644
index d2cd3a6c..00000000
--- a/src/customWidgets/UBWidgetList.h
+++ /dev/null
@@ -1,69 +0,0 @@
-#ifndef UBWIDGETLIST_H
-#define UBWIDGETLIST_H
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include "interfaces/IResizeable.h"
-#include "customWidgets/UBActionableWidget.h"
-
-typedef enum{
- eWidgetListOrientation_Vertical,
- eWidgetListOrientation_Horizontal
-}eWidgetListOrientation;
-
-
-class UBWidgetList : public QScrollArea
-{
- Q_OBJECT
-
- typedef struct
- {
- QSize size;
- bool isResizable;
- } sWidgetProperties;
-
-public:
- UBWidgetList(QWidget* parent=0, eWidgetListOrientation orientation = eWidgetListOrientation_Vertical, const char* name = "UBWidgetList");
- ~UBWidgetList();
- void addWidget(QWidget* widget);
- void removeWidget(QWidget* widget);
- void setMargin(int margin);
- void setEmptyText(const QString& text);
- int margin();
- bool empty();
- void setListElementSpacing(int margin) { mListElementsSpacing = margin; }
- int listElementsSpacing() {return mListElementsSpacing; }
-
-signals:
- void closeWidget(QWidget* w);
-
-protected:
- bool mCanRemove;
-
- void resizeEvent(QResizeEvent* ev);
- void mousePressEvent(QMouseEvent* ev);
-
-private:
- QWidget* widgetAt(QPoint p);
- int scaleWidgets(QSize pSize);
- void scaleContainer(QSize pSize, int updateValue);
- void updateView(QSize pSize);
- void updateSizes();
- QBoxLayout* mpLayout;
- QWidget* mpContainer;
- eWidgetListOrientation mOrientation;
- int mMargin;
- int mListElementsSpacing;
- QMap mWidgetInfo;
- QLabel* mpEmptyLabel;
- UBActionableWidget* mpCurrentWidget;
-};
-
-#endif // UBWIDGETLIST_H
diff --git a/src/customWidgets/customWidgets.pri b/src/customWidgets/customWidgets.pri
index c531d4b3..a3c64030 100644
--- a/src/customWidgets/customWidgets.pri
+++ b/src/customWidgets/customWidgets.pri
@@ -1,13 +1,8 @@
-HEADERS += src/customWidgets/UBWidgetList.h \
- src/customWidgets/UBDraggableLabel.h \
+HEADERS += \
src/customWidgets/UBMediaWidget.h \
- src/globals/UBGlobals.h \
- src/customWidgets/UBDraggableMedia.h \
src/customWidgets/UBActionableWidget.h
-
-SOURCES += src/customWidgets/UBWidgetList.cpp \
- src/customWidgets/UBDraggableLabel.cpp \
+
+SOURCES += \
src/customWidgets/UBMediaWidget.cpp \
- src/customWidgets/UBDraggableMedia.cpp \
src/customWidgets/UBActionableWidget.cpp
diff --git a/src/desktop/UBDesktopAnnotationController.cpp b/src/desktop/UBDesktopAnnotationController.cpp
index 1f27f607..13b64aff 100644
--- a/src/desktop/UBDesktopAnnotationController.cpp
+++ b/src/desktop/UBDesktopAnnotationController.cpp
@@ -762,21 +762,6 @@ void UBDesktopAnnotationController::togglePropertyPalette(UBActionPalette *palet
void UBDesktopAnnotationController::switchCursor(const int tool)
{
-// enum Enum
-// {
-// Pen = 0,
-// Eraser,
-// Marker,
-// Selector,
-// Hand,
-// ZoomIn,
-// ZoomOut,
-// Pointer,
-// Line,
-// Text,
-// Capture
-// };
-
mTransparentDrawingScene->setToolCursor(tool);
mTransparentDrawingView->setToolCursor(tool);
}
@@ -826,17 +811,6 @@ void UBDesktopAnnotationController::onDesktopPaletteMaximized()
connect(pPointerButton, SIGNAL(pressed()), this, SLOT(pointerActionPressed()));
connect(pPointerButton, SIGNAL(released()), this, SLOT(pointerActionReleased()));
}
-
- // enum Enum
- // {
- // Hand,
- // ZoomIn,
- // ZoomOut,
- // Line,
- // Text,
- // Capture
- // };
-
}
/**
@@ -872,16 +846,6 @@ void UBDesktopAnnotationController::onDesktopPaletteMinimize()
void UBDesktopAnnotationController::TransparentWidgetResized()
{
-/*
- int rW = UBApplication::boardController->paletteManager()->rightPalette()->width();
- int rH_ = UBApplication::boardController->paletteManager()->rightPalette()->height();
- int rH = mTransparentDrawingView->height();
-
- UBApplication::boardController->paletteManager()->rightPalette()->resize(rW+1, rH);
-
- // UBApplication::boardController->paletteManager()->rightPalette()->resize(500, 500);
-*/
-
onTransparentWidgetResized();
}
@@ -900,8 +864,6 @@ void UBDesktopAnnotationController::onTransparentWidgetResized()
UBApplication::boardController->paletteManager()->leftPalette()->resize(lW+1, rH);
UBApplication::boardController->paletteManager()->leftPalette()->resize(lW, rH);
-
-// mRightPalette->resize(mRightPalette->width(), mTransparentDrawingView->height());
}
void UBDesktopAnnotationController::updateMask(bool bTransparent)
diff --git a/src/document/UBDocumentController.cpp b/src/document/UBDocumentController.cpp
index f75ccc4d..acc5495e 100644
--- a/src/document/UBDocumentController.cpp
+++ b/src/document/UBDocumentController.cpp
@@ -160,6 +160,9 @@ void UBDocumentController::selectDocument(UBDocumentProxy* proxy, bool setAsCurr
mDocumentUI->documentTreeWidget->scrollToItem(selected);
+ mDocumentThumbs = UBThumbnailAdaptor::load(selectedDocumentProxy());
+ refreshDocumentThumbnailsView();
+
mSelectionType = Document;
}
}
@@ -268,11 +271,10 @@ void UBDocumentController::refreshDocumentThumbnailsView()
if (proxy)
{
mCurrentDocument = proxy;
- QList thumbs = UBThumbnailAdaptor::load(proxy);
- for (int i = 0; i < thumbs.count(); i++)
+ for (int i = 0; i < mDocumentThumbs.count(); i++)
{
- QPixmap pix = thumbs.at(i);
+ QPixmap pix = mDocumentThumbs.at(i);
QGraphicsPixmapItem *pixmapItem = new UBSceneThumbnailPixmap(pix, proxy, i); // deleted by the tree widget
if (proxy == mBoardController->activeDocument() && mBoardController->activeSceneIndex() == i)
@@ -507,7 +509,7 @@ void UBDocumentController::openSelectedItem()
if (proxy && isOKToOpenDocument(proxy))
{
- mBoardController->setActiveDocumentScene(proxy, thumb->sceneIndex());
+ //mBoardController->setActiveDocumentScene(proxy, thumb->sceneIndex());
UBApplication::applicationController->showBoard();
}
}
@@ -561,6 +563,7 @@ void UBDocumentController::duplicateSelectedItem()
foreach (int sceneIndex, selectedSceneIndexes)
{
UBPersistenceManager::persistenceManager()->duplicateDocumentScene(proxy, sceneIndex + offset);
+ mDocumentThumbs.insert(sceneIndex + offset, mDocumentThumbs.at(sceneIndex + offset));
offset++;
}
}
@@ -921,6 +924,7 @@ void UBDocumentController::itemClicked(QTreeWidgetItem * item, int column )
Q_UNUSED(item);
Q_UNUSED(column);
+ selectDocument(selectedDocumentProxy(), false);
itemSelectionChanged();
}
@@ -1043,6 +1047,7 @@ void UBDocumentController::addFolderOfImages()
{
document->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime()));
UBMetadataDcSubsetAdaptor::persist(document);
+ mDocumentThumbs = UBThumbnailAdaptor::load(selectedDocumentProxy());
refreshDocumentThumbnailsView();
}
}
@@ -1057,6 +1062,7 @@ void UBDocumentController::addFileToDocument()
if (document)
{
addFileToDocument(document);
+ mDocumentThumbs = UBThumbnailAdaptor::load(document);
refreshDocumentThumbnailsView();
}
}
@@ -1108,12 +1114,9 @@ void UBDocumentController::moveSceneToIndex(UBDocumentProxy* proxy, int source,
proxy->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime()));
UBMetadataDcSubsetAdaptor::persist(proxy);
+ mDocumentThumbs.insert(target, mDocumentThumbs.takeAt(source));
refreshDocumentThumbnailsView();
-
- // Notify the move to anyone interested in knowing it
- emit movedToIndex(target);
-
- UBApplication::boardController->setActiveDocumentScene(proxy, target);
+ mDocumentUI->thumbnailWidget->hightlightItem(target);
}
@@ -1321,7 +1324,8 @@ void UBDocumentController::addToDocument()
}
int newActiveSceneIndex = selectedItems.count() == mBoardController->activeDocument()->pageCount() ? 0 : oldActiveSceneIndex + 1;
- mBoardController->setActiveDocumentScene(mBoardController->activeDocument(), newActiveSceneIndex);
+ mDocumentUI->thumbnailWidget->selectItemAt(newActiveSceneIndex, false);
+ selectDocument(mBoardController->activeDocument());
mBoardController->activeDocument()->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime()));
UBMetadataDcSubsetAdaptor::persist(mBoardController->activeDocument());
@@ -1495,6 +1499,7 @@ void UBDocumentController::addImages()
{
document->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime()));
UBMetadataDcSubsetAdaptor::persist(document);
+ mDocumentThumbs = UBThumbnailAdaptor::load(selectedDocumentProxy());
refreshDocumentThumbnailsView();
}
}
@@ -1605,6 +1610,13 @@ void UBDocumentController::deletePages(QList itemsToDelete)
UBPersistenceManager::persistenceManager()->deleteDocumentScenes(proxy, sceneIndexes);
proxy->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime()));
UBMetadataDcSubsetAdaptor::persist(proxy);
+
+ int offset = 0;
+ foreach(int index, sceneIndexes)
+ {
+ mDocumentThumbs.removeAt(index - offset);
+ offset++;
+ }
refreshDocumentThumbnailsView();
int minIndex = proxy->pageCount() - 1;
@@ -1616,3 +1628,15 @@ void UBDocumentController::deletePages(QList itemsToDelete)
}
}
}
+
+int UBDocumentController::getSelectedItemIndex()
+{
+ QList selectedItems = mDocumentUI->thumbnailWidget->selectedItems();
+
+ if (selectedItems.count() > 0)
+ {
+ UBSceneThumbnailPixmap* thumb = dynamic_cast (selectedItems.last());
+ return thumb->sceneIndex();
+ }
+ else return -1;
+}
\ No newline at end of file
diff --git a/src/document/UBDocumentController.h b/src/document/UBDocumentController.h
index 4baf8b36..5b1daa2b 100644
--- a/src/document/UBDocumentController.h
+++ b/src/document/UBDocumentController.h
@@ -48,8 +48,9 @@ class UBDocumentController : public QObject
QWidget* controlView();
UBDocumentProxyTreeItem* findDocument(UBDocumentProxy* proxy);
bool addFileToDocument(UBDocumentProxy* document);
- UBDocumentProxy* getCurrentDocument();
+ UBDocumentProxy* getCurrentDocument() { return mCurrentDocument; };
void deletePages(QList itemsToDelete);
+ int getSelectedItemIndex();
signals:
void refreshThumbnails();
@@ -111,6 +112,7 @@ class UBDocumentController : public QObject
bool mToolsPalettePositionned;
UBDocumentGroupTreeItem* mTrashTi;
UBDocumentProxy* mCurrentDocument;
+ QList mDocumentThumbs;
// UBKeyboardPalette *mKeyboardPalette;
diff --git a/src/domain/UBGraphicsDelegateFrame.cpp b/src/domain/UBGraphicsDelegateFrame.cpp
index c0e22a16..d6df2c62 100644
--- a/src/domain/UBGraphicsDelegateFrame.cpp
+++ b/src/domain/UBGraphicsDelegateFrame.cpp
@@ -254,10 +254,10 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
qreal moveY = -move.length() * sin((move.angle() - mAngle) * PI / 180);
qreal width = delegated()->boundingRect().width() * mTotalScaleX;
qreal height = delegated()->boundingRect().height() * mTotalScaleY;
- mTranslateX = moveX;
if(mOperationMode == Scaling)
{
+ mTranslateX = moveX;
// Perform the resize
if (resizingBottomRight())
{
@@ -353,6 +353,7 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
}
else if (mOperationMode == Resizing)
{
+ mTranslateX = moveX;
UBResizableGraphicsItem* resizableItem = dynamic_cast(delegated());
if (resizableItem)
@@ -390,12 +391,14 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
if (rotating())
{
+ mTranslateX = 0;
+ mTranslateY = 0;
+
QLineF startLine(sceneBoundingRect().center(), event->lastScenePos());
- QLineF currentLine(sceneBoundingRect().center(), event->scenePos());
+ QLineF currentLine(sceneBoundingRect().center(), event->scenePos());
mAngle += startLine.angleTo(currentLine);
- if ((int)mAngle % 45 >= 45 - mAngleTolerance
- || (int)mAngle % 45 <= mAngleTolerance)
+ if ((int)mAngle % 45 >= 45 - mAngleTolerance || (int)mAngle % 45 <= mAngleTolerance)
{
mAngle = qRound(mAngle / 45) * 45;
mAngleOffset += startLine.angleTo(currentLine);
@@ -405,8 +408,7 @@ void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
mAngleOffset = 0;
}
}
- else if ((int)mAngle % 30 >= 30 - mAngleTolerance
- || (int)mAngle % 30 <= mAngleTolerance)
+ else if ((int)mAngle % 30 >= 30 - mAngleTolerance || (int)mAngle % 30 <= mAngleTolerance)
{
mAngle = qRound(mAngle / 30) * 30;
mAngleOffset += startLine.angleTo(currentLine);
@@ -498,10 +500,16 @@ QTransform UBGraphicsDelegateFrame::buildTransform()
{
QTransform tr;
QPointF center = delegated()->boundingRect().center();
+
+ // Translate
tr.translate(mTotalTranslateX + mTranslateX, mTotalTranslateY + mTranslateY);
+
+ // Set angle
tr.translate(center.x() * mTotalScaleX * mScaleX, center.y() * mTotalScaleY * mScaleY);
tr.rotate(-mAngle);
tr.translate(-center.x() * mTotalScaleX * mScaleX, -center.y() * mTotalScaleY * mScaleY);
+
+ // Scale
tr.scale(mTotalScaleX * mScaleX, mTotalScaleY * mScaleY);
return tr;
}
@@ -565,35 +573,53 @@ void UBGraphicsDelegateFrame::setVisible(bool visible)
void UBGraphicsDelegateFrame::positionHandles()
{
+ // TODO: Check why the height is modified if the user rotates the item more than 90°
+
QRectF itemRect = delegated()->boundingRect();
QTransform itemTransform = delegated()->sceneTransform();
QPointF topLeft = itemTransform.map(itemRect.topLeft());
QPointF topRight = itemTransform.map(itemRect.topRight());
QPointF bottomLeft = itemTransform.map(itemRect.bottomLeft());
+ QPointF bottomRight = itemTransform.map(itemRect.bottomRight());
QPointF center = itemTransform.map(itemRect.center());
+ int rotateHeight = QLineF(topLeft, bottomLeft).length();
// Handle the mirroring
if(topLeft.x() > topRight.x()){
- QPointF tmp = topRight;
+ QPointF topTmp = topRight;
+ QPointF bottomTmp = bottomRight;
topRight = topLeft;
- topLeft = tmp;
- bottomLeft.setX(topLeft.x());
+ topLeft = topTmp;
+ bottomRight = bottomLeft;
+ bottomLeft = bottomTmp;
+ }
+
+ if(bottomLeft.y() > topLeft.y()){
+ QPointF leftTmp = bottomLeft;
+ QPointF rightTmp = bottomRight;
+ bottomLeft = topLeft;
+ topLeft = leftTmp;
+ bottomRight = topRight;
+ topRight = rightTmp;
}
QLineF topLine(topLeft, topRight);
qreal angle = topLine.angle();
qreal width = topLine.length();
+
QLineF leftLine(topLeft, bottomLeft);
qreal height = leftLine.length();
+ int h = rotating()?rotateHeight:height;
+
if (mVisible)
{
- setRect(center.x() - mFrameWidth - width / 2, center.y() - mFrameWidth - height / 2,
- width + 2 * mFrameWidth, height + 2 * mFrameWidth);
+ qDebug() << center.y();
+ setRect(center.x() - mFrameWidth - width / 2, center.y() - mFrameWidth - h / 2, width + 2 * mFrameWidth, h + 2 * mFrameWidth);
}
else
{
- setRect(center.x() - width / 2, center.y() - height / 2, width, height);
+ setRect(center.x() - width / 2, center.y() - h / 2, width, h);
}
resetTransform();
@@ -680,30 +706,38 @@ UBGraphicsDelegateFrame::FrameTool UBGraphicsDelegateFrame::toolFromPos(QPointF
return ResizeBottomRight;
else if (bottomResizeGripRect().contains(pos)){
if(mMirrorY){
+ qDebug() << "Top";
return ResizeTop;
}else{
+ qDebug() << "Bottom";
return ResizeBottom;
}
}
else if (leftResizeGripRect().contains(pos)){
if(mMirrorX){
+ qDebug() << "Right";
return ResizeRight;
}else{
+ qDebug() << "Left";
return ResizeLeft;
}
return ResizeLeft;
}
else if (rightResizeGripRect().contains(pos)){
if(mMirrorX){
+ qDebug() << "Left";
return ResizeLeft;
}else{
+ qDebug() << "Right";
return ResizeRight;
}
}
else if (topResizeGripRect().contains(pos)){
if(mMirrorY){
+ qDebug() << "Bottom";
return ResizeBottom;
}else{
+ qDebug() << "Top";
return ResizeTop;
}
}
diff --git a/src/globals/UBGlobals.h b/src/globals/UBGlobals.h
index 5a98fd10..93ebcb84 100644
--- a/src/globals/UBGlobals.h
+++ b/src/globals/UBGlobals.h
@@ -1,11 +1,38 @@
+/*
+ * 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 .
+ */
+
#ifndef UBGLOBALS_H
#define UBGLOBALS_H
+#include
+#include
+
#define DELETEPTR(ptr) if(NULL != ptr){ \
delete ptr; \
ptr = NULL; \
}
+#define SET_STYLE_SHEET() {\
+ setAttribute(Qt::WA_StyledBackground, true);\
+ QString style;\
+ QFile f(":style.qss");\
+ if(f.exists() && f.open(QIODevice::ReadOnly))\
+ style = QString(f.readAll());\
+ setStyleSheet(style);\
+}
+
#ifdef Q_WS_WIN
#define WARNINGS_DISABLE __pragma(warning(push, 0));
@@ -14,7 +41,7 @@
#ifdef NO_THIRD_PARTY_WARNINGS
// disabling warning level to 0 and save old state
#define THIRD_PARTY_WARNINGS_DISABLE WARNINGS_DISABLE
-#else
+#else
// just save old state (needs for not empty define)
#define THIRD_PARTY_WARNINGS_DISABLE __pragma(warning(push));
#endif //#ifdef NO_THIRD_PARTY_WARNINGS
@@ -24,9 +51,9 @@
#define WARNINGS_DISABLE _Pragma("GCC diagnostic push"); \
_Pragma("GCC diagnostic ignored \"-Wunused-parameter\""); \
_Pragma("GCC diagnostic ignored \"-Wunused-variable\""); \
-_Pragma("GCC diagnostic ignored \"-Wsign-compare\"");
+_Pragma("GCC diagnostic ignored \"-Wsign-compare\"");
-#define WARNINGS_ENABLE _Pragma("GCC diagnostic pop");
+#define WARNINGS_ENABLE _Pragma("GCC diagnostic pop");
#ifdef NO_THIRD_PARTY_WARNINGS
//disabling some warnings
@@ -43,4 +70,4 @@ _Pragma("GCC diagnostic ignored \"-Wsign-compare\"");
#define THIRD_PARTY_WARNINGS_ENABLE WARNINGS_ENABLE
#endif // UBGLOBALS_H
-
+
diff --git a/src/gui/UBActionPalette.cpp b/src/gui/UBActionPalette.cpp
index 304f8ec2..96d9395e 100644
--- a/src/gui/UBActionPalette.cpp
+++ b/src/gui/UBActionPalette.cpp
@@ -231,6 +231,7 @@ void UBActionPalette::mouseReleaseEvent(QMouseEvent * event)
void UBActionPalette::actionChanged()
{
+ emit itemOnActionPaletteChanged();
for(int i = 0; i < mActions.length() && i < mButtons.length(); i++)
{
mButtons.at(i)->setVisible(mActions.at(i)->isVisible());
diff --git a/src/gui/UBActionPalette.h b/src/gui/UBActionPalette.h
index dc64a408..5e5604a8 100644
--- a/src/gui/UBActionPalette.h
+++ b/src/gui/UBActionPalette.h
@@ -56,10 +56,12 @@ class UBActionPalette : public UBFloatingPalette
public slots:
void close();
+
signals:
void closed();
void buttonGroupClicked(int id);
void customMouseReleased();
+ void itemOnActionPaletteChanged();
protected:
virtual void paintEvent(QPaintEvent *event);
diff --git a/src/gui/UBCachePropertiesWidget.cpp b/src/gui/UBCachePropertiesWidget.cpp
index e0c74986..ada7f785 100644
--- a/src/gui/UBCachePropertiesWidget.cpp
+++ b/src/gui/UBCachePropertiesWidget.cpp
@@ -7,6 +7,7 @@
#include "core/UBApplication.h"
#include "core/UBApplicationController.h"
+#include "globals/UBGlobals.h"
#include "board/UBBoardController.h"
#include "domain/UBGraphicsScene.h"
@@ -34,8 +35,8 @@ UBCachePropertiesWidget::UBCachePropertiesWidget(QWidget *parent, const char *na
, mpCurrentCache(NULL)
{
setObjectName(name);
- setAttribute(Qt::WA_StyledBackground, true);
- setStyleSheet(UBApplication::globalStyleSheet());
+
+ SET_STYLE_SHEET();
mName = "CachePropWidget";
mVisibleState = false;
@@ -283,7 +284,7 @@ void UBCachePropertiesWidget::updateCurrentCache()
if( UBApplication::applicationController != NULL )
{
// if app controller is available, and current mode is Board, and no show desktop, than all ok, just process
- if( UBApplication::applicationController->displayMode() == UBApplicationController::Board &&
+ if( UBApplication::applicationController->displayMode() == UBApplicationController::Board &&
!UBApplication::applicationController->isShowingDesktop())
isBoardMode = true;
}
@@ -348,4 +349,4 @@ void UBCachePropertiesWidget::onCacheEnabled()
{
emit showTab(this);
}
-
+
diff --git a/src/gui/UBDockDownloadWidget.cpp b/src/gui/UBDockDownloadWidget.cpp
index 01b5d0ac..4ce9d07e 100644
--- a/src/gui/UBDockDownloadWidget.cpp
+++ b/src/gui/UBDockDownloadWidget.cpp
@@ -15,6 +15,8 @@
#include "UBDockDownloadWidget.h"
#include "core/UBApplication.h"
+#include "globals/UBGlobals.h"
+
UBDockDownloadWidget::UBDockDownloadWidget(QWidget *parent, const char *name):UBDockPaletteWidget(parent, name)
, mpLayout(NULL)
, mpDLWidget(NULL)
@@ -22,8 +24,7 @@ UBDockDownloadWidget::UBDockDownloadWidget(QWidget *parent, const char *name):UB
mName = "DownloadWidget";
mVisibleState = false;
- setAttribute(Qt::WA_StyledBackground, true);
- setStyleSheet(UBApplication::globalStyleSheet());
+ SET_STYLE_SHEET();
mIconToLeft = QPixmap(":images/download_open.png");
mIconToRight = QPixmap(":images/download_close.png");
diff --git a/src/gui/UBDockTeacherGuideWidget.cpp b/src/gui/UBDockTeacherGuideWidget.cpp
new file mode 100644
index 00000000..f8ad4f43
--- /dev/null
+++ b/src/gui/UBDockTeacherGuideWidget.cpp
@@ -0,0 +1,44 @@
+/*
+ * 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 .
+ */
+
+#include "core/UBApplication.h"
+#include "globals/UBGlobals.h"
+
+#include "UBDockTeacherGuideWidget.h"
+#include "UBTeacherGuideWidget.h"
+
+
+UBDockTeacherGuideWidget::UBDockTeacherGuideWidget(QWidget* parent, const char* name):
+ UBDockPaletteWidget(parent,name)
+ , mpTeacherGuideWidget(NULL)
+{
+ mName = "TeacherGuide";
+
+ SET_STYLE_SHEET();
+
+ mIconToLeft = QPixmap(":images/teacher_open.png");
+ mIconToRight = QPixmap(":images/teacher_close.png");
+
+ mpLayout = new QVBoxLayout(this);
+ setLayout(mpLayout);
+ mpTeacherGuideWidget = new UBTeacherGuideWidget(this);
+ mpLayout->addWidget(mpTeacherGuideWidget);
+}
+
+UBDockTeacherGuideWidget::~UBDockTeacherGuideWidget()
+{
+ DELETEPTR(mpTeacherGuideWidget);
+ DELETEPTR(mpLayout);
+}
diff --git a/src/gui/UBDockTeacherGuideWidget.h b/src/gui/UBDockTeacherGuideWidget.h
new file mode 100644
index 00000000..ee2d4268
--- /dev/null
+++ b/src/gui/UBDockTeacherGuideWidget.h
@@ -0,0 +1,39 @@
+/*
+ * 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 .
+ */
+
+#ifndef UBDOCKTEACHERGUIDEWIDGET_H
+#define UBDOCKTEACHERGUIDEWIDGET_H
+
+class QVBoxLayout;
+class UBTeacherGuideWidget;
+
+#include "UBDockPaletteWidget.h"
+
+
+class UBDockTeacherGuideWidget : public UBDockPaletteWidget
+{
+ Q_OBJECT
+public:
+ UBDockTeacherGuideWidget(QWidget* parent=0, const char* name="UBDockTeacherGuideWidget");
+ ~UBDockTeacherGuideWidget();
+
+ bool visibleInMode(eUBDockPaletteWidgetMode mode){ return mode == eUBDockPaletteWidget_BOARD; }
+
+private:
+ QVBoxLayout* mpLayout;
+ UBTeacherGuideWidget* mpTeacherGuideWidget;
+};
+
+#endif // UBDOCKTEACHERGUIDEWIDGET_H
diff --git a/src/gui/UBDocumentNavigator.cpp b/src/gui/UBDocumentNavigator.cpp
index 7abf129b..efb3e04a 100644
--- a/src/gui/UBDocumentNavigator.cpp
+++ b/src/gui/UBDocumentNavigator.cpp
@@ -56,7 +56,6 @@ 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)));
}
diff --git a/src/gui/UBDownloadWidget.cpp b/src/gui/UBDownloadWidget.cpp
index 286b9f20..00da5b01 100644
--- a/src/gui/UBDownloadWidget.cpp
+++ b/src/gui/UBDownloadWidget.cpp
@@ -18,8 +18,10 @@
#include
#include "UBDownloadWidget.h"
-#include "core/UBApplication.h"
+#include "globals/UBGlobals.h"
+
+#include "core/UBApplication.h"
#include "core/memcheck.h"
/**
@@ -36,8 +38,7 @@ UBDownloadWidget::UBDownloadWidget(QWidget *parent, const char *name):QWidget(pa
{
setObjectName(name);
setWindowTitle(tr("Downloading files"));
- setAttribute(Qt::WA_StyledBackground, true);
- setStyleSheet(UBApplication::globalStyleSheet());
+ SET_STYLE_SHEET();
resize(400, 300);
mpLayout = new QVBoxLayout(this);
diff --git a/src/gui/UBLibItemProperties.cpp b/src/gui/UBLibItemProperties.cpp
index b37747ff..4d2eada3 100644
--- a/src/gui/UBLibItemProperties.cpp
+++ b/src/gui/UBLibItemProperties.cpp
@@ -18,10 +18,12 @@
#include "core/UBApplication.h"
#include "core/UBDownloadManager.h"
+#include "core/memcheck.h"
#include "frameworks/UBFileSystemUtils.h"
-#include "core/memcheck.h"
+#include "globals/UBGlobals.h"
+
/**
* \brief Constructor
@@ -43,8 +45,7 @@ UBLibItemProperties::UBLibItemProperties(QWidget *parent, const char *name):QWid
{
setObjectName(name);
- setAttribute(Qt::WA_StyledBackground, true);
- setStyleSheet(UBApplication::globalStyleSheet());
+ SET_STYLE_SHEET();
// Create the GUI
mpLayout = new QVBoxLayout(this);
diff --git a/src/gui/UBLibNavigatorWidget.cpp b/src/gui/UBLibNavigatorWidget.cpp
index 8b36dd07..5974c4ea 100644
--- a/src/gui/UBLibNavigatorWidget.cpp
+++ b/src/gui/UBLibNavigatorWidget.cpp
@@ -18,6 +18,8 @@
#include "core/UBApplication.h"
#include "core/memcheck.h"
+#include "globals/UBGlobals.h"
+
static int lowBoundForSlider = 40;
static int topBoundForSlider = 120;
static int tickIntervalForSlider = 10;
@@ -35,8 +37,7 @@ UBLibNavigatorWidget::UBLibNavigatorWidget(QWidget *parent, const char *name):QW
{
setObjectName(name);
- setAttribute(Qt::WA_StyledBackground, true);
- setStyleSheet(UBApplication::globalStyleSheet());
+ SET_STYLE_SHEET();
setAcceptDrops(true);
@@ -62,7 +63,7 @@ UBLibNavigatorWidget::UBLibNavigatorWidget(QWidget *parent, const char *name):QW
connect(mLibWidget, SIGNAL(propertiesRequested(UBLibElement*)), this, SLOT(onPropertiesRequested(UBLibElement*)));
- connect(mLibWidget, SIGNAL(displaySearchEngine(UBLibElement*)), this, SLOT(onDisplaySearchEngine(UBLibElement*)));
+ connect(mLibWidget, SIGNAL(displaySearchEngine(UBLibElement*)), this, SLOT(onDisplaySearchEngine(UBLibElement*)));
connect(mSlider,SIGNAL(valueChanged(int)),this,SLOT(updateThumbnailsSize(int)));
connect(libWidget->pathViewer(), SIGNAL(mouseClick(UBChainedLibElement*)), this, SLOT(onPathItemClicked(UBChainedLibElement*)));
connect(libWidget->pathViewer(), SIGNAL(elementsDropped(QList,UBLibElement*)), mLibWidget, SLOT(onElementsDropped(QList,UBLibElement*)));
diff --git a/src/gui/UBLibWebView.cpp b/src/gui/UBLibWebView.cpp
index b02af11d..ac6e11a5 100644
--- a/src/gui/UBLibWebView.cpp
+++ b/src/gui/UBLibWebView.cpp
@@ -1,11 +1,15 @@
#include
#include "core/UBApplication.h"
+#include "core/memcheck.h"
+
#include "board/UBBoardController.h"
+#include "globals/UBGlobals.h"
+
#include "UBLibWebView.h"
-#include "core/memcheck.h"
+
UBLibWebView::UBLibWebView(QWidget* parent, const char* name):QWidget(parent)
, mpView(NULL)
@@ -15,8 +19,7 @@ UBLibWebView::UBLibWebView(QWidget* parent, const char* name):QWidget(parent)
{
setObjectName(name);
- setAttribute(Qt::WA_StyledBackground, true);
- setStyleSheet(UBApplication::globalStyleSheet());
+ SET_STYLE_SHEET();
mpLayout = new QVBoxLayout();
setLayout(mpLayout);
diff --git a/src/gui/UBLibWidget.cpp b/src/gui/UBLibWidget.cpp
index 4e8ffc08..9765bae4 100644
--- a/src/gui/UBLibWidget.cpp
+++ b/src/gui/UBLibWidget.cpp
@@ -15,10 +15,12 @@
#include
#include "UBLibWidget.h"
-#include "core/UBApplication.h"
+#include "core/UBApplication.h"
#include "core/memcheck.h"
+#include "globals/UBGlobals.h"
+
/**
* \brief Constructor
* @param parent as the parent widget
@@ -37,8 +39,7 @@ UBLibWidget::UBLibWidget(QWidget *parent, const char *name):UBDockPaletteWidget(
mName = "LibWidget";
mVisibleState = true;
- setAttribute(Qt::WA_StyledBackground, true);
- setStyleSheet(UBApplication::globalStyleSheet());
+ SET_STYLE_SHEET();
mIconToLeft = QPixmap(":images/library_open.png");
mIconToRight = QPixmap(":images/library_close.png");
diff --git a/src/gui/UBMediaPlayer.cpp b/src/gui/UBMediaPlayer.cpp
deleted file mode 100644
index b3ed29b8..00000000
--- a/src/gui/UBMediaPlayer.cpp
+++ /dev/null
@@ -1,389 +0,0 @@
-#include "UBMediaPlayer.h"
-
-
-
-#include
-
-#define SLIDER_RANGE 8
-
-
-MediaVideoWidget::MediaVideoWidget(UBMediaPlayer *player, QWidget *parent) :
- Phonon::VideoWidget(parent), m_player(player)/*, m_action(this)*/
-{
-// m_action.setCheckable(true);
-// m_action.setChecked(false);
-// m_action.setShortcut(QKeySequence( Qt::AltModifier + Qt::Key_Return));
-// m_action.setShortcutContext(Qt::WindowShortcut);
-// connect(&m_action, SIGNAL(toggled(bool)), SLOT(setFullScreen(bool)));
-// addAction(&m_action);
-// setAcceptDrops(true);
-}
-
-void MediaVideoWidget::timerEvent(QTimerEvent *e)
-{
- if (e->timerId() == m_timer.timerId()) {
- //let's store the cursor shape
-#ifndef QT_NO_CURSOR
- setCursor(Qt::BlankCursor);
-#endif
- }
- Phonon::VideoWidget::timerEvent(e);
-}
-
-
-UBMediaPlayer::UBMediaPlayer() :
- playButton(0),
- m_AudioOutput(Phonon::VideoCategory),
- m_videoWidget(new MediaVideoWidget(this))
-{
- setContextMenuPolicy(Qt::CustomContextMenu);
- m_videoWidget->setContextMenuPolicy(Qt::CustomContextMenu);
-
- QSize buttonSize(26, 20);
-
-// QPushButton *openButton = new QPushButton(this);
-
-//// openButton->setIcon(style()->standardIcon(QStyle::SP_DialogOpenButton));
-//// QPalette bpal;
-//// QColor arrowcolor = bpal.buttonText().color();
-//// if (arrowcolor == Qt::black)
-//// arrowcolor = QColor(80, 80, 80);
-//// bpal.setBrush(QPalette::ButtonText, arrowcolor);
-//// openButton->setPalette(bpal);
-
-// rewindButton = new QPushButton(this);
-// rewindButton->setIcon(style()->standardIcon(QStyle::SP_MediaSkipBackward));
-
-// forwardButton = new QPushButton(this);
-// forwardButton->setIcon(style()->standardIcon(QStyle::SP_MediaSkipForward));
-// forwardButton->setEnabled(false);
-
- playButton = new QPushButton(this);
- playIcon = style()->standardIcon(QStyle::SP_MediaPlay);
- pauseIcon = style()->standardIcon(QStyle::SP_MediaPause);
- playButton->setIcon(playIcon);
-
- slider = new Phonon::SeekSlider(this);
- slider->setMediaObject(&m_MediaObject);
-
- QVBoxLayout *vLayout = new QVBoxLayout(this);
- vLayout->setContentsMargins(1, 1, 1, 1);
-
-// QHBoxLayout *layout = new QHBoxLayout();
-
-// info = new QLabel(this);
-// info->setMinimumHeight(70);
-// info->setAcceptDrops(false);
-// info->setMargin(2);
-// info->setFrameStyle(QFrame::StyledPanel | QFrame::Sunken);
-// info->setLineWidth(2);
-// info->setAutoFillBackground(true);
-
-// QPalette palette;
-// palette.setBrush(QPalette::WindowText, Qt::white);
-#ifndef Q_WS_MAC
-// rewindButton->setMinimumSize(buttonSize);
-// forwardButton->setMinimumSize(buttonSize);
- playButton->setMinimumSize(buttonSize);
-#endif
-// info->setStyleSheet("border-image:url(:/images/screen.png) ; border-width:3px");
-// info->setPalette(palette);
-// info->setText(tr("No media"));
-
-
-// layout->addWidget(rewindButton);
-// layout->addWidget(playButton);
-// layout->addWidget(forwardButton);
-
-// layout->addStretch();
-
-// vLayout->addWidget(info);
- initVideoWindow();
- vLayout->addWidget(&m_videoWindow);
-// m_videoWidget->setStyleSheet(QString("background:red;"));
- QVBoxLayout *buttonPanelLayout = new QVBoxLayout();
-#ifndef Q_WS_WIN
- m_videoWindow.hide();
-#endif
-// buttonPanelLayout->addLayout(layout);
-
-// timeLabel = new QLabel(this);
- progressLabel = new QLabel(this);
- QWidget *sliderPanel = new QWidget(this);
-// sliderPanel->setStyleSheet(QString("background:green;"));
- QHBoxLayout *sliderLayout = new QHBoxLayout();
-// playButton->setStyleSheet(QString("background:yellow;"));
- sliderLayout->addWidget(playButton);
- sliderLayout->addWidget(slider);
-// sliderLayout->addWidget(timeLabel);
- sliderLayout->addWidget(progressLabel);
- sliderLayout->setContentsMargins(0, 0, 0, 0);
- sliderPanel->setLayout(sliderLayout);
-
- buttonPanelLayout->addWidget(sliderPanel);
- buttonPanelLayout->setContentsMargins(0, 0, 0, 0);
-#ifdef Q_OS_MAC
-// layout->setSpacing(4);
- buttonPanelLayout->setSpacing(0);
-// info->setMinimumHeight(100);
-// info->setFont(QFont("verdana", 15));
-// openButton->setFocusPolicy(Qt::NoFocus);
-#endif
- QWidget *buttonPanelWidget = new QWidget(this);
- buttonPanelWidget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
- buttonPanelWidget->setLayout(buttonPanelLayout);
- vLayout->addWidget(buttonPanelWidget);
-
- QHBoxLayout *labelLayout = new QHBoxLayout();
- vLayout->addLayout(labelLayout);
- setLayout(vLayout);
-
-
- // Setup signal connections:
-// connect(rewindButton, SIGNAL(clicked()), this, SLOT(rewind()));
-
- connect(playButton, SIGNAL(clicked()), this, SLOT(playPause()));
-// connect(forwardButton, SIGNAL(clicked()), this, SLOT(forward()));
-
-// connect(&m_MediaObject, SIGNAL(totalTimeChanged(qint64)), this, SLOT(updateTime()));
-// connect(&m_MediaObject, SIGNAL(tick(qint64)), this, SLOT(updateTime()));
- connect(&m_MediaObject, SIGNAL(finished()), this, SLOT(finished()));
- connect(&m_MediaObject, SIGNAL(stateChanged(Phonon::State,Phonon::State)), this, SLOT(stateChanged(Phonon::State,Phonon::State)));
- connect(&m_MediaObject, SIGNAL(bufferStatus(int)), this, SLOT(bufferStatus(int)));
- connect(&m_MediaObject, SIGNAL(hasVideoChanged(bool)), this, SLOT(hasVideoChanged(bool)));
-
-// rewindButton->setEnabled(false);
- playButton->setEnabled(false);
-// setAcceptDrops(true);
-
- m_audioOutputPath = Phonon::createPath(&m_MediaObject, &m_AudioOutput);
- Phonon::createPath(&m_MediaObject, m_videoWidget);
-
- resize(minimumSizeHint());
-}
-
-void UBMediaPlayer::stateChanged(Phonon::State newstate, Phonon::State oldstate)
-{
- if (oldstate == Phonon::LoadingState) {
- QRect videoHintRect = QRect(QPoint(0, 0), m_videoWindow.sizeHint());
- QApplication::desktop()->screenGeometry().intersected(videoHintRect);
-
- if (m_MediaObject.hasVideo()) {
- qApp->processEvents();
- resize(sizeHint());
- } else
- resize(minimumSize());
-
- }
-
- switch (newstate) {
- case Phonon::ErrorState:
- if (m_MediaObject.errorType() == Phonon::FatalError) {
- playButton->setEnabled(false);
-// rewindButton->setEnabled(false);
- } else {
- m_MediaObject.pause();
- }
- QMessageBox::warning(this, "Phonon UBMediaPlayer", m_MediaObject.errorString(), QMessageBox::Close);
- break;
-
- case Phonon::StoppedState:
-// m_videoWidget-> (false);
- // Fall through
- case Phonon::PausedState:
- playButton->setIcon(playIcon);
- if (m_MediaObject.currentSource().type() != Phonon::MediaSource::Invalid){
- playButton->setEnabled(true);
-// rewindButton->setEnabled(true);
- } else {
- playButton->setEnabled(false);
-// rewindButton->setEnabled(false);
- }
- break;
- case Phonon::PlayingState:
- playButton->setEnabled(true);
- playButton->setIcon(pauseIcon);
- if (m_MediaObject.hasVideo())
- m_videoWindow.show();
- // Fall through
- case Phonon::BufferingState:
-// rewindButton->setEnabled(true);
- break;
- case Phonon::LoadingState:
-// rewindButton->setEnabled(false);
- break;
- }
-
-}
-
-void UBMediaPlayer::setVolume(qreal volume)
-{
- m_AudioOutput.setVolume(volume);
-}
-
-
-void UBMediaPlayer::initVideoWindow()
-{
- QVBoxLayout *videoLayout = new QVBoxLayout();
- videoLayout->addWidget(m_videoWidget);
- videoLayout->setContentsMargins(0, 0, 0, 0);
- m_videoWindow.setLayout(videoLayout);
- m_videoWindow.setMinimumSize(60, 40);
-}
-
-void UBMediaPlayer::playPause()
-{
- if (m_MediaObject.state() == Phonon::PlayingState)
- m_MediaObject.pause();
- else {
- if (m_MediaObject.currentTime() == m_MediaObject.totalTime())
- m_MediaObject.seek(0);
- m_MediaObject.play();
- }
-}
-
-void UBMediaPlayer::setFile(const QString &fileName)
-{
- setWindowTitle(fileName.right(fileName.length() - fileName.lastIndexOf('/') - 1));
- m_MediaObject.setCurrentSource(Phonon::MediaSource(fileName));
-}
-
-void UBMediaPlayer::setLocation(const QString& location)
-{
- setWindowTitle(location.right(location.length() - location.lastIndexOf('/') - 1));
- m_MediaObject.setCurrentSource(Phonon::MediaSource(QUrl::fromEncoded(location.toUtf8())));
- m_MediaObject.play();
-}
-
-
-void UBMediaPlayer::openFile()
-{
- QStringList fileNames = QFileDialog::getOpenFileNames(this, QString(), QDesktopServices::storageLocation(QDesktopServices::MusicLocation));
-
-
- m_MediaObject.clearQueue();
- if (fileNames.size() > 0) {
- QString fileName = fileNames[0];
- setFile(fileName);
- for (int i=1; isetText(QString());
- else {
- QString str = QString::fromLatin1("(%1%)").arg(percent);
- progressLabel->setText(str);
- }
-}
-
-//void UBMediaPlayer::updateTime()
-//{
-// long len = m_MediaObject.totalTime();
-// long pos = m_MediaObject.currentTime();
-// QString timeString;
-// if (pos || len)
-// {
-// int sec = pos/1000;
-// int min = sec/60;
-// int hour = min/60;
-// int msec = pos;
-
-// QTime playTime(hour%60, min%60, sec%60, msec%1000);
-// sec = len / 1000;
-// min = sec / 60;
-// hour = min / 60;
-// msec = len;
-
-// QTime stopTime(hour%60, min%60, sec%60, msec%1000);
-// QString timeFormat = "m:ss";
-// if (hour > 0)
-// timeFormat = "h:mm:ss";
-// timeString = playTime.toString(timeFormat);
-// if (len)
-// timeString += " / " + stopTime.toString(timeFormat);
-// }
-// timeLabel->setText(timeString);
-//}
-
-void UBMediaPlayer::rewind()
-{
- m_MediaObject.seek(0);
-}
-
-void UBMediaPlayer::forward()
-{
- QList queue = m_MediaObject.queue();
- if (queue.size() > 0) {
- m_MediaObject.setCurrentSource(queue[0]);
-// forwardButton->setEnabled(queue.size() > 1);
- m_MediaObject.play();
- }
-}
-
-void UBMediaPlayer::openUrl()
-{
- QSettings settings;
- settings.beginGroup(QLatin1String("BrowserMainWindow"));
- QString sourceURL = settings.value("location").toString();
- bool ok = false;
- sourceURL = QInputDialog::getText(this, tr("Open Location"), tr("Please enter a valid address here:"), QLineEdit::Normal, sourceURL, &ok);
- if (ok && !sourceURL.isEmpty()) {
- setLocation(sourceURL);
- settings.setValue("location", sourceURL);
- }
-}
-
-void UBMediaPlayer::finished()
-{
-}
-
-void UBMediaPlayer::hasVideoChanged(bool bHasVideo)
-{
-// info->setVisible(!bHasVideo);
- m_videoWindow.setVisible(bHasVideo);
-}
-
-void UBMediaPlayer::resizeEvent(QResizeEvent* pEvent)
-{
- Q_UNUSED(pEvent);
-// int origWidth = m_videoWindow.width();
-// int origHeight = m_videoWindow.height();
-
-// float scaleFactor = (float)origWidth / (float)width();
-// int newWidth = width();
-// int newHeigth = origHeight/scaleFactor;
-
-// m_videoWindow.resize(newWidth, newHeigth);
-}
-
-//*************************************************************************
-UBDraggableMediaPlayer::UBDraggableMediaPlayer():UBMediaPlayer()
-{
-// setAcceptDrops(true);
-}
-
-void UBDraggableMediaPlayer::setFile(const QString &text)
-{
- mSourcePath = text;
- UBMediaPlayer::setFile(text);
-}
-
-void UBDraggableMediaPlayer::mousePressEvent(QMouseEvent *event)
-{
- Q_UNUSED(event);
- QMimeData *mimeData = new QMimeData;
- QList urls;
- urls << QUrl::fromLocalFile(mSourcePath);
- mimeData->setUrls(urls);
- mimeData->setText(mSourcePath);
-
-
- QDrag *drag = new QDrag(this);
- drag->setMimeData(mimeData);
- drag->start();
-}
-
diff --git a/src/gui/UBMediaPlayer.h b/src/gui/UBMediaPlayer.h
deleted file mode 100644
index 9e5e0e1a..00000000
--- a/src/gui/UBMediaPlayer.h
+++ /dev/null
@@ -1,107 +0,0 @@
-#ifndef UBUBMediaPlayer_H
-#define UBUBMediaPlayer_H
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-QT_BEGIN_NAMESPACE
-class QPushButton;
-class QLabel;
-class QSlider;
-class QTextEdit;
-QT_END_NAMESPACE
-
-class UBMediaPlayer;
-
-class MediaVideoWidget : public Phonon::VideoWidget
-{
- Q_OBJECT;
-
-public:
- MediaVideoWidget(UBMediaPlayer *player, QWidget *parent = 0);
-
-protected:
- void timerEvent(QTimerEvent *e);
-
-private:
- UBMediaPlayer* m_player;
- QBasicTimer m_timer;
-// QAction m_action;
-};
-
-class UBMediaPlayer : public QWidget
-{
- Q_OBJECT
-public:
- UBMediaPlayer();
-
- void setFile(const QString &text);
- void setLocation(const QString &location);
- void setVolume(qreal volume);
-
-public slots:
- void openFile();
- void rewind();
- void forward();
-// void updateTime();
- void finished();
- void playPause();
-
-protected:
- void resizeEvent(QResizeEvent* pEvent);
-
-private slots:
- void stateChanged(Phonon::State newstate, Phonon::State oldstate);
- void bufferStatus(int percent);
- void openUrl();
-
- void hasVideoChanged(bool);
-
-private:
- void initVideoWindow();
-
- QIcon playIcon;
- QIcon pauseIcon;
- QPushButton *playButton;
-// QPushButton *rewindButton;
-// QPushButton *forwardButton;
- Phonon::SeekSlider *slider;
-// QLabel *timeLabel;
- QLabel *progressLabel;
-// QLabel *info;
-
- QWidget m_videoWindow;
- Phonon::MediaObject m_MediaObject;
- Phonon::AudioOutput m_AudioOutput;
- MediaVideoWidget *m_videoWidget;
- Phonon::Path m_audioOutputPath;
-};
-
-class UBDraggableMediaPlayer : public UBMediaPlayer
-{
- Q_OBJECT
-public:
- UBDraggableMediaPlayer();
- void setFile(const QString &text);
-protected:
- QString mSourcePath;
- void mousePressEvent(QMouseEvent *event);
-};
-
-
-#endif // UBUBMediaPlayer_H
diff --git a/src/gui/UBPageNavigationWidget.cpp b/src/gui/UBPageNavigationWidget.cpp
index 77c378c2..6ff72dd8 100644
--- a/src/gui/UBPageNavigationWidget.cpp
+++ b/src/gui/UBPageNavigationWidget.cpp
@@ -14,9 +14,12 @@
*/
#include "UBPageNavigationWidget.h"
#include "core/UBApplication.h"
-#include "board/UBBoardController.h"
#include "core/memcheck.h"
+#include "board/UBBoardController.h"
+
+#include "globals/UBGlobals.h"
+
/**
* \brief Constructor
* @param parent as the parent widget
@@ -32,8 +35,8 @@ UBPageNavigationWidget::UBPageNavigationWidget(QWidget *parent, const char *name
setObjectName(name);
mName = "PageNavigator";
mVisibleState = true;
- setAttribute(Qt::WA_StyledBackground, true);
- setStyleSheet(UBApplication::globalStyleSheet());
+
+ SET_STYLE_SHEET();
mIconToRight = QPixmap(":images/pages_open.png");
mIconToLeft = QPixmap(":images/pages_close.png");
diff --git a/src/gui/UBTGWidgetTreeDelegate.cpp b/src/gui/UBTGWidgetTreeDelegate.cpp
new file mode 100644
index 00000000..928beac9
--- /dev/null
+++ b/src/gui/UBTGWidgetTreeDelegate.cpp
@@ -0,0 +1,34 @@
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include "UBTGWidgetTreeDelegate.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;
+}
diff --git a/src/gui/UBTGWidgetTreeDelegate.h b/src/gui/UBTGWidgetTreeDelegate.h
new file mode 100644
index 00000000..75343346
--- /dev/null
+++ b/src/gui/UBTGWidgetTreeDelegate.h
@@ -0,0 +1,35 @@
+#ifndef UBTGWIDGETTREEDELEGATE_H
+#define UBTGWIDGETTREEDELEGATE_H
+
+class QPainter;
+class QStyleOptionViewItem;
+class QModelIndex;
+
+#include
+
+
+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
diff --git a/src/gui/UBTeacherGuideDelegate.cpp b/src/gui/UBTeacherGuideDelegate.cpp
new file mode 100644
index 00000000..33dba6fe
--- /dev/null
+++ b/src/gui/UBTeacherGuideDelegate.cpp
@@ -0,0 +1,5 @@
+#include "UBTeacherGuideDelegate.h"
+
+UBTeacherGuideDelegate::UBTeacherGuideDelegate()
+{
+}
diff --git a/src/gui/UBTeacherGuideDelegate.h b/src/gui/UBTeacherGuideDelegate.h
new file mode 100644
index 00000000..1c1134f5
--- /dev/null
+++ b/src/gui/UBTeacherGuideDelegate.h
@@ -0,0 +1,10 @@
+#ifndef UBTEACHERGUIDEDELEGATE_H
+#define UBTEACHERGUIDEDELEGATE_H
+
+class UBTeacherGuideDelegate
+{
+public:
+ UBTeacherGuideDelegate();
+};
+
+#endif // UBTEACHERGUIDEDELEGATE_H
diff --git a/src/gui/UBTeacherGuideWidget.cpp b/src/gui/UBTeacherGuideWidget.cpp
new file mode 100644
index 00000000..8d770c64
--- /dev/null
+++ b/src/gui/UBTeacherGuideWidget.cpp
@@ -0,0 +1,504 @@
+/*
+ * 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 .
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "UBTeacherGuideWidget.h"
+
+#include "core/UBApplication.h"
+
+#include "globals/UBGlobals.h"
+
+#include "board/UBBoardController.h"
+#include "board/UBBoardView.h"
+#include "board/UBBoardPaletteManager.h"
+
+#include "gui/UBStylusPalette.h"
+#include "gui/UBActionPalette.h"
+
+#include "web/UBWebController.h"
+
+#define UBTG_SEPARATOR_FIXED_HEIGHT 3
+
+
+/***************************************************************************
+ * class UBTeacherGuideEditionWidget *
+ ***************************************************************************/
+
+UBTeacherGuideEditionWidget::UBTeacherGuideEditionWidget(QWidget *parent, const char* name) :
+ QWidget(parent)
+ , mpLayout(NULL)
+ , mpDocumentTitle(NULL)
+ , mpPageNumberLabel(NULL)
+ , mpPageTitle(NULL)
+ , mpComment(NULL)
+ , mpSeparator(NULL)
+ , mpTreeWidget(NULL)
+ , mpRootWidgetItem(NULL)
+ , 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");
+ mpLayout->addWidget(mpPageNumberLabel);
+ // tree basic configuration
+ mpDocumentTitle = new QLabel(this);
+ mpDocumentTitle->setText("Document title");
+ mpDocumentTitle->setObjectName("UBTGEditionDocumentTitle");
+ mpLayout->addWidget(mpDocumentTitle);
+
+ mpPageTitle = new UBTGAdaptableText(0,this);
+ mpPageTitle->setObjectName("UBTGEditionPageTitle");
+ mpPageTitle->setPlaceHolderText(tr("Type title here ..."));
+ mpLayout->addWidget(mpPageTitle);
+
+ mpComment = new UBTGAdaptableText(0,this);
+ mpComment->setObjectName("UBTGEditionComment");
+ mpComment->setPlaceHolderText(tr("Type comment here ..."));
+ mpLayout->addWidget(mpComment);
+
+ mpSeparator = new QFrame(this);
+ mpSeparator->setObjectName("UBTGEditionSeparator");
+ mpSeparator->setFixedHeight(UBTG_SEPARATOR_FIXED_HEIGHT);
+ mpLayout->addWidget(mpSeparator);
+
+ 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);
+ mpTreeWidget->header()->close();
+ mpTreeWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ mpTreeWidget->setColumnCount(2);
+ mpTreeWidget->header()->setStretchLastSection(false);
+ mpTreeWidget->header()->setResizeMode(0, QHeaderView::Stretch);
+ mpTreeWidget->header()->setResizeMode(1, QHeaderView::Fixed);
+ mpTreeWidget->header()->setDefaultSectionSize(18);
+
+ connect(mpTreeWidget,SIGNAL(itemClicked(QTreeWidgetItem*,int)),this,SLOT(onAddItemClicked(QTreeWidgetItem*,int)));
+ connect(UBApplication::boardController,SIGNAL(activeSceneChanged()),this,SLOT(onActiveSceneChanged()));
+
+ mpAddAnActionItem = new UBAddItem(tr("Add an action"),eUBTGAddSubItemWidgetType_Action,mpTreeWidget);
+ mpAddAMediaItem = new UBAddItem(tr("Add a media"),eUBTGAddSubItemWidgetType_Media,mpTreeWidget);
+ mpAddALinkItem = new UBAddItem(tr("Add a link"),eUBTGAddSubItemWidgetType_Url,mpTreeWidget);
+
+ mpRootWidgetItem->addChild(mpAddAnActionItem);
+ mpRootWidgetItem->addChild(mpAddAMediaItem);
+ mpRootWidgetItem->addChild(mpAddALinkItem);
+}
+
+UBTeacherGuideEditionWidget::~UBTeacherGuideEditionWidget()
+{
+ DELETEPTR(mpDocumentTitle);
+ DELETEPTR(mpPageNumberLabel);
+ DELETEPTR(mpPageTitle);
+ DELETEPTR(mpComment);
+ DELETEPTR(mpSeparator);
+ 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()
+{
+ cleanData();
+ mpPageNumberLabel->setText(tr("Page: %0").arg(UBApplication::boardController->activeSceneIndex() + 1));
+}
+
+void UBTeacherGuideEditionWidget::cleanData()
+{
+ mpPageTitle->setText("");
+ mpComment->setText("");
+ QList children = mpAddAnActionItem->takeChildren();
+ children << mpAddAMediaItem->takeChildren();
+ children << mpAddALinkItem->takeChildren();
+
+ foreach(QTreeWidgetItem* item, children){
+ DELETEPTR(item);
+ }
+
+}
+
+QList UBTeacherGuideEditionWidget::getChildrenList(QTreeWidgetItem* widgetItem)
+{
+ QListresult;
+ for(int i=0;ichildCount();i+=1)
+ result << widgetItem->child(i);
+ return result;
+}
+
+QVector UBTeacherGuideEditionWidget::getPageAndCommentData()
+{
+ QVectorresult;
+ tUBGEElementNode* pageTitle = new tUBGEElementNode();
+ pageTitle->type = "pageTitle";
+ pageTitle->attributes.insert("value",mpPageTitle->text());
+ result << pageTitle;
+
+ tUBGEElementNode* comment = new tUBGEElementNode();
+ comment->type = "comment";
+ comment->attributes.insert("value",mpComment->text());
+ result << comment;
+ return result;
+}
+
+QVector UBTeacherGuideEditionWidget::getData()
+{
+ QVectorresult;
+ QList children = getChildrenList(mpAddAnActionItem);
+ children << getChildrenList(mpAddAMediaItem);
+ children << getChildrenList(mpAddALinkItem);
+ result << getPageAndCommentData();
+ foreach(QTreeWidgetItem* widgetItem, children){
+ tUBGEElementNode* node = dynamic_cast(mpTreeWidget->itemWidget(widgetItem,0))->saveData();
+ if(node)
+ result << node;
+ }
+ return result;
+}
+
+void UBTeacherGuideEditionWidget::onAddItemClicked(QTreeWidgetItem* widget, int column)
+{
+ int addSubItemWidgetType = widget->data(column,Qt::UserRole).toInt();
+ if(column == 0 && 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));
+ break;
+ case eUBTGAddSubItemWidgetType_Media:
+ mpTreeWidget->setItemWidget(newWidgetItem,0,new UBTGMediaWidget(widget));
+ break;
+ case eUBTGAddSubItemWidgetType_Url:
+ mpTreeWidget->setItemWidget(newWidgetItem,0,new UBTGUrlWidget());
+ break;
+ default:
+ delete newWidgetItem;
+ qCritical() << "onAddItemClicked no action set";
+ return;
+ }
+
+ if(addSubItemWidgetType != eUBTGAddSubItemWidgetType_None && !widget->isExpanded() )
+ widget->setExpanded(true);
+ else{
+ //to update the tree and subtrees
+ widget->setExpanded(false);
+ widget->setExpanded(true);
+ }
+ }
+ else if(column == 1 && addSubItemWidgetType == eUBTGAddSubItemWidgetType_None){
+ int index = mpTreeWidget->currentIndex().row();
+ QTreeWidgetItem* toBeDeletedWidgetItem = widget->parent()->takeChild(index);
+ delete toBeDeletedWidgetItem;
+ }
+}
+
+/***************************************************************************
+ * class UBTeacherGuidePresentationWidget *
+ ***************************************************************************/
+typedef enum
+{
+ tUBTGActionAssociateOnClickItem_NONE,
+ tUBTGActionAssociateOnClickItem_URL,
+ tUBTGActionAssociateOnClickItem_MEDIA,
+ tUBTGActionAssociateOnClickItem_EXPAND
+}tUBTGActionAssociateOnClickItem;
+
+typedef enum
+{
+ tUBTGTreeWidgetItemRole_HasAnAction = Qt::UserRole,
+ tUBTGTreeWidgetItemRole_HasAnUrl
+}tUBTGTreeWidgetItemRole;
+
+
+UBTeacherGuidePresentationWidget::UBTeacherGuidePresentationWidget(QWidget *parent, const char *name) : QWidget(parent)
+ , mpPageTitle(NULL)
+ , mpComment(NULL)
+ , mpLayout(NULL)
+ , mpButtonTitleLayout(NULL)
+ , mpDocumentTitle(NULL)
+ , mpPageNumberLabel(NULL)
+ , mpSeparator(NULL)
+ , mpModePushButton(NULL)
+ , mpTreeWidget(NULL)
+ , mpRootWidgetItem(NULL)
+ , mpMediaSwitchItem(NULL)
+{
+ setObjectName(name);
+
+ mpLayout = new QVBoxLayout(this);
+
+ mpPageNumberLabel = new QLabel(this);
+ mpPageNumberLabel->setAlignment(Qt::AlignRight);
+ mpPageNumberLabel->setObjectName("UBTGPresentationPageNumberLabel");
+
+ mpLayout->addWidget(mpPageNumberLabel);
+
+ mpButtonTitleLayout = new QHBoxLayout(0);
+
+ mpModePushButton = new QPushButton(this);
+ mpModePushButton->setIcon(QIcon(":images/pencil.svg"));
+ mpModePushButton->setMaximumWidth(32);
+
+ 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);
+
+ mpLayout->addLayout(mpButtonTitleLayout);
+
+ mpPageTitle = new UBTGAdaptableText(0,this);
+ mpPageTitle->setObjectName("UBTGPresentationPageTitle");
+ mpPageTitle->setReadOnly(true);
+ mpPageTitle->setStyleSheet("background-color:transparent");
+ mpLayout->addWidget(mpPageTitle);
+
+ mpComment = new UBTGAdaptableText(0,this);
+ mpComment->setObjectName("UBTGPresentationComment");
+ mpComment->setReadOnly(true);
+ mpComment->setStyleSheet("background-color:transparent");
+ mpLayout->addWidget(mpComment);
+
+ mpSeparator = new QFrame(this);
+ mpSeparator->setFixedHeight(UBTG_SEPARATOR_FIXED_HEIGHT);
+ mpSeparator->setObjectName("UBTGPresentationSepartor");
+ mpLayout->addWidget(mpSeparator);
+
+ mpTreeWidget = new QTreeWidget(this);
+ mpLayout->addWidget(mpTreeWidget);
+
+ mpRootWidgetItem = mpTreeWidget->invisibleRootItem();
+ mpTreeWidget->setRootIsDecorated(false);
+ mpTreeWidget->setIndentation(0);
+ mpTreeWidget->setDropIndicatorShown(false);
+ mpTreeWidget->header()->close();
+ mpTreeWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ connect(mpTreeWidget,SIGNAL(itemClicked(QTreeWidgetItem*,int)),this,SLOT(onAddItemClicked(QTreeWidgetItem*,int)));
+ connect(UBApplication::boardController,SIGNAL(activeSceneChanged()),this,SLOT(onActiveSceneChanged()));
+}
+
+UBTeacherGuidePresentationWidget::~UBTeacherGuidePresentationWidget()
+{
+ DELETEPTR(mpComment);
+ DELETEPTR(mpPageTitle);
+ DELETEPTR(mpPageNumberLabel);
+ DELETEPTR(mpSeparator);
+ DELETEPTR(mpMediaSwitchItem);
+ DELETEPTR(mpModePushButton);
+ DELETEPTR(mpDocumentTitle);
+ DELETEPTR(mpButtonTitleLayout);
+ DELETEPTR(mpTreeWidget);
+ DELETEPTR(mpLayout);
+}
+
+void UBTeacherGuidePresentationWidget::cleanData()
+{
+ mpPageTitle->showText("");
+ mpComment->showText("");
+ //tree clean
+ QList itemToRemove = mpRootWidgetItem->takeChildren();
+ foreach(QTreeWidgetItem* eachItem, itemToRemove){
+ DELETEPTR(eachItem);
+ }
+ // the mpMediaSwitchItem is deleted by the previous loop but the pointer is not set to zero
+ mpMediaSwitchItem = NULL;
+}
+
+void UBTeacherGuidePresentationWidget::onActiveSceneChanged()
+{
+ cleanData();
+ mpPageNumberLabel->setText(tr("Page: %0").arg(UBApplication::boardController->activeSceneIndex() + 1));
+}
+
+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);
+ mpMediaSwitchItem->setData(0,Qt::BackgroundRole,QVariant(QColor(200,200,200)));
+ mpMediaSwitchItem->setData(0,Qt::FontRole, QVariant(QFont(QApplication::font().family(),16)));
+ mpMediaSwitchItem->setData(0,Qt::TextAlignmentRole,QVariant(Qt::AlignCenter));
+ mpRootWidgetItem->addChild(mpMediaSwitchItem);
+ }
+}
+
+
+void UBTeacherGuidePresentationWidget::showData(QVector data)
+{
+ cleanData();
+
+ foreach(tUBGEElementNode* element, data){
+ if(element->type == "pageTitle")
+ mpPageTitle->showText(element->attributes.value("value"));
+ else if (element->type == "comment")
+ mpComment->showText(element->attributes.value("value"));
+ else if(element->type == "action"){
+ QTreeWidgetItem* newWidgetItem = new QTreeWidgetItem(mpRootWidgetItem);
+ newWidgetItem->setText(0,element->attributes.value("task"));
+ QString colorString = element->attributes.value("owner").toInt() == 0 ? "red":"green";
+ UBTGAdaptableText* textWidget = new UBTGAdaptableText(newWidgetItem,0);
+ textWidget->bottomMargin(14);
+ textWidget->setStyleSheet("QWidget {background: #EEEEEE; border:none; color:" + colorString + ";}");
+ textWidget->showText(element->attributes.value("task"));
+ textWidget->document()->setDefaultFont(QFont(QApplication::font().family(),11));
+ mpTreeWidget->setItemWidget(newWidgetItem,0,textWidget);
+
+ mpRootWidgetItem->addChild(newWidgetItem);
+ }
+ else if(element->type == "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)));
+ mpRootWidgetItem->addChild(newWidgetItem);
+
+ QTreeWidgetItem* mediaItem = new QTreeWidgetItem(newWidgetItem);
+ //mediaItem->setBackground(0,QBrush(QColor("#EEEEEF")));
+ mediaItem->setData(0,tUBTGTreeWidgetItemRole_HasAnAction,tUBTGActionAssociateOnClickItem_NONE);
+ UBTGMediaWidget* mediaWidget = new UBTGMediaWidget(element->attributes.value("relativePath"),newWidgetItem);
+ newWidgetItem->setExpanded(false);
+ mpTreeWidget->setItemWidget(mediaItem,0,mediaWidget);
+ }
+ else if(element->type == "link"){
+ createMediaButtonItem();
+ QTreeWidgetItem* newWidgetItem = new QTreeWidgetItem(mpMediaSwitchItem);
+ newWidgetItem->setIcon(0,QIcon(":images/teacherGuide/link.png"));
+ newWidgetItem->setText(0,element->attributes.value("title"));
+ 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)));
+ mpRootWidgetItem->addChild(newWidgetItem);
+ }
+ }
+}
+
+void UBTeacherGuidePresentationWidget::onAddItemClicked(QTreeWidgetItem* widget, int column)
+{
+ int associateAction = widget->data(column,tUBTGTreeWidgetItemRole_HasAnAction).toInt();
+ if(column == 0 && associateAction != tUBTGActionAssociateOnClickItem_NONE){
+ switch(associateAction)
+ {
+ case tUBTGActionAssociateOnClickItem_EXPAND:
+ widget->setExpanded(!widget->isExpanded());
+ if(widget->isExpanded())
+ mpMediaSwitchItem->setText(0,"-");
+ else
+ mpMediaSwitchItem->setText(0,"+");
+ break;
+ case tUBTGActionAssociateOnClickItem_URL:
+ widget->data(column,tUBTGTreeWidgetItemRole_HasAnUrl).toString();
+ UBApplication::webController->loadUrl(QUrl(widget->data(column,tUBTGTreeWidgetItemRole_HasAnUrl).toString()));
+ break;
+ case tUBTGActionAssociateOnClickItem_MEDIA:
+ widget->setExpanded(!widget->isExpanded());
+ break;
+ default:
+ qDebug() << "associateAction no action set " << associateAction;
+ }
+ }
+}
+
+/***************************************************************************
+ * class UBTeacherGuideWidget *
+ ***************************************************************************/
+UBTeacherGuideWidget::UBTeacherGuideWidget(QWidget *parent, const char *name): QStackedWidget(parent)
+ , mpEditionWidget(NULL)
+ , mpPresentationWidget(NULL)
+{
+ setObjectName(name);
+
+ mpEditionWidget = new UBTeacherGuideEditionWidget(this);
+ addWidget(mpEditionWidget);
+ mpPresentationWidget = new UBTeacherGuidePresentationWidget(this);
+ addWidget(mpPresentationWidget);
+
+ setCurrentWidget(mpPresentationWidget);
+ connect(UBApplication::boardController->controlView(),SIGNAL(clickOnBoard()),this,SLOT(showPresentationMode()));
+ connectToStylusPalette();
+}
+
+
+UBTeacherGuideWidget::~UBTeacherGuideWidget()
+{
+ DELETEPTR(mpEditionWidget);
+ DELETEPTR(mpPresentationWidget);
+}
+
+void UBTeacherGuideWidget::connectToStylusPalette()
+{
+ if(UBApplication::boardController->paletteManager())
+ connect(UBApplication::boardController->paletteManager()->stylusPalette(),SIGNAL(itemOnActionPaletteChanged()),this,SLOT(showPresentationMode()));
+ else
+ QTimer::singleShot(500,this,SLOT(connectToStylusPalette()));
+}
+
+void UBTeacherGuideWidget::showPresentationMode()
+{
+ if(currentWidget()!=mpPresentationWidget){
+ mCurrentData = mpEditionWidget->getData();
+ mpPresentationWidget->showData(mCurrentData);
+ setCurrentWidget(mpPresentationWidget);
+ }
+}
+
+void UBTeacherGuideWidget::changeMode()
+{
+ if(currentWidget() == mpEditionWidget)
+ setCurrentWidget(mpPresentationWidget);
+ else
+ setCurrentWidget(mpEditionWidget);
+
+}
diff --git a/src/gui/UBTeacherGuideWidget.h b/src/gui/UBTeacherGuideWidget.h
new file mode 100644
index 00000000..fc984d4a
--- /dev/null
+++ b/src/gui/UBTeacherGuideWidget.h
@@ -0,0 +1,123 @@
+/*
+ * 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 .
+ */
+
+#ifndef UBTEACHERGUIDEWIDGET_H
+#define UBTEACHERGUIDEWIDGET_H
+
+class QTreeWidget;
+class QHeaderView;
+class QLabel;
+class QVBoxLayout;
+class QPushButton;
+
+#include "UBTeacherGuideWidgetsTools.h"
+#include "UBTGWidgetTreeDelegate.h"
+
+/***************************************************************************
+ * class UBTeacherGuideEditionWidget *
+ ***************************************************************************/
+class UBTeacherGuideEditionWidget : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit UBTeacherGuideEditionWidget(QWidget* parent = 0, const char* name="UBTeacherGuideEditionWidget");
+ ~UBTeacherGuideEditionWidget();
+ void cleanData();
+ QVector getData();
+
+public slots:
+ void onAddItemClicked(QTreeWidgetItem* widget, int column);
+ void onActiveSceneChanged();
+ void showEvent(QShowEvent* event);
+
+private:
+ QList getChildrenList(QTreeWidgetItem* widgetItem);
+ QVector getPageAndCommentData();
+
+ QVBoxLayout* mpLayout;
+ QLabel* mpDocumentTitle;
+ QLabel* mpPageNumberLabel;
+ UBTGAdaptableText* mpPageTitle;
+ UBTGAdaptableText* mpComment;
+ QFrame* mpSeparator;
+ QTreeWidget* mpTreeWidget;
+ QTreeWidgetItem* mpRootWidgetItem;
+ UBAddItem* mpAddAnActionItem;
+ UBAddItem* mpAddAMediaItem;
+ UBAddItem* mpAddALinkItem;
+ UBTGWidgetTreeDelegate* mpTreeDelegate;
+
+};
+
+
+/***************************************************************************
+ * class UBTeacherGuidePresentationWidget *
+ ***************************************************************************/
+class UBTeacherGuidePresentationWidget : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit UBTeacherGuidePresentationWidget(QWidget* parent, const char* name = "UBTeacherGuidePresentationName");
+ ~UBTeacherGuidePresentationWidget();
+ void showData(QVectordata);
+ void cleanData();
+
+public slots:
+ void onAddItemClicked(QTreeWidgetItem* widget, int column);
+ void onActiveSceneChanged();
+
+private:
+ void createMediaButtonItem();
+
+ UBTGAdaptableText* mpPageTitle;
+ UBTGAdaptableText* mpComment;
+ QVBoxLayout* mpLayout;
+ QHBoxLayout* mpButtonTitleLayout;
+ QLabel* mpDocumentTitle;
+ QLabel* mpPageNumberLabel;
+ QFrame* mpSeparator;
+ QPushButton* mpModePushButton;
+ QTreeWidget* mpTreeWidget;
+ QTreeWidgetItem* mpRootWidgetItem;
+ QTreeWidgetItem* mpMediaSwitchItem;
+
+};
+
+
+
+/***************************************************************************
+ * class UBTeacherGuideWidget *
+ ***************************************************************************/
+
+class UBTeacherGuideWidget : public QStackedWidget
+{
+ Q_OBJECT
+public:
+ explicit UBTeacherGuideWidget(QWidget* parent = 0, const char* name="UBTeacherGuideWidget");
+ ~UBTeacherGuideWidget();
+
+public slots:
+ void changeMode();
+ void showPresentationMode();
+ void connectToStylusPalette();
+
+private:
+ UBTeacherGuideEditionWidget* mpEditionWidget;
+ UBTeacherGuidePresentationWidget* mpPresentationWidget;
+ QVectormCurrentData;
+
+};
+
+#endif // UBTEACHERGUIDEWIDGET_H
diff --git a/src/gui/UBTeacherGuideWidgetsTools.cpp b/src/gui/UBTeacherGuideWidgetsTools.cpp
new file mode 100644
index 00000000..73b89276
--- /dev/null
+++ b/src/gui/UBTeacherGuideWidgetsTools.cpp
@@ -0,0 +1,436 @@
+/*
+ * 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 .
+ */
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "UBTeacherGuideWidgetsTools.h"
+#include "UBTGWidgetTreeDelegate.h"
+
+#include "globals/UBGlobals.h"
+
+#include "frameworks/UBFileSystemUtils.h"
+
+
+/***************************************************************************
+ * class UBAddItem *
+ ***************************************************************************/
+UBAddItem::UBAddItem(const QString &string, int addSubItemWidgetType, QTreeWidget* parent): QTreeWidgetItem(parent)
+{
+ setIcon(0,QIcon(":images/increase.svg"));
+ setText(0,string);
+ setData(0,Qt::UserRole,QVariant(addSubItemWidgetType));
+ setData(1,Qt::UserRole,QVariant(addSubItemWidgetType));
+ setData(0,Qt::BackgroundRole,QVariant(QColor(200,200,200)));
+ setData(1,Qt::BackgroundRole,QVariant(QColor(200,200,200)));
+ setData(0,Qt::FontRole,QVariant(QFont(QApplication::font().family(),12)));
+}
+
+UBAddItem::~UBAddItem()
+{
+ //NOOP
+}
+
+/***************************************************************************
+ * class UBTGActionWidget *
+ ***************************************************************************/
+UBTGActionWidget::UBTGActionWidget(QTreeWidgetItem* widget, QWidget* parent, const char* name) : QWidget(parent)
+ , mpLayout(NULL)
+ , mpOwner(NULL)
+ , mpTask(NULL)
+{
+ setObjectName(name);
+ SET_STYLE_SHEET();
+ mpLayout = new QVBoxLayout(this);
+ mpOwner = new QComboBox(this);
+ mpOwner->setObjectName("DockPaletteWidgetComboBox");
+ mpOwner->setMinimumHeight(22);
+ QStringList qslOwner;
+ qslOwner << tr("Teacher") << tr("Student");
+ mpOwner->insertItems(0,qslOwner);
+ mpOwner->setCurrentIndex(0);
+ mpTask = new UBTGAdaptableText(widget,this);
+ mpTask->setPlaceHolderText(tr("Type task here ..."));
+ mpTask->setAcceptRichText(true);
+ mpTask->setTextColor(QColor().green());
+ mpTask->setObjectName("ActionWidgetTaskTextEdit");
+ mpLayout->addWidget(mpOwner,0);
+ mpLayout->addWidget(mpTask,1);
+}
+
+UBTGActionWidget::~UBTGActionWidget()
+{
+ DELETEPTR(mpOwner);
+ DELETEPTR(mpTask);
+ DELETEPTR(mpLayout);
+}
+
+tUBGEElementNode* UBTGActionWidget::saveData()
+{
+ tUBGEElementNode* result = new tUBGEElementNode();
+ result->type = "action";
+ result->attributes.insert("owner",QString("%0").arg(mpOwner->currentIndex()));
+ result->attributes.insert("task",mpTask->text());
+ return result;
+}
+
+/***************************************************************************
+ * class UBTGAdaptableText *
+ ***************************************************************************/
+UBTGAdaptableText::UBTGAdaptableText(QTreeWidgetItem* widget, QWidget* parent, const char* name):QTextEdit(parent)
+ , mBottomMargin(5)
+ , mpTreeWidgetItem(widget)
+ , mMinimumHeight(20)
+ , 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);
+ setMinimumHeight(mMinimumHeight);
+}
+
+void UBTGAdaptableText::setPlaceHolderText(QString text)
+{
+ mHasPlaceHolder = true;
+
+ // the space addition is to make this string unique and check against it to know
+ // if we are talking about a typed string or the placeholder string
+ mPlaceHolderText = text + " ";
+ setTextColor(QColor(Qt::lightGray));
+ setPlainText(mPlaceHolderText);
+}
+
+void UBTGAdaptableText::keyPressEvent(QKeyEvent* e)
+{
+ if(toPlainText() == mPlaceHolderText){
+ setTextColor(QColor(Qt::black));
+ setPlainText("");
+ }
+ QTextEdit::keyPressEvent(e);
+}
+
+void UBTGAdaptableText::keyReleaseEvent(QKeyEvent* e)
+{
+ QTextEdit::keyReleaseEvent(e);
+
+ if(toPlainText().isEmpty()){
+ setTextColor(QColor(Qt::lightGray));
+ setPlainText(mPlaceHolderText);
+ }
+}
+
+void UBTGAdaptableText::showEvent(QShowEvent* e)
+{
+ Q_UNUSED(e);
+ if(!mIsUpdatingSize && mHasPlaceHolder && toPlainText().isEmpty())
+ setPlainText(mPlaceHolderText);
+}
+
+QString UBTGAdaptableText::text()
+{
+ QString result = toPlainText();
+ if(mHasPlaceHolder && result == mPlaceHolderText)
+ return "";
+
+ return result;
+}
+
+void UBTGAdaptableText::onTextChanged()
+{
+ mIsUpdatingSize = true;
+ if(document()->size().height() < mMinimumHeight)
+ setFixedHeight(mMinimumHeight);
+ else
+ setFixedHeight(document()->size().height()+mBottomMargin);
+ updateGeometry();
+ //to trig the widget item to resize it
+ if(mpTreeWidgetItem){
+ mpTreeWidgetItem->setExpanded(false);
+ mpTreeWidgetItem->setExpanded(true);
+ setFocus();
+ }
+ mIsUpdatingSize = false;
+}
+
+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)
+{
+ mBottomMargin = newValue;
+ onTextChanged();
+}
+
+void UBTGAdaptableText::resizeEvent(QResizeEvent* e)
+{
+ QTextEdit::resizeEvent(e);
+ QTimer::singleShot(100,this,SLOT(onTextChanged()));
+}
+
+/***************************************************************************
+ * class UBTGMediaWidget *
+ ***************************************************************************/
+UBTGMediaWidget::UBTGMediaWidget(QTreeWidgetItem* widget, QWidget* parent,const char* name): QStackedWidget(parent)
+ , mpTreeWidgetItem(widget)
+ , mpDropMeWidget(NULL)
+ , mpWorkWidget(NULL)
+ , mpLayout(NULL)
+ , mpTitle(NULL)
+ , mpMediaLabelWidget(NULL)
+ , mpMediaWidget(NULL)
+ , mpWebView(NULL)
+ , mRelativePath(QString(""))
+ , mIsPresentationMode(false)
+{
+ setObjectName(name);
+ mpDropMeWidget = new QLabel();
+ mpDropMeWidget->setObjectName("UBTGMediaDropMeLabel");
+ mpDropMeWidget->setText(tr("drop media here ..."));
+ mpDropMeWidget->setAlignment(Qt::AlignCenter);
+ setAcceptDrops(true);
+ addWidget(mpDropMeWidget);
+
+ setMinimumHeight(200);
+}
+
+UBTGMediaWidget::UBTGMediaWidget(QString relativePath, QTreeWidgetItem* widget, QWidget* parent,const char* name): QStackedWidget(parent)
+ , mpTreeWidgetItem(widget)
+ , mpDropMeWidget(NULL)
+ , mpWorkWidget(NULL)
+ , mpLayout(NULL)
+ , mpTitle(NULL)
+ , mpMediaLabelWidget(NULL)
+ , mpMediaWidget(NULL)
+ , mpWebView(NULL)
+ , mRelativePath(relativePath)
+ , mIsPresentationMode(true)
+ , mMediaType("")
+{
+ setObjectName(name);
+ setAcceptDrops(false);
+ createWorkWidget(mRelativePath);
+ setMinimumHeight(200);
+}
+
+UBTGMediaWidget::~UBTGMediaWidget()
+{
+ DELETEPTR(mpTitle);
+ DELETEPTR(mpMediaLabelWidget);
+ DELETEPTR(mpMediaWidget);
+ DELETEPTR(mpWebView);
+ DELETEPTR(mpLayout);
+
+ removeWidget(mpDropMeWidget);
+ DELETEPTR(mpDropMeWidget);
+ removeWidget(mpWorkWidget);
+ DELETEPTR(mpWorkWidget);
+}
+
+tUBGEElementNode* UBTGMediaWidget::saveData()
+{
+ if(!mpTitle)
+ return 0;
+ tUBGEElementNode* result = new tUBGEElementNode();
+ result->type = "media";
+ result->attributes.insert("title",mpTitle->text());
+ result->attributes.insert("relativePath",mRelativePath);
+ result->attributes.insert("mediaType",mMediaType);
+ return result;
+}
+
+void UBTGMediaWidget::dragEnterEvent(QDragEnterEvent *event)
+{
+ event->accept();
+}
+
+void UBTGMediaWidget::createWorkWidget(QString& path)
+{
+ QString mimeType = UBFileSystemUtils::mimeTypeFromFileName(path);
+ qDebug() << mimeType;
+ bool setMedia = true;
+ 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);
+ }
+ else if(mimeType.contains("image")){
+ mMediaType = "image";
+ mpMediaLabelWidget = new QLabel();
+ QPixmap pixmap = QPixmap(QUrl(path).toLocalFile());
+ pixmap = pixmap.scaledToWidth(mpTreeWidgetItem->treeWidget()->size().width());
+ mpMediaLabelWidget->setPixmap(pixmap);
+ mpMediaLabelWidget->setScaledContents(true);
+ }
+ else if(mimeType.contains("application")){
+ mMediaType = "w3c";
+ mpWebView = new QWebView(0);
+ mpWebView->setAcceptDrops(false);
+ mpWebView->settings()->setAttribute(QWebSettings::JavaEnabled, true);
+ mpWebView->settings()->setAttribute(QWebSettings::PluginsEnabled, true);
+ mpWebView->settings()->setAttribute(QWebSettings::LocalStorageDatabaseEnabled, true);
+ mpWebView->settings()->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, true);
+ mpWebView->settings()->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true);
+ mpWebView->settings()->setAttribute(QWebSettings::JavascriptCanAccessClipboard, true);
+ mpWebView->settings()->setAttribute(QWebSettings::DnsPrefetchEnabled, true);
+ mpWebView->load(QUrl(path));
+ mpWebView->show();
+ }
+ else{
+ qDebug() << "createWorkWidget mime type not handled" << mimeType;
+ setMedia=false;
+ }
+
+ 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);
+ }
+ if(mpMediaLabelWidget){
+ mpMediaLabelWidget->setParent(mpWorkWidget);
+ mpLayout->addWidget(mpMediaLabelWidget);
+ }
+ else if (mpMediaWidget){
+ mpMediaWidget->setMaximumHeight(mpTreeWidgetItem->treeWidget()->size().width());
+ mpMediaWidget->setParent(mpWorkWidget);
+ mpLayout->addWidget(mpMediaWidget);
+ }
+ else if (mpWebView){
+ mpWebView->setMaximumHeight(mpTreeWidgetItem->treeWidget()->size().width());
+ mpWebView->setParent(mpWorkWidget);
+ mpLayout->addWidget(mpWebView);
+ }
+ 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();
+ }
+ else if(pMimeData->hasUrls()){
+ path = pMimeData->urls().at(0).toString();
+ }
+ else if(pMimeData->hasImage()){
+ qDebug() << "Not yet implemented";
+ }
+ }
+ else
+ qDebug() << "No mime data present";
+
+ createWorkWidget(path);
+}
+
+void UBTGMediaWidget::dropEvent(QDropEvent* event)
+{
+ parseMimeData(event->mimeData());
+ event->accept();
+}
+
+void UBTGMediaWidget::mousePressEvent(QMouseEvent *event)
+{
+ if (!mIsPresentationMode)
+ event->ignore();
+ else{
+
+ QDrag *drag = new QDrag(this);
+ QMimeData *mimeData = new QMimeData;
+ QList urlList;
+ urlList << QUrl(mRelativePath);
+ mimeData->setUrls(urlList);
+ drag->setMimeData(mimeData);
+
+ drag->exec();
+ event->accept();
+ }
+}
+
+void UBTGMediaWidget::updateSize()
+{
+ if(mpTreeWidgetItem){
+ mpTreeWidgetItem->setExpanded(false);
+ mpTreeWidgetItem->setExpanded(true);
+ if(!mIsPresentationMode)
+ mpTitle->setFocus();
+ }
+}
+
+/***************************************************************************
+ * class UBTGUrlWdiget *
+ ***************************************************************************/
+UBTGUrlWidget::UBTGUrlWidget(QWidget* parent, const char* name ):QWidget(parent)
+ , mpLayout(NULL)
+ , mpTitle(NULL)
+ , mpUrl(NULL)
+{
+ setObjectName(name);
+ SET_STYLE_SHEET();
+ mpLayout = new QVBoxLayout(this);
+ mpTitle = new QLineEdit(this);
+ mpTitle->setObjectName("UBTGLineEdit");
+ mpTitle->setPlaceholderText(tr("Insert link title here..."));
+ mpUrl = new QLineEdit(this);
+ mpUrl->setObjectName("UBTGLineEdit");
+ mpUrl->setPlaceholderText("http://");
+ mpLayout->addWidget(mpTitle);
+ mpLayout->addWidget(mpUrl);
+}
+
+UBTGUrlWidget::~UBTGUrlWidget()
+{
+ DELETEPTR(mpTitle);
+ DELETEPTR(mpUrl);
+ DELETEPTR(mpLayout);
+}
+
+tUBGEElementNode* UBTGUrlWidget::saveData()
+{
+ tUBGEElementNode* result = new tUBGEElementNode();
+ result->type = "link";
+ result->attributes.insert("title",mpTitle->text());
+ result->attributes.insert("url",mpUrl->text());
+ return result;
+}
diff --git a/src/gui/UBTeacherGuideWidgetsTools.h b/src/gui/UBTeacherGuideWidgetsTools.h
new file mode 100644
index 00000000..fe1248d8
--- /dev/null
+++ b/src/gui/UBTeacherGuideWidgetsTools.h
@@ -0,0 +1,161 @@
+/*
+ * 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 .
+ */
+
+#ifndef UBTEACHERGUIDEWIDGETSTOOLS_H
+#define UBTEACHERGUIDEWIDGETSTOOLS_H
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include "customWidgets/UBMediaWidget.h"
+
+class QTreeWidget;
+class QVBoxLayout;
+class QComboBox;
+class QTextEdit;
+class QWidget;
+class UBTGAdaptableText;
+class QDomElement;
+
+typedef struct
+{
+ QString type;
+ QMap attributes;
+}tUBGEElementNode;
+
+
+class iUBTGSavableData
+{
+public:
+ virtual tUBGEElementNode* saveData() = 0;
+};
+
+
+class UBAddItem : public QTreeWidgetItem
+{
+public:
+ explicit UBAddItem(const QString &strings, int addSubItemWidgetType, QTreeWidget* parent = 0);
+ ~UBAddItem();
+
+signals:
+
+public slots:
+};
+
+class UBTGActionWidget : public QWidget, public iUBTGSavableData
+{
+ Q_OBJECT
+
+public:
+ explicit UBTGActionWidget(QTreeWidgetItem* widget, QWidget* parent = 0,const char* name = "UBTGActionWidget");
+ ~UBTGActionWidget();
+ void update();
+ tUBGEElementNode* saveData();
+
+private:
+ QVBoxLayout* mpLayout;
+ QComboBox* mpOwner;
+ UBTGAdaptableText* mpTask;
+
+protected:
+ QTreeWidgetItem* mpTreeWidgetItem;
+};
+
+
+class UBTGAdaptableText : public QTextEdit
+{
+ Q_OBJECT
+public:
+ explicit UBTGAdaptableText(QTreeWidgetItem* widget = 0, QWidget *parent = 0, const char* name = "UBTGAdaptableText");
+ void showText(const QString & text);
+ void bottomMargin(int newValue);
+ void setPlaceHolderText(QString text);
+ QString text();
+
+public slots:
+ void onTextChanged();
+
+protected:
+ void keyPressEvent(QKeyEvent* e);
+ void keyReleaseEvent(QKeyEvent* e);
+ void showEvent(QShowEvent* e);
+ void resizeEvent(QResizeEvent* e);
+
+private:
+ int mBottomMargin;
+ QTreeWidgetItem* mpTreeWidgetItem;
+ int mMinimumHeight;
+ bool mHasPlaceHolder;
+ QString mPlaceHolderText;
+ bool mIsUpdatingSize;
+};
+
+
+class UBTGMediaWidget : public QStackedWidget , public iUBTGSavableData
+{
+ 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();
+ tUBGEElementNode* saveData();
+
+protected:
+ void dragEnterEvent(QDragEnterEvent* event);
+ void dropEvent(QDropEvent* event);
+ void mousePressEvent(QMouseEvent* event);
+
+private:
+ void parseMimeData(const QMimeData* pMimeData);
+ void createWorkWidget(QString& path);
+ void updateSize();
+
+ QTreeWidgetItem* mpTreeWidgetItem;
+ QLabel* mpDropMeWidget;
+ QWidget* mpWorkWidget;
+ QVBoxLayout* mpLayout;
+ UBTGAdaptableText* mpTitle;
+ QLabel* mpMediaLabelWidget;
+ UBMediaWidget* mpMediaWidget;
+ QWebView* mpWebView;
+ QString mRelativePath;
+ bool mIsPresentationMode;
+ QString mMediaType;
+};
+
+
+class UBTGUrlWidget : public QWidget , public iUBTGSavableData
+{
+ Q_OBJECT
+public:
+ UBTGUrlWidget(QWidget* parent = 0, const char* name = "UBTGUrlWidget");
+ ~UBTGUrlWidget();
+ tUBGEElementNode* saveData();
+private:
+ QVBoxLayout* mpLayout;
+ QLineEdit* mpTitle;
+ QLineEdit* mpUrl;
+};
+
+
+#endif // UBTEACHERGUIDEWIDGETSTOOLS_H
diff --git a/src/gui/UBThumbnailWidget.cpp b/src/gui/UBThumbnailWidget.cpp
index 302c6a23..cd0ebec3 100644
--- a/src/gui/UBThumbnailWidget.cpp
+++ b/src/gui/UBThumbnailWidget.cpp
@@ -1,863 +1,879 @@
-/*
- * 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 .
- */
-#include
-#include
-
-#include "UBThumbnailWidget.h"
-#include "UBRubberBand.h"
-
-#include "core/UBSettings.h"
-#include "core/UBApplication.h"
-
-#include "document/UBDocumentProxy.h"
-#include "document/UBDocumentController.h"
-
-#include "core/memcheck.h"
-
-UBThumbnailWidget::UBThumbnailWidget(QWidget* parent)
- : QGraphicsView(parent)
- , mThumbnailWidth(UBSettings::defaultThumbnailWidth)
- , mSpacing(UBSettings::thumbnailSpacing)
- , mLastSelectedThumbnail(0)
- , mSelectionSpan(0)
- , mLassoRectItem(0)
-{
- // By default, the drag is possible
- bCanDrag = true;
- setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
- setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing);
- setFrameShape(QFrame::NoFrame);
- setScene(&mThumbnailsScene);
-
- setAlignment(Qt::AlignLeft | Qt::AlignTop);
-
- connect(&mThumbnailsScene, SIGNAL(selectionChanged()), this, SLOT(sceneSelectionChanged()));
-}
-
-
-UBThumbnailWidget::~UBThumbnailWidget()
-{
- disconnect(&mThumbnailsScene, SIGNAL(selectionChanged()));
-}
-
-
-void UBThumbnailWidget::setThumbnailWidth(qreal pThumbnailWidth)
-{
- mThumbnailWidth = pThumbnailWidth;
-
- refreshScene();
-}
-
-
-void UBThumbnailWidget::setSpacing(qreal pSpacing)
-{
- mSpacing = pSpacing;
-
- refreshScene();
-}
-
-
-void UBThumbnailWidget::setGraphicsItems(const QList& pGraphicsItems
- , const QList& pItemsPaths
- , const QStringList pLabels
- , const QString& pMimeType)
-{
- mGraphicItems = pGraphicsItems;
- mItemsPaths = pItemsPaths;
- mMimeType = pMimeType;
- mLabels = pLabels;
-
- foreach(QGraphicsItem* it, mThumbnailsScene.items())
- {
- mThumbnailsScene.removeItem(it, true);
- }
-
- // set lasso to 0 as it has been cleared as well
- mLassoRectItem = 0;
-
- foreach (QGraphicsItem* item, pGraphicsItems)
- {
- if (item->scene() != &mThumbnailsScene)
- {
- mThumbnailsScene.addItem(item);
- }
- }
-
- mLabelsItems.clear();
-
- foreach (const QString label, pLabels)
- {
- QFontMetrics fm(font());
- UBThumbnailTextItem *labelItem =
- new UBThumbnailTextItem(label); // deleted while replace or by the scene destruction
-
- mThumbnailsScene.addItem(labelItem);
- mLabelsItems << labelItem;
- }
-
- refreshScene();
-
- mLastSelectedThumbnail = 0;
-}
-
-
-void UBThumbnailWidget::refreshScene()
-{
- int nbColumns = (geometry().width() - mSpacing) / (mThumbnailWidth + mSpacing);
-
- int labelSpacing = 0;
-
- if (mLabelsItems.size() > 0)
- {
- QFontMetrics fm(mLabelsItems.at(0)->font());
- labelSpacing = UBSettings::thumbnailSpacing + fm.height(); // TODO UB 4.x where is 20 from ??? configure ?? compute based on mSpacing ?? JBA Is it the font height?
- }
- nbColumns = qMax(nbColumns, 1);
-
- qreal thumbnailHeight = mThumbnailWidth / UBSettings::minScreenRatio;
-
- for (int i = 0; i < mGraphicItems.size(); i++)
- {
- QGraphicsItem* item = mGraphicItems.at(i);
-
- qreal scaleWidth = mThumbnailWidth / item->boundingRect().width();
- qreal scaleHeight = thumbnailHeight / item->boundingRect().height();
-
- qreal scaleFactor = qMin(scaleWidth, scaleHeight);
-
- //bitmap should not be stretched
- UBThumbnail* pix = dynamic_cast(item);
- if (pix)
- scaleFactor = qMin(scaleFactor, 1.0);
-
- QTransform transform;
- transform.scale(scaleFactor, scaleFactor);
-
- item->setTransform(transform);
-
- item->setFlag(QGraphicsItem::ItemIsSelectable, true);
-
- int columnIndex = i % nbColumns;
- int rowIndex = i / nbColumns;
-
- if (pix)
- {
- pix->setColumn(columnIndex);
- pix->setRow(rowIndex);
- }
-
- int w = item->boundingRect().width();
- int h = item->boundingRect().height();
- QPointF pos(
- mSpacing + (mThumbnailWidth - w * scaleFactor) / 2 + columnIndex * (mThumbnailWidth + mSpacing),
- mSpacing + rowIndex * (thumbnailHeight + mSpacing + labelSpacing) + (thumbnailHeight - h * scaleFactor) / 2);
-
- item->setPos(pos);
-
- if (mLabelsItems.size() > i)
- {
- QFontMetrics fm(mLabelsItems.at(i)->font(), this);
- QString elidedText = fm.elidedText(mLabels.at(i), Qt::ElideRight, mThumbnailWidth);
-
- mLabelsItems.at(i)->setPlainText(elidedText);
- mLabelsItems.at(i)->setWidth(fm.width(elidedText) + 2 * mLabelsItems.at(i)->document()->documentMargin());
-
- pos.setY(pos.y() + (thumbnailHeight + h * scaleFactor) / 2 + 5);
- qreal labelWidth = fm.width(elidedText);
- pos.setX(mSpacing + (mThumbnailWidth - labelWidth) / 2 + columnIndex * (mThumbnailWidth + mSpacing));
- mLabelsItems.at(i)->setPos(pos);
- }
- }
-
- QScrollBar *vertScrollBar = verticalScrollBar();
- int scrollBarThickness = 0;
- if (vertScrollBar && vertScrollBar->isVisible())
- scrollBarThickness = vertScrollBar->width();
-
- setSceneRect(0, 0,
- geometry().width() - scrollBarThickness,
- mSpacing + ((((mGraphicItems.size() - 1) / nbColumns) + 1) * (thumbnailHeight + mSpacing + labelSpacing)));
-}
-
-
-QList UBThumbnailWidget::selectedItems()
-{
- QList sortedSelectedItems = mThumbnailsScene.selectedItems();
- qSort(sortedSelectedItems.begin(), sortedSelectedItems.end(), thumbnailLessThan);
- return sortedSelectedItems;
-}
-
-
-void UBThumbnailWidget::mousePressEvent(QMouseEvent *event)
-{
- mClickTime = QTime::currentTime();
- mMousePressPos = event->pos();
- mMousePressScenePos = mapToScene(mMousePressPos);
- QGraphicsItem* underlyingItem = itemAt(mMousePressPos);
-
- UBThumbnail *previousSelectedThumbnail = mLastSelectedThumbnail;
-
- if (!dynamic_cast(underlyingItem))
- {
- deleteLasso();
-
- UBRubberBand rubberBand(QRubberBand::Rectangle);
- QStyleOption option;
- option.initFrom(&rubberBand);
-
- mLassoRectItem = new QGraphicsRectItem(0, scene());
-
-#ifdef Q_WS_MAC
- // The following code must stay in synch with \src\gui\styles\qmacstyle_mac.mm
- QColor strokeColor;
- strokeColor.setHsvF(0, 0, 0.86, 1.0);
- mLassoRectItem->setPen(QPen(strokeColor));
- QColor fillColor(option.palette.color(QPalette::Disabled, QPalette::Highlight));
- fillColor.setHsvF(0, 0, 0.53, 0.25);
- mLassoRectItem->setBrush(fillColor);
-#else
- // The following code must stay in synch with \src\gui\styles\qwindowsxpstyle.cpp
- QColor highlight = option.palette.color(QPalette::Active, QPalette::Highlight);
- mLassoRectItem->setPen(highlight.darker(120));
- QColor dimHighlight(qMin(highlight.red() / 2 + 110, 255),
- qMin(highlight.green() / 2 + 110, 255),
- qMin(highlight.blue() / 2 + 110, 255),
- 127);
- mLassoRectItem->setBrush(dimHighlight);
-#endif
-
- mLassoRectItem->setZValue(10000);
- mLassoRectItem->setRect(QRectF(mMousePressScenePos, QSizeF()));
-
- if (Qt::ControlModifier & event->modifiers() || Qt::ShiftModifier & event->modifiers())
- {
- mSelectedThumbnailItems = selectedItems();
- return;
- }
-
- mSelectedThumbnailItems.clear();
- QGraphicsView::mousePressEvent(event);
- }
- else if (Qt::ShiftModifier & event->modifiers())
- {
- if (previousSelectedThumbnail)
- {
- QGraphicsItem* previousSelectedItem = dynamic_cast(previousSelectedThumbnail);
- if (previousSelectedItem)
- {
- int index1 = mGraphicItems.indexOf(previousSelectedItem);
- int index2 = mGraphicItems.indexOf(underlyingItem);
- if (-1 == index2)
- {
- mSelectedThumbnailItems = selectedItems();
- return;
- }
- mSelectionSpan = index2 - index1;
- selectItems(qMin(index1, index2), mSelectionSpan < 0 ? - mSelectionSpan + 1 : mSelectionSpan + 1);
- return;
- }
- }
- }
- else
- {
- mLastSelectedThumbnail = dynamic_cast(underlyingItem);
- if (!underlyingItem->isSelected())
- {
- int index = mGraphicItems.indexOf(underlyingItem);
- selectItemAt(index, Qt::ControlModifier & event->modifiers());
- }
- else
- {
- QGraphicsView::mousePressEvent(event);
- }
- if (!mLastSelectedThumbnail && mGraphicItems.count() > 0)
- mLastSelectedThumbnail = dynamic_cast(mGraphicItems.at(0));
- mSelectionSpan = 0;
- return;
- }
-}
-
-
-void UBThumbnailWidget::mouseMoveEvent(QMouseEvent *event)
-{
- int distance = (mMousePressPos - event->pos()).manhattanLength();
-
- if (0 == (event->buttons() & Qt::LeftButton) || distance < QApplication::startDragDistance())
- return;
-
- if (mLassoRectItem)
- {
- bSelectionInProgress = true;
- QPointF currentScenePos = mapToScene(event->pos());
- QRectF lassoRect(
- qMin(mMousePressScenePos.x(), currentScenePos.x()), qMin(mMousePressScenePos.y(), currentScenePos.y()),
- qAbs(mMousePressScenePos.x() - currentScenePos.x()), qAbs(mMousePressScenePos.y() - currentScenePos.y()));
- mLassoRectItem->setRect(lassoRect);
-
- QList lassoSelectedItems = scene()->items(lassoRect, Qt::IntersectsItemBoundingRect);
- QList lassoSelectedThumbnailItems;
- foreach (QGraphicsItem *lassoSelectedItem, lassoSelectedItems)
- {
- UBThumbnail *thumbnailItem = dynamic_cast(lassoSelectedItem);
- if (thumbnailItem)
- lassoSelectedThumbnailItems.append(lassoSelectedItems);
- }
-
- unselectAll();
- foreach (QGraphicsItem *lassoSelectedItem, lassoSelectedThumbnailItems)
- {
- if (Qt::ControlModifier & event->modifiers())
- {
- if (!mSelectedThumbnailItems.contains(lassoSelectedItem))
- selectItemAt(mGraphicItems.indexOf(lassoSelectedItem), true);
- }
- else
- {
- selectItemAt(mGraphicItems.indexOf(lassoSelectedItem), true);
- }
- }
- if (Qt::ControlModifier & event->modifiers())
- {
- foreach (QGraphicsItem *selectedItem, mSelectedThumbnailItems)
- {
- if (!lassoSelectedThumbnailItems.contains(selectedItem))
- selectItemAt(mGraphicItems.indexOf(selectedItem), true);
- }
- }
- }
- else
- {
- bSelectionInProgress = false;
- if (0 == selectedItems().size())
- return;
-
- if(bCanDrag)
- {
- QDrag *drag = new QDrag(this);
- QMimeData *mime = new QMimeData();
-
- if (mMimeType.length() > 0)
- mime->setData(mMimeType, QByteArray()); // trick the d&d system to register our own mime type
-
- drag->setMimeData(mime);
-
- QList qlElements;
-
- foreach (QGraphicsItem* item, selectedItems())
- {
- if (mGraphicItems.contains(item))
- {
- if (mGraphicItems.indexOf(item) <= mItemsPaths.size()){
- qlElements << mItemsPaths.at(mGraphicItems.indexOf(item));
- }
- }
- }
-
- if (qlElements.size() > 0){
- mime->setUrls(qlElements);
- drag->setMimeData(mime);
- drag->exec(Qt::CopyAction);
- }
- }
- }
-
- QGraphicsView::mouseMoveEvent(event);
-}
-
-
-void UBThumbnailWidget::mouseReleaseEvent(QMouseEvent *event)
-{
- int elapsedTimeSincePress = mClickTime.elapsed();
- deleteLasso();
- QGraphicsView::mouseReleaseEvent(event);
-
- if(elapsedTimeSincePress < STARTDRAGTIME) {
- emit mouseClick(itemAt(event->pos()), 0);
- }
-}
-
-
-void UBThumbnailWidget::keyPressEvent(QKeyEvent *event)
-{
- if (mLastSelectedThumbnail)
- {
- QGraphicsItem *lastSelectedGraphicsItem = dynamic_cast(mLastSelectedThumbnail);
- if (!lastSelectedGraphicsItem) return;
- int startSelectionIndex = mGraphicItems.indexOf(lastSelectedGraphicsItem);
- int previousSelectedThumbnailIndex = startSelectionIndex + mSelectionSpan;
-
- switch (event->key())
- {
- case Qt::Key_Down:
- case Qt::Key_Up:
- {
- if (rowCount() <= 1) break;
- if (Qt::ShiftModifier & event->modifiers())
- {
- int endSelectionIndex;
- if (Qt::Key_Down == event->key())
- {
- endSelectionIndex = previousSelectedThumbnailIndex + columnCount();
- if (endSelectionIndex >= mGraphicItems.count()) break;
- }
- else
- {
- endSelectionIndex = previousSelectedThumbnailIndex - columnCount();
- if (endSelectionIndex < 0) break;
- }
-
- int startIndex = startSelectionIndex < endSelectionIndex ? startSelectionIndex : endSelectionIndex;
- int count = startSelectionIndex < endSelectionIndex ? endSelectionIndex - startSelectionIndex + 1 : startSelectionIndex - endSelectionIndex + 1;
- mSelectionSpan = startSelectionIndex < endSelectionIndex ? (count - 1) : - (count - 1);
- selectItems(startIndex, count);
- }
- else
- {
- int toSelectIndex;
- if (Qt::Key_Down == event->key())
- {
- toSelectIndex = previousSelectedThumbnailIndex + columnCount();
- if (toSelectIndex >= mGraphicItems.count()) break;
- }
- else
- {
- toSelectIndex = previousSelectedThumbnailIndex - columnCount();
- if (toSelectIndex < 0) break;
- }
-
- selectItemAt(toSelectIndex, Qt::ControlModifier & event->modifiers());
- mSelectionSpan = 0;
- }
- }
- break;
-
- case Qt::Key_Left:
- case Qt::Key_Right:
- {
- QGraphicsItem *previousSelectedItem = mGraphicItems.at(previousSelectedThumbnailIndex);
- UBThumbnail *previousSelectedThumbnail = dynamic_cast(previousSelectedItem);
- if (!previousSelectedThumbnail) break;
-
- if (Qt::Key_Left == event->key())
- {
- if (0 == previousSelectedThumbnail->column()) break;
- }
- else
- {
- if (previousSelectedThumbnail->column() == columnCount() - 1 ||
- previousSelectedThumbnailIndex == mGraphicItems.count() - 1) break;
- }
-
- if (Qt::ShiftModifier & event->modifiers())
- {
- int endSelectionIndex;
- if (Qt::Key_Left == event->key())
- {
- endSelectionIndex = previousSelectedThumbnailIndex - 1;
- if (endSelectionIndex < 0) break;
- }
- else
- {
- endSelectionIndex = previousSelectedThumbnailIndex + 1;
- if (endSelectionIndex >= mGraphicItems.count()) break;
- }
-
- int startIndex = startSelectionIndex < endSelectionIndex ? startSelectionIndex : endSelectionIndex;
- int count = startSelectionIndex < endSelectionIndex ? endSelectionIndex - startSelectionIndex + 1 : startSelectionIndex - endSelectionIndex + 1;
- mSelectionSpan = startSelectionIndex < endSelectionIndex ? (count - 1) : - (count - 1);
- selectItems(startIndex, count);
- }
- else
- {
- if (Qt::Key_Left == event->key())
- selectItemAt(previousSelectedThumbnailIndex - 1, Qt::ControlModifier & event->modifiers());
- else
- selectItemAt(previousSelectedThumbnailIndex + 1, Qt::ControlModifier & event->modifiers());
-
- mSelectionSpan = 0;
- }
- }
- break;
-
- case Qt::Key_Home:
- {
- if (Qt::ShiftModifier & event->modifiers())
- {
- mSelectionSpan = - startSelectionIndex;
- selectItems(0, startSelectionIndex + 1);
- }
- else
- {
- selectItemAt(0, Qt::ControlModifier & event->modifiers());
- mSelectionSpan = 0;
- }
- }
- break;
-
- case Qt::Key_End:
- {
- if (Qt::ShiftModifier & event->modifiers())
- {
- mSelectionSpan = mGraphicItems.count() - startSelectionIndex - 1;
- selectItems(startSelectionIndex, mSelectionSpan + 1);
- }
- else
- {
- selectItemAt(mGraphicItems.count() - 1, Qt::ControlModifier & event->modifiers());
- mSelectionSpan = 0;
- }
- }
- break;
- case Qt::Key_A:
- {
- if (Qt::ControlModifier & event->modifiers())
- selectAll();
- }
- break;
- }
- }
- QGraphicsView::keyPressEvent(event);
-}
-
-
-void UBThumbnailWidget::focusInEvent(QFocusEvent *event)
-{
- Q_UNUSED(event);
-
- if (0 == selectedItems().count() && mGraphicItems.count() > 0 && Qt::TabFocusReason == event->reason())
- {
- selectItemAt(0);
- mSelectionSpan = 0;
- }
-}
-
-
-void UBThumbnailWidget::resizeEvent(QResizeEvent *event)
-{
- Q_UNUSED(event);
-
- refreshScene();
-
- emit resized();
-}
-
-
-void UBThumbnailWidget::sceneSelectionChanged()
-{
- emit selectionChanged();
-}
-
-
-void UBThumbnailWidget::selectItemAt(int pIndex, bool extend)
-{
- QGraphicsItem* itemToSelect = 0;
-
- if (pIndex >= 0 && pIndex < mGraphicItems.size())
- itemToSelect = mGraphicItems.at(pIndex);
-
- foreach (QGraphicsItem* item, items())
- {
- if (item == itemToSelect)
- {
- mLastSelectedThumbnail = dynamic_cast(item);
- item->setSelected(true);
- ensureVisible(item);
- }
- else if (!extend)
- {
- item->setSelected(false);
- }
- }
-}
-
-void UBThumbnailWidget::unselectItemAt(int pIndex)
-{
- if (pIndex >= 0 && pIndex < mGraphicItems.size())
- {
- QGraphicsItem *itemToUnselect = mGraphicItems.at(pIndex);
- itemToUnselect->setSelected(false);
- }
-}
-
-
-void UBThumbnailWidget::selectItems(int startIndex, int count)
-{
- for (int i = 0; i < mGraphicItems.count(); i++)
- {
- mGraphicItems.at(i)->setSelected(i >= startIndex && i < startIndex + count);
- }
-}
-
-
-void UBThumbnailWidget::selectAll()
-{
- foreach (QGraphicsItem* item, mGraphicItems)
- {
- item->setSelected(true);
- }
-}
-
-void UBThumbnailWidget::unselectAll()
-{
- foreach (QGraphicsItem* item, mGraphicItems)
- {
- item->setSelected(false);
- }
-}
-
-int UBThumbnailWidget::rowCount() const
-{
- UBThumbnail *lastThumbnail = dynamic_cast(mGraphicItems.last());
- return lastThumbnail ? lastThumbnail->row() + 1 : 0;
-}
-
-int UBThumbnailWidget::columnCount() const
-{
- UBThumbnail *lastThumbnail = dynamic_cast(mGraphicItems.last());
- if (!lastThumbnail) return 0;
- int lastRow = lastThumbnail->row();
- int lastColumn = lastThumbnail->column();
- return lastRow > 0 ? (mGraphicItems.count() - lastColumn - 1) / lastRow : mGraphicItems.count();
-}
-
-
-void UBThumbnailWidget::mouseDoubleClickEvent(QMouseEvent * event)
-{
- QGraphicsItem* item = itemAt(event->pos());
-
- if (item)
- {
- int index = mGraphicItems.indexOf(item);
- emit mouseDoubleClick(item, index);
- }
-}
-
-
-bool UBThumbnailWidget::thumbnailLessThan(QGraphicsItem* item1, QGraphicsItem* item2)
-{
- UBThumbnail *thumbnail1 = dynamic_cast(item1);
- UBThumbnail *thumbnail2 = dynamic_cast(item2);
- if (thumbnail1 && thumbnail2)
- {
- if (thumbnail1->row() != thumbnail2->row())
- return thumbnail1->row() < thumbnail2->row();
- else
- return thumbnail1->column() < thumbnail2->column();
- }
- return false;
-}
-
-void UBThumbnailWidget::deleteLasso()
-{
- if (mLassoRectItem && scene())
- {
- scene()->removeItem(mLassoRectItem);
- delete mLassoRectItem;
- mLassoRectItem = 0;
- }
-}
-
-
-UBThumbnail::UBThumbnail()
- : mAddedToScene(false)
-{
- mSelectionItem = new QGraphicsRectItem(0, 0, 0, 0);
- mSelectionItem->setPen(QPen(UBSettings::treeViewBackgroundColor, 8));
- // TODO UB 4.x fix nasty dependencies : 8 is a bit less than half of UBThumbnailWidget.mSpacing
-}
-
-UBThumbnail::~UBThumbnail()
-{
- if (mSelectionItem && !mAddedToScene)
- delete mSelectionItem;
-}
-
-
-UBSceneThumbnailNavigPixmap::UBSceneThumbnailNavigPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex)
- : UBSceneThumbnailPixmap(pix, proxy, pSceneIndex)
- , bButtonsVisible(false)
- , bCanDelete(false)
- , bCanMoveUp(false)
- , bCanMoveDown(false)
-{
- setAcceptsHoverEvents(true);
- setFlag(QGraphicsItem::ItemIsSelectable, true);
-}
-
-UBSceneThumbnailNavigPixmap::~UBSceneThumbnailNavigPixmap()
-{
-
-}
-
-void UBSceneThumbnailNavigPixmap::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
-{
- event->accept();
- updateButtonsState();
- update();
-}
-
-void UBSceneThumbnailNavigPixmap::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
-{
- event->accept();
- bButtonsVisible = false;
- update();
-}
-
-void UBSceneThumbnailNavigPixmap::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
-{
- Q_UNUSED(option);
- Q_UNUSED(widget);
-
- UBSceneThumbnailPixmap::paint(painter, option, widget);
- if(bButtonsVisible)
- {
- if(bCanDelete)
- painter->drawPixmap(0, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/close.svg"));
- else
- painter->drawPixmap(0, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/closeDisabled.svg"));
- if(bCanMoveUp)
- painter->drawPixmap(BUTTONSIZE + BUTTONSPACING, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/moveUp.svg"));
- else
- painter->drawPixmap(BUTTONSIZE + BUTTONSPACING, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/moveUpDisabled.svg"));
- if(bCanMoveDown)
- painter->drawPixmap(2*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/menu.svg"));
- else
- painter->drawPixmap(2*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/menuDisabled.svg"));
- }
-}
-
-void UBSceneThumbnailNavigPixmap::mousePressEvent(QGraphicsSceneMouseEvent *event)
-{
- QPointF p = event->pos();
-
- // Here we check the position of the click and verify if it has to trig an action or not.
- if(bCanDelete && p.x() >= 0 && p.x() <= BUTTONSIZE && p.y() >= 0 && p.y() <= BUTTONSIZE)
- {
- deletePage();
- }
- if(bCanMoveUp && p.x() >= BUTTONSIZE + BUTTONSPACING && p.x() <= 2*BUTTONSIZE + BUTTONSPACING && p.y() >= 0 && p.y() <= BUTTONSIZE)
- {
- moveUpPage();
- }
- if(bCanMoveDown && p.x() >= 2*(BUTTONSIZE + BUTTONSPACING) && p.x() <= 2*(BUTTONSIZE + BUTTONSPACING) + BUTTONSIZE && p.y() >= 0 && p.y() <= BUTTONSIZE)
- {
- moveDownPage();
- }
- event->accept();
-}
-
-void UBSceneThumbnailNavigPixmap::updateButtonsState()
-{
- bCanDelete = false;
- bCanMoveUp = false;
- bCanMoveDown = false;
-
- UBDocumentProxy* p = proxy();
- if(NULL != p)
- {
- int iNbPages = p->pageCount();
- if(1 < iNbPages)
- {
- bCanDelete = true;
- if(sceneIndex() > 0)
- {
- bCanMoveUp = true;
- }
- if(sceneIndex() != iNbPages - 1)
- {
- bCanMoveDown = true;
- }
- }
- }
-
- if(bCanDelete || bCanMoveUp || bCanMoveDown)
- {
- bButtonsVisible = true;
- }
-}
-
-void UBSceneThumbnailNavigPixmap::deletePage()
-{
- QList itemsToDelete;
- itemsToDelete << this;
-
- UBApplication::documentController->deletePages(itemsToDelete);
-}
-
-void UBSceneThumbnailNavigPixmap::moveUpPage()
-{
- UBApplication::documentController->moveSceneToIndex(proxy(), sceneIndex(), sceneIndex() - 1);
-}
-
-void UBSceneThumbnailNavigPixmap::moveDownPage()
-{
- UBApplication::documentController->moveSceneToIndex(proxy(), sceneIndex(), sceneIndex() + 1);
-}
-
-void UBImgTextThumbnailElement::Place(int row, int col, qreal width, qreal height)
-{
- int labelSpacing = 0;
- if(this->caption)
- {
- QFontMetrics fm(this->caption->font());
- labelSpacing = UBSettings::thumbnailSpacing + fm.height();
- }
- if(this->thumbnail)
- {
- int w = this->thumbnail->boundingRect().width();
- int h = this->thumbnail->boundingRect().height();
-
- qreal scaleWidth = width / w;
- qreal scaleHeight = height / h;
- qreal scaleFactor = qMin(scaleWidth, scaleHeight);
- UBThumbnail* pix = dynamic_cast(this->thumbnail);
-
- if(pix)
- {
- scaleFactor = qMin(scaleFactor, 1.0);
- }
-
- QTransform transform;
- transform.scale(scaleFactor, scaleFactor);
-
- // Apply the scaling
- this->thumbnail->setTransform(transform);
- this->thumbnail->setFlag(QGraphicsItem::ItemIsSelectable, true);
-
- if(pix)
- {
- pix->setColumn(col);
- pix->setRow(row);
- }
-
- QPointF pos(border + (width - w * scaleFactor) / 2 + col * (width + border),
- border + row * (height + border + labelSpacing) + (height - h * scaleFactor) / 2);
-
- this->thumbnail->setPos(pos);
-
- if(this->caption)
- {
- QFontMetrics fm(this->caption->font());
- QString elidedText = fm.elidedText(this->caption->toPlainText(), Qt::ElideRight, width);
-
- this->caption->setPlainText(elidedText);
- this->caption->setWidth(fm.width(elidedText) + 2 * this->caption->document()->documentMargin());
- pos.setY(pos.y() + (height + h * scaleFactor) / 2 + 5); // What is this 5 ??
- qreal labelWidth = fm.width(elidedText);
- pos.setX(border + (width - labelWidth) / 2 + col * (width + border));
- this->caption->setPos(pos);
- }
- }
-}
+/*
+ * 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 .
+ */
+#include
+#include
+
+#include "UBThumbnailWidget.h"
+#include "UBRubberBand.h"
+
+#include "core/UBSettings.h"
+#include "core/UBApplication.h"
+
+#include "document/UBDocumentProxy.h"
+#include "document/UBDocumentController.h"
+
+#include "core/memcheck.h"
+
+UBThumbnailWidget::UBThumbnailWidget(QWidget* parent)
+ : QGraphicsView(parent)
+ , mThumbnailWidth(UBSettings::defaultThumbnailWidth)
+ , mSpacing(UBSettings::thumbnailSpacing)
+ , mLastSelectedThumbnail(0)
+ , mSelectionSpan(0)
+ , mLassoRectItem(0)
+{
+ // By default, the drag is possible
+ bCanDrag = true;
+ setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
+ setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing);
+ setFrameShape(QFrame::NoFrame);
+ setScene(&mThumbnailsScene);
+
+ setAlignment(Qt::AlignLeft | Qt::AlignTop);
+
+ connect(&mThumbnailsScene, SIGNAL(selectionChanged()), this, SLOT(sceneSelectionChanged()));
+}
+
+
+UBThumbnailWidget::~UBThumbnailWidget()
+{
+ disconnect(&mThumbnailsScene, SIGNAL(selectionChanged()));
+}
+
+
+void UBThumbnailWidget::setThumbnailWidth(qreal pThumbnailWidth)
+{
+ mThumbnailWidth = pThumbnailWidth;
+
+ refreshScene();
+}
+
+
+void UBThumbnailWidget::setSpacing(qreal pSpacing)
+{
+ mSpacing = pSpacing;
+
+ refreshScene();
+}
+
+
+void UBThumbnailWidget::setGraphicsItems(const QList& pGraphicsItems
+ , const QList& pItemsPaths
+ , const QStringList pLabels
+ , const QString& pMimeType)
+{
+ mGraphicItems = pGraphicsItems;
+ mItemsPaths = pItemsPaths;
+ mMimeType = pMimeType;
+ mLabels = pLabels;
+
+ foreach(QGraphicsItem* it, mThumbnailsScene.items())
+ {
+ mThumbnailsScene.removeItem(it, true);
+ }
+
+ // set lasso to 0 as it has been cleared as well
+ mLassoRectItem = 0;
+
+ foreach (QGraphicsItem* item, pGraphicsItems)
+ {
+ if (item->scene() != &mThumbnailsScene)
+ {
+ mThumbnailsScene.addItem(item);
+ }
+ }
+
+ mLabelsItems.clear();
+
+ foreach (const QString label, pLabels)
+ {
+ QFontMetrics fm(font());
+ UBThumbnailTextItem *labelItem =
+ new UBThumbnailTextItem(label); // deleted while replace or by the scene destruction
+
+ mThumbnailsScene.addItem(labelItem);
+ mLabelsItems << labelItem;
+ }
+
+ refreshScene();
+
+ mLastSelectedThumbnail = 0;
+}
+
+
+void UBThumbnailWidget::refreshScene()
+{
+ int nbColumns = (geometry().width() - mSpacing) / (mThumbnailWidth + mSpacing);
+
+ int labelSpacing = 0;
+
+ if (mLabelsItems.size() > 0)
+ {
+ QFontMetrics fm(mLabelsItems.at(0)->font());
+ labelSpacing = UBSettings::thumbnailSpacing + fm.height(); // TODO UB 4.x where is 20 from ??? configure ?? compute based on mSpacing ?? JBA Is it the font height?
+ }
+ nbColumns = qMax(nbColumns, 1);
+
+ qreal thumbnailHeight = mThumbnailWidth / UBSettings::minScreenRatio;
+
+ for (int i = 0; i < mGraphicItems.size(); i++)
+ {
+ QGraphicsItem* item = mGraphicItems.at(i);
+
+ qreal scaleWidth = mThumbnailWidth / item->boundingRect().width();
+ qreal scaleHeight = thumbnailHeight / item->boundingRect().height();
+
+ qreal scaleFactor = qMin(scaleWidth, scaleHeight);
+
+ //bitmap should not be stretched
+ UBThumbnail* pix = dynamic_cast(item);
+ if (pix)
+ scaleFactor = qMin(scaleFactor, 1.0);
+
+ QTransform transform;
+ transform.scale(scaleFactor, scaleFactor);
+
+ item->setTransform(transform);
+
+ item->setFlag(QGraphicsItem::ItemIsSelectable, true);
+
+ int columnIndex = i % nbColumns;
+ int rowIndex = i / nbColumns;
+
+ if (pix)
+ {
+ pix->setColumn(columnIndex);
+ pix->setRow(rowIndex);
+ }
+
+ int w = item->boundingRect().width();
+ int h = item->boundingRect().height();
+ QPointF pos(
+ mSpacing + (mThumbnailWidth - w * scaleFactor) / 2 + columnIndex * (mThumbnailWidth + mSpacing),
+ mSpacing + rowIndex * (thumbnailHeight + mSpacing + labelSpacing) + (thumbnailHeight - h * scaleFactor) / 2);
+
+ item->setPos(pos);
+
+ if (mLabelsItems.size() > i)
+ {
+ QFontMetrics fm(mLabelsItems.at(i)->font(), this);
+ QString elidedText = fm.elidedText(mLabels.at(i), Qt::ElideRight, mThumbnailWidth);
+
+ mLabelsItems.at(i)->setPlainText(elidedText);
+ mLabelsItems.at(i)->setWidth(fm.width(elidedText) + 2 * mLabelsItems.at(i)->document()->documentMargin());
+
+ pos.setY(pos.y() + (thumbnailHeight + h * scaleFactor) / 2 + 5);
+ qreal labelWidth = fm.width(elidedText);
+ pos.setX(mSpacing + (mThumbnailWidth - labelWidth) / 2 + columnIndex * (mThumbnailWidth + mSpacing));
+ mLabelsItems.at(i)->setPos(pos);
+ }
+ }
+
+ QScrollBar *vertScrollBar = verticalScrollBar();
+ int scrollBarThickness = 0;
+ if (vertScrollBar && vertScrollBar->isVisible())
+ scrollBarThickness = vertScrollBar->width();
+
+ setSceneRect(0, 0,
+ geometry().width() - scrollBarThickness,
+ mSpacing + ((((mGraphicItems.size() - 1) / nbColumns) + 1) * (thumbnailHeight + mSpacing + labelSpacing)));
+}
+
+
+QList UBThumbnailWidget::selectedItems()
+{
+ QList sortedSelectedItems = mThumbnailsScene.selectedItems();
+ qSort(sortedSelectedItems.begin(), sortedSelectedItems.end(), thumbnailLessThan);
+ return sortedSelectedItems;
+}
+
+
+void UBThumbnailWidget::mousePressEvent(QMouseEvent *event)
+{
+ mClickTime = QTime::currentTime();
+ mMousePressPos = event->pos();
+ mMousePressScenePos = mapToScene(mMousePressPos);
+ QGraphicsItem* underlyingItem = itemAt(mMousePressPos);
+
+ UBThumbnail *previousSelectedThumbnail = mLastSelectedThumbnail;
+
+ if (!dynamic_cast(underlyingItem))
+ {
+ deleteLasso();
+
+ UBRubberBand rubberBand(QRubberBand::Rectangle);
+ QStyleOption option;
+ option.initFrom(&rubberBand);
+
+ mLassoRectItem = new QGraphicsRectItem(0, scene());
+
+#ifdef Q_WS_MAC
+ // The following code must stay in synch with \src\gui\styles\qmacstyle_mac.mm
+ QColor strokeColor;
+ strokeColor.setHsvF(0, 0, 0.86, 1.0);
+ mLassoRectItem->setPen(QPen(strokeColor));
+ QColor fillColor(option.palette.color(QPalette::Disabled, QPalette::Highlight));
+ fillColor.setHsvF(0, 0, 0.53, 0.25);
+ mLassoRectItem->setBrush(fillColor);
+#else
+ // The following code must stay in synch with \src\gui\styles\qwindowsxpstyle.cpp
+ QColor highlight = option.palette.color(QPalette::Active, QPalette::Highlight);
+ mLassoRectItem->setPen(highlight.darker(120));
+ QColor dimHighlight(qMin(highlight.red() / 2 + 110, 255),
+ qMin(highlight.green() / 2 + 110, 255),
+ qMin(highlight.blue() / 2 + 110, 255),
+ 127);
+ mLassoRectItem->setBrush(dimHighlight);
+#endif
+
+ mLassoRectItem->setZValue(10000);
+ mLassoRectItem->setRect(QRectF(mMousePressScenePos, QSizeF()));
+
+ if (Qt::ControlModifier & event->modifiers() || Qt::ShiftModifier & event->modifiers())
+ {
+ // mSelectedThumbnailItems = selectedItems().toSet();
+ return;
+ }
+
+ mSelectedThumbnailItems.clear();
+ QGraphicsView::mousePressEvent(event);
+ }
+ else if (Qt::ShiftModifier & event->modifiers())
+ {
+ if (previousSelectedThumbnail)
+ {
+ QGraphicsItem* previousSelectedItem = dynamic_cast(previousSelectedThumbnail);
+ if (previousSelectedItem)
+ {
+ int index1 = mGraphicItems.indexOf(previousSelectedItem);
+ int index2 = mGraphicItems.indexOf(underlyingItem);
+ if (-1 == index2)
+ {
+ mSelectedThumbnailItems = selectedItems().toSet();
+ return;
+ }
+ mSelectionSpan = index2 - index1;
+ selectItems(qMin(index1, index2), mSelectionSpan < 0 ? - mSelectionSpan + 1 : mSelectionSpan + 1);
+ return;
+ }
+ }
+ }
+ else
+ {
+ mLastSelectedThumbnail = dynamic_cast(underlyingItem);
+ if (!underlyingItem->isSelected())
+ {
+ int index = mGraphicItems.indexOf(underlyingItem);
+ selectItemAt(index, Qt::ControlModifier & event->modifiers());
+ }
+ else
+ {
+ QGraphicsView::mousePressEvent(event);
+ }
+ if (!mLastSelectedThumbnail && mGraphicItems.count() > 0)
+ mLastSelectedThumbnail = dynamic_cast(mGraphicItems.at(0));
+ mSelectionSpan = 0;
+ return;
+ }
+}
+
+
+void UBThumbnailWidget::mouseMoveEvent(QMouseEvent *event)
+{
+ int distance = (mMousePressPos - event->pos()).manhattanLength();
+
+ if (0 == (event->buttons() & Qt::LeftButton) || distance < QApplication::startDragDistance())
+ return;
+
+ if (mLassoRectItem)
+ {
+ bSelectionInProgress = true;
+ int incrementLassoMinWidth = 2;
+ QPointF currentScenePos = mapToScene(event->pos());
+ QRectF lassoRect(
+ qMin(mMousePressScenePos.x(), currentScenePos.x()), qMin(mMousePressScenePos.y(), currentScenePos.y()),
+ qAbs(mMousePressScenePos.x() - currentScenePos.x()), qAbs(mMousePressScenePos.y() - currentScenePos.y()));
+ QRectF incrementXSelection(
+ qMin(prevMoveMousePos.x(), currentScenePos.x()), qMin(mMousePressScenePos.y(), currentScenePos.y()),
+ qAbs(prevMoveMousePos.x() - currentScenePos.x())+incrementLassoMinWidth, qAbs(mMousePressScenePos.y() - currentScenePos.y()));
+ QRectF incrementYSelection(
+ qMin(mMousePressScenePos.x(), currentScenePos.x()), qMin(prevMoveMousePos.y(), currentScenePos.y()),
+ qAbs(mMousePressScenePos.x() - currentScenePos.x()), qAbs(prevMoveMousePos.y() - currentScenePos.y())+incrementLassoMinWidth);
+
+ prevMoveMousePos = currentScenePos;
+ mLassoRectItem->setRect(lassoRect);
+
+
+ QSet incSelectedItems = scene()->items(incrementXSelection, Qt::IntersectsItemBoundingRect).toSet()
+ + scene()->items(incrementYSelection, Qt::IntersectsItemBoundingRect).toSet();
+
+ mPreviouslyIncrementalSelectedItems = incSelectedItems;
+ QSet lassoSelectedItems;
+ QSet lassoSelectedThumbnailItems;
+ foreach (QGraphicsItem *lassoSelectedItem, incSelectedItems)
+ {
+ if (lassoSelectedItem)
+ {
+ UBSceneThumbnailPixmap *thumbnailItem = dynamic_cast(lassoSelectedItem);
+
+ if (thumbnailItem)
+ {
+ lassoSelectedItem->setSelected(true);
+ lassoSelectedThumbnailItems += lassoSelectedItem;
+ }
+ }
+ }
+
+ QSet toUnset;
+ toUnset = mSelectedThumbnailItems - lassoSelectedThumbnailItems;
+ foreach(QGraphicsItem* item, toUnset)
+ {
+ item->setSelected(false);
+ }
+
+
+ mSelectedThumbnailItems += lassoSelectedItems;
+ // foreach (QGraphicsItem *lassoSelectedItem, lassoSelectedThumbnailItems)
+ {
+
+ }
+ if (Qt::ControlModifier & event->modifiers())
+ {
+ for (int i = 0; i < mSelectedThumbnailItems.count()-1; i++)
+ {
+ mSelectedThumbnailItems.values().at(i)->setSelected(true);
+ }
+ // foreach (QGraphicsItem *selectedItem, mSelectedThumbnailItems)
+ {
+ // selectedItem->setSelected(true);
+ }
+ }
+ }
+ else
+ {
+ bSelectionInProgress = false;
+ if (0 == selectedItems().size())
+ return;
+
+ if(bCanDrag)
+ {
+ QDrag *drag = new QDrag(this);
+ QMimeData *mime = new QMimeData();
+
+ if (mMimeType.length() > 0)
+ mime->setData(mMimeType, QByteArray()); // trick the d&d system to register our own mime type
+
+ drag->setMimeData(mime);
+
+ QList qlElements;
+
+ foreach (QGraphicsItem* item, selectedItems())
+ {
+ if (mGraphicItems.contains(item))
+ {
+ if (mGraphicItems.indexOf(item) <= mItemsPaths.size()){
+ qlElements << mItemsPaths.at(mGraphicItems.indexOf(item));
+ }
+ }
+ }
+
+ if (qlElements.size() > 0){
+ mime->setUrls(qlElements);
+ drag->setMimeData(mime);
+ drag->exec(Qt::CopyAction);
+ }
+ }
+ }
+
+ QGraphicsView::mouseMoveEvent(event);
+}
+
+
+void UBThumbnailWidget::mouseReleaseEvent(QMouseEvent *event)
+{
+ int elapsedTimeSincePress = mClickTime.elapsed();
+ deleteLasso();
+ QGraphicsView::mouseReleaseEvent(event);
+
+ if(elapsedTimeSincePress < STARTDRAGTIME) {
+ emit mouseClick(itemAt(event->pos()), 0);
+ }
+}
+
+
+void UBThumbnailWidget::keyPressEvent(QKeyEvent *event)
+{
+ if (mLastSelectedThumbnail)
+ {
+ QGraphicsItem *lastSelectedGraphicsItem = dynamic_cast(mLastSelectedThumbnail);
+ if (!lastSelectedGraphicsItem) return;
+ int startSelectionIndex = mGraphicItems.indexOf(lastSelectedGraphicsItem);
+ int previousSelectedThumbnailIndex = startSelectionIndex + mSelectionSpan;
+
+ switch (event->key())
+ {
+ case Qt::Key_Down:
+ case Qt::Key_Up:
+ {
+ if (rowCount() <= 1) break;
+ if (Qt::ShiftModifier & event->modifiers())
+ {
+ int endSelectionIndex;
+ if (Qt::Key_Down == event->key())
+ {
+ endSelectionIndex = previousSelectedThumbnailIndex + columnCount();
+ if (endSelectionIndex >= mGraphicItems.count()) break;
+ }
+ else
+ {
+ endSelectionIndex = previousSelectedThumbnailIndex - columnCount();
+ if (endSelectionIndex < 0) break;
+ }
+
+ int startIndex = startSelectionIndex < endSelectionIndex ? startSelectionIndex : endSelectionIndex;
+ int count = startSelectionIndex < endSelectionIndex ? endSelectionIndex - startSelectionIndex + 1 : startSelectionIndex - endSelectionIndex + 1;
+ mSelectionSpan = startSelectionIndex < endSelectionIndex ? (count - 1) : - (count - 1);
+ selectItems(startIndex, count);
+ }
+ else
+ {
+ int toSelectIndex;
+ if (Qt::Key_Down == event->key())
+ {
+ toSelectIndex = previousSelectedThumbnailIndex + columnCount();
+ if (toSelectIndex >= mGraphicItems.count()) break;
+ }
+ else
+ {
+ toSelectIndex = previousSelectedThumbnailIndex - columnCount();
+ if (toSelectIndex < 0) break;
+ }
+
+ selectItemAt(toSelectIndex, Qt::ControlModifier & event->modifiers());
+ mSelectionSpan = 0;
+ }
+ }
+ break;
+
+ case Qt::Key_Left:
+ case Qt::Key_Right:
+ {
+ QGraphicsItem *previousSelectedItem = mGraphicItems.at(previousSelectedThumbnailIndex);
+ UBThumbnail *previousSelectedThumbnail = dynamic_cast(previousSelectedItem);
+ if (!previousSelectedThumbnail) break;
+
+ if (Qt::Key_Left == event->key())
+ {
+ if (0 == previousSelectedThumbnail->column()) break;
+ }
+ else
+ {
+ if (previousSelectedThumbnail->column() == columnCount() - 1 ||
+ previousSelectedThumbnailIndex == mGraphicItems.count() - 1) break;
+ }
+
+ if (Qt::ShiftModifier & event->modifiers())
+ {
+ int endSelectionIndex;
+ if (Qt::Key_Left == event->key())
+ {
+ endSelectionIndex = previousSelectedThumbnailIndex - 1;
+ if (endSelectionIndex < 0) break;
+ }
+ else
+ {
+ endSelectionIndex = previousSelectedThumbnailIndex + 1;
+ if (endSelectionIndex >= mGraphicItems.count()) break;
+ }
+
+ int startIndex = startSelectionIndex < endSelectionIndex ? startSelectionIndex : endSelectionIndex;
+ int count = startSelectionIndex < endSelectionIndex ? endSelectionIndex - startSelectionIndex + 1 : startSelectionIndex - endSelectionIndex + 1;
+ mSelectionSpan = startSelectionIndex < endSelectionIndex ? (count - 1) : - (count - 1);
+ selectItems(startIndex, count);
+ }
+ else
+ {
+ if (Qt::Key_Left == event->key())
+ selectItemAt(previousSelectedThumbnailIndex - 1, Qt::ControlModifier & event->modifiers());
+ else
+ selectItemAt(previousSelectedThumbnailIndex + 1, Qt::ControlModifier & event->modifiers());
+
+ mSelectionSpan = 0;
+ }
+ }
+ break;
+
+ case Qt::Key_Home:
+ {
+ if (Qt::ShiftModifier & event->modifiers())
+ {
+ mSelectionSpan = - startSelectionIndex;
+ selectItems(0, startSelectionIndex + 1);
+ }
+ else
+ {
+ selectItemAt(0, Qt::ControlModifier & event->modifiers());
+ mSelectionSpan = 0;
+ }
+ }
+ break;
+
+ case Qt::Key_End:
+ {
+ if (Qt::ShiftModifier & event->modifiers())
+ {
+ mSelectionSpan = mGraphicItems.count() - startSelectionIndex - 1;
+ selectItems(startSelectionIndex, mSelectionSpan + 1);
+ }
+ else
+ {
+ selectItemAt(mGraphicItems.count() - 1, Qt::ControlModifier & event->modifiers());
+ mSelectionSpan = 0;
+ }
+ }
+ break;
+ case Qt::Key_A:
+ {
+ if (Qt::ControlModifier & event->modifiers())
+ selectAll();
+ }
+ break;
+ }
+ }
+ QGraphicsView::keyPressEvent(event);
+}
+
+
+void UBThumbnailWidget::focusInEvent(QFocusEvent *event)
+{
+ Q_UNUSED(event);
+
+ if (0 == selectedItems().count() && mGraphicItems.count() > 0 && Qt::TabFocusReason == event->reason())
+ {
+ selectItemAt(0);
+ mSelectionSpan = 0;
+ }
+}
+
+
+void UBThumbnailWidget::resizeEvent(QResizeEvent *event)
+{
+ Q_UNUSED(event);
+
+ refreshScene();
+
+ emit resized();
+}
+
+
+void UBThumbnailWidget::sceneSelectionChanged()
+{
+ emit selectionChanged();
+}
+
+
+void UBThumbnailWidget::selectItemAt(int pIndex, bool extend)
+{
+ QGraphicsItem* itemToSelect = 0;
+
+ if (pIndex >= 0 && pIndex < mGraphicItems.size())
+ itemToSelect = mGraphicItems.at(pIndex);
+
+ foreach (QGraphicsItem* item, items())
+ {
+ if (item == itemToSelect)
+ {
+ mLastSelectedThumbnail = dynamic_cast(item);
+ item->setSelected(true);
+ ensureVisible(item);
+ }
+ else if (!extend)
+ {
+ item->setSelected(false);
+ }
+ }
+}
+
+void UBThumbnailWidget::unselectItemAt(int pIndex)
+{
+ if (pIndex >= 0 && pIndex < mGraphicItems.size())
+ {
+ QGraphicsItem *itemToUnselect = mGraphicItems.at(pIndex);
+ itemToUnselect->setSelected(false);
+ }
+}
+
+
+void UBThumbnailWidget::selectItems(int startIndex, int count)
+{
+ for (int i = 0; i < mGraphicItems.count(); i++)
+ {
+ mGraphicItems.at(i)->setSelected(i >= startIndex && i < startIndex + count);
+ }
+}
+
+
+void UBThumbnailWidget::selectAll()
+{
+ foreach (QGraphicsItem* item, mGraphicItems)
+ {
+ item->setSelected(true);
+ }
+}
+
+int UBThumbnailWidget::rowCount() const
+{
+ UBThumbnail *lastThumbnail = dynamic_cast(mGraphicItems.last());
+ return lastThumbnail ? lastThumbnail->row() + 1 : 0;
+}
+
+int UBThumbnailWidget::columnCount() const
+{
+ UBThumbnail *lastThumbnail = dynamic_cast(mGraphicItems.last());
+ if (!lastThumbnail) return 0;
+ int lastRow = lastThumbnail->row();
+ int lastColumn = lastThumbnail->column();
+ return lastRow > 0 ? (mGraphicItems.count() - lastColumn - 1) / lastRow : mGraphicItems.count();
+}
+
+
+void UBThumbnailWidget::mouseDoubleClickEvent(QMouseEvent * event)
+{
+ QGraphicsItem* item = itemAt(event->pos());
+
+ if (item)
+ {
+ int index = mGraphicItems.indexOf(item);
+ emit mouseDoubleClick(item, index);
+ }
+}
+
+
+bool UBThumbnailWidget::thumbnailLessThan(QGraphicsItem* item1, QGraphicsItem* item2)
+{
+ UBThumbnail *thumbnail1 = dynamic_cast(item1);
+ UBThumbnail *thumbnail2 = dynamic_cast(item2);
+ if (thumbnail1 && thumbnail2)
+ {
+ if (thumbnail1->row() != thumbnail2->row())
+ return thumbnail1->row() < thumbnail2->row();
+ else
+ return thumbnail1->column() < thumbnail2->column();
+ }
+ return false;
+}
+
+void UBThumbnailWidget::deleteLasso()
+{
+ if (mLassoRectItem && scene())
+ {
+ scene()->removeItem(mLassoRectItem);
+ delete mLassoRectItem;
+ mLassoRectItem = 0;
+ }
+}
+
+
+UBThumbnail::UBThumbnail()
+ : mAddedToScene(false)
+{
+ mSelectionItem = new QGraphicsRectItem(0, 0, 0, 0);
+ mSelectionItem->setPen(QPen(UBSettings::treeViewBackgroundColor, 8));
+ // TODO UB 4.x fix nasty dependencies : 8 is a bit less than half of UBThumbnailWidget.mSpacing
+}
+
+UBThumbnail::~UBThumbnail()
+{
+ if (mSelectionItem && !mAddedToScene)
+ delete mSelectionItem;
+}
+
+
+UBSceneThumbnailNavigPixmap::UBSceneThumbnailNavigPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex)
+ : UBSceneThumbnailPixmap(pix, proxy, pSceneIndex)
+ , bButtonsVisible(false)
+ , bCanDelete(false)
+ , bCanMoveUp(false)
+ , bCanMoveDown(false)
+{
+ setAcceptsHoverEvents(true);
+ setFlag(QGraphicsItem::ItemIsSelectable, true);
+}
+
+UBSceneThumbnailNavigPixmap::~UBSceneThumbnailNavigPixmap()
+{
+
+}
+
+void UBSceneThumbnailNavigPixmap::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
+{
+ event->accept();
+ updateButtonsState();
+ update();
+}
+
+void UBSceneThumbnailNavigPixmap::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
+{
+ event->accept();
+ bButtonsVisible = false;
+ update();
+}
+
+void UBSceneThumbnailNavigPixmap::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+{
+ Q_UNUSED(option);
+ Q_UNUSED(widget);
+
+ UBSceneThumbnailPixmap::paint(painter, option, widget);
+ if(bButtonsVisible)
+ {
+ if(bCanDelete)
+ painter->drawPixmap(0, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/close.svg"));
+ else
+ painter->drawPixmap(0, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/closeDisabled.svg"));
+ if(bCanMoveUp)
+ painter->drawPixmap(BUTTONSIZE + BUTTONSPACING, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/moveUp.svg"));
+ else
+ painter->drawPixmap(BUTTONSIZE + BUTTONSPACING, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/moveUpDisabled.svg"));
+ if(bCanMoveDown)
+ painter->drawPixmap(2*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/menu.svg"));
+ else
+ painter->drawPixmap(2*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/menuDisabled.svg"));
+ }
+}
+
+void UBSceneThumbnailNavigPixmap::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ QPointF p = event->pos();
+
+ // Here we check the position of the click and verify if it has to trig an action or not.
+ if(bCanDelete && p.x() >= 0 && p.x() <= BUTTONSIZE && p.y() >= 0 && p.y() <= BUTTONSIZE)
+ {
+ deletePage();
+ }
+ if(bCanMoveUp && p.x() >= BUTTONSIZE + BUTTONSPACING && p.x() <= 2*BUTTONSIZE + BUTTONSPACING && p.y() >= 0 && p.y() <= BUTTONSIZE)
+ {
+ moveUpPage();
+ }
+ if(bCanMoveDown && p.x() >= 2*(BUTTONSIZE + BUTTONSPACING) && p.x() <= 2*(BUTTONSIZE + BUTTONSPACING) + BUTTONSIZE && p.y() >= 0 && p.y() <= BUTTONSIZE)
+ {
+ moveDownPage();
+ }
+ event->accept();
+}
+
+void UBSceneThumbnailNavigPixmap::updateButtonsState()
+{
+ bCanDelete = false;
+ bCanMoveUp = false;
+ bCanMoveDown = false;
+
+ UBDocumentProxy* p = proxy();
+ if(NULL != p)
+ {
+ int iNbPages = p->pageCount();
+ if(1 < iNbPages)
+ {
+ bCanDelete = true;
+ if(sceneIndex() > 0)
+ {
+ bCanMoveUp = true;
+ }
+ if(sceneIndex() != iNbPages - 1)
+ {
+ bCanMoveDown = true;
+ }
+ }
+ }
+
+ if(bCanDelete || bCanMoveUp || bCanMoveDown)
+ {
+ bButtonsVisible = true;
+ }
+}
+
+void UBSceneThumbnailNavigPixmap::deletePage()
+{
+ QList itemsToDelete;
+ itemsToDelete << this;
+
+ UBApplication::documentController->deletePages(itemsToDelete);
+}
+
+void UBSceneThumbnailNavigPixmap::moveUpPage()
+{
+ UBApplication::documentController->moveSceneToIndex(proxy(), sceneIndex(), sceneIndex() - 1);
+}
+
+void UBSceneThumbnailNavigPixmap::moveDownPage()
+{
+ UBApplication::documentController->moveSceneToIndex(proxy(), sceneIndex(), sceneIndex() + 1);
+}
+
+void UBImgTextThumbnailElement::Place(int row, int col, qreal width, qreal height)
+{
+ int labelSpacing = 0;
+ if(this->caption)
+ {
+ QFontMetrics fm(this->caption->font());
+ labelSpacing = UBSettings::thumbnailSpacing + fm.height();
+ }
+ if(this->thumbnail)
+ {
+ int w = this->thumbnail->boundingRect().width();
+ int h = this->thumbnail->boundingRect().height();
+
+ qreal scaleWidth = width / w;
+ qreal scaleHeight = height / h;
+ qreal scaleFactor = qMin(scaleWidth, scaleHeight);
+ UBThumbnail* pix = dynamic_cast(this->thumbnail);
+
+ if(pix)
+ {
+ scaleFactor = qMin(scaleFactor, 1.0);
+ }
+
+ QTransform transform;
+ transform.scale(scaleFactor, scaleFactor);
+
+ // Apply the scaling
+ this->thumbnail->setTransform(transform);
+ this->thumbnail->setFlag(QGraphicsItem::ItemIsSelectable, true);
+
+ if(pix)
+ {
+ pix->setColumn(col);
+ pix->setRow(row);
+ }
+
+ QPointF pos(border + (width - w * scaleFactor) / 2 + col * (width + border),
+ border + row * (height + border + labelSpacing) + (height - h * scaleFactor) / 2);
+
+ this->thumbnail->setPos(pos);
+
+ if(this->caption)
+ {
+ QFontMetrics fm(this->caption->font());
+ QString elidedText = fm.elidedText(this->caption->toPlainText(), Qt::ElideRight, width);
+
+ this->caption->setPlainText(elidedText);
+ this->caption->setWidth(fm.width(elidedText) + 2 * this->caption->document()->documentMargin());
+ pos.setY(pos.y() + (height + h * scaleFactor) / 2 + 5); // What is this 5 ??
+ qreal labelWidth = fm.width(elidedText);
+ pos.setX(border + (width - labelWidth) / 2 + col * (width + border));
+ this->caption->setPos(pos);
+ }
+ }
+}
diff --git a/src/gui/UBThumbnailWidget.h b/src/gui/UBThumbnailWidget.h
index e00029c5..2ad70c37 100644
--- a/src/gui/UBThumbnailWidget.h
+++ b/src/gui/UBThumbnailWidget.h
@@ -1,421 +1,423 @@
-/*
- * 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 .
- */
-
-#ifndef UBTHUMBNAILWIDGET_H_
-#define UBTHUMBNAILWIDGET_H_
-
-#include
-#include
-#include
-#include
-
-#include "frameworks/UBCoreGraphicsScene.h"
-#include "core/UBSettings.h"
-#include "domain/UBItem.h"
-
-#define STARTDRAGTIME 1000000
-#define BUTTONSIZE 48
-#define BUTTONSPACING 5
-
-class UBDocumentProxy;
-class UBThumbnailTextItem;
-class UBThumbnail;
-
-class UBThumbnailWidget : public QGraphicsView
-{
- Q_OBJECT;
-
- public:
- UBThumbnailWidget(QWidget* parent);
- virtual ~UBThumbnailWidget();
-
- QList selectedItems();
- void selectItemAt(int pIndex, bool extend = false);
- void unselectItemAt(int pIndex);
-
- qreal thumbnailWidth()
- {
- return mThumbnailWidth;
- }
-
- void setBackgroundBrush(const QBrush& brush)
- {
- mThumbnailsScene.setBackgroundBrush(brush);
- }
-
- public slots:
- void setThumbnailWidth(qreal pThumbnailWidth);
- void setSpacing(qreal pSpacing);
- virtual void setGraphicsItems(const QList& pGraphicsItems, const QList& pItemPaths, const QStringList pLabels = QStringList(), const QString& pMimeType = QString(""));
- void refreshScene();
- void sceneSelectionChanged();
-
- signals:
- void resized();
- void selectionChanged();
- void mouseDoubleClick(QGraphicsItem* item, int index);
- void mouseClick(QGraphicsItem* item, int index);
-
-
- protected:
- virtual void mousePressEvent(QMouseEvent *event);
- virtual void mouseMoveEvent(QMouseEvent *event);
- virtual void mouseReleaseEvent(QMouseEvent *event);
- virtual void resizeEvent(QResizeEvent * event);
- void mouseDoubleClickEvent(QMouseEvent * event);
-
- virtual void keyPressEvent(QKeyEvent *event);
- virtual void focusInEvent(QFocusEvent *event);
-
- QList mGraphicItems;
- QList mLabelsItems;
- QPointF mMousePressScenePos;
- QPoint mMousePressPos;
-
- protected:
- qreal spacing() { return mSpacing; }
- QList mItemsPaths;
- QStringList mLabels;
- bool bSelectionInProgress;
- bool bCanDrag;
-
- private:
- void selectAll();
- void unselectAll();
- void selectItems(int startIndex, int count);
- int rowCount() const;
- int columnCount() const;
-
- static bool thumbnailLessThan(QGraphicsItem* item1, QGraphicsItem* item2);
-
- void deleteLasso();
-
- UBCoreGraphicsScene mThumbnailsScene;
-
- QString mMimeType;
-
- qreal mThumbnailWidth;
- qreal mThumbnailHeight;
- qreal mSpacing;
-
- UBThumbnail *mLastSelectedThumbnail;
- int mSelectionSpan;
- QGraphicsRectItem *mLassoRectItem;
- QList mSelectedThumbnailItems;
- QTime mClickTime;
-};
-
-
-class UBThumbnail
-{
- public:
- UBThumbnail();
-
- virtual ~UBThumbnail();
-
- QStyleOptionGraphicsItem muteStyleOption(const QStyleOptionGraphicsItem *option)
- {
- // Never draw the rubber band, we draw our custom selection with the DelegateFrame
- QStyleOptionGraphicsItem styleOption = QStyleOptionGraphicsItem(*option);
- styleOption.state &= ~QStyle::State_Selected;
-
- return styleOption;
- }
-
- virtual void itemChange(QGraphicsItem *item, QGraphicsItem::GraphicsItemChange change, const QVariant &value)
- {
- Q_UNUSED(value);
-
- if ((change == QGraphicsItem::ItemSelectedHasChanged
- || change == QGraphicsItem::ItemTransformHasChanged
- || change == QGraphicsItem::ItemPositionHasChanged)
- && item->scene())
- {
- if (item->isSelected())
- {
- if (!mSelectionItem->scene())
- {
- item->scene()->addItem(mSelectionItem);
- mSelectionItem->setZValue(item->zValue() - 1);
-// UBGraphicsItem::assignZValue(mSelectionItem, item->zValue() - 1);
- mAddedToScene = true;
- }
-
- mSelectionItem->setRect(
- item->sceneBoundingRect().x() - 5,
- item->sceneBoundingRect().y() - 5,
- item->sceneBoundingRect().width() + 10,
- item->sceneBoundingRect().height() + 10);
-
- mSelectionItem->show();
-
- }
- else
- {
- mSelectionItem->hide();
- }
- }
- }
-
- int column() { return mColumn; }
- void setColumn(int column) { mColumn = column; }
- int row() { return mRow; }
- void setRow(int row) { mRow = row; }
-
- protected:
- QGraphicsRectItem *mSelectionItem;
- private:
- bool mAddedToScene;
-
- int mColumn;
- int mRow;
-};
-
-
-class UBThumbnailSvg : public QGraphicsSvgItem, public UBThumbnail
-{
- public:
- UBThumbnailSvg(const QString& path)
- : QGraphicsSvgItem(path)
- {
- setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
- }
-
- virtual ~UBThumbnailSvg()
- {
- // NOOP
- }
-
- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
- {
- QStyleOptionGraphicsItem styleOption = UBThumbnail::muteStyleOption(option);
- QGraphicsSvgItem::paint(painter, &styleOption, widget);
- }
-
- virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value)
- {
- UBThumbnail::itemChange(this, change, value);
- return QGraphicsSvgItem::itemChange(change, value);
- }
-
-};
-
-
-class UBThumbnailPixmap : public QGraphicsPixmapItem, public UBThumbnail
-{
- public:
- UBThumbnailPixmap(const QPixmap& pix)
- : QGraphicsPixmapItem(pix)
- {
- setTransformationMode(Qt::SmoothTransformation); // UB 4.3 may be expensive -- make configurable
- setShapeMode(QGraphicsPixmapItem::BoundingRectShape);
- setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
- }
-
- virtual ~UBThumbnailPixmap()
- {
- // NOOP
- }
-
- virtual QPainterPath shape () const
- {
- QPainterPath path;
- path.addRect(boundingRect());
- return path;
- }
-
-
- virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
- {
- QStyleOptionGraphicsItem styleOption = UBThumbnail::muteStyleOption(option);
- QGraphicsPixmapItem::paint(painter, &styleOption, widget);
- }
-
- virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value)
- {
- UBThumbnail::itemChange(this, change, value);
- return QGraphicsPixmapItem::itemChange(change, value);
- }
-};
-
-
-class UBSceneThumbnailPixmap : public UBThumbnailPixmap
-{
- public:
- UBSceneThumbnailPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex)
- : UBThumbnailPixmap(pix)
- , mProxy(proxy)
- , mSceneIndex(pSceneIndex)
- {
- // NOOP
- }
-
- virtual ~UBSceneThumbnailPixmap()
- {
- // NOOP
- }
-
- UBDocumentProxy* proxy()
- {
- return mProxy;
- }
-
- int sceneIndex()
- {
- return mSceneIndex;
- }
-
- void highlight()
- {
- //NOOP
- }
-
- private:
- UBDocumentProxy* mProxy;
- int mSceneIndex;
-};
-
-class UBSceneThumbnailNavigPixmap : public UBSceneThumbnailPixmap
-{
- public:
- UBSceneThumbnailNavigPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex);
- ~UBSceneThumbnailNavigPixmap();
-
- protected:
- void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
- void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
- void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
- void mousePressEvent(QGraphicsSceneMouseEvent *event);
-
- private:
- void updateButtonsState();
- void deletePage();
- void moveUpPage();
- void moveDownPage();
-
- bool bButtonsVisible;
- bool bCanDelete;
- bool bCanMoveUp;
- bool bCanMoveDown;
-};
-
-class UBThumbnailVideo : public UBThumbnailPixmap
-{
- public:
- UBThumbnailVideo(const QUrl &path)
- : UBThumbnailPixmap(QPixmap(":/images/movie.svg"))
- , mPath(path)
- {
- // NOOP
- }
-
- virtual ~UBThumbnailVideo()
- {
- // NOOP
- }
-
- QUrl path()
- {
- return mPath;
- }
-
- private:
-
- QUrl mPath;
-};
-
-class UBThumbnailTextItem : public QGraphicsTextItem
-{
- public:
- UBThumbnailTextItem(const QString& text)
- : QGraphicsTextItem(text)
- , mUnelidedText(text)
- , mIsHighlighted(false)
- {
- setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
- }
-
- QRectF boundingRect() const { return QRectF(QPointF(0.0, 0.0), QSize(mWidth, QFontMetricsF(font()).height() + 5));}
-
- void setWidth(qreal pWidth)
- {
- if (mWidth != pWidth)
- {
- prepareGeometryChange();
- mWidth = pWidth;
- computeText();
- }
- };
-
- qreal width() {return mWidth;}
-
- void highlight()
- {
- if (!mIsHighlighted)
- {
- mIsHighlighted = true;
- computeText();
- }
- }
-
- void computeText()
- {
- QFontMetricsF fm(font());
- QString elidedText = fm.elidedText(mUnelidedText, Qt::ElideRight, mWidth);
-
- if (mIsHighlighted)
- {
- setHtml("" + elidedText + "");
- }
- else
- {
- setPlainText(elidedText);
- }
- }
-
- private:
- qreal mWidth;
- QString mUnelidedText;
- bool mIsHighlighted;
-};
-
-class UBImgTextThumbnailElement
-{
-private:
- QGraphicsItem* thumbnail;
- UBThumbnailTextItem* caption;
- int border;
-
-public:
- UBImgTextThumbnailElement(QGraphicsItem* thumb, UBThumbnailTextItem* text): border(0)
- {
- this->thumbnail = thumb;
- this->caption = text;
- }
-
- QGraphicsItem* getThumbnail() const { return this->thumbnail; }
- void setThumbnail(QGraphicsItem* newGItem) { this->thumbnail = newGItem; }
-
- UBThumbnailTextItem* getCaption() const { return this->caption; }
- void setCaption(UBThumbnailTextItem* newcaption) { this->caption = newcaption; }
-
- void Place(int row, int col, qreal width, qreal height);
-
- int getBorder() const { return this->border; }
- void setBorder(int newBorder) { this->border = newBorder; }
-};
-
-
-#endif /* UBTHUMBNAILWIDGET_H_ */
+/*
+ * 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 .
+ */
+
+#ifndef UBTHUMBNAILWIDGET_H_
+#define UBTHUMBNAILWIDGET_H_
+
+#include
+#include
+#include
+#include
+
+#include "frameworks/UBCoreGraphicsScene.h"
+#include "core/UBSettings.h"
+#include "domain/UBItem.h"
+
+#define STARTDRAGTIME 1000000
+#define BUTTONSIZE 48
+#define BUTTONSPACING 5
+
+class UBDocumentProxy;
+class UBThumbnailTextItem;
+class UBThumbnail;
+
+class UBThumbnailWidget : public QGraphicsView
+{
+ Q_OBJECT;
+
+ public:
+ UBThumbnailWidget(QWidget* parent);
+ virtual ~UBThumbnailWidget();
+
+ QList selectedItems();
+ void selectItemAt(int pIndex, bool extend = false);
+ void unselectItemAt(int pIndex);
+
+ qreal thumbnailWidth()
+ {
+ return mThumbnailWidth;
+ }
+
+ void setBackgroundBrush(const QBrush& brush)
+ {
+ mThumbnailsScene.setBackgroundBrush(brush);
+ }
+
+ public slots:
+ void setThumbnailWidth(qreal pThumbnailWidth);
+ void setSpacing(qreal pSpacing);
+ virtual void setGraphicsItems(const QList& pGraphicsItems, const QList& pItemPaths, const QStringList pLabels = QStringList(), const QString& pMimeType = QString(""));
+ void refreshScene();
+ void sceneSelectionChanged();
+
+ signals:
+ void resized();
+ void selectionChanged();
+ void mouseDoubleClick(QGraphicsItem* item, int index);
+ void mouseClick(QGraphicsItem* item, int index);
+
+
+ protected:
+ virtual void mousePressEvent(QMouseEvent *event);
+ virtual void mouseMoveEvent(QMouseEvent *event);
+ virtual void mouseReleaseEvent(QMouseEvent *event);
+ virtual void resizeEvent(QResizeEvent * event);
+ void mouseDoubleClickEvent(QMouseEvent * event);
+
+ virtual void keyPressEvent(QKeyEvent *event);
+ virtual void focusInEvent(QFocusEvent *event);
+
+ QList mGraphicItems;
+ QList mLabelsItems;
+ QPointF mMousePressScenePos;
+ QPoint mMousePressPos;
+
+ protected:
+ qreal spacing() { return mSpacing; }
+ QList mItemsPaths;
+ QStringList mLabels;
+ bool bSelectionInProgress;
+ bool bCanDrag;
+
+ private:
+ void selectAll();
+ void selectItems(int startIndex, int count);
+ int rowCount() const;
+ int columnCount() const;
+
+ static bool thumbnailLessThan(QGraphicsItem* item1, QGraphicsItem* item2);
+
+ void deleteLasso();
+
+ UBCoreGraphicsScene mThumbnailsScene;
+
+ QString mMimeType;
+
+ QPointF prevMoveMousePos;
+
+ qreal mThumbnailWidth;
+ qreal mThumbnailHeight;
+ qreal mSpacing;
+
+ UBThumbnail *mLastSelectedThumbnail;
+ int mSelectionSpan;
+ QGraphicsRectItem *mLassoRectItem;
+ QSet mSelectedThumbnailItems;
+ QSet mPreviouslyIncrementalSelectedItems;
+ QTime mClickTime;
+};
+
+
+class UBThumbnail
+{
+ public:
+ UBThumbnail();
+
+ virtual ~UBThumbnail();
+
+ QStyleOptionGraphicsItem muteStyleOption(const QStyleOptionGraphicsItem *option)
+ {
+ // Never draw the rubber band, we draw our custom selection with the DelegateFrame
+ QStyleOptionGraphicsItem styleOption = QStyleOptionGraphicsItem(*option);
+ styleOption.state &= ~QStyle::State_Selected;
+
+ return styleOption;
+ }
+
+ virtual void itemChange(QGraphicsItem *item, QGraphicsItem::GraphicsItemChange change, const QVariant &value)
+ {
+ Q_UNUSED(value);
+
+ if ((change == QGraphicsItem::ItemSelectedHasChanged
+ || change == QGraphicsItem::ItemTransformHasChanged
+ || change == QGraphicsItem::ItemPositionHasChanged)
+ && item->scene())
+ {
+ if (item->isSelected())
+ {
+ if (!mSelectionItem->scene())
+ {
+ item->scene()->addItem(mSelectionItem);
+ mSelectionItem->setZValue(item->zValue() - 1);
+// UBGraphicsItem::assignZValue(mSelectionItem, item->zValue() - 1);
+ mAddedToScene = true;
+ }
+
+ mSelectionItem->setRect(
+ item->sceneBoundingRect().x() - 5,
+ item->sceneBoundingRect().y() - 5,
+ item->sceneBoundingRect().width() + 10,
+ item->sceneBoundingRect().height() + 10);
+
+ mSelectionItem->show();
+
+ }
+ else
+ {
+ mSelectionItem->hide();
+ }
+ }
+ }
+
+ int column() { return mColumn; }
+ void setColumn(int column) { mColumn = column; }
+ int row() { return mRow; }
+ void setRow(int row) { mRow = row; }
+
+ protected:
+ QGraphicsRectItem *mSelectionItem;
+ private:
+ bool mAddedToScene;
+
+ int mColumn;
+ int mRow;
+};
+
+
+class UBThumbnailSvg : public QGraphicsSvgItem, public UBThumbnail
+{
+ public:
+ UBThumbnailSvg(const QString& path)
+ : QGraphicsSvgItem(path)
+ {
+ setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
+ }
+
+ virtual ~UBThumbnailSvg()
+ {
+ // NOOP
+ }
+
+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+ {
+ QStyleOptionGraphicsItem styleOption = UBThumbnail::muteStyleOption(option);
+ QGraphicsSvgItem::paint(painter, &styleOption, widget);
+ }
+
+ virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value)
+ {
+ UBThumbnail::itemChange(this, change, value);
+ return QGraphicsSvgItem::itemChange(change, value);
+ }
+
+};
+
+
+class UBThumbnailPixmap : public QGraphicsPixmapItem, public UBThumbnail
+{
+ public:
+ UBThumbnailPixmap(const QPixmap& pix)
+ : QGraphicsPixmapItem(pix)
+ {
+ setTransformationMode(Qt::SmoothTransformation); // UB 4.3 may be expensive -- make configurable
+ setShapeMode(QGraphicsPixmapItem::BoundingRectShape);
+ setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
+ }
+
+ virtual ~UBThumbnailPixmap()
+ {
+ // NOOP
+ }
+
+ virtual QPainterPath shape () const
+ {
+ QPainterPath path;
+ path.addRect(boundingRect());
+ return path;
+ }
+
+
+ virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+ {
+ QStyleOptionGraphicsItem styleOption = UBThumbnail::muteStyleOption(option);
+ QGraphicsPixmapItem::paint(painter, &styleOption, widget);
+ }
+
+ virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value)
+ {
+ UBThumbnail::itemChange(this, change, value);
+ return QGraphicsPixmapItem::itemChange(change, value);
+ }
+};
+
+
+class UBSceneThumbnailPixmap : public UBThumbnailPixmap
+{
+ public:
+ UBSceneThumbnailPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex)
+ : UBThumbnailPixmap(pix)
+ , mProxy(proxy)
+ , mSceneIndex(pSceneIndex)
+ {
+ // NOOP
+ }
+
+ virtual ~UBSceneThumbnailPixmap()
+ {
+ // NOOP
+ }
+
+ UBDocumentProxy* proxy()
+ {
+ return mProxy;
+ }
+
+ int sceneIndex()
+ {
+ return mSceneIndex;
+ }
+
+ void highlight()
+ {
+ //NOOP
+ }
+
+ private:
+ UBDocumentProxy* mProxy;
+ int mSceneIndex;
+};
+
+class UBSceneThumbnailNavigPixmap : public UBSceneThumbnailPixmap
+{
+ public:
+ UBSceneThumbnailNavigPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex);
+ ~UBSceneThumbnailNavigPixmap();
+
+ protected:
+ void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
+ void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
+ void mousePressEvent(QGraphicsSceneMouseEvent *event);
+
+ private:
+ void updateButtonsState();
+ void deletePage();
+ void moveUpPage();
+ void moveDownPage();
+
+ bool bButtonsVisible;
+ bool bCanDelete;
+ bool bCanMoveUp;
+ bool bCanMoveDown;
+};
+
+class UBThumbnailVideo : public UBThumbnailPixmap
+{
+ public:
+ UBThumbnailVideo(const QUrl &path)
+ : UBThumbnailPixmap(QPixmap(":/images/movie.svg"))
+ , mPath(path)
+ {
+ // NOOP
+ }
+
+ virtual ~UBThumbnailVideo()
+ {
+ // NOOP
+ }
+
+ QUrl path()
+ {
+ return mPath;
+ }
+
+ private:
+
+ QUrl mPath;
+};
+
+class UBThumbnailTextItem : public QGraphicsTextItem
+{
+ public:
+ UBThumbnailTextItem(const QString& text)
+ : QGraphicsTextItem(text)
+ , mUnelidedText(text)
+ , mIsHighlighted(false)
+ {
+ setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
+ }
+
+ QRectF boundingRect() const { return QRectF(QPointF(0.0, 0.0), QSize(mWidth, QFontMetricsF(font()).height() + 5));}
+
+ void setWidth(qreal pWidth)
+ {
+ if (mWidth != pWidth)
+ {
+ prepareGeometryChange();
+ mWidth = pWidth;
+ computeText();
+ }
+ };
+
+ qreal width() {return mWidth;}
+
+ void highlight()
+ {
+ if (!mIsHighlighted)
+ {
+ mIsHighlighted = true;
+ computeText();
+ }
+ }
+
+ void computeText()
+ {
+ QFontMetricsF fm(font());
+ QString elidedText = fm.elidedText(mUnelidedText, Qt::ElideRight, mWidth);
+
+ if (mIsHighlighted)
+ {
+ setHtml("" + elidedText + "");
+ }
+ else
+ {
+ setPlainText(elidedText);
+ }
+ }
+
+ private:
+ qreal mWidth;
+ QString mUnelidedText;
+ bool mIsHighlighted;
+};
+
+class UBImgTextThumbnailElement
+{
+private:
+ QGraphicsItem* thumbnail;
+ UBThumbnailTextItem* caption;
+ int border;
+
+public:
+ UBImgTextThumbnailElement(QGraphicsItem* thumb, UBThumbnailTextItem* text): border(0)
+ {
+ this->thumbnail = thumb;
+ this->caption = text;
+ }
+
+ QGraphicsItem* getThumbnail() const { return this->thumbnail; }
+ void setThumbnail(QGraphicsItem* newGItem) { this->thumbnail = newGItem; }
+
+ UBThumbnailTextItem* getCaption() const { return this->caption; }
+ void setCaption(UBThumbnailTextItem* newcaption) { this->caption = newcaption; }
+
+ void Place(int row, int col, qreal width, qreal height);
+
+ int getBorder() const { return this->border; }
+ void setBorder(int newBorder) { this->border = newBorder; }
+};
+
+
+#endif /* UBTHUMBNAILWIDGET_H_ */
diff --git a/src/gui/gui.pri b/src/gui/gui.pri
index ed0c9c4c..a901409f 100644
--- a/src/gui/gui.pri
+++ b/src/gui/gui.pri
@@ -46,7 +46,11 @@ HEADERS += src/gui/UBThumbnailView.h \
src/gui/UBLibWebView.h \
src/gui/UBDownloadWidget.h \
src/gui/UBDockDownloadWidget.h \
- src/gui/UBMediaPlayer.h
+ src/gui/UBDockTeacherGuideWidget.h \
+ src/gui/UBTeacherGuideWidget.h \
+ src/gui/UBTeacherGuideWidgetsTools.h \
+ src/gui/UBTeacherGuideDelegate.h \
+ src/gui/UBTGWidgetTreeDelegate.h
SOURCES += src/gui/UBThumbnailView.cpp \
src/gui/UBFloatingPalette.cpp \
@@ -95,7 +99,11 @@ SOURCES += src/gui/UBThumbnailView.cpp \
src/gui/UBLibWebView.cpp \
src/gui/UBDownloadWidget.cpp \
src/gui/UBDockDownloadWidget.cpp \
- src/gui/UBMediaPlayer.cpp
+ src/gui/UBDockTeacherGuideWidget.cpp \
+ src/gui/UBTeacherGuideWidget.cpp \
+ src/gui/UBTeacherGuideWidgetsTools.cpp \
+ src/gui/UBTeacherGuideDelegate.cpp \
+ src/gui/UBTGWidgetTreeDelegate.cpp
win32 {
@@ -123,15 +131,3 @@ linux-g++-64 {
SOURCES += src/gui/UBKeyboardPalette_linux.cpp
}
-
-
-
-
-
-
-
-
-
-
-
-