1 /***************************************************************************
2 * This file is part of KWorship. *
3 * Copyright 2008 James Hogan <james@albanarts.com> *
5 * KWorship is free software: you can redistribute it and/or modify *
6 * it under the terms of the GNU General Public License as published by *
7 * the Free Software Foundation, either version 2 of the License, or *
8 * (at your option) any later version. *
10 * KWorship is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
15 * You should have received a copy of the GNU General Public License *
16 * along with KWorship. If not, write to the Free Software Foundation, *
17 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. *
18 ***************************************************************************/
21 * @file DesktopView.cpp
22 * @brief Preview of the screens on the desktop.
23 * @author James Hogan <james@albanarts.com>
26 #include "DesktopView.h"
28 #include <QApplication>
29 #include <QDesktopWidget>
30 #include <QGraphicsRectItem>
31 #include <QGraphicsTextItem>
32 #include <QMouseEvent>
37 * Constructors + destructor
40 /// Primary constructor.
41 DesktopView::DesktopView(QWidget
* parent
)
42 : QGraphicsView(parent
)
44 , m_multiSelect(false)
46 , m_selectedScreen(-1)
53 DesktopView::~DesktopView()
61 /// Find whether a screen is selected.
62 bool DesktopView::isScreenSelected(int screen
) const
64 assert(screen
>= 0 && screen
< m_selectedScreens
.size());
67 return m_selectedScreens
[screen
];
71 return (screen
== m_selectedScreen
);
75 /// Find which single screen is selected.
76 int DesktopView::selectedScreen() const
80 /// @todo Implement multiselect selectedScreen()
85 return m_selectedScreen
;
93 /// Set the selected screen.
94 void DesktopView::setSelectedScreen(int selectedScreen
)
98 /// @todo Implement multiselect setSelectedScreen(int)
100 else if (m_selectedScreen
!= selectedScreen
)
102 screenSelected(m_selectedScreen
, false);
103 m_selectedScreen
= selectedScreen
;
104 screenSelected(m_selectedScreen
, true);
105 singleSelectRestatus();
114 void DesktopView::resizeEvent(QResizeEvent
*)
117 fitInView(m_desktopRect
, Qt::KeepAspectRatio
);
120 void DesktopView::mousePressEvent(QMouseEvent
* event
)
124 QDesktopWidget
* desktop
= qobject_cast
<QApplication
*>(QCoreApplication::instance())->desktop();
125 if (0 != itemAt(event
->pos()))
127 QPoint pos
= mapToScene(event
->pos()).toPoint();
128 int screen
= desktop
->screenNumber(pos
);
129 assert(screen
>= 0 && screen
< m_selectedScreens
.size());
133 if (event
->modifiers().testFlag(Qt::ControlModifier
))
135 // We know its changed here so no need to use selectScreen
136 screenSelected(screen
, m_selectedScreens
[screen
] = !m_selectedScreens
[screen
]);
140 for (int i
= 0; i
< m_selectedScreens
.size(); ++i
)
142 selectScreen(i
, i
== screen
);
146 else if (m_selectedScreen
!= screen
)
148 if (m_selectedScreen
>= 0)
150 screenSelected(m_selectedScreen
, false);
152 m_selectedScreen
= screen
;
153 screenSelected(m_selectedScreen
, true);
154 singleSelectRestatus();
161 if (!event
->modifiers().testFlag(Qt::ControlModifier
))
163 for (int i
= 0; i
< m_selectedScreens
.size(); ++i
)
165 selectScreen(i
, false);
169 else if (m_noSelect
&& m_selectedScreen
>= 0)
171 screenSelected(m_selectedScreen
, false);
172 m_selectedScreen
= -1;
173 singleSelectRestatus();
178 QGraphicsView::mousePressEvent(event
);
181 void DesktopView::changeEvent(QEvent
*event
)
183 switch (event
->type())
185 case QEvent::EnabledChange
:
186 case QEvent::PaletteChange
:
198 /// Indicates that a screen has been resized.
199 void DesktopView::resizeScreen(int screen
)
209 /// Setup the display.
210 void DesktopView::setup()
212 QDesktopWidget
* desktop
= qobject_cast
<QApplication
*>(QCoreApplication::instance())->desktop();
213 assert(0 != desktop
);
214 int screens
= desktop
->numScreens();
215 assert(0 != screens
);
217 // Cleanup any previous scene
220 int oldSize
= m_selectedScreens
.size();
221 m_selectedScreens
.resize(screens
);
224 while (oldSize
< screens
)
226 m_selectedScreens
[oldSize
] = false;
231 // Set up the screens preview
232 QGraphicsScene
* scene
= new QGraphicsScene(this);
235 for (int i
= 0; i
< screens
; ++i
)
237 QRectF geom
= desktop
->screenGeometry(i
);
240 QGraphicsRectItem
* rect
= scene
->addRect(geom
, QPen(palette().color(QPalette::Foreground
)),
241 isScreenSelected(i
) ? palette().color(QPalette::Highlight
) :
242 QBrush(palette().color(QPalette::Button
)));
247 QGraphicsTextItem
* text
= new QGraphicsTextItem(string
, rect
);
250 font
.setPixelSize(geom
.height() * 0.8f
);
252 text
->setDefaultTextColor(isScreenSelected(i
) ? palette().color(QPalette::HighlightedText
)
253 : palette().color(QPalette::ButtonText
));
255 QRectF textRect
= text
->boundingRect();
256 text
->setPos(QPointF(geom
.x() + (geom
.width() - textRect
.width()) / 2,
257 geom
.y() + (geom
.height() - textRect
.height()) / 2));
259 m_desktopRect
= desktop
->rect();
263 /// Change selection of a screen.
264 void DesktopView::selectScreen(int screen
, bool newSelected
)
266 assert(m_multiSelect
);
267 assert(screen
>= 0 && screen
< m_selectedScreens
.size());
268 if (m_selectedScreens
[screen
] != newSelected
)
270 screenSelected(screen
, m_selectedScreens
[screen
] = newSelected
);
274 /// Update a single selection status.
275 void DesktopView::singleSelectRestatus()
277 assert(!m_multiSelect
);
278 if (m_selectedScreen
>= 0)
280 QDesktopWidget
* desktop
= qobject_cast
<QApplication
*>(QCoreApplication::instance())->desktop();
281 assert(0 != desktop
);
282 if (m_selectedScreen
< m_selectedScreens
.size())
284 QRectF geom
= desktop
->screenGeometry(m_selectedScreen
);
285 statusChanged(tr("Screen %1: \%2x%3.")
286 .arg(m_selectedScreen
+1)
288 .arg(geom
.height()));
292 statusChanged(tr("Screen %1: not plugged in.")
293 .arg(m_selectedScreen
+1));
300 screenChanged(m_selectedScreen
);