aero-applets/run-applet/runapplet.cpp

116 lines
3.2 KiB
C++

#include "runapplet.h"
#include "ui_runapplet.h"
#include "utils.hpp"
#include <QLineEdit>
#include <QProcess>
#include <QMessageBox>
#include <QSettings>
#include <QFileDialog>
#include <QDesktopServices>
#include <QMimeDatabase>
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, [&]() {
QFileDialog dialog;
dialog.setWindowTitle(tr("Browse"));
dialog.setMimeTypeFilters({"application/x-executable"});
dialog.exec();
QStringList files = dialog.selectedFiles();
QString file = files.size() == 1 ? files[0] : "";
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]));
}
// If the file exists and is not an executable, use QDesktopServices instead
QMimeDatabase mimeDb;
QMimeType mime = mimeDb.mimeTypeForFile(args[0]);
if (QFile::exists(command) && mime.name() != "application/x-executable") {
QDesktopServices::openUrl(QUrl::fromLocalFile(command));
return;
}
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());
}