* get rid of ToolTipManager::getItemItsApplet
* introduce Plasma::viewFor and Plasma::popupPosition generally nicer code all around. svn path=/trunk/KDE/kdebase/workspace/libs/plasma/; revision=833534
This commit is contained in:
parent
c1fb3655cd
commit
19b3401af9
@ -411,13 +411,16 @@ QGraphicsView *Applet::view() const
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QGraphicsView *found = 0;
|
||||||
foreach (QGraphicsView *view, scene()->views()) {
|
foreach (QGraphicsView *view, scene()->views()) {
|
||||||
if (view->sceneRect().intersects(sceneBoundingRect()) ||
|
if (view->sceneRect().intersects(sceneBoundingRect()) ||
|
||||||
view->sceneRect().contains(scenePos())) {
|
view->sceneRect().contains(scenePos())) {
|
||||||
return view;
|
if (!found || view->isActiveWindow()) {
|
||||||
|
found = view;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return found;
|
||||||
}
|
}
|
||||||
|
|
||||||
QRectF Applet::mapFromView(const QGraphicsView *view, const QRect &rect) const
|
QRectF Applet::mapFromView(const QGraphicsView *view, const QRect &rect) const
|
||||||
@ -434,7 +437,7 @@ QRect Applet::mapToView(const QGraphicsView *view, const QRectF &rect) const
|
|||||||
|
|
||||||
QPoint Applet::popupPosition(const QSize &s) const
|
QPoint Applet::popupPosition(const QSize &s) const
|
||||||
{
|
{
|
||||||
return ToolTipManager::popupPosition(this,s);
|
return Plasma::popupPosition(this, s);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Applet::updateConstraints(Plasma::Constraints constraints)
|
void Applet::updateConstraints(Plasma::Constraints constraints)
|
||||||
|
83
plasma.cpp
83
plasma.cpp
@ -17,7 +17,14 @@
|
|||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <plasma.h>
|
#include <plasma/plasma.h>
|
||||||
|
|
||||||
|
#include <QDesktopWidget>
|
||||||
|
#include <QGraphicsScene>
|
||||||
|
#include <QGraphicsView>
|
||||||
|
|
||||||
|
#include <plasma/containment.h>
|
||||||
|
#include <plasma/view.h>
|
||||||
|
|
||||||
namespace Plasma
|
namespace Plasma
|
||||||
{
|
{
|
||||||
@ -62,4 +69,78 @@ Direction locationToDirection(Location location)
|
|||||||
return Down;
|
return Down;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QPoint popupPosition(const QGraphicsItem * item, const QSize &s)
|
||||||
|
{
|
||||||
|
QGraphicsView *v = viewFor(item);
|
||||||
|
|
||||||
|
if (!v) {
|
||||||
|
return QPoint(0,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
QPoint pos = v->mapFromScene(item->scenePos());
|
||||||
|
pos = v->mapToGlobal(pos);
|
||||||
|
//kDebug() << "==> position is" << scenePos() << v->mapFromScene(scenePos()) << pos;
|
||||||
|
Plasma::View *pv = dynamic_cast<Plasma::View *>(v);
|
||||||
|
|
||||||
|
Plasma::Location loc = Floating;
|
||||||
|
if (pv) {
|
||||||
|
loc = pv->containment()->location();
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (loc) {
|
||||||
|
case BottomEdge:
|
||||||
|
pos = QPoint(pos.x(), pos.y() - s.height());
|
||||||
|
break;
|
||||||
|
case TopEdge:
|
||||||
|
pos = QPoint(pos.x(), pos.y() + (int)item->boundingRect().size().height());
|
||||||
|
break;
|
||||||
|
case LeftEdge:
|
||||||
|
pos = QPoint(pos.x() + (int)item->boundingRect().size().width(), pos.y());
|
||||||
|
break;
|
||||||
|
case RightEdge:
|
||||||
|
pos = QPoint(pos.x() - s.width(), pos.y());
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if (pos.y() - s.height() > 0) {
|
||||||
|
pos = QPoint(pos.x(), pos.y() - s.height());
|
||||||
|
} else {
|
||||||
|
pos = QPoint(pos.x(), pos.y() + (int)item->boundingRect().size().height());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//are we out of screen?
|
||||||
|
QRect screenRect = QApplication::desktop()->screenGeometry(pv ? pv->containment()->screen() : -1);
|
||||||
|
//kDebug() << "==> rect for" << (pv ? pv->containment()->screen() : -1) << "is" << screenRect;
|
||||||
|
|
||||||
|
if (pos.rx() + s.width() > screenRect.right()) {
|
||||||
|
pos.rx() -= ((pos.rx() + s.width()) - screenRect.right());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pos.ry() + s.height() > screenRect.bottom()) {
|
||||||
|
pos.ry() -= ((pos.ry() + s.height()) - screenRect.bottom());
|
||||||
|
}
|
||||||
|
|
||||||
|
pos.rx() = qMax(0, pos.rx());
|
||||||
|
return pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
QGraphicsView* viewFor(const QGraphicsItem * item)
|
||||||
|
{
|
||||||
|
if (!item->scene()) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
QGraphicsView *found = 0;
|
||||||
|
foreach (QGraphicsView *view, item->scene()->views()) {
|
||||||
|
if (view->sceneRect().intersects(item->sceneBoundingRect()) ||
|
||||||
|
view->sceneRect().contains(item->scenePos())) {
|
||||||
|
if (!found || view->isActiveWindow()) {
|
||||||
|
found = view;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
} // Plasma namespace
|
} // Plasma namespace
|
||||||
|
18
plasma.h
18
plasma.h
@ -25,6 +25,8 @@
|
|||||||
|
|
||||||
#include <plasma/plasma_export.h>
|
#include <plasma/plasma_export.h>
|
||||||
|
|
||||||
|
class QGraphicsView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Namespace for everything in libplasma
|
* Namespace for everything in libplasma
|
||||||
*/
|
*/
|
||||||
@ -193,6 +195,22 @@ PLASMA_EXPORT qreal scalingFactor(ZoomLevel level);
|
|||||||
**/
|
**/
|
||||||
PLASMA_EXPORT Direction locationToDirection(Location location);
|
PLASMA_EXPORT Direction locationToDirection(Location location);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reccomended position for a popup window like a menu or a tooltip
|
||||||
|
* given its size
|
||||||
|
* @param s size of the popup
|
||||||
|
* @returns reccomended position
|
||||||
|
*/
|
||||||
|
PLASMA_EXPORT QPoint popupPosition(const QGraphicsItem *item, const QSize &s);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the most appropriate QGraphicsView for the item.
|
||||||
|
*
|
||||||
|
* @arg item the QGraphicsItem to locate a view for
|
||||||
|
* @return pointer to a view, or 0 if none was found
|
||||||
|
*/
|
||||||
|
PLASMA_EXPORT QGraphicsView *viewFor(const QGraphicsItem *item);
|
||||||
|
|
||||||
} // Plasma namespace
|
} // Plasma namespace
|
||||||
|
|
||||||
Q_DECLARE_OPERATORS_FOR_FLAGS(Plasma::Constraints)
|
Q_DECLARE_OPERATORS_FOR_FLAGS(Plasma::Constraints)
|
||||||
|
@ -288,7 +288,7 @@ void ToolTipManagerPrivate::showToolTip()
|
|||||||
ToolTip *tooltip = tooltips.value(currentWidget);
|
ToolTip *tooltip = tooltips.value(currentWidget);
|
||||||
if (tooltip) {
|
if (tooltip) {
|
||||||
tooltip->prepareShowing();
|
tooltip->prepareShowing();
|
||||||
tooltip->move(ToolTipManager::popupPosition(currentWidget,tooltip->size()));
|
tooltip->move(popupPosition(currentWidget, tooltip->size()));
|
||||||
isShown = true; //ToolTip is visible
|
isShown = true; //ToolTip is visible
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -299,6 +299,7 @@ bool ToolTipManager::eventFilter(QObject *watched, QEvent *event)
|
|||||||
if (!widget) {
|
if (!widget) {
|
||||||
return QObject::eventFilter(watched,event);
|
return QObject::eventFilter(watched,event);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (event->type()) {
|
switch (event->type()) {
|
||||||
case QEvent::GraphicsSceneHoverMove:
|
case QEvent::GraphicsSceneHoverMove:
|
||||||
// If the tooltip isn't visible, run through showing the tooltip again
|
// If the tooltip isn't visible, run through showing the tooltip again
|
||||||
@ -317,12 +318,7 @@ bool ToolTipManager::eventFilter(QObject *watched, QEvent *event)
|
|||||||
// If the mouse is in the widget's area at the time that it is being
|
// If the mouse is in the widget's area at the time that it is being
|
||||||
// created the widget can receive a hover event before it is fully
|
// created the widget can receive a hover event before it is fully
|
||||||
// initialized, in which case view() will return 0.
|
// initialized, in which case view() will return 0.
|
||||||
const Applet * applet = ToolTipManager::getItemItsApplet(widget);
|
QGraphicsView *parentView = viewFor(widget);
|
||||||
if (!applet) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
QGraphicsView *parentView = applet->view();
|
|
||||||
if (parentView) {
|
if (parentView) {
|
||||||
showToolTip(widget);
|
showToolTip(widget);
|
||||||
}
|
}
|
||||||
@ -345,77 +341,7 @@ bool ToolTipManager::eventFilter(QObject *watched, QEvent *event)
|
|||||||
return QObject::eventFilter(watched,event);
|
return QObject::eventFilter(watched,event);
|
||||||
}
|
}
|
||||||
|
|
||||||
const Applet * ToolTipManager::getItemItsApplet(const QGraphicsItem * item)
|
} // Plasma namespace
|
||||||
{
|
|
||||||
const Plasma::Applet * applet = dynamic_cast<const Applet *>(item);
|
|
||||||
if (!applet) {
|
|
||||||
const QGraphicsItem * currentItem = item->parentItem();
|
|
||||||
while(currentItem->parentItem() && !dynamic_cast<const Applet *>(currentItem))
|
|
||||||
{
|
|
||||||
currentItem=currentItem->parentItem();
|
|
||||||
}
|
|
||||||
applet = dynamic_cast<const Applet *>(currentItem);
|
|
||||||
if (!applet) return 0;
|
|
||||||
}
|
|
||||||
return applet;
|
|
||||||
}
|
|
||||||
|
|
||||||
QPoint ToolTipManager::popupPosition(const QGraphicsItem * item, const QSize &s)
|
|
||||||
{
|
|
||||||
const Applet * applet = ToolTipManager::getItemItsApplet(item);
|
|
||||||
if (!applet) return QPoint(0,0);
|
|
||||||
QGraphicsView *v = applet->view();
|
|
||||||
Q_ASSERT(v);
|
|
||||||
|
|
||||||
QPoint pos = v->mapFromScene(item->scenePos());
|
|
||||||
pos = v->mapToGlobal(pos);
|
|
||||||
//kDebug() << "==> position is" << scenePos() << v->mapFromScene(scenePos()) << pos;
|
|
||||||
Plasma::View *pv = dynamic_cast<Plasma::View *>(v);
|
|
||||||
|
|
||||||
Plasma::Location loc = Floating;
|
|
||||||
if (pv) {
|
|
||||||
loc = pv->containment()->location();
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (loc) {
|
|
||||||
case BottomEdge:
|
|
||||||
pos = QPoint(pos.x(), pos.y() - s.height());
|
|
||||||
break;
|
|
||||||
case TopEdge:
|
|
||||||
pos = QPoint(pos.x(), pos.y() + (int)item->boundingRect().size().height());
|
|
||||||
break;
|
|
||||||
case LeftEdge:
|
|
||||||
pos = QPoint(pos.x() + (int)item->boundingRect().size().width(), pos.y());
|
|
||||||
break;
|
|
||||||
case RightEdge:
|
|
||||||
pos = QPoint(pos.x() - s.width(), pos.y());
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
if (pos.y() - s.height() > 0) {
|
|
||||||
pos = QPoint(pos.x(), pos.y() - s.height());
|
|
||||||
} else {
|
|
||||||
pos = QPoint(pos.x(), pos.y() + (int)item->boundingRect().size().height());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//are we out of screen?
|
|
||||||
|
|
||||||
QRect screenRect = QApplication::desktop()->screenGeometry(pv ? pv->containment()->screen() : -1);
|
|
||||||
//kDebug() << "==> rect for" << (pv ? pv->containment()->screen() : -1) << "is" << screenRect;
|
|
||||||
|
|
||||||
if (pos.rx() + s.width() > screenRect.right()) {
|
|
||||||
pos.rx() -= ((pos.rx() + s.width()) - screenRect.right());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pos.ry() + s.height() > screenRect.bottom()) {
|
|
||||||
pos.ry() -= ((pos.ry() + s.height()) - screenRect.bottom());
|
|
||||||
}
|
|
||||||
pos.rx() = qMax(0, pos.rx());
|
|
||||||
|
|
||||||
return pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
#include "tooltipmanager.moc"
|
#include "tooltipmanager.moc"
|
||||||
|
|
||||||
|
@ -149,25 +149,8 @@ namespace Plasma
|
|||||||
*/
|
*/
|
||||||
bool widgetHasToolTip(QGraphicsWidget *widget) const;
|
bool widgetHasToolTip(QGraphicsWidget *widget) const;
|
||||||
|
|
||||||
/**
|
|
||||||
* Reccomended position for a popup window like a menu or a tooltip
|
|
||||||
* given its size
|
|
||||||
* @param s size of the popup
|
|
||||||
* @returns reccomended position
|
|
||||||
*/
|
|
||||||
static QPoint popupPosition(const QGraphicsItem * item, const QSize &s);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Take an item and return its owning applet
|
|
||||||
* @param item the item on which we search an applet return NULL if no parent plasma applet
|
|
||||||
* found
|
|
||||||
*/
|
|
||||||
static const Applet * getItemItsApplet(const QGraphicsItem * item);
|
|
||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
friend class ToolTipManagerSingleton;
|
friend class ToolTipManagerSingleton;
|
||||||
|
|
||||||
bool eventFilter(QObject * watched, QEvent * event);
|
bool eventFilter(QObject * watched, QEvent * event);
|
||||||
|
|
||||||
ToolTipManagerPrivate* const d;
|
ToolTipManagerPrivate* const d;
|
||||||
|
Loading…
Reference in New Issue
Block a user