玉兔远程控制 0.1.0-bate5
载入中...
搜索中...
未找到
Operate.cpp
1#include <QMetaMethod>
2#include <QInputDialog>
3#include <QCheckBox>
4#include <QLoggingCategory>
5#include <QApplication>
6
7#include "Operate.h"
8#include "Plugin.h"
9#include "RabbitCommonTools.h"
10#include "RabbitCommonDir.h"
11
12static Q_LOGGING_CATEGORY(log, "Operate")
13
15 : QObject{plugin}
16 , m_pPlugin(plugin)
17 , m_pActionSettings(nullptr)
18{
19 qDebug(log) << Q_FUNC_INFO;
20 if(QApplication::clipboard())
21 {
22 bool check = connect(QApplication::clipboard(), SIGNAL(dataChanged()),
23 this, SIGNAL(sigClipBoardChanged()));
24 Q_ASSERT(check);
25 }
26}
27
28COperate::~COperate()
29{
30 qDebug(log) << Q_FUNC_INFO;
31}
32
33const QString COperate::Id()
34{
35 Q_ASSERT(GetPlugin());
36 QString szId = GetPlugin()->Name() + "_" + Protocol()
37 + "_" + QString::number((int)GetPlugin()->Type());
38 return szId;
39}
40
41const QString COperate::Name()
42{
43 return GetPlugin()->DisplayName();
44}
45
46const QString COperate::Description()
47{
48 QString szDescription;
49 if(!Name().isEmpty())
50 szDescription = tr("Name: ") + Name() + "\n";
51
52 if(!GetTypeName().isEmpty())
53 szDescription += tr("Type:") + GetTypeName() + "\n";
54
55 if(!Protocol().isEmpty()) {
56 szDescription += tr("Protocol: ") + Protocol();
57#ifdef DEBUG
58 if(!GetPlugin()->DisplayName().isEmpty())
59 szDescription += " - " + GetPlugin()->DisplayName();
60#endif
61 szDescription += "\n";
62 }
63
64 if(GetSecurityLevel() != SecurityLevel::No)
65 szDescription += tr("Security level: ") + GetSecurityLevelString() + "\n";
66
67 szDescription += tr("Description: ") + GetPlugin()->Description();
68 return szDescription;
69}
70
71const QString COperate::Protocol() const
72{
73 return GetPlugin()->Protocol();
74}
75
76const QString COperate::GetTypeName() const
77{
78 Q_ASSERT(GetPlugin());
79 return GetPlugin()->TypeName(GetPlugin()->Type());
80}
81
82const QIcon COperate::Icon() const
83{
84 return GetPlugin()->Icon();
85}
86
87int COperate::OpenDialogSettings(QWidget *parent)
88{
89 int nRet = QDialog::Accepted;
90 QDialog* p = OnOpenDialogSettings(parent);
91 if(p)
92 {
93 // The dialog is closed when the connect is close.
94 bool check = connect(this, SIGNAL(sigFinished()),
95 p, SLOT(reject()));
96 Q_ASSERT(check);
97 p->setWindowIcon(this->Icon());
98 p->setWindowTitle(tr("Set ") + GetPlugin()->DisplayName());
99 p->setAttribute(Qt::WA_DeleteOnClose);
100 nRet = RC_SHOW_WINDOW(p);
101 } else {
102 qCritical(log) << "The Protocol [" << Protocol() << "] don't settings dialog";
103 }
104 return nRet;
105}
106
107QMenu* COperate::GetMenu(QWidget* parent)
108{
109 if(m_Menu.actions().isEmpty())
110 return nullptr;
111 return &m_Menu;
112}
113
114CStats *COperate::GetStats()
115{
116 return nullptr;
117}
118
119COperate::SecurityLevel COperate::GetSecurityLevel()
120{
121 return SecurityLevel::No;
122}
123
124QString COperate::GetSecurityLevelString()
125{
126 return GetSecurityLevelString(GetSecurityLevel());
127}
128
129QString COperate::GetSecurityLevelString(SecurityLevel level)
130{
131 switch (level) {
132 case SecurityLevel::No:
133 return tr("No");
134 case SecurityLevel::Secure:
135 return tr("Secure");
136 case SecurityLevel::NonSecureAuthentication:
137 return tr("Non-secure authentication over a secure channel");
138 case SecurityLevel::Normal:
139 return tr("Channel is secure.");
140 case SecurityLevel::SecureAuthentication:
141 return tr("There is security verification, not a secure channel.");
142 case SecurityLevel::Risky:
143 return tr("Risky");
144 default:
145 break;
146 }
147 return QString();
148}
149
150QColor COperate::GetSecurityLevelColor()
151{
152 return GetSecurityLevelColor(GetSecurityLevel());
153}
154
155QColor COperate::GetSecurityLevelColor(SecurityLevel level)
156{
157 switch (level) {
158 case SecurityLevel::Secure:
159 return Qt::GlobalColor::green;
160 case SecurityLevel::NonSecureAuthentication:
161 return Qt::GlobalColor::blue;
162 case SecurityLevel::Normal:
163 return Qt::GlobalColor::yellow;
164 case SecurityLevel::SecureAuthentication:
165 return Qt::GlobalColor::darkRed;
166 case SecurityLevel::Risky:
167 return Qt::GlobalColor::red;
168 default:
169 break;
170 }
171 return QColor();
172}
173
174QString COperate::GetSettingsFile()
175{
176 if(m_szSettings.isEmpty())
177 {
178 m_szSettings = RabbitCommon::CDir::Instance()->GetDirUserData()
179 + QDir::separator()
180 + Id()
181 + ".rrc";
182 }
183 return m_szSettings;
184}
185
186int COperate::SetSettingsFile(const QString &szFile)
187{
188 m_szSettings = szFile;
189 return 0;
190}
191
192int COperate::Load(QString szFile)
193{
194 Q_ASSERT(!szFile.isEmpty());
195 if(szFile.isEmpty())
196 {
197 qCritical(log) << "The load file is empty";
198 return -1;
199 }
200 qInfo(log) << "Load configure file:" << szFile;
201 QSettings set(szFile, QSettings::IniFormat);
202 return Load(set);
203}
204
205int COperate::Save(QString szFile)
206{
207 Q_ASSERT(!szFile.isEmpty());
208 if(szFile.isEmpty())
209 {
210 qCritical(log) << "The load file is empty";
211 return -1;
212 }
213 qInfo(log) << "Save configure file:" << szFile;
214 QSettings set(szFile, QSettings::IniFormat);
215 return Save(set);
216}
217
219{
220 m_Menu.setIcon(m_pPlugin->Icon());
221 m_Menu.setTitle(m_pPlugin->DisplayName());
222 m_Menu.setToolTip(m_pPlugin->DisplayName());
223 m_Menu.setStatusTip(m_pPlugin->DisplayName());
224
225 m_pActionSettings = new QAction(QIcon::fromTheme("system-settings"),
226 tr("Settings"), &m_Menu);
227 if(m_pActionSettings) {
228 bool check = connect(m_pActionSettings, SIGNAL(triggered()),
229 this, SLOT(slotSettings()));
230 Q_ASSERT(check);
231 }
232 return 0;
233}
234
236{
237 return 0;
238}
239
240void COperate::slotSettings()
241{
242 int nRet = OpenDialogSettings();
243 if(QDialog::Accepted == nRet)
244 emit sigUpdateParameters(this);
245}
246
248{
249 return m_pPlugin;
250}
251
253{
254 QString szMsg = "There is not parameters! "
255 "please first create parameters, "
256 "then call SetParameter() in the ";
257 szMsg += metaObject()->className() + QString("::")
258 + metaObject()->className();
259 szMsg += QString("() or ") + metaObject()->className()
260 + QString("::") + "Initial()";
261 szMsg += " to set the parameters pointer. "
262 "Default set CParameterClient for the parameters of operate "
263 "(CParameterOperate or its derived classes) "
264 "See CManager::CreateOperate. "
265 "If you are sure the parameter of operate "
266 "does not need CParameterClient. "
267 "Please overload the SetGlobalParameters() in the ";
268 szMsg += QString(metaObject()->className()) + " . don't set it";
269 qCritical(log) << szMsg.toStdString().c_str();
270 Q_ASSERT_X(false, Q_FUNC_INFO, szMsg.toStdString().c_str());
271
272 return 0;
273}
274
275void COperate::slotUpdateName()
276{
277 emit sigUpdateName(Name());
278}
279
280QObject* COperate::createObject(const QString& className, QObject* parent)
281{
282 Q_UNUSED(parent);
283 int type =
284#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
285 QMetaType::fromName(className.toStdString().c_str()).id();
286#else
287 QMetaType::type(className.toStdString().c_str());
288#endif
289 if(QMetaType::UnknownType == type)
290 {
291 qCritical(log) << className << " is QMetaType::UnknownType";
292 return nullptr;
293 }
294 QObject *obj =
295#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
296 (QObject*)QMetaType(type).create();
297#else
298 (QObject*)QMetaType::create(type);
299#endif
300 if(nullptr == obj)
301 {
302 qCritical(log) << "QMetaType::create fail: " << type;
303 return nullptr;
304 }
305 //const QMetaObject* metaObj = QMetaType::metaObjectForType(type);
306 //QObject *obj = metaObj->newInstance(Q_ARG(QObject*, parent));
307 return obj;
308}
309
310void COperate::slotBlockShowWidget(const QString& className, int &nRet, void* pContext)
311{
312 bool check = false;
313 QObject *obj = createObject(className);
314 Q_ASSERT_X(obj, "Connecter", QString("Create object failed: " + className).toStdString().c_str());
315 /*
316 const QMetaObject* metaObject = obj->metaObject();
317 QStringList methods;
318 for(int i = metaObject->methodOffset(); i < metaObject->methodCount(); ++i)
319 methods << QString::fromLatin1(metaObject->method(i).methodSignature());
320 qDebug(log) << methods;
321 //*/
322 if(-1 == obj->metaObject()->indexOfMethod("SetContext(void*)"))
323 {
324 QString szErr;
325 szErr = "The class " + className + " is not method SetContext. It must be SetContext(void*) method.";
326 qCritical(log) << szErr;
327 Q_ASSERT_X(false, "Connecter", szErr.toStdString().c_str());
328 }
329 obj->metaObject()->invokeMethod(obj, "SetContext", Q_ARG(void*, pContext));
330
331 if(obj->inherits("QDialog"))
332 {
333 QDialog* pDlg = qobject_cast<QDialog*>(obj);
334 pDlg->setAttribute(Qt::WA_DeleteOnClose);
335 check = connect(this, SIGNAL(sigFinished()),
336 pDlg, SLOT(reject()));
337 Q_ASSERT(check);
338 nRet = RC_SHOW_WINDOW(pDlg);
339 } else if(obj->inherits("QWidget")) {
340 QWidget* pWdg = qobject_cast<QWidget*>(obj);
341 pWdg->setAttribute(Qt::WA_DeleteOnClose);
342 check = connect(this, SIGNAL(sigFinished()),
343 pWdg, SLOT(close()));
344 Q_ASSERT(check);
345 nRet = RC_SHOW_WINDOW(pWdg);
346 }
347}
348
349void COperate::slotBlockShowMessageBox(const QString &szTitle, const QString &szMessage,
350 QMessageBox::StandardButtons buttons,
351 QMessageBox::StandardButton &nRet,
352 bool &checkBox,
353 QString szCheckBoxContext)
354{
355 QCheckBox* pBox = nullptr;
356 QMessageBox msg(QMessageBox::Information,
357 szTitle, szMessage, buttons, GetViewer());
358 if(!szCheckBoxContext.isEmpty())
359 {
360 pBox = new QCheckBox(szCheckBoxContext);
361 if(pBox)
362 pBox->setCheckable(true);
363 msg.setCheckBox(pBox);
364 }
365 nRet = (QMessageBox::StandardButton)RC_SHOW_WINDOW(&msg);
366 if(pBox)
367 checkBox = pBox->isChecked();
368}
369
370void COperate::slotBlockInputDialog(const QString &szTitle, const QString &szLable,
371 const QString &szMessage,
372 QString& szText)
373{
374 bool ok = false;
375 QString t = QInputDialog::getText(nullptr,
376 szTitle,
377 szLable,
378 QLineEdit::Normal,
379 szMessage,
380 &ok);
381 if(ok && !t.isEmpty())
382 szText = t;
383}
384
385void COperate::slotSetClipboard(QMimeData* data)
386{
387 QClipboard* pClipboard = QApplication::clipboard();
388 if(pClipboard) {
389 // pClipboard->disconnect(this);
390
391 pClipboard->setMimeData(data);
392
393 // bool check = connect(pClipboard, SIGNAL(dataChanged()),
394 // this, SIGNAL(sigClipBoardChanged()));
395 // Q_ASSERT(check);
396 }
397}
操作接口。
Definition Operate.h:51
virtual QDialog * OnOpenDialogSettings(QWidget *parent=nullptr)=0
得到设置对话框
virtual int OpenDialogSettings(QWidget *parent=nullptr)
打开设置对话框
Definition Operate.cpp:87
void sigFinished()
断开连接成功信号。仅由插件触发
virtual const QIcon Icon() const
Icon
Definition Operate.cpp:82
virtual int Load(QSettings &set)=0
加载参数
virtual Q_INVOKABLE int Initial()
Initial parameters and resource
Definition Operate.cpp:218
virtual int Save(QSettings &set)=0
保存参数
virtual QWidget * GetViewer()=0
得到显示视图
virtual void slotBlockShowWidget(const QString &className, int &nRet, void *pContext)
阻塞后台线程,并在前台线程中显示窗口。
Definition Operate.cpp:310
virtual const QString Protocol() const
Protocol
Definition Operate.cpp:71
virtual Q_INVOKABLE int SetGlobalParameters(CParameterPlugin *pPara)=0
应用插件全局参数
Definition Operate.cpp:252
virtual Q_INVOKABLE int Clean()
Clean parameters and resource
Definition Operate.cpp:235
virtual void slotSetClipboard(QMimeData *data)
Definition Operate.cpp:385
Q_INVOKABLE CPlugin * GetPlugin() const
Get plugin
Definition Operate.cpp:247
virtual void slotBlockInputDialog(const QString &szTitle, const QString &szLable, const QString &szMessage, QString &szText)
Block background threads and display input dialogs in foreground threads (QInputDialog)
Definition Operate.cpp:370
virtual const QString Name()
Name
Definition Operate.cpp:41
virtual void slotBlockShowMessageBox(const QString &szTitle, const QString &szMessage, QMessageBox::StandardButtons buttons, QMessageBox::StandardButton &nRet, bool &checkBox, QString szCheckBoxContext=QString())
阻塞后台线程,并在前台线程中显示消息对话框(QMessageBox)
Definition Operate.cpp:349
virtual const QString Description()
Description
Definition Operate.cpp:46
void sigUpdateParameters(COperate *pOperate)
更新参数,通知应用程序保存或显示参数
virtual const QString Id()
Identity
Definition Operate.cpp:33
void sigUpdateName(const QString &szName)
virtual const QString GetTypeName() const
Get type name
Definition Operate.cpp:76
virtual QMenu * GetMenu(QWidget *parent=nullptr)
Get menu
Definition Operate.cpp:107
插件的全局参数。
插件接口
Definition Plugin.h:15
virtual const QString Name() const =0
插件名,这个名一定要与工程名(${PROJECT_NAME})相同。 翻译文件(${PROJECT_NAME}_*.ts))名与其相关。
virtual const QString DisplayName() const
在界面上显示的名称
Definition Plugin.cpp:73
virtual const QString Protocol() const =0
协议
virtual const QString Description() const =0
描述
Definition Stats.h:11