Example #1
0
void PopupMenu::showMenu(const QPoint &p, PopupMenu *parent, TriggeredSource source) {
	_parent = parent;

	auto origin = PanelAnimation::Origin::TopLeft;
	auto w = p - QPoint(0, _padding.top());
	auto r = Sandbox::screenGeometry(p);
	_useTransparency = Platform::TransparentWindowsSupported(p);
	handleCompositingUpdate();
	if (rtl()) {
		if (w.x() - width() < r.x() - _padding.left()) {
			if (_parent && w.x() + _parent->width() - _padding.left() - _padding.right() + width() - _padding.right() <= r.x() + r.width()) {
				w.setX(w.x() + _parent->width() - _padding.left() - _padding.right());
			} else {
				w.setX(r.x() - _padding.left());
			}
		} else {
			w.setX(w.x() - width());
		}
	} else {
		if (w.x() + width() - _padding.right() > r.x() + r.width()) {
			if (_parent && w.x() - _parent->width() + _padding.left() + _padding.right() - width() + _padding.right() >= r.x() - _padding.left()) {
				w.setX(w.x() + _padding.left() + _padding.right() - _parent->width() - width() + _padding.left() + _padding.right());
			} else {
				w.setX(p.x() - width() + _padding.right());
			}
			origin = PanelAnimation::Origin::TopRight;
		}
	}
	if (w.y() + height() - _padding.bottom() > r.y() + r.height()) {
		if (_parent) {
			w.setY(r.y() + r.height() - height() + _padding.bottom());
		} else {
			w.setY(p.y() - height() + _padding.bottom());
			origin = (origin == PanelAnimation::Origin::TopRight) ? PanelAnimation::Origin::BottomRight : PanelAnimation::Origin::BottomLeft;
		}
	}
	if (w.x() < r.x()) {
		w.setX(r.x());
	}
	if (w.y() < r.y()) {
		w.setY(r.y());
	}
	move(w);

	setOrigin(origin);
	_menu->setShowSource(source);

	startShowAnimation();

	psUpdateOverlayed(this);
	show();
	psShowOverAll(this);
	windowHandle()->requestActivate();
	activateWindow();
}
Example #2
0
void PopupMenu::showMenu(const QPoint &p, PopupMenu *parent, PressSource source) {
    _parent = parent;

    QPoint w = p - QPoint(0, _padding.top());
    QRect r = App::app() ? App::app()->desktop()->screenGeometry(p) : QDesktopWidget().screenGeometry(p);
    if (rtl()) {
        if (w.x() - width() < r.x() - _padding.left()) {
            if (_parent && w.x() + _parent->width() - _padding.left() - _padding.right() + width() - _padding.right() <= r.x() + r.width()) {
                w.setX(w.x() + _parent->width() - _padding.left() - _padding.right());
            } else {
                w.setX(r.x() - _padding.left());
            }
        } else {
            w.setX(w.x() - width());
        }
    } else {
        if (w.x() + width() - _padding.right() > r.x() + r.width()) {
            if (_parent && w.x() - _parent->width() + _padding.left() + _padding.right() - width() + _padding.right() >= r.x() - _padding.left()) {
                w.setX(w.x() + _padding.left() + _padding.right() - _parent->width() - width() + _padding.left() + _padding.right());
            } else {
                w.setX(r.x() + r.width() - width() + _padding.right());
            }
        }
    }
    if (w.y() + height() - _padding.bottom() > r.y() + r.height()) {
        if (_parent) {
            w.setY(r.y() + r.height() - height() + _padding.bottom());
        } else {
            w.setY(p.y() - height() + _padding.bottom());
        }
    }
    if (w.y() < r.y()) {
        w.setY(r.y());
    }
    move(w);

    _mouseSelection = (source == PressSourceMouse);
    setSelected((source == PressSourceMouse || _actions.isEmpty()) ? -1 : 0);
    psUpdateOverlayed(this);
    show();
    psShowOverAll(this);
    windowHandle()->requestActivate();
    activateWindow();

    if (_a_hide.animating()) {
        _a_hide.stop();
        _cache = QPixmap();
    }
    a_opacity = anim::fvalue(1, 1);
}
Example #3
0
void ContextMenu::showStart() {
	if (!isHidden() && a_opacity.current() == 1) {
		return;
	}
	_selected = -1;
	_hiding = false;
	a_opacity.start(1);
	anim::start(this);
	animStep(0);
	psUpdateOverlayed(this);
	show();
	psShowOverAll(this);
	windowHandle()->requestActivate();
	activateWindow();
	setFocus();
}