#include "windowfinderdialogue.h" #include "ui_windowfinderdialogue.h" #include "Widgets/applicationinfowidget.h" #include "QtImprovements/qsettingsplus.h" #include "Widgets/qprocesslistitem.h" #include #include #include #include #include WindowFinderDialogue::WindowFinderDialogue(QWidget *parent) : QMainWindow(parent) , ui(new Ui::WindowFinderDialogue) { ui->setupUi(this); ui->labelInstructions->setHidden(false); this->widgetApplicationInfo = new ApplicationInfoWidget(this); ui->layoutApplicationEditor->addWidget(this->widgetApplicationInfo); this->widgetApplicationInfo->setHidden(true); ui->listApplications->setSelectionMode(QAbstractItemView::SelectionMode::SingleSelection); ui->listApplications->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu); QObject::connect(ui->listApplications, &QListWidget::customContextMenuRequested, this, &WindowFinderDialogue::showListContextMenu); QObject::connect(ui->listApplications, &QListWidget::itemSelectionChanged, this, &WindowFinderDialogue::loadNewApplicationData); QObject::connect(ui->listApplications, &QListWidget::currentTextChanged, this, &WindowFinderDialogue::updateListItem); QSettings settings = QSettingsPlus::createQSettings(this); settings.beginGroup("ApplicationNames"); QStringList applicationKeys = settings.childKeys(); for (const QString &applicationName : applicationKeys) { WindowData data; data.importDataFromSetting(settings.value(applicationName).toString()); QProcessListItem *pli = new QProcessListItem(data, ui->listApplications); pli->setFlags(pli->flags()); ui->listApplications->addItem(pli); } QListWidgetItem(); } WindowFinderDialogue::~WindowFinderDialogue() { delete ui; } void WindowFinderDialogue::changeEvent(QEvent *event) { if (event->type() == QEvent::ActivationChange) { if (!this->isActiveWindow()) { this->timerWindowFinder = new QTimer(); QObject::connect(this->timerWindowFinder, &QTimer::timeout, this, &WindowFinderDialogue::windowFound); this->timerWindowFinder->setSingleShot(true); this->timerWindowFinder->start(250); } } QWidget::changeEvent(event); } void WindowFinderDialogue::windowFound() { this->capturedWindow = WindowFinder::getFrontmostWindowProcess(); QSettings settings = QSettingsPlus::createQSettings(this); settings.beginGroup("ApplicationNames"); if (settings.contains(this->capturedWindow.processName)) { return; } ui->labelInstructions->setHidden(true); this->widgetApplicationInfo->setHidden(false); this->widgetApplicationInfo->setTextData(this->capturedWindow.processName, this->capturedWindow.processName, this->capturedWindow.processPath, this->capturedWindow.processWindowTitle); settings.setValue(this->capturedWindow.processName, QString("%1%2%3%4%5").arg(this->capturedWindow.processName, QSettingsPlus::keyDataSeparator(), this->capturedWindow.processPath, QSettingsPlus::keyDataSeparator(), this->capturedWindow.processWindowTitle)); QProcessListItem *pli = new QProcessListItem(this->capturedWindow, ui->listApplications); pli->setFlags(pli->flags()); ui->listApplications->addItem(pli); pli->setSelected(true); } void WindowFinderDialogue::showListContextMenu(const QPoint &pos) { if (ui->listApplications->selectedItems().size() > 0) { QPoint globalPos = ui->listApplications->mapToGlobal(pos); QMenu myMenu; myMenu.addAction("Delete selected", this, &WindowFinderDialogue::eraseListItem); myMenu.exec(globalPos); } } void WindowFinderDialogue::updateListItem(const QString &text) { QList items = ui->listApplications->selectedItems(); if (items.size() == 1) { QProcessListItem *pli = (QProcessListItem *) items.first(); pli->updateText(text); } } void WindowFinderDialogue::eraseListItem() { QSettings settings = QSettingsPlus::createQSettings(this); settings.beginGroup("ApplicationNames"); QList items = ui->listApplications->selectedItems(); for (QListWidgetItem *item : items) { settings.remove(item->text()); ui->listApplications->removeItemWidget(item); delete item; } } void WindowFinderDialogue::loadNewApplicationData() { QList items = ui->listApplications->selectedItems(); switch (items.size()) { case 0: { this->setWidgetState(WindowPanelState::INSTRUCTIONS); } break; case 1: { QProcessListItem *pli = (QProcessListItem *) items.first(); const WindowData &windowData = pli->getWindowData(); this->widgetApplicationInfo->setTextData(pli->text(), windowData.processName, windowData.processPath, windowData.processWindowTitle); this->setWidgetState(WindowPanelState::EDITOR); } break; } } void WindowFinderDialogue::setWidgetState(const WindowPanelState &newState) { switch (newState) { case WindowPanelState::INSTRUCTIONS: ui->labelInstructions->setHidden(false); this->widgetApplicationInfo->setHidden(true); break; case WindowPanelState::EDITOR: ui->labelInstructions->setHidden(true); this->widgetApplicationInfo->setHidden(false); break; } }