Rabbit Remote Control 0.1.0-alpha
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
33int CTerminal::Start()
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
69int CTerminal::Stop()
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
95 m_pOpenFolderWithExplorer = m_Menu.addAction(
96 QIcon::fromTheme("folder-open"),
97 tr("Open working directory with file explorer") + "\tCtrl+O",
98 QKeySequence(QKeySequence::Open), //Qt::CTRL | Qt::Key_O),
99 [&](){
100 QDesktopServices::openUrl(
101 QUrl::fromLocalFile(m_pTerminal->workingDirectory()));
102 });
103 m_Menu.insertAction(m_pActionFind, m_pOpenFolderWithExplorer);
104 m_pCopyToClipboard = m_Menu.addAction(
105 QIcon::fromTheme("edit-copy"),
106 tr("Copy working directory to clipboard"),
107 this, [&](){
108 if(!m_pTerminal) return;
109 QClipboard* pClipboard = QApplication::clipboard();
110 if(!pClipboard) return;
111 pClipboard->setText(m_pTerminal->workingDirectory());
112 });
113 m_Menu.insertAction(m_pActionFind, m_pCopyToClipboard);
114 return nRet;
115}
116
117const QString CTerminal::Name()
118{
119 if(!m_Parameters.GetName().isEmpty())
120 return m_Parameters.GetName();
121 if(!m_Parameters.GetShellName().isEmpty())
122 return COperateTerminal::Name() + " - " + m_Parameters.GetShellName();
123 return COperateTerminal::Name();
124}
125
126void CTerminal::SetShotcuts(bool bEnable)
127{
128 COperateTerminal::SetShotcuts(bEnable);
129 if(bEnable) {
130 m_pOpenFolderWithExplorer->setShortcut(QKeySequence(QKeySequence::Open));
131 return;
132 }
133 m_pOpenFolderWithExplorer->setShortcut(QKeySequence());
134 m_pCopyToClipboard->setShortcut(QKeySequence());
135}
136
137
139{
140 QString szDescription;
141 if(!Name().isEmpty())
142 szDescription = tr("Name: ") + Name() + "\n";
143
144 if(!GetTypeName().isEmpty())
145 szDescription += tr("Type: ") + GetTypeName() + "\n";
146
147 if(!Protocol().isEmpty()) {
148 szDescription += tr("Protocol: ") + Protocol();
149#ifdef DEBUG
150 if(!GetPlugin()->DisplayName().isEmpty())
151 szDescription += " - " + GetPlugin()->DisplayName();
152#endif
153 szDescription += "\n";
154 }
155
156 if(!m_Parameters.GetShellName().isEmpty())
157 szDescription += tr("Shell name: ") + m_Parameters.GetShellName() + "\n";
158 if(!m_Parameters.GetShell().isEmpty())
159 szDescription += tr("Shell path: ") + m_Parameters.GetShell() + "\n";
160 if(!m_Parameters.GetShellParameters().isEmpty())
161 szDescription += tr("Shell parameters: ") + m_Parameters.GetShellParameters() + "\n";
162 if(m_Parameters.GetCommands().size() > 0) {
163 szDescription += tr("Start commands:") + "\n";
164 foreach(auto cmd, m_Parameters.GetCommands())
165 szDescription += " " + cmd + "\n";
166 }
167 if(GetSecurityLevel() != SecurityLevel::No)
168 szDescription += tr("Security level: ") + GetSecurityLevelString() + "\n";
169
170 if(!GetPlugin()->Description().isEmpty())
171 szDescription += tr("Description: ") + GetPlugin()->Description();
172
173 return szDescription;
174}
175
177{
178 bool check = connect(&m_Parameters, &CTerminalParameter::sigEnableTitleChanged,
179 this, [&](bool changed) {
180 if(changed)
181 slotTerminalTitleChanged();
182 else
183 emit sigUpdateName(Name());
184 });
185 Q_ASSERT(check);
186 return COperateTerminal::SetParameter(pPara);
187}
188
189void CTerminal::slotTerminalTitleChanged()
190{
191 if(!m_pTerminal) return;
192 emit sigUpdateName(m_pTerminal->title());
193}
Backend interface.
Definition Backend.h:42
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.
void sigFinished()
Successful disconnection signal.
void sigRunning()
Start success signal.
virtual const QString Protocol() const
Protocol.
Definition Operate.cpp:71
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin.
Definition Operate.cpp:259
void sigUpdateName(const QString &szName)
virtual const QString GetTypeName() const
Get type name.
Definition Operate.cpp:76
Terminal base parameter.
Plugin interface.
Definition Plugin.h:15
virtual const QString DisplayName() const
The plugin display name.
Definition Plugin.cpp:73
virtual const QString Description() const =0
Plugin description.
virtual int Initial() override
Initial parameters and resource.
Definition Terminal.cpp:88
virtual int SetParameter(CParameterTerminalBase *pPara) override
Set parameter pointer.
Definition Terminal.cpp:176
virtual QDialog * OnOpenDialogSettings(QWidget *parent) override
Open settgins dialog.
Definition Terminal.cpp:28
virtual const QString Description() override
Description.
Definition Terminal.cpp:138
virtual const QString Name() override
Name.
Definition Terminal.cpp:117
virtual CBackend * InstanceBackend() override
New CBackend.
Definition Terminal.cpp:83