Skip to content

Commit

Permalink
Added the rest of the settings pages
Browse files Browse the repository at this point in the history
  • Loading branch information
apa420 committed Jan 30, 2025
1 parent f2fa585 commit 6386cc8
Show file tree
Hide file tree
Showing 12 changed files with 147 additions and 91 deletions.
24 changes: 15 additions & 9 deletions src/widgets/settingspages/AccountsPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,22 +24,21 @@ AccountsPage::AccountsPage()
LayoutCreator<AccountsPage> layoutCreator(this);
auto layout = layoutCreator.emplace<QVBoxLayout>().withoutMargin();

EditableModelView *view =
layout
.emplace<EditableModelView>(
app->getAccounts()->createModel(nullptr), false)
.getElement();
this->view_ = layout
.emplace<EditableModelView>(
app->getAccounts()->createModel(nullptr), false)
.getElement();

view->getTableView()->horizontalHeader()->setVisible(false);
view->getTableView()->horizontalHeader()->setStretchLastSection(true);
view_->getTableView()->horizontalHeader()->setVisible(false);
view_->getTableView()->horizontalHeader()->setStretchLastSection(true);

// We can safely ignore this signal connection since we own the view
std::ignore = view->addButtonPressed.connect([this] {
std::ignore = view_->addButtonPressed.connect([this] {
LoginDialog d(this);
d.exec();
});

view->getTableView()->setStyleSheet("background: #333");
view_->getTableView()->setStyleSheet("background: #333");

// auto buttons = layout.emplace<QDialogButtonBox>();
// {
Expand Down Expand Up @@ -67,4 +66,11 @@ AccountsPage::AccountsPage()
// });
}

bool AccountsPage::filterElements(const QString &query)
{
auto *fields = new std::vector<int>{0, 1};

return view_->filterSearchResults(query, *fields);
}

} // namespace chatterino
4 changes: 4 additions & 0 deletions src/widgets/settingspages/AccountsPage.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,19 @@ namespace chatterino {

class AccountSwitchWidget;

class EditableModelView;

class AccountsPage : public SettingsPage
{
public:
AccountsPage();
bool filterElements(const QString &query) override;

private:
QPushButton *addButton_{};
QPushButton *removeButton_{};
AccountSwitchWidget *accountSwitchWidget_{};
EditableModelView *view_;
};

} // namespace chatterino
52 changes: 29 additions & 23 deletions src/widgets/settingspages/FiltersPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -25,27 +25,26 @@ FiltersPage::FiltersPage()
layout.emplace<QLabel>(
"Selectively display messages in Splits using channel filters. Set "
"filters under a Split menu.");
EditableModelView *view =
layout
.emplace<EditableModelView>(
(new FilterModel(nullptr))
->initialized(&getSettings()->filterRecords))
.getElement();

view->setTitles({"Name", "Filter", "Valid"});
view->getTableView()->horizontalHeader()->setSectionResizeMode(
view_ = layout
.emplace<EditableModelView>(
(new FilterModel(nullptr))
->initialized(&getSettings()->filterRecords))
.getElement();

view_->setTitles({"Name", "Filter", "Valid"});
view_->getTableView()->horizontalHeader()->setSectionResizeMode(
QHeaderView::Interactive);
view->getTableView()->horizontalHeader()->setSectionResizeMode(
view_->getTableView()->horizontalHeader()->setSectionResizeMode(
1, QHeaderView::Stretch);

QTimer::singleShot(1, [view] {
view->getTableView()->resizeColumnsToContents();
view->getTableView()->setColumnWidth(0, 150);
view->getTableView()->setColumnWidth(2, 125);
QTimer::singleShot(1, [this] {
view_->getTableView()->resizeColumnsToContents();
view_->getTableView()->setColumnWidth(0, 150);
view_->getTableView()->setColumnWidth(2, 125);
});

// We can safely ignore this signal connection since we own the view
std::ignore = view->addButtonPressed.connect([this] {
// We can safely ignore this signal connection since we own the view_
std::ignore = view_->addButtonPressed.connect([this] {
ChannelFilterEditorDialog d(this->window());
if (d.exec() == QDialog::Accepted)
{
Expand All @@ -59,19 +58,19 @@ FiltersPage::FiltersPage()
getSettings()->filterRecords.append(std::make_shared<FilterRecord>(
"My filter", "message.content contains \"hello\""));
});
view->addCustomButton(quickAddButton);
view_->addCustomButton(quickAddButton);

QObject::connect(view->getTableView(), &QTableView::clicked,
[this, view](const QModelIndex &clicked) {
this->tableCellClicked(clicked, view);
QObject::connect(view_->getTableView(), &QTableView::clicked,
[this](const QModelIndex &clicked) {
this->tableCellClicked(clicked, view_);
});

auto *filterHelpLabel =
new QLabel(QStringView(u"<a href='%1'><span "
"style='color:#99f'>filter info</span></a>")
.arg(FILTERS_DOCUMENTATION));
filterHelpLabel->setOpenExternalLinks(true);
view->addCustomButton(filterHelpLabel);
view_->addCustomButton(filterHelpLabel);

layout.append(
this->createCheckBox("Do not filter my own messages",
Expand All @@ -84,15 +83,15 @@ void FiltersPage::onShow()
}

void FiltersPage::tableCellClicked(const QModelIndex &clicked,
EditableModelView *view)
EditableModelView *view_)
{
// valid column
if (clicked.column() == 2)
{
QMessageBox popup(this->window());

auto filterText =
view->getModel()->data(clicked.siblingAtColumn(1)).toString();
view_->getModel()->data(clicked.siblingAtColumn(1)).toString();
auto filterResult = filters::Filter::fromString(filterText);

if (std::holds_alternative<filters::Filter>(filterResult))
Expand Down Expand Up @@ -130,4 +129,11 @@ void FiltersPage::tableCellClicked(const QModelIndex &clicked,
}
}

bool FiltersPage::filterElements(const QString &query)
{
auto *fields = new std::vector<int>{0, 1};

return view_->filterSearchResults(query, *fields);
}

} // namespace chatterino
2 changes: 2 additions & 0 deletions src/widgets/settingspages/FiltersPage.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,13 @@ class FiltersPage : public SettingsPage
FiltersPage();

void onShow() final;
bool filterElements(const QString &query) override;

private:
void tableCellClicked(const QModelIndex &clicked, EditableModelView *view);

QStringListModel userListModel_;
EditableModelView *view_;
};

} // namespace chatterino
12 changes: 6 additions & 6 deletions src/widgets/settingspages/HighlightingPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ HighlightingPage::HighlightingPage()
// getSettings()->enableHighlights));

// TABS
tabsWidget_ = new QTabWidget();
auto tabs = layout.append(tabsWidget_);
this->tabWidget_ = new QTabWidget();
auto tabs = layout.append(tabWidget_);
{
// HIGHLIGHTS
auto highlights = tabs.appendTab(new QVBoxLayout, "Messages");
Expand Down Expand Up @@ -416,17 +416,17 @@ bool HighlightingPage::filterElements(const QString &query)
auto *fields = new std::vector<int>{0};

bool matchMessages = viewMessages_->filterSearchResults(query, *fields);
tabsWidget_->setTabVisible(0, matchMessages);
this->tabWidget_->setTabVisible(0, matchMessages);

bool matchUsers = viewUsers_->filterSearchResults(query, *fields);
tabsWidget_->setTabVisible(1, matchUsers);
this->tabWidget_->setTabVisible(1, matchUsers);

bool matchBadges = viewBadges_->filterSearchResults(query, *fields);
tabsWidget_->setTabVisible(2, matchBadges);
this->tabWidget_->setTabVisible(2, matchBadges);

bool matchBlacklistedUsers =
viewBlacklistedUsers_->filterSearchResults(query, *fields);
tabsWidget_->setTabVisible(3, matchBlacklistedUsers);
this->tabWidget_->setTabVisible(3, matchBlacklistedUsers);

return matchMessages || matchUsers || matchBadges || matchBlacklistedUsers;
}
Expand Down
2 changes: 1 addition & 1 deletion src/widgets/settingspages/HighlightingPage.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class HighlightingPage : public SettingsPage
private:
enum HighlightTab { Messages = 0, Users = 1, Badges = 2, Blacklist = 3 };

QTabWidget *tabsWidget_;
QTabWidget *tabWidget_;
EditableModelView *viewMessages_;
EditableModelView *viewUsers_;
EditableModelView *viewBadges_;
Expand Down
6 changes: 3 additions & 3 deletions src/widgets/settingspages/IgnoresPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,8 @@ IgnoresPage::IgnoresPage()
LayoutCreator<IgnoresPage> layoutCreator(this);
auto layout = layoutCreator.setLayoutType<QVBoxLayout>();

tabsWidget_ = new QTabWidget();
auto tabs = layout.append(tabsWidget_);
this->tabWidget_ = new QTabWidget();
auto tabs = layout.append(this->tabWidget_);

addPhrasesTab(tabs.appendTab(new QVBoxLayout, "Messages"));
addUsersTab(*this, tabs.appendTab(new QVBoxLayout, "Users"),
Expand Down Expand Up @@ -145,7 +145,7 @@ bool IgnoresPage::filterElements(const QString &query)
auto *fields = new std::vector<int>{0, 4};

bool matchMessages = viewMessages_->filterSearchResults(query, *fields);
tabsWidget_->setTabVisible(0, matchMessages);
this->tabWidget_->setTabVisible(0, matchMessages);

return matchMessages;
}
Expand Down
2 changes: 1 addition & 1 deletion src/widgets/settingspages/IgnoresPage.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ class IgnoresPage : public SettingsPage

private:
QStringListModel userListModel_;
QTabWidget *tabsWidget_;
QTabWidget *tabWidget_;
EditableModelView *viewMessages_;

void addPhrasesTab(LayoutCreator<QVBoxLayout> layout);
Expand Down
85 changes: 53 additions & 32 deletions src/widgets/settingspages/ModerationPage.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -174,20 +174,19 @@ ModerationPage::ModerationPage()
getSettings()->enableLogging);
});

EditableModelView *view =
logs.emplace<EditableModelView>(
(new ChannelLoggingModel(nullptr))
->initialized(&getSettings()->loggedChannels))
.getElement();
viewLogs_ = logs.emplace<EditableModelView>(
(new ChannelLoggingModel(nullptr))
->initialized(&getSettings()->loggedChannels))
.getElement();

view->setTitles({"Twitch channels"});
view->getTableView()->horizontalHeader()->setSectionResizeMode(
viewLogs_->setTitles({"Twitch channels"});
viewLogs_->getTableView()->horizontalHeader()->setSectionResizeMode(
QHeaderView::Fixed);
view->getTableView()->horizontalHeader()->setSectionResizeMode(
viewLogs_->getTableView()->horizontalHeader()->setSectionResizeMode(
0, QHeaderView::Stretch);

// We can safely ignore this signal connection since we own the view
std::ignore = view->addButtonPressed.connect([] {
std::ignore = viewLogs_->addButtonPressed.connect([] {
getSettings()->loggedChannels.append(ChannelLog("channel"));
});

Expand All @@ -214,61 +213,69 @@ ModerationPage::ModerationPage()
// getSettings()->timeoutAction));
// }

EditableModelView *view =
viewModerationButtons_ =
modMode
.emplace<EditableModelView>(
(new ModerationActionModel(nullptr))
->initialized(&getSettings()->moderationActions))
.getElement();

view->setTitles({"Action", "Icon"});
view->getTableView()->horizontalHeader()->setSectionResizeMode(
QHeaderView::Fixed);
view->getTableView()->horizontalHeader()->setSectionResizeMode(
0, QHeaderView::Stretch);
view->getTableView()->setItemDelegateForColumn(
ModerationActionModel::Column::Icon, new IconDelegate(view));
viewModerationButtons_->setTitles({"Action", "Icon"});
viewModerationButtons_->getTableView()
->horizontalHeader()
->setSectionResizeMode(QHeaderView::Fixed);
viewModerationButtons_->getTableView()
->horizontalHeader()
->setSectionResizeMode(0, QHeaderView::Stretch);
viewModerationButtons_->getTableView()->setItemDelegateForColumn(
ModerationActionModel::Column::Icon,
new IconDelegate(viewModerationButtons_));
QObject::connect(
view->getTableView(), &QTableView::clicked,
[this, view](const QModelIndex &clicked) {
viewModerationButtons_->getTableView(), &QTableView::clicked,
[this](const QModelIndex &clicked) {
if (clicked.column() == ModerationActionModel::Column::Icon)
{
auto fileUrl = QFileDialog::getOpenFileUrl(
this, "Open Image", QUrl(),
"Image Files (*.png *.jpg *.jpeg)");
view->getModel()->setData(clicked, fileUrl, Qt::UserRole);
view->getModel()->setData(clicked, fileUrl.fileName(),
Qt::DisplayRole);
viewModerationButtons_->getModel()->setData(
clicked, fileUrl, Qt::UserRole);
viewModerationButtons_->getModel()->setData(
clicked, fileUrl.fileName(), Qt::DisplayRole);
// Clear the icon if the user canceled the dialog
if (fileUrl.isEmpty())
{
view->getModel()->setData(clicked, QVariant(),
Qt::DecorationRole);
viewModerationButtons_->getModel()->setData(
clicked, QVariant(), Qt::DecorationRole);
}
else
{
// QPointer will be cleared when view is destroyed
QPointer<EditableModelView> viewtemp = view;
// QPointer will be cleared when viewModerationButtons_ is destroyed
QPointer<EditableModelView> viewModerationButtonsTemp =
viewModerationButtons_;

loadPixmapFromUrl(
{fileUrl.toString()},
[clicked, view = viewtemp](const QPixmap &pixmap) {
postToThread([clicked, view, pixmap]() {
if (view.isNull())
[clicked, viewModerationButtons_ =
viewModerationButtonsTemp](
const QPixmap &pixmap) {
postToThread([clicked, viewModerationButtons_,
pixmap]() {
if (viewModerationButtons_.isNull())
{
return;
}

view->getModel()->setData(
viewModerationButtons_->getModel()->setData(
clicked, pixmap, Qt::DecorationRole);
});
});
}
}
});

// We can safely ignore this signal connection since we own the view
std::ignore = view->addButtonPressed.connect([] {
// We can safely ignore this signal connection since we own the viewModerationButtons_
std::ignore = viewModerationButtons_->addButtonPressed.connect([] {
getSettings()->moderationActions.append(
ModerationAction("/timeout {user.name} 300"));
});
Expand Down Expand Up @@ -371,4 +378,18 @@ void ModerationPage::selectModerationActions()
this->tabWidget_->setCurrentIndex(1);
}

bool ModerationPage::filterElements(const QString &query)
{
auto *fields = new std::vector<int>{0};

bool matchLogs = viewLogs_->filterSearchResults(query, *fields);
tabWidget_->setTabVisible(0, matchLogs);

bool matchModerationButtons =
viewModerationButtons_->filterSearchResults(query, *fields);
tabWidget_->setTabVisible(1, matchModerationButtons);

return matchLogs || matchModerationButtons;
}

} // namespace chatterino
Loading

0 comments on commit 6386cc8

Please sign in to comment.