/
e-face
/
SuperPuperTerminal
Обзор
Документация
Войти
/
e-face
/
SuperPuperTerminal
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
src/mainwindow.cpp
309 строк
8 KB
e-face
First one
14 фев 2026, 19:38
14 фев 2026, 19:38
87f499b
Код
Авторство
О чём код?
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QMdiSubWindow> #include <QPushButton> #include <QFile> #include <QSettings> #include <QStringList> #include <QFileDialog> #include <QMessageBox> #include <QDesktopServices> #include <QUrl> #include "connectionsettingsdialog.h" #include "thememanager.h" #include "icons.h" //---------------------------------------------- MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow), _aboutDlg(new AboutDialog(this)) { ui->setupUi(this); ui->actionNewConnection->setIcon(ConnectionIcons::addIcon()); ui->actionOpen->setIcon(ConnectionIcons::fileIcon()); ui->actionSave->setIcon(ConnectionIcons::saveIcon()); ui->actionOpenSess->setIcon(ConnectionIcons::folderIcon()); ui->actionSaveSess->setIcon(ConnectionIcons::saveIcon()); ui->actionCloseAll->setIcon(ConnectionIcons::closeIcon()); ui->actionExit->setIcon(ConnectionIcons::exitIcon()); ui->actionAbout->setIcon(ConnectionIcons::infoIcon()); ui->actionHelp->setIcon(ConnectionIcons::helpIcon()); ui->actionThemeDefault->setIcon(ConnectionIcons::themeIcon()); ui->actionThemeDark->setIcon(ConnectionIcons::themeIcon()); ThemeManager::instance().loadThemeFromSettings(); updateThemeActions(); restoreSession("current.spt.session"); restoreView(); } //---------------------------------------------- MainWindow::~MainWindow() { delete ui; } //---------------------------------------------- void MainWindow::closeEvent(QCloseEvent* e) { saveSession("current.spt.session"); saveView(); QMainWindow::closeEvent(e); } //---------------------------------------------- void MainWindow::saveView() { QSettings s("settings.ini", QSettings::IniFormat); s.setValue("wg", saveGeometry()); s.setValue("ws", saveState()); } //---------------------------------------------- void MainWindow::restoreView() { QSettings s("settings.ini", QSettings::IniFormat); restoreGeometry(s.value("wg", saveGeometry()).toByteArray()); restoreState(s.value("ws", saveState()).toByteArray()); } //---------------------------------------------- QList<BaseConnection *> MainWindow::connections() const { QList<BaseConnection *> out; auto sw = ui->mdiArea->subWindowList(); for (auto it = sw.begin(); it != sw.end(); ++it) { out.append(qobject_cast<BaseConnection*>((*it)->widget())); } return out; } //---------------------------------------------- BaseConnection *MainWindow::currentConnection() const { auto w = ui->mdiArea->currentSubWindow(); if (!w) return 0; return qobject_cast<BaseConnection*>(w->widget()); } //---------------------------------------------- void MainWindow::closeAllConnections() { auto sw = ui->mdiArea->subWindowList(); for (auto it = sw.begin(); it != sw.end(); ++it) { (*it)->close(); } } //---------------------------------------------- void MainWindow::saveConnection(QString filename) { BaseConnection* c = currentConnection(); if (!c) return; QString d = c->settings(); QFile f(filename); if (!f.open(QFile::WriteOnly | QFile::Truncate)) { return; } f.write(d.toUtf8()); f.close(); } //---------------------------------------------- void MainWindow::restoreConection(QString filename) { QFile f(filename); if (!f.open(QFile::ReadOnly)) { return; } QString d = QString::fromUtf8(f.readAll()); f.close(); BaseConnection* conn = BaseConnection::createConnection(d); if (!conn) return; QMdiSubWindow* w = ui->mdiArea->addSubWindow(conn); w->setWindowTitle(conn->title()); w->showMaximized(); } //---------------------------------------------- void MainWindow::saveSession(QString filename) { QFile::remove(filename); QList<BaseConnection *> conns = connections(); QStringList cl; for (auto it = conns.begin(); it != conns.end(); ++it) { cl.append(((*it)->settings() + ":" + (*it)->data()).toUtf8().toHex()); } QSettings s(filename, QSettings::IniFormat); s.setValue("connections", cl.join("$")); } //---------------------------------------------- void MainWindow::restoreSession(QString filename) { closeAllConnections(); QSettings s(filename, QSettings::IniFormat); QStringList cl = s.value("connections").toString().split("$"); for (auto it = cl.begin(); it != cl.end(); ++it) { QString d = QString::fromUtf8(QByteArray::fromHex((*it).toUtf8())); QStringList ld = d.split(":"); if (ld.count() != 2) continue; BaseConnection* conn = BaseConnection::createConnection(ld[0]); if (!conn) return; conn->setData(ld[1]); QMdiSubWindow* w = ui->mdiArea->addSubWindow(conn); w->setWindowTitle(conn->title()); w->setWindowIcon(ConnectionIcons::iconForType(conn->connectionType())); w->showMaximized(); } } //---------------------------------------------- void MainWindow::on_actionNewConnection_triggered() { ConnectionSettingsDialog dlg; if (dlg.exec() == QDialog::Accepted) { BaseConnection* conn = dlg.createConnection(); if (!conn) return; QMdiSubWindow* w = ui->mdiArea->addSubWindow(conn); w->setWindowTitle(conn->title()); w->setWindowIcon(ConnectionIcons::iconForType(conn->connectionType())); w->showMaximized(); } } //---------------------------------------------- void MainWindow::on_actionOpen_triggered() { QString fileName = QFileDialog::getOpenFileName(this, tr("Открыть подключение"), "", tr("Файл подключения (*.connection);;Все файлы (*.*)")); if (fileName.isNull()) return; restoreConection(fileName); } //---------------------------------------------- void MainWindow::on_actionSave_triggered() { QString fileName = QFileDialog::getSaveFileName(this, tr("Сохранить подключение"), "", tr("Файл подключения (*.connection);;Все файлы (*.*)")); if (fileName.isNull()) return; if (!fileName.endsWith(".connection")) { fileName.append(".connection"); } saveConnection(fileName); } //---------------------------------------------- void MainWindow::on_actionOpenSess_triggered() { QString fileName = QFileDialog::getOpenFileName(this, tr("Открыть сессию"), "", tr("Файл сессии (*.session);;Все файлы (*.*)")); if (fileName.isNull()) return; restoreSession(fileName); } //---------------------------------------------- void MainWindow::on_actionSaveSess_triggered() { QString fileName = QFileDialog::getSaveFileName(this, tr("Сохранить сессию"), "", tr("Файл сессии (*.session);;Все файлы (*.*)")); if (fileName.isNull()) return; if (!fileName.endsWith(".session")) { fileName.append(".session"); } saveSession(fileName); } //---------------------------------------------- void MainWindow::on_actionExit_triggered() { qApp->quit(); } //---------------------------------------------- void MainWindow::on_actionCloseAll_triggered() { closeAllConnections(); } //---------------------------------------------- void MainWindow::on_actionAbout_triggered() { _aboutDlg->show(); } //---------------------------------------------- void MainWindow::on_actionHelp_triggered() { QUrl docUrl(QCoreApplication::applicationDirPath() + "/doc/documentation.html"); if (!QDesktopServices::openUrl(docUrl)) { QMessageBox::warning(this, tr("Ошибка"), tr("Не удалось открыть документацию. Файл doc/documentation.html не найден.")); } } //---------------------------------------------- void MainWindow::on_actionThemeDefault_triggered() { ThemeManager::instance().setTheme("default"); updateThemeActions(); } //---------------------------------------------- void MainWindow::on_actionThemeDark_triggered() { ThemeManager::instance().setTheme("dark"); updateThemeActions(); } //---------------------------------------------- void MainWindow::updateThemeActions() { QString current = ThemeManager::instance().currentTheme(); ui->actionThemeDefault->setChecked(current == "default"); ui->actionThemeDark->setChecked(current == "dark"); }