Begin SpecialCommand handling
Introduce SpecialCommand handling. Currently, we block until the command finishes. SettingsProvider provides a few example, but needs implementation to read this from config.
This commit is contained in:
parent
4814872bcf
commit
65b044e618
@ -12,6 +12,7 @@ HEADERS += calculationengine.h \
|
|||||||
entrypushbutton.h \
|
entrypushbutton.h \
|
||||||
settingsprovider.h \
|
settingsprovider.h \
|
||||||
singleinstanceserver.h \
|
singleinstanceserver.h \
|
||||||
|
specialcommandconfig.h \
|
||||||
textoutputlabel.h \
|
textoutputlabel.h \
|
||||||
window.h
|
window.h
|
||||||
SOURCES += calculationengine.cpp \
|
SOURCES += calculationengine.cpp \
|
||||||
|
@ -38,3 +38,28 @@ QString SettingsProvider::socketPath() const
|
|||||||
{
|
{
|
||||||
return settings->value("singleInstanceSocket", "/tmp/qsrun").toString();
|
return settings->value("singleInstanceSocket", "/tmp/qsrun").toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QVector<SpecialCommandConfig> SettingsProvider::specialCommands() const
|
||||||
|
{
|
||||||
|
QVector<SpecialCommandConfig> result;
|
||||||
|
|
||||||
|
SpecialCommandConfig uname;
|
||||||
|
uname.command = "uname";
|
||||||
|
uname.reqArgCount = 0;
|
||||||
|
uname.immediateProcessing = true;
|
||||||
|
result.append(uname);
|
||||||
|
|
||||||
|
|
||||||
|
SpecialCommandConfig date;
|
||||||
|
date.command = "date";
|
||||||
|
date.reqArgCount = 0;
|
||||||
|
date.immediateProcessing = true;
|
||||||
|
result.append(date);
|
||||||
|
|
||||||
|
SpecialCommandConfig echo;
|
||||||
|
echo.command = "echo";
|
||||||
|
echo.reqArgCount = 0;
|
||||||
|
echo.immediateProcessing = true;
|
||||||
|
result.append(echo);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
#include "specialcommandconfig.h"
|
||||||
|
|
||||||
class SettingsProvider
|
class SettingsProvider
|
||||||
{
|
{
|
||||||
@ -17,6 +18,7 @@ class SettingsProvider
|
|||||||
virtual bool singleInstanceMode() const;
|
virtual bool singleInstanceMode() const;
|
||||||
QString getTerminalCommand() const;
|
QString getTerminalCommand() const;
|
||||||
QString socketPath() const;
|
QString socketPath() const;
|
||||||
|
QVector<SpecialCommandConfig> specialCommands() const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SETTINGSPROVIDER_H
|
#endif // SETTINGSPROVIDER_H
|
||||||
|
40
window.cpp
40
window.cpp
@ -30,6 +30,7 @@
|
|||||||
|
|
||||||
#include "entryprovider.h"
|
#include "entryprovider.h"
|
||||||
#include "window.h"
|
#include "window.h"
|
||||||
|
|
||||||
Window::Window(EntryProvider &entryProvider, SettingsProvider &configProvider)
|
Window::Window(EntryProvider &entryProvider, SettingsProvider &configProvider)
|
||||||
{
|
{
|
||||||
this->entryProvider = &entryProvider;
|
this->entryProvider = &entryProvider;
|
||||||
@ -53,6 +54,7 @@ void Window::initFromConfig()
|
|||||||
{
|
{
|
||||||
this->userEntryButtons = generateEntryButtons(entryProvider->getUserEntries());
|
this->userEntryButtons = generateEntryButtons(entryProvider->getUserEntries());
|
||||||
this->systemEntryButtons = generateEntryButtons(entryProvider->getSystemEntries());
|
this->systemEntryButtons = generateEntryButtons(entryProvider->getSystemEntries());
|
||||||
|
this->specialCommands = settingsProvider->specialCommands();
|
||||||
}
|
}
|
||||||
catch(const ConfigFormatException &e)
|
catch(const ConfigFormatException &e)
|
||||||
{
|
{
|
||||||
@ -318,14 +320,18 @@ void Window::lineEditTextChanged(QString text)
|
|||||||
addPATHSuggestion(text);
|
addPATHSuggestion(text);
|
||||||
if(this->grid->count() == 0)
|
if(this->grid->count() == 0)
|
||||||
{
|
{
|
||||||
QStringList arguments = text.split(" ");
|
QStringList arguments = QProcess::splitCommand(text);
|
||||||
|
QString command = arguments[0];
|
||||||
|
auto specialCommandConfig = getSpecialCommandConfig(command);
|
||||||
|
if(specialCommandConfig)
|
||||||
|
{
|
||||||
|
executeSpecialCommand(specialCommandConfig.value(), arguments);
|
||||||
|
return;
|
||||||
|
}
|
||||||
EntryConfig e;
|
EntryConfig e;
|
||||||
e.name = "Execute: " + text;
|
e.name = "Execute: " + text;
|
||||||
if(arguments.length() > 1)
|
e.command = command;
|
||||||
{
|
e.arguments = arguments;
|
||||||
e.arguments = arguments.mid(1);
|
|
||||||
}
|
|
||||||
e.command = arguments[0];
|
|
||||||
e.iconPath = "utilities-terminal";
|
e.iconPath = "utilities-terminal";
|
||||||
e.type = EntryType::DYNAMIC;
|
e.type = EntryType::DYNAMIC;
|
||||||
|
|
||||||
@ -407,6 +413,28 @@ int Window::rankConfig(const EntryConfig &config, QString filter) const
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::optional<SpecialCommandConfig> Window::getSpecialCommandConfig(QString cmd) const
|
||||||
|
{
|
||||||
|
SpecialCommandConfig result;
|
||||||
|
for(const SpecialCommandConfig &config : this->specialCommands)
|
||||||
|
{
|
||||||
|
if(config.command == cmd)
|
||||||
|
{
|
||||||
|
return config;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return { };
|
||||||
|
}
|
||||||
|
|
||||||
|
void Window::executeSpecialCommand(const SpecialCommandConfig &config, QStringList arguments)
|
||||||
|
{
|
||||||
|
QProcess process;
|
||||||
|
process.start(config.command, arguments.mid(1));
|
||||||
|
process.waitForFinished();
|
||||||
|
QString result = process.readAllStandardOutput();
|
||||||
|
showGrowingOutputText(result);
|
||||||
|
}
|
||||||
|
|
||||||
void Window::filterGridFor(QString filter)
|
void Window::filterGridFor(QString filter)
|
||||||
{
|
{
|
||||||
if(filter.length() > 0)
|
if(filter.length() > 0)
|
||||||
|
4
window.h
4
window.h
@ -36,6 +36,7 @@
|
|||||||
#include "entrypushbutton.h"
|
#include "entrypushbutton.h"
|
||||||
#include "calculationengine.h"
|
#include "calculationengine.h"
|
||||||
#include "settingsprovider.h"
|
#include "settingsprovider.h"
|
||||||
|
#include "specialcommandconfig.h"
|
||||||
#include "textoutputlabel.h"
|
#include "textoutputlabel.h"
|
||||||
|
|
||||||
class RankedButton
|
class RankedButton
|
||||||
@ -60,6 +61,7 @@ class Window : public QWidget
|
|||||||
QVector<EntryPushButton *> userEntryButtons;
|
QVector<EntryPushButton *> userEntryButtons;
|
||||||
QVector<EntryPushButton *> systemEntryButtons;
|
QVector<EntryPushButton *> systemEntryButtons;
|
||||||
QVector<EntryPushButton *> buttonsInGrid;
|
QVector<EntryPushButton *> buttonsInGrid;
|
||||||
|
QVector<SpecialCommandConfig> specialCommands;
|
||||||
TextoutputLabel calculationResultLabel;
|
TextoutputLabel calculationResultLabel;
|
||||||
QString currentCalculationResult;
|
QString currentCalculationResult;
|
||||||
QString queuedFileSearch;
|
QString queuedFileSearch;
|
||||||
@ -86,6 +88,8 @@ class Window : public QWidget
|
|||||||
void closeWindow();
|
void closeWindow();
|
||||||
std::pair<int, int> getNextFreeCell();
|
std::pair<int, int> getNextFreeCell();
|
||||||
int rankConfig(const EntryConfig &config, QString filter) const;
|
int rankConfig(const EntryConfig &config, QString filter) const;
|
||||||
|
std::optional<SpecialCommandConfig> getSpecialCommandConfig(QString cmd) const;
|
||||||
|
void executeSpecialCommand(const SpecialCommandConfig &config, QStringList arguments);
|
||||||
void showGrowingOutputText(QString text);
|
void showGrowingOutputText(QString text);
|
||||||
private slots:
|
private slots:
|
||||||
void lineEditReturnPressed();
|
void lineEditReturnPressed();
|
||||||
|
Loading…
Reference in New Issue
Block a user