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