173 lines
5.2 KiB
C++
173 lines
5.2 KiB
C++
#include "windowfinderdialogue.h"
|
|
#include "ui_windowfinderdialogue.h"
|
|
|
|
#include "Widgets/applicationinfowidget.h"
|
|
|
|
#include "QtImprovements/qsettingsplus.h"
|
|
#include "Widgets/qprocesslistitem.h"
|
|
|
|
#include <QAbstractButton>
|
|
#include <QMenu>
|
|
#include <QMessageBox>
|
|
#include <QTimer>
|
|
|
|
#include <QDebug>
|
|
|
|
|
|
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<QListWidgetItem *> 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<QListWidgetItem *> items = ui->listApplications->selectedItems();
|
|
for (QListWidgetItem *item : items) {
|
|
settings.remove(item->text());
|
|
ui->listApplications->removeItemWidget(item);
|
|
delete item;
|
|
}
|
|
}
|
|
|
|
|
|
void WindowFinderDialogue::loadNewApplicationData()
|
|
{
|
|
QList<QListWidgetItem *> 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;
|
|
}
|
|
}
|