From 1386b3c50a785bdb87dd06549f474c508fe80955 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 31 Aug 2009 12:14:41 +0000 Subject: [PATCH] Rewrite UI for title animation svn path=/trunk/kdenlive/; revision=3865 --- src/graphicsscenerectmove.cpp | 6 +- src/projectlist.cpp | 2 +- src/titledocument.cpp | 44 ++--- src/titledocument.h | 8 +- src/titlewidget.cpp | 135 ++++++++++--- src/titlewidget.h | 6 +- src/widgets/titlewidget_ui.ui | 352 +++++++++++++++++----------------- 7 files changed, 307 insertions(+), 246 deletions(-) diff --git a/src/graphicsscenerectmove.cpp b/src/graphicsscenerectmove.cpp index 275c2a4d..7cd2e9a3 100644 --- a/src/graphicsscenerectmove.cpp +++ b/src/graphicsscenerectmove.cpp @@ -74,7 +74,7 @@ void GraphicsSceneRectMove::setTool(TITLETOOL tool) void GraphicsSceneRectMove::keyPressEvent(QKeyEvent * keyEvent) { - if (m_selectedItem == NULL) { + if (m_selectedItem == NULL || !(m_selectedItem->flags() & QGraphicsItem::ItemIsMovable)) { QGraphicsScene::keyPressEvent(keyEvent); return; } @@ -165,7 +165,7 @@ void GraphicsSceneRectMove::mousePressEvent(QGraphicsSceneMouseEvent* e) break; } } - if (item == NULL) { + if (item == NULL || !(item->flags() & QGraphicsItem::ItemIsSelectable)) { if (m_selectedItem && m_selectedItem->type() == 8) { // disable text editing QGraphicsTextItem *t = static_cast(m_selectedItem); @@ -182,7 +182,7 @@ void GraphicsSceneRectMove::mousePressEvent(QGraphicsSceneMouseEvent* e) } } } - if (item != NULL) { + if (item != NULL && item->flags() & QGraphicsItem::ItemIsMovable) { m_sceneClickPoint = e->scenePos(); m_selectedItem = item; kDebug() << "///////// ITEM TYPE: " << item->type(); diff --git a/src/projectlist.cpp b/src/projectlist.cpp index 50f2ad79..52e42871 100644 --- a/src/projectlist.cpp +++ b/src/projectlist.cpp @@ -878,7 +878,7 @@ void ProjectList::slotRefreshClipThumbnail(ProjectItem *item, bool update) int height = 50; int width = (int)(height * m_render->dar()); if (clip->clipType() == AUDIO) pix = KIcon("audio-x-generic").pixmap(QSize(width, height)); - else if (clip->clipType() == TEXT || clip->clipType() == IMAGE) pix = KThumb::getFrame(item->referencedClip()->producer(), 0, width, height); + else if (clip->clipType() == IMAGE) pix = KThumb::getFrame(item->referencedClip()->producer(), 0, width, height); else pix = item->referencedClip()->thumbProducer()->extractImage(item->referencedClip()->getClipThumbFrame(), width, height); if (!pix.isNull()) { m_listView->blockSignals(true); diff --git a/src/titledocument.cpp b/src/titledocument.cpp index a402a195..514f3239 100644 --- a/src/titledocument.cpp +++ b/src/titledocument.cpp @@ -47,7 +47,7 @@ void TitleDocument::setScene(QGraphicsScene* _scene, int width, int height) m_height = height; } -QDomDocument TitleDocument::xml(QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv) +QDomDocument TitleDocument::xml(QGraphicsRectItem* startv, QGraphicsRectItem* endv) { QDomDocument doc; @@ -128,18 +128,11 @@ QDomDocument TitleDocument::xml(QGraphicsPolygonItem* startv, QGraphicsPolygonIt if (startv && endv) { QDomElement endp = doc.createElement("endviewport"); QDomElement startp = doc.createElement("startviewport"); - endp.setAttribute("x", endv->data(0).toString()); - endp.setAttribute("y", endv->data(1).toString()); - endp.setAttribute("size", endv->data(2).toString()); - endp.setAttribute("rect", rectFToString(endv->boundingRect())); - - startp.setAttribute("x", startv->data(0).toString()); - startp.setAttribute("y", startv->data(1).toString()); - startp.setAttribute("size", startv->data(2).toString()); - startp.setAttribute("rect", rectFToString(startv->boundingRect())); - - startp.setAttribute("z-index", startv->zValue()); - endp.setAttribute("z-index", endv->zValue()); + QRectF r(endv->pos().x(), endv->pos().y(), endv->rect().width(), endv->rect().height()); + endp.setAttribute("rect", rectFToString(r)); + QRectF r2(startv->pos().x(), startv->pos().y(), startv->rect().width(), startv->rect().height()); + startp.setAttribute("rect", rectFToString(r2)); + main.appendChild(startp); main.appendChild(endp); } @@ -169,7 +162,7 @@ QColor TitleDocument::getBackgroundColor() } -bool TitleDocument::saveDocument(const KUrl& url, QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv, int out) +bool TitleDocument::saveDocument(const KUrl& url, QGraphicsRectItem* startv, QGraphicsRectItem* endv, int out) { if (!m_scene) return false; @@ -192,7 +185,7 @@ bool TitleDocument::saveDocument(const KUrl& url, QGraphicsPolygonItem* startv, return KIO::NetAccess::upload(tmpfile.fileName(), url, 0); } -int TitleDocument::loadFromXml(QDomDocument doc, QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv, int *out) +int TitleDocument::loadFromXml(QDomDocument doc, QGraphicsRectItem* startv, QGraphicsRectItem* endv, int *out) { QDomNodeList titles = doc.elementsByTagName("kdenlivetitle"); //TODO: Check if the opened title size is equal to project size, otherwise warn user and rescale @@ -313,23 +306,14 @@ int TitleDocument::loadFromXml(QDomDocument doc, QGraphicsPolygonItem* startv, Q } } else if (items.item(i).nodeName() == "startviewport" && startv) { QString rect = items.item(i).attributes().namedItem("rect").nodeValue(); - startv->setPolygon(stringToRect(rect)); - int x = items.item(i).attributes().namedItem("x").nodeValue().toInt(); - int y = items.item(i).attributes().namedItem("y").nodeValue().toInt(); - int size = items.item(i).attributes().namedItem("size").nodeValue().toInt(); - startv->setData(0, x); - startv->setData(1, y); - startv->setData(2, size); - //startv->setPos(p); + QRectF r = stringToRect(rect); + startv->setRect(0, 0, r.width(), r.height()); + startv->setPos(r.topLeft()); } else if (items.item(i).nodeName() == "endviewport" && endv) { QString rect = items.item(i).attributes().namedItem("rect").nodeValue(); - endv->setPolygon(stringToRect(rect)); - int x = items.item(i).attributes().namedItem("x").nodeValue().toInt(); - int y = items.item(i).attributes().namedItem("y").nodeValue().toInt(); - int size = items.item(i).attributes().namedItem("size").nodeValue().toInt(); - endv->setData(0, x); - endv->setData(1, y); - endv->setData(2, size); + QRectF r = stringToRect(rect); + endv->setRect(0, 0, r.width(), r.height()); + endv->setPos(r.topLeft()); } } } diff --git a/src/titledocument.h b/src/titledocument.h index 2d006475..8b15bb5f 100644 --- a/src/titledocument.h +++ b/src/titledocument.h @@ -22,7 +22,7 @@ #include class QGraphicsScene; -class QGraphicsPolygonItem; +class QGraphicsRectItem; class TitleDocument { @@ -30,9 +30,9 @@ class TitleDocument public: TitleDocument(); void setScene(QGraphicsScene* scene, int width, int height); - bool saveDocument(const KUrl& url, QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv, int out); - QDomDocument xml(QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv); - int loadFromXml(QDomDocument doc, QGraphicsPolygonItem* startv, QGraphicsPolygonItem* endv, int *out); + bool saveDocument(const KUrl& url, QGraphicsRectItem* startv, QGraphicsRectItem* endv, int out); + QDomDocument xml(QGraphicsRectItem* startv, QGraphicsRectItem* endv); + int loadFromXml(QDomDocument doc, QGraphicsRectItem* startv, QGraphicsRectItem* endv, int *out); /** \brief Get the background color (incl. alpha) from the document, if possibly * \returns The background color of the document, inclusive alpha. If none found, returns (0,0,0,0) */ QColor getBackgroundColor(); diff --git a/src/titlewidget.cpp b/src/titlewidget.cpp index 1dc30385..d6de9291 100644 --- a/src/titlewidget.cpp +++ b/src/titlewidget.cpp @@ -86,12 +86,12 @@ TitleWidget::TitleWidget(KUrl url, Timecode tc, QString projectTitlePath, Render connect(rectBColor, SIGNAL(clicked()), this, SLOT(rectChanged())); connect(rectLineWidth, SIGNAL(valueChanged(int)), this, SLOT(rectChanged())); - connect(startViewportX, SIGNAL(valueChanged(int)), this, SLOT(setupViewports())); + /*connect(startViewportX, SIGNAL(valueChanged(int)), this, SLOT(setupViewports())); connect(startViewportY, SIGNAL(valueChanged(int)), this, SLOT(setupViewports())); connect(startViewportSize, SIGNAL(valueChanged(int)), this, SLOT(setupViewports())); connect(endViewportX, SIGNAL(valueChanged(int)), this, SLOT(setupViewports())); connect(endViewportY, SIGNAL(valueChanged(int)), this, SLOT(setupViewports())); - connect(endViewportSize, SIGNAL(valueChanged(int)), this, SLOT(setupViewports())); + connect(endViewportSize, SIGNAL(valueChanged(int)), this, SLOT(setupViewports()));*/ connect(zValue, SIGNAL(valueChanged(int)), this, SLOT(zIndexChanged(int))); connect(itemzoom, SIGNAL(valueChanged(int)), this, SLOT(itemScaled(int))); @@ -261,18 +261,22 @@ TitleWidget::TitleWidget(KUrl url, Timecode tc, QString projectTitlePath, Render // mbd: load saved settings readChoices(); - initViewports(); graphicsView->show(); //graphicsView->setRenderHint(QPainter::Antialiasing); graphicsView->setInteractive(true); //graphicsView->resize(400, 300); kDebug() << "// TITLE WIDGWT: " << graphicsView->viewport()->width() << "x" << graphicsView->viewport()->height(); //toolBox->setItemEnabled(2, false); + m_startViewport = new QGraphicsRectItem(QRectF(0, 0, m_frameWidth, m_frameHeight)); + m_endViewport = new QGraphicsRectItem(QRectF(0, 0, m_frameWidth, m_frameHeight)); if (!url.isEmpty()) loadTitle(url); else { slotTextTool(); QTimer::singleShot(200, this, SLOT(slotAdjustZoom())); } + initAnimation(); + connect(anim_start, SIGNAL(toggled(bool)), this, SLOT(slotAnimStart(bool))); + connect(anim_end, SIGNAL(toggled(bool)), this, SLOT(slotAnimEnd(bool))); } TitleWidget::~TitleWidget() @@ -360,7 +364,12 @@ void TitleWidget::slotSelectTool() break; } } + enableToolbars(t); + if (t == TITLE_RECTANGLE && (l.at(0) == m_endViewport || l.at(0) == m_startViewport)) { + //graphicsView->centerOn(l.at(0)); + t = TITLE_NONE; + } showToolbars(t); if (l.size() > 0) { @@ -520,11 +529,10 @@ void TitleWidget::displayBackgroundFrame() } } -void TitleWidget::initViewports() +void TitleWidget::initAnimation() { - m_startViewport = new QGraphicsPolygonItem(QPolygonF(QRectF(0, 0, 0, 0))); - m_endViewport = new QGraphicsPolygonItem(QPolygonF(QRectF(0, 0, 0, 0))); - + align_box->setEnabled(false); + align_box->setVisible(false); QPen startpen(Qt::DotLine); QPen endpen(Qt::DashDotLine); startpen.setColor(QColor(100, 200, 100, 140)); @@ -533,9 +541,6 @@ void TitleWidget::initViewports() m_startViewport->setPen(startpen); m_endViewport->setPen(endpen); - startViewportSize->setValue(100); - endViewportSize->setValue(100); - m_startViewport->setZValue(-1000); m_endViewport->setZValue(-1000); @@ -718,24 +723,34 @@ void TitleWidget::selectionChanged() showToolbars(TITLE_RECTANGLE); settingUp = true; QGraphicsRectItem *rec = static_cast (l.at(0)); - toolBox->setCurrentIndex(0); - //toolBox->setItemEnabled(3, true); - rectFAlpha->setValue(rec->pen().color().alpha()); - rectBAlpha->setValue(rec->brush().color().alpha()); - //kDebug() << rec->brush().color().alpha(); - QColor fcol = rec->pen().color(); - QColor bcol = rec->brush().color(); - //fcol.setAlpha(255); - //bcol.setAlpha(255); - rectFColor->setColor(fcol); - rectBColor->setColor(bcol); - settingUp = false; - rectLineWidth->setValue(rec->pen().width()); + if (rec == m_startViewport || rec == m_endViewport) { + toolBox->setCurrentIndex(3); + toolBox->widget(0)->setEnabled(false); + toolBox->widget(1)->setEnabled(false); + enableToolbars(TITLE_NONE); + } + else { + toolBox->widget(0)->setEnabled(true); + toolBox->widget(1)->setEnabled(true); + toolBox->setCurrentIndex(0); + //toolBox->setItemEnabled(3, true); + rectFAlpha->setValue(rec->pen().color().alpha()); + rectBAlpha->setValue(rec->brush().color().alpha()); + //kDebug() << rec->brush().color().alpha(); + QColor fcol = rec->pen().color(); + QColor bcol = rec->brush().color(); + //fcol.setAlpha(255); + //bcol.setAlpha(255); + rectFColor->setColor(fcol); + rectBColor->setColor(bcol); + settingUp = false; + rectLineWidth->setValue(rec->pen().width()); + enableToolbars(TITLE_RECTANGLE); + } updateAxisButtons(l.at(0)); updateCoordinates(rec); updateDimension(rec); - enableToolbars(TITLE_RECTANGLE); } else if (l.at(0)->type() == IMAGEITEM) { showToolbars(TITLE_IMAGE); @@ -1281,7 +1296,7 @@ void TitleWidget::setupViewports() { //double aspect_ratio = 4.0 / 3.0;//read from project //better zoom centered, but render uses only the created rect, so no problem to change the zoom function - QRectF sp(0, 0, startViewportSize->value() * m_frameWidth / 100.0 , startViewportSize->value()* m_frameHeight / 100.0); + /*QRectF sp(0, 0, startViewportSize->value() * m_frameWidth / 100.0 , startViewportSize->value()* m_frameHeight / 100.0); QRectF ep(0, 0, endViewportSize->value() * m_frameWidth / 100.0, endViewportSize->value() * m_frameHeight / 100.0); // use a polygon thiat uses 16:9 and 4:3 rects forpreview the size in all aspect ratios ? QPolygonF spoly(sp); @@ -1298,7 +1313,7 @@ void TitleWidget::setupViewports() m_endViewport->setData(0, endViewportX->value()); m_endViewport->setData(1, endViewportY->value()); m_endViewport->setData(2, endViewportSize->value()); - } + }*/ } void TitleWidget::loadTitle(KUrl url) @@ -1322,6 +1337,7 @@ void TitleWidget::loadTitle(KUrl url) KIO::NetAccess::removeTempFile(tmpfile); } setXml(doc); + /*int out; m_count = m_titledocument.loadDocument(url, m_startViewport, m_endViewport, &out) + 1; adjustFrameSize(); @@ -1342,6 +1358,8 @@ void TitleWidget::loadTitle(KUrl url) void TitleWidget::saveTitle(KUrl url) { + if (anim_start->isChecked()) slotAnimStart(false); + if (anim_end->isChecked()) slotAnimEnd(false); if (url.isEmpty()) url = KFileDialog::getSaveUrl(KUrl(m_projectTitlePath), "application/x-kdenlivetitle", this, i18n("Save Title")); if (!url.isEmpty()) { if (m_titledocument.saveDocument(url, m_startViewport, m_endViewport, m_tc.getFrameCount(title_duration->text())) == false) @@ -1399,12 +1417,12 @@ void TitleWidget::setXml(QDomDocument doc) horizontalSlider->blockSignals(false); kcolorbutton->blockSignals(false); - startViewportX->setValue(m_startViewport->data(0).toInt()); + /*startViewportX->setValue(m_startViewport->data(0).toInt()); startViewportY->setValue(m_startViewport->data(1).toInt()); startViewportSize->setValue(m_startViewport->data(2).toInt()); endViewportX->setValue(m_endViewport->data(0).toInt()); endViewportY->setValue(m_endViewport->data(1).toInt()); - endViewportSize->setValue(m_endViewport->data(2).toInt()); + endViewportSize->setValue(m_endViewport->data(2).toInt());*/ QTimer::singleShot(200, this, SLOT(slotAdjustZoom())); slotSelectTool(); @@ -1461,6 +1479,8 @@ QImage TitleWidget::renderedPixmap() /** \brief Connected to the accepted signal - calls writeChoices */ void TitleWidget::slotAccepted() { + if (anim_start->isChecked()) slotAnimStart(false); + if (anim_end->isChecked()) slotAnimEnd(false); writeChoices(); } @@ -1534,6 +1554,65 @@ void TitleWidget::adjustFrameSize() displayBackgroundFrame(); } +void TitleWidget::slotAnimStart(bool anim) +{ + if (anim && anim_end->isChecked()) { + anim_end->setChecked(false); + m_endViewport->setZValue(-1000); + m_endViewport->setBrush(QBrush()); + } + slotSelectTool(); + QList list = m_scene->items(); + for (int i = 0; i < list.count(); i++) { + list.at(i)->setFlag(QGraphicsItem::ItemIsMovable, !anim); + list.at(i)->setFlag(QGraphicsItem::ItemIsSelectable, !anim); + } + align_box->setEnabled(anim); + frame_toolbar->setEnabled(!anim); + rect_properties->setEnabled(!anim); + if (anim) { + m_startViewport->setZValue(1100); + QColor col = m_startViewport->pen().color(); + col.setAlpha(100); + m_startViewport->setBrush(col); + m_startViewport->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); + } + else { + m_startViewport->setZValue(-1000); + m_startViewport->setBrush(QBrush()); + m_startViewport->setFlags(0); + } + +} +void TitleWidget::slotAnimEnd(bool anim) +{ + if (anim && anim_start->isChecked()) { + anim_start->setChecked(false); + m_startViewport->setZValue(-1000); + m_startViewport->setBrush(QBrush()); + } + slotSelectTool(); + QList list = m_scene->items(); + for (int i = 0; i < list.count(); i++) { + list.at(i)->setFlag(QGraphicsItem::ItemIsMovable, !anim); + list.at(i)->setFlag(QGraphicsItem::ItemIsSelectable, !anim); + } + align_box->setEnabled(anim); + frame_toolbar->setEnabled(!anim); + rect_properties->setEnabled(!anim); + if (anim) { + m_endViewport->setZValue(1100); + QColor col = m_endViewport->pen().color(); + col.setAlpha(100); + m_endViewport->setBrush(col); + m_endViewport->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); + } + else { + m_endViewport->setZValue(-1000); + m_endViewport->setBrush(QBrush()); + m_endViewport->setFlags(0); + } +} diff --git a/src/titlewidget.h b/src/titlewidget.h index 288daa84..af5b289a 100644 --- a/src/titlewidget.h +++ b/src/titlewidget.h @@ -83,9 +83,9 @@ protected: virtual void resizeEvent(QResizeEvent * event); private: - QGraphicsPolygonItem *m_startViewport, *m_endViewport; + QGraphicsRectItem *m_startViewport, *m_endViewport; GraphicsSceneRectMove *m_scene; - void initViewports(); + void initAnimation(); QMap m_transformations; TitleDocument m_titledocument; QGraphicsRectItem *m_frameBorder; @@ -229,6 +229,8 @@ private slots: void slotSelectTool(); void slotImageTool(); + void slotAnimStart(bool); + void slotAnimEnd(bool); /** \brief Called when accepted, stores the user selections for next time use */ void slotAccepted(); diff --git a/src/widgets/titlewidget_ui.ui b/src/widgets/titlewidget_ui.ui index 7bf81640..6f6aafa9 100644 --- a/src/widgets/titlewidget_ui.ui +++ b/src/widgets/titlewidget_ui.ui @@ -7,7 +7,7 @@ 0 0 736 - 515 + 638 @@ -576,6 +576,13 @@ + + + + Qt::Horizontal + + + @@ -585,7 +592,7 @@ - 0 + 2 @@ -593,7 +600,7 @@ 0 0 347 - 140 + 238 @@ -711,8 +718,8 @@ 0 0 - 94 - 65 + 347 + 238 @@ -758,189 +765,178 @@ 0 - -58 - 330 - 198 + 0 + 347 + 238 - Viewport + Animation - + - - - - - StartViewport - - - - - - - - X: - - - - - - - Y: - - - - - - - Size: - - - - - - - -32000 - - - 3200 - - - 10 - - - - - - - -32000 - - - 32000 - - - 10 - - - - - - - 1 - - - 1000 - - - 5 - - - - - - - - - - - - EndViewport - - - - - - - - X: - - - - - - - Y: - - - - - - - Size: - - - - - - - -32000 - - - 32000 - - - 10 - - - - - - - -32000 - - - 32000 - - - 10 - - - - - - - 1 - - - 1000 - - - 5 - - - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - + + + Edit start + + + true + + + + + + + Edit end + + + true + + + + + + + + + + + + + + 0 + 0 + + + + Hor. align + + + + + + + + 0 + 0 + + + + < + + + + + + + + 0 + 0 + + + + | + + + + + + + + 0 + 0 + + + + > + + + + + + + + 0 + 0 + + + + Vert. align + + + + + + + + 0 + 0 + + + + < + + + + + + + + 0 + 0 + + + + | + + + + + + + + 0 + 0 + + + + > + + + + + + + + + + Qt::Vertical + + + + 81 + 120 + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + - - - - Qt::Horizontal - - - -- 2.39.2