Compare commits
2 Commits
WIP/specia
...
master
Author | SHA1 | Date | |
---|---|---|---|
8a47838d94 | |||
89c9cc573e |
@ -30,15 +30,17 @@ EntryConfig EntryProvider::readFromDesktopFile(const QString &path)
|
|||||||
QTextStream stream(&file);
|
QTextStream stream(&file);
|
||||||
// There should be nothing preceding this group in the desktop entry file but possibly one or more comments.
|
// There should be nothing preceding this group in the desktop entry file but possibly one or more comments.
|
||||||
// https://standards.freedesktop.org/desktop-entry-spec/latest/ar01s03.html#group-header
|
// https://standards.freedesktop.org/desktop-entry-spec/latest/ar01s03.html#group-header
|
||||||
QString firstLine;
|
// Ignore that as there some that violate that in the wild
|
||||||
|
const QString startSection = "[Desktop Entry]";
|
||||||
|
QString line;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
firstLine = stream.readLine().trimmed();
|
line = stream.readLine().trimmed();
|
||||||
} while(!stream.atEnd() && (firstLine.isEmpty() || firstLine[0] == '#'));
|
} while(!stream.atEnd() && line != startSection);
|
||||||
|
|
||||||
if(firstLine != "[Desktop Entry]")
|
if(line != startSection)
|
||||||
{
|
{
|
||||||
throw ConfigFormatException(".desktop file does not start with [Desktop Entry]: " + path.toStdString());
|
throw ConfigFormatException(".desktop file does not contain [Desktop Entry] section: " + path.toStdString());
|
||||||
}
|
}
|
||||||
|
|
||||||
while(!stream.atEnd())
|
while(!stream.atEnd())
|
||||||
|
@ -12,8 +12,6 @@ HEADERS += calculationengine.h \
|
|||||||
entrypushbutton.h \
|
entrypushbutton.h \
|
||||||
settingsprovider.h \
|
settingsprovider.h \
|
||||||
singleinstanceserver.h \
|
singleinstanceserver.h \
|
||||||
specialcommandconfig.h \
|
|
||||||
textoutputlabel.h \
|
|
||||||
window.h
|
window.h
|
||||||
SOURCES += calculationengine.cpp \
|
SOURCES += calculationengine.cpp \
|
||||||
entryprovider.cpp \
|
entryprovider.cpp \
|
||||||
@ -21,7 +19,6 @@ SOURCES += calculationengine.cpp \
|
|||||||
main.cpp \
|
main.cpp \
|
||||||
settingsprovider.cpp \
|
settingsprovider.cpp \
|
||||||
singleinstanceserver.cpp \
|
singleinstanceserver.cpp \
|
||||||
textoutputlabel.cpp \
|
|
||||||
window.cpp
|
window.cpp
|
||||||
QT += widgets sql network
|
QT += widgets sql network
|
||||||
QT_CONFIG -= no-pkg-config
|
QT_CONFIG -= no-pkg-config
|
||||||
|
@ -38,28 +38,3 @@ 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,7 +3,6 @@
|
|||||||
|
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include "specialcommandconfig.h"
|
|
||||||
|
|
||||||
class SettingsProvider
|
class SettingsProvider
|
||||||
{
|
{
|
||||||
@ -18,7 +17,6 @@ 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
|
||||||
|
@ -1,37 +0,0 @@
|
|||||||
#include "textoutputlabel.h"
|
|
||||||
|
|
||||||
TextoutputLabel::TextoutputLabel()
|
|
||||||
{
|
|
||||||
QFont font;
|
|
||||||
font.setPointSize(48);
|
|
||||||
font.setBold(true);
|
|
||||||
this->setFont(font);
|
|
||||||
this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
|
||||||
this->setAlignment(Qt::AlignCenter);
|
|
||||||
this->setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
|
|
||||||
}
|
|
||||||
|
|
||||||
void TextoutputLabel::setText(const QString &text)
|
|
||||||
{
|
|
||||||
QLabel::setText(text);
|
|
||||||
QFont currentFont = this->font();
|
|
||||||
int calculatedPointSize = currentFont.pointSize();
|
|
||||||
QFontMetrics fm(currentFont);
|
|
||||||
int contentWidth = this->contentsRect().width() - this->margin();
|
|
||||||
while(calculatedPointSize < 48 && fm.boundingRect(this->text()).width() < contentWidth)
|
|
||||||
{
|
|
||||||
calculatedPointSize += 1;
|
|
||||||
currentFont.setPointSize(calculatedPointSize);
|
|
||||||
fm = QFontMetrics(currentFont);
|
|
||||||
}
|
|
||||||
while(fm.boundingRect(this->text()).width() >= contentWidth)
|
|
||||||
{
|
|
||||||
calculatedPointSize -= 1;
|
|
||||||
currentFont.setPointSize(calculatedPointSize);
|
|
||||||
fm = QFontMetrics(currentFont);
|
|
||||||
}
|
|
||||||
this->setFont(currentFont);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
|||||||
#ifndef TEXTOUTPUTLABEL_H
|
|
||||||
#define TEXTOUTPUTLABEL_H
|
|
||||||
#include <QLabel>
|
|
||||||
|
|
||||||
class TextoutputLabel : public QLabel
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
TextoutputLabel();
|
|
||||||
virtual void setText(const QString &text);
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // TEXTOUTPUTLABEL_H
|
|
82
window.cpp
82
window.cpp
@ -30,7 +30,6 @@
|
|||||||
|
|
||||||
#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;
|
||||||
@ -39,7 +38,13 @@ Window::Window(EntryProvider &entryProvider, SettingsProvider &configProvider)
|
|||||||
initFromConfig();
|
initFromConfig();
|
||||||
this->lineEdit->installEventFilter(this);
|
this->lineEdit->installEventFilter(this);
|
||||||
this->setAcceptDrops(true);
|
this->setAcceptDrops(true);
|
||||||
|
QFont font;
|
||||||
|
font.setPointSize(48);
|
||||||
|
font.setBold(true);
|
||||||
|
calculationResultLabel.setFont(font);
|
||||||
|
calculationResultLabel.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||||
|
calculationResultLabel.setAlignment(Qt::AlignCenter);
|
||||||
|
calculationResultLabel.setContextMenuPolicy(Qt::ContextMenuPolicy::CustomContextMenu);
|
||||||
connect(&calculationResultLabel, &QLabel::customContextMenuRequested, this,
|
connect(&calculationResultLabel, &QLabel::customContextMenuRequested, this,
|
||||||
&Window::showCalculationResultContextMenu);
|
&Window::showCalculationResultContextMenu);
|
||||||
}
|
}
|
||||||
@ -54,7 +59,6 @@ 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)
|
||||||
{
|
{
|
||||||
@ -283,22 +287,34 @@ void Window::clearGrid()
|
|||||||
buttonsInGrid.clear();
|
buttonsInGrid.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Window::showGrowingOutputText(QString text)
|
|
||||||
{
|
|
||||||
clearGrid();
|
|
||||||
calculationResultLabel.setText(text);
|
|
||||||
calculationResultLabel.setVisible(true);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
grid->addWidget(&calculationResultLabel, 0, 0);
|
|
||||||
}
|
|
||||||
void Window::addCalcResult(const QString &expression)
|
void Window::addCalcResult(const QString &expression)
|
||||||
{
|
{
|
||||||
|
clearGrid();
|
||||||
currentCalculationResult = calcEngine.evaluate(expression);
|
currentCalculationResult = calcEngine.evaluate(expression);
|
||||||
QString labelText = expression + ": " + currentCalculationResult;
|
QString labelText = expression + ": " + currentCalculationResult;
|
||||||
showGrowingOutputText(labelText);
|
calculationResultLabel.setText(labelText);
|
||||||
|
calculationResultLabel.setVisible(true);
|
||||||
|
|
||||||
|
QFont currentFont = calculationResultLabel.font();
|
||||||
|
int calculatedPointSize = currentFont.pointSize();
|
||||||
|
QFontMetrics fm(currentFont);
|
||||||
|
int contentWidth = calculationResultLabel.contentsRect().width() - calculationResultLabel.margin();
|
||||||
|
while(calculatedPointSize < 48 && fm.boundingRect(labelText).width() < contentWidth)
|
||||||
|
{
|
||||||
|
calculatedPointSize += 1;
|
||||||
|
currentFont.setPointSize(calculatedPointSize);
|
||||||
|
fm = QFontMetrics(currentFont);
|
||||||
|
}
|
||||||
|
while(fm.boundingRect(labelText).width() >= contentWidth)
|
||||||
|
{
|
||||||
|
calculatedPointSize -= 1;
|
||||||
|
currentFont.setPointSize(calculatedPointSize);
|
||||||
|
fm = QFontMetrics(currentFont);
|
||||||
|
}
|
||||||
|
|
||||||
|
calculationResultLabel.setFont(currentFont);
|
||||||
|
|
||||||
|
grid->addWidget(&calculationResultLabel, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// main problem here there is no easy event compression (clearing emit queue and only processing the last one)
|
// main problem here there is no easy event compression (clearing emit queue and only processing the last one)
|
||||||
@ -320,18 +336,14 @@ void Window::lineEditTextChanged(QString text)
|
|||||||
addPATHSuggestion(text);
|
addPATHSuggestion(text);
|
||||||
if(this->grid->count() == 0)
|
if(this->grid->count() == 0)
|
||||||
{
|
{
|
||||||
QStringList arguments = QProcess::splitCommand(text);
|
QStringList arguments = text.split(" ");
|
||||||
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;
|
||||||
e.command = command;
|
if(arguments.length() > 1)
|
||||||
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;
|
||||||
|
|
||||||
@ -413,28 +425,6 @@ 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)
|
||||||
|
10
window.h
10
window.h
@ -36,8 +36,6 @@
|
|||||||
#include "entrypushbutton.h"
|
#include "entrypushbutton.h"
|
||||||
#include "calculationengine.h"
|
#include "calculationengine.h"
|
||||||
#include "settingsprovider.h"
|
#include "settingsprovider.h"
|
||||||
#include "specialcommandconfig.h"
|
|
||||||
#include "textoutputlabel.h"
|
|
||||||
|
|
||||||
class RankedButton
|
class RankedButton
|
||||||
{
|
{
|
||||||
@ -61,8 +59,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;
|
QLabel calculationResultLabel;
|
||||||
TextoutputLabel calculationResultLabel;
|
|
||||||
QString currentCalculationResult;
|
QString currentCalculationResult;
|
||||||
QString queuedFileSearch;
|
QString queuedFileSearch;
|
||||||
QString queuedContentSearch;
|
QString queuedContentSearch;
|
||||||
@ -88,10 +85,7 @@ 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;
|
private slots:
|
||||||
void executeSpecialCommand(const SpecialCommandConfig &config, QStringList arguments);
|
|
||||||
void showGrowingOutputText(QString text);
|
|
||||||
private slots:
|
|
||||||
void lineEditReturnPressed();
|
void lineEditReturnPressed();
|
||||||
void showCalculationResultContextMenu(const QPoint &point);
|
void showCalculationResultContextMenu(const QPoint &point);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user