13#include <KLocalizedString>
14#include <KSvg/FrameSvg>
16#include <QApplication>
18#include <QGraphicsScene>
19#include <QGraphicsSceneEvent>
20#include <QGraphicsView>
28static QScreen *screenFromWidget(
const QWidget *widget)
30 QScreen *screen = widget->screen();
35 return QGuiApplication::primaryScreen();
41 for (
auto &popup : m_popups) {
42 popup = std::make_unique<QMenu>(
this);
44 m_scene = std::make_unique<QGraphicsScene>(
this);
45 m_view = std::make_unique<QGraphicsView>(m_scene.get(),
this);
46 m_view->setBackgroundBrush(Qt::black);
47 m_view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
48 m_view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
49 m_view->setFocusPolicy(Qt::NoFocus);
50 m_view->setFrameShape(QFrame::NoFrame);
51 for (
size_t i = 0; i < m_items.size(); i++) {
52 m_items[i] = std::make_unique<Corner>(
this);
53 m_scene->addItem(m_items[i].get());
55 m_actionGroups[i] = std::make_unique<QActionGroup>(
this);
57 QRect avail = screenFromWidget(
this)->geometry();
59 setRatio((qreal)avail.width() / (qreal)avail.height());
67 for (
size_t i = 0; i < m_popups.size(); i++) {
69 m_items[i]->setActive(
false);
71 m_actionGroups[i] = std::make_unique<QActionGroup>(
this);
83 const bool r = ScreenPreviewWidget::event(
event);
84 if (
event->type() == QEvent::ScreenChangeInternal) {
85 QRect avail = screenFromWidget(
this)->geometry();
86 setRatio((qreal)avail.width() / (qreal)avail.height());
92void Monitor::checkSize()
95 m_view->setGeometry(contentsRect);
96 m_scene->setSceneRect(QRect(QPoint(0, 0), contentsRect.size()));
97 const int x2 = (contentsRect.width() - 20) / 2;
98 const int x3 = contentsRect.width() - 20;
99 const int y2 = (contentsRect.height() - 20) / 2;
100 const int y3 = contentsRect.height() - 20;
101 m_items[0]->setRect(0, y2, 20, 20);
102 m_items[1]->setRect(x3, y2, 20, 20);
103 m_items[2]->setRect(x2, 0, 20, 20);
104 m_items[3]->setRect(x2, y3, 20, 20);
105 m_items[4]->setRect(0, 0, 20, 20);
106 m_items[5]->setRect(x3, 0, 20, 20);
107 m_items[6]->setRect(0, y3, 20, 20);
108 m_items[7]->setRect(x3, y3, 20, 20);
113 for (QAction *action : std::as_const(m_popupActions[edge])) {
114 action->setEnabled(enabled);
120 m_hidden[edge] = set;
122 m_items[edge]->hide();
124 m_items[edge]->show();
130 return m_hidden[edge];
135 QAction *act = m_popups[edge]->addAction(item);
136 act->setCheckable(
true);
137 m_popupActions[edge].append(act);
138 m_actionGroups[edge]->addAction(act);
139 if (m_popupActions[edge].count() == 1) {
140 act->setChecked(
true);
141 m_items[edge]->setToolTip(item);
143 m_items[edge]->setActive(!m_popupActions[edge].front()->isChecked());
148 m_popupActions[edge][index]->setEnabled(enabled);
153 return m_popupActions[edge][index]->isEnabled();
158 m_popupActions[edge][index]->setChecked(
true);
159 m_items[edge]->setActive(!m_popupActions[edge].front()->isChecked());
160 QString actionText = m_popupActions[edge][index]->text();
162 actionText = KLocalizedString::removeAcceleratorMarker(actionText);
163 m_items[edge]->setToolTip(actionText);
168 const auto &actions = m_popupActions[edge];
169 for (QAction *act : actions) {
170 if (act->isChecked()) {
171 return actions.indexOf(act);
177void Monitor::popup(Corner *c, QPoint pos)
179 for (
size_t i = 0; i < m_items.size(); i++) {
180 if (m_items[i].get() == c) {
181 if (m_popupActions[i].empty()) {
184 if (QAction *a = m_popups[i]->exec(pos)) {
188 c->setToolTip(KLocalizedString::removeAcceleratorMarker(a->text()));
196void Monitor::flip(Corner *c, QPoint pos)
198 for (
size_t i = 0; i < m_items.size(); i++) {
199 if (m_items[i].get() == c) {
200 if (m_popupActions[i].empty()) {
201 m_items[i]->setActive(m_items[i]->brush() != Qt::green);
213 , m_button(std::make_unique<
KSvg::FrameSvg>())
216 m_button->setImagePath(
"widgets/button");
217 setAcceptHoverEvents(
true);
224 m_monitor->popup(
this, e->screenPos());
229 m_monitor->flip(
this, e->screenPos());
235 m_button->setElementPrefix(
"normal");
237 qreal left, top, right, bottom;
238 m_button->getMargins(left, top, right, bottom);
240 m_button->setElementPrefix(
"active");
241 qreal activeLeft, activeTop, activeRight, activeBottom;
242 m_button->getMargins(activeLeft, activeTop, activeRight, activeBottom);
244 QRectF activeRect = QRectF(QPointF(0, 0), rect().size());
245 activeRect.adjust(left - activeLeft, top - activeTop,
246 -(right - activeRight), -(bottom - activeBottom));
247 m_button->setElementPrefix(
"active");
248 m_button->resizeFrame(activeRect.size());
249 m_button->paintFrame(painter, rect().topLeft() + activeRect.topLeft());
251 m_button->setElementPrefix(m_active ?
"pressed" :
"normal");
252 m_button->resizeFrame(rect().size());
253 m_button->paintFrame(painter, rect().topLeft());
257 QPainterPath roundedRect;
258 painter->setRenderHint(QPainter::Antialiasing);
259 roundedRect.addRoundedRect(rect().adjusted(5, 5, -5, -5), 2, 2);
260 painter->fillPath(roundedRect, QApplication::palette().text());
288#include "moc_monitor.cpp"
void mousePressEvent(QGraphicsSceneMouseEvent *e) override
void contextMenuEvent(QGraphicsSceneContextMenuEvent *e) override
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget=nullptr) override
void hoverEnterEvent(QGraphicsSceneHoverEvent *e) override
void setActive(bool active)
void hoverLeaveEvent(QGraphicsSceneHoverEvent *e) override
bool edgeHidden(int edge) const
int selectedEdgeItem(int edge) const
void selectEdgeItem(int edge, int index)
bool edgeItemEnabled(int edge, int index) const
void addEdgeItem(int edge, const QString &item)
void setEdgeEnabled(int edge, bool enabled)
bool event(QEvent *event) override
void resizeEvent(QResizeEvent *e) override
void setEdgeHidden(int edge, bool set)
void setEdgeItemEnabled(int edge, int index, bool enabled)
void edgeSelectionChanged(int edge, int index)