Rabbit Remote Control 0.1.0-bate14
Loading...
Searching...
No Matches
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}
Backend interface.
Definition Backend.h:52
Terminal operate interface.
virtual int Initial() override
Initial parameters and resource.
virtual const QString Name() override
Name.
virtual int SetParameter(CParameterTerminalBase *pPara)
Set parameter pointer.
virtual CSecurityLevel::Levels GetSecurityLevel() const
Get Security Level.
Definition Operate.cpp:129
void sigFinished()
Successful disconnection signal.
virtual int Start()=0
Start.
void sigRunning()
Start success signal.
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin.
Definition Operate.cpp:221
virtual int Stop()=0
Stop.
void sigUpdateName(const QString &szName)
Terminal base parameter.
Plugin interface.
Definition Plugin.h:15
virtual const QString DisplayName() const
The plugin display name.
Definition Plugin.cpp:76
virtual const QString Description() const =0
Plugin description.
Security level.
Definition Stats.h:97
Definition Stats.h:11
virtual int Initial() override
Initial parameters and resource.
Definition Terminal.cpp:88
virtual int SetParameter(CParameterTerminalBase *pPara) override
Set parameter pointer.
Definition Terminal.cpp:197
virtual QDialog * OnOpenDialogSettings(QWidget *parent) override
Open settgins dialog.
Definition Terminal.cpp:28
virtual const QString Description() override
Description.
Definition Terminal.cpp:153
virtual const QString Name() override
Name.
Definition Terminal.cpp:131
virtual CBackend * InstanceBackend() override
New CBackend.
Definition Terminal.cpp:83
CStats * GetStats() override
Get statistics.
Definition Terminal.cpp:216