Rabbit Remote Control 0.0.34
Loading...
Searching...
No Matches
ScreenCapture.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QLoggingCategory>
4#include <QApplication>
5#include <QDesktopServices>
6#include "ScreenCapture.h"
7#include "DlgCapture.h"
8#include "RabbitCommonTools.h"
9#include "PluginClient.h"
10
11static Q_LOGGING_CATEGORY(log, "Screen.Capture")
13 : CConnecter(plugin)
14 , m_pWidget(nullptr)
15{
16 qDebug(log) << Q_FUNC_INFO;
17}
18
19CScreenCapture::~CScreenCapture()
20{
21 qDebug(log) << Q_FUNC_INFO;
22}
23
25{
26 return 0;
27}
28
30{
31 bool check = false;
32 qDebug(log) << Q_FUNC_INFO;
33 Q_ASSERT(!m_pWidget);
34 m_pWidget = new QVideoWidget();
35 if(!m_pWidget) {
36 qCritical(log) << "new QVideoWidget() fail";
37 return -1;
38 }
39 m_pWidget->setFocusPolicy(Qt::WheelFocus);
40 m_pWidget->installEventFilter(this);
41
42 int nRet = SetParameter(&m_Parameter);
43 if(nRet) return nRet;
44
45 CPluginClient* plugin = GetPlugClient();
46 QString szTitle(plugin->DisplayName());
47 m_Menu.setTitle(szTitle);
48 m_Menu.setToolTip(szTitle);
49 m_Menu.setStatusTip(szTitle);
50 m_Menu.setWhatsThis(szTitle);
51 m_Menu.setIcon(plugin->Icon());
52 check = m_Menu.addAction(
53 QIcon::fromTheme("media-playback-start"), tr("Start"),
54 this, SLOT(slotStart()));
55 Q_ASSERT(check);
56 check = m_Menu.addAction(
57 QIcon::fromTheme("media-playback-stop"), tr("Stop"),
58 this, SLOT(slotStop()));
59 Q_ASSERT(check);
60
61 check = connect(
62 &m_ScreenCapture, &QScreenCapture::errorOccurred,
63 this, [&](QScreenCapture::Error error, const QString &errorString){
64 qDebug(log) << "Capture screen error occurred:" << error << errorString;
65 slotStop();
66 emit sigError(error, errorString);
67 });
68 Q_ASSERT(check);
69 check = connect(
70 &m_WindowCapture, &QWindowCapture::errorOccurred,
71 this, [&](QWindowCapture::Error error, const QString &errorString){
72 qDebug(log) << "Capture windows error occurred:" << error << errorString;
73 slotStop();
74 emit sigError(error, errorString);
75 });
76 Q_ASSERT(check);
77
78 check = connect(
79 &m_Recorder, &QMediaRecorder::errorOccurred,
80 this, [&](QMediaRecorder::Error error, const QString &errorString) {
81 qDebug(log) << "Recorder error occurred:" << error << errorString;
82 slotStop();
83 emit sigError(error, errorString);
84 });
85 Q_ASSERT(check);
86 check = connect(
87 &m_Recorder, &QMediaRecorder::recorderStateChanged,
88 this, [&](QMediaRecorder::RecorderState state){
89 qDebug(log) << "Recorder state changed:" << state;
90 if(QMediaRecorder::StoppedState == state)
91 switch(m_Parameter.m_Record.GetEndAction())
92 {
93 case CParameterRecord::ENDACTION::OpenFile:
94 QDesktopServices::openUrl(QUrl::fromLocalFile(m_szRecordFile));
95 break;
96 case CParameterRecord::ENDACTION::OpenFolder: {
97 QFileInfo fi(m_szRecordFile);
98 QDesktopServices::openUrl(QUrl::fromLocalFile(fi.absolutePath()));
99 break;
100 }
101 default:
102 break;
103 }
104 });
105 Q_ASSERT(check);
106 check = connect(
107 &m_Recorder, &QMediaRecorder::actualLocationChanged,
108 this, [&](const QUrl &location){
109 qInfo(log) << "Recorder actual location changed:" << location;
110 m_szRecordFile = location.toLocalFile();
111 });
112 Q_ASSERT(check);
113 check = connect(
114 &m_ImageCapture, &QImageCapture::errorOccurred,
115 this, [&](int id, QImageCapture::Error error, const QString &errorString) {
116 qDebug(log) << "Capture image error occurred:" << id << error << errorString;
117 slotStop();
118 emit sigError(error, errorString);
119 });
120 Q_ASSERT(check);
121 check = connect(
122 &m_ImageCapture, &QImageCapture::imageCaptured,
123 this, [&](int id, const QImage &image){
124 qDebug(log) << "Capture image:" << id << image;
125 QString szFile = m_Parameter.m_Record.GetImageFile(true);
126 if(!image.save(szFile, "PNG"))
127 {
128 qCritical(log) << "Capture image save to file fail." << szFile;
129 slotStop();
130 return;
131 }
132 qDebug(log) << "Capture image to file:" << szFile;
133 switch(m_Parameter.m_Record.GetEndAction())
134 {
135 case CParameterRecord::ENDACTION::OpenFile: {
136 bool bRet = QDesktopServices::openUrl(QUrl::fromLocalFile(szFile));
137 if(!bRet)
138 qCritical(log) << "Fail: Open capture image file" << szFile;
139 break;
140 }
141 case CParameterRecord::ENDACTION::OpenFolder: {
142 QFileInfo fi(szFile);
143 QDesktopServices::openUrl(QUrl::fromLocalFile(fi.absolutePath()));
144 break;
145 }
146 default:
147 break;
148 }
149 });
150 Q_ASSERT(check);
151 return 0;
152}
153
155{
156 if(m_pWidget)
157 delete m_pWidget;
158 return 0;
159}
160
162{
163 return m_pWidget;
164}
165
167{
168 return nullptr;
169}
170
171int CScreenCapture::Connect()
172{
173 int nRet = 0;
174 slotStart();
175 emit sigConnected();
176 return nRet;
177}
178
179int CScreenCapture::DisConnect()
180{
181 int nRet = 0;
182 slotStop();
183 emit sigDisconnected();
184 return nRet;
185}
186
187int CScreenCapture::slotStart()
188{
189 qDebug(log) << "CScreenCapture::slotStart()";
190 int nRet = 0;
191 CDlgCapture dlg(&m_Parameter);
192 nRet = RC_SHOW_WINDOW(&dlg);
193 if(QDialog::Accepted != nRet)
194 return 0;
195
196 int nIndex = m_Parameter.GetScreen();
197 if(m_Parameter.GetTarget() == CParameterScreenCapture::TARGET::Screen
198 && -1 < nIndex && nIndex < QApplication::screens().size()) {
199 m_ScreenCapture.setScreen(QApplication::screens().at(nIndex));
200 m_CaptureSessioin.setScreenCapture(&m_ScreenCapture);
201 m_ScreenCapture.start();
202 }else
203 m_CaptureSessioin.setScreenCapture(nullptr);
204
205 if(m_Parameter.GetTarget() == CParameterScreenCapture::TARGET::Window) {
206 m_CaptureSessioin.setWindowCapture(&m_WindowCapture);
207 m_WindowCapture.setWindow(m_Parameter.GetWindow());
208 m_WindowCapture.start();
209 } else
210 m_CaptureSessioin.setWindowCapture(nullptr);
211
212 if(m_Parameter.GetOperate() == CParameterScreenCapture::OPERATE::Record) {
213 m_CaptureSessioin.setRecorder(&m_Recorder);
214 m_Parameter.m_Record >> m_Recorder;
215 m_Recorder.record();
216 qDebug(log) << "Record to file:" << m_Recorder.actualLocation();
217 }
218 else
219 m_CaptureSessioin.setRecorder(nullptr);
220
221 if(m_Parameter.GetOperate() == CParameterScreenCapture::OPERATE::Shot) {
222 m_CaptureSessioin.setImageCapture(&m_ImageCapture);
223 m_ImageCapture.capture();
224 } else
225 m_CaptureSessioin.setImageCapture(nullptr);
226
227 if(m_pWidget)
228 m_CaptureSessioin.setVideoOutput(m_pWidget);
229
230 return 0;
231}
232
233int CScreenCapture::slotStop()
234{
235 qDebug(log) << "CScreenCapture::slotStop()";
236 if(m_Parameter.GetTarget() == CParameterScreenCapture::TARGET::Screen)
237 m_ScreenCapture.stop();
238 if(m_Parameter.GetTarget() == CParameterScreenCapture::TARGET::Window)
239 m_WindowCapture.stop();
240
241 if(m_Parameter.GetOperate() == CParameterScreenCapture::OPERATE::Record)
242 m_Recorder.stop();
243
244 return 0;
245}
246
247bool CScreenCapture::eventFilter(QObject *watched, QEvent *event)
248{
249 //qDebug(log) << Q_FUNC_INFO << event;
250 if(m_pWidget == watched)
251 {
252 switch(event->type()){
253 case QEvent::FocusIn:
254 {
255 qDebug(log) << Q_FUNC_INFO << event;
256 emit sigViewerFocusIn(m_pWidget);
257 break;
258 }
259 default:
260 break;
261 }
262 }
263 return false;
264}
Connecter interface.
Definition Connecter.h:62
void sigConnected()
Successful connection signal.
void sigDisconnected()
Successful disconnection signal.
virtual int SetParameter(CParameter *p)
Set parameters.
void sigError(const int nError, const QString &szError)
Triggered when an error is generated.
void sigViewerFocusIn(QWidget *pView)
The view is focus.
The plugin interface.
virtual const QString DisplayName() const
The plugin display name.
virtual QWidget * GetViewer() override
Get Viewer.
virtual QDialog * OnOpenDialogSettings(QWidget *parent) override
Open settgins dialog.
virtual qint16 Version() override
Version.
virtual int Initial() override
Initial parameters and resource.
virtual int Clean() override
Clean parameters and resource.