]> git.sesse.net Git - kdenlive/blob - src/customtrackview.cpp
3d8a68d5b59f7b4fdcee63fd68537731829c80fc
[kdenlive] / src / customtrackview.cpp
1 /***************************************************************************
2  *   Copyright (C) 2007 by Jean-Baptiste Mardelle (jb@kdenlive.org)        *
3  *                                                                         *
4  *   This program is free software; you can redistribute it and/or modify  *
5  *   it under the terms of the GNU General Public License as published by  *
6  *   the Free Software Foundation; either version 2 of the License, or     *
7  *   (at your option) any later version.                                   *
8  *                                                                         *
9  *   This program is distributed in the hope that it will be useful,       *
10  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12  *   GNU General Public License for more details.                          *
13  *                                                                         *
14  *   You should have received a copy of the GNU General Public License     *
15  *   along with this program; if not, write to the                         *
16  *   Free Software Foundation, Inc.,                                       *
17  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
18  ***************************************************************************/
19
20 #include <QMouseEvent>
21 #include <QStylePainter>
22 #include <QGraphicsItem>
23 #include <QDomDocument>
24 #include <QScrollBar>
25
26 #include <KDebug>
27 #include <KLocale>
28 #include <KUrl>
29 #include <KCursor>
30
31 #include "customtrackview.h"
32 #include "docclipbase.h"
33 #include "clipitem.h"
34 #include "definitions.h"
35 #include "moveclipcommand.h"
36 #include "resizeclipcommand.h"
37 #include "addtimelineclipcommand.h"
38 #include "addeffectcommand.h"
39 #include "editeffectcommand.h"
40 #include "addtransitioncommand.h"
41 #include "edittransitioncommand.h"
42 #include "kdenlivesettings.h"
43 #include "transition.h"
44 #include "clipitem.h"
45 #include "customtrackview.h"
46 #include "clipmanager.h"
47 //TODO:
48 // disable animation if user asked it in KDE's global settings
49 // http://lists.kde.org/?l=kde-commits&m=120398724717624&w=2
50 // needs something like below (taken from dolphin)
51 // #include <kglobalsettings.h>
52 // const bool animate = KGlobalSettings::graphicEffectsLevel() & KGlobalSettings::SimpleAnimationEffects;
53 // const int duration = animate ? 1500 : 1;
54
55 CustomTrackView::CustomTrackView(KdenliveDoc *doc, QGraphicsScene * projectscene, QWidget *parent)
56         : QGraphicsView(projectscene, parent), m_cursorPos(0), m_dropItem(NULL), m_cursorLine(NULL), m_operationMode(NONE), m_startPos(QPointF()), m_dragItem(NULL), m_visualTip(NULL), m_moveOpMode(NONE), m_animation(NULL), m_projectDuration(0), m_scale(1.0), m_clickPoint(QPoint()), m_document(doc), m_autoScroll(KdenliveSettings::autoscroll()), m_tracksHeight(KdenliveSettings::trackheight()) {
57     if (doc) m_commandStack = doc->commandStack();
58     else m_commandStack == NULL;
59     setMouseTracking(true);
60     setAcceptDrops(true);
61     m_animationTimer = new QTimeLine(800);
62     m_animationTimer->setFrameRange(0, 5);
63     m_animationTimer->setUpdateInterval(100);
64     m_animationTimer->setLoopCount(0);
65     m_tipColor = QColor(0, 192, 0, 200);
66     QColor border = QColor(255, 255, 255, 100);
67     m_tipPen.setColor(border);
68     m_tipPen.setWidth(3);
69     setContentsMargins(0, 0, 0, 0);
70     if (projectscene) {
71         m_cursorLine = projectscene->addLine(0, 0, 0, m_tracksHeight);
72         m_cursorLine->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIgnoresTransformations);
73         m_cursorLine->setZValue(1000);
74     }
75 }
76
77 void CustomTrackView::setContextMenu(QMenu *timeline, QMenu *clip, QMenu *transition) {
78     m_timelineContextMenu = timeline;
79     m_timelineContextClipMenu = clip;
80     m_timelineContextTransitionMenu = transition;
81 }
82
83 void CustomTrackView::checkAutoScroll() {
84     m_autoScroll = KdenliveSettings::autoscroll();
85 }
86
87 QList <TrackInfo> CustomTrackView::tracksList() const {
88     return m_tracksList;
89 }
90
91 void CustomTrackView::checkTrackHeight() {
92     if (m_tracksHeight == KdenliveSettings::trackheight()) return;
93     m_tracksHeight = KdenliveSettings::trackheight();
94     emit trackHeightChanged();
95     QList<QGraphicsItem *> itemList = items();
96     ClipItem *item;
97     Transition *transitionitem;
98     for (int i = 0; i < itemList.count(); i++) {
99         if (itemList.at(i)->type() == AVWIDGET) {
100             item = (ClipItem*) itemList.at(i);
101             item->setRect(item->rect().x(), item->track() * m_tracksHeight, item->rect().width(), m_tracksHeight - 1);
102             item->resetThumbs();
103         } else if (itemList.at(i)->type() == TRANSITIONWIDGET) {
104             transitionitem = (Transition*) itemList.at(i);
105             transitionitem->setRect(transitionitem->rect().x(), transitionitem->track() * m_tracksHeight + m_tracksHeight / 2, transitionitem->rect().width(), m_tracksHeight - 1);
106         }
107     }
108     m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), m_tracksHeight * m_tracksList.count());
109     setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_tracksList.count());
110     verticalScrollBar()->setMaximum(m_tracksHeight * m_tracksList.count());
111     update();
112 }
113
114 // virtual
115 void CustomTrackView::resizeEvent(QResizeEvent * event) {
116     QGraphicsView::resizeEvent(event);
117 }
118
119 // virtual
120 void CustomTrackView::wheelEvent(QWheelEvent * e) {
121     if (e->modifiers() == Qt::ControlModifier) {
122         if (e->delta() > 0) emit zoomIn();
123         else emit zoomOut();
124     } else {
125         if (e->delta() > 0) horizontalScrollBar()->setValue(horizontalScrollBar()->value() + horizontalScrollBar()->singleStep());
126         else  horizontalScrollBar()->setValue(horizontalScrollBar()->value() - horizontalScrollBar()->singleStep());
127     }
128 }
129
130 int CustomTrackView::getPreviousVideoTrack(int track) {
131     track = m_tracksList.count() - track - 1;
132     int videoTracksCount = 0;
133     track --;
134     for (int i = track; i > -1; i--) {
135         if (m_tracksList.at(i).type == VIDEOTRACK) return i + 1;
136     }
137     return 0;
138 }
139
140 // virtual
141 void CustomTrackView::mouseMoveEvent(QMouseEvent * event) {
142     int pos = event->x();
143     emit mousePosition(mapToScene(event->pos()).x() / m_scale);
144     /*if (event->modifiers() == Qt::ControlModifier)
145       setDragMode(QGraphicsView::ScrollHandDrag);
146     else if (event->modifiers() == Qt::ShiftModifier)
147       setDragMode(QGraphicsView::RubberBandDrag);
148     else*/
149     {
150
151         if (m_dragItem) { //event->button() == Qt::LeftButton) {
152             // a button was pressed, delete visual tips
153             if (m_operationMode == MOVE) {
154                 double snappedPos = getSnapPointForPos(mapToScene(event->pos()).x() - m_clickPoint.x());
155                 //kDebug() << "///////  MOVE CLIP, EVENT Y: "<<m_clickPoint.y();//<<event->scenePos().y()<<", SCENE HEIGHT: "<<scene()->sceneRect().height();
156                 int moveTrack = (int)  mapToScene(event->pos() + QPoint(0, (m_dragItem->type() == TRANSITIONWIDGET ? m_tracksHeight - m_clickPoint.y() : 0))).y() / m_tracksHeight;
157                 int currentTrack = m_dragItem->track();
158
159                 if (moveTrack > m_tracksList.count() - 1) moveTrack = m_tracksList.count() - 1;
160                 else if (moveTrack < 0) moveTrack = 0;
161
162                 int offset = moveTrack - currentTrack;
163                 if (offset != 0) offset = m_tracksHeight * offset;
164                 m_dragItem->moveTo(snappedPos / m_scale, m_scale, offset, moveTrack);
165             } else if (m_operationMode == RESIZESTART) {
166                 double snappedPos = getSnapPointForPos(mapToScene(event->pos()).x());
167                 m_dragItem->resizeStart(snappedPos / m_scale, m_scale);
168             } else if (m_operationMode == RESIZEEND) {
169                 double snappedPos = getSnapPointForPos(mapToScene(event->pos()).x());
170                 m_dragItem->resizeEnd(snappedPos / m_scale, m_scale);
171             } else if (m_operationMode == FADEIN) {
172                 int pos = mapToScene(event->pos()).x() / m_scale;
173                 m_dragItem->setFadeIn(pos - m_dragItem->startPos().frames(m_document->fps()), m_scale);
174             } else if (m_operationMode == FADEOUT) {
175                 int pos = mapToScene(event->pos()).x() / m_scale;
176                 m_dragItem->setFadeOut(m_dragItem->endPos().frames(m_document->fps()) - pos, m_scale);
177             }
178
179             if (m_animation) delete m_animation;
180             m_animation = NULL;
181             if (m_visualTip) delete m_visualTip;
182             m_visualTip = NULL;
183             QGraphicsView::mouseMoveEvent(event);
184             return;
185         }
186
187         QList<QGraphicsItem *> itemList = items(event->pos());
188         QGraphicsRectItem *item = NULL;
189         for (int i = 0; i < itemList.count(); i++) {
190             if (itemList.at(i)->type() == AVWIDGET || itemList.at(i)->type() == TRANSITIONWIDGET) {
191                 item = (QGraphicsRectItem*) itemList.at(i);
192                 break;
193             }
194         }
195         if (item && event->buttons() == Qt::NoButton) {
196             AbstractClipItem *clip = (AbstractClipItem*) item;
197             OPERATIONTYPE opMode = opMode = clip->operationMode(mapToScene(event->pos()), m_scale);
198             double size = 8;
199
200             if (opMode == m_moveOpMode) {
201                 QGraphicsView::mouseMoveEvent(event);
202                 return;
203             } else {
204                 if (m_visualTip) {
205                     if (m_animation) delete m_animation;
206                     m_animation = NULL;
207                     m_animationTimer->stop();
208                     delete m_visualTip;
209                     m_visualTip = NULL;
210                 }
211             }
212             m_moveOpMode = opMode;
213             if (opMode == MOVE) {
214                 setCursor(Qt::OpenHandCursor);
215             } else if (opMode == RESIZESTART) {
216                 setCursor(KCursor("left_side", Qt::SizeHorCursor));
217                 kDebug() << "********  RESIZE CLIP START; WIDTH: " << size;
218                 if (m_visualTip == NULL) {
219                     QPolygon polygon;
220                     polygon << QPoint(clip->rect().x(), clip->rect().y() + clip->rect().height() / 2 - size * 2);
221                     polygon << QPoint(clip->rect().x() + size * 2, clip->rect().y() + clip->rect().height() / 2);
222                     polygon << QPoint(clip->rect().x(), clip->rect().y() + clip->rect().height() / 2 + size * 2);
223                     polygon << QPoint(clip->rect().x(), clip->rect().y() + clip->rect().height() / 2 - size * 2);
224
225                     m_visualTip = new QGraphicsPolygonItem(polygon);
226                     ((QGraphicsPolygonItem*) m_visualTip)->setBrush(m_tipColor);
227                     ((QGraphicsPolygonItem*) m_visualTip)->setPen(m_tipPen);
228                     m_visualTip->setZValue(100);
229                     m_animation = new QGraphicsItemAnimation;
230                     m_animation->setItem(m_visualTip);
231                     m_animation->setTimeLine(m_animationTimer);
232                     m_visualTip->setPos(0, 0);
233                     double scale = 2.0;
234                     m_animation->setScaleAt(.5, scale, 1);
235                     m_animation->setPosAt(.5, QPointF(clip->rect().x() - clip->rect().x() * scale, 0));
236                     scale = 1.0;
237                     m_animation->setScaleAt(1, scale, 1);
238                     m_animation->setPosAt(1, QPointF(clip->rect().x() - clip->rect().x() * scale, 0));
239                     scene()->addItem(m_visualTip);
240                     m_animationTimer->start();
241                 }
242             } else if (opMode == RESIZEEND) {
243                 setCursor(KCursor("right_side", Qt::SizeHorCursor));
244                 if (m_visualTip == NULL) {
245                     QPolygon polygon;
246                     polygon << QPoint(clip->rect().x() + clip->rect().width(), clip->rect().y() + clip->rect().height() / 2 - size * 2);
247                     polygon << QPoint(clip->rect().x() + clip->rect().width() - size * 2, clip->rect().y() + clip->rect().height() / 2);
248                     polygon << QPoint(clip->rect().x() + clip->rect().width(), clip->rect().y() + clip->rect().height() / 2 + size * 2);
249                     polygon << QPoint(clip->rect().x() + clip->rect().width(), clip->rect().y() + clip->rect().height() / 2 - size * 2);
250
251                     m_visualTip = new QGraphicsPolygonItem(polygon);
252                     ((QGraphicsPolygonItem*) m_visualTip)->setBrush(m_tipColor);
253                     ((QGraphicsPolygonItem*) m_visualTip)->setPen(m_tipPen);
254
255                     m_visualTip->setZValue(100);
256                     m_animation = new QGraphicsItemAnimation;
257                     m_animation->setItem(m_visualTip);
258                     m_animation->setTimeLine(m_animationTimer);
259                     m_visualTip->setPos(0, 0);
260                     double scale = 2.0;
261                     m_animation->setScaleAt(.5, scale, 1);
262                     m_animation->setPosAt(.5, QPointF(clip->rect().x() - clip->rect().x() * scale - clip->rect().width(), 0));
263                     scale = 1.0;
264                     m_animation->setScaleAt(1, scale, 1);
265                     m_animation->setPosAt(1, QPointF(clip->rect().x() - clip->rect().x() * scale, 0));
266                     scene()->addItem(m_visualTip);
267                     m_animationTimer->start();
268                 }
269             } else if (opMode == FADEIN) {
270                 if (m_visualTip == NULL) {
271                     m_visualTip = new QGraphicsEllipseItem(clip->rect().x() + clip->fadeIn() * m_scale - size, clip->rect().y() - 8, size * 2, 16);
272                     ((QGraphicsEllipseItem*) m_visualTip)->setBrush(m_tipColor);
273                     ((QGraphicsEllipseItem*) m_visualTip)->setPen(m_tipPen);
274                     m_visualTip->setZValue(100);
275                     m_animation = new QGraphicsItemAnimation;
276                     m_animation->setItem(m_visualTip);
277                     m_animation->setTimeLine(m_animationTimer);
278                     m_visualTip->setPos(0, 0);
279                     double scale = 2.0;
280                     m_animation->setScaleAt(.5, scale, scale);
281                     m_animation->setPosAt(.5, QPointF(clip->rect().x() - clip->rect().x() * scale -  clip->fadeIn() * m_scale, clip->rect().y() - clip->rect().y() * scale));
282                     scale = 1.0;
283                     m_animation->setScaleAt(1, scale, scale);
284                     m_animation->setPosAt(1, QPointF(clip->rect().x() - clip->rect().x() * scale, clip->rect().y() - clip->rect().y() * scale));
285                     scene()->addItem(m_visualTip);
286                     m_animationTimer->start();
287                 }
288                 setCursor(Qt::PointingHandCursor);
289             } else if (opMode == FADEOUT) {
290                 if (m_visualTip == NULL) {
291                     m_visualTip = new QGraphicsEllipseItem(clip->rect().x() + clip->rect().width() - clip->fadeOut() * m_scale - size, clip->rect().y() - 8, size*2, 16);
292                     ((QGraphicsEllipseItem*) m_visualTip)->setBrush(m_tipColor);
293                     ((QGraphicsEllipseItem*) m_visualTip)->setPen(m_tipPen);
294                     m_visualTip->setZValue(100);
295                     m_animation = new QGraphicsItemAnimation;
296                     m_animation->setItem(m_visualTip);
297                     m_animation->setTimeLine(m_animationTimer);
298                     m_visualTip->setPos(0, 0);
299                     double scale = 2.0;
300                     m_animation->setScaleAt(.5, scale, scale);
301                     m_animation->setPosAt(.5, QPointF(clip->rect().x() - clip->rect().x() * scale - clip->rect().width() + clip->fadeOut() * m_scale, clip->rect().y() - clip->rect().y() * scale));
302                     scale = 1.0;
303                     m_animation->setScaleAt(1, scale, scale);
304                     m_animation->setPosAt(1, QPointF(clip->rect().x() - clip->rect().x() * scale, clip->rect().y() - clip->rect().y() * scale));
305                     scene()->addItem(m_visualTip);
306                     m_animationTimer->start();
307                 }
308                 setCursor(Qt::PointingHandCursor);
309             } else if (opMode == TRANSITIONSTART) {
310                 if (m_visualTip == NULL) {
311                     m_visualTip = new QGraphicsEllipseItem(-5, -5 , 10, 10);
312                     ((QGraphicsEllipseItem*) m_visualTip)->setBrush(m_tipColor);
313                     ((QGraphicsEllipseItem*) m_visualTip)->setPen(m_tipPen);
314                     m_visualTip->setZValue(100);
315                     m_animation = new QGraphicsItemAnimation;
316                     m_animation->setItem(m_visualTip);
317                     m_animation->setTimeLine(m_animationTimer);
318                     m_visualTip->setPos(clip->rect().x() + 15, clip->rect().y() + clip->rect().height() / 2);
319                     double scale = 2.0;
320                     m_animation->setScaleAt(.5, scale, scale);
321                     scale = 1.0;
322                     m_animation->setScaleAt(1, scale, scale);
323                     scene()->addItem(m_visualTip);
324                     m_animationTimer->start();
325                 }
326                 setCursor(Qt::PointingHandCursor);
327             } else if (opMode == TRANSITIONEND) {
328                 if (m_visualTip == NULL) {
329                     m_visualTip = new QGraphicsEllipseItem(-5, -5 , 10, 10);
330                     ((QGraphicsEllipseItem*) m_visualTip)->setBrush(m_tipColor);
331                     ((QGraphicsEllipseItem*) m_visualTip)->setPen(m_tipPen);
332                     m_visualTip->setZValue(100);
333                     m_animation = new QGraphicsItemAnimation;
334                     m_animation->setItem(m_visualTip);
335                     m_animation->setTimeLine(m_animationTimer);
336                     m_visualTip->setPos(clip->rect().x() + clip->rect().width() - 15 , clip->rect().y() + clip->rect().height() / 2);
337                     double scale = 2.0;
338                     m_animation->setScaleAt(.5, scale, scale);
339                     scale = 1.0;
340                     m_animation->setScaleAt(1, scale, scale);
341                     scene()->addItem(m_visualTip);
342                     m_animationTimer->start();
343                 }
344                 setCursor(Qt::PointingHandCursor);
345             }
346         } else {
347             m_moveOpMode = NONE;
348             if (event->buttons() != Qt::NoButton && event->modifiers() == Qt::NoModifier) {
349                 setCursorPos((int) mapToScene(event->pos().x(), 0).x() / m_scale);
350             }
351             if (m_visualTip) {
352                 if (m_animation) delete m_animation;
353                 m_animationTimer->stop();
354                 m_animation = NULL;
355                 delete m_visualTip;
356                 m_visualTip = NULL;
357
358             }
359             setCursor(Qt::ArrowCursor);
360         }
361     }
362     QGraphicsView::mouseMoveEvent(event);
363 }
364
365 // virtual
366 void CustomTrackView::mousePressEvent(QMouseEvent * event) {
367     activateMonitor();
368     int pos = event->x();
369     if (event->modifiers() == Qt::ControlModifier) {
370         setDragMode(QGraphicsView::ScrollHandDrag);
371         QGraphicsView::mousePressEvent(event);
372         return;
373     } else if (event->modifiers() == Qt::ShiftModifier) {
374         setDragMode(QGraphicsView::RubberBandDrag);
375         QGraphicsView::mousePressEvent(event);
376         return;
377     } else {
378         bool collision = false;
379         QList<QGraphicsItem *> collisionList = items(event->pos());
380         AbstractClipItem *clipItem = NULL, *transitionItem = NULL;
381         for (int i = 0; i < collisionList.size(); ++i) {
382             QGraphicsItem *item = collisionList.at(i);
383             if (item->type() == AVWIDGET || item->type() == TRANSITIONWIDGET) {
384                 // select item
385                 if (!item->isSelected()) {
386
387                     item->setSelected(true);
388                     update();
389                 }
390
391                 m_dragItem = (AbstractClipItem *) item;
392                 if (item->type() == AVWIDGET) {
393                     clipItem = m_dragItem;
394                 } else if (item->type() == TRANSITIONWIDGET) {
395                     transitionItem = m_dragItem;
396                 }
397                 m_clickPoint = QPoint(mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps()) * m_scale, event->pos().y() - m_dragItem->rect().top());
398                 m_operationMode = m_dragItem->operationMode(item->mapFromScene(mapToScene(event->pos())), m_scale);
399                 if (m_operationMode == MOVE) setCursor(Qt::ClosedHandCursor);
400                 if (m_operationMode == MOVE || m_operationMode == RESIZESTART)
401                     m_startPos = QPointF(m_dragItem->startPos().frames(m_document->fps()), m_dragItem->track());
402                 else if (m_operationMode == RESIZEEND)
403                     m_startPos = QPointF(m_dragItem->endPos().frames(m_document->fps()), m_dragItem->track());
404                 else if (m_operationMode == TRANSITIONSTART) {
405                     Transition *tr = new Transition(
406                         QRect(m_dragItem->startPos().frames(m_document->fps()) *m_scale , m_dragItem->rect().y() + m_dragItem->rect().height() / 2,
407                               GenTime(2.5).frames(m_document->fps()) *m_scale ,  m_dragItem->rect().height()
408                              ),
409                         (ClipItem*)m_dragItem, "luma" , m_dragItem->startPos(), m_dragItem->startPos() + GenTime(2.5), m_document->fps());
410                     tr->setTrack(m_dragItem->track());
411                     scene()->addItem(tr);
412                     //m_dragItem->addTransition(tra);
413                 }
414                 updateSnapPoints(m_dragItem);
415                 kDebug() << "//////// ITEM CLICKED: " << m_startPos;
416                 collision = true;
417                 break;
418             }
419         }
420         emit clipItemSelected((ClipItem*) clipItem);
421         emit transitionItemSelected((Transition*) transitionItem);
422         if (!collision) {
423             kDebug() << "//////// NO ITEM FOUND ON CLICK";
424             m_dragItem = NULL;
425             setCursor(Qt::ArrowCursor);
426             QList<QGraphicsItem *> itemList = items();
427             for (int i = 0; i < itemList.count(); i++)
428                 itemList.at(i)->setSelected(false);
429             //emit clipItemSelected(NULL);
430             if (event->button() == Qt::RightButton) {
431                 displayContextMenu(event->globalPos());
432             } else setCursorPos((int) mapToScene(event->x(), 0).x() / m_scale);
433         } else if (event->button() == Qt::RightButton) {
434             m_operationMode = NONE;
435             displayContextMenu(event->globalPos(), (ClipItem *) m_dragItem);
436             m_dragItem = NULL;
437         }
438     }
439     //kDebug()<<pos;
440     //QGraphicsView::mousePressEvent(event);
441 }
442
443 void CustomTrackView::displayContextMenu(QPoint pos, ClipItem *clip) {
444     m_timelineContextClipMenu->popup(pos);
445 }
446
447 void CustomTrackView::activateMonitor() {
448     emit activateDocumentMonitor();
449 }
450
451 void CustomTrackView::dragEnterEvent(QDragEnterEvent * event) {
452     if (event->mimeData()->hasFormat("kdenlive/producerslist")) {
453         kDebug() << "///////////////  DRAG ENTERED, TEXT: " << event->mimeData()->data("kdenlive/producerslist");
454         QStringList ids = QString(event->mimeData()->data("kdenlive/producerslist")).split(";");
455         //TODO: drop of several clips
456         for (int i = 0; i < ids.size(); ++i) {
457         }
458         DocClipBase *clip = m_document->getBaseClip(ids.at(0).toInt());
459         if (clip == NULL) kDebug() << " WARNING))))))))) CLIP NOT FOUND : " << ids.at(0).toInt();
460         addItem(clip, event->pos());
461         event->acceptProposedAction();
462     } else QGraphicsView::dragEnterEvent(event);
463 }
464
465 void CustomTrackView::slotRefreshEffects(ClipItem *clip) {
466     int track = m_tracksList.count() - clip->track();
467     GenTime pos = clip->startPos();
468     m_document->renderer()->mltRemoveEffect(track, pos, "-1", false);
469     for (int i = 0; i < clip->effectsCount(); i++) {
470         m_document->renderer()->mltAddEffect(track, pos, clip->getEffectArgs(clip->effectAt(i)), false);
471     }
472     m_document->renderer()->doRefresh();
473 }
474
475 void CustomTrackView::addEffect(int track, GenTime pos, QDomElement effect) {
476     ClipItem *clip = getClipItemAt(pos.frames(m_document->fps()) + 1, m_tracksList.count() - track);
477     if (clip) {
478         QMap <QString, QString> effectParams = clip->addEffect(effect);
479         m_document->renderer()->mltAddEffect(track, pos, effectParams);
480         emit clipItemSelected(clip);
481     }
482 }
483
484 void CustomTrackView::deleteEffect(int track, GenTime pos, QDomElement effect) {
485     QString index = effect.attribute("kdenlive_ix");
486     m_document->renderer()->mltRemoveEffect(track, pos, index);
487     ClipItem *clip = getClipItemAt(pos.frames(m_document->fps()) + 1, m_tracksList.count() - track);
488     if (clip) {
489         clip->deleteEffect(index);
490         emit clipItemSelected(clip);
491     }
492 }
493
494 void CustomTrackView::slotAddEffect(QDomElement effect, GenTime pos, int track) {
495     QList<QGraphicsItem *> itemList;
496     if (track == -1)
497         itemList = items();
498     else {
499         ClipItem *clip = getClipItemAt(pos.frames(m_document->fps()) + 1, track);
500         if (clip) itemList.append(clip);
501         else kDebug() << "------   wrning, clip eff not found";
502     }
503     kDebug() << "// REQUESTING EFFECT ON CLIP: " << pos.frames(25) << ", TRK: " << track;
504     for (int i = 0; i < itemList.count(); i++) {
505         if (itemList.at(i)->type() == AVWIDGET && (itemList.at(i)->isSelected() || track != -1)) {
506             ClipItem *item = (ClipItem *)itemList.at(i);
507             // the kdenlive_ix int is used to identify an effect in mlt's playlist, should
508             // not be changed
509             if (effect.attribute("kdenlive_ix").toInt() == 0)
510                 effect.setAttribute("kdenlive_ix", QString::number(item->effectsCounter()));
511             AddEffectCommand *command = new AddEffectCommand(this, m_tracksList.count() - item->track(), item->startPos(), effect, true);
512             m_commandStack->push(command);
513         }
514     }
515     m_document->setModified(true);
516 }
517
518 void CustomTrackView::slotDeleteEffect(ClipItem *clip, QDomElement effect) {
519     AddEffectCommand *command = new AddEffectCommand(this, m_tracksList.count() - clip->track(), clip->startPos(), effect, false);
520     m_commandStack->push(command);
521     m_document->setModified(true);
522 }
523
524 void CustomTrackView::updateEffect(int track, GenTime pos, QDomElement effect) {
525     ClipItem *clip = getClipItemAt(pos.frames(m_document->fps()) + 1, m_tracksList.count() - track);
526     if (clip) {
527         QMap <QString, QString> effectParams = clip->getEffectArgs(effect);
528         if (effectParams["disabled"] == "1") {
529             QString index = effectParams["kdenlive_ix"];
530             m_document->renderer()->mltRemoveEffect(track, pos, index);
531         } else m_document->renderer()->mltEditEffect(m_tracksList.count() - clip->track(), clip->startPos(), effectParams);
532     }
533     m_document->setModified(true);
534 }
535
536 void CustomTrackView::slotChangeEffectState(ClipItem *clip, QDomElement effect, bool disable) {
537     QDomElement oldEffect = effect.cloneNode().toElement();
538     effect.setAttribute("disabled", disable);
539     EditEffectCommand *command = new EditEffectCommand(this, m_tracksList.count() - clip->track(), clip->startPos(), oldEffect, effect, true);
540     m_commandStack->push(command);
541     m_document->setModified(true);
542 }
543
544 void CustomTrackView::slotUpdateClipEffect(ClipItem *clip, QDomElement oldeffect, QDomElement effect) {
545     EditEffectCommand *command = new EditEffectCommand(this, m_tracksList.count() - clip->track(), clip->startPos(), oldeffect, effect, true);
546     m_commandStack->push(command);
547 }
548
549 void CustomTrackView::slotAddTransition(ClipItem* clip , QDomElement transition, GenTime startTime , int startTrack) {
550     AddTransitionCommand* command = new AddTransitionCommand(this, startTrack, transition, startTime, true);
551     m_commandStack->push(command);
552     m_document->setModified(true);
553 }
554
555 void CustomTrackView::addTransition(int startTrack, GenTime startPos , QDomElement e) {
556     QMap < QString, QString> map;
557
558     QDomNamedNodeMap attribs = e.attributes();
559     for (int i = 0;i < attribs.count();i++) {
560         if (attribs.item(i).nodeName() != "type" &&
561                 attribs.item(i).nodeName() != "start" &&
562                 attribs.item(i).nodeName() != "end"
563            )
564             map[attribs.item(i).nodeName()] = attribs.item(i).nodeValue();
565     }
566     map["resource"] = "%luma12.pgm";
567     kDebug() << "---- ADDING transition " << e.attribute("type") << ", on tracks " << m_tracksList.count() - e.attribute("transition_track").toInt() << " / " << getPreviousVideoTrack(e.attribute("transition_track").toInt());
568     m_document->renderer()->mltAddTransition(e.attribute("type"), getPreviousVideoTrack(e.attribute("transition_track").toInt()), m_tracksList.count() - e.attribute("transition_track").toInt() ,
569             GenTime(e.attribute("start").toInt(), m_document->renderer()->fps()),
570             GenTime(e.attribute("end").toInt(), m_document->renderer()->fps()),
571             map);
572
573     m_document->setModified(true);
574 }
575
576 void CustomTrackView::deleteTransition(int, GenTime, QDomElement e) {
577     QMap < QString, QString> map;
578     QDomNamedNodeMap attribs = e.attributes();
579     m_document->renderer()->mltDeleteTransition(e.attribute("type"), getPreviousVideoTrack(e.attribute("transition_track").toInt()), m_tracksList.count() - e.attribute("transition_track").toInt() ,
580             GenTime(e.attribute("start").toInt(), m_document->renderer()->fps()),
581             GenTime(e.attribute("end").toInt(), m_document->renderer()->fps()),
582             map);
583     m_document->setModified(true);
584 }
585
586 void CustomTrackView::slotTransitionUpdated(QDomElement old, QDomElement newEffect) {
587     EditTransitionCommand *command = new EditTransitionCommand(this, newEffect.attribute("a_track").toInt(), GenTime(newEffect.attribute("start").toInt(), m_document->renderer()->fps()) , old, newEffect , true);
588     m_commandStack->push(command);
589     m_document->setModified(true);
590 }
591
592 void CustomTrackView::updateTransition(int track, GenTime pos, QDomElement oldTransition, QDomElement transition) {
593     QMap < QString, QString> map;
594     QDomNamedNodeMap attribs = transition.attributes();
595     for (int i = 0;i < attribs.count();i++) {
596         if (attribs.item(i).nodeName() != "type" &&
597                 attribs.item(i).nodeName() != "start" &&
598                 attribs.item(i).nodeName() != "end"
599            )
600             map[attribs.item(i).nodeName()] = attribs.item(i).nodeValue();
601     }
602     m_document->renderer()->mltUpdateTransition(oldTransition.attribute("type"), transition.attribute("type"), m_tracksList.count() - 1  - transition.attribute("transition_track").toInt(), m_tracksList.count() - transition.attribute("transition_track").toInt() ,
603             GenTime(transition.attribute("start").toInt(), m_document->renderer()->fps()),
604             GenTime(transition.attribute("end").toInt(), m_document->renderer()->fps()),
605             map);
606     m_document->setModified(true);
607 }
608
609 void CustomTrackView::addItem(DocClipBase *clip, QPoint pos) {
610     int in = 0;
611     GenTime out = clip->duration();
612     //kdDebug()<<"- - - -CREATING CLIP, duration = "<<out<<", URL: "<<clip->fileURL();
613     int trackTop = ((int) mapToScene(pos).y() / m_tracksHeight) * m_tracksHeight + 1;
614     m_dropItem = new ClipItem(clip, ((int) mapToScene(pos).y() / m_tracksHeight), GenTime(), QRectF(mapToScene(pos).x() * m_scale, trackTop, out.frames(m_document->fps()) * m_scale, m_tracksHeight - 1), out, m_document->fps());
615     scene()->addItem(m_dropItem);
616 }
617
618
619 void CustomTrackView::dragMoveEvent(QDragMoveEvent * event) {
620     event->setDropAction(Qt::IgnoreAction);
621     //kDebug()<<"+++++++++++++   DRAG MOVE, : "<<mapToScene(event->pos()).x()<<", SCAL: "<<m_scale;
622     if (m_dropItem) {
623         int track = (int) mapToScene(event->pos()).y() / m_tracksHeight; //) * (m_scale * 50) + m_scale;
624         m_dropItem->moveTo(mapToScene(event->pos()).x() / m_scale, m_scale, (track - m_dropItem->track()) * m_tracksHeight, track);
625         event->setDropAction(Qt::MoveAction);
626         if (event->mimeData()->hasFormat("kdenlive/producerslist")) {
627             event->acceptProposedAction();
628         }
629     } else {
630         QGraphicsView::dragMoveEvent(event);
631     }
632 }
633
634 void CustomTrackView::dragLeaveEvent(QDragLeaveEvent * event) {
635     if (m_dropItem) {
636         delete m_dropItem;
637         m_dropItem = NULL;
638     } else QGraphicsView::dragLeaveEvent(event);
639 }
640
641 void CustomTrackView::dropEvent(QDropEvent * event) {
642     if (m_dropItem) {
643         AddTimelineClipCommand *command = new AddTimelineClipCommand(this, m_dropItem->xml(), m_dropItem->clipProducer(), m_dropItem->track(), m_dropItem->startPos(), m_dropItem->rect(), m_dropItem->duration(), false, false);
644         m_commandStack->push(command);
645         m_dropItem->baseClip()->addReference();
646         m_document->updateClip(m_dropItem->baseClip()->getId());
647         // kDebug()<<"IIIIIIIIIIIIIIIIIIIIIIII TRAX CNT: "<<m_tracksList.count()<<", DROP: "<<m_dropItem->track();
648         m_document->renderer()->mltInsertClip(m_tracksList.count() - m_dropItem->track(), m_dropItem->startPos(), m_dropItem->xml());
649         m_document->setModified(true);
650     } else QGraphicsView::dropEvent(event);
651     m_dropItem = NULL;
652 }
653
654
655 QStringList CustomTrackView::mimeTypes() const {
656     QStringList qstrList;
657     // list of accepted mime types for drop
658     qstrList.append("text/plain");
659     qstrList.append("kdenlive/producerslist");
660     return qstrList;
661 }
662
663 Qt::DropActions CustomTrackView::supportedDropActions() const {
664     // returns what actions are supported when dropping
665     return Qt::MoveAction;
666 }
667
668 void CustomTrackView::setDuration(int duration) {
669     kDebug() << "/////////////  PRO DUR: " << duration << ", SCALE. " << m_scale << ", height: " << 50 * m_tracksList.count();
670     m_projectDuration = duration;
671     scene()->setSceneRect(0, 0, (m_projectDuration + 500) * m_scale, scene()->sceneRect().height()); //50 * m_tracksCount);
672     horizontalScrollBar()->setMaximum((m_projectDuration + 500) * m_scale);
673 }
674
675 int CustomTrackView::duration() const {
676     return m_projectDuration;
677 }
678
679 void CustomTrackView::addTrack(TrackInfo type) {
680     m_tracksList << type;
681     m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), m_tracksHeight * m_tracksList.count());
682     setSceneRect(0, 0, sceneRect().width(), m_tracksHeight * m_tracksList.count());
683     verticalScrollBar()->setMaximum(m_tracksHeight * m_tracksList.count());
684     //setFixedHeight(50 * m_tracksCount);
685 }
686
687 void CustomTrackView::removeTrack() {
688     // TODO: implement track deletion
689     //m_tracksCount--;
690     m_cursorLine->setLine(m_cursorLine->line().x1(), 0, m_cursorLine->line().x1(), m_tracksHeight * m_tracksList.count());
691 }
692
693
694 void CustomTrackView::slotSwitchTrackAudio(int ix) {
695     int tracknumber = m_tracksList.count() - ix;
696     kDebug() << "/////  MUTING TRK: " << ix << "; PL NUM: " << tracknumber;
697     m_tracksList[tracknumber - 1].isMute = !m_tracksList.at(tracknumber - 1).isMute;
698     m_document->renderer()->mltChangeTrackState(tracknumber, m_tracksList.at(tracknumber - 1).isMute, m_tracksList.at(tracknumber - 1).isBlind);
699 }
700
701 void CustomTrackView::slotSwitchTrackVideo(int ix) {
702     int tracknumber = m_tracksList.count() - ix;
703     m_tracksList[tracknumber - 1].isBlind = !m_tracksList.at(tracknumber - 1).isBlind;
704     m_document->renderer()->mltChangeTrackState(tracknumber, m_tracksList.at(tracknumber - 1).isMute, m_tracksList.at(tracknumber - 1).isBlind);
705 }
706
707 void CustomTrackView::deleteClip(int clipId) {
708     QList<QGraphicsItem *> itemList = items();
709     for (int i = 0; i < itemList.count(); i++) {
710         if (itemList.at(i)->type() == AVWIDGET) {
711             ClipItem *item = (ClipItem *)itemList.at(i);
712             if (item->clipProducer() == clipId) {
713                 AddTimelineClipCommand *command = new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->track(), item->startPos(), item->rect(), item->duration(), true, true);
714                 m_commandStack->push(command);
715                 //delete item;
716             }
717         }
718     }
719 }
720
721 void CustomTrackView::setCursorPos(int pos, bool seek) {
722     emit cursorMoved(m_cursorPos * m_scale, pos * m_scale);
723     m_cursorPos = pos;
724     m_cursorLine->setPos(pos * m_scale, 0);
725     if (seek) m_document->renderer()->seek(GenTime(pos, m_document->fps()));
726     else if (m_autoScroll && m_scale < 50) checkScrolling();
727 }
728
729 void CustomTrackView::updateCursorPos() {
730     m_cursorLine->setPos(m_cursorPos * m_scale, 0);
731 }
732
733 int CustomTrackView::cursorPos() {
734     return m_cursorPos * m_scale;
735 }
736
737 void CustomTrackView::checkScrolling() {
738     QRect rectInView = viewport()->rect();
739     int delta = rectInView.width() / 3;
740     int max = rectInView.right() + horizontalScrollBar()->value() - delta;
741     //kDebug() << "CURSOR POS: "<<m_cursorPos<< "Scale: "<<m_scale;
742     if (m_cursorPos * m_scale >= max) horizontalScrollBar()->setValue(horizontalScrollBar()->value() + 1 + m_scale);
743 }
744
745 void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) {
746     QGraphicsView::mouseReleaseEvent(event);
747     setDragMode(QGraphicsView::NoDrag);
748     if (m_dragItem == NULL) return;
749     if (m_operationMode == MOVE) setCursor(Qt::OpenHandCursor);
750     if (m_operationMode == MOVE && m_startPos.x() != m_dragItem->startPos().frames(m_document->fps())) {
751         // move clip
752         MoveClipCommand *command = new MoveClipCommand(this, m_startPos, QPointF(m_dragItem->startPos().frames(m_document->fps()), m_dragItem->track()), false);
753         m_commandStack->push(command);
754         if (m_dragItem->type() == AVWIDGET) m_document->renderer()->mltMoveClip(m_tracksList.count() - m_startPos.y(), m_tracksList.count() - m_dragItem->track(), m_startPos.x(), m_dragItem->startPos().frames(m_document->fps()));
755     } else if (m_operationMode == RESIZESTART) {
756         // resize start
757         ResizeClipCommand *command = new ResizeClipCommand(this, m_startPos, QPointF(m_dragItem->startPos().frames(m_document->fps()), m_dragItem->track()), true, false);
758
759         if (m_dragItem->type() == AVWIDGET) m_document->renderer()->mltResizeClipStart(m_tracksList.count() - m_dragItem->track(), m_dragItem->endPos(), m_dragItem->startPos(), GenTime(m_startPos.x(), m_document->fps()), m_dragItem->cropStart(), m_dragItem->cropStart() + m_dragItem->endPos() - m_dragItem->startPos());
760         m_commandStack->push(command);
761         m_document->renderer()->doRefresh();
762     } else if (m_operationMode == RESIZEEND) {
763         // resize end
764         ResizeClipCommand *command = new ResizeClipCommand(this, m_startPos, QPointF(m_dragItem->endPos().frames(m_document->fps()), m_dragItem->track()), false, false);
765
766         if (m_dragItem->type() == AVWIDGET) m_document->renderer()->mltResizeClipEnd(m_tracksList.count() - m_dragItem->track(), m_dragItem->startPos(), m_dragItem->cropStart(), m_dragItem->cropStart() + m_dragItem->endPos() - m_dragItem->startPos());
767         m_commandStack->push(command);
768         m_document->renderer()->doRefresh();
769     }
770     m_document->setModified(true);
771     m_operationMode = NONE;
772     m_dragItem = NULL;
773 }
774
775 void CustomTrackView::deleteClip(int track, GenTime startpos, const QRectF &rect) {
776     ClipItem *item = getClipItemAt(startpos, track);
777     if (!item) {
778         kDebug() << "----------------  ERROR, CANNOT find clip to move at: " << rect.x();
779         return;
780     }
781     item->baseClip()->removeReference();
782     m_document->updateClip(item->baseClip()->getId());
783     delete item;
784     m_document->renderer()->mltRemoveClip(m_tracksList.count() - track, startpos);
785     m_document->renderer()->doRefresh();
786 }
787
788 void CustomTrackView::deleteSelectedClips() {
789     QList<QGraphicsItem *> itemList = items();
790     for (int i = 0; i < itemList.count(); i++) {
791         if (itemList.at(i)->type() == AVWIDGET && itemList.at(i)->isSelected()) {
792             ClipItem *item = (ClipItem *) itemList.at(i);
793             AddTimelineClipCommand *command = new AddTimelineClipCommand(this, item->xml(), item->clipProducer(), item->track(), item->startPos(), item->rect(), item->duration(), true, true);
794             m_commandStack->push(command);
795         }
796     }
797 }
798
799 void CustomTrackView::addClip(QDomElement xml, int clipId, int track, GenTime startpos, const QRectF &rect, GenTime duration) {
800     QRect r(startpos.frames(m_document->fps()) * m_scale, m_tracksHeight * track, duration.frames(m_document->fps()) * m_scale, m_tracksHeight - 1);
801     DocClipBase *baseclip = m_document->clipManager()->getClipById(clipId);
802     ClipItem *item = new ClipItem(baseclip, track, startpos, r, duration, m_document->fps());
803     scene()->addItem(item);
804     baseclip->addReference();
805     m_document->updateClip(baseclip->getId());
806     m_document->renderer()->mltInsertClip(m_tracksList.count() - track, startpos, xml);
807     m_document->renderer()->doRefresh();
808 }
809
810 ClipItem *CustomTrackView::getClipItemAt(int pos, int track) {
811     return (ClipItem *) scene()->itemAt(pos * m_scale, track * m_tracksHeight + m_tracksHeight / 2);
812 }
813
814 ClipItem *CustomTrackView::getClipItemAt(GenTime pos, int track) {
815     return (ClipItem *) scene()->itemAt(pos.frames(m_document->fps()) * m_scale, track * m_tracksHeight + m_tracksHeight / 2);
816 }
817
818 void CustomTrackView::moveClip(const QPointF &startPos, const QPointF &endPos) {
819     ClipItem *item = getClipItemAt(startPos.x() + 1, startPos.y());
820     if (!item) {
821         kDebug() << "----------------  ERROR, CANNOT find clip to move at: " << startPos.x() * m_scale * FRAME_SIZE + 1 << ", " << startPos.y() * m_tracksHeight + m_tracksHeight / 2;
822         return;
823     }
824     kDebug() << "----------------  Move CLIP FROM: " << startPos.x() << ", END:" << endPos.x();
825     item->moveTo(endPos.x(), m_scale, (endPos.y() - startPos.y()) * m_tracksHeight, endPos.y());
826     m_document->renderer()->mltMoveClip(m_tracksList.count() - startPos.y(), m_tracksList.count() - endPos.y(), startPos.x(), endPos.x());
827 }
828
829 void CustomTrackView::resizeClip(const QPointF &startPos, const QPointF &endPos, bool resizeClipStart) {
830     int offset;
831     if (resizeClipStart) offset = 1;
832     else offset = -1;
833     ClipItem *item = getClipItemAt(startPos.x() + offset, startPos.y());
834     if (!item) {
835         kDebug() << "----------------  ERROR, CANNOT find clip to resize at: " << startPos;
836         return;
837     }
838     qreal diff = endPos.x() - startPos.x();
839     if (resizeClipStart) {
840         m_document->renderer()->mltResizeClipStart(m_tracksList.count() - item->track(), item->endPos(), GenTime(endPos.x(), m_document->fps()), item->startPos(), item->cropStart() + GenTime(diff, m_document->fps()), item->cropStart() + GenTime(diff, m_document->fps()) + item->endPos() - GenTime(endPos.x(), m_document->fps()));
841         item->resizeStart(endPos.x(), m_scale);
842     } else {
843         m_document->renderer()->mltResizeClipEnd(m_tracksList.count() - item->track(), item->startPos(), item->cropStart(), item->cropStart() + GenTime(endPos.x(), m_document->fps()) - item->startPos());
844         item->resizeEnd(endPos.x(), m_scale);
845     }
846     m_document->renderer()->doRefresh();
847 }
848
849 double CustomTrackView::getSnapPointForPos(double pos) {
850     for (int i = 0; i < m_snapPoints.size(); ++i) {
851         if (abs(pos - m_snapPoints.at(i).frames(m_document->fps()) * m_scale) < 10) {
852             //kDebug()<<" FOUND SNAP POINT AT: "<<m_snapPoints.at(i)<<", current pos: "<<pos / m_scale;
853             return m_snapPoints.at(i).frames(m_document->fps()) * m_scale + 0.5;
854         }
855         if (m_snapPoints.at(i).frames(m_document->fps() * m_scale) > pos) break;
856     }
857     return pos;
858 }
859
860 void CustomTrackView::updateSnapPoints(AbstractClipItem *selected) {
861     m_snapPoints.clear();
862     GenTime offset;
863     if (selected) offset = selected->duration();
864     QList<QGraphicsItem *> itemList = items();
865     for (int i = 0; i < itemList.count(); i++) {
866         if (itemList.at(i)->type() == AVWIDGET && itemList.at(i) != selected) {
867             ClipItem *item = (ClipItem *)itemList.at(i);
868             GenTime start = item->startPos();
869             GenTime end = item->endPos();
870             m_snapPoints.append(start);
871             m_snapPoints.append(end);
872             if (offset != GenTime()) {
873                 if (start > offset) m_snapPoints.append(start - offset);
874                 if (end > offset) m_snapPoints.append(end - offset);
875             }
876         }
877     }
878     qSort(m_snapPoints);
879     //for (int i = 0; i < m_snapPoints.size(); ++i)
880     //    kDebug() << "SNAP POINT: " << m_snapPoints.at(i).frames(25);
881 }
882
883
884 void CustomTrackView::setScale(double scaleFactor) {
885     //scale(scaleFactor, scaleFactor);
886     double pos = cursorPos() / m_scale;
887     m_scale = scaleFactor;
888     kDebug() << " HHHHHHHH  SCALING: " << m_scale;
889     QList<QGraphicsItem *> itemList = items();
890
891     for (int i = 0; i < itemList.count(); i++) {
892         if (itemList.at(i)->type() == AVWIDGET || itemList.at(i)->type() == TRANSITIONWIDGET) {
893             AbstractClipItem *clip = (AbstractClipItem *)itemList.at(i);
894             clip->setRect(clip->startPos().frames(m_document->fps()) * m_scale, clip->rect().y(), clip->duration().frames(m_document->fps()) * m_scale, clip->rect().height());
895         }
896     }
897     updateCursorPos();
898     centerOn(QPointF(cursorPos(), m_tracksHeight));
899     scene()->setSceneRect(0, 0, (m_projectDuration + 500) * m_scale, scene()->sceneRect().height());
900 }
901
902 void CustomTrackView::drawBackground(QPainter * painter, const QRectF & rect) {
903     QRect rectInView = viewport()->rect();
904     rectInView.moveTo(horizontalScrollBar()->value(), verticalScrollBar()->value());
905
906     QColor base = palette().button().color();
907     painter->setClipRect(rect);
908     painter->drawLine(rectInView.left(), 0, rectInView.right(), 0);
909     uint max = m_tracksList.count();
910     for (uint i = 0; i < max;i++) {
911         if (m_tracksList.at(max - i - 1).type == AUDIOTRACK) painter->fillRect(rectInView.left(), m_tracksHeight * i + 1, rectInView.right() - rectInView.left() + 1, m_tracksHeight - 1, QBrush(QColor(240, 240, 255)));
912         painter->drawLine(rectInView.left(), m_tracksHeight * (i + 1), rectInView.right(), m_tracksHeight * (i + 1));
913         //painter->drawText(QRectF(10, 50 * i, 100, 50 * i + 49), Qt::AlignLeft, i18n(" Track ") + QString::number(i + 1));
914     }
915     int lowerLimit = m_tracksHeight * m_tracksList.count() + 1;
916     if (height() > lowerLimit)
917         painter->fillRect(QRectF(rectInView.left(), lowerLimit, rectInView.width(), height() - lowerLimit), QBrush(base));
918 }
919 /*
920 void CustomTrackView::drawForeground ( QPainter * painter, const QRectF & rect )
921 {
922   //kDebug()<<"/////  DRAWING FB: "<<rect.x()<<", width: "<<rect.width();
923   painter->fillRect(rect, QColor(50, rand() % 250,50,100));
924   painter->drawLine(m_cursorPos, rect.y(), m_cursorPos, rect.y() + rect.height());
925 }
926 */
927 #include "customtrackview.moc"