Special Commands Handling #41
| @@ -12,6 +12,8 @@ HEADERS += calculationengine.h \ | ||||
|            entrypushbutton.h \ | ||||
|            settingsprovider.h \ | ||||
|            singleinstanceserver.h \ | ||||
|            specialcommandconfig.h \ | ||||
|            textoutputlabel.h \ | ||||
|            window.h | ||||
| SOURCES += calculationengine.cpp \ | ||||
|            entryprovider.cpp \ | ||||
| @@ -19,6 +21,7 @@ SOURCES += calculationengine.cpp \ | ||||
|            main.cpp \ | ||||
|            settingsprovider.cpp \ | ||||
|            singleinstanceserver.cpp \ | ||||
|            textoutputlabel.cpp \ | ||||
|            window.cpp | ||||
| QT += widgets sql network | ||||
| QT_CONFIG -= no-pkg-config | ||||
|   | ||||
							
								
								
									
										
											دودویی (BIN)
										
									
								
								screenshots/calc.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											دودویی (BIN)
										
									
								
								screenshots/calc.png
									
									
									
									
									
										Normal file
									
								
							
										
											فایل باینری نشان داده نشده است.
										
									
								
							| پس از عرض: | ارتفاع: | اندازه: 31 KiB | 
							
								
								
									
										
											دودویی (BIN)
										
									
								
								screenshots/search-libreoffice.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											دودویی (BIN)
										
									
								
								screenshots/search-libreoffice.png
									
									
									
									
									
										Normal file
									
								
							
										
											فایل باینری نشان داده نشده است.
										
									
								
							| پس از عرض: | ارتفاع: | اندازه: 48 KiB | 
							
								
								
									
										
											دودویی (BIN)
										
									
								
								screenshots/startview.jpg
									
									
									
									
									
								
							
							
						
						
									
										
											دودویی (BIN)
										
									
								
								screenshots/startview.jpg
									
									
									
									
									
								
							
										
											فایل باینری نشان داده نشده است.
										
									
								
							| قبل از عرض: | ارتفاع: | اندازه: 112 KiB | 
							
								
								
									
										
											دودویی (BIN)
										
									
								
								screenshots/startview.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											دودویی (BIN)
										
									
								
								screenshots/startview.png
									
									
									
									
									
										Normal file
									
								
							
										
											فایل باینری نشان داده نشده است.
										
									
								
							| پس از عرض: | ارتفاع: | اندازه: 205 KiB | 
| @@ -38,3 +38,28 @@ QString SettingsProvider::socketPath() const | ||||
| { | ||||
| 	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 <stdexcept> | ||||
| #include "specialcommandconfig.h" | ||||
|  | ||||
| class SettingsProvider | ||||
| { | ||||
| @@ -17,6 +18,7 @@ class SettingsProvider | ||||
| 	virtual bool singleInstanceMode() const; | ||||
| 	QString getTerminalCommand() const; | ||||
| 	QString socketPath() const; | ||||
| 	QVector<SpecialCommandConfig> specialCommands() const; | ||||
| }; | ||||
|  | ||||
| #endif // SETTINGSPROVIDER_H | ||||
|   | ||||
							
								
								
									
										37
									
								
								textoutputlabel.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								textoutputlabel.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | ||||
| #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); | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										14
									
								
								textoutputlabel.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								textoutputlabel.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| #ifndef TEXTOUTPUTLABEL_H | ||||
| #define TEXTOUTPUTLABEL_H | ||||
| #include <QLabel> | ||||
|  | ||||
| class TextoutputLabel : public QLabel | ||||
| { | ||||
| public: | ||||
| 	TextoutputLabel(); | ||||
| 	virtual void setText(const QString &text); | ||||
|  | ||||
|  | ||||
| }; | ||||
|  | ||||
| #endif // TEXTOUTPUTLABEL_H | ||||
							
								
								
									
										78
									
								
								window.cpp
									
									
									
									
									
								
							
							
						
						
									
										78
									
								
								window.cpp
									
									
									
									
									
								
							| @@ -30,6 +30,7 @@ | ||||
|  | ||||
| #include "entryprovider.h" | ||||
| #include "window.h" | ||||
|  | ||||
| Window::Window(EntryProvider &entryProvider, SettingsProvider &configProvider) | ||||
| { | ||||
| 	this->entryProvider = &entryProvider; | ||||
| @@ -38,13 +39,7 @@ Window::Window(EntryProvider &entryProvider, SettingsProvider &configProvider) | ||||
| 	initFromConfig(); | ||||
| 	this->lineEdit->installEventFilter(this); | ||||
| 	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, | ||||
| 			&Window::showCalculationResultContextMenu); | ||||
| } | ||||
| @@ -59,6 +54,7 @@ void Window::initFromConfig() | ||||
| 	{ | ||||
| 		this->userEntryButtons = generateEntryButtons(entryProvider->getUserEntries()); | ||||
| 		this->systemEntryButtons = generateEntryButtons(entryProvider->getSystemEntries()); | ||||
| 		this->specialCommands = settingsProvider->specialCommands(); | ||||
| 	} | ||||
| 	catch(const ConfigFormatException &e) | ||||
| 	{ | ||||
| @@ -287,35 +283,23 @@ void Window::clearGrid() | ||||
| 	buttonsInGrid.clear(); | ||||
| } | ||||
|  | ||||
| void Window::addCalcResult(const QString &expression) | ||||
| void Window::showGrowingOutputText(QString text) | ||||
| { | ||||
| 	clearGrid(); | ||||
| 	currentCalculationResult = calcEngine.evaluate(expression); | ||||
| 	QString labelText = expression + ": " + currentCalculationResult; | ||||
| 	calculationResultLabel.setText(labelText); | ||||
| 	calculationResultLabel.setText(text); | ||||
| 	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); | ||||
| } | ||||
| void Window::addCalcResult(const QString &expression) | ||||
| { | ||||
| 	currentCalculationResult = calcEngine.evaluate(expression); | ||||
| 	QString labelText = expression + ": " + currentCalculationResult; | ||||
| 	showGrowingOutputText(labelText); | ||||
|  | ||||
| } | ||||
|  | ||||
| // main problem here there is no easy event compression (clearing emit queue and only processing the last one) | ||||
| void Window::lineEditTextChanged(QString text) | ||||
| @@ -336,14 +320,18 @@ void Window::lineEditTextChanged(QString text) | ||||
| 		addPATHSuggestion(text); | ||||
| 		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; | ||||
| 			e.name = "Execute: " + text; | ||||
| 			if(arguments.length() > 1) | ||||
| 			{ | ||||
| 				e.arguments = arguments.mid(1); | ||||
| 			} | ||||
| 			e.command = arguments[0]; | ||||
| 			e.command = command; | ||||
| 			e.arguments = arguments; | ||||
| 			e.iconPath = "utilities-terminal"; | ||||
| 			e.type = EntryType::DYNAMIC; | ||||
|  | ||||
| @@ -425,6 +413,28 @@ int Window::rankConfig(const EntryConfig &config, QString filter) const | ||||
| 	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) | ||||
| { | ||||
| 	if(filter.length() > 0) | ||||
|   | ||||
							
								
								
									
										10
									
								
								window.h
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								window.h
									
									
									
									
									
								
							| @@ -36,6 +36,8 @@ | ||||
| #include "entrypushbutton.h" | ||||
| #include "calculationengine.h" | ||||
| #include "settingsprovider.h" | ||||
| #include "specialcommandconfig.h" | ||||
| #include "textoutputlabel.h" | ||||
|  | ||||
| class RankedButton | ||||
| { | ||||
| @@ -59,7 +61,8 @@ class Window : public QWidget | ||||
| 	QVector<EntryPushButton *> userEntryButtons; | ||||
| 	QVector<EntryPushButton *> systemEntryButtons; | ||||
| 	QVector<EntryPushButton *> buttonsInGrid; | ||||
| 	QLabel calculationResultLabel; | ||||
| 	QVector<SpecialCommandConfig> specialCommands; | ||||
| 	TextoutputLabel calculationResultLabel; | ||||
| 	QString currentCalculationResult; | ||||
| 	QString queuedFileSearch; | ||||
| 	QString queuedContentSearch; | ||||
| @@ -85,7 +88,10 @@ class Window : public QWidget | ||||
| 	void closeWindow(); | ||||
| 	std::pair<int, int> getNextFreeCell(); | ||||
| 	int rankConfig(const EntryConfig &config, QString filter) const; | ||||
|   private slots: | ||||
| 	std::optional<SpecialCommandConfig> getSpecialCommandConfig(QString cmd) const; | ||||
| 	void executeSpecialCommand(const SpecialCommandConfig &config, QStringList arguments); | ||||
| 	void showGrowingOutputText(QString text); | ||||
| private slots: | ||||
| 	void lineEditReturnPressed(); | ||||
| 	void showCalculationResultContextMenu(const QPoint &point); | ||||
|  | ||||
|   | ||||
		مرجع در شماره جدید
	
	Block a user