From 5e158780251e0aa2f126349bd73b85d795abdbd4 Mon Sep 17 00:00:00 2001 From: Keshav Bhatt Date: Sun, 28 May 2023 01:18:28 +0530 Subject: [PATCH] update show hide logic for systemtray --- src/mainwindow.cpp | 518 ++++++++++++++++++++------------------ src/mainwindow.h | 107 +++----- src/systemtraymanager.cpp | 47 ++-- src/systemtraymanager.h | 10 +- 4 files changed, 343 insertions(+), 339 deletions(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index b63072f..7247acc 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -5,31 +5,41 @@ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); - SystemTrayManager *trayManager = new SystemTrayManager(this); + m_trayManager = new SystemTrayManager(this); - connect(trayManager, &SystemTrayManager::showWindow, this, &MainWindow::show); - connect(trayManager, &SystemTrayManager::hideWindow, this, &MainWindow::hide); + connect(m_trayManager, &SystemTrayManager::showWindow, this, [=]() { + this->showNormal(); + m_trayManager->updateMenu(this->isVisible()); + }); + connect(m_trayManager, &SystemTrayManager::hideWindow, this, [=]() { + this->hide(); + m_trayManager->updateMenu(this->isVisible()); + }); + + m_trayManager->updateMenu(true); this->setWindowTitle(QApplication::applicationName() + " v" + QApplication::applicationVersion()); this->setWindowIcon(QIcon(":/icons/app/icon-64.png")); - setStyle(":/qbreeze/" + settings.value("theme", "dark").toString() + ".qss"); + setStyle(":/qbreeze/" + m_settings.value("theme", "dark").toString() + + ".qss"); // set layout - _translate = new controlButton(ui->translationWidget); - _translate->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); - _translate->setFixedSize(36, 36); - _translate->setMouseTracking(true); - _translate->setToolTip("Translate (Shift + Enter)"); - _translate->setStyleSheet("border:none;border-radius:18px;"); - _translate->setIconSize(QSize(28, 28)); - QShortcut *shortcut = new QShortcut( - QKeySequence(tr("Shift+Return", "Translate")), _translate, SLOT(click())); + m_translate = new controlButton(ui->translationWidget); + m_translate->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); + m_translate->setFixedSize(36, 36); + m_translate->setMouseTracking(true); + m_translate->setToolTip("Translate (Shift + Enter)"); + m_translate->setStyleSheet("border:none;border-radius:18px;"); + m_translate->setIconSize(QSize(28, 28)); + QShortcut *shortcut = + new QShortcut(QKeySequence(tr("Shift+Return", "Translate")), m_translate, + SLOT(click())); shortcut->setContext(Qt::ApplicationShortcut); - _translate->setIcon(QIcon(":/icons/arrow-right-circle-line.png")); + m_translate->setIcon(QIcon(":/icons/arrow-right-circle-line.png")); QTimer::singleShot(100, this, SLOT(resizeFix())); - connect(_translate, &QAbstractButton::clicked, this, + connect(m_translate, &QAbstractButton::clicked, this, &MainWindow::translate_clicked); // read language codes and initialize vars @@ -40,8 +50,8 @@ MainWindow::MainWindow(QWidget *parent) ui->lang2->blockSignals(true); ui->lang1->addItem(QIcon(":/icons/translate-2.png"), "Auto Detect"); - ui->lang1->addItems(_langName); - ui->lang2->addItems(_langName); + ui->lang1->addItems(m_langName); + ui->lang2->addItems(m_langName); for (int i = 0; i < ui->lang1->count(); i++) { if (i == 0) { ui->lang1->setItemIcon(i, QIcon(":/icons/magic-line.png")); @@ -54,8 +64,8 @@ MainWindow::MainWindow(QWidget *parent) } // load settings - ui->lang1->setCurrentIndex(settings.value("lang1", 0).toInt()); - ui->lang2->setCurrentIndex(settings.value("lang2", 20).toInt()); + ui->lang1->setCurrentIndex(m_settings.value("lang1", 0).toInt()); + ui->lang2->setCurrentIndex(m_settings.value("lang2", 20).toInt()); ui->switch_lang->setEnabled(ui->lang1->currentIndex() != 0); @@ -66,21 +76,21 @@ MainWindow::MainWindow(QWidget *parent) ui->lang2->setMinimumWidth(150); // loader is the child of wall_view - _loader = new WaitingSpinnerWidget(_translate, true, true); - _loader->setRoundness(70.0); - _loader->setMinimumTrailOpacity(15.0); - _loader->setTrailFadePercentage(70.0); - _loader->setNumberOfLines(30); - _loader->setLineLength(14); - _loader->setLineWidth(2); - _loader->setInnerRadius(2); - _loader->setRevolutionsPerSecond(3); - _loader->setColor(QColor(67, 124, 198)); - - if (settings.value("geometry").isValid()) { - restoreGeometry(settings.value("geometry").toByteArray()); - if (settings.value("windowState").isValid()) { - restoreState(settings.value("windowState").toByteArray()); + m_loader = new WaitingSpinnerWidget(m_translate, true, true); + m_loader->setRoundness(70.0); + m_loader->setMinimumTrailOpacity(15.0); + m_loader->setTrailFadePercentage(70.0); + m_loader->setNumberOfLines(30); + m_loader->setLineLength(14); + m_loader->setLineWidth(2); + m_loader->setInnerRadius(2); + m_loader->setRevolutionsPerSecond(3); + m_loader->setColor(QColor(67, 124, 198)); + + if (m_settings.value("geometry").isValid()) { + restoreGeometry(m_settings.value("geometry").toByteArray()); + if (m_settings.value("windowState").isValid()) { + restoreState(m_settings.value("windowState").toByteArray()); } else { QScreen *pScreen = QGuiApplication::screenAt(this->mapToGlobal({this->width() / 2, 0})); @@ -90,38 +100,38 @@ MainWindow::MainWindow(QWidget *parent) } // init media player - _player = new QMediaPlayer(this, QMediaPlayer::StreamPlayback); - _player->setVolume(100); - connect(_player, &QMediaPlayer::stateChanged, this, + m_player = new QMediaPlayer(this, QMediaPlayer::StreamPlayback); + m_player->setVolume(100); + connect(m_player, &QMediaPlayer::stateChanged, this, [=](QMediaPlayer::State state) { QPushButton *playBtn = this->findChild( - _player->objectName().split("_").last()); + m_player->objectName().split("_").last()); if (playBtn != nullptr && state == QMediaPlayer::StoppedState) { playBtn->setIcon(QIcon(":/icons/volume-up-line.png")); - playSelected = false; - selectedText.clear(); + m_playSelected = false; + m_selectedText.clear(); } if (playBtn != nullptr && state == QMediaPlayer::PlayingState) { playBtn->setIcon(QIcon(":/icons/stop-line.png")); } }); - connect(_player, QOverload::of(&QMediaPlayer::error), + connect(m_player, QOverload::of(&QMediaPlayer::error), this, [=](QMediaPlayer::Error error) { Q_UNUSED(error); - playSelected = false; - selectedText.clear(); + m_playSelected = false; + m_selectedText.clear(); QPushButton *playBtn = this->findChild( - _player->objectName().split("_").last()); + m_player->objectName().split("_").last()); if (playBtn != nullptr) playBtn->setIcon(QIcon(":/icons/volume-up-line.png")); - showError(_player->errorString()); + showError(m_player->errorString()); }); - connect(_player, &QMediaPlayer::mediaStatusChanged, this, + connect(m_player, &QMediaPlayer::mediaStatusChanged, this, [=](QMediaPlayer::MediaStatus mediastate) { QPushButton *playBtn = this->findChild( - _player->objectName().split("_").last()); + m_player->objectName().split("_").last()); if (playBtn != nullptr && (mediastate == QMediaPlayer::LoadingMedia || mediastate == QMediaPlayer::BufferingMedia)) { @@ -143,20 +153,20 @@ MainWindow::MainWindow(QWidget *parent) ui->counter->setMinimumWidth(minWid); ui->counter_2->setMinimumWidth(minWid); - clipboard = QApplication::clipboard(); + m_clipboard = QApplication::clipboard(); // init share - _share = new Share(this); - _share->setWindowTitle(QApplication::applicationName() + - " | Share translation"); - _share->setWindowFlag(Qt::Dialog); - _share->setWindowModality(Qt::NonModal); - - _lineByLine = new LineByLine(this, clipboard); - _lineByLine->setWindowTitle(QApplication::applicationName() + - " | LineByLine translation"); - _lineByLine->setWindowFlag(Qt::Dialog); - _lineByLine->setWindowModality(Qt::NonModal); + m_share = new Share(this); + m_share->setWindowTitle(QApplication::applicationName() + + " | Share translation"); + m_share->setWindowFlag(Qt::Dialog); + m_share->setWindowModality(Qt::NonModal); + + m_lineByLine = new LineByLine(this, m_clipboard); + m_lineByLine->setWindowTitle(QApplication::applicationName() + + " | LineByLine translation"); + m_lineByLine->setWindowFlag(Qt::Dialog); + m_lineByLine->setWindowModality(Qt::NonModal); // init settings init_settings(); @@ -164,20 +174,20 @@ MainWindow::MainWindow(QWidget *parent) // init history init_history(); - if (settings.value("lastTranslation").isValid()) { + if (m_settings.value("lastTranslation").isValid()) { QFileInfo check(QFile(utils::returnPath("history") + "/" + - settings.value("lastTranslation").toString() + + m_settings.value("lastTranslation").toString() + ".json")); if (check.exists()) { - translationId = settings.value("lastTranslation").toString(); - historyWidget->loadHistoryItem(utils::returnPath("history") + "/" + - translationId + ".json"); + m_translationId = m_settings.value("lastTranslation").toString(); + m_historyWidget->loadHistoryItem(utils::returnPath("history") + "/" + + m_translationId + ".json"); } } - if (settings.value("firstRun").isValid() == false) { + if (m_settings.value("firstRun").isValid() == false) { on_help_clicked(); - settings.setValue("firstRun", false); + m_settings.setValue("firstRun", false); } } @@ -185,20 +195,21 @@ MainWindow::MainWindow(QWidget *parent) void MainWindow::init_history() { utils::returnPath("history"); - historyWidget = new History(this); - historyWidget->setWindowTitle(QApplication::applicationName() + " | History"); - historyWidget->setWindowFlag(Qt::Dialog); - historyWidget->setWindowModality(Qt::NonModal); - connect(historyWidget, &History::setTranslationId, this, - [=](QString transId) { this->translationId = transId; }); - connect(historyWidget, &History::historyItemMeta, this, + m_historyWidget = new History(this); + m_historyWidget->setWindowTitle(QApplication::applicationName() + + " | History"); + m_historyWidget->setWindowFlag(Qt::Dialog); + m_historyWidget->setWindowModality(Qt::NonModal); + connect(m_historyWidget, &History::setTranslationId, this, + [=](QString transId) { this->m_translationId = transId; }); + connect(m_historyWidget, &History::historyItemMeta, this, [=](QStringList historyItemMeta) { if (historyItemMeta.count() >= 4) { - currentTranslationData.clear(); - settings.setValue( + m_currentTranslationData.clear(); + m_settings.setValue( "lastTranslation", - translationId); // translation id is set before this functor - // is called via signal + m_translationId); // translation id is set before this functor + // is called via signal QString from, to, src1, src2; from = historyItemMeta.at(0); to = historyItemMeta.at(1); @@ -212,27 +223,34 @@ void MainWindow::init_history() { }); } +void MainWindow::changeEvent(QEvent *e) { + QMainWindow::changeEvent(e); + // if (e->type() == QEvent::WindowStateChange) { + // m_trayManager->updateMenu(this->isVisible()); + // } +} + void MainWindow::init_settings() { - nativeHotkey = new QHotkey(this); - settingsWidget = new Settings(this, nativeHotkey); - settingsWidget->setWindowTitle(QApplication::applicationName() + - " | Settings"); - settingsWidget->setWindowFlag(Qt::Dialog); - settingsWidget->setWindowModality(Qt::NonModal); - connect(settingsWidget, &Settings::translationRequest, this, + m_nativeHotkey = new QHotkey(this); + m_settingsWidget = new Settings(this, m_nativeHotkey); + m_settingsWidget->setWindowTitle(QApplication::applicationName() + + " | Settings"); + m_settingsWidget->setWindowFlag(Qt::Dialog); + m_settingsWidget->setWindowModality(Qt::NonModal); + connect(m_settingsWidget, &Settings::translationRequest, this, [=](const QString selected) { ui->src1->setText(selected); ui->lang1->setCurrentIndex(0); - _translate->click(); + m_translate->click(); this->setWindowState((this->windowState() & ~Qt::WindowMinimized) | Qt::WindowActive); this->show(); }); - connect(settingsWidget, &Settings::themeToggled, this, [=]() { - setStyle(":/qbreeze/" + settings.value("theme", "dark").toString() + + connect(m_settingsWidget, &Settings::themeToggled, this, [=]() { + setStyle(":/qbreeze/" + m_settings.value("theme", "dark").toString() + ".qss"); }); - if (nativeHotkey->isRegistered() == false) { + if (m_nativeHotkey->isRegistered() == false) { showError("Unable to register Global Hotkey.\nIs another instance of " + QApplication::applicationName() + "running ?\nIf yes close it and restart the application."); @@ -242,23 +260,23 @@ void MainWindow::init_settings() { void MainWindow::textSelectionChanged(QTextEdit *editor) { QString selection = editor->textCursor().selectedText().trimmed(); if (!selection.isEmpty()) { - textOptionWidget->setObjectName("selection_" + editor->objectName()); - textOptionWidget->move(QCursor::pos().x(), QCursor::pos().y() + 10); - textOptionWidget->resize(textOptionWidget->minimumSizeHint()); - textOptionWidget->adjustSize(); - textOptionWidget->show(); + m_textOptionWidget->setObjectName("selection_" + editor->objectName()); + m_textOptionWidget->move(QCursor::pos().x(), QCursor::pos().y() + 10); + m_textOptionWidget->resize(m_textOptionWidget->minimumSizeHint()); + m_textOptionWidget->adjustSize(); + m_textOptionWidget->show(); textOptionForm.readPushButton->disconnect(); textOptionForm.copyPushButton->disconnect(); connect(textOptionForm.readPushButton, &QPushButton::clicked, this, [=]() { - if (this->findChild(textOptionWidget->objectName() + if (this->findChild(m_textOptionWidget->objectName() .split("selection_") .last() .trimmed()) != nullptr) { - playSelected = true; - selectedText = selection; - if (textOptionWidget->objectName() + m_playSelected = true; + m_selectedText = selection; + if (m_textOptionWidget->objectName() .split("selection_") .last() .trimmed() == "src1") { @@ -266,17 +284,17 @@ void MainWindow::textSelectionChanged(QTextEdit *editor) { } else { on_play2_clicked(); } - textOptionWidget->hide(); + m_textOptionWidget->hide(); } }); connect(textOptionForm.copyPushButton, &QPushButton::clicked, this, [=]() { - clipboard->setText(selection); - textOptionWidget->hide(); + m_clipboard->setText(selection); + m_textOptionWidget->hide(); }); } else { - playSelected = false; - selectedText.clear(); + m_playSelected = false; + m_selectedText.clear(); } } @@ -289,7 +307,7 @@ bool MainWindow::eventFilter(QObject *o, QEvent *e) { QKeyEvent *keyEvent = static_cast(e); if ((keyEvent->key() == Qt::Key_Return) && keyEvent->modifiers() & (Qt::ShiftModifier)) { - _translate->click(); + m_translate->click(); return true; } else { return false; @@ -307,25 +325,29 @@ void MainWindow::resizeFix() { } void MainWindow::closeEvent(QCloseEvent *event) { - settings.setValue("geometry", saveGeometry()); - settings.setValue("windowState", saveState()); + QMainWindow::closeEvent(event); + + m_settings.setValue("geometry", saveGeometry()); + + m_settings.setValue("windowState", saveState()); // save quick trans shortcut - settings.setValue("quicktrans_shortcut", - settingsWidget->keySequenceEditKeySequence()); + m_settings.setValue("quicktrans_shortcut", + m_settingsWidget->keySequenceEditKeySequence()); // save quicktrans settings - settings.setValue("quicktrans", settingsWidget->quickResultCheckBoxChecked()); + m_settings.setValue("quicktrans", + m_settingsWidget->quickResultCheckBoxChecked()); - QMainWindow::closeEvent(event); + m_trayManager->updateMenu(false); } void MainWindow::resizeEvent(QResizeEvent *event) { int x = - ui->translationWidget->geometry().center().x() - _translate->width() / 2; + ui->translationWidget->geometry().center().x() - m_translate->width() / 2; int y = ui->translationWidget->geometry().center().y() - - (_translate->height() + _translate->height() / 2); - _translate->move(x, y); + (m_translate->height() + m_translate->height() / 2); + m_translate->move(x, y); ui->switch_lang->move(x, ui->switch_lang->y()); ui->left_buttons_widget->resize(ui->right_button_widget->width(), ui->left_buttons_widget->height()); @@ -341,8 +363,8 @@ void MainWindow::readLangCode() { while (!lang.atEnd()) { QString langLine = QString(lang.readLine()); QStringList langItem = langLine.split("<=>"); - _langName.append(langItem.at(0).trimmed()); - _langCode.append(langItem.at(1).trimmed()); + m_langName.append(langItem.at(0).trimmed()); + m_langCode.append(langItem.at(1).trimmed()); } lang.close(); @@ -354,12 +376,12 @@ void MainWindow::readLangCode() { } while (!tts.atEnd()) { QString ttsCode = QString(tts.readLine()); - _supportedTts.append(ttsCode.trimmed()); + m_supportedTts.append(ttsCode.trimmed()); } tts.close(); } -void MainWindow::setStyle(QString fname) { +void MainWindow::setStyle(const QString &fname) { QFile styleSheet(fname); if (!styleSheet.open(QIODevice::ReadOnly)) { qWarning("Unable to open file"); @@ -373,31 +395,31 @@ MainWindow::~MainWindow() { delete ui; } void MainWindow::translate_clicked() { // clear processor vars - currentTranslationData.clear(); + m_currentTranslationData.clear(); ui->src2->clear(); - if (_request != nullptr) { - _request->blockSignals(true); - _request->deleteLater(); - _request->blockSignals(false); - _request = nullptr; - _loader->stop(); + if (m_request != nullptr) { + m_request->blockSignals(true); + m_request->deleteLater(); + m_request->blockSignals(false); + m_request = nullptr; + m_loader->stop(); } - if (_request == nullptr) { - _request = new Request(this); - connect(_request, &Request::requestStarted, this, - [=]() { _loader->start(); }); - connect(_request, &Request::requestFinished, this, [=](QString reply) { + if (m_request == nullptr) { + m_request = new Request(this); + connect(m_request, &Request::requestStarted, this, + [=]() { m_loader->start(); }); + connect(m_request, &Request::requestFinished, this, [=](QString reply) { // save cache for line by line use - saveByTransId(translationId, reply); + saveByTransId(m_translationId, reply); // load to view processTranslation(reply); - _loader->stop(); - settings.setValue("lastTranslation", translationId); + m_loader->stop(); + m_settings.setValue("lastTranslation", m_translationId); }); - connect(_request, &Request::downloadError, this, [=](QString errorString) { - _loader->stop(); + connect(m_request, &Request::downloadError, this, [=](QString errorString) { + m_loader->stop(); showError(errorString); }); @@ -422,21 +444,22 @@ void MainWindow::translate_clicked() { if (urlStr.isEmpty()) { showError("Invalid Input."); } else { - _request->get(QUrl(urlStr)); - translationId = utils::generateRandomId(20); + m_request->get(QUrl(urlStr)); + m_translationId = utils::generateRandomId(20); } } } -void MainWindow::saveByTransId(QString translationId, QString reply) { +void MainWindow::saveByTransId(const QString &translationId, + const QString &reply) { QFile jsonFile(utils::returnPath("cache") + "/" + translationId + ".glate"); jsonFile.open(QFile::WriteOnly); jsonFile.write(reply.toUtf8()); jsonFile.close(); } -void MainWindow::processTranslation(QString reply) { - currentTranslationData.clear(); +void MainWindow::processTranslation(const QString &reply) { + m_currentTranslationData.clear(); QJsonDocument jsonResponse = QJsonDocument::fromJson(reply.toUtf8()); if (jsonResponse.isEmpty()) { showError( @@ -452,23 +475,23 @@ void MainWindow::processTranslation(QString reply) { QStringList translationFregments; translationFregments << val2.toArray().at(0).toString(); translationFregments << val2.toArray().at(1).toString(); - currentTranslationData.append(translationFregments); + m_currentTranslationData.append(translationFregments); } } } } - foreach (QStringList translationFregments, currentTranslationData) { + foreach (QStringList translationFregments, m_currentTranslationData) { ui->src2->append(translationFregments.at(0)); } // scroll to top ui->src2->verticalScrollBar()->triggerAction(QScrollBar::SliderToMinimum); // history save - historyWidget->insertItem( + m_historyWidget->insertItem( QStringList() << getLangName(getSourceLang()) << getLangName(getTransLang()) << ui->src1->toPlainText() << ui->src2->toPlainText() << QDateTime::currentDateTime().toLocalTime().toString(), - false, translationId); + false, m_translationId); } QString MainWindow::getSourceLang() { @@ -476,48 +499,49 @@ QString MainWindow::getSourceLang() { if (indexLang1 == 0) { return "auto"; } else { - return _langCode.at(indexLang1 - 1).trimmed(); + return m_langCode.at(indexLang1 - 1).trimmed(); } } QString MainWindow::getTransLang() { int indexLang2 = ui->lang2->currentIndex(); - return _langCode.at(indexLang2).trimmed(); + return m_langCode.at(indexLang2).trimmed(); } -void MainWindow::showError(QString message) { - if (message.contains("host", Qt::CaseInsensitive) || - message.contains("translate.googleapis.com")) { - message.replace("translate.googleapis.com", "host"); +void MainWindow::showError(const QString &message) { + QString temp = message; + if (temp.contains("host", Qt::CaseInsensitive) || + temp.contains("translate.googleapis.com")) { + temp.replace("translate.googleapis.com", "host"); } // init error - _error = new Error(this); - _error->setAttribute(Qt::WA_DeleteOnClose); - _error->setWindowTitle(QApplication::applicationName() + " | Error dialog"); - _error->setWindowFlag(Qt::Dialog); - _error->setWindowModality(Qt::NonModal); - _error->setError("An Error ocurred while processing your request!", message); - _error->show(); + m_error = new Error(this); + m_error->setAttribute(Qt::WA_DeleteOnClose, true); + m_error->setWindowTitle(QApplication::applicationName() + " | Error dialog"); + m_error->setWindowFlag(Qt::Dialog); + m_error->setWindowModality(Qt::NonModal); + m_error->setError("An Error ocurred while processing your request!", temp); + m_error->show(); } void MainWindow::on_clear_clicked() { ui->src1->clear(); ui->src2->clear(); - if (_request != nullptr) { - _request->blockSignals(true); - _request->deleteLater(); - _request->blockSignals(false); - _request = nullptr; - _loader->stop(); + if (m_request != nullptr) { + m_request->blockSignals(true); + m_request->deleteLater(); + m_request->blockSignals(false); + m_request = nullptr; + m_loader->stop(); } - currentTranslationData.clear(); - translationId.clear(); - _lineByLine->clearData(); + m_currentTranslationData.clear(); + m_translationId.clear(); + m_lineByLine->clearData(); } void MainWindow::on_paste_clicked() { - const QMimeData *mimeData = clipboard->mimeData(); + const QMimeData *mimeData = m_clipboard->mimeData(); if (mimeData->hasText()) { ui->src1->setPlainText(mimeData->text()); } @@ -541,37 +565,37 @@ void MainWindow::on_switch_lang_clicked() { void MainWindow::on_lang1_currentIndexChanged(int index) { ui->switch_lang->setEnabled(index != 0); - settings.setValue("lang1", index); - _translate->setToolTip( + m_settings.setValue("lang1", index); + m_translate->setToolTip( "Translate from " + ui->lang1->itemText(index) + " to " + ui->lang2->itemText(ui->lang2->currentIndex()) + "(Shift + Enter)"); } void MainWindow::on_lang2_currentIndexChanged(int index) { - settings.setValue("lang2", index); - _translate->setToolTip("Translate from " + - ui->lang1->itemText(ui->lang1->currentIndex()) + - " to " + ui->lang2->itemText(index)); + m_settings.setValue("lang2", index); + m_translate->setToolTip("Translate from " + + ui->lang1->itemText(ui->lang1->currentIndex()) + + " to " + ui->lang2->itemText(index)); } void MainWindow::on_play2_clicked() { - bool player1Playing = _player->objectName().split("_").last() == "play1" && - _player->state() == QMediaPlayer::PlayingState; + bool player1Playing = m_player->objectName().split("_").last() == "play1" && + m_player->state() == QMediaPlayer::PlayingState; - if (_player->state() != QMediaPlayer::PlayingState) { - if (_supportedTts.contains(getTransLang(), Qt::CaseInsensitive) == false) { + if (m_player->state() != QMediaPlayer::PlayingState) { + if (m_supportedTts.contains(getTransLang(), Qt::CaseInsensitive) == false) { showError("Selected language '" + getTransLang() + "' is not supported by TTS Engine.\nPlease choose different " "Language."); return; } - _player->setObjectName("player_play2"); + m_player->setObjectName("player_play2"); QString text = ui->src2->toPlainText(); - if (playSelected) - text = selectedText; + if (m_playSelected) + text = m_selectedText; QStringList src2Parts; - QMediaPlaylist *src2playlist = new QMediaPlaylist(_player); + QMediaPlaylist *src2playlist = new QMediaPlaylist(m_player); src2playlist->setPlaybackMode(QMediaPlaylist::Sequential); connect(src2playlist, &QMediaPlaylist::currentIndexChanged, [=](int pos) { qDebug() << "Playist for player2 pos changed" << pos; @@ -587,15 +611,15 @@ void MainWindow::on_play2_clicked() { src2playlist->addMedia(QMediaContent(url)); } } - _player->setPlaylist(src2playlist); - _player->play(); + m_player->setPlaylist(src2playlist); + m_player->play(); ui->play2->setIcon(QIcon(":/icons/loader-2-fill.png")); } else { - _player->blockSignals(true); - _player->stop(); + m_player->blockSignals(true); + m_player->stop(); ui->play1->setIcon(QIcon(":/icons/volume-up-line.png")); ui->play2->setIcon(QIcon(":/icons/volume-up-line.png")); - _player->blockSignals(false); + m_player->blockSignals(false); } if (player1Playing) { @@ -604,23 +628,24 @@ void MainWindow::on_play2_clicked() { } void MainWindow::on_play1_clicked() { - bool player2Playing = _player->objectName().split("_").last() == "play2" && - _player->state() == QMediaPlayer::PlayingState; + bool player2Playing = m_player->objectName().split("_").last() == "play2" && + m_player->state() == QMediaPlayer::PlayingState; - if (_player->state() != QMediaPlayer::PlayingState) { - if (_supportedTts.contains(getSourceLang(), Qt::CaseInsensitive) == false) { + if (m_player->state() != QMediaPlayer::PlayingState) { + if (m_supportedTts.contains(getSourceLang(), Qt::CaseInsensitive) == + false) { showError("Selected language '" + getSourceLang() + "' is not supported by TTS Engine.\nPlease choose different " "Language."); return; } - _player->setObjectName("player_play1"); + m_player->setObjectName("player_play1"); QString text = ui->src1->toPlainText(); - if (playSelected) - text = selectedText; + if (m_playSelected) + text = m_selectedText; QStringList src1Parts; - QMediaPlaylist *src1playlist = new QMediaPlaylist(_player); + QMediaPlaylist *src1playlist = new QMediaPlaylist(m_player); src1playlist->setPlaybackMode(QMediaPlaylist::Sequential); connect(src1playlist, &QMediaPlaylist::currentIndexChanged, [=](int pos) { qDebug() << "Playist for player1 pos changed" << pos; @@ -636,15 +661,15 @@ void MainWindow::on_play1_clicked() { src1playlist->addMedia(QMediaContent(url)); } } - _player->setPlaylist(src1playlist); - _player->play(); + m_player->setPlaylist(src1playlist); + m_player->play(); ui->play1->setIcon(QIcon(":/icons/loader-2-fill.png")); } else { - _player->blockSignals(true); - _player->stop(); + m_player->blockSignals(true); + m_player->stop(); ui->play1->setIcon(QIcon(":/icons/volume-up-line.png")); ui->play2->setIcon(QIcon(":/icons/volume-up-line.png")); - _player->blockSignals(false); + m_player->blockSignals(false); } if (player2Playing) { @@ -675,107 +700,108 @@ void MainWindow::on_src2_textChanged() { void MainWindow::on_copy_clicked() { const QString text = ui->src2->toPlainText(); if (!text.isEmpty()) { - clipboard->setText(text); + m_clipboard->setText(text); } } void MainWindow::on_share_clicked() { - _share->setTranslation(ui->src2->toPlainText(), translationId); - if (_share->isVisible() == false) { - _share->showNormal(); + m_share->setTranslation(ui->src2->toPlainText(), m_translationId); + if (m_share->isVisible() == false) { + m_share->showNormal(); } } void MainWindow::on_settings_clicked() { - if (settingsWidget->isVisible() == false) { - settingsWidget->adjustSize(); + if (m_settingsWidget->isVisible() == false) { + m_settingsWidget->adjustSize(); QScreen *pScreen = QGuiApplication::screenAt( - this->mapToGlobal({settingsWidget->width() / 2, 0})); + this->mapToGlobal({m_settingsWidget->width() / 2, 0})); QRect availableScreenSize = pScreen->availableGeometry(); - settingsWidget->move(availableScreenSize.center() - - settingsWidget->rect().center()); - settingsWidget->showNormal(); + m_settingsWidget->move(availableScreenSize.center() - + m_settingsWidget->rect().center()); + m_settingsWidget->showNormal(); } } void MainWindow::on_history_clicked() { - if (historyWidget->isVisible() == false) { - historyWidget->loadHistory(); + if (m_historyWidget->isVisible() == false) { + m_historyWidget->loadHistory(); QScreen *pScreen = QGuiApplication::screenAt( - this->mapToGlobal({historyWidget->width() / 2, 0})); + this->mapToGlobal({m_historyWidget->width() / 2, 0})); QRect availableScreenSize = pScreen->availableGeometry(); - historyWidget->move(availableScreenSize.center() - - historyWidget->rect().center()); - historyWidget->showNormal(); + m_historyWidget->move(availableScreenSize.center() - + m_historyWidget->rect().center()); + m_historyWidget->showNormal(); } } void MainWindow::on_lineByline_clicked() { - if (translationId.isEmpty()) { + if (m_translationId.isEmpty()) { showError("Translate something first."); return; } - if (_lineByLine->isVisible() == false) { - if (translationId != _lineByLine->getTId()) { - _lineByLine->clearData(); - if (currentTranslationData.isEmpty() == false) { - _lineByLine->setData(currentTranslationData, - getLangName(getSourceLang()), - getLangName(getTransLang()), translationId); + if (m_lineByLine->isVisible() == false) { + if (m_translationId != m_lineByLine->getTId()) { + m_lineByLine->clearData(); + if (m_currentTranslationData.isEmpty() == false) { + m_lineByLine->setData(m_currentTranslationData, + getLangName(getSourceLang()), + getLangName(getTransLang()), m_translationId); } else { // load translation from cache; - QFile jsonFile(utils::returnPath("cache") + "/" + translationId + + QFile jsonFile(utils::returnPath("cache") + "/" + m_translationId + ".glate"); jsonFile.open(QFile::ReadOnly); - currentTranslationData.clear(); + m_currentTranslationData.clear(); processTranslation(jsonFile.readAll()); - _lineByLine->setData(currentTranslationData, - getLangName(getSourceLang()), - getLangName(getTransLang()), translationId); + m_lineByLine->setData(m_currentTranslationData, + getLangName(getSourceLang()), + getLangName(getTransLang()), m_translationId); } } QScreen *pScreen = QGuiApplication::screenAt( - this->mapToGlobal({_lineByLine->width() / 2, 0})); + this->mapToGlobal({m_lineByLine->width() / 2, 0})); QRect availableScreenSize = pScreen->availableGeometry(); - _lineByLine->move(availableScreenSize.center() - - _lineByLine->rect().center()); - _lineByLine->showNormal(); + m_lineByLine->move(availableScreenSize.center() - + m_lineByLine->rect().center()); + m_lineByLine->showNormal(); } } // convert lang code to lang name. -QString MainWindow::getLangName(QString langCode) { +QString MainWindow::getLangName(const QString &langCode) { if (langCode == "auto") { return "Auto Detected"; } else { - QStringList langNameList = _langName; + QStringList langNameList = m_langName; langNameList.removeAt(0); // remove auto detect - QString langName = langNameList.at(_langCode.lastIndexOf(langCode) - 1); + QString langName = langNameList.at(m_langCode.lastIndexOf(langCode) - 1); return langName; } } // not tested not being used yet -QString MainWindow::getLangCode(QString langName) { +QString MainWindow::getLangCode(const QString &langName) { if (langName.contains("auto", Qt::CaseInsensitive)) { return "auto"; } else { - QStringList langCodeList = _langCode; - QString langCode = langCodeList.at(_langName.lastIndexOf(langName) - 1); + QStringList langCodeList = m_langCode; + QString langCode = langCodeList.at(m_langName.lastIndexOf(langName) - 1); return langCode; } } void MainWindow::on_help_clicked() { - if (slider == nullptr) { - slider = new Slider(this); - slider->setWindowTitle(QApplication::applicationName() + " | Introduction"); - slider->setWindowFlag(Qt::Dialog); - slider->setWindowModality(Qt::ApplicationModal); - slider->setMinimumSize(680, 420); - } - if (slider->isVisible() == false) { - slider->showNormal(); - slider->start(); + if (m_slider == nullptr) { + m_slider = new Slider(this); + m_slider->setWindowTitle(QApplication::applicationName() + + " | Introduction"); + m_slider->setWindowFlag(Qt::Dialog); + m_slider->setWindowModality(Qt::ApplicationModal); + m_slider->setMinimumSize(680, 420); + } + if (m_slider->isVisible() == false) { + m_slider->showNormal(); + m_slider->start(); } } diff --git a/src/mainwindow.h b/src/mainwindow.h index 3dd5a3d..a45c274 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -33,10 +33,10 @@ #include "settings.h" #include "share.h" #include "slider.h" +#include "systemtraymanager.h" #include "ui_textoptionform.h" #include "utils.h" #include "waitingspinnerwidget.h" -#include "systemtraymanager.h" namespace Ui { class MainWindow; @@ -50,93 +50,68 @@ class MainWindow : public QMainWindow { ~MainWindow(); protected slots: - void resizeEvent(QResizeEvent *event); - void closeEvent(QCloseEvent *event); - bool eventFilter(QObject *o, QEvent *e); + void changeEvent(QEvent *e) override; + void resizeEvent(QResizeEvent *event) override; + void closeEvent(QCloseEvent *event) override; + bool eventFilter(QObject *o, QEvent *e) override; private slots: - void setStyle(QString fname); - - void readLangCode(); - - void resizeFix(); - - void translate_clicked(); - - void showError(QString message); void on_clear_clicked(); - void on_paste_clicked(); - void on_switch_lang_clicked(); - void on_lang1_currentIndexChanged(int index); - void on_lang2_currentIndexChanged(int index); - - QString getTransLang(); - - QString getSourceLang(); - - void processTranslation(QString reply); - void on_play2_clicked(); - void on_play1_clicked(); - void on_src1_textChanged(); - void on_copy_clicked(); - void on_src2_textChanged(); - void on_share_clicked(); - - void init_settings(); - void on_settings_clicked(); - - void textSelectionChanged(QTextEdit *editor); void on_history_clicked(); - - void init_history(); void on_lineByline_clicked(); - - QString getLangName(QString langCode); - - QString getLangCode(QString langName); - - void saveByTransId(QString translationId, QString reply); - void on_help_clicked(); + void readLangCode(); + void resizeFix(); + void translate_clicked(); + void init_history(); + QString getTransLang(); + QString getSourceLang(); + void init_settings(); + void setStyle(const QString &fname); + void showError(const QString &message); + void textSelectionChanged(QTextEdit *editor); + QString getLangName(const QString &langCode); + QString getLangCode(const QString &langName); + void saveByTransId(const QString &translationId, const QString &reply); + void processTranslation(const QString &reply); + private: Ui::MainWindow *ui; Ui::textOptionForm textOptionForm; - QStringList _langName, _langCode, _supportedTts; - controlButton *_translate = nullptr; - WaitingSpinnerWidget *_loader = nullptr; - QSettings settings; - Request *_request = nullptr; - Share *_share = nullptr; - LineByLine *_lineByLine = nullptr; - - Error *_error = nullptr; - QList currentTranslationData; - QMediaPlayer *_player = nullptr; - QClipboard *clipboard = nullptr; - - Settings *settingsWidget = nullptr; - History *historyWidget = nullptr; - - QHotkey *nativeHotkey = nullptr; - - QWidget *textOptionWidget = nullptr; - QString selectedText; - bool playSelected = false; - QString translationId; - Slider *slider = nullptr; + controlButton *m_translate = nullptr; + WaitingSpinnerWidget *m_loader = nullptr; + Error *m_error = nullptr; + LineByLine *m_lineByLine = nullptr; + Share *m_share = nullptr; + Request *m_request = nullptr; + QMediaPlayer *m_player = nullptr; + QClipboard *m_clipboard = nullptr; + Settings *m_settingsWidget = nullptr; + History *m_historyWidget = nullptr; + QHotkey *m_nativeHotkey = nullptr; + QWidget *m_textOptionWidget = nullptr; + Slider *m_slider = nullptr; + SystemTrayManager *m_trayManager = nullptr; + + QString m_selectedText; + bool m_playSelected = false; + QString m_translationId; + QStringList m_langName, m_langCode, m_supportedTts; + QSettings m_settings; + QList m_currentTranslationData; }; #endif // MAINWINDOW_H diff --git a/src/systemtraymanager.cpp b/src/systemtraymanager.cpp index 3840018..5a48480 100644 --- a/src/systemtraymanager.cpp +++ b/src/systemtraymanager.cpp @@ -1,29 +1,30 @@ #include "systemtraymanager.h" +#include SystemTrayManager::SystemTrayManager(QObject *parent) : QObject{parent} { if (QSystemTrayIcon::isSystemTrayAvailable()) { trayIcon = new QSystemTrayIcon(QIcon(":/icons/app/icon-64.png"), this->parent()); - trayMenu = new QMenu(0); - showAction = new QAction("Show", this); - hideAction = new QAction("Hide", this); - quitAction = new QAction("Quit", this); + m_trayMenu = new QMenu(0); + m_showAction = + new QAction(tr("Show %1").arg(qApp->applicationName()), this); + m_hideAction = + new QAction(tr("Hide %1").arg(qApp->applicationName()), this); + m_quitAction = new QAction(tr("Quit"), this); - showAction->setDisabled(true); + m_trayMenu->addAction(m_showAction); + m_trayMenu->addAction(m_hideAction); + m_trayMenu->addSeparator(); + m_trayMenu->addAction(m_quitAction); - trayMenu->addAction(showAction); - trayMenu->addAction(hideAction); - trayMenu->addSeparator(); - trayMenu->addAction(quitAction); + trayIcon->setContextMenu(m_trayMenu); - trayIcon->setContextMenu(trayMenu); - - connect(showAction, &QAction::triggered, this, + connect(m_showAction, &QAction::triggered, this, &SystemTrayManager::showMainWindow); - connect(hideAction, &QAction::triggered, this, + connect(m_hideAction, &QAction::triggered, this, &SystemTrayManager::hideMainWindow); - connect(quitAction, &QAction::triggered, this, + connect(m_quitAction, &QAction::triggered, this, &SystemTrayManager::quitApplication); trayIcon->show(); @@ -38,16 +39,16 @@ SystemTrayManager::~SystemTrayManager() { delete trayIcon; } -void SystemTrayManager::showMainWindow() { - emit showWindow(); - showAction->setDisabled(true); - hideAction->setDisabled(false); +void SystemTrayManager::updateMenu(bool windowVisible) { + if (QSystemTrayIcon::isSystemTrayAvailable()) { + qWarning() << windowVisible; + m_showAction->setEnabled(!windowVisible); + m_hideAction->setEnabled(windowVisible); + } } -void SystemTrayManager::hideMainWindow() { - emit hideWindow(); - hideAction->setDisabled(true); - showAction->setDisabled(false); -} +void SystemTrayManager::showMainWindow() { emit showWindow(); } + +void SystemTrayManager::hideMainWindow() { emit hideWindow(); } void SystemTrayManager::quitApplication() { qApp->quit(); } diff --git a/src/systemtraymanager.h b/src/systemtraymanager.h index 2d3661f..855aa6e 100644 --- a/src/systemtraymanager.h +++ b/src/systemtraymanager.h @@ -15,16 +15,18 @@ class SystemTrayManager : public QObject { ~SystemTrayManager(); + void updateMenu(bool windowVisible); + signals: void showWindow(); void hideWindow(); private: QSystemTrayIcon *trayIcon = nullptr; - QMenu *trayMenu = nullptr; - QAction *showAction = nullptr; - QAction *hideAction = nullptr; - QAction *quitAction = nullptr; + QMenu *m_trayMenu = nullptr; + QAction *m_showAction = nullptr; + QAction *m_hideAction = nullptr; + QAction *m_quitAction = nullptr; private slots: void showMainWindow();