玉兔远程控制 0.1.0-bate9
载入中...
搜索中...
未找到
OperateTerminal.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QDialog>
4#include <QApplication>
5#include <QSettings>
6#include <QLoggingCategory>
7#include <QDesktopServices>
8#include <QDir>
9
10#if defined(Q_OS_UNIX)
11#include <unistd.h>
12#endif
13
14#include "ParameterOperate.h"
15#include "Backend.h"
16#include "BackendThread.h"
17#include "OperateTerminal.h"
18#include "Plugin.h"
19
20static Q_LOGGING_CATEGORY(log, "Operate.Terminal")
21
23 : COperate(parent)
24 , m_pTerminal(nullptr)
25 , m_pThread(nullptr)
26 , m_pActionFind(nullptr)
27 , m_pActionOpenWithSystem(nullptr)
28 , m_pParameters(nullptr)
29 , m_pEditCopy(nullptr)
30 , m_pEditPaste(nullptr)
31 , m_pZoomIn(nullptr)
32 , m_pZoomOut(nullptr)
33 , m_pZoomOriginal(nullptr)
34 , m_pClear(nullptr)
35{
36 QTermWidget::addCustomColorSchemeDir(QApplication::applicationDirPath()
37 + QDir::separator() + "color-schemes");
38 QTermWidget::addCustomColorSchemeDir(QApplication::applicationDirPath()
39 + QDir::separator() + ".."
40 + QDir::separator() + "share"
41 + QDir::separator() + "qtermwidget6"
42 + QDir::separator() + "color-schemes");
43 /*QTermWidget::addCustomKeyboardLayoutDir(QApplication::applicationDirPath()
44 + QDir::separator() + "kb-layouts");
45 QTermWidget::addCustomKeyboardLayoutDir(QApplication::applicationDirPath()
46 + QDir::separator() + ".."
47 + QDir::separator() + "share"
48 + QDir::separator() + "qtermwidget6"
49 + QDir::separator() + "kb-layouts");//*/
50 m_pTerminal = new QTermWidget(0);
51 if(!m_pTerminal) {
52 qCritical(log) << "new QTermWidget() fail";
53 return;
54 }
55 m_pTerminal->setAutoClose(true);
56
57 bool check = false;
58 m_pTerminal->setContextMenuPolicy(Qt::CustomContextMenu);
59 check = connect(m_pTerminal, SIGNAL(customContextMenuRequested(const QPoint &)),
60 this, SLOT(slotCustomContextMenu(const QPoint &)));
61 Q_ASSERT(check);
62 check = connect(m_pTerminal, SIGNAL(urlActivated(const QUrl&, bool)),
63 this, SLOT(slotActivateUrl(const QUrl&, bool)));
64 Q_ASSERT(check);
65 // check = connect(m_pTerminal, SIGNAL(titleChanged()),
66 // this, SLOT(slotTerminalTitleChanged()));
67 // Q_ASSERT(check);
68 check = connect(m_pTerminal, SIGNAL(finished()),
69 this, SIGNAL(sigStop()));
70 Q_ASSERT(check);
71 // check = connect(m_pTerminal, SIGNAL(termKeyPressed(QKeyEvent*)),
72 // this, SLOT(slotTermKeyPressed(QKeyEvent*)));
73 // Q_ASSERT(check);
74 check = connect(m_pTerminal, SIGNAL(termGetFocus()),
75 this, SLOT(slotFocusIn()));
76 Q_ASSERT(check);
77 check = connect(m_pTerminal, SIGNAL(termLostFocus()),
78 this, SLOT(slotFocusOut()));
79 Q_ASSERT(check);
80}
81
82COperateTerminal::~COperateTerminal()
83{
84 qDebug(log) << Q_FUNC_INFO;
85 if(m_pTerminal)
86 {
87 m_pTerminal->deleteLater();
88 m_pTerminal = nullptr;
89 }
90}
91
92const QString COperateTerminal::Id()
93{
94 QString szId = COperate::Id();
95 if(GetParameter()) {
96 if(GetParameter()->GetName().isEmpty())
97 szId += "_" + Name();
98 else
99 szId += "_" + GetParameter()->GetName();
100 }
101 static QRegularExpression exp("[-@:/#%!^&* \\.]");
102 szId = szId.replace(exp, "_");
103 return szId;
104}
105
107{
108 QString szName;
109 if(GetParameter())
110 szName = GetParameter()->GetName();
111 if(szName.isEmpty())
112 szName = COperate::Name();
113 return szName;
114}
115
117{
118 QString szDescription;
119 if(!Name().isEmpty())
120 szDescription = tr("Name: ") + Name() + "\n";
121
122 if(!GetTypeName().isEmpty())
123 szDescription += tr("Type: ") + GetTypeName() + "\n";
124
125 if(!Protocol().isEmpty()) {
126 szDescription += tr("Protocol: ") + Protocol();
127#ifdef DEBUG
128 if(!GetPlugin()->DisplayName().isEmpty())
129 szDescription += " - " + GetPlugin()->DisplayName();
130#endif
131 szDescription += "\n";
132 }
133
135 if(GetSecurityLevel() != CSecurityLevel::Level::No) {
136 szDescription += tr("Security level: ");
137 if(!sl.GetUnicodeIcon().isEmpty())
138 szDescription += sl.GetUnicodeIcon() + " ";
139 szDescription += sl.GetString() + "\n";
140 }
141
142 if(!GetPlugin()->Description().isEmpty())
143 szDescription += tr("Description: ") + GetPlugin()->Description();
144
145 return szDescription;
146}
147
148const qint16 COperateTerminal::Version() const
149{
150 return 0;
151}
152
153const QString COperateTerminal::Details()
154{
155 QString szDetails;
156 szDetails = " - " + tr("QTermWidget") + "\n" +
157 " - " + tr("Version:") + " "
158 + QString("%1.%2.%3").arg(QTERMWIDGET_VERSION_MAJOR)
159 .arg(QTERMWIDGET_VERSION_MINOR)
160 .arg(QTERMWIDGET_VERSION_PATCH) + "\n";
161 return szDetails;
162}
163
165{
166 return m_pTerminal;
167}
168
170{
171 return &m_Stats;
172}
173
174int COperateTerminal::Load(QSettings &set)
175{
176 int nRet = 0;
177 auto pPara = GetParameter();
178 Q_ASSERT(pPara);
179 if(!pPara) return -1;
180 nRet = pPara->Load(set);
181 return nRet;
182}
183
184int COperateTerminal::Save(QSettings &set)
185{
186 int nRet = 0;
187 auto pPara = GetParameter();
188 Q_ASSERT(pPara);
189 if(!pPara) return -1;
190 nRet = pPara->Save(set);
191 return nRet;
192}
193
195{
196 int nRet = 0;
197
198 nRet = COperate::Initial();
199 if(nRet)
200 return nRet;
201
202 m_pEditCopy = m_Menu.addAction(QIcon::fromTheme("edit-copy"),
203 tr("Copy selection to clipboard") + "\tCtrl+Shift+C",
204 m_pTerminal, SLOT(copyClipboard()));
205 m_pEditPaste = m_Menu.addAction(QIcon::fromTheme("edit-paste"),
206 tr("Paste clipboard") + "\tCtrl+V",
207 m_pTerminal, SLOT(pasteClipboard()));
208 m_Menu.addAction(tr("Paste selection"), m_pTerminal, SLOT(pasteSelection()));
209 m_Menu.addSeparator();
210 m_pZoomIn = m_Menu.addAction(QIcon::fromTheme("zoom-in"), tr("Zoom in") + "\tCtrl++",
211 m_pTerminal, SLOT(zoomIn()));
212 m_pZoomOut = m_Menu.addAction(QIcon::fromTheme("zoom-out"), tr("Zoom out") + "\tCtrl+-",
213 m_pTerminal, SLOT(zoomOut()));
214 m_pZoomOriginal = m_Menu.addAction(QIcon::fromTheme("zoom-original"), tr("Zoom reset") + "\tCtrl+0",
215 this, SLOT(slotZoomReset()));
216
217 m_Menu.addSeparator();
218 // m_pActionOpenWithSystem = m_Menu.addAction(
219 // QIcon::fromTheme("folder-open"),
220 // tr("Open the selection with the System Associated Program"),
221 // QKeySequence(Qt::CTRL | Qt::Key_O),
222 // [&](){
223 // QString szText = m_pTerminal->selectedText(false);
224 // QUrl url(szText);
225 // qDebug(log) << szText << url;
226 // QDesktopServices::openUrl(url);
227 // });
228 m_pActionFind = m_Menu.addAction(
229 QIcon::fromTheme("edit-find"), tr("Find ......") + "\tCtrl+F",
230 m_pTerminal, &QTermWidget::toggleShowSearchBar);
231
232 m_Menu.addSeparator();
233 m_pClear = m_Menu.addAction(QIcon::fromTheme("edit-clear"),
234 tr("Clear") + "\tCtrl+R",
235 m_pTerminal, SLOT(clear()));
236
237 if(m_pActionSettings) {
238 m_Menu.addSeparator();
239 m_Menu.addAction(m_pActionSettings);
240 }
241
242 return nRet;
243}
244
246{
247 int nRet = 0;
248 nRet = COperate::Clean();
249 return nRet;
250}
251
252int COperateTerminal::Start()
253{
254 int nRet = 0;
255
256 slotUpdateParameter(this);
257 m_pThread = new CBackendThread(this);
258 if(!m_pThread) {
259 qCritical(log) << "new CBackendThread fail";
260 return -2;
261 }
262 m_pThread->start();
263 return nRet;
264}
265
266int COperateTerminal::Stop()
267{
268 qDebug(log) << Q_FUNC_INFO;
269 int nRet = 0;
270 if(m_pThread)
271 {
272 m_pThread->quit();
273 //Don't delete m_pThread, See CBackendThread
274 m_pThread = nullptr;
275 }
276 return nRet;
277}
278
280{
281 return m_pParameters;
282}
283
285{
286 int nRet = 0;
287
288 Q_ASSERT(pPara);
289 Q_ASSERT(!m_pParameters);
290
291 m_pParameters = pPara;
292
293 if(!pPara || !m_pTerminal) return -1;
294
295 bool check = connect(GetParameter(), &CParameter::sigChanged,
296 this, [&](){
297 emit this->sigUpdateParameters(this);
298 });
299 Q_ASSERT(check);
300 check = connect(this, SIGNAL(sigUpdateParameters(COperate*)),
301 this, SLOT(slotUpdateParameter(COperate*)));
302 Q_ASSERT(check);
303
304 return nRet;
305}
306
307void COperateTerminal::slotUpdateParameter(COperate* pOperate)
308{
309 qDebug(log) << Q_FUNC_INFO;
310 if(this != pOperate) return;
311 if(!GetParameter() || !m_pTerminal) return;
312
313 auto pPara = &GetParameter()->m_Terminal;
314
315#if QTERMWIDGET_VERSION >= QT_VERSION_CHECK(0, 9, 0)
316 m_pTerminal->setTerminalSizeHint(pPara->GetSizeHint());
317 m_pTerminal->setBidiEnabled(pPara->GetDirectional());
318 m_pTerminal->disableBracketedPasteMode(pPara->GetDisableBracketedPasteMode());
319#endif
320 m_pTerminal->setTerminalFont(pPara->GetFont());
321 m_pTerminal->setKeyboardCursorShape(pPara->GetCursorShape());
322 m_pTerminal->setColorScheme(pPara->GetColorScheme());
323 m_pTerminal->setScrollBarPosition(pPara->GetScrollBarPosition());
324 m_pTerminal->setFlowControlEnabled(pPara->GetFlowControl());
325 m_pTerminal->setFlowControlWarningEnabled(pPara->GetFlowControlWarning());
326 m_pTerminal->setMotionAfterPasting(pPara->GetMotionAfterPasting());
327 m_pTerminal->setTerminalOpacity(1.0 - pPara->GetTransparency() / 100.0);
328 m_pTerminal->setTerminalBackgroundImage(pPara->GetBackgroupImage());
329
330 m_pTerminal->setKeyBindings(pPara->GetKeyBindings());
331 m_pTerminal->setHistorySize(pPara->GetHistorySize());
332
333 // m_pTerminal->setMonitorActivity(false);
334 // m_pTerminal->setMonitorSilence(false);
335 // m_pTerminal->setBlinkingCursor(true);
336}
337
338void COperateTerminal::slotZoomReset()
339{
340 if(!m_pTerminal) return;
341 CParameterTerminal* pPara = &GetParameter()->m_Terminal;
342 if(!pPara) return;
343 m_pTerminal->setTerminalFont(pPara->GetFont());
344}
345
346void COperateTerminal::slotCustomContextMenu(const QPoint & pos)
347{
348 if(!m_pTerminal) return;
349
350 // QString szText = m_pTerminal->selectedText(false);
351 // m_pActionOpenWithSystem->setVisible(
352 // !szText.isEmpty()
353 // && QUrl(szText).isValid());
354 m_Menu.exec(m_pTerminal->mapToGlobal(pos));
355}
356
357void COperateTerminal::slotActivateUrl(const QUrl& url, bool fromContextMenu)
358{
359 if (QApplication::keyboardModifiers() & Qt::ControlModifier || fromContextMenu) {
360 QDesktopServices::openUrl(url);
361 }
362}
363
364void COperateTerminal::slotTermKeyPressed(QKeyEvent* e)
365{
366 qDebug(log) << Q_FUNC_INFO << e;
367}
368
369void COperateTerminal::slotFocusIn()
370{
372 SetShotcuts(true);
373}
374
375void COperateTerminal::slotFocusOut()
376{
377 SetShotcuts(false);
378}
379
381{
382 Q_ASSERT(pPara);
383 if(GetParameter()) {
384 GetParameter()->SetPluginParameters(pPara);
385 if(pPara) {
386 bool check = connect(pPara, SIGNAL(sigNameStylesChanged()),
387 this, SLOT(slotUpdateName()));
388 Q_ASSERT(check);
389 }
390 return 0;
391 } else {
392 QString szMsg = "There is not parameters! "
393 "please first create parameters, "
394 "then call SetParameter() in the ";
395 szMsg += metaObject()->className() + QString("::")
396 + metaObject()->className();
397 szMsg += QString("() or ") + metaObject()->className()
398 + QString("::") + "Initial()";
399 szMsg += " to set the parameters pointer. "
400 "Default set CParameterPlugin for the parameters of operate "
401 "(CParameterOperate or its derived classes) "
402 "See CManager::CreateOperate. "
403 "If you are sure the parameter of operate "
404 "does not need CParameterPlugin. "
405 "Please overload the SetPluginParameters() in the ";
406 szMsg += QString(metaObject()->className()) + " . don't set it";
407 qCritical(log) << szMsg.toStdString().c_str();
408 Q_ASSERT(false);
409 }
410 return -1;
411}
412
413int COperateTerminal::WriteTerminal(const char *buf, int len)
414{
415 int nRet = 0;
416#if defined(Q_OS_WIN)
417 if(m_pTerminal) {
418 m_pTerminal->receiveData(buf, len);
419 }
420#else
421 nRet = write(m_pTerminal->getPtySlaveFd(), buf, len);
422#endif
423 return nRet;
424}
425
426void COperateTerminal::SetShotcuts(bool bEnable)
427{
428 if(bEnable) {
429 m_pEditCopy->setShortcuts(
430 QList<QKeySequence>() << QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_C)
431 << QKeySequence(Qt::CTRL | Qt::Key_Insert));
432 m_pEditPaste->setShortcuts(QList<QKeySequence>()
433 << QKeySequence(QKeySequence::Paste)
434 << QKeySequence(Qt::SHIFT | Qt::Key_Insert));
435 m_pZoomIn->setShortcut(QKeySequence(QKeySequence::ZoomIn));
436 m_pZoomOut->setShortcut(QKeySequence(QKeySequence::ZoomOut));
437 m_pZoomOriginal->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_0));
438 m_pActionFind->setShortcut(QKeySequence(QKeySequence::Find));
439 m_pClear->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R));
440 return;
441 }
442
443 m_pEditCopy->setShortcuts(QList<QKeySequence>());
444 m_pEditPaste->setShortcut(QKeySequence());
445 m_pZoomIn->setShortcut(QKeySequence());
446 m_pZoomOut->setShortcut(QKeySequence());
447 m_pZoomOriginal->setShortcut(QKeySequence());
448 m_pActionFind->setShortcut(QKeySequence());
449 m_pClear->setShortcut(QKeySequence());
450}
The backend thread
virtual void quit()
Quit
终端操作接口
virtual int Save(QSettings &set) override
保存参数
CStats * GetStats() override
得到统计信息。如果有,其派生类则需要重载此函数提供统计信息。
virtual const qint16 Version() const override
版本
virtual int Initial() override
Initial parameters and resource
virtual const QString Name() override
名称
virtual int Clean() override
Clean parameters and resource
virtual int Load(QSettings &set) override
加载参数
virtual const QString Id() override
标识
virtual int SetParameter(CParameterTerminalBase *pPara)
设置参数指针
virtual CParameterTerminalBase * GetParameter() const
Get parameters
virtual const QString Description() override
描述
QWidget * GetViewer() override
得到显示视图
virtual int SetPluginParameters(CParameterPlugin *pPara) override
Set Global Parameters
操作接口。
Definition Operate.h:51
virtual CSecurityLevel::Levels GetSecurityLevel() const
Get Security Level
Definition Operate.cpp:129
virtual Q_INVOKABLE int Initial()
Initial parameters and resource
Definition Operate.cpp:190
virtual const QString Protocol() const
协议
Definition Operate.cpp:81
virtual Q_INVOKABLE int Clean()
Clean parameters and resource
Definition Operate.cpp:207
void sigViewerFocusIn(QWidget *pView)
视图获得焦点
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin
Definition Operate.cpp:219
virtual const QString Name()
名称
Definition Operate.cpp:46
void sigUpdateParameters(COperate *pOperate)
更新参数,通知应用程序保存或显示参数
virtual const QString Id()
标识
Definition Operate.cpp:36
virtual const QString GetTypeName() const
类型名
Definition Operate.cpp:86
插件的全局参数。
void sigChanged()
当参数改变时,触发 通常如果需要,则相应的参数会对应一个改变事件。
插件接口
Definition Plugin.h:15
virtual const QString DisplayName() const
在界面上显示的名称
Definition Plugin.cpp:76
virtual const QString Description() const =0
描述
安全级别
Definition Stats.h:79
Definition Stats.h:11