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