};
CustomRuler::CustomRuler(Timecode tc, CustomTrackView *parent)
- : KRuler(parent), m_timecode(tc), m_view(parent) {
+ : KRuler(parent), m_timecode(tc), m_view(parent), m_duration(0) {
slotNewOffset(0);
setRulerMetricStyle(KRuler::Pixel);
setLength(1024);
KRuler::setPixelPerMark(1.0 / scale);
}
+void CustomRuler::setDuration(int d) {
+ m_duration = d;
+ update();
+}
+
// virtual
void CustomRuler::paintEvent(QPaintEvent *e) {
// debug ("KRuler::drawContents, %s",(horizontal==dir)?"horizontal":"vertical");
QStylePainter p(this);
p.setClipRect(e->rect());
- p.fillRect(e->rect(), QBrush(QColor(255, 255, 255, 80)));
+
+ //p.fillRect(e->rect(), QBrush(QColor(200, 200, 200)));
//kDebug()<<"RULER ZONE: "<<m_zoneStart<<", OFF: "<<offset()<<", END: "<<m_zoneEnd<<", FACTOR: "<<pixelPerMark() * FRAME_SIZE;
- int zoneStart = (m_zoneStart) * pixelPerMark() * FRAME_SIZE;
- int zoneEnd = (m_zoneEnd) * pixelPerMark() * FRAME_SIZE;
+ int projectEnd = m_duration * pixelPerMark() * FRAME_SIZE;
+ p.fillRect(QRect(- offset(), e->rect().y(), projectEnd, e->rect().height()), QBrush(QColor(245, 245, 245)));
+
+
+ int zoneStart = m_zoneStart * pixelPerMark() * FRAME_SIZE;
+ int zoneEnd = m_zoneEnd * pixelPerMark() * FRAME_SIZE;
+
p.fillRect(QRect(zoneStart - offset(), e->rect().y() + e->rect().height() / 2, zoneEnd - zoneStart, e->rect().height() / 2), QBrush(QColor(133, 255, 143)));
int value = m_view->cursorPos() - offset() + 4;
m_commandStack = new QUndoGroup;
m_timelineArea = new KTabWidget(this);
- m_timelineArea->setHoverCloseButton(true);
m_timelineArea->setTabReorderingEnabled(true);
m_timelineArea->setTabBarHidden(true);
+
+ QToolButton *closeTabButton = new QToolButton;
+ connect(closeTabButton, SIGNAL(clicked()), this, SLOT(slotRemoveTab()));
+ closeTabButton->setIcon(KIcon("tab-close"));
+ closeTabButton->adjustSize();
+ closeTabButton->setToolTip(i18n("Close the current tab"));
+ m_timelineArea->setCornerWidget(closeTabButton);
connect(m_timelineArea, SIGNAL(currentChanged(int)), this, SLOT(activateDocument()));
- connect(m_timelineArea, SIGNAL(closeRequest(QWidget *)), this, SLOT(closeDocument(QWidget *)));
initEffects::parseEffectFiles(&m_audioEffects, &m_videoEffects);
timeline_buttons_ui.buttonAudio->setDown(KdenliveSettings::audiothumbnails());
connect(timeline_buttons_ui.buttonVideo, SIGNAL(clicked()), this, SLOT(slotSwitchVideoThumbs()));
connect(timeline_buttons_ui.buttonAudio, SIGNAL(clicked()), this, SLOT(slotSwitchAudioThumbs()));
+ connect(timeline_buttons_ui.buttonFitZoom, SIGNAL(clicked()), this, SLOT(slotFitZoom()));
statusBar()->insertPermanentWidget(0, statusProgressBar, 1);
statusBar()->insertPermanentWidget(1, statusLabel, 1);
statusBar()->insertPermanentWidget(ID_TIMELINE_FORMAT, m_timecodeFormat);
statusBar()->setMaximumHeight(statusBar()->font().pointSize() * 4);
- timeline_buttons_ui.buttonVideo->setIcon(KIcon("display-video"));
+ timeline_buttons_ui.buttonVideo->setIcon(KIcon("video-mpeg"));
timeline_buttons_ui.buttonVideo->setToolTip(i18n("Show video thumbnails"));
- timeline_buttons_ui.buttonAudio->setIcon(KIcon("display-audio"));
+ timeline_buttons_ui.buttonAudio->setIcon(KIcon("audio-mpeg"));
timeline_buttons_ui.buttonAudio->setToolTip(i18n("Show audio thumbnails"));
+ timeline_buttons_ui.buttonFitZoom->setIcon(KIcon("zoom-fit-best"));
+ timeline_buttons_ui.buttonFitZoom->setToolTip(i18n("Fit zoom to project"));
setupGUI(Default, "kdenliveui.rc");
connectDocument(currentTab, currentDoc);
}
-void MainWindow::closeDocument(QWidget *w) {
- if (w == m_timelineArea->currentWidget()) {
- // closing current document
- int ix = m_timelineArea->currentIndex() + 1;
- if (ix == m_timelineArea->count()) ix = 0;
- m_timelineArea->setCurrentIndex(ix);
- }
-
+void MainWindow::slotRemoveTab() {
+ QWidget *w = m_timelineArea->currentWidget();
+ // closing current document
+ int ix = m_timelineArea->currentIndex() + 1;
+ if (ix == m_timelineArea->count()) ix = 0;
+ m_timelineArea->setCurrentIndex(ix);
TrackView *tabToClose = (TrackView *) w;
KdenliveDoc *docToClose = tabToClose->document();
m_timelineArea->removeTab(m_timelineArea->indexOf(w));
+ if (m_timelineArea->count() == 1) m_timelineArea->setTabBarHidden(true);
delete docToClose;
delete w;
}
m_activeDocument->backupMltPlaylist();
if (m_activeTimeline) {
disconnect(m_projectMonitor, SIGNAL(renderPosition(int)), m_activeTimeline, SLOT(moveCursorPos(int)));
- disconnect(m_projectMonitor, SIGNAL(durationChanged(int)), m_activeTimeline->projectView(), SLOT(setDuration(int)));
+ disconnect(m_projectMonitor, SIGNAL(durationChanged(int)), m_activeTimeline, SLOT(setDuration(int)));
disconnect(m_activeDocument, SIGNAL(addProjectClip(DocClipBase *)), m_projectList, SLOT(slotAddClip(DocClipBase *)));
disconnect(m_activeDocument, SIGNAL(signalDeleteProjectClip(int)), m_projectList, SLOT(slotDeleteClip(int)));
disconnect(m_activeDocument, SIGNAL(updateClipDisplay(int)), m_projectList, SLOT(slotUpdateClip(int)));
connect(trackView, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(activateMonitor()));
connect(trackView, SIGNAL(mousePosition(int)), this, SLOT(slotUpdateMousePosition(int)));
connect(m_projectMonitor, SIGNAL(renderPosition(int)), trackView, SLOT(moveCursorPos(int)));
- connect(m_projectMonitor, SIGNAL(durationChanged(int)), trackView->projectView(), SLOT(setDuration(int)));
+ connect(m_projectMonitor, SIGNAL(durationChanged(int)), trackView, SLOT(setDuration(int)));
connect(doc, SIGNAL(addProjectClip(DocClipBase *)), m_projectList, SLOT(slotAddClip(DocClipBase *)));
connect(doc, SIGNAL(signalDeleteProjectClip(int)), m_projectList, SLOT(slotDeleteClip(int)));
connect(doc, SIGNAL(updateClipDisplay(int)), m_projectList, SLOT(slotUpdateClip(int)));
m_commandStack->setActiveStack(doc->commandStack());
m_overView->setScene(trackView->projectScene());
- m_overView->scale(m_overView->width() / trackView->duration(), m_overView->height() / (50 * trackView->tracksNumber()));
+ //m_overView->scale(m_overView->width() / trackView->duration(), m_overView->height() / (50 * trackView->tracksNumber()));
//m_overView->fitInView(m_overView->itemAt(0, 50), Qt::KeepAspectRatio);
setCaption(doc->description());
timeline_buttons_ui.zoom_slider->setValue(timeline_buttons_ui.zoom_slider->value() + 1);
}
+void MainWindow::slotFitZoom() {
+ TrackView *currentTab = (TrackView *) m_timelineArea->currentWidget();
+ if (currentTab) {
+ timeline_buttons_ui.zoom_slider->setValue(currentTab->fitZoom());
+ }
+}
+
void MainWindow::slotGotProgressInfo(KUrl url, int progress) {
statusProgressBar->setValue(progress);
if (progress > 0) {
#include "clipitem.h"
TrackView::TrackView(KdenliveDoc *doc, QWidget *parent)
- : QWidget(parent), m_doc(doc), m_scale(1.0), m_projectTracks(0), m_projectDuration(0), m_currentZoom(4) {
+ : QWidget(parent), m_doc(doc), m_scale(1.0), m_projectTracks(0), m_currentZoom(4) {
view = new Ui::TimeLine_UI();
view->setupUi(this);
}
int TrackView::duration() const {
- return m_projectDuration;
+ return m_trackview->duration();
}
int TrackView::tracksNumber() const {
emit clipItemSelected(c);
}
+void TrackView::setDuration(int dur) {
+ m_trackview->setDuration(dur);
+ m_ruler->setDuration(dur);
+}
+
void TrackView::parseDocument(QDomDocument doc) {
int cursorPos = 0;
kDebug() << "//// DOCUMENT: " << doc.toString();
cursorPos = props.toElement().attribute("timeline_position").toInt();
}
QDomNodeList tracks = doc.elementsByTagName("playlist");
- m_projectDuration = 300;
+ int duration = 300;
m_projectTracks = tracks.count();
- int duration = 0;
+ int trackduration = 0;
kDebug() << "//////////// TIMELINE FOUND: " << m_projectTracks << " tracks";
for (int i = 0; i < m_projectTracks; i++) {
if (tracks.item(i).toElement().attribute("hide", QString::null) == "video") {
// this is an audio track
- duration = slotAddAudioTrack(i, tracks.item(i).toElement());
+ trackduration = slotAddAudioTrack(i, tracks.item(i).toElement());
} else if (!tracks.item(i).toElement().attribute("id", QString::null).isEmpty())
- duration = slotAddVideoTrack(i, tracks.item(i).toElement());
- kDebug() << " PRO DUR: " << m_projectDuration << ", TRACK DUR: " << duration;
- if (duration > m_projectDuration) m_projectDuration = duration;
+ trackduration = slotAddVideoTrack(i, tracks.item(i).toElement());
+ kDebug() << " PRO DUR: " << trackduration << ", TRACK DUR: " << duration;
+ if (trackduration > duration) duration = trackduration;
}
- m_trackview->setDuration(m_projectDuration);
+ m_trackview->setDuration(duration);
//m_trackview->setCursorPos(cursorPos);
//m_scrollBox->setGeometry(0, 0, 300 * zoomFactor(), m_scrollArea->height());
}
m_trackview->setScale(m_scale);
}
+int TrackView::fitZoom() const {
+ int zoom = (duration() + 20 / m_scale) * FRAME_SIZE / m_trackview->width();
+ int i;
+ for (i = 0; i < 13; i++)
+ if (m_ruler->comboScale[i] > zoom) break;
+ return i;
+}
+
const double TrackView::zoomFactor() const {
return m_scale;
}