Rabbit Remote Control 0.0.35
Loading...
Searching...
No Matches
FrmListRecentConnects.cpp
1#include "FrmListRecentConnects.h"
2#include "RabbitCommonDir.h"
3#include <QVBoxLayout>
4#include <QDateTime>
5#include <QStandardItem>
6#include <QDir>
7#include <QHeaderView>
8#include <QMenu>
9
10CFrmListRecentConnects::CFrmListRecentConnects(
11 CClient* pClient,
12 CParameterApp &parameterApp, bool bDock, QWidget *parent) :
13 QWidget(parent),
14 m_ParameterApp(parameterApp),
15 m_pToolBar(nullptr),
16 m_ptbConnect(nullptr),
17 m_pMenuNew(nullptr),
18 m_pModel(nullptr),
19 m_pClient(pClient),
20 m_nFileRow(0),
21 m_bDock(bDock),
22 m_pDockTitleBar(nullptr)
23{
24 setFocusPolicy(Qt::NoFocus);
25 setAttribute(Qt::WA_DeleteOnClose);
26 setLayout(new QVBoxLayout(this));
27 setWindowTitle(tr("List recent connections"));
28
29 m_pToolBar = new QToolBar(this);
30
31 m_pConnect = m_pToolBar->addAction(
32 QIcon::fromTheme("network-wired"), tr("Connect"),
33 this, SLOT(slotConnect()));
34 m_pConnect->setStatusTip(tr("Connect"));
35 m_pConnect->setToolTip(tr("Connect"));
36 m_pEditConnect = m_pToolBar->addAction(
37 QIcon::fromTheme("edit-connect"), tr("Edit and Connect"),
38 this, SLOT(slotEditConnect()));
39 m_pEditConnect->setStatusTip(tr("Edit and Connect"));
40 m_pEditConnect->setToolTip(tr("Edit and Connect"));
41 m_pToolBar->addSeparator();
42
43 m_ptbConnect = new QToolButton(m_pToolBar);
44 m_ptbConnect->setFocusPolicy(Qt::NoFocus);
45 m_ptbConnect->setPopupMode(QToolButton::InstantPopup);
46 //m_ptbConnect->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
47 m_pMenuNew = new QMenu(tr("New"), this);
48 m_pMenuNew->setIcon(QIcon::fromTheme("add"));
49 m_ptbConnect->setMenu(m_pMenuNew);
50 m_ptbConnect->setIcon(m_pMenuNew->icon());
51 m_ptbConnect->setText(tr("New"));
52 m_ptbConnect->setToolTip(tr("New"));
53 m_ptbConnect->setStatusTip(tr("New"));
54 m_pToolBar->addWidget(m_ptbConnect);
55 m_pClient->EnumPlugins(this);
56 m_pEdit = m_pToolBar->addAction(QIcon::fromTheme("edit"), tr("Edit"),
57 this, SLOT(slotEdit()));
58 m_pEdit->setStatusTip(tr("Edit"));
59 m_pEdit->setToolTip(tr("Edit"));
60 m_pCopy = m_pToolBar->addAction(QIcon::fromTheme("edit-copy"), tr("Copy"),
61 this, SLOT(slotCopy()));
62 m_pCopy->setStatusTip(tr("Copy"));
63 m_pCopy->setToolTip(tr("Copy"));
64 m_pDelete = m_pToolBar->addAction(
65 QIcon::fromTheme("edit-delete"), tr("Delete"),
66 this, SLOT(slotDelete()));
67 m_pDelete->setToolTip(tr("Delete"));
68 m_pDelete->setStatusTip(tr("Delete"));
69 m_pDetail = m_pToolBar->addAction(
70 QIcon::fromTheme("dialog-information"), tr("Detail"),
71 this, SLOT(slotDetail()));
72 m_pDetail->setCheckable(true);
73 m_pDetail->setChecked(false);
74 m_pDetail->setToolTip(tr("Detail"));
75 m_pDetail->setStatusTip(tr("Detail"));
76 m_pToolBar->addSeparator();
77 if(m_bDock) {
78 m_pRefresh = m_pToolBar->addAction(
79 QIcon::fromTheme("view-refresh"),
80 tr("Refresh"),
81 this, SLOT(slotLoadFiles()));
82 m_pRefresh->setToolTip(tr("Refresh"));
83 m_pRefresh->setStatusTip(tr("Refresh"));
84 } else {
85 QAction* pClose = m_pToolBar->addAction(
86 QIcon::fromTheme("window-close"), tr("Close"),
87 this, SLOT(close()));
88 pClose->setStatusTip(tr("Close"));
89 pClose->setToolTip(tr("Close"));
90 }
91
92 layout()->addWidget(m_pToolBar);
93
94 if(bDock) {
95 m_pDockTitleBar = new RabbitCommon::CTitleBar(parent);
96 // Create tools pushbutton in title bar
97 QMenu* pMenu = new QMenu(tr("Tools"), m_pDockTitleBar);
98 QPushButton* pTools = m_pDockTitleBar->CreateSmallPushButton(
99 QIcon::fromTheme("tools"), m_pDockTitleBar);
100 pTools->setToolTip(tr("Tools"));
101 pTools->setMenu(pMenu);
102 QList<QWidget*> lstWidget;
103 lstWidget << pTools;
104 m_pDockTitleBar->AddWidgets(lstWidget);
105
106 pMenu->addAction(m_pConnect);
107 pMenu->addAction(m_pEditConnect);
108 pMenu->addMenu(m_pMenuNew);
109 pMenu->addAction(m_pEdit);
110 pMenu->addAction(m_pCopy);
111 pMenu->addAction(m_pDelete);
112 pMenu->addAction(m_pDetail);
113 pMenu->addAction(m_pRefresh);
114 pMenu->addSeparator();
115 auto pShowToolBar = pMenu->addAction(tr("Show tool bar"), this, [&](){
116 QAction* a = (QAction*)sender();
117 if(a) {
118 m_pToolBar->setVisible(a->isChecked());
119 m_ParameterApp.SetDockListRecentShowToolBar(a->isChecked());
120 m_ParameterApp.Save();
121 }
122 });
123 pShowToolBar->setCheckable(true);
124 pShowToolBar->setChecked(m_ParameterApp.GetDockListRecentShowToolBar());
125 m_pToolBar->setVisible(m_ParameterApp.GetDockListRecentShowToolBar());
126 }
127
128 Q_ASSERT(m_pClient);
129 m_pTableView = new QTableView(this);
130 m_pTableView->setContextMenuPolicy(Qt::CustomContextMenu);
131 bool check = connect(m_pTableView,
132 SIGNAL(customContextMenuRequested(const QPoint &)),
133 this, SLOT(slotCustomContextMenu(const QPoint &)));
134 Q_ASSERT(check);
135 check = connect(m_pTableView, SIGNAL(doubleClicked(const QModelIndex &)),
136 this, SLOT(slotDoubleClicked(const QModelIndex&)));
137 Q_ASSERT(check);
138 layout()->addWidget(m_pTableView);
139
140 m_pModel = new QStandardItemModel(m_pTableView);
141 m_pTableView->setModel(m_pModel);
142 m_pTableView->verticalHeader()->hide();
143 m_pTableView->setSelectionMode(QAbstractItemView::SingleSelection);
144 m_pTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
145 m_pTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
146 m_pModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Name")));
147 m_pModel->setHorizontalHeaderItem(1, new QStandardItem(tr("Protocol")));
148 m_pModel->setHorizontalHeaderItem(2, new QStandardItem(tr("Date")));
149 m_pModel->setHorizontalHeaderItem(3, new QStandardItem(tr("ID")));
150 m_nFileRow = 4;
151 m_pModel->setHorizontalHeaderItem(m_nFileRow, new QStandardItem(tr("File")));
152 if(!m_pDetail->isChecked()) {
153 m_pTableView->hideColumn(3);
154 m_pTableView->hideColumn(m_nFileRow);
155 }
156
157 slotLoadFiles();
158
159 //必须在 setModel 后,才能应用
160 /*第二个参数可以为:
161 QHeaderView::Interactive :0 用户可设置,也可被程序设置成默认大小
162 QHeaderView::Fixed :2 用户不可更改列宽
163 QHeaderView::Stretch :1 根据空间,自动改变列宽,用户与程序不能改变列宽
164 QHeaderView::ResizeToContents:3 根据内容改变列宽,用户与程序不能改变列宽
165 */
166 m_pTableView->horizontalHeader()->setSectionResizeMode(
167#if defined(DEBUG) && !defined(Q_OS_ANDROID)
168 0,
169#endif
170 QHeaderView::Interactive);
171 //以下设置列宽函数必须要数据加载完成后使用,才能应用
172 //See: https://blog.csdn.net/qq_40450386/article/details/86083759
173 //m_pTableView->resizeColumnsToContents(); //设置所有列宽度自适应内容
174 //m_pTableView->resizeColumnToContents(0); //设置第0列宽度自适应内容
175 //m_pTableView->resizeColumnToContents(2); //设置第1列宽度自适应内容
176
177 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
178 QModelIndexList lstIndex;
179 if(pSelect)
180 lstIndex = pSelect->selectedRows();
181 if(m_pModel->rowCount() > 0 && lstIndex.isEmpty())
182 {
183 m_pTableView->selectRow(0);
184 }
185
186}
187
188CFrmListRecentConnects::~CFrmListRecentConnects()
189{
190}
191
192void CFrmListRecentConnects::slotLoadFiles()
193{
194 m_pModel->removeRows(0, m_pModel->rowCount());
195 QString szPath = RabbitCommon::CDir::Instance()->GetDirUserData();
196 QDir dir(szPath);
197 QStringList files = dir.entryList(QStringList() << "*.rrc",
198 QDir::Files, QDir::Time);
199 foreach (auto fileName, files) {
200 QString szFile = dir.absoluteFilePath(fileName);
201 if(szFile.isEmpty()) continue;
202 CConnecter* c = m_pClient->LoadConnecter(szFile);
203 if(!c) continue;
204
205 QList<QStandardItem*> lstItem;
206 QStandardItem* pName = new QStandardItem(c->Icon(), c->Name());
207 pName->setToolTip(c->Description());
208 lstItem << pName;
209 QStandardItem* pProtocol = new QStandardItem(c->Protocol());
210 lstItem << pProtocol;
211 QFileInfo fi(szFile);
212 lstItem << new QStandardItem(fi.lastModified().toLocalTime().toString());
213 QStandardItem* pId = new QStandardItem(c->Id());
214 lstItem << pId;
215 QStandardItem* pFile = new QStandardItem(szFile);
216 lstItem << pFile;
217 m_pModel->appendRow(lstItem);
218
219 m_pClient->DeleteConnecter(c);
220 }
221
222 if(m_pModel->rowCount() > 0)
223 {
224 m_pConnect->setEnabled(true);
225 m_pEditConnect->setEnabled(true);
226 m_pEdit->setEnabled(true);
227 m_pCopy->setEnabled(true);
228 m_pDelete->setEnabled(true);
229 } else {
230 m_pConnect->setEnabled(false);
231 m_pEditConnect->setEnabled(false);
232 m_pEdit->setEnabled(false);
233 m_pCopy->setEnabled(false);
234 m_pDelete->setEnabled(false);
235 }
236
237 //以下设置列宽函数必须要数据加载完成后使用,才能应用
238 //See: https://blog.csdn.net/qq_40450386/article/details/86083759
239 //m_pTableView->resizeColumnsToContents(); //设置所有列宽度自适应内容
240 m_pTableView->resizeColumnToContents(0); //设置第0列宽度自适应内容
241 m_pTableView->resizeColumnToContents(1); //设置第1列宽度自适应内容
242 m_pTableView->resizeColumnToContents(2); //设置第1列宽度自适应内容
243 return;
244}
245
246int CFrmListRecentConnects::InsertItem(CConnecter *c, QString& szFile)
247{
248 QList<QStandardItem*> lstItem;
249 QStandardItem* pName = new QStandardItem(c->Icon(), c->Name());
250 pName->setToolTip(c->Description());
251 lstItem << pName;
252 QStandardItem* pProtocol = new QStandardItem(c->Protocol());
253 lstItem << pProtocol;
254 QFileInfo fi(szFile);
255 lstItem << new QStandardItem(fi.lastModified().toString());
256 QStandardItem* pId = new QStandardItem(c->Id());
257 lstItem << pId;
258 QStandardItem* pFile = new QStandardItem(szFile);
259 lstItem << pFile;
260 m_pModel->insertRow(0, lstItem);
261 m_pTableView->selectRow(0);
262 return 0;
263}
264
266{
267 // Connect menu and toolbar
268 QAction* pAction = m_pMenuNew->addAction(
269 pPlug->Protocol() + ": " + pPlug->DisplayName(),
270 this, SLOT(slotNew()));
271 pAction->setToolTip(pPlug->Description());
272 pAction->setStatusTip(pPlug->Description());
273 pAction->setData(id);
274 pAction->setIcon(pPlug->Icon());
275 return 0;
276}
277
278void CFrmListRecentConnects::slotNew()
279{
280 QAction* pAction = dynamic_cast<QAction*>(this->sender());
281 CConnecter* c = m_pClient->CreateConnecter(pAction->data().toString());
282 if(nullptr == c) return;
283
284 int nRet = c->OpenDialogSettings(this);
285 switch(nRet)
286 {
287 case QDialog::Rejected:
288 break;
289 case QDialog::Accepted:
290 {
291 QString szFile = c->GetSettingsFile();
292 QDir d;
293 if(d.exists(szFile)) {
294 QMessageBox::StandardButton r
295 = QMessageBox::warning(
296 this, tr("Warning"),
297 tr("File of connecter is exists. whether to overwrite it? File: %1").arg(szFile),
298 QMessageBox::StandardButton::Ok | QMessageBox::StandardButton::No,
299 QMessageBox::StandardButton::No);
300 if(QMessageBox::StandardButton::Ok == r)
301 {
302 d.remove(szFile);
303 m_pClient->SaveConnecter(c);
304 }
305 break;
306 }
307
308 m_pClient->SaveConnecter(c);
309
310 InsertItem(c, szFile);
311
312 break;
313 }
314 }
315
316 m_pClient->DeleteConnecter(c);
317}
318
319void CFrmListRecentConnects::slotEdit()
320{
321 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
322 QModelIndexList lstIndex = pSelect->selectedRows();
323 foreach(auto index, lstIndex)
324 {
325 QString szFile = m_pModel->item(index.row(), m_nFileRow)->text();
326 CConnecter* c = m_pClient->LoadConnecter(szFile);
327 int nRet = c->OpenDialogSettings(this);
328 switch(nRet)
329 {
330 case QDialog::Rejected:
331 break;
332 case QDialog::Accepted:
333 m_pClient->SaveConnecter(c);
334 break;
335 }
336 m_pClient->DeleteConnecter(c);
337 }
338}
339
340void CFrmListRecentConnects::slotEditConnect()
341{
342 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
343 QModelIndexList lstIndex = pSelect->selectedRows();
344 foreach(auto index, lstIndex)
345 {
346 QString szFile = m_pModel->item(index.row(), m_nFileRow)->text();
347 CConnecter* c = m_pClient->LoadConnecter(szFile);
348 int nRet = c->OpenDialogSettings(this);
349 switch(nRet)
350 {
351 case QDialog::Rejected:
352 break;
353 case QDialog::Accepted:
354 m_pClient->SaveConnecter(c);
355 emit sigConnect(szFile);
356 break;
357 }
358 m_pClient->DeleteConnecter(c);
359 }
360 if(!m_bDock)
361 close();
362}
363
364void CFrmListRecentConnects::slotCopy()
365{
366 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
367 QModelIndexList lstIndex = pSelect->selectedRows();
368 foreach(auto index, lstIndex)
369 {
370 QString szFile = m_pModel->item(index.row(), m_nFileRow)->text();
371 CConnecter* c = m_pClient->LoadConnecter(szFile);
372
373 do {
374 bool bExit = true;
375 bool bInsert = true;
376 int nRet = c->OpenDialogSettings(this);
377 switch(nRet)
378 {
379 case QDialog::Rejected:
380 break;
381 case QDialog::Accepted:
382 {
383 szFile = c->GetSettingsFile();
384 QDir d(szFile);
385 if(d.exists(szFile)) {
386 QMessageBox::StandardButton r
387 = QMessageBox::warning(
388 this,
389 tr("Warning"),
390 tr("File of connecter is exists. whether to overwrite it? "
391 "If select No, please modify the name of connecter"),
392 QMessageBox::StandardButton::Ok
393 | QMessageBox::StandardButton::No
394 | QMessageBox::StandardButton::Cancel,
395 QMessageBox::StandardButton::No);
396 if(QMessageBox::StandardButton::No == r)
397 {
398 bExit = false;
399 break;
400 }
401 if(QMessageBox::StandardButton::Cancel == r)
402 break;
403 bInsert = false;
404 }
405 m_pClient->SaveConnecter(c);
406 if(bInsert)
407 InsertItem(c, szFile);
408 break;
409 }
410 }
411
412 if(bExit)
413 break;
414 } while(1);
415
416 m_pClient->DeleteConnecter(c);
417 }
418}
419
420void CFrmListRecentConnects::slotDelete()
421{
422 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
423 QModelIndexList lstIndex = pSelect->selectedRows();
424 foreach(auto index, lstIndex)
425 {
426 QString szFile = m_pModel->item(index.row(), m_nFileRow)->text();
427 QDir d(szFile);
428 if(d.remove(szFile))
429 m_pModel->removeRow(index.row());
430 }
431}
432
433void CFrmListRecentConnects::slotConnect()
434{
435 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
436 QModelIndexList lstIndex = pSelect->selectedRows();
437 foreach(auto index, lstIndex)
438 {
439 QString szFile = m_pModel->item(index.row(), m_nFileRow)->text();
440 emit sigConnect(szFile);
441 }
442 if(!m_bDock) close();
443}
444
445void CFrmListRecentConnects::slotDetail()
446{
447 if(m_pDetail->isChecked()) {
448 m_pTableView->showColumn(3);
449 m_pTableView->showColumn(m_nFileRow);
450 } else {
451 m_pTableView->hideColumn(3);
452 m_pTableView->hideColumn(m_nFileRow);
453 }
454}
455
456void CFrmListRecentConnects::slotCustomContextMenu(const QPoint &pos)
457{
458 QMenu menu(this);
459
460 menu.addAction(QIcon::fromTheme("network-wired"),
461 tr("Connect"), this, SLOT(slotConnect()));
462 menu.addAction(tr("Edit and Connect"), this, SLOT(slotEditConnect()));
463 menu.addSeparator();
464 menu.addMenu(m_pMenuNew);
465 menu.addAction(tr("Edit"), this, SLOT(slotEdit()));
466 menu.addAction(QIcon::fromTheme("edit-copy"), tr("Copy"),
467 this, SLOT(slotCopy()));
468 menu.addAction(QIcon::fromTheme("edit-delete"), tr("Delete"),
469 this, SLOT(slotDelete()));
470 menu.addSeparator();
471 menu.addAction(QIcon::fromTheme("view-refresh"), tr("Refresh"),
472 this, SLOT(slotLoadFiles()));
473
474 menu.exec(mapToGlobal(pos));
475}
476
477void CFrmListRecentConnects::slotDoubleClicked(const QModelIndex& index)
478{
479 QString szFile = m_pModel->item(index.row(), m_nFileRow)->text();
480 emit sigConnect(szFile);
481 if(!m_bDock) close();
482}
manage plugins and connecter
Definition Client.h:49
virtual CConnecter * LoadConnecter(const QString &szFile)
New CConnecter pointer from file, the owner is caller.
Definition Client.cpp:284
virtual CConnecter * CreateConnecter(const QString &id)
New CConnecter pointer, the owner is caller.
Definition Client.cpp:223
virtual int DeleteConnecter(CConnecter *p)
Delete CConnecter.
Definition Client.cpp:251
virtual int SaveConnecter(CConnecter *pConnecter)
Accept connecter parameters to file.
Definition Client.cpp:324
Connecter interface.
Definition Connecter.h:62
virtual const QIcon Icon() const
Icon.
Definition Connecter.cpp:66
virtual int OpenDialogSettings(QWidget *parent=nullptr)
Open settings dialog.
Definition Connecter.cpp:85
virtual const QString Description()
Description.
Definition Connecter.cpp:50
virtual const QString Protocol() const
Protocol.
Definition Connecter.cpp:61
virtual const QString Id()
Identity.
Definition Connecter.cpp:39
virtual const QString Name()
Name.
Definition Connecter.cpp:45
virtual int onProcess(const QString &id, CPluginClient *pPlug) override
Process plugins.
The plugin interface.
virtual const QString DisplayName() const
The plugin display name.
virtual const QString Description() const =0
Plugin description.
virtual const QString Protocol() const =0
Plugin Protocol.