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;
94 QString szDescription;
96 szDescription = tr(
"Name: ") +
Name() +
"\n";
99 szDescription += tr(
"Type: ") +
GetTypeName() +
"\n";
102 szDescription += tr(
"Protocol: ") +
Protocol();
104 if(!
GetPlugin()->DisplayName().isEmpty())
107 szDescription +=
"\n";
110 if(GetSecurityLevel() != SecurityLevel::No)
111 szDescription += tr(
"Security level: ") + GetSecurityLevelString() +
"\n";
116 return szDescription;
124CStats* COperateTerminal::GetStats()
134 if(!pPara)
return -1;
135 nRet = pPara->Load(set);
144 if(!pPara)
return -1;
145 nRet = pPara->Save(set);
157 m_pEditCopy = m_Menu.addAction(QIcon::fromTheme(
"edit-copy"),
158 tr(
"Copy selection to clipboard") +
"\tCtrl+Shift+C",
159 m_pTerminal, SLOT(copyClipboard()));
160 m_pEditPaste = m_Menu.addAction(QIcon::fromTheme(
"edit-paste"),
161 tr(
"Paste clipboard") +
"\tCtrl+V",
162 m_pTerminal, SLOT(pasteClipboard()));
163 m_Menu.addAction(tr(
"Paste selection"), m_pTerminal, SLOT(pasteSelection()));
164 m_Menu.addSeparator();
165 m_pZoomIn = m_Menu.addAction(QIcon::fromTheme(
"zoom-in"), tr(
"Zoom in") +
"\tCtrl++",
166 m_pTerminal, SLOT(zoomIn()));
167 m_pZoomOut = m_Menu.addAction(QIcon::fromTheme(
"zoom-out"), tr(
"Zoom out") +
"\tCtrl+-",
168 m_pTerminal, SLOT(zoomOut()));
169 m_pZoomOriginal = m_Menu.addAction(QIcon::fromTheme(
"zoom-original"), tr(
"Zoom reset") +
"\tCtrl+0",
170 this, SLOT(slotZoomReset()));
172 m_Menu.addSeparator();
183 m_pActionFind = m_Menu.addAction(
184 QIcon::fromTheme(
"edit-find"), tr(
"Find ......") +
"\tCtrl+F",
185 m_pTerminal, &QTermWidget::toggleShowSearchBar);
187 m_Menu.addSeparator();
188 m_pClear = m_Menu.addAction(QIcon::fromTheme(
"edit-clear"),
189 tr(
"Clear") +
"\tCtrl+R",
190 m_pTerminal, SLOT(clear()));
192 if(m_pActionSettings) {
193 m_Menu.addSeparator();
194 m_Menu.addAction(m_pActionSettings);
207int COperateTerminal::Start()
211 slotUpdateParameter(
this);
214 qCritical(log) <<
"new CBackendThread fail";
221int COperateTerminal::Stop()
223 qDebug(log) << Q_FUNC_INFO;
236 return m_pParameters;
244 Q_ASSERT(!m_pParameters);
246 m_pParameters = pPara;
248 if(!pPara || !m_pTerminal)
return -1;
256 this, SLOT(slotUpdateParameter(
COperate*)));
262void COperateTerminal::slotUpdateParameter(
COperate* pOperate)
264 qDebug(log) << Q_FUNC_INFO;
265 if(
this != pOperate)
return;
270#if QTERMWIDGET_VERSION >= QT_VERSION_CHECK(0, 9, 0)
271 m_pTerminal->setTerminalSizeHint(pPara->GetSizeHint());
272 m_pTerminal->setBidiEnabled(pPara->GetDirectional());
273 m_pTerminal->disableBracketedPasteMode(pPara->GetDisableBracketedPasteMode());
275 m_pTerminal->setTerminalFont(pPara->GetFont());
276 m_pTerminal->setKeyboardCursorShape(pPara->GetCursorShape());
277 m_pTerminal->setColorScheme(pPara->GetColorScheme());
278 m_pTerminal->setScrollBarPosition(pPara->GetScrollBarPosition());
279 m_pTerminal->setFlowControlEnabled(pPara->GetFlowControl());
280 m_pTerminal->setFlowControlWarningEnabled(pPara->GetFlowControlWarning());
281 m_pTerminal->setMotionAfterPasting(pPara->GetMotionAfterPasting());
282 m_pTerminal->setTerminalOpacity(1.0 - pPara->GetTransparency() / 100.0);
283 m_pTerminal->setTerminalBackgroundImage(pPara->GetBackgroupImage());
285 m_pTerminal->setKeyBindings(pPara->GetKeyBindings());
286 m_pTerminal->setHistorySize(pPara->GetHistorySize());
293void COperateTerminal::slotZoomReset()
295 if(!m_pTerminal)
return;
298 m_pTerminal->setTerminalFont(pPara->GetFont());
301void COperateTerminal::slotCustomContextMenu(
const QPoint & pos)
303 if(!m_pTerminal)
return;
309 m_Menu.exec(m_pTerminal->mapToGlobal(pos));
312void COperateTerminal::slotActivateUrl(
const QUrl& url,
bool fromContextMenu)
314 if (QApplication::keyboardModifiers() & Qt::ControlModifier || fromContextMenu) {
315 QDesktopServices::openUrl(url);
319void COperateTerminal::slotTermKeyPressed(QKeyEvent* e)
321 qDebug(log) << Q_FUNC_INFO << e;
324void COperateTerminal::slotFocusIn()
330void COperateTerminal::slotFocusOut()
340const QString COperateTerminal::Details()
343 szDetails =
"- " + tr(
"QTermWidget:") +
" "
344 + QString(
"%1.%2.%3").arg(QTERMWIDGET_VERSION_MAJOR)
345 .arg(QTERMWIDGET_VERSION_MINOR)
346 .arg(QTERMWIDGET_VERSION_PATCH) +
"\n";
358 QString szMsg =
"There is not parameters! "
359 "please first create parameters, "
360 "then call SetParameter() in the ";
361 szMsg += metaObject()->className() + QString(
"::")
362 + metaObject()->className();
363 szMsg += QString(
"() or ") + metaObject()->className()
364 + QString(
"::") +
"Initial()";
365 szMsg +=
" to set the parameters pointer. "
366 "Default set CParameterPlugin for the parameters of operate "
367 "(CParameterOperate or its derived classes) "
368 "See CManager::CreateOperate. "
369 "If you are sure the parameter of operate "
370 "does not need CParameterPlugin. "
371 "Please overload the SetGlobalParameters() in the ";
372 szMsg += QString(metaObject()->className()) +
" . don't set it";
373 qCritical(log) << szMsg.toStdString().c_str();
379int COperateTerminal::WriteTerminal(
const char *buf,
int len)
384 m_pTerminal->receiveData(buf, len);
387 nRet = write(m_pTerminal->getPtySlaveFd(), buf, len);
392void COperateTerminal::SetShotcuts(
bool bEnable)
395 m_pEditCopy->setShortcuts(
396 QList<QKeySequence>() << QKeySequence(Qt::CTRL | Qt::SHIFT | Qt::Key_C)
397 << QKeySequence(Qt::CTRL | Qt::Key_Insert));
398 m_pEditPaste->setShortcuts(QList<QKeySequence>()
399 << QKeySequence(QKeySequence::Paste)
400 << QKeySequence(Qt::SHIFT | Qt::Key_Insert));
401 m_pZoomIn->setShortcut(QKeySequence(QKeySequence::ZoomIn));
402 m_pZoomOut->setShortcut(QKeySequence(QKeySequence::ZoomOut));
403 m_pZoomOriginal->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_0));
404 m_pActionFind->setShortcut(QKeySequence(QKeySequence::Find));
405 m_pClear->setShortcut(QKeySequence(Qt::CTRL | Qt::Key_R));
409 m_pEditCopy->setShortcuts(QList<QKeySequence>());
410 m_pEditPaste->setShortcut(QKeySequence());
411 m_pZoomIn->setShortcut(QKeySequence());
412 m_pZoomOut->setShortcut(QKeySequence());
413 m_pZoomOriginal->setShortcut(QKeySequence());
414 m_pActionFind->setShortcut(QKeySequence());
415 m_pClear->setShortcut(QKeySequence());
423 szId +=
"_" +
Name();
427 static QRegularExpression exp(
"[-@:/#%!^&* \\.]");
428 szId = szId.replace(exp,
"_");
virtual int Save(QSettings &set) override
保存参数
virtual const qint16 Version() const override
Version
virtual int Initial() override
Initial parameters and resource
virtual CParameterTerminalBase * GetParameter()
Get parameters
virtual const QString Name() override
Name
virtual int Clean() override
Clean parameters and resource
virtual int Load(QSettings &set) override
加载参数
virtual const QString Id() override
Identity
virtual int SetParameter(CParameterTerminalBase *pPara)
设置参数指针
virtual int SetGlobalParameters(CParameterPlugin *pPara) override
应用插件全局参数
virtual const QString Description() override
Description
QWidget * GetViewer() override
得到显示视图
virtual Q_INVOKABLE int Initial()
Initial parameters and resource
virtual const QString Protocol() const
Protocol
virtual Q_INVOKABLE int SetGlobalParameters(CParameterPlugin *pPara)=0
应用插件全局参数
virtual Q_INVOKABLE int Clean()
Clean parameters and resource
void sigViewerFocusIn(QWidget *pView)
视图获得焦点
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin
virtual const QString Name()
Name
void sigUpdateParameters(COperate *pOperate)
更新参数,通知应用程序保存或显示参数
virtual const QString Id()
Identity
virtual const QString GetTypeName() const
Get type name
void sigChanged()
当参数改变时,触发 通常如果需要,则相应的参数会对应一个改变事件。
virtual const QString DisplayName() const
在界面上显示的名称
virtual const QString Description() const =0
描述