Commit 33d2bfab authored by shibakaneki's avatar shibakaneki

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

parents 368a4dc5 8238b22e
...@@ -639,29 +639,30 @@ QDomElement UBCFFAdaptor::UBToCFFConverter::parseSvgPageSection(const QDomElemen ...@@ -639,29 +639,30 @@ QDomElement UBCFFAdaptor::UBToCFFConverter::parseSvgPageSection(const QDomElemen
void UBCFFAdaptor::UBToCFFConverter::writeQDomElementToXML(const QDomNode &node) void UBCFFAdaptor::UBToCFFConverter::writeQDomElementToXML(const QDomNode &node)
{ {
if (!node.isNull()) if (!node.isNull()){
if (node.isText()) 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++)
{ {
QDomAttr attr = node.toElement().attributes().item(i).toAttr(); mIWBContentWriter->writeCharacters(node.nodeValue());
mIWBContentWriter->writeAttribute(attr.name(), attr.value());
} }
QDomNode child = node.firstChild(); else
while(!child.isNull())
{ {
writeQDomElementToXML(child); mIWBContentWriter->writeStartElement(node.namespaceURI(), node.toElement().tagName());
child = child.nextSibling();
}
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() bool UBCFFAdaptor::UBToCFFConverter::writeExtendedIwbSection()
...@@ -1322,7 +1323,7 @@ QDomNode UBCFFAdaptor::UBToCFFConverter::findNodeByTagName(const QDomNode &node, ...@@ -1322,7 +1323,7 @@ QDomNode UBCFFAdaptor::UBToCFFConverter::findNodeByTagName(const QDomNode &node,
if (!iterNode.firstChildElement().isNull()) if (!iterNode.firstChildElement().isNull())
{ {
QDomNode foundNode = findNodeByTagName(iterNode.firstChildElement(), tagName); QDomNode foundNode = findNodeByTagName(iterNode.firstChildElement(), tagName);
if (!foundNode.isNull()) if (!foundNode.isNull()){
if (foundNode.isElement()) if (foundNode.isElement())
{ {
if (tagName == foundNode.toElement().tagName()) if (tagName == foundNode.toElement().tagName())
...@@ -1330,6 +1331,7 @@ QDomNode UBCFFAdaptor::UBToCFFConverter::findNodeByTagName(const QDomNode &node, ...@@ -1330,6 +1331,7 @@ QDomNode UBCFFAdaptor::UBToCFFConverter::findNodeByTagName(const QDomNode &node,
} }
else else
break; break;
}
} }
} }
......
...@@ -347,5 +347,10 @@ ...@@ -347,5 +347,10 @@
<file>images/licenses/ccbyncsa.png</file> <file>images/licenses/ccbyncsa.png</file>
<file>images/licenses/ccbynd.png</file> <file>images/licenses/ccbynd.png</file>
<file>images/licenses/ccbysa.png</file> <file>images/licenses/ccbysa.png</file>
<file>images/teacherGuide/audio.png</file>
<file>images/teacherGuide/image.png</file>
<file>images/teacherGuide/link.png</file>
<file>images/teacherGuide/movie.png</file>
<file>images/teacherGuide/w3c.png</file>
</qresource> </qresource>
</RCC> </RCC>
...@@ -4,22 +4,13 @@ QWidget#UBLibPathViewer, ...@@ -4,22 +4,13 @@ QWidget#UBLibPathViewer,
QWidget#UBLibNavigatorWidget, QWidget#UBLibNavigatorWidget,
QWidget#UBLibItemProperties, QWidget#UBLibItemProperties,
QWidget#UBDownloadWidget, QWidget#UBDownloadWidget,
QWidget#UBWidgetList, QWidget#UBTeacherGuideWidget
QWidget#UBTeacherBarDropMediaZone,
QWidget#UBTBMediaContainer
{ {
background: #EEEEEE; background: #EEEEEE;
border-radius: 10px; border-radius: 10px;
border: 2px solid #999999; border: 2px solid #999999;
} }
QFrame#UBTBSeparator
{
background: #DDDDDD;
border-radius: 2px;
border: 1px solid #DDDDDD;
}
QWidget#UBMediaVideoContainer QWidget#UBMediaVideoContainer
{ {
background: #000000; background: #000000;
...@@ -27,40 +18,6 @@ QWidget#UBMediaVideoContainer ...@@ -27,40 +18,6 @@ QWidget#UBMediaVideoContainer
border: 2px solid #999999; 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 QWidget#UBLibWebView
{ {
background: #EEEEEE; background: #EEEEEE;
...@@ -68,30 +25,6 @@ QWidget#UBLibWebView ...@@ -68,30 +25,6 @@ QWidget#UBLibWebView
border: 2px solid #999999; 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 QWebView#SearchEngineView
{ {
background:white; background:white;
...@@ -109,9 +42,11 @@ QLabel#DockPaletteWidgetTitle ...@@ -109,9 +42,11 @@ QLabel#DockPaletteWidgetTitle
font-weight:bold; font-weight:bold;
} }
QLineEdit#DockPaletteWidgetLineEdit QLineEdit#UBTGLineEdit,
QLabel#UBTGMediaDropMeLabel
{ {
background: white; background: white;
border: 1 solid #999999;
border-radius : 10px; border-radius : 10px;
padding: 2px; padding: 2px;
} }
...@@ -268,4 +203,59 @@ QSlider::groove::horizontal ...@@ -268,4 +203,59 @@ QSlider::groove::horizontal
height:10px; height:10px;
border-radius:5px; border-radius:5px;
border:1px solid #555555; 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;
}
...@@ -191,7 +191,7 @@ UBDocumentProxy* UBImportDocument::importFile(const QFile& pFile, const QString& ...@@ -191,7 +191,7 @@ UBDocumentProxy* UBImportDocument::importFile(const QFile& pFile, const QString&
return 0; return 0;
} }
else{ else{
UBDocumentProxy* newDocument = UBPersistenceManager::persistenceManager()->createDocumentFromDir(documentRootFolder); UBDocumentProxy* newDocument = UBPersistenceManager::persistenceManager()->createDocumentFromDir(documentRootFolder, pGroup);
UBApplication::showMessage(tr("Import successful.")); UBApplication::showMessage(tr("Import successful."));
return newDocument; return newDocument;
} }
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#include "gui/UBZoomPalette.h" #include "gui/UBZoomPalette.h"
#include "gui/UBActionPalette.h" #include "gui/UBActionPalette.h"
#include "gui/UBFavoriteToolPalette.h" #include "gui/UBFavoriteToolPalette.h"
#include "gui/UBDockTeacherGuideWidget.h"
#include "web/UBWebPage.h" #include "web/UBWebPage.h"
...@@ -84,6 +85,7 @@ UBBoardPaletteManager::UBBoardPaletteManager(QWidget* container, UBBoardControll ...@@ -84,6 +85,7 @@ UBBoardPaletteManager::UBBoardPaletteManager(QWidget* container, UBBoardControll
, mpCachePropWidget(NULL) , mpCachePropWidget(NULL)
, mpDownloadWidget(NULL) , mpDownloadWidget(NULL)
, mpDesktopLibWidget(NULL) , mpDesktopLibWidget(NULL)
, mpTeacherGuideWidget(NULL)
, mDownloadInProgress(false) , mDownloadInProgress(false)
{ {
setupPalettes(); setupPalettes();
...@@ -135,6 +137,7 @@ void UBBoardPaletteManager::setupDockPaletteWidgets() ...@@ -135,6 +137,7 @@ void UBBoardPaletteManager::setupDockPaletteWidgets()
mpCachePropWidget = new UBCachePropertiesWidget(); mpCachePropWidget = new UBCachePropertiesWidget();
mpDownloadWidget = new UBDockDownloadWidget(); mpDownloadWidget = new UBDockDownloadWidget();
mpTeacherGuideWidget = new UBDockTeacherGuideWidget();
// Add the dock palettes // Add the dock palettes
mLeftPalette = new UBLeftPalette(mContainer); mLeftPalette = new UBLeftPalette(mContainer);
...@@ -143,6 +146,9 @@ void UBBoardPaletteManager::setupDockPaletteWidgets() ...@@ -143,6 +146,9 @@ void UBBoardPaletteManager::setupDockPaletteWidgets()
mLeftPalette->registerWidget(mpPageNavigWidget); mLeftPalette->registerWidget(mpPageNavigWidget);
mLeftPalette->addTab(mpPageNavigWidget); mLeftPalette->addTab(mpPageNavigWidget);
mLeftPalette->registerWidget(mpTeacherGuideWidget);
mLeftPalette->addTab(mpTeacherGuideWidget);
mLeftPalette->connectSignals(); mLeftPalette->connectSignals();
mRightPalette = new UBRightPalette(mContainer); mRightPalette = new UBRightPalette(mContainer);
...@@ -170,7 +176,7 @@ void UBBoardPaletteManager::slot_changeMainMode(UBApplicationController::MainMod ...@@ -170,7 +176,7 @@ void UBBoardPaletteManager::slot_changeMainMode(UBApplicationController::MainMod
switch( mainMode ) switch( mainMode )
{ {
case UBApplicationController::Board: case UBApplicationController::Board:
{ {
// call changeMode only when switch NOT from desktop mode // call changeMode only when switch NOT from desktop mode
if(!UBApplication::applicationController->isShowingDesktop()) if(!UBApplication::applicationController->isShowingDesktop())
...@@ -205,7 +211,7 @@ void UBBoardPaletteManager::slot_changeMainMode(UBApplicationController::MainMod ...@@ -205,7 +211,7 @@ void UBBoardPaletteManager::slot_changeMainMode(UBApplicationController::MainMod
void UBBoardPaletteManager::slot_changeDesktopMode(bool isDesktop) void UBBoardPaletteManager::slot_changeDesktopMode(bool isDesktop)
{ {
UBApplicationController::MainMode currMode = UBApplication::applicationController->displayMode(); UBApplicationController::MainMode currMode = UBApplication::applicationController->displayMode();
if(!isDesktop) if(!isDesktop)
{ {
switch( currMode ) switch( currMode )
{ {
...@@ -232,6 +238,7 @@ void UBBoardPaletteManager::setupPalettes() ...@@ -232,6 +238,7 @@ void UBBoardPaletteManager::setupPalettes()
#endif #endif
} }
setupDockPaletteWidgets(); setupDockPaletteWidgets();
...@@ -735,8 +742,8 @@ void UBBoardPaletteManager::changeMode(eUBDockPaletteWidgetMode newMode, bool is ...@@ -735,8 +742,8 @@ void UBBoardPaletteManager::changeMode(eUBDockPaletteWidgetMode newMode, bool is
mKeyboardPalette->show(); mKeyboardPalette->show();
} }
else else
mKeyboardPalette->setParent(UBApplication::documentController->controlView()); mKeyboardPalette->setParent(UBApplication::documentController->controlView());
} }
} }
break; break;
...@@ -787,7 +794,7 @@ void UBBoardPaletteManager::addItem(const QPixmap& pPixmap, const QPointF& pos, ...@@ -787,7 +794,7 @@ void UBBoardPaletteManager::addItem(const QPixmap& pPixmap, const QPointF& pos,
void UBBoardPaletteManager::addItemToCurrentPage() void UBBoardPaletteManager::addItemToCurrentPage()
{ {
UBApplication::applicationController->showBoard(); UBApplication::applicationController->showBoard();
mAddItemPalette->hide(); mAddItemPalette->hide();
if(mPixmap.isNull()) if(mPixmap.isNull())
UBApplication::boardController->downloadURL(mItemUrl); UBApplication::boardController->downloadURL(mItemUrl);
......
...@@ -40,6 +40,7 @@ class UBServerXMLHttpRequest; ...@@ -40,6 +40,7 @@ class UBServerXMLHttpRequest;
class UBKeyboardPalette; class UBKeyboardPalette;
class UBMainWindow; class UBMainWindow;
class UBApplicationController; class UBApplicationController;
class UBDockTeacherGuideWidget;
class UBBoardPaletteManager : public QObject class UBBoardPaletteManager : public QObject
{ {
...@@ -52,6 +53,7 @@ class UBBoardPaletteManager : public QObject ...@@ -52,6 +53,7 @@ class UBBoardPaletteManager : public QObject
void setupLayout(); void setupLayout();
UBLeftPalette* leftPalette(){return mLeftPalette;} UBLeftPalette* leftPalette(){return mLeftPalette;}
UBRightPalette* rightPalette(){return mRightPalette;} UBRightPalette* rightPalette(){return mRightPalette;}
UBStylusPalette* stylusPalette(){return mStylusPalette;}
void showVirtualKeyboard(bool show = true); void showVirtualKeyboard(bool show = true);
void initPalettesPosAtStartup(); void initPalettesPosAtStartup();
void connectToDocumentController(); void connectToDocumentController();
...@@ -134,6 +136,8 @@ class UBBoardPaletteManager : public QObject ...@@ -134,6 +136,8 @@ class UBBoardPaletteManager : public QObject
// lib widget! // lib widget!
UBLibWidget* mpDesktopLibWidget; UBLibWidget* mpDesktopLibWidget;
UBDockTeacherGuideWidget* mpTeacherGuideWidget;
bool mDownloadInProgress; bool mDownloadInProgress;
private slots: private slots:
......
...@@ -35,8 +35,8 @@ ...@@ -35,8 +35,8 @@
#include "gui/UBToolWidget.h" #include "gui/UBToolWidget.h"
#include "gui/UBResources.h" #include "gui/UBResources.h"
#include "gui/UBMainWindow.h" #include "gui/UBMainWindow.h"
#include "gui/UBMediaPlayer.h"
#include "gui/UBThumbnailWidget.h" #include "gui/UBThumbnailWidget.h"
#include "gui/UBTeacherGuideWidgetsTools.h"
#include "board/UBBoardController.h" #include "board/UBBoardController.h"
...@@ -49,9 +49,6 @@ ...@@ -49,9 +49,6 @@
#include "document/UBDocumentProxy.h" #include "document/UBDocumentProxy.h"
#include "customWidgets/UBDraggableLabel.h"
#include "customWidgets/UBDraggableMedia.h"
#include "tools/UBGraphicsCompass.h" #include "tools/UBGraphicsCompass.h"
#include "tools/UBGraphicsCache.h" #include "tools/UBGraphicsCache.h"
#include "tools/UBGraphicsTriangle.h" #include "tools/UBGraphicsTriangle.h"
...@@ -379,41 +376,43 @@ void UBBoardView::tabletEvent (QTabletEvent * event) ...@@ -379,41 +376,43 @@ void UBBoardView::tabletEvent (QTabletEvent * event)
} }
void void UBBoardView::mousePressEvent (QMouseEvent *event)
UBBoardView::mousePressEvent (QMouseEvent *event)
{ {
if (isAbsurdPoint (event->pos ())) if (isAbsurdPoint (event->pos ()))
{ {
event->accept (); event->accept ();
return; 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) UBStylusTool::Enum currentTool = (UBStylusTool::Enum)UBDrawingController::drawingController ()->stylusTool ();
mMouseButtonIsPressed = true;
if (currentTool == UBStylusTool::ZoomIn) if (!mTabletStylusIsPressed)
mMouseButtonIsPressed = true;
if (currentTool == UBStylusTool::ZoomIn)
{ {
mController->zoomIn (mapToScene (event->pos ())); mController->zoomIn (mapToScene (event->pos ()));
event->accept (); event->accept ();
} }
else if (currentTool == UBStylusTool::ZoomOut) else if (currentTool == UBStylusTool::ZoomOut)
{ {
mController->zoomOut (mapToScene (event->pos ())); mController->zoomOut (mapToScene (event->pos ()));
event->accept (); event->accept ();
} }
else if (currentTool == UBStylusTool::Hand) else if (currentTool == UBStylusTool::Hand)
{ {
viewport ()->setCursor (QCursor (Qt::ClosedHandCursor)); viewport ()->setCursor (QCursor (Qt::ClosedHandCursor));
mPreviousPoint = event->posF (); mPreviousPoint = event->posF ();
event->accept (); event->accept ();
} }
else if (currentTool == UBStylusTool::Selector) else if (currentTool == UBStylusTool::Selector)
{ {
QSet<QGraphicsItem*> existingTools = scene()->tools(); QSet<QGraphicsItem*> existingTools = scene()->tools();
...@@ -443,67 +442,67 @@ UBBoardView::mousePressEvent (QMouseEvent *event) ...@@ -443,67 +442,67 @@ UBBoardView::mousePressEvent (QMouseEvent *event)
} }
suspendedMousePressEvent = new QMouseEvent(event->type(), event->pos(), event->button(), event->buttons(), event->modifiers()); // удалить suspendedMousePressEvent = new QMouseEvent(event->type(), event->pos(), event->button(), event->buttons(), event->modifiers()); // удалить
} }
event->accept(); event->accept();
} }
else if (currentTool == UBStylusTool::Text) else if (currentTool == UBStylusTool::Text)
{ {
int frameWidth = UBSettings::settings ()->objectFrameWidth; int frameWidth = UBSettings::settings ()->objectFrameWidth;
QRectF fuzzyRect (0, 0, frameWidth * 4, frameWidth * 4); QRectF fuzzyRect (0, 0, frameWidth * 4, frameWidth * 4);
fuzzyRect.moveCenter (mapToScene (mMouseDownPos)); fuzzyRect.moveCenter (mapToScene (mMouseDownPos));
UBGraphicsTextItem* foundTextItem = 0; UBGraphicsTextItem* foundTextItem = 0;
QListIterator<QGraphicsItem *> it (scene ()->items (fuzzyRect)); QListIterator<QGraphicsItem *> it (scene ()->items (fuzzyRect));
while (it.hasNext () && !foundTextItem) while (it.hasNext () && !foundTextItem)
{ {
foundTextItem = qgraphicsitem_cast<UBGraphicsTextItem*>(it.next ()); foundTextItem = qgraphicsitem_cast<UBGraphicsTextItem*>(it.next ());
} }
if (foundTextItem) if (foundTextItem)
{ {
mIsCreatingTextZone = false; mIsCreatingTextZone = false;
QGraphicsView::mousePressEvent (event); QGraphicsView::mousePressEvent (event);
} }
else else
{ {
scene ()->deselectAllItems (); scene ()->deselectAllItems ();
if (!mRubberBand) if (!mRubberBand)
mRubberBand = new UBRubberBand (QRubberBand::Rectangle, this); mRubberBand = new UBRubberBand (QRubberBand::Rectangle, this);
mRubberBand->setGeometry (QRect (mMouseDownPos, QSize ())); mRubberBand->setGeometry (QRect (mMouseDownPos, QSize ()));
mRubberBand->show (); mRubberBand->show ();
mIsCreatingTextZone = true; mIsCreatingTextZone = true;
event->accept (); event->accept ();
} }
} }
else if (currentTool == UBStylusTool::Capture) else if (currentTool == UBStylusTool::Capture)
{ {
scene ()->deselectAllItems (); scene ()->deselectAllItems ();
if (!mRubberBand) if (!mRubberBand)
mRubberBand = new UBRubberBand (QRubberBand::Rectangle, this); mRubberBand = new UBRubberBand (QRubberBand::Rectangle, this);
mRubberBand->setGeometry (QRect (mMouseDownPos, QSize ())); mRubberBand->setGeometry (QRect (mMouseDownPos, QSize ()));
mRubberBand->show (); mRubberBand->show ();
mIsCreatingSceneGrabZone = true; 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) if (scene () && !mTabletStylusIsPressed)
{ {
scene ()->inputDevicePress (mapToScene (UBGeometryUtils::pointConstrainedInRect (event->pos (), rect ()))); scene ()->inputDevicePress (mapToScene (UBGeometryUtils::pointConstrainedInRect (event->pos (), rect ())));
} }
event->accept (); event->accept ();
} }
} }
} }
...@@ -533,7 +532,7 @@ UBBoardView::mouseMoveEvent (QMouseEvent *event) ...@@ -533,7 +532,7 @@ UBBoardView::mouseMoveEvent (QMouseEvent *event)
if((event->pos() - mLastPressedMousePos).manhattanLength() < QApplication::startDragDistance()) { if((event->pos() - mLastPressedMousePos).manhattanLength() < QApplication::startDragDistance()) {
return; return;
} }
if (movingItem && (mMouseButtonIsPressed || mTabletStylusIsPressed)) if (movingItem && (mMouseButtonIsPressed || mTabletStylusIsPressed))
{ {
QPointF scenePos = mapToScene(event->pos()); QPointF scenePos = mapToScene(event->pos());
...@@ -591,7 +590,7 @@ UBBoardView::mouseReleaseEvent (QMouseEvent *event) ...@@ -591,7 +590,7 @@ UBBoardView::mouseReleaseEvent (QMouseEvent *event)
mWidgetMoved = false; mWidgetMoved = false;
movingItem = NULL; movingItem = NULL;
} }
else if (movingItem && suspendedMousePressEvent) else if (movingItem && suspendedMousePressEvent)
{ {
QGraphicsView::mousePressEvent(suspendedMousePressEvent); // suspendedMousePressEvent is deleted by old Qt event loop QGraphicsView::mousePressEvent(suspendedMousePressEvent); // suspendedMousePressEvent is deleted by old Qt event loop
movingItem = NULL; movingItem = NULL;
...@@ -703,7 +702,7 @@ UBBoardView::wheelEvent (QWheelEvent *wheelEvent) ...@@ -703,7 +702,7 @@ UBBoardView::wheelEvent (QWheelEvent *wheelEvent)
QList<QGraphicsItem *> selItemsList = scene()->selectedItems(); QList<QGraphicsItem *> selItemsList = scene()->selectedItems();
// if NO have selected items, than no need process mouse wheel. just exist // 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 // only one selected item possible, so we will work with first item only
QGraphicsItem * selItem = selItemsList[0]; QGraphicsItem * selItem = selItemsList[0];
...@@ -711,7 +710,7 @@ UBBoardView::wheelEvent (QWheelEvent *wheelEvent) ...@@ -711,7 +710,7 @@ UBBoardView::wheelEvent (QWheelEvent *wheelEvent)
// get items list under mouse cursor // get items list under mouse cursor
QPointF scenePos = mapToScene(wheelEvent->pos()); QPointF scenePos = mapToScene(wheelEvent->pos());
QList<QGraphicsItem *> itemsList = scene()->items(scenePos); QList<QGraphicsItem *> itemsList = scene()->items(scenePos);
QBool isSlectedAndMouseHower = itemsList.contains(selItem); QBool isSlectedAndMouseHower = itemsList.contains(selItem);
if(isSlectedAndMouseHower) if(isSlectedAndMouseHower)
{ {
...@@ -765,11 +764,6 @@ UBBoardView::drawItems (QPainter *painter, int numItems, ...@@ -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) void UBBoardView::dragMoveEvent (QDragMoveEvent *event)
{ {
...@@ -806,15 +800,17 @@ void UBBoardView::dropEvent (QDropEvent *event) ...@@ -806,15 +800,17 @@ void UBBoardView::dropEvent (QDropEvent *event)
QGraphicsItem* graphicsItemAtPos = itemAt(event->pos().x(),event->pos().y()); QGraphicsItem* graphicsItemAtPos = itemAt(event->pos().x(),event->pos().y());
UBGraphicsWidgetItem* graphicsWidget = dynamic_cast<UBGraphicsWidgetItem*>(graphicsItemAtPos); UBGraphicsWidgetItem* graphicsWidget = dynamic_cast<UBGraphicsWidgetItem*>(graphicsItemAtPos);
if (graphicsWidget && graphicsWidget->acceptDrops()) { qDebug() << event->source();
if (graphicsWidget && graphicsWidget->acceptDrops()) {
graphicsWidget->processDropEvent(event); graphicsWidget->processDropEvent(event);
event->acceptProposedAction(); event->acceptProposedAction();
} else if (!event->source() || dynamic_cast<UBThumbnailWidget *>(event->source()) }
|| dynamic_cast<QWebView*>(event->source()) || dynamic_cast<UBDraggableMediaPlayer *>(event->source()) else if (!event->source()
|| dynamic_cast<UBDraggableLabel *>(event->source()) || dynamic_cast<UBDraggableMedia *>(event->source())) { || dynamic_cast<UBThumbnailWidget *>(event->source())
|| dynamic_cast<QWebView*>(event->source())
|| dynamic_cast<UBTGMediaWidget*>(event->source())) {
mController->processMimeData (event->mimeData (), mapToScene (event->pos ())); mController->processMimeData (event->mimeData (), mapToScene (event->pos ()));
event->acceptProposedAction(); event->acceptProposedAction();
} }
...@@ -966,7 +962,7 @@ UBBoardView::setToolCursor (int tool) ...@@ -966,7 +962,7 @@ UBBoardView::setToolCursor (int tool)
controlViewport->setCursor (UBResources::resources ()->penCursor); controlViewport->setCursor (UBResources::resources ()->penCursor);
break; break;
case UBStylusTool::Eraser: case UBStylusTool::Eraser:
controlViewport->setCursor (UBResources::resources ()->eraserCursor); controlViewport->setCursor (UBResources::resources ()->eraserCursor);
break; break;
case UBStylusTool::Marker: case UBStylusTool::Marker:
controlViewport->setCursor (UBResources::resources ()->markerCursor); controlViewport->setCursor (UBResources::resources ()->markerCursor);
......
...@@ -46,6 +46,7 @@ class UBBoardView : public QGraphicsView ...@@ -46,6 +46,7 @@ class UBBoardView : public QGraphicsView
void resized(QResizeEvent* event); void resized(QResizeEvent* event);
void hidden(); void hidden();
void shown(); void shown();
void clickOnBoard();
protected: protected:
......
...@@ -257,10 +257,10 @@ int UBApplication::exec(const QString& pFileToImport) ...@@ -257,10 +257,10 @@ int UBApplication::exec(const QString& pFileToImport)
applicationController = new UBApplicationController(boardController->controlView(), boardController->displayView(), mainWindow, staticMemoryCleaner); 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))); boardController->paletteManager(), SLOT(slot_changeMainMode(UBApplicationController::MainMode)));
connect(applicationController, SIGNAL(desktopMode(bool)), connect(applicationController, SIGNAL(desktopMode(bool)),
boardController->paletteManager(), SLOT(slot_changeDesktopMode(bool))); boardController->paletteManager(), SLOT(slot_changeDesktopMode(bool)));
...@@ -283,8 +283,8 @@ int UBApplication::exec(const QString& pFileToImport) ...@@ -283,8 +283,8 @@ int UBApplication::exec(const QString& pFileToImport)
connect(mainWindow->actionSankoreEditor, SIGNAL(triggered()), applicationController, SLOT(showSankoreEditor())); connect(mainWindow->actionSankoreEditor, SIGNAL(triggered()), applicationController, SLOT(showSankoreEditor()));
connect(mainWindow->actionCheckUpdate, SIGNAL(triggered()), applicationController, SLOT(checkUpdateRequest())); connect(mainWindow->actionCheckUpdate, SIGNAL(triggered()), applicationController, SLOT(checkUpdateRequest()));
toolBarPositionChanged(UBSettings::settings()->appToolBarPositionedAtTop->get()); toolBarPositionChanged(UBSettings::settings()->appToolBarPositionedAtTop->get());
bool bUseMultiScreen = UBSettings::settings()->appUseMultiscreen->get().toBool(); bool bUseMultiScreen = UBSettings::settings()->appUseMultiscreen->get().toBool();
...@@ -645,29 +645,13 @@ void UBStyle::drawItemText(QPainter *painter, const QRect &rect, int alignment, ...@@ -645,29 +645,13 @@ void UBStyle::drawItemText(QPainter *painter, const QRect &rect, int alignment,
painter->setPen(savedPen); 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 UBApplication::urlFromHtml(QString html)
{ {
QString _html; QString _html;
QRegExp comments("\\<![ \r\n\t]*(--([^\\-]|[\r\n]|-[^\\-])*--[ \r\n\t]*)\\>"); QRegExp comments("\\<![ \r\n\t]*(--([^\\-]|[\r\n]|-[^\\-])*--[ \r\n\t]*)\\>");
QString url; QString url;
QDomDocument domDoc; QDomDocument domDoc;
// We remove all the comments & CRLF of this html // We remove all the comments & CRLF of this html
_html = html.remove(comments); _html = html.remove(comments);
domDoc.setContent(_html.remove(QRegExp("[\\0]"))); domDoc.setContent(_html.remove(QRegExp("[\\0]")));
......
...@@ -78,7 +78,6 @@ class UBApplication : public QtSingleApplication ...@@ -78,7 +78,6 @@ class UBApplication : public QtSingleApplication
static void setDisabled(bool disable); static void setDisabled(bool disable);
static QObject* staticMemoryCleaner; static QObject* staticMemoryCleaner;
static QString globalStyleSheet();
void decorateActionMenu(QAction* action); void decorateActionMenu(QAction* action);
void insertSpaceToToolbarBeforeAction(QToolBar* toolbar, QAction* action, int width = -1); void insertSpaceToToolbarBeforeAction(QToolBar* toolbar, QAction* action, int width = -1);
......
...@@ -337,6 +337,9 @@ void UBApplicationController::showBoard() ...@@ -337,6 +337,9 @@ void UBApplicationController::showBoard()
mMainWindow->tutorialToolBar->hide(); mMainWindow->tutorialToolBar->hide();
mMainWindow->boardToolBar->show(); mMainWindow->boardToolBar->show();
if (mMainMode == Document && UBApplication::documentController->getSelectedItemIndex() != -1)
UBApplication::boardController->setActiveDocumentScene(UBApplication::documentController->getCurrentDocument(), UBApplication::documentController->getSelectedItemIndex());
mMainMode = Board; mMainMode = Board;
adaptToolBar(); adaptToolBar();
......
...@@ -254,13 +254,23 @@ UBDocumentProxy* UBPersistenceManager::createDocument(const QString& pGroupName, ...@@ -254,13 +254,23 @@ UBDocumentProxy* UBPersistenceManager::createDocument(const QString& pGroupName,
return doc; return doc;
} }
UBDocumentProxy* UBPersistenceManager::createDocumentFromDir(const QString& pDocumentDirectory, const QString& pGroupName, const QString& pName, bool withEmptyPage)
UBDocumentProxy* UBPersistenceManager::createDocumentFromDir(const QString& pDocumentDirectory)
{ {
checkIfDocumentRepositoryExists(); checkIfDocumentRepositoryExists();
UBDocumentProxy* doc = new UBDocumentProxy(pDocumentDirectory); // deleted in UBPersistenceManager::destructor 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<QString, QVariant> metadatas = UBMetadataDcSubsetAdaptor::load(pDocumentDirectory); QMap<QString, QVariant> metadatas = UBMetadataDcSubsetAdaptor::load(pDocumentDirectory);
foreach(QString key, metadatas.keys()) foreach(QString key, metadatas.keys())
......
...@@ -46,7 +46,7 @@ class UBPersistenceManager : public QObject ...@@ -46,7 +46,7 @@ class UBPersistenceManager : public QObject
static void destroy(); static void destroy();
virtual UBDocumentProxy* createDocument(const QString& pGroupName = "", const QString& pName = "", bool withEmptyPage = true); virtual UBDocumentProxy* createDocument(const QString& pGroupName = "", const QString& pName = "", bool withEmptyPage = true);
virtual UBDocumentProxy* createDocumentFromDir(const QString& pDocumentDirectory); virtual UBDocumentProxy* createDocumentFromDir(const QString& pDocumentDirectory, const QString& pGroupName = "", const QString& pName = "", bool withEmptyPage = false);
virtual UBDocumentProxy* persistDocumentMetadata(UBDocumentProxy* pDocumentProxy); virtual UBDocumentProxy* persistDocumentMetadata(UBDocumentProxy* pDocumentProxy);
......
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <QPainter> #include <QPainter>
#include <QDebug> #include <QDebug>
......
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef UBACTIONABLEWIDGET_H #ifndef UBACTIONABLEWIDGET_H
#define UBACTIONABLEWIDGET_H #define UBACTIONABLEWIDGET_H
......
#include <QMimeData>
#include <QDrag>
#include <QUrl>
#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<QUrl> urls;
urls << QUrl::fromLocalFile(mSourcePath);
mimeData->setUrls(urls);
mimeData->setText(mSourcePath);
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->start();
}
#ifndef UBDRAGGABLELABEL_H
#define UBDRAGGABLELABEL_H
#include <QLabel>
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
#include <QApplication>
#include <QUrl>
#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<QUrl> urls;
urls << QUrl(mFilePath);
mimeData->setText(mFilePath);
mimeData->setUrls(urls);
drag->setMimeData(mimeData);
drag->exec(Qt::CopyAction | Qt::MoveAction);
}
#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
...@@ -34,9 +34,10 @@ UBMediaWidget::UBMediaWidget(eMediaType type, QWidget *parent, const char *name) ...@@ -34,9 +34,10 @@ UBMediaWidget::UBMediaWidget(eMediaType type, QWidget *parent, const char *name)
, mBorder(5) , mBorder(5)
, mpMediaContainer(NULL) , mpMediaContainer(NULL)
, mpCover(NULL) , mpCover(NULL)
// , mpVideoStackedWidget(NULL)
// , mpSnapshotVideoWidget(NULL)
{ {
setAttribute(Qt::WA_StyledBackground, true); SET_STYLE_SHEET();
setStyleSheet(UBApplication::globalStyleSheet());
addAction(eAction_Close); addAction(eAction_Close);
mType = type; mType = type;
...@@ -73,6 +74,8 @@ UBMediaWidget::~UBMediaWidget() ...@@ -73,6 +74,8 @@ UBMediaWidget::~UBMediaWidget()
DELETEPTR(mpPlayStopButton); DELETEPTR(mpPlayStopButton);
DELETEPTR(mpAudioOutput); DELETEPTR(mpAudioOutput);
DELETEPTR(mpVideoWidget); DELETEPTR(mpVideoWidget);
// DELETEPTR(mpVideoStackedWidget);
// DELETEPTR(mpSnapshotVideoWidget);
DELETEPTR(mpMediaObject); DELETEPTR(mpMediaObject);
DELETEPTR(mpCover); DELETEPTR(mpCover);
} }
...@@ -118,6 +121,13 @@ void UBMediaWidget::showEvent(QShowEvent* event) ...@@ -118,6 +121,13 @@ void UBMediaWidget::showEvent(QShowEvent* event)
QWidget::showEvent(event); QWidget::showEvent(event);
} }
void UBMediaWidget::hideEvent(QHideEvent* event)
{
if(mpMediaObject->state() == Phonon::PlayingState)
mpMediaObject->stop();
UBActionableWidget::hideEvent(event);
}
/** /**
* \brief Create the media player * \brief Create the media player
*/ */
...@@ -128,10 +138,17 @@ void UBMediaWidget::createMediaPlayer() ...@@ -128,10 +138,17 @@ void UBMediaWidget::createMediaPlayer()
mpMediaContainer->setLayout(&mMediaLayout); mpMediaContainer->setLayout(&mMediaLayout);
if(eMediaType_Video == mType){ if(eMediaType_Video == mType){
mMediaLayout.setContentsMargins(10, 10, 25, 10); mMediaLayout.setContentsMargins(10, 10, 10, 10);
if(isVisible()){ if(isVisible()){
mpVideoWidget = new Phonon::VideoWidget(this); mpVideoWidget = new Phonon::VideoWidget(this);
mMediaLayout.addStretch(1); mMediaLayout.addStretch(1);
// mpVideoStackedWidget = new QStackedWidget(this);
// mpVideoStackedWidget->addWidget(mpVideoWidget);
// mpSnapshotVideoWidget = new QLabel(this);
// mpVideoStackedWidget->addWidget(mpSnapshotVideoWidget);
// mMediaLayout.addWidget(mpVideoStackedWidget,0);
mMediaLayout.addWidget(mpVideoWidget, 0); mMediaLayout.addWidget(mpVideoWidget, 0);
mMediaLayout.addStretch(1); mMediaLayout.addStretch(1);
Phonon::createPath(mpMediaObject, mpVideoWidget); Phonon::createPath(mpMediaObject, mpVideoWidget);
...@@ -171,6 +188,22 @@ void UBMediaWidget::adaptSizeToVideo() ...@@ -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 * \brief Handle the media state change notification
* @param newState as the new state * @param newState as the new state
...@@ -199,6 +232,7 @@ void UBMediaWidget::onStateChanged(Phonon::State newState, Phonon::State oldStat ...@@ -199,6 +232,7 @@ void UBMediaWidget::onStateChanged(Phonon::State newState, Phonon::State oldStat
mpPauseButton->setEnabled(false); mpPauseButton->setEnabled(false);
mpSlider->setValue(0); mpSlider->setValue(0);
} }
//updateView(newState);
} }
} }
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <QLabel> #include <QLabel>
#include <QSlider> #include <QSlider>
#include <QMouseEvent> #include <QMouseEvent>
#include <QStackedWidget>
#include <phonon/MediaObject> #include <phonon/MediaObject>
#include <phonon/VideoWidget> #include <phonon/VideoWidget>
...@@ -75,6 +76,7 @@ public: ...@@ -75,6 +76,7 @@ public:
protected: protected:
void resizeEvent(QResizeEvent* ev); void resizeEvent(QResizeEvent* ev);
void showEvent(QShowEvent* event); void showEvent(QShowEvent* event);
void hideEvent(QHideEvent* event);
/** The current media file path */ /** The current media file path */
QString mFilePath; QString mFilePath;
...@@ -89,6 +91,7 @@ private slots: ...@@ -89,6 +91,7 @@ private slots:
private: private:
void createMediaPlayer(); void createMediaPlayer();
void adaptSizeToVideo(); void adaptSizeToVideo();
// void updateView(Phonon::State nextState);
/** The current media type */ /** The current media type */
eMediaType mType; eMediaType mType;
...@@ -122,6 +125,9 @@ private: ...@@ -122,6 +125,9 @@ private:
QLabel* mpCover; QLabel* mpCover;
/** The media url */ /** The media url */
QString mUrl; QString mUrl;
// QStackedWidget* mpVideoStackedWidget;
// QLabel* mpSnapshotVideoWidget;
}; };
#endif // UBMEDIAWIDGET_H #endif // UBMEDIAWIDGET_H
#include <QDebug>
#include <QScrollBar>
#include <QApplication>
#include <QPainter>
#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<UBActionableWidget*>(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();
}
#ifndef UBWIDGETLIST_H
#define UBWIDGETLIST_H
#include <QWidget>
#include <QScrollArea>
#include <QBoxLayout>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QResizeEvent>
#include <QVector>
#include <QLabel>
#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<QWidget*, QSize> mWidgetInfo;
QLabel* mpEmptyLabel;
UBActionableWidget* mpCurrentWidget;
};
#endif // UBWIDGETLIST_H
HEADERS += src/customWidgets/UBWidgetList.h \ HEADERS += \
src/customWidgets/UBDraggableLabel.h \
src/customWidgets/UBMediaWidget.h \ src/customWidgets/UBMediaWidget.h \
src/globals/UBGlobals.h \
src/customWidgets/UBDraggableMedia.h \
src/customWidgets/UBActionableWidget.h src/customWidgets/UBActionableWidget.h
SOURCES += src/customWidgets/UBWidgetList.cpp \ SOURCES += \
src/customWidgets/UBDraggableLabel.cpp \
src/customWidgets/UBMediaWidget.cpp \ src/customWidgets/UBMediaWidget.cpp \
src/customWidgets/UBDraggableMedia.cpp \
src/customWidgets/UBActionableWidget.cpp src/customWidgets/UBActionableWidget.cpp
...@@ -762,21 +762,6 @@ void UBDesktopAnnotationController::togglePropertyPalette(UBActionPalette *palet ...@@ -762,21 +762,6 @@ void UBDesktopAnnotationController::togglePropertyPalette(UBActionPalette *palet
void UBDesktopAnnotationController::switchCursor(const int tool) void UBDesktopAnnotationController::switchCursor(const int tool)
{ {
// enum Enum
// {
// Pen = 0,
// Eraser,
// Marker,
// Selector,
// Hand,
// ZoomIn,
// ZoomOut,
// Pointer,
// Line,
// Text,
// Capture
// };
mTransparentDrawingScene->setToolCursor(tool); mTransparentDrawingScene->setToolCursor(tool);
mTransparentDrawingView->setToolCursor(tool); mTransparentDrawingView->setToolCursor(tool);
} }
...@@ -826,17 +811,6 @@ void UBDesktopAnnotationController::onDesktopPaletteMaximized() ...@@ -826,17 +811,6 @@ void UBDesktopAnnotationController::onDesktopPaletteMaximized()
connect(pPointerButton, SIGNAL(pressed()), this, SLOT(pointerActionPressed())); connect(pPointerButton, SIGNAL(pressed()), this, SLOT(pointerActionPressed()));
connect(pPointerButton, SIGNAL(released()), this, SLOT(pointerActionReleased())); connect(pPointerButton, SIGNAL(released()), this, SLOT(pointerActionReleased()));
} }
// enum Enum
// {
// Hand,
// ZoomIn,
// ZoomOut,
// Line,
// Text,
// Capture
// };
} }
/** /**
...@@ -872,16 +846,6 @@ void UBDesktopAnnotationController::onDesktopPaletteMinimize() ...@@ -872,16 +846,6 @@ void UBDesktopAnnotationController::onDesktopPaletteMinimize()
void UBDesktopAnnotationController::TransparentWidgetResized() 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(); onTransparentWidgetResized();
} }
...@@ -900,8 +864,6 @@ void UBDesktopAnnotationController::onTransparentWidgetResized() ...@@ -900,8 +864,6 @@ void UBDesktopAnnotationController::onTransparentWidgetResized()
UBApplication::boardController->paletteManager()->leftPalette()->resize(lW+1, rH); UBApplication::boardController->paletteManager()->leftPalette()->resize(lW+1, rH);
UBApplication::boardController->paletteManager()->leftPalette()->resize(lW, rH); UBApplication::boardController->paletteManager()->leftPalette()->resize(lW, rH);
// mRightPalette->resize(mRightPalette->width(), mTransparentDrawingView->height());
} }
void UBDesktopAnnotationController::updateMask(bool bTransparent) void UBDesktopAnnotationController::updateMask(bool bTransparent)
......
...@@ -160,6 +160,9 @@ void UBDocumentController::selectDocument(UBDocumentProxy* proxy, bool setAsCurr ...@@ -160,6 +160,9 @@ void UBDocumentController::selectDocument(UBDocumentProxy* proxy, bool setAsCurr
mDocumentUI->documentTreeWidget->scrollToItem(selected); mDocumentUI->documentTreeWidget->scrollToItem(selected);
mDocumentThumbs = UBThumbnailAdaptor::load(selectedDocumentProxy());
refreshDocumentThumbnailsView();
mSelectionType = Document; mSelectionType = Document;
} }
} }
...@@ -268,11 +271,10 @@ void UBDocumentController::refreshDocumentThumbnailsView() ...@@ -268,11 +271,10 @@ void UBDocumentController::refreshDocumentThumbnailsView()
if (proxy) if (proxy)
{ {
mCurrentDocument = proxy; mCurrentDocument = proxy;
QList<QPixmap> 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 QGraphicsPixmapItem *pixmapItem = new UBSceneThumbnailPixmap(pix, proxy, i); // deleted by the tree widget
if (proxy == mBoardController->activeDocument() && mBoardController->activeSceneIndex() == i) if (proxy == mBoardController->activeDocument() && mBoardController->activeSceneIndex() == i)
...@@ -507,7 +509,7 @@ void UBDocumentController::openSelectedItem() ...@@ -507,7 +509,7 @@ void UBDocumentController::openSelectedItem()
if (proxy && isOKToOpenDocument(proxy)) if (proxy && isOKToOpenDocument(proxy))
{ {
mBoardController->setActiveDocumentScene(proxy, thumb->sceneIndex()); //mBoardController->setActiveDocumentScene(proxy, thumb->sceneIndex());
UBApplication::applicationController->showBoard(); UBApplication::applicationController->showBoard();
} }
} }
...@@ -561,6 +563,7 @@ void UBDocumentController::duplicateSelectedItem() ...@@ -561,6 +563,7 @@ void UBDocumentController::duplicateSelectedItem()
foreach (int sceneIndex, selectedSceneIndexes) foreach (int sceneIndex, selectedSceneIndexes)
{ {
UBPersistenceManager::persistenceManager()->duplicateDocumentScene(proxy, sceneIndex + offset); UBPersistenceManager::persistenceManager()->duplicateDocumentScene(proxy, sceneIndex + offset);
mDocumentThumbs.insert(sceneIndex + offset, mDocumentThumbs.at(sceneIndex + offset));
offset++; offset++;
} }
} }
...@@ -921,6 +924,7 @@ void UBDocumentController::itemClicked(QTreeWidgetItem * item, int column ) ...@@ -921,6 +924,7 @@ void UBDocumentController::itemClicked(QTreeWidgetItem * item, int column )
Q_UNUSED(item); Q_UNUSED(item);
Q_UNUSED(column); Q_UNUSED(column);
selectDocument(selectedDocumentProxy(), false);
itemSelectionChanged(); itemSelectionChanged();
} }
...@@ -1043,6 +1047,7 @@ void UBDocumentController::addFolderOfImages() ...@@ -1043,6 +1047,7 @@ void UBDocumentController::addFolderOfImages()
{ {
document->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime())); document->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime()));
UBMetadataDcSubsetAdaptor::persist(document); UBMetadataDcSubsetAdaptor::persist(document);
mDocumentThumbs = UBThumbnailAdaptor::load(selectedDocumentProxy());
refreshDocumentThumbnailsView(); refreshDocumentThumbnailsView();
} }
} }
...@@ -1057,6 +1062,7 @@ void UBDocumentController::addFileToDocument() ...@@ -1057,6 +1062,7 @@ void UBDocumentController::addFileToDocument()
if (document) if (document)
{ {
addFileToDocument(document); addFileToDocument(document);
mDocumentThumbs = UBThumbnailAdaptor::load(document);
refreshDocumentThumbnailsView(); refreshDocumentThumbnailsView();
} }
} }
...@@ -1108,12 +1114,9 @@ void UBDocumentController::moveSceneToIndex(UBDocumentProxy* proxy, int source, ...@@ -1108,12 +1114,9 @@ void UBDocumentController::moveSceneToIndex(UBDocumentProxy* proxy, int source,
proxy->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime())); proxy->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime()));
UBMetadataDcSubsetAdaptor::persist(proxy); UBMetadataDcSubsetAdaptor::persist(proxy);
mDocumentThumbs.insert(target, mDocumentThumbs.takeAt(source));
refreshDocumentThumbnailsView(); refreshDocumentThumbnailsView();
mDocumentUI->thumbnailWidget->hightlightItem(target);
// Notify the move to anyone interested in knowing it
emit movedToIndex(target);
UBApplication::boardController->setActiveDocumentScene(proxy, target);
} }
...@@ -1321,7 +1324,8 @@ void UBDocumentController::addToDocument() ...@@ -1321,7 +1324,8 @@ void UBDocumentController::addToDocument()
} }
int newActiveSceneIndex = selectedItems.count() == mBoardController->activeDocument()->pageCount() ? 0 : oldActiveSceneIndex + 1; 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())); mBoardController->activeDocument()->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime()));
UBMetadataDcSubsetAdaptor::persist(mBoardController->activeDocument()); UBMetadataDcSubsetAdaptor::persist(mBoardController->activeDocument());
...@@ -1495,6 +1499,7 @@ void UBDocumentController::addImages() ...@@ -1495,6 +1499,7 @@ void UBDocumentController::addImages()
{ {
document->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime())); document->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime()));
UBMetadataDcSubsetAdaptor::persist(document); UBMetadataDcSubsetAdaptor::persist(document);
mDocumentThumbs = UBThumbnailAdaptor::load(selectedDocumentProxy());
refreshDocumentThumbnailsView(); refreshDocumentThumbnailsView();
} }
} }
...@@ -1605,6 +1610,13 @@ void UBDocumentController::deletePages(QList<QGraphicsItem *> itemsToDelete) ...@@ -1605,6 +1610,13 @@ void UBDocumentController::deletePages(QList<QGraphicsItem *> itemsToDelete)
UBPersistenceManager::persistenceManager()->deleteDocumentScenes(proxy, sceneIndexes); UBPersistenceManager::persistenceManager()->deleteDocumentScenes(proxy, sceneIndexes);
proxy->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime())); proxy->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime()));
UBMetadataDcSubsetAdaptor::persist(proxy); UBMetadataDcSubsetAdaptor::persist(proxy);
int offset = 0;
foreach(int index, sceneIndexes)
{
mDocumentThumbs.removeAt(index - offset);
offset++;
}
refreshDocumentThumbnailsView(); refreshDocumentThumbnailsView();
int minIndex = proxy->pageCount() - 1; int minIndex = proxy->pageCount() - 1;
...@@ -1616,3 +1628,15 @@ void UBDocumentController::deletePages(QList<QGraphicsItem *> itemsToDelete) ...@@ -1616,3 +1628,15 @@ void UBDocumentController::deletePages(QList<QGraphicsItem *> itemsToDelete)
} }
} }
} }
int UBDocumentController::getSelectedItemIndex()
{
QList<QGraphicsItem*> selectedItems = mDocumentUI->thumbnailWidget->selectedItems();
if (selectedItems.count() > 0)
{
UBSceneThumbnailPixmap* thumb = dynamic_cast<UBSceneThumbnailPixmap*> (selectedItems.last());
return thumb->sceneIndex();
}
else return -1;
}
\ No newline at end of file
...@@ -48,8 +48,9 @@ class UBDocumentController : public QObject ...@@ -48,8 +48,9 @@ class UBDocumentController : public QObject
QWidget* controlView(); QWidget* controlView();
UBDocumentProxyTreeItem* findDocument(UBDocumentProxy* proxy); UBDocumentProxyTreeItem* findDocument(UBDocumentProxy* proxy);
bool addFileToDocument(UBDocumentProxy* document); bool addFileToDocument(UBDocumentProxy* document);
UBDocumentProxy* getCurrentDocument(); UBDocumentProxy* getCurrentDocument() { return mCurrentDocument; };
void deletePages(QList<QGraphicsItem*> itemsToDelete); void deletePages(QList<QGraphicsItem*> itemsToDelete);
int getSelectedItemIndex();
signals: signals:
void refreshThumbnails(); void refreshThumbnails();
...@@ -111,6 +112,7 @@ class UBDocumentController : public QObject ...@@ -111,6 +112,7 @@ class UBDocumentController : public QObject
bool mToolsPalettePositionned; bool mToolsPalettePositionned;
UBDocumentGroupTreeItem* mTrashTi; UBDocumentGroupTreeItem* mTrashTi;
UBDocumentProxy* mCurrentDocument; UBDocumentProxy* mCurrentDocument;
QList<QPixmap> mDocumentThumbs;
// UBKeyboardPalette *mKeyboardPalette; // UBKeyboardPalette *mKeyboardPalette;
......
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef UBGLOBALS_H #ifndef UBGLOBALS_H
#define UBGLOBALS_H #define UBGLOBALS_H
#include <QString>
#include <QFile>
#define DELETEPTR(ptr) if(NULL != ptr){ \ #define DELETEPTR(ptr) if(NULL != ptr){ \
delete ptr; \ delete ptr; \
ptr = NULL; \ 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 #ifdef Q_WS_WIN
#define WARNINGS_DISABLE __pragma(warning(push, 0)); #define WARNINGS_DISABLE __pragma(warning(push, 0));
...@@ -14,7 +41,7 @@ ...@@ -14,7 +41,7 @@
#ifdef NO_THIRD_PARTY_WARNINGS #ifdef NO_THIRD_PARTY_WARNINGS
// disabling warning level to 0 and save old state // disabling warning level to 0 and save old state
#define THIRD_PARTY_WARNINGS_DISABLE WARNINGS_DISABLE #define THIRD_PARTY_WARNINGS_DISABLE WARNINGS_DISABLE
#else #else
// just save old state (needs for not empty define) // just save old state (needs for not empty define)
#define THIRD_PARTY_WARNINGS_DISABLE __pragma(warning(push)); #define THIRD_PARTY_WARNINGS_DISABLE __pragma(warning(push));
#endif //#ifdef NO_THIRD_PARTY_WARNINGS #endif //#ifdef NO_THIRD_PARTY_WARNINGS
...@@ -24,9 +51,9 @@ ...@@ -24,9 +51,9 @@
#define WARNINGS_DISABLE _Pragma("GCC diagnostic push"); \ #define WARNINGS_DISABLE _Pragma("GCC diagnostic push"); \
_Pragma("GCC diagnostic ignored \"-Wunused-parameter\""); \ _Pragma("GCC diagnostic ignored \"-Wunused-parameter\""); \
_Pragma("GCC diagnostic ignored \"-Wunused-variable\""); \ _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 #ifdef NO_THIRD_PARTY_WARNINGS
//disabling some warnings //disabling some warnings
...@@ -43,4 +70,4 @@ _Pragma("GCC diagnostic ignored \"-Wsign-compare\""); ...@@ -43,4 +70,4 @@ _Pragma("GCC diagnostic ignored \"-Wsign-compare\"");
#define THIRD_PARTY_WARNINGS_ENABLE WARNINGS_ENABLE #define THIRD_PARTY_WARNINGS_ENABLE WARNINGS_ENABLE
#endif // UBGLOBALS_H #endif // UBGLOBALS_H
...@@ -231,6 +231,7 @@ void UBActionPalette::mouseReleaseEvent(QMouseEvent * event) ...@@ -231,6 +231,7 @@ void UBActionPalette::mouseReleaseEvent(QMouseEvent * event)
void UBActionPalette::actionChanged() void UBActionPalette::actionChanged()
{ {
emit itemOnActionPaletteChanged();
for(int i = 0; i < mActions.length() && i < mButtons.length(); i++) for(int i = 0; i < mActions.length() && i < mButtons.length(); i++)
{ {
mButtons.at(i)->setVisible(mActions.at(i)->isVisible()); mButtons.at(i)->setVisible(mActions.at(i)->isVisible());
......
...@@ -56,10 +56,12 @@ class UBActionPalette : public UBFloatingPalette ...@@ -56,10 +56,12 @@ class UBActionPalette : public UBFloatingPalette
public slots: public slots:
void close(); void close();
signals: signals:
void closed(); void closed();
void buttonGroupClicked(int id); void buttonGroupClicked(int id);
void customMouseReleased(); void customMouseReleased();
void itemOnActionPaletteChanged();
protected: protected:
virtual void paintEvent(QPaintEvent *event); virtual void paintEvent(QPaintEvent *event);
......
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
#include "core/UBApplication.h" #include "core/UBApplication.h"
#include "core/UBApplicationController.h" #include "core/UBApplicationController.h"
#include "globals/UBGlobals.h"
#include "board/UBBoardController.h" #include "board/UBBoardController.h"
#include "domain/UBGraphicsScene.h" #include "domain/UBGraphicsScene.h"
...@@ -34,8 +35,8 @@ UBCachePropertiesWidget::UBCachePropertiesWidget(QWidget *parent, const char *na ...@@ -34,8 +35,8 @@ UBCachePropertiesWidget::UBCachePropertiesWidget(QWidget *parent, const char *na
, mpCurrentCache(NULL) , mpCurrentCache(NULL)
{ {
setObjectName(name); setObjectName(name);
setAttribute(Qt::WA_StyledBackground, true);
setStyleSheet(UBApplication::globalStyleSheet()); SET_STYLE_SHEET();
mName = "CachePropWidget"; mName = "CachePropWidget";
mVisibleState = false; mVisibleState = false;
...@@ -283,7 +284,7 @@ void UBCachePropertiesWidget::updateCurrentCache() ...@@ -283,7 +284,7 @@ void UBCachePropertiesWidget::updateCurrentCache()
if( UBApplication::applicationController != NULL ) if( UBApplication::applicationController != NULL )
{ {
// if app controller is available, and current mode is Board, and no show desktop, than all ok, just process // 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()) !UBApplication::applicationController->isShowingDesktop())
isBoardMode = true; isBoardMode = true;
} }
...@@ -348,4 +349,4 @@ void UBCachePropertiesWidget::onCacheEnabled() ...@@ -348,4 +349,4 @@ void UBCachePropertiesWidget::onCacheEnabled()
{ {
emit showTab(this); emit showTab(this);
} }
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
#include "UBDockDownloadWidget.h" #include "UBDockDownloadWidget.h"
#include "core/UBApplication.h" #include "core/UBApplication.h"
#include "globals/UBGlobals.h"
UBDockDownloadWidget::UBDockDownloadWidget(QWidget *parent, const char *name):UBDockPaletteWidget(parent, name) UBDockDownloadWidget::UBDockDownloadWidget(QWidget *parent, const char *name):UBDockPaletteWidget(parent, name)
, mpLayout(NULL) , mpLayout(NULL)
, mpDLWidget(NULL) , mpDLWidget(NULL)
...@@ -22,8 +24,7 @@ UBDockDownloadWidget::UBDockDownloadWidget(QWidget *parent, const char *name):UB ...@@ -22,8 +24,7 @@ UBDockDownloadWidget::UBDockDownloadWidget(QWidget *parent, const char *name):UB
mName = "DownloadWidget"; mName = "DownloadWidget";
mVisibleState = false; mVisibleState = false;
setAttribute(Qt::WA_StyledBackground, true); SET_STYLE_SHEET();
setStyleSheet(UBApplication::globalStyleSheet());
mIconToLeft = QPixmap(":images/download_open.png"); mIconToLeft = QPixmap(":images/download_open.png");
mIconToRight = QPixmap(":images/download_close.png"); mIconToRight = QPixmap(":images/download_close.png");
......
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "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);
}
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef 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
...@@ -56,7 +56,6 @@ UBDocumentNavigator::UBDocumentNavigator(QWidget *parent, const char *name):QGra ...@@ -56,7 +56,6 @@ UBDocumentNavigator::UBDocumentNavigator(QWidget *parent, const char *name):QGra
setFrameShadow(QFrame::Plain); setFrameShadow(QFrame::Plain);
connect(UBApplication::boardController, SIGNAL(activeSceneChanged()), this, SLOT(addNewPage())); connect(UBApplication::boardController, SIGNAL(activeSceneChanged()), this, SLOT(addNewPage()));
connect(UBApplication::boardController, SIGNAL(setDocOnPageNavigator(UBDocumentProxy*)), this, SLOT(generateThumbnails()));
connect(mScene, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); connect(mScene, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged()));
connect(UBApplication::boardController, SIGNAL(documentReorganized(int)), this, SLOT(onMovedToIndex(int))); connect(UBApplication::boardController, SIGNAL(documentReorganized(int)), this, SLOT(onMovedToIndex(int)));
} }
......
...@@ -18,8 +18,10 @@ ...@@ -18,8 +18,10 @@
#include <QApplication> #include <QApplication>
#include "UBDownloadWidget.h" #include "UBDownloadWidget.h"
#include "core/UBApplication.h"
#include "globals/UBGlobals.h"
#include "core/UBApplication.h"
#include "core/memcheck.h" #include "core/memcheck.h"
/** /**
...@@ -36,8 +38,7 @@ UBDownloadWidget::UBDownloadWidget(QWidget *parent, const char *name):QWidget(pa ...@@ -36,8 +38,7 @@ UBDownloadWidget::UBDownloadWidget(QWidget *parent, const char *name):QWidget(pa
{ {
setObjectName(name); setObjectName(name);
setWindowTitle(tr("Downloading files")); setWindowTitle(tr("Downloading files"));
setAttribute(Qt::WA_StyledBackground, true); SET_STYLE_SHEET();
setStyleSheet(UBApplication::globalStyleSheet());
resize(400, 300); resize(400, 300);
mpLayout = new QVBoxLayout(this); mpLayout = new QVBoxLayout(this);
......
...@@ -18,10 +18,12 @@ ...@@ -18,10 +18,12 @@
#include "core/UBApplication.h" #include "core/UBApplication.h"
#include "core/UBDownloadManager.h" #include "core/UBDownloadManager.h"
#include "core/memcheck.h"
#include "frameworks/UBFileSystemUtils.h" #include "frameworks/UBFileSystemUtils.h"
#include "core/memcheck.h" #include "globals/UBGlobals.h"
/** /**
* \brief Constructor * \brief Constructor
...@@ -43,8 +45,7 @@ UBLibItemProperties::UBLibItemProperties(QWidget *parent, const char *name):QWid ...@@ -43,8 +45,7 @@ UBLibItemProperties::UBLibItemProperties(QWidget *parent, const char *name):QWid
{ {
setObjectName(name); setObjectName(name);
setAttribute(Qt::WA_StyledBackground, true); SET_STYLE_SHEET();
setStyleSheet(UBApplication::globalStyleSheet());
// Create the GUI // Create the GUI
mpLayout = new QVBoxLayout(this); mpLayout = new QVBoxLayout(this);
......
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
#include "core/UBApplication.h" #include "core/UBApplication.h"
#include "core/memcheck.h" #include "core/memcheck.h"
#include "globals/UBGlobals.h"
static int lowBoundForSlider = 40; static int lowBoundForSlider = 40;
static int topBoundForSlider = 120; static int topBoundForSlider = 120;
static int tickIntervalForSlider = 10; static int tickIntervalForSlider = 10;
...@@ -35,8 +37,7 @@ UBLibNavigatorWidget::UBLibNavigatorWidget(QWidget *parent, const char *name):QW ...@@ -35,8 +37,7 @@ UBLibNavigatorWidget::UBLibNavigatorWidget(QWidget *parent, const char *name):QW
{ {
setObjectName(name); setObjectName(name);
setAttribute(Qt::WA_StyledBackground, true); SET_STYLE_SHEET();
setStyleSheet(UBApplication::globalStyleSheet());
setAcceptDrops(true); setAcceptDrops(true);
...@@ -62,7 +63,7 @@ UBLibNavigatorWidget::UBLibNavigatorWidget(QWidget *parent, const char *name):QW ...@@ -62,7 +63,7 @@ UBLibNavigatorWidget::UBLibNavigatorWidget(QWidget *parent, const char *name):QW
connect(mLibWidget, SIGNAL(propertiesRequested(UBLibElement*)), this, SLOT(onPropertiesRequested(UBLibElement*))); 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(mSlider,SIGNAL(valueChanged(int)),this,SLOT(updateThumbnailsSize(int)));
connect(libWidget->pathViewer(), SIGNAL(mouseClick(UBChainedLibElement*)), this, SLOT(onPathItemClicked(UBChainedLibElement*))); connect(libWidget->pathViewer(), SIGNAL(mouseClick(UBChainedLibElement*)), this, SLOT(onPathItemClicked(UBChainedLibElement*)));
connect(libWidget->pathViewer(), SIGNAL(elementsDropped(QList<QString>,UBLibElement*)), mLibWidget, SLOT(onElementsDropped(QList<QString>,UBLibElement*))); connect(libWidget->pathViewer(), SIGNAL(elementsDropped(QList<QString>,UBLibElement*)), mLibWidget, SLOT(onElementsDropped(QList<QString>,UBLibElement*)));
......
#include <QDomDocument> #include <QDomDocument>
#include "core/UBApplication.h" #include "core/UBApplication.h"
#include "core/memcheck.h"
#include "board/UBBoardController.h" #include "board/UBBoardController.h"
#include "globals/UBGlobals.h"
#include "UBLibWebView.h" #include "UBLibWebView.h"
#include "core/memcheck.h"
UBLibWebView::UBLibWebView(QWidget* parent, const char* name):QWidget(parent) UBLibWebView::UBLibWebView(QWidget* parent, const char* name):QWidget(parent)
, mpView(NULL) , mpView(NULL)
...@@ -15,8 +19,7 @@ UBLibWebView::UBLibWebView(QWidget* parent, const char* name):QWidget(parent) ...@@ -15,8 +19,7 @@ UBLibWebView::UBLibWebView(QWidget* parent, const char* name):QWidget(parent)
{ {
setObjectName(name); setObjectName(name);
setAttribute(Qt::WA_StyledBackground, true); SET_STYLE_SHEET();
setStyleSheet(UBApplication::globalStyleSheet());
mpLayout = new QVBoxLayout(); mpLayout = new QVBoxLayout();
setLayout(mpLayout); setLayout(mpLayout);
......
...@@ -15,10 +15,12 @@ ...@@ -15,10 +15,12 @@
#include <QDebug> #include <QDebug>
#include "UBLibWidget.h" #include "UBLibWidget.h"
#include "core/UBApplication.h"
#include "core/UBApplication.h"
#include "core/memcheck.h" #include "core/memcheck.h"
#include "globals/UBGlobals.h"
/** /**
* \brief Constructor * \brief Constructor
* @param parent as the parent widget * @param parent as the parent widget
...@@ -37,8 +39,7 @@ UBLibWidget::UBLibWidget(QWidget *parent, const char *name):UBDockPaletteWidget( ...@@ -37,8 +39,7 @@ UBLibWidget::UBLibWidget(QWidget *parent, const char *name):UBDockPaletteWidget(
mName = "LibWidget"; mName = "LibWidget";
mVisibleState = true; mVisibleState = true;
setAttribute(Qt::WA_StyledBackground, true); SET_STYLE_SHEET();
setStyleSheet(UBApplication::globalStyleSheet());
mIconToLeft = QPixmap(":images/library_open.png"); mIconToLeft = QPixmap(":images/library_open.png");
mIconToRight = QPixmap(":images/library_close.png"); mIconToRight = QPixmap(":images/library_close.png");
......
#include "UBMediaPlayer.h"
#include <QtGui>
#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("<center>No media</center>"));
// 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; i<fileNames.size(); i++)
m_MediaObject.enqueue(Phonon::MediaSource(fileNames[i]));
}
}
void UBMediaPlayer::bufferStatus(int percent)
{
if (percent == 100)
progressLabel->setText(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<Phonon::MediaSource> 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<QUrl> urls;
urls << QUrl::fromLocalFile(mSourcePath);
mimeData->setUrls(urls);
mimeData->setText(mSourcePath);
QDrag *drag = new QDrag(this);
drag->setMimeData(mimeData);
drag->start();
}
#ifndef UBUBMediaPlayer_H
#define UBUBMediaPlayer_H
#include <QtGui/QWidget>
#include <QtGui/QApplication>
#include <QtCore/QTimerEvent>
#include <QtGui/QShowEvent>
#include <QtGui/QIcon>
#include <QtCore/QBasicTimer>
#include <QtGui/QAction>
#include <phonon/audiooutput.h>
#include <phonon/backendcapabilities.h>
#include <phonon/effect.h>
#include <phonon/effectparameter.h>
#include <phonon/effectwidget.h>
#include <phonon/mediaobject.h>
#include <phonon/seekslider.h>
#include <phonon/videowidget.h>
#include <phonon/volumeslider.h>
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
...@@ -14,9 +14,12 @@ ...@@ -14,9 +14,12 @@
*/ */
#include "UBPageNavigationWidget.h" #include "UBPageNavigationWidget.h"
#include "core/UBApplication.h" #include "core/UBApplication.h"
#include "board/UBBoardController.h"
#include "core/memcheck.h" #include "core/memcheck.h"
#include "board/UBBoardController.h"
#include "globals/UBGlobals.h"
/** /**
* \brief Constructor * \brief Constructor
* @param parent as the parent widget * @param parent as the parent widget
...@@ -32,8 +35,8 @@ UBPageNavigationWidget::UBPageNavigationWidget(QWidget *parent, const char *name ...@@ -32,8 +35,8 @@ UBPageNavigationWidget::UBPageNavigationWidget(QWidget *parent, const char *name
setObjectName(name); setObjectName(name);
mName = "PageNavigator"; mName = "PageNavigator";
mVisibleState = true; mVisibleState = true;
setAttribute(Qt::WA_StyledBackground, true);
setStyleSheet(UBApplication::globalStyleSheet()); SET_STYLE_SHEET();
mIconToRight = QPixmap(":images/pages_open.png"); mIconToRight = QPixmap(":images/pages_open.png");
mIconToLeft = QPixmap(":images/pages_close.png"); mIconToLeft = QPixmap(":images/pages_close.png");
......
#include <QApplication>
#include <QStyleOptionButton>
#include <QStyledItemDelegate>
#include <QStyleOptionViewItem>
#include <QPainter>
#include <QModelIndex>
#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;
}
#ifndef UBTGWIDGETTREEDELEGATE_H
#define UBTGWIDGETTREEDELEGATE_H
class QPainter;
class QStyleOptionViewItem;
class QModelIndex;
#include <QStyledItemDelegate>
typedef enum
{
eUBTGAddSubItemWidgetType_None,
eUBTGAddSubItemWidgetType_Action ,
eUBTGAddSubItemWidgetType_Media,
eUBTGAddSubItemWidgetType_Url
}eUBTGAddSubItemWidgetType;
class UBTGWidgetTreeDelegate : public QStyledItemDelegate
{
Q_OBJECT
public:
explicit UBTGWidgetTreeDelegate(QObject *parent = 0);
virtual void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIndex& index) const;
virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const;
signals:
public slots:
};
#endif // UBTGWIDGETTREEDELEGATE_H
#include "UBTeacherGuideDelegate.h"
UBTeacherGuideDelegate::UBTeacherGuideDelegate()
{
}
#ifndef UBTEACHERGUIDEDELEGATE_H
#define UBTEACHERGUIDEDELEGATE_H
class UBTeacherGuideDelegate
{
public:
UBTeacherGuideDelegate();
};
#endif // UBTEACHERGUIDEDELEGATE_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 <http://www.gnu.org/licenses/>.
*/
#include <QDebug>
#include <QLabel>
#include <QVBoxLayout>
#include <QHeaderView>
#include <QTreeWidget>
#include <QPushButton>
#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<QTreeWidgetItem*> children = mpAddAnActionItem->takeChildren();
children << mpAddAMediaItem->takeChildren();
children << mpAddALinkItem->takeChildren();
foreach(QTreeWidgetItem* item, children){
DELETEPTR(item);
}
}
QList<QTreeWidgetItem*> UBTeacherGuideEditionWidget::getChildrenList(QTreeWidgetItem* widgetItem)
{
QList<QTreeWidgetItem*>result;
for(int i=0;i<widgetItem->childCount();i+=1)
result << widgetItem->child(i);
return result;
}
QVector<tUBGEElementNode*> UBTeacherGuideEditionWidget::getPageAndCommentData()
{
QVector<tUBGEElementNode*>result;
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<tUBGEElementNode*> UBTeacherGuideEditionWidget::getData()
{
QVector<tUBGEElementNode*>result;
QList<QTreeWidgetItem*> children = getChildrenList(mpAddAnActionItem);
children << getChildrenList(mpAddAMediaItem);
children << getChildrenList(mpAddALinkItem);
result << getPageAndCommentData();
foreach(QTreeWidgetItem* widgetItem, children){
tUBGEElementNode* node = dynamic_cast<iUBTGSavableData*>(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<QTreeWidgetItem*> 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<tUBGEElementNode*> 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"));
QColor color = element->attributes.value("owner").toInt() == 0 ? QColor(Qt::red):QColor(Qt::green);
newWidgetItem->setData(0,Qt::ForegroundRole,QBrush(color));
newWidgetItem->setData(0,tUBTGTreeWidgetItemRole_HasAnAction,tUBTGActionAssociateOnClickItem_NONE);
newWidgetItem->setData(0,Qt::FontRole, QVariant(QFont(QApplication::font().family(),11)));
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);
}
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef 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<tUBGEElementNode*> getData();
public slots:
void onAddItemClicked(QTreeWidgetItem* widget, int column);
void onActiveSceneChanged();
void showEvent(QShowEvent* event);
private:
QList<QTreeWidgetItem*> getChildrenList(QTreeWidgetItem* widgetItem);
QVector<tUBGEElementNode*> 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(QVector<tUBGEElementNode*>data);
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;
QVector<tUBGEElementNode*>mCurrentData;
};
#endif // UBTEACHERGUIDEWIDGET_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 <http://www.gnu.org/licenses/>.
*/
#include <QTreeWidget>
#include <QVBoxLayout>
#include <QComboBox>
#include <QColor>
#include <QLabel>
#include <QDebug>
#include <QUrl>
#include <QWebSettings>
#include <QDomElement>
#include <QDomDocument>
#include <QApplication>
#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->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)
{
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)
{
// 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));
setText(mPlaceHolderText);
onTextChanged();
if(isHidden())
show();
mHasPlaceHolder = true;
}
void UBTGAdaptableText::focusInEvent(QFocusEvent *e)
{
if(mHasPlaceHolder && toPlainText() == mPlaceHolderText){
setText("");
setTextColor(QColor(Qt::black));
}
e->accept();
}
void UBTGAdaptableText::focusOutEvent(QFocusEvent *e)
{
if(mHasPlaceHolder && toPlainText().length() == 0){
setTextColor(QColor(Qt::lightGray));
setText(mPlaceHolderText);
}
e->accept();
}
QString UBTGAdaptableText::text()
{
QString result = toPlainText();
if(mHasPlaceHolder && result == mPlaceHolderText)
return "";
return result;
}
void UBTGAdaptableText::onTextChanged()
{
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();
}
}
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();
}
/***************************************************************************
* 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(100);
}
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);
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->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);
QString mimeType = UBFileSystemUtils::mimeTypeFromFileName(path);
qDebug() << mimeType;
}
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<QUrl> 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;
}
/*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef UBTEACHERGUIDEWIDGETSTOOLS_H
#define UBTEACHERGUIDEWIDGETSTOOLS_H
#include <QObject>
#include <QTreeWidgetItem>
#include <QTextEdit>
#include <QLabel>
#include <QDragEnterEvent>
#include <QDropEvent>
#include <QLineEdit>
#include <QMimeData>
#include <QStackedWidget>
#include <QWebView>
#include "customWidgets/UBMediaWidget.h"
class QTreeWidget;
class QVBoxLayout;
class QComboBox;
class QTextEdit;
class QWidget;
class UBTGAdaptableText;
class QDomElement;
typedef struct
{
QString type;
QMap<QString,QString> 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 focusInEvent(QFocusEvent *e);
void focusOutEvent(QFocusEvent *e);
private:
int mBottomMargin;
QTreeWidgetItem* mpTreeWidgetItem;
int mMinimumHeight;
bool mHasPlaceHolder;
QString mPlaceHolderText;
};
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
/* /*
* This program is free software: you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <QString> #include <QString>
#include <QCursor> #include <QCursor>
#include "UBThumbnailWidget.h" #include "UBThumbnailWidget.h"
#include "UBRubberBand.h" #include "UBRubberBand.h"
#include "core/UBSettings.h" #include "core/UBSettings.h"
#include "core/UBApplication.h" #include "core/UBApplication.h"
#include "document/UBDocumentProxy.h" #include "document/UBDocumentProxy.h"
#include "document/UBDocumentController.h" #include "document/UBDocumentController.h"
#include "core/memcheck.h" #include "core/memcheck.h"
UBThumbnailWidget::UBThumbnailWidget(QWidget* parent) UBThumbnailWidget::UBThumbnailWidget(QWidget* parent)
: QGraphicsView(parent) : QGraphicsView(parent)
, mThumbnailWidth(UBSettings::defaultThumbnailWidth) , mThumbnailWidth(UBSettings::defaultThumbnailWidth)
, mSpacing(UBSettings::thumbnailSpacing) , mSpacing(UBSettings::thumbnailSpacing)
, mLastSelectedThumbnail(0) , mLastSelectedThumbnail(0)
, mSelectionSpan(0) , mSelectionSpan(0)
, mLassoRectItem(0) , mLassoRectItem(0)
{ {
// By default, the drag is possible // By default, the drag is possible
bCanDrag = true; bCanDrag = true;
setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing); setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform | QPainter::TextAntialiasing);
setFrameShape(QFrame::NoFrame); setFrameShape(QFrame::NoFrame);
setScene(&mThumbnailsScene); setScene(&mThumbnailsScene);
setAlignment(Qt::AlignLeft | Qt::AlignTop); setAlignment(Qt::AlignLeft | Qt::AlignTop);
connect(&mThumbnailsScene, SIGNAL(selectionChanged()), this, SLOT(sceneSelectionChanged())); connect(&mThumbnailsScene, SIGNAL(selectionChanged()), this, SLOT(sceneSelectionChanged()));
} }
UBThumbnailWidget::~UBThumbnailWidget() UBThumbnailWidget::~UBThumbnailWidget()
{ {
disconnect(&mThumbnailsScene, SIGNAL(selectionChanged())); disconnect(&mThumbnailsScene, SIGNAL(selectionChanged()));
} }
void UBThumbnailWidget::setThumbnailWidth(qreal pThumbnailWidth) void UBThumbnailWidget::setThumbnailWidth(qreal pThumbnailWidth)
{ {
mThumbnailWidth = pThumbnailWidth; mThumbnailWidth = pThumbnailWidth;
refreshScene(); refreshScene();
} }
void UBThumbnailWidget::setSpacing(qreal pSpacing) void UBThumbnailWidget::setSpacing(qreal pSpacing)
{ {
mSpacing = pSpacing; mSpacing = pSpacing;
refreshScene(); refreshScene();
} }
void UBThumbnailWidget::setGraphicsItems(const QList<QGraphicsItem*>& pGraphicsItems void UBThumbnailWidget::setGraphicsItems(const QList<QGraphicsItem*>& pGraphicsItems
, const QList<QUrl>& pItemsPaths , const QList<QUrl>& pItemsPaths
, const QStringList pLabels , const QStringList pLabels
, const QString& pMimeType) , const QString& pMimeType)
{ {
mGraphicItems = pGraphicsItems; mGraphicItems = pGraphicsItems;
mItemsPaths = pItemsPaths; mItemsPaths = pItemsPaths;
mMimeType = pMimeType; mMimeType = pMimeType;
mLabels = pLabels; mLabels = pLabels;
foreach(QGraphicsItem* it, mThumbnailsScene.items()) foreach(QGraphicsItem* it, mThumbnailsScene.items())
{ {
mThumbnailsScene.removeItem(it, true); mThumbnailsScene.removeItem(it, true);
} }
// set lasso to 0 as it has been cleared as well // set lasso to 0 as it has been cleared as well
mLassoRectItem = 0; mLassoRectItem = 0;
foreach (QGraphicsItem* item, pGraphicsItems) foreach (QGraphicsItem* item, pGraphicsItems)
{ {
if (item->scene() != &mThumbnailsScene) if (item->scene() != &mThumbnailsScene)
{ {
mThumbnailsScene.addItem(item); mThumbnailsScene.addItem(item);
} }
} }
mLabelsItems.clear(); mLabelsItems.clear();
foreach (const QString label, pLabels) foreach (const QString label, pLabels)
{ {
QFontMetrics fm(font()); QFontMetrics fm(font());
UBThumbnailTextItem *labelItem = UBThumbnailTextItem *labelItem =
new UBThumbnailTextItem(label); // deleted while replace or by the scene destruction new UBThumbnailTextItem(label); // deleted while replace or by the scene destruction
mThumbnailsScene.addItem(labelItem); mThumbnailsScene.addItem(labelItem);
mLabelsItems << labelItem; mLabelsItems << labelItem;
} }
refreshScene(); refreshScene();
mLastSelectedThumbnail = 0; mLastSelectedThumbnail = 0;
} }
void UBThumbnailWidget::refreshScene() void UBThumbnailWidget::refreshScene()
{ {
int nbColumns = (geometry().width() - mSpacing) / (mThumbnailWidth + mSpacing); int nbColumns = (geometry().width() - mSpacing) / (mThumbnailWidth + mSpacing);
int labelSpacing = 0; int labelSpacing = 0;
if (mLabelsItems.size() > 0) if (mLabelsItems.size() > 0)
{ {
QFontMetrics fm(mLabelsItems.at(0)->font()); 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? 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); nbColumns = qMax(nbColumns, 1);
qreal thumbnailHeight = mThumbnailWidth / UBSettings::minScreenRatio; qreal thumbnailHeight = mThumbnailWidth / UBSettings::minScreenRatio;
for (int i = 0; i < mGraphicItems.size(); i++) for (int i = 0; i < mGraphicItems.size(); i++)
{ {
QGraphicsItem* item = mGraphicItems.at(i); QGraphicsItem* item = mGraphicItems.at(i);
qreal scaleWidth = mThumbnailWidth / item->boundingRect().width(); qreal scaleWidth = mThumbnailWidth / item->boundingRect().width();
qreal scaleHeight = thumbnailHeight / item->boundingRect().height(); qreal scaleHeight = thumbnailHeight / item->boundingRect().height();
qreal scaleFactor = qMin(scaleWidth, scaleHeight); qreal scaleFactor = qMin(scaleWidth, scaleHeight);
//bitmap should not be stretched //bitmap should not be stretched
UBThumbnail* pix = dynamic_cast<UBThumbnail*>(item); UBThumbnail* pix = dynamic_cast<UBThumbnail*>(item);
if (pix) if (pix)
scaleFactor = qMin(scaleFactor, 1.0); scaleFactor = qMin(scaleFactor, 1.0);
QTransform transform; QTransform transform;
transform.scale(scaleFactor, scaleFactor); transform.scale(scaleFactor, scaleFactor);
item->setTransform(transform); item->setTransform(transform);
item->setFlag(QGraphicsItem::ItemIsSelectable, true); item->setFlag(QGraphicsItem::ItemIsSelectable, true);
int columnIndex = i % nbColumns; int columnIndex = i % nbColumns;
int rowIndex = i / nbColumns; int rowIndex = i / nbColumns;
if (pix) if (pix)
{ {
pix->setColumn(columnIndex); pix->setColumn(columnIndex);
pix->setRow(rowIndex); pix->setRow(rowIndex);
} }
int w = item->boundingRect().width(); int w = item->boundingRect().width();
int h = item->boundingRect().height(); int h = item->boundingRect().height();
QPointF pos( QPointF pos(
mSpacing + (mThumbnailWidth - w * scaleFactor) / 2 + columnIndex * (mThumbnailWidth + mSpacing), mSpacing + (mThumbnailWidth - w * scaleFactor) / 2 + columnIndex * (mThumbnailWidth + mSpacing),
mSpacing + rowIndex * (thumbnailHeight + mSpacing + labelSpacing) + (thumbnailHeight - h * scaleFactor) / 2); mSpacing + rowIndex * (thumbnailHeight + mSpacing + labelSpacing) + (thumbnailHeight - h * scaleFactor) / 2);
item->setPos(pos); item->setPos(pos);
if (mLabelsItems.size() > i) if (mLabelsItems.size() > i)
{ {
QFontMetrics fm(mLabelsItems.at(i)->font(), this); QFontMetrics fm(mLabelsItems.at(i)->font(), this);
QString elidedText = fm.elidedText(mLabels.at(i), Qt::ElideRight, mThumbnailWidth); QString elidedText = fm.elidedText(mLabels.at(i), Qt::ElideRight, mThumbnailWidth);
mLabelsItems.at(i)->setPlainText(elidedText); mLabelsItems.at(i)->setPlainText(elidedText);
mLabelsItems.at(i)->setWidth(fm.width(elidedText) + 2 * mLabelsItems.at(i)->document()->documentMargin()); mLabelsItems.at(i)->setWidth(fm.width(elidedText) + 2 * mLabelsItems.at(i)->document()->documentMargin());
pos.setY(pos.y() + (thumbnailHeight + h * scaleFactor) / 2 + 5); pos.setY(pos.y() + (thumbnailHeight + h * scaleFactor) / 2 + 5);
qreal labelWidth = fm.width(elidedText); qreal labelWidth = fm.width(elidedText);
pos.setX(mSpacing + (mThumbnailWidth - labelWidth) / 2 + columnIndex * (mThumbnailWidth + mSpacing)); pos.setX(mSpacing + (mThumbnailWidth - labelWidth) / 2 + columnIndex * (mThumbnailWidth + mSpacing));
mLabelsItems.at(i)->setPos(pos); mLabelsItems.at(i)->setPos(pos);
} }
} }
QScrollBar *vertScrollBar = verticalScrollBar(); QScrollBar *vertScrollBar = verticalScrollBar();
int scrollBarThickness = 0; int scrollBarThickness = 0;
if (vertScrollBar && vertScrollBar->isVisible()) if (vertScrollBar && vertScrollBar->isVisible())
scrollBarThickness = vertScrollBar->width(); scrollBarThickness = vertScrollBar->width();
setSceneRect(0, 0, setSceneRect(0, 0,
geometry().width() - scrollBarThickness, geometry().width() - scrollBarThickness,
mSpacing + ((((mGraphicItems.size() - 1) / nbColumns) + 1) * (thumbnailHeight + mSpacing + labelSpacing))); mSpacing + ((((mGraphicItems.size() - 1) / nbColumns) + 1) * (thumbnailHeight + mSpacing + labelSpacing)));
} }
QList<QGraphicsItem*> UBThumbnailWidget::selectedItems() QList<QGraphicsItem*> UBThumbnailWidget::selectedItems()
{ {
QList<QGraphicsItem*> sortedSelectedItems = mThumbnailsScene.selectedItems(); QList<QGraphicsItem*> sortedSelectedItems = mThumbnailsScene.selectedItems();
qSort(sortedSelectedItems.begin(), sortedSelectedItems.end(), thumbnailLessThan); qSort(sortedSelectedItems.begin(), sortedSelectedItems.end(), thumbnailLessThan);
return sortedSelectedItems; return sortedSelectedItems;
} }
void UBThumbnailWidget::mousePressEvent(QMouseEvent *event) void UBThumbnailWidget::mousePressEvent(QMouseEvent *event)
{ {
mClickTime = QTime::currentTime(); mClickTime = QTime::currentTime();
mMousePressPos = event->pos(); mMousePressPos = event->pos();
mMousePressScenePos = mapToScene(mMousePressPos); mMousePressScenePos = mapToScene(mMousePressPos);
QGraphicsItem* underlyingItem = itemAt(mMousePressPos); QGraphicsItem* underlyingItem = itemAt(mMousePressPos);
UBThumbnail *previousSelectedThumbnail = mLastSelectedThumbnail; UBThumbnail *previousSelectedThumbnail = mLastSelectedThumbnail;
if (!dynamic_cast<UBThumbnail*>(underlyingItem)) if (!dynamic_cast<UBThumbnail*>(underlyingItem))
{ {
deleteLasso(); deleteLasso();
UBRubberBand rubberBand(QRubberBand::Rectangle); UBRubberBand rubberBand(QRubberBand::Rectangle);
QStyleOption option; QStyleOption option;
option.initFrom(&rubberBand); option.initFrom(&rubberBand);
mLassoRectItem = new QGraphicsRectItem(0, scene()); mLassoRectItem = new QGraphicsRectItem(0, scene());
#ifdef Q_WS_MAC #ifdef Q_WS_MAC
// The following code must stay in synch with <Qt installation folder>\src\gui\styles\qmacstyle_mac.mm // The following code must stay in synch with <Qt installation folder>\src\gui\styles\qmacstyle_mac.mm
QColor strokeColor; QColor strokeColor;
strokeColor.setHsvF(0, 0, 0.86, 1.0); strokeColor.setHsvF(0, 0, 0.86, 1.0);
mLassoRectItem->setPen(QPen(strokeColor)); mLassoRectItem->setPen(QPen(strokeColor));
QColor fillColor(option.palette.color(QPalette::Disabled, QPalette::Highlight)); QColor fillColor(option.palette.color(QPalette::Disabled, QPalette::Highlight));
fillColor.setHsvF(0, 0, 0.53, 0.25); fillColor.setHsvF(0, 0, 0.53, 0.25);
mLassoRectItem->setBrush(fillColor); mLassoRectItem->setBrush(fillColor);
#else #else
// The following code must stay in synch with <Qt installation folder>\src\gui\styles\qwindowsxpstyle.cpp // The following code must stay in synch with <Qt installation folder>\src\gui\styles\qwindowsxpstyle.cpp
QColor highlight = option.palette.color(QPalette::Active, QPalette::Highlight); QColor highlight = option.palette.color(QPalette::Active, QPalette::Highlight);
mLassoRectItem->setPen(highlight.darker(120)); mLassoRectItem->setPen(highlight.darker(120));
QColor dimHighlight(qMin(highlight.red() / 2 + 110, 255), QColor dimHighlight(qMin(highlight.red() / 2 + 110, 255),
qMin(highlight.green() / 2 + 110, 255), qMin(highlight.green() / 2 + 110, 255),
qMin(highlight.blue() / 2 + 110, 255), qMin(highlight.blue() / 2 + 110, 255),
127); 127);
mLassoRectItem->setBrush(dimHighlight); mLassoRectItem->setBrush(dimHighlight);
#endif #endif
mLassoRectItem->setZValue(10000); mLassoRectItem->setZValue(10000);
mLassoRectItem->setRect(QRectF(mMousePressScenePos, QSizeF())); mLassoRectItem->setRect(QRectF(mMousePressScenePos, QSizeF()));
if (Qt::ControlModifier & event->modifiers() || Qt::ShiftModifier & event->modifiers()) if (Qt::ControlModifier & event->modifiers() || Qt::ShiftModifier & event->modifiers())
{ {
mSelectedThumbnailItems = selectedItems(); // mSelectedThumbnailItems = selectedItems().toSet();
return; return;
} }
mSelectedThumbnailItems.clear(); mSelectedThumbnailItems.clear();
QGraphicsView::mousePressEvent(event); QGraphicsView::mousePressEvent(event);
} }
else if (Qt::ShiftModifier & event->modifiers()) else if (Qt::ShiftModifier & event->modifiers())
{ {
if (previousSelectedThumbnail) if (previousSelectedThumbnail)
{ {
QGraphicsItem* previousSelectedItem = dynamic_cast<QGraphicsItem*>(previousSelectedThumbnail); QGraphicsItem* previousSelectedItem = dynamic_cast<QGraphicsItem*>(previousSelectedThumbnail);
if (previousSelectedItem) if (previousSelectedItem)
{ {
int index1 = mGraphicItems.indexOf(previousSelectedItem); int index1 = mGraphicItems.indexOf(previousSelectedItem);
int index2 = mGraphicItems.indexOf(underlyingItem); int index2 = mGraphicItems.indexOf(underlyingItem);
if (-1 == index2) if (-1 == index2)
{ {
mSelectedThumbnailItems = selectedItems(); mSelectedThumbnailItems = selectedItems().toSet();
return; return;
} }
mSelectionSpan = index2 - index1; mSelectionSpan = index2 - index1;
selectItems(qMin(index1, index2), mSelectionSpan < 0 ? - mSelectionSpan + 1 : mSelectionSpan + 1); selectItems(qMin(index1, index2), mSelectionSpan < 0 ? - mSelectionSpan + 1 : mSelectionSpan + 1);
return; return;
} }
} }
} }
else else
{ {
mLastSelectedThumbnail = dynamic_cast<UBThumbnail*>(underlyingItem); mLastSelectedThumbnail = dynamic_cast<UBThumbnail*>(underlyingItem);
if (!underlyingItem->isSelected()) if (!underlyingItem->isSelected())
{ {
int index = mGraphicItems.indexOf(underlyingItem); int index = mGraphicItems.indexOf(underlyingItem);
selectItemAt(index, Qt::ControlModifier & event->modifiers()); selectItemAt(index, Qt::ControlModifier & event->modifiers());
} }
else else
{ {
QGraphicsView::mousePressEvent(event); QGraphicsView::mousePressEvent(event);
} }
if (!mLastSelectedThumbnail && mGraphicItems.count() > 0) if (!mLastSelectedThumbnail && mGraphicItems.count() > 0)
mLastSelectedThumbnail = dynamic_cast<UBThumbnail*>(mGraphicItems.at(0)); mLastSelectedThumbnail = dynamic_cast<UBThumbnail*>(mGraphicItems.at(0));
mSelectionSpan = 0; mSelectionSpan = 0;
return; return;
} }
} }
void UBThumbnailWidget::mouseMoveEvent(QMouseEvent *event) void UBThumbnailWidget::mouseMoveEvent(QMouseEvent *event)
{ {
int distance = (mMousePressPos - event->pos()).manhattanLength(); int distance = (mMousePressPos - event->pos()).manhattanLength();
if (0 == (event->buttons() & Qt::LeftButton) || distance < QApplication::startDragDistance()) if (0 == (event->buttons() & Qt::LeftButton) || distance < QApplication::startDragDistance())
return; return;
if (mLassoRectItem) if (mLassoRectItem)
{ {
bSelectionInProgress = true; bSelectionInProgress = true;
QPointF currentScenePos = mapToScene(event->pos()); int incrementLassoMinWidth = 2;
QRectF lassoRect( QPointF currentScenePos = mapToScene(event->pos());
qMin(mMousePressScenePos.x(), currentScenePos.x()), qMin(mMousePressScenePos.y(), currentScenePos.y()), QRectF lassoRect(
qAbs(mMousePressScenePos.x() - currentScenePos.x()), qAbs(mMousePressScenePos.y() - currentScenePos.y())); qMin(mMousePressScenePos.x(), currentScenePos.x()), qMin(mMousePressScenePos.y(), currentScenePos.y()),
mLassoRectItem->setRect(lassoRect); qAbs(mMousePressScenePos.x() - currentScenePos.x()), qAbs(mMousePressScenePos.y() - currentScenePos.y()));
QRectF incrementXSelection(
QList<QGraphicsItem*> lassoSelectedItems = scene()->items(lassoRect, Qt::IntersectsItemBoundingRect); qMin(prevMoveMousePos.x(), currentScenePos.x()), qMin(mMousePressScenePos.y(), currentScenePos.y()),
QList<QGraphicsItem*> lassoSelectedThumbnailItems; qAbs(prevMoveMousePos.x() - currentScenePos.x())+incrementLassoMinWidth, qAbs(mMousePressScenePos.y() - currentScenePos.y()));
foreach (QGraphicsItem *lassoSelectedItem, lassoSelectedItems) QRectF incrementYSelection(
{ qMin(mMousePressScenePos.x(), currentScenePos.x()), qMin(prevMoveMousePos.y(), currentScenePos.y()),
UBThumbnail *thumbnailItem = dynamic_cast<UBThumbnail*>(lassoSelectedItem); qAbs(mMousePressScenePos.x() - currentScenePos.x()), qAbs(prevMoveMousePos.y() - currentScenePos.y())+incrementLassoMinWidth);
if (thumbnailItem)
lassoSelectedThumbnailItems.append(lassoSelectedItems); prevMoveMousePos = currentScenePos;
} mLassoRectItem->setRect(lassoRect);
unselectAll();
foreach (QGraphicsItem *lassoSelectedItem, lassoSelectedThumbnailItems) QSet<QGraphicsItem*> incSelectedItems = scene()->items(incrementXSelection, Qt::IntersectsItemBoundingRect).toSet()
{ + scene()->items(incrementYSelection, Qt::IntersectsItemBoundingRect).toSet();
if (Qt::ControlModifier & event->modifiers())
{ mPreviouslyIncrementalSelectedItems = incSelectedItems;
if (!mSelectedThumbnailItems.contains(lassoSelectedItem)) QSet<QGraphicsItem*> lassoSelectedItems;
selectItemAt(mGraphicItems.indexOf(lassoSelectedItem), true); QSet<QGraphicsItem*> lassoSelectedThumbnailItems;
} foreach (QGraphicsItem *lassoSelectedItem, incSelectedItems)
else {
{ if (lassoSelectedItem)
selectItemAt(mGraphicItems.indexOf(lassoSelectedItem), true); {
} UBSceneThumbnailPixmap *thumbnailItem = dynamic_cast<UBSceneThumbnailPixmap*>(lassoSelectedItem);
}
if (Qt::ControlModifier & event->modifiers()) if (thumbnailItem)
{ {
foreach (QGraphicsItem *selectedItem, mSelectedThumbnailItems) lassoSelectedItem->setSelected(true);
{ lassoSelectedThumbnailItems += lassoSelectedItem;
if (!lassoSelectedThumbnailItems.contains(selectedItem)) }
selectItemAt(mGraphicItems.indexOf(selectedItem), true); }
} }
}
} QSet<QGraphicsItem*> toUnset;
else toUnset = mSelectedThumbnailItems - lassoSelectedThumbnailItems;
{ foreach(QGraphicsItem* item, toUnset)
bSelectionInProgress = false; {
if (0 == selectedItems().size()) item->setSelected(false);
return; }
if(bCanDrag)
{ mSelectedThumbnailItems += lassoSelectedItems;
QDrag *drag = new QDrag(this); // foreach (QGraphicsItem *lassoSelectedItem, lassoSelectedThumbnailItems)
QMimeData *mime = new QMimeData(); {
if (mMimeType.length() > 0) }
mime->setData(mMimeType, QByteArray()); // trick the d&d system to register our own mime type if (Qt::ControlModifier & event->modifiers())
{
drag->setMimeData(mime); for (int i = 0; i < mSelectedThumbnailItems.count()-1; i++)
{
QList<QUrl> qlElements; mSelectedThumbnailItems.values().at(i)->setSelected(true);
}
foreach (QGraphicsItem* item, selectedItems()) // foreach (QGraphicsItem *selectedItem, mSelectedThumbnailItems)
{ {
if (mGraphicItems.contains(item)) // selectedItem->setSelected(true);
{ }
if (mGraphicItems.indexOf(item) <= mItemsPaths.size()){ }
qlElements << mItemsPaths.at(mGraphicItems.indexOf(item)); }
} else
} {
} bSelectionInProgress = false;
if (0 == selectedItems().size())
if (qlElements.size() > 0){ return;
mime->setUrls(qlElements);
drag->setMimeData(mime); if(bCanDrag)
drag->exec(Qt::CopyAction); {
} QDrag *drag = new QDrag(this);
} QMimeData *mime = new QMimeData();
}
if (mMimeType.length() > 0)
QGraphicsView::mouseMoveEvent(event); mime->setData(mMimeType, QByteArray()); // trick the d&d system to register our own mime type
}
drag->setMimeData(mime);
void UBThumbnailWidget::mouseReleaseEvent(QMouseEvent *event) QList<QUrl> qlElements;
{
int elapsedTimeSincePress = mClickTime.elapsed(); foreach (QGraphicsItem* item, selectedItems())
deleteLasso(); {
QGraphicsView::mouseReleaseEvent(event); if (mGraphicItems.contains(item))
{
if(elapsedTimeSincePress < STARTDRAGTIME) { if (mGraphicItems.indexOf(item) <= mItemsPaths.size()){
emit mouseClick(itemAt(event->pos()), 0); qlElements << mItemsPaths.at(mGraphicItems.indexOf(item));
} }
} }
}
void UBThumbnailWidget::keyPressEvent(QKeyEvent *event) if (qlElements.size() > 0){
{ mime->setUrls(qlElements);
if (mLastSelectedThumbnail) drag->setMimeData(mime);
{ drag->exec(Qt::CopyAction);
QGraphicsItem *lastSelectedGraphicsItem = dynamic_cast<QGraphicsItem*>(mLastSelectedThumbnail); }
if (!lastSelectedGraphicsItem) return; }
int startSelectionIndex = mGraphicItems.indexOf(lastSelectedGraphicsItem); }
int previousSelectedThumbnailIndex = startSelectionIndex + mSelectionSpan;
QGraphicsView::mouseMoveEvent(event);
switch (event->key()) }
{
case Qt::Key_Down:
case Qt::Key_Up: void UBThumbnailWidget::mouseReleaseEvent(QMouseEvent *event)
{ {
if (rowCount() <= 1) break; int elapsedTimeSincePress = mClickTime.elapsed();
if (Qt::ShiftModifier & event->modifiers()) deleteLasso();
{ QGraphicsView::mouseReleaseEvent(event);
int endSelectionIndex;
if (Qt::Key_Down == event->key()) if(elapsedTimeSincePress < STARTDRAGTIME) {
{ emit mouseClick(itemAt(event->pos()), 0);
endSelectionIndex = previousSelectedThumbnailIndex + columnCount(); }
if (endSelectionIndex >= mGraphicItems.count()) break; }
}
else
{ void UBThumbnailWidget::keyPressEvent(QKeyEvent *event)
endSelectionIndex = previousSelectedThumbnailIndex - columnCount(); {
if (endSelectionIndex < 0) break; if (mLastSelectedThumbnail)
} {
QGraphicsItem *lastSelectedGraphicsItem = dynamic_cast<QGraphicsItem*>(mLastSelectedThumbnail);
int startIndex = startSelectionIndex < endSelectionIndex ? startSelectionIndex : endSelectionIndex; if (!lastSelectedGraphicsItem) return;
int count = startSelectionIndex < endSelectionIndex ? endSelectionIndex - startSelectionIndex + 1 : startSelectionIndex - endSelectionIndex + 1; int startSelectionIndex = mGraphicItems.indexOf(lastSelectedGraphicsItem);
mSelectionSpan = startSelectionIndex < endSelectionIndex ? (count - 1) : - (count - 1); int previousSelectedThumbnailIndex = startSelectionIndex + mSelectionSpan;
selectItems(startIndex, count);
} switch (event->key())
else {
{ case Qt::Key_Down:
int toSelectIndex; case Qt::Key_Up:
if (Qt::Key_Down == event->key()) {
{ if (rowCount() <= 1) break;
toSelectIndex = previousSelectedThumbnailIndex + columnCount(); if (Qt::ShiftModifier & event->modifiers())
if (toSelectIndex >= mGraphicItems.count()) break; {
} int endSelectionIndex;
else if (Qt::Key_Down == event->key())
{ {
toSelectIndex = previousSelectedThumbnailIndex - columnCount(); endSelectionIndex = previousSelectedThumbnailIndex + columnCount();
if (toSelectIndex < 0) break; if (endSelectionIndex >= mGraphicItems.count()) break;
} }
else
selectItemAt(toSelectIndex, Qt::ControlModifier & event->modifiers()); {
mSelectionSpan = 0; endSelectionIndex = previousSelectedThumbnailIndex - columnCount();
} if (endSelectionIndex < 0) break;
} }
break;
int startIndex = startSelectionIndex < endSelectionIndex ? startSelectionIndex : endSelectionIndex;
case Qt::Key_Left: int count = startSelectionIndex < endSelectionIndex ? endSelectionIndex - startSelectionIndex + 1 : startSelectionIndex - endSelectionIndex + 1;
case Qt::Key_Right: mSelectionSpan = startSelectionIndex < endSelectionIndex ? (count - 1) : - (count - 1);
{ selectItems(startIndex, count);
QGraphicsItem *previousSelectedItem = mGraphicItems.at(previousSelectedThumbnailIndex); }
UBThumbnail *previousSelectedThumbnail = dynamic_cast<UBThumbnail*>(previousSelectedItem); else
if (!previousSelectedThumbnail) break; {
int toSelectIndex;
if (Qt::Key_Left == event->key()) if (Qt::Key_Down == event->key())
{ {
if (0 == previousSelectedThumbnail->column()) break; toSelectIndex = previousSelectedThumbnailIndex + columnCount();
} if (toSelectIndex >= mGraphicItems.count()) break;
else }
{ else
if (previousSelectedThumbnail->column() == columnCount() - 1 || {
previousSelectedThumbnailIndex == mGraphicItems.count() - 1) break; toSelectIndex = previousSelectedThumbnailIndex - columnCount();
} if (toSelectIndex < 0) break;
}
if (Qt::ShiftModifier & event->modifiers())
{ selectItemAt(toSelectIndex, Qt::ControlModifier & event->modifiers());
int endSelectionIndex; mSelectionSpan = 0;
if (Qt::Key_Left == event->key()) }
{ }
endSelectionIndex = previousSelectedThumbnailIndex - 1; break;
if (endSelectionIndex < 0) break;
} case Qt::Key_Left:
else case Qt::Key_Right:
{ {
endSelectionIndex = previousSelectedThumbnailIndex + 1; QGraphicsItem *previousSelectedItem = mGraphicItems.at(previousSelectedThumbnailIndex);
if (endSelectionIndex >= mGraphicItems.count()) break; UBThumbnail *previousSelectedThumbnail = dynamic_cast<UBThumbnail*>(previousSelectedItem);
} if (!previousSelectedThumbnail) break;
int startIndex = startSelectionIndex < endSelectionIndex ? startSelectionIndex : endSelectionIndex; if (Qt::Key_Left == event->key())
int count = startSelectionIndex < endSelectionIndex ? endSelectionIndex - startSelectionIndex + 1 : startSelectionIndex - endSelectionIndex + 1; {
mSelectionSpan = startSelectionIndex < endSelectionIndex ? (count - 1) : - (count - 1); if (0 == previousSelectedThumbnail->column()) break;
selectItems(startIndex, count); }
} else
else {
{ if (previousSelectedThumbnail->column() == columnCount() - 1 ||
if (Qt::Key_Left == event->key()) previousSelectedThumbnailIndex == mGraphicItems.count() - 1) break;
selectItemAt(previousSelectedThumbnailIndex - 1, Qt::ControlModifier & event->modifiers()); }
else
selectItemAt(previousSelectedThumbnailIndex + 1, Qt::ControlModifier & event->modifiers()); if (Qt::ShiftModifier & event->modifiers())
{
mSelectionSpan = 0; int endSelectionIndex;
} if (Qt::Key_Left == event->key())
} {
break; endSelectionIndex = previousSelectedThumbnailIndex - 1;
if (endSelectionIndex < 0) break;
case Qt::Key_Home: }
{ else
if (Qt::ShiftModifier & event->modifiers()) {
{ endSelectionIndex = previousSelectedThumbnailIndex + 1;
mSelectionSpan = - startSelectionIndex; if (endSelectionIndex >= mGraphicItems.count()) break;
selectItems(0, startSelectionIndex + 1); }
}
else int startIndex = startSelectionIndex < endSelectionIndex ? startSelectionIndex : endSelectionIndex;
{ int count = startSelectionIndex < endSelectionIndex ? endSelectionIndex - startSelectionIndex + 1 : startSelectionIndex - endSelectionIndex + 1;
selectItemAt(0, Qt::ControlModifier & event->modifiers()); mSelectionSpan = startSelectionIndex < endSelectionIndex ? (count - 1) : - (count - 1);
mSelectionSpan = 0; selectItems(startIndex, count);
} }
} else
break; {
if (Qt::Key_Left == event->key())
case Qt::Key_End: selectItemAt(previousSelectedThumbnailIndex - 1, Qt::ControlModifier & event->modifiers());
{ else
if (Qt::ShiftModifier & event->modifiers()) selectItemAt(previousSelectedThumbnailIndex + 1, Qt::ControlModifier & event->modifiers());
{
mSelectionSpan = mGraphicItems.count() - startSelectionIndex - 1; mSelectionSpan = 0;
selectItems(startSelectionIndex, mSelectionSpan + 1); }
} }
else break;
{
selectItemAt(mGraphicItems.count() - 1, Qt::ControlModifier & event->modifiers()); case Qt::Key_Home:
mSelectionSpan = 0; {
} if (Qt::ShiftModifier & event->modifiers())
} {
break; mSelectionSpan = - startSelectionIndex;
case Qt::Key_A: selectItems(0, startSelectionIndex + 1);
{ }
if (Qt::ControlModifier & event->modifiers()) else
selectAll(); {
} selectItemAt(0, Qt::ControlModifier & event->modifiers());
break; mSelectionSpan = 0;
} }
} }
QGraphicsView::keyPressEvent(event); break;
}
case Qt::Key_End:
{
void UBThumbnailWidget::focusInEvent(QFocusEvent *event) if (Qt::ShiftModifier & event->modifiers())
{ {
Q_UNUSED(event); mSelectionSpan = mGraphicItems.count() - startSelectionIndex - 1;
selectItems(startSelectionIndex, mSelectionSpan + 1);
if (0 == selectedItems().count() && mGraphicItems.count() > 0 && Qt::TabFocusReason == event->reason()) }
{ else
selectItemAt(0); {
mSelectionSpan = 0; selectItemAt(mGraphicItems.count() - 1, Qt::ControlModifier & event->modifiers());
} mSelectionSpan = 0;
} }
}
break;
void UBThumbnailWidget::resizeEvent(QResizeEvent *event) case Qt::Key_A:
{ {
Q_UNUSED(event); if (Qt::ControlModifier & event->modifiers())
selectAll();
refreshScene(); }
break;
emit resized(); }
} }
QGraphicsView::keyPressEvent(event);
}
void UBThumbnailWidget::sceneSelectionChanged()
{
emit selectionChanged(); void UBThumbnailWidget::focusInEvent(QFocusEvent *event)
} {
Q_UNUSED(event);
void UBThumbnailWidget::selectItemAt(int pIndex, bool extend) if (0 == selectedItems().count() && mGraphicItems.count() > 0 && Qt::TabFocusReason == event->reason())
{ {
QGraphicsItem* itemToSelect = 0; selectItemAt(0);
mSelectionSpan = 0;
if (pIndex >= 0 && pIndex < mGraphicItems.size()) }
itemToSelect = mGraphicItems.at(pIndex); }
foreach (QGraphicsItem* item, items())
{ void UBThumbnailWidget::resizeEvent(QResizeEvent *event)
if (item == itemToSelect) {
{ Q_UNUSED(event);
mLastSelectedThumbnail = dynamic_cast<UBThumbnail*>(item);
item->setSelected(true); refreshScene();
ensureVisible(item);
} emit resized();
else if (!extend) }
{
item->setSelected(false);
} void UBThumbnailWidget::sceneSelectionChanged()
} {
} emit selectionChanged();
}
void UBThumbnailWidget::unselectItemAt(int pIndex)
{
if (pIndex >= 0 && pIndex < mGraphicItems.size()) void UBThumbnailWidget::selectItemAt(int pIndex, bool extend)
{ {
QGraphicsItem *itemToUnselect = mGraphicItems.at(pIndex); QGraphicsItem* itemToSelect = 0;
itemToUnselect->setSelected(false);
} if (pIndex >= 0 && pIndex < mGraphicItems.size())
} itemToSelect = mGraphicItems.at(pIndex);
foreach (QGraphicsItem* item, items())
void UBThumbnailWidget::selectItems(int startIndex, int count) {
{ if (item == itemToSelect)
for (int i = 0; i < mGraphicItems.count(); i++) {
{ mLastSelectedThumbnail = dynamic_cast<UBThumbnail*>(item);
mGraphicItems.at(i)->setSelected(i >= startIndex && i < startIndex + count); item->setSelected(true);
} ensureVisible(item);
} }
else if (!extend)
{
void UBThumbnailWidget::selectAll() item->setSelected(false);
{ }
foreach (QGraphicsItem* item, mGraphicItems) }
{ }
item->setSelected(true);
} void UBThumbnailWidget::unselectItemAt(int pIndex)
} {
if (pIndex >= 0 && pIndex < mGraphicItems.size())
void UBThumbnailWidget::unselectAll() {
{ QGraphicsItem *itemToUnselect = mGraphicItems.at(pIndex);
foreach (QGraphicsItem* item, mGraphicItems) itemToUnselect->setSelected(false);
{ }
item->setSelected(false); }
}
}
void UBThumbnailWidget::selectItems(int startIndex, int count)
int UBThumbnailWidget::rowCount() const {
{ for (int i = 0; i < mGraphicItems.count(); i++)
UBThumbnail *lastThumbnail = dynamic_cast<UBThumbnail*>(mGraphicItems.last()); {
return lastThumbnail ? lastThumbnail->row() + 1 : 0; mGraphicItems.at(i)->setSelected(i >= startIndex && i < startIndex + count);
} }
}
int UBThumbnailWidget::columnCount() const
{
UBThumbnail *lastThumbnail = dynamic_cast<UBThumbnail*>(mGraphicItems.last()); void UBThumbnailWidget::selectAll()
if (!lastThumbnail) return 0; {
int lastRow = lastThumbnail->row(); foreach (QGraphicsItem* item, mGraphicItems)
int lastColumn = lastThumbnail->column(); {
return lastRow > 0 ? (mGraphicItems.count() - lastColumn - 1) / lastRow : mGraphicItems.count(); item->setSelected(true);
} }
}
void UBThumbnailWidget::mouseDoubleClickEvent(QMouseEvent * event) int UBThumbnailWidget::rowCount() const
{ {
QGraphicsItem* item = itemAt(event->pos()); UBThumbnail *lastThumbnail = dynamic_cast<UBThumbnail*>(mGraphicItems.last());
return lastThumbnail ? lastThumbnail->row() + 1 : 0;
if (item) }
{
int index = mGraphicItems.indexOf(item); int UBThumbnailWidget::columnCount() const
emit mouseDoubleClick(item, index); {
} UBThumbnail *lastThumbnail = dynamic_cast<UBThumbnail*>(mGraphicItems.last());
} if (!lastThumbnail) return 0;
int lastRow = lastThumbnail->row();
int lastColumn = lastThumbnail->column();
bool UBThumbnailWidget::thumbnailLessThan(QGraphicsItem* item1, QGraphicsItem* item2) return lastRow > 0 ? (mGraphicItems.count() - lastColumn - 1) / lastRow : mGraphicItems.count();
{ }
UBThumbnail *thumbnail1 = dynamic_cast<UBThumbnail*>(item1);
UBThumbnail *thumbnail2 = dynamic_cast<UBThumbnail*>(item2);
if (thumbnail1 && thumbnail2) void UBThumbnailWidget::mouseDoubleClickEvent(QMouseEvent * event)
{ {
if (thumbnail1->row() != thumbnail2->row()) QGraphicsItem* item = itemAt(event->pos());
return thumbnail1->row() < thumbnail2->row();
else if (item)
return thumbnail1->column() < thumbnail2->column(); {
} int index = mGraphicItems.indexOf(item);
return false; emit mouseDoubleClick(item, index);
} }
}
void UBThumbnailWidget::deleteLasso()
{
if (mLassoRectItem && scene()) bool UBThumbnailWidget::thumbnailLessThan(QGraphicsItem* item1, QGraphicsItem* item2)
{ {
scene()->removeItem(mLassoRectItem); UBThumbnail *thumbnail1 = dynamic_cast<UBThumbnail*>(item1);
delete mLassoRectItem; UBThumbnail *thumbnail2 = dynamic_cast<UBThumbnail*>(item2);
mLassoRectItem = 0; if (thumbnail1 && thumbnail2)
} {
} if (thumbnail1->row() != thumbnail2->row())
return thumbnail1->row() < thumbnail2->row();
else
UBThumbnail::UBThumbnail() return thumbnail1->column() < thumbnail2->column();
: mAddedToScene(false) }
{ return 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 void UBThumbnailWidget::deleteLasso()
} {
if (mLassoRectItem && scene())
UBThumbnail::~UBThumbnail() {
{ scene()->removeItem(mLassoRectItem);
if (mSelectionItem && !mAddedToScene) delete mLassoRectItem;
delete mSelectionItem; mLassoRectItem = 0;
} }
}
UBSceneThumbnailNavigPixmap::UBSceneThumbnailNavigPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex)
: UBSceneThumbnailPixmap(pix, proxy, pSceneIndex) UBThumbnail::UBThumbnail()
, bButtonsVisible(false) : mAddedToScene(false)
, bCanDelete(false) {
, bCanMoveUp(false) mSelectionItem = new QGraphicsRectItem(0, 0, 0, 0);
, bCanMoveDown(false) mSelectionItem->setPen(QPen(UBSettings::treeViewBackgroundColor, 8));
{ // TODO UB 4.x fix nasty dependencies : 8 is a bit less than half of UBThumbnailWidget.mSpacing
setAcceptsHoverEvents(true); }
setFlag(QGraphicsItem::ItemIsSelectable, true);
} UBThumbnail::~UBThumbnail()
{
UBSceneThumbnailNavigPixmap::~UBSceneThumbnailNavigPixmap() if (mSelectionItem && !mAddedToScene)
{ delete mSelectionItem;
}
}
void UBSceneThumbnailNavigPixmap::hoverEnterEvent(QGraphicsSceneHoverEvent *event) UBSceneThumbnailNavigPixmap::UBSceneThumbnailNavigPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex)
{ : UBSceneThumbnailPixmap(pix, proxy, pSceneIndex)
event->accept(); , bButtonsVisible(false)
updateButtonsState(); , bCanDelete(false)
update(); , bCanMoveUp(false)
} , bCanMoveDown(false)
{
void UBSceneThumbnailNavigPixmap::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) setAcceptsHoverEvents(true);
{ setFlag(QGraphicsItem::ItemIsSelectable, true);
event->accept(); }
bButtonsVisible = false;
update(); UBSceneThumbnailNavigPixmap::~UBSceneThumbnailNavigPixmap()
} {
void UBSceneThumbnailNavigPixmap::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) }
{
Q_UNUSED(option); void UBSceneThumbnailNavigPixmap::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
Q_UNUSED(widget); {
event->accept();
UBSceneThumbnailPixmap::paint(painter, option, widget); updateButtonsState();
if(bButtonsVisible) update();
{ }
if(bCanDelete)
painter->drawPixmap(0, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/close.svg")); void UBSceneThumbnailNavigPixmap::hoverLeaveEvent(QGraphicsSceneHoverEvent *event)
else {
painter->drawPixmap(0, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/closeDisabled.svg")); event->accept();
if(bCanMoveUp) bButtonsVisible = false;
painter->drawPixmap(BUTTONSIZE + BUTTONSPACING, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/moveUp.svg")); update();
else }
painter->drawPixmap(BUTTONSIZE + BUTTONSPACING, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/moveUpDisabled.svg"));
if(bCanMoveDown) void UBSceneThumbnailNavigPixmap::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
painter->drawPixmap(2*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/menu.svg")); {
else Q_UNUSED(option);
painter->drawPixmap(2*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/menuDisabled.svg")); Q_UNUSED(widget);
}
} UBSceneThumbnailPixmap::paint(painter, option, widget);
if(bButtonsVisible)
void UBSceneThumbnailNavigPixmap::mousePressEvent(QGraphicsSceneMouseEvent *event) {
{ if(bCanDelete)
QPointF p = event->pos(); painter->drawPixmap(0, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/close.svg"));
else
// Here we check the position of the click and verify if it has to trig an action or not. painter->drawPixmap(0, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/closeDisabled.svg"));
if(bCanDelete && p.x() >= 0 && p.x() <= BUTTONSIZE && p.y() >= 0 && p.y() <= BUTTONSIZE) if(bCanMoveUp)
{ painter->drawPixmap(BUTTONSIZE + BUTTONSPACING, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/moveUp.svg"));
deletePage(); else
} painter->drawPixmap(BUTTONSIZE + BUTTONSPACING, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/moveUpDisabled.svg"));
if(bCanMoveUp && p.x() >= BUTTONSIZE + BUTTONSPACING && p.x() <= 2*BUTTONSIZE + BUTTONSPACING && p.y() >= 0 && p.y() <= BUTTONSIZE) if(bCanMoveDown)
{ painter->drawPixmap(2*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/menu.svg"));
moveUpPage(); else
} painter->drawPixmap(2*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/menuDisabled.svg"));
if(bCanMoveDown && p.x() >= 2*(BUTTONSIZE + BUTTONSPACING) && p.x() <= 2*(BUTTONSIZE + BUTTONSPACING) + BUTTONSIZE && p.y() >= 0 && p.y() <= BUTTONSIZE) }
{ }
moveDownPage();
} void UBSceneThumbnailNavigPixmap::mousePressEvent(QGraphicsSceneMouseEvent *event)
event->accept(); {
} QPointF p = event->pos();
void UBSceneThumbnailNavigPixmap::updateButtonsState() // 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)
bCanDelete = false; {
bCanMoveUp = false; deletePage();
bCanMoveDown = false; }
if(bCanMoveUp && p.x() >= BUTTONSIZE + BUTTONSPACING && p.x() <= 2*BUTTONSIZE + BUTTONSPACING && p.y() >= 0 && p.y() <= BUTTONSIZE)
UBDocumentProxy* p = proxy(); {
if(NULL != p) moveUpPage();
{ }
int iNbPages = p->pageCount(); if(bCanMoveDown && p.x() >= 2*(BUTTONSIZE + BUTTONSPACING) && p.x() <= 2*(BUTTONSIZE + BUTTONSPACING) + BUTTONSIZE && p.y() >= 0 && p.y() <= BUTTONSIZE)
if(1 < iNbPages) {
{ moveDownPage();
bCanDelete = true; }
if(sceneIndex() > 0) event->accept();
{ }
bCanMoveUp = true;
} void UBSceneThumbnailNavigPixmap::updateButtonsState()
if(sceneIndex() != iNbPages - 1) {
{ bCanDelete = false;
bCanMoveDown = true; bCanMoveUp = false;
} bCanMoveDown = false;
}
} UBDocumentProxy* p = proxy();
if(NULL != p)
if(bCanDelete || bCanMoveUp || bCanMoveDown) {
{ int iNbPages = p->pageCount();
bButtonsVisible = true; if(1 < iNbPages)
} {
} bCanDelete = true;
if(sceneIndex() > 0)
void UBSceneThumbnailNavigPixmap::deletePage() {
{ bCanMoveUp = true;
QList<QGraphicsItem*> itemsToDelete; }
itemsToDelete << this; if(sceneIndex() != iNbPages - 1)
{
UBApplication::documentController->deletePages(itemsToDelete); bCanMoveDown = true;
} }
}
void UBSceneThumbnailNavigPixmap::moveUpPage() }
{
UBApplication::documentController->moveSceneToIndex(proxy(), sceneIndex(), sceneIndex() - 1); if(bCanDelete || bCanMoveUp || bCanMoveDown)
} {
bButtonsVisible = true;
void UBSceneThumbnailNavigPixmap::moveDownPage() }
{ }
UBApplication::documentController->moveSceneToIndex(proxy(), sceneIndex(), sceneIndex() + 1);
} void UBSceneThumbnailNavigPixmap::deletePage()
{
void UBImgTextThumbnailElement::Place(int row, int col, qreal width, qreal height) QList<QGraphicsItem*> itemsToDelete;
{ itemsToDelete << this;
int labelSpacing = 0;
if(this->caption) UBApplication::documentController->deletePages(itemsToDelete);
{ }
QFontMetrics fm(this->caption->font());
labelSpacing = UBSettings::thumbnailSpacing + fm.height(); void UBSceneThumbnailNavigPixmap::moveUpPage()
} {
if(this->thumbnail) UBApplication::documentController->moveSceneToIndex(proxy(), sceneIndex(), sceneIndex() - 1);
{ }
int w = this->thumbnail->boundingRect().width();
int h = this->thumbnail->boundingRect().height(); void UBSceneThumbnailNavigPixmap::moveDownPage()
{
qreal scaleWidth = width / w; UBApplication::documentController->moveSceneToIndex(proxy(), sceneIndex(), sceneIndex() + 1);
qreal scaleHeight = height / h; }
qreal scaleFactor = qMin(scaleWidth, scaleHeight);
UBThumbnail* pix = dynamic_cast<UBThumbnail*>(this->thumbnail); void UBImgTextThumbnailElement::Place(int row, int col, qreal width, qreal height)
{
if(pix) int labelSpacing = 0;
{ if(this->caption)
scaleFactor = qMin(scaleFactor, 1.0); {
} QFontMetrics fm(this->caption->font());
labelSpacing = UBSettings::thumbnailSpacing + fm.height();
QTransform transform; }
transform.scale(scaleFactor, scaleFactor); if(this->thumbnail)
{
// Apply the scaling int w = this->thumbnail->boundingRect().width();
this->thumbnail->setTransform(transform); int h = this->thumbnail->boundingRect().height();
this->thumbnail->setFlag(QGraphicsItem::ItemIsSelectable, true);
qreal scaleWidth = width / w;
if(pix) qreal scaleHeight = height / h;
{ qreal scaleFactor = qMin(scaleWidth, scaleHeight);
pix->setColumn(col); UBThumbnail* pix = dynamic_cast<UBThumbnail*>(this->thumbnail);
pix->setRow(row);
} if(pix)
{
QPointF pos(border + (width - w * scaleFactor) / 2 + col * (width + border), scaleFactor = qMin(scaleFactor, 1.0);
border + row * (height + border + labelSpacing) + (height - h * scaleFactor) / 2); }
this->thumbnail->setPos(pos); QTransform transform;
transform.scale(scaleFactor, scaleFactor);
if(this->caption)
{ // Apply the scaling
QFontMetrics fm(this->caption->font()); this->thumbnail->setTransform(transform);
QString elidedText = fm.elidedText(this->caption->toPlainText(), Qt::ElideRight, width); this->thumbnail->setFlag(QGraphicsItem::ItemIsSelectable, true);
this->caption->setPlainText(elidedText); if(pix)
this->caption->setWidth(fm.width(elidedText) + 2 * this->caption->document()->documentMargin()); {
pos.setY(pos.y() + (height + h * scaleFactor) / 2 + 5); // What is this 5 ?? pix->setColumn(col);
qreal labelWidth = fm.width(elidedText); pix->setRow(row);
pos.setX(border + (width - labelWidth) / 2 + col * (width + border)); }
this->caption->setPos(pos);
} 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 * 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 * it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or * the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. * (at your option) any later version.
* *
* This program is distributed in the hope that it will be useful, * This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of * but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details. * GNU General Public License for more details.
* *
* You should have received a copy of the GNU General Public License * You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#ifndef UBTHUMBNAILWIDGET_H_ #ifndef UBTHUMBNAILWIDGET_H_
#define UBTHUMBNAILWIDGET_H_ #define UBTHUMBNAILWIDGET_H_
#include <QtGui> #include <QtGui>
#include <QtSvg> #include <QtSvg>
#include <QTime> #include <QTime>
#include <QGraphicsSceneHoverEvent> #include <QGraphicsSceneHoverEvent>
#include "frameworks/UBCoreGraphicsScene.h" #include "frameworks/UBCoreGraphicsScene.h"
#include "core/UBSettings.h" #include "core/UBSettings.h"
#include "domain/UBItem.h" #include "domain/UBItem.h"
#define STARTDRAGTIME 1000000 #define STARTDRAGTIME 1000000
#define BUTTONSIZE 48 #define BUTTONSIZE 48
#define BUTTONSPACING 5 #define BUTTONSPACING 5
class UBDocumentProxy; class UBDocumentProxy;
class UBThumbnailTextItem; class UBThumbnailTextItem;
class UBThumbnail; class UBThumbnail;
class UBThumbnailWidget : public QGraphicsView class UBThumbnailWidget : public QGraphicsView
{ {
Q_OBJECT; Q_OBJECT;
public: public:
UBThumbnailWidget(QWidget* parent); UBThumbnailWidget(QWidget* parent);
virtual ~UBThumbnailWidget(); virtual ~UBThumbnailWidget();
QList<QGraphicsItem*> selectedItems(); QList<QGraphicsItem*> selectedItems();
void selectItemAt(int pIndex, bool extend = false); void selectItemAt(int pIndex, bool extend = false);
void unselectItemAt(int pIndex); void unselectItemAt(int pIndex);
qreal thumbnailWidth() qreal thumbnailWidth()
{ {
return mThumbnailWidth; return mThumbnailWidth;
} }
void setBackgroundBrush(const QBrush& brush) void setBackgroundBrush(const QBrush& brush)
{ {
mThumbnailsScene.setBackgroundBrush(brush); mThumbnailsScene.setBackgroundBrush(brush);
} }
public slots: public slots:
void setThumbnailWidth(qreal pThumbnailWidth); void setThumbnailWidth(qreal pThumbnailWidth);
void setSpacing(qreal pSpacing); void setSpacing(qreal pSpacing);
virtual void setGraphicsItems(const QList<QGraphicsItem*>& pGraphicsItems, const QList<QUrl>& pItemPaths, const QStringList pLabels = QStringList(), const QString& pMimeType = QString("")); virtual void setGraphicsItems(const QList<QGraphicsItem*>& pGraphicsItems, const QList<QUrl>& pItemPaths, const QStringList pLabels = QStringList(), const QString& pMimeType = QString(""));
void refreshScene(); void refreshScene();
void sceneSelectionChanged(); void sceneSelectionChanged();
signals: signals:
void resized(); void resized();
void selectionChanged(); void selectionChanged();
void mouseDoubleClick(QGraphicsItem* item, int index); void mouseDoubleClick(QGraphicsItem* item, int index);
void mouseClick(QGraphicsItem* item, int index); void mouseClick(QGraphicsItem* item, int index);
protected: protected:
virtual void mousePressEvent(QMouseEvent *event); virtual void mousePressEvent(QMouseEvent *event);
virtual void mouseMoveEvent(QMouseEvent *event); virtual void mouseMoveEvent(QMouseEvent *event);
virtual void mouseReleaseEvent(QMouseEvent *event); virtual void mouseReleaseEvent(QMouseEvent *event);
virtual void resizeEvent(QResizeEvent * event); virtual void resizeEvent(QResizeEvent * event);
void mouseDoubleClickEvent(QMouseEvent * event); void mouseDoubleClickEvent(QMouseEvent * event);
virtual void keyPressEvent(QKeyEvent *event); virtual void keyPressEvent(QKeyEvent *event);
virtual void focusInEvent(QFocusEvent *event); virtual void focusInEvent(QFocusEvent *event);
QList<QGraphicsItem*> mGraphicItems; QList<QGraphicsItem*> mGraphicItems;
QList<UBThumbnailTextItem*> mLabelsItems; QList<UBThumbnailTextItem*> mLabelsItems;
QPointF mMousePressScenePos; QPointF mMousePressScenePos;
QPoint mMousePressPos; QPoint mMousePressPos;
protected: protected:
qreal spacing() { return mSpacing; } qreal spacing() { return mSpacing; }
QList<QUrl> mItemsPaths; QList<QUrl> mItemsPaths;
QStringList mLabels; QStringList mLabels;
bool bSelectionInProgress; bool bSelectionInProgress;
bool bCanDrag; bool bCanDrag;
private: private:
void selectAll(); void selectAll();
void unselectAll(); void selectItems(int startIndex, int count);
void selectItems(int startIndex, int count); int rowCount() const;
int rowCount() const; int columnCount() const;
int columnCount() const;
static bool thumbnailLessThan(QGraphicsItem* item1, QGraphicsItem* item2);
static bool thumbnailLessThan(QGraphicsItem* item1, QGraphicsItem* item2);
void deleteLasso();
void deleteLasso();
UBCoreGraphicsScene mThumbnailsScene;
UBCoreGraphicsScene mThumbnailsScene;
QString mMimeType;
QString mMimeType;
QPointF prevMoveMousePos;
qreal mThumbnailWidth;
qreal mThumbnailHeight; qreal mThumbnailWidth;
qreal mSpacing; qreal mThumbnailHeight;
qreal mSpacing;
UBThumbnail *mLastSelectedThumbnail;
int mSelectionSpan; UBThumbnail *mLastSelectedThumbnail;
QGraphicsRectItem *mLassoRectItem; int mSelectionSpan;
QList<QGraphicsItem*> mSelectedThumbnailItems; QGraphicsRectItem *mLassoRectItem;
QTime mClickTime; QSet<QGraphicsItem*> mSelectedThumbnailItems;
}; QSet<QGraphicsItem*> mPreviouslyIncrementalSelectedItems;
QTime mClickTime;
};
class UBThumbnail
{
public: class UBThumbnail
UBThumbnail(); {
public:
virtual ~UBThumbnail(); UBThumbnail();
QStyleOptionGraphicsItem muteStyleOption(const QStyleOptionGraphicsItem *option) virtual ~UBThumbnail();
{
// Never draw the rubber band, we draw our custom selection with the DelegateFrame QStyleOptionGraphicsItem muteStyleOption(const QStyleOptionGraphicsItem *option)
QStyleOptionGraphicsItem styleOption = QStyleOptionGraphicsItem(*option); {
styleOption.state &= ~QStyle::State_Selected; // Never draw the rubber band, we draw our custom selection with the DelegateFrame
QStyleOptionGraphicsItem styleOption = QStyleOptionGraphicsItem(*option);
return styleOption; styleOption.state &= ~QStyle::State_Selected;
}
return styleOption;
virtual void itemChange(QGraphicsItem *item, QGraphicsItem::GraphicsItemChange change, const QVariant &value) }
{
Q_UNUSED(value); virtual void itemChange(QGraphicsItem *item, QGraphicsItem::GraphicsItemChange change, const QVariant &value)
{
if ((change == QGraphicsItem::ItemSelectedHasChanged Q_UNUSED(value);
|| change == QGraphicsItem::ItemTransformHasChanged
|| change == QGraphicsItem::ItemPositionHasChanged) if ((change == QGraphicsItem::ItemSelectedHasChanged
&& item->scene()) || change == QGraphicsItem::ItemTransformHasChanged
{ || change == QGraphicsItem::ItemPositionHasChanged)
if (item->isSelected()) && item->scene())
{ {
if (!mSelectionItem->scene()) if (item->isSelected())
{ {
item->scene()->addItem(mSelectionItem); if (!mSelectionItem->scene())
mSelectionItem->setZValue(item->zValue() - 1); {
// UBGraphicsItem::assignZValue(mSelectionItem, item->zValue() - 1); item->scene()->addItem(mSelectionItem);
mAddedToScene = true; mSelectionItem->setZValue(item->zValue() - 1);
} // UBGraphicsItem::assignZValue(mSelectionItem, item->zValue() - 1);
mAddedToScene = true;
mSelectionItem->setRect( }
item->sceneBoundingRect().x() - 5,
item->sceneBoundingRect().y() - 5, mSelectionItem->setRect(
item->sceneBoundingRect().width() + 10, item->sceneBoundingRect().x() - 5,
item->sceneBoundingRect().height() + 10); item->sceneBoundingRect().y() - 5,
item->sceneBoundingRect().width() + 10,
mSelectionItem->show(); item->sceneBoundingRect().height() + 10);
} mSelectionItem->show();
else
{ }
mSelectionItem->hide(); else
} {
} mSelectionItem->hide();
} }
}
int column() { return mColumn; } }
void setColumn(int column) { mColumn = column; }
int row() { return mRow; } int column() { return mColumn; }
void setRow(int row) { mRow = row; } void setColumn(int column) { mColumn = column; }
int row() { return mRow; }
protected: void setRow(int row) { mRow = row; }
QGraphicsRectItem *mSelectionItem;
private: protected:
bool mAddedToScene; QGraphicsRectItem *mSelectionItem;
private:
int mColumn; bool mAddedToScene;
int mRow;
}; int mColumn;
int mRow;
};
class UBThumbnailSvg : public QGraphicsSvgItem, public UBThumbnail
{
public: class UBThumbnailSvg : public QGraphicsSvgItem, public UBThumbnail
UBThumbnailSvg(const QString& path) {
: QGraphicsSvgItem(path) public:
{ UBThumbnailSvg(const QString& path)
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); : QGraphicsSvgItem(path)
} {
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
virtual ~UBThumbnailSvg() }
{
// NOOP virtual ~UBThumbnailSvg()
} {
// NOOP
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) }
{
QStyleOptionGraphicsItem styleOption = UBThumbnail::muteStyleOption(option); virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
QGraphicsSvgItem::paint(painter, &styleOption, widget); {
} QStyleOptionGraphicsItem styleOption = UBThumbnail::muteStyleOption(option);
QGraphicsSvgItem::paint(painter, &styleOption, widget);
virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value) }
{
UBThumbnail::itemChange(this, change, value); virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value)
return QGraphicsSvgItem::itemChange(change, value); {
} UBThumbnail::itemChange(this, change, value);
return QGraphicsSvgItem::itemChange(change, value);
}; }
};
class UBThumbnailPixmap : public QGraphicsPixmapItem, public UBThumbnail
{
public: class UBThumbnailPixmap : public QGraphicsPixmapItem, public UBThumbnail
UBThumbnailPixmap(const QPixmap& pix) {
: QGraphicsPixmapItem(pix) public:
{ UBThumbnailPixmap(const QPixmap& pix)
setTransformationMode(Qt::SmoothTransformation); // UB 4.3 may be expensive -- make configurable : QGraphicsPixmapItem(pix)
setShapeMode(QGraphicsPixmapItem::BoundingRectShape); {
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); setTransformationMode(Qt::SmoothTransformation); // UB 4.3 may be expensive -- make configurable
} setShapeMode(QGraphicsPixmapItem::BoundingRectShape);
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
virtual ~UBThumbnailPixmap() }
{
// NOOP virtual ~UBThumbnailPixmap()
} {
// NOOP
virtual QPainterPath shape () const }
{
QPainterPath path; virtual QPainterPath shape () const
path.addRect(boundingRect()); {
return path; QPainterPath path;
} path.addRect(boundingRect());
return path;
}
virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
QStyleOptionGraphicsItem styleOption = UBThumbnail::muteStyleOption(option); virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
QGraphicsPixmapItem::paint(painter, &styleOption, widget); {
} QStyleOptionGraphicsItem styleOption = UBThumbnail::muteStyleOption(option);
QGraphicsPixmapItem::paint(painter, &styleOption, widget);
virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value) }
{
UBThumbnail::itemChange(this, change, value); virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value)
return QGraphicsPixmapItem::itemChange(change, value); {
} UBThumbnail::itemChange(this, change, value);
}; return QGraphicsPixmapItem::itemChange(change, value);
}
};
class UBSceneThumbnailPixmap : public UBThumbnailPixmap
{
public: class UBSceneThumbnailPixmap : public UBThumbnailPixmap
UBSceneThumbnailPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex) {
: UBThumbnailPixmap(pix) public:
, mProxy(proxy) UBSceneThumbnailPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex)
, mSceneIndex(pSceneIndex) : UBThumbnailPixmap(pix)
{ , mProxy(proxy)
// NOOP , mSceneIndex(pSceneIndex)
} {
// NOOP
virtual ~UBSceneThumbnailPixmap() }
{
// NOOP virtual ~UBSceneThumbnailPixmap()
} {
// NOOP
UBDocumentProxy* proxy() }
{
return mProxy; UBDocumentProxy* proxy()
} {
return mProxy;
int sceneIndex() }
{
return mSceneIndex; int sceneIndex()
} {
return mSceneIndex;
void highlight() }
{
//NOOP void highlight()
} {
//NOOP
private: }
UBDocumentProxy* mProxy;
int mSceneIndex; private:
}; UBDocumentProxy* mProxy;
int mSceneIndex;
class UBSceneThumbnailNavigPixmap : public UBSceneThumbnailPixmap };
{
public: class UBSceneThumbnailNavigPixmap : public UBSceneThumbnailPixmap
UBSceneThumbnailNavigPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex); {
~UBSceneThumbnailNavigPixmap(); public:
UBSceneThumbnailNavigPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex);
protected: ~UBSceneThumbnailNavigPixmap();
void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); protected:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void hoverEnterEvent(QGraphicsSceneHoverEvent *event);
void mousePressEvent(QGraphicsSceneMouseEvent *event); void hoverLeaveEvent(QGraphicsSceneHoverEvent *event);
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
private: void mousePressEvent(QGraphicsSceneMouseEvent *event);
void updateButtonsState();
void deletePage(); private:
void moveUpPage(); void updateButtonsState();
void moveDownPage(); void deletePage();
void moveUpPage();
bool bButtonsVisible; void moveDownPage();
bool bCanDelete;
bool bCanMoveUp; bool bButtonsVisible;
bool bCanMoveDown; bool bCanDelete;
}; bool bCanMoveUp;
bool bCanMoveDown;
class UBThumbnailVideo : public UBThumbnailPixmap };
{
public: class UBThumbnailVideo : public UBThumbnailPixmap
UBThumbnailVideo(const QUrl &path) {
: UBThumbnailPixmap(QPixmap(":/images/movie.svg")) public:
, mPath(path) UBThumbnailVideo(const QUrl &path)
{ : UBThumbnailPixmap(QPixmap(":/images/movie.svg"))
// NOOP , mPath(path)
} {
// NOOP
virtual ~UBThumbnailVideo() }
{
// NOOP virtual ~UBThumbnailVideo()
} {
// NOOP
QUrl path() }
{
return mPath; QUrl path()
} {
return mPath;
private: }
QUrl mPath; private:
};
QUrl mPath;
class UBThumbnailTextItem : public QGraphicsTextItem };
{
public: class UBThumbnailTextItem : public QGraphicsTextItem
UBThumbnailTextItem(const QString& text) {
: QGraphicsTextItem(text) public:
, mUnelidedText(text) UBThumbnailTextItem(const QString& text)
, mIsHighlighted(false) : QGraphicsTextItem(text)
{ , mUnelidedText(text)
setFlag(QGraphicsItem::ItemSendsGeometryChanges, true); , 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) QRectF boundingRect() const { return QRectF(QPointF(0.0, 0.0), QSize(mWidth, QFontMetricsF(font()).height() + 5));}
{
if (mWidth != pWidth) void setWidth(qreal pWidth)
{ {
prepareGeometryChange(); if (mWidth != pWidth)
mWidth = pWidth; {
computeText(); prepareGeometryChange();
} mWidth = pWidth;
}; computeText();
}
qreal width() {return mWidth;} };
void highlight() qreal width() {return mWidth;}
{
if (!mIsHighlighted) void highlight()
{ {
mIsHighlighted = true; if (!mIsHighlighted)
computeText(); {
} mIsHighlighted = true;
} computeText();
}
void computeText() }
{
QFontMetricsF fm(font()); void computeText()
QString elidedText = fm.elidedText(mUnelidedText, Qt::ElideRight, mWidth); {
QFontMetricsF fm(font());
if (mIsHighlighted) QString elidedText = fm.elidedText(mUnelidedText, Qt::ElideRight, mWidth);
{
setHtml("<span style=\"color: #6682b5\">" + elidedText + "</span>"); if (mIsHighlighted)
} {
else setHtml("<span style=\"color: #6682b5\">" + elidedText + "</span>");
{ }
setPlainText(elidedText); else
} {
} setPlainText(elidedText);
}
private: }
qreal mWidth;
QString mUnelidedText; private:
bool mIsHighlighted; qreal mWidth;
}; QString mUnelidedText;
bool mIsHighlighted;
class UBImgTextThumbnailElement };
{
private: class UBImgTextThumbnailElement
QGraphicsItem* thumbnail; {
UBThumbnailTextItem* caption; private:
int border; QGraphicsItem* thumbnail;
UBThumbnailTextItem* caption;
public: int border;
UBImgTextThumbnailElement(QGraphicsItem* thumb, UBThumbnailTextItem* text): border(0)
{ public:
this->thumbnail = thumb; UBImgTextThumbnailElement(QGraphicsItem* thumb, UBThumbnailTextItem* text): border(0)
this->caption = text; {
} this->thumbnail = thumb;
this->caption = text;
QGraphicsItem* getThumbnail() const { return this->thumbnail; } }
void setThumbnail(QGraphicsItem* newGItem) { this->thumbnail = newGItem; }
QGraphicsItem* getThumbnail() const { return this->thumbnail; }
UBThumbnailTextItem* getCaption() const { return this->caption; } void setThumbnail(QGraphicsItem* newGItem) { this->thumbnail = newGItem; }
void setCaption(UBThumbnailTextItem* newcaption) { this->caption = newcaption; }
UBThumbnailTextItem* getCaption() const { return this->caption; }
void Place(int row, int col, qreal width, qreal height); void setCaption(UBThumbnailTextItem* newcaption) { this->caption = newcaption; }
int getBorder() const { return this->border; } void Place(int row, int col, qreal width, qreal height);
void setBorder(int newBorder) { this->border = newBorder; }
}; int getBorder() const { return this->border; }
void setBorder(int newBorder) { this->border = newBorder; }
};
#endif /* UBTHUMBNAILWIDGET_H_ */
#endif /* UBTHUMBNAILWIDGET_H_ */
...@@ -46,7 +46,11 @@ HEADERS += src/gui/UBThumbnailView.h \ ...@@ -46,7 +46,11 @@ HEADERS += src/gui/UBThumbnailView.h \
src/gui/UBLibWebView.h \ src/gui/UBLibWebView.h \
src/gui/UBDownloadWidget.h \ src/gui/UBDownloadWidget.h \
src/gui/UBDockDownloadWidget.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 \ SOURCES += src/gui/UBThumbnailView.cpp \
src/gui/UBFloatingPalette.cpp \ src/gui/UBFloatingPalette.cpp \
...@@ -95,7 +99,11 @@ SOURCES += src/gui/UBThumbnailView.cpp \ ...@@ -95,7 +99,11 @@ SOURCES += src/gui/UBThumbnailView.cpp \
src/gui/UBLibWebView.cpp \ src/gui/UBLibWebView.cpp \
src/gui/UBDownloadWidget.cpp \ src/gui/UBDownloadWidget.cpp \
src/gui/UBDockDownloadWidget.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 { win32 {
...@@ -123,15 +131,3 @@ linux-g++-64 { ...@@ -123,15 +131,3 @@ linux-g++-64 {
SOURCES += src/gui/UBKeyboardPalette_linux.cpp SOURCES += src/gui/UBKeyboardPalette_linux.cpp
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment