From cf23838099abcc3b5133ec3dc5dda021a4d2df69 Mon Sep 17 00:00:00 2001 From: fourtf Date: Sun, 8 Sep 2019 18:06:43 +0200 Subject: [PATCH] added irc support --- chatterino.pro | 9 +- src/Application.cpp | 2 + src/providers/irc/Irc2.cpp | 73 +++++++++ src/providers/irc/Irc2.hpp | 38 +++++ src/util/LayoutCreator.hpp | 22 +++ src/widgets/dialogs/IrcConnectionEditor.cpp | 16 ++ src/widgets/dialogs/IrcConnectionEditor.hpp | 19 +++ src/widgets/dialogs/IrcConnectionEditor.ui | 159 ++++++++++++++++++++ src/widgets/dialogs/IrcConnectionPopup.cpp | 36 +++++ src/widgets/dialogs/IrcConnectionPopup.hpp | 13 ++ src/widgets/dialogs/SelectChannelDialog.cpp | 81 ++++++++-- 11 files changed, 455 insertions(+), 13 deletions(-) create mode 100644 src/providers/irc/Irc2.cpp create mode 100644 src/providers/irc/Irc2.hpp create mode 100644 src/widgets/dialogs/IrcConnectionEditor.cpp create mode 100644 src/widgets/dialogs/IrcConnectionEditor.hpp create mode 100644 src/widgets/dialogs/IrcConnectionEditor.ui create mode 100644 src/widgets/dialogs/IrcConnectionPopup.cpp create mode 100644 src/widgets/dialogs/IrcConnectionPopup.hpp diff --git a/chatterino.pro b/chatterino.pro index d2db3dbc9..a1ef3933a 100644 --- a/chatterino.pro +++ b/chatterino.pro @@ -129,6 +129,7 @@ SOURCES += \ src/providers/ffz/FfzEmotes.cpp \ src/providers/ffz/FfzModBadge.cpp \ src/providers/irc/AbstractIrcServer.cpp \ + src/providers/irc/Irc2.cpp \ src/providers/irc/IrcAccount.cpp \ src/providers/irc/IrcChannel2.cpp \ src/providers/irc/IrcConnection2.cpp \ @@ -177,6 +178,8 @@ SOURCES += \ src/widgets/AccountSwitchWidget.cpp \ src/widgets/AttachedWindow.cpp \ src/widgets/dialogs/EmotePopup.cpp \ + src/widgets/dialogs/IrcConnectionEditor.cpp \ + src/widgets/dialogs/IrcConnectionPopup.cpp \ src/widgets/dialogs/LastRunCrashDialog.cpp \ src/widgets/dialogs/LoginDialog.cpp \ src/widgets/dialogs/LogsPopup.cpp \ @@ -294,6 +297,7 @@ HEADERS += \ src/providers/ffz/FfzEmotes.hpp \ src/providers/ffz/FfzModBadge.hpp \ src/providers/irc/AbstractIrcServer.hpp \ + src/providers/irc/Irc2.hpp \ src/providers/irc/IrcAccount.hpp \ src/providers/irc/IrcChannel2.hpp \ src/providers/irc/IrcConnection2.hpp \ @@ -354,6 +358,8 @@ HEADERS += \ src/widgets/AccountSwitchWidget.hpp \ src/widgets/AttachedWindow.hpp \ src/widgets/dialogs/EmotePopup.hpp \ + src/widgets/dialogs/IrcConnectionEditor.hpp \ + src/widgets/dialogs/IrcConnectionPopup.hpp \ src/widgets/dialogs/LastRunCrashDialog.hpp \ src/widgets/dialogs/LoginDialog.hpp \ src/widgets/dialogs/LogsPopup.hpp \ @@ -405,7 +411,8 @@ RESOURCES += \ DISTFILES += -FORMS += +FORMS += \ + src/widgets/dialogs/IrcConnectionEditor.ui # do not use windows min/max macros #win32 { diff --git a/src/Application.cpp b/src/Application.cpp index 42b9bd0bf..37b26394b 100644 --- a/src/Application.cpp +++ b/src/Application.cpp @@ -116,6 +116,8 @@ void Application::save() void Application::initNm(Paths &paths) { + (void)paths; + #ifdef Q_OS_WIN # if defined QT_NO_DEBUG || defined C_DEBUG_NM registerNmHost(paths); diff --git a/src/providers/irc/Irc2.cpp b/src/providers/irc/Irc2.cpp new file mode 100644 index 000000000..44f88f855 --- /dev/null +++ b/src/providers/irc/Irc2.cpp @@ -0,0 +1,73 @@ +#include "Irc2.hpp" + +#include "common/SignalVectorModel.hpp" +#include "util/StandardItemHelper.hpp" + +namespace chatterino { + +namespace { + class Model : public SignalVectorModel + { + public: + Model(QObject *parent) + : SignalVectorModel(6, parent) + { + } + + // turn a vector item into a model row + IrcConnection_ getItemFromRow(std::vector &row, + const IrcConnection_ &original) + { + return IrcConnection_{ + row[0]->data(Qt::EditRole).toString(), // host + row[1]->data(Qt::EditRole).toInt(), // port + row[2]->data(Qt::Checked).toBool(), // ssl + row[3]->data(Qt::EditRole).toString(), // user + row[4]->data(Qt::EditRole).toString(), // nick + row[5]->data(Qt::EditRole).toString(), // password + original.id, // id + }; + } + + // turns a row in the model into a vector item + void getRowFromItem(const IrcConnection_ &item, + std::vector &row) + { + setStringItem(row[0], item.host); + setStringItem(row[1], QString::number(item.port)); + setBoolItem(row[2], item.ssl); + setStringItem(row[3], item.user); + setStringItem(row[4], item.nick); + setStringItem(row[5], item.password); + } + }; +} // namespace + +static std::atomic_int currentId; + +Irc::Irc() +{ +} + +IrcConnection_ IrcConnection_::unique() +{ + IrcConnection_ c; + c.id = currentId++; + c.port = 6697; + return c; +} + +QAbstractTableModel *Irc::newConnectionModel(QObject *parent) +{ + auto model = new Model(parent); + model->init(&this->connections); + return model; +} + +Irc &Irc::getInstance() +{ + static Irc irc; + return irc; +} + +} // namespace chatterino diff --git a/src/providers/irc/Irc2.hpp b/src/providers/irc/Irc2.hpp new file mode 100644 index 000000000..ef3d7a922 --- /dev/null +++ b/src/providers/irc/Irc2.hpp @@ -0,0 +1,38 @@ +#pragma once + +#include + +class QAbstractTableModel; + +namespace chatterino { + +struct IrcConnection_ { + QString host; + int port; + bool ssl; + + QString user; + QString nick; + QString password; + + int id; + + // makes an IrcConnection with a unique id + static IrcConnection_ unique(); +}; + +class Irc +{ +public: + Irc(); + + static Irc &getInstance(); + + UnsortedSignalVector connections; + QAbstractTableModel *newConnectionModel(QObject *parent); + +signals: + void connectionUpdated(int id); +}; + +} // namespace chatterino diff --git a/src/util/LayoutCreator.hpp b/src/util/LayoutCreator.hpp index b31fcef8b..f29d0b528 100644 --- a/src/util/LayoutCreator.hpp +++ b/src/util/LayoutCreator.hpp @@ -126,6 +126,20 @@ public: return LayoutCreator(item); } + template + LayoutCreator connect(Slot slot, QObject *receiver, Func func) + { + QObject::connect(this->getElement(), slot, receiver, func); + return *this; + } + + template + LayoutCreator onClick(QObject *receiver, Func func) + { + QObject::connect(this->getElement(), &T::clicked, receiver, func); + return *this; + } + private: T *item_; @@ -169,4 +183,12 @@ private: } }; +template +LayoutCreator makeDialog(Args &&... args) +{ + T *t = new T(std::forward(args)...); + t->setAttribute(Qt::WA_DeleteOnClose); + return LayoutCreator(t); +} + } // namespace chatterino diff --git a/src/widgets/dialogs/IrcConnectionEditor.cpp b/src/widgets/dialogs/IrcConnectionEditor.cpp new file mode 100644 index 000000000..14ba38151 --- /dev/null +++ b/src/widgets/dialogs/IrcConnectionEditor.cpp @@ -0,0 +1,16 @@ +#include "IrcConnectionEditor.hpp" +#include "ui_IrcConnectionEditor.h" + +IrcConnectionEditor::IrcConnectionEditor(bool isAdd, QWidget *parent) + : QDialog(parent) + , ui(new Ui::IrcConnectionEditor) +{ + ui->setupUi(this); + + this->setWindowTitle(QString(isAdd ? "Add " : "Edit ") + "Irc Connection"); +} + +IrcConnectionEditor::~IrcConnectionEditor() +{ + delete ui; +} diff --git a/src/widgets/dialogs/IrcConnectionEditor.hpp b/src/widgets/dialogs/IrcConnectionEditor.hpp new file mode 100644 index 000000000..fc700ecfc --- /dev/null +++ b/src/widgets/dialogs/IrcConnectionEditor.hpp @@ -0,0 +1,19 @@ +#pragma once + +#include + +namespace Ui { +class IrcConnectionEditor; +} + +class IrcConnectionEditor : public QDialog +{ + Q_OBJECT + +public: + explicit IrcConnectionEditor(bool isAdd = false, QWidget *parent = nullptr); + ~IrcConnectionEditor(); + +private: + Ui::IrcConnectionEditor *ui; +}; diff --git a/src/widgets/dialogs/IrcConnectionEditor.ui b/src/widgets/dialogs/IrcConnectionEditor.ui new file mode 100644 index 000000000..a7fcc3ef5 --- /dev/null +++ b/src/widgets/dialogs/IrcConnectionEditor.ui @@ -0,0 +1,159 @@ + + + IrcConnectionEditor + + + + 0 + 0 + 264 + 258 + + + + Dialog + + + + + + + + Server: + + + + + + + + + + Port: + + + + + + + 65636 + + + 6697 + + + + + + + SSL: + + + + + + + true + + + true + + + + + + + Qt::Vertical + + + + 20 + 20 + + + + + + + + User Name: + + + + + + + + + + Nick Name: + + + + + + + + + + Password: + + + + + + + QLineEdit::Password + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + IrcConnectionEditor + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + IrcConnectionEditor + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/widgets/dialogs/IrcConnectionPopup.cpp b/src/widgets/dialogs/IrcConnectionPopup.cpp new file mode 100644 index 000000000..c06827299 --- /dev/null +++ b/src/widgets/dialogs/IrcConnectionPopup.cpp @@ -0,0 +1,36 @@ +#include "IrcConnectionPopup.hpp" + +#include "providers/irc/Irc2.hpp" +#include "util/LayoutHelper.hpp" +#include "widgets/helper/EditableModelView.hpp" + +#include +#include + +namespace chatterino { + +IrcConnectionPopup::IrcConnectionPopup(QWidget *parent) + : BaseWindow(parent, BaseWindow::Flags::EnableCustomFrame) +{ + this->setWindowTitle("Edit Irc Connections"); + + // view + auto view = + new EditableModelView(Irc::getInstance().newConnectionModel(this)); + + view->setTitles({"host", "port", "ssl", "user", "nick", "password"}); + view->getTableView()->horizontalHeader()->resizeSection(0, 140); + view->getTableView()->horizontalHeader()->resizeSection(1, 30); + view->getTableView()->horizontalHeader()->resizeSection(2, 30); + + this->setScaleIndependantSize(800, 500); + + view->addButtonPressed.connect([] { + Irc::getInstance().connections.appendItem(IrcConnection_::unique()); + }); + + // init layout + this->getLayoutContainer()->setLayout(makeLayout({view})); +} + +} // namespace chatterino diff --git a/src/widgets/dialogs/IrcConnectionPopup.hpp b/src/widgets/dialogs/IrcConnectionPopup.hpp new file mode 100644 index 000000000..8d0ca333e --- /dev/null +++ b/src/widgets/dialogs/IrcConnectionPopup.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include "widgets/BaseWindow.hpp" + +namespace chatterino { + +class IrcConnectionPopup : public BaseWindow +{ +public: + IrcConnectionPopup(QWidget *parent); +}; + +} // namespace chatterino diff --git a/src/widgets/dialogs/SelectChannelDialog.cpp b/src/widgets/dialogs/SelectChannelDialog.cpp index f965ccb5c..b5af90fe5 100644 --- a/src/widgets/dialogs/SelectChannelDialog.cpp +++ b/src/widgets/dialogs/SelectChannelDialog.cpp @@ -5,6 +5,8 @@ #include "singletons/Theme.hpp" #include "util/LayoutCreator.hpp" #include "widgets/Notebook.hpp" +#include "widgets/dialogs/IrcConnectionEditor.hpp" +#include "widgets/dialogs/IrcConnectionPopup.hpp" #include "widgets/helper/NotebookTab.hpp" #include @@ -14,6 +16,10 @@ #include #include +#include +#include "providers/irc/Irc2.hpp" +#include "widgets/helper/EditableModelView.hpp" + #define TAB_TWITCH 0 namespace chatterino { @@ -122,21 +128,72 @@ SelectChannelDialog::SelectChannelDialog(QWidget *parent) } // irc - /* + { + LayoutCreator obj(new QWidget()); + auto outerBox = obj.setLayoutType(); + // outerBox.emplace("Connection:"); + { - LayoutCreator obj(new QWidget()); - auto vbox = obj.setLayoutType(); - auto form = vbox.emplace(); + auto view = new EditableModelView( + Irc::getInstance().newConnectionModel(this)); - form->addRow(new QLabel("User name:"), new QLineEdit()); - form->addRow(new QLabel("First nick choice:"), new QLineEdit()); - form->addRow(new QLabel("Second nick choice:"), new QLineEdit()); - form->addRow(new QLabel("Third nick choice:"), new QLineEdit()); + view->setTitles( + {"host", "port", "ssl", "user", "nick", "password"}); + view->getTableView()->horizontalHeader()->resizeSection(0, 140); + view->getTableView()->horizontalHeader()->resizeSection(1, 30); + view->getTableView()->horizontalHeader()->resizeSection(2, 30); - auto tab = notebook->addPage(obj.getElement()); - tab->setCustomTitle("Irc"); + view->addButtonPressed.connect([] { + Irc::getInstance().connections.appendItem( + IrcConnection_::unique()); + }); + + outerBox->addWidget(view); + + // auto box = outerBox.emplace().withoutMargin(); + + // auto conns = box.emplace(); + // conns->addActions({new QAction("hackint")}); + + // auto buttons = box.emplace().withoutMargin(); + + // buttons.emplace("Add").onClick(this, [this]() { + // (new IrcConnectionPopup(this)) + // ->show(); // XXX: don't show multiple + // }); + + // buttons.emplace("Edit"); + // buttons.emplace("Remove"); + // buttons->addStretch(1); } - */ + + { + auto box = outerBox.emplace().withoutMargin(); + box.emplace("Channel:"); + box.emplace(); + } + + // auto vbox = obj.setLayoutType(); + // auto form = vbox.emplace(); + + // auto servers = new QComboBox; + // auto accounts = new QComboBox; + //servers->setEditable(true); + //servers->addItems( + // {"irc://irc.hackint.org:6697", "irc://irc.somethingelse.com:6667"}); + + // form->addRow("Server:", servers); + // form->addRow("Account:", accounts); + // form->addRow("Channel:", new QLineEdit()); + + // form->addRow("User name:", new QLineEdit()); + // form->addRow("First nick choice:", new QLineEdit()); + // form->addRow("Second nick choice:", new QLineEdit()); + // form->addRow("Third nick choice:", new QLineEdit()); + + auto tab = notebook->addPage(obj.getElement()); + tab->setCustomTitle("Irc"); + } layout->setStretchFactor(notebook.getElement(), 1); @@ -151,7 +208,7 @@ SelectChannelDialog::SelectChannelDialog(QWidget *parent) [=](bool) { this->close(); }); } - this->setScaleIndependantSize(300, 310); + this->setMinimumSize(300, 310); this->ui_.notebook->selectIndex(TAB_TWITCH); this->ui_.twitch.channel->setFocus();