From e812ebb92ec9a5d550b3cd80ef1b4d217d1da2a0 Mon Sep 17 00:00:00 2001 From: shibakaneki Date: Tue, 16 Aug 2011 10:40:40 +0200 Subject: [PATCH] Implemented dock palette tab position related to the toolbar position --- src/core/UBPreferencesController.cpp | 1 + src/gui/UBDockPalette.cpp | 80 ++- src/gui/UBDockPalette.h | 16 + src/gui/UBLibNavigatorWidget.cpp | 1 + src/gui/UBLibPalette.cpp | 2 +- src/gui/UBLibPathViewer.cpp | 926 +++++++++++++-------------- src/gui/UBNavigatorPalette.cpp | 3 +- 7 files changed, 551 insertions(+), 478 deletions(-) diff --git a/src/core/UBPreferencesController.cpp b/src/core/UBPreferencesController.cpp index ff357ee9..37a3bc37 100644 --- a/src/core/UBPreferencesController.cpp +++ b/src/core/UBPreferencesController.cpp @@ -451,6 +451,7 @@ void UBPreferencesController::toolbarPositionChanged(bool checked) UBSettings* settings = UBSettings::settings(); settings->appToolBarPositionedAtTop->set(mPreferencesUI->toolbarAtTopRadioButton->isChecked()); + } void UBPreferencesController::toolbarOrientationVertical(bool checked) diff --git a/src/gui/UBDockPalette.cpp b/src/gui/UBDockPalette.cpp index 5a85cb9d..49fbddd6 100644 --- a/src/gui/UBDockPalette.cpp +++ b/src/gui/UBDockPalette.cpp @@ -19,9 +19,27 @@ #include "UBDockPalette.h" #include "core/UBSettings.h" #include "frameworks/UBPlatformUtils.h" +#include "core/UBApplication.h" +#include "core/UBPreferencesController.h" #include "core/memcheck.h" +/* + Note to myself: I will have to modify this implementation when we will + have to support mulitple tab. At this moment, a UBDockPalette + will be only the palette that manages the tabs. This + palette will maintain a list of tabs with icons and will + contain a QStackedWidget that will be contains the different + widget contents. + A click on a tab that is not related to the current widget + will show the related widget in the palette. + A click on a tab that is related to the current widget will + collapse the palette. + If the palette is collapsed, a click on any tab will expand it + and show the tab related widget. +*/ + + /** * \brief The constructor */ @@ -34,11 +52,12 @@ UBDockPalette::UBDockPalette(QWidget *parent, const char *name) , mResized(false) , mCollapseWidth(150) , mLastWidth(-1) + , mHTab(0) { setObjectName(name); // We let 2 pixels in order to keep a small border for the resizing - setMinimumWidth(border() + 2); + setMinimumWidth(2*border() + 2); if (parent) { @@ -61,6 +80,10 @@ UBDockPalette::UBDockPalette(QWidget *parent, const char *name) // This is the only way to set the background as transparent! setStyleSheet("QWidget {background-color: transparent}"); + + // Set the position of the tab + onToolbarPosUpdated(); + connect(UBSettings::settings()->appToolBarPositionedAtTop, SIGNAL(changed(QVariant)), this, SLOT(onToolbarPosUpdated())); } /** @@ -206,9 +229,9 @@ void UBDockPalette::mouseReleaseEvent(QMouseEvent *event) if(eUBDockOrientation_Left == mOrientation) { if(mMousePressPos.x() >= width() - 2*border() && - mMousePressPos.y() >= border() && + mMousePressPos.y() >= mHTab && mMousePressPos.x() <= width() && - mMousePressPos.y() <= border() + TABSIZE) + mMousePressPos.y() <= mHTab + TABSIZE) { tabClicked(); } @@ -217,8 +240,8 @@ void UBDockPalette::mouseReleaseEvent(QMouseEvent *event) { if(mMousePressPos.x() >= 0 && mMousePressPos.x() <= 2*border() && - mMousePressPos.y() >= border() && - mMousePressPos.y() <= border() + TABSIZE) + mMousePressPos.y() >= mHTab && + mMousePressPos.y() <= mHTab + TABSIZE) { tabClicked(); } @@ -291,23 +314,32 @@ void UBDockPalette::paintEvent(QPaintEvent *event) painter.setPen(Qt::NoPen); painter.setBrush(mBackgroundBrush); + if(eUBDockTabOrientation_Up == mTabsOrientation) + { + mHTab = border(); + } + else + { + mHTab = height() - border() - TABSIZE; + } + if(mOrientation == eUBDockOrientation_Left) { QPainterPath path; path.setFillRule(Qt::WindingFill); - path.addRect(0.0, 0.0, width()-border(), height()); - path.addRoundedRect(width()-2*border(), border(), 2*border(), TABSIZE, radius(), radius()); + path.addRect(0.0, 0.0, width()-2*border(), height()); + path.addRoundedRect(width()-4*border(), mHTab, 4*border(), TABSIZE, radius(), radius()); painter.drawPath(path); - painter.drawPixmap(width() - border() + 1, border() + 1 , border() - 4, TABSIZE - 2, mIcon); + painter.drawPixmap(width() - border() + 1, mHTab + 1 , border() - 4, TABSIZE - 2, mIcon); } else if(mOrientation == eUBDockOrientation_Right) { QPainterPath path; path.setFillRule(Qt::WindingFill); - path.addRect(border(), 0.0, width()-border(), height()); - path.addRoundedRect(0.0, border(), 2*border(), TABSIZE, radius(), radius()); + path.addRect(2*border(), 0.0, width()-2*border(), height()); + path.addRoundedRect(0.0, mHTab, 4*border(), TABSIZE, radius(), radius()); painter.drawPath(path); - painter.drawPixmap(2, border() + 1, border() - 3, TABSIZE - 2, mIcon); + painter.drawPixmap(2, mHTab + 1, border() - 3, TABSIZE - 2, mIcon); } else { @@ -372,7 +404,7 @@ void UBDockPalette::tabClicked() { // The palette must be collapsed mLastWidth = width(); - resize(border(), height()); + resize(2*border(), height()); } else { @@ -381,3 +413,27 @@ void UBDockPalette::tabClicked() mLastWidth = -1; } } + +void UBDockPalette::setTabsOrientation(eUBDockTabOrientation orientation) +{ + mTabsOrientation = orientation; +} + +void UBDockPalette::onToolbarPosUpdated() +{ + // Get the position of the tab + if(UBSettings::settings()->appToolBarPositionedAtTop->get().toBool()) + { + setTabsOrientation(eUBDockTabOrientation_Up); + } + else + { + setTabsOrientation(eUBDockTabOrientation_Down); + } + update(); +} + +int UBDockPalette::customMargin() +{ + return 5; +} diff --git a/src/gui/UBDockPalette.h b/src/gui/UBDockPalette.h index 24753f01..17440662 100644 --- a/src/gui/UBDockPalette.h +++ b/src/gui/UBDockPalette.h @@ -39,14 +39,22 @@ typedef enum eUBDockOrientation_Bottom /** [to be implemented]Bottom dock */ }eUBDockOrientation; +typedef enum +{ + eUBDockTabOrientation_Up, /** Up tabs */ + eUBDockTabOrientation_Down /** Down tabs */ +}eUBDockTabOrientation; + class UBDockPalette : public QWidget { + Q_OBJECT public: UBDockPalette(QWidget* parent=0, const char* name="UBDockPalette"); ~UBDockPalette(); eUBDockOrientation orientation(); void setOrientation(eUBDockOrientation orientation); + void setTabsOrientation(eUBDockTabOrientation orientation); virtual void mouseMoveEvent(QMouseEvent *event); virtual void mousePressEvent(QMouseEvent *event); @@ -60,6 +68,7 @@ public: protected: virtual int border(); virtual int radius(); + virtual int customMargin(); virtual void updateMaxWidth(); virtual void resizeEvent(QResizeEvent *event); virtual int collapseWidth(); @@ -86,6 +95,13 @@ protected: QPoint mMousePressPos; /** The palette icon */ QPixmap mIcon; + /** The tab orientation */ + eUBDockTabOrientation mTabsOrientation; + /** The h position of the tab */ + int mHTab; + +private slots: + void onToolbarPosUpdated(); private: void tabClicked(); diff --git a/src/gui/UBLibNavigatorWidget.cpp b/src/gui/UBLibNavigatorWidget.cpp index c8a249aa..adefdd1e 100644 --- a/src/gui/UBLibNavigatorWidget.cpp +++ b/src/gui/UBLibNavigatorWidget.cpp @@ -39,6 +39,7 @@ UBLibNavigatorWidget::UBLibNavigatorWidget(QWidget *parent, const char *name):QW UBLibPalette* pLibPalette = dynamic_cast(parentWidget()); mLayout = new QVBoxLayout(this); +// mLayout->setContentsMargins(20, 5, 5, 5); setLayout(mLayout); mPathViewer = new UBLibPathViewer(this); diff --git a/src/gui/UBLibPalette.cpp b/src/gui/UBLibPalette.cpp index 56ffeef2..fb5c9a1f 100644 --- a/src/gui/UBLibPalette.cpp +++ b/src/gui/UBLibPalette.cpp @@ -40,7 +40,7 @@ UBLibPalette::UBLibPalette(QWidget *parent, const char *name):UBDockPalette(pare mLastWidth = 300; mLayout = new QVBoxLayout(this); - mLayout->setMargin(3); + mLayout->setContentsMargins(20, customMargin(), customMargin(), customMargin()); setLayout(mLayout); // Build the GUI diff --git a/src/gui/UBLibPathViewer.cpp b/src/gui/UBLibPathViewer.cpp index 1b846932..9da9c913 100644 --- a/src/gui/UBLibPathViewer.cpp +++ b/src/gui/UBLibPathViewer.cpp @@ -12,466 +12,466 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include -#include -#include - -#include "UBLibPathViewer.h" -#include "core/UBApplication.h" -#include "board/UBBoardController.h" - -#include "core/memcheck.h" - -/** - * \brief Constructor - * @param parent as the parent widget - * @param name as the object name - */ -UBLibPathViewer::UBLibPathViewer(QWidget *parent, const char *name):QGraphicsView(parent) - , mpElems(NULL) - , mpScene(NULL) - , mpLayout(NULL) - , mpContainer(NULL) -{ - setObjectName(name); - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); - setAcceptDrops(true); - setStyleSheet(QString("QGraphicsView{background:#EEEEEE; border-radius:10px; border:2px solid #999999;}")); - - mpScene = new UBPathScene(this); - setScene(mpScene); - - mpContainer = new QGraphicsWidget(); - mpContainer->setMinimumWidth(width() - 20); - mpScene->addItem(mpContainer); - mpLayout = new QGraphicsLinearLayout(); - mpContainer->setLayout(mpLayout); - - connect(mpScene, SIGNAL(mouseClick(UBChainedLibElement*)), this, SLOT(onMouseClicked(UBChainedLibElement*))); - connect(mpScene, SIGNAL(elementsDropped(QList,UBLibElement*)), this, SLOT(onElementsDropped(QList,UBLibElement*))); - connect(horizontalScrollBar(), SIGNAL(sliderMoved(int)), this, SLOT(onSliderMoved(int))); -} - -/** - * \brief Destructor - */ -UBLibPathViewer::~UBLibPathViewer() -{ - if(NULL != mpContainer) - { - delete mpContainer; - mpContainer = NULL; - } - //if(NULL != mpLayout) - //{ - // delete mpLayout; - // mpLayout = NULL; - //} - if(NULL != mpElems) - { - delete mpElems; - mpElems = NULL; - } - if(NULL != mpScene) - { - delete mpScene; - mpScene = NULL; - } -} - -/** - * \brief Display the current path - * @param elementsChain as the path to display - */ -void UBLibPathViewer::displayPath(UBChainedLibElement *elementsChain) -{ - if(NULL != elementsChain) - { - mpElems = elementsChain; - refreshPath(); - } -} - -/** - * \brief Refresh the current path - */ -void UBLibPathViewer::refreshPath() -{ - if (mpScene && mpContainer) - mpScene->removeItem(mpContainer); - if(mpContainer) - delete mpContainer; - mVItems.clear(); - mpScene->mapWidgetToChainedElem()->clear(); - mpContainer = new QGraphicsWidget(); - - mpScene->addItem(mpContainer); - mpLayout = new QGraphicsLinearLayout(); - mpContainer->setLayout(mpLayout); - mSceneWidth = 0; - addItem(mpElems); - mpLayout->addStretch(); - - updateScrolls(); - -} - -/** - * \brief Handle the slider moved event - * @param value as the current slider position - */ -void UBLibPathViewer::onSliderMoved(int value) -{ - Q_UNUSED(value); -} - -/** - * \brief Update the scroll bar status - */ -void UBLibPathViewer::updateScrolls() -{ - int iLimit = mSceneWidth + 40; // 2x 20 pixels margin - int iVp = viewport()->width(); - - if(iLimit >= iVp) - { - int iDiff = iLimit - iVp; - horizontalScrollBar()->setRange(0, iDiff); - } - else - { - horizontalScrollBar()->setRange(0, 0); - } -} - -/** - * \brief Append an item to the path - * @param elem as the element to add to the path - */ -void UBLibPathViewer::addItem(UBChainedLibElement *elem) -{ - if(NULL != elem) - { - // Add the icon - QLabel* pIconLabel = new QLabel(); - pIconLabel->setStyleSheet(QString("background-color: transparent;")); - pIconLabel->setPixmap((QPixmap::fromImage(*elem->element()->thumbnail())).scaledToWidth(PATHITEMWIDTH)); - UBFolderPath* iconWidget = reinterpret_cast(mpScene->addWidget(pIconLabel)); - //iconWidget->setToolTip(elem->element()->name()); - iconWidget->setWindowFlags(Qt::BypassGraphicsProxyWidget); - mpLayout->addItem(iconWidget); - mVItems << iconWidget; - mpScene->mapWidgetToChainedElem()->insert(iconWidget,elem); - mSceneWidth += pIconLabel->pixmap()->width() + 4; // 2px border - - if(NULL != elem->nextElement()) - { - // Add the arrow - QLabel* pArrowLabel = new QLabel(); - pArrowLabel->setStyleSheet(QString("background-color: transparent;")); - pArrowLabel->setPixmap(QPixmap(":images/navig_arrow.png")); - QGraphicsWidget* arrowWidget = mpScene->addWidget(pArrowLabel); - mpLayout->addItem(arrowWidget); - mVItems << arrowWidget; - mSceneWidth += pArrowLabel->pixmap()->width() + 4; // 2px border - - // Recursively call this method while a next item exists - addItem(elem->nextElement()); - } - } -} - -/** - * \brief Handles the resize event - * @param event as the resize event - */ -void UBLibPathViewer::resizeEvent(QResizeEvent *event) -{ - - if(event->oldSize() == event->size()) - event->ignore(); - else{ - if(NULL != mpContainer) - mpContainer->setMinimumWidth(width() - 20); - - viewport()->resize(width() - 10, viewport()->height()); - - updateScrolls(); - event->accept(); - } -} - -void UBLibPathViewer::showEvent(QShowEvent *event) -{ - Q_UNUSED(event); - updateScrolls(); -} - -/** - * \brief Handles the mouse move event - * @param event as the mouse move event - */ -void UBLibPathViewer::mouseMoveEvent(QMouseEvent *event) -{ - event->ignore(); -} - -void UBLibPathViewer::onMouseClicked(UBChainedLibElement *elem) -{ - emit mouseClick(elem); -} - -int UBLibPathViewer::widgetAt(QPointF p) -{ - int position = -1; - - for(int i = 0; i < mVItems.size(); i++) - { - QGraphicsWidget* pCrntWidget = mVItems.at(i); - if(NULL != pCrntWidget) - { - QRectF r = pCrntWidget->rect(); - QPointF wPos = pCrntWidget->scenePos(); - int xMin = wPos.x() + r.x(); - int xMax = wPos.x() + r.x() + r.width(); - int yMin = wPos.y() + r.y(); - int yMax = wPos.y() + r.y() + r.height(); - - if(p.x() >= xMin && - p.x() <= xMax && - p.y() >= yMin && - p.y() <= yMax) - { - return i; - } - } - } - - return position; -} - -void UBLibPathViewer::onElementsDropped(QList elements, UBLibElement *target) -{ - emit elementsDropped(elements, target); -} - - -UBFolderPath::UBFolderPath():QGraphicsProxyWidget() -{ - -} - -UBFolderPath::~UBFolderPath() -{ - -} - -/** - * \brief Handles the drag enter event - * @param pEvent as the drag enter event - */ -void UBFolderPath::dragEnterEvent(QGraphicsSceneDragDropEvent *event) -{ - event->acceptProposedAction(); -} - -/** - * \brief Handles the drop event - * @param pEvent as the drop event - */ -void UBFolderPath::dropEvent(QDropEvent *pEvent) -{ - processMimeData(pEvent->mimeData()); - pEvent->acceptProposedAction(); -} - -/** - * \brief Handles the drag move event - * @param pEvent as the drag move event - */ -void UBFolderPath::dragMoveEvent(QDragMoveEvent* pEvent) -{ - pEvent->acceptProposedAction(); -} - -/** - * \brief Process the given MIME data - * @param pData as the MIME data to process - */ -void UBFolderPath::processMimeData(const QMimeData *pData) -{ - Q_UNUSED(pData); -} - -/** - * \brief Handles the mouse press event - * @param event as the mouse press event - */ -void UBFolderPath::mousePressEvent(QGraphicsSceneMouseEvent *event) -{ - Q_UNUSED(event); -} - -/** - * \brief Handles the mouse move event - * @param event as the mouse move event - */ -void UBFolderPath::mouseMoveEvent(QMouseEvent *event) -{ - Q_UNUSED(event); -} - -/** - * \brief Handles the mouse release event - * @param event as the mouse release event - */ -void UBFolderPath::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -{ - Q_UNUSED(event); -} - - -UBPathScene::UBPathScene(QWidget* parent):QGraphicsScene(parent) -{ - -} - -UBPathScene::~UBPathScene() -{ - -} - - -void UBPathScene::mousePressEvent(QGraphicsSceneMouseEvent *event) -{ - if(event->button() == Qt::LeftButton) - { - mDragStartPos = event->scenePos(); - mClickTime = QTime::currentTime(); - } -} - -/** - * \brief Handles the mouse release event - * @param event as the mouse release event - */ -void UBPathScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -{ - int elapsedTimeSincePress = mClickTime.elapsed(); - - if(elapsedTimeSincePress < STARTDRAGTIME) - { - QGraphicsWidget* pGWidget = dynamic_cast(itemAt(event->pos())); - if(NULL != pGWidget) - { - // We have only one view at a time - UBLibPathViewer* pView = dynamic_cast(this->views().at(0)); - if(NULL != pView) - { - int iClickedItem = pView->widgetAt(event->scenePos()); - if(-1 != iClickedItem) - { - QGraphicsWidget* pFolderW = dynamic_cast(pGWidget->layout()->itemAt(iClickedItem)); - if(NULL != pFolderW) - { - UBChainedLibElement* chElem = mMapWidgetToChainedElem[pFolderW]; - if(NULL != chElem) - { - emit mouseClick(chElem); - } - } - } - } - } - } -} - -/** - * \brief Handles the mouse move event - * @param event as the mouse move event - */ -void UBPathScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) -{ - if(event->button() == Qt::LeftButton) - { - if((event->pos() - mDragStartPos).manhattanLength() < QApplication::startDragDistance()) - { - // The user is not doing a drag - return; - } - - // The user is performing a drag operation - QDrag* drag = new QDrag(event->widget()); - QMimeData* mimeData = new QMimeData(); - drag->setMimeData(mimeData); - drag->start(); - } -} - - -void UBPathScene::dragEnterEvent(QGraphicsSceneDragDropEvent *event) -{ - event->accept(); -} - -void UBPathScene::dragMoveEvent(QGraphicsSceneDragDropEvent *event) -{ - event->accept(); -} - -void UBPathScene::dropEvent(QGraphicsSceneDragDropEvent *event) -{ - const QMimeData* pMimeData = event->mimeData(); - qDebug() << " Drop source : " << event->source()->metaObject()->className(); - - if(0 == QString::compare(event->source()->metaObject()->className(), "UBLibraryWidget")) - { - UBLibElement* pTargetElement = elementFromPos(event->scenePos()); - if(NULL != pTargetElement) - { - if(eUBLibElementType_Folder == pTargetElement->type()) - { - // The drag comes from this application, we have now to get the list of UBLibElements* - QList qlDroppedElems; - - foreach(QUrl url, pMimeData->urls()) - qlDroppedElems << url.toString(); - - if(!qlDroppedElems.empty()) - { - // Send a signal with the target dir and the list of ublibelement* - emit elementsDropped(qlDroppedElems, pTargetElement); - } - } - } - - event->accept(); - } - else - { - event->ignore(); - } -} - -/** - * \brief Return the element related to the given position - * @param p as the given position - * - */ -UBLibElement* UBPathScene::elementFromPos(QPointF p) -{ - UBLibElement* pElem = NULL; - - QGraphicsWidget* pGWidget = dynamic_cast(itemAt(p)); - if(NULL != pGWidget) - { - UBChainedLibElement* chElem = mMapWidgetToChainedElem[pGWidget]; - if(NULL != chElem) - { - return chElem->element(); - } - } - - return pElem; -} +#include +#include +#include + +#include "UBLibPathViewer.h" +#include "core/UBApplication.h" +#include "board/UBBoardController.h" + +#include "core/memcheck.h" + +/** + * \brief Constructor + * @param parent as the parent widget + * @param name as the object name + */ +UBLibPathViewer::UBLibPathViewer(QWidget *parent, const char *name):QGraphicsView(parent) + , mpElems(NULL) + , mpScene(NULL) + , mpLayout(NULL) + , mpContainer(NULL) +{ + setObjectName(name); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn); + setAcceptDrops(true); + setStyleSheet(QString("QGraphicsView{background:#EEEEEE; border-radius:10px; border:2px solid #999999;}")); + + mpScene = new UBPathScene(this); + setScene(mpScene); + + mpContainer = new QGraphicsWidget(); + mpContainer->setMinimumWidth(width() - 20); + mpScene->addItem(mpContainer); + mpLayout = new QGraphicsLinearLayout(); + mpContainer->setLayout(mpLayout); + + connect(mpScene, SIGNAL(mouseClick(UBChainedLibElement*)), this, SLOT(onMouseClicked(UBChainedLibElement*))); + connect(mpScene, SIGNAL(elementsDropped(QList,UBLibElement*)), this, SLOT(onElementsDropped(QList,UBLibElement*))); + connect(horizontalScrollBar(), SIGNAL(sliderMoved(int)), this, SLOT(onSliderMoved(int))); +} + +/** + * \brief Destructor + */ +UBLibPathViewer::~UBLibPathViewer() +{ + if(NULL != mpContainer) + { + delete mpContainer; + mpContainer = NULL; + } + //if(NULL != mpLayout) + //{ + // delete mpLayout; + // mpLayout = NULL; + //} + if(NULL != mpElems) + { + delete mpElems; + mpElems = NULL; + } + if(NULL != mpScene) + { + delete mpScene; + mpScene = NULL; + } +} + +/** + * \brief Display the current path + * @param elementsChain as the path to display + */ +void UBLibPathViewer::displayPath(UBChainedLibElement *elementsChain) +{ + if(NULL != elementsChain) + { + mpElems = elementsChain; + refreshPath(); + } +} + +/** + * \brief Refresh the current path + */ +void UBLibPathViewer::refreshPath() +{ + if (mpScene && mpContainer) + mpScene->removeItem(mpContainer); + if(mpContainer) + delete mpContainer; + mVItems.clear(); + mpScene->mapWidgetToChainedElem()->clear(); + mpContainer = new QGraphicsWidget(); + + mpScene->addItem(mpContainer); + mpLayout = new QGraphicsLinearLayout(); + mpContainer->setLayout(mpLayout); + mSceneWidth = 0; + addItem(mpElems); + mpLayout->addStretch(); + + updateScrolls(); + +} + +/** + * \brief Handle the slider moved event + * @param value as the current slider position + */ +void UBLibPathViewer::onSliderMoved(int value) +{ + Q_UNUSED(value); +} + +/** + * \brief Update the scroll bar status + */ +void UBLibPathViewer::updateScrolls() +{ + int iLimit = mSceneWidth + 40; // 2x 20 pixels margin + int iVp = viewport()->width(); + + if(iLimit >= iVp) + { + int iDiff = iLimit - iVp; + horizontalScrollBar()->setRange(0, iDiff); + } + else + { + horizontalScrollBar()->setRange(0, 0); + } +} + +/** + * \brief Append an item to the path + * @param elem as the element to add to the path + */ +void UBLibPathViewer::addItem(UBChainedLibElement *elem) +{ + if(NULL != elem) + { + // Add the icon + QLabel* pIconLabel = new QLabel(); + pIconLabel->setStyleSheet(QString("background-color: transparent;")); + pIconLabel->setPixmap((QPixmap::fromImage(*elem->element()->thumbnail())).scaledToWidth(PATHITEMWIDTH)); + UBFolderPath* iconWidget = reinterpret_cast(mpScene->addWidget(pIconLabel)); + //iconWidget->setToolTip(elem->element()->name()); + iconWidget->setWindowFlags(Qt::BypassGraphicsProxyWidget); + mpLayout->addItem(iconWidget); + mVItems << iconWidget; + mpScene->mapWidgetToChainedElem()->insert(iconWidget,elem); + mSceneWidth += pIconLabel->pixmap()->width() + 4; // 2px border + + if(NULL != elem->nextElement()) + { + // Add the arrow + QLabel* pArrowLabel = new QLabel(); + pArrowLabel->setStyleSheet(QString("background-color: transparent;")); + pArrowLabel->setPixmap(QPixmap(":images/navig_arrow.png")); + QGraphicsWidget* arrowWidget = mpScene->addWidget(pArrowLabel); + mpLayout->addItem(arrowWidget); + mVItems << arrowWidget; + mSceneWidth += pArrowLabel->pixmap()->width() + 4; // 2px border + + // Recursively call this method while a next item exists + addItem(elem->nextElement()); + } + } +} + +/** + * \brief Handles the resize event + * @param event as the resize event + */ +void UBLibPathViewer::resizeEvent(QResizeEvent *event) +{ + + if(event->oldSize() == event->size()) + event->ignore(); + else{ + if(NULL != mpContainer) + mpContainer->setMinimumWidth(width() - 20); + + viewport()->resize(width() - 10, viewport()->height()); + + updateScrolls(); + event->accept(); + } +} + +void UBLibPathViewer::showEvent(QShowEvent *event) +{ + Q_UNUSED(event); + updateScrolls(); +} + +/** + * \brief Handles the mouse move event + * @param event as the mouse move event + */ +void UBLibPathViewer::mouseMoveEvent(QMouseEvent *event) +{ + event->ignore(); +} + +void UBLibPathViewer::onMouseClicked(UBChainedLibElement *elem) +{ + emit mouseClick(elem); +} + +int UBLibPathViewer::widgetAt(QPointF p) +{ + int position = -1; + + for(int i = 0; i < mVItems.size(); i++) + { + QGraphicsWidget* pCrntWidget = mVItems.at(i); + if(NULL != pCrntWidget) + { + QRectF r = pCrntWidget->rect(); + QPointF wPos = pCrntWidget->scenePos(); + int xMin = wPos.x() + r.x(); + int xMax = wPos.x() + r.x() + r.width(); + int yMin = wPos.y() + r.y(); + int yMax = wPos.y() + r.y() + r.height(); + + if(p.x() >= xMin && + p.x() <= xMax && + p.y() >= yMin && + p.y() <= yMax) + { + return i; + } + } + } + + return position; +} + +void UBLibPathViewer::onElementsDropped(QList elements, UBLibElement *target) +{ + emit elementsDropped(elements, target); +} + + +UBFolderPath::UBFolderPath():QGraphicsProxyWidget() +{ + +} + +UBFolderPath::~UBFolderPath() +{ + +} + +/** + * \brief Handles the drag enter event + * @param pEvent as the drag enter event + */ +void UBFolderPath::dragEnterEvent(QGraphicsSceneDragDropEvent *event) +{ + event->acceptProposedAction(); +} + +/** + * \brief Handles the drop event + * @param pEvent as the drop event + */ +void UBFolderPath::dropEvent(QDropEvent *pEvent) +{ + processMimeData(pEvent->mimeData()); + pEvent->acceptProposedAction(); +} + +/** + * \brief Handles the drag move event + * @param pEvent as the drag move event + */ +void UBFolderPath::dragMoveEvent(QDragMoveEvent* pEvent) +{ + pEvent->acceptProposedAction(); +} + +/** + * \brief Process the given MIME data + * @param pData as the MIME data to process + */ +void UBFolderPath::processMimeData(const QMimeData *pData) +{ + Q_UNUSED(pData); +} + +/** + * \brief Handles the mouse press event + * @param event as the mouse press event + */ +void UBFolderPath::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event); +} + +/** + * \brief Handles the mouse move event + * @param event as the mouse move event + */ +void UBFolderPath::mouseMoveEvent(QMouseEvent *event) +{ + Q_UNUSED(event); +} + +/** + * \brief Handles the mouse release event + * @param event as the mouse release event + */ +void UBFolderPath::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + Q_UNUSED(event); +} + + +UBPathScene::UBPathScene(QWidget* parent):QGraphicsScene(parent) +{ + +} + +UBPathScene::~UBPathScene() +{ + +} + + +void UBPathScene::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + if(event->button() == Qt::LeftButton) + { + mDragStartPos = event->scenePos(); + mClickTime = QTime::currentTime(); + } +} + +/** + * \brief Handles the mouse release event + * @param event as the mouse release event + */ +void UBPathScene::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + int elapsedTimeSincePress = mClickTime.elapsed(); + + if(elapsedTimeSincePress < STARTDRAGTIME) + { + QGraphicsWidget* pGWidget = dynamic_cast(itemAt(event->pos())); + if(NULL != pGWidget) + { + // We have only one view at a time + UBLibPathViewer* pView = dynamic_cast(this->views().at(0)); + if(NULL != pView) + { + int iClickedItem = pView->widgetAt(event->scenePos()); + if(-1 != iClickedItem) + { + QGraphicsWidget* pFolderW = dynamic_cast(pGWidget->layout()->itemAt(iClickedItem)); + if(NULL != pFolderW) + { + UBChainedLibElement* chElem = mMapWidgetToChainedElem[pFolderW]; + if(NULL != chElem) + { + emit mouseClick(chElem); + } + } + } + } + } + } +} + +/** + * \brief Handles the mouse move event + * @param event as the mouse move event + */ +void UBPathScene::mouseMoveEvent(QGraphicsSceneMouseEvent *event) +{ + if(event->button() == Qt::LeftButton) + { + if((event->pos() - mDragStartPos).manhattanLength() < QApplication::startDragDistance()) + { + // The user is not doing a drag + return; + } + + // The user is performing a drag operation + QDrag* drag = new QDrag(event->widget()); + QMimeData* mimeData = new QMimeData(); + drag->setMimeData(mimeData); + drag->start(); + } +} + + +void UBPathScene::dragEnterEvent(QGraphicsSceneDragDropEvent *event) +{ + event->accept(); +} + +void UBPathScene::dragMoveEvent(QGraphicsSceneDragDropEvent *event) +{ + event->accept(); +} + +void UBPathScene::dropEvent(QGraphicsSceneDragDropEvent *event) +{ + const QMimeData* pMimeData = event->mimeData(); + qDebug() << " Drop source : " << event->source()->metaObject()->className(); + + if(0 == QString::compare(event->source()->metaObject()->className(), "UBLibraryWidget")) + { + UBLibElement* pTargetElement = elementFromPos(event->scenePos()); + if(NULL != pTargetElement) + { + if(eUBLibElementType_Folder == pTargetElement->type()) + { + // The drag comes from this application, we have now to get the list of UBLibElements* + QList qlDroppedElems; + + foreach(QUrl url, pMimeData->urls()) + qlDroppedElems << url.toString(); + + if(!qlDroppedElems.empty()) + { + // Send a signal with the target dir and the list of ublibelement* + emit elementsDropped(qlDroppedElems, pTargetElement); + } + } + } + + event->accept(); + } + else + { + event->ignore(); + } +} + +/** + * \brief Return the element related to the given position + * @param p as the given position + * + */ +UBLibElement* UBPathScene::elementFromPos(QPointF p) +{ + UBLibElement* pElem = NULL; + + QGraphicsWidget* pGWidget = dynamic_cast(itemAt(p)); + if(NULL != pGWidget) + { + UBChainedLibElement* chElem = mMapWidgetToChainedElem[pGWidget]; + if(NULL != chElem) + { + return chElem->element(); + } + } + + return pElem; +} diff --git a/src/gui/UBNavigatorPalette.cpp b/src/gui/UBNavigatorPalette.cpp index 2ed1e6e9..8ac69e5e 100644 --- a/src/gui/UBNavigatorPalette.cpp +++ b/src/gui/UBNavigatorPalette.cpp @@ -35,11 +35,10 @@ UBNavigatorPalette::UBNavigatorPalette(QWidget *parent, const char *name):UBDock mIcon = QPixmap(":images/paletteNavigator.png"); resize(UBSettings::settings()->navigPaletteWidth->get().toInt(), height()); mLastWidth = 300; - setContentsMargins(0, 0, border(), 0); // Build the gui mLayout = new QVBoxLayout(this); - mLayout->setMargin(3); + mLayout->setContentsMargins(customMargin(), customMargin(), 2*border() + customMargin(), customMargin()); setLayout(mLayout); mNavigator = new UBDocumentNavigator(this);