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:") +
" " + 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());
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 int SetGlobalParameters(CParameterPlugin *pPara) override
Set Global Parameters.
virtual const QString Description() override
Description.
QWidget * GetViewer() override
Get Viewer.
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.