]> git.sesse.net Git - kdenlive/commitdiff
Introduce very basic geometry editing on the monitor.
authorTill Theato <root@ttill.de>
Wed, 4 Aug 2010 21:39:50 +0000 (21:39 +0000)
committerTill Theato <root@ttill.de>
Wed, 4 Aug 2010 21:39:50 +0000 (21:39 +0000)
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.

svn path=/trunk/kdenlive/; revision=4683

17 files changed:
src/CMakeLists.txt
src/effectstackedit.cpp
src/effectstackedit.h
src/effectstackview.cpp
src/effectstackview.h
src/geometrywidget.cpp [new file with mode: 0644]
src/geometrywidget.h [new file with mode: 0644]
src/kdenlivesettings.kcfg
src/mainwindow.cpp
src/monitor.cpp
src/monitor.h
src/monitorscene.cpp [new file with mode: 0644]
src/monitorscene.h [new file with mode: 0644]
src/transitionsettings.cpp
src/transitionsettings.h
src/widgets/configmisc_ui.ui
src/widgets/geometrywidget_ui.ui [new file with mode: 0644]

index 4e844f0642be454292d220fa95b005265239ae56..8b41476d8ec5d71eead200382f4e7acff52a58b5 100644 (file)
@@ -98,6 +98,7 @@ kde4_add_ui_files(kdenlive_UI
   widgets/waveform_ui.ui
   widgets/rgbparade_ui.ui
   widgets/histogram_ui.ui
+  widgets/geometrywidget_ui.ui
 )
 
 set(kdenlive_SRCS
@@ -214,6 +215,8 @@ set(kdenlive_SRCS
   razorgroupcommand.cpp
   colorpickerwidget.cpp
   choosecolorwidget.cpp
+  monitorscene.cpp
+  geometrywidget.cpp
 )
 
 
index 3e484e012785359b03704ebfb03cd21e49d65b0e..de1aaa6f8c0c6266827d1e1903e5cfff20b913d7 100644 (file)
@@ -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 @@ class Urlval: public QWidget, public Ui::Urlval_UI
 
 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 @@ void EffectStackEdit::updateTimecodeFormat()
         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 @@ void EffectStackEdit::transferParamDesc(const QDomElement d, int pos, int in, in
             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 @@ void EffectStackEdit::collectAllParameters()
             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();
index 6cba4d9b9c75d7c575c9b3e4876ca7d3238fb38c..1ecf626339b4e3fbb3444cc490a8e08758f7e157 100644 (file)
@@ -39,12 +39,13 @@ struct wipeInfo {
 };
 
 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 @@ private:
     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 */
index 6e76a5c0b851b6a790c98339df19783d8b6d63d5..b5d80d0e004ae3b51e0f9bbdba3a182d722aba4a 100644 (file)
 #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);
index 68311d9346876f6b652453c7e3bcbd05f55bffb7..fffed50f7ef3da94b4da773f6f1f46ee31ee05e3 100644 (file)
 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. */
diff --git a/src/geometrywidget.cpp b/src/geometrywidget.cpp
new file mode 100644 (file)
index 0000000..fee08f3
--- /dev/null
@@ -0,0 +1,163 @@
+/***************************************************************************
+ *   Copyright (C) 2010 by Till Theato (root@ttill.de)                     *
+ *                                                                         *
+ *   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"
diff --git a/src/geometrywidget.h b/src/geometrywidget.h
new file mode 100644 (file)
index 0000000..f53278a
--- /dev/null
@@ -0,0 +1,68 @@
+/***************************************************************************
+ *   Copyright (C) 2010 by Till Theato (root@ttill.de)                     *
+ *                                                                         *
+ *   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
index 1e812dcd6868fb8fb50326c8f640d4ab27ad9fe6..ace2e0c266d63c0a8a51c2f0d5c44f6caaff5214 100644 (file)
       <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">
index 78b22affe28d352b5d1577df6f71f7f3b5d9ab4f..ce8ea7eebe9964e70aa039f7422540b8a532477c 100644 (file)
@@ -176,18 +176,6 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
     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 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, QWidget *parent
     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();
index df5d98baf3634b3cc3a217b908568c85512e4374..3b62bc68e75cb8d957877b4fcf83b5e56507ad42 100644 (file)
@@ -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 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget
 #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 @@ Monitor::~Monitor()
     delete m_timePos;
     delete m_overlay;
     delete m_monitorRefresh;
+    delete m_effectView;
+    delete m_effectScene;
     delete render;
 }
 
@@ -367,7 +382,7 @@ void Monitor::slotSetZoneEnd()
 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::mousePressEvent(QMouseEvent * event)
 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 @@ QStringList Monitor::getZoneInfo() const
     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 @@ void MonitorRefresh::setRenderer(Render* render)
     m_renderer = render;
 }
 
-void MonitorRefresh::paintEvent(QPaintEvent * /*event*/)
+void MonitorRefresh::paintEvent(QPaintEvent *event)
 {
+    Q_UNUSED(event);
     if (m_renderer) m_renderer->doRefresh();
 }
 
index 6b0be9d30e4357a5db8e06d0cad7923e12e9af27..afdc611bffd723c25a9f5772d6b8f5c60da7b46b 100644 (file)
@@ -39,13 +39,16 @@ class MonitorManager;
 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 @@ public:
     void checkOverlay();
     void updateTimecodeFormat();
     void updateMarkers(DocClipBase *source);
+    MonitorScene *getEffectScene();
 
 protected:
     virtual void mousePressEvent(QMouseEvent * event);
@@ -123,6 +127,8 @@ private:
     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 @@ public slots:
     void adjustRulerSize(int length);
     void setTimePos(const QString &pos);
     QStringList getZoneInfo() const;
+    void slotEffectScene(bool show = true);
 
 signals:
     void renderPosition(int);
diff --git a/src/monitorscene.cpp b/src/monitorscene.cpp
new file mode 100644 (file)
index 0000000..e52e7e9
--- /dev/null
@@ -0,0 +1,88 @@
+/***************************************************************************
+ *   Copyright (C) 2010 by Till Theato (root@ttill.de)                     *
+ *                                                                         *
+ *   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"
diff --git a/src/monitorscene.h b/src/monitorscene.h
new file mode 100644 (file)
index 0000000..de9dbb0
--- /dev/null
@@ -0,0 +1,53 @@
+/***************************************************************************
+ *   Copyright (C) 2010 by Till Theato (root@ttill.de)                     *
+ *                                                                         *
+ *   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
index 55df15538170bf8ef14f6897f51736bd2fdf9002..9f9437b42dded33b529fcc58b621804c95d4e582 100644 (file)
 
 #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);
index 62b8445a6a1a355701f6fc24d83d1913675db0cc..0a31e2a0550a1ea73fbf9d60f961218e4f41eb3c 100644 (file)
@@ -26,13 +26,14 @@ class Timecode;
 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();
index 5d43df74d34266c824f095286d72bc8237063d59..01f984c8f1723f3e4bc314f2172890019b172ec7 100644 (file)
@@ -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>
      </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>
diff --git a/src/widgets/geometrywidget_ui.ui b/src/widgets/geometrywidget_ui.ui
new file mode 100644 (file)
index 0000000..55daaaf
--- /dev/null
@@ -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>