diff --git a/resources/style.qss b/resources/style.qss
index 31f1e671..29505cea 100644
--- a/resources/style.qss
+++ b/resources/style.qss
@@ -26,6 +26,13 @@ QWidget#UBLibWebView
border: 2px solid #999999;
}
+QWidget#UBFeaturesWebView
+{
+ background: #EEEEEE;
+ border-radius : 10px;
+ border: 2px solid #999999;
+}
+
QListView
{
background: #EEEEEE;
diff --git a/src/adaptors/UBExportCFF.cpp b/src/adaptors/UBExportCFF.cpp
index 741eb871..bc97a730 100644
--- a/src/adaptors/UBExportCFF.cpp
+++ b/src/adaptors/UBExportCFF.cpp
@@ -3,6 +3,7 @@
#include "document/UBDocumentProxy.h"
#include "core/UBDocumentManager.h"
#include "core/UBApplication.h"
+#include "core/memcheck.h"
UBExportCFF::UBExportCFF(QObject *parent)
diff --git a/src/board/UBBoardPaletteManager.cpp b/src/board/UBBoardPaletteManager.cpp
index 51b8622e..980a6911 100644
--- a/src/board/UBBoardPaletteManager.cpp
+++ b/src/board/UBBoardPaletteManager.cpp
@@ -58,10 +58,10 @@
#include "UBBoardController.h"
-#include "core/memcheck.h"
-
#include "document/UBDocumentController.h"
+#include "core/memcheck.h"
+
UBBoardPaletteManager::UBBoardPaletteManager(QWidget* container, UBBoardController* pBoardController)
: QObject(container)
, mKeyboardPalette(0)
@@ -81,7 +81,9 @@ UBBoardPaletteManager::UBBoardPaletteManager(QWidget* container, UBBoardControll
, mPendingPanButtonPressed(false)
, mPendingEraseButtonPressed(false)
, mpPageNavigWidget(NULL)
+#ifdef USE_WEB_WIDGET
, mpLibWidget(NULL)
+#endif
, mpCachePropWidget(NULL)
, mpDownloadWidget(NULL)
, mpDesktopLibWidget(NULL)
@@ -132,7 +134,9 @@ void UBBoardPaletteManager::setupDockPaletteWidgets()
mpPageNavigWidget = new UBPageNavigationWidget();
+#ifdef USE_WEB_WIDGET
mpLibWidget = new UBLibWidget();
+#endif
mpCachePropWidget = new UBCachePropertiesWidget();
@@ -159,8 +163,11 @@ void UBBoardPaletteManager::setupDockPaletteWidgets()
mRightPalette->addTab(mpFeaturesWidget);
//Do not show deprecated lib widget to prevent collisions. Uncomment to return lib widget
-// mRightPalette->registerWidget(mpLibWidget);
-// mRightPalette->addTab(mpLibWidget);
+
+#ifdef USE_WEB_WIDGET
+ mRightPalette->registerWidget(mpLibWidget);
+ mRightPalette->addTab(mpLibWidget);
+#endif
// The cache widget will be visible only if a cache is put on the page
@@ -841,10 +848,10 @@ void UBBoardPaletteManager::addItemToLibrary()
}
QImage image = mPixmap.toImage();
- if(NULL != mpLibWidget)
- {
- mpLibWidget->libNavigator()->libraryWidget()->libraryController()->importImageOnLibrary(image);
- }
+#ifdef USE_WEB_WIDGET
+ mpLibWidget->libNavigator()->libraryWidget()->libraryController()->importImageOnLibrary(image);
+#endif
+
}
else
{
diff --git a/src/board/UBBoardPaletteManager.h b/src/board/UBBoardPaletteManager.h
index 6a1c60a1..8e9cef3e 100644
--- a/src/board/UBBoardPaletteManager.h
+++ b/src/board/UBBoardPaletteManager.h
@@ -1,184 +1,192 @@
-/*
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-#ifndef UBBOARDPALETTEMANAGER_H_
-#define UBBOARDPALETTEMANAGER_H_
-
-#include
-#include
-
-#include "web/UBRoutedMouseEventWebView.h"
-#include "gui/UBLeftPalette.h"
-#include "gui/UBRightPalette.h"
-#include "gui/UBPageNavigationWidget.h"
-#include "gui/UBLibWidget.h"
-#include "gui/UBCachePropertiesWidget.h"
-#include "gui/UBDockDownloadWidget.h"
-#include "core/UBApplicationController.h"
-#include "gui/UBFeaturesWidget.h"
-
-
-class UBStylusPalette;
-class UBClockPalette;
-class UBPageNumberPalette;
-class UBZoomPalette;
-class UBActionPalette;
-class UBBoardController;
-class UBFloatingPalette;
-class UBServerXMLHttpRequest;
-class UBKeyboardPalette;
-class UBMainWindow;
-class UBApplicationController;
-class UBDockTeacherGuideWidget;
-
-class UBBoardPaletteManager : public QObject
-{
- Q_OBJECT
-
- public:
- UBBoardPaletteManager(QWidget* container, UBBoardController* controller);
- virtual ~UBBoardPaletteManager();
-
- void setupLayout();
- UBLeftPalette* leftPalette(){return mLeftPalette;}
- UBRightPalette* rightPalette(){return mRightPalette;}
- UBStylusPalette* stylusPalette(){return mStylusPalette;}
- void showVirtualKeyboard(bool show = true);
- void initPalettesPosAtStartup();
- void connectToDocumentController();
- void refreshPalettes();
-
- UBKeyboardPalette *mKeyboardPalette;
-
- void processPalettersWidget(UBDockPalette *paletter, eUBDockPaletteWidgetMode mode);
- void changeMode(eUBDockPaletteWidgetMode newMode, bool isInit = false);
- void startDownloads();
- void stopDownloads();
-
- signals:
- void connectToDocController();
- void signal_changeMode(eUBDockPaletteWidgetMode newMode);
-
- public slots:
-
- void activeSceneChanged();
- void containerResized();
- void addItem(const QUrl& pUrl);
- void addItem(const QPixmap& pPixmap, const QPointF& p = QPointF(0.0, 0.0), qreal scale = 1.0, const QUrl& sourceUrl = QUrl());
-
- void slot_changeMainMode(UBApplicationController::MainMode);
- void slot_changeDesktopMode(bool);
-
- private:
-
- void setupPalettes();
- void connectPalettes();
- void positionFreeDisplayPalette();
- void setupDockPaletteWidgets();
-
- QWidget* mContainer;
- UBBoardController *mBoardControler;
-
- UBStylusPalette *mStylusPalette;
-
- UBZoomPalette *mZoomPalette;
-
- /** The left dock palette */
- UBLeftPalette* mLeftPalette;
- /** The right dock palette */
- UBRightPalette* mRightPalette;
-
- UBActionPalette *mBackgroundsPalette;
- UBActionPalette *mToolsPalette;
- UBActionPalette* mAddItemPalette;
- UBActionPalette* mErasePalette;
- UBActionPalette* mPagePalette;
-
- QUrl mItemUrl;
- QPixmap mPixmap;
- QPointF mPos;
- qreal mScaleFactor;
-
- QTime mPageButtonPressedTime;
- bool mPendingPageButtonPressed;
-
- QTime mZoomButtonPressedTime;
- bool mPendingZoomButtonPressed;
-
- QTime mPanButtonPressedTime;
- bool mPendingPanButtonPressed;
-
- QTime mEraseButtonPressedTime;
- bool mPendingEraseButtonPressed;
-
- /** The page navigator widget */
- UBPageNavigationWidget* mpPageNavigWidget;
- /** The library widget */
- UBLibWidget* mpLibWidget;
- /** The cache properties widget */
- UBCachePropertiesWidget* mpCachePropWidget;
-
- UBFeaturesWidget *mpFeaturesWidget;
-
- /** The download widget */
- UBDockDownloadWidget* mpDownloadWidget;
- // HACK: here we duplicate the lib widget for the desktop mode
- // we MUST refactor the architecture in order to use only one
- // lib widget!
- UBLibWidget* mpDesktopLibWidget;
-
- UBDockTeacherGuideWidget* mpTeacherGuideWidget;
-
- bool mDownloadInProgress;
-
- private slots:
-
- void changeBackground();
-
- void toggleBackgroundPalette(bool checked);
- void backgroundPaletteClosed();
-
- void toggleStylusPalette(bool checked);
- void tooglePodcastPalette(bool checked);
-
- void erasePaletteButtonPressed();
- void erasePaletteButtonReleased();
-
- void toggleErasePalette(bool ckecked);
- void erasePaletteClosed();
-
- void togglePagePalette(bool ckecked);
- void pagePaletteClosed();
-
- void pagePaletteButtonPressed();
- void pagePaletteButtonReleased();
-
- void addItemToCurrentPage();
- void addItemToNewPage();
- void addItemToLibrary();
-
- void purchaseLinkActivated(const QString&);
-
- void linkClicked(const QUrl& url);
-
- void zoomButtonPressed();
- void zoomButtonReleased();
- void panButtonPressed();
- void panButtonReleased();
-
- void changeStylusPaletteOrientation(QVariant var);
-};
-
-#endif /* UBBOARDPALETTEMANAGER_H_ */
+/*
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#ifndef UBBOARDPALETTEMANAGER_H_
+#define UBBOARDPALETTEMANAGER_H_
+
+#include
+#include
+
+#include "web/UBRoutedMouseEventWebView.h"
+#include "gui/UBLeftPalette.h"
+#include "gui/UBRightPalette.h"
+#include "gui/UBPageNavigationWidget.h"
+#include "gui/UBLibWidget.h"
+#include "gui/UBCachePropertiesWidget.h"
+#include "gui/UBDockDownloadWidget.h"
+#include "core/UBApplicationController.h"
+#include "gui/UBFeaturesWidget.h"
+
+
+class UBStylusPalette;
+class UBClockPalette;
+class UBPageNumberPalette;
+class UBZoomPalette;
+class UBActionPalette;
+class UBBoardController;
+class UBFloatingPalette;
+class UBServerXMLHttpRequest;
+class UBKeyboardPalette;
+class UBMainWindow;
+class UBApplicationController;
+class UBDockTeacherGuideWidget;
+
+// Uncomment this to use old-styles lib paletter
+// #define USE_WEB_WIDGET
+
+
+class UBBoardPaletteManager : public QObject
+{
+ Q_OBJECT
+
+ public:
+ UBBoardPaletteManager(QWidget* container, UBBoardController* controller);
+ virtual ~UBBoardPaletteManager();
+
+ void setupLayout();
+ UBLeftPalette* leftPalette(){return mLeftPalette;}
+ UBRightPalette* rightPalette(){return mRightPalette;}
+ UBStylusPalette* stylusPalette(){return mStylusPalette;}
+ void showVirtualKeyboard(bool show = true);
+ void initPalettesPosAtStartup();
+ void connectToDocumentController();
+ void refreshPalettes();
+
+ UBKeyboardPalette *mKeyboardPalette;
+
+ void processPalettersWidget(UBDockPalette *paletter, eUBDockPaletteWidgetMode mode);
+ void changeMode(eUBDockPaletteWidgetMode newMode, bool isInit = false);
+ void startDownloads();
+ void stopDownloads();
+
+ signals:
+ void connectToDocController();
+ void signal_changeMode(eUBDockPaletteWidgetMode newMode);
+
+ public slots:
+
+ void activeSceneChanged();
+ void containerResized();
+ void addItem(const QUrl& pUrl);
+ void addItem(const QPixmap& pPixmap, const QPointF& p = QPointF(0.0, 0.0), qreal scale = 1.0, const QUrl& sourceUrl = QUrl());
+
+ void slot_changeMainMode(UBApplicationController::MainMode);
+ void slot_changeDesktopMode(bool);
+
+ private:
+
+ void setupPalettes();
+ void connectPalettes();
+ void positionFreeDisplayPalette();
+ void setupDockPaletteWidgets();
+
+ QWidget* mContainer;
+ UBBoardController *mBoardControler;
+
+ UBStylusPalette *mStylusPalette;
+
+ UBZoomPalette *mZoomPalette;
+
+ /** The left dock palette */
+ UBLeftPalette* mLeftPalette;
+ /** The right dock palette */
+ UBRightPalette* mRightPalette;
+
+ UBActionPalette *mBackgroundsPalette;
+ UBActionPalette *mToolsPalette;
+ UBActionPalette* mAddItemPalette;
+ UBActionPalette* mErasePalette;
+ UBActionPalette* mPagePalette;
+
+ QUrl mItemUrl;
+ QPixmap mPixmap;
+ QPointF mPos;
+ qreal mScaleFactor;
+
+ QTime mPageButtonPressedTime;
+ bool mPendingPageButtonPressed;
+
+ QTime mZoomButtonPressedTime;
+ bool mPendingZoomButtonPressed;
+
+ QTime mPanButtonPressedTime;
+ bool mPendingPanButtonPressed;
+
+ QTime mEraseButtonPressedTime;
+ bool mPendingEraseButtonPressed;
+
+ /** The page navigator widget */
+ UBPageNavigationWidget* mpPageNavigWidget;
+
+#ifdef USE_WEB_WIDGET
+ /** The library widget */
+ UBLibWidget* mpLibWidget;
+#endif
+
+ /** The cache properties widget */
+ UBCachePropertiesWidget* mpCachePropWidget;
+
+ UBFeaturesWidget *mpFeaturesWidget;
+
+ /** The download widget */
+ UBDockDownloadWidget* mpDownloadWidget;
+ // HACK: here we duplicate the lib widget for the desktop mode
+ // we MUST refactor the architecture in order to use only one
+ // lib widget!
+ UBLibWidget* mpDesktopLibWidget;
+
+ UBDockTeacherGuideWidget* mpTeacherGuideWidget;
+
+ bool mDownloadInProgress;
+
+ private slots:
+
+ void changeBackground();
+
+ void toggleBackgroundPalette(bool checked);
+ void backgroundPaletteClosed();
+
+ void toggleStylusPalette(bool checked);
+ void tooglePodcastPalette(bool checked);
+
+ void erasePaletteButtonPressed();
+ void erasePaletteButtonReleased();
+
+ void toggleErasePalette(bool ckecked);
+ void erasePaletteClosed();
+
+ void togglePagePalette(bool ckecked);
+ void pagePaletteClosed();
+
+ void pagePaletteButtonPressed();
+ void pagePaletteButtonReleased();
+
+ void addItemToCurrentPage();
+ void addItemToNewPage();
+ void addItemToLibrary();
+
+ void purchaseLinkActivated(const QString&);
+
+ void linkClicked(const QUrl& url);
+
+ void zoomButtonPressed();
+ void zoomButtonReleased();
+ void panButtonPressed();
+ void panButtonReleased();
+
+ void changeStylusPaletteOrientation(QVariant var);
+};
+
+#endif /* UBBOARDPALETTEMANAGER_H_ */
diff --git a/src/board/UBFeaturesController.cpp b/src/board/UBFeaturesController.cpp
index 0e34c595..b104c317 100644
--- a/src/board/UBFeaturesController.cpp
+++ b/src/board/UBFeaturesController.cpp
@@ -18,13 +18,30 @@
#include "domain/UBGraphicsVideoItem.h"
#include "domain/UBGraphicsWidgetItem.h"
-UBFeature::UBFeature(const QString &url, const QPixmap &icon, const QString &name, const QString &realPath, UBFeatureElementType type)
+UBFeature::UBFeature(const QString &url, const QPixmap &icon, const QString &name, const QUrl &realPath, UBFeatureElementType type)
: virtualPath(url), mThumbnail(icon), mName(name), mPath(realPath), elementType(type)
{
}
+QString UBFeature::getUrl() const
+{
+ if ( elementType == FEATURE_INTERNAL )
+ return getFullPath().toString();
+ /*if ( UBApplication::isFromWeb( getFullPath() ) )
+ return QUrl( getFullPath() );*/
+ return getFullPath().toLocalFile();
+}
+
+bool UBFeature::operator ==( const UBFeature &f )const
+{
+ return virtualPath == f.getVirtualPath() && mName == f.getName() && mPath == f.getFullPath() && elementType == f.getType();
+}
+bool UBFeature::operator !=( const UBFeature &f )const
+{
+ return !(*this == f);
+}
bool UBFeature::isFolder() const
{
@@ -32,6 +49,10 @@ bool UBFeature::isFolder() const
|| elementType == FEATURE_FOLDER;
}
+bool UBFeature::isDeletable()const
+{
+ return elementType == FEATURE_ITEM;
+}
UBFeaturesController::UBFeaturesController(QWidget *pParentWidget) :
QObject(pParentWidget),
@@ -43,23 +64,24 @@ UBFeaturesController::UBFeaturesController(QWidget *pParentWidget) :
void UBFeaturesController::initDirectoryTree()
{
- mUserAudioDirectoryPath = UBSettings::settings()->userAudioDirectory();
- mUserVideoDirectoryPath = UBSettings::settings()->userVideoDirectory();
- mUserPicturesDirectoryPath = UBSettings::settings()->userImageDirectory();
- mUserInteractiveDirectoryPath = UBSettings::settings()->userInteractiveDirectory();
- mUserAnimationDirectoryPath = UBSettings::settings()->userAnimationDirectory();
-
- mLibPicturesDirectoryPath = UBSettings::settings()->applicationImageLibraryDirectory();
- mLibInteractiveDirectoryPath = UBSettings::settings()->applicationInteractivesDirectory();
- mLibApplicationsDirectoryPath = UBSettings::settings()->applicationApplicationsLibraryDirectory();
- mLibShapesDirectoryPath = UBSettings::settings()->applicationShapeLibraryDirectory() ;
- trashDirectoryPath = UBSettings::userTrashDirPath();
+ mUserAudioDirectoryPath = QUrl::fromLocalFile( UBSettings::settings()->userAudioDirectory() );
+ mUserVideoDirectoryPath = QUrl::fromLocalFile( UBSettings::settings()->userVideoDirectory() );
+ mUserPicturesDirectoryPath = QUrl::fromLocalFile( UBSettings::settings()->userImageDirectory() );
+ mUserInteractiveDirectoryPath = QUrl::fromLocalFile( UBSettings::settings()->userInteractiveDirectory() );
+ mUserAnimationDirectoryPath = QUrl::fromLocalFile( UBSettings::settings()->userAnimationDirectory() );
+
+ mLibPicturesDirectoryPath = QUrl::fromLocalFile( UBSettings::settings()->applicationImageLibraryDirectory() );
+ mLibInteractiveDirectoryPath = QUrl::fromLocalFile( UBSettings::settings()->applicationInteractivesDirectory() );
+ mLibApplicationsDirectoryPath = QUrl::fromLocalFile( UBSettings::settings()->applicationApplicationsLibraryDirectory() );
+ mLibShapesDirectoryPath = QUrl::fromLocalFile( UBSettings::settings()->applicationShapeLibraryDirectory() );
+ mLibSearchDirectoryPath =QUrl::fromLocalFile( UBSettings::settings()->userSearchDirectory() );
+ trashDirectoryPath = QUrl::fromLocalFile( UBSettings::userTrashDirPath() );
featuresList = new QList ();
QList tools = UBToolsManager::manager()->allTools();
- featuresList->append( UBFeature( QString(), QPixmap( ":images/libpalette/home.png" ), "root", QString() ) );
+ featuresList->append( UBFeature( QString(), QPixmap( ":images/libpalette/home.png" ), "root", QUrl() ) );
currentElement = featuresList->at(0);
appPath = rootPath + "/Applications";
@@ -72,26 +94,32 @@ void UBFeaturesController::initDirectoryTree()
trashPath = rootPath + "/Trash";
favoritePath = rootPath + "/Favorites";
- featuresList->append( UBFeature( rootPath, QPixmap(":images/libpalette/AudiosCategory.svg"), "Audios" , mUserAudioDirectoryPath ) );
- featuresList->append( UBFeature( rootPath, QPixmap(":images/libpalette/MoviesCategory.svg"), "Movies" , mUserVideoDirectoryPath ) );
- featuresList->append( UBFeature( rootPath, QPixmap(":images/libpalette/PicturesCategory.svg"), "Pictures" , mUserPicturesDirectoryPath ) );
+ audiosElement = UBFeature( rootPath, QPixmap(":images/libpalette/AudiosCategory.svg"), "Audios" , mUserAudioDirectoryPath );
+ featuresList->append( audiosElement );
+ moviesElement = UBFeature( rootPath, QPixmap(":images/libpalette/MoviesCategory.svg"), "Movies" , mUserVideoDirectoryPath );
+ featuresList->append( moviesElement );
+ picturesElement = UBFeature( rootPath, QPixmap(":images/libpalette/PicturesCategory.svg"), "Pictures" , mUserPicturesDirectoryPath );
+ featuresList->append( picturesElement );
featuresList->append( UBFeature( rootPath, QPixmap(":images/libpalette/ApplicationsCategory.svg"), "Applications" , mUserInteractiveDirectoryPath ) );
- featuresList->append( UBFeature( rootPath, QPixmap(":images/libpalette/FlashCategory.svg"), "Animations" , mUserAnimationDirectoryPath ) );
- featuresList->append( UBFeature( rootPath, QPixmap(":images/libpalette/InteractivesCategory.svg"), "Interactivities" , mLibInteractiveDirectoryPath ) );
+ flashElement = UBFeature( rootPath, QPixmap(":images/libpalette/FlashCategory.svg"), "Animations" , mUserAnimationDirectoryPath );
+ featuresList->append( flashElement );
+ interactElement = UBFeature( rootPath, QPixmap(":images/libpalette/InteractivesCategory.svg"), "Interactivities" , mLibInteractiveDirectoryPath );
+ featuresList->append( interactElement );
featuresList->append( UBFeature( rootPath, QPixmap(":images/libpalette/ShapesCategory.svg"), "Shapes" , mLibShapesDirectoryPath ) );
trashElement = UBFeature( rootPath, QPixmap(":images/libpalette/TrashCategory.svg"), "Trash", trashDirectoryPath, FEATURE_TRASH );
featuresList->append( trashElement );
- favoriteElement = UBFeature( rootPath, QPixmap(":images/libpalette/FavoritesCategory.svg"), "Favorites", "favorites", FEATURE_FAVORITE );
+ favoriteElement = UBFeature( rootPath, QPixmap(":images/libpalette/FavoritesCategory.svg"), "Favorites", QUrl("favorites"), FEATURE_FAVORITE );
featuresList->append( favoriteElement );
-
+ webSearchElement = UBFeature( rootPath, QPixmap(":images/libpalette/WebSearchCategory.svg"), "Web search", mLibSearchDirectoryPath );
+ featuresList->append( webSearchElement );
loadFavoriteList();
foreach (UBToolsManager::UBToolDescriptor tool, tools)
{
- featuresList->append( UBFeature( appPath, tool.icon, tool.label, tool.id, FEATURE_INTERNAL ) );
- if ( favoriteSet->find( tool.id ) != favoriteSet->end() )
+ featuresList->append( UBFeature( appPath, tool.icon, tool.label, QUrl( tool.id ), FEATURE_INTERNAL ) );
+ if ( favoriteSet->find( QUrl( tool.id ) ) != favoriteSet->end() )
{
- featuresList->append( UBFeature( favoritePath, tool.icon, tool.label, tool.id, FEATURE_INTERNAL ) );
+ featuresList->append( UBFeature( favoritePath, tool.icon, tool.label, QUrl( tool.id ), FEATURE_INTERNAL ) );
}
}
fileSystemScan( mUserInteractiveDirectoryPath, appPath );
@@ -105,14 +133,14 @@ void UBFeaturesController::initDirectoryTree()
fileSystemScan( mLibShapesDirectoryPath, shapesPath );
fileSystemScan( mLibInteractiveDirectoryPath, interactPath );
fileSystemScan( trashDirectoryPath, trashPath );
-
+ fileSystemScan( mLibSearchDirectoryPath, rootPath + "/" + "Web search" );
}
-void UBFeaturesController::fileSystemScan(const QString & currentPath, const QString & currVirtualPath)
+void UBFeaturesController::fileSystemScan(const QUrl & currentPath, const QString & currVirtualPath)
{
- QFileInfoList fileInfoList = UBFileSystemUtils::allElementsInDirectory(currentPath);
+ QFileInfoList fileInfoList = UBFileSystemUtils::allElementsInDirectory(currentPath.toLocalFile());
QFileInfoList::iterator fileInfo;
for ( fileInfo = fileInfoList.begin(); fileInfo != fileInfoList.end(); fileInfo += 1)
@@ -120,12 +148,19 @@ void UBFeaturesController::fileSystemScan(const QString & currentPath, const QSt
UBFeatureElementType fileType = fileInfo->isDir() ? FEATURE_FOLDER : FEATURE_ITEM;
QString fileName = fileInfo->fileName();
- if ( UBFileSystemUtils::mimeTypeFromFileName(fileName).contains("application") ) {
- fileType = FEATURE_INTERACTIVE;
+ if ( UBFileSystemUtils::mimeTypeFromFileName(fileName).contains("application") )
+ {
+ if ( UBFileSystemUtils::mimeTypeFromFileName(fileName).contains("application/search") )
+ {
+ fileType = FEATURE_SEARCH;
+ }
+ else
+ fileType = FEATURE_INTERACTIVE;
}
QString itemName = (fileType != FEATURE_ITEM) ? fileName : fileInfo->completeBaseName();
QPixmap icon = QPixmap(":images/libpalette/soundIcon.svg");
QString fullFileName = fileInfo->filePath();
+
if ( fileType == FEATURE_FOLDER )
{
@@ -146,15 +181,15 @@ void UBFeaturesController::fileSystemScan(const QString & currentPath, const QSt
icon = QPixmap( thumbnailPath );
else icon = createThumbnail( fullFileName );*/
}
- featuresList->append( UBFeature( currVirtualPath, icon, fileName, fullFileName, fileType ) );
- if ( favoriteSet->find( fullFileName ) != favoriteSet->end() )
+ featuresList->append( UBFeature( currVirtualPath, icon, fileName, QUrl::fromLocalFile( fullFileName ), fileType ) );
+ if ( favoriteSet->find( QUrl::fromLocalFile( fullFileName ) ) != favoriteSet->end() )
{
- featuresList->append( UBFeature( favoritePath, icon, fileName, fullFileName, fileType ) );
+ featuresList->append( UBFeature( favoritePath, icon, fileName, QUrl::fromLocalFile( fullFileName ), fileType ) );
}
if ( fileType == FEATURE_FOLDER )
{
- fileSystemScan( fullFileName, currVirtualPath + "/" + fileName );
+ fileSystemScan( QUrl::fromLocalFile( fullFileName ), currVirtualPath + "/" + fileName );
}
}
@@ -162,7 +197,7 @@ void UBFeaturesController::fileSystemScan(const QString & currentPath, const QSt
void UBFeaturesController::loadFavoriteList()
{
- favoriteSet = new QSet();
+ favoriteSet = new QSet();
QFile file( UBSettings::userDataDirectory() + "/favorites.dat" );
if ( file.exists() )
{
@@ -172,7 +207,7 @@ void UBFeaturesController::loadFavoriteList()
in >> elementsNumber;
for ( int i = 0; i < elementsNumber; ++i)
{
- QString path;
+ QUrl path;
in >> path;
/*QFileInfo fileInfo( path );
QString fileName = fileInfo.fileName();
@@ -191,7 +226,7 @@ void UBFeaturesController::saveFavoriteList()
file.open(QIODevice::WriteOnly);
QDataStream out(&file);
out << favoriteSet->size();
- for ( QSet::iterator it = favoriteSet->begin(); it != favoriteSet->end(); ++it )
+ for ( QSet::iterator it = favoriteSet->begin(); it != favoriteSet->end(); ++it )
{
out << (*it);
}
@@ -201,12 +236,12 @@ void UBFeaturesController::saveFavoriteList()
UBFeature UBFeaturesController::addToFavorite( const QUrl &path )
{
QString filePath = fileNameFromUrl( path );
- if ( favoriteSet->find( filePath ) == favoriteSet->end() )
+ if ( favoriteSet->find( path ) == favoriteSet->end() )
{
QFileInfo fileInfo( filePath );
QString fileName = fileInfo.fileName();
- UBFeature elem( favoritePath, thumbnailForFile( filePath ), fileName, filePath, fileTypeFromUrl(filePath) );
- favoriteSet->insert( filePath );
+ UBFeature elem( favoritePath, thumbnailForFile( filePath ), fileName, path, fileTypeFromUrl(filePath) );
+ favoriteSet->insert( path );
saveFavoriteList();
return elem;
}
@@ -216,9 +251,9 @@ UBFeature UBFeaturesController::addToFavorite( const QUrl &path )
void UBFeaturesController::removeFromFavorite( const QUrl &path )
{
QString filePath = fileNameFromUrl( path );
- if ( favoriteSet->find( filePath ) != favoriteSet->end() )
+ if ( favoriteSet->find( path ) != favoriteSet->end() )
{
- favoriteSet->erase( favoriteSet->find( filePath ) );
+ favoriteSet->erase( favoriteSet->find( path ) );
saveFavoriteList();
}
}
@@ -231,6 +266,7 @@ QString UBFeaturesController::fileNameFromUrl( const QUrl &url )
return url.toLocalFile();
}
+
UBFeatureElementType UBFeaturesController::fileTypeFromUrl( const QString &path )
{
QFileInfo fileInfo( path );
@@ -268,6 +304,12 @@ QPixmap UBFeaturesController::thumbnailForFile(const QString &path)
return thumb;
}
+bool UBFeaturesController::isDeletable( const QUrl &url )
+{
+ UBFeatureElementType type = fileTypeFromUrl( fileNameFromUrl(url) );
+ return type == FEATURE_ITEM;
+}
+
QPixmap UBFeaturesController::createThumbnail(const QString &path)
{
QString thumbnailPath = UBFileSystemUtils::thumbnailPath(path);
@@ -305,24 +347,63 @@ QPixmap UBFeaturesController::createThumbnail(const QString &path)
UBFeature UBFeaturesController::newFolder( const QString &name )
{
- QString path = currentElement.getFullPath() + "/" + name;
+ QString path = currentElement.getFullPath().toLocalFile() + "/" + name;
if(!QFileInfo(path).exists())
{
QDir().mkpath(path);
}
- return UBFeature( currentElement.getUrl() + "/" + currentElement.getName(), QPixmap(":images/libpalette/folder.svg"), name, path, FEATURE_FOLDER );
+ return UBFeature( currentElement.getFullVirtualPath(), QPixmap(":images/libpalette/folder.svg"),
+ name, QUrl::fromLocalFile( path ), FEATURE_FOLDER );
}
void UBFeaturesController::addItemToPage(const UBFeature &item)
{
- if ( item.getType() == FEATURE_INTERNAL )
- {
- UBApplication::boardController->downloadURL( QUrl( item.getFullPath() ) );
- }
- else
+ UBApplication::boardController->downloadURL( item.getFullPath() );
+}
+
+void UBFeaturesController::addItemAsBackground(const UBFeature &item)
+{
+ UBApplication::boardController->downloadURL( item.getFullPath(), QPointF(), QSize(), true );
+}
+
+
+UBFeature UBFeaturesController::getDestinationForItem( const QUrl &url )
+{
+ QString mimetype = UBFileSystemUtils::mimeTypeFromFileName( url.toString() );
+
+ if ( mimetype.contains("audio") )
+ return audiosElement;
+ if ( mimetype.contains("video") )
+ return moviesElement;
+ else if ( mimetype.contains("image") )
+ return picturesElement;
+ else if ( mimetype.contains("application") )
{
- UBApplication::boardController->downloadURL( QUrl::fromLocalFile( item.getFullPath() ) );
- }
+ if ( mimetype.contains( "x-shockwave-flash") )
+ return flashElement;
+ else
+ return interactElement;
+ }
+ return UBFeature();
+}
+
+UBFeature UBFeaturesController::addDownloadedFile( const QUrl &sourceUrl, const QByteArray &pData )
+{
+ UBFeature dest = getDestinationForItem( sourceUrl );
+ if ( dest == UBFeature() )
+ return UBFeature();
+ QString fileName = QFileInfo( sourceUrl.toString() ).fileName();
+ QString filePath = dest.getFullPath().toLocalFile() + "/" + fileName;
+
+ QFile file( filePath );
+ if( file.open(QIODevice::WriteOnly ))
+ {
+ file.write(pData);
+ file.close();
+ return UBFeature( dest.getFullVirtualPath(), thumbnailForFile( filePath ),
+ fileName, QUrl::fromLocalFile(filePath), FEATURE_ITEM );
+ }
+ return UBFeature();
}
UBFeature UBFeaturesController::moveItemToFolder( const QUrl &url, const UBFeature &destination )
@@ -338,9 +419,19 @@ UBFeature UBFeaturesController::copyItemToFolder( const QUrl &url, const UBFeatu
Q_ASSERT( QFileInfo( sourcePath ).exists() );
+ UBFeature possibleDest = getDestinationForItem( url );
+
+ UBFeature dest = destination;
+
+ if ( destination != trashElement &&
+ !destination.getFullVirtualPath().startsWith( possibleDest.getFullVirtualPath(), Qt::CaseInsensitive ) )
+ {
+ dest = possibleDest;
+ }
+
QString name = QFileInfo( sourcePath ).fileName();
- QString destPath = destination.getFullPath();
- QString destVirtualPath = destination.getUrl() + "/" + destination.getName();
+ QString destPath = dest.getFullPath().toLocalFile();
+ QString destVirtualPath = dest.getFullVirtualPath();
QString newFullPath = destPath + "/" + name;
QFile( sourcePath ).copy( newFullPath );
@@ -349,7 +440,7 @@ UBFeature UBFeaturesController::copyItemToFolder( const QUrl &url, const UBFeatu
UBFeatureElementType type = FEATURE_ITEM;
if ( UBFileSystemUtils::mimeTypeFromFileName( newFullPath ).contains("application") )
type = FEATURE_INTERACTIVE;
- UBFeature newElement( destVirtualPath, thumb, name, newFullPath, type );
+ UBFeature newElement( destVirtualPath, thumb, name, QUrl::fromLocalFile( newFullPath ), type );
return newElement;
}
@@ -359,7 +450,7 @@ void UBFeaturesController::deleteItem( const QUrl &url )
Q_ASSERT( QFileInfo( path ).exists() );
QString thumbnailPath = UBFileSystemUtils::thumbnailPath( path );
- if (thumbnailPath.length() && QFileInfo( thumbnailPath ).exists())
+ if ( thumbnailPath.length() && QFileInfo( thumbnailPath ).exists() )
{
QFile::remove(thumbnailPath);
}
@@ -368,7 +459,7 @@ void UBFeaturesController::deleteItem( const QUrl &url )
bool UBFeaturesController::isTrash( const QUrl &url )
{
- return url.toLocalFile().startsWith( trashDirectoryPath );
+ return url.toLocalFile().startsWith( trashDirectoryPath.toLocalFile() );
}
UBFeaturesController::~UBFeaturesController()
diff --git a/src/board/UBFeaturesController.h b/src/board/UBFeaturesController.h
index a46c6e63..0431eb7e 100644
--- a/src/board/UBFeaturesController.h
+++ b/src/board/UBFeaturesController.h
@@ -4,9 +4,13 @@
#include
#include
#include
+#include
#include
#include
#include
+#include
+#include
+#include
//#include "UBDockPaletteWidget.h"
@@ -19,7 +23,8 @@ enum UBFeatureElementType
FEATURE_INTERNAL,
FEATURE_ITEM,
FEATURE_TRASH,
- FEATURE_FAVORITE
+ FEATURE_FAVORITE,
+ FEATURE_SEARCH
};
class UBFeature
@@ -27,21 +32,30 @@ class UBFeature
public:
UBFeature() {;}
//UBFeature(const UBFeature &f);
- UBFeature(const QString &url, const QPixmap &icon, const QString &name, const QString &realPath, UBFeatureElementType type = FEATURE_CATEGORY);
+ UBFeature(const QString &url, const QPixmap &icon, const QString &name, const QUrl &realPath, UBFeatureElementType type = FEATURE_CATEGORY);
virtual ~UBFeature() {;}
QString getName() const { return mName; }
QPixmap getThumbnail() const {return mThumbnail;}
- QString getUrl() const { return virtualPath; }
+ QString getVirtualPath() const { return virtualPath; }
//QString getPath() const { return mPath; };
- QString getFullPath() const { return mPath; }
+ QUrl getFullPath() const { return mPath; }
+ QString getFullVirtualPath() const { return virtualPath + "/" + mName; }
+ QString getUrl() const;
UBFeatureElementType getType() const { return elementType; }
+
bool isFolder() const;
+ bool isDeletable() const;
+ bool operator ==( const UBFeature &f )const;
+ bool operator !=( const UBFeature &f )const;
+ const QMap & getMetadata() const { return metadata; }
+ void setMetadata( const QMap &data ) { metadata = data; }
private:
QString virtualPath;
QPixmap mThumbnail;
QString mName;
- QString mPath;
+ QUrl mPath;
UBFeatureElementType elementType;
+ QMap metadata;
};
Q_DECLARE_METATYPE( UBFeature )
@@ -57,10 +71,14 @@ public:
const QString& getRootPath()const { return rootPath; }
- void addItemToPage(const UBFeature &item);
+ void addItemToPage( const UBFeature &item );
+ void addItemAsBackground( const UBFeature &item );
const UBFeature& getCurrentElement()const { return currentElement; }
void setCurrentElement( const UBFeature &elem ) { currentElement = elem; }
const UBFeature & getTrashElement () const { return trashElement; }
+
+ UBFeature addDownloadedFile( const QUrl &sourceUrl, const QByteArray &pData );
+
UBFeature moveItemToFolder( const QUrl &url, const UBFeature &destination );
UBFeature copyItemToFolder( const QUrl &url, const UBFeature &destination );
void deleteItem( const QUrl &url );
@@ -71,34 +89,37 @@ public:
static QString fileNameFromUrl( const QUrl &url );
static QPixmap thumbnailForFile( const QString &path );
+ static bool isDeletable( const QUrl &url );
private:
void initDirectoryTree();
- void fileSystemScan(const QString &currPath, const QString & currVirtualPath);
+ void fileSystemScan(const QUrl &currPath, const QString & currVirtualPath);
static QPixmap createThumbnail(const QString &path);
//void addImageToCurrentPage( const QString &path );
void loadFavoriteList();
void saveFavoriteList();
+ UBFeature getDestinationForItem( const QUrl &url );
static UBFeatureElementType fileTypeFromUrl( const QString &path );
QList *featuresList;
UBFeature *rootElement;
- QString mUserAudioDirectoryPath;
- QString mUserVideoDirectoryPath;
- QString mUserPicturesDirectoryPath;
- QString mUserInteractiveDirectoryPath;
- QString mUserAnimationDirectoryPath;
+ QUrl mUserAudioDirectoryPath;
+ QUrl mUserVideoDirectoryPath;
+ QUrl mUserPicturesDirectoryPath;
+ QUrl mUserInteractiveDirectoryPath;
+ QUrl mUserAnimationDirectoryPath;
QString libraryPath;
- QString mLibAudioDirectoryPath;
- QString mLibVideoDirectoryPath;
- QString mLibPicturesDirectoryPath;
- QString mLibInteractiveDirectoryPath;
- QString mLibAnimationDirectoryPath;
- QString mLibApplicationsDirectoryPath;
- QString mLibShapesDirectoryPath;
- QString trashDirectoryPath;
+ QUrl mLibAudioDirectoryPath;
+ QUrl mLibVideoDirectoryPath;
+ QUrl mLibPicturesDirectoryPath;
+ QUrl mLibInteractiveDirectoryPath;
+ QUrl mLibAnimationDirectoryPath;
+ QUrl mLibApplicationsDirectoryPath;
+ QUrl mLibShapesDirectoryPath;
+ QUrl trashDirectoryPath;
+ QUrl mLibSearchDirectoryPath;
QString rootPath;
QString audiosPath;
@@ -115,8 +136,15 @@ private:
UBFeature currentElement;
UBFeature trashElement;
UBFeature favoriteElement;
-
- QSet *favoriteSet;
+ UBFeature audiosElement;
+ UBFeature moviesElement;
+ UBFeature picturesElement;
+ UBFeature interactElement;
+ UBFeature flashElement;
+ UBFeature shapesElement;
+ UBFeature webSearchElement;
+
+ QSet *favoriteSet;
};
diff --git a/src/core/main.cpp b/src/core/main.cpp
index 80c8a989..33cb711c 100644
--- a/src/core/main.cpp
+++ b/src/core/main.cpp
@@ -72,7 +72,7 @@ int main(int argc, char *argv[])
// Uncomment next section to have memory leaks information
// tracing in VC++ debug mode under Windows
- /*
+/*
#if defined(_MSC_VER) && defined(_DEBUG)
_CrtSetDbgFlag ( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );
#endif
diff --git a/src/customWidgets/UBActionableWidget.cpp b/src/customWidgets/UBActionableWidget.cpp
index 78d8ea6b..25c1809e 100644
--- a/src/customWidgets/UBActionableWidget.cpp
+++ b/src/customWidgets/UBActionableWidget.cpp
@@ -18,6 +18,8 @@
#include "UBActionableWidget.h"
+#include "core/memcheck.h"
+
UBActionableWidget::UBActionableWidget(QWidget *parent, const char *name):QWidget(parent)
, mShowActions(false)
{
diff --git a/src/customWidgets/UBMediaWidget.cpp b/src/customWidgets/UBMediaWidget.cpp
index cbc0b842..cf7f8489 100644
--- a/src/customWidgets/UBMediaWidget.cpp
+++ b/src/customWidgets/UBMediaWidget.cpp
@@ -16,6 +16,8 @@
#include "globals/UBGlobals.h"
#include "UBMediaWidget.h"
+#include "core/memcheck.h"
+
/**
* \brief Constructor
* @param type as the media type
diff --git a/src/domain/UBAbstractUndoCommand.cpp b/src/domain/UBAbstractUndoCommand.cpp
index fe623acc..fc5d9fdf 100644
--- a/src/domain/UBAbstractUndoCommand.cpp
+++ b/src/domain/UBAbstractUndoCommand.cpp
@@ -15,6 +15,8 @@
#include "UBAbstractUndoCommand.h"
+#include "core/memcheck.h"
+
UBAbstractUndoCommand::UBAbstractUndoCommand()
{
// NOOP
diff --git a/src/domain/UBAngleWidget.cpp b/src/domain/UBAngleWidget.cpp
index 542a7eed..7be0bf39 100644
--- a/src/domain/UBAngleWidget.cpp
+++ b/src/domain/UBAngleWidget.cpp
@@ -1,6 +1,8 @@
#include "UBAngleWidget.h"
#include
+#include "core/memcheck.h"
+
UBAngleWidget::UBAngleWidget(QWidget *parent)
: QWidget(parent)
{
diff --git a/src/domain/UBGraphicsDelegateFrame.cpp b/src/domain/UBGraphicsDelegateFrame.cpp
index bb47e5c6..54dc4650 100644
--- a/src/domain/UBGraphicsDelegateFrame.cpp
+++ b/src/domain/UBGraphicsDelegateFrame.cpp
@@ -1,794 +1,802 @@
-/*
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-#include "UBGraphicsDelegateFrame.h"
-
-#include
-#include
-
-#include "core/UBApplication.h"
-#include "core/UBSettings.h"
-
-#include "domain/UBGraphicsItemDelegate.h"
-#include "domain/UBGraphicsScene.h"
-#include "domain/UBGraphicsProxyWidget.h"
-
-#include "gui/UBResources.h"
-
-#include "core/memcheck.h"
-
-UBGraphicsDelegateFrame::UBGraphicsDelegateFrame(UBGraphicsItemDelegate* pDelegate, QRectF pRect, qreal pFrameWidth, bool respectRatio)
- : QGraphicsRectItem(), QObject(pDelegate)
- , mCurrentTool(None)
- , mDelegate(pDelegate)
- , mVisible(true)
- , mFrameWidth(pFrameWidth)
- , mNominalFrameWidth(pFrameWidth)
- , mRespectRatio(respectRatio)
- , mAngle(0)
- , mAngleOffset(0)
- , mTotalScaleX(-1)
- , mTotalScaleY(-1)
- , mTranslateX(0)
- , mTranslateY(0)
- , mTotalTranslateX(0)
- , mTotalTranslateY(0)
- , mOperationMode(Scaling)
- , mMirrorX(false)
- , mMirrorY(false)
-{
- mAngleTolerance = UBSettings::settings()->angleTolerance->get().toReal();
-
- setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
-
- setAcceptedMouseButtons(Qt::LeftButton);
- setRect(pRect.adjusted(mFrameWidth, mFrameWidth, mFrameWidth * -1, mFrameWidth * -1));
-
- setBrush(QBrush(UBSettings::paletteColor));
- setPen(Qt::NoPen);
- setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control));
-
- mBottomRightResizeGripSvgItem = new QGraphicsSvgItem(":/images/resize.svg", this);
- mBottomResizeGripSvgItem = new QGraphicsSvgItem(":/images/resizeBottom.svg", this);
- mLeftResizeGripSvgItem = new QGraphicsSvgItem(":/images/resizeLeft.svg", this);
- mRightResizeGripSvgItem = new QGraphicsSvgItem(":/images/resizeRight.svg", this);
- mTopResizeGripSvgItem = new QGraphicsSvgItem(":/images/resizeTop.svg", this);
-
- mBottomRightResizeGrip = new QGraphicsRectItem(this);
- mBottomRightResizeGrip->setPen(Qt::NoPen);
- mBottomResizeGrip = new QGraphicsRectItem(this);
- mBottomResizeGrip->setPen(Qt::NoPen);
- mLeftResizeGrip = new QGraphicsRectItem(this);
- mLeftResizeGrip->setToolTip("left");
- mLeftResizeGrip->setPen(Qt::NoPen);
- mRightResizeGrip = new QGraphicsRectItem(this);
- mRightResizeGrip->setPen(Qt::NoPen);
- mRightResizeGrip->setToolTip("Right");
- mTopResizeGrip = new QGraphicsRectItem(this);
- mTopResizeGrip->setPen(Qt::NoPen);
-
- mRotateButton = new QGraphicsSvgItem(":/images/rotate.svg", this);
- mRotateButton->setCursor(UBResources::resources()->rotateCursor);
- mRotateButton->setVisible(mDelegate->canRotate());
-
- updateResizeCursors();
-
- setAntiScale(1.0);
-
- positionHandles();
-
- this->setAcceptHoverEvents(true);
-
- angleWidget = new UBAngleWidget();
-}
-
-
-UBGraphicsDelegateFrame::~UBGraphicsDelegateFrame()
-{
-delete angleWidget;
- // NOOP
-}
-
-void UBGraphicsDelegateFrame::setAntiScale(qreal pAntiScale)
-{
- mFrameWidth = mNominalFrameWidth * pAntiScale;
-
- QTransform tr;
- tr.scale(pAntiScale, pAntiScale);
-
- mBottomRightResizeGripSvgItem->setTransform(tr);
- mBottomResizeGripSvgItem->setTransform(tr);
- mLeftResizeGripSvgItem->setTransform(tr);
- mRightResizeGripSvgItem->setTransform(tr);
- mTopResizeGripSvgItem->setTransform(tr);
- mRotateButton->setTransform(tr);
-}
-
-
-void UBGraphicsDelegateFrame::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
-{
- Q_UNUSED(option);
- Q_UNUSED(widget);
-
- QPainterPath path;
- path.addRoundedRect(rect(), mFrameWidth / 2, mFrameWidth / 2);
-
- if (rect().width() > 1 && rect().height() > 1)
- {
- QPainterPath extruded;
- extruded.addRect(rect().adjusted(mFrameWidth, mFrameWidth, (mFrameWidth * -1), (mFrameWidth * -1)));
- path = path.subtracted(extruded);
- }
-
- painter->fillPath(path, brush());
-}
-
-
-QPainterPath UBGraphicsDelegateFrame::shape() const
-{
- QPainterPath path;
-
- //We do not use the rounded rect here because we want the bottom right corner
- //to be included in the frame (for resize grip handling : #702)
- path.addRect(rect());
-
- if (rect().width() > 0 && rect().height() > 0)
- {
- QPainterPath extruded;
- extruded.addRect(rect().adjusted(mFrameWidth, mFrameWidth, mFrameWidth * -1, mFrameWidth * -1));
- path = path.subtracted(extruded);
- }
-
- return path;
-}
-
-
-void UBGraphicsDelegateFrame::initializeTransform()
-{
- QTransform itemTransform = delegated()->sceneTransform();
- QRectF itemRect = delegated()->boundingRect();
- QPointF topLeft = itemTransform.map(itemRect.topLeft());
- QPointF topRight = itemTransform.map(itemRect.topRight());
- QPointF bottomLeft = itemTransform.map(itemRect.bottomLeft());
-
- qreal horizontalFlip = (topLeft.x() > topRight.x()) ? -1 : 1;
- mMirrorX = horizontalFlip < 0 ;
- if(horizontalFlip < 0){
- // why this is because of the way of calculating the translations that checks which side is the most is the
- // nearest instead of checking which one is the left side.
- QPointF tmp = topLeft;
- topLeft = topRight;
- topRight = tmp;
-
- // because of the calculation of the height is done by lenght and not deltaY
- bottomLeft = itemTransform.map(itemRect.bottomRight());
- }
-
- qreal verticalFlip = (bottomLeft.y() < topLeft.y()) ? -1 : 1;
- // not sure that is usefull
- mMirrorY = verticalFlip < 0;
- if(verticalFlip < 0 && !mMirrorX){
- topLeft = itemTransform.map(itemRect.bottomLeft());
- topRight = itemTransform.map(itemRect.bottomRight());
- bottomLeft = itemTransform.map(itemRect.topLeft());
- }
-
- QLineF topLine(topLeft, topRight);
- QLineF leftLine(topLeft, bottomLeft);
- qreal width = topLine.length();
- qreal height = leftLine.length();
-
- mAngle = topLine.angle();
-
- // the fact the the length is used we loose the horizontalFlip information
- // a better way to do this is using DeltaX that preserve the direction information.
- mTotalScaleX = (width / itemRect.width()) * horizontalFlip;
- mTotalScaleY = height / itemRect.height() * verticalFlip;
-
- QTransform tr;
- QPointF center = delegated()->boundingRect().center();
- tr.translate(center.x() * mTotalScaleX, center.y() * mTotalScaleY);
- tr.rotate(-mAngle);
- tr.translate(-center.x() * mTotalScaleX, -center.y() * mTotalScaleY);
- tr.scale(mTotalScaleX, mTotalScaleY);
-
- mTotalTranslateX = delegated()->transform().dx() - tr.dx();
- mTotalTranslateY = delegated()->transform().dy() - tr.dy();
-}
-
-
-void UBGraphicsDelegateFrame::mousePressEvent(QGraphicsSceneMouseEvent *event)
-{
- mDelegate->startUndoStep();
-
- mStartingPoint = event->scenePos();
-
- initializeTransform();
-
- mScaleX = 1;
- mScaleY = 1;
- mTranslateX = 0;
- mTranslateY = 0;
- mAngleOffset = 0;
-
- mInitialTransform = buildTransform();
-
- mCurrentTool = toolFromPos(event->pos());
-
- event->accept();
-}
-
-bool UBGraphicsDelegateFrame::canResizeBottomRight(qreal width, qreal height, qreal scaleFactor)
-{
- bool res = false;
-
- if(!mMirrorX && !mMirrorX && ((width * scaleFactor) > 2*mFrameWidth && (height * scaleFactor) > 2*mFrameWidth)){
- res = true;
- }else if(mMirrorX && !mMirrorY && (-width * scaleFactor) > 2*mFrameWidth && (height*scaleFactor) > 2*mFrameWidth){
- res = true;
- }else if(!mMirrorX && mMirrorY && (width * scaleFactor) > 2*mFrameWidth && (-height*scaleFactor) > 2*mFrameWidth){
- res = true;
- }else if(mMirrorX && mMirrorY && (-width * scaleFactor) > 2*mFrameWidth && (-height*scaleFactor) > 2*mFrameWidth){
- res = true;
- }
-
- return res;
-}
-
-void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
-{
- QLineF move(mStartingPoint, event->scenePos());
- qreal moveX = move.length() * cos((move.angle() - mAngle) * PI / 180);
- qreal moveY = -move.length() * sin((move.angle() - mAngle) * PI / 180);
- qreal width = delegated()->boundingRect().width() * mTotalScaleX;
- qreal height = delegated()->boundingRect().height() * mTotalScaleY;
-
- if(mOperationMode == Scaling)
- {
- mTranslateX = moveX;
- // Perform the resize
- if (resizingBottomRight())
- {
- // -----------------------------------------------------
- // ! We want to keep the aspect ratio with this resize !
- // -----------------------------------------------------
- qreal scaleX;
- qreal scaleY;
-
- if(!mMirrorX){
- scaleX = (width + moveX) / width;
- }else{
- scaleX = (width - moveX) / width;
- }
-
- if(!mMirrorY){
- scaleY = (height + moveY) / height;
- }else{
- scaleY = (height - moveY) / height;
- }
-
- qreal scaleFactor = (scaleX + scaleY) / 2;
-
- // Do not allow resizing of image size under frame size
- if (canResizeBottomRight(width, height, scaleFactor))
- {
- if (mRespectRatio)
- {
- mScaleX = scaleFactor;
- mScaleY = scaleFactor;
- }
- else
- {
- mScaleX = scaleX;
- mScaleY = scaleY;
- }
- }
- }else if (resizingLeft() || resizingRight())
- {
- if(width != 0){
- qreal scaleX = 0.0;
- if(resizingLeft()){
- scaleX = (width - moveX) / width;
- }else if(resizingRight()){
- scaleX = (width + moveX) / width;
- }
- if(mDelegate->isFlippable() && qAbs(scaleX) != 0){
- if((qAbs(width * scaleX)) < 2*mFrameWidth){
- bool negative = (scaleX < 0)?true:false;
- if(negative){
- if(mMirrorX)
- scaleX = 2*mFrameWidth/width;
- else
- scaleX = -2*mFrameWidth/width;
- }else{
- scaleX = -1;
- }
- }
- mScaleX = scaleX;
- }else if (scaleX > 1 || (width * scaleX) > 2 * mFrameWidth){
- mScaleX = scaleX;
- if(resizingLeft()){
- mTranslateX = moveX;
- }
- }
- }
- }else if(resizingTop() || resizingBottom()){
- if(height != 0){
- qreal scaleY = 0.0;
- if(resizingTop()){
- scaleY = (height - moveY) / height;
- }else if(resizingBottom()){
- scaleY = (height + moveY) / height;
- }
-
- if(mDelegate->isFlippable() && qAbs(scaleY) != 0){
- if((qAbs(height * scaleY)) < 2*mFrameWidth){
- bool negative = (scaleY < 0)?true:false;
- if(negative){
- if(mMirrorY)
- scaleY = 2*mFrameWidth/width;
- else
- scaleY = -2*mFrameWidth/width;
- }else{
- scaleY = -1;
- }
- }
- mScaleY = scaleY;
- }else if (scaleY > 1 || (height * scaleY) > 2 * mFrameWidth)
- {
- mScaleY = scaleY;
- if(resizingTop()){
- mTranslateY = moveY;
- }
- }
- }
- }
- }
- else if (mOperationMode == Resizing)
- {
- mTranslateX = moveX;
- UBResizableGraphicsItem* resizableItem = dynamic_cast(delegated());
-
- if (resizableItem)
- {
- QLineF mousePosDelta(delegated()->mapFromScene(event->lastScenePos())
- , delegated()->mapFromScene(event->scenePos()));
- QSizeF incVector(0, 0);
-
- if (resizingBottomRight())
- {
- incVector = QSizeF(mousePosDelta.dx(), mousePosDelta.dy());
- }
- else if (resizingRight())
- {
- incVector = QSizeF(mousePosDelta.dx(), 0);
- }
- else if (resizingBottom())
- {
- incVector = QSizeF(0, mousePosDelta.dy());
- }
- else if (resizingLeft())
- {
- incVector = QSizeF(- mousePosDelta.dx(), 0);
- }
- else if (resizingTop())
- {
- incVector = QSizeF(0, - mousePosDelta.dy());
- }
-
- QSizeF newSize = resizableItem->size() + incVector;
-
- resizableItem->resize(newSize);
- }
- }
-
- if (rotating())
- {
- mTranslateX = 0;
- mTranslateY = 0;
-
- QLineF startLine(sceneBoundingRect().center(), event->lastScenePos());
- QLineF currentLine(sceneBoundingRect().center(), event->scenePos());
- mAngle += startLine.angleTo(currentLine);
-
- if ((int)mAngle % 45 >= 45 - mAngleTolerance || (int)mAngle % 45 <= mAngleTolerance)
- {
- mAngle = qRound(mAngle / 45) * 45;
- mAngleOffset += startLine.angleTo(currentLine);
- if ((int)mAngleOffset % 360 > mAngleTolerance && (int)mAngleOffset % 360 < 360 - mAngleTolerance)
- {
- mAngle += mAngleOffset;
- mAngleOffset = 0;
- }
- }
- else if ((int)mAngle % 30 >= 30 - mAngleTolerance || (int)mAngle % 30 <= mAngleTolerance)
- {
- mAngle = qRound(mAngle / 30) * 30;
- mAngleOffset += startLine.angleTo(currentLine);
- if ((int)mAngleOffset % 360 > mAngleTolerance && (int)mAngleOffset % 360 < 360 - mAngleTolerance)
- {
- mAngle += mAngleOffset;
- mAngleOffset = 0;
- }
- }
-
- if (!angleWidget->isVisible())
- angleWidget->show();
-
- angleWidget->setText(QString::number((int)mAngle % 360));
- angleWidget->update();
-
- }
- else if (moving())
- {
- mTranslateX = move.dx();
- mTranslateY = move.dy();
- }
-
- QTransform tr = buildTransform();
-
- //TODO UB 4.x: Could find a better solution ?
- if (resizingRight() || resizingBottom() || resizingBottomRight())
- {
- QPointF ref;
- if(!mMirrorX && !mMirrorY){
- ref = delegated()->boundingRect().topLeft();
- }else if(mMirrorX && !mMirrorY){
- ref = delegated()->boundingRect().topLeft();
- }else if(!mMirrorX && mMirrorY){
- ref = delegated()->boundingRect().topLeft();
- }else if(mMirrorX && mMirrorY){
- ref = delegated()->boundingRect().topRight();
- }
-
- // Map the item topleft point to the current mouse move transform
- QPointF topLeft = tr.map(ref);
-
- // Map the item topleft point to the mouse press transform
- QPointF fixedPoint = mInitialTransform.map(ref);
-
- // Update the translation coordinates
- mTranslateX += fixedPoint.x() - topLeft.x();
- mTranslateY += fixedPoint.y() - topLeft.y();
-
- // Update the transform
- tr = buildTransform();
- }
- else if (resizingTop() || resizingLeft())
- {
- if (mOperationMode == Scaling)
- {
- QPointF bottomRight = tr.map(delegated()->boundingRect().bottomRight());
- QPointF fixedPoint = mInitialTransform.map(delegated()->boundingRect().bottomRight());
- mTranslateX += fixedPoint.x() - bottomRight.x();
- mTranslateY += fixedPoint.y() - bottomRight.y();
- }
- else
- {
- QLineF vector;
- if (resizingLeft())
- {
- QPointF topRight1 = mInitialTransform.map(QPointF(delegated()->boundingRect().width() - moveX, 0));
- QPointF topRight2 = mInitialTransform.map(QPointF(delegated()->boundingRect().width(), 0));
- vector.setPoints(topRight1, topRight2);
- }
- else
- {
- QPointF bottomLeft1 = mInitialTransform.map(QPointF(0, delegated()->boundingRect().height() - moveY));
- QPointF bottomLeft2 = mInitialTransform.map(QPointF(0, delegated()->boundingRect().height()));
- vector.setPoints(bottomLeft1, bottomLeft2);
- }
- mTranslateX = vector.dx();
- mTranslateY = vector.dy();
- }
- tr = buildTransform();
- }
-
- delegated()->setTransform(tr);
- event->accept();
-}
-
-
-QTransform UBGraphicsDelegateFrame::buildTransform()
-{
- QTransform tr;
- QPointF center = delegated()->boundingRect().center();
-
- // Translate
- tr.translate(mTotalTranslateX + mTranslateX, mTotalTranslateY + mTranslateY);
-
- // Set angle
- tr.translate(center.x() * mTotalScaleX * mScaleX, center.y() * mTotalScaleY * mScaleY);
- tr.rotate(-mAngle);
- tr.translate(-center.x() * mTotalScaleX * mScaleX, -center.y() * mTotalScaleY * mScaleY);
-
- // Scale
- tr.scale(mTotalScaleX * mScaleX, mTotalScaleY * mScaleY);
- return tr;
-}
-
-
-void UBGraphicsDelegateFrame::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
-{
- if (angleWidget->isVisible())
- angleWidget->hide();
-
- updateResizeCursors();
-
- mDelegate->commitUndoStep();
- mTotalScaleX *= mScaleX;
- mTotalScaleY *= mScaleY;
- mTotalTranslateX += mTranslateX;
- mTotalTranslateY += mTranslateY;
- event->accept();
-
- mCurrentTool = None;
- QGraphicsRectItem::mouseReleaseEvent(event);
-
- // Show the buttons
- if(isResizing()){
- mResizing = false;
- }
- mDelegate->setButtonsVisible(true);
-}
-
-
-void UBGraphicsDelegateFrame::updateResizeCursors()
-{
- QPixmap pix(":/images/cursors/resize.png");
- QTransform tr;
-
- tr.rotate(-mAngle);
- QCursor resizeCursor = QCursor(pix.transformed(tr, Qt::SmoothTransformation), pix.width() / 2, pix.height() / 2);
- mLeftResizeGrip->setCursor(resizeCursor);
- mRightResizeGrip->setCursor(resizeCursor);
-
- tr.rotate(-90);
- resizeCursor = QCursor(pix.transformed(tr, Qt::SmoothTransformation), pix.width() / 2, pix.height() / 2);
- mBottomResizeGrip->setCursor(resizeCursor);
- mTopResizeGrip->setCursor(resizeCursor);
-
- tr.rotate(-45);
- resizeCursor = QCursor(pix.transformed(tr, Qt::SmoothTransformation), pix.width() / 2, pix.height() / 2);
- mBottomRightResizeGrip->setCursor(resizeCursor);
-}
-
-
-void UBGraphicsDelegateFrame::setVisible(bool visible)
-{
- mVisible = visible;
- if (mVisible)
- setBrush(QBrush(UBSettings::paletteColor));
- else
- setBrush(Qt::NoBrush);
-}
-
-
-void UBGraphicsDelegateFrame::positionHandles()
-{
- QRectF itemRect = delegated()->boundingRect();
- QTransform itemTransform = delegated()->sceneTransform();
- QPointF topLeft = itemTransform.map(itemRect.topLeft());
- QPointF topRight = itemTransform.map(itemRect.topRight());
- QPointF bottomLeft = itemTransform.map(itemRect.bottomLeft());
- QPointF bottomRight = itemTransform.map(itemRect.bottomRight());
- QPointF center = itemTransform.map(itemRect.center());
- int rotateHeight = QLineF(topLeft, bottomLeft).length();
-
- // Handle the mirroring
- if(topLeft.x() > topRight.x()){
- QPointF topTmp = topRight;
- QPointF bottomTmp = bottomRight;
- topRight = topLeft;
- topLeft = topTmp;
- bottomRight = bottomLeft;
- bottomLeft = bottomTmp;
- }
-
- if(bottomLeft.y() > topLeft.y()){
- QPointF leftTmp = bottomLeft;
- QPointF rightTmp = bottomRight;
- bottomLeft = topLeft;
- topLeft = leftTmp;
- bottomRight = topRight;
- topRight = rightTmp;
- }
-
- QLineF topLine(topLeft, topRight);
- qreal angle = topLine.angle();
- qreal width = topLine.length();
-
- QLineF leftLine(topLeft, bottomLeft);
- qreal height = leftLine.length();
-
- int h = rotating()?rotateHeight:height;
-
- if (mVisible)
- {
- setRect(center.x() - mFrameWidth - width / 2, center.y() - mFrameWidth - h / 2, width + 2 * mFrameWidth, h + 2 * mFrameWidth);
- }
- else
- {
- setRect(center.x() - width / 2, center.y() - h / 2, width, h);
- }
-
- resetTransform();
- translate(center.x(), center.y());
- rotate(-angle);
- translate(-center.x(), -center.y());
-
- mBottomRightResizeGripSvgItem->setParentItem(this);
- mBottomResizeGripSvgItem->setParentItem(this);
- mLeftResizeGripSvgItem->setParentItem(this);
- mRightResizeGripSvgItem->setParentItem(this);
- mTopResizeGripSvgItem->setParentItem(this);
- mRotateButton->setParentItem(this);
-
- mBottomRightResizeGrip->setParentItem(this);
- mBottomResizeGrip->setParentItem(this);
- mLeftResizeGrip->setParentItem(this);
- mRightResizeGrip->setParentItem(this);
- mTopResizeGrip->setParentItem(this);
-
- QRectF brRect = mBottomRightResizeGripSvgItem->mapRectToParent(mBottomRightResizeGripSvgItem->boundingRect());
- QRectF bRect = mBottomResizeGripSvgItem->mapRectToParent(mBottomResizeGripSvgItem->boundingRect());
- QRectF lRect = mLeftResizeGripSvgItem->mapRectToParent(mLeftResizeGripSvgItem->boundingRect());
- QRectF rRect = mRightResizeGripSvgItem->mapRectToParent(mRightResizeGripSvgItem->boundingRect());
- QRectF trRect = mTopResizeGripSvgItem->mapRectToParent(mTopResizeGripSvgItem->boundingRect());
-
- mBottomRightResizeGripSvgItem->setPos(rect().right() - brRect.width(), rect().bottom() - brRect.height());
- mBottomResizeGripSvgItem->setPos(rect().center().x() - bRect.width() / 2, rect().bottom() - bRect.height());
-
- mLeftResizeGripSvgItem->setPos(rect().left(), rect().center().y() - lRect.height() / 2);
- mRightResizeGripSvgItem->setPos(rect().right() - rRect.width(), rect().center().y() - rRect.height() / 2);
-
- mTopResizeGripSvgItem->setPos(rect().center().x() - trRect.width() / 2, rect().y());
- mRotateButton->setPos(rect().right() - mFrameWidth - 5, rect().top() + 5);
-
- mBottomRightResizeGrip->setRect(bottomRightResizeGripRect());
- mBottomResizeGrip->setRect(bottomResizeGripRect());
- mLeftResizeGrip->setRect(leftResizeGripRect());
- mRightResizeGrip->setRect(rightResizeGripRect());
- mTopResizeGrip->setRect(topResizeGripRect());
-
- QVariant vLocked = delegated()->data(UBGraphicsItemData::ItemLocked);
- bool isLocked = (vLocked.isValid() && vLocked.toBool());
-
- mBottomRightResizeGripSvgItem->setVisible(!isLocked);
- mBottomResizeGripSvgItem->setVisible(!isLocked);
- mLeftResizeGripSvgItem->setVisible(!isLocked);
- mRightResizeGripSvgItem->setVisible(!isLocked);
- mTopResizeGripSvgItem->setVisible(!isLocked);
- mRotateButton->setVisible(mDelegate->canRotate() && !isLocked);
-
- mBottomRightResizeGrip->setVisible(!isLocked);
- mBottomResizeGrip->setVisible(!isLocked);
- mLeftResizeGrip->setVisible(!isLocked);
- mRightResizeGrip->setVisible(!isLocked);
- mTopResizeGrip->setVisible(!isLocked);
-
- if (isLocked)
- {
- QColor baseColor = UBSettings::paletteColor;
- baseColor.setAlphaF(baseColor.alphaF() / 3);
- setBrush(QBrush(baseColor));
- }
- else
- {
- setBrush(QBrush(UBSettings::paletteColor));
- }
-
- //make frame interact like delegated item when selected. Maybe should be deleted if selection logic will change
- setZValue(delegated()->zValue());
-}
-
-
-QGraphicsItem* UBGraphicsDelegateFrame::delegated()
-{
- return mDelegate->delegated();
-}
-
-UBGraphicsDelegateFrame::FrameTool UBGraphicsDelegateFrame::toolFromPos(QPointF pos)
-{
- if(mDelegate->isLocked())
- return None;
- else if (bottomRightResizeGripRect().contains(pos))
- return ResizeBottomRight;
- else if (bottomResizeGripRect().contains(pos)){
- if(mMirrorY){
- return ResizeTop;
- }else{
- return ResizeBottom;
- }
- }
- else if (leftResizeGripRect().contains(pos)){
- if(mMirrorX){
- return ResizeRight;
- }else{
- return ResizeLeft;
- }
- return ResizeLeft;
- }
- else if (rightResizeGripRect().contains(pos)){
- if(mMirrorX){
- return ResizeLeft;
- }else{
- return ResizeRight;
- }
- }
- else if (topResizeGripRect().contains(pos)){
- if(mMirrorY){
- return ResizeBottom;
- }else{
- return ResizeTop;
- }
- }
- else if (rotateButtonBounds().contains(pos) && mDelegate && mDelegate->canRotate())
- return Rotate;
- else
- return Move;
-}
-
-
-QRectF UBGraphicsDelegateFrame::bottomRightResizeGripRect() const
-{
- return QRectF(rect().right() - mFrameWidth, rect().bottom() - mFrameWidth, mFrameWidth, mFrameWidth);
-}
-
-
-QRectF UBGraphicsDelegateFrame::bottomResizeGripRect() const
-{
- return QRectF(rect().center().x() - mFrameWidth / 2, rect().bottom() - mFrameWidth, mFrameWidth, mFrameWidth);
-}
-
-
-QRectF UBGraphicsDelegateFrame::leftResizeGripRect() const
-{
- return QRectF(rect().left(), rect().center().y() - mFrameWidth / 2, mFrameWidth, mFrameWidth);
-}
-
-
-QRectF UBGraphicsDelegateFrame::rightResizeGripRect() const
-{
- return QRectF(rect().right() - mFrameWidth, rect().center().y() - mFrameWidth / 2, mFrameWidth, mFrameWidth);
-}
-
-
-QRectF UBGraphicsDelegateFrame::topResizeGripRect() const
-{
- return QRectF(rect().center().x() - mFrameWidth / 2, rect().top(), mFrameWidth, mFrameWidth);
-}
-
-
-QRectF UBGraphicsDelegateFrame::rotateButtonBounds() const
-{
- return QRectF(rect().right()- mFrameWidth, rect().top(), mFrameWidth, mFrameWidth);
-}
-
-void UBGraphicsDelegateFrame::refreshGeometry()
-{
- // Here we want to have the left on the left, the right on the right, the top on the top and the bottom on the bottom!
- QRectF itemRect = delegated()->boundingRect();
- QTransform itemTransform = delegated()->sceneTransform();
- QPointF topLeft = itemTransform.map(itemRect.topLeft());
- QPointF topRight = itemTransform.map(itemRect.topRight());
- QPointF bottomLeft = itemTransform.map(itemRect.bottomLeft());
-
- QLineF topLine(topLeft, topRight);
- qreal width = topLine.length();
- QLineF leftLine(topLeft, bottomLeft);
- qreal height = leftLine.length();
- setRect(topRight.x() - mFrameWidth, topLeft.y() - mFrameWidth, width + 2*mFrameWidth, height + 2*mFrameWidth);
-}
+/*
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include "UBGraphicsDelegateFrame.h"
+
+#include
+#include
+
+#include "core/UBApplication.h"
+#include "core/UBSettings.h"
+
+#include "domain/UBGraphicsItemDelegate.h"
+#include "domain/UBGraphicsScene.h"
+#include "domain/UBGraphicsProxyWidget.h"
+
+#include "gui/UBResources.h"
+
+#include "core/memcheck.h"
+
+UBGraphicsDelegateFrame::UBGraphicsDelegateFrame(UBGraphicsItemDelegate* pDelegate, QRectF pRect, qreal pFrameWidth, bool respectRatio)
+ : QGraphicsRectItem(), QObject(pDelegate)
+ , mCurrentTool(None)
+ , mDelegate(pDelegate)
+ , mVisible(true)
+ , mFrameWidth(pFrameWidth)
+ , mNominalFrameWidth(pFrameWidth)
+ , mRespectRatio(respectRatio)
+ , mAngle(0)
+ , mAngleOffset(0)
+ , mTotalScaleX(-1)
+ , mTotalScaleY(-1)
+ , mTranslateX(0)
+ , mTranslateY(0)
+ , mTotalTranslateX(0)
+ , mTotalTranslateY(0)
+ , mOperationMode(Scaling)
+ , mMirrorX(false)
+ , mMirrorY(false)
+{
+ mAngleTolerance = UBSettings::settings()->angleTolerance->get().toReal();
+
+ setFlag(QGraphicsItem::ItemSendsGeometryChanges, true);
+
+ setAcceptedMouseButtons(Qt::LeftButton);
+ setRect(pRect.adjusted(mFrameWidth, mFrameWidth, mFrameWidth * -1, mFrameWidth * -1));
+
+ setBrush(QBrush(UBSettings::paletteColor));
+ setPen(Qt::NoPen);
+ setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control));
+
+ mBottomRightResizeGripSvgItem = new QGraphicsSvgItem(":/images/resize.svg", this);
+ mBottomResizeGripSvgItem = new QGraphicsSvgItem(":/images/resizeBottom.svg", this);
+ mLeftResizeGripSvgItem = new QGraphicsSvgItem(":/images/resizeLeft.svg", this);
+ mRightResizeGripSvgItem = new QGraphicsSvgItem(":/images/resizeRight.svg", this);
+ mTopResizeGripSvgItem = new QGraphicsSvgItem(":/images/resizeTop.svg", this);
+
+ mBottomRightResizeGrip = new QGraphicsRectItem(this);
+ mBottomRightResizeGrip->setPen(Qt::NoPen);
+ mBottomResizeGrip = new QGraphicsRectItem(this);
+ mBottomResizeGrip->setPen(Qt::NoPen);
+ mLeftResizeGrip = new QGraphicsRectItem(this);
+ mLeftResizeGrip->setToolTip("left");
+ mLeftResizeGrip->setPen(Qt::NoPen);
+ mRightResizeGrip = new QGraphicsRectItem(this);
+ mRightResizeGrip->setPen(Qt::NoPen);
+ mRightResizeGrip->setToolTip("Right");
+ mTopResizeGrip = new QGraphicsRectItem(this);
+ mTopResizeGrip->setPen(Qt::NoPen);
+
+ mRotateButton = new QGraphicsSvgItem(":/images/rotate.svg", this);
+ mRotateButton->setCursor(UBResources::resources()->rotateCursor);
+ mRotateButton->setVisible(mDelegate->canRotate());
+
+ updateResizeCursors();
+
+ setAntiScale(1.0);
+
+ positionHandles();
+
+ this->setAcceptHoverEvents(true);
+
+ angleWidget = new UBAngleWidget();
+}
+
+
+UBGraphicsDelegateFrame::~UBGraphicsDelegateFrame()
+{
+delete angleWidget;
+ // NOOP
+}
+
+void UBGraphicsDelegateFrame::setAntiScale(qreal pAntiScale)
+{
+ mFrameWidth = mNominalFrameWidth * pAntiScale;
+
+ QTransform tr;
+ tr.scale(pAntiScale, pAntiScale);
+
+ mBottomRightResizeGripSvgItem->setTransform(tr);
+ mBottomResizeGripSvgItem->setTransform(tr);
+ mLeftResizeGripSvgItem->setTransform(tr);
+ mRightResizeGripSvgItem->setTransform(tr);
+ mTopResizeGripSvgItem->setTransform(tr);
+ mRotateButton->setTransform(tr);
+}
+
+
+void UBGraphicsDelegateFrame::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+{
+ Q_UNUSED(option);
+ Q_UNUSED(widget);
+
+ QPainterPath path;
+ path.addRoundedRect(rect(), mFrameWidth / 2, mFrameWidth / 2);
+
+ if (rect().width() > 1 && rect().height() > 1)
+ {
+ QPainterPath extruded;
+ extruded.addRect(rect().adjusted(mFrameWidth, mFrameWidth, (mFrameWidth * -1), (mFrameWidth * -1)));
+ path = path.subtracted(extruded);
+ }
+
+ painter->fillPath(path, brush());
+}
+
+
+QPainterPath UBGraphicsDelegateFrame::shape() const
+{
+ QPainterPath path;
+
+ //We do not use the rounded rect here because we want the bottom right corner
+ //to be included in the frame (for resize grip handling : #702)
+ path.addRect(rect());
+
+ if (rect().width() > 0 && rect().height() > 0)
+ {
+ QPainterPath extruded;
+ extruded.addRect(rect().adjusted(mFrameWidth, mFrameWidth, mFrameWidth * -1, mFrameWidth * -1));
+ path = path.subtracted(extruded);
+ }
+
+ return path;
+}
+
+
+void UBGraphicsDelegateFrame::initializeTransform()
+{
+ QTransform itemTransform = delegated()->sceneTransform();
+ QRectF itemRect = delegated()->boundingRect();
+ QPointF topLeft = itemTransform.map(itemRect.topLeft());
+ QPointF topRight = itemTransform.map(itemRect.topRight());
+ QPointF bottomLeft = itemTransform.map(itemRect.bottomLeft());
+
+ qreal horizontalFlip = (topLeft.x() > topRight.x()) ? -1 : 1;
+ mMirrorX = horizontalFlip < 0 ;
+ if(horizontalFlip < 0){
+ // why this is because of the way of calculating the translations that checks which side is the most is the
+ // nearest instead of checking which one is the left side.
+ QPointF tmp = topLeft;
+ topLeft = topRight;
+ topRight = tmp;
+
+ // because of the calculation of the height is done by lenght and not deltaY
+ bottomLeft = itemTransform.map(itemRect.bottomRight());
+ }
+
+ qreal verticalFlip = (bottomLeft.y() < topLeft.y()) ? -1 : 1;
+ // not sure that is usefull
+ mMirrorY = verticalFlip < 0;
+ if(verticalFlip < 0 && !mMirrorX){
+ topLeft = itemTransform.map(itemRect.bottomLeft());
+ topRight = itemTransform.map(itemRect.bottomRight());
+ bottomLeft = itemTransform.map(itemRect.topLeft());
+ }
+
+ QLineF topLine(topLeft, topRight);
+ QLineF leftLine(topLeft, bottomLeft);
+ qreal width = topLine.length();
+ qreal height = leftLine.length();
+
+ mAngle = topLine.angle();
+
+ // the fact the the length is used we loose the horizontalFlip information
+ // a better way to do this is using DeltaX that preserve the direction information.
+ mTotalScaleX = (width / itemRect.width()) * horizontalFlip;
+ mTotalScaleY = height / itemRect.height() * verticalFlip;
+
+ QTransform tr;
+ QPointF center = delegated()->boundingRect().center();
+ tr.translate(center.x() * mTotalScaleX, center.y() * mTotalScaleY);
+ tr.rotate(-mAngle);
+ tr.translate(-center.x() * mTotalScaleX, -center.y() * mTotalScaleY);
+ tr.scale(mTotalScaleX, mTotalScaleY);
+
+ mTotalTranslateX = delegated()->transform().dx() - tr.dx();
+ mTotalTranslateY = delegated()->transform().dy() - tr.dy();
+}
+
+
+void UBGraphicsDelegateFrame::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ mDelegate->startUndoStep();
+
+ mStartingPoint = event->scenePos();
+
+ initializeTransform();
+
+ mScaleX = 1;
+ mScaleY = 1;
+ mTranslateX = 0;
+ mTranslateY = 0;
+ mAngleOffset = 0;
+
+ mInitialTransform = buildTransform();
+
+ mCurrentTool = toolFromPos(event->pos());
+
+ event->accept();
+}
+
+bool UBGraphicsDelegateFrame::canResizeBottomRight(qreal width, qreal height, qreal scaleFactor)
+{
+ bool res = false;
+
+ if(!mMirrorX && !mMirrorX && ((width * scaleFactor) > 2*mFrameWidth && (height * scaleFactor) > 2*mFrameWidth)){
+ res = true;
+ }else if(mMirrorX && !mMirrorY && (-width * scaleFactor) > 2*mFrameWidth && (height*scaleFactor) > 2*mFrameWidth){
+ res = true;
+ }else if(!mMirrorX && mMirrorY && (width * scaleFactor) > 2*mFrameWidth && (-height*scaleFactor) > 2*mFrameWidth){
+ res = true;
+ }else if(mMirrorX && mMirrorY && (-width * scaleFactor) > 2*mFrameWidth && (-height*scaleFactor) > 2*mFrameWidth){
+ res = true;
+ }
+
+ return res;
+}
+
+void UBGraphicsDelegateFrame::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+ QLineF move(mStartingPoint, event->scenePos());
+ qreal moveX = move.length() * cos((move.angle() - mAngle) * PI / 180);
+ qreal moveY = -move.length() * sin((move.angle() - mAngle) * PI / 180);
+ qreal width = delegated()->boundingRect().width() * mTotalScaleX;
+ qreal height = delegated()->boundingRect().height() * mTotalScaleY;
+
+ if(mOperationMode == Scaling)
+ {
+ mTranslateX = moveX;
+ // Perform the resize
+ if (resizingBottomRight())
+ {
+ // -----------------------------------------------------
+ // ! We want to keep the aspect ratio with this resize !
+ // -----------------------------------------------------
+ qreal scaleX;
+ qreal scaleY;
+
+ if(!mMirrorX){
+ scaleX = (width + moveX) / width;
+ }else{
+ scaleX = (width - moveX) / width;
+ }
+
+ if(!mMirrorY){
+ scaleY = (height + moveY) / height;
+ }else{
+ scaleY = (height - moveY) / height;
+ }
+
+ qreal scaleFactor = (scaleX + scaleY) / 2;
+
+ // Do not allow resizing of image size under frame size
+ if (canResizeBottomRight(width, height, scaleFactor))
+ {
+ if (mRespectRatio)
+ {
+ mScaleX = scaleFactor;
+ mScaleY = scaleFactor;
+ }
+ else
+ {
+ mScaleX = scaleX;
+ mScaleY = scaleY;
+ }
+ }
+ }else if (resizingLeft() || resizingRight())
+ {
+ if(width != 0){
+ qreal scaleX = 0.0;
+ if(resizingLeft()){
+ scaleX = (width - moveX) / width;
+ }else if(resizingRight()){
+ scaleX = (width + moveX) / width;
+ }
+ if(mDelegate->isFlippable() && qAbs(scaleX) != 0){
+ if((qAbs(width * scaleX)) < 2*mFrameWidth){
+ bool negative = (scaleX < 0)?true:false;
+ if(negative){
+ if(mMirrorX)
+ scaleX = 2*mFrameWidth/width;
+ else
+ scaleX = -2*mFrameWidth/width;
+ }else{
+ scaleX = -1;
+ }
+ }
+ mScaleX = scaleX;
+ }else if (scaleX > 1 || (width * scaleX) > 2 * mFrameWidth){
+ mScaleX = scaleX;
+ if(resizingLeft()){
+ mTranslateX = moveX;
+ }
+ }
+ }
+ }else if(resizingTop() || resizingBottom()){
+ if(height != 0){
+ qreal scaleY = 0.0;
+ if(resizingTop()){
+ scaleY = (height - moveY) / height;
+ }else if(resizingBottom()){
+ scaleY = (height + moveY) / height;
+ }
+
+ if(mDelegate->isFlippable() && qAbs(scaleY) != 0){
+ if((qAbs(height * scaleY)) < 2*mFrameWidth){
+ bool negative = (scaleY < 0)?true:false;
+ if(negative){
+ if(mMirrorY)
+ scaleY = 2*mFrameWidth/width;
+ else
+ scaleY = -2*mFrameWidth/width;
+ }else{
+ scaleY = -1;
+ }
+ }
+ mScaleY = scaleY;
+ }else if (scaleY > 1 || (height * scaleY) > 2 * mFrameWidth)
+ {
+ mScaleY = scaleY;
+ if(resizingTop()){
+ mTranslateY = moveY;
+ }
+ }
+ }
+ }
+ }
+ else if (mOperationMode == Resizing)
+ {
+ mTranslateX = moveX;
+ UBResizableGraphicsItem* resizableItem = dynamic_cast(delegated());
+
+ if (resizableItem)
+ {
+ QLineF mousePosDelta(delegated()->mapFromScene(event->lastScenePos())
+ , delegated()->mapFromScene(event->scenePos()));
+ QSizeF incVector(0, 0);
+
+ if (resizingBottomRight())
+ {
+ incVector = QSizeF(mousePosDelta.dx(), mousePosDelta.dy());
+ }
+ else if (resizingRight())
+ {
+ incVector = QSizeF(mousePosDelta.dx(), 0);
+ }
+ else if (resizingBottom())
+ {
+ incVector = QSizeF(0, mousePosDelta.dy());
+ }
+ else if (resizingLeft())
+ {
+ incVector = QSizeF(- mousePosDelta.dx(), 0);
+ }
+ else if (resizingTop())
+ {
+ incVector = QSizeF(0, - mousePosDelta.dy());
+ }
+
+ QSizeF newSize = resizableItem->size() + incVector;
+
+ if (!(mDelegate->getToolBarItem()->isVisibleOnBoard()
+ && (newSize.width() < mDelegate->getToolBarItem()->minWidth() / mDelegate->antiScaleRatio()
+ || newSize.height() < mDelegate->getToolBarItem()->minWidth() / mDelegate->antiScaleRatio() * 3/4)))
+ resizableItem->resize(newSize);
+ }
+ }
+
+ if (rotating())
+ {
+ mTranslateX = 0;
+ mTranslateY = 0;
+
+ QLineF startLine(sceneBoundingRect().center(), event->lastScenePos());
+ QLineF currentLine(sceneBoundingRect().center(), event->scenePos());
+ mAngle += startLine.angleTo(currentLine);
+
+ if ((int)mAngle % 45 >= 45 - mAngleTolerance || (int)mAngle % 45 <= mAngleTolerance)
+ {
+ mAngle = qRound(mAngle / 45) * 45;
+ mAngleOffset += startLine.angleTo(currentLine);
+ if ((int)mAngleOffset % 360 > mAngleTolerance && (int)mAngleOffset % 360 < 360 - mAngleTolerance)
+ {
+ mAngle += mAngleOffset;
+ mAngleOffset = 0;
+ }
+ }
+ else if ((int)mAngle % 30 >= 30 - mAngleTolerance || (int)mAngle % 30 <= mAngleTolerance)
+ {
+ mAngle = qRound(mAngle / 30) * 30;
+ mAngleOffset += startLine.angleTo(currentLine);
+ if ((int)mAngleOffset % 360 > mAngleTolerance && (int)mAngleOffset % 360 < 360 - mAngleTolerance)
+ {
+ mAngle += mAngleOffset;
+ mAngleOffset = 0;
+ }
+ }
+
+ if (!angleWidget->isVisible())
+ angleWidget->show();
+
+ angleWidget->setText(QString::number((int)mAngle % 360));
+ angleWidget->update();
+
+ }
+ else if (moving())
+ {
+ mTranslateX = move.dx();
+ mTranslateY = move.dy();
+ }
+
+ QTransform tr = buildTransform();
+
+ //TODO UB 4.x: Could find a better solution ?
+ if (resizingRight() || resizingBottom() || resizingBottomRight())
+ {
+ QPointF ref;
+ if(!mMirrorX && !mMirrorY){
+ ref = delegated()->boundingRect().topLeft();
+ }else if(mMirrorX && !mMirrorY){
+ ref = delegated()->boundingRect().topLeft();
+ }else if(!mMirrorX && mMirrorY){
+ ref = delegated()->boundingRect().topLeft();
+ }else if(mMirrorX && mMirrorY){
+ ref = delegated()->boundingRect().topRight();
+ }
+
+ // Map the item topleft point to the current mouse move transform
+ QPointF topLeft = tr.map(ref);
+
+ // Map the item topleft point to the mouse press transform
+ QPointF fixedPoint = mInitialTransform.map(ref);
+
+ // Update the translation coordinates
+ mTranslateX += fixedPoint.x() - topLeft.x();
+ mTranslateY += fixedPoint.y() - topLeft.y();
+
+ // Update the transform
+ tr = buildTransform();
+ }
+ else if (resizingTop() || resizingLeft())
+ {
+ if (mOperationMode == Scaling)
+ {
+ QPointF bottomRight = tr.map(delegated()->boundingRect().bottomRight());
+ QPointF fixedPoint = mInitialTransform.map(delegated()->boundingRect().bottomRight());
+ mTranslateX += fixedPoint.x() - bottomRight.x();
+ mTranslateY += fixedPoint.y() - bottomRight.y();
+ }
+ else
+ {
+ QLineF vector;
+ if (resizingLeft())
+ {
+ QPointF topRight1 = mInitialTransform.map(QPointF(delegated()->boundingRect().width() - moveX, 0));
+ QPointF topRight2 = mInitialTransform.map(QPointF(delegated()->boundingRect().width(), 0));
+ vector.setPoints(topRight1, topRight2);
+ }
+ else
+ {
+ QPointF bottomLeft1 = mInitialTransform.map(QPointF(0, delegated()->boundingRect().height() - moveY));
+ QPointF bottomLeft2 = mInitialTransform.map(QPointF(0, delegated()->boundingRect().height()));
+ vector.setPoints(bottomLeft1, bottomLeft2);
+ }
+ mTranslateX = vector.dx();
+ mTranslateY = vector.dy();
+ }
+ tr = buildTransform();
+ }
+
+ delegated()->setTransform(tr);
+ event->accept();
+}
+
+
+QTransform UBGraphicsDelegateFrame::buildTransform()
+{
+ QTransform tr;
+ QPointF center = delegated()->boundingRect().center();
+
+ // Translate
+ tr.translate(mTotalTranslateX + mTranslateX, mTotalTranslateY + mTranslateY);
+
+ // Set angle
+ tr.translate(center.x() * mTotalScaleX * mScaleX, center.y() * mTotalScaleY * mScaleY);
+ tr.rotate(-mAngle);
+ tr.translate(-center.x() * mTotalScaleX * mScaleX, -center.y() * mTotalScaleY * mScaleY);
+
+ // Scale
+ tr.scale(mTotalScaleX * mScaleX, mTotalScaleY * mScaleY);
+ return tr;
+}
+
+
+void UBGraphicsDelegateFrame::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+ if (angleWidget->isVisible())
+ angleWidget->hide();
+
+ updateResizeCursors();
+
+ mDelegate->commitUndoStep();
+ mTotalScaleX *= mScaleX;
+ mTotalScaleY *= mScaleY;
+ mTotalTranslateX += mTranslateX;
+ mTotalTranslateY += mTranslateY;
+ event->accept();
+
+ mCurrentTool = None;
+ QGraphicsRectItem::mouseReleaseEvent(event);
+
+ // Show the buttons
+ if(isResizing()){
+ mResizing = false;
+ }
+ mDelegate->setButtonsVisible(true);
+}
+
+
+void UBGraphicsDelegateFrame::updateResizeCursors()
+{
+ QPixmap pix(":/images/cursors/resize.png");
+ QTransform tr;
+
+ tr.rotate(-mAngle);
+ QCursor resizeCursor = QCursor(pix.transformed(tr, Qt::SmoothTransformation), pix.width() / 2, pix.height() / 2);
+ mLeftResizeGrip->setCursor(resizeCursor);
+ mRightResizeGrip->setCursor(resizeCursor);
+
+ tr.rotate(-90);
+ resizeCursor = QCursor(pix.transformed(tr, Qt::SmoothTransformation), pix.width() / 2, pix.height() / 2);
+ mBottomResizeGrip->setCursor(resizeCursor);
+ mTopResizeGrip->setCursor(resizeCursor);
+
+ tr.rotate(-45);
+ resizeCursor = QCursor(pix.transformed(tr, Qt::SmoothTransformation), pix.width() / 2, pix.height() / 2);
+ mBottomRightResizeGrip->setCursor(resizeCursor);
+}
+
+
+void UBGraphicsDelegateFrame::setVisible(bool visible)
+{
+ mVisible = visible;
+ if (mVisible)
+ setBrush(QBrush(UBSettings::paletteColor));
+ else
+ setBrush(Qt::NoBrush);
+}
+
+
+void UBGraphicsDelegateFrame::positionHandles()
+{
+ QRectF itemRect = delegated()->boundingRect();
+
+ if (mDelegate->getToolBarItem()->isVisibleOnBoard()
+ && mDelegate->getToolBarItem()->isShifting())
+ itemRect.setHeight(itemRect.height() + mDelegate->getToolBarItem()->rect().height() * mDelegate->antiScaleRatio() * 1.1);
+
+ QTransform itemTransform = delegated()->sceneTransform();
+ QPointF topLeft = itemTransform.map(itemRect.topLeft());
+ QPointF topRight = itemTransform.map(itemRect.topRight());
+ QPointF bottomLeft = itemTransform.map(itemRect.bottomLeft());
+ QPointF bottomRight = itemTransform.map(itemRect.bottomRight());
+ QPointF center = itemTransform.map(itemRect.center());
+ int rotateHeight = QLineF(topLeft, bottomLeft).length();
+
+ // Handle the mirroring
+ if(topLeft.x() > topRight.x()){
+ QPointF topTmp = topRight;
+ QPointF bottomTmp = bottomRight;
+ topRight = topLeft;
+ topLeft = topTmp;
+ bottomRight = bottomLeft;
+ bottomLeft = bottomTmp;
+ }
+
+ if(bottomLeft.y() > topLeft.y()){
+ QPointF leftTmp = bottomLeft;
+ QPointF rightTmp = bottomRight;
+ bottomLeft = topLeft;
+ topLeft = leftTmp;
+ bottomRight = topRight;
+ topRight = rightTmp;
+ }
+
+ QLineF topLine(topLeft, topRight);
+ qreal angle = topLine.angle();
+ qreal width = topLine.length();
+
+ QLineF leftLine(topLeft, bottomLeft);
+ qreal height = leftLine.length();
+
+ int h = rotating()?rotateHeight:height;
+
+ if (mVisible)
+ {
+ setRect(center.x() - mFrameWidth - width / 2, center.y() - mFrameWidth - h / 2, width + 2 * mFrameWidth, h + 2 * mFrameWidth);
+ }
+ else
+ {
+ setRect(center.x() - width / 2, center.y() - h / 2, width, h);
+ }
+
+ resetTransform();
+ translate(center.x(), center.y());
+ rotate(-angle);
+ translate(-center.x(), -center.y());
+
+ mBottomRightResizeGripSvgItem->setParentItem(this);
+ mBottomResizeGripSvgItem->setParentItem(this);
+ mLeftResizeGripSvgItem->setParentItem(this);
+ mRightResizeGripSvgItem->setParentItem(this);
+ mTopResizeGripSvgItem->setParentItem(this);
+ mRotateButton->setParentItem(this);
+
+ mBottomRightResizeGrip->setParentItem(this);
+ mBottomResizeGrip->setParentItem(this);
+ mLeftResizeGrip->setParentItem(this);
+ mRightResizeGrip->setParentItem(this);
+ mTopResizeGrip->setParentItem(this);
+
+ QRectF brRect = mBottomRightResizeGripSvgItem->mapRectToParent(mBottomRightResizeGripSvgItem->boundingRect());
+ QRectF bRect = mBottomResizeGripSvgItem->mapRectToParent(mBottomResizeGripSvgItem->boundingRect());
+ QRectF lRect = mLeftResizeGripSvgItem->mapRectToParent(mLeftResizeGripSvgItem->boundingRect());
+ QRectF rRect = mRightResizeGripSvgItem->mapRectToParent(mRightResizeGripSvgItem->boundingRect());
+ QRectF trRect = mTopResizeGripSvgItem->mapRectToParent(mTopResizeGripSvgItem->boundingRect());
+
+ mBottomRightResizeGripSvgItem->setPos(rect().right() - brRect.width(), rect().bottom() - brRect.height());
+ mBottomResizeGripSvgItem->setPos(rect().center().x() - bRect.width() / 2, rect().bottom() - bRect.height());
+
+ mLeftResizeGripSvgItem->setPos(rect().left(), rect().center().y() - lRect.height() / 2);
+ mRightResizeGripSvgItem->setPos(rect().right() - rRect.width(), rect().center().y() - rRect.height() / 2);
+
+ mTopResizeGripSvgItem->setPos(rect().center().x() - trRect.width() / 2, rect().y());
+ mRotateButton->setPos(rect().right() - mFrameWidth - 5, rect().top() + 5);
+
+ mBottomRightResizeGrip->setRect(bottomRightResizeGripRect());
+ mBottomResizeGrip->setRect(bottomResizeGripRect());
+ mLeftResizeGrip->setRect(leftResizeGripRect());
+ mRightResizeGrip->setRect(rightResizeGripRect());
+ mTopResizeGrip->setRect(topResizeGripRect());
+
+ QVariant vLocked = delegated()->data(UBGraphicsItemData::ItemLocked);
+ bool isLocked = (vLocked.isValid() && vLocked.toBool());
+
+ mBottomRightResizeGripSvgItem->setVisible(!isLocked);
+ mBottomResizeGripSvgItem->setVisible(!isLocked);
+ mLeftResizeGripSvgItem->setVisible(!isLocked);
+ mRightResizeGripSvgItem->setVisible(!isLocked);
+ mTopResizeGripSvgItem->setVisible(!isLocked);
+ mRotateButton->setVisible(mDelegate->canRotate() && !isLocked);
+
+ mBottomRightResizeGrip->setVisible(!isLocked);
+ mBottomResizeGrip->setVisible(!isLocked);
+ mLeftResizeGrip->setVisible(!isLocked);
+ mRightResizeGrip->setVisible(!isLocked);
+ mTopResizeGrip->setVisible(!isLocked);
+
+ if (isLocked)
+ {
+ QColor baseColor = UBSettings::paletteColor;
+ baseColor.setAlphaF(baseColor.alphaF() / 3);
+ setBrush(QBrush(baseColor));
+ }
+ else
+ {
+ setBrush(QBrush(UBSettings::paletteColor));
+ }
+
+ //make frame interact like delegated item when selected. Maybe should be deleted if selection logic will change
+ setZValue(delegated()->zValue());
+}
+
+
+QGraphicsItem* UBGraphicsDelegateFrame::delegated()
+{
+ return mDelegate->delegated();
+}
+
+UBGraphicsDelegateFrame::FrameTool UBGraphicsDelegateFrame::toolFromPos(QPointF pos)
+{
+ if(mDelegate->isLocked())
+ return None;
+ else if (bottomRightResizeGripRect().contains(pos))
+ return ResizeBottomRight;
+ else if (bottomResizeGripRect().contains(pos)){
+ if(mMirrorY){
+ return ResizeTop;
+ }else{
+ return ResizeBottom;
+ }
+ }
+ else if (leftResizeGripRect().contains(pos)){
+ if(mMirrorX){
+ return ResizeRight;
+ }else{
+ return ResizeLeft;
+ }
+ return ResizeLeft;
+ }
+ else if (rightResizeGripRect().contains(pos)){
+ if(mMirrorX){
+ return ResizeLeft;
+ }else{
+ return ResizeRight;
+ }
+ }
+ else if (topResizeGripRect().contains(pos)){
+ if(mMirrorY){
+ return ResizeBottom;
+ }else{
+ return ResizeTop;
+ }
+ }
+ else if (rotateButtonBounds().contains(pos) && mDelegate && mDelegate->canRotate())
+ return Rotate;
+ else
+ return Move;
+}
+
+
+QRectF UBGraphicsDelegateFrame::bottomRightResizeGripRect() const
+{
+ return QRectF(rect().right() - mFrameWidth, rect().bottom() - mFrameWidth, mFrameWidth, mFrameWidth);
+}
+
+
+QRectF UBGraphicsDelegateFrame::bottomResizeGripRect() const
+{
+ return QRectF(rect().center().x() - mFrameWidth / 2, rect().bottom() - mFrameWidth, mFrameWidth, mFrameWidth);
+}
+
+
+QRectF UBGraphicsDelegateFrame::leftResizeGripRect() const
+{
+ return QRectF(rect().left(), rect().center().y() - mFrameWidth / 2, mFrameWidth, mFrameWidth);
+}
+
+
+QRectF UBGraphicsDelegateFrame::rightResizeGripRect() const
+{
+ return QRectF(rect().right() - mFrameWidth, rect().center().y() - mFrameWidth / 2, mFrameWidth, mFrameWidth);
+}
+
+
+QRectF UBGraphicsDelegateFrame::topResizeGripRect() const
+{
+ return QRectF(rect().center().x() - mFrameWidth / 2, rect().top(), mFrameWidth, mFrameWidth);
+}
+
+
+QRectF UBGraphicsDelegateFrame::rotateButtonBounds() const
+{
+ return QRectF(rect().right()- mFrameWidth, rect().top(), mFrameWidth, mFrameWidth);
+}
+
+void UBGraphicsDelegateFrame::refreshGeometry()
+{
+ // Here we want to have the left on the left, the right on the right, the top on the top and the bottom on the bottom!
+ QRectF itemRect = delegated()->boundingRect();
+ QTransform itemTransform = delegated()->sceneTransform();
+ QPointF topLeft = itemTransform.map(itemRect.topLeft());
+ QPointF topRight = itemTransform.map(itemRect.topRight());
+ QPointF bottomLeft = itemTransform.map(itemRect.bottomLeft());
+
+ QLineF topLine(topLeft, topRight);
+ qreal width = topLine.length();
+ QLineF leftLine(topLeft, bottomLeft);
+ qreal height = leftLine.length();
+ setRect(topRight.x() - mFrameWidth, topLeft.y() - mFrameWidth, width + 2*mFrameWidth, height + 2*mFrameWidth);
+}
diff --git a/src/domain/UBGraphicsItemDelegate.cpp b/src/domain/UBGraphicsItemDelegate.cpp
index cadbf191..c081d40e 100644
--- a/src/domain/UBGraphicsItemDelegate.cpp
+++ b/src/domain/UBGraphicsItemDelegate.cpp
@@ -37,6 +37,9 @@
#include "UBGraphicsWidgetItem.h"
#include "domain/UBAbstractWidget.h"
+#include "domain/UBGraphicsTextItem.h"
+#include "domain/UBGraphicsAudioItem.h"
+#include "domain/UBGraphicsVideoItem.h"
#include "web/UBWebController.h"
@@ -47,6 +50,27 @@
class UBGraphicsParaschoolEditorWidgetItem;
+DelegateButton::DelegateButton(const QString & fileName, QGraphicsItem* pDelegated, QGraphicsItem * parent, Qt::WindowFrameSection section)
+ : QGraphicsSvgItem(fileName, parent)
+ , mDelegated(pDelegated)
+ , mIsTransparentToMouseEvent(false)
+ , mButtonAlignmentSection(section)
+{
+ setAcceptedMouseButtons(Qt::LeftButton);
+ setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control));
+}
+
+DelegateButton::~DelegateButton()
+{
+ // NOOP
+}
+
+void DelegateButton::setFileName(const QString & fileName)
+{
+ QGraphicsSvgItem::setSharedRenderer(new QSvgRenderer (fileName, this));
+}
+
+
void DelegateButton::mousePressEvent(QGraphicsSceneMouseEvent *event)
{
// make sure delegate is selected, to avoid control being hidden
@@ -93,6 +117,8 @@ UBGraphicsItemDelegate::UBGraphicsItemDelegate(QGraphicsItem* pDelegated, QObjec
void UBGraphicsItemDelegate::init()
{
+ mToolBarItem = new UBGraphicsToolBarItem(delegated());
+
mFrame = new UBGraphicsDelegateFrame(this, QRectF(0, 0, 0, 0), mFrameWidth, mRespectRatio);
mFrame->hide();
mFrame->setFlag(QGraphicsItem::ItemIsSelectable, true);
@@ -123,10 +149,13 @@ void UBGraphicsItemDelegate::init()
foreach(DelegateButton* button, mButtons)
{
+ if (button->getSection() != Qt::TitleBarArea)
+ {
button->hide();
button->setFlag(QGraphicsItem::ItemIsSelectable, true);
}
}
+}
UBGraphicsItemDelegate::~UBGraphicsItemDelegate()
@@ -292,13 +321,20 @@ void UBGraphicsItemDelegate::positionHandles()
updateButtons(true);
+ if (mToolBarItem->isVisibleOnBoard())
+ {
+ updateToolBar();
+ mToolBarItem->show();
+ }
} else {
foreach(DelegateButton* button, mButtons)
button->hide();
mFrame->hide();
+ mToolBarItem->hide();
}
}
+
void UBGraphicsItemDelegate::setZOrderButtonsVisible(bool visible)
{
if (visible) {
@@ -335,6 +371,7 @@ void UBGraphicsItemDelegate::remove(bool canUndo)
scene->removeItem(mFrame);
scene->removeItem(mDelegated);
+ scene->removeItem(mToolBarItem);
if (canUndo)
{
@@ -577,14 +614,16 @@ void UBGraphicsItemDelegate::updateButtons(bool showUpdated)
int i = 1, j = 0, k = 0;
while ((i + j + k) < mButtons.size()) {
DelegateButton* button = mButtons[i + j];
- button->setParentItem(mFrame);
- button->setTransform(tr);
if (button->getSection() == Qt::TopLeftSection) {
+ button->setParentItem(mFrame);
button->setPos(topX + (i++ * 1.6 * mFrameWidth * mAntiScaleRatio), topY);
+ button->setTransform(tr);
} else if (button->getSection() == Qt::BottomLeftSection) {
+ button->setParentItem(mFrame);
button->setPos(bottomX + (++j * 1.6 * mFrameWidth * mAntiScaleRatio), bottomY);
- } else if (button->getSection() == Qt::NoSection) {
+ button->setTransform(tr);
+ } else if (button->getSection() == Qt::TitleBarArea || button->getSection() == Qt::NoSection){
++k;
}
if (!button->scene())
@@ -599,9 +638,65 @@ void UBGraphicsItemDelegate::updateButtons(bool showUpdated)
}
}
+void UBGraphicsItemDelegate::updateToolBar()
+{
+ QTransform transformForToolbarButtons;
+ transformForToolbarButtons.scale(mAntiScaleRatio, 1);
+
+ QRectF toolBarRect = mToolBarItem->rect();
+ toolBarRect.setWidth(delegated()->boundingRect().width() - 10);
+ mToolBarItem->setRect(toolBarRect);
+
+ if (mToolBarItem->isShifting())
+ mToolBarItem->setPos(delegated()->boundingRect().bottomLeft() + QPointF(5 * mAntiScaleRatio, 0));
+ else mToolBarItem->setPos(delegated()->boundingRect().bottomLeft() - QPointF(-5 * mAntiScaleRatio, mToolBarItem->rect().height() * 1.1 * mAntiScaleRatio));
+
+ int offsetOnToolBar = 5 * mAntiScaleRatio;
+ QList itemList = mToolBarItem->itemsOnToolBar();
+ foreach (QGraphicsItem* item, itemList)
+ {
+ item->setPos(offsetOnToolBar, 0);
+ offsetOnToolBar += (item->boundingRect().width() + 5) * mAntiScaleRatio;
+ item->setTransform(transformForToolbarButtons);
+ item->show();
+ }
+
+ mToolBarItem->setOffsetOnToolBar(offsetOnToolBar);
+
+ QTransform tr;
+ tr.scale(1, mAntiScaleRatio);
+ mToolBarItem->setTransform(tr);
+}
+
void UBGraphicsItemDelegate::setButtonsVisible(bool visible)
{
foreach(DelegateButton* pButton, mButtons){
pButton->setVisible(visible);
}
}
+
+UBGraphicsToolBarItem::UBGraphicsToolBarItem(QGraphicsItem * parent) :
+ QGraphicsRectItem(parent),
+ mShifting(true),
+ mVisible(false),
+ mMinWidth(200)
+{
+ QRectF rect = this->rect();
+ rect.setHeight(26);
+ this->setRect(rect);
+
+ setBrush(QColor(UBSettings::paletteColor));
+ setPen(Qt::NoPen);
+ hide();
+}
+
+void UBGraphicsToolBarItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
+{
+ Q_UNUSED(option);
+ Q_UNUSED(widget);
+
+ QPainterPath path;
+ path.addRoundedRect(rect(), 10, 10);
+
+ painter->fillPath(path, brush());
+}
\ No newline at end of file
diff --git a/src/domain/UBGraphicsItemDelegate.h b/src/domain/UBGraphicsItemDelegate.h
index cc3c8e3b..d24c7562 100644
--- a/src/domain/UBGraphicsItemDelegate.h
+++ b/src/domain/UBGraphicsItemDelegate.h
@@ -35,30 +35,16 @@ class DelegateButton: public QGraphicsSvgItem
Q_OBJECT
public:
- DelegateButton(const QString & fileName, QGraphicsItem* pDelegated, QGraphicsItem * parent = 0, Qt::WindowFrameSection section = Qt::TopLeftSection)
- : QGraphicsSvgItem(fileName, parent)
- , mDelegated(pDelegated)
- , mIsTransparentToMouseEvent(false)
- , mButtonAlignmentSection(section)
- {
- setAcceptedMouseButtons(Qt::LeftButton);
- setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control));
- }
+ DelegateButton(const QString & fileName, QGraphicsItem* pDelegated, QGraphicsItem * parent = 0, Qt::WindowFrameSection section = Qt::TopLeftSection);
- virtual ~DelegateButton()
- {
- // NOOP
- }
+ virtual ~DelegateButton();
void setTransparentToMouseEvent(bool tr)
{
mIsTransparentToMouseEvent = tr;
}
- void setFileName(const QString & fileName)
- {
- QGraphicsSvgItem::setSharedRenderer(new QSvgRenderer (fileName, this));
- }
+ void setFileName(const QString & fileName);
void setSection(Qt::WindowFrameSection section) {mButtonAlignmentSection = section;}
Qt::WindowFrameSection getSection() const {return mButtonAlignmentSection;}
@@ -84,6 +70,31 @@ class DelegateButton: public QGraphicsSvgItem
};
+class UBGraphicsToolBarItem : public QGraphicsRectItem, public QObject
+{
+ public:
+ UBGraphicsToolBarItem(QGraphicsItem * parent = 0);
+ virtual ~UBGraphicsToolBarItem() {};
+
+ bool isVisibleOnBoard() const { return mVisible; }
+ void setVisibleOnBoard(bool visible) { mVisible = visible; }
+ bool isShifting() const { return mShifting; }
+ void setShifting(bool shifting) { mShifting = shifting; }
+ int offsetOnToolBar() const { return mOffsetOnToolBar; }
+ void setOffsetOnToolBar(int pOffset) { mOffsetOnToolBar = pOffset; }
+ QList itemsOnToolBar() const { return mItemsOnToolBar; }
+ void setItemsOnToolBar(QList itemsOnToolBar) { mItemsOnToolBar = itemsOnToolBar;}
+ int minWidth() { return mMinWidth; }
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
+ QWidget *widget);
+
+ private:
+ bool mShifting;
+ bool mVisible;
+ int mOffsetOnToolBar;
+ int mMinWidth;
+ QList mItemsOnToolBar;
+};
class UBGraphicsItemDelegate : public QObject
{
@@ -138,6 +149,10 @@ class UBGraphicsItemDelegate : public QObject
void setButtonsVisible(bool visible);
+ UBGraphicsToolBarItem* getToolBarItem() const { return mToolBarItem; }
+
+ qreal antiScaleRatio() const { return mAntiScaleRatio; }
+
signals:
void showOnDisplayChanged(bool shown);
void lockChanged(bool locked);
@@ -183,12 +198,17 @@ class UBGraphicsItemDelegate : public QObject
QList mButtons;
+ UBGraphicsToolBarItem* mToolBarItem;
+
protected slots:
virtual void gotoContentSource(bool checked);
private:
void updateFrame();
void updateButtons(bool showUpdated = false);
+ void updateToolBar();
+
+
QPointF mOffset;
QTransform mPreviousTransform;
diff --git a/src/domain/UBGraphicsItemUndoCommand.cpp b/src/domain/UBGraphicsItemUndoCommand.cpp
index d027c1f0..bc8c4c82 100644
--- a/src/domain/UBGraphicsItemUndoCommand.cpp
+++ b/src/domain/UBGraphicsItemUndoCommand.cpp
@@ -19,12 +19,12 @@
#include "UBGraphicsScene.h"
-#include "core/memcheck.h"
-
#include "core/UBApplication.h"
#include "board/UBBoardController.h"
+#include "core/memcheck.h"
+
UBGraphicsItemUndoCommand::UBGraphicsItemUndoCommand(UBGraphicsScene* pScene, const QSet& pRemovedItems,
const QSet& pAddedItems)
: mScene(pScene)
diff --git a/src/domain/UBGraphicsMediaItem.cpp b/src/domain/UBGraphicsMediaItem.cpp
index 9342cb66..dd19e275 100644
--- a/src/domain/UBGraphicsMediaItem.cpp
+++ b/src/domain/UBGraphicsMediaItem.cpp
@@ -23,10 +23,10 @@
#include "board/UBBoardController.h"
-#include "core/memcheck.h"
-
#include "frameworks/UBFileSystemUtils.h"
+#include "core/memcheck.h"
+
bool UBGraphicsMediaItem::sIsMutedByDefault = false;
UBGraphicsMediaItem::UBGraphicsMediaItem(const QUrl& pMediaFileUrl, QGraphicsItem *parent)
diff --git a/src/domain/UBGraphicsStrokesGroup.cpp b/src/domain/UBGraphicsStrokesGroup.cpp
index ac7aadf0..a7f658dd 100644
--- a/src/domain/UBGraphicsStrokesGroup.cpp
+++ b/src/domain/UBGraphicsStrokesGroup.cpp
@@ -1,5 +1,7 @@
#include "UBGraphicsStrokesGroup.h"
+#include "core/memcheck.h"
+
UBGraphicsStrokesGroup::UBGraphicsStrokesGroup(QGraphicsItem *parent):QGraphicsItemGroup(parent)
{
mDelegate = new UBGraphicsItemDelegate(this, 0, true, true);
diff --git a/src/domain/UBGraphicsTextItemDelegate.cpp b/src/domain/UBGraphicsTextItemDelegate.cpp
index c567ef43..2a911fbf 100644
--- a/src/domain/UBGraphicsTextItemDelegate.cpp
+++ b/src/domain/UBGraphicsTextItemDelegate.cpp
@@ -24,9 +24,10 @@
#include "domain/UBGraphicsDelegateFrame.h"
#include "core/UBSettings.h"
-#include "core/memcheck.h"
#include "board/UBBoardController.h"
+#include "core/memcheck.h"
+
const int UBGraphicsTextItemDelegate::sMinPixelSize = 8;
const int UBGraphicsTextItemDelegate::sMinPointSize = 8;
@@ -94,17 +95,21 @@ void UBGraphicsTextItemDelegate::buildButtons()
{
UBGraphicsItemDelegate::buildButtons();
- mFontButton = new DelegateButton(":/images/font.svg", mDelegated, mFrame, Qt::TopLeftSection);
- mColorButton = new DelegateButton(":/images/color.svg", mDelegated, mFrame, Qt::TopLeftSection);
- mDecreaseSizeButton = new DelegateButton(":/images/minus.svg", mDelegated, mFrame, Qt::TopLeftSection);
- mIncreaseSizeButton = new DelegateButton(":/images/plus.svg", mDelegated, mFrame, Qt::TopLeftSection);
+ mFontButton = new DelegateButton(":/images/font.svg", mDelegated, mToolBarItem, Qt::TitleBarArea);
+ mColorButton = new DelegateButton(":/images/color.svg", mDelegated, mToolBarItem, Qt::TitleBarArea);
+ mDecreaseSizeButton = new DelegateButton(":/images/minus.svg", mDelegated, mToolBarItem, Qt::TitleBarArea);
+ mIncreaseSizeButton = new DelegateButton(":/images/plus.svg", mDelegated, mToolBarItem, Qt::TitleBarArea);
connect(mFontButton, SIGNAL(clicked(bool)), this, SLOT(pickFont()));
connect(mColorButton, SIGNAL(clicked(bool)), this, SLOT(pickColor()));
connect(mDecreaseSizeButton, SIGNAL(clicked(bool)), this, SLOT(decreaseSize()));
connect(mIncreaseSizeButton, SIGNAL(clicked(bool)), this, SLOT(increaseSize()));
- mButtons << mFontButton << mColorButton << mDecreaseSizeButton << mIncreaseSizeButton;
+ QList itemsOnToolBar;
+ itemsOnToolBar << mFontButton << mColorButton << mDecreaseSizeButton << mIncreaseSizeButton;
+ mToolBarItem->setItemsOnToolBar(itemsOnToolBar);
+
+ mToolBarItem->setVisibleOnBoard(true);
}
void UBGraphicsTextItemDelegate::contentsChanged()
diff --git a/src/domain/UBGraphicsVideoItemDelegate.cpp b/src/domain/UBGraphicsVideoItemDelegate.cpp
index 35620cf0..e02640c5 100644
--- a/src/domain/UBGraphicsVideoItemDelegate.cpp
+++ b/src/domain/UBGraphicsVideoItemDelegate.cpp
@@ -1,336 +1,351 @@
-/*
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-#include
-#include
-
-#include "UBGraphicsVideoItemDelegate.h"
-
-#include "UBGraphicsScene.h"
-
-#include "core/UBSettings.h"
-#include "core/UBApplication.h"
-#include "core/UBApplicationController.h"
-#include "core/UBDisplayManager.h"
-
-#include "domain/UBGraphicsVideoItem.h"
-#include "domain/UBGraphicsDelegateFrame.h"
-
-#include "core/memcheck.h"
-
-UBGraphicsVideoItemDelegate::UBGraphicsVideoItemDelegate(UBGraphicsVideoItem* pDelegated, Phonon::MediaObject* pMedia, QObject * parent)
- : UBGraphicsItemDelegate(pDelegated, parent, true, false)
- , mMedia(pMedia)
-{
- // NOOP
-}
-
-void UBGraphicsVideoItemDelegate::buildButtons()
-{
- mPlayPauseButton = new DelegateButton(":/images/play.svg", mDelegated, mFrame);
-
- mStopButton = new DelegateButton(":/images/stop.svg", mDelegated, mFrame);
- mStopButton->hide();
-
- if (delegated()->isMuted())
- mMuteButton = new DelegateButton(":/images/soundOff.svg", mDelegated, mFrame);
- else
- mMuteButton = new DelegateButton(":/images/soundOn.svg", mDelegated, mFrame);
-
- mMuteButton->hide();
-
- mVideoControl = new DelegateVideoControl(delegated(), mFrame);
- UBGraphicsItem::assignZValue(mVideoControl, delegated()->zValue());
- mVideoControl->setFlag(QGraphicsItem::ItemIsSelectable, true);
-
- connect(mPlayPauseButton, SIGNAL(clicked(bool)), this, SLOT(togglePlayPause()));
- connect(mStopButton, SIGNAL(clicked(bool)), mMedia, SLOT(stop()));
- connect(mMuteButton, SIGNAL(clicked(bool)), delegated(), SLOT(toggleMute()));
- connect(mMuteButton, SIGNAL(clicked(bool)), this, SLOT(toggleMute()));
-
- mButtons << mPlayPauseButton << mStopButton << mMuteButton;
-
- mMedia->setTickInterval(50);
-
- connect(mMedia, SIGNAL(stateChanged (Phonon::State, Phonon::State)), this, SLOT(mediaStateChanged (Phonon::State, Phonon::State)));
- connect(mMedia, SIGNAL(finished()), this, SLOT(updatePlayPauseState()));
- connect(mMedia, SIGNAL(tick(qint64)), this, SLOT(updateTicker(qint64)));
- connect(mMedia, SIGNAL(totalTimeChanged(qint64)), this, SLOT(totalTimeChanged(qint64)));
-
-}
-
-
-UBGraphicsVideoItemDelegate::~UBGraphicsVideoItemDelegate()
-{
- //NOOP
-}
-
-
-void UBGraphicsVideoItemDelegate::positionHandles()
-{
- UBGraphicsItemDelegate::positionHandles();
-
- if (mDelegated->isSelected())
- {
- qreal scaledFrameWidth = mFrameWidth * mAntiScaleRatio;
-
-
- qreal width = mFrame->rect().width();
- qreal height = mFrame->rect().height();
-
- qreal x = mFrame->rect().left();
- qreal y = mFrame->rect().top();
-
- mVideoControl->setRect(x + 2 * scaledFrameWidth
- , y + height - 3 * scaledFrameWidth
- , width - 4 * scaledFrameWidth
- , 2 * scaledFrameWidth);
-
- if (!mVideoControl->scene())
- {
- mVideoControl->setParentItem(mFrame);//update parent for the case the item has been previously removed from scene
- mDelegated->scene()->addItem(mVideoControl);
- }
-
- mVideoControl->setAntiScale(mAntiScaleRatio);
- mVideoControl->setZValue(delegated()->zValue());
- mVideoControl->show();
- }
- else
- {
- mVideoControl->hide();
- }
-}
-
-
-void UBGraphicsVideoItemDelegate::remove(bool canUndo)
-{
- if (delegated() && delegated()->mediaObject())
- delegated()->mediaObject()->stop();
-
- QGraphicsScene* scene = mDelegated->scene();
-
- scene->removeItem(mVideoControl);
-
- UBGraphicsItemDelegate::remove(canUndo);
-}
-
-
-void UBGraphicsVideoItemDelegate::toggleMute()
-{
- if (delegated()->isMuted())
- mMuteButton->setFileName(":/images/soundOff.svg");
- else
- mMuteButton->setFileName(":/images/soundOn.svg");
-
-}
-
-
-UBGraphicsVideoItem* UBGraphicsVideoItemDelegate::delegated()
-{
- return static_cast(mDelegated);
-}
-
-
-void UBGraphicsVideoItemDelegate::togglePlayPause()
-{
- if (delegated() && delegated()->mediaObject()) {
-
- Phonon::MediaObject* media = delegated()->mediaObject();
- if (media->state() == Phonon::StoppedState) {
- media->play();
- } else if (media->state() == Phonon::PlayingState) {
- if (media->remainingTime() <= 0) {
- media->stop();
- media->play();
- } else {
- media->pause();
- if(delegated()->scene())
- delegated()->scene()->setModified(true);
- }
- } else if (media->state() == Phonon::PausedState) {
- if (media->remainingTime() <= 0) {
- media->stop();
- }
- media->play();
- } else if ( media->state() == Phonon::LoadingState ) {
- delegated()->mediaObject()->setCurrentSource(delegated()->mediaFileUrl());
- media->play();
- } else if (media->state() == Phonon::ErrorState){
- qDebug() << "Error appeared." << media->errorString();
- }
- }
-}
-
-void UBGraphicsVideoItemDelegate::mediaStateChanged ( Phonon::State newstate, Phonon::State oldstate )
-{
- Q_UNUSED(newstate);
- Q_UNUSED(oldstate);
- updatePlayPauseState();
-}
-
-
-void UBGraphicsVideoItemDelegate::updatePlayPauseState()
-{
- Phonon::MediaObject* media = delegated()->mediaObject();
-
- if (media->state() == Phonon::PlayingState)
- mPlayPauseButton->setFileName(":/images/pause.svg");
- else
- mPlayPauseButton->setFileName(":/images/play.svg");
-}
-
-
-void UBGraphicsVideoItemDelegate::updateTicker(qint64 time)
-{
- Phonon::MediaObject* media = delegated()->mediaObject();
- mVideoControl->totalTimeChanged(media->totalTime());
-
- mVideoControl->updateTicker(time);
-}
-
-
-void UBGraphicsVideoItemDelegate::totalTimeChanged(qint64 newTotalTime)
-{
- mVideoControl->totalTimeChanged(newTotalTime);
-}
-
-
-DelegateVideoControl::DelegateVideoControl(UBGraphicsVideoItem* pDelegated, QGraphicsItem * parent)
- : QGraphicsRectItem(parent)
- , mDelegate(pDelegated)
- , mDisplayCurrentTime(false)
- , mAntiScale(1.0)
- , mCurrentTimeInMs(0)
- , mTotalTimeInMs(0)
-{
- setAcceptedMouseButtons(Qt::LeftButton);
-
- setBrush(QBrush(UBSettings::paletteColor));
- setPen(Qt::NoPen);
- setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control));
-}
-
-
-void DelegateVideoControl::paint(QPainter *painter,
- const QStyleOptionGraphicsItem *option, QWidget *widget)
-{
- Q_UNUSED(option);
- Q_UNUSED(widget);
-
- painter->fillPath(shape(), brush());
-
- qreal frameWidth = rect().height() / 2;
- int position = frameWidth;
-
- if (mTotalTimeInMs > 0)
- {
- position = frameWidth + (rect().width() - (2 * frameWidth)) / mTotalTimeInMs * mCurrentTimeInMs;
- }
-
- int radius = rect().height() / 6;
- QRectF r(rect().x() + position - radius, rect().y() + (rect().height() / 4) - radius, radius * 2, radius * 2);
-
- painter->setBrush(UBSettings::documentViewLightColor);
- painter->drawEllipse(r);
-
- if(mDisplayCurrentTime)
- {
- painter->setBrush(UBSettings::paletteColor);
- painter->setPen(QPen(Qt::NoPen));
- QRectF balloon(rect().x() + position - frameWidth, rect().y() - (frameWidth * 1.2), 2 * frameWidth, frameWidth);
- painter->drawRoundedRect(balloon, frameWidth/2, frameWidth/2);
-
- QTime t;
- t = t.addMSecs(mCurrentTimeInMs < 0 ? 0 : mCurrentTimeInMs);
- QFont f = painter->font();
- f.setPointSizeF(f.pointSizeF() * mAntiScale);
- painter->setFont(f);
- painter->setPen(Qt::white);
- painter->drawText(balloon, Qt::AlignCenter, t.toString("m:ss"));
- }
-}
-
-
-QPainterPath DelegateVideoControl::shape() const
-{
- QPainterPath path;
- QRectF r = rect().adjusted(0,0,0,- rect().height() / 2);
- path.addRoundedRect(r, rect().height() / 4, rect().height() / 4);
- return path;
-}
-
-
-void DelegateVideoControl::updateTicker(qint64 time )
-{
- mCurrentTimeInMs = time;
- update();
-}
-
-
-void DelegateVideoControl::totalTimeChanged(qint64 newTotalTime)
-{
- mTotalTimeInMs = newTotalTime;
- update();
-}
-
-
-void DelegateVideoControl::mousePressEvent(QGraphicsSceneMouseEvent *event)
-{
- mDisplayCurrentTime = true;
- seekToMousePos(event->pos());
- update();
- event->accept();
-}
-
-
-void DelegateVideoControl::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
-{
- seekToMousePos(event->pos());
- update();
- event->accept();
-}
-
-
-void DelegateVideoControl::seekToMousePos(QPointF mousePos)
-{
- qreal minX, length;
- qreal frameWidth = rect().height() / 2;
-
- minX = rect().x() + frameWidth;
- length = rect().width() - (2 * frameWidth);
-
- qreal mouseX = mousePos.x();
-
- if (mTotalTimeInMs > 0 && length > 0 && mDelegate
- && mDelegate->mediaObject() && mDelegate->mediaObject()->isSeekable())
- {
- qint64 tickPos = mTotalTimeInMs / length * (mouseX - minX);
- mDelegate->mediaObject()->seek(tickPos);
-
- //OSX is a bit lazy
- updateTicker(tickPos);
- }
-}
-
-void DelegateVideoControl::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
-{
- mDisplayCurrentTime = false;
- update();
- event->accept();
-}
-
-
-
+/*
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#include
+#include
+
+#include "UBGraphicsVideoItemDelegate.h"
+
+#include "UBGraphicsScene.h"
+
+#include "core/UBSettings.h"
+#include "core/UBApplication.h"
+#include "core/UBApplicationController.h"
+#include "core/UBDisplayManager.h"
+
+#include "domain/UBGraphicsVideoItem.h"
+#include "domain/UBGraphicsDelegateFrame.h"
+
+#include "core/memcheck.h"
+
+UBGraphicsVideoItemDelegate::UBGraphicsVideoItemDelegate(UBGraphicsVideoItem* pDelegated, Phonon::MediaObject* pMedia, QObject * parent)
+ : UBGraphicsItemDelegate(pDelegated, parent, true, false)
+ , mMedia(pMedia)
+{
+ // NOOP
+}
+
+void UBGraphicsVideoItemDelegate::buildButtons()
+{
+ mPlayPauseButton = new DelegateButton(":/images/play.svg", mDelegated, mToolBarItem, Qt::TitleBarArea);
+
+ mStopButton = new DelegateButton(":/images/stop.svg", mDelegated, mToolBarItem, Qt::TitleBarArea);
+
+ mVideoControl = new DelegateVideoControl(delegated(), mToolBarItem);
+ UBGraphicsItem::assignZValue(mVideoControl, delegated()->zValue());
+ mVideoControl->setFlag(QGraphicsItem::ItemIsSelectable, true);
+
+ if (delegated()->isMuted())
+ mMuteButton = new DelegateButton(":/images/soundOff.svg", mDelegated, mToolBarItem, Qt::TitleBarArea);
+ else
+ mMuteButton = new DelegateButton(":/images/soundOn.svg", mDelegated, mToolBarItem, Qt::TitleBarArea);
+
+ connect(mPlayPauseButton, SIGNAL(clicked(bool)), this, SLOT(togglePlayPause()));
+ connect(mStopButton, SIGNAL(clicked(bool)), mMedia, SLOT(stop()));
+ connect(mMuteButton, SIGNAL(clicked(bool)), delegated(), SLOT(toggleMute()));
+ connect(mMuteButton, SIGNAL(clicked(bool)), this, SLOT(toggleMute()));
+
+ mButtons << mPlayPauseButton << mStopButton << mMuteButton;
+
+ QList itemsOnToolBar;
+ itemsOnToolBar << mPlayPauseButton << mStopButton << mVideoControl << mMuteButton;
+ mToolBarItem->setItemsOnToolBar(itemsOnToolBar);
+
+ mMedia->setTickInterval(50);
+
+ connect(mMedia, SIGNAL(stateChanged (Phonon::State, Phonon::State)), this, SLOT(mediaStateChanged (Phonon::State, Phonon::State)));
+ connect(mMedia, SIGNAL(finished()), this, SLOT(updatePlayPauseState()));
+ connect(mMedia, SIGNAL(tick(qint64)), this, SLOT(updateTicker(qint64)));
+ connect(mMedia, SIGNAL(totalTimeChanged(qint64)), this, SLOT(totalTimeChanged(qint64)));
+
+ mToolBarItem->setVisibleOnBoard(true);
+ mToolBarItem->setShifting(false);
+}
+
+
+UBGraphicsVideoItemDelegate::~UBGraphicsVideoItemDelegate()
+{
+ //NOOP
+}
+
+
+void UBGraphicsVideoItemDelegate::positionHandles()
+{
+ UBGraphicsItemDelegate::positionHandles();
+
+ if (mDelegated->isSelected())
+ {
+ qreal scaledFrameWidth = mFrameWidth * mAntiScaleRatio;
+
+ int offset = 0;
+ foreach (DelegateButton* button, mButtons)
+ {
+ if (button->getSection() == Qt::TitleBarArea)
+ offset += button->boundingRect().width() * mAntiScaleRatio;
+ }
+
+ mVideoControl->setRect(mVideoControl->rect().x()
+ , scaledFrameWidth/6 - 0.5
+ , (mToolBarItem->rect().width() - 35 - offset) / mAntiScaleRatio
+ , (2 * scaledFrameWidth) / mAntiScaleRatio);
+
+ offset += (mVideoControl->rect().width() + 5) * mAntiScaleRatio;
+ mMuteButton->setPos(offset, 0);
+
+ if (!mVideoControl->scene())
+ {
+ mVideoControl->setParentItem(mToolBarItem);//update parent for the case the item has been previously removed from scene
+ mDelegated->scene()->addItem(mVideoControl);
+ }
+
+ mVideoControl->setAntiScale(mAntiScaleRatio);
+ mVideoControl->setZValue(delegated()->zValue());
+ mVideoControl->show();
+ }
+ else
+ {
+ mVideoControl->hide();
+ }
+}
+
+
+void UBGraphicsVideoItemDelegate::remove(bool canUndo)
+{
+ if (delegated() && delegated()->mediaObject())
+ delegated()->mediaObject()->stop();
+
+ QGraphicsScene* scene = mDelegated->scene();
+
+ scene->removeItem(mVideoControl);
+
+ UBGraphicsItemDelegate::remove(canUndo);
+}
+
+
+void UBGraphicsVideoItemDelegate::toggleMute()
+{
+ if (delegated()->isMuted())
+ mMuteButton->setFileName(":/images/soundOff.svg");
+ else
+ mMuteButton->setFileName(":/images/soundOn.svg");
+
+}
+
+
+UBGraphicsVideoItem* UBGraphicsVideoItemDelegate::delegated()
+{
+ return static_cast(mDelegated);
+}
+
+
+void UBGraphicsVideoItemDelegate::togglePlayPause()
+{
+ if (delegated() && delegated()->mediaObject()) {
+
+ Phonon::MediaObject* media = delegated()->mediaObject();
+ if (media->state() == Phonon::StoppedState) {
+ media->play();
+ } else if (media->state() == Phonon::PlayingState) {
+ if (media->remainingTime() <= 0) {
+ media->stop();
+ media->play();
+ } else {
+ media->pause();
+ if(delegated()->scene())
+ delegated()->scene()->setModified(true);
+ }
+ } else if (media->state() == Phonon::PausedState) {
+ if (media->remainingTime() <= 0) {
+ media->stop();
+ }
+ media->play();
+ } else if ( media->state() == Phonon::LoadingState ) {
+ delegated()->mediaObject()->setCurrentSource(delegated()->mediaFileUrl());
+ media->play();
+ } else if (media->state() == Phonon::ErrorState){
+ qDebug() << "Error appeared." << media->errorString();
+ }
+ }
+}
+
+void UBGraphicsVideoItemDelegate::mediaStateChanged ( Phonon::State newstate, Phonon::State oldstate )
+{
+ Q_UNUSED(newstate);
+ Q_UNUSED(oldstate);
+ updatePlayPauseState();
+}
+
+
+void UBGraphicsVideoItemDelegate::updatePlayPauseState()
+{
+ Phonon::MediaObject* media = delegated()->mediaObject();
+
+ if (media->state() == Phonon::PlayingState)
+ mPlayPauseButton->setFileName(":/images/pause.svg");
+ else
+ mPlayPauseButton->setFileName(":/images/play.svg");
+}
+
+
+void UBGraphicsVideoItemDelegate::updateTicker(qint64 time)
+{
+ Phonon::MediaObject* media = delegated()->mediaObject();
+ mVideoControl->totalTimeChanged(media->totalTime());
+
+ mVideoControl->updateTicker(time);
+}
+
+
+void UBGraphicsVideoItemDelegate::totalTimeChanged(qint64 newTotalTime)
+{
+ mVideoControl->totalTimeChanged(newTotalTime);
+}
+
+
+DelegateVideoControl::DelegateVideoControl(UBGraphicsVideoItem* pDelegated, QGraphicsItem * parent)
+ : QGraphicsRectItem(parent)
+ , mDelegate(pDelegated)
+ , mDisplayCurrentTime(false)
+ , mAntiScale(1.0)
+ , mCurrentTimeInMs(0)
+ , mTotalTimeInMs(0)
+ , mStartWidth(200)
+{
+ setAcceptedMouseButtons(Qt::LeftButton);
+
+ setBrush(QBrush(Qt::white));
+ setPen(Qt::NoPen);
+ setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Control));
+
+ QRectF rect = this->rect();
+ rect.setWidth(mStartWidth);
+ this->setRect(rect);
+}
+
+
+void DelegateVideoControl::paint(QPainter *painter,
+ const QStyleOptionGraphicsItem *option, QWidget *widget)
+{
+ Q_UNUSED(option);
+ Q_UNUSED(widget);
+
+ painter->fillPath(shape(), brush());
+
+ qreal frameWidth = rect().height() / 2;
+ int position = frameWidth;
+
+ if (mTotalTimeInMs > 0)
+ {
+ position = frameWidth + (rect().width() - (2 * frameWidth)) / mTotalTimeInMs * mCurrentTimeInMs;
+ }
+
+ int radius = rect().height() / 6;
+ QRectF r(rect().x() + position - radius, rect().y() + (rect().height() / 4) - radius, radius * 2, radius * 2);
+
+ painter->setBrush(UBSettings::documentViewLightColor);
+ painter->drawEllipse(r);
+
+ if(mDisplayCurrentTime)
+ {
+ painter->setBrush(UBSettings::paletteColor);
+ painter->setPen(QPen(Qt::NoPen));
+ mBalloon.setRect(rect().x() + position - frameWidth, rect().y() - (frameWidth * 1.2), 2 * frameWidth, frameWidth);
+ painter->drawRoundedRect(mBalloon, frameWidth/2, frameWidth/2);
+
+ QTime t;
+ t = t.addMSecs(mCurrentTimeInMs < 0 ? 0 : mCurrentTimeInMs);
+ QFont f = painter->font();
+ f.setPointSizeF(f.pointSizeF() * mAntiScale);
+ painter->setFont(f);
+ painter->setPen(Qt::white);
+ painter->drawText(mBalloon, Qt::AlignCenter, t.toString("m:ss"));
+ }
+}
+
+
+QPainterPath DelegateVideoControl::shape() const
+{
+ QPainterPath path;
+ QRectF r = rect().adjusted(0,0,0,- rect().height() / 2);
+ path.addRoundedRect(r, rect().height() / 4, rect().height() / 4);
+ return path;
+}
+
+
+void DelegateVideoControl::updateTicker(qint64 time )
+{
+ mCurrentTimeInMs = time;
+ update();
+}
+
+
+void DelegateVideoControl::totalTimeChanged(qint64 newTotalTime)
+{
+ mTotalTimeInMs = newTotalTime;
+ update();
+}
+
+
+void DelegateVideoControl::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ mDisplayCurrentTime = true;
+ seekToMousePos(event->pos());
+ update();
+ event->accept();
+}
+
+
+void DelegateVideoControl::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+ if (shape().contains(event->pos() - QPointF(mBalloon.width()/2,0))
+ && shape().contains(event->pos() + QPointF(mBalloon.width()/2,0)))
+ {
+ seekToMousePos(event->pos());
+ update();
+ event->accept();
+ }
+}
+
+
+void DelegateVideoControl::seekToMousePos(QPointF mousePos)
+{
+ qreal minX, length;
+ qreal frameWidth = rect().height() / 2;
+
+ minX = rect().x() + frameWidth;
+ length = rect().width() - (2 * frameWidth);
+
+ qreal mouseX = mousePos.x();
+
+ if (mTotalTimeInMs > 0 && length > 0 && mDelegate
+ && mDelegate->mediaObject() && mDelegate->mediaObject()->isSeekable())
+ {
+ qint64 tickPos = mTotalTimeInMs / length * (mouseX - minX);
+ mDelegate->mediaObject()->seek(tickPos);
+
+ //OSX is a bit lazy
+ updateTicker(tickPos);
+ }
+}
+
+void DelegateVideoControl::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+ mDisplayCurrentTime = false;
+ update();
+ event->accept();
+}
+
+
+
diff --git a/src/domain/UBGraphicsVideoItemDelegate.h b/src/domain/UBGraphicsVideoItemDelegate.h
index 8fd36bcc..66dcd8a8 100644
--- a/src/domain/UBGraphicsVideoItemDelegate.h
+++ b/src/domain/UBGraphicsVideoItemDelegate.h
@@ -1,114 +1,116 @@
-/*
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-#ifndef UBGRAPHICSVIDEOITEMDELEGATE_H_
-#define UBGRAPHICSVIDEOITEMDELEGATE_H_
-
-#include
-#include
-
-#include "core/UB.h"
-#include "UBGraphicsItemDelegate.h"
-
-class QGraphicsSceneMouseEvent;
-class QGraphicsItem;
-class UBGraphicsVideoItem;
-
-class DelegateVideoControl: public QGraphicsRectItem
-{
- public:
-
- DelegateVideoControl(UBGraphicsVideoItem* pDelegated, QGraphicsItem * parent = 0);
-
- virtual ~DelegateVideoControl()
- {
- // NOOP
- }
-
- void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
- QWidget *widget);
-
- QPainterPath shape() const;
-
- void setAntiScale(qreal antiScale){ mAntiScale = antiScale; }
-
- virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
- virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
- virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
-
- void updateTicker(qint64 time);
- void totalTimeChanged( qint64 newTotalTime);
-
- protected:
-
-
- void seekToMousePos(QPointF mousePos);
-
- UBGraphicsVideoItem* mDelegate;
- bool mDisplayCurrentTime;
-
- qreal mAntiScale;
- qint64 mCurrentTimeInMs;
- qint64 mTotalTimeInMs;
-
-};
-
-
-class UBGraphicsVideoItemDelegate : public UBGraphicsItemDelegate
-{
- Q_OBJECT
-
- public:
- UBGraphicsVideoItemDelegate(UBGraphicsVideoItem* pDelegated, Phonon::MediaObject* pMedia, QObject * parent = 0);
- virtual ~UBGraphicsVideoItemDelegate();
-
- virtual void positionHandles();
-
- public slots:
-
- void toggleMute();
- void updateTicker(qint64 time);
-
- protected slots:
-
- virtual void remove(bool canUndo = true);
-
- void togglePlayPause();
-
- void mediaStateChanged ( Phonon::State newstate, Phonon::State oldstate );
-
- void updatePlayPauseState();
-
- void totalTimeChanged( qint64 newTotalTime);
-
- protected:
-
- virtual void buildButtons();
-
- private:
-
- UBGraphicsVideoItem* delegated();
-
- DelegateButton* mPlayPauseButton;
- DelegateButton* mStopButton;
- DelegateButton* mMuteButton;
- DelegateVideoControl *mVideoControl;
-
- Phonon::MediaObject* mMedia;
-
-};
-
-
-#endif /* UBGRAPHICSVIDEOITEMDELEGATE_H_ */
+/*
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+#ifndef UBGRAPHICSVIDEOITEMDELEGATE_H_
+#define UBGRAPHICSVIDEOITEMDELEGATE_H_
+
+#include
+#include
+
+#include "core/UB.h"
+#include "UBGraphicsItemDelegate.h"
+
+class QGraphicsSceneMouseEvent;
+class QGraphicsItem;
+class UBGraphicsVideoItem;
+
+class DelegateVideoControl: public QGraphicsRectItem
+{
+ public:
+
+ DelegateVideoControl(UBGraphicsVideoItem* pDelegated, QGraphicsItem * parent = 0);
+
+ virtual ~DelegateVideoControl()
+ {
+ // NOOP
+ }
+
+ void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
+ QWidget *widget);
+
+ QPainterPath shape() const;
+
+ void setAntiScale(qreal antiScale){ mAntiScale = antiScale; }
+
+ virtual void mousePressEvent(QGraphicsSceneMouseEvent *event);
+ virtual void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+ virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+
+ void updateTicker(qint64 time);
+ void totalTimeChanged( qint64 newTotalTime);
+
+ protected:
+
+
+ void seekToMousePos(QPointF mousePos);
+
+ UBGraphicsVideoItem* mDelegate;
+ bool mDisplayCurrentTime;
+
+ qreal mAntiScale;
+ qint64 mCurrentTimeInMs;
+ qint64 mTotalTimeInMs;
+
+ private:
+ int mStartWidth;
+ QRectF mBalloon;
+};
+
+
+class UBGraphicsVideoItemDelegate : public UBGraphicsItemDelegate
+{
+ Q_OBJECT
+
+ public:
+ UBGraphicsVideoItemDelegate(UBGraphicsVideoItem* pDelegated, Phonon::MediaObject* pMedia, QObject * parent = 0);
+ virtual ~UBGraphicsVideoItemDelegate();
+
+ virtual void positionHandles();
+
+ public slots:
+
+ void toggleMute();
+ void updateTicker(qint64 time);
+
+ protected slots:
+
+ virtual void remove(bool canUndo = true);
+
+ void togglePlayPause();
+
+ void mediaStateChanged ( Phonon::State newstate, Phonon::State oldstate );
+
+ void updatePlayPauseState();
+
+ void totalTimeChanged( qint64 newTotalTime);
+
+ protected:
+
+ virtual void buildButtons();
+
+ private:
+
+ UBGraphicsVideoItem* delegated();
+
+ DelegateButton* mPlayPauseButton;
+ DelegateButton* mStopButton;
+ DelegateButton* mMuteButton;
+ DelegateVideoControl *mVideoControl;
+
+ Phonon::MediaObject* mMedia;
+};
+
+
+#endif /* UBGRAPHICSVIDEOITEMDELEGATE_H_ */
diff --git a/src/domain/ubgraphicsgroupcontaineritem.cpp b/src/domain/ubgraphicsgroupcontaineritem.cpp
index 9f71cd94..e7a9eb93 100644
--- a/src/domain/ubgraphicsgroupcontaineritem.cpp
+++ b/src/domain/ubgraphicsgroupcontaineritem.cpp
@@ -6,6 +6,8 @@
#include "domain/ubgraphicsgroupcontaineritemdelegate.h"
#include "domain/UBGraphicsScene.h"
+#include "core/memcheck.h"
+
UBGraphicsGroupContainerItem::UBGraphicsGroupContainerItem(QGraphicsItem *parent)
: QGraphicsItemGroup(parent)
{
diff --git a/src/domain/ubgraphicsgroupcontaineritemdelegate.cpp b/src/domain/ubgraphicsgroupcontaineritemdelegate.cpp
index 43286df6..3fcf7b3f 100644
--- a/src/domain/ubgraphicsgroupcontaineritemdelegate.cpp
+++ b/src/domain/ubgraphicsgroupcontaineritemdelegate.cpp
@@ -8,9 +8,10 @@
#include "domain/UBGraphicsDelegateFrame.h"
#include "domain/ubgraphicsgroupcontaineritem.h"
-#include "core/memcheck.h"
#include "board/UBBoardController.h"
+#include "core/memcheck.h"
+
UBGraphicsGroupContainerItemDelegate::UBGraphicsGroupContainerItemDelegate(QGraphicsItem *pDelegated, QObject *parent) :
UBGraphicsItemDelegate(pDelegated, parent), mDestroyGroupButton(0)
diff --git a/src/frameworks/UBCoreGraphicsScene.cpp b/src/frameworks/UBCoreGraphicsScene.cpp
index 68ffed2d..9eb68db7 100644
--- a/src/frameworks/UBCoreGraphicsScene.cpp
+++ b/src/frameworks/UBCoreGraphicsScene.cpp
@@ -15,12 +15,13 @@
#include "UBCoreGraphicsScene.h"
-#include "core/memcheck.h"
#include "domain/UBGraphicsAudioItem.h"
#include "domain/UBGraphicsVideoItem.h"
#include "domain/UBGraphicsMediaItem.h"
#include "domain/UBGraphicsWidgetItem.h"
+#include "core/memcheck.h"
+
UBCoreGraphicsScene::UBCoreGraphicsScene(QObject * parent)
: QGraphicsScene ( parent )
{
diff --git a/src/gui/UBDockDownloadWidget.cpp b/src/gui/UBDockDownloadWidget.cpp
index 4ce9d07e..a09ab966 100644
--- a/src/gui/UBDockDownloadWidget.cpp
+++ b/src/gui/UBDockDownloadWidget.cpp
@@ -17,6 +17,8 @@
#include "globals/UBGlobals.h"
+#include "core/memcheck.h"
+
UBDockDownloadWidget::UBDockDownloadWidget(QWidget *parent, const char *name):UBDockPaletteWidget(parent, name)
, mpLayout(NULL)
, mpDLWidget(NULL)
diff --git a/src/gui/UBDockTeacherGuideWidget.cpp b/src/gui/UBDockTeacherGuideWidget.cpp
index f8ad4f43..0c4d5c4a 100644
--- a/src/gui/UBDockTeacherGuideWidget.cpp
+++ b/src/gui/UBDockTeacherGuideWidget.cpp
@@ -19,6 +19,8 @@
#include "UBDockTeacherGuideWidget.h"
#include "UBTeacherGuideWidget.h"
+#include "core/memcheck.h"
+
UBDockTeacherGuideWidget::UBDockTeacherGuideWidget(QWidget* parent, const char* name):
UBDockPaletteWidget(parent,name)
diff --git a/src/gui/UBFeaturesActionBar.cpp b/src/gui/UBFeaturesActionBar.cpp
index e9a560e1..ac009c48 100644
--- a/src/gui/UBFeaturesActionBar.cpp
+++ b/src/gui/UBFeaturesActionBar.cpp
@@ -1,4 +1,5 @@
#include "UBFeaturesActionBar.h"
+#include "core/memcheck.h"
UBFeaturesActionBar::UBFeaturesActionBar( UBFeaturesController *controller, QWidget* parent, const char* name ) : QWidget (parent)
, featuresController(controller)
@@ -143,6 +144,16 @@ void UBFeaturesActionBar::setButtons()
mpRemoveFavoriteBtn->show();
mpNewFolderBtn->hide();
break;
+ case IN_TRASH:
+ mpFavoriteBtn->hide();
+ mpSocialBtn->hide();
+ mSearchBar->show();
+ //mpSearchBtn->show();
+ //mpDeleteBtn->hide();
+ mpCloseBtn->hide();
+ //mpRemoveFavoriteBtn->show();
+ mpNewFolderBtn->hide();
+ break;
default:
break;
}
@@ -169,7 +180,9 @@ void UBFeaturesActionBar::dragMoveEvent(QDragMoveEvent *event)
void UBFeaturesActionBar::dragEnterEvent( QDragEnterEvent *event )
{
if (event->mimeData()->hasFormat("text/uri-list"))
+ {
event->acceptProposedAction();
+ }
}
void UBFeaturesActionBar::dropEvent( QDropEvent *event )
@@ -177,6 +190,12 @@ void UBFeaturesActionBar::dropEvent( QDropEvent *event )
QWidget *dest = childAt( event->pos() );
if ( dest == mpDeleteBtn )
{
+ QList urls = event->mimeData()->urls();
+ foreach ( QUrl url, urls )
+ {
+ if ( !UBFeaturesController::isDeletable( url ) )
+ return;
+ }
event->setDropAction( Qt::MoveAction );
event->accept();
emit deleteElements( *event->mimeData() );
diff --git a/src/gui/UBFeaturesActionBar.h b/src/gui/UBFeaturesActionBar.h
index 653fbbac..a45371d8 100644
--- a/src/gui/UBFeaturesActionBar.h
+++ b/src/gui/UBFeaturesActionBar.h
@@ -12,7 +12,8 @@ enum UBFeaturesActionBarState
IN_ROOT,
IN_FOLDER,
IN_PROPERTIES,
- IN_FAVORITE
+ IN_FAVORITE,
+ IN_TRASH
};
class UBFeaturesActionBar : public QWidget
diff --git a/src/gui/UBFeaturesWidget.cpp b/src/gui/UBFeaturesWidget.cpp
index e7f1520a..c5d5cd76 100644
--- a/src/gui/UBFeaturesWidget.cpp
+++ b/src/gui/UBFeaturesWidget.cpp
@@ -1,3 +1,5 @@
+#include
+
#include "UBFeaturesWidget.h"
#include "domain/UBAbstractWidget.h"
#include "gui/UBThumbnailWidget.h"
@@ -6,6 +8,7 @@
#include "core/UBApplication.h"
#include "core/UBDownloadManager.h"
#include "globals/UBGlobals.h"
+#include "board/UBBoardController.h"
UBFeaturesWidget::UBFeaturesWidget(QWidget *parent, const char *name):UBDockPaletteWidget(parent)
{
@@ -56,6 +59,7 @@ UBFeaturesWidget::UBFeaturesWidget(QWidget *parent, const char *name):UBDockPale
featuresListView->setViewMode( QListView::IconMode );
itemDelegate = new UBFeaturesItemDelegate( this, featuresListView );
featuresListView->setItemDelegate( itemDelegate );
+ //featuresListView->setSelectionRectVisible(false);
featuresListView->setIconSize( QSize(defaultThumbnailSize, defaultThumbnailSize) );
featuresListView->setGridSize( QSize(defaultThumbnailSize * 1.75, defaultThumbnailSize * 1.75) );
@@ -71,6 +75,9 @@ UBFeaturesWidget::UBFeaturesWidget(QWidget *parent, const char *name):UBDockPale
pathListView->setSelectionMode( QAbstractItemView::NoSelection );
pathListView->setVerticalScrollBarPolicy( Qt::ScrollBarAlwaysOff );
pathListView->setHorizontalScrollBarPolicy( Qt::ScrollBarAlwaysOn );
+ pathListView->setFlow( QListView::LeftToRight );
+ pathListView->setWrapping(false);
+
//pathListView->setResizeMode( QListView::Adjust );
//pathListView->setMovement( QListView::Static );
pathListView->setDragDropMode( QAbstractItemView::DropOnly );
@@ -78,6 +85,7 @@ UBFeaturesWidget::UBFeaturesWidget(QWidget *parent, const char *name):UBDockPale
pathScene = new QGraphicsScene(this);
//pathViewer = new UBFeaturesPathViewer( QPixmap(":images/libpalette/home.png"), controller->getRootPath(), pathScene, this );
featureProperties = new UBFeatureProperties(this);
+ webView = new UBFeaturesWebView(this);
//layout->addWidget( pathViewer );
//pathViewer->show();
@@ -87,6 +95,7 @@ UBFeaturesWidget::UBFeaturesWidget(QWidget *parent, const char *name):UBDockPale
stackedWidget->addWidget( featuresListView );
stackedWidget->addWidget( featureProperties );
+ stackedWidget->addWidget( webView );
stackedWidget->setCurrentIndex(ID_LISTVIEW);
currentStackedWidget = ID_LISTVIEW;
@@ -107,7 +116,7 @@ UBFeaturesWidget::UBFeaturesWidget(QWidget *parent, const char *name):UBDockPale
this, SLOT(currentSelected(const QModelIndex &)));*/
connect( featuresListView, SIGNAL(clicked ( const QModelIndex & ) ),
this, SLOT( currentSelected(const QModelIndex &) ) );
- connect( mActionBar, SIGNAL( searchElement(const QString &) ), this, SLOT( const searchStarted(QString &) ) );
+ connect( mActionBar, SIGNAL( searchElement(const QString &) ), this, SLOT( searchStarted(const QString &) ) );
connect( mActionBar, SIGNAL( newFolderToCreate() ), this, SLOT( createNewFolder() ) );
connect( mActionBar, SIGNAL( deleteElements(const QMimeData &) ), this, SLOT( deleteElements(const QMimeData &) ) );
connect( mActionBar, SIGNAL( addToFavorite(const QMimeData &) ), this, SLOT( addToFavorite(const QMimeData &) ) );
@@ -115,6 +124,10 @@ UBFeaturesWidget::UBFeaturesWidget(QWidget *parent, const char *name):UBDockPale
connect( pathListView, SIGNAL(clicked( const QModelIndex & ) ),
this, SLOT( currentPathChanged( const QModelIndex & ) ) );
connect( thumbSlider, SIGNAL( sliderMoved(int) ), this, SLOT(thumbnailSizeChanged( int ) ) );
+ connect( UBApplication::boardController, SIGNAL( displayMetadata( QMap ) ),
+ this, SLOT( onDisplayMetadata( QMap ) ) );
+ connect( UBDownloadManager::downloadManager(), SIGNAL( addDownloadedFileToLibrary( bool, QUrl, QString, QByteArray ) ),
+ this, SLOT( onAddDownloadedFileToLibrary( bool, QUrl, QString,QByteArray ) ) );
}
bool UBFeaturesWidget::eventFilter( QObject *target, QEvent *event )
@@ -156,7 +169,7 @@ void UBFeaturesWidget::currentSelected(const QModelIndex ¤t)
if ( feature.isFolder() )
{
- QString newPath = feature.getUrl() + "/" + feature.getName();
+ QString newPath = feature.getFullVirtualPath();
//pathViewer->addPathElement( feature.getThumbnail(), newPath );
controller->setCurrentElement( feature );
@@ -170,11 +183,20 @@ void UBFeaturesWidget::currentSelected(const QModelIndex ¤t)
{
mActionBar->setCurrentState( IN_FAVORITE );
}
+ else if (feature.getType() == FEATURE_TRASH)
+ {
+ mActionBar->setCurrentState( IN_TRASH );
+ }
else
{
mActionBar->setCurrentState( IN_FOLDER );
}
}
+ else if ( feature.getType() == FEATURE_SEARCH )
+ {
+ webView->showElement( feature );
+ switchToWebView();
+ }
else
{
featureProperties->showElement( feature );
@@ -190,7 +212,7 @@ void UBFeaturesWidget::currentPathChanged(const QModelIndex &index)
if ( index.isValid() )
{
UBFeature feature = featuresPathModel->data(index, Qt::UserRole + 1).value();
- QString newPath = feature.getUrl() + "/" + feature.getName();
+ QString newPath = feature.getFullVirtualPath();
featuresPathModel->setPath( newPath );
featuresPathModel->invalidate();
@@ -208,6 +230,10 @@ void UBFeaturesWidget::currentPathChanged(const QModelIndex &index)
{
mActionBar->setCurrentState( IN_FAVORITE );
}
+ else if (feature.getType() == FEATURE_TRASH)
+ {
+ mActionBar->setCurrentState( IN_TRASH );
+ }
else
{
mActionBar->setCurrentState( IN_FOLDER );
@@ -224,7 +250,6 @@ void UBFeaturesWidget::createNewFolder()
featuresModel->addItem( newFolder );
featuresProxyModel->invalidate();
}
-
}
void UBFeaturesWidget::deleteElements( const QMimeData & mimeData )
@@ -260,7 +285,7 @@ void UBFeaturesWidget::addToFavorite( const QMimeData & mimeData )
foreach ( QUrl url, urls )
{
UBFeature elem = controller->addToFavorite( url );
- if ( !elem.getUrl().isEmpty() && !elem.getUrl().isNull() )
+ if ( !elem.getVirtualPath().isEmpty() && !elem.getVirtualPath().isNull() )
featuresModel->addItem( elem );
}
QSortFilterProxyModel *model = dynamic_cast( featuresListView->model() );
@@ -284,6 +309,30 @@ void UBFeaturesWidget::thumbnailSizeChanged( int value )
featuresListView->setGridSize( QSize( value * 1.75, value * 1.75 ) );
}
+void UBFeaturesWidget::onDisplayMetadata( QMap metadata )
+{
+ UBFeature feature( QString(), QPixmap(":images/libpalette/notFound.png"), QString(), metadata["Url"], FEATURE_ITEM );
+ feature.setMetadata( metadata );
+
+ featureProperties->showElement( feature );
+ switchToProperties();
+ mActionBar->setCurrentState( IN_PROPERTIES );
+}
+
+void UBFeaturesWidget::onAddDownloadedFileToLibrary(bool pSuccess, QUrl sourceUrl, QString pContentHeader, QByteArray pData)
+{
+ if ( pSuccess )
+ {
+ UBFeature newFeature = controller->addDownloadedFile( sourceUrl, pData );
+ if ( newFeature != UBFeature() )
+ {
+ featuresModel->addItem( newFeature );
+ QSortFilterProxyModel *model = dynamic_cast( featuresListView->model() );
+ model->invalidate();
+ }
+ }
+}
+
void UBFeaturesWidget::switchToListView()
{
stackedWidget->setCurrentIndex(ID_LISTVIEW);
@@ -296,6 +345,11 @@ void UBFeaturesWidget::switchToProperties()
currentStackedWidget = ID_PROPERTIES;
}
+void UBFeaturesWidget::switchToWebView()
+{
+ stackedWidget->setCurrentIndex(ID_WEBVIEW);
+ currentStackedWidget = ID_WEBVIEW;
+}
/*
@@ -315,11 +369,39 @@ UBFeaturesWidget::~UBFeaturesWidget()
{
}
-UBFeaturesListView::UBFeaturesListView( QWidget* parent, const char* name ) : QListView(parent)
+UBFeaturesListView::UBFeaturesListView( QWidget* parent, const char* name )
+: QListView(parent)
{
setObjectName(name);
+ //rubberBand = new UBRubberBand( QRubberBand::Rectangle, this );
+}
+
+/*
+void UBFeaturesListView::mousePressEvent( QMouseEvent *event )
+{
+ rubberOrigin = event->pos();
+ rubberBand->setGeometry( QRect( rubberOrigin, QSize() ) );
+ //qDebug() << rubberOrigin.x() << rubberOrigin.y();
+ rubberBand->show();
+ QListView::mousePressEvent(event);
+}
+
+void UBFeaturesListView::mouseMoveEvent( QMouseEvent *event )
+{
+ QPoint current = event->pos();
+ rubberBand->setGeometry( QRect( rubberOrigin, current ).normalized() );
+
+ //setSelection( rubberBand->rect(), QItemSelectionModel::Select );
+ QListView::mouseMoveEvent(event);
+}
+
+void UBFeaturesListView::mouseReleaseEvent( QMouseEvent *event )
+{
+ rubberBand->hide();
+ QListView::mouseReleaseEvent(event);
}
+*/
void UBFeaturesListView::dragEnterEvent( QDragEnterEvent *event )
{
if ( event->mimeData()->hasUrls() )
@@ -336,6 +418,96 @@ void UBFeaturesListView::dropEvent( QDropEvent *event )
}
+UBFeaturesWebView::UBFeaturesWebView(QWidget* parent, const char* name):QWidget(parent)
+ , mpView(NULL)
+ , mpWebSettings(NULL)
+ , mpLayout(NULL)
+ , mpSankoreAPI(NULL)
+{
+ setObjectName(name);
+
+ SET_STYLE_SHEET();
+
+ mpLayout = new QVBoxLayout();
+ setLayout(mpLayout);
+
+ mpView = new QWebView(this);
+ mpView->setObjectName("SearchEngineView");
+ mpSankoreAPI = new UBWidgetUniboardAPI(UBApplication::boardController->activeScene());
+ mpView->page()->mainFrame()->addToJavaScriptWindowObject("sankore", mpSankoreAPI);
+
+ mpWebSettings = QWebSettings::globalSettings();
+ mpWebSettings->setAttribute(QWebSettings::JavaEnabled, true);
+ mpWebSettings->setAttribute(QWebSettings::PluginsEnabled, true);
+ mpWebSettings->setAttribute(QWebSettings::LocalStorageDatabaseEnabled, true);
+ mpWebSettings->setAttribute(QWebSettings::OfflineWebApplicationCacheEnabled, true);
+ mpWebSettings->setAttribute(QWebSettings::OfflineStorageDatabaseEnabled, true);
+ mpWebSettings->setAttribute(QWebSettings::JavascriptCanAccessClipboard, true);
+ mpWebSettings->setAttribute(QWebSettings::DnsPrefetchEnabled, true);
+
+ mpLayout->addWidget(mpView);
+
+ connect(mpView, SIGNAL(loadFinished(bool)), this, SLOT(onLoadFinished(bool)));
+}
+
+UBFeaturesWebView::~UBFeaturesWebView()
+{
+ if(NULL != mpSankoreAPI){
+ delete mpSankoreAPI;
+ mpSankoreAPI = NULL;
+ }
+ if(NULL != mpView){
+ delete mpView;
+ mpView = NULL;
+ }
+ if(NULL != mpLayout){
+ delete mpLayout;
+ mpLayout = NULL;
+ }
+}
+
+void UBFeaturesWebView::showElement(const UBFeature &elem)
+{
+ QString qsWidgetName;
+ QString path = elem.getFullPath().toLocalFile();
+
+ QString qsConfigPath = QString("%0/config.xml").arg(path);
+
+ if(QFile::exists(qsConfigPath))
+ {
+ QFile f(qsConfigPath);
+ if(f.open(QIODevice::ReadOnly))
+ {
+ QDomDocument domDoc;
+ domDoc.setContent(QString(f.readAll()));
+ QDomElement root = domDoc.documentElement();
+
+ QDomNode node = root.firstChild();
+ while(!node.isNull())
+ {
+ if(node.toElement().tagName() == "content")
+ {
+ QDomAttr srcAttr = node.toElement().attributeNode("src");
+ qsWidgetName = srcAttr.value();
+ break;
+ }
+ node = node.nextSibling();
+ }
+ f.close();
+ }
+ }
+
+ mpView->load(QUrl::fromLocalFile(QString("%0/%1").arg(path).arg(qsWidgetName)));
+}
+
+void UBFeaturesWebView::onLoadFinished(bool ok)
+{
+ if(ok && NULL != mpSankoreAPI){
+ mpView->page()->mainFrame()->addToJavaScriptWindowObject("sankore", mpSankoreAPI);
+ }
+}
+
+
UBFeatureProperties::UBFeatureProperties( QWidget *parent, const char *name ) : QWidget(parent)
, mpLayout(NULL)
, mpButtonLayout(NULL)
@@ -346,6 +518,7 @@ UBFeatureProperties::UBFeatureProperties( QWidget *parent, const char *name ) :
, mpThumbnail(NULL)
, mpOrigPixmap(NULL)
, mpElement(NULL)
+ , mpObjInfos(NULL)
{
setObjectName(name);
@@ -385,12 +558,49 @@ UBFeatureProperties::UBFeatureProperties( QWidget *parent, const char *name ) :
mpButtonLayout->addStretch(1);
- mpObjInfoLabel = new QLabel(tr("Object informations"));
+ mpObjInfoLabel = new QLabel(tr("Object informations"));
mpObjInfoLabel->setStyleSheet(QString("color: #888888; font-size : 18px; font-weight:bold;"));
mpLayout->addWidget(mpObjInfoLabel, 0);
- connect(mpAddPageButton, SIGNAL(clicked()), this, SLOT(onAddToPage()));
+ mpObjInfos = new QTreeWidget(this);
+ mpObjInfos->setColumnCount(2);
+ mpObjInfos->header()->hide();
+ mpObjInfos->setAlternatingRowColors(true);
+ mpObjInfos->setRootIsDecorated(false);
+ mpObjInfos->setObjectName("DockPaletteWidgetBox");
+ mpObjInfos->setStyleSheet("background:white;");
+ mpLayout->addWidget(mpObjInfos, 1);
+ connect( mpAddPageButton, SIGNAL(clicked()), this, SLOT(onAddToPage()) );
+ connect( mpSetAsBackgroundButton, SIGNAL( clicked() ), this, SLOT( onSetAsBackground() ) );
+ connect( mpAddToLibButton, SIGNAL( clicked() ), this, SLOT(onAddToLib() ) );
+}
+
+void UBFeatureProperties::resizeEvent( QResizeEvent *event )
+{
+ Q_UNUSED(event);
+ adaptSize();
+}
+
+void UBFeatureProperties::showEvent (QShowEvent *event )
+{
+ Q_UNUSED(event);
+ adaptSize();
+}
+
+void UBFeatureProperties::adaptSize()
+{
+ if( NULL != mpOrigPixmap )
+ {
+ if( width() < THUMBNAIL_WIDTH + 40 )
+ {
+ mpThumbnail->setPixmap( mpOrigPixmap->scaledToWidth( width() - 40 ) );
+ }
+ else
+ {
+ mpThumbnail->setPixmap( mpOrigPixmap->scaledToWidth( THUMBNAIL_WIDTH ) );
+ }
+ }
}
void UBFeatureProperties::showElement( const UBFeature &elem )
@@ -408,59 +618,95 @@ void UBFeatureProperties::showElement( const UBFeature &elem )
mpElement = new UBFeature( elem );
mpOrigPixmap = new QPixmap( elem.getThumbnail() );
mpThumbnail->setPixmap(elem.getThumbnail().scaledToWidth(THUMBNAIL_WIDTH));
- //populateMetadata();
+ populateMetadata();
- if ( UBApplication::isFromWeb( elem.getUrl() ) )
+ if ( UBApplication::isFromWeb( elem.getFullPath().toString() ) )
{
mpAddToLibButton->show();
- /*if(elem->metadatas()["Type"].toLower().contains("image"))
+ if( elem.getMetadata()["Type"].toLower().contains("image") )
{
mpSetAsBackgroundButton->show();
}
else
{
mpSetAsBackgroundButton->hide();
- }*/
+ }
}
else
{
mpAddToLibButton->hide();
- if (UBFileSystemUtils::mimeTypeFromFileName( elem.getUrl() ).contains("image"))
+ if (UBFileSystemUtils::mimeTypeFromFileName( elem.getFullPath().toLocalFile() ).contains("image"))
{
mpSetAsBackgroundButton->show();
}
- else
+ else
{
mpSetAsBackgroundButton->hide();
}
}
}
+void UBFeatureProperties::populateMetadata()
+{
+ if(NULL != mpObjInfos){
+ mpObjInfos->clear();
+ QMap metas = mpElement->getMetadata();
+ QList lKeys = metas.keys();
+ QList lValues = metas.values();
+
+ for(int i=0; i< metas.size(); i++){
+ QStringList values;
+ values << lKeys.at(i);
+ values << lValues.at(i);
+ mpItem = new QTreeWidgetItem(values);
+ mpObjInfos->addTopLevelItem(mpItem);
+ }
+ mpObjInfos->resizeColumnToContents(0);
+ }
+}
+
void UBFeatureProperties::onAddToPage()
{
QWidget *w = parentWidget()->parentWidget();
UBFeaturesWidget* featuresWidget = dynamic_cast( w );
featuresWidget->getFeaturesController()->addItemToPage( *mpElement );
- /*if ( UBApplication::isFromWeb( mpElement->getUrl() ) )
- {
+}
+
+void UBFeatureProperties::onAddToLib()
+{
+ if ( UBApplication::isFromWeb( mpElement->getFullPath().toString() ) )
+ {
sDownloadFileDesc desc;
desc.isBackground = false;
- desc.modal = true;
- desc.name = QFileInfo( mpElement->getName() ).fileName();
- desc.url = mpElement->getUrl();
+ desc.modal = false;
+ desc.name = QFileInfo( mpElement->getFullPath().toString()).fileName();
+ qDebug() << desc.name;
+ desc.url = mpElement->getFullPath().toString();
+ qDebug() << desc.url;
UBDownloadManager::downloadManager()->addFileToDownload(desc);
-
}
- else
- {
- QWidget *w = parentWidget()->parentWidget();
- UBFeaturesWidget* featuresWidget = dynamic_cast( w );
- featuresWidget->getFeaturesController()->addItemToPage( *mpElement );
- }*/
+}
+
+
+void UBFeatureProperties::onSetAsBackground()
+{
+ QWidget *w = parentWidget()->parentWidget();
+ UBFeaturesWidget* featuresWidget = dynamic_cast( w );
+ featuresWidget->getFeaturesController()->addItemAsBackground( *mpElement );
}
UBFeatureProperties::~UBFeatureProperties()
{
+ if ( mpOrigPixmap )
+ {
+ delete mpOrigPixmap;
+ mpOrigPixmap = NULL;
+ }
+ if ( mpElement )
+ {
+ delete mpElement;
+ mpElement = NULL;
+ }
}
UBFeatureItemButton::UBFeatureItemButton(QWidget *parent, const char *name):QPushButton(parent)
@@ -487,7 +733,7 @@ QVariant UBFeaturesModel::data(const QModelIndex &index, int role) const
}
else if (role == Qt::UserRole)
{
- return featuresList->at(index.row()).getUrl();
+ return featuresList->at(index.row()).getVirtualPath();
}
else if (role == Qt::UserRole + 1)
{
@@ -509,14 +755,15 @@ QMimeData* UBFeaturesModel::mimeData(const QModelIndexList &indexes) const
if ( index.isValid() )
{
UBFeature element = data( index, Qt::UserRole + 1 ).value();
- if ( element.getType() == FEATURE_INTERNAL )
+ urlList.push_back( element.getFullPath() );
+ /*if ( element.getType() == FEATURE_INTERNAL )
{
urlList.push_back( QUrl( element.getFullPath() ) );
}
else if ( element.getType() == FEATURE_INTERACTIVE || element.getType() == FEATURE_ITEM )
{
- urlList.push_back( QUrl::fromLocalFile(element.getFullPath()) );
- }
+ urlList.push_back( element.getFullPath() );
+ }*/
}
}
mimeData->setUrls( urlList );
@@ -537,19 +784,15 @@ bool UBFeaturesModel::dropMimeData(const QMimeData *mimeData, Qt::DropAction act
int endRow = 0;
+ UBFeature parentFeature;
if ( !parent.isValid() )
{
- return false;
- /*if (row < 0)
- endRow = featuresList->size();
- else
- endRow = qMin( row, featuresList->size() );*/
+ parentFeature = dynamic_cast(QObject::parent())->getFeaturesController()->getCurrentElement();
}
else
- endRow = parent.row();
- Q_UNUSED(endRow) //why do we need this variable?
-
- UBFeature parentFeature = parent.data( Qt::UserRole + 1).value();
+ {
+ parentFeature = parent.data( Qt::UserRole + 1).value();
+ }
QList urls = mimeData->urls();
@@ -581,8 +824,8 @@ void UBFeaturesModel::deleteFavoriteItem( const QString &path )
{
for ( int i = 0; i < featuresList->size(); ++i )
{
- if ( !QString::compare( featuresList->at(i).getFullPath(), path, Qt::CaseInsensitive ) &&
- !QString::compare( featuresList->at(i).getUrl(), "/root/favorites", Qt::CaseInsensitive ) )
+ if ( !QString::compare( featuresList->at(i).getUrl(), path, Qt::CaseInsensitive ) &&
+ !QString::compare( featuresList->at(i).getVirtualPath(), "/root/favorites", Qt::CaseInsensitive ) )
{
removeRow( i, QModelIndex() );
return;
@@ -626,9 +869,9 @@ Qt::ItemFlags UBFeaturesModel::flags( const QModelIndex &index ) const
item.getType() == FEATURE_ITEM ||
item.getType() == FEATURE_INTERNAL )
return Qt::ItemIsDragEnabled | defaultFlags;
- if ( item.isFolder() && !item.getFullPath().isNull() )
+ if ( item.isFolder() && !item.getVirtualPath().isNull() )
return defaultFlags | Qt::ItemIsDropEnabled;
- else return defaultFlags;
+ else return defaultFlags | Qt::ItemIsDropEnabled;
}
/*if ( index.isValid() )
{
@@ -647,7 +890,7 @@ Qt::ItemFlags UBFeaturesModel::flags( const QModelIndex &index ) const
default:;
}
}*/
- return defaultFlags;
+ return defaultFlags | Qt::ItemIsDropEnabled;
}
@@ -696,9 +939,8 @@ bool UBFeaturesPathProxyModel::filterAcceptsRow( int sourceRow, const QModelInde
eUBLibElementType type = (eUBLibElementType)sourceModel()->data(index, Qt::UserRole + 1).toInt();*/
UBFeature feature = sourceModel()->data(index, Qt::UserRole + 1).value();
- QString virtualFullPath = feature.getUrl() + "/" + feature.getName();
- return feature.isFolder() && path.startsWith( virtualFullPath );
+ return feature.isFolder() && path.startsWith( feature.getFullVirtualPath() );
}
QString UBFeaturesItemDelegate::displayText ( const QVariant & value, const QLocale & locale ) const
@@ -710,13 +952,7 @@ QString UBFeaturesItemDelegate::displayText ( const QVariant & value, const QLoc
{
const QFontMetrics fm = listView->fontMetrics();
const QSize iSize = listView->iconSize();
-
- if ( iSize.width() > 0 && fm.width(text) > iSize.width() )
- {
- while (fm.width(text) > iSize.width())
- text.resize(text.size()-1);
- text += "...";
- }
+ return elidedText( fm, iSize.width(), Qt::ElideRight, text );
}
return text;
}
diff --git a/src/gui/UBFeaturesWidget.h b/src/gui/UBFeaturesWidget.h
index ea718f22..d9e77a4d 100644
--- a/src/gui/UBFeaturesWidget.h
+++ b/src/gui/UBFeaturesWidget.h
@@ -18,12 +18,15 @@
#include "UBDockPaletteWidget.h"
//#include "UBLibActionBar.h"
#include "board/UBFeaturesController.h"
+#include "api/UBWidgetUniboardAPI.h"
#include "UBFeaturesActionBar.h"
+#include "UBRubberBand.h"
#define THUMBNAIL_WIDTH 400
#define ID_LISTVIEW 0
#define ID_PROPERTIES 1
+#define ID_WEBVIEW 2
class UBListModel;
@@ -37,6 +40,7 @@ class UBFeaturesPathViewer;
class UBFeatureProperties;
class UBFeatureItemButton;
class UBFeaturesListView;
+class UBFeaturesWebView;
class UBFeaturesWidget : public UBDockPaletteWidget
{
@@ -58,6 +62,7 @@ public:
private:
void switchToListView();
void switchToProperties();
+ void switchToWebView();
UBFeaturesController *controller;
@@ -78,7 +83,9 @@ private:
QGraphicsScene *pathScene;
UBFeaturesActionBar *mActionBar;
UBFeatureProperties *featureProperties;
+ UBFeaturesWebView *webView;
QStackedWidget *stackedWidget;
+
int currentStackedWidget;
QModelIndex trashIndex;
@@ -92,6 +99,8 @@ private slots:
void addToFavorite( const QMimeData & );
void removeFromFavorite( const QMimeData & );
void thumbnailSizeChanged( int );
+ void onDisplayMetadata( QMap );
+ void onAddDownloadedFileToLibrary(bool, QUrl, QString, QByteArray);
protected:
bool eventFilter(QObject *target, QEvent *event);
};
@@ -105,8 +114,32 @@ public:
protected:
virtual void dragEnterEvent( QDragEnterEvent *event );
virtual void dropEvent( QDropEvent *event );
+ /*virtual void mousePressEvent( QMouseEvent *event );
+ virtual void mouseMoveEvent( QMouseEvent *event );
+ virtual void mouseReleaseEvent( QMouseEvent *event );*/
+private:
+ //UBRubberBand *rubberBand;
+ //QPoint rubberOrigin;
};
+class UBFeaturesWebView : public QWidget
+{
+ Q_OBJECT
+public:
+ UBFeaturesWebView(QWidget* parent = 0, const char* name = "UBFeaturesWebView");
+ ~UBFeaturesWebView();
+
+ void showElement(const UBFeature &elem);
+
+private slots:
+ void onLoadFinished(bool ok);
+
+private:
+ QWebView* mpView;
+ QWebSettings* mpWebSettings;
+ QVBoxLayout* mpLayout;
+ UBWidgetUniboardAPI* mpSankoreAPI;
+};
class UBFeatureProperties : public QWidget
{
@@ -119,28 +152,31 @@ public:
protected:
- //void resizeEvent(QResizeEvent *event);
- //void showEvent(QShowEvent *event);
+ void resizeEvent(QResizeEvent *event);
+ void showEvent(QShowEvent *event);
private slots:
void onAddToPage();
- //void onAddToLib();
- //void onSetAsBackground();
+ void onAddToLib();
+ void onSetAsBackground();
//void onBack();
private:
+ void populateMetadata();
+ void adaptSize();
+
QVBoxLayout* mpLayout;
QHBoxLayout* mpButtonLayout;
UBFeatureItemButton* mpAddPageButton;
UBFeatureItemButton* mpAddToLibButton;
UBFeatureItemButton* mpSetAsBackgroundButton;
QLabel* mpObjInfoLabel;
- //QTreeWidget* mpObjInfos;
+ QTreeWidget* mpObjInfos;
QLabel* mpThumbnail;
QPixmap* mpOrigPixmap;
int maxThumbHeight;
UBFeature *mpElement;
- //QTreeWidgetItem* mpItem;
+ QTreeWidgetItem* mpItem;
};
@@ -174,7 +210,7 @@ public:
Qt::DropActions supportedDropActions() const { return Qt::MoveAction | Qt::CopyAction; }
- void setFeaturesList( QList *flist ) { featuresList = flist; }
+ void setFeaturesList(QList *flist ) { featuresList = flist; }
private:
QList *featuresList;
};
diff --git a/src/gui/UBLibItemProperties.cpp b/src/gui/UBLibItemProperties.cpp
index 4d2eada3..86c9233d 100644
--- a/src/gui/UBLibItemProperties.cpp
+++ b/src/gui/UBLibItemProperties.cpp
@@ -18,12 +18,13 @@
#include "core/UBApplication.h"
#include "core/UBDownloadManager.h"
-#include "core/memcheck.h"
#include "frameworks/UBFileSystemUtils.h"
#include "globals/UBGlobals.h"
+#include "core/memcheck.h"
+
/**
* \brief Constructor
diff --git a/src/gui/UBLibNavigatorWidget.cpp b/src/gui/UBLibNavigatorWidget.cpp
index 5974c4ea..d7b50551 100644
--- a/src/gui/UBLibNavigatorWidget.cpp
+++ b/src/gui/UBLibNavigatorWidget.cpp
@@ -16,10 +16,11 @@
#include "UBLibWidget.h"
#include "core/UBApplication.h"
-#include "core/memcheck.h"
#include "globals/UBGlobals.h"
+#include "core/memcheck.h"
+
static int lowBoundForSlider = 40;
static int topBoundForSlider = 120;
static int tickIntervalForSlider = 10;
diff --git a/src/gui/UBLibPathViewer.cpp b/src/gui/UBLibPathViewer.cpp
index fe31b290..9ca91d82 100644
--- a/src/gui/UBLibPathViewer.cpp
+++ b/src/gui/UBLibPathViewer.cpp
@@ -20,10 +20,11 @@
#include "core/UBApplication.h"
#include "board/UBBoardController.h"
-#include "core/memcheck.h"
#include "core/UBDownloadManager.h"
#include "board/UBBoardPaletteManager.h"
+#include "core/memcheck.h"
+
/**
* \brief Constructor
* @param parent as the parent widget
diff --git a/src/gui/UBLibWebView.cpp b/src/gui/UBLibWebView.cpp
index ac6e11a5..a70cbcdc 100644
--- a/src/gui/UBLibWebView.cpp
+++ b/src/gui/UBLibWebView.cpp
@@ -1,7 +1,6 @@
#include
#include "core/UBApplication.h"
-#include "core/memcheck.h"
#include "board/UBBoardController.h"
@@ -9,7 +8,7 @@
#include "UBLibWebView.h"
-
+#include "core/memcheck.h"
UBLibWebView::UBLibWebView(QWidget* parent, const char* name):QWidget(parent)
, mpView(NULL)
diff --git a/src/gui/UBLibWidget.cpp b/src/gui/UBLibWidget.cpp
index 9765bae4..5fbfad49 100644
--- a/src/gui/UBLibWidget.cpp
+++ b/src/gui/UBLibWidget.cpp
@@ -17,10 +17,11 @@
#include "UBLibWidget.h"
#include "core/UBApplication.h"
-#include "core/memcheck.h"
#include "globals/UBGlobals.h"
+#include "core/memcheck.h"
+
/**
* \brief Constructor
* @param parent as the parent widget
diff --git a/src/gui/UBPageNavigationWidget.cpp b/src/gui/UBPageNavigationWidget.cpp
index 6ff72dd8..4d751ccd 100644
--- a/src/gui/UBPageNavigationWidget.cpp
+++ b/src/gui/UBPageNavigationWidget.cpp
@@ -14,12 +14,13 @@
*/
#include "UBPageNavigationWidget.h"
#include "core/UBApplication.h"
-#include "core/memcheck.h"
#include "board/UBBoardController.h"
#include "globals/UBGlobals.h"
+#include "core/memcheck.h"
+
/**
* \brief Constructor
* @param parent as the parent widget
diff --git a/src/gui/UBTGWidgetTreeDelegate.cpp b/src/gui/UBTGWidgetTreeDelegate.cpp
index 928beac9..1b3754f6 100644
--- a/src/gui/UBTGWidgetTreeDelegate.cpp
+++ b/src/gui/UBTGWidgetTreeDelegate.cpp
@@ -7,6 +7,8 @@
#include
#include "UBTGWidgetTreeDelegate.h"
+#include "core/memcheck.h"
+
UBTGWidgetTreeDelegate::UBTGWidgetTreeDelegate(QObject *parent) :
QStyledItemDelegate(parent)
{
diff --git a/src/gui/UBTeacherGuideDelegate.cpp b/src/gui/UBTeacherGuideDelegate.cpp
index 33dba6fe..fd98606a 100644
--- a/src/gui/UBTeacherGuideDelegate.cpp
+++ b/src/gui/UBTeacherGuideDelegate.cpp
@@ -1,4 +1,5 @@
#include "UBTeacherGuideDelegate.h"
+#include "core/memcheck.h"
UBTeacherGuideDelegate::UBTeacherGuideDelegate()
{
diff --git a/src/gui/UBTeacherGuideWidget.cpp b/src/gui/UBTeacherGuideWidget.cpp
index 9fc0fdcd..1d571274 100644
--- a/src/gui/UBTeacherGuideWidget.cpp
+++ b/src/gui/UBTeacherGuideWidget.cpp
@@ -40,6 +40,8 @@
#include "document/UBDocumentProxy.h"
#include "document/UBDocumentController.h"
+#include "core/memcheck.h"
+
#define UBTG_SEPARATOR_FIXED_HEIGHT 3
diff --git a/src/gui/UBTeacherGuideWidgetsTools.cpp b/src/gui/UBTeacherGuideWidgetsTools.cpp
index 73b89276..adf91d11 100644
--- a/src/gui/UBTeacherGuideWidgetsTools.cpp
+++ b/src/gui/UBTeacherGuideWidgetsTools.cpp
@@ -32,6 +32,8 @@
#include "frameworks/UBFileSystemUtils.h"
+#include "core/memcheck.h"
+
/***************************************************************************
* class UBAddItem *
diff --git a/src/pdf-merger/CCITTFaxDecode.cpp b/src/pdf-merger/CCITTFaxDecode.cpp
index 1b9310c9..5c1ab0af 100644
--- a/src/pdf-merger/CCITTFaxDecode.cpp
+++ b/src/pdf-merger/CCITTFaxDecode.cpp
@@ -16,6 +16,8 @@
#include
#include "CCITTFaxDecode.h"
+#include "core/memcheck.h"
+
using namespace merge_lib;
bool CCITTFaxDecode::encode(std::string & decoded)
diff --git a/src/pdf-merger/DCTDecode.cpp b/src/pdf-merger/DCTDecode.cpp
index 603926c5..392c4862 100644
--- a/src/pdf-merger/DCTDecode.cpp
+++ b/src/pdf-merger/DCTDecode.cpp
@@ -16,6 +16,8 @@
#include
#include "DCTDecode.h"
+#include "core/memcheck.h"
+
using namespace merge_lib;
bool DCTDecode::encode(std::string & decoded)
diff --git a/src/pdf-merger/JBIG2Decode.cpp b/src/pdf-merger/JBIG2Decode.cpp
index 6ef248d0..f6e601de 100644
--- a/src/pdf-merger/JBIG2Decode.cpp
+++ b/src/pdf-merger/JBIG2Decode.cpp
@@ -15,6 +15,7 @@
#include
#include "JBIG2Decode.h"
+#include "core/memcheck.h"
using namespace merge_lib;
diff --git a/src/web/UBOEmbedParser.cpp b/src/web/UBOEmbedParser.cpp
index 1cb8e1f8..786d2883 100644
--- a/src/web/UBOEmbedParser.cpp
+++ b/src/web/UBOEmbedParser.cpp
@@ -24,6 +24,8 @@
#include "UBOEmbedParser.h"
+#include "core/memcheck.h"
+
UBOEmbedParser::UBOEmbedParser(QObject *parent, const char* name)
{
Q_UNUSED(parent);