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:") +
" "
158 + QString(
"%1.%2.%3").arg(QTERMWIDGET_VERSION_MAJOR)
159 .arg(QTERMWIDGET_VERSION_MINOR)
160 .arg(QTERMWIDGET_VERSION_PATCH) +
"\n";
179 if(!pPara)
return -1;
180 nRet = pPara->Load(set);
189 if(!pPara)
return -1;
190 nRet = pPara->Save(set);
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()));
217 m_Menu.addSeparator();
228 m_pActionFind = m_Menu.addAction(
229 QIcon::fromTheme(
"edit-find"), tr(
"Find ......") +
"\tCtrl+F",
230 m_pTerminal, &QTermWidget::toggleShowSearchBar);
232 m_Menu.addSeparator();
233 m_pClear = m_Menu.addAction(QIcon::fromTheme(
"edit-clear"),
234 tr(
"Clear") +
"\tCtrl+R",
235 m_pTerminal, SLOT(clear()));
237 if(m_pActionSettings) {
238 m_Menu.addSeparator();
239 m_Menu.addAction(m_pActionSettings);
252int COperateTerminal::Start()
256 slotUpdateParameter(
this);
259 qCritical(log) <<
"new CBackendThread fail";
266int COperateTerminal::Stop()
268 qDebug(log) << Q_FUNC_INFO;
281 return m_pParameters;
289 Q_ASSERT(!m_pParameters);
291 m_pParameters = pPara;
293 if(!pPara || !m_pTerminal)
return -1;
301 this, SLOT(slotUpdateParameter(
COperate*)));
307void COperateTerminal::slotUpdateParameter(
COperate* pOperate)
309 qDebug(log) << Q_FUNC_INFO;
310 if(
this != pOperate)
return;
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());
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());
330 m_pTerminal->setKeyBindings(pPara->GetKeyBindings());
331 m_pTerminal->setHistorySize(pPara->GetHistorySize());
338void COperateTerminal::slotZoomReset()
340 if(!m_pTerminal)
return;
343 m_pTerminal->setTerminalFont(pPara->GetFont());
346void COperateTerminal::slotCustomContextMenu(
const QPoint & pos)
348 if(!m_pTerminal)
return;
354 m_Menu.exec(m_pTerminal->mapToGlobal(pos));
357void COperateTerminal::slotActivateUrl(
const QUrl& url,
bool fromContextMenu)
359 if (QApplication::keyboardModifiers() & Qt::ControlModifier || fromContextMenu) {
360 QDesktopServices::openUrl(url);
364void COperateTerminal::slotTermKeyPressed(QKeyEvent* e)
366 qDebug(log) << Q_FUNC_INFO << e;
369void COperateTerminal::slotFocusIn()
375void COperateTerminal::slotFocusOut()
386 bool check = connect(pPara, SIGNAL(sigNameStylesChanged()),
387 this, SLOT(slotUpdateName()));
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();
413int COperateTerminal::WriteTerminal(
const char *buf,
int len)
418 m_pTerminal->receiveData(buf, len);
421 nRet = write(m_pTerminal->getPtySlaveFd(), buf, len);
426void COperateTerminal::SetShotcuts(
bool 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));
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());
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
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
描述