玉兔远程控制 0.1.0-bate11
载入中...
搜索中...
未找到
Terminal.cpp
1// Author: Kang Lin <kl222@126.com>
2
3#include <QDesktopServices>
4#include <QLoggingCategory>
5#include <QApplication>
6#include <QThread>
7
8#include "Terminal.h"
9#include "DlgSettingsTerminal.h"
10#include "Plugin.h"
11
12static Q_LOGGING_CATEGORY(log, "Plugin.Terminal.Operate")
13
15 : COperateTerminal(parent)
16 , m_pOpenFolderWithExplorer(nullptr)
17 , m_pCopyToClipboard(nullptr)
18{
19 qDebug(log) << Q_FUNC_INFO;
20 SetParameter(&m_Parameters);
21}
22
23CTerminal::~CTerminal()
24{
25 qDebug(log) << Q_FUNC_INFO;
26}
27
28QDialog *CTerminal::OnOpenDialogSettings(QWidget *parent)
29{
30 return new CDlgSettingsTerminal(&m_Parameters, parent);
31}
32
34{
35 slotUpdateParameter(this);
36 if(m_pTerminal) {
37 bool check = connect(m_pTerminal, &QTermWidget::titleChanged,
38 this, [&](){
39 qDebug(log) << "Title changed:" << m_pTerminal->title()
40 << "; Working directory:"
41 << m_pTerminal->workingDirectory();
42 if(m_Parameters.GetEnableTitleChanged()) {
43 m_pTerminal->setWindowTitle(m_pTerminal->title());
44 emit sigUpdateName(m_pTerminal->title());
45 }
46 if(m_Parameters.GetRestoreDirectory()) {
47 if(!m_pTerminal->workingDirectory().isEmpty())
48 m_Parameters.SetLasterDirectory(m_pTerminal->workingDirectory());
49 }
50 });
51 Q_ASSERT(check);
52 if(!m_Parameters.GetShell().isEmpty())
53 m_pTerminal->setShellProgram(m_Parameters.GetShell());
54 if(!m_Parameters.GetShellParameters().isEmpty())
55 m_pTerminal->setArgs(QStringList() << m_Parameters.GetShellParameters());
56 qDebug(log) << "Start:" << m_Parameters.GetShell() << m_Parameters.GetShellParameters();
57 m_pTerminal->startShellProgram();
58 if(m_Parameters.GetRestoreDirectory() && !m_Parameters.GetLasterDirectory().isEmpty())
59 m_pTerminal->sendText("cd " + m_Parameters.GetLasterDirectory() + "\r");
60 if(!m_Parameters.GetCommands().isEmpty()) {
61 foreach (auto c, m_Parameters.GetCommands())
62 m_pTerminal->sendText(c + "\r");
63 }
64 }
65 emit sigRunning();
66 return 0;
67}
68
70{
71 // if(m_Parameters.GetRestoreDirectory()) {
72 // if(!m_pTerminal->workingDirectory().isEmpty())
73 // m_Parameters.SetLasterDirectory(m_pTerminal->workingDirectory());
74 // emit sigUpdateParameters(this);
75 // }
76
77 if(m_pTerminal)
78 m_pTerminal->close();
79 emit sigFinished();
80 return 0;
81}
82
84{
85 return nullptr;
86}
87
89{
90 int nRet = 0;
92 if(nRet)
93 return nRet;
94#if !defined(Q_OS_WIN)
95#if QT_VERSION >= QT_VERSION_CHECK(6, 3, 0)
96 m_pOpenFolderWithExplorer = m_Menu.addAction(
97 QIcon::fromTheme("folder-open"),
98 tr("Open working directory with file explorer") + "\tCtrl+O",
99 QKeySequence(QKeySequence::Open), //Qt::CTRL | Qt::Key_O),
100 [&](){
101 QDesktopServices::openUrl(
102 QUrl::fromLocalFile(m_pTerminal->workingDirectory()));
103 });
104#else
105 m_pOpenFolderWithExplorer = m_Menu.addAction(
106 QIcon::fromTheme("folder-open"),
107 tr("Open working directory with file explorer") + "\tCtrl+O",
108 this,
109 [&](){
110 QDesktopServices::openUrl(
111 QUrl::fromLocalFile(m_pTerminal->workingDirectory()));
112 },
113 QKeySequence(QKeySequence::Open) //Qt::CTRL | Qt::Key_O)
114 );
115#endif
116 m_Menu.insertAction(m_pActionFind, m_pOpenFolderWithExplorer);
117 m_pCopyToClipboard = m_Menu.addAction(
118 QIcon::fromTheme("edit-copy"),
119 tr("Copy working directory to clipboard"),
120 this, [&](){
121 if(!m_pTerminal) return;
122 QClipboard* pClipboard = QApplication::clipboard();
123 if(!pClipboard) return;
124 pClipboard->setText(m_pTerminal->workingDirectory());
125 });
126 m_Menu.insertAction(m_pActionFind, m_pCopyToClipboard);
127#endif
128 return nRet;
129}
130
131const QString CTerminal::Name()
132{
133 if(!m_Parameters.GetName().isEmpty())
134 return m_Parameters.GetName();
135 if(!m_Parameters.GetShellName().isEmpty())
136 return COperateTerminal::Name() + " - " + m_Parameters.GetShellName();
137 return COperateTerminal::Name();
138}
139
140void CTerminal::SetShotcuts(bool bEnable)
141{
142 if(!m_pOpenFolderWithExplorer || !m_pCopyToClipboard)
143 return;
144 COperateTerminal::SetShotcuts(bEnable);
145 if(bEnable) {
146 m_pOpenFolderWithExplorer->setShortcut(QKeySequence(QKeySequence::Open));
147 return;
148 }
149 m_pOpenFolderWithExplorer->setShortcut(QKeySequence());
150 m_pCopyToClipboard->setShortcut(QKeySequence());
151}
152
154{
155 QString szDescription;
156 if(!Name().isEmpty())
157 szDescription = tr("Name: ") + Name() + "\n";
158
159 if(!GetTypeName().isEmpty())
160 szDescription += tr("Type: ") + GetTypeName() + "\n";
161
162 if(!Protocol().isEmpty()) {
163 szDescription += tr("Protocol: ") + Protocol();
164#ifdef DEBUG
165 if(!GetPlugin()->DisplayName().isEmpty())
166 szDescription += " - " + GetPlugin()->DisplayName();
167#endif
168 szDescription += "\n";
169 }
170
171 if(!m_Parameters.GetShellName().isEmpty())
172 szDescription += tr("Shell name: ") + m_Parameters.GetShellName() + "\n";
173 if(!m_Parameters.GetShell().isEmpty())
174 szDescription += tr("Shell path: ") + m_Parameters.GetShell() + "\n";
175 if(!m_Parameters.GetShellParameters().isEmpty())
176 szDescription += tr("Shell parameters: ") + m_Parameters.GetShellParameters() + "\n";
177 if(m_Parameters.GetCommands().size() > 0) {
178 szDescription += tr("Start commands:") + "\n";
179 foreach(auto cmd, m_Parameters.GetCommands())
180 szDescription += " " + cmd + "\n";
181 }
182
184 if(GetSecurityLevel() != CSecurityLevel::Level::No) {
185 szDescription += tr("Security level: ");
186 if(!sl.GetUnicodeIcon().isEmpty())
187 szDescription += sl.GetUnicodeIcon() + " ";
188 szDescription += sl.GetString() + "\n";
189 }
190
191 if(!GetPlugin()->Description().isEmpty())
192 szDescription += tr("Description: ") + GetPlugin()->Description();
193
194 return szDescription;
195}
196
198{
199 bool check = connect(&m_Parameters, &CTerminalParameter::sigEnableTitleChanged,
200 this, [&](bool changed) {
201 if(changed)
202 slotTerminalTitleChanged();
203 else
204 emit sigUpdateName(Name());
205 });
206 Q_ASSERT(check);
207 return COperateTerminal::SetParameter(pPara);
208}
209
210void CTerminal::slotTerminalTitleChanged()
211{
212 if(!m_pTerminal) return;
213 emit sigUpdateName(m_pTerminal->title());
214}
215
217{
218 return nullptr;
219}
后端接口。它由协议插件实现。 它默认启动一个定时器来开启一个非 Qt 事件循环(就是普通的循环处理)。 详见: Start()、 slotTimeOut()、 OnProcess() 。 当然,它仍然支...
终端操作接口
virtual int Initial() override
Initial parameters and resource
virtual const QString Name() override
名称
virtual int SetParameter(CParameterTerminalBase *pPara)
设置参数指针
virtual CSecurityLevel::Levels GetSecurityLevel() const
Get Security Level
void sigFinished()
断开连接成功信号。仅由插件触发
virtual int Start()=0
开始
void sigRunning()
开始成功信号。仅由插件触发。
virtual const QString Protocol() const
协议
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin
virtual int Stop()=0
关闭
void sigUpdateName(const QString &szName)
virtual const QString GetTypeName() const
类型名
插件接口
virtual const QString DisplayName() const
在界面上显示的名称
virtual const QString Description() const =0
描述
安全级别
定义 Stats.h:97
virtual int Initial() override
Initial parameters and resource
virtual int SetParameter(CParameterTerminalBase *pPara) override
设置参数指针
virtual QDialog * OnOpenDialogSettings(QWidget *parent) override
得到设置对话框
virtual const QString Description() override
描述
virtual const QString Name() override
名称
virtual CBackend * InstanceBackend() override
新建后端实例。它的所有者是调用者, 如果调用者不再使用它,调用者必须负责释放它。
CStats * GetStats() override
得到统计信息。如果有,其派生类则需要重载此函数提供统计信息。