mirror of
https://github.com/Chatterino/chatterino2.git
synced 2024-11-21 22:24:07 +01:00
Implement the "inline" account switch button
Make the account switch listview into a widget
This commit is contained in:
parent
4010c49c84
commit
1a870685b0
9 changed files with 223 additions and 47 deletions
|
@ -99,7 +99,9 @@ SOURCES += \
|
||||||
src/widgets/splitcontainer.cpp \
|
src/widgets/splitcontainer.cpp \
|
||||||
src/widgets/helper/droppreview.cpp \
|
src/widgets/helper/droppreview.cpp \
|
||||||
src/widgets/window.cpp \
|
src/widgets/window.cpp \
|
||||||
src/widgets/helper/splitcolumn.cpp
|
src/widgets/helper/splitcolumn.cpp \
|
||||||
|
src/widgets/accountswitchwidget.cpp \
|
||||||
|
src/widgets/accountswitchpopupwidget.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
src/asyncexec.hpp \
|
src/asyncexec.hpp \
|
||||||
|
@ -171,7 +173,9 @@ HEADERS += \
|
||||||
src/widgets/helper/droppreview.hpp \
|
src/widgets/helper/droppreview.hpp \
|
||||||
src/widgets/helper/splitcolumn.hpp \
|
src/widgets/helper/splitcolumn.hpp \
|
||||||
src/util/irchelpers.hpp \
|
src/util/irchelpers.hpp \
|
||||||
src/util/helpers.hpp
|
src/util/helpers.hpp \
|
||||||
|
src/widgets/accountswitchwidget.hpp \
|
||||||
|
src/widgets/accountswitchpopupwidget.hpp
|
||||||
|
|
||||||
|
|
||||||
PRECOMPILED_HEADER =
|
PRECOMPILED_HEADER =
|
||||||
|
|
51
src/widgets/accountswitchpopupwidget.cpp
Normal file
51
src/widgets/accountswitchpopupwidget.cpp
Normal file
|
@ -0,0 +1,51 @@
|
||||||
|
#include "widgets/accountswitchpopupwidget.hpp"
|
||||||
|
#include "debug/log.hpp"
|
||||||
|
#include "widgets/settingsdialog.hpp"
|
||||||
|
|
||||||
|
#include <QHBoxLayout>
|
||||||
|
#include <QLayout>
|
||||||
|
#include <QPushButton>
|
||||||
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
|
namespace chatterino {
|
||||||
|
namespace widgets {
|
||||||
|
|
||||||
|
AccountSwitchPopupWidget::AccountSwitchPopupWidget(QWidget *parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
{
|
||||||
|
this->setWindowFlags(Qt::FramelessWindowHint);
|
||||||
|
|
||||||
|
this->setContentsMargins(0, 0, 0, 0);
|
||||||
|
|
||||||
|
this->ui.accountSwitchWidget = new AccountSwitchWidget(this);
|
||||||
|
QVBoxLayout *vbox = new QVBoxLayout(this);
|
||||||
|
this->ui.accountSwitchWidget->setFocusPolicy(Qt::NoFocus);
|
||||||
|
vbox->addWidget(this->ui.accountSwitchWidget);
|
||||||
|
|
||||||
|
// vbox->setSizeConstraint(QLayout::SetMinimumSize);
|
||||||
|
|
||||||
|
auto hbox = new QHBoxLayout();
|
||||||
|
auto manageAccountsButton = new QPushButton(this);
|
||||||
|
manageAccountsButton->setText("Manage Accounts");
|
||||||
|
hbox->addWidget(manageAccountsButton);
|
||||||
|
vbox->addLayout(hbox);
|
||||||
|
|
||||||
|
connect(manageAccountsButton, &QPushButton::clicked, []() {
|
||||||
|
SettingsDialog::showDialog(SettingsDialog::PreferredTab::Accounts); //
|
||||||
|
});
|
||||||
|
|
||||||
|
this->setLayout(vbox);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AccountSwitchPopupWidget::refresh()
|
||||||
|
{
|
||||||
|
this->ui.accountSwitchWidget->refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AccountSwitchPopupWidget::focusOutEvent(QFocusEvent *)
|
||||||
|
{
|
||||||
|
this->hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace widgets
|
||||||
|
} // namespace chatterino
|
29
src/widgets/accountswitchpopupwidget.hpp
Normal file
29
src/widgets/accountswitchpopupwidget.hpp
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "widgets/accountswitchwidget.hpp"
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
namespace chatterino {
|
||||||
|
namespace widgets {
|
||||||
|
|
||||||
|
class AccountSwitchPopupWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
AccountSwitchPopupWidget(QWidget *parent = nullptr);
|
||||||
|
|
||||||
|
void refresh();
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual void focusOutEvent(QFocusEvent *event) override final;
|
||||||
|
|
||||||
|
private:
|
||||||
|
struct {
|
||||||
|
AccountSwitchWidget *accountSwitchWidget = nullptr;
|
||||||
|
} ui;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace widgets
|
||||||
|
} // namespace chatterino
|
64
src/widgets/accountswitchwidget.cpp
Normal file
64
src/widgets/accountswitchwidget.cpp
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
#include "accountswitchwidget.hpp"
|
||||||
|
#include "accountmanager.hpp"
|
||||||
|
|
||||||
|
namespace chatterino {
|
||||||
|
namespace widgets {
|
||||||
|
|
||||||
|
AccountSwitchWidget::AccountSwitchWidget(QWidget *parent)
|
||||||
|
: QListWidget(parent)
|
||||||
|
{
|
||||||
|
static QString anonUsername(" - anonymous - ");
|
||||||
|
|
||||||
|
this->addItem(anonUsername);
|
||||||
|
|
||||||
|
for (const auto &userName : AccountManager::getInstance().Twitch.getUsernames()) {
|
||||||
|
this->addItem(userName);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->refreshSelection();
|
||||||
|
|
||||||
|
QObject::connect(this, &QListWidget::clicked, [this] {
|
||||||
|
if (!this->selectedItems().isEmpty()) {
|
||||||
|
QString newUsername = this->currentItem()->text();
|
||||||
|
if (newUsername.compare(anonUsername, Qt::CaseInsensitive) == 0) {
|
||||||
|
AccountManager::getInstance().Twitch.currentUsername = "";
|
||||||
|
} else {
|
||||||
|
AccountManager::getInstance().Twitch.currentUsername = newUsername.toStdString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
void AccountSwitchWidget::refresh()
|
||||||
|
{
|
||||||
|
this->refreshSelection();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AccountSwitchWidget::refreshSelection()
|
||||||
|
{
|
||||||
|
this->blockSignals(true);
|
||||||
|
|
||||||
|
// Select the currently logged in user
|
||||||
|
if (this->count() > 0) {
|
||||||
|
auto currentUser = AccountManager::getInstance().Twitch.getCurrent();
|
||||||
|
|
||||||
|
if (currentUser->isAnon()) {
|
||||||
|
this->setCurrentRow(0);
|
||||||
|
} else {
|
||||||
|
const QString ¤tUsername = currentUser->getUserName();
|
||||||
|
for (int i = 0; i < this->count(); ++i) {
|
||||||
|
QString itemText = this->item(i)->text();
|
||||||
|
|
||||||
|
if (itemText.compare(currentUsername, Qt::CaseInsensitive) == 0) {
|
||||||
|
this->setCurrentRow(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this->blockSignals(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace widgets
|
||||||
|
} // namespace chatterino
|
22
src/widgets/accountswitchwidget.hpp
Normal file
22
src/widgets/accountswitchwidget.hpp
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QListWidget>
|
||||||
|
|
||||||
|
namespace chatterino {
|
||||||
|
namespace widgets {
|
||||||
|
|
||||||
|
class AccountSwitchWidget : public QListWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit AccountSwitchWidget(QWidget *parent = nullptr);
|
||||||
|
|
||||||
|
void refresh();
|
||||||
|
|
||||||
|
private:
|
||||||
|
void refreshSelection();
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace widgets
|
||||||
|
} // namespace chatterino
|
|
@ -113,8 +113,9 @@ void SplitHeader::updateChannelText()
|
||||||
"<br>"
|
"<br>"
|
||||||
"Live for " +
|
"Live for " +
|
||||||
twitchChannel->streamUptime + " with " +
|
twitchChannel->streamUptime + " with " +
|
||||||
twitchChannel->streamViewerCount + " viewers"
|
twitchChannel->streamViewerCount +
|
||||||
"</p>");
|
" viewers"
|
||||||
|
"</p>");
|
||||||
} else {
|
} else {
|
||||||
this->channelNameLabel.setText(QString::fromStdString(channelName));
|
this->channelNameLabel.setText(QString::fromStdString(channelName));
|
||||||
this->setToolTip("");
|
this->setToolTip("");
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
#include "widgets/notebook.hpp"
|
#include "widgets/notebook.hpp"
|
||||||
#include "colorscheme.hpp"
|
#include "colorscheme.hpp"
|
||||||
|
#include "debug/log.hpp"
|
||||||
|
#include "widgets/accountswitchpopupwidget.hpp"
|
||||||
#include "widgets/helper/notebookbutton.hpp"
|
#include "widgets/helper/notebookbutton.hpp"
|
||||||
#include "widgets/helper/notebooktab.hpp"
|
#include "widgets/helper/notebooktab.hpp"
|
||||||
#include "widgets/settingsdialog.hpp"
|
#include "widgets/settingsdialog.hpp"
|
||||||
|
@ -227,6 +229,26 @@ void Notebook::settingsButtonClicked()
|
||||||
|
|
||||||
void Notebook::usersButtonClicked()
|
void Notebook::usersButtonClicked()
|
||||||
{
|
{
|
||||||
|
static QWidget *lastFocusedWidget = nullptr;
|
||||||
|
static AccountSwitchPopupWidget *w = new AccountSwitchPopupWidget(this);
|
||||||
|
|
||||||
|
if (w->hasFocus()) {
|
||||||
|
w->hide();
|
||||||
|
if (lastFocusedWidget) {
|
||||||
|
lastFocusedWidget->setFocus();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
lastFocusedWidget = this->focusWidget();
|
||||||
|
|
||||||
|
w->refresh();
|
||||||
|
|
||||||
|
QPoint buttonPos = this->userButton.rect().bottomRight();
|
||||||
|
w->move(buttonPos.x(), buttonPos.y());
|
||||||
|
|
||||||
|
w->show();
|
||||||
|
w->setFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Notebook::addPageButtonClicked()
|
void Notebook::addPageButtonClicked()
|
||||||
|
|
|
@ -126,48 +126,9 @@ QVBoxLayout *SettingsDialog::createAccountsTab()
|
||||||
|
|
||||||
layout->addWidget(buttonBox);
|
layout->addWidget(buttonBox);
|
||||||
|
|
||||||
// listview
|
this->ui.accountSwitchWidget = new AccountSwitchWidget(this);
|
||||||
auto listWidget = new QListWidget(this);
|
|
||||||
|
|
||||||
static QString anonUsername(" - anonymous - ");
|
layout->addWidget(this->ui.accountSwitchWidget);
|
||||||
|
|
||||||
listWidget->addItem(anonUsername);
|
|
||||||
|
|
||||||
for (const auto &userName : AccountManager::getInstance().Twitch.getUsernames()) {
|
|
||||||
listWidget->addItem(userName);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Select the currently logged in user
|
|
||||||
if (listWidget->count() > 0) {
|
|
||||||
auto currentUser = AccountManager::getInstance().Twitch.getCurrent();
|
|
||||||
|
|
||||||
if (currentUser->isAnon()) {
|
|
||||||
listWidget->setCurrentRow(0);
|
|
||||||
} else {
|
|
||||||
const QString ¤tUsername = currentUser->getUserName();
|
|
||||||
for (int i = 0; i < listWidget->count(); ++i) {
|
|
||||||
QString itemText = listWidget->item(i)->text();
|
|
||||||
|
|
||||||
if (itemText.compare(currentUsername, Qt::CaseInsensitive) == 0) {
|
|
||||||
listWidget->setCurrentRow(i);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
QObject::connect(listWidget, &QListWidget::clicked, this, [&, listWidget] {
|
|
||||||
if (!listWidget->selectedItems().isEmpty()) {
|
|
||||||
QString newUsername = listWidget->currentItem()->text();
|
|
||||||
if (newUsername.compare(anonUsername, Qt::CaseInsensitive) == 0) {
|
|
||||||
AccountManager::getInstance().Twitch.currentUsername = "";
|
|
||||||
} else {
|
|
||||||
AccountManager::getInstance().Twitch.currentUsername = newUsername.toStdString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
layout->addWidget(listWidget);
|
|
||||||
|
|
||||||
return layout;
|
return layout;
|
||||||
}
|
}
|
||||||
|
@ -618,9 +579,16 @@ void SettingsDialog::select(SettingsDialogTab *tab)
|
||||||
this->selectedTab = tab;
|
this->selectedTab = tab;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SettingsDialog::showDialog()
|
void SettingsDialog::showDialog(PreferredTab preferredTab)
|
||||||
{
|
{
|
||||||
static SettingsDialog *instance = new SettingsDialog();
|
static SettingsDialog *instance = new SettingsDialog();
|
||||||
|
instance->refresh();
|
||||||
|
|
||||||
|
switch (preferredTab) {
|
||||||
|
case SettingsDialog::PreferredTab::Accounts: {
|
||||||
|
instance->select(instance->tabs.at(0));
|
||||||
|
} break;
|
||||||
|
}
|
||||||
|
|
||||||
instance->show();
|
instance->show();
|
||||||
instance->activateWindow();
|
instance->activateWindow();
|
||||||
|
@ -628,6 +596,11 @@ void SettingsDialog::showDialog()
|
||||||
instance->setFocus();
|
instance->setFocus();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SettingsDialog::refresh()
|
||||||
|
{
|
||||||
|
this->ui.accountSwitchWidget->refresh();
|
||||||
|
}
|
||||||
|
|
||||||
void SettingsDialog::dpiMultiplierChanged(float oldDpi, float newDpi)
|
void SettingsDialog::dpiMultiplierChanged(float oldDpi, float newDpi)
|
||||||
{
|
{
|
||||||
QFile file(":/qss/settings.qss");
|
QFile file(":/qss/settings.qss");
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
#include "settingsmanager.hpp"
|
#include "settingsmanager.hpp"
|
||||||
#include "settingssnapshot.hpp"
|
#include "settingssnapshot.hpp"
|
||||||
|
#include "widgets/accountswitchwidget.hpp"
|
||||||
#include "widgets/helper/settingsdialogtab.hpp"
|
#include "widgets/helper/settingsdialogtab.hpp"
|
||||||
|
|
||||||
#include <QButtonGroup>
|
#include <QButtonGroup>
|
||||||
|
@ -31,12 +32,19 @@ public:
|
||||||
|
|
||||||
void select(SettingsDialogTab *tab);
|
void select(SettingsDialogTab *tab);
|
||||||
|
|
||||||
static void showDialog();
|
enum class PreferredTab {
|
||||||
|
NoPreference,
|
||||||
|
Accounts,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void showDialog(PreferredTab preferredTab = PreferredTab::NoPreference);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void dpiMultiplierChanged(float oldDpi, float newDpi) override;
|
virtual void dpiMultiplierChanged(float oldDpi, float newDpi) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void refresh();
|
||||||
|
|
||||||
SettingsSnapshot snapshot;
|
SettingsSnapshot snapshot;
|
||||||
std::vector<SettingsDialogTab *> tabs;
|
std::vector<SettingsDialogTab *> tabs;
|
||||||
|
|
||||||
|
@ -51,6 +59,8 @@ private:
|
||||||
QDialogButtonBox buttonBox;
|
QDialogButtonBox buttonBox;
|
||||||
QPushButton okButton;
|
QPushButton okButton;
|
||||||
QPushButton cancelButton;
|
QPushButton cancelButton;
|
||||||
|
|
||||||
|
AccountSwitchWidget *accountSwitchWidget = nullptr;
|
||||||
} ui;
|
} ui;
|
||||||
|
|
||||||
void addTab(QBoxLayout *layout, QString title, QString imageRes);
|
void addTab(QBoxLayout *layout, QString title, QString imageRes);
|
||||||
|
|
Loading…
Reference in a new issue