MacroBinds/windowfinderdialogue.cpp
2024-09-17 04:05:32 -04:00

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;
}
}