6#include <QLoggingCategory>
7#include <QDesktopServices>
14#include "ParameterOperate.h"
16#include "BackendThread.h"
17#include "OperateTerminal.h"
20static Q_LOGGING_CATEGORY(log,
"Operate.Terminal")
24 , m_pTerminal(
nullptr)
26 , m_pActionFind(
nullptr)
27 , m_pActionOpenWithSystem(
nullptr)
28 , m_pParameters(
nullptr)
29 , m_pEditCopy(
nullptr)
30 , m_pEditPaste(
nullptr)
33 , m_pZoomOriginal(
nullptr)
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");
50 m_pTerminal =
new QTermWidget(0);
52 qCritical(log) <<
"new QTermWidget() fail";
55 m_pTerminal->setAutoClose(
true);
58 m_pTerminal->setContextMenuPolicy(Qt::CustomContextMenu);
59 check = connect(m_pTerminal, SIGNAL(customContextMenuRequested(
const QPoint &)),
60 this, SLOT(slotCustomContextMenu(
const QPoint &)));
62 check = connect(m_pTerminal, SIGNAL(urlActivated(
const QUrl&,
bool)),
63 this, SLOT(slotActivateUrl(
const QUrl&,
bool)));
68 check = connect(m_pTerminal, SIGNAL(finished()),
69 this, SIGNAL(sigStop()));
74 check = connect(m_pTerminal, SIGNAL(termGetFocus()),
75 this, SLOT(slotFocusIn()));
77 check = connect(m_pTerminal, SIGNAL(termLostFocus()),
78 this, SLOT(slotFocusOut()));
82COperateTerminal::~COperateTerminal()
84 qDebug(log) << Q_FUNC_INFO;
87 m_pTerminal->deleteLater();
88 m_pTerminal =
nullptr;
101 static QRegularExpression exp(
"[-@:/#%!^&* \\.]");
102 szId = szId.replace(exp,
"_");
118 QString szDescription;
119 if(!
Name().isEmpty())
120 szDescription = tr(
"Name: ") +
Name() +
"\n";
123 szDescription += tr(
"Type: ") +
GetTypeName() +
"\n";
126 szDescription += tr(
"Protocol: ") +
Protocol();
128 if(!
GetPlugin()->DisplayName().isEmpty())
131 szDescription +=
"\n";
136 szDescription += tr(
"Security level: ");
137 if(!sl.GetUnicodeIcon().isEmpty())
138 szDescription += sl.GetUnicodeIcon() +
" ";
139 szDescription += sl.GetString() +
"\n";
145 return szDescription;
153const QString COperateTerminal::Details()
156 szDetails =
" - " + tr(
"QTermWidget") +
"\n" +
157 " - " + tr(
"Version:") +
" " + QString(
"%1.%2.%3").arg(QTERMWIDGET_VERSION_MAJOR)
158 .arg(QTERMWIDGET_VERSION_MINOR)
159 .arg(QTERMWIDGET_VERSION_PATCH) +
"\n";
178 if(!pPara)
return -1;
179 nRet = pPara->Load(set);
188 if(!pPara)
return -1;
189 nRet = pPara->Save(set);
201 m_pEditCopy = m_Menu.addAction(QIcon::fromTheme(
"edit-copy"),
202 tr(
"Copy selection to clipboard") +
"\tCtrl+Shift+C",
203 m_pTerminal, SLOT(copyClipboard()));
204 m_pEditPaste = m_Menu.addAction(QIcon::fromTheme(
"edit-paste"),
205 tr(
"Paste clipboard") +
"\tCtrl+V",
206 m_pTerminal, SLOT(pasteClipboard()));
207 m_Menu.addAction(tr(
"Paste selection"), m_pTerminal, SLOT(pasteSelection()));
208 m_Menu.addSeparator();
209 m_pZoomIn = m_Menu.addAction(QIcon::fromTheme(
"zoom-in"), tr(
"Zoom in") +
"\tCtrl++",
210 m_pTerminal, SLOT(zoomIn()));
211 m_pZoomOut = m_Menu.addAction(QIcon::fromTheme(
"zoom-out"), tr(
"Zoom out") +
"\tCtrl+-",
212 m_pTerminal, SLOT(zoomOut()));
213 m_pZoomOriginal = m_Menu.addAction(QIcon::fromTheme(
"zoom-original"), tr(
"Zoom reset") +
"\tCtrl+0",
214 this, SLOT(slotZoomReset()));
216 m_Menu.addSeparator();
227 m_pActionFind = m_Menu.addAction(
228 QIcon::fromTheme(
"edit-find"), tr(
"Find ......") +
"\tCtrl+F",
229 m_pTerminal, &QTermWidget::toggleShowSearchBar);
231 m_Menu.addSeparator();
232 m_pClear = m_Menu.addAction(QIcon::fromTheme(
"edit-clear"),
233 tr(
"Clear") +
"\tCtrl+R",
234 m_pTerminal, SLOT(clear()));
236 if(m_pActionSettings) {
237 m_Menu.addSeparator();
238 m_Menu.addAction(m_pActionSettings);
251int COperateTerminal::Start()
255 slotUpdateParameter(
this);
258 qCritical(log) <<
"new CBackendThread fail";
265int COperateTerminal::Stop()
267 qDebug(log) << Q_FUNC_INFO;
280 return m_pParameters;
288 Q_ASSERT(!m_pParameters);
290 m_pParameters = pPara;
292 if(!pPara || !m_pTerminal)
return -1;
300 this, SLOT(slotUpdateParameter(
COperate*)));
306void COperateTerminal::slotUpdateParameter(
COperate* pOperate)
308 qDebug(log) << Q_FUNC_INFO;
309 if(
this != pOperate)
return;
314#if QTERMWIDGET_VERSION >= QT_VERSION_CHECK(0, 9, 0)
315 m_pTerminal->setTerminalSizeHint(pPara->GetSizeHint());
316 m_pTerminal->setBidiEnabled(pPara->GetDirectional());
317 m_pTerminal->disableBracketedPasteMode(pPara->GetDisableBracketedPasteMode());
319 m_pTerminal->setTerminalFont(pPara->GetFont());
320 m_pTerminal->setKeyboardCursorShape(pPara->GetCursorShape());
321 m_pTerminal->setColorScheme(pPara->GetColorScheme());
322 m_pTerminal->setScrollBarPosition(pPara->GetScrollBarPosition());
323 m_pTerminal->setFlowControlEnabled(pPara->GetFlowControl());
324 m_pTerminal->setFlowControlWarningEnabled(pPara->GetFlowControlWarning());
325 m_pTerminal->setMotionAfterPasting(pPara->GetMotionAfterPasting());
326 m_pTerminal->setTerminalOpacity(1.0 - pPara->GetTransparency() / 100.0);
327 m_pTerminal->setTerminalBackgroundImage(pPara->GetBackgroupImage());
329 m_pTerminal->setKeyBindings(pPara->GetKeyBindings());
330 m_pTerminal->setHistorySize(pPara->GetHistorySize());
337void COperateTerminal::slotZoomReset()
339 if(!m_pTerminal)
return;
342 m_pTerminal->setTerminalFont(pPara->GetFont());
345void COperateTerminal::slotCustomContextMenu(
const QPoint & pos)
347 if(!m_pTerminal)
return;
353 m_Menu.exec(m_pTerminal->mapToGlobal(pos));
356void COperateTerminal::slotActivateUrl(
const QUrl& url,
bool fromContextMenu)
358 if (QApplication::keyboardModifiers() & Qt::ControlModifier || fromContextMenu) {
359 QDesktopServices::openUrl(url);
363void COperateTerminal::slotTermKeyPressed(QKeyEvent* e)
365 qDebug(log) << Q_FUNC_INFO << e;
368void COperateTerminal::slotFocusIn()
374void COperateTerminal::slotFocusOut()
385 bool check = connect(pPara, SIGNAL(sigNameStylesChanged()),
386 this, SLOT(slotUpdateName()));
391 QString szMsg =
"There is not parameters! "
392 "please first create parameters, "
393 "then call SetParameter() in the ";
394 szMsg += metaObject()->className() + QString(
"::")
395 + metaObject()->className();
396 szMsg += QString(
"() or ") + metaObject()->className()
397 + QString(
"::") +
"Initial()";
398 szMsg +=
" to set the parameters pointer. "
399 "Default set CParameterPlugin for the parameters of operate "
400 "(CParameterOperate or its derived classes) "
401 "See CManager::CreateOperate. "
402 "If you are sure the parameter of operate "
403 "does not need CParameterPlugin. "
404 "Please overload the SetGlobalParameters() in the ";
405 szMsg += QString(metaObject()->className()) +
" . don't set it";
406 qCritical(log) << szMsg.toStdString().c_str();
412int COperateTerminal::WriteTerminal(
const char *buf,
int len)
417 m_pTerminal->receiveData(buf, len);
420 nRet = write(m_pTerminal->getPtySlaveFd(), buf, len);
425void COperateTerminal::SetShotcuts(
bool bEnable)
428 m_pEditCopy->setShortcuts(
429 QList<QKeySequence>() << QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_C)
430 << QKeySequence(Qt::CTRL | Qt::Key_Insert));
431 m_pEditPaste->setShortcuts(QList<QKeySequence>()
432 << QKeySequence(QKeySequence::Paste)
433 << QKeySequence(Qt::SHIFT | Qt::Key_Insert));
434 m_pZoomIn->setShortcut(QKeySequence(QKeySequence::ZoomIn));
435 m_pZoomOut->setShortcut(QKeySequence(QKeySequence::ZoomOut));
436 m_pZoomOriginal->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_0));
437 m_pActionFind->setShortcut(QKeySequence(QKeySequence::Find));
438 m_pClear->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R));
442 m_pEditCopy->setShortcuts(QList<QKeySequence>());
443 m_pEditPaste->setShortcut(QKeySequence());
444 m_pZoomIn->setShortcut(QKeySequence());
445 m_pZoomOut->setShortcut(QKeySequence());
446 m_pZoomOriginal->setShortcut(QKeySequence());
447 m_pActionFind->setShortcut(QKeySequence());
448 m_pClear->setShortcut(QKeySequence());
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 int SetGlobalParameters(CParameterPlugin *pPara) override
Set Global Parameters
virtual const QString Description() override
描述
QWidget * GetViewer() override
得到显示视图
virtual CSecurityLevel::Levels GetSecurityLevel() const
Get Security Level
virtual Q_INVOKABLE int Initial()
Initial parameters and resource
virtual const QString Protocol() const
协议
virtual Q_INVOKABLE int Clean()
Clean parameters and resource
void sigViewerFocusIn(QWidget *pView)
视图获得焦点
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin
virtual const QString Name()
名称
void sigUpdateParameters(COperate *pOperate)
更新参数,通知应用程序保存或显示参数
virtual const QString Id()
标识
virtual const QString GetTypeName() const
类型名
void sigChanged()
当参数改变时,触发 通常如果需要,则相应的参数会对应一个改变事件。
virtual const QString DisplayName() const
在界面上显示的名称
virtual const QString Description() const =0
描述