From 1879ec239a811c7ac5646e07f6b7bdd308de141e Mon Sep 17 00:00:00 2001 From: Jorge Cuadrado Date: Mon, 31 Dec 2007 02:20:55 -0500 Subject: [PATCH] Implemented copy, cut and paste frame --- src/components/timeline/framestable.cpp | 69 +++++++++++++++---- src/components/timeline/framestable.h | 5 ++ src/components/timeline/timeline.cpp | 20 ++++-- src/components/timeline/timelinewidget.cpp | 104 +++++++++++++++++++++++++++-- src/components/timeline/timelinewidget.h | 8 +++ src/dashd/main.cpp | 2 +- 6 files changed, 185 insertions(+), 23 deletions(-) diff --git a/src/components/timeline/framestable.cpp b/src/components/timeline/framestable.cpp index 8563331..90dc361 100644 --- a/src/components/timeline/framestable.cpp +++ b/src/components/timeline/framestable.cpp @@ -28,6 +28,8 @@ #include #include #include +#include +#include #include #include @@ -345,8 +347,11 @@ struct FramesTable::Private InsertFrame = 0, RemoveFrame, ToggleLockFrame, - ToggleFrameVisibility, - ExpandFrame + ToggleFrameVisibility, + ExpandFrame, + CopyFrame, + PasteFrame, + CutFrame }; }; @@ -444,26 +449,45 @@ void FramesTable::onItemSelectionChanged() */ void FramesTable::mousePressEvent ( QMouseEvent * event ) { - QTableWidget::mousePressEvent(event); + QTableWidget::mousePressEvent(event); if(event->buttons() == Qt::RightButton ) { QMenu *menu = new QMenu(tr("Frames"), this); FramesTableItem *item = dynamic_cast(currentItem()); + + menu->addAction( tr("Insert frame"))->setData(Private::InsertFrame); + if(item) { - menu->addAction( tr("Insert frame"))->setData(Private::InsertFrame); - - if(item->isUsed()) + if( item->isUsed()) { menu->addAction( tr("Remove frame"))->setData(Private::RemoveFrame); menu->addAction( tr("Expand this frame"))->setData(Private::ExpandFrame); + menu->addSeparator(); + menu->addAction(tr("Copy frame"))->setData(Private::CopyFrame); + + menu->addAction(tr("Cut frame"))->setData(Private::CutFrame); } - - menu->addSeparator(); - - if(item->isLocked()) + else + { + menu->addSeparator(); + } + } + + if(const QMimeData *mimeData = QApplication::clipboard()->mimeData()) + { + if(mimeData->hasFormat("yamf-frame")) + { + menu->addAction( tr("Paste frame"))->setData(Private::PasteFrame); + menu->addSeparator(); + } + } + + if(item) + { + if( item->isLocked()) { menu->addAction( tr("Unlock this frame"))->setData(Private::ToggleLockFrame); } @@ -480,9 +504,10 @@ void FramesTable::mousePressEvent ( QMouseEvent * event ) { menu->addAction( tr("Show this frame"))->setData(Private::ToggleFrameVisibility); } - } + connect(menu, SIGNAL(triggered(QAction *)), this, SLOT(onMenuActionTriggered(QAction * ))); + menu->exec( event->globalPos() ); } } @@ -519,6 +544,11 @@ void FramesTable::onMenuActionTriggered(QAction * action) emit requestInsertFrame(layerPos, framePos+1); } } + else + { + emit requestInsertFrame(layerPos, framePos); + } + } break; case Private::RemoveFrame: @@ -526,6 +556,21 @@ void FramesTable::onMenuActionTriggered(QAction * action) emit requestRemoveFrame(layerPos, framePos); } break; + case Private::CopyFrame: + { + emit requestCopyFrame(layerPos, framePos); + } + break; + case Private::PasteFrame: + { + emit requestPasteFrame(layerPos, framePos); + } + break; + case Private::CutFrame: + { + emit requestCutFrame(layerPos, framePos); + } + break; case Private::ToggleLockFrame: { FramesTableItem *item = dynamic_cast(currentItem()); @@ -551,10 +596,8 @@ void FramesTable::onMenuActionTriggered(QAction * action) { bool ok = false; int size = QInputDialog::getInteger ( 0, tr("Expand frame"), tr("number of frames to enlarge this frame?"), 1, 1, 2000, 1, &ok); - if(ok) { - dfDebug << framePos; emit requestExpandFrame(layerPos, framePos, size); } } diff --git a/src/components/timeline/framestable.h b/src/components/timeline/framestable.h index 7f5a0e2..ca38437 100644 --- a/src/components/timeline/framestable.h +++ b/src/components/timeline/framestable.h @@ -140,6 +140,11 @@ class FramesTable : public QTableWidget void layerSelected(int layerPos); void requestInsertFrame(int layerPos, int framePos); void requestRemoveFrame(int layerPos, int framePos); + + void requestCopyFrame(int layerPos, int framePos); + void requestPasteFrame(int layerPos, int framePos); + void requestCutFrame(int layerPos, int framePos); + void requestChangeFrameVisibility(int layerPos, int framePos, bool isVisible); void requestLockFrame(int layerPos, int framePos, bool locked); void requestExpandFrame(int layerPos, int framePos, int size); diff --git a/src/components/timeline/timeline.cpp b/src/components/timeline/timeline.cpp index 96671c0..1b8272e 100644 --- a/src/components/timeline/timeline.cpp +++ b/src/components/timeline/timeline.cpp @@ -39,6 +39,8 @@ #include "dash/project.h" #include +#include + namespace Dash { namespace Component { @@ -544,6 +546,20 @@ void TimeLine::onEvent(const TimeLineWidget::Event &event ) } } } + case TimeLineWidget::CopyFrame: + { + project()->copyFrameToClipboard(event.scene, event.layer, event.frame); + } + break; + case TimeLineWidget::PasteFrame: + { + project()->pasteFrameFromClipboard(event.scene, event.layer, event.frame); + } + break; + case TimeLineWidget::CutFrame: + { + project()->cutFrame(event.scene, event.layer, event.frame); + } break; case TimeLineWidget::MoveFrameUp: { @@ -562,8 +578,6 @@ void TimeLine::onEvent(const TimeLineWidget::Event &event ) { YAMF::Model::Scene *scene = project()->scene(event.scene); YAMF::Model::Layer *layer = scene->layer(event.layer); - - YAMF::Model::Frame *frame = layer->frame(event.frame); if(frame) @@ -571,8 +585,6 @@ void TimeLine::onEvent(const TimeLineWidget::Event &event ) int nclones = layer->clones(frame); layer->moveFrame(frame->visualIndex(), frame->visualIndex()+nclones+1); } - -// layer->moveFrame(event.frame, event.frame+1); } break; case TimeLineWidget::LockFrame: diff --git a/src/components/timeline/timelinewidget.cpp b/src/components/timeline/timelinewidget.cpp index 9808d28..c451a77 100644 --- a/src/components/timeline/timelinewidget.cpp +++ b/src/components/timeline/timelinewidget.cpp @@ -61,7 +61,6 @@ struct TimeLineWidget::Private event.frame = tl->frame(); return event; } - }; /** @@ -191,6 +190,11 @@ void TimeLineWidget::insertScene(int position, const QString &name) connect(framesTable, SIGNAL(layerSelected(int)), this, SLOT(onLayerSelected(int))); connect(framesTable, SIGNAL(requestInsertFrame(int, int)), this, SLOT(onRequestInsertFrame(int, int))); connect(framesTable, SIGNAL(requestRemoveFrame(int, int)), this, SLOT(onRequestRemoveFrame(int, int))); + + connect(framesTable, SIGNAL(requestCopyFrame(int, int)), this, SLOT(onRequestCopyFrame(int, int))); + connect(framesTable, SIGNAL(requestPasteFrame(int, int)), this, SLOT(onRequestPasteFrame(int, int))); + connect(framesTable, SIGNAL(requestCutFrame(int, int)), this, SLOT(onRequestCutFrame(int, int))); + connect(framesTable, SIGNAL(requestChangeFrameVisibility(int, int, bool)), this, SLOT(onRequestChangeFrameVisibility(int, int, bool))); connect(framesTable, SIGNAL(requestLockFrame(int, int, bool)), this, SLOT(onRequestLockFrame(int, int, bool))); @@ -756,11 +760,45 @@ void TimeLineWidget::onButtonClicked(int action) */ void TimeLineWidget::onRequestInsertFrame(int layerPosition, int framePosition) { + Event e = d->createEvent(this, InsertFrame); + + int lastFrame = 0; + + FramesTable *frames = framesTable(scene()); + if(frames) + { + lastFrame = frames->lastFrameByLayer(e.layer); + } + + int frame = e.frame; + + if(lastFrame < e.frame ) + { + for(int i = lastFrame+1; i < frame+1; i++) + { + e.frame = i; + emit postEvent(e); + } + return; + } + else + { + e.frame++; + } + + emit postEvent(e); +} + +/** + * @internal + */ +void TimeLineWidget::onRequestRemoveFrame(int layerPosition, int framePosition) +{ Event event; event.scene = d->layers.container->currentIndex(); event.layer = layerPosition; event.frame = framePosition; - event.action = InsertFrame; + event.action = RemoveFrame; emit postEvent(event); } @@ -768,13 +806,69 @@ void TimeLineWidget::onRequestInsertFrame(int layerPosition, int framePosition) /** * @internal */ -void TimeLineWidget::onRequestRemoveFrame(int layerPosition, int framePosition) +void TimeLineWidget::onRequestCopyFrame(int layerPosition, int framePosition) { Event event; event.scene = d->layers.container->currentIndex(); event.layer = layerPosition; - event.layer = framePosition; - event.action = RemoveFrame; + event.frame = framePosition; + event.action = CopyFrame; + + emit postEvent(event); +} + +/** + * @internal + */ +void TimeLineWidget::onRequestPasteFrame(int layerPosition, int framePosition) +{ + Event e = d->createEvent(this, PasteFrame); + + int lastFrame = 0; + + FramesTable *frames = framesTable(scene()); + if(frames) + { + lastFrame = frames->lastFrameByLayer(e.layer); + } + + int frame = e.frame; + + if(lastFrame < e.frame ) + { + for(int i = lastFrame+1; i < frame+1; i++) + { + e.frame = i; + emit postEvent(e); + } + return; + } + else + { + e.frame++; + } + + emit postEvent(e); + /* + Event event; + event.scene = d->layers.container->currentIndex(); + event.layer = layerPosition; + event.frame = framePosition; + event.action = PasteFrame; + + emit postEvent(event);*/ +} + +/** + * @internal + */ +void TimeLineWidget::onRequestCutFrame(int layerPosition, int framePosition) +{ + Event event; + event.scene = d->layers.container->currentIndex(); + event.layer = layerPosition; + event.frame = framePosition; + event.action = CutFrame; emit postEvent(event); } diff --git a/src/components/timeline/timelinewidget.h b/src/components/timeline/timelinewidget.h index 569b3d0..64441ff 100644 --- a/src/components/timeline/timelinewidget.h +++ b/src/components/timeline/timelinewidget.h @@ -43,6 +43,9 @@ class TimeLineWidget : public QSplitter enum Action { InsertFrame = 0, RemoveFrame, + CopyFrame, + PasteFrame, + CutFrame, MoveFrameUp, MoveFrameDown, LockFrame, @@ -125,6 +128,11 @@ class TimeLineWidget : public QSplitter void onRequestInsertFrame(int layerPosition, int framePosition); void onRequestRemoveFrame(int layerPosition, int framePosition); + + void onRequestCopyFrame(int layerPosition, int framePosition); + void onRequestPasteFrame(int layerPosition, int framePosition); + void onRequestCutFrame(int layerPosition, int framePosition); + void onRequestLockFrame(int layerPosition, int framePosition, bool locked); void onRequestChangeFrameVisibility(int layerPosition, int framePosition, bool visibility); void onRequestExpandFrame(int layerPosition, int framePosition, int size); diff --git a/src/dashd/main.cpp b/src/dashd/main.cpp index 6ba686a..c16778c 100644 --- a/src/dashd/main.cpp +++ b/src/dashd/main.cpp @@ -50,7 +50,7 @@ int main(int argc, char **argv) { DCore::Debug::setForceDisableGUI(); - DGui::Application app(argc, argv); // Text Item requires X11 + DGui::Application app(argc, argv, false); // Text Item requires X11 app.setApplicationName("dashd"); XDBMS::Manager::self()->initialize("database"); -- 2.11.4.GIT