+void Monitor::slotSetSizeOneToTwo() {
+ QRect r = QApplication::desktop()->screenGeometry();
+ const int maxWidth = r.width() - 20;
+ const int maxHeight = r.height() - 20;
+ int width = render->renderWidth() / 2;
+ int height = render->renderHeight() / 2;
+ kDebug() << "// render info: " << width << "x" << height;
+ while (width >= maxWidth || height >= maxHeight) {
+ width = width * 0.8;
+ height = height * 0.8;
+ }
+ kDebug() << "// MONITOR; set SIZE: " << width << ", " << height;
+ ui.video_frame->setFixedSize(width, height);
+ updateGeometry();
+ adjustSize();
+ //ui.video_frame->setMinimumSize(0, 0);
+ emit adjustMonitorSize();
+}
+
+void Monitor::resetSize() {
+ ui.video_frame->setMinimumSize(0, 0);
+}
+
+void Monitor::slotZoneMoved(int start, int end) {
+ m_ruler->setZone(start, end);
+ checkOverlay();
+}
+
+void Monitor::slotSetZoneStart() {
+ m_ruler->setZone(m_position, -1);
+ emit zoneUpdated(m_ruler->zone());
+ checkOverlay();
+}
+
+void Monitor::slotSetZoneEnd() {
+ m_ruler->setZone(-1, m_position);
+ emit zoneUpdated(m_ruler->zone());
+ checkOverlay();
+}
+
+// virtual
+void Monitor::mousePressEvent(QMouseEvent * event) {
+ if (event->button() != Qt::RightButton) {
+ if (ui.video_frame->underMouse()) {
+ m_dragStarted = true;
+ m_DragStartPosition = event->pos();
+ }
+ } else m_contextMenu->popup(event->globalPos());
+}
+
+// virtual
+void Monitor::mouseReleaseEvent(QMouseEvent * event) {
+ if (m_dragStarted) {
+ if (ui.video_frame->underMouse()) {
+ slotPlay();
+ } else QWidget::mouseReleaseEvent(event);
+ m_dragStarted = false;
+ }
+}
+
+
+// virtual
+void Monitor::mouseMoveEvent(QMouseEvent *event) {
+ // kDebug() << "// DRAG STARTED, MOUSE MOVED: ";
+ if (!m_dragStarted || m_currentClip == NULL) return;
+
+ if ((event->pos() - m_DragStartPosition).manhattanLength()
+ < QApplication::startDragDistance())
+ return;
+
+ {
+ QDrag *drag = new QDrag(this);
+ QMimeData *mimeData = new QMimeData;
+
+ QStringList list;
+ list.append(m_currentClip->getId());
+ QPoint p = m_ruler->zone();
+ list.append(QString::number(p.x()));
+ list.append(QString::number(p.y()));
+ QByteArray data;
+ data.append(list.join(";").toUtf8());
+ mimeData->setData("kdenlive/clip", data);
+ drag->setMimeData(mimeData);
+ QPixmap pix = m_currentClip->thumbnail();
+ kDebug() << "/ / / /CLIP DRAGGED PIXMAP: " << pix.width() << "x" << pix.height();
+ drag->setPixmap(pix);
+ drag->setHotSpot(QPoint(0, 50));
+ drag->start(Qt::MoveAction);
+
+ //Qt::DropAction dropAction;
+ //dropAction = drag->start(Qt::CopyAction | Qt::MoveAction);
+
+ //Qt::DropAction dropAction = drag->exec();
+
+ }
+ //event->accept();
+}
+
+/*void Monitor::dragMoveEvent(QDragMoveEvent * event) {
+ event->setDropAction(Qt::IgnoreAction);
+ event->setDropAction(Qt::MoveAction);
+ if (event->mimeData()->hasText()) {
+ event->acceptProposedAction();
+ }
+}
+
+Qt::DropActions Monitor::supportedDropActions() const {
+ // returns what actions are supported when dropping
+ return Qt::MoveAction;
+}*/
+
+QStringList Monitor::mimeTypes() const {
+ QStringList qstrList;
+ // list of accepted mime types for drop
+ qstrList.append("kdenlive/clip");
+ return qstrList;
+}
+
+
+// virtual
+/** Move to other position on mousewheel
+ *
+ * Moves towards end of clip/timeline on mousewheel down/back,
+ * opposite for mousewheel up/forward.
+ *
+ * Ctrl+wheel moves single frame, without Ctrl moves a second.
+ *
+ * See also http://www.kdenlive.org/mantis/view.php?id=265 */
+void Monitor::wheelEvent(QWheelEvent * event) {
+ if (event->modifiers() == Qt::ControlModifier) {
+ int delta = m_monitorManager->timecode().fps();
+ if (event->delta() < 0) delta = 0 - delta;
+ slotSeek(m_position - delta);
+ } else {
+ if (event->delta() <= 0) slotForwardOneFrame();
+ else slotRewindOneFrame();
+ }
+}
+
+void Monitor::slotSetThumbFrame() {
+ if (m_currentClip == NULL) {
+ return;
+ }
+ m_currentClip->setClipThumbFrame((uint) m_position);
+ emit refreshClipThumbnail(m_currentClip->getId());
+}
+
+void Monitor::slotExtractCurrentFrame() {
+ QPixmap frame = render->extractFrame(m_position);
+ QString outputFile = KFileDialog::getSaveFileName(KUrl(), "image/png");
+ if (!outputFile.isEmpty()) {
+ if (QFile::exists(outputFile) && KMessageBox::questionYesNo(this, i18n("File already exists.\nDo you want to overwrite it ?")) == KMessageBox::No) return;
+ frame.save(outputFile);
+ }
+}
+
+bool Monitor::isActive() const {
+ return m_isActive;
+}
+
+void Monitor::activateMonitor() {
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
+}
+
+void Monitor::slotSeek() {
+ const int frames = m_monitorManager->timecode().getFrameCount(m_timePos->text(), m_monitorManager->timecode().fps());
+ slotSeek(frames);
+}
+
+void Monitor::slotSeek(int pos) {
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
+ if (render == NULL) return;
+ render->seekToFrame(pos);
+ m_position = pos;
+ emit renderPosition(m_position);
+ m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
+ checkOverlay();
+}
+
+void Monitor::checkOverlay() {
+ QPoint zone = m_ruler->zone();
+ //kDebug()<<"RUL: "<<pos<<", ZONE: "<<zone;
+ if (m_position == zone.x()) m_overlay->setOverlayText(i18n("In Point"));
+ else if (m_position == zone.y()) m_overlay->setOverlayText(i18n("Out Point"));
+ else m_overlay->setHidden(true);
+}
+
+void Monitor::slotStart() {
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
+ render->play(0);
+ m_position = 0;
+ render->seekToFrame(m_position);
+ emit renderPosition(m_position);
+ m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
+}
+
+void Monitor::slotEnd() {
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
+ render->play(0);
+ m_position = render->getLength();
+ render->seekToFrame(m_position);
+ emit renderPosition(m_position);
+ m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
+}
+
+void Monitor::slotZoneStart() {
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
+ render->play(0);
+ m_position = m_ruler->zone().x();
+ render->seekToFrame(m_position);
+ emit renderPosition(m_position);
+ m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
+}
+
+void Monitor::slotZoneEnd() {
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
+ render->play(0);
+ m_position = m_ruler->zone().y();
+ render->seekToFrame(m_position);
+ emit renderPosition(m_position);
+ m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
+}
+
+void Monitor::slotRewind(double speed) {
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
+ if (speed == 0) {
+ double currentspeed = render->playSpeed();
+ if (currentspeed >= 0) render->play(-2);
+ else render->play(currentspeed * 2);
+ } else render->play(speed);
+ m_playAction->setChecked(true);
+ m_playAction->setIcon(m_pauseIcon);
+}
+
+void Monitor::slotForward(double speed) {
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
+ if (speed == 0) {
+ double currentspeed = render->playSpeed();
+ if (currentspeed <= 1) render->play(2);
+ else render->play(currentspeed * 2);
+ } else render->play(speed);
+ m_playAction->setChecked(true);
+ m_playAction->setIcon(m_pauseIcon);
+}
+
+void Monitor::slotRewindOneFrame() {
+ if (!m_isActive) m_monitorManager->activateMonitor(m_name);
+ render->play(0);
+ if (m_position < 1) return;
+ m_position--;
+ render->seekToFrame(m_position);
+ emit renderPosition(m_position);
+ m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(m_position));
+ checkOverlay();