wiRedPanda
Logic Circuit Simulator
Loading...
Searching...
No Matches
MinimapWidget.h
Go to the documentation of this file.
1// Copyright 2015 - 2026, GIBIS-UNIFESP and the wiRedPanda contributors
2// SPDX-License-Identifier: GPL-3.0-or-later
3
4#pragma once
5
6#include <QEnterEvent>
7#include <QPixmap>
8#include <QRect>
9#include <QTimer>
10#include <QWidget>
11
12class Scene;
13class GraphicsView;
14class QPainter;
15
16class MinimapWidget : public QWidget
17{
18 Q_OBJECT
19
20 friend class TestMinimapWidget;
21
22public:
23 explicit MinimapWidget(Scene *scene, GraphicsView *view, QWidget *parent = nullptr);
24
25 QSize sizeHint() const override;
26
27public slots:
28 void invalidateCache();
29 void onThrottleTimeout();
30 void updateOverlay();
31
32signals:
36 void geometryChangeFinished(const QRect &geometry);
37
38protected:
39 void paintEvent(QPaintEvent *event) override;
40 void mousePressEvent(QMouseEvent *event) override;
41 void wheelEvent(QWheelEvent *event) override; // swallow wheel events so main view doesn't zoom
42 void mouseMoveEvent(QMouseEvent *event) override;
43 void mouseReleaseEvent(QMouseEvent *event) override;
44 void enterEvent(QEnterEvent *event) override;
45 void leaveEvent(QEvent *event) override;
46 bool eventFilter(QObject *watched, QEvent *event) override;
47
48private:
49 enum class ResizeMode {
50 None,
51 Top,
52 Bottom,
53 Left,
54 Right,
55 TopLeft,
56 TopRight,
57 BottomLeft,
58 BottomRight
59 };
60
61 Scene *m_scene = nullptr;
62 GraphicsView *m_view = nullptr;
63 QPixmap m_cache;
64 bool m_cacheDirty = true;
65 QRectF m_cacheSrc;
66 bool m_dragging = false;
67 bool m_resizing = false;
68 bool m_moving = false;
69 QPoint m_lastGlobalPos;
70 ResizeMode m_resizeMode = ResizeMode::None;
71 ResizeMode m_hoverResizeMode = ResizeMode::None;
72 bool m_hoverMoveHandle = false;
73 QTimer m_throttle;
74
75 // Compute mapping parameters used by both paint and mouse handling.
76 bool computeTransform(QRectF &srcOut, double &scaleOut, double &dxOut, double &dyOut, double &usedWOut, double &usedHOut) const;
77 QPointF widgetToScene(const QPointF &p) const;
78
79 // Edge/corner resize handles.
80 ResizeMode resizeModeAt(const QPoint &pos) const;
81 Qt::CursorShape cursorForResizeMode(ResizeMode mode) const;
82 void applyResize(const QPoint &globalPos);
83
84 // Move handle: a strip along the top of the widget, dragged to reposition it freely.
85 QRect moveHandleRect() const;
86 bool isMoveHandle(const QPoint &pos) const;
87 void moveBy(const QPoint &delta);
88
89 // Cursor + hover-highlight state for the handles at pos, shared by mouseMoveEvent()
90 // and enterEvent() (and called directly by tests, since it takes a plain QPoint).
91 void updateHoverState(const QPoint &pos);
92
93 // Visual affordances painted so the handles are discoverable without hovering first.
94 void drawMoveHandle(QPainter &painter) const;
95 void drawResizeGrips(QPainter &painter) const;
96};
Extended QGraphicsView with enhanced navigation capabilities.
friend class TestMinimapWidget
void mouseMoveEvent(QMouseEvent *event) override
void paintEvent(QPaintEvent *event) override
void wheelEvent(QWheelEvent *event) override
void mouseReleaseEvent(QMouseEvent *event) override
void leaveEvent(QEvent *event) override
bool eventFilter(QObject *watched, QEvent *event) override
void geometryChangeFinished(const QRect &geometry)
void enterEvent(QEnterEvent *event) override
void mousePressEvent(QMouseEvent *event) override
QSize sizeHint() const override
MinimapWidget(Scene *scene, GraphicsView *view, QWidget *parent=nullptr)
Main circuit editing scene.
Definition Scene.h:56