Rabbit Remote Control 0.1.0-de
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 slotLoadFiles();
172
173 //必须在 setModel 后,才能应用
174 /*第二个参数可以为:
175 QHeaderView::Interactive :0 用户可设置,也可被程序设置成默认大小
176 QHeaderView::Fixed :2 用户不可更改列宽
177 QHeaderView::Stretch :1 根据空间,自动改变列宽,用户与程序不能改变列宽
178 QHeaderView::ResizeToContents:3 根据内容改变列宽,用户与程序不能改变列宽
179 */
180 m_pTableView->horizontalHeader()->setSectionResizeMode(
181#if defined(DEBUG) && !defined(Q_OS_ANDROID)
182 0,
183#endif
184 QHeaderView::Interactive);
185 //以下设置列宽函数必须要数据加载完成后使用,才能应用
186 //See: https://blog.csdn.net/qq_40450386/article/details/86083759
187 //m_pTableView->resizeColumnsToContents(); //设置所有列宽度自适应内容
188 //m_pTableView->resizeColumnToContents(0); //设置第0列宽度自适应内容
189 //m_pTableView->resizeColumnToContents(2); //设置第1列宽度自适应内容
190 //m_pTableView->resizeColumnToContents(3); //设置第1列宽度自适应内容
191
192 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
193 QModelIndexList lstIndex;
194 if(pSelect)
195 lstIndex = pSelect->selectedRows();
196 if(m_pModel->rowCount() > 0 && lstIndex.isEmpty())
197 {
198 m_pTableView->selectRow(0);
199 }
200
201}
202
203CFrmListRecent::~CFrmListRecent()
204{
205}
206
207void CFrmListRecent::slotLoadFiles()
208{
209 m_pModel->removeRows(0, m_pModel->rowCount());
210 QString szPath = RabbitCommon::CDir::Instance()->GetDirUserData();
211 QDir dir(szPath);
212 QStringList files = dir.entryList(QStringList() << "*.rrc",
213 QDir::Files, QDir::Time);
214 foreach (auto fileName, files) {
215 QString szFile = dir.absoluteFilePath(fileName);
216 if(szFile.isEmpty()) continue;
217 COperate* pOperate = m_pManager->LoadOperate(szFile);
218 if(!pOperate) continue;
219
220 QList<QStandardItem*> lstItem;
221 lstItem = GetItem(pOperate, szFile);
222 m_pModel->appendRow(lstItem);
223
224 m_pManager->DeleteOperate(pOperate);
225 }
226
227 m_pStart->setEnabled(m_pModel->rowCount() > 0);
228 m_pEditOperate->setEnabled(m_pModel->rowCount() > 0);
229 m_pEdit->setEnabled(m_pModel->rowCount() > 0);
230 m_pCopy->setEnabled(m_pModel->rowCount() > 0);
231 m_pDelete->setEnabled(m_pModel->rowCount() > 0);
232 m_pAddToFavorite->setEnabled(m_pModel->rowCount() > 0);
233
234 //以下设置列宽函数必须要数据加载完成后使用,才能应用
235 //See: https://blog.csdn.net/qq_40450386/article/details/86083759
236 //m_pTableView->resizeColumnsToContents(); //设置所有列宽度自适应内容
237 m_pTableView->resizeColumnToContents(ColumnNo::Name); //设置第0列宽度自适应内容
238 m_pTableView->resizeColumnToContents(ColumnNo::Protocol); //设置第1列宽度自适应内容
239 m_pTableView->resizeColumnToContents(ColumnNo::Type); //设置第1列宽度自适应内容
240 m_pTableView->resizeColumnToContents(ColumnNo::Date); //设置第1列宽度自适应内容
241 return;
242}
243
244QList<QStandardItem*> CFrmListRecent::GetItem(COperate* c, QString &szFile)
245{
246 QList<QStandardItem*> lstItem;
247 QStandardItem* pName = new QStandardItem(c->Icon(), c->Name());
248 pName->setToolTip(c->Description());
249 lstItem << pName;
250 QStandardItem* pProtocol = new QStandardItem(c->Protocol());
251 lstItem << pProtocol;
252 QStandardItem* pType = new QStandardItem(c->GetTypeName());
253 lstItem << pType;
254 //Date
255 QFileInfo fi(szFile);
256 lstItem << new QStandardItem(fi.lastModified().toString());
257 QStandardItem* pId = new QStandardItem(c->Id());
258 lstItem << pId;
259 QStandardItem* pFile = new QStandardItem(szFile);
260 lstItem << pFile;
261 return lstItem;
262}
263
264int CFrmListRecent::InsertItem(COperate *c, QString& szFile)
265{
266 QList<QStandardItem*> lstItem;
267 lstItem = GetItem(c, szFile);
268 m_pModel->insertRow(0, lstItem);
269 m_pTableView->selectRow(0);
270 return 0;
271}
272
273void CFrmListRecent::slotStartByType()
274{
275 qDebug(log) << Q_FUNC_INFO;
276 auto m = m_pMenuNew->actions();
277 foreach(auto a, m) {
278 a->deleteLater();
279 }
280 foreach (auto a, m_MenuStartByType) {
281 a->deleteLater();
282 }
283 m_pMenuNew->clear();
284 m_MenuStartByType.clear();
285 m_pManager->EnumPlugins(this);
286}
287
288int CFrmListRecent::onProcess(const QString &id, CPlugin *pPlugin)
289{
290 // Connect menu and toolbar
291 QMenu* m = m_pMenuNew;
292 if(m_ParameterApp.GetStartByType()) {
293 auto it = m_MenuStartByType.find(pPlugin->Type());
294 if(it == m_MenuStartByType.end()) {
295 m = new QMenu(pPlugin->TypeName(pPlugin->Type()), m_pMenuNew);
296 m_MenuStartByType[pPlugin->Type()] = m;
297 m_pMenuNew->addMenu(m);
298 } else
299 m = *it;
300 }
301 // Start menu and toolbar
302 QAction* p = m_pMainWindow->GetStartAction(m, pPlugin);
303 bool check = connect(p, SIGNAL(triggered()), this, SLOT(slotNew()));
304 Q_ASSERT(check);
305 return 0;
306}
307
308void CFrmListRecent::slotNew()
309{
310 QAction* pAction = dynamic_cast<QAction*>(this->sender());
311 COperate* pOperate = m_pManager->CreateOperate(pAction->data().toString());
312 if(nullptr == pOperate) return;
313
314 int nRet = pOperate->OpenDialogSettings(this);
315 switch(nRet)
316 {
317 case QDialog::Rejected:
318 break;
319 case QDialog::Accepted:
320 {
321 QString szFile = pOperate->GetSettingsFile();
322 QDir d;
323 if(d.exists(szFile)) {
324 QMessageBox::StandardButton r
325 = QMessageBox::warning(
326 this, tr("Warning"),
327 tr("The file is exists. whether to overwrite it? File: %1").arg(szFile),
328 QMessageBox::StandardButton::Ok | QMessageBox::StandardButton::No,
329 QMessageBox::StandardButton::No);
330 if(QMessageBox::StandardButton::Ok == r)
331 {
332 d.remove(szFile);
333 m_pManager->SaveOperate(pOperate);
334 }
335 break;
336 }
337
338 m_pManager->SaveOperate(pOperate);
339
340 InsertItem(pOperate, szFile);
341
342 break;
343 }
344 }
345
346 m_pManager->DeleteOperate(pOperate);
347}
348
349void CFrmListRecent::slotEdit()
350{
351 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
352 QModelIndexList lstIndex = pSelect->selectedRows();
353 foreach(auto index, lstIndex)
354 {
355 QString szFile = m_pModel->item(index.row(), ColumnNo::File)->text();
356 COperate* pOperate = m_pManager->LoadOperate(szFile);
357 int nRet = pOperate->OpenDialogSettings(this);
358 switch(nRet)
359 {
360 case QDialog::Rejected:
361 break;
362 case QDialog::Accepted:
363 m_pManager->SaveOperate(pOperate);
364 break;
365 }
366 m_pManager->DeleteOperate(pOperate);
367 }
368}
369
370void CFrmListRecent::slotEditConnect()
371{
372 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
373 QModelIndexList lstIndex = pSelect->selectedRows();
374 foreach(auto index, lstIndex)
375 {
376 QString szFile = m_pModel->item(index.row(), ColumnNo::File)->text();
377 COperate* c = m_pManager->LoadOperate(szFile);
378 int nRet = c->OpenDialogSettings(this);
379 switch(nRet)
380 {
381 case QDialog::Rejected:
382 break;
383 case QDialog::Accepted:
384 m_pManager->SaveOperate(c);
385 emit sigStart(szFile);
386 break;
387 }
388 m_pManager->DeleteOperate(c);
389 }
390 if(!m_bDock)
391 close();
392}
393
394void CFrmListRecent::slotCopy()
395{
396 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
397 QModelIndexList lstIndex = pSelect->selectedRows();
398 foreach(auto index, lstIndex)
399 {
400 QString szFile = m_pModel->item(index.row(), ColumnNo::File)->text();
401 COperate* pOperate = m_pManager->LoadOperate(szFile);
402
403 do {
404 bool bExit = true;
405 bool bInsert = true;
406 int nRet = pOperate->OpenDialogSettings(this);
407 switch(nRet)
408 {
409 case QDialog::Rejected:
410 break;
411 case QDialog::Accepted:
412 {
413 szFile = pOperate->GetSettingsFile();
414 QDir d(szFile);
415 if(d.exists(szFile)) {
416 QMessageBox::StandardButton r
417 = QMessageBox::warning(
418 this,
419 tr("Warning"),
420 tr("The file is exists. whether to overwrite it?"
421 " If select No, please modify the name."),
422 QMessageBox::StandardButton::Ok
423 | QMessageBox::StandardButton::No
424 | QMessageBox::StandardButton::Cancel,
425 QMessageBox::StandardButton::No);
426 if(QMessageBox::StandardButton::No == r)
427 {
428 bExit = false;
429 break;
430 }
431 if(QMessageBox::StandardButton::Cancel == r)
432 break;
433 bInsert = false;
434 }
435 m_pManager->SaveOperate(pOperate);
436 if(bInsert)
437 InsertItem(pOperate, szFile);
438 break;
439 }
440 }
441
442 if(bExit)
443 break;
444 } while(1);
445
446 m_pManager->DeleteOperate(pOperate);
447 }
448}
449
450void CFrmListRecent::slotDelete()
451{
452 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
453 QModelIndexList lstIndex = pSelect->selectedRows();
454 foreach(auto index, lstIndex)
455 {
456 QString szFile = m_pModel->item(index.row(), ColumnNo::File)->text();
457 QDir d(szFile);
458 if(d.remove(szFile))
459 m_pModel->removeRow(index.row());
460 }
461}
462
463void CFrmListRecent::slotStart()
464{
465 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
466 QModelIndexList lstIndex = pSelect->selectedRows();
467 foreach(auto index, lstIndex)
468 {
469 QString szFile = m_pModel->item(index.row(), ColumnNo::File)->text();
470 emit sigStart(szFile);
471 }
472 if(!m_bDock) close();
473}
474
475void CFrmListRecent::slotDetail()
476{
477 if(m_pDetail->isChecked()) {
478 m_pTableView->showColumn(ColumnNo::ID);
479 m_pTableView->showColumn(ColumnNo::File);
480 } else {
481 m_pTableView->hideColumn(ColumnNo::ID);
482 m_pTableView->hideColumn(ColumnNo::File);
483 }
484}
485
486void CFrmListRecent::slotCustomContextMenu(const QPoint &pos)
487{
488 QMenu menu(this);
489
490 menu.addAction(m_pStart);
491 menu.addAction(m_pStart);
492 menu.addSeparator();
493 menu.addMenu(m_pMenuNew);
494 menu.addAction(m_pEdit);
495 menu.addAction(m_pCopy);
496 menu.addAction(m_pDelete);
497 menu.addSeparator();
498 menu.addAction(m_pAddToFavorite);
499 if(m_bDock)
500 menu.addAction(m_pRefresh);
501
502 menu.exec(mapToGlobal(pos));
503}
504
505void CFrmListRecent::slotDoubleClicked(const QModelIndex& index)
506{
507 if(!index.isValid()) return;
508 QString szFile = m_pModel->item(index.row(), ColumnNo::File)->text();
509 emit sigStart(szFile);
510 if(!m_bDock) close();
511}
512
513void CFrmListRecent::slotAddToFavorite()
514{
515 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
516 QModelIndexList lstIndex = pSelect->selectedRows();
517 foreach(auto index, lstIndex)
518 {
519 if(!index.isValid()) continue;
520 auto item = m_pModel->item(index.row(), ColumnNo::Name);
521 if(!item) continue;
522 QString szName = item->text();
523 QIcon icon = item->icon();
524 QString szDescription = item->toolTip();
525 QString szFile = m_pModel->item(index.row(), ColumnNo::File)->text();
526 emit sigAddToFavorite(szName, szDescription, icon, szFile);
527 }
528}
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:409
virtual COperate * CreateOperate(const QString &id)
New COperate pointer, the owner is caller.
Definition Manager.cpp:207
virtual COperate * LoadOperate(const QString &szFile)
New COperate pointer from file, the owner is caller.
Definition Manager.cpp:268
virtual int DeleteOperate(COperate *p)
Delete COperate.
Definition Manager.cpp:235
virtual int SaveOperate(COperate *pOperate)
Accept Operate parameters to file.
Definition Manager.cpp:307
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:34