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