]> git.sesse.net Git - kdenlive/commitdiff
Progress in clip monitor and project switching
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 30 Dec 2007 21:29:38 +0000 (21:29 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sun, 30 Dec 2007 21:29:38 +0000 (21:29 +0000)
svn path=/branches/KDE4/; revision=1780

22 files changed:
src/CMakeLists.txt
src/customruler.cpp
src/customruler.h
src/kdenlivedoc.cpp
src/kdenlivedoc.h
src/mainwindow.cpp
src/mainwindow.h
src/monitor.cpp
src/monitor.h
src/monitormanager.cpp [new file with mode: 0644]
src/monitormanager.h [new file with mode: 0644]
src/projectitem.cpp
src/projectlist.cpp
src/projectlist.h
src/renderer.cpp
src/renderer.h
src/smallruler.cpp [new file with mode: 0644]
src/smallruler.h [new file with mode: 0644]
src/timecode.cpp
src/timecode.h
src/trackview.cpp
src/widgets/monitor_ui.ui

index 3088830bae81bba8cfc0bdaf8e02e759c42302fd..7ccafdff21c870a6d72b64d3ab34cd2f2f479de5 100644 (file)
@@ -27,6 +27,7 @@ set(kdenlive_SRCS
   main.cpp
   mainwindow.cpp
   customruler.cpp
+  smallruler.cpp
   projectlist.cpp
   projectitem.cpp
   monitor.cpp
@@ -36,6 +37,7 @@ set(kdenlive_SRCS
   trackview.cpp
   docclipbase.cpp
   timecode.cpp
+  monitormanager.cpp
 )
 
 kde4_add_kcfg_files(kdenlive_SRCS GENERATE_MOC kdenlivesettings.kcfgc )
index e7f95c81cf92cd4dc333b3e848812e709f10b321..d05caca3e230e6f02aa43ae8df322569fb8f8aee 100644 (file)
@@ -57,8 +57,8 @@ const int CustomRuler::comboScale[] =
        { 1, 2, 5, 10, 25, 50, 125, 250, 500, 725, 1500, 3000, 6000,
            12000 };
 
-CustomRuler::CustomRuler(QWidget *parent)
-    : KRuler(parent)
+CustomRuler::CustomRuler(Timecode tc, QWidget *parent)
+    : KRuler(parent), m_timecode(tc)
 {
   slotNewOffset(0);
   setRulerMetricStyle(KRuler::Pixel);
@@ -145,7 +145,10 @@ void CustomRuler::paintEvent(QPaintEvent * /*e*/)
      fend = pixelPerMark()*littleMarkDistance();
      if (fend > 5) for ( f=offsetmin; f<offsetmax; f+=fend ) {
          p.drawLine((int)f, LITTLE_MARK_X1, (int)f, LITTLE_MARK_X2);
-        if (fend > 30) p.drawText( (int)f + 2, LABEL_SIZE, QString::number((f - offsetmin) / pixelPerMark() / FRAME_SIZE) );
+        if (fend > 60) {
+         QString lab = m_timecode.getTimecodeFromFrames((int) ((f - offsetmin) / pixelPerMark() / FRAME_SIZE + 0.5));
+         p.drawText( (int)f + 2, LABEL_SIZE, lab );
+        }
      }
    }
    if (showMediumMarks()) {
@@ -153,7 +156,10 @@ void CustomRuler::paintEvent(QPaintEvent * /*e*/)
      fend = pixelPerMark()*mediumMarkDistance();
      if (fend > 5) for ( f=offsetmin; f<offsetmax; f+=fend ) {
          p.drawLine((int)f, MIDDLE_MARK_X1, (int)f, MIDDLE_MARK_X2);
-        if (fend > 30) p.drawText( (int)f + 2, LABEL_SIZE, QString::number((f - offsetmin) / pixelPerMark() / FRAME_SIZE) );
+        if (fend > 60) {
+         QString lab = m_timecode.getTimecodeFromFrames((int) ((f - offsetmin) / pixelPerMark() / FRAME_SIZE + 0.5) );
+         p.drawText( (int)f + 2, LABEL_SIZE, lab );
+        }
      }
    }
    if (showBigMarks()) {
@@ -161,7 +167,14 @@ void CustomRuler::paintEvent(QPaintEvent * /*e*/)
      fend = pixelPerMark()*bigMarkDistance();
      if (fend > 5) for ( f=offsetmin; f<offsetmax; f+=fend ) {
          p.drawLine((int)f, BIG_MARK_X1, (int)f, BIG_MARK_X2);
-        if (fend > 30) p.drawText( (int)f + 2, LABEL_SIZE, QString::number((f - offsetmin) / pixelPerMark() / FRAME_SIZE) );
+        if (fend > 60) {
+         QString lab = m_timecode.getTimecodeFromFrames((int) ((f - offsetmin) / pixelPerMark() / FRAME_SIZE + 0.5) );
+         p.drawText( (int)f + 2, LABEL_SIZE, lab );
+        }
+        else if (((int) (f - offsetmin)) % ((int)(fend * 5)) == 0) {
+           QString lab = m_timecode.getTimecodeFromFrames((int) ((f - offsetmin) / pixelPerMark() / FRAME_SIZE + 0.5) );
+         p.drawText( (int)f + 2, LABEL_SIZE, lab );
+        }
      }
    }
 /*   if (d->showem) {
index 767c58057057631c768cd5266d1a2634d6fadcb5..1d43282906c6b7a3c04ed63cce530c630c6c17cd 100644 (file)
@@ -3,12 +3,14 @@
 
 #include <KRuler>
 
+#include <timecode.h>
+
 class CustomRuler : public KRuler
 {
   Q_OBJECT
   
   public:
-    CustomRuler(QWidget *parent=0);
+    CustomRuler(Timecode tc, QWidget *parent=0);
     virtual void mousePressEvent ( QMouseEvent * event );
     void setPixelPerMark (double rate);
     static const int comboScale[];
@@ -17,6 +19,7 @@ class CustomRuler : public KRuler
 
   private:
     int m_cursorPosition;
+    Timecode m_timecode;
 
   public slots:
     void slotNewValue ( int _value );
index 2792e45a387ae39b38ae9e331bcb414d3c91e1b1..fe53e502edc491e3a1ae2904f45335273798dde8 100644 (file)
 
 #include "kdenlivedoc.h"
 
-KdenliveDoc::KdenliveDoc(KUrl url, double fps, int width, int height, QWidget *parent):QObject(parent), m_url(url), m_projectName(NULL)
+KdenliveDoc::KdenliveDoc(KUrl url, double fps, int width, int height, QWidget *parent):QObject(parent), m_url(url), m_fps(fps), m_width(width), m_height(height), m_projectName(NULL)
 {
   if (!url.isEmpty()) {
     QString tmpFile;
     if(KIO::NetAccess::download(url.path(), tmpFile, parent))
-  {
-    QFile file(tmpFile);
-    m_document.setContent(&file, false);
-    file.close();
-    m_projectName = url.fileName();
+    {
+      QFile file(tmpFile);
+      m_document.setContent(&file, false);
+      file.close();
+      m_projectName = url.fileName();
  
-    KIO::NetAccess::removeTempFile(tmpFile);
-  }
-  else
-  {
-    KMessageBox::error(parent, 
-        KIO::NetAccess::lastErrorString());
+      KIO::NetAccess::removeTempFile(tmpFile);
+    }
+    else
+    {
+      KMessageBox::error(parent, KIO::NetAccess::lastErrorString());
+    }
   }
+  else {
+    // Creating new document
+    QDomElement westley = m_document.createElement("westley");
+    m_document.appendChild(westley);
+    QDomElement doc = m_document.createElement("kdenlivedoc");
+    doc.setAttribute("version", "0.6");
+    westley.appendChild(doc);
+    QDomElement props = m_document.createElement("properties");
+    doc.setAttribute("width", m_width);
+    doc.setAttribute("height", m_height);
+    doc.setAttribute("projectfps", m_fps);
+    doc.appendChild(props);
+    
   }
+  if (fps == 30000.0 / 1001.0 ) m_timecode.setFormat(30, true);
+    else m_timecode.setFormat((int) fps);
 }
 
 KdenliveDoc::~KdenliveDoc()
 {
 }
 
+Timecode  KdenliveDoc::timecode()
+{
+  return m_timecode;
+}
+
 QString KdenliveDoc::documentName()
 {
   return m_projectName;
@@ -68,5 +88,45 @@ QDomNodeList KdenliveDoc::producersList()
   return m_document.elementsByTagName("producer");
 }
 
+void KdenliveDoc::setProducers(QDomElement doc)
+{
+  QDomNode kdenlivedocument = m_document.elementsByTagName("kdenlivedoc").item(0);
+
+  QDomNodeList list = m_document.elementsByTagName("producer");
+  int ct = list.count();
+    kDebug()<<"DELETING CHILD PRODUCERS: "<<ct;
+  for (int i = 0; i < ct; i++) {
+    kdenlivedocument.removeChild(list.item(0));
+   }
+
+  QDomNode n = doc.firstChild();
+  ct = 0;
+  while(!n.isNull()) {
+     QDomElement e = n.toElement(); // try to convert the node to an element.
+     if(!e.isNull() && e.tagName() == "producer") {
+        kdenlivedocument.appendChild(m_document.importNode(e, true));
+       ct++;
+     }
+     n = n.nextSibling();
+  }
+  kDebug()<<"ADDING CHILD PRODS: "<<ct<<"\n";
+  //kDebug()<<m_document.toString();
+}
+
+double KdenliveDoc::fps()
+{
+  return m_fps;
+}
+
+int KdenliveDoc::width()
+{
+  return m_width;
+}
+
+int KdenliveDoc::height()
+{
+  return m_height;
+}
+
 #include "kdenlivedoc.moc"
 
index a8040a51540917076f1d9c4f79f221e60d53a286..29c088612a5eb39d8f51d1178474f993326a445c 100644 (file)
@@ -27,7 +27,7 @@
 #include <kurl.h>
 
 #include "gentime.h"
-
+#include "timecode.h"
 
 class KdenliveDoc:public QObject {
   Q_OBJECT public:
@@ -36,11 +36,20 @@ class KdenliveDoc:public QObject {
     ~KdenliveDoc();
     QString documentName();
     QDomNodeList producersList();
+    double fps();
+    int width();
+    int height();
+    void setProducers(QDomElement doc);
+    Timecode timecode();
 
   private:
     KUrl m_url;
     QDomDocument m_document;
     QString m_projectName;
+    double m_fps;
+    int m_width;
+    int m_height;
+    Timecode m_timecode;
 
   public slots:
     
index 79f8449ea17562299659c80237099e37a7b7b0af..41fc446ec2454f42435efa53f37213ba65a0af92 100644 (file)
@@ -1,6 +1,7 @@
 
 
 #include <QTextStream>
+#include <QTimer>
  
 #include <KApplication>
 #include <KAction>
@@ -25,7 +26,7 @@
  
 MainWindow::MainWindow(QWidget *parent)
     : KXmlGuiWindow(parent),
-      fileName(QString())
+      fileName(QString()), m_activeDocument(NULL)
 {
   m_timelineArea = new KTabWidget(this);
   m_timelineArea->setHoverCloseButton(true);
@@ -33,26 +34,28 @@ MainWindow::MainWindow(QWidget *parent)
   connect(m_timelineArea, SIGNAL(currentChanged (int)), this, SLOT(activateDocument()));
   setCentralWidget(m_timelineArea);
 
+  m_monitorManager = new MonitorManager();
+
   projectListDock = new QDockWidget(i18n("Project Tree"), this);
   projectListDock->setObjectName("project_tree");
-  m_projectList = new ProjectList(NULL, this);
+  m_projectList = new ProjectList(this);
   projectListDock->setWidget(m_projectList);
   addDockWidget(Qt::TopDockWidgetArea, projectListDock);
 
   effectListDock = new QDockWidget(i18n("Effect List"), this);
-  effectListDock->setObjectName("project_tree");
+  effectListDock->setObjectName("effect_list");
   effectList = new KListWidget(this);
   effectListDock->setWidget(effectList);
   addDockWidget(Qt::TopDockWidgetArea, effectListDock);
   
   effectStackDock = new QDockWidget(i18n("Effect Stack"), this);
-  effectStackDock->setObjectName("project_tree");
+  effectStackDock->setObjectName("effect_stack");
   effectStack = new KListWidget(this);
   effectStackDock->setWidget(effectStack);
   addDockWidget(Qt::TopDockWidgetArea, effectStackDock);
   
   transitionConfigDock = new QDockWidget(i18n("Transition"), this);
-  transitionConfigDock->setObjectName("project_tree");
+  transitionConfigDock->setObjectName("transition");
   transitionConfig = new KListWidget(this);
   transitionConfigDock->setWidget(transitionConfig);
   addDockWidget(Qt::TopDockWidgetArea, transitionConfigDock);
@@ -60,34 +63,56 @@ MainWindow::MainWindow(QWidget *parent)
   Mlt::Factory::init(NULL);
 
   clipMonitorDock = new QDockWidget(i18n("Clip Monitor"), this);
-  clipMonitorDock->setObjectName("project_tree");
-  m_clipMonitor = new Monitor("clip", this);
+  clipMonitorDock->setObjectName("clip_monitor");
+  m_clipMonitor = new Monitor("clip", m_monitorManager, this);
   clipMonitorDock->setWidget(m_clipMonitor);
   addDockWidget(Qt::TopDockWidgetArea, clipMonitorDock);
-
+  
   projectMonitorDock = new QDockWidget(i18n("Project Monitor"), this);
-  projectMonitorDock->setObjectName("project_tree");
-  m_projectMonitor = new Monitor("project", this);
+  projectMonitorDock->setObjectName("project_monitor");
+  m_projectMonitor = new Monitor("project", m_monitorManager, this);
   projectMonitorDock->setWidget(m_projectMonitor);
   addDockWidget(Qt::TopDockWidgetArea, projectMonitorDock);
 
   setupActions();
-  tabifyDockWidget (effectListDock, projectListDock);
-  tabifyDockWidget (effectListDock, effectStackDock);
-  tabifyDockWidget (effectListDock, transitionConfigDock);
+  tabifyDockWidget (projectListDock, effectListDock);
+  tabifyDockWidget (projectListDock, effectStackDock);
+  tabifyDockWidget (projectListDock, transitionConfigDock);
+  projectListDock->raise();
 
   tabifyDockWidget (clipMonitorDock, projectMonitorDock);
 
-  connect(m_projectList, SIGNAL(clipSelected(const QDomElement &)), m_projectMonitor, SLOT(slotSetXml(const QDomElement &)));
+  connect(projectMonitorDock, SIGNAL(visibilityChanged (bool)), m_projectMonitor, SLOT(refreshMonitor(bool)));
+  connect(clipMonitorDock, SIGNAL(visibilityChanged (bool)), m_projectMonitor, SLOT(refreshMonitor(bool)));
 
-  connect(m_projectList, SIGNAL(getFileProperties(const KUrl &, uint)), m_projectMonitor->render, SLOT(getFileProperties(const KUrl &, uint)));
 
-  connect(m_projectMonitor->render, SIGNAL(replyGetImage(const KUrl &, int, const QPixmap &, int, int)), m_projectList, SLOT(slotReplyGetImage(const KUrl &, int, const QPixmap &, int, int)));
+  m_monitorManager->initMonitors(m_clipMonitor, m_projectMonitor);
+  connect(m_monitorManager, SIGNAL(connectMonitors ()), this, SLOT(slotConnectMonitors()));
+  connect(m_monitorManager, SIGNAL(raiseClipMonitor (bool)), this, SLOT(slotRaiseMonitor(bool)));
+}
 
-  connect(m_projectMonitor->render, SIGNAL(replyGetFileProperties(const QMap < QString, QString > &, const QMap < QString, QString > &)), m_projectList, SLOT(slotReplyGetFileProperties(const QMap < QString, QString > &, const QMap < QString, QString > &)));
 
+void MainWindow::slotRaiseMonitor(bool clipMonitor)
+{
+  if (clipMonitor) clipMonitorDock->raise();
+  else projectMonitorDock->raise();
 }
+
+void MainWindow::slotConnectMonitors()
+{
+
+  m_projectList->setRenderer(m_clipMonitor->render);
+
+  connect(m_projectList, SIGNAL(clipSelected(const QDomElement &)), m_clipMonitor, SLOT(slotSetXml(const QDomElement &)));
+
+  connect(m_projectList, SIGNAL(getFileProperties(const KUrl &, uint)), m_clipMonitor->render, SLOT(getFileProperties(const KUrl &, uint)));
+
+  connect(m_clipMonitor->render, SIGNAL(replyGetImage(const KUrl &, int, const QPixmap &, int, int)), m_projectList, SLOT(slotReplyGetImage(const KUrl &, int, const QPixmap &, int, int)));
+
+  connect(m_clipMonitor->render, SIGNAL(replyGetFileProperties(const QMap < QString, QString > &, const QMap < QString, QString > &)), m_projectList, SLOT(slotReplyGetFileProperties(const QMap < QString, QString > &, const QMap < QString, QString > &)));
+
+}
+
 void MainWindow::setupActions()
 {
   KAction* clearAction = new KAction(this);
@@ -127,6 +152,8 @@ void MainWindow::newFile()
   KdenliveDoc *doc = new KdenliveDoc(KUrl(), 25, 720, 576);
   TrackView *trackView = new TrackView(doc);
   m_timelineArea->addTab(trackView, "New Project");
+  if (m_timelineArea->count() == 1)
+    connectDocument(doc);
 }
 
 void MainWindow::activateDocument()
@@ -183,8 +210,9 @@ void MainWindow::openFile(const QString &inputFileName) //new
 
 void MainWindow::connectDocument(KdenliveDoc *doc) //changed
 {
-  m_projectList->populate(doc->producersList());
-  //connect(doc, SIGNAL(addClip(QDomElement &)), m_projectList, SLOT(slotAddClip(QDomElement &)));
+  if (m_activeDocument) m_activeDocument->setProducers(m_projectList->producersList());
+  m_projectList->setDocument(doc);
+  m_activeDocument = doc;
 }
 
 
index af93385bb6b6db9c411daadbc5f4766dfefc6ada..463d448f02aa7aab3bc1370f43a3c437e7c01791 100644 (file)
@@ -10,6 +10,7 @@
 
 #include "projectlist.h"
 #include "monitor.h"
+#include "monitormanager.h"
 #include "kdenlivedoc.h"
 
 class MainWindow : public KXmlGuiWindow
@@ -24,6 +25,8 @@ class MainWindow : public KXmlGuiWindow
     KTabWidget* m_timelineArea;
     void setupActions();
     QString fileName;
+    KdenliveDoc *m_activeDocument;
+    MonitorManager *m_monitorManager;
 
     QDockWidget *projectListDock;
     ProjectList *m_projectList;
@@ -52,6 +55,8 @@ class MainWindow : public KXmlGuiWindow
     void saveFileAs();
     void saveFileAs(const QString &outputFileName);
     void slotPreferences();
+    void slotConnectMonitors();
+    void slotRaiseMonitor(bool clipMonitor);
 };
  
 #endif
index bd56f1ac4b8cee7c860b107ad2f41c70f3ffaa71..7bdb3762e89a84cd47414faaddbdfe29a2933de7 100644 (file)
 #include "gentime.h"
 #include "monitor.h"
 
-Monitor::Monitor(QString name, QWidget *parent)
-    : QWidget(parent)
+Monitor::Monitor(QString name, MonitorManager *manager, QWidget *parent)
+    : QWidget(parent), render(NULL), m_monitorManager(manager), m_name(name)
 {
   ui.setupUi(this);
-  if (name == "project") {
-  render = new Render(name, this);
-  render->createVideoXWindow(ui.video_frame->winId(), -1);
+  m_scale = 1;
+  m_ruler = new SmallRuler();
+  QVBoxLayout *layout = new QVBoxLayout;
+  layout->addWidget( m_ruler);
+  ui.ruler_frame->setLayout( layout );
+  //m_ruler->setPixelPerMark(3);
+  connect(m_ruler, SIGNAL(seekRenderer(int)), this, SLOT(slotSeek(int)));
   connect(ui.button_play, SIGNAL(clicked()), this, SLOT(slotOpen()));
   connect(ui.button_rew, SIGNAL(clicked()), this, SLOT(slotRewind()));
   connect(ui.button_play_2, SIGNAL(clicked()), this, SLOT(slotPlay()));
-  }
 }
 
-void Monitor::slotOpen()
+// virtual
+void Monitor::mousePressEvent ( QMouseEvent * event )
+{
+  slotPlay();
+}
+
+// virtual
+void Monitor::wheelEvent ( QWheelEvent * event )
 {
+  render->play(0);
+  if (event->delta() > 0) m_position++;
+  else m_position--;
+  render->seekToFrame(m_position);
+}
 
-render->mltInsertClip(2, GenTime(1, 25), QString("<westley><producer mlt_service=\"colour\" colour=\"red\" in=\"1\" out=\"30\" /></westley>"));
-render->mltInsertClip(2, GenTime(0, 25), QString("<westley><producer mlt_service=\"avformat\" resource=\"/home/one/.vids/clip3e.mpg\" in=\"1\" out=\"300\" /></westley>"));
+void Monitor::slotSeek(int pos)
+{
+  if ( render == NULL ) return;
+  int realPos = ((double) pos) / m_scale;
+  render->seekToFrame(realPos);
+  
+}
+
+void Monitor::seekCursor(int pos)
+{
+  int rulerPos = (int) (pos * m_scale);
+  m_position = pos;
+  //kDebug()<<"seek: "<<pos<<", scale: "<<m_scale<<
+  m_ruler->slotNewValue(rulerPos);
+}
+
+void Monitor::rendererStopped(int pos)
+{
+  int rulerPos = (int) (pos * m_scale);
+  m_ruler->slotNewValue(rulerPos);
+  ui.button_play_2->setChecked(false);
+}
+
+void Monitor::initMonitor()
+{
+  if ( render ) return;
+  render = new Render(m_name, this);
+  render->createVideoXWindow(ui.video_frame->winId(), -1);
+  connect(render, SIGNAL(playListDuration(int)), this, SLOT(adjustRulerSize(int)));
+  connect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
+  connect(render, SIGNAL(rendererStopped(int)), this, SLOT(rendererStopped(int)));
+  int width = m_ruler->width();
+  m_ruler->setLength(width);
+  m_ruler->setMaximum(width);
+  m_length = 0;
+}
+
+// virtual
+void Monitor::resizeEvent ( QResizeEvent * event )
+{
+  adjustRulerSize(-1);
+  if (render) render->askForRefresh();
+}
+
+void Monitor::adjustRulerSize(int length)
+{
+  int width = m_ruler->width();
+  m_ruler->setLength(width);
+  if (length > 0) m_length = length;
+  m_scale = (double) width / m_length;
+  if (m_scale == 0) m_scale = 1;
+  kDebug()<<"RULER WIDT: "<<width<<", RENDER LENGT: "<<m_length<<", SCALE: "<<m_scale;
+  m_ruler->setPixelPerMark(m_scale);
+  m_ruler->setMaximum(width);
+  //m_ruler->setLength(length);
+}
+
+void Monitor::stop()
+{
+  if (render) render->stop();
+}
+
+void Monitor::start()
+{
+  if (render) render->start();
+}
+
+void Monitor::refreshMonitor(bool visible)
+{
+  if (visible && render) render->askForRefresh();
+}
+
+void Monitor::slotOpen()
+{
+  if ( render == NULL ) return;
+  render->mltInsertClip(2, GenTime(1, 25), QString("<westley><producer mlt_service=\"colour\" colour=\"red\" in=\"1\" out=\"30\" /></westley>"));
+  render->mltInsertClip(2, GenTime(0, 25), QString("<westley><producer mlt_service=\"avformat\" resource=\"/home/one/.vids/clip3e.mpg\" in=\"1\" out=\"300\" /></westley>"));
 }
 
 void Monitor::slotRewind()
 {
+  if ( render == NULL ) return;
+  m_monitorManager->activateMonitor(m_name);
   render->seek(GenTime(0));
-
 }
 
 void Monitor::slotPlay()
 {
+  if ( render == NULL ) return;
+  m_monitorManager->activateMonitor(m_name);
   render->switchPlay();
+  ui.button_play_2->setChecked(true);
 }
 
 void Monitor::slotSetXml(const QDomElement &e)
 {
+    if ( render == NULL ) return;
+    m_monitorManager->activateMonitor(m_name);
     QDomDocument doc;
     QDomElement westley = doc.createElement("westley");
     doc.appendChild(westley);
     westley.appendChild(e);
     render->setSceneList(doc, 0);
+    m_ruler->slotNewValue(0);
+    m_position = 0;
 }
 
 
 void Monitor::slotOpenFile(const QString &file)
 {
+    if ( render == NULL ) return;
+    m_monitorManager->activateMonitor(m_name);
     QDomDocument doc;
     QDomElement westley = doc.createElement("westley");
     doc.appendChild(westley);
index 9ca51b9c61d6be2cac164e28b2ec3b095a195b1a..461bd8720ec5b23c761faefb8e92234dd5345e47 100644 (file)
@@ -1,29 +1,50 @@
 #ifndef MONITOR_H
 #define MONITOR_H
 
-#include <KListWidget>
 #include "ui_monitor_ui.h"
 #include "renderer.h"
+#include "monitormanager.h"
+#include "smallruler.h"
+
+class MonitorManager;
 
 class Monitor : public QWidget
 {
   Q_OBJECT
   
   public:
-    Monitor(QString name, QWidget *parent=0);
+    Monitor(QString name, MonitorManager *manager, QWidget *parent=0);
     Render *render;
+    virtual void resizeEvent ( QResizeEvent * event );
+  protected:
+    virtual void mousePressEvent ( QMouseEvent * event );
+    virtual void wheelEvent ( QWheelEvent * event );
 
   private:
     Ui::Monitor_UI ui;
+    MonitorManager *m_monitorManager;
+    QString m_name;
+    double m_scale;
+    int m_length;
+    int m_position;
+    SmallRuler *m_ruler;
 
   private slots:
     void slotPlay();
     void slotOpen();
     void slotRewind();
+    void adjustRulerSize(int length);
+    void seekCursor(int pos);
+    void rendererStopped(int pos);
+    void slotSeek(int pos);
 
   public slots:
     void slotOpenFile(const QString &);
     void slotSetXml(const QDomElement &e);
+    void initMonitor();
+    void refreshMonitor(bool visible);
+    void stop();
+    void start();
 };
 
 #endif
diff --git a/src/monitormanager.cpp b/src/monitormanager.cpp
new file mode 100644 (file)
index 0000000..50be9d6
--- /dev/null
@@ -0,0 +1,51 @@
+#include <QObject>
+#include <QTimer>
+
+#include "monitormanager.h"
+
+MonitorManager::MonitorManager(QWidget *parent)
+    : QObject(parent)
+{
+
+
+}
+
+void MonitorManager::initMonitors(Monitor *clipMonitor, Monitor *projectMonitor)
+{
+  m_clipMonitor = clipMonitor;
+  m_projectMonitor = projectMonitor;
+  QTimer::singleShot(750, this, SLOT(initClipMonitor()));
+}
+
+void MonitorManager::initClipMonitor()
+{
+  m_clipMonitor->initMonitor();
+  QTimer::singleShot(1500, this, SLOT(initProjectMonitor()));
+}
+
+void MonitorManager::initProjectMonitor()
+{
+  m_clipMonitor->stop();
+  m_projectMonitor->initMonitor();
+  activateMonitor("project");
+  emit connectMonitors();
+}
+
+void MonitorManager::activateMonitor(QString name)
+{
+  if (m_activeMonitor == name) return;
+  if (name == "clip") {
+    m_projectMonitor->stop();
+    m_clipMonitor->start();
+    emit raiseClipMonitor(true);
+  }
+  else {
+    m_clipMonitor->stop();
+    m_projectMonitor->start();
+    m_projectMonitor->raise();
+    emit raiseClipMonitor(false);
+  }
+  m_activeMonitor = name;
+}
+
+#include "monitormanager.moc"
diff --git a/src/monitormanager.h b/src/monitormanager.h
new file mode 100644 (file)
index 0000000..00979c4
--- /dev/null
@@ -0,0 +1,33 @@
+#ifndef MONITORMANAGER_H
+#define MONITORMANAGER_H
+
+#include "monitor.h"
+
+class Monitor;
+
+class MonitorManager : public QObject
+{
+  Q_OBJECT
+  
+  public:
+    MonitorManager(QWidget *parent=0);
+
+    void initMonitors(Monitor *clipMonitor, Monitor *projectMonitor);
+    void activateMonitor(QString name);
+
+  private:
+    Monitor *m_clipMonitor;
+    Monitor *m_projectMonitor;
+    QString m_activeMonitor;
+
+  private slots:
+    void initProjectMonitor();
+    void initClipMonitor();
+
+  signals:
+    void connectMonitors();
+    void raiseClipMonitor(bool);
+
+};
+
+#endif
index 97595eb7bb71cc1b8b1e7291ab594b4a71848cf1..eb2c3c95bff6df5018599b3d510f9b417aa8f60f 100644 (file)
@@ -53,6 +53,7 @@ void ProjectItem::slotSetToolTip()
       break;
     case 4:
       tip.append(i18n("Color clip"));
+      setData(1, DurationRole, Timecode::getEasyTimecode(GenTime(m_element.attribute("out", "250").toInt(), 25), 25));
       break;
     case 5:
       tip.append(i18n("Image clip"));
index e0e29237f9342ba05e9d0fc012152dd9ce468dc4..953d96209799cdb0a475efd8409657815f933930 100644 (file)
@@ -3,17 +3,16 @@
 #include <QStylePainter>
 #include <QPixmap>
 #include <QIcon>
-#include <QToolBar>
 #include <QDialog>
 
 #include <KDebug>
 #include <KAction>
 #include <KLocale>
 #include <KFileDialog>
-#include <klistwidgetsearchline.h>
 
 #include "projectlist.h"
 #include "projectitem.h"
+#include "kdenlivesettings.h"
 #include "ui_colorclip_ui.h"
 
 #include <QtGui>
@@ -34,16 +33,29 @@ void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIn
 {
   if (index.column() == 1)
   {
-    QFont font = painter->font();
-    font.setPointSize(font.pointSize() - 2 );
+    const bool hover = option.state & (QStyle::State_Selected|QStyle::State_MouseOver|QStyle::State_HasFocus);
     QRect r1 = option.rect;
-    r1.setBottom(r1.y() + (r1.height() *2 / 3 ));
+    painter->save();
+    if (hover) {
+        painter->setPen(option.palette.color(QPalette::HighlightedText));
+        QColor backgroundColor = option.palette.color(QPalette::Highlight);
+        painter->setBrush(QBrush(backgroundColor));
+       painter->fillRect(r1, QBrush(backgroundColor));
+    }
+    QFont font = painter->font();
+    font.setPointSize(font.pointSize() - 1 );
+    font.setBold(true);
+    painter->setFont(font);
+    int mid = (int) ((r1.height() / 2 ));
+    r1.setBottom(r1.y() + mid);
     QRect r2 = option.rect;
-    r2.setTop(r2.y() + (r2.height() *2 / 3 ));
-    painter->drawText(r1, Qt::AlignLeft | Qt::AlignVCenter , index.data().toString());
-    painter->setPen(Qt::green);
-    painter->drawText(r2, Qt::AlignLeft | Qt::AlignTop , index.data(DurationRole).toString());
-    painter->setPen(Qt::black);
+    r2.setTop(r2.y() + mid);
+    painter->drawText(r1, Qt::AlignLeft | Qt::AlignBottom , index.data().toString());
+    //painter->setPen(Qt::green);
+    font.setBold(false);
+    painter->setFont(font);
+    painter->drawText(r2, Qt::AlignLeft | Qt::AlignVCenter , index.data(DurationRole).toString());
+    painter->restore();
   }
   else
   {
@@ -53,8 +65,8 @@ void paint(QPainter* painter, const QStyleOptionViewItem& option, const QModelIn
 };
 
 
-ProjectList::ProjectList(Render *projectRender, QWidget *parent)
-    : QWidget(parent), m_render(projectRender)
+ProjectList::ProjectList(QWidget *parent)
+    : QWidget(parent), m_render(NULL), m_fps(-1)
 {
 
   QWidget *vbox = new QWidget;
@@ -63,14 +75,14 @@ ProjectList::ProjectList(Render *projectRender, QWidget *parent)
 
   // setup toolbar
   searchView = new KTreeWidgetSearchLine (this);
-  QToolBar *bar = new QToolBar("projectToolBar", this);
-  bar->addWidget (searchView);
+  m_toolbar = new QToolBar("projectToolBar", this);
+  m_toolbar->addWidget (searchView);
 
-  QToolButton *addButton = new QToolButton( bar );
+  QToolButton *addButton = new QToolButton( m_toolbar );
   QMenu *addMenu = new QMenu(this);
   addButton->setMenu( addMenu );
   addButton->setPopupMode(QToolButton::MenuButtonPopup);
-  bar->addWidget (addButton);
+  m_toolbar->addWidget (addButton);
   
   QAction *addClip = addMenu->addAction (KIcon("document-new"), i18n("Add Clip"));
   connect(addClip, SIGNAL(triggered()), this, SLOT(slotAddClip()));
@@ -78,28 +90,25 @@ ProjectList::ProjectList(Render *projectRender, QWidget *parent)
   QAction *addColorClip = addMenu->addAction (KIcon("document-new"), i18n("Add Color Clip"));
   connect(addColorClip, SIGNAL(triggered()), this, SLOT(slotAddColorClip()));
 
-  QAction *deleteClip = bar->addAction (KIcon("edit-delete"), i18n("Delete Clip"));
+  QAction *deleteClip = m_toolbar->addAction (KIcon("edit-delete"), i18n("Delete Clip"));
   connect(deleteClip, SIGNAL(triggered()), this, SLOT(slotRemoveClip()));
 
-  QAction *editClip = bar->addAction (KIcon("document-properties"), i18n("Edit Clip"));
+  QAction *editClip = m_toolbar->addAction (KIcon("document-properties"), i18n("Edit Clip"));
   connect(editClip, SIGNAL(triggered()), this, SLOT(slotEditClip()));
 
   addButton->setDefaultAction( addClip );
 
-  layout->addWidget( bar );
+  layout->addWidget( m_toolbar );
   layout->addWidget( listView );
   setLayout( layout );
+  m_toolbar->setEnabled(false);
 
   searchView->setTreeWidget(listView);
   listView->setColumnCount(3);
   QStringList headers;
   headers<<i18n("Thumbnail")<<i18n("Filename")<<i18n("Description");
   listView->setHeaderLabels(headers);
-
-  QStringList itemEntry;
-  itemEntry.append(QString::null);
-  itemEntry.append("coucou");
-  new ProjectItem(listView, itemEntry);
+  listView->sortByColumn(1, Qt::AscendingOrder);
 
   connect(listView, SIGNAL(itemSelectionChanged()), this, SLOT(slotClipSelected()));
   //connect(listView, SIGNAL(itemDoubleClicked ( QTreeWidgetItem *, int )), this, SLOT(slotEditClip(QTreeWidgetItem *, int)));
@@ -116,14 +125,6 @@ void ProjectList::setRenderer(Render *projectRender)
   m_render = projectRender;
 }
 
-void ProjectList::slotDoubleClicked(QListWidgetItem *item, const QPoint &pos)
-{
-  kDebug()<<" / / / DBL CLICK";
-  if (item) {
-    KUrl url = KFileDialog::getOpenUrl( KUrl(), "video/mpeg");
-  }
-}
-
 void ProjectList::slotClipSelected()
 {
   ProjectItem *item = (ProjectItem*) listView->currentItem();
@@ -146,18 +147,20 @@ void ProjectList::slotAddClip()
 {
    
   KUrl::List list = KFileDialog::getOpenUrls( KUrl(), "application/vnd.kde.kdenlive application/vnd.westley.scenelist application/flv application/vnd.rn-realmedia video/x-dv video/x-msvideo video/mpeg video/x-ms-wmv audio/x-mp3 audio/x-wav application/ogg *.m2t *.dv video/mp4 video/quicktime image/gif image/jpeg image/png image/x-bmp image/svg+xml image/tiff image/x-xcf-gimp image/x-vnd.adobe.photoshop image/x-pcx image/x-exr");
-
+  if (list.isEmpty()) return;
   KUrl::List::Iterator it;
   KUrl url;
-       
+  ProjectItem *item;
+
   for (it = list.begin(); it != list.end(); it++) {
       QStringList itemEntry;
       itemEntry.append(QString::null);
       itemEntry.append((*it).fileName());
-      ProjectItem *item = new ProjectItem(listView, itemEntry, QDomElement());
+      item = new ProjectItem(listView, itemEntry, QDomElement());
       item->setData(1, FullPathRole, (*it).path());
       emit getFileProperties((*it), 0);
   }
+  listView->setCurrentItem(item);
 }
 
 void ProjectList::slotAddColorClip()
@@ -166,6 +169,7 @@ void ProjectList::slotAddColorClip()
   Ui::ColorClip_UI *dia_ui = new Ui::ColorClip_UI();
   dia_ui->setupUi(dia);
   dia_ui->clip_name->setText(i18n("Color Clip"));
+  dia_ui->clip_duration->setText(KdenliveSettings::color_duration());
   if (dia->exec() == QDialog::Accepted)
   {
     QDomDocument doc;
@@ -175,6 +179,9 @@ void ProjectList::slotAddColorClip()
     color = color.replace(0, 1, "0x") + "ff";
     element.setAttribute("colour", color);
     element.setAttribute("type", (int) DocClipBase::COLOR);
+    element.setAttribute("in", "0");
+    element.setAttribute("out", m_timecode.getFrameCount(dia_ui->clip_duration->text(), m_fps));
+    element.setAttribute("name", dia_ui->clip_name->text());
     QStringList itemEntry;
     itemEntry.append(QString::null);
     itemEntry.append(dia_ui->clip_name->text());
@@ -182,7 +189,7 @@ void ProjectList::slotAddColorClip()
     QPixmap pix(60, 40);
     pix.fill(dia_ui->clip_color->color());
     item->setIcon(0, QIcon(pix));
-
+    listView->setCurrentItem(item);
     
   }
   delete dia_ui;
@@ -197,13 +204,39 @@ void ProjectList::slotAddColorClip()
   }*/
 }
 
-void ProjectList::populate(QDomNodeList prods)
+void ProjectList::setDocument(KdenliveDoc *doc)
 {
+  m_fps = doc->fps();
+  m_timecode = doc->timecode();
+
+  QDomNodeList prods = doc->producersList();
   listView->clear();
   for (int i = 0; i <  prods.count () ; i++)
   {
     addProducer(prods.item(i).toElement());
   }
+  QTreeWidgetItem *first = listView->topLevelItem(0);
+  if (first) listView->setCurrentItem(first);
+  m_toolbar->setEnabled(true);
+}
+
+QDomElement ProjectList::producersList()
+{
+  QDomDocument doc;
+  QDomElement prods = doc.createElement("producerlist");
+  doc.appendChild(prods);
+  QTreeWidgetItem *parent = 0;
+  int count =
+    parent ? parent->childCount() : listView->topLevelItemCount();
+
+  for (int i = 0; i < count; i++)
+  {
+    QTreeWidgetItem *item =
+      parent ? parent->child(i) : listView->topLevelItem(i);
+    prods.appendChild(doc.importNode(((ProjectItem *)item)->toXml(), true));
+  }
+  //kDebug()<<"PRODUCERS: \n"<<doc.toString();
+  return prods;
 }
 
 void ProjectList::slotReplyGetFileProperties(const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata)
@@ -257,7 +290,6 @@ void ProjectList::addProducer(QDomElement producer)
       itemEntry.append(QString::null);
       itemEntry.append(resource.fileName());
       ProjectItem *item = new ProjectItem(listView, itemEntry, producer);
-      //item->setIcon(0, Render::getVideoThumbnail(resource, 0, 60, 40));
       item->setData(1, FullPathRole, resource.path());
       item->setData(1, ClipTypeRole, (int) type);
       emit getFileProperties(resource, producer.attribute("frame_thumbnail", 0).toInt());
index 584add301f4819832cc9b9664bdbb7542028cfcd..3a7daf927b55ec8eface71f274852b956100770e 100644 (file)
@@ -2,33 +2,42 @@
 #define PRJECTLIST_H
 
 #include <QDomNodeList>
+#include <QToolBar>
+
 #include <QTreeWidget>
 #include <KTreeWidgetSearchLine>
 
 #include "docclipbase.h"
+#include "kdenlivedoc.h"
 #include "renderer.h"
+#include "timecode.h"
 
 class ProjectList : public QWidget
 {
   Q_OBJECT
   
   public:
-    ProjectList(Render *projectRender, QWidget *parent=0);
+    ProjectList(QWidget *parent=0);
+
+    QDomElement producersList();
+    void setRenderer(Render *projectRender);
 
   public slots:
-    void populate(QDomNodeList prods);
+    void setDocument(KdenliveDoc *doc);
     void addProducer(QDomElement producer);
-    void setRenderer(Render *projectRender);
     void slotReplyGetImage(const KUrl &url, int pos, const QPixmap &pix, int w, int h);
     void slotReplyGetFileProperties(const QMap < QString, QString > &properties, const QMap < QString, QString > &metadata);
 
+
   private:
     QTreeWidget *listView;
     KTreeWidgetSearchLine *searchView;
     Render *m_render;
+    Timecode m_timecode;
+    double m_fps;
+    QToolBar *m_toolbar;
 
   private slots:
-    void slotDoubleClicked(QListWidgetItem *, const QPoint &);
     void slotAddClip();
     void slotRemoveClip();
     void slotEditClip();
index 32b328e7a6ece9c0ab48cdeadd6c1eeb4a8c5b1e..a9081928c81cec058f96399af903c3b3f682964e 100644 (file)
@@ -46,7 +46,7 @@ extern "C" {
 Render::Render(const QString & rendererName, QWidget *parent):QObject(parent), m_name(rendererName), m_mltConsumer(NULL), m_mltProducer(NULL), m_mltTextProducer(NULL), m_sceneList(QDomDocument()), m_winid(-1), m_framePosition(0), m_generateScenelist(false), isBlocked(true)
 {
     refreshTimer = new QTimer( this );
-    connect( refreshTimer, SIGNAL(timeout()), this, SLOT(refresh()) );
+    connect( refreshTimer, SIGNAL(timeout()), this, SLOT( refresh()) );
 
     m_connectTimer = new QTimer( this );
     connect( m_connectTimer, SIGNAL(timeout()), this, SLOT(connectPlaylist()) );
@@ -593,12 +593,16 @@ void Render::setSceneList(QDomDocument list, int position)
         if (!m_mltConsumer) {
            restartConsumer();
         }
-
+       emit playListDuration( (int) m_mltProducer->get_playtime());
        m_connectTimer->start( 500 );
        m_generateScenelist = false;
   
 }
 
+const double Render::fps() const
+{
+    return m_fps;
+}
 
 void Render::connectPlaylist() {
         kDebug()<<"**************  CONNECTING PLAYLIST";
@@ -798,10 +802,19 @@ void Render::sendSeekCommand(GenTime time)
     refresh();
 }
 
+void Render::seekToFrame(int pos)
+{
+    if (!m_mltProducer)
+       return;
+    //kDebug()<<"//////////  KDENLIVE SEEK: "<<(int) (time.frames(m_fps));
+    m_mltProducer->seek(pos);
+    refresh();
+}
+
 void Render::askForRefresh()
 {
     // Use a Timer so that we don't refresh too much
-    refreshTimer->start(200 );
+    refreshTimer->start( 200 );
 }
 
 void Render::refresh()
@@ -848,9 +861,10 @@ const QString & Render::rendererName() const
 
 void Render::emitFrameNumber(double position)
 {
-      kDebug()<<"// POSITON: "<<m_framePosition;
+      //kDebug()<<"// POSITON: "<<m_framePosition;
        if (m_generateScenelist) return;
        m_framePosition = position;
+       emit rendererPosition((int) position);
         //if (qApp->activeWindow()) QApplication::postEvent(qApp->activeWindow(), new PositionChangeEvent( GenTime((int) position, m_fps), m_monitorId));
 }
 
@@ -859,6 +873,7 @@ void Render::emitConsumerStopped()
     // This is used to know when the playing stopped
     if (m_mltProducer && !m_generateScenelist) {
        double pos = m_mltProducer->position();
+       emit rendererStopped((int) pos);
         //if (qApp->activeWindow()) QApplication::postEvent(qApp->activeWindow(), new PositionChangeEvent(GenTime((int) pos, m_fps), m_monitorId + 100));
        //new QCustomEvent(10002));
     }
index 5d7826fbd8919a6d0632a22535f03b9475dee4a7..7e00c8ac92eb8acb1904284b1f35906e937d32e8 100644 (file)
@@ -73,6 +73,7 @@ class Render:public QObject {
     void createVideoXWindow(WId winid, WId externalMonitor);
        /** Seeks the renderer clip to the given time. */
     void seek(GenTime time);
+    void seekToFrame(int pos);
     
     static QPixmap getVideoThumbnail(QString file, int frame, int width, int height);
     QPixmap getImageThumbnail(KUrl url, int width, int height);
@@ -148,6 +149,7 @@ class Render:public QObject {
     QDomDocument sceneList() const;
     int resetRendererProfile(char * profile);
     bool isBlocked;
+    const double fps() const;
 
     /** Playlist manipulation */
     void mltInsertClip(int track, GenTime position, QString resource);
@@ -232,6 +234,9 @@ class Render:public QObject {
        /** Emitted when an error occurs within this renderer. */
     void error(const QString &, const QString &);
     void durationChanged();
+    void playListDuration(int);
+    void rendererPosition(int);
+    void rendererStopped(int);
 
     
     public slots:              // Public slots
diff --git a/src/smallruler.cpp b/src/smallruler.cpp
new file mode 100644 (file)
index 0000000..62b3baa
--- /dev/null
@@ -0,0 +1,127 @@
+
+#include <QMouseEvent>
+#include <QStylePainter>
+
+#include <KDebug>
+
+#define LITTLE_MARK_X2 15
+#define LITTLE_MARK_X1 13
+#define MIDDLE_MARK_X1 9
+#define MIDDLE_MARK_X2 15
+
+#define LABEL_SIZE 8
+
+#include "smallruler.h"
+
+
+SmallRuler::SmallRuler(QWidget *parent)
+    : KRuler(parent)
+{
+  setShowPointer(true);
+  setShowBigMarks(false);
+  setShowTinyMarks(false);
+  slotNewOffset(0);
+  setRulerMetricStyle(KRuler::Custom);
+  setLengthFixed(true);
+}
+
+void SmallRuler::setPixelPerMark ( double rate )
+{
+  kDebug()<<" RULER SET RATE: "<<rate;
+  if (rate > 0.5) {
+    setLittleMarkDistance(25);
+    setMediumMarkDistance(5 * 25);
+  }
+  else if (rate > 0.09) {
+    setLittleMarkDistance(5 * 25);
+    setMediumMarkDistance(30 * 25);
+  }
+  else {
+    setLittleMarkDistance(30 * 25);
+    setMediumMarkDistance(60 * 25);
+  }
+  
+  KRuler::setPixelPerMark( rate );
+}
+
+// virtual 
+void SmallRuler::mousePressEvent ( QMouseEvent * event )
+{
+  int pos = event->x();
+  //slotNewValue( pos );
+  emit seekRenderer(pos);
+  kDebug()<<pos;
+}
+
+void SmallRuler::slotNewValue ( int _value )
+{
+  m_cursorPosition = _value / pixelPerMark();
+  KRuler::slotNewValue(_value);
+}
+
+// virtual
+void SmallRuler::paintEvent(QPaintEvent * /*e*/)
+ {
+   //  debug ("KRuler::drawContents, %s",(horizontal==dir)?"horizontal":"vertical");
+   QStylePainter p(this);
+
+   int value  = this->value(),
+     minval = minimum(),
+     maxval;
+     maxval = maximum()
+     + offset() - endOffset();
+
+     //ioffsetval = value-offset;
+     //    pixelpm = (int)ppm;
+   //    left  = clip.left(),
+   //    right = clip.right();
+   double f, fend,
+     offsetmin=(double)(minval-offset()),
+     offsetmax=(double)(maxval-offset()),
+     fontOffset = (((double)minval)>offsetmin)?(double)minval:offsetmin;
+   // draw labels
+   QFont font = p.font();
+   font.setPointSize(LABEL_SIZE);
+   p.setFont( font );
+
+   if (showLittleMarks()) {
+     // draw the little marks
+     fend = pixelPerMark()*littleMarkDistance();
+     if (fend > 2) for ( f=offsetmin; f<offsetmax; f+=fend ) {
+         p.drawLine((int)f, LITTLE_MARK_X1, (int)f, LITTLE_MARK_X2);
+     }
+   }
+   if (showMediumMarks()) {
+     // draw medium marks
+     fend = pixelPerMark()*mediumMarkDistance();
+     if (fend > 2) for ( f=offsetmin; f<offsetmax; f+=fend ) {
+         p.drawLine((int)f, MIDDLE_MARK_X1, (int)f, MIDDLE_MARK_X2);
+     }
+   }
+
+/*   if (d->showem) {
+     // draw end marks
+     if (d->dir == Qt::Horizontal) {
+       p.drawLine(minval-d->offset, END_MARK_X1, minval-d->offset, END_MARK_X2);
+       p.drawLine(maxval-d->offset, END_MARK_X1, maxval-d->offset, END_MARK_X2);
+     }
+     else {
+       p.drawLine(END_MARK_X1, minval-d->offset, END_MARK_X2, minval-d->offset);
+       p.drawLine(END_MARK_X1, maxval-d->offset, END_MARK_X2, maxval-d->offset);
+     }
+   }*/
+   // draw pointer
+   if (showPointer()) {
+     QPolygon pa(4);
+       pa.setPoints(3, value-6, 9, value+6, 9, value/*+0*/, 16);
+     p.setBrush( QBrush(Qt::yellow) );
+     p.drawPolygon( pa );
+   }
+ }
+
+#include "smallruler.moc"
diff --git a/src/smallruler.h b/src/smallruler.h
new file mode 100644 (file)
index 0000000..053ce1e
--- /dev/null
@@ -0,0 +1,30 @@
+#ifndef SMALLRULER_H
+#define SMALLRULER_H
+
+#include <KRuler>
+
+class SmallRuler : public KRuler
+{
+  Q_OBJECT
+  
+  public:
+    SmallRuler(QWidget *parent=0);
+    virtual void mousePressEvent ( QMouseEvent * event );
+
+    void setPixelPerMark ( double rate );
+
+  protected:
+    virtual void paintEvent(QPaintEvent * /*e*/);
+
+  private:
+    int m_cursorPosition;
+    double m_scale;
+
+  public slots:
+    void slotNewValue ( int _value );
+
+  signals:
+    void seekRenderer(int);
+};
+
+#endif
index 5d9a308eaa9f7c228e851c455b3a52ea5462d08f..7437dcf2ce109aeb681470237237cd1a28ae2cb5 100644 (file)
@@ -29,7 +29,8 @@ Timecode::~Timecode()
 {
 }
 
-int Timecode::getFrameNumber(const QString duration, double fps) const
+
+int Timecode::getFrameCount(const QString duration, double fps) const
 {
     if (m_dropFrame) {
        // calculate how many frames need to be dropped every minute.
index b71393bcebd54f217ab33cc29478c09316393b13..fb8e5afe49eeedae3bf6ea8a2fdfb3f0c3228d05 100644 (file)
@@ -48,9 +48,10 @@ class Timecode {
 
        /** Returns the timecode for a given time */
     QString getTimecode(const GenTime & time, double fps) const;
-    int getFrameNumber(const QString duration, double fps) const;
+    int getFrameCount(const QString duration, double fps) const;
     static QString getEasyTimecode(const GenTime & time, const double &fps);
     QString getTimecodeFromFrames(int frames);
+
   private:
     Formats m_format;
     bool m_dropFrame;
index 5463237f6b915c824d0ff9bd2d271f986dc27942..68efca20fe87b4556ed9c7e5f2bc03f32e250140 100644 (file)
@@ -12,7 +12,7 @@ TrackView::TrackView(KdenliveDoc *doc, QWidget *parent)
 {
   view = new Ui::TimeLine_UI();
   view->setupUi(this);
-  m_ruler = new CustomRuler();
+  m_ruler = new CustomRuler(doc->timecode());
   QVBoxLayout *layout = new QVBoxLayout;
   layout->addWidget(m_ruler);
   view->ruler_frame->setLayout(layout);
index e32fb9ddca73201a68a37af9d73d1c94e6215d06..3160181d4a998f8604b16bcc838b03ab55f2ee17 100644 (file)
     </widget>
    </item>
    <item row="1" column="0" colspan="2" >
-    <widget class="KRuler" name="monitor_ruler" />
+    <widget class="QFrame" name="ruler_frame" >
+     <property name="sizePolicy" >
+      <sizepolicy vsizetype="Maximum" hsizetype="Preferred" >
+       <horstretch>0</horstretch>
+       <verstretch>0</verstretch>
+      </sizepolicy>
+     </property>
+     <property name="frameShape" >
+      <enum>QFrame::StyledPanel</enum>
+     </property>
+     <property name="frameShadow" >
+      <enum>QFrame::Raised</enum>
+     </property>
+    </widget>
    </item>
    <item row="2" column="0" >
     <layout class="QHBoxLayout" >
          <height>16777215</height>
         </size>
        </property>
+       <property name="checkable" >
+        <bool>true</bool>
+       </property>
+       <property name="checked" >
+        <bool>false</bool>
+       </property>
        <property name="flat" >
         <bool>true</bool>
        </property>
    <extends>KLineEdit</extends>
    <header>krestrictedline.h</header>
   </customwidget>
-  <customwidget>
-   <class>KRuler</class>
-   <extends>QWidget</extends>
-   <header>kruler.h</header>
-  </customwidget>
  </customwidgets>
  <resources/>
  <connections/>