diff --git a/include/emoji/Panel.h b/include/emoji/Panel.h
index 523a855e..ad233c27 100644
--- a/include/emoji/Panel.h
+++ b/include/emoji/Panel.h
@@ -37,8 +37,16 @@ signals:
void emojiSelected(const QString &emoji);
protected:
- void leaveEvent(QEvent *event);
- void paintEvent(QPaintEvent *event);
+ void leaveEvent(QEvent *event) override
+ {
+ emit leaving();
+ QWidget::leaveEvent(event);
+ }
+
+ void paintEvent(QPaintEvent *event) override;
+
+signals:
+ void leaving();
private:
void showCategory(const Category *category);
diff --git a/include/emoji/PickButton.h b/include/emoji/PickButton.h
index 9c30a549..9117e61f 100644
--- a/include/emoji/PickButton.h
+++ b/include/emoji/PickButton.h
@@ -18,6 +18,7 @@
#pragma once
#include <QEvent>
+#include <QTimer>
#include <QWidget>
#include "FlatButton.h"
@@ -37,6 +38,7 @@ signals:
protected:
void enterEvent(QEvent *e) override;
+ void leaveEvent(QEvent *e) override;
private:
// Vertical distance from panel's bottom.
@@ -46,5 +48,6 @@ private:
int horizontal_distance_ = 70;
QSharedPointer<Panel> panel_;
+ QTimer hideTimer_;
};
} // namespace emoji
diff --git a/src/emoji/Panel.cc b/src/emoji/Panel.cc
index 064dd6d5..89c3f823 100644
--- a/src/emoji/Panel.cc
+++ b/src/emoji/Panel.cc
@@ -39,7 +39,7 @@ Panel::Panel(QWidget *parent)
"QScrollBar::handle:vertical { min-height: 30px; }");
setAttribute(Qt::WA_ShowWithoutActivating, true);
- setWindowFlags(Qt::Popup | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint);
+ setWindowFlags(Qt::Tool | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint);
auto mainWidget = new QWidget(this);
mainWidget->setMaximumSize(width_, height_);
@@ -214,12 +214,6 @@ Panel::showCategory(const Category *category)
}
void
-Panel::leaveEvent(QEvent *)
-{
- hide();
-}
-
-void
Panel::paintEvent(QPaintEvent *event)
{
Q_UNUSED(event);
diff --git a/src/emoji/PickButton.cc b/src/emoji/PickButton.cc
index 530c951b..d2b4e9fd 100644
--- a/src/emoji/PickButton.cc
+++ b/src/emoji/PickButton.cc
@@ -15,15 +15,28 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
-#include "emoji/PickButton.h"
+#include <QDebug>
+
#include "emoji/Panel.h"
+#include "emoji/PickButton.h"
using namespace emoji;
+// Number of milliseconds after which the panel will be hidden
+// if the mouse cursor is not on top of the widget.
+constexpr int TimeoutDuration = 300;
+
PickButton::PickButton(QWidget *parent)
: FlatButton(parent)
, panel_{nullptr}
-{}
+{
+ connect(&hideTimer_, &QTimer::timeout, this, [this]() {
+ if (panel_ && !panel_->underMouse()) {
+ hideTimer_.stop();
+ panel_->hide();
+ }
+ });
+}
void
PickButton::enterEvent(QEvent *e)
@@ -33,8 +46,12 @@ PickButton::enterEvent(QEvent *e)
if (panel_.isNull()) {
panel_ = QSharedPointer<Panel>(new Panel(this));
connect(panel_.data(), &Panel::emojiSelected, this, &PickButton::emojiSelected);
+ connect(panel_.data(), &Panel::leaving, this, [this]() { panel_->hide(); });
}
+ if (panel_->isVisible())
+ return;
+
QPoint pos(rect().x(), rect().y());
pos = this->mapToGlobal(pos);
@@ -46,3 +63,10 @@ PickButton::enterEvent(QEvent *e)
panel_->move(x, y);
panel_->show();
}
+
+void
+PickButton::leaveEvent(QEvent *e)
+{
+ hideTimer_.start(TimeoutDuration);
+ FlatButton::leaveEvent(e);
+}
|