Logo Search packages:      
Sourcecode: kdenlive version File versions

trackpanelclipresizefunction.cpp

/***************************************************************************
                          trackpanelfunction.cpp  -  description
                             -------------------
    begin                : Sun May 18 2003
    copyright            : (C) 2003 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 "trackpanelclipresizefunction.h"

#include <kdebug.h>
#include <kiconloader.h>

#include "doctrackbase.h"
#include "kdenlive.h"
#include "ktimeline.h"
#include "kresizecommand.h"
#include "kselectclipcommand.h"

#include <cmath>

// static
const uint TrackPanelClipResizeFunction::s_resizeTolerance = 5;

TrackPanelClipResizeFunction::TrackPanelClipResizeFunction(Gui::KdenliveApp * app, Gui::KTimeLine * timeline, KdenliveDoc * document):
m_app(app),
m_timeline(timeline),
m_document(document),
m_clipUnderMouse(0),
m_resizeState(None), m_resizeCommand(0), m_snapToGrid()
{
KIconLoader* loader = KGlobal::iconLoader ();
m_startCursor = QCursor(loader->loadIcon("resize_left_cursor.png", KIcon::NoGroup, 22), 3);
m_endCursor = QCursor(loader->loadIcon("resize_right_cursor.png", KIcon::NoGroup, 22), 20);
}

TrackPanelClipResizeFunction::~TrackPanelClipResizeFunction()
{
}


00050 bool TrackPanelClipResizeFunction::mouseApplies(Gui::KTrackPanel * panel,
    QMouseEvent * event) const
{
    bool result = false;

    if (panel->hasDocumentTrackIndex()) {
      DocTrackBase *track =
          m_document->track(panel->documentTrackIndex());
      if (track) {
            GenTime mouseTime((int)m_timeline->mapLocalToValue(event->x()),
            m_document->framesPerSecond());
          DocClipRef *clip = track->getClipAt(mouseTime);
          if (clip) {
            if (event->x() <= (m_timeline->mapValueToLocal(clip->trackStart().
                      frames(m_document->framesPerSecond())) + s_resizeTolerance)) {
                result = true;
            }
            else if (event->x() >= (m_timeline->mapValueToLocal((clip->trackEnd()).
                      frames(m_document->framesPerSecond())) - s_resizeTolerance)) {
                result = true;
            }
          }
      }
    }

    return result;
}

00078 QCursor TrackPanelClipResizeFunction::getMouseCursor(Gui::KTrackPanel *panel, QMouseEvent *event)
{

    if (panel->hasDocumentTrackIndex()) {
      DocTrackBase *track =
          m_document->track(panel->documentTrackIndex());
      if (track) {
            GenTime mouseTime((int)m_timeline->mapLocalToValue(event->x()),
            m_document->framesPerSecond());
          DocClipRef *clip = track->getClipAt(mouseTime);
          if (clip) {
            if (event->x() <= (m_timeline->mapValueToLocal(clip->trackStart().
                      frames(m_document->framesPerSecond())) + s_resizeTolerance)) {
                return m_startCursor;
            }
            if (event->x() >= (m_timeline->mapValueToLocal((clip->trackEnd()).
                      frames(m_document->framesPerSecond())) - s_resizeTolerance)) {
                return m_endCursor;
            }
          }
      }
    }

    //return QCursor(Qt::SizeHorCursor);
}

00104 bool TrackPanelClipResizeFunction::mousePressed(Gui::KTrackPanel * panel,
    QMouseEvent * event)
{
    bool result = false;

    if (panel->hasDocumentTrackIndex()) {
      DocTrackBase *track =
          m_document->track(panel->documentTrackIndex());
      if (track) {
            GenTime mouseTime((int)m_timeline->mapLocalToValue(event->x()),
            m_document->framesPerSecond());
          m_clipUnderMouse = track->getClipAt(mouseTime);
          if (m_clipUnderMouse) {
            if (fabs(m_timeline->mapValueToLocal(m_clipUnderMouse->
                      trackStart().frames(m_document->
                        framesPerSecond())) - event->x()) <
                s_resizeTolerance) {
                m_resizeState = Start;
            }
            if (fabs(m_timeline->mapValueToLocal((m_clipUnderMouse->
                        trackEnd()).frames(m_document->
                        framesPerSecond())) - event->x()) <
                s_resizeTolerance) {
                m_resizeState = End;
            }
            if (!track->clipSelected(m_clipUnderMouse)) {
                KMacroCommand *macroCommand = new KMacroCommand(i18n("Select Clip"));
                macroCommand->addCommand(Command::KSelectClipCommand::selectNone(m_document));
                macroCommand->addCommand(new Command::KSelectClipCommand(m_document, m_clipUnderMouse, true));
                m_app->addCommand(macroCommand, true);
            }

            m_snapToGrid.clearSnapList();
            if (m_timeline->snapToSeekTime())
                m_snapToGrid.addToSnapList(m_timeline->seekPosition());
            m_snapToGrid.setSnapToFrame(m_timeline->snapToFrame());

            m_snapToGrid.addToSnapList(m_document->
                getSnapTimes(m_timeline->snapToBorders(),
                  m_timeline->snapToMarkers(), true, false));

            m_snapToGrid.setSnapTolerance(GenTime((int)(m_timeline->
                  mapLocalToValue(Gui::KTimeLine::snapTolerance) -
                        m_timeline->mapLocalToValue(0)),
                  m_document->framesPerSecond()));

            QValueVector < GenTime > cursor;

            if (m_resizeState == Start) {
                cursor.append(m_clipUnderMouse->trackStart());
            } else if (m_resizeState == End) {
                cursor.append(m_clipUnderMouse->trackEnd());
            }
            m_snapToGrid.setCursorTimes(cursor);
            m_resizeCommand =
                new Command::KResizeCommand(m_document,
                *m_clipUnderMouse);

            result = true;
          }
      }
    }

    return result;
}

00170 bool TrackPanelClipResizeFunction::mouseDoubleClicked(Gui::KTrackPanel *, QMouseEvent *)
{
    return false;
}

00175 bool TrackPanelClipResizeFunction::mouseReleased(Gui::KTrackPanel *, QMouseEvent *)
{
    if (!m_resizeCommand) return false;
    bool result = false;
    m_app->activateWorkspaceMonitor();
    m_resizeCommand->setEndSize(*m_clipUnderMouse);
    m_app->addCommand(m_resizeCommand, true);
    // m_document->indirectlyModified();
    m_document->slotUpdateMonitorPlaytime();
    m_resizeCommand = 0;

    result = true;
    return result;
}

00190 bool TrackPanelClipResizeFunction::mouseMoved(Gui::KTrackPanel * panel,
    QMouseEvent * event)
{
    bool result = false;

    if (panel->hasDocumentTrackIndex()) {
      DocTrackBase *track =
          m_document->track(panel->documentTrackIndex());
      if (track) {
          GenTime mouseTime =
            m_snapToGrid.getSnappedTime(m_timeline->
            timeUnderMouse(event->x()));

          if (m_clipUnderMouse) {
            result = true;
            if (m_resizeState == Start) {           
                track->resizeClipTrackStart(m_clipUnderMouse,
                  mouseTime);
                emit signalClipCropStartChanged(m_clipUnderMouse);
            } else if (m_resizeState == End) {
                track->resizeClipTrackEnd(m_clipUnderMouse, mouseTime);
                emit signalClipCropEndChanged(m_clipUnderMouse);
            } else {
                kdError() <<
                  "Unknown resize state reached in KMMTimeLineTrackView::mouseMoveEvent()"
                  << endl;
                kdError() << "(this message should never be seen!)" <<
                  endl;
            }
          }
      }
    }

    return result;
}

Generated by  Doxygen 1.6.0   Back to index