]> git.sesse.net Git - kdenlive/commitdiff
Merge branch 'master' into feature/pkey
authorEd Rogalsky <ed.rogalsky@googlemail.com>
Wed, 31 Oct 2012 06:56:55 +0000 (07:56 +0100)
committerEd Rogalsky <ed.rogalsky@googlemail.com>
Wed, 31 Oct 2012 06:56:55 +0000 (07:56 +0100)
Conflicts:
src/mainwindow.h

21 files changed:
src/customtrackview.cpp
src/customtrackview.h
src/definitions.h
src/dvdwizard.cpp
src/dvdwizardmenu.cpp
src/dvdwizardmenu.h
src/dvdwizardvob.cpp
src/dvdwizardvob.h
src/effectstack/parametercontainer.cpp
src/effectstack/parametercontainer.h
src/effectstackedit.cpp
src/effectstackedit.h
src/geometrywidget.cpp
src/geometrywidget.h
src/mainwindow.cpp
src/mainwindow.h
src/onmonitoritems/onmonitorrectitem.cpp
src/transitionsettings.cpp
src/transitionsettings.h
src/widgets/geometrywidget_ui.ui
src/widgets/importkeyframesdialog_ui.ui

index c9c4df4a8450b326ecc797e8baf24534bdfbe968..166990f43d1800f24ed9f65835884050cce9308b 100644 (file)
@@ -420,10 +420,14 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
 {
     int pos = event->x();
     int mappedXPos = qMax((int)(mapToScene(event->pos()).x() + 0.5), 0);
-   
     double snappedPos = getSnapPointForPos(mappedXPos);
     emit mousePosition(mappedXPos);
 
+    if (m_operationMode == SCROLLTIMELINE) {
+       QGraphicsView::mouseMoveEvent(event);
+       return;
+    }
+
     if (event->buttons() & Qt::MidButton) return;
     if (dragMode() == QGraphicsView::RubberBandDrag || (event->modifiers() == Qt::ControlModifier && m_tool != SPACERTOOL && m_operationMode != RESIZESTART && m_operationMode != RESIZEEND)) {
         event->setAccepted(true);
@@ -602,11 +606,8 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
 
     if (m_tool == RAZORTOOL) {
         setCursor(m_razorCursor);
-        //QGraphicsView::mouseMoveEvent(event);
-        //return;
     } else if (m_tool == SPACERTOOL) {
         setCursor(m_spacerCursor);
-        return;
     }
 
     QList<QGraphicsItem *> itemList = items(event->pos());
@@ -615,12 +616,18 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
 
     if (itemList.count() == 1 && itemList.at(0)->type() == GUIDEITEM) {
         opMode = MOVEGUIDE;
+       setCursor(Qt::SplitHCursor);
     } else for (int i = 0; i < itemList.count(); i++) {
-            if (itemList.at(i)->type() == AVWIDGET || itemList.at(i)->type() == TRANSITIONWIDGET) {
-                item = (QGraphicsRectItem*) itemList.at(i);
-                break;
-            }
-        }
+        if (itemList.at(i)->type() == AVWIDGET || itemList.at(i)->type() == TRANSITIONWIDGET) {
+            item = (QGraphicsRectItem*) itemList.at(i);
+           break;
+       }
+    }
+
+    if (m_tool == SPACERTOOL) {
+        event->accept();
+        return;
+    }
 
     if (item && event->buttons() == Qt::NoButton) {
         AbstractClipItem *clip = static_cast <AbstractClipItem*>(item);
@@ -716,7 +723,6 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event)
         return;
     } else if (opMode == MOVEGUIDE) {
         m_moveOpMode = opMode;
-        setCursor(Qt::SplitHCursor);
     } else {
         removeTipAnimation();
         setCursor(Qt::ArrowCursor);
@@ -779,9 +785,9 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
     if (event->modifiers() == Qt::ControlModifier && m_tool != SPACERTOOL && collisionList.count() == 0) {
         // Pressing Ctrl + left mouse button in an empty area scrolls the timeline
         setDragMode(QGraphicsView::ScrollHandDrag);
-        QGraphicsView::mousePressEvent(event);
         m_blockRefresh = false;
-        m_operationMode = NONE;
+        m_operationMode = SCROLLTIMELINE;
+       QGraphicsView::mousePressEvent(event);
         return;
     }
 
@@ -888,7 +894,6 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
     // No item under click
     if (m_dragItem == NULL || m_tool == SPACERTOOL) {
         resetSelectionGroup(false);
-        setCursor(Qt::ArrowCursor);
         m_scene->clearSelection();
         //event->accept();
         updateClipTypeActions(NULL);
@@ -961,6 +966,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
             }
             m_operationMode = SPACER;
         } else {
+           setCursor(Qt::ArrowCursor);
             seekCursorPos((int)(mapToScene(event->x(), 0).x()));
         }
         QGraphicsView::mousePressEvent(event);
@@ -1027,7 +1033,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
        if (selected == false) {
            m_dragItem = NULL;
        }
-        groupSelectedItems();
+        groupSelectedItems(QList <QGraphicsItem*>(), false, false, true);
        if (m_dragItem) { 
            ClipItem *clip = static_cast <ClipItem *>(m_dragItem);
            updateClipTypeActions(dragGroup == NULL ? clip : NULL);
@@ -3506,8 +3512,15 @@ void CustomTrackView::checkScrolling()
 void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
 {
     if (m_moveOpMode == SEEK) m_moveOpMode = NONE;
+    if (m_operationMode == SCROLLTIMELINE) {
+       m_operationMode = NONE;
+       setDragMode(QGraphicsView::NoDrag);
+       QGraphicsView::mouseReleaseEvent(event);
+       return;
+    }
     if (!m_controlModifier && m_operationMode != RUBBERSELECTION) {
        //event->accept();
+       setDragMode(QGraphicsView::NoDrag);
        if (m_clipDrag) QGraphicsView::mouseReleaseEvent(event);
     }
     m_clipDrag = false;
@@ -4418,7 +4431,7 @@ void CustomTrackView::doGroupClips(QList <ItemInfo> clipInfos, QList <ItemInfo>
             //clip->setSelected(true);
         }
     }
-    groupSelectedItems(list, false, true);
+    groupSelectedItems(list, false, true, true);
     setDocumentModified();
 }
 
@@ -5692,6 +5705,16 @@ void CustomTrackView::slotDeleteAllGuides()
 void CustomTrackView::setTool(PROJECTTOOL tool)
 {
     m_tool = tool;
+    switch (m_tool) {
+      case RAZORTOOL:
+         setCursor(m_razorCursor);
+         break;
+      case SPACERTOOL:
+         setCursor(m_spacerCursor);
+         break;
+      default:
+         unsetCursor();
+    }
 }
 
 void CustomTrackView::setScale(double scaleFactor, double verticalScale)
@@ -7067,6 +7090,7 @@ void CustomTrackView::slotSelectTrack(int ix)
 void CustomTrackView::slotSelectClipsInTrack()
 {
     QRectF rect(0, m_selectedTrack * m_tracksHeight + m_tracksHeight / 2, sceneRect().width(), m_tracksHeight / 2 - 1);
+    resetSelectionGroup();
     QList<QGraphicsItem *> selection = m_scene->items(rect);
     m_scene->clearSelection();
     QList<QGraphicsItem *> list;
@@ -7075,16 +7099,14 @@ void CustomTrackView::slotSelectClipsInTrack()
            list.append(selection.at(i));
         }
     }    
-    resetSelectionGroup();
-    groupSelectedItems(list);
+    groupSelectedItems(list, false, false, true);
 }
 
 void CustomTrackView::slotSelectAllClips()
 {
-    QList<QGraphicsItem *> selection = m_scene->items();
     m_scene->clearSelection();
     resetSelectionGroup();
-    groupSelectedItems(selection);
+    groupSelectedItems(m_scene->items(), false, false, true);
 }
 
 void CustomTrackView::selectClip(bool add, bool group, int track, int pos)
@@ -7637,7 +7659,7 @@ void CustomTrackView::slotImportClipKeyframes(GRAPHICSRECTITEM type)
            result.append(';');
        }
     }
-    emit importKeyframes(type, result);
+    emit importKeyframes(type, result, ui.limit_keyframes->isChecked() ? ui.max_keyframes->value() : -1);
     delete d;
 }
 
index 42341874912e805f8d58758e023836bbeca2cd98..f4e729611b8fc470a3a05055a3990f7306e77977 100644 (file)
@@ -532,7 +532,7 @@ signals:
     /** @brief Cursor position changed, repaint ruler.*/
     void updateRuler();
     /** @brief Send data from a clip to be imported as keyframes for effect / transition.*/
-    void importKeyframes(GRAPHICSRECTITEM type, const QString&);
+    void importKeyframes(GRAPHICSRECTITEM type, const QString&, int maximum);
 };
 
 #endif
index 74e79bc7172581beabbb5215f950342cfd788c8a..b525a77fe2cea48d4859c1c7c96717e6118b160a 100644 (file)
@@ -40,7 +40,7 @@ namespace Kdenlive {
   const QString stopmotionMonitor("stopmotionMonitor");*/
 }
 
-enum OPERATIONTYPE { NONE = 0, MOVE = 1, RESIZESTART = 2, RESIZEEND = 3, FADEIN = 4, FADEOUT = 5, TRANSITIONSTART = 6, TRANSITIONEND = 7, MOVEGUIDE = 8, KEYFRAME = 9, SEEK = 10, SPACER = 11, RUBBERSELECTION = 12};
+enum OPERATIONTYPE { NONE = 0, MOVE = 1, RESIZESTART = 2, RESIZEEND = 3, FADEIN = 4, FADEOUT = 5, TRANSITIONSTART = 6, TRANSITIONEND = 7, MOVEGUIDE = 8, KEYFRAME = 9, SEEK = 10, SPACER = 11, RUBBERSELECTION = 12, SCROLLTIMELINE = 13};
 enum CLIPTYPE { UNKNOWN = 0, AUDIO = 1, VIDEO = 2, AV = 3, COLOR = 4, IMAGE = 5, TEXT = 6, SLIDESHOW = 7, VIRTUAL = 8, PLAYLIST = 9 };
 
 enum PROJECTITEMTYPE { PROJECTCLIPTYPE = QTreeWidgetItem::UserType, PROJECTFOLDERTYPE, PROJECTSUBCLIPTYPE };
index aa36f6048a497c4a84a3cf767f3e8ea4d59928e3..0a411e659b5d0ba5f30e7823435e4bd532f46418 100644 (file)
@@ -196,6 +196,11 @@ void DvdWizard::generateDvd()
     //temp5.setAutoRemove(false);
     temp5.open();
 
+    KTemporaryFile temp6;
+    temp6.setSuffix(".vob");
+    //temp6.setAutoRemove(false);
+    temp6.open();
+
     m_menuFile.close();
     m_menuFile.setSuffix(".xml");
     m_menuFile.setAutoRemove(false);
@@ -243,16 +248,62 @@ void DvdWizard::generateDvd()
             args.append(temp4.fileName());
             args.append("in=0");
             args.append("out=100");
-            args << "-consumer" << "avformat:" + temp5.fileName();
-            if (m_pageMenu->isPalMenu()) {
-                args << "f=dvd" << "acodec=ac3" << "ab=192k" << "ar=48000" << "vcodec=mpeg2video" << "vb=5000k" << "maxrate=8000k" << "minrate=0" << "bufsize=1835008" << "mux_packet_s=2048" << "mux_rate=10080000" << "s=720x576" << "g=15" << "me_range=63" << "trellis=1";
+            args << "-consumer" << "avformat:" + temp5.fileName()<<"properties=DVD";
+            QProcess renderbg;
+            renderbg.start(KdenliveSettings::rendererpath(), args);
+            if (renderbg.waitForFinished()) {
+                if (renderbg.exitStatus() == QProcess::CrashExit) {
+                    kDebug() << "/// RENDERING MENU vob crashed";
+                    errorMessage(i18n("Rendering menu crashed"));
+                    QByteArray result = renderbg.readAllStandardError();
+                    vobitem->setIcon(KIcon("dialog-close"));
+                    m_status.error_log->append(result);
+                    m_status.error_box->setHidden(false);
+                    m_status.button_start->setEnabled(true);
+                    m_status.button_abort->setEnabled(false);
+                    return;
+                }
             } else {
-                args << "f=dvd" << "acodec=ac3" << "ab=192k" << "ar=48000" << "vcodec=mpeg2video" << "vb=6000k" << "maxrate=9000k" << "minrate=0" << "bufsize=1835008" << "mux_packet_s=2048" << "mux_rate=10080000" << "s=720x480" << "g=18" << "me_range=63" << "trellis=1";
+                kDebug() << "/// RENDERING MENU vob timed out";
+                errorMessage(i18n("Rendering job timed out"));
+                vobitem->setIcon(KIcon("dialog-close"));
+                m_status.error_log->append("<a name=\"result\" /><br /><strong>" + i18n("Rendering job timed out"));
+                m_status.error_log->scrollToAnchor("result");
+                m_status.error_box->setHidden(false);
+                m_status.button_start->setEnabled(true);
+                m_status.button_abort->setEnabled(false);
+                return;
             }
+            vobitem->setIcon(KIcon("dialog-ok"));
+        } else {
+           // Movie as menu background, do the compositing
+           QListWidgetItem *vobitem =  m_status.job_progress->item(1);
+            m_status.job_progress->setCurrentRow(1);
+            vobitem->setIcon(KIcon("system-run"));
+            qApp->processEvents();
 
-            kDebug() << "MLT ARGS: " << args;
+           QString std;
+           if (m_pageMenu->isPalMenu()) std = "dv_pal";
+           else std = "dv_ntsc";
+           int menuLength = m_pageMenu->menuMovieLength();
+           if (menuLength == -1) {
+               // menu movie is invalid
+               errorMessage(i18n("Menu movie is invalid"));
+               m_status.button_start->setEnabled(true);
+                m_status.button_abort->setEnabled(false);
+                return;
+           }
+
+            QStringList args;
+            args.append("-profile");
+            args.append(std);
+            args.append(m_pageMenu->menuMoviePath());
+           args << "-track" << temp4.fileName();
+           args << "out=" + QString::number(menuLength);
+           args << "-transition" << "composite" << "always_active=1";
+            args << "-consumer" << "avformat:" + temp6.fileName()<<"properties=DVD";
             QProcess renderbg;
-            renderbg.start(KdenliveSettings::rendererpath(), args);
+           renderbg.start(KdenliveSettings::rendererpath(), args);
             if (renderbg.waitForFinished()) {
                 if (renderbg.exitStatus() == QProcess::CrashExit) {
                     kDebug() << "/// RENDERING MENU vob crashed";
@@ -277,7 +328,7 @@ void DvdWizard::generateDvd()
                 return;
             }
             vobitem->setIcon(KIcon("dialog-ok"));
-        }
+       }
         kDebug() << "/// STARTING SPUMUX";
 
         // create xml spumux file
@@ -353,7 +404,7 @@ void DvdWizard::generateDvd()
         spumux.setEnvironment(env);
 #endif
     
-        if (m_pageMenu->menuMovie()) spumux.setStandardInputFile(m_pageMenu->menuMoviePath());
+        if (m_pageMenu->menuMovie()) spumux.setStandardInputFile(temp6.fileName());
         else spumux.setStandardInputFile(temp5.fileName());
         spumux.setStandardOutputFile(m_menuVobFile.fileName());
         spumux.start("spumux", args);
index 38ac05a719ee74df68a56523817680411d6a3736..fb162c89378850a422ce2ddce584a64d8c6b51c6 100644 (file)
@@ -34,7 +34,8 @@ DvdWizardMenu::DvdWizardMenu(const QString &profile, QWidget *parent) :
         QWizardPage(parent),
         m_color(NULL),
         m_safeRect(NULL),
-        m_finalSize(720, 576)
+        m_finalSize(720, 576),
+        m_movieLength(-1)
 {
     m_view.setupUi(this);
     m_view.play_text->setText(i18n("Play"));
@@ -329,10 +330,10 @@ void DvdWizardMenu::addButton()
 #endif
     //font.setStyleStrategy(QFont::NoAntialias);
     button->setFont(font);
+    button->setDefaultTextColor(m_view.text_color->color());
     button->setZValue(4);
     QRectF r = button->sceneBoundingRect();
     m_scene->addItem(button);
-    updateColor(m_view.text_color->color());
     button->setPos((m_width - r.width()) / 2, (m_height - r.height()) / 2);
     button->setSelected(true);
 }
@@ -441,11 +442,16 @@ void DvdWizardMenu::buildImage()
         pix = pix.scaled(m_width, m_height);
     } else if (m_view.background_list->currentIndex() == 2) {
         // video background
-        int w;
-        if (m_isPal) w = 768;
-        else w = 640;
-        pix = KThumb::getImage(m_view.background_image->url(), 0, w, m_height);
-        pix = pix.scaled(m_width, m_height);
+        m_movieLength = -1;
+        QString standard = "dv_pal";
+        if (!m_isPal) standard = "dv_ntsc";
+       Mlt::Profile profile(standard.toUtf8().constData());
+       Mlt::Producer *producer = new Mlt::Producer(profile, m_view.background_image->url().path().toUtf8().data());
+       if (producer && producer->is_valid()) {
+           pix = QPixmap::fromImage(KThumb::getFrame(producer, 0, m_finalSize.width(), m_width, m_height));
+           m_movieLength = producer->get_length();
+       }
+       if (producer) delete producer;
     }
     m_background->setPixmap(pix);
     m_scene->addItem(m_background);
@@ -634,7 +640,15 @@ void DvdWizardMenu::createBackgroundImage(const QString &overlayMenu, const QStr
 {
     m_scene->clearSelection();
     if (m_safeRect->scene() != 0) m_scene->removeItem(m_safeRect);
+    bool showBg = false;
     QImage img(m_width, m_height, QImage::Format_ARGB32);
+    if (menuMovie() && m_background->scene() != 0) {
+       showBg = true;
+       m_scene->removeItem(m_background);
+       if (m_color->scene() != 0) m_scene->removeItem(m_color);
+       if (m_safeRect->scene() != 0) m_scene->removeItem(m_safeRect);
+       img.fill(Qt::transparent);
+    }
     updateColor(m_view.text_color->color());
     QPainter p(&img);
     p.setRenderHints(QPainter::Antialiasing, true);
@@ -643,6 +657,10 @@ void DvdWizardMenu::createBackgroundImage(const QString &overlayMenu, const QStr
     p.end();
     img.save(img1);
     m_scene->addItem(m_safeRect);
+    if (showBg) {
+       m_scene->addItem(m_background);
+       m_scene->addItem(m_color);
+    }
     return;
        
   
@@ -694,6 +712,11 @@ QString DvdWizardMenu::menuMoviePath() const
     return m_view.background_image->url().path();
 }
 
+int DvdWizardMenu::menuMovieLength() const
+{
+  return m_movieLength;
+}
+
 
 QMap <QString, QRect> DvdWizardMenu::buttonsInfo()
 {
index e8d6f07de258cd063fa1f4c4f8332c7cc73d4382..2ecdcae18b9c41153d5b40bf8680cfd7fe19eb20 100644 (file)
@@ -140,6 +140,7 @@ public:
     bool loopMovie() const;
     bool menuMovie() const;
     QString menuMoviePath() const;
+    int menuMovieLength() const;
     bool isPalMenu() const;
     void changeProfile(bool isPal);
     QDomElement toXml() const;
@@ -157,6 +158,7 @@ private:
     int m_width;
     int m_height;
     QSize m_finalSize;
+    int m_movieLength;
 #if KDE_IS_VERSION(4,7,0)
     KMessageWidget *m_menuMessage;
 #endif
index 1caae7f8180dbfd676da45abc180ee62cc17fdc9..0dc32551e98c0f1dc2369be8e36ac108b8f517ea 100644 (file)
@@ -50,6 +50,7 @@ DvdWizardVob::DvdWizardVob(const QString &profile, QWidget *parent) :
     connect(m_view.button_up, SIGNAL(clicked()), this, SLOT(slotItemUp()));
     connect(m_view.button_down, SIGNAL(clicked()), this, SLOT(slotItemDown()));
     connect(m_view.vobs_list, SIGNAL(itemSelectionChanged()), this, SLOT(slotCheckVobList()));
+    
     m_view.vobs_list->setIconSize(QSize(60, 45));
 
     if (KStandardDirs::findExe("dvdauthor").isEmpty()) m_errorMessage.append(i18n("<strong>Program %1 is required for the DVD wizard.</strong>", i18n("dvdauthor")));
@@ -63,15 +64,28 @@ DvdWizardVob::DvdWizardVob(const QString &profile, QWidget *parent) :
     else if (profile == "dv_ntsc_wide") m_view.dvd_profile->setCurrentIndex(3);
 
     connect(m_view.dvd_profile, SIGNAL(activated(int)), this, SLOT(changeFormat()));
+    connect(m_view.dvd_profile, SIGNAL(activated(int)), this, SLOT(slotCheckProfiles()));
     m_view.vobs_list->header()->setStretchLastSection(false);
     m_view.vobs_list->header()->setResizeMode(0, QHeaderView::Stretch);
     m_view.vobs_list->header()->setResizeMode(1, QHeaderView::Custom);
     m_view.vobs_list->header()->setResizeMode(2, QHeaderView::Custom);
 
     m_capacityBar = new KCapacityBar(KCapacityBar::DrawTextInline, this);
-    QHBoxLayout *layout = new QHBoxLayout;
-    layout->addWidget(m_capacityBar);
-    m_view.size_box->setLayout(layout);
+    QHBoxLayout *lay = new QHBoxLayout;
+    lay->addWidget(m_capacityBar);
+    m_view.size_box->setLayout(lay);
+
+    m_view.vobs_list->setItemDelegate(new DvdViewDelegate(m_view.vobs_list));
+
+#if KDE_IS_VERSION(4,7,0)
+    m_warnMessage = new KMessageWidget;
+    m_warnMessage->setText(i18n("Conflicting video standards, check DVD profile and clips"));
+    m_warnMessage->setMessageType(KMessageWidget::Warning);
+    QGridLayout *s =  static_cast <QGridLayout*> (layout());
+    s->addWidget(m_warnMessage, 3, 0, 1, -1);
+    m_warnMessage->hide();
+#endif
+    
     slotCheckVobList();
 }
 
@@ -80,6 +94,25 @@ DvdWizardVob::~DvdWizardVob()
     delete m_capacityBar;
 }
 
+void DvdWizardVob::slotCheckProfiles()
+{
+#if KDE_IS_VERSION(4,7,0)
+    bool conflict = false;
+    int comboProfile = m_view.dvd_profile->currentIndex();
+    for (int i = 0; i < m_view.vobs_list->topLevelItemCount(); i++) {
+        QTreeWidgetItem *item = m_view.vobs_list->topLevelItem(i);
+        if (item->data(0, Qt::UserRole + 1).toInt() != comboProfile) {
+           conflict = true;
+           break;
+       }
+    }
+
+    if (conflict) {
+       m_warnMessage->animatedShow();
+    }
+    else m_warnMessage->animatedHide();
+#endif
+}
 
 void DvdWizardVob::slotAddVobFile(KUrl url, const QString &chapters)
 {
@@ -103,25 +136,57 @@ void DvdWizardVob::slotAddVobFile(KUrl url, const QString &chapters)
         break;
     }
 
-    Mlt::Profile profile(profilename.toUtf8().data());
+    Mlt::Profile profile(profilename.toUtf8().constData());
+    profile.set_explicit(false);
     QTreeWidgetItem *item = new QTreeWidgetItem(m_view.vobs_list, QStringList() << url.path() << QString() << KIO::convertSize(fileSize));
     item->setData(0, Qt::UserRole, fileSize);
-    item->setIcon(0, KIcon("video-x-generic"));
-
-    QPixmap pix(60, 45);
-
+    item->setData(0, Qt::DecorationRole, KIcon("video-x-generic").pixmap(60, 45));
+    item->setToolTip(0, url.path());
+    
     Mlt::Producer *producer = new Mlt::Producer(profile, url.path().toUtf8().data());
-
-    if (producer->is_blank() == false) {
+    if (producer && producer->is_valid() && !producer->is_blank()) {
+       //Mlt::Frame *frame = producer->get_frame();
+       //delete frame;
+       profile.from_producer(*producer);
         int width = 45.0 * profile.dar();
         int swidth = 45.0 * profile.width() / profile.height();
         if (width % 2 == 1) width++;
-        item->setIcon(0, QPixmap::fromImage(KThumb::getFrame(producer, 0, swidth, width, 45)));
+       item->setData(0, Qt::DecorationRole, QPixmap::fromImage(KThumb::getFrame(producer, 0, swidth, width, 45)));
         int playTime = producer->get_playtime();
         item->setText(1, Timecode::getStringTimecode(playTime, profile.fps()));
         item->setData(1, Qt::UserRole, playTime);
+       int standard = -1;
+       int aspect = profile.dar() * 100;
+       if (profile.height() == 576) {
+           if (aspect > 150) standard = 1;
+           else standard = 0;
+       }
+       else if (profile.height() == 480) {
+           if (aspect > 150) standard = 3;
+           else standard = 2;
+       }
+       QString standardName;
+       switch (standard) {
+         case 3:
+             standardName = i18n("NTSC 16:9");
+             break;
+         case 2:
+             standardName = i18n("NTSC 4:3");
+             break;
+         case 1:
+             standardName = i18n("PAL 16:9");
+             break;
+         case 0:
+             standardName = i18n("PAL 4:3");
+             break;
+         default:
+             standardName = i18n("Unknown");
+       }
+       item->setData(0, Qt::UserRole, standardName);
+       item->setData(0, Qt::UserRole + 1, standard);
+       
     }
-    delete producer;
+    if (producer) delete producer;
 
     if (chapters.isEmpty() == false) {
         item->setData(1, Qt::UserRole + 1, chapters);
@@ -147,6 +212,7 @@ void DvdWizardVob::slotAddVobFile(KUrl url, const QString &chapters)
         item->setData(1, Qt::UserRole + 1, "0");
 
     slotCheckVobList();
+    slotCheckProfiles();
 }
 
 void DvdWizardVob::changeFormat()
@@ -168,7 +234,7 @@ void DvdWizardVob::changeFormat()
         break;
     }
 
-    Mlt::Profile profile(profilename.toUtf8().data());
+    Mlt::Profile profile(profilename.toUtf8().constData());
     QPixmap pix(180, 135);
 
     for (int i = 0; i < max; i++) {
@@ -196,6 +262,7 @@ void DvdWizardVob::slotDeleteVobFile()
     if (item == NULL) return;
     delete item;
     slotCheckVobList();
+    slotCheckProfiles();
 }
 
 
index bc395019071794c744f2f034709be6742bb23874..0b634a7743d04468f5819258aed02ce8c87a137f 100644 (file)
 #include <kcapacitybar.h>
 #include <KUrl>
 
+#if KDE_IS_VERSION(4,7,0)
+#include <KMessageWidget>
+#endif
+
 #include <QWizardPage>
+#include <QStyledItemDelegate>
+#include <QPainter>
+
+class DvdViewDelegate : public QStyledItemDelegate
+{
+    Q_OBJECT
+public:
+    DvdViewDelegate(QWidget *parent) : QStyledItemDelegate(parent) {}
+
+    void paint(QPainter *painter, const QStyleOptionViewItem &option,
+               const QModelIndex &index) const {
+        if (index.column() == 0) {
+            painter->save();
+            QStyleOptionViewItemV4 opt(option);
+           QRect r1 = option.rect;
+            QStyle *style = opt.widget ? opt.widget->style() : QApplication::style();
+            const int textMargin = style->pixelMetric(QStyle::PM_FocusFrameHMargin) + 1;
+            style->drawPrimitive(QStyle::PE_PanelItemViewItem, &opt, painter, opt.widget);
+
+            QPixmap pixmap = qVariantValue<QPixmap>(index.data(Qt::DecorationRole));
+            QPoint pixmapPoint(r1.left() + textMargin, r1.top() + (r1.height() - pixmap.height()) / 2);
+            painter->drawPixmap(pixmapPoint, pixmap);
+            int decoWidth = pixmap.width() + 2 * textMargin;
+
+           QFont font = painter->font();
+            font.setBold(true);
+            painter->setFont(font);
+            int mid = (int)((r1.height() / 2));
+            r1.adjust(decoWidth, 0, 0, -mid);
+            QRect r2 = option.rect;
+            r2.adjust(decoWidth, mid, 0, 0);
+            painter->drawText(r1, Qt::AlignLeft | Qt::AlignBottom, KUrl(index.data().toString()).fileName());
+            font.setBold(false);
+            painter->setFont(font);
+            QString subText = index.data(Qt::UserRole).toString();
+            QRectF bounding;
+            painter->drawText(r2, Qt::AlignLeft | Qt::AlignVCenter , subText, &bounding);
+            painter->restore();
+        } else QStyledItemDelegate::paint(painter, option, index);
+    }
+};
+
 
 class DvdWizardVob : public QWizardPage
 {
@@ -54,9 +100,13 @@ private:
     Ui::DvdWizardVob_UI m_view;
     QString m_errorMessage;
     KCapacityBar *m_capacityBar;
+#if KDE_IS_VERSION(4,7,0)
+    KMessageWidget *m_warnMessage;
+#endif
 
 public slots:
     void slotAddVobFile(KUrl url = KUrl(), const QString &chapters = QString());
+    void slotCheckProfiles();
 
 private slots:
     void slotCheckVobList();
index b3820c6f1a469413243b2591e9f2d4b6fc4566ca..89256436f738cd21979a075f527a73a23a04a2bd 100644 (file)
@@ -854,13 +854,13 @@ bool ParameterContainer::needsMonitorEffectScene() const
     return m_needsMonitorEffectScene;
 }
 
-void ParameterContainer::setKeyframes(const QString &data)
+void ParameterContainer::setKeyframes(const QString &data, int maximum)
 {
     if (!m_geometryWidget) {
        kDebug()<<" / / NO GEOMETRY WIDGET FOUND FOR IMPORTING DATA";
        return;
     }
-    m_geometryWidget->importKeyframes(data);
+    m_geometryWidget->importKeyframes(data, maximum);
     
 }
 
index 92b8dcb508c11fd124dd6183b3df384b6d31088e..86bc2cd0bef12ecdca0d3049e4a3189161379f13 100644 (file)
@@ -67,7 +67,7 @@ public:
     /** @brief Returns true of this effect requires an on monitor adjustable effect scene. */
     bool needsMonitorEffectScene() const;
     /** @brief Set keyframes for this param. */
-    void setKeyframes(const QString &data);
+    void setKeyframes(const QString &data, int maximum);
 
 private slots:
     void slotCollectAllParameters();
index 10899110d1a13581a38596bc67b111006848b653..95b8d37be53e6aef9e3d77216185235b9a941889 100644 (file)
@@ -184,9 +184,9 @@ bool EffectStackEdit::needsMonitorEffectScene() const
     return m_paramWidget->needsMonitorEffectScene();
 }
 
-void EffectStackEdit::setKeyframes(const QString &data)
+void EffectStackEdit::setKeyframes(const QString &data, int maximum)
 {
     if (!m_paramWidget) return;
-    m_paramWidget->setKeyframes(data);
+    m_paramWidget->setKeyframes(data, maximum);
 }
 
index f760222242c85ca8c2a185b5ed5651ac434632e8..499fe8edbc798d4cace6bce92a53b5626a543a6b 100644 (file)
@@ -57,7 +57,7 @@ public:
     /** @brief Returns true if this transition requires an on monitor scene. */
     bool needsMonitorEffectScene() const;
     /** @brief Set keyframes for this transition. */
-    void setKeyframes(const QString &data);
+    void setKeyframes(const QString &data, int maximum);
 
 private:
     Monitor *m_monitor;
index fcbb90a660ccf8f50e9b913182c17428601adfe5..304a1094ac678d4698429737e78d989b6761c628 100644 (file)
@@ -65,7 +65,7 @@ GeometryWidget::GeometryWidget(Monitor* monitor, Timecode timecode, int clipPos,
         Setup of timeline and keyframe controls
     */
 
-    ((QGridLayout *)(m_ui.widgetTimeWrapper->layout()))->addWidget(m_timePos, 1, 6);
+    ((QGridLayout *)(m_ui.widgetTimeWrapper->layout()))->addWidget(m_timePos, 1, 5);
 
     QVBoxLayout *layout = new QVBoxLayout(m_ui.frameTimeline);
     m_timeline = new KeyframeHelper(m_ui.frameTimeline);
@@ -81,15 +81,10 @@ GeometryWidget::GeometryWidget(Monitor* monitor, Timecode timecode, int clipPos,
     m_ui.buttonNext->setIcon(KIcon("media-skip-forward"));
     m_ui.buttonNext->setToolTip(i18n("Go to next keyframe"));
     m_ui.buttonNext->setIconSize(iconSize);
-    m_ui.buttonAddDelete->setIcon(KIcon("document-new"));
+    m_ui.buttonAddDelete->setIcon(KIcon("list-add"));
     m_ui.buttonAddDelete->setToolTip(i18n("Add keyframe"));
     m_ui.buttonAddDelete->setIconSize(iconSize);
 
-    m_ui.buttonSync->setIcon(KIcon("insert-link"));
-    m_ui.buttonSync->setToolTip(i18n("Synchronize with timeline cursor"));
-    m_ui.buttonSync->setChecked(KdenliveSettings::transitionfollowcursor());
-    m_ui.buttonSync->setIconSize(iconSize);
-
     connect(m_timeline, SIGNAL(requestSeek(int)), this, SLOT(slotRequestSeek(int)));
     connect(m_timeline, SIGNAL(keyframeMoved(int)),   this, SLOT(slotKeyframeMoved(int)));
     connect(m_timeline, SIGNAL(addKeyframe(int)),     this, SLOT(slotAddKeyframe(int)));
@@ -98,7 +93,6 @@ GeometryWidget::GeometryWidget(Monitor* monitor, Timecode timecode, int clipPos,
     connect(m_ui.buttonPrevious,  SIGNAL(clicked()), this, SLOT(slotPreviousKeyframe()));
     connect(m_ui.buttonNext,      SIGNAL(clicked()), this, SLOT(slotNextKeyframe()));
     connect(m_ui.buttonAddDelete, SIGNAL(clicked()), this, SLOT(slotAddDeleteKeyframe()));
-    connect(m_ui.buttonSync,      SIGNAL(toggled(bool)), this, SLOT(slotSetSynchronize(bool)));
 
     m_spinX = new DragValue(i18nc("x axis position", "X"), 0, 0, -99000, 99000, -1, QString(), false, this);
     m_ui.horizontalLayout->addWidget(m_spinX, 0, 0);
@@ -115,39 +109,44 @@ GeometryWidget::GeometryWidget(Monitor* monitor, Timecode timecode, int clipPos,
     m_ui.horizontalLayout->setColumnStretch(4, 10);
 
     QMenu *menu = new QMenu(this);
-    QAction *adjustSize = new QAction(i18n("Adjust to original size"), this);
+    QAction *adjustSize = new QAction(KIcon("zoom-fit-best"), i18n("Adjust to original size"), this);
     connect(adjustSize, SIGNAL(triggered()), this, SLOT(slotAdjustToFrameSize()));
-    menu->addAction(adjustSize);
-    QAction *fitToWidth = new QAction(i18n("Fit to width"), this);
+    QAction *fitToWidth = new QAction(KIcon("zoom-fit-width"), i18n("Fit to width"), this);
     connect(fitToWidth, SIGNAL(triggered()), this, SLOT(slotFitToWidth()));
-    menu->addAction(fitToWidth);
-    QAction *fitToHeight = new QAction(i18n("Fit to height"), this);
+    QAction *fitToHeight = new QAction(KIcon("zoom-fit-height"), i18n("Fit to height"), this);
     connect(fitToHeight, SIGNAL(triggered()), this, SLOT(slotFitToHeight()));
-    menu->addAction(fitToHeight);
-    menu->addSeparator();
+
     QAction *importKeyframes = new QAction(i18n("Import keyframes from clip"), this);
     connect(importKeyframes, SIGNAL(triggered()), this, SIGNAL(importClipKeyframes()));
     menu->addAction(importKeyframes);
+    QAction *resetKeyframes = new QAction(i18n("Reset keyframes"), this);
+    connect(resetKeyframes, SIGNAL(triggered()), this, SLOT(slotResetKeyframes()));
+    menu->addAction(resetKeyframes);
     menu->addSeparator();
+
+    QAction *syncTimeline = new QAction(KIcon("insert-link"), i18n("Synchronize with timeline cursor"), this);
+    syncTimeline->setCheckable(true);
+    syncTimeline->setChecked(KdenliveSettings::transitionfollowcursor());
+    connect(syncTimeline, SIGNAL(toggled(bool)), this, SLOT(slotSetSynchronize(bool)));
+    menu->addAction(syncTimeline);
+
     QAction *alignleft = new QAction(KIcon("kdenlive-align-left"), i18n("Align left"), this);
     connect(alignleft, SIGNAL(triggered()), this, SLOT(slotMoveLeft()));
-    menu->addAction(alignleft);
     QAction *alignhcenter = new QAction(KIcon("kdenlive-align-hor"), i18n("Center horizontally"), this);
     connect(alignhcenter, SIGNAL(triggered()), this, SLOT(slotCenterH()));
-    menu->addAction(alignhcenter);
     QAction *alignright = new QAction(KIcon("kdenlive-align-right"), i18n("Align right"), this);
     connect(alignright, SIGNAL(triggered()), this, SLOT(slotMoveRight()));
-    menu->addAction(alignright);
     QAction *aligntop = new QAction(KIcon("kdenlive-align-top"), i18n("Align top"), this);
     connect(aligntop, SIGNAL(triggered()), this, SLOT(slotMoveTop()));
-    menu->addAction(aligntop);
     QAction *alignvcenter = new QAction(KIcon("kdenlive-align-vert"), i18n("Center vertically"), this);
     connect(alignvcenter, SIGNAL(triggered()), this, SLOT(slotCenterV()));
-    menu->addAction(alignvcenter);
     QAction *alignbottom = new QAction(KIcon("kdenlive-align-bottom"), i18n("Align bottom"), this);
     connect(alignbottom, SIGNAL(triggered()), this, SLOT(slotMoveBottom()));
-    menu->addAction(alignbottom);
+    
     m_ui.buttonOptions->setMenu(menu);
+    m_ui.buttonOptions->setIcon(KIcon("configure"));
+    m_ui.buttonOptions->setToolTip(i18n("Options"));
+    m_ui.buttonOptions->setIconSize(iconSize);
 
     QHBoxLayout *alignLayout = new QHBoxLayout;
     alignLayout->setSpacing(0);
@@ -180,6 +179,21 @@ GeometryWidget::GeometryWidget(Monitor* monitor, Timecode timecode, int clipPos,
     alignButton->setDefaultAction(alignbottom);
     alignButton->setAutoRaise(true);
     alignLayout->addWidget(alignButton);
+
+    alignButton = new QToolButton;
+    alignButton->setDefaultAction(adjustSize);
+    alignButton->setAutoRaise(true);
+    alignLayout->addWidget(alignButton);
+
+    alignButton = new QToolButton;
+    alignButton->setDefaultAction(fitToWidth);
+    alignButton->setAutoRaise(true);
+    alignLayout->addWidget(alignButton);
+    
+    alignButton = new QToolButton;
+    alignButton->setDefaultAction(fitToHeight);
+    alignButton->setAutoRaise(true);
+    alignLayout->addWidget(alignButton);
     alignLayout->addStretch(10);
 
     m_ui.horizontalLayout->addLayout(alignLayout, 1, 0, 1, 4);
@@ -238,7 +252,7 @@ GeometryWidget::GeometryWidget(Monitor* monitor, Timecode timecode, int clipPos,
 
 GeometryWidget::~GeometryWidget()
 {
-    m_scene->setEnabled(true);
+    m_scene->setEnabled(false);
     delete m_timePos;
     delete m_timeline;
     delete m_spinX;
@@ -246,10 +260,14 @@ GeometryWidget::~GeometryWidget()
     delete m_spinWidth;
     delete m_spinHeight;
     delete m_opacity;
-    m_scene->removeItem(m_rect);
-    m_scene->removeItem(m_geomPath);
-    if (m_rect) delete m_rect;
-    if (m_geomPath) delete m_geomPath;
+    if (m_rect) {
+       m_scene->removeItem(m_rect);
+       delete m_rect;
+    }
+    if (m_geomPath) {
+       m_scene->removeItem(m_geomPath);
+       delete m_geomPath;
+    }
     if (m_previous) delete m_previous;
     delete m_geometry;
     m_extraGeometryNames.clear();
@@ -308,7 +326,6 @@ void GeometryWidget::setupParam(const QDomElement elem, int minframe, int maxfra
     } else {
         m_ui.widgetTimeWrapper->setHidden(false);
         m_timeline->setKeyGeometry(m_geometry, m_outPoint - m_inPoint);
-        m_timeline->update();
         m_timePos->setRange(0, m_outPoint - m_inPoint);
     }
 
@@ -336,8 +353,8 @@ void GeometryWidget::setupParam(const QDomElement elem, int minframe, int maxfra
     m_geomPath = new OnMonitorPathItem(m_monitor->render->dar());
     connect(m_geomPath, SIGNAL(changed()), this, SLOT(slotUpdatePath()));
     m_geomPath->setPen(QPen(Qt::red));
-    m_scene->addItem(m_geomPath);
     m_geomPath->setPoints(m_geometry);
+    m_scene->addItem(m_geomPath);
     m_scene->centerView();
     slotPositionChanged(0, false);
 }
@@ -387,14 +404,14 @@ void GeometryWidget::slotPositionChanged(int pos, bool seek)
         m_rect->setEnabled(false);
         m_scene->setEnabled(false);
         m_ui.widgetGeometry->setEnabled(false);
-        m_ui.buttonAddDelete->setIcon(KIcon("document-new"));
+        m_ui.buttonAddDelete->setIcon(KIcon("list-add"));
         m_ui.buttonAddDelete->setToolTip(i18n("Add keyframe"));
     } else {
         // keyframe
         m_rect->setEnabled(true);
         m_scene->setEnabled(true);
         m_ui.widgetGeometry->setEnabled(true);
-        m_ui.buttonAddDelete->setIcon(KIcon("edit-delete"));
+        m_ui.buttonAddDelete->setIcon(KIcon("list-remove"));
         m_ui.buttonAddDelete->setToolTip(i18n("Delete keyframe"));
     }
     
@@ -506,6 +523,11 @@ void GeometryWidget::slotDeleteKeyframe(int pos)
     }
 
     m_timeline->update();
+    if (m_geomPath) {
+       m_scene->removeItem(m_geomPath);
+       m_geomPath->setPoints(m_geometry);
+       m_scene->addItem(m_geomPath);
+    }
     slotPositionChanged(pos, false);
     emit parameterChanged();
 }
@@ -590,7 +612,11 @@ void GeometryWidget::slotUpdateGeometry()
             geom->insert(item2);
         }
     }
-    if (m_geomPath) m_geomPath->setPoints(m_geometry);
+    if (m_geomPath) {
+       m_scene->removeItem(m_geomPath);
+       m_geomPath->setPoints(m_geometry);
+       m_scene->addItem(m_geomPath);
+    }
     emit parameterChanged();
 }
 
@@ -769,20 +795,59 @@ void GeometryWidget::slotFitToHeight()
     updateMonitorGeometry();
 }
 
-void GeometryWidget::importKeyframes(const QString &data)
+void GeometryWidget::slotResetKeyframes()
+{
+    // Delete existing keyframes
+    Mlt::GeometryItem item;
+    while (!m_geometry->next_key(&item, 1)) {
+       m_geometry->remove(item.frame());
+    }
+
+    // Create neutral first keyframe
+    item.frame(0);
+    item.x(0);
+    item.y(0);
+    item.w(m_monitor->render->frameRenderWidth());
+    item.h(m_monitor->render->renderHeight());
+    item.mix(100);
+    m_geometry->insert(item);
+    m_timeline->setKeyGeometry(m_geometry, m_outPoint - m_inPoint);
+    if (m_geomPath) {
+       m_scene->removeItem(m_geomPath);
+       m_geomPath->setPoints(m_geometry);
+       m_scene->addItem(m_geomPath);
+    }
+    slotPositionChanged(-1, false);
+    emit parameterChanged();
+    
+}
+
+void GeometryWidget::importKeyframes(const QString &data, int maximum)
 {
     QStringList list = data.split(';', QString::SkipEmptyParts);
+    if (list.isEmpty()) return;
     QPoint screenSize = m_frameSize;
     if (screenSize == QPoint() || screenSize.x() == 0 || screenSize.y() == 0) {
         screenSize = QPoint(m_monitor->render->frameRenderWidth(), m_monitor->render->renderHeight());
     }
-    for (int i = 0; i < list.count(); i++) {
-       Mlt::GeometryItem item;
+    // Clear existing keyframes
+    Mlt::GeometryItem item;
+    
+    while (!m_geometry->next_key(&item, 0)) {
+       m_geometry->remove(item.frame());
+    }
+    
+    int offset = 1;
+    if (maximum > 0 && list.count() > maximum) {
+       offset = list.count() / maximum;
+    }
+    for (int i = 0; i < list.count(); i += offset) {
        QString geom = list.at(i);
        if (geom.contains('=')) {
            item.frame(geom.section('=', 0, 0).toInt());
+           geom = geom.section('=', 1);
        }
-       geom = geom.section('=', 1);
+       else item.frame(0);
        if (geom.contains('/')) {
            item.x(geom.section('/', 0, 0).toDouble());
            item.y(geom.section('/', 1, 1).section(':', 0, 0).toDouble());
@@ -803,7 +868,15 @@ void GeometryWidget::importKeyframes(const QString &data)
        item.mix(100);
        m_geometry->insert(item);
     }
+    m_timeline->setKeyGeometry(m_geometry, m_outPoint - m_inPoint);
+    if (m_geomPath) {
+       m_scene->removeItem(m_geomPath);
+       m_geomPath->setPoints(m_geometry);
+       m_scene->addItem(m_geomPath);
+    }
+    slotPositionChanged(-1, false);
     emit parameterChanged();
 }
 
+
 #include "geometrywidget.moc"
index 0ae57f737468a22af3c024992cf899bdf60d0db3..cdd01cd6427a3cfe482ac7f06aeab6d6d52fcc8e 100644 (file)
@@ -58,7 +58,7 @@ public:
     /** @brief Sets the size of the original clip. */
     void setFrameSize(QPoint size);
     void addParameter(const QDomElement elem);
-    void importKeyframes(const QString &data);
+    void importKeyframes(const QString &data, int maximum);
 
 public slots:
     /** @brief Sets up the rect and the geometry object.
@@ -68,6 +68,7 @@ public slots:
     void setupParam(const QDomElement elem, int minframe, int maxframe);
     /** @brief Updates position of the local timeline to @param relTimelinePos.  */
     void slotSyncPosition(int relTimelinePos);
+    void slotResetKeyframes();
 
 private:
     Ui::GeometryWidget_UI m_ui;
index 7355b8d33b3c581b3c63947bb26d5fa55393866a..013a5e14808c14548994ebc7a6a12fb29f6d8740 100644 (file)
@@ -2573,7 +2573,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
     connect(trackView, SIGNAL(mousePosition(int)), this, SLOT(slotUpdateMousePosition(int)));
     connect(trackView->projectView(), SIGNAL(forceClipProcessing(const QString &)), m_projectList, SLOT(slotForceProcessing(const QString &)));
 
-    connect(trackView->projectView(), SIGNAL(importKeyframes(GRAPHICSRECTITEM, const QString&)), this, SLOT(slotProcessImportKeyframes(GRAPHICSRECTITEM, const QString&)));
+    connect(trackView->projectView(), SIGNAL(importKeyframes(GRAPHICSRECTITEM, const QString&, int)), this, SLOT(slotProcessImportKeyframes(GRAPHICSRECTITEM, const QString&, int)));
     
     connect(m_projectMonitor, SIGNAL(renderPosition(int)), trackView, SLOT(moveCursorPos(int)));
     connect(m_projectMonitor, SIGNAL(zoneUpdated(QPoint)), trackView, SLOT(slotSetZone(QPoint)));
@@ -4578,14 +4578,14 @@ void MainWindow::slotSaveTimelineClip()
     }
 }
 
-void MainWindow::slotProcessImportKeyframes(GRAPHICSRECTITEM type, const QString& data)
+void MainWindow::slotProcessImportKeyframes(GRAPHICSRECTITEM type, const QString& data, int maximum)
 {
     if (type == AVWIDGET) {
        // This data should be sent to the effect stack
     }
     else if (type == TRANSITIONWIDGET) {
        // This data should be sent to the transition stack
-       m_transitionConfig->setKeyframes(data);
+       m_transitionConfig->setKeyframes(data, maximum);
     }
     else {
        // Error
index 67f31ea10b723663a630c9371cdcbfcd84d39e61..db1cbc2252d415b8877429a991d45720d1c7ebfc 100644 (file)
@@ -567,7 +567,7 @@ private slots:
     /** @brief Save current timeline clip as mlt playlist. */
     void slotSaveTimelineClip();
     /** @brief Process keyframe data sent from a clip to effect / transition stack. */
-    void slotProcessImportKeyframes(GRAPHICSRECTITEM type, const QString& data);
+    void slotProcessImportKeyframes(GRAPHICSRECTITEM type, const QString& data, int maximum);
     /** @brief Move playhead to mouse curser position if defined key is pressed */
     void slotAlignPlayheadToMousePos();
 
index 37f918f356b978754b7cccb7615234d8b0487312..20152e6fca4de6e398ec38d44008ea7a546e0999 100644 (file)
@@ -56,8 +56,8 @@ rectActions OnMonitorRectItem::getMode(QPointF pos)
     right.lineTo(pol.at(2));
 
     QPainterPath mouseArea;
-    qreal xsize = 10;
-    qreal ysize = 10;
+    qreal xsize = 12;
+    qreal ysize = 12;
     if (getView()) {
         xsize /= m_view->matrix().m11();
        ysize /= m_view->matrix().m22();
index 312cf60d73cf6d7d6d744dc463e48fdaeb201c7c..996d8a8948599431fcb3922bfa09d003123c8a61 100644 (file)
@@ -246,9 +246,9 @@ void TransitionSettings::slotCheckMonitorPosition(int renderPos)
     }
 }
 
-void TransitionSettings::setKeyframes(const QString data)
+void TransitionSettings::setKeyframes(const QString data, int maximum)
 {
-    m_effectEdit->setKeyframes(data);
+    m_effectEdit->setKeyframes(data, maximum);
 }
 
 #include "transitionsettings.moc"
index 46e6eef077a2ca8a4510498ade8c0bdbced2e61c..efe0188e1e53031e1ce800158f5c6b6369042573 100644 (file)
@@ -37,7 +37,7 @@ public:
     void raiseWindow(QWidget*);
     void updateProjectFormat(MltVideoProfile profile, Timecode t, const QList <TrackInfo> info);
     void updateTimecodeFormat();
-    void setKeyframes(const QString data);
+    void setKeyframes(const QString data, int maximum);
 
 private:
     EffectStackEdit *m_effectEdit;
index b83e2f562f699fc763e33f728b717646ab6baea8..d412e48b2d3a6078e97056f31315a855d543432e 100644 (file)
@@ -6,8 +6,8 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>129</width>
-    <height>85</height>
+    <width>312</width>
+    <height>183</height>
    </rect>
   </property>
   <layout class="QGridLayout" name="gridLayout_3">
       <property name="margin">
        <number>0</number>
       </property>
-      <item row="1" column="0">
-       <widget class="QToolButton" name="buttonPrevious">
-        <property name="text">
-         <string>...</string>
+      <item row="1" column="3">
+       <widget class="QToolButton" name="buttonOptions">
+        <property name="popupMode">
+         <enum>QToolButton::InstantPopup</enum>
         </property>
         <property name="autoRaise">
          <bool>true</bool>
         </property>
        </widget>
       </item>
-      <item row="1" column="2">
-       <widget class="QToolButton" name="buttonNext">
+      <item row="1" column="4">
+       <spacer name="horizontalSpacer_3">
+        <property name="orientation">
+         <enum>Qt::Horizontal</enum>
+        </property>
+        <property name="sizeHint" stdset="0">
+         <size>
+          <width>40</width>
+          <height>20</height>
+         </size>
+        </property>
+       </spacer>
+      </item>
+      <item row="1" column="1">
+       <widget class="QToolButton" name="buttonAddDelete">
         <property name="text">
          <string>...</string>
         </property>
         </property>
        </widget>
       </item>
-      <item row="1" column="1">
-       <widget class="QToolButton" name="buttonAddDelete">
+      <item row="1" column="5">
+       <widget class="QFrame" name="frameTimePos"/>
+      </item>
+      <item row="1" column="0">
+       <widget class="QToolButton" name="buttonPrevious">
         <property name="text">
          <string>...</string>
         </property>
         </property>
        </widget>
       </item>
-      <item row="1" column="5">
-       <spacer name="horizontalSpacer_3">
-        <property name="orientation">
-         <enum>Qt::Horizontal</enum>
+      <item row="1" column="2">
+       <widget class="QToolButton" name="buttonNext">
+        <property name="text">
+         <string>...</string>
         </property>
-        <property name="sizeHint" stdset="0">
-         <size>
-          <width>40</width>
-          <height>20</height>
-         </size>
+        <property name="autoRaise">
+         <bool>true</bool>
         </property>
-       </spacer>
+       </widget>
       </item>
-      <item row="0" column="0" colspan="7">
+      <item row="0" column="0" colspan="6">
        <widget class="QFrame" name="frameTimeline">
         <property name="sizePolicy">
          <sizepolicy hsizetype="MinimumExpanding" vsizetype="Preferred">
         </property>
        </widget>
       </item>
-      <item row="1" column="6">
-       <widget class="QFrame" name="frameTimePos"/>
-      </item>
-      <item row="1" column="4">
-       <widget class="QToolButton" name="buttonSync">
-        <property name="text">
-         <string>...</string>
-        </property>
-        <property name="checkable">
-         <bool>true</bool>
-        </property>
-        <property name="autoRaise">
-         <bool>true</bool>
-        </property>
-       </widget>
-      </item>
-      <item row="1" column="3">
-       <widget class="Line" name="line_3">
-        <property name="frameShadow">
-         <enum>QFrame::Raised</enum>
-        </property>
-        <property name="orientation">
-         <enum>Qt::Vertical</enum>
-        </property>
-       </widget>
-      </item>
      </layout>
     </widget>
    </item>
         <property name="leftMargin">
          <number>0</number>
         </property>
-        <item>
-         <widget class="QToolButton" name="buttonOptions">
-          <property name="text">
-           <string>Options</string>
-          </property>
-          <property name="popupMode">
-           <enum>QToolButton::InstantPopup</enum>
-          </property>
-          <property name="autoRaise">
-           <bool>false</bool>
-          </property>
-         </widget>
-        </item>
        </layout>
       </item>
      </layout>
   <tabstop>buttonPrevious</tabstop>
   <tabstop>buttonAddDelete</tabstop>
   <tabstop>buttonNext</tabstop>
-  <tabstop>buttonSync</tabstop>
  </tabstops>
  <resources/>
  <connections/>
index dd057f8ff683d30579f5ac994a96964f4e57af8a..00413bfbec449d89591515efa735791a89aa43c9 100644 (file)
@@ -6,20 +6,16 @@
    <rect>
     <x>0</x>
     <y>0</y>
-    <width>255</width>
-    <height>115</height>
+    <width>248</width>
+    <height>163</height>
    </rect>
   </property>
   <property name="windowTitle">
-   <string>Scene Cut</string>
+   <string>Import Keyframes</string>
   </property>
   <layout class="QGridLayout" name="gridLayout">
-   <item row="0" column="0">
-    <widget class="QLabel" name="label">
-     <property name="text">
-      <string>Data to import</string>
-     </property>
-    </widget>
+   <item row="4" column="0" colspan="2">
+    <widget class="QLabel" name="keyframe_info"/>
    </item>
    <item row="0" column="1">
     <widget class="QComboBox" name="data_list">
      </property>
     </widget>
    </item>
+   <item row="5" column="0" rowspan="2" colspan="2">
+    <spacer name="verticalSpacer">
+     <property name="orientation">
+      <enum>Qt::Vertical</enum>
+     </property>
+     <property name="sizeHint" stdset="0">
+      <size>
+       <width>218</width>
+       <height>2</height>
+      </size>
+     </property>
+    </spacer>
+   </item>
+   <item row="3" column="0" colspan="2">
+    <layout class="QHBoxLayout" name="horizontalLayout">
+     <item>
+      <widget class="QCheckBox" name="limit_keyframes">
+       <property name="text">
+        <string>Limit keyframes number</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QSpinBox" name="max_keyframes">
+       <property name="enabled">
+        <bool>false</bool>
+       </property>
+       <property name="minimum">
+        <number>1</number>
+       </property>
+       <property name="maximum">
+        <number>1000</number>
+       </property>
+       <property name="value">
+        <number>10</number>
+       </property>
+      </widget>
+     </item>
+    </layout>
+   </item>
+   <item row="2" column="0" colspan="2">
+    <widget class="QCheckBox" name="import_size">
+     <property name="text">
+      <string>Size</string>
+     </property>
+    </widget>
+   </item>
    <item row="1" column="0" colspan="2">
     <widget class="QCheckBox" name="import_position">
      <property name="text">
      </property>
     </widget>
    </item>
-   <item row="2" column="0" colspan="2">
-    <widget class="QCheckBox" name="import_size">
+   <item row="0" column="0">
+    <widget class="QLabel" name="label">
      <property name="text">
-      <string>Size</string>
+      <string>Data to import</string>
      </property>
     </widget>
    </item>
-   <item row="3" column="0" colspan="2">
-    <spacer name="verticalSpacer">
-     <property name="orientation">
-      <enum>Qt::Vertical</enum>
-     </property>
-     <property name="sizeHint" stdset="0">
-      <size>
-       <width>218</width>
-       <height>2</height>
-      </size>
-     </property>
-    </spacer>
-   </item>
-   <item row="4" column="1">
+   <item row="7" column="0" colspan="2">
     <widget class="QDialogButtonBox" name="buttonBox">
      <property name="orientation">
       <enum>Qt::Horizontal</enum>
     </hint>
    </hints>
   </connection>
+  <connection>
+   <sender>limit_keyframes</sender>
+   <signal>toggled(bool)</signal>
+   <receiver>max_keyframes</receiver>
+   <slot>setEnabled(bool)</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>86</x>
+     <y>94</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>207</x>
+     <y>94</y>
+    </hint>
+   </hints>
+  </connection>
  </connections>
 </ui>