From 1833713dd75571873fe6cf1d4981adb0bdfe78df Mon Sep 17 00:00:00 2001 From: shibakaneki Date: Thu, 13 Oct 2011 11:02:13 +0200 Subject: [PATCH] Implemented move up, move down and delete page in the navigation palette --- src/board/UBBoardController.h | 1 + src/board/UBBoardPaletteManager.cpp | 5 + src/board/UBBoardPaletteManager.h | 4 + src/core/UBApplication.cpp | 8 +- src/core/UBApplicationController.h | 1 - src/document/UBDocumentController.cpp | 111 ++++++++++++------ src/document/UBDocumentController.h | 2 + src/gui/UBDocumentNavigator.cpp | 34 ++++-- src/gui/UBDocumentNavigator.h | 5 +- src/gui/UBThumbnailWidget.cpp | 160 ++++++++++++++++++++++++++ src/gui/UBThumbnailWidget.h | 28 +++++ 11 files changed, 314 insertions(+), 45 deletions(-) diff --git a/src/board/UBBoardController.h b/src/board/UBBoardController.h index 1fdeb6b3..ef2564f6 100644 --- a/src/board/UBBoardController.h +++ b/src/board/UBBoardController.h @@ -262,6 +262,7 @@ class UBBoardController : public QObject void cacheDisabled(); void pageChanged(); void setDocOnPageNavigator(UBDocumentProxy* doc); + void documentReorganized(int index); protected: diff --git a/src/board/UBBoardPaletteManager.cpp b/src/board/UBBoardPaletteManager.cpp index 08d609bf..da17c5ad 100755 --- a/src/board/UBBoardPaletteManager.cpp +++ b/src/board/UBBoardPaletteManager.cpp @@ -717,3 +717,8 @@ UBRightPalette* UBBoardPaletteManager::createDesktopRightPalette(QWidget* parent return mDesktopRightPalette; } + +void UBBoardPaletteManager::connectToDocumentController() +{ + emit connectToDocController(); +} diff --git a/src/board/UBBoardPaletteManager.h b/src/board/UBBoardPaletteManager.h index 4ca00fd7..cf4e34ef 100644 --- a/src/board/UBBoardPaletteManager.h +++ b/src/board/UBBoardPaletteManager.h @@ -49,10 +49,14 @@ class UBBoardPaletteManager : public QObject UBLeftPalette* leftPalette(){return mLeftPalette;} void showVirtualKeyboard(bool show = true); void initPalettesPosAtStartup(); + void connectToDocumentController(); UBKeyboardPalette *mKeyboardPalette; UBRightPalette* createDesktopRightPalette(QWidget* parent); + signals: + void connectToDocController(); + public slots: void activeSceneChanged(); diff --git a/src/core/UBApplication.cpp b/src/core/UBApplication.cpp index c72ccfdd..381e52dc 100644 --- a/src/core/UBApplication.cpp +++ b/src/core/UBApplication.cpp @@ -39,7 +39,7 @@ #include "board/UBBoardController.h" #include "board/UBDrawingController.h" #include "board/UBBoardView.h" - +#include "board/UBBoardPaletteManager.h" #include "web/UBWebController.h" #include "document/UBDocumentController.h" @@ -233,13 +233,15 @@ int UBApplication::exec(const QString& pFileToImport) connect(mainWindow->actionDocument, SIGNAL(triggered()), this, SLOT(showDocument())); connect(mainWindow->actionQuit, SIGNAL(triggered()), this, SLOT(closing())); connect(mainWindow, SIGNAL(closeEvent_Signal(QCloseEvent*)), this, SLOT(closeEvent(QCloseEvent*))); - + boardController = new UBBoardController(mainWindow); boardController->init(); webController = new UBWebController(mainWindow); documentController = new UBDocumentController(mainWindow); + boardController->paletteManager()->connectToDocumentController(); + applicationController = new UBApplicationController(boardController->controlView(), boardController->displayView(), mainWindow, staticMemoryCleaner); connect(mainWindow->actionDesktop, SIGNAL(triggered(bool)), applicationController, SLOT(showDesktop(bool))); @@ -249,6 +251,8 @@ int UBApplication::exec(const QString& pFileToImport) connect(mainWindow->actionHideApplication, SIGNAL(triggered()), this, SLOT(showMinimized())); #endif + connect(documentController, SIGNAL(movedToIndex(int)), boardController, SIGNAL(documentReorganized(int))); + mPreferencesController = new UBPreferencesController(mainWindow); connect(mainWindow->actionPreferences, SIGNAL(triggered()), mPreferencesController, SLOT(show())); diff --git a/src/core/UBApplicationController.h b/src/core/UBApplicationController.h index d0a224df..2bdf6890 100644 --- a/src/core/UBApplicationController.h +++ b/src/core/UBApplicationController.h @@ -102,7 +102,6 @@ class UBApplicationController : public QObject signals: void mainModeChanged(UBApplicationController::MainMode pMode); - void desktopMode(bool displayed); public slots: diff --git a/src/document/UBDocumentController.cpp b/src/document/UBDocumentController.cpp index d56cb51c..b2cd201b 100644 --- a/src/document/UBDocumentController.cpp +++ b/src/document/UBDocumentController.cpp @@ -620,40 +620,42 @@ void UBDocumentController::deleteSelectedItem() { QList selectedItems = mDocumentUI->thumbnailWidget->selectedItems(); - if (selectedItems.count() > 0) - { - QList sceneIndexes; - UBDocumentProxy* proxy = 0; - - foreach (QGraphicsItem* item, selectedItems) - { - UBSceneThumbnailPixmap* thumb = dynamic_cast (item); - - if (thumb) - { - proxy = thumb->proxy(); - if (proxy) - { - sceneIndexes.append(thumb->sceneIndex()); - } - } - } - - if(UBApplication::mainWindow->yesNoQuestion(tr("Remove Page"), tr("Are you sure you want to remove %n page(s) from the selected document '%1'?", "", sceneIndexes.count()).arg(proxy->metaData(UBSettings::documentName).toString()))) - { - UBPersistenceManager::persistenceManager()->deleteDocumentScenes(proxy, sceneIndexes); - proxy->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime())); - UBMetadataDcSubsetAdaptor::persist(proxy); - refreshDocumentThumbnailsView(); - - int minIndex = proxy->pageCount() - 1; - - foreach (int i, sceneIndexes) - minIndex = qMin(i, minIndex); - - mDocumentUI->thumbnailWidget->selectItemAt(minIndex); - } - } + deletePages(selectedItems); + +// if (selectedItems.count() > 0) +// { +// QList sceneIndexes; +// UBDocumentProxy* proxy = 0; + +// foreach (QGraphicsItem* item, selectedItems) +// { +// UBSceneThumbnailPixmap* thumb = dynamic_cast (item); + +// if (thumb) +// { +// proxy = thumb->proxy(); +// if (proxy) +// { +// sceneIndexes.append(thumb->sceneIndex()); +// } +// } +// } + +// if(UBApplication::mainWindow->yesNoQuestion(tr("Remove Page"), tr("Are you sure you want to remove %n page(s) from the selected document '%1'?", "", sceneIndexes.count()).arg(proxy->metaData(UBSettings::documentName).toString()))) +// { +// UBPersistenceManager::persistenceManager()->deleteDocumentScenes(proxy, sceneIndexes); +// proxy->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime())); +// UBMetadataDcSubsetAdaptor::persist(proxy); +// refreshDocumentThumbnailsView(); + +// int minIndex = proxy->pageCount() - 1; + +// foreach (int i, sceneIndexes) +// minIndex = qMin(i, minIndex); + +// mDocumentUI->thumbnailWidget->selectItemAt(minIndex); +// } +// } } else { @@ -1164,7 +1166,11 @@ void UBDocumentController::moveSceneToIndex(UBDocumentProxy* proxy, int source, UBMetadataDcSubsetAdaptor::persist(proxy); refreshDocumentThumbnailsView(); + // NOTE [Didier]: I think that selecting the thumbnail is not the role of the documentController mDocumentUI->thumbnailWidget->selectItemAt(target); + + // Notify the move to anyone interested in knowing it + emit movedToIndex(target); } @@ -1630,3 +1636,40 @@ void UBDocumentController::focusChanged(QWidget *old, QWidget *current) selectionChanged(); } +void UBDocumentController::deletePages(QList itemsToDelete) +{ + if (itemsToDelete.count() > 0) + { + QList sceneIndexes; + UBDocumentProxy* proxy = 0; + + foreach (QGraphicsItem* item, itemsToDelete) + { + UBSceneThumbnailPixmap* thumb = dynamic_cast (item); + + if (thumb) + { + proxy = thumb->proxy(); + if (proxy) + { + sceneIndexes.append(thumb->sceneIndex()); + } + } + } + + if(UBApplication::mainWindow->yesNoQuestion(tr("Remove Page"), tr("Are you sure you want to remove %n page(s) from the selected document '%1'?", "", sceneIndexes.count()).arg(proxy->metaData(UBSettings::documentName).toString()))) + { + UBPersistenceManager::persistenceManager()->deleteDocumentScenes(proxy, sceneIndexes); + proxy->setMetaData(UBSettings::documentUpdatedAt, UBStringUtils::toUtcIsoDateTime(QDateTime::currentDateTime())); + UBMetadataDcSubsetAdaptor::persist(proxy); + refreshDocumentThumbnailsView(); + + int minIndex = proxy->pageCount() - 1; + + foreach (int i, sceneIndexes) + minIndex = qMin(i, minIndex); + + mDocumentUI->thumbnailWidget->selectItemAt(minIndex); + } + } +} diff --git a/src/document/UBDocumentController.h b/src/document/UBDocumentController.h index 473ee42c..4e9b3d31 100644 --- a/src/document/UBDocumentController.h +++ b/src/document/UBDocumentController.h @@ -49,10 +49,12 @@ class UBDocumentController : public QObject UBDocumentProxyTreeItem* findDocument(UBDocumentProxy* proxy); bool addFileToDocument(UBDocumentProxy* document); UBDocumentProxy* getCurrentDocument(); + void deletePages(QList itemsToDelete); signals: void refreshThumbnails(); void exportDone(); + void movedToIndex(int index); public slots: void createNewDocument(); diff --git a/src/gui/UBDocumentNavigator.cpp b/src/gui/UBDocumentNavigator.cpp index afd62d79..74bd3611 100644 --- a/src/gui/UBDocumentNavigator.cpp +++ b/src/gui/UBDocumentNavigator.cpp @@ -28,6 +28,8 @@ #include "adaptors/UBSvgSubsetAdaptor.h" #include "document/UBDocumentController.h" #include "domain/UBGraphicsScene.h" +#include "board/UBBoardPaletteManager.h" +#include "core/UBApplicationController.h" #include "core/memcheck.h" @@ -56,6 +58,7 @@ UBDocumentNavigator::UBDocumentNavigator(QWidget *parent, const char *name):QGra connect(UBApplication::boardController, SIGNAL(activeSceneChanged()), this, SLOT(addNewPage())); connect(UBApplication::boardController, SIGNAL(setDocOnPageNavigator(UBDocumentProxy*)), this, SLOT(generateThumbnails())); connect(mScene, SIGNAL(selectionChanged()), this, SLOT(onSelectionChanged())); + connect(UBApplication::boardController, SIGNAL(documentReorganized(int)), this, SLOT(onMovedToIndex(int))); } /** @@ -107,13 +110,13 @@ void UBDocumentNavigator::generateThumbnails() for(int i = 0; i < thumbs.count(); i++) { QPixmap pix = thumbs.at(i); - QGraphicsPixmapItem* pixmapItem = new UBSceneThumbnailPixmap(pix, mCrntDoc, i); + QGraphicsPixmapItem* pixmapItem = new UBSceneThumbnailNavigPixmap(pix, mCrntDoc, i); // Get the selected item if(UBApplication::boardController->activeSceneIndex() == i) { selection = pixmapItem; - mCrntItem = dynamic_cast(pixmapItem); + mCrntItem = dynamic_cast(pixmapItem); mCrntItem->setSelected(true); } @@ -145,7 +148,7 @@ void UBDocumentNavigator::updateSpecificThumbnail(int iPage) // Load it QList thumbs = UBThumbnailAdaptor::load(mCrntDoc); QPixmap pix = thumbs.at(iPage); - QGraphicsPixmapItem* pixmapItem = new UBSceneThumbnailPixmap(pix, mCrntDoc, iPage); + QGraphicsPixmapItem* pixmapItem = new UBSceneThumbnailNavigPixmap(pix, mCrntDoc, iPage); if(pixmapItem) { // Get the old thumbnail @@ -370,7 +373,7 @@ void UBDocumentNavigator::mousePressEvent(QMouseEvent *event) bNavig = true; // First, select the clicked item - UBSceneThumbnailPixmap* pCrntItem = dynamic_cast(pClickedItem); + UBSceneThumbnailNavigPixmap* pCrntItem = dynamic_cast(pClickedItem); if(NULL == pCrntItem) { @@ -378,7 +381,7 @@ void UBDocumentNavigator::mousePressEvent(QMouseEvent *event) UBThumbnailTextItem* pTextItem = dynamic_cast(pClickedItem); if(NULL != pTextItem) { - pCrntItem = dynamic_cast(mThumbnails.at(mLabels.indexOf(pTextItem))); + pCrntItem = dynamic_cast(mThumbnails.at(mLabels.indexOf(pTextItem))); } } else @@ -387,12 +390,14 @@ void UBDocumentNavigator::mousePressEvent(QMouseEvent *event) { // Unselect the previous item int iOldPage = mThumbnails.indexOf(mCrntItem); - mCrntItem->setSelected(false); updateSpecificThumbnail(iOldPage); mCrntItem = pCrntItem; } - pCrntItem->setSelected(true); + // HACK: for an unknown reason, the mousePressEvent of the item is not + // called when a click occurs on it. So I created this method in + // order to handle the click. + mCrntItem->notifyClick(mapToScene(event->pos())); // Then display the related page emit changeCurrentPage(); @@ -435,3 +440,18 @@ void UBDocumentNavigator::onSelectionChanged() // QList qlItems = mScene->selectedItems(); // qDebug() << "The number of selected items is " << qlItems.count(); } + +/** + * \brief Occurs when a page has been moved to another index in the document + * @param index as the new index + */ +void UBDocumentNavigator::onMovedToIndex(int index) +{ + UBSceneThumbnailNavigPixmap* pItem = dynamic_cast(mThumbnails.at(index)); + if(NULL != pItem) + { + mCrntItem = pItem; + mCrntItem->setSelected(true); + centerOn(mCrntItem); + } +} diff --git a/src/gui/UBDocumentNavigator.h b/src/gui/UBDocumentNavigator.h index 435edeb9..82b542b2 100644 --- a/src/gui/UBDocumentNavigator.h +++ b/src/gui/UBDocumentNavigator.h @@ -44,6 +44,9 @@ public: signals: void changeCurrentPage(); +public slots: + void onMovedToIndex(int index); + protected: virtual void resizeEvent(QResizeEvent *event); virtual void mousePressEvent(QMouseEvent *event); @@ -63,7 +66,7 @@ private: /** The scene */ QGraphicsScene* mScene; /** The current selected item */ - UBSceneThumbnailPixmap* mCrntItem; + UBSceneThumbnailNavigPixmap* mCrntItem; /** The current document */ UBDocumentProxy* mCrntDoc; /** The list of current thumbnails */ diff --git a/src/gui/UBThumbnailWidget.cpp b/src/gui/UBThumbnailWidget.cpp index 3c3e397c..227e3fac 100644 --- a/src/gui/UBThumbnailWidget.cpp +++ b/src/gui/UBThumbnailWidget.cpp @@ -13,14 +13,19 @@ * along with this program. If not, see . */ #include +#include #include "UBThumbnailWidget.h" #include "UBRubberBand.h" #include "core/UBSettings.h" +#include "core/UBApplication.h" #include "core/memcheck.h" +#include "document/UBDocumentProxy.h" +#include "document/UBDocumentController.h" + UBThumbnailWidget::UBThumbnailWidget(QWidget* parent) : QGraphicsView(parent) , mThumbnailWidth(UBSettings::defaultThumbnailWidth) @@ -681,3 +686,158 @@ UBThumbnail::~UBThumbnail() if (mSelectionItem && !mAddedToScene) delete mSelectionItem; } + + +UBSceneThumbnailNavigPixmap::UBSceneThumbnailNavigPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex) + : UBSceneThumbnailPixmap(pix, proxy, pSceneIndex) + , bButtonsVisible(false) + , bCanDelete(false) + , bCanMoveUp(false) + , bCanMoveDown(false) +{ + setAcceptsHoverEvents(true); + setFlag(QGraphicsItem::ItemIsSelectable, true); +} + +UBSceneThumbnailNavigPixmap::~UBSceneThumbnailNavigPixmap() +{ + +} + +void UBSceneThumbnailNavigPixmap::hoverEnterEvent(QGraphicsSceneHoverEvent *event) +{ + event->accept(); + updateButtonsState(); + update(); +} + +void UBSceneThumbnailNavigPixmap::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) +{ + event->accept(); + bButtonsVisible = false; + update(); +} + +void UBSceneThumbnailNavigPixmap::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +{ + Q_UNUSED(option); + Q_UNUSED(widget); + + UBSceneThumbnailPixmap::paint(painter, option, widget); + if(bButtonsVisible) + { + if(bCanDelete) + painter->drawPixmap(0, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/close.svg")); + else + painter->drawPixmap(0, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/closeDisabled.svg")); + if(bCanMoveUp) + painter->drawPixmap(BUTTONSIZE + BUTTONSPACING, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/moveUp.svg")); + else + painter->drawPixmap(BUTTONSIZE + BUTTONSPACING, 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/moveUpDisabled.svg")); + if(bCanMoveDown) + painter->drawPixmap(2*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/menu.svg")); + else + painter->drawPixmap(2*(BUTTONSIZE + BUTTONSPACING), 0, BUTTONSIZE, BUTTONSIZE, QPixmap(":images/menuDisabled.svg")); + } +} + +void UBSceneThumbnailNavigPixmap::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + // INFO: This implementation should work but this method is not called on a mousePressEvent, why? + // PLEASE DO NOT REMOVE THIS METHOD! We should reactivate this code when we will fix + // the mousePressEvent-not-called issue! + +// QPointF p = event->pos(); + +// // Here we check the position of the click and verify if it has to trig an action or not. +// if(bCanDelete && p.x() >= 0 && p.x() <= BUTTONSIZE && p.y() >= 0 && p.y() <= BUTTONSIZE) +// { +// deletePage(); +// } +// if(bCanMoveUp && p.x() >= BUTTONSIZE + BUTTONSPACING && p.x() <= 2*BUTTONSIZE + BUTTONSPACING && p.y() >= 0 && p.y() <= BUTTONSIZE) +// { +// moveUpPage(); +// } +// if(bCanMoveDown && p.x() >= 2*(BUTTONSIZE + BUTTONSPACING) && p.x() <= 2*(BUTTONSIZE + BUTTONSPACING) + BUTTONSIZE && p.y() >= 0 && p.y() <= BUTTONSIZE) +// { +// moveDownPage(); +// } + event->accept(); +} + +void UBSceneThumbnailNavigPixmap::updateButtonsState() +{ + bCanDelete = false; + bCanMoveUp = false; + bCanMoveDown = false; + + UBDocumentProxy* p = proxy(); + if(NULL != p) + { + int iNbPages = p->pageCount(); + if(1 < iNbPages) + { + bCanDelete = true; + if(sceneIndex() > 0) + { + bCanMoveUp = true; + } + if(sceneIndex() != iNbPages - 1) + { + bCanMoveDown = true; + } + } + } + + if(bCanDelete || bCanMoveUp || bCanMoveDown) + { + bButtonsVisible = true; + } +} + +void UBSceneThumbnailNavigPixmap::deletePage() +{ + QList itemsToDelete; + itemsToDelete << this; + + UBApplication::documentController->deletePages(itemsToDelete); +} + +void UBSceneThumbnailNavigPixmap::moveUpPage() +{ + UBApplication::documentController->moveSceneToIndex(proxy(), sceneIndex(), sceneIndex() - 1); +} + +void UBSceneThumbnailNavigPixmap::moveDownPage() +{ + UBApplication::documentController->moveSceneToIndex(proxy(), sceneIndex(), sceneIndex() + 1); +} + +void UBSceneThumbnailNavigPixmap::notifyClick(QPointF clickedScenePos) +{ + QPointF p = clickedPos(clickedScenePos); + + // Here we check the position of the click and verify if it has to trig an action or not. + if(bCanDelete && p.x() >= 0 && p.x() <= BUTTONSIZE/2 && p.y() >= 0 && p.y() <= BUTTONSIZE/2) + { + deletePage(); + } + if(bCanMoveUp && p.x() >= (BUTTONSIZE + BUTTONSPACING)/2 && p.x() <= BUTTONSIZE + BUTTONSPACING && p.y() >= 0 && p.y() <= BUTTONSIZE/2) + { + moveUpPage(); + } + if(bCanMoveDown && p.x() >= BUTTONSIZE + BUTTONSPACING && p.x() <= BUTTONSIZE + BUTTONSPACING + BUTTONSIZE/2 && p.y() >= 0 && p.y() <= BUTTONSIZE/2) + { + moveDownPage(); + } +} + +QPointF UBSceneThumbnailNavigPixmap::clickedPos(QPointF clickedScenePos) +{ + QPointF p; + + p.setX(clickedScenePos.x() - scenePos().x()); + p.setY(clickedScenePos.y() - scenePos().y()); + + return p; +} diff --git a/src/gui/UBThumbnailWidget.h b/src/gui/UBThumbnailWidget.h index edf71077..c4fa103f 100644 --- a/src/gui/UBThumbnailWidget.h +++ b/src/gui/UBThumbnailWidget.h @@ -19,11 +19,14 @@ #include #include #include +#include #include "frameworks/UBCoreGraphicsScene.h" #include "core/UBSettings.h" #define STARTDRAGTIME 1000000 +#define BUTTONSIZE 48 +#define BUTTONSPACING 5 class UBDocumentProxy; class UBThumbnailTextItem; @@ -282,6 +285,31 @@ class UBSceneThumbnailPixmap : public UBThumbnailPixmap int mSceneIndex; }; +class UBSceneThumbnailNavigPixmap : public UBSceneThumbnailPixmap +{ + public: + UBSceneThumbnailNavigPixmap(const QPixmap& pix, UBDocumentProxy* proxy, int pSceneIndex); + ~UBSceneThumbnailNavigPixmap(); + void notifyClick(QPointF clickedScenePos); + + protected: + void hoverEnterEvent(QGraphicsSceneHoverEvent *event); + void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); + void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); + void mousePressEvent(QGraphicsSceneMouseEvent *event); + + private: + void updateButtonsState(); + void deletePage(); + void moveUpPage(); + void moveDownPage(); + QPointF clickedPos(QPointF clickedScenePos); + + bool bButtonsVisible; + bool bCanDelete; + bool bCanMoveUp; + bool bCanMoveDown; +}; class UBThumbnailVideo : public UBThumbnailPixmap {