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