mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-22 19:08:58 +03:00
Port remaining sidebar actions to qml
This commit is contained in:
parent
567078d39f
commit
53fcf7f428
10 changed files with 50 additions and 677 deletions
|
@ -477,6 +477,7 @@ Page {
|
||||||
image: ":/icons/icons/ui/power-button-off.png"
|
image: ":/icons/icons/ui/power-button-off.png"
|
||||||
ToolTip.visible: hovered
|
ToolTip.visible: hovered
|
||||||
ToolTip.text: qsTr("Logout")
|
ToolTip.text: qsTr("Logout")
|
||||||
|
onClicked: Nheko.openLogoutDialog()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -523,6 +524,23 @@ Page {
|
||||||
ToolTip.visible: hovered
|
ToolTip.visible: hovered
|
||||||
ToolTip.text: qsTr("Start a new chat")
|
ToolTip.text: qsTr("Start a new chat")
|
||||||
Layout.margins: Nheko.paddingMedium
|
Layout.margins: Nheko.paddingMedium
|
||||||
|
|
||||||
|
onClicked: roomJoinCreateMenu.open(parent)
|
||||||
|
|
||||||
|
Platform.Menu {
|
||||||
|
id: roomJoinCreateMenu
|
||||||
|
|
||||||
|
Platform.MenuItem {
|
||||||
|
text: qsTr("Join a room")
|
||||||
|
onTriggered: Nheko.openJoinRoomDialog()
|
||||||
|
}
|
||||||
|
|
||||||
|
Platform.MenuItem {
|
||||||
|
text: qsTr("Create a new room")
|
||||||
|
onTriggered: Nheko.openCreateRoomDialog()
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImageButton {
|
ImageButton {
|
||||||
|
@ -545,6 +563,7 @@ Page {
|
||||||
ToolTip.visible: hovered
|
ToolTip.visible: hovered
|
||||||
ToolTip.text: qsTr("User settings")
|
ToolTip.text: qsTr("User settings")
|
||||||
Layout.margins: Nheko.paddingMedium
|
Layout.margins: Nheko.paddingMedium
|
||||||
|
onClicked: Nheko.showUserSettingsPage()
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,6 @@
|
||||||
#include "MainWindow.h"
|
#include "MainWindow.h"
|
||||||
#include "MatrixClient.h"
|
#include "MatrixClient.h"
|
||||||
#include "RegisterPage.h"
|
#include "RegisterPage.h"
|
||||||
#include "Splitter.h"
|
|
||||||
#include "TrayIcon.h"
|
#include "TrayIcon.h"
|
||||||
#include "UserSettingsPage.h"
|
#include "UserSettingsPage.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
|
|
|
@ -1,120 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#include <QIcon>
|
|
||||||
#include <QPainter>
|
|
||||||
#include <QResizeEvent>
|
|
||||||
#include <QStyle>
|
|
||||||
#include <QStyleOption>
|
|
||||||
|
|
||||||
#include <mtx/requests.hpp>
|
|
||||||
|
|
||||||
#include "Config.h"
|
|
||||||
#include "MainWindow.h"
|
|
||||||
#include "SideBarActions.h"
|
|
||||||
#include "Splitter.h"
|
|
||||||
#include "ui/FlatButton.h"
|
|
||||||
#include "ui/Menu.h"
|
|
||||||
|
|
||||||
SideBarActions::SideBarActions(QWidget *parent)
|
|
||||||
: QWidget{parent}
|
|
||||||
{
|
|
||||||
QFont f;
|
|
||||||
f.setPointSizeF(f.pointSizeF());
|
|
||||||
|
|
||||||
const int fontHeight = QFontMetrics(f).height();
|
|
||||||
const int contentHeight = fontHeight * 2.5;
|
|
||||||
|
|
||||||
setFixedHeight(contentHeight);
|
|
||||||
|
|
||||||
layout_ = new QHBoxLayout(this);
|
|
||||||
layout_->setMargin(0);
|
|
||||||
|
|
||||||
QIcon settingsIcon;
|
|
||||||
settingsIcon.addFile(":/icons/icons/ui/settings.png");
|
|
||||||
|
|
||||||
QIcon createRoomIcon;
|
|
||||||
createRoomIcon.addFile(":/icons/icons/ui/add-square-button.png");
|
|
||||||
|
|
||||||
QIcon joinRoomIcon;
|
|
||||||
joinRoomIcon.addFile(":/icons/icons/ui/speech-bubbles-comment-option.png");
|
|
||||||
|
|
||||||
settingsBtn_ = new FlatButton(this);
|
|
||||||
settingsBtn_->setToolTip(tr("User settings"));
|
|
||||||
settingsBtn_->setIcon(settingsIcon);
|
|
||||||
settingsBtn_->setCornerRadius(conf::sidebarActions::iconSize / 2);
|
|
||||||
settingsBtn_->setIconSize(
|
|
||||||
QSize(conf::sidebarActions::iconSize, conf::sidebarActions::iconSize));
|
|
||||||
|
|
||||||
addMenu_ = new Menu(this);
|
|
||||||
createRoomAction_ = new QAction(tr("Create new room"), this);
|
|
||||||
joinRoomAction_ = new QAction(tr("Join a room"), this);
|
|
||||||
|
|
||||||
connect(joinRoomAction_, &QAction::triggered, this, [this]() {
|
|
||||||
MainWindow::instance()->openJoinRoomDialog(
|
|
||||||
[this](const QString &room_id) { emit joinRoom(room_id); });
|
|
||||||
});
|
|
||||||
|
|
||||||
connect(createRoomAction_, &QAction::triggered, this, [this]() {
|
|
||||||
MainWindow::instance()->openCreateRoomDialog(
|
|
||||||
[this](const mtx::requests::CreateRoom &req) { emit createRoom(req); });
|
|
||||||
});
|
|
||||||
|
|
||||||
addMenu_->addAction(createRoomAction_);
|
|
||||||
addMenu_->addAction(joinRoomAction_);
|
|
||||||
|
|
||||||
createRoomBtn_ = new FlatButton(this);
|
|
||||||
createRoomBtn_->setToolTip(tr("Start a new chat"));
|
|
||||||
createRoomBtn_->setIcon(createRoomIcon);
|
|
||||||
createRoomBtn_->setCornerRadius(conf::sidebarActions::iconSize / 2);
|
|
||||||
createRoomBtn_->setIconSize(
|
|
||||||
QSize(conf::sidebarActions::iconSize, conf::sidebarActions::iconSize));
|
|
||||||
|
|
||||||
connect(createRoomBtn_, &QPushButton::clicked, this, [this]() {
|
|
||||||
auto pos = mapToGlobal(createRoomBtn_->pos());
|
|
||||||
auto padding = conf::sidebarActions::iconSize / 2;
|
|
||||||
|
|
||||||
addMenu_->popup(
|
|
||||||
QPoint(pos.x() + padding, pos.y() - padding - addMenu_->sizeHint().height()));
|
|
||||||
});
|
|
||||||
|
|
||||||
roomDirectory_ = new FlatButton(this);
|
|
||||||
roomDirectory_->setToolTip(tr("Room directory"));
|
|
||||||
roomDirectory_->setEnabled(false);
|
|
||||||
roomDirectory_->setIcon(joinRoomIcon);
|
|
||||||
roomDirectory_->setCornerRadius(conf::sidebarActions::iconSize / 2);
|
|
||||||
roomDirectory_->setIconSize(
|
|
||||||
QSize(conf::sidebarActions::iconSize, conf::sidebarActions::iconSize));
|
|
||||||
|
|
||||||
layout_->addWidget(createRoomBtn_);
|
|
||||||
layout_->addWidget(roomDirectory_);
|
|
||||||
layout_->addWidget(settingsBtn_);
|
|
||||||
|
|
||||||
connect(settingsBtn_, &QPushButton::clicked, this, &SideBarActions::showSettings);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SideBarActions::resizeEvent(QResizeEvent *event)
|
|
||||||
{
|
|
||||||
Q_UNUSED(event);
|
|
||||||
|
|
||||||
const auto sidebarSizes = splitter::calculateSidebarSizes(QFont{});
|
|
||||||
|
|
||||||
if (width() <= sidebarSizes.small) {
|
|
||||||
roomDirectory_->hide();
|
|
||||||
createRoomBtn_->hide();
|
|
||||||
} else {
|
|
||||||
roomDirectory_->show();
|
|
||||||
createRoomBtn_->show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
SideBarActions::paintEvent(QPaintEvent *)
|
|
||||||
{
|
|
||||||
QStyleOption opt;
|
|
||||||
opt.init(this);
|
|
||||||
QPainter p(this);
|
|
||||||
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
|
|
||||||
}
|
|
|
@ -1,54 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <QAction>
|
|
||||||
#include <QHBoxLayout>
|
|
||||||
#include <QWidget>
|
|
||||||
|
|
||||||
namespace mtx {
|
|
||||||
namespace requests {
|
|
||||||
struct CreateRoom;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class Menu;
|
|
||||||
class FlatButton;
|
|
||||||
class QResizeEvent;
|
|
||||||
|
|
||||||
class SideBarActions : public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
Q_PROPERTY(QColor borderColor READ borderColor WRITE setBorderColor)
|
|
||||||
|
|
||||||
public:
|
|
||||||
SideBarActions(QWidget *parent = nullptr);
|
|
||||||
|
|
||||||
QColor borderColor() const { return borderColor_; }
|
|
||||||
void setBorderColor(QColor &color) { borderColor_ = color; }
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void showSettings();
|
|
||||||
void joinRoom(const QString &room);
|
|
||||||
void createRoom(const mtx::requests::CreateRoom &request);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void resizeEvent(QResizeEvent *event) override;
|
|
||||||
void paintEvent(QPaintEvent *event) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
QHBoxLayout *layout_;
|
|
||||||
|
|
||||||
Menu *addMenu_;
|
|
||||||
QAction *createRoomAction_;
|
|
||||||
QAction *joinRoomAction_;
|
|
||||||
|
|
||||||
FlatButton *settingsBtn_;
|
|
||||||
FlatButton *createRoomBtn_;
|
|
||||||
FlatButton *roomDirectory_;
|
|
||||||
|
|
||||||
QColor borderColor_;
|
|
||||||
};
|
|
166
src/Splitter.cpp
166
src/Splitter.cpp
|
@ -1,166 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: 2017 Konstantinos Sideris <siderisk@auth.gr>
|
|
||||||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#include <QSettings>
|
|
||||||
|
|
||||||
#include "Logging.h"
|
|
||||||
#include "Splitter.h"
|
|
||||||
|
|
||||||
constexpr auto MaxWidth = (1 << 24) - 1;
|
|
||||||
|
|
||||||
Splitter::Splitter(QWidget *parent)
|
|
||||||
: QSplitter(parent)
|
|
||||||
, sz_{splitter::calculateSidebarSizes(QFont{})}
|
|
||||||
{
|
|
||||||
connect(this, &QSplitter::splitterMoved, this, &Splitter::onSplitterMoved);
|
|
||||||
setChildrenCollapsible(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Splitter::restoreSizes(int fallback)
|
|
||||||
{
|
|
||||||
QSettings settings;
|
|
||||||
int savedWidth = settings.value("sidebar/width").toInt();
|
|
||||||
|
|
||||||
auto left = widget(0);
|
|
||||||
if (savedWidth <= 0) {
|
|
||||||
hideSidebar();
|
|
||||||
return;
|
|
||||||
} else if (savedWidth <= sz_.small) {
|
|
||||||
if (left) {
|
|
||||||
left->setMinimumWidth(sz_.small);
|
|
||||||
left->setMaximumWidth(sz_.small);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else if (savedWidth < sz_.normal) {
|
|
||||||
savedWidth = sz_.normal;
|
|
||||||
}
|
|
||||||
|
|
||||||
left->setMinimumWidth(sz_.normal);
|
|
||||||
left->setMaximumWidth(2 * sz_.normal);
|
|
||||||
setSizes({savedWidth, fallback - savedWidth});
|
|
||||||
|
|
||||||
setStretchFactor(0, 0);
|
|
||||||
setStretchFactor(1, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
Splitter::~Splitter()
|
|
||||||
{
|
|
||||||
auto left = widget(0);
|
|
||||||
|
|
||||||
if (left) {
|
|
||||||
QSettings settings;
|
|
||||||
settings.setValue("sidebar/width", left->width());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Splitter::onSplitterMoved(int pos, int index)
|
|
||||||
{
|
|
||||||
Q_UNUSED(pos);
|
|
||||||
Q_UNUSED(index);
|
|
||||||
|
|
||||||
auto s = sizes();
|
|
||||||
|
|
||||||
if (s.count() < 2) {
|
|
||||||
nhlog::ui()->warn("Splitter needs at least two children");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (s[0] == sz_.normal) {
|
|
||||||
rightMoveCount_ += 1;
|
|
||||||
|
|
||||||
if (rightMoveCount_ > moveEventLimit_) {
|
|
||||||
auto left = widget(0);
|
|
||||||
auto cursorPosition = left->mapFromGlobal(QCursor::pos());
|
|
||||||
|
|
||||||
// if we are coming from the right, the cursor should
|
|
||||||
// end up on the first widget.
|
|
||||||
if (left->rect().contains(cursorPosition)) {
|
|
||||||
left->setMinimumWidth(sz_.small);
|
|
||||||
left->setMaximumWidth(sz_.small);
|
|
||||||
|
|
||||||
rightMoveCount_ = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (s[0] == sz_.small) {
|
|
||||||
leftMoveCount_ += 1;
|
|
||||||
|
|
||||||
if (leftMoveCount_ > moveEventLimit_) {
|
|
||||||
auto left = widget(0);
|
|
||||||
auto right = widget(1);
|
|
||||||
auto cursorPosition = right->mapFromGlobal(QCursor::pos());
|
|
||||||
|
|
||||||
// We move the start a little further so the transition isn't so abrupt.
|
|
||||||
auto extended = right->rect();
|
|
||||||
extended.translate(100, 0);
|
|
||||||
|
|
||||||
// if we are coming from the left, the cursor should
|
|
||||||
// end up on the second widget.
|
|
||||||
if (extended.contains(cursorPosition) &&
|
|
||||||
right->size().width() >= sz_.collapsePoint + sz_.normal) {
|
|
||||||
left->setMinimumWidth(sz_.normal);
|
|
||||||
left->setMaximumWidth(2 * sz_.normal);
|
|
||||||
|
|
||||||
leftMoveCount_ = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Splitter::hideSidebar()
|
|
||||||
{
|
|
||||||
auto left = widget(0);
|
|
||||||
if (left)
|
|
||||||
left->hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Splitter::showChatView()
|
|
||||||
{
|
|
||||||
auto left = widget(0);
|
|
||||||
auto right = widget(1);
|
|
||||||
|
|
||||||
if (right->isHidden()) {
|
|
||||||
left->hide();
|
|
||||||
right->show();
|
|
||||||
|
|
||||||
// Restore previous size.
|
|
||||||
if (left->minimumWidth() == sz_.small) {
|
|
||||||
left->setMinimumWidth(sz_.small);
|
|
||||||
left->setMaximumWidth(sz_.small);
|
|
||||||
} else {
|
|
||||||
left->setMinimumWidth(sz_.normal);
|
|
||||||
left->setMaximumWidth(2 * sz_.normal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Splitter::showFullRoomList()
|
|
||||||
{
|
|
||||||
auto left = widget(0);
|
|
||||||
auto right = widget(1);
|
|
||||||
|
|
||||||
right->hide();
|
|
||||||
|
|
||||||
left->show();
|
|
||||||
left->setMaximumWidth(MaxWidth);
|
|
||||||
}
|
|
||||||
|
|
||||||
splitter::SideBarSizes
|
|
||||||
splitter::calculateSidebarSizes(const QFont &f)
|
|
||||||
{
|
|
||||||
const auto height = static_cast<double>(QFontMetrics{f}.lineSpacing());
|
|
||||||
|
|
||||||
SideBarSizes sz;
|
|
||||||
sz.small = std::ceil(3.8 * height);
|
|
||||||
sz.normal = std::ceil(16 * height);
|
|
||||||
sz.groups = std::ceil(3 * height);
|
|
||||||
sz.collapsePoint = 2 * sz.normal;
|
|
||||||
|
|
||||||
return sz;
|
|
||||||
}
|
|
|
@ -1,49 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: 2017 Konstantinos Sideris <siderisk@auth.gr>
|
|
||||||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <QSplitter>
|
|
||||||
|
|
||||||
namespace splitter {
|
|
||||||
struct SideBarSizes
|
|
||||||
{
|
|
||||||
int small;
|
|
||||||
int normal;
|
|
||||||
int groups;
|
|
||||||
int collapsePoint;
|
|
||||||
};
|
|
||||||
|
|
||||||
SideBarSizes
|
|
||||||
calculateSidebarSizes(const QFont &f);
|
|
||||||
}
|
|
||||||
|
|
||||||
class Splitter : public QSplitter
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
public:
|
|
||||||
explicit Splitter(QWidget *parent = nullptr);
|
|
||||||
~Splitter() override;
|
|
||||||
|
|
||||||
void restoreSizes(int fallback);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
void hideSidebar();
|
|
||||||
void showFullRoomList();
|
|
||||||
void showChatView();
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void hiddenSidebar();
|
|
||||||
|
|
||||||
private:
|
|
||||||
void onSplitterMoved(int pos, int index);
|
|
||||||
|
|
||||||
int moveEventLimit_ = 50;
|
|
||||||
|
|
||||||
int leftMoveCount_ = 0;
|
|
||||||
int rightMoveCount_ = 0;
|
|
||||||
|
|
||||||
splitter::SideBarSizes sz_;
|
|
||||||
};
|
|
|
@ -1,219 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: 2017 Konstantinos Sideris <siderisk@auth.gr>
|
|
||||||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#include <QInputDialog>
|
|
||||||
#include <QLabel>
|
|
||||||
#include <QMenu>
|
|
||||||
#include <QPainter>
|
|
||||||
#include <QStyle>
|
|
||||||
#include <QStyleOption>
|
|
||||||
#include <QTimer>
|
|
||||||
|
|
||||||
#include <iostream>
|
|
||||||
|
|
||||||
#include "ChatPage.h"
|
|
||||||
#include "Config.h"
|
|
||||||
#include "MainWindow.h"
|
|
||||||
#include "Splitter.h"
|
|
||||||
#include "UserInfoWidget.h"
|
|
||||||
#include "UserSettingsPage.h"
|
|
||||||
#include "ui/Avatar.h"
|
|
||||||
#include "ui/FlatButton.h"
|
|
||||||
#include "ui/OverlayModal.h"
|
|
||||||
|
|
||||||
UserInfoWidget::UserInfoWidget(QWidget *parent)
|
|
||||||
: QWidget(parent)
|
|
||||||
, display_name_("User")
|
|
||||||
, user_id_("@user:homeserver.org")
|
|
||||||
{
|
|
||||||
QFont f;
|
|
||||||
f.setPointSizeF(f.pointSizeF());
|
|
||||||
|
|
||||||
const int fontHeight = QFontMetrics(f).height();
|
|
||||||
const int widgetMargin = fontHeight / 3;
|
|
||||||
const int contentHeight = fontHeight * 3;
|
|
||||||
|
|
||||||
logoutButtonSize_ = std::min(fontHeight, 20);
|
|
||||||
|
|
||||||
setFixedHeight(contentHeight + widgetMargin);
|
|
||||||
|
|
||||||
topLayout_ = new QHBoxLayout(this);
|
|
||||||
topLayout_->setSpacing(0);
|
|
||||||
topLayout_->setMargin(widgetMargin);
|
|
||||||
|
|
||||||
avatarLayout_ = new QHBoxLayout();
|
|
||||||
textLayout_ = new QVBoxLayout();
|
|
||||||
textLayout_->setSpacing(widgetMargin / 2);
|
|
||||||
textLayout_->setContentsMargins(widgetMargin * 2, widgetMargin, widgetMargin, widgetMargin);
|
|
||||||
|
|
||||||
userAvatar_ = new Avatar(this, fontHeight * 2.5);
|
|
||||||
userAvatar_->setObjectName("userAvatar");
|
|
||||||
userAvatar_->setLetter(QChar('?'));
|
|
||||||
|
|
||||||
QFont nameFont;
|
|
||||||
nameFont.setPointSizeF(nameFont.pointSizeF() * 1.1);
|
|
||||||
nameFont.setWeight(QFont::Medium);
|
|
||||||
|
|
||||||
displayNameLabel_ = new QLabel(this);
|
|
||||||
displayNameLabel_->setFont(nameFont);
|
|
||||||
displayNameLabel_->setObjectName("displayNameLabel");
|
|
||||||
displayNameLabel_->setAlignment(Qt::AlignLeading | Qt::AlignLeft | Qt::AlignTop);
|
|
||||||
|
|
||||||
userIdLabel_ = new QLabel(this);
|
|
||||||
userIdLabel_->setFont(f);
|
|
||||||
userIdLabel_->setObjectName("userIdLabel");
|
|
||||||
userIdLabel_->setAlignment(Qt::AlignLeading | Qt::AlignLeft | Qt::AlignVCenter);
|
|
||||||
|
|
||||||
avatarLayout_->addWidget(userAvatar_);
|
|
||||||
textLayout_->addWidget(displayNameLabel_, 0, Qt::AlignBottom);
|
|
||||||
textLayout_->addWidget(userIdLabel_, 0, Qt::AlignTop);
|
|
||||||
|
|
||||||
topLayout_->addLayout(avatarLayout_);
|
|
||||||
topLayout_->addLayout(textLayout_);
|
|
||||||
topLayout_->addStretch(1);
|
|
||||||
|
|
||||||
buttonLayout_ = new QHBoxLayout();
|
|
||||||
buttonLayout_->setSpacing(0);
|
|
||||||
buttonLayout_->setMargin(0);
|
|
||||||
|
|
||||||
logoutButton_ = new FlatButton(this);
|
|
||||||
logoutButton_->setToolTip(tr("Logout"));
|
|
||||||
logoutButton_->setCornerRadius(logoutButtonSize_ / 2);
|
|
||||||
|
|
||||||
QIcon icon;
|
|
||||||
icon.addFile(":/icons/icons/ui/power-button-off.png");
|
|
||||||
|
|
||||||
logoutButton_->setIcon(icon);
|
|
||||||
logoutButton_->setIconSize(QSize(logoutButtonSize_, logoutButtonSize_));
|
|
||||||
|
|
||||||
buttonLayout_->addWidget(logoutButton_);
|
|
||||||
|
|
||||||
topLayout_->addLayout(buttonLayout_);
|
|
||||||
|
|
||||||
// Show the confirmation dialog.
|
|
||||||
connect(logoutButton_, &QPushButton::clicked, this, []() {
|
|
||||||
MainWindow::instance()->openLogoutDialog();
|
|
||||||
});
|
|
||||||
|
|
||||||
menu = new QMenu(this);
|
|
||||||
|
|
||||||
auto setStatusAction = menu->addAction(tr("Set custom status message"));
|
|
||||||
connect(setStatusAction, &QAction::triggered, this, [this]() {
|
|
||||||
bool ok = false;
|
|
||||||
QString text = QInputDialog::getText(this,
|
|
||||||
tr("Custom status message"),
|
|
||||||
tr("Status:"),
|
|
||||||
QLineEdit::Normal,
|
|
||||||
ChatPage::instance()->status(),
|
|
||||||
&ok);
|
|
||||||
if (ok)
|
|
||||||
ChatPage::instance()->setStatus(text);
|
|
||||||
});
|
|
||||||
|
|
||||||
auto userProfileAction = menu->addAction(tr("User Profile Settings"));
|
|
||||||
connect(
|
|
||||||
userProfileAction, &QAction::triggered, this, [this]() { emit openGlobalUserProfile(); });
|
|
||||||
|
|
||||||
#if 0 // disable presence menu until issues in synapse are resolved
|
|
||||||
auto setAutoPresence = menu->addAction(tr("Set presence automatically"));
|
|
||||||
connect(setAutoPresence, &QAction::triggered, this, []() {
|
|
||||||
ChatPage::instance()->userSettings()->setPresence(
|
|
||||||
UserSettings::Presence::AutomaticPresence);
|
|
||||||
ChatPage::instance()->setStatus(ChatPage::instance()->status());
|
|
||||||
});
|
|
||||||
auto setOnline = menu->addAction(tr("Online"));
|
|
||||||
connect(setOnline, &QAction::triggered, this, []() {
|
|
||||||
ChatPage::instance()->userSettings()->setPresence(UserSettings::Presence::Online);
|
|
||||||
ChatPage::instance()->setStatus(ChatPage::instance()->status());
|
|
||||||
});
|
|
||||||
auto setUnavailable = menu->addAction(tr("Unavailable"));
|
|
||||||
connect(setUnavailable, &QAction::triggered, this, []() {
|
|
||||||
ChatPage::instance()->userSettings()->setPresence(
|
|
||||||
UserSettings::Presence::Unavailable);
|
|
||||||
ChatPage::instance()->setStatus(ChatPage::instance()->status());
|
|
||||||
});
|
|
||||||
auto setOffline = menu->addAction(tr("Offline"));
|
|
||||||
connect(setOffline, &QAction::triggered, this, []() {
|
|
||||||
ChatPage::instance()->userSettings()->setPresence(UserSettings::Presence::Offline);
|
|
||||||
ChatPage::instance()->setStatus(ChatPage::instance()->status());
|
|
||||||
});
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
UserInfoWidget::contextMenuEvent(QContextMenuEvent *event)
|
|
||||||
{
|
|
||||||
menu->popup(event->globalPos());
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
UserInfoWidget::resizeEvent(QResizeEvent *event)
|
|
||||||
{
|
|
||||||
Q_UNUSED(event);
|
|
||||||
|
|
||||||
const auto sz = splitter::calculateSidebarSizes(QFont{});
|
|
||||||
|
|
||||||
if (width() <= sz.small) {
|
|
||||||
topLayout_->setContentsMargins(0, 0, logoutButtonSize_, 0);
|
|
||||||
|
|
||||||
userAvatar_->hide();
|
|
||||||
displayNameLabel_->hide();
|
|
||||||
userIdLabel_->hide();
|
|
||||||
} else {
|
|
||||||
topLayout_->setMargin(5);
|
|
||||||
userAvatar_->show();
|
|
||||||
displayNameLabel_->show();
|
|
||||||
userIdLabel_->show();
|
|
||||||
}
|
|
||||||
|
|
||||||
QWidget::resizeEvent(event);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
UserInfoWidget::reset()
|
|
||||||
{
|
|
||||||
displayNameLabel_->setText("");
|
|
||||||
userIdLabel_->setText("");
|
|
||||||
userAvatar_->setLetter(QChar('?'));
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
UserInfoWidget::setDisplayName(const QString &name)
|
|
||||||
{
|
|
||||||
if (name.isEmpty())
|
|
||||||
display_name_ = user_id_.split(':')[0].split('@')[1];
|
|
||||||
else
|
|
||||||
display_name_ = name;
|
|
||||||
|
|
||||||
displayNameLabel_->setText(display_name_);
|
|
||||||
userAvatar_->setLetter(QChar(display_name_[0]));
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
UserInfoWidget::setUserId(const QString &userid)
|
|
||||||
{
|
|
||||||
user_id_ = userid;
|
|
||||||
userIdLabel_->setText(userid);
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
UserInfoWidget::setAvatar(const QString &url)
|
|
||||||
{
|
|
||||||
userAvatar_->setImage(url);
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
UserInfoWidget::paintEvent(QPaintEvent *event)
|
|
||||||
{
|
|
||||||
Q_UNUSED(event);
|
|
||||||
|
|
||||||
QStyleOption opt;
|
|
||||||
opt.init(this);
|
|
||||||
QPainter p(this);
|
|
||||||
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
|
|
||||||
}
|
|
|
@ -1,68 +0,0 @@
|
||||||
// SPDX-FileCopyrightText: 2017 Konstantinos Sideris <siderisk@auth.gr>
|
|
||||||
// SPDX-FileCopyrightText: 2021 Nheko Contributors
|
|
||||||
//
|
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
||||||
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <QWidget>
|
|
||||||
|
|
||||||
class Avatar;
|
|
||||||
class FlatButton;
|
|
||||||
class OverlayModal;
|
|
||||||
|
|
||||||
class QLabel;
|
|
||||||
class QHBoxLayout;
|
|
||||||
class QVBoxLayout;
|
|
||||||
class QMenu;
|
|
||||||
|
|
||||||
class UserInfoWidget : public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
Q_PROPERTY(QColor borderColor READ borderColor WRITE setBorderColor)
|
|
||||||
|
|
||||||
public:
|
|
||||||
UserInfoWidget(QWidget *parent = nullptr);
|
|
||||||
|
|
||||||
void setDisplayName(const QString &name);
|
|
||||||
void setUserId(const QString &userid);
|
|
||||||
void setAvatar(const QString &url);
|
|
||||||
|
|
||||||
void reset();
|
|
||||||
|
|
||||||
QColor borderColor() const { return borderColor_; }
|
|
||||||
void setBorderColor(QColor &color) { borderColor_ = color; }
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void resizeEvent(QResizeEvent *event) override;
|
|
||||||
void paintEvent(QPaintEvent *event) override;
|
|
||||||
void contextMenuEvent(QContextMenuEvent *) override;
|
|
||||||
|
|
||||||
signals:
|
|
||||||
void openGlobalUserProfile();
|
|
||||||
|
|
||||||
private:
|
|
||||||
Avatar *userAvatar_;
|
|
||||||
|
|
||||||
QHBoxLayout *topLayout_;
|
|
||||||
QHBoxLayout *avatarLayout_;
|
|
||||||
QVBoxLayout *textLayout_;
|
|
||||||
QHBoxLayout *buttonLayout_;
|
|
||||||
|
|
||||||
FlatButton *logoutButton_;
|
|
||||||
|
|
||||||
QLabel *displayNameLabel_;
|
|
||||||
QLabel *userIdLabel_;
|
|
||||||
|
|
||||||
QString display_name_;
|
|
||||||
QString user_id_;
|
|
||||||
|
|
||||||
QImage avatar_image_;
|
|
||||||
|
|
||||||
int logoutButtonSize_;
|
|
||||||
|
|
||||||
QColor borderColor_;
|
|
||||||
|
|
||||||
QMenu *menu = nullptr;
|
|
||||||
};
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "Cache_p.h"
|
#include "Cache_p.h"
|
||||||
#include "ChatPage.h"
|
#include "ChatPage.h"
|
||||||
#include "Logging.h"
|
#include "Logging.h"
|
||||||
|
#include "MainWindow.h"
|
||||||
#include "UserSettingsPage.h"
|
#include "UserSettingsPage.h"
|
||||||
#include "Utils.h"
|
#include "Utils.h"
|
||||||
|
|
||||||
|
@ -113,3 +114,29 @@ Nheko::currentUser() const
|
||||||
|
|
||||||
return currentUser_.get();
|
return currentUser_.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Nheko::showUserSettingsPage() const
|
||||||
|
{
|
||||||
|
ChatPage::instance()->showUserSettingsPage();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Nheko::openLogoutDialog() const
|
||||||
|
{
|
||||||
|
MainWindow::instance()->openLogoutDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Nheko::openCreateRoomDialog() const
|
||||||
|
{
|
||||||
|
MainWindow::instance()->openCreateRoomDialog(
|
||||||
|
[](const mtx::requests::CreateRoom &req) { ChatPage::instance()->createRoom(req); });
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Nheko::openJoinRoomDialog() const
|
||||||
|
{
|
||||||
|
MainWindow::instance()->openJoinRoomDialog(
|
||||||
|
[](const QString &room_id) { ChatPage::instance()->joinRoom(room_id); });
|
||||||
|
}
|
||||||
|
|
|
@ -40,6 +40,10 @@ public:
|
||||||
|
|
||||||
Q_INVOKABLE void openLink(QString link) const;
|
Q_INVOKABLE void openLink(QString link) const;
|
||||||
Q_INVOKABLE void setStatusMessage(QString msg) const;
|
Q_INVOKABLE void setStatusMessage(QString msg) const;
|
||||||
|
Q_INVOKABLE void showUserSettingsPage() const;
|
||||||
|
Q_INVOKABLE void openLogoutDialog() const;
|
||||||
|
Q_INVOKABLE void openCreateRoomDialog() const;
|
||||||
|
Q_INVOKABLE void openJoinRoomDialog() const;
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void updateUserProfile();
|
void updateUserProfile();
|
||||||
|
|
Loading…
Reference in a new issue