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;
92const QString COperateTerminal::Id()
94 QString szId = COperate::Id();
101 static QRegularExpression exp(
"[-@:/#%!^&* \\.]");
102 szId = szId.replace(exp,
"_");
118 QString szDescription;
119 if(!
Name().isEmpty())
120 szDescription = tr(
"Name: ") +
Name() +
"\n";
122 if(!GetTypeName().isEmpty())
123 szDescription += tr(
"Type: ") + GetTypeName() +
"\n";
125 if(!Protocol().isEmpty()) {
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;
148const qint16 COperateTerminal::Version()
const
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());
Terminal operate interface.
virtual int Save(QSettings &set) override
Save parameters.
CStats * GetStats() override
Get statistics.
virtual int Initial() override
Initial parameters and resource.
virtual const QString Name() override
Name.
virtual int Clean() override
Clean parameters and resource.
virtual int Load(QSettings &set) override
Load parameters.
virtual int SetParameter(CParameterTerminalBase *pPara)
Set parameter pointer.
virtual CParameterTerminalBase * GetParameter() const
Get parameters.
virtual const QString Description() override
Description.
QWidget * GetViewer() override
Get Viewer.
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 Q_INVOKABLE int Clean()
Clean parameters and resource.
void sigViewerFocusIn(QWidget *pView)
The view is focus.
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin.
virtual const QString Name()
Name.
void sigUpdateParameters(COperate *pOperate)
Update parameters, notify application to save or show parameters.
Global parameters of plugins.
void sigChanged()
emit when the parameter changes Usually if required, the corresponding parameter corresponds to a cha...
virtual const QString DisplayName() const
The plugin display name.
virtual const QString Description() const =0
Plugin description.