From: <tt...@us...> - 2010-08-04 21:39:57
|
Revision: 4683 http://kdenlive.svn.sourceforge.net/kdenlive/?rev=4683&view=rev Author: ttill Date: 2010-08-04 21:39:50 +0000 (Wed, 04 Aug 2010) Log Message: ----------- Introduce very basic geometry editing on the monitor. Has to be enabled in the settings dialog first, but you probably do not want to do this now as it cannot compete with our little red rectangle yet. Modified Paths: -------------- trunk/kdenlive/src/CMakeLists.txt trunk/kdenlive/src/effectstackedit.cpp trunk/kdenlive/src/effectstackedit.h trunk/kdenlive/src/effectstackview.cpp trunk/kdenlive/src/effectstackview.h trunk/kdenlive/src/kdenlivesettings.kcfg trunk/kdenlive/src/mainwindow.cpp trunk/kdenlive/src/monitor.cpp trunk/kdenlive/src/monitor.h trunk/kdenlive/src/transitionsettings.cpp trunk/kdenlive/src/transitionsettings.h trunk/kdenlive/src/widgets/configmisc_ui.ui Added Paths: ----------- trunk/kdenlive/src/geometrywidget.cpp trunk/kdenlive/src/geometrywidget.h trunk/kdenlive/src/monitorscene.cpp trunk/kdenlive/src/monitorscene.h trunk/kdenlive/src/widgets/geometrywidget_ui.ui Modified: trunk/kdenlive/src/CMakeLists.txt =================================================================== --- trunk/kdenlive/src/CMakeLists.txt 2010-08-03 21:25:54 UTC (rev 4682) +++ trunk/kdenlive/src/CMakeLists.txt 2010-08-04 21:39:50 UTC (rev 4683) @@ -98,6 +98,7 @@ widgets/waveform_ui.ui widgets/rgbparade_ui.ui widgets/histogram_ui.ui + widgets/geometrywidget_ui.ui ) set(kdenlive_SRCS @@ -214,6 +215,8 @@ razorgroupcommand.cpp colorpickerwidget.cpp choosecolorwidget.cpp + monitorscene.cpp + geometrywidget.cpp ) Modified: trunk/kdenlive/src/effectstackedit.cpp =================================================================== --- trunk/kdenlive/src/effectstackedit.cpp 2010-08-03 21:25:54 UTC (rev 4682) +++ trunk/kdenlive/src/effectstackedit.cpp 2010-08-04 21:39:50 UTC (rev 4683) @@ -31,6 +31,7 @@ #include "kis_curve_widget.h" #include "kis_cubic_curve.h" #include "choosecolorwidget.h" +#include "geometrywidget.h" #include <KDebug> #include <KLocale> @@ -66,12 +67,13 @@ QMap<QString, QImage> EffectStackEdit::iconCache; -EffectStackEdit::EffectStackEdit(QWidget *parent) : +EffectStackEdit::EffectStackEdit(Monitor *monitor, QWidget *parent) : QScrollArea(parent), m_in(0), m_out(0), m_frameSize(QPoint()), - m_keyframeEditor(NULL) + m_keyframeEditor(NULL), + m_monitor(monitor) { m_baseWidget = new QWidget(this); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); @@ -122,7 +124,7 @@ QString type = pa.attributes().namedItem("type").nodeValue(); QString paramName = i18n(na.toElement().text().toUtf8().data()); - if (type == "geometry") { + if (type == "geometry" && !KdenliveSettings::on_monitor_effects()) { Geometryval *geom = ((Geometryval*)m_valueItems[paramName+"geometry"]); geom->updateTimecodeFormat(); break; @@ -257,15 +259,26 @@ m_valueItems[paramName+"complex"] = pl; connect(pl, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters())); } else if (type == "geometry") { - Geometryval *geo = new Geometryval(m_profile, m_timecode, m_frameSize, pos); - if (minFrame == maxFrame) - geo->setupParam(pa, m_in, m_out); - else - geo->setupParam(pa, minFrame, maxFrame); - m_vbox->addWidget(geo); - m_valueItems[paramName+"geometry"] = geo; - connect(geo, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters())); - connect(geo, SIGNAL(seekToPos(int)), this, SIGNAL(seekTimeline(int))); + if (KdenliveSettings::on_monitor_effects()) { + GeometryWidget *geometry = new GeometryWidget(m_monitor, pos, this); + if (minFrame == maxFrame) + geometry->setupParam(pa, m_in, m_out); + else + geometry->setupParam(pa, minFrame, maxFrame); + m_vbox->addWidget(geometry); + m_valueItems[paramName+"geometry"] = geometry; + connect(geometry, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters())); + } else { + Geometryval *geo = new Geometryval(m_profile, m_timecode, m_frameSize, pos); + if (minFrame == maxFrame) + geo->setupParam(pa, m_in, m_out); + else + geo->setupParam(pa, minFrame, maxFrame); + m_vbox->addWidget(geo); + m_valueItems[paramName+"geometry"] = geo; + connect(geo, SIGNAL(parameterChanged()), this, SLOT(collectAllParameters())); + connect(geo, SIGNAL(seekToPos(int)), this, SIGNAL(seekTimeline(int))); + } } else if (type == "keyframe" || type == "simplekeyframe") { // keyframe editor widget kDebug() << "min: " << m_in << ", MAX: " << m_out; @@ -532,8 +545,13 @@ ComplexParameter *complex = ((ComplexParameter*)m_valueItems.value(paramName)); namenode.item(i) = complex->getParamDesc(); } else if (type == "geometry") { - Geometryval *geom = ((Geometryval*)m_valueItems.value(paramName)); - namenode.item(i).toElement().setAttribute("value", geom->getValue()); + if (KdenliveSettings::on_monitor_effects()) { + GeometryWidget *geometry = ((GeometryWidget*)m_valueItems.value(paramName)); + namenode.item(i).toElement().setAttribute("value", geometry->getValue()); + } else { + Geometryval *geom = ((Geometryval*)m_valueItems.value(paramName)); + namenode.item(i).toElement().setAttribute("value", geom->getValue()); + } } else if (type == "position") { PositionEdit *pedit = ((PositionEdit*)m_valueItems.value(paramName)); int pos = pedit->getPosition(); Modified: trunk/kdenlive/src/effectstackedit.h =================================================================== --- trunk/kdenlive/src/effectstackedit.h 2010-08-03 21:25:54 UTC (rev 4682) +++ trunk/kdenlive/src/effectstackedit.h 2010-08-04 21:39:50 UTC (rev 4683) @@ -39,12 +39,13 @@ }; class QFrame; +class Monitor; class EffectStackEdit : public QScrollArea { Q_OBJECT public: - EffectStackEdit(QWidget *parent); + EffectStackEdit(Monitor *monitor, QWidget *parent = 0); ~EffectStackEdit(); void updateProjectFormat(MltVideoProfile profile, Timecode t); static QMap<QString, QImage> iconCache; @@ -68,6 +69,7 @@ int m_out; QPoint m_frameSize; KeyframeEdit *m_keyframeEditor; + Monitor *m_monitor; public slots: /** \brief Called when an effect is selected, builds the UI for this effect */ Modified: trunk/kdenlive/src/effectstackview.cpp =================================================================== --- trunk/kdenlive/src/effectstackview.cpp 2010-08-03 21:25:54 UTC (rev 4682) +++ trunk/kdenlive/src/effectstackview.cpp 2010-08-04 21:39:50 UTC (rev 4683) @@ -37,12 +37,12 @@ #include <QInputDialog> -EffectStackView::EffectStackView(QWidget *parent) : +EffectStackView::EffectStackView(Monitor *monitor, QWidget *parent) : QWidget(parent) { m_ui.setupUi(this); QVBoxLayout *vbox1 = new QVBoxLayout(m_ui.frame); - m_effectedit = new EffectStackEdit(m_ui.frame); + m_effectedit = new EffectStackEdit(monitor, m_ui.frame); vbox1->setContentsMargins(0, 0, 0, 0); vbox1->setSpacing(0); vbox1->addWidget(m_effectedit); Modified: trunk/kdenlive/src/effectstackview.h =================================================================== --- trunk/kdenlive/src/effectstackview.h 2010-08-03 21:25:54 UTC (rev 4682) +++ trunk/kdenlive/src/effectstackview.h 2010-08-04 21:39:50 UTC (rev 4683) @@ -30,13 +30,14 @@ class EffectsList; class ClipItem; class MltVideoProfile; +class Monitor; class EffectStackView : public QWidget { Q_OBJECT public: - EffectStackView(QWidget *parent = 0); + EffectStackView(Monitor *monitor, QWidget *parent = 0); virtual ~EffectStackView(); /** @brief Raises @param dock if a clip is loaded. */ Added: trunk/kdenlive/src/geometrywidget.cpp =================================================================== --- trunk/kdenlive/src/geometrywidget.cpp (rev 0) +++ trunk/kdenlive/src/geometrywidget.cpp 2010-08-04 21:39:50 UTC (rev 4683) @@ -0,0 +1,163 @@ +/*************************************************************************** + * Copyright (C) 2010 by Till Theato (ro...@tt...) * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + + +#include "geometrywidget.h" +#include "monitor.h" +#include "renderer.h" +#include "monitorscene.h" + +#include <QGraphicsRectItem> + +GeometryWidget::GeometryWidget(Monitor* monitor, int clipPos, QWidget* parent ): + QWidget(parent), + m_monitor(monitor), + m_rect(NULL), + m_geometry(NULL), + m_clipPos(clipPos), + m_inPoint(0), + m_outPoint(1) +{ + m_ui.setupUi(this); + m_scene = monitor->getEffectScene(); + connect(m_scene, SIGNAL(actionFinished()), this, SLOT(slotUpdateGeometry())); + connect(m_scene, SIGNAL(actionFinished()), this, SLOT(slotUpdateProperties())); + + connect(m_monitor->render, SIGNAL(rendererPosition(int)), this, SLOT(slotCheckPosition(int))); + + connect(m_ui.spinX, SIGNAL(valueChanged(int)), this, SLOT(slotSetX(int))); + connect(m_ui.spinY, SIGNAL(valueChanged(int)), this, SLOT(slotSetY(int))); + connect(m_ui.spinWidth, SIGNAL(valueChanged(int)), this, SLOT(slotSetWidth(int))); + connect(m_ui.spinHeight, SIGNAL(valueChanged(int)), this, SLOT(slotSetHeight(int))); +} + +GeometryWidget::~GeometryWidget() +{ + m_monitor->slotEffectScene(false); + m_scene->disconnect(this); + delete m_rect; + delete m_geometry; +} + +QString GeometryWidget::getValue() const +{ + return m_geometry->serialise(); +} + +void GeometryWidget::setupParam(const QDomElement elem, int minframe, int maxframe) +{ + m_inPoint = minframe; + m_outPoint = maxframe; + QString value = elem.attribute("value"); + + char *tmp = (char *) qstrdup(value.toUtf8().data()); + if (m_geometry) + m_geometry->parse(tmp, maxframe - minframe, m_monitor->render->renderWidth(), m_monitor->render->renderHeight()); + else + m_geometry = new Mlt::Geometry(tmp, maxframe - minframe, m_monitor->render->renderWidth(), m_monitor->render->renderHeight()); + delete[] tmp; + + Mlt::GeometryItem item; + + m_geometry->fetch(&item, 0); + delete m_rect; + m_rect = new QGraphicsRectItem(QRectF(0, 0, item.w(), item.h())); + m_rect->setPos(item.x(), item.y()); + m_rect->setZValue(0); + m_rect->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); + + QPen framepen(Qt::DotLine); + framepen.setColor(Qt::yellow); + m_rect->setPen(framepen); + m_rect->setBrush(Qt::transparent); + m_scene->addItem(m_rect); + + slotUpdateProperties(); + slotCheckPosition(m_monitor->render->seekFramePosition()); +} + +void GeometryWidget::slotCheckPosition(int renderPos) +{ + if (renderPos >= m_clipPos && renderPos <= m_clipPos + m_outPoint - m_inPoint) + m_monitor->slotEffectScene(true); + else + m_monitor->slotEffectScene(false); +} + +void GeometryWidget::slotUpdateGeometry() +{ + Mlt::GeometryItem item; + m_geometry->next_key(&item, 0); + + QRectF rectSize = m_rect->rect().normalized(); + QPointF rectPos = m_rect->pos(); + item.x(rectPos.x()); + item.y(rectPos.y()); + item.w(rectSize.width()); + item.h(rectSize.height()); + m_geometry->insert(item); + emit parameterChanged(); +} + +void GeometryWidget::slotUpdateProperties() +{ + QRectF rectSize = m_rect->rect().normalized(); + QPointF rectPos = m_rect->pos(); + + m_ui.spinX->blockSignals(true); + m_ui.spinY->blockSignals(true); + m_ui.spinWidth->blockSignals(true); + m_ui.spinHeight->blockSignals(true); + + m_ui.spinX->setValue(rectPos.x()); + m_ui.spinY->setValue(rectPos.y()); + m_ui.spinWidth->setValue(rectSize.width()); + m_ui.spinHeight->setValue(rectSize.height()); + + m_ui.spinX->blockSignals(false); + m_ui.spinY->blockSignals(false); + m_ui.spinWidth->blockSignals(false); + m_ui.spinHeight->blockSignals(false); +} + +void GeometryWidget::slotSetX(int value) +{ + m_rect->setPos(value, m_ui.spinY->value()); + slotUpdateGeometry(); +} + +void GeometryWidget::slotSetY(int value) +{ + m_rect->setPos(m_ui.spinX->value(), value); + slotUpdateGeometry(); +} + +void GeometryWidget::slotSetWidth(int value) +{ + m_rect->setRect(0, 0, value, m_ui.spinHeight->value()); + slotUpdateGeometry(); +} + +void GeometryWidget::slotSetHeight(int value) +{ + m_rect->setRect(0, 0, m_ui.spinWidth->value(), value); + slotUpdateGeometry(); +} + +#include "geometrywidget.moc" Added: trunk/kdenlive/src/geometrywidget.h =================================================================== --- trunk/kdenlive/src/geometrywidget.h (rev 0) +++ trunk/kdenlive/src/geometrywidget.h 2010-08-04 21:39:50 UTC (rev 4683) @@ -0,0 +1,68 @@ +/*************************************************************************** + * Copyright (C) 2010 by Till Theato (ro...@tt...) * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + + +#ifndef GEOMETRYWIDGET_H +#define GEOMETRYWIDGET_H + +#include "ui_geometrywidget_ui.h" +#include <mlt++/Mlt.h> + +#include <QWidget> + +class QDomElement; +class QGraphicsRectItem; +class Monitor; +class MonitorScene; + +class GeometryWidget : public QWidget +{ + Q_OBJECT +public: + GeometryWidget(Monitor *monitor, int clipPos = 0, QWidget* parent = 0); + virtual ~GeometryWidget(); + QString getValue() const; + +public slots: + void setupParam(const QDomElement elem, int minframe, int maxframe); + +private: + Ui::GeometryWidget_UI m_ui; + int m_clipPos; + int m_inPoint; + int m_outPoint; + Monitor *m_monitor; + MonitorScene *m_scene; + QGraphicsRectItem *m_rect; + Mlt::Geometry *m_geometry; + +private slots: + void slotCheckPosition(int renderPos); + void slotUpdateGeometry(); + void slotUpdateProperties(); + void slotSetX(int value); + void slotSetY(int value); + void slotSetWidth(int value); + void slotSetHeight(int value); + +signals: + void parameterChanged(); +}; + +#endif Modified: trunk/kdenlive/src/kdenlivesettings.kcfg =================================================================== --- trunk/kdenlive/src/kdenlivesettings.kcfg 2010-08-03 21:25:54 UTC (rev 4682) +++ trunk/kdenlive/src/kdenlivesettings.kcfg 2010-08-04 21:39:50 UTC (rev 4683) @@ -39,6 +39,11 @@ <label>Default title clip duration.</label> <default>00:00:05:00</default> </entry> + + <entry name="on_monitor_effects" type="Bool"> + <label>Use on-monitor effects (Warning: experimental).</label> + <default>false</default> + </entry> </group> <group name="project"> Modified: trunk/kdenlive/src/mainwindow.cpp =================================================================== --- trunk/kdenlive/src/mainwindow.cpp 2010-08-03 21:25:54 UTC (rev 4682) +++ trunk/kdenlive/src/mainwindow.cpp 2010-08-04 21:39:50 UTC (rev 4683) @@ -176,18 +176,6 @@ m_projectListDock->setWidget(m_projectList); addDockWidget(Qt::TopDockWidgetArea, m_projectListDock); - m_effectStackDock = new QDockWidget(i18n("Effect Stack"), this); - m_effectStackDock->setObjectName("effect_stack"); - m_effectStack = new EffectStackView(this); - m_effectStackDock->setWidget(m_effectStack); - addDockWidget(Qt::TopDockWidgetArea, m_effectStackDock); - - m_transitionConfigDock = new QDockWidget(i18n("Transition"), this); - m_transitionConfigDock->setObjectName("transition"); - m_transitionConfig = new TransitionSettings(this); - m_transitionConfigDock->setWidget(m_transitionConfig); - addDockWidget(Qt::TopDockWidgetArea, m_transitionConfigDock); - m_clipMonitorDock = new QDockWidget(i18n("Clip Monitor"), this); m_clipMonitorDock->setObjectName("clip_monitor"); m_clipMonitor = new Monitor("clip", m_monitorManager, QString(), this); @@ -210,6 +198,18 @@ connect(m_recMonitor, SIGNAL(showConfigDialog(int, int)), this, SLOT(slotPreferences(int, int))); #endif + m_effectStackDock = new QDockWidget(i18n("Effect Stack"), this); + m_effectStackDock->setObjectName("effect_stack"); + m_effectStack = new EffectStackView(m_projectMonitor, this); + m_effectStackDock->setWidget(m_effectStack); + addDockWidget(Qt::TopDockWidgetArea, m_effectStackDock); + + m_transitionConfigDock = new QDockWidget(i18n("Transition"), this); + m_transitionConfigDock->setObjectName("transition"); + m_transitionConfig = new TransitionSettings(m_projectMonitor, this); + m_transitionConfigDock->setWidget(m_transitionConfig); + addDockWidget(Qt::TopDockWidgetArea, m_transitionConfigDock); + m_effectListDock = new QDockWidget(i18n("Effect List"), this); m_effectListDock->setObjectName("effect_list"); m_effectList = new EffectsListView(); Modified: trunk/kdenlive/src/monitor.cpp =================================================================== --- trunk/kdenlive/src/monitor.cpp 2010-08-03 21:25:54 UTC (rev 4682) +++ trunk/kdenlive/src/monitor.cpp 2010-08-04 21:39:50 UTC (rev 4683) @@ -23,6 +23,7 @@ #include "monitormanager.h" #include "smallruler.h" #include "docclipbase.h" +#include "monitorscene.h" #include "kdenlivesettings.h" #include <KDebug> @@ -39,6 +40,9 @@ #include <QDesktopWidget> #include <QLabel> #include <QIntValidator> +#include <QVBoxLayout> +#include <QGraphicsView> +#include <QGraphicsPixmapItem> Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget *parent) : @@ -161,6 +165,15 @@ #ifndef Q_WS_MAC m_monitorRefresh->show(); #endif + + if (name == "project") { + m_effectScene = new MonitorScene(render); + m_effectView = new QGraphicsView(m_effectScene, m_ui.video_frame); + rendererBox->addWidget(m_effectView); + m_effectScene->setUp(); + m_effectView->hide(); + } + kDebug() << "/////// BUILDING MONITOR, ID: " << m_ui.video_frame->winId(); } @@ -170,6 +183,8 @@ delete m_timePos; delete m_overlay; delete m_monitorRefresh; + delete m_effectView; + delete m_effectScene; delete render; } @@ -367,7 +382,7 @@ void Monitor::mousePressEvent(QMouseEvent * event) { if (event->button() != Qt::RightButton) { - if (m_ui.video_frame->underMouse()) { + if (m_ui.video_frame->underMouse() && !m_effectView->isVisible()) { m_dragStarted = true; m_DragStartPosition = event->pos(); } @@ -378,7 +393,7 @@ void Monitor::mouseReleaseEvent(QMouseEvent * event) { if (m_dragStarted) { - if (m_ui.video_frame->underMouse()) { + if (m_ui.video_frame->underMouse() && !m_effectView->isVisible()) { if (isActive()) slotPlay(); else activateMonitor(); } else QWidget::mouseReleaseEvent(event); @@ -818,6 +833,21 @@ return result; } +void Monitor::slotEffectScene(bool show) +{ + if (m_name == "project") { + m_monitorRefresh->setVisible(!show); + m_effectView->setVisible(show); + if (show) + m_effectScene->slotUpdateBackground(); + } +} + +MonitorScene * Monitor::getEffectScene() +{ + return m_effectScene; +} + MonitorRefresh::MonitorRefresh(QWidget* parent) : \ QWidget(parent), m_renderer(NULL) @@ -832,8 +862,9 @@ m_renderer = render; } -void MonitorRefresh::paintEvent(QPaintEvent * /*event*/) +void MonitorRefresh::paintEvent(QPaintEvent *event) { + Q_UNUSED(event); if (m_renderer) m_renderer->doRefresh(); } Modified: trunk/kdenlive/src/monitor.h =================================================================== --- trunk/kdenlive/src/monitor.h 2010-08-03 21:25:54 UTC (rev 4682) +++ trunk/kdenlive/src/monitor.h 2010-08-04 21:39:50 UTC (rev 4683) @@ -39,13 +39,16 @@ class Render; class SmallRuler; class DocClipBase; +class MonitorScene; +class QGraphicsView; +class QGraphicsPixmapItem; class MonitorRefresh : public QWidget { Q_OBJECT public: - MonitorRefresh(QWidget* parent); - virtual void paintEvent(QPaintEvent * event); + MonitorRefresh(QWidget *parent = 0); + virtual void paintEvent(QPaintEvent *event); void setRenderer(Render* render); private: @@ -83,6 +86,7 @@ void checkOverlay(); void updateTimecodeFormat(); void updateMarkers(DocClipBase *source); + MonitorScene *getEffectScene(); protected: virtual void mousePressEvent(QMouseEvent * event); @@ -123,6 +127,8 @@ QMenu *m_playMenu; QMenu *m_markerMenu; QPoint m_DragStartPosition; + MonitorScene *m_effectScene; + QGraphicsView *m_effectView; #ifdef Q_WS_MAC VideoGLWidget *m_glWidget; #endif @@ -171,6 +177,7 @@ void adjustRulerSize(int length); void setTimePos(const QString &pos); QStringList getZoneInfo() const; + void slotEffectScene(bool show = true); signals: void renderPosition(int); Added: trunk/kdenlive/src/monitorscene.cpp =================================================================== --- trunk/kdenlive/src/monitorscene.cpp (rev 0) +++ trunk/kdenlive/src/monitorscene.cpp 2010-08-04 21:39:50 UTC (rev 4683) @@ -0,0 +1,88 @@ +/*************************************************************************** + * Copyright (C) 2010 by Till Theato (ro...@tt...) * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + + +#include "monitorscene.h" +#include "renderer.h" + +#include <QGraphicsView> +#include <QGraphicsPixmapItem> +#include <QtCore> + +MonitorScene::MonitorScene(Render *renderer, QObject* parent) : + QGraphicsScene(parent), + m_renderer(renderer) +{ +} + +void MonitorScene::setUp() +{ + setBackgroundBrush(QBrush(QColor(0, 0, 255))); + + QPen framepen(Qt::DotLine); + framepen.setColor(Qt::red); + + m_frameBorder = new QGraphicsRectItem(QRectF(0, 0, m_renderer->renderWidth(), m_renderer->renderHeight())); + m_frameBorder->setPen(framepen); + m_frameBorder->setZValue(-9); + m_frameBorder->setBrush(Qt::transparent); + m_frameBorder->setFlags(0); + addItem(m_frameBorder); + + m_lastUpdate.start(); + m_background = new QGraphicsPixmapItem(); + m_background->setZValue(-10); + m_background->setFlags(0); + QPixmap bg(m_renderer->renderWidth(), m_renderer->renderHeight()); + bg.fill(); + m_background->setPixmap(bg); + addItem(m_background); + + connect(m_renderer, SIGNAL(rendererPosition(int)), this, SLOT(slotUpdateBackground())); + connect(m_renderer, SIGNAL(frameUpdated(int)), this, SLOT(slotUpdateBackground())); + slotUpdateBackground(); + views().at(0)->fitInView(m_frameBorder, Qt::KeepAspectRatio); + views().at(0)->centerOn(m_frameBorder); +} + +void MonitorScene::slotUpdateBackground() +{ + if (views().count() > 0 && views().at(0)->isVisible()) { + if (m_lastUpdate.elapsed() > 200) { + m_background->setPixmap(QPixmap::fromImage(m_renderer->extractFrame(m_renderer->seekFramePosition()))); + views().at(0)->fitInView(m_frameBorder, Qt::KeepAspectRatio); + views().at(0)->centerOn(m_frameBorder); + m_lastUpdate.start(); + } + } +} + +void MonitorScene::mousePressEvent(QGraphicsSceneMouseEvent* event) +{ + QGraphicsScene::mousePressEvent(event); +} + + +void MonitorScene::mouseReleaseEvent(QGraphicsSceneMouseEvent* event) +{ + QGraphicsScene::mouseReleaseEvent(event); + emit actionFinished(); +} + +#include "monitorscene.moc" Added: trunk/kdenlive/src/monitorscene.h =================================================================== --- trunk/kdenlive/src/monitorscene.h (rev 0) +++ trunk/kdenlive/src/monitorscene.h 2010-08-04 21:39:50 UTC (rev 4683) @@ -0,0 +1,53 @@ +/*************************************************************************** + * Copyright (C) 2010 by Till Theato (ro...@tt...) * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + + +#ifndef MONITORSCENE_H +#define MONITORSCENE_H + +#include <QGraphicsScene> +#include <QTime> + +class QGraphicsPixmapItem; +class Render; + +class MonitorScene : public QGraphicsScene +{ + Q_OBJECT +public: + MonitorScene(Render *renderer, QObject* parent = 0); + void setUp(); + +protected: + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); + +public slots: + void slotUpdateBackground(); + +private: + Render *m_renderer; + QGraphicsPixmapItem *m_background; + QGraphicsRectItem *m_frameBorder; + QTime m_lastUpdate; +signals: + void actionFinished(); +}; + +#endif Modified: trunk/kdenlive/src/transitionsettings.cpp =================================================================== --- trunk/kdenlive/src/transitionsettings.cpp 2010-08-03 21:25:54 UTC (rev 4682) +++ trunk/kdenlive/src/transitionsettings.cpp 2010-08-04 21:39:50 UTC (rev 4683) @@ -26,14 +26,14 @@ #include <KDebug> -TransitionSettings::TransitionSettings(QWidget* parent) : +TransitionSettings::TransitionSettings(Monitor *monitor, QWidget* parent) : QWidget(parent), m_usedTransition(NULL), m_autoTrackTransition(0) { setupUi(this); QVBoxLayout *vbox1 = new QVBoxLayout(frame); - m_effectEdit = new EffectStackEdit(frame); + m_effectEdit = new EffectStackEdit(monitor, frame); vbox1->setContentsMargins(0, 0, 0, 0); vbox1->setSpacing(0); vbox1->addWidget(m_effectEdit); Modified: trunk/kdenlive/src/transitionsettings.h =================================================================== --- trunk/kdenlive/src/transitionsettings.h 2010-08-03 21:25:54 UTC (rev 4682) +++ trunk/kdenlive/src/transitionsettings.h 2010-08-04 21:39:50 UTC (rev 4683) @@ -26,13 +26,14 @@ class Transition; class EffectsList; class EffectStackEdit; +class Monitor; class TransitionSettings : public QWidget, public Ui::TransitionSettings_UI { Q_OBJECT public: - TransitionSettings(QWidget* parent = 0); + TransitionSettings(Monitor *monitor, QWidget* parent = 0); void raiseWindow(QWidget*); void updateProjectFormat(MltVideoProfile profile, Timecode t, const QList <TrackInfo> info); void updateTimecodeFormat(); Modified: trunk/kdenlive/src/widgets/configmisc_ui.ui =================================================================== --- trunk/kdenlive/src/widgets/configmisc_ui.ui 2010-08-03 21:25:54 UTC (rev 4682) +++ trunk/kdenlive/src/widgets/configmisc_ui.ui 2010-08-04 21:39:50 UTC (rev 4683) @@ -32,7 +32,7 @@ </property> </widget> </item> - <item row="4" column="0" colspan="3"> + <item row="5" column="0" colspan="3"> <widget class="QGroupBox" name="groupBox"> <property name="title"> <string>Default Durations</string> @@ -83,7 +83,7 @@ </layout> </widget> </item> - <item row="5" column="0" colspan="3"> + <item row="6" column="0" colspan="3"> <spacer> <property name="orientation"> <enum>Qt::Vertical</enum> @@ -103,6 +103,13 @@ </property> </widget> </item> + <item row="4" column="0"> + <widget class="QCheckBox" name="kcfg_on_monitor_effects"> + <property name="text"> + <string>Use on-monitor effects (Warning: experimental)</string> + </property> + </widget> + </item> </layout> </widget> <customwidgets> Added: trunk/kdenlive/src/widgets/geometrywidget_ui.ui =================================================================== --- trunk/kdenlive/src/widgets/geometrywidget_ui.ui (rev 0) +++ trunk/kdenlive/src/widgets/geometrywidget_ui.ui 2010-08-04 21:39:50 UTC (rev 4683) @@ -0,0 +1,89 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>GeometryWidget_UI</class> + <widget class="QWidget" name="GeometryWidget_UI"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>256</width> + <height>120</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="1"> + <widget class="QLabel" name="label"> + <property name="text"> + <string>X</string> + </property> + </widget> + </item> + <item row="0" column="2"> + <widget class="QSpinBox" name="spinX"> + <property name="minimum"> + <number>-10000</number> + </property> + <property name="maximum"> + <number>10000</number> + </property> + </widget> + </item> + <item row="1" column="1"> + <widget class="QLabel" name="label_2"> + <property name="text"> + <string>Y</string> + </property> + </widget> + </item> + <item row="2" column="1"> + <widget class="QLabel" name="label_3"> + <property name="text"> + <string>Width</string> + </property> + </widget> + </item> + <item row="3" column="1"> + <widget class="QLabel" name="label_4"> + <property name="text"> + <string>Height</string> + </property> + </widget> + </item> + <item row="1" column="2"> + <widget class="QSpinBox" name="spinY"> + <property name="minimum"> + <number>-10000</number> + </property> + <property name="maximum"> + <number>10000</number> + </property> + </widget> + </item> + <item row="2" column="2"> + <widget class="QSpinBox" name="spinWidth"> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>10000</number> + </property> + </widget> + </item> + <item row="3" column="2"> + <widget class="QSpinBox" name="spinHeight"> + <property name="minimum"> + <number>1</number> + </property> + <property name="maximum"> + <number>10000</number> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections/> +</ui> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |