/*** Olive - Non-Linear Video Editor Copyright (C) 2022 Olive Team Modifications Copyright (C) 2025 mikesolar 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 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . ***/ #include "nodeviewminimap.h" #include namespace olive { #define super QGraphicsView NodeViewMiniMap::NodeViewMiniMap(NodeViewScene *scene, QWidget *parent) : super(parent) , resizing_(false) { connect(scene, &QGraphicsScene::sceneRectChanged, this, &NodeViewMiniMap::scene_changed); setScene(scene); setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); setViewportUpdateMode(FullViewportUpdate); setFrameShape(QFrame::Panel); setFrameShadow(QFrame::Plain); setMouseTracking(true); QMetaObject::invokeMethod(this, &NodeViewMiniMap::set_default_size, Qt::QueuedConnection); resize_triangle_sz_ = fontMetrics().height() / 2; } void NodeViewMiniMap::set_viewport_rect(const QPolygonF &rect) { viewport_rect_ = rect; viewport()->update(); } void NodeViewMiniMap::drawForeground(QPainter *painter, const QRectF &rect) { super::drawForeground(painter, rect); QColor viewport_color = palette().text().color(); // Draw resize triangle painter->save(); painter->resetTransform(); QPointF triangle[3] = { QPointF(0, 0), QPointF(resize_triangle_sz_, 0), QPointF(0, resize_triangle_sz_) }; painter->setBrush(viewport_color); painter->setPen(viewport_color); painter->drawPolygon(triangle, 3); painter->restore(); // Draw viewport rectangle viewport_color.setAlphaF(0.25); painter->setBrush(viewport_color); painter->drawPolygon(viewport_rect_); } void NodeViewMiniMap::resizeEvent(QResizeEvent *event) { super::resizeEvent(event); emit resized(); scene_changed(sceneRect()); } void NodeViewMiniMap::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { if (mouse_inside_resize_triangle(event)) { // Resizing! resizing_ = true; resize_anchor_ = QCursor::pos(); } else { emit_move_signal(event); } } } void NodeViewMiniMap::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { if (resizing_) { QPointF movement = QCursor::pos() - resize_anchor_; resize(QSize(width() - movement.x(), height() - movement.y())); resize_anchor_ = QCursor::pos(); } else { emit_move_signal(event); } } else { if (mouse_inside_resize_triangle(event)) { setCursor(Qt::SizeFDiagCursor); } else { unsetCursor(); } } } void NodeViewMiniMap::mouseReleaseEvent(QMouseEvent *event) { resizing_ = false; } void NodeViewMiniMap::scene_changed(const QRectF &bounding) { double x_scale = double(this->width()) / bounding.width(); double y_scale = double(this->height()) / bounding.height(); double min_scale = qMin(x_scale, y_scale); QTransform transform; transform.scale(min_scale, min_scale); setTransform(transform); } void NodeViewMiniMap::set_default_size() { if (parentWidget()) { resize(parentWidget()->width() / 4, parentWidget()->height() / 4); } } bool NodeViewMiniMap::mouse_inside_resize_triangle(QMouseEvent *event) { return event->pos().x() <= resize_triangle_sz_ && event->pos().y() <= resize_triangle_sz_; } void NodeViewMiniMap::emit_move_signal(QMouseEvent *event) { emit move_to_scene_point(mapToScene(event->pos())); } }