Loading...
Searching...
No Matches
QmlProcess.hpp
1#pragma once
2#include <QProcess>
3#include <QQmlEngine>
4
5#include <verdigris>
6
7namespace JS
8{
9class QmlProcess : public QProcess
10{
11 W_OBJECT(QmlProcess)
12public:
13 explicit QmlProcess(QObject* parent = nullptr);
14 ~QmlProcess() override;
15
16 bool running() const { return state() == Running; }
17
18 // Getters wrapping QProcess methods for verdigris binding
19 QString program() const { return QProcess::program(); }
20 QStringList arguments() const { return QProcess::arguments(); }
21 QString workingDirectory() const { return QProcess::workingDirectory(); }
22 QProcess::ProcessState processState() const { return QProcess::state(); }
23 QProcess::ProcessError processError() const { return QProcess::error(); }
24 int exitCode() const { return QProcess::exitCode(); }
25 QProcess::ExitStatus exitStatus() const { return QProcess::exitStatus(); }
26 qint64 processId() const { return QProcess::processId(); }
27
28 QString standardOutput() const { return m_standardOutput; }
29 QString standardError() const { return m_standardError; }
30
31 // Invokable methods for QML
32 void start();
33 W_INVOKABLE(start);
34 void stop();
35 W_INVOKABLE(stop);
36 void kill();
37 W_INVOKABLE(kill);
38 void clearOutput();
39 W_INVOKABLE(clearOutput);
40 void write(const QString& data);
41 W_INVOKABLE(write);
42
43 // Custom setters that wrap QProcess setters and emit signals
44 void setProgram(const QString& program);
45 void setArguments(const QStringList& arguments);
46 void setWorkingDirectory(const QString& dir);
47
48 // Signals
49 void started() W_SIGNAL(started);
50 void finished(int exitCode, QProcess::ExitStatus status)
51 W_SIGNAL(finished, exitCode, status);
52
53 void programChanged() W_SIGNAL(programChanged);
54 void argumentsChanged() W_SIGNAL(argumentsChanged);
55 void workingDirectoryChanged() W_SIGNAL(workingDirectoryChanged);
56 void processStateChanged() W_SIGNAL(processStateChanged);
57 void runningChanged() W_SIGNAL(runningChanged);
58 void processErrorChanged() W_SIGNAL(processErrorChanged);
59 void exitCodeChanged() W_SIGNAL(exitCodeChanged);
60 void exitStatusChanged() W_SIGNAL(exitStatusChanged);
61 void standardOutputChanged() W_SIGNAL(standardOutputChanged);
62 void standardErrorChanged() W_SIGNAL(standardErrorChanged);
63
64 void outputLineReceived(const QString& line) W_SIGNAL(outputLineReceived, line);
65 void errorLineReceived(const QString& line) W_SIGNAL(errorLineReceived, line);
66
67 void lineReceived(const QString& line, bool isError)
68 W_SIGNAL(lineReceived, line, isError);
69
70 void onStarted();
71 W_SLOT(onStarted);
72 void onReadyReadStandardOutput();
73 W_SLOT(onReadyReadStandardOutput);
74 void onReadyReadStandardError();
75 W_SLOT(onReadyReadStandardError);
76 void onStateChanged(QProcess::ProcessState newState);
77 W_SLOT(onStateChanged);
78 void onFinished(int code, QProcess::ExitStatus status);
79 W_SLOT(onFinished);
80 void onErrorOccurred(QProcess::ProcessError error);
81 W_SLOT(onErrorOccurred);
82
83 W_PROPERTY(QString, program READ program WRITE setProgram NOTIFY programChanged)
84 W_PROPERTY(
85 QStringList, arguments READ arguments WRITE setArguments NOTIFY argumentsChanged)
86 W_PROPERTY(
87 QString, workingDirectory READ workingDirectory WRITE setWorkingDirectory NOTIFY
88 workingDirectoryChanged)
89
90 // State
91 W_PROPERTY(ProcessState, processState READ processState NOTIFY processStateChanged)
92 W_PROPERTY(bool, running READ running NOTIFY runningChanged)
93 W_PROPERTY(ProcessError, processError READ processError NOTIFY processErrorChanged)
94 W_PROPERTY(int, exitCode READ exitCode NOTIFY exitCodeChanged)
95 W_PROPERTY(ExitStatus, exitStatus READ exitStatus NOTIFY exitStatusChanged)
96 W_PROPERTY(qint64, processId READ processId NOTIFY started)
97
98 // Accumulated output (convenience for QML bindings)
99 W_PROPERTY(QString, standardOutput READ standardOutput NOTIFY standardOutputChanged)
100 W_PROPERTY(QString, standardError READ standardError NOTIFY standardErrorChanged)
101
102private:
103 QString m_standardOutput;
104 QString m_standardError;
105 QByteArray m_stdoutBuffer;
106 QByteArray m_stderrBuffer;
107};
108}
109
110W_REGISTER_ARGTYPE(QProcess::ProcessError)
111W_REGISTER_ARGTYPE(QProcess::ExitStatus)
112W_REGISTER_ARGTYPE(QProcess::ProcessState)
Definition QmlProcess.hpp:10