diff --git a/src/board/UBBoardController.cpp b/src/board/UBBoardController.cpp index d5032fc0..05c66ace 100644 --- a/src/board/UBBoardController.cpp +++ b/src/board/UBBoardController.cpp @@ -533,10 +533,12 @@ void UBBoardController::duplicateScene() duplicateScene(mActiveSceneIndex); } -void UBBoardController::duplicateItem(UBItem *item) +UBGraphicsItem *UBBoardController::duplicateItem(UBItem *item) { if (!item) - return; + return NULL; + + UBGraphicsItem *retItem = NULL; mLastCreatedItem = NULL; @@ -610,6 +612,7 @@ void UBBoardController::duplicateItem(UBItem *item) case UBMimeType::Group: { UBGraphicsGroupContainerItem* groupItem = dynamic_cast(item); + UBGraphicsGroupContainerItem* duplicatedGroup = NULL; if(groupItem){ QTransform groupTransform = groupItem->transform(); groupItem->resetTransform(); @@ -628,13 +631,13 @@ void UBBoardController::duplicateItem(UBItem *item) if(!selItems.empty()){ // I don't like this solution but for now this is the only way I found. // Normally, at this state, only the duplicated group should be selected - UBGraphicsGroupContainerItem* duplicatedGroup = dynamic_cast(selItems.at(0)); + duplicatedGroup = dynamic_cast(selItems.at(0)); if(NULL != duplicatedGroup){ duplicatedGroup->setTransform(groupTransform); } } } - return; + retItem = dynamic_cast(duplicatedGroup); break; } @@ -648,10 +651,13 @@ void UBBoardController::duplicateItem(UBItem *item) mLastCreatedItem = gitem; gitem->setSelected(true); } - return; + retItem = dynamic_cast(gitem); }break; } + if (retItem) + return retItem; + UBItem *createdItem = downloadFinished(true, sourceUrl, contentTypeHeader, pData, itemPos, QSize(itemSize.width(), itemSize.height()), false); if (createdItem) { @@ -663,7 +669,10 @@ void UBBoardController::duplicateItem(UBItem *item) createdGitem->setPos(itemPos); mLastCreatedItem = dynamic_cast(createdItem); mLastCreatedItem->setSelected(true); + + retItem = dynamic_cast(createdItem); } + return retItem; } void UBBoardController::deleteScene(int nIndex) @@ -2080,7 +2089,7 @@ UBGraphicsWidgetItem *UBBoardController::addW3cWidget(const QUrl &pUrl, const QP QString snapshotPath = selectedDocument()->persistencePath() + "/" + UBPersistenceManager::widgetDirectory + "/" + struuid + ".png"; w3cWidgetItem->setSnapshotPath(QUrl::fromLocalFile(snapshotPath)); UBGraphicsWidgetItem *tmpItem = dynamic_cast(w3cWidgetItem); - if (tmpItem) + if (tmpItem && tmpItem->scene()) tmpItem->takeSnapshot().save(snapshotPath, "PNG"); } @@ -2293,17 +2302,24 @@ void UBBoardController::togglePodcast(bool checked) UBPodcastController::instance()->toggleRecordingPalette(checked); } - void UBBoardController::moveGraphicsWidgetToControlView(UBGraphicsWidgetItem* graphicsWidget) { graphicsWidget->remove(); - UBToolWidget *toolWidget = new UBToolWidget(graphicsWidget); + mActiveScene->setURStackEnable(false); + UBGraphicsItem *toolW3C = duplicateItem(dynamic_cast(graphicsWidget)); + UBGraphicsWidgetItem *copyedGraphicsWidget = NULL; + + if (UBGraphicsWidgetItem::Type == toolW3C->type()) + copyedGraphicsWidget = static_cast(toolW3C); + + UBToolWidget *toolWidget = new UBToolWidget(copyedGraphicsWidget); mActiveScene->addItem(toolWidget); qreal ssf = 1 / UBApplication::boardController->systemScaleFactor(); toolWidget->setScale(ssf); toolWidget->setPos(graphicsWidget->scenePos()); + mActiveScene->setURStackEnable(true); } diff --git a/src/board/UBBoardController.h b/src/board/UBBoardController.h index 042ba24a..e21236d8 100644 --- a/src/board/UBBoardController.h +++ b/src/board/UBBoardController.h @@ -40,6 +40,7 @@ class UBGraphicsAudioItem; class UBGraphicsWidgetItem; class UBBoardPaletteManager; class UBItem; +class UBGraphicsItem; class UBBoardController : public UBDocumentContainer @@ -158,7 +159,7 @@ class UBBoardController : public UBDocumentContainer void moveSceneToIndex(int source, int target); void duplicateScene(int index); - void duplicateItem(UBItem *item); + UBGraphicsItem *duplicateItem(UBItem *item); void deleteScene(int index); bool cacheIsVisible() {return mCacheWidgetIsEnabled;} diff --git a/src/domain/UBGraphicsScene.h b/src/domain/UBGraphicsScene.h index 5f406d10..1c9c847f 100644 --- a/src/domain/UBGraphicsScene.h +++ b/src/domain/UBGraphicsScene.h @@ -109,8 +109,9 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem }; // tmp stub for divide addings scene objects from undo mechanism implementation - bool isURStackIsEnabled(){ return mUndoRedoStackEnabled;} - void enableUndoRedoStack(){mUndoRedoStackEnabled = true;} + void enableUndoRedoStack(){mUndoRedoStackEnabled = true;} + void setURStackEnable(bool enable){mUndoRedoStackEnabled = enable;} + bool isURStackIsEnabled(){return mUndoRedoStackEnabled;} UBGraphicsScene(UBDocumentProxy *parent, bool enableUndoRedoStack = true); virtual ~UBGraphicsScene(); diff --git a/src/domain/UBItem.h b/src/domain/UBItem.h index a74fd0b4..4629dd70 100644 --- a/src/domain/UBItem.h +++ b/src/domain/UBItem.h @@ -99,6 +99,8 @@ protected: public: + virtual int type() const = 0; + inline UBGraphicsItemDelegate *Delegate() const { return mDelegate; } static void assignZValue(QGraphicsItem*, qreal value); diff --git a/src/gui/UBToolWidget.cpp b/src/gui/UBToolWidget.cpp index 41a78e1a..5b8a601b 100644 --- a/src/gui/UBToolWidget.cpp +++ b/src/gui/UBToolWidget.cpp @@ -75,6 +75,15 @@ void UBToolWidget::initialize() if(!sUnpinPixmap) sUnpinPixmap = new QPixmap(":/images/unpin.svg"); + + UBGraphicsScene *wscene = dynamic_cast(mGraphicsWidgetItem->scene()); + if (wscene) + { + wscene->removeItemFromDeletion(mGraphicsWidgetItem); + wscene->removeItem(mGraphicsWidgetItem); + } + + mGraphicsWidgetItem->setParent(this); QGraphicsLinearLayout *graphicsLayout = new QGraphicsLinearLayout(Qt::Vertical, this); @@ -83,7 +92,7 @@ void UBToolWidget::initialize() graphicsLayout->setContentsMargins(mContentMargin, mContentMargin, mContentMargin, mContentMargin); setPreferredSize(mGraphicsWidgetItem->preferredWidth() + mContentMargin * 2, mGraphicsWidgetItem->preferredHeight() + mContentMargin * 2); - mGraphicsWebView = new QGraphicsWebView(); + mGraphicsWebView = new QGraphicsWebView(this); connect(mGraphicsWebView->page()->mainFrame(), SIGNAL(javaScriptWindowObjectCleared()), this, SLOT(javaScriptWindowObjectCleared())); mGraphicsWebView->load(mGraphicsWidgetItem->mainHtml()); graphicsLayout->addItem(mGraphicsWebView);