Logo Search packages:      
Sourcecode: kdenlive version File versions  Download package

kmmmonitor.cpp

/***************************************************************************
                          kmmmonitor.cpp  -  description
                             -------------------
    begin                : Sun Mar 24 2002
    copyright            : (C) 2002 by Jason Wood
    email                : jasonwood@blueyonder.co.uk
 ***************************************************************************/

/***************************************************************************
 *                                                                         *
 *   This program is free software; you can redistribute it and/or modify  *
 *   it under the terms of the GNU General Public License as published by  *
 *   the Free Software Foundation; either version 2 of the License, or     *
 *   (at your option) any later version.                                   *
 *                                                                         *
 ***************************************************************************/

#include "kmmmonitor.h"

#include <kdebug.h>
#include <kinputdialog.h>

#include <qcolor.h>
#include <qcursor.h>
#include <qpopupmenu.h>

#include "kdenlive.h"
#include "kdenlivedoc.h"
#include "docclipbase.h"
#include "docclipavfile.h"
#include "avfile.h"
#include "clipdrag.h"
#include "krendermanager.h"
#include "kaddmarkercommand.h"

#include <algorithm>

namespace Gui {

    KMMMonitor::KMMMonitor(KdenliveApp * app, KdenliveDoc * document,
      QWidget * parent, const char *name):KMonitor(parent, name),
      m_app(app), m_document(document), m_screen(new KMMScreen(this, m_screenHolder, name)), m_screenHolder(new QVBox(this,
          name)), m_editPanel(new KMMEditPanel(document, this, name)),
      m_noSeek(false), m_clip(NULL), m_referredClip(NULL) {

      connect(m_editPanel, SIGNAL(seekPositionChanged(const GenTime &)),
          this, SIGNAL(seekPositionChanged(const GenTime &)));
       connect(m_editPanel, SIGNAL(seekPositionChanged(const GenTime &)),
          this, SLOT(updateEditPanel(const GenTime &)));
       connect(m_editPanel,
          SIGNAL(setVolume(double)), this, SLOT(slotSetVolume(double)));
       connect(m_editPanel,
          SIGNAL(inpointPositionChanged(const GenTime &)), this,
          SIGNAL(inpointPositionChanged(const GenTime &)));
       connect(m_editPanel,
          SIGNAL(activatedSlider(int)), this,
          SIGNAL(activatedSlider(int)));
       connect(m_editPanel,
          SIGNAL(outpointPositionChanged(const GenTime &)), this,
         SIGNAL(outpointPositionChanged(const GenTime &)));

       connect(m_editPanel, SIGNAL(toggleSnapMarker()),
          this, SLOT(slotToggleSnapMarker()));
       connect(m_editPanel, SIGNAL(nextSnapMarkerClicked()),
          this, SLOT(slotNextSnapMarker()));
       connect(m_editPanel, SIGNAL(previousSnapMarkerClicked()),
          this, SLOT(slotPreviousSnapMarker()));

       m_screenHolder->setMargin(3);
       m_screenHolder->setPaletteBackgroundColor(QColor(0, 0, 0));
       m_screenHolder->setSizePolicy(QSizePolicy(QSizePolicy::Expanding,
            QSizePolicy::Expanding, FALSE));
      //m_editPanel->setSizePolicy(QSizePolicy (QSizePolicy::Expanding, QSizePolicy::Maximum, FALSE));
       connectScreen();
       //setSceneList(QDomDocument());
    } 
    
    KMMMonitor::~KMMMonitor() {
      if (m_editPanel)
          delete m_editPanel;
      if (m_screen)
          delete m_screen;
      if (m_screenHolder)
          delete m_screenHolder;
      if (m_clip)
          delete m_clip;
    }

    void KMMMonitor::screenPositionChanged(const GenTime & time) {
      disconnect(m_editPanel,
          SIGNAL(seekPositionChanged(const GenTime &)), m_screen,
          SLOT(seek(const GenTime &)));
      m_editPanel->seek(time);
      connect(m_editPanel, SIGNAL(seekPositionChanged(const GenTime &)),
          m_screen, SLOT(seek(const GenTime &)));
      updateEditPanel(time);
    }
/*
void KMMMonitor::swapScreens(KMMMonitor *monitor)
{
      disconnectScreen();
      monitor->disconnectScreen();

      std::swap(monitor->m_screen, m_screen);

      monitor->m_screen->reparent(monitor->m_screenHolder, 0, QPoint(0,0), true);
      m_screen->reparent(m_screenHolder, 0, QPoint(0,0), true);
      connectScreen();
      monitor->connectScreen();
}
*/

    void KMMMonitor::disconnectScreen() {
      disconnect(m_editPanel,
          SIGNAL(seekPositionChanged(const GenTime &)), m_screen,
          SLOT(seek(const GenTime &)));
    }

    void KMMMonitor::connectScreen() {
      connect(m_editPanel, SIGNAL(seekPositionChanged(const GenTime &)),
          m_screen, SLOT(seek(const GenTime &)));
    }

    void KMMMonitor::slotPlaySpeedChanged(double speed)
    {
      m_editPanel->screenPlaySpeedChanged(speed);
    }

    int KMMMonitor::externalMonitor()
    {
      return m_app->externalMonitor();
    }

    void KMMMonitor::playingStopped()
    {
      m_editPanel->screenPlayStopped();
    }

    void KMMMonitor::setSceneList(const QDomDocument & scenelist, int position) {
      m_screen->setSceneList(scenelist, position);
    }
    
    void KMMMonitor::exportCurrentFrame(KURL url, bool notify) const {
        m_screen->exportCurrentFrame(url, notify);
    }

    const GenTime & KMMMonitor::seekPosition() const {
      return m_screen->seekPosition();
    } 

    void KMMMonitor::slotSetVolume(double volume) const {
      m_screen->setVolume( volume );
    }
    
    void KMMMonitor::activateMonitor() {
      m_app->activateMonitor(this);
    }

    KRender *KMMMonitor::findRenderer(const char *name) {
      return m_app->renderManager()->findRenderer(name);
    }

    void KMMMonitor::slotSetActive() const {
        m_editPanel->rendererConnected();
      //m_screenHolder->setPaletteBackgroundColor(QColor(16, 32, 71));
      m_screen->startRenderer();
    }

    void KMMMonitor::slotSetInactive() const {
        m_editPanel->rendererDisconnected();
      m_screen->stopRenderer();
      //m_screenHolder->setPaletteBackgroundColor(QColor(0, 0, 0));
    }

    void KMMMonitor::mousePressEvent(QMouseEvent * e) {
      emit monitorClicked(this);
      if (e->button() == RightButton)
          popupContextMenu();
    }

    void KMMMonitor::clickMonitor() {
      emit monitorClicked(this);
    }

    void KMMMonitor::refreshClip() {
          if (m_clip) doCommonSetClip(false);
    }

    void KMMMonitor::refreshDisplay() const {
          m_screen->refreshDisplay();
    }

    void KMMMonitor::slotSetClip(DocClipRef * clip) {
      if (!clip) {
          kdError() << "Null clip passed, not setting monitor." << endl;
          return;
      }
        if (m_referredClip == clip) return;
      m_referredClip = 0;
      if (m_clip != 0) {
          delete m_clip;
          m_clip = 0;
      }
      // create a copy of the clip.
      m_clip = clip->clone(m_document);

      if (!m_clip) {
          kdError() <<
            "KMMMonitor : Could not copy clip - you won't be able to see it!!!"
            << endl;
      } else {
          m_referredClip = clip;
          doCommonSetClip();
      }
    }

    void KMMMonitor::slotSetClip(DocClipBase * clip) {
      if (!clip) {
          kdError() << "Null clip passed, not setting monitor." << endl;
          return;
      }
        //activateMonitor();
      m_referredClip = 0;
      if (m_clip) {
          delete m_clip;
          m_clip = 0;
      }
      // create a copy of the clip.
      m_clip = new DocClipRef(clip);
      if (!m_clip) {
          kdError() <<
            "KMMMonitor : Could not copy clip - drag 'n' drop will not work!"
            << endl;
      } else {
          doCommonSetClip(false);
      }
    }

    void KMMMonitor::slotCheckLength() {
      m_screen->updateClipLength();
    }

    void KMMMonitor::slotSetClip(QDomDocument playlist, GenTime duration) {
      if (m_clip) {
          delete m_clip;
          m_clip = 0;
      }
      m_referredClip = 0;
      m_editPanel->doStop();
      setSceneList(playlist);
      m_screen->updateClipLength();
      //m_editPanel->setClipLength((int) duration.frames(m_document->framesPerSecond()));
      activateMonitor();
    } 

    void KMMMonitor::doCommonSetClip(bool resetCropPosition) {
      m_editPanel->doStop();
      QDomDocument scenelist = m_clip->generateSceneList();
      setSceneList(scenelist, (int) m_app->cursorPosition().frames(m_document->framesPerSecond()));
      GenTime clipDuration(m_clip->duration() / m_clip->speed());
      m_screen->updateClipLength();
      m_editPanel->setClipLength((int) clipDuration.frames(m_document->framesPerSecond()));
      activateMonitor();
        if (resetCropPosition) {
         m_editPanel->setInpoint(m_clip->cropStartTime());
         m_editPanel->setOutpoint(m_clip->cropStartTime() + m_clip->cropDuration());
        }
      if ((!m_noSeek) || (seekPosition() < m_clip->cropStartTime()) ||
          (seekPosition() > clipDuration)) {
      //cropStartTime() + m_clip->cropDuration()))) {
          m_screen->seek(m_clip->cropStartTime());
      }
    }

    void KMMMonitor::slotClearClip() {
      m_referredClip = 0;
      if (m_clip) {
//        m_clip->disconnectThumbCreator();
          delete m_clip;
          m_clip = 0;
      }
      m_screen->resetRenderer();
      m_screen->updateClipLength();
      //m_editPanel->setClipLength(0);
      m_editPanel->setInpoint(GenTime(0));
      m_editPanel->setOutpoint(GenTime(0));
        m_editPanel->seek(GenTime(0));
      
    }

    void KMMMonitor::startDrag() {
      if (!m_clip) {
          kdWarning() << "KMMMonitor cannot start drag - m_clip is null!"
            << endl;
          return;
      }

      m_clip->setCropStartTime(GenTime(m_editPanel->inpoint()));
      m_clip->setTrackStart(GenTime(0));
      if (m_editPanel->inpoint() >= m_editPanel->outpoint())
          m_clip->setTrackEnd(m_editPanel->inpoint() +
            m_clip->duration());
      else
          m_clip->setTrackEnd(m_editPanel->outpoint() -
            m_editPanel->inpoint());

      ClipDrag *drag = new ClipDrag(m_clip, this, "Clip from monitor");

      drag->dragCopy();
    }

    void KMMMonitor::setNoSeek(bool noSeek) {
      m_noSeek = noSeek;
    }

    DocClipRef *KMMMonitor::clip() const {
      return m_clip;
    } 


    void KMMMonitor::slotUpdateClip(DocClipRef * clip) {
      if (m_referredClip == clip) {
          m_clip->setCropStartTime(clip->cropStartTime());
          m_clip->setCropDuration(clip->cropDuration());

          m_editPanel->setInpoint(m_clip->cropStartTime());
          m_editPanel->setOutpoint(m_clip->cropStartTime() +
            m_clip->cropDuration());
      }
    }

    void KMMMonitor::slotClipCropStartChanged(DocClipRef * clip) {
      if (m_referredClip == clip) {
          slotUpdateClip(clip);
          m_editPanel->seek(clip->cropStartTime());
      }
    }

    void KMMMonitor::slotClipCropEndChanged(DocClipRef * clip) {
      if (m_referredClip == clip) {
          slotUpdateClip(clip);
            m_editPanel->seek(clip->cropStartTime() + clip->cropDuration() - GenTime(1, m_document->framesPerSecond()));
      }
    }

    void KMMMonitor::popupContextMenu() {
      QPopupMenu *menu = NULL;
      if (QString(name()) == "ClipMonitor") menu = (QPopupMenu *) m_app->factory()->container("monitor_clip_context", m_app);
      else menu = (QPopupMenu *) m_app->factory()->container("monitor_context", m_app);
      if (menu) {
          menu->popup(QCursor::pos());
      }
    }

    void KMMMonitor::rightClickMonitor() {
      popupContextMenu();
    }

    void KMMMonitor::slotPreviousSnapMarker() {
      if (m_referredClip) {
          m_editPanel->seek(m_referredClip->referencedClip()->findPreviousSnapMarker(seekPosition()));
      } else m_app->slotPreviousSnap();
    }

    void KMMMonitor::slotNextSnapMarker() {
      if (m_referredClip) {
          m_editPanel->seek(m_referredClip->referencedClip()->findNextSnapMarker(seekPosition()));
      } else m_app->slotNextSnap();
    }

    void KMMMonitor::updateEditPanel(const GenTime & time) {
      if (m_referredClip) {
          m_editPanel->setSnapMarker(m_referredClip->hasSnapMarker(time) != GenTime(0.0));
      }
    }

    KMMEditPanel *KMMMonitor::editPanel() const {
      return m_editPanel;
    } 

    KMMScreen *KMMMonitor::screen() const {
      return m_screen;
    } 

    void KMMMonitor::slotToggleSnapMarker() {
      if (m_referredClip) {
          Command::KAddMarkerCommand * command;
          GenTime currentTime = seekPosition();
          if (m_referredClip->hasSnapMarker(currentTime) != GenTime(0.0)) {
            command =
                new Command::KAddMarkerCommand(*m_document,
                m_referredClip->referencedClip()->getId(), currentTime, QString::null, false);
          } else {
            bool ok;
            QString comment = KInputDialog::getText(i18n("Add Marker"), i18n("Marker comment: "), i18n("Marker"), &ok);
            if (ok) {
                command = new Command::KAddMarkerCommand(*m_document, m_referredClip->referencedClip()->getId(), currentTime, comment, true);
            }
            else return;
          }

          m_app->addCommand(command, true);
      } else m_app->toggleMarkerUnderCursor();
      
      updateEditPanel(seekPosition());
    }

}                       // namespace Gui

Generated by  Doxygen 1.6.0   Back to index