mirror-chatterino2/src/widgets/settingspages/NotificationPage.cpp

149 lines
5.8 KiB
C++
Raw Normal View History

#include "NotificationPage.hpp"
#include "Application.hpp"
#include "controllers/notifications/NotificationController.hpp"
#include "controllers/notifications/NotificationModel.hpp"
#include "singletons/Settings.hpp"
#include "singletons/Toasts.hpp"
#include "util/LayoutCreator.hpp"
#include "widgets/helper/EditableModelView.hpp"
#include <QCheckBox>
2018-08-24 18:05:36 +02:00
#include <QFileDialog>
#include <QGroupBox>
#include <QHeaderView>
#include <QLabel>
#include <QListView>
2018-08-24 18:05:36 +02:00
#include <QPushButton>
#include <QTableView>
#include <QTimer>
namespace chatterino {
NotificationPage::NotificationPage()
{
LayoutCreator<NotificationPage> layoutCreator(this);
auto layout = layoutCreator.emplace<QVBoxLayout>().withoutMargin();
{
auto tabs = layout.emplace<QTabWidget>();
{
auto settings = tabs.appendTab(new QVBoxLayout, "Options");
{
settings.emplace<QLabel>(
"You can be informed when certain channels go live. You "
"can be informed in multiple ways:");
settings.append(this->createCheckBox(
2018-09-30 18:55:41 +02:00
"Flash taskbar", getSettings()->notificationFlashTaskbar));
settings.append(
this->createCheckBox("Play sound for selected channels",
getSettings()->notificationPlaySound));
settings.append(this->createCheckBox(
"Play sound for any channel going live",
getSettings()->notificationOnAnyChannel));
2018-08-24 18:05:36 +02:00
#ifdef Q_OS_WIN
settings.append(this->createCheckBox(
"Show notification", getSettings()->notificationToast));
auto openIn = settings.emplace<QHBoxLayout>().withoutMargin();
{
openIn
.emplace<QLabel>(
"Action when clicking on a notification: ")
->setSizePolicy(QSizePolicy::Maximum,
QSizePolicy::Preferred);
// implementation of custom combobox done
// because addComboBox only can handle strings-settings
// int setting for the ToastReaction is desired
openIn
.append(this->createToastReactionComboBox(
this->managedConnections_))
->setSizePolicy(QSizePolicy::Maximum,
QSizePolicy::Preferred);
}
openIn->setContentsMargins(40, 0, 0, 0);
openIn->setSizeConstraint(QLayout::SetMaximumSize);
2018-08-24 18:05:36 +02:00
#endif
auto customSound =
layout.emplace<QHBoxLayout>().withoutMargin();
{
customSound.append(this->createCheckBox(
"Custom sound",
2018-08-29 19:25:37 +02:00
getSettings()->notificationCustomSound));
2018-08-24 18:05:36 +02:00
auto selectFile = customSound.emplace<QPushButton>(
"Select custom sound file");
QObject::connect(
selectFile.getElement(), &QPushButton::clicked, this,
[this] {
auto fileName = QFileDialog::getOpenFileName(
this, tr("Open Sound"), "",
tr("Audio Files (*.mp3 *.wav)"));
2018-09-30 18:55:41 +02:00
getSettings()->notificationPathSound = fileName;
2018-08-24 18:05:36 +02:00
});
}
settings->addStretch(1);
}
auto twitchChannels =
tabs.appendTab(new QVBoxLayout, "Selected Channels");
{
twitchChannels.emplace<QLabel>(
"These are the channels for which you will be informed "
"when they go live:");
EditableModelView *view =
2018-08-12 15:29:40 +02:00
twitchChannels
.emplace<EditableModelView>(
2018-08-12 18:54:32 +02:00
getApp()->notifications->createModel(
nullptr, Platform::Twitch))
.getElement();
2018-08-12 15:29:40 +02:00
view->setTitles({"Twitch channels"});
view->getTableView()->horizontalHeader()->setSectionResizeMode(
QHeaderView::Fixed);
view->getTableView()->horizontalHeader()->setSectionResizeMode(
0, QHeaderView::Stretch);
QTimer::singleShot(1, [view] {
view->getTableView()->resizeColumnsToContents();
view->getTableView()->setColumnWidth(0, 200);
});
view->addButtonPressed.connect([] {
getApp()
->notifications->channelMap[Platform::Twitch]
.append("channel");
2018-08-12 15:29:40 +02:00
});
}
}
}
}
QComboBox *NotificationPage::createToastReactionComboBox(
std::vector<pajlada::Signals::ScopedConnection> managedConnections)
{
QComboBox *toastReactionOptions = new QComboBox();
for (int i = 0; i <= static_cast<int>(ToastReaction::DontOpen); i++)
{
toastReactionOptions->insertItem(
i, Toasts::findStringFromReaction(static_cast<ToastReaction>(i)));
}
// update when setting changes
pajlada::Settings::Setting<int> setting = getSettings()->openFromToast;
setting.connect(
[toastReactionOptions](const int &index, auto) {
toastReactionOptions->setCurrentIndex(index);
},
managedConnections);
QObject::connect(toastReactionOptions,
QOverload<int>::of(&QComboBox::currentIndexChanged),
[](const int &newValue) {
getSettings()->openFromToast.setValue(newValue);
});
return toastReactionOptions;
}
} // namespace chatterino