]> git.sesse.net Git - kdenlive/blob - src/trackview.cpp
77b76dfeaf7ddf8ac1e77a8aa2a72a83dbd91ba2
[kdenlive] / src / trackview.cpp
1
2 #include <QMouseEvent>
3 #include <QStylePainter>
4 #include <QScrollBar>
5
6 #include <KDebug>
7
8 #include "definitions.h"
9 #include "documentvideotrack.h"
10 #include "documentaudiotrack.h"
11 #include "headertrack.h"
12 #include "trackview.h"
13 #include "trackpanelclipmovefunction.h"
14
15 TrackView::TrackView(KdenliveDoc *doc, QWidget *parent)
16     : QWidget(parent), m_doc(doc), m_scale(1.0), m_panelUnderMouse(NULL), m_function(NULL)
17 {
18   setMouseTracking(true);
19   view = new Ui::TimeLine_UI();
20   view->setupUi(this);
21   m_ruler = new CustomRuler(doc->timecode());
22   QVBoxLayout *layout = new QVBoxLayout;
23   layout->addWidget(m_ruler);
24   view->ruler_frame->setLayout(layout);
25
26   m_tracksLayout = new QVBoxLayout;
27   m_tracksLayout->setContentsMargins (0, 0, 0, 0);
28   m_scrollArea = new QScrollArea;
29
30   m_tracksLayout->addWidget(m_scrollArea);
31   m_scrollArea->setHorizontalScrollBarPolicy ( Qt::ScrollBarAlwaysOn);
32   m_scrollArea->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
33   m_scrollArea->setWidgetResizable( true );
34
35   m_scrollBox = new QFrame(m_scrollArea);
36   //m_scrollBox ->setFlat(false);
37   m_scrollBox ->setFocusPolicy(Qt::WheelFocus);
38   m_scrollBox->setSizePolicy( QSizePolicy::Preferred,QSizePolicy::Fixed );
39
40   m_tracksAreaLayout = new QVBoxLayout(m_scrollBox);
41   m_tracksAreaLayout->setContentsMargins (0, 0, 0, 0);
42   m_tracksAreaLayout->setSpacing(0);
43 //MyScroll->setGeometry(...);
44   m_scrollArea->setWidget(m_scrollBox);
45
46   view->tracks_frame->setLayout(m_tracksLayout);
47
48   m_headersLayout = new QVBoxLayout;
49   m_headersLayout->setContentsMargins (0, 0, 0, 0);
50   view->headers_frame->setLayout(m_headersLayout);
51
52   parseDocument(doc->toXml());
53
54   TrackPanelClipMoveFunction *m_moveFunction = new TrackPanelClipMoveFunction(this);
55   registerFunction("move", m_moveFunction);
56   setEditMode("move");
57
58   connect(view->horizontalSlider, SIGNAL(valueChanged ( int )), this, SLOT(slotChangeZoom( int )));
59 }
60
61 void TrackView::registerFunction(const QString & name, TrackPanelFunction * function) 
62 {
63   m_factory.registerFunction(name, function);
64 }
65
66 void TrackView::parseDocument(QDomDocument doc)
67 {
68   QDomNodeList tracks = doc.elementsByTagName("playlist");
69   m_projectDuration = 300;
70   int duration;
71   for (int i = 0; i < tracks.count(); i++)
72   {
73     if (tracks.item(i).toElement().attribute("hide", QString::null) == "video") {
74       // this is an audio track
75       duration = slotAddAudioTrack(i, tracks.item(i).toElement());
76     }
77     else duration = slotAddVideoTrack(i, tracks.item(i).toElement());
78     if (duration > m_projectDuration) m_projectDuration = duration;
79   }
80   m_tracksAreaLayout->insertStretch (1000);
81   //m_scrollBox->setGeometry(0, 0, 300 * zoomFactor(), m_scrollArea->height());
82 }
83
84 void TrackView::slotChangeZoom(int factor)
85 {
86   m_ruler->setPixelPerMark(factor);
87   m_scale = m_ruler->pixelPerMark();
88   for (int i = 0; i < documentTracks.count(); i++) {
89     kDebug()<<"------REPAINTING OBJECT";
90     documentTracks.at(i)->update();
91     //documentTracks.at(i)->setFixedWidth(300 * zoomFactor());
92   }
93   m_scrollBox->setFixedWidth(( m_projectDuration + 300) * zoomFactor());
94   /*m_scrollArea->horizontalScrollBar()->setMaximum(300 * zoomFactor());
95   m_scrollArea->horizontalScrollBar()->setPageStep(FRAME_SIZE * zoomFactor());*/
96 }
97
98 const double TrackView::zoomFactor() const
99 {
100   return m_scale * FRAME_SIZE;
101 }
102
103 const int TrackView::mapLocalToValue(int x) const
104 {
105   return (int) x * zoomFactor();
106 }
107
108 KdenliveDoc *TrackView::document()
109 {
110   return m_doc;
111 }
112
113 int TrackView::slotAddAudioTrack(int ix, QDomElement xml)
114 {
115   DocumentTrack *track = new DocumentAudioTrack(xml, this, m_scrollBox);
116   HeaderTrack *header = new HeaderTrack();
117   m_tracksAreaLayout->addWidget(track); //, ix, Qt::AlignTop);
118   m_headersLayout->addWidget(header); //, ix, Qt::AlignTop);
119   documentTracks.insert(ix, track);
120   return track->duration();
121   //track->show();
122 }
123
124 int TrackView::slotAddVideoTrack(int ix, QDomElement xml)
125 {
126   DocumentTrack *track = new DocumentVideoTrack(xml, this, m_scrollBox);
127   HeaderTrack *header = new HeaderTrack();
128   m_tracksAreaLayout->addWidget(track); //, ix, Qt::AlignTop);
129   m_headersLayout->addWidget(header); //, ix, Qt::AlignTop);
130   documentTracks.insert(ix, track);
131   return track->duration();
132   //track->show();
133 }
134
135 DocumentTrack *TrackView::panelAt(int y)
136 {
137   return NULL;
138 }
139
140 void TrackView::setEditMode(const QString & editMode)
141 {
142   m_editMode = editMode;
143 }
144
145 const QString & TrackView::editMode() const
146 {
147   return m_editMode;
148 }
149
150 /** This event occurs when the mouse has been moved. */
151     void TrackView::mouseMoveEvent(QMouseEvent * event) {
152     kDebug()<<"--------  TRACKVIEW MOUSE MOVE EVENT -----";
153         if (m_panelUnderMouse) {
154             if (event->buttons() & Qt::LeftButton) {
155                 bool result = false;
156                 if (m_function)
157                     result =
158                         m_function->mouseMoved(m_panelUnderMouse, event);
159                 if (!result) {
160                     m_panelUnderMouse = 0;
161                     m_function = 0;
162                 }
163             } else {
164                 if (m_function) {
165                     m_function->mouseReleased(m_panelUnderMouse, event);
166                     m_function = 0;
167                 }
168                 m_panelUnderMouse = 0;
169             }
170         } else {
171             DocumentTrack *panel = panelAt(event->y());
172             if (panel) {
173                 QCursor result(Qt::ArrowCursor);
174
175                 TrackPanelFunction *function =
176                     getApplicableFunction(panel, editMode(),
177                     event);
178                 if (function)
179                     result = function->getMouseCursor(panel, event);
180
181                 setCursor(result);
182             } else {
183                 setCursor(QCursor(Qt::ArrowCursor));
184             }
185         }
186     }
187
188     TrackPanelFunction *TrackView::getApplicableFunction(DocumentTrack *
189         panel, const QString & editMode, QMouseEvent * event) {
190         TrackPanelFunction *function = 0;
191
192         QStringList list = panel->applicableFunctions(editMode);
193         QStringList::iterator itt = list.begin();
194
195         while (itt != list.end()) {
196             TrackPanelFunction *testFunction = m_factory.function(*itt);
197             if (testFunction) {
198                 if (testFunction->mouseApplies(panel, event)) {
199                     function = testFunction;
200                     break;
201                 }
202             }
203
204             ++itt;
205         }
206
207         return function;
208     }
209
210
211 #include "trackview.moc"