mirror of https://github.com/Nheko-Reborn/nheko
parent
b4278ffaa8
commit
2613275461
@ -0,0 +1,98 @@ |
|||||||
|
// SPDX-FileCopyrightText: 2022 Nheko Contributors |
||||||
|
// |
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later |
||||||
|
|
||||||
|
import QtQuick 2.15 |
||||||
|
import QtQuick.Controls 2.15 |
||||||
|
import im.nheko 1.0 |
||||||
|
|
||||||
|
Popup { |
||||||
|
id: snackbar |
||||||
|
|
||||||
|
property var messages: [] |
||||||
|
property string currentMessage: "" |
||||||
|
|
||||||
|
function showNotification(msg) { |
||||||
|
messages.push(msg); |
||||||
|
currentMessage = messages[0]; |
||||||
|
if (!visible) { |
||||||
|
open(); |
||||||
|
dismissTimer.start(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
Timer { |
||||||
|
id: dismissTimer |
||||||
|
interval: 10000 |
||||||
|
onTriggered: snackbar.close() |
||||||
|
} |
||||||
|
|
||||||
|
onAboutToHide: { |
||||||
|
messages.shift(); |
||||||
|
} |
||||||
|
onClosed: { |
||||||
|
if (messages.length > 0) { |
||||||
|
currentMessage = messages[0]; |
||||||
|
open(); |
||||||
|
dismissTimer.restart(); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
parent: Overlay.overlay |
||||||
|
opacity: 0 |
||||||
|
y: -100 |
||||||
|
x: (parent.width - width)/2 |
||||||
|
padding: Nheko.paddingLarge |
||||||
|
|
||||||
|
contentItem: Label { |
||||||
|
color: Nheko.colors.light |
||||||
|
width: Math.max(Overlay.overlay? Overlay.overlay.width/2 : 0, 400) |
||||||
|
text: snackbar.currentMessage |
||||||
|
font.bold: true |
||||||
|
} |
||||||
|
|
||||||
|
background: Rectangle { |
||||||
|
radius: Nheko.paddingLarge |
||||||
|
color: Nheko.colors.dark |
||||||
|
opacity: 0.8 |
||||||
|
} |
||||||
|
|
||||||
|
enter: Transition { |
||||||
|
NumberAnimation { |
||||||
|
target: snackbar |
||||||
|
property: "opacity" |
||||||
|
from: 0.0 |
||||||
|
to: 1.0 |
||||||
|
duration: 200 |
||||||
|
easing.type: Easing.OutCubic |
||||||
|
} |
||||||
|
NumberAnimation { |
||||||
|
target: snackbar |
||||||
|
properties: "y" |
||||||
|
from: -100 |
||||||
|
to: 100 |
||||||
|
duration: 1000 |
||||||
|
easing.type: Easing.OutCubic |
||||||
|
} |
||||||
|
} |
||||||
|
exit: Transition { |
||||||
|
NumberAnimation { |
||||||
|
target: snackbar |
||||||
|
property: "opacity" |
||||||
|
from: 1.0 |
||||||
|
to: 0.0 |
||||||
|
duration: 300 |
||||||
|
easing.type: Easing.InCubic |
||||||
|
} |
||||||
|
NumberAnimation { |
||||||
|
target: snackbar |
||||||
|
properties: "y" |
||||||
|
to: -100 |
||||||
|
from: 100 |
||||||
|
duration: 300 |
||||||
|
easing.type: Easing.InCubic |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
@ -1,79 +0,0 @@ |
|||||||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
|
||||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#include "OverlayWidget.h" |
|
||||||
|
|
||||||
#include <QPainter> |
|
||||||
#include <QStyleOption> |
|
||||||
|
|
||||||
OverlayWidget::OverlayWidget(QWidget *parent) |
|
||||||
: QWidget(parent) |
|
||||||
{ |
|
||||||
if (parent) { |
|
||||||
parent->installEventFilter(this); |
|
||||||
setGeometry(overlayGeometry()); |
|
||||||
raise(); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
bool |
|
||||||
OverlayWidget::event(QEvent *event) |
|
||||||
{ |
|
||||||
if (!parent()) |
|
||||||
return QWidget::event(event); |
|
||||||
|
|
||||||
switch (event->type()) { |
|
||||||
case QEvent::ParentChange: { |
|
||||||
parent()->installEventFilter(this); |
|
||||||
setGeometry(overlayGeometry()); |
|
||||||
break; |
|
||||||
} |
|
||||||
case QEvent::ParentAboutToChange: { |
|
||||||
parent()->removeEventFilter(this); |
|
||||||
break; |
|
||||||
} |
|
||||||
default: |
|
||||||
break; |
|
||||||
} |
|
||||||
|
|
||||||
return QWidget::event(event); |
|
||||||
} |
|
||||||
|
|
||||||
bool |
|
||||||
OverlayWidget::eventFilter(QObject *obj, QEvent *event) |
|
||||||
{ |
|
||||||
switch (event->type()) { |
|
||||||
case QEvent::Move: |
|
||||||
case QEvent::Resize: |
|
||||||
setGeometry(overlayGeometry()); |
|
||||||
break; |
|
||||||
default: |
|
||||||
break; |
|
||||||
} |
|
||||||
|
|
||||||
return QWidget::eventFilter(obj, event); |
|
||||||
} |
|
||||||
|
|
||||||
QRect |
|
||||||
OverlayWidget::overlayGeometry() const |
|
||||||
{ |
|
||||||
QWidget *widget = parentWidget(); |
|
||||||
|
|
||||||
if (!widget) |
|
||||||
return QRect(); |
|
||||||
|
|
||||||
return widget->rect(); |
|
||||||
} |
|
||||||
|
|
||||||
void |
|
||||||
OverlayWidget::paintEvent(QPaintEvent *event) |
|
||||||
{ |
|
||||||
Q_UNUSED(event); |
|
||||||
|
|
||||||
QStyleOption opt; |
|
||||||
opt.initFrom(this); |
|
||||||
QPainter p(this); |
|
||||||
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); |
|
||||||
} |
|
@ -1,26 +0,0 @@ |
|||||||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
|
||||||
// SPDX-FileCopyrightText: 2022 Nheko Contributors
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#pragma once |
|
||||||
|
|
||||||
#include <QEvent> |
|
||||||
#include <QWidget> |
|
||||||
|
|
||||||
class QPainter; |
|
||||||
|
|
||||||
class OverlayWidget : public QWidget |
|
||||||
{ |
|
||||||
Q_OBJECT |
|
||||||
|
|
||||||
public: |
|
||||||
explicit OverlayWidget(QWidget *parent = nullptr); |
|
||||||
|
|
||||||
protected: |
|
||||||
bool event(QEvent *event) override; |
|
||||||
bool eventFilter(QObject *obj, QEvent *event) override; |
|
||||||
|
|
||||||
QRect overlayGeometry() const; |
|
||||||
void paintEvent(QPaintEvent *event) override; |
|
||||||
}; |
|
Loading…
Reference in new issue