* 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;
|
||||
}
|
||||
|
||||
QGraphicsView *found = 0;
|
||||
foreach (QGraphicsView *view, scene()->views()) {
|
||||
if (view->sceneRect().intersects(sceneBoundingRect()) ||
|
||||
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
|
||||
@ -434,7 +437,7 @@ QRect Applet::mapToView(const QGraphicsView *view, const QRectF &rect) const
|
||||
|
||||
QPoint Applet::popupPosition(const QSize &s) const
|
||||
{
|
||||
return ToolTipManager::popupPosition(this,s);
|
||||
return Plasma::popupPosition(this, s);
|
||||
}
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
#include <plasma.h>
|
||||
#include <plasma/plasma.h>
|
||||
|
||||
#include <QDesktopWidget>
|
||||
#include <QGraphicsScene>
|
||||
#include <QGraphicsView>
|
||||
|
||||
#include <plasma/containment.h>
|
||||
#include <plasma/view.h>
|
||||
|
||||
namespace Plasma
|
||||
{
|
||||
@ -62,4 +69,78 @@ Direction locationToDirection(Location location)
|
||||
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
|
||||
|
18
plasma.h
18
plasma.h
@ -25,6 +25,8 @@
|
||||
|
||||
#include <plasma/plasma_export.h>
|
||||
|
||||
class QGraphicsView;
|
||||
|
||||
/**
|
||||
* Namespace for everything in libplasma
|
||||
*/
|
||||
@ -193,6 +195,22 @@ PLASMA_EXPORT qreal scalingFactor(ZoomLevel level);
|
||||
**/
|
||||
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
|
||||
|
||||
Q_DECLARE_OPERATORS_FOR_FLAGS(Plasma::Constraints)
|
||||
|
@ -288,7 +288,7 @@ void ToolTipManagerPrivate::showToolTip()
|
||||
ToolTip *tooltip = tooltips.value(currentWidget);
|
||||
if (tooltip) {
|
||||
tooltip->prepareShowing();
|
||||
tooltip->move(ToolTipManager::popupPosition(currentWidget,tooltip->size()));
|
||||
tooltip->move(popupPosition(currentWidget, tooltip->size()));
|
||||
isShown = true; //ToolTip is visible
|
||||
}
|
||||
}
|
||||
@ -299,6 +299,7 @@ bool ToolTipManager::eventFilter(QObject *watched, QEvent *event)
|
||||
if (!widget) {
|
||||
return QObject::eventFilter(watched,event);
|
||||
}
|
||||
|
||||
switch (event->type()) {
|
||||
case QEvent::GraphicsSceneHoverMove:
|
||||
// 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
|
||||
// created the widget can receive a hover event before it is fully
|
||||
// initialized, in which case view() will return 0.
|
||||
const Applet * applet = ToolTipManager::getItemItsApplet(widget);
|
||||
if (!applet) {
|
||||
break;
|
||||
}
|
||||
|
||||
QGraphicsView *parentView = applet->view();
|
||||
QGraphicsView *parentView = viewFor(widget);
|
||||
if (parentView) {
|
||||
showToolTip(widget);
|
||||
}
|
||||
@ -345,77 +341,7 @@ bool ToolTipManager::eventFilter(QObject *watched, QEvent *event)
|
||||
return QObject::eventFilter(watched,event);
|
||||
}
|
||||
|
||||
const Applet * ToolTipManager::getItemItsApplet(const QGraphicsItem * item)
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
}
|
||||
} // Plasma namespace
|
||||
|
||||
#include "tooltipmanager.moc"
|
||||
|
||||
|
@ -149,25 +149,8 @@ namespace Plasma
|
||||
*/
|
||||
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:
|
||||
friend class ToolTipManagerSingleton;
|
||||
|
||||
bool eventFilter(QObject * watched, QEvent * event);
|
||||
|
||||
ToolTipManagerPrivate* const d;
|
||||
|
Loading…
Reference in New Issue
Block a user