Rabbit Remote Control 0.0.34
Loading...
Searching...
No Matches
ConnecterThread.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QLoggingCategory>
4#include <QDesktopServices>
5#include <QUrl>
6
7#include <QWidgetAction>
8#include <QActionGroup>
9
10#include "ConnecterThread.h"
11#include "ConnectThread.h"
12#include "PluginClient.h"
13
14static Q_LOGGING_CATEGORY(log, "Client.Connecter.Thread")
15
17 : CConnecterConnect(plugin)
18 , m_pThread(nullptr)
19 , m_pFrmViewer(nullptr)
20 , m_pScroll(nullptr)
21 , m_pZoomToWindow(nullptr)
22 , m_pZoomAspectRatio(nullptr)
23 , m_pZoomOriginal(nullptr)
24 , m_pZoomIn(nullptr)
25 , m_pZoomOut(nullptr)
26 , m_psbZoomFactor(nullptr)
27 , m_pScreenShot(nullptr)
28#if HAVE_QT6_RECORD
29 , m_pRecord(nullptr)
30 , m_pRecordPause(nullptr)
31#endif
32{
33 qDebug(log) << Q_FUNC_INFO;
34}
35
36CConnecterThread::~CConnecterThread()
37{
38 qDebug(log) << Q_FUNC_INFO;
39}
40
42{
43 qDebug(log) << Q_FUNC_INFO;
44 int nRet = 0;
45 bool check = false;
46
48 if(nRet)
49 return nRet;
50
51 Q_ASSERT(!(m_pFrmViewer && m_pScroll));
52 m_pFrmViewer = new CFrmViewer();
53 m_pScroll = new CFrmScroll(m_pFrmViewer);
54
55 check = connect(m_pFrmViewer, SIGNAL(sigViewerFocusIn(QWidget*)),
56 this, SIGNAL(sigViewerFocusIn(QWidget*)));
57 Q_ASSERT(check);
58
59 nRet = InitialMenu();
60
61 return nRet;
62}
63
65{
66 qDebug(log) << Q_FUNC_INFO;
67 int nRet = 0;
68 if(m_pScroll)
69 {
70 delete m_pScroll;
71 m_pScroll = nullptr;
72 }
73
75 return nRet;
76}
77
78int CConnecterThread::InitialMenu()
79{
80 int nRet = 0;
81 bool check = false;
82
83 QMenu* pMenuZoom = new QMenu(&m_Menu);
84 pMenuZoom->setTitle(tr("Zoom"));
85 pMenuZoom->setIcon(QIcon::fromTheme("zoom"));
86 m_pMenuZoom = m_Menu.addMenu(pMenuZoom);
87 m_pZoomToWindow = pMenuZoom->addAction(
88 QIcon::fromTheme("zoom-fit-best"), tr("Zoom to window"));
89 m_pZoomToWindow->setCheckable(true);
90 check = connect(m_pZoomToWindow, &QAction::toggled, this,
91 [&](){
92 m_pScroll->slotSetAdaptWindows(
94 });
95 Q_ASSERT(check);
96 m_pZoomAspectRatio = pMenuZoom->addAction(
97 QIcon::fromTheme("zoom-aspect-ratio"),
98 tr("Keep aspect ration to windows"));
99 m_pZoomAspectRatio->setCheckable(true);
100 check = connect(m_pZoomAspectRatio, &QAction::toggled, this,
101 [&](){
102 m_pScroll->slotSetAdaptWindows(
104 });
105 Q_ASSERT(check);
106 m_pZoomOriginal = pMenuZoom->addAction(
107 QIcon::fromTheme("zoom-original"), tr("Original"));
108 m_pZoomOriginal->setCheckable(true);
109 check = connect(m_pZoomOriginal, &QAction::toggled, this,
110 [&](){
111 m_pScroll->slotSetAdaptWindows(
113 });
114 Q_ASSERT(check);
115 m_pZoomIn = pMenuZoom->addAction(QIcon::fromTheme("zoom-in"), tr("Zoom in"));
116 m_pZoomIn->setCheckable(true);
117 check = connect(
118 m_pZoomIn, &QAction::toggled, this,
119 [&](){
120 if(m_psbZoomFactor)
121 m_psbZoomFactor->setValue((m_pFrmViewer->GetZoomFactor() + 0.1) * 100);
122 });
123 Q_ASSERT(check);
124 m_pZoomOut = pMenuZoom->addAction(
125 QIcon::fromTheme("zoom-out"), tr("Zoom out"));
126 m_pZoomOut->setCheckable(true);
127 check = connect(
128 m_pZoomOut, &QAction::toggled, this,
129 [&](){
130 if(m_psbZoomFactor)
131 m_psbZoomFactor->setValue((m_pFrmViewer->GetZoomFactor() - 0.1) * 100);
132 });
133 Q_ASSERT(check);
134 QActionGroup* pGBViewZoom = new QActionGroup(this);
135 if(pGBViewZoom) {
136 pGBViewZoom->addAction(m_pZoomToWindow);
137 pGBViewZoom->addAction(m_pZoomAspectRatio);
138 pGBViewZoom->addAction(m_pZoomOriginal);
139 pGBViewZoom->addAction(m_pZoomIn);
140 pGBViewZoom->addAction(m_pZoomOut);
141 }
142 m_psbZoomFactor = new QSpinBox(pMenuZoom);
143 m_psbZoomFactor->setRange(0, 9999999);
144 m_psbZoomFactor->setValue(100);
145 m_psbZoomFactor->setSuffix("%");
146 m_psbZoomFactor->setEnabled(false);
147 m_psbZoomFactor->setFocusPolicy(Qt::NoFocus);
148 check = connect(
149 m_psbZoomFactor, SIGNAL(valueChanged(int)),
150 this, SLOT(slotValueChanged(int)));
151 Q_ASSERT(check);
152 QWidgetAction* pFactor = new QWidgetAction(pMenuZoom);
153 pFactor->setDefaultWidget(m_psbZoomFactor);
154 pMenuZoom->insertAction(m_pZoomOut, pFactor);
155
156 m_Menu.addSeparator();
157 m_pScreenShot = new QAction(QIcon::fromTheme("camera-photo"),
158 tr("ScreenShot"), &m_Menu);
159 check = connect(m_pScreenShot, SIGNAL(triggered()),
160 this, SLOT(slotScreenShot()));
161 Q_ASSERT(check);
162 m_Menu.addAction(m_pScreenShot);
163#if HAVE_QT6_RECORD
164 m_pRecord = new QAction(
165 QIcon::fromTheme("media-record"), tr("Start record"), &m_Menu);
166 m_pRecord->setCheckable(true);
167 check = connect(m_pRecord, SIGNAL(toggled(bool)),
168 this, SLOT(slotRecord(bool)));
169 Q_ASSERT(check);
170 m_Menu.addAction(m_pRecord);
171 m_pRecordPause = new QAction(
172 QIcon::fromTheme("media-playback-pause"), tr("Record pause"), &m_Menu);
173 m_pRecordPause->setCheckable(true);
174 m_pRecordPause->setEnabled(false);
175 check = connect(m_pRecordPause, SIGNAL(toggled(bool)),
176 this, SIGNAL(sigRecordPause(bool)));
177 Q_ASSERT(check);
178 m_Menu.addAction(m_pRecordPause);
179#endif
180
181 m_Menu.addSeparator();
182 if(m_pSettings)
183 m_Menu.addAction(m_pSettings);
184
185 return nRet;
186}
187
189{
190 return m_pScroll;
191}
192
194{
195 qDebug(log) << Q_FUNC_INFO;
196 int nRet = 0;
197 m_pThread = new CConnectThread(this);
198 if(!m_pThread) {
199 qCritical(log) << "new CConnectThread fail";
200 return -2;
201 }
202
203 m_pThread->start();
204
205 return nRet;
206}
207
209{
210 qDebug(log) << Q_FUNC_INFO;
211 int nRet = 0;
212 if(m_pThread)
213 {
214 m_pThread->quit();
215 //Don't delete m_pThread, See CConnectThread
216 m_pThread = nullptr;
217 }
218 return nRet;
219}
220
222{
223 if(GetParameter())
224 if(!GetParameter()->GetShowServerName()
225 || CConnecterConnect::ServerName().isEmpty())
226 {
227 if(!GetParameter()->m_Net.GetHost().isEmpty())
228 return GetParameter()->m_Net.GetHost() + ":"
229 + QString::number(GetParameter()->m_Net.GetPort());
230 }
232}
233
234int CConnecterThread::Load(QSettings &set)
235{
236 int nRet = 0;
237 Q_ASSERT(m_pFrmViewer);
238 nRet = CConnecterConnect::Load(set);
239 if(m_pFrmViewer && GetParameter())
240 {
241 m_pFrmViewer->slotSetZoomFactor(GetParameter()->GetZoomFactor());
242 if(m_psbZoomFactor)
243 m_psbZoomFactor->setValue(m_pFrmViewer->GetZoomFactor() * 100);
244 CFrmViewer::ADAPT_WINDOWS aw = GetParameter()->GetAdaptWindows();
246 if(m_pZoomToWindow)
247 m_pZoomToWindow->setChecked(true);
249 if(m_pZoomAspectRatio)
250 m_pZoomAspectRatio->setChecked(true);
251 } else if(CFrmViewer::ADAPT_WINDOWS::Original == aw) {
252 if(m_pZoomOriginal)
253 m_pZoomOriginal->setChecked(true);
254 } else if(CFrmViewer::ADAPT_WINDOWS::Zoom == aw) {
255 if(m_pZoomIn)
256 m_pZoomIn->setChecked(true);
257 }
258 }
259 return nRet;
260}
261
262int CConnecterThread::Save(QSettings &set)
263{
264 int nRet = 0;
265 Q_ASSERT(GetParameter());
266 if(GetParameter() && m_pFrmViewer)
267 {
268 GetParameter()->SetAdaptWindows(m_pFrmViewer->GetAdaptWindows());
269 GetParameter()->SetZoomFactor(m_pFrmViewer->GetZoomFactor());
270 }
271 nRet = CConnecterConnect::Save(set);
272 return nRet;
273}
274
275#if HAVE_QT6_RECORD
276void CConnecterThread::slotRecord(bool checked)
277{
278 qDebug(log) << Q_FUNC_INFO << checked;
279 QAction* pRecord = qobject_cast<QAction*>(sender());
280 if(pRecord)
281 {
282 if(checked) {
283 //pRecord->setIcon(QIcon::fromTheme("media-playback-stop"));
284 pRecord->setText(tr("Stop record"));
285 } else {
286 //pRecord->setIcon(QIcon::fromTheme("media-playback-start"));
287 pRecord->setText(tr("Start record"));
288 }
289 m_pRecordPause->setEnabled(checked);
290 emit sigRecord(checked);
291 }
292}
293
294void CConnecterThread::slotRecorderStateChanged(
295 QMediaRecorder::RecorderState state)
296{
297 qDebug(log) << Q_FUNC_INFO << state;
298 if(QMediaRecorder::StoppedState == state)
299 {
300 m_pRecord->setChecked(false);
301 m_pRecordPause->setChecked(false);
302 }
303}
304#endif
305
307{
308 if(!m_pScroll || !m_pFrmViewer) return;
309 m_pFrmViewer->slotSetZoomFactor(((double)v) / 100);
310 m_pScroll->slotSetAdaptWindows(CFrmViewer::ADAPT_WINDOWS::Zoom);
311}
312
313void CConnecterThread::slotScreenShot()
314{
315 if(!GetParameter() || !m_pFrmViewer)
316 return;
317 auto &record = GetParameter()->m_Record;
318 QString szFile = record.GetImageFile(true);
319 bool bRet = m_pFrmViewer->GrabImage().save(szFile);
320 if(bRet)
321 qDebug(log) << "Success: save screenshot to" << szFile;
322 else
323 qCritical(log) << "Fail: save screenshot to" << szFile;
324 if(record.GetEndAction() != CParameterRecord::ENDACTION::No)
325 QDesktopServices::openUrl(QUrl::fromLocalFile(szFile));
326}
The class only is used by CConnecterThread.
The connector interface of the plug-in, which is only used by the plug-in.
virtual CParameterBase * GetParameter()
Get parameter.
virtual QString ServerName()
Current connect server name (remote desktop name, if not present, then IP:PORT).
It starts a background thread by default.
virtual int Load(QSettings &set) override
Load parameters.
virtual QWidget * GetViewer() override
Get Viewer.
virtual int Initial() override
Initial parameters and resource.
void slotValueChanged(int v)
emit by zoom menu in the class
virtual int Clean() override
Clean parameters and resource.
virtual int DisConnect() override
emit sigConnected() in CConnectThread::run()
virtual QString ServerName() override
Current connect server name (remote desktop name, if not present, then IP:PORT).
virtual int Connect() override
Start a background thread, and create an instance of CConnect .
virtual int Save(QSettings &set) override
Save parameters.
virtual int Load(QSettings &set)
Load parameters.
virtual Q_INVOKABLE int Clean()
Clean parameters and resource.
virtual int Save(QSettings &set)
Save parameters.
virtual Q_INVOKABLE int Initial()
Initial parameters and resource.
void sigViewerFocusIn(QWidget *pView)
The view is focus.
The scroll form class.
Definition FrmScroll.h:17
A widget which displays output image from a CConnectDesktop and sends input keypresses and mouse acti...
Definition FrmViewer.h:49
ADAPT_WINDOWS
The ADAPT_WINDOWS enum.
Definition FrmViewer.h:61
@ Original
Original desktop size, the left-top of the desktop is aligned with the left-top of the window.
@ Zoom
zoom windows = desktop size * factor
@ KeepAspectRationToWindow
Keep desktop aspectration adapt to windows.
@ ZoomToWindow
Desktop adapt to windows.
double GetZoomFactor() const
Adjust the zoom factor.
The plugin interface.