]> git.sesse.net Git - kdenlive/blobdiff - src/renderwidget.cpp
Fix rendering remain time display
[kdenlive] / src / renderwidget.cpp
index a28aa0f7478676df4b1a70a72dfdbeee83942883..95ecbe4e25347927acea2802222e9ddeb625610c 100644 (file)
@@ -101,15 +101,18 @@ RenderWidget::RenderWidget(QWidget * parent): QDialog(parent) {
 
     m_view.out_file->setMode(KFile::File);
 
+    m_view.running_jobs->setHeaderLabels(QStringList() << QString() << i18n("File") << i18n("Progress"));
     m_view.running_jobs->setItemDelegate(new RenderViewDelegate(this));
     QHeaderView *header = m_view.running_jobs->header();
     QFontMetrics fm = fontMetrics();
     //header->resizeSection(0, fm.width("typical-name-for-a-torrent.torrent"));
-    header->setResizeMode(0, QHeaderView::Interactive);
-    header->resizeSection(0, fm.width("typical-name-for-a-file.torrent"));
-    header->setResizeMode(1, QHeaderView::Fixed);
-    header->resizeSection(0, width() * 2 / 3);
+    header->setResizeMode(0, QHeaderView::Fixed);
+    header->resizeSection(0, 30);
     header->setResizeMode(1, QHeaderView::Interactive);
+    header->resizeSection(1, fm.width("typical-name-for-a-file.torrent"));
+    header->setResizeMode(2, QHeaderView::Fixed);
+    header->resizeSection(1, width() * 2 / 3);
+    header->setResizeMode(2, QHeaderView::Interactive);
     //header->setResizeMode(1, QHeaderView::Fixed);
 
     focusFirstVisibleItem();
@@ -472,9 +475,12 @@ void RenderWidget::slotExport() {
 
     // insert item in running jobs list
     QTreeWidgetItem *renderItem;
-    QList<QTreeWidgetItem *> existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly);
+    QList<QTreeWidgetItem *> existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1);
     if (!existing.isEmpty()) renderItem = existing.at(0);
-    else renderItem = new QTreeWidgetItem(m_view.running_jobs, QStringList() << dest << QString());
+    else renderItem = new QTreeWidgetItem(m_view.running_jobs, QStringList() << QString() << dest << QString());
+    renderItem->setSizeHint(1, QSize(m_view.running_jobs->columnWidth(1), fontMetrics().height() * 2));
+    renderItem->setData(1, Qt::UserRole + 1, QTime::currentTime());
+
     // Set rendering type
     QString group = m_view.size_list->currentItem()->data(MetaGroupRole).toString();
     if (group == "dvd" && m_view.open_dvd->isChecked()) {
@@ -768,48 +774,63 @@ void RenderWidget::parseFile(QString exportFile, bool editable) {
 
 void RenderWidget::setRenderJob(const QString &dest, int progress) {
     QTreeWidgetItem *item;
-    QList<QTreeWidgetItem *> existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly);
+    QList<QTreeWidgetItem *> existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1);
     if (!existing.isEmpty()) item = existing.at(0);
-    else item = new QTreeWidgetItem(m_view.running_jobs, QStringList() << dest << QString());
-    item->setData(1, Qt::UserRole, progress);
-    if (progress == 0) item->setIcon(0, KIcon("system-run"));
+    else item = new QTreeWidgetItem(m_view.running_jobs, QStringList() << QString() << dest << QString());
+    item->setData(2, Qt::UserRole, progress);
+    if (progress == 0) {
+        item->setIcon(0, KIcon("system-run"));
+        item->setSizeHint(1, QSize(m_view.running_jobs->columnWidth(1), fontMetrics().height() * 2));
+        item->setData(1, Qt::UserRole + 1, QTime::currentTime());
+    } else {
+        QTime startTime = item->data(1, Qt::UserRole + 1).toTime();
+        int seconds = startTime.secsTo(QTime::currentTime());;
+        const QString t = i18n("Estimated time %1", QTime().addSecs(seconds * (100 - progress) / progress).toString("hh:mm:ss"));
+        item->setData(1, Qt::UserRole, t);
+    }
 }
 
 void RenderWidget::setRenderStatus(const QString &dest, int status, const QString &error) {
     QTreeWidgetItem *item;
-    QList<QTreeWidgetItem *> existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly);
+    QList<QTreeWidgetItem *> existing = m_view.running_jobs->findItems(dest, Qt::MatchExactly, 1);
     if (!existing.isEmpty()) item = existing.at(0);
-    else item = new QTreeWidgetItem(m_view.running_jobs, QStringList() << dest << QString());
+    else item = new QTreeWidgetItem(m_view.running_jobs, QStringList() << QString() << dest << QString());
     if (status == -1) {
         // Job finished successfully
         item->setIcon(0, KIcon("dialog-ok"));
-        item->setData(1, Qt::UserRole, 100);
+        item->setData(2, Qt::UserRole, 100);
+        QTime startTime = item->data(1, Qt::UserRole + 1).toTime();
+        int seconds = startTime.secsTo(QTime::currentTime());
+        const QTime tm = QTime().addSecs(seconds);
+        const QString t = i18n("Rendering finished in %1", tm.toString("hh:mm:ss"));
+        item->setData(1, Qt::UserRole, t);
         QString itemGroup = item->data(0, Qt::UserRole).toString();
         if (itemGroup == "dvd") {
-            emit openDvdWizard(item->text(0), item->data(0, Qt::UserRole + 1).toString());
+            emit openDvdWizard(item->text(1), item->data(0, Qt::UserRole + 1).toString());
         } else if (itemGroup == "websites") {
             QString url = item->data(0, Qt::UserRole + 1).toString();
             if (!url.isEmpty()) KRun *openBrowser = new KRun(url, this);
         }
     } else if (status == -2) {
         // Rendering crashed
+        item->setData(1, Qt::UserRole, i18n("Rendering crashed"));
         item->setIcon(0, KIcon("dialog-close"));
-        item->setData(1, Qt::UserRole, 0);
+        item->setData(2, Qt::UserRole, 0);
         m_view.error_log->append(i18n("<strong>Rendering of %1 crashed</strong><br />", dest));
         m_view.error_log->append(error);
         m_view.error_log->append("<hr />");
         m_view.error_box->setVisible(true);
     } else if (status == -3) {
         // User aborted job
+        item->setData(1, Qt::UserRole, i18n("Rendering aborted"));
         item->setIcon(0, KIcon("dialog-cancel"));
-        item->setData(1, Qt::UserRole, 100);
-        item->setData(1, Qt::UserRole + 1, i18n("Aborted by user"));
+        item->setData(2, Qt::UserRole, 100);
     }
 }
 
 void RenderWidget::slotAbortCurrentJob() {
     QTreeWidgetItem *current = m_view.running_jobs->currentItem();
-    if (current) emit abortProcess(current->text(0));
+    if (current) emit abortProcess(current->text(1));
 }
 
 #include "renderwidget.moc"