99 lines
2.7 KiB
C++
99 lines
2.7 KiB
C++
#include "runapplet.h"
|
|
#include "ui_runapplet.h"
|
|
#include "utils.hpp"
|
|
|
|
#include <QLineEdit>
|
|
#include <QProcess>
|
|
#include <QMessageBox>
|
|
#include <QSettings>
|
|
#include <QFileDialog>
|
|
|
|
RunApplet::RunApplet(QWidget *parent)
|
|
: QDialog(parent)
|
|
, ui(new Ui::RunApplet)
|
|
{
|
|
ui->setupUi(this);
|
|
setFixedSize(400, 175);
|
|
|
|
restoreState();
|
|
|
|
ui->label->setPixmap(QIcon::fromTheme("system-run-symbolic").pixmap(42, 42));
|
|
// https://forum.qt.io/post/291563
|
|
ui->cancelBtn->setIcon(style()->standardIcon(QStyle::SP_DialogCancelButton));
|
|
ui->okBtn->setIcon(style()->standardIcon(QStyle::SP_DialogOkButton));
|
|
ui->browseBtn->setIcon(style()->standardIcon(QStyle::SP_DialogOpenButton));
|
|
|
|
connect(ui->cancelBtn, &QPushButton::clicked, this, [&]() {
|
|
qApp->quit();
|
|
});
|
|
|
|
connect(ui->okBtn, &QPushButton::clicked, this, [&]() {
|
|
runApp(ui->comboBox->currentText());
|
|
});
|
|
|
|
connect(ui->browseBtn, &QPushButton::clicked, this, [&]() {
|
|
QString file = QFileDialog::getOpenFileName(this, tr("Browse"), "", tr("All Files (*)"));
|
|
if (file == "") return;
|
|
ui->comboBox->lineEdit()->setText(file);
|
|
});
|
|
|
|
connect(ui->comboBox->lineEdit(), &QLineEdit::textChanged, this, [&]() {
|
|
ui->okBtn->setDisabled(ui->comboBox->lineEdit()->text() == "");
|
|
});
|
|
}
|
|
|
|
RunApplet::~RunApplet()
|
|
{
|
|
delete ui;
|
|
}
|
|
|
|
void RunApplet::runApp(QString command) {
|
|
QStringList args;
|
|
|
|
int p_argc;
|
|
uint32_t p_err;
|
|
wchar_t** p_args = wine_parse_command_line(command.toStdWString().c_str(), &p_argc, &p_err);
|
|
|
|
for (int i = 0; i < p_argc; i++) {
|
|
args.push_back(QString::fromWCharArray(p_args[i]));
|
|
}
|
|
|
|
QProcess *process = new QProcess;
|
|
process->setProgram(args[0]);
|
|
args.remove(0);
|
|
process->setArguments(args);
|
|
bool status = process->startDetached();
|
|
|
|
if (status) {
|
|
qApp->quit();
|
|
}
|
|
|
|
QMessageBox messageBox;
|
|
messageBox.critical(0, process->program(), QString(tr("Windows cannot find '%1'. Make sure you typed the name correctly, and then try again.")).arg(process->program()));
|
|
}
|
|
|
|
void RunApplet::closeEvent(QCloseEvent* evt) {
|
|
saveState();
|
|
|
|
return QDialog::closeEvent(evt);
|
|
}
|
|
|
|
void RunApplet::saveState() {
|
|
// https://stackoverflow.com/a/33639884/16255372
|
|
QSettings settings("aero-applets", "run-applet");
|
|
|
|
QStringList commandHistory;
|
|
|
|
for (int i = 0; i < ui->comboBox->count(); i++) {
|
|
commandHistory.append(ui->comboBox->itemText(i));
|
|
}
|
|
|
|
settings.setValue("commandHistory", commandHistory);
|
|
}
|
|
|
|
void RunApplet::restoreState() {
|
|
// https://stackoverflow.com/a/33639884/16255372
|
|
QSettings settings("aero-applets", "run-applet");
|
|
|
|
ui->comboBox->addItems(settings.value("commandHistory").toStringList());
|
|
}
|