mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-22 19:08:58 +03:00
Fix regressions regarding UI resizing
The room list would be hidden only through window resizing.
This commit is contained in:
parent
a8e82ba284
commit
6c5309d9eb
9 changed files with 138 additions and 83 deletions
|
@ -69,6 +69,14 @@ public:
|
||||||
QSharedPointer<UserSettings> userSettings() { return userSettings_; }
|
QSharedPointer<UserSettings> userSettings() { return userSettings_; }
|
||||||
void deleteConfigs();
|
void deleteConfigs();
|
||||||
|
|
||||||
|
//! Calculate the width of the message timeline.
|
||||||
|
int timelineWidth();
|
||||||
|
bool isSideBarExpanded();
|
||||||
|
//! Hide the room & group list (if it was visible).
|
||||||
|
void hideSideBars();
|
||||||
|
//! Show the room/group list (if it was visible).
|
||||||
|
void showSideBars();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void leaveRoom(const QString &room_id);
|
void leaveRoom(const QString &room_id);
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
// Font sizes are in pixels.
|
// Font sizes are in pixels.
|
||||||
|
|
||||||
namespace conf {
|
namespace conf {
|
||||||
|
constexpr int sideBarCollapsePoint = 450;
|
||||||
// Global settings.
|
// Global settings.
|
||||||
constexpr int fontSize = 14;
|
constexpr int fontSize = 14;
|
||||||
constexpr int textInputFontSize = 14;
|
constexpr int textInputFontSize = 14;
|
||||||
|
|
|
@ -73,9 +73,13 @@ public:
|
||||||
void openMemberListDialog(const QString &room_id = "");
|
void openMemberListDialog(const QString &room_id = "");
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void closeEvent(QCloseEvent *event);
|
void closeEvent(QCloseEvent *event) override;
|
||||||
|
void resizeEvent(QResizeEvent *event) override;
|
||||||
|
void showEvent(QShowEvent *event) override;
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
//! Show or hide the sidebars based on window's size.
|
||||||
|
void adjustSideBars();
|
||||||
//! Handle interaction with the tray icon.
|
//! Handle interaction with the tray icon.
|
||||||
void iconActivated(QSystemTrayIcon::ActivationReason reason);
|
void iconActivated(QSystemTrayIcon::ActivationReason reason);
|
||||||
|
|
||||||
|
|
|
@ -29,8 +29,8 @@ public:
|
||||||
void restoreSizes(int fallback);
|
void restoreSizes(int fallback);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void showSidebar();
|
|
||||||
void hideSidebar();
|
void hideSidebar();
|
||||||
|
void showFullRoomList();
|
||||||
void showChatView();
|
void showChatView();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
|
|
@ -55,11 +55,14 @@ public:
|
||||||
void setBorderColor(QColor &color) { borderColor_ = color; }
|
void setBorderColor(QColor &color) { borderColor_ = color; }
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
//! Add a "back-arrow" button that can switch to roomlist only view.
|
||||||
void enableBackButton();
|
void enableBackButton();
|
||||||
|
//! Replace the "back-arrow" button with the avatar of the room.
|
||||||
|
void disableBackButton();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void inviteUsers(QStringList users);
|
void inviteUsers(QStringList users);
|
||||||
void showSidebar();
|
void showRoomList();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void mousePressEvent(QMouseEvent *) override
|
void mousePressEvent(QMouseEvent *) override
|
||||||
|
|
|
@ -65,7 +65,7 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
|
||||||
communitiesList_ = new CommunitiesList(this);
|
communitiesList_ = new CommunitiesList(this);
|
||||||
topLayout_->addWidget(communitiesList_);
|
topLayout_->addWidget(communitiesList_);
|
||||||
|
|
||||||
auto splitter = new Splitter(this);
|
splitter = new Splitter(this);
|
||||||
splitter->setHandleWidth(0);
|
splitter->setHandleWidth(0);
|
||||||
|
|
||||||
topLayout_->addWidget(splitter);
|
topLayout_->addWidget(splitter);
|
||||||
|
@ -183,8 +183,7 @@ ChatPage::ChatPage(QSharedPointer<UserSettings> userSettings, QWidget *parent)
|
||||||
emit showOverlayProgressBar();
|
emit showOverlayProgressBar();
|
||||||
});
|
});
|
||||||
|
|
||||||
connect(splitter, &Splitter::hiddenSidebar, top_bar_, &TopRoomBar::enableBackButton);
|
connect(top_bar_, &TopRoomBar::showRoomList, splitter, &Splitter::showFullRoomList);
|
||||||
connect(top_bar_, &TopRoomBar::showSidebar, splitter, &Splitter::showSidebar);
|
|
||||||
connect(top_bar_, &TopRoomBar::inviteUsers, this, [this](QStringList users) {
|
connect(top_bar_, &TopRoomBar::inviteUsers, this, [this](QStringList users) {
|
||||||
const auto room_id = current_room_.toStdString();
|
const auto room_id = current_room_.toStdString();
|
||||||
|
|
||||||
|
@ -1314,3 +1313,35 @@ ChatPage::getProfileInfo()
|
||||||
});
|
});
|
||||||
// TODO http::client()->getOwnCommunities();
|
// TODO http::client()->getOwnCommunities();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ChatPage::hideSideBars()
|
||||||
|
{
|
||||||
|
communitiesList_->hide();
|
||||||
|
sideBar_->hide();
|
||||||
|
top_bar_->enableBackButton();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
ChatPage::showSideBars()
|
||||||
|
{
|
||||||
|
if (userSettings_->isGroupViewEnabled())
|
||||||
|
communitiesList_->show();
|
||||||
|
|
||||||
|
sideBar_->show();
|
||||||
|
top_bar_->disableBackButton();
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
ChatPage::timelineWidth()
|
||||||
|
{
|
||||||
|
int sidebarWidth = sideBar_->size().width();
|
||||||
|
sidebarWidth += communitiesList_->size().width();
|
||||||
|
|
||||||
|
return size().width() - sidebarWidth;
|
||||||
|
}
|
||||||
|
bool
|
||||||
|
ChatPage::isSideBarExpanded()
|
||||||
|
{
|
||||||
|
return sideBar_->size().width() > ui::sidebar::NormalSize;
|
||||||
|
}
|
||||||
|
|
|
@ -163,6 +163,34 @@ MainWindow::MainWindow(QWidget *parent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MainWindow::showEvent(QShowEvent *event)
|
||||||
|
{
|
||||||
|
adjustSideBars();
|
||||||
|
QMainWindow::showEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MainWindow::resizeEvent(QResizeEvent *event)
|
||||||
|
{
|
||||||
|
adjustSideBars();
|
||||||
|
QMainWindow::resizeEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
MainWindow::adjustSideBars()
|
||||||
|
{
|
||||||
|
const int timelineWidth = chat_page_->timelineWidth();
|
||||||
|
const int minAvailableWidth =
|
||||||
|
conf::sideBarCollapsePoint + ui::sidebar::CommunitiesSidebarSize;
|
||||||
|
|
||||||
|
if (timelineWidth < minAvailableWidth && !chat_page_->isSideBarExpanded()) {
|
||||||
|
chat_page_->hideSideBars();
|
||||||
|
} else {
|
||||||
|
chat_page_->showSideBars();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MainWindow::restoreWindowSize()
|
MainWindow::restoreWindowSize()
|
||||||
{
|
{
|
||||||
|
|
115
src/Splitter.cc
115
src/Splitter.cc
|
@ -21,37 +21,18 @@
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <QShortcut>
|
#include <QShortcut>
|
||||||
|
|
||||||
|
#include "Config.h"
|
||||||
#include "Splitter.h"
|
#include "Splitter.h"
|
||||||
#include "Theme.h"
|
#include "Theme.h"
|
||||||
|
|
||||||
|
constexpr auto MaxWidth = (1 << 24) - 1;
|
||||||
|
|
||||||
Splitter::Splitter(QWidget *parent)
|
Splitter::Splitter(QWidget *parent)
|
||||||
: QSplitter(parent)
|
: QSplitter(parent)
|
||||||
{
|
{
|
||||||
connect(this, &QSplitter::splitterMoved, this, &Splitter::onSplitterMoved);
|
connect(this, &QSplitter::splitterMoved, this, &Splitter::onSplitterMoved);
|
||||||
setChildrenCollapsible(false);
|
setChildrenCollapsible(false);
|
||||||
setStyleSheet("QSplitter::handle { image: none; }");
|
setStyleSheet("QSplitter::handle { image: none; }");
|
||||||
|
|
||||||
auto showChatShortcut = new QShortcut(QKeySequence(tr("Ctrl+O", "Show chat")), parent);
|
|
||||||
auto showSidebarShortcut =
|
|
||||||
new QShortcut(QKeySequence(tr("Ctrl+L", "Show sidebar")), parent);
|
|
||||||
|
|
||||||
connect(showChatShortcut, &QShortcut::activated, this, [this]() {
|
|
||||||
if (count() != 2)
|
|
||||||
return;
|
|
||||||
|
|
||||||
hideSidebar();
|
|
||||||
widget(1)->show();
|
|
||||||
});
|
|
||||||
connect(showSidebarShortcut, &QShortcut::activated, this, [this]() {
|
|
||||||
if (count() != 2)
|
|
||||||
return;
|
|
||||||
|
|
||||||
widget(0)->setMinimumWidth(ui::sidebar::NormalSize);
|
|
||||||
widget(0)->setMaximumWidth(QApplication::desktop()->screenGeometry().height());
|
|
||||||
|
|
||||||
widget(0)->show();
|
|
||||||
widget(1)->hide();
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -61,7 +42,10 @@ Splitter::restoreSizes(int fallback)
|
||||||
int savedWidth = settings.value("sidebar/width").toInt();
|
int savedWidth = settings.value("sidebar/width").toInt();
|
||||||
|
|
||||||
auto left = widget(0);
|
auto left = widget(0);
|
||||||
if (savedWidth == ui::sidebar::SmallSize) {
|
if (savedWidth == 0) {
|
||||||
|
hideSidebar();
|
||||||
|
return;
|
||||||
|
} else if (savedWidth == ui::sidebar::SmallSize) {
|
||||||
if (left) {
|
if (left) {
|
||||||
left->setMinimumWidth(ui::sidebar::SmallSize);
|
left->setMinimumWidth(ui::sidebar::SmallSize);
|
||||||
left->setMaximumWidth(ui::sidebar::SmallSize);
|
left->setMaximumWidth(ui::sidebar::SmallSize);
|
||||||
|
@ -69,21 +53,12 @@ Splitter::restoreSizes(int fallback)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (savedWidth >= ui::sidebar::NormalSize && savedWidth <= 2 * ui::sidebar::NormalSize) {
|
|
||||||
if (left) {
|
|
||||||
left->setMinimumWidth(ui::sidebar::NormalSize);
|
left->setMinimumWidth(ui::sidebar::NormalSize);
|
||||||
left->setMaximumWidth(2 * ui::sidebar::NormalSize);
|
left->setMaximumWidth(2 * ui::sidebar::NormalSize);
|
||||||
setSizes({savedWidth, fallback - savedWidth});
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (savedWidth == 0) {
|
|
||||||
hideSidebar();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
setSizes({ui::sidebar::NormalSize, fallback - ui::sidebar::NormalSize});
|
setSizes({ui::sidebar::NormalSize, fallback - ui::sidebar::NormalSize});
|
||||||
|
|
||||||
|
setStretchFactor(0, 0);
|
||||||
|
setStretchFactor(1, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
Splitter::~Splitter()
|
Splitter::~Splitter()
|
||||||
|
@ -92,10 +67,6 @@ Splitter::~Splitter()
|
||||||
|
|
||||||
if (left) {
|
if (left) {
|
||||||
QSettings settings;
|
QSettings settings;
|
||||||
|
|
||||||
if (!left->isVisible())
|
|
||||||
settings.setValue("sidebar/width", 0);
|
|
||||||
else
|
|
||||||
settings.setValue("sidebar/width", left->width());
|
settings.setValue("sidebar/width", left->width());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -143,49 +114,55 @@ Splitter::onSplitterMoved(int pos, int index)
|
||||||
|
|
||||||
// if we are coming from the left, the cursor should
|
// if we are coming from the left, the cursor should
|
||||||
// end up on the second widget.
|
// end up on the second widget.
|
||||||
if (extended.contains(pos)) {
|
if (extended.contains(pos) &&
|
||||||
|
right->size().width() >=
|
||||||
|
conf::sideBarCollapsePoint + ui::sidebar::NormalSize) {
|
||||||
left->setMinimumWidth(ui::sidebar::NormalSize);
|
left->setMinimumWidth(ui::sidebar::NormalSize);
|
||||||
left->setMaximumWidth(2 * ui::sidebar::NormalSize);
|
left->setMaximumWidth(2 * ui::sidebar::NormalSize);
|
||||||
|
|
||||||
leftMoveCount_ = 0;
|
leftMoveCount_ = 0;
|
||||||
} else if (left->rect().contains(left->mapFromGlobal(QCursor::pos()))) {
|
|
||||||
hideSidebar();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void
|
|
||||||
Splitter::showChatView()
|
|
||||||
{
|
|
||||||
if (count() != 2)
|
|
||||||
return;
|
|
||||||
|
|
||||||
auto right = widget(1);
|
|
||||||
|
|
||||||
// We are in Roomlist-only view so we'll switch into Chat-only view.
|
|
||||||
if (!right->isVisible()) {
|
|
||||||
right->show();
|
|
||||||
hideSidebar();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
Splitter::showSidebar()
|
|
||||||
{
|
|
||||||
auto left = widget(0);
|
|
||||||
if (left) {
|
|
||||||
left->setMinimumWidth(ui::sidebar::SmallSize);
|
|
||||||
left->setMaximumWidth(ui::sidebar::SmallSize);
|
|
||||||
left->show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
Splitter::hideSidebar()
|
Splitter::hideSidebar()
|
||||||
{
|
{
|
||||||
auto left = widget(0);
|
auto left = widget(0);
|
||||||
if (left) {
|
if (left)
|
||||||
left->hide();
|
left->hide();
|
||||||
emit hiddenSidebar();
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Splitter::showChatView()
|
||||||
|
{
|
||||||
|
auto left = widget(0);
|
||||||
|
auto right = widget(1);
|
||||||
|
|
||||||
|
if (right->isHidden()) {
|
||||||
|
left->hide();
|
||||||
|
right->show();
|
||||||
|
|
||||||
|
// Restore previous size.
|
||||||
|
if (left->minimumWidth() == ui::sidebar::SmallSize) {
|
||||||
|
left->setMinimumWidth(ui::sidebar::SmallSize);
|
||||||
|
left->setMaximumWidth(ui::sidebar::SmallSize);
|
||||||
|
} else {
|
||||||
|
left->setMinimumWidth(ui::sidebar::NormalSize);
|
||||||
|
left->setMaximumWidth(2 * ui::sidebar::NormalSize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
Splitter::showFullRoomList()
|
||||||
|
{
|
||||||
|
auto left = widget(0);
|
||||||
|
auto right = widget(1);
|
||||||
|
|
||||||
|
right->hide();
|
||||||
|
|
||||||
|
left->show();
|
||||||
|
left->setMaximumWidth(MaxWidth);
|
||||||
|
}
|
||||||
|
|
|
@ -83,11 +83,7 @@ TopRoomBar::TopRoomBar(QWidget *parent)
|
||||||
backBtn_->setIconSize(QSize(buttonSize_ / 2, buttonSize_ / 2));
|
backBtn_->setIconSize(QSize(buttonSize_ / 2, buttonSize_ / 2));
|
||||||
backBtn_->hide();
|
backBtn_->hide();
|
||||||
|
|
||||||
connect(backBtn_, &QPushButton::clicked, this, [this]() {
|
connect(backBtn_, &QPushButton::clicked, this, &TopRoomBar::showRoomList);
|
||||||
backBtn_->hide();
|
|
||||||
avatar_->show();
|
|
||||||
emit showSidebar();
|
|
||||||
});
|
|
||||||
|
|
||||||
topLayout_->addWidget(avatar_);
|
topLayout_->addWidget(avatar_);
|
||||||
topLayout_->addWidget(backBtn_);
|
topLayout_->addWidget(backBtn_);
|
||||||
|
@ -136,6 +132,13 @@ TopRoomBar::enableBackButton()
|
||||||
backBtn_->show();
|
backBtn_->show();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
TopRoomBar::disableBackButton()
|
||||||
|
{
|
||||||
|
avatar_->show();
|
||||||
|
backBtn_->hide();
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
TopRoomBar::updateRoomAvatarFromName(const QString &name)
|
TopRoomBar::updateRoomAvatarFromName(const QString &name)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue