main.cpp
mainwindow.cpp
customruler.cpp
+ smallruler.cpp
projectlist.cpp
projectitem.cpp
monitor.cpp
trackview.cpp
docclipbase.cpp
timecode.cpp
+ monitormanager.cpp
)
kde4_add_kcfg_files(kdenlive_SRCS GENERATE_MOC kdenlivesettings.kcfgc )
{ 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);
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()) {
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()) {
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) {
#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[];
private:
int m_cursorPosition;
+ Timecode m_timecode;
public slots:
void slotNewValue ( int _value );
#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;
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"
#include <kurl.h>
#include "gentime.h"
-
+#include "timecode.h"
class KdenliveDoc:public QObject {
Q_OBJECT public:
~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:
#include <QTextStream>
+#include <QTimer>
#include <KApplication>
#include <KAction>
MainWindow::MainWindow(QWidget *parent)
: KXmlGuiWindow(parent),
- fileName(QString())
+ fileName(QString()), m_activeDocument(NULL)
{
m_timelineArea = new KTabWidget(this);
m_timelineArea->setHoverCloseButton(true);
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);
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);
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()
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;
}
#include "projectlist.h"
#include "monitor.h"
+#include "monitormanager.h"
#include "kdenlivedoc.h"
class MainWindow : public KXmlGuiWindow
KTabWidget* m_timelineArea;
void setupActions();
QString fileName;
+ KdenliveDoc *m_activeDocument;
+ MonitorManager *m_monitorManager;
QDockWidget *projectListDock;
ProjectList *m_projectList;
void saveFileAs();
void saveFileAs(const QString &outputFileName);
void slotPreferences();
+ void slotConnectMonitors();
+ void slotRaiseMonitor(bool clipMonitor);
};
#endif
#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);
#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
--- /dev/null
+#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"
--- /dev/null
+#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
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"));
#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>
{
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
{
};
-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;
// 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()));
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)));
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();
{
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()
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;
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());
QPixmap pix(60, 40);
pix.fill(dia_ui->clip_color->color());
item->setIcon(0, QIcon(pix));
-
+ listView->setCurrentItem(item);
}
delete dia_ui;
}*/
}
-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)
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());
#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();
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()) );
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";
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()
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));
}
// 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));
}
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);
QDomDocument sceneList() const;
int resetRendererProfile(char * profile);
bool isBlocked;
+ const double fps() const;
/** Playlist manipulation */
void mltInsertClip(int track, GenTime position, QString resource);
/** 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
--- /dev/null
+
+#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"
--- /dev/null
+#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
{
}
-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.
/** 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;
{
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);
</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/>