mirror of
https://github.com/qTox/qTox.git
synced 2024-03-22 14:00:36 +08:00
Show edge markers for notifications
Add margin for edge notification marker Fix conventions Make AdjustingScrollArea not final
This commit is contained in:
parent
0267e2654a
commit
b83b5dbe59
8
qtox.pro
8
qtox.pro
|
@ -481,7 +481,9 @@ SOURCES += \
|
||||||
src/core/toxid.cpp \
|
src/core/toxid.cpp \
|
||||||
src/persistence/profile.cpp \
|
src/persistence/profile.cpp \
|
||||||
src/widget/translator.cpp \
|
src/widget/translator.cpp \
|
||||||
src/persistence/settingsserializer.cpp
|
src/persistence/settingsserializer.cpp \
|
||||||
|
src/widget/notificationscrollarea.cpp \
|
||||||
|
src/widget/notificationedgewidget.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
src/audio/audio.h \
|
src/audio/audio.h \
|
||||||
|
@ -517,4 +519,6 @@ HEADERS += \
|
||||||
src/core/toxid.h \
|
src/core/toxid.h \
|
||||||
src/persistence/profile.h \
|
src/persistence/profile.h \
|
||||||
src/widget/translator.h \
|
src/widget/translator.h \
|
||||||
src/persistence/settingsserializer.h
|
src/persistence/settingsserializer.h \
|
||||||
|
src/widget/notificationscrollarea.h \
|
||||||
|
src/widget/notificationedgewidget.h
|
||||||
|
|
1
res.qrc
1
res.qrc
|
@ -119,5 +119,6 @@
|
||||||
<file>ui/rejectCall/rejectCall.svg</file>
|
<file>ui/rejectCall/rejectCall.svg</file>
|
||||||
<file>ui/volButton/volButtonDisabled.png</file>
|
<file>ui/volButton/volButtonDisabled.png</file>
|
||||||
<file>img/login_logo.svg</file>
|
<file>img/login_logo.svg</file>
|
||||||
|
<file>ui/notificationEdge/notificationEdge.css</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
|
|
|
@ -1045,7 +1045,7 @@ QSplitter:handle{
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<widget class="AdjustingScrollArea" name="friendList">
|
<widget class="NotificationScrollArea" name="friendList">
|
||||||
<property name="sizePolicy">
|
<property name="sizePolicy">
|
||||||
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
<sizepolicy hsizetype="Minimum" vsizetype="Preferred">
|
||||||
<horstretch>0</horstretch>
|
<horstretch>0</horstretch>
|
||||||
|
@ -1072,8 +1072,8 @@ QSplitter:handle{
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>284</width>
|
<width>292</width>
|
||||||
<height>359</height>
|
<height>353</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_5"/>
|
<layout class="QVBoxLayout" name="verticalLayout_5"/>
|
||||||
|
@ -1838,7 +1838,7 @@ QSplitter:handle{
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>775</width>
|
<width>775</width>
|
||||||
<height>19</height>
|
<height>22</height>
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
|
@ -1859,9 +1859,9 @@ QSplitter:handle{
|
||||||
<header location="global">src/widget/tool/croppinglabel.h</header>
|
<header location="global">src/widget/tool/croppinglabel.h</header>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
<customwidget>
|
<customwidget>
|
||||||
<class>AdjustingScrollArea</class>
|
<class>NotificationScrollArea</class>
|
||||||
<extends>QScrollArea</extends>
|
<extends>QScrollArea</extends>
|
||||||
<header location="global">src/widget/tool/adjustingscrollarea.h</header>
|
<header location="global">src/widget/notificationscrollarea.h</header>
|
||||||
<container>1</container>
|
<container>1</container>
|
||||||
</customwidget>
|
</customwidget>
|
||||||
</customwidgets>
|
</customwidgets>
|
||||||
|
|
56
src/widget/notificationedgewidget.cpp
Normal file
56
src/widget/notificationedgewidget.cpp
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
Copyright © 2015 by The qTox Project
|
||||||
|
|
||||||
|
This file is part of qTox, a Qt-based graphical interface for Tox.
|
||||||
|
|
||||||
|
qTox is libre software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
qTox is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with qTox. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "notificationedgewidget.h"
|
||||||
|
#include "style.h"
|
||||||
|
#include <QLabel>
|
||||||
|
#include <QBoxLayout>
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
NotificationEdgeWidget::NotificationEdgeWidget(Position position, QWidget *parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
{
|
||||||
|
setAttribute(Qt::WA_StyledBackground); // Show background.
|
||||||
|
setStyleSheet(Style::getStylesheet(":/ui/notificationEdge/notificationEdge.css"));
|
||||||
|
QHBoxLayout* layout = new QHBoxLayout(this);
|
||||||
|
layout->addStretch();
|
||||||
|
|
||||||
|
QLabel* textLabel = new QLabel(tr("Unread message(s)"), this);
|
||||||
|
textLabel->setMinimumHeight(textLabel->sizeHint().height()); // Prevent cut-off text.
|
||||||
|
layout->addWidget(textLabel);
|
||||||
|
|
||||||
|
QLabel* arrowLabel = new QLabel(this);
|
||||||
|
|
||||||
|
if (position == Top)
|
||||||
|
arrowLabel->setPixmap(QPixmap("://ui/chatArea/scrollBarUpArrow.svg"));
|
||||||
|
else
|
||||||
|
arrowLabel->setPixmap(QPixmap("://ui/chatArea/scrollBarDownArrow.svg"));
|
||||||
|
|
||||||
|
layout->addWidget(arrowLabel);
|
||||||
|
layout->addStretch();
|
||||||
|
|
||||||
|
setCursor(Qt::PointingHandCursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NotificationEdgeWidget::mouseReleaseEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
|
emit clicked();
|
||||||
|
QWidget::mousePressEvent(event);
|
||||||
|
}
|
44
src/widget/notificationedgewidget.h
Normal file
44
src/widget/notificationedgewidget.h
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
/*
|
||||||
|
Copyright © 2015 by The qTox Project
|
||||||
|
|
||||||
|
This file is part of qTox, a Qt-based graphical interface for Tox.
|
||||||
|
|
||||||
|
qTox is libre software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
qTox is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with qTox. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NOTIFICATIONEDGEWIDGET_H
|
||||||
|
#define NOTIFICATIONEDGEWIDGET_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
class NotificationEdgeWidget final : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
enum Position : uint8_t
|
||||||
|
{
|
||||||
|
Top,
|
||||||
|
Bottom
|
||||||
|
};
|
||||||
|
|
||||||
|
explicit NotificationEdgeWidget(Position position, QWidget *parent = 0);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void clicked();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void mouseReleaseEvent(QMouseEvent* event) final override;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // NOTIFICATIONEDGEWIDGET_H
|
204
src/widget/notificationscrollarea.cpp
Normal file
204
src/widget/notificationscrollarea.cpp
Normal file
|
@ -0,0 +1,204 @@
|
||||||
|
/*
|
||||||
|
Copyright © 2015 by The qTox Project
|
||||||
|
|
||||||
|
This file is part of qTox, a Qt-based graphical interface for Tox.
|
||||||
|
|
||||||
|
qTox is libre software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
qTox is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with qTox. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#include "notificationscrollarea.h"
|
||||||
|
#include "notificationedgewidget.h"
|
||||||
|
#include "genericchatroomwidget.h"
|
||||||
|
#include <QScrollBar>
|
||||||
|
#include <cassert>
|
||||||
|
|
||||||
|
#include <QDebug>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
NotificationScrollArea::NotificationScrollArea(QWidget* parent)
|
||||||
|
: AdjustingScrollArea(parent)
|
||||||
|
{
|
||||||
|
connect(verticalScrollBar(), &QAbstractSlider::valueChanged, this, &NotificationScrollArea::updateTracking);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NotificationScrollArea::trackWidget(GenericChatroomWidget* widget)
|
||||||
|
{
|
||||||
|
if (trackedWidgets.find(widget) != trackedWidgets.end())
|
||||||
|
return;
|
||||||
|
|
||||||
|
Visibility visibility = widgetVisible(widget);
|
||||||
|
if (visibility != Visible)
|
||||||
|
{
|
||||||
|
if (visibility == Above)
|
||||||
|
{
|
||||||
|
if (referencesAbove++ == 0)
|
||||||
|
{
|
||||||
|
assert(topEdge == nullptr);
|
||||||
|
topEdge = new NotificationEdgeWidget(NotificationEdgeWidget::Top, this);
|
||||||
|
connect(topEdge, &NotificationEdgeWidget::clicked, this, &NotificationScrollArea::findPreviousWidget);
|
||||||
|
recalculateTopEdge();
|
||||||
|
topEdge->show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (referencesBelow++ == 0)
|
||||||
|
{
|
||||||
|
assert(bottomEdge == nullptr);
|
||||||
|
bottomEdge = new NotificationEdgeWidget(NotificationEdgeWidget::Bottom, this);
|
||||||
|
connect(bottomEdge, &NotificationEdgeWidget::clicked, this, &NotificationScrollArea::findNextWidget);
|
||||||
|
recalculateBottomEdge();
|
||||||
|
bottomEdge->show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
trackedWidgets.insert(widget, visibility);
|
||||||
|
}
|
||||||
|
qDebug() << "VISIBLE?" << visibility;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NotificationScrollArea::updateTracking()
|
||||||
|
{
|
||||||
|
QHash<GenericChatroomWidget*, Visibility>::iterator i = trackedWidgets.begin();
|
||||||
|
while (i != trackedWidgets.end())
|
||||||
|
{
|
||||||
|
if (widgetVisible(i.key()) == Visible)
|
||||||
|
{
|
||||||
|
if (i.value() == Above)
|
||||||
|
{
|
||||||
|
if (--referencesAbove == 0)
|
||||||
|
{
|
||||||
|
delete topEdge;
|
||||||
|
topEdge = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (--referencesBelow == 0)
|
||||||
|
{
|
||||||
|
delete bottomEdge;
|
||||||
|
bottomEdge = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
i = trackedWidgets.erase(i);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
++i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void NotificationScrollArea::resizeEvent(QResizeEvent *event)
|
||||||
|
{
|
||||||
|
if (topEdge != nullptr)
|
||||||
|
recalculateTopEdge();
|
||||||
|
if (bottomEdge != nullptr)
|
||||||
|
recalculateBottomEdge();
|
||||||
|
|
||||||
|
AdjustingScrollArea::resizeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NotificationScrollArea::findNextWidget()
|
||||||
|
{
|
||||||
|
GenericChatroomWidget* next = nullptr;
|
||||||
|
int value;
|
||||||
|
QHash<GenericChatroomWidget*, Visibility>::iterator i = trackedWidgets.begin();
|
||||||
|
|
||||||
|
// Find the first next, to avoid nullptr.
|
||||||
|
for (; i != trackedWidgets.end(); ++i)
|
||||||
|
{
|
||||||
|
if (i.value() == Below)
|
||||||
|
{
|
||||||
|
next = i.key();
|
||||||
|
value = next->mapTo(viewport(), QPoint()).y();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try finding a closer one.
|
||||||
|
for (; i != trackedWidgets.end(); ++i)
|
||||||
|
{
|
||||||
|
if (i.value() == Below)
|
||||||
|
{
|
||||||
|
int y = i.key()->mapTo(viewport(), QPoint()).y();
|
||||||
|
if (y < value)
|
||||||
|
{
|
||||||
|
next = i.key();
|
||||||
|
value = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (next != nullptr)
|
||||||
|
ensureWidgetVisible(next, 0, referencesBelow != 1 ? bottomEdge->height() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void NotificationScrollArea::findPreviousWidget()
|
||||||
|
{
|
||||||
|
GenericChatroomWidget* next = nullptr;
|
||||||
|
int value;
|
||||||
|
QHash<GenericChatroomWidget*, Visibility>::iterator i = trackedWidgets.begin();
|
||||||
|
|
||||||
|
// Find the first next, to avoid nullptr.
|
||||||
|
for (; i != trackedWidgets.end(); ++i)
|
||||||
|
{
|
||||||
|
if (i.value() == Above)
|
||||||
|
{
|
||||||
|
next = i.key();
|
||||||
|
value = next->mapTo(viewport(), QPoint()).y();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Try finding a closer one.
|
||||||
|
for (; i != trackedWidgets.end(); ++i)
|
||||||
|
{
|
||||||
|
if (i.value() == Above)
|
||||||
|
{
|
||||||
|
int y = i.key()->mapTo(viewport(), QPoint()).y();
|
||||||
|
if (y > value)
|
||||||
|
{
|
||||||
|
next = i.key();
|
||||||
|
value = y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (next != nullptr)
|
||||||
|
ensureWidgetVisible(next, 0, referencesAbove != 1 ? topEdge->height() : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
NotificationScrollArea::Visibility NotificationScrollArea::widgetVisible(QWidget *widget) const
|
||||||
|
{
|
||||||
|
int y = widget->mapTo(viewport(), QPoint()).y();
|
||||||
|
|
||||||
|
if (y < 0)
|
||||||
|
return Above;
|
||||||
|
else if (y + widget->height() > viewport()->height())
|
||||||
|
return Below;
|
||||||
|
|
||||||
|
return Visible;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NotificationScrollArea::recalculateTopEdge()
|
||||||
|
{
|
||||||
|
topEdge->move(viewport()->pos());
|
||||||
|
topEdge->resize(viewport()->width(), topEdge->height());
|
||||||
|
}
|
||||||
|
|
||||||
|
void NotificationScrollArea::recalculateBottomEdge()
|
||||||
|
{
|
||||||
|
QPoint position = viewport()->pos();
|
||||||
|
position.setY(position.y() + viewport()->height() - bottomEdge->height());
|
||||||
|
bottomEdge->move(position);
|
||||||
|
bottomEdge->resize(viewport()->width(), bottomEdge->height());
|
||||||
|
}
|
63
src/widget/notificationscrollarea.h
Normal file
63
src/widget/notificationscrollarea.h
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
Copyright © 2015 by The qTox Project
|
||||||
|
|
||||||
|
This file is part of qTox, a Qt-based graphical interface for Tox.
|
||||||
|
|
||||||
|
qTox is libre software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
qTox is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with qTox. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef NOTIFICATIONSCROLLAREA_H
|
||||||
|
#define NOTIFICATIONSCROLLAREA_H
|
||||||
|
|
||||||
|
#include "tool/adjustingscrollarea.h"
|
||||||
|
#include <QHash>
|
||||||
|
|
||||||
|
class GenericChatroomWidget;
|
||||||
|
class NotificationEdgeWidget;
|
||||||
|
|
||||||
|
class NotificationScrollArea final : public AdjustingScrollArea
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NotificationScrollArea(QWidget* parent = 0);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void trackWidget(GenericChatroomWidget* widget);
|
||||||
|
void updateTracking();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void resizeEvent(QResizeEvent *event) final override;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void findNextWidget();
|
||||||
|
void findPreviousWidget();
|
||||||
|
|
||||||
|
private:
|
||||||
|
enum Visibility : uint8_t
|
||||||
|
{
|
||||||
|
Visible,
|
||||||
|
Above,
|
||||||
|
Below
|
||||||
|
};
|
||||||
|
Visibility widgetVisible(QWidget* widget) const;
|
||||||
|
void recalculateTopEdge();
|
||||||
|
void recalculateBottomEdge();
|
||||||
|
|
||||||
|
QHash<GenericChatroomWidget*, Visibility> trackedWidgets;
|
||||||
|
NotificationEdgeWidget* topEdge = nullptr;
|
||||||
|
NotificationEdgeWidget* bottomEdge = nullptr;
|
||||||
|
size_t referencesAbove = 0;
|
||||||
|
size_t referencesBelow = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // NOTIFICATIONSCROLLAREA_H
|
|
@ -22,14 +22,14 @@
|
||||||
|
|
||||||
#include <QScrollArea>
|
#include <QScrollArea>
|
||||||
|
|
||||||
class AdjustingScrollArea final : public QScrollArea
|
class AdjustingScrollArea : public QScrollArea
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
explicit AdjustingScrollArea(QWidget *parent = 0);
|
explicit AdjustingScrollArea(QWidget *parent = 0);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void resizeEvent(QResizeEvent *ev) final override;
|
virtual void resizeEvent(QResizeEvent *ev) override;
|
||||||
virtual QSize sizeHint() const final override;
|
virtual QSize sizeHint() const final override;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -799,6 +799,8 @@ void Widget::newMessageAlert(GenericChatroomWidget* chat)
|
||||||
|
|
||||||
Audio::playMono16Sound(sndData);
|
Audio::playMono16Sound(sndData);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ui->friendList->trackWidget(chat);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Widget::playRingtone()
|
void Widget::playRingtone()
|
||||||
|
|
9
ui/notificationEdge/notificationEdge.css
Normal file
9
ui/notificationEdge/notificationEdge.css
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
NotificationEdgeWidget
|
||||||
|
{
|
||||||
|
background-color: #6bc260;
|
||||||
|
}
|
||||||
|
|
||||||
|
NotificationEdgeWidget > QLabel
|
||||||
|
{
|
||||||
|
color: white;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user