Rabbit Remote Control 0.1.0-alpha.2
Loading...
Searching...
No Matches
FrmActive.cpp
1#include <QVBoxLayout>
2#include <QLoggingCategory>
3#include <QHeaderView>
4#include <QLabel>
5#include <QMenu>
6#include "FrmActive.h"
7
8static Q_LOGGING_CATEGORY(log, "App.FrmActive")
9
10CFrmActive::CFrmActive(QVector<COperate*> &operates,
11 CParameterApp &parameterApp,
12 QMenu* pOperate,
13 QAction* pStop,
14 RabbitCommon::CRecentMenu *pRecentMenu,
15 QWidget *parent)
16 : QWidget(parent)
17 , m_pDockTitleBar(nullptr)
18 , m_pOperate(pOperate)
19 , m_pStop(pStop)
20 , m_pRecentMenu(pRecentMenu)
21 , m_Operates(operates)
22 , m_pAddToFavorite(nullptr)
23 , m_ParameterApp(parameterApp)
24 , m_pTableView(nullptr)
25 , m_pModel(nullptr)
26 , m_pMenu(nullptr)
27 , m_pToolBar(nullptr)
28 , m_nId(3)
29{
30 bool check = false;
31 setFocusPolicy(Qt::NoFocus);
32 //setAttribute(Qt::WA_DeleteOnClose);
33 setWindowTitle(tr("Activity list"));
34
35 QVBoxLayout* pLayout = new QVBoxLayout(this);
36 if(!pLayout) {
37 qCritical(log) << "new QVBoxLayout(this) fail";
38 return;
39 }
40 setLayout(pLayout);
41
42 m_pToolBar = new QToolBar(this);
43 m_pToolBar->setVisible(m_ParameterApp.GetDockListActiveShowToolBar());
44 // Create recent menu
45 auto ptbRecent = new QToolButton(m_pToolBar);
46 ptbRecent->setFocusPolicy(Qt::NoFocus);
47 ptbRecent->setPopupMode(QToolButton::InstantPopup);
48 //ptbRecent->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
49 ptbRecent->setMenu(m_pRecentMenu);
50 ptbRecent->setIcon(m_pRecentMenu->icon());
51 ptbRecent->setText(m_pRecentMenu->title());
52 ptbRecent->setToolTip(m_pRecentMenu->title());
53 ptbRecent->setStatusTip(m_pRecentMenu->title());
54 m_pToolBar->addWidget(ptbRecent);
55 // Create start menu
56 auto ptbStart = new QToolButton(m_pToolBar);
57 ptbStart->setFocusPolicy(Qt::NoFocus);
58 ptbStart->setPopupMode(QToolButton::InstantPopup);
59 //ptbStart->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
60 ptbStart->setMenu(m_pOperate);
61 ptbStart->setIcon(m_pOperate->icon());
62 ptbStart->setText(m_pOperate->title());
63 ptbStart->setToolTip(m_pOperate->title());
64 ptbStart->setStatusTip(m_pOperate->title());
65 m_pToolBar->addWidget(ptbStart);
66
67 m_pToolBar->addAction(m_pStop);
68 m_pToolBar->addSeparator();
69 m_pAddToFavorite = m_pToolBar->addAction(QIcon::fromTheme("emblem-favorite"), tr("Add to favorite"),
70 this, SLOT(slotAddToFavorite()));
71 m_pAddToFavorite->setStatusTip(m_pAddToFavorite->text());
72 m_pAddToFavorite->setToolTip(m_pAddToFavorite->text());
73 m_pAddToFavorite->setEnabled(false);
74 layout()->addWidget(m_pToolBar);
75
76 m_pDockTitleBar = new RabbitCommon::CTitleBar(parent);
77 // Create tools pushbutton in title bar
78 m_pMenu = new QMenu(tr("Tools"), m_pDockTitleBar);
79 m_pMenu->addMenu(m_pRecentMenu);
80 m_pMenu->addMenu(m_pOperate);
81 m_pMenu->addAction(m_pStop);
82 m_pMenu->addAction(m_pAddToFavorite);
83
84 QPushButton* pTools = m_pDockTitleBar->CreateSmallPushButton(
85 QIcon::fromTheme("tools"), m_pDockTitleBar);
86 pTools->setToolTip(tr("Tools"));
87 pTools->setMenu(m_pMenu);
88 m_pMenu->addSeparator();
89 auto pShowToolBar = m_pMenu->addAction(tr("Show tool bar"), this, [&](){
90 QAction* a = (QAction*)sender();
91 if(a) {
92 m_pToolBar->setVisible(a->isChecked());
93 m_ParameterApp.SetDockListActiveShowToolBar(a->isChecked());
94 m_ParameterApp.Save();
95 }
96 });
97 pShowToolBar->setCheckable(true);
98 pShowToolBar->setChecked(m_ParameterApp.GetDockListActiveShowToolBar());
99
100 QList<QWidget*> lstWidget;
101 lstWidget << pTools;
102 m_pDockTitleBar->AddWidgets(lstWidget);
103
104 m_pTableView = new QTableView(this);
105 if(!m_pTableView) {
106 qCritical(log) << "new QTableView fail";
107 return;
108 }
109 layout()->addWidget(m_pTableView);
110 m_pTableView->setContextMenuPolicy(Qt::CustomContextMenu);
111 check = connect(m_pTableView,
112 SIGNAL(customContextMenuRequested(const QPoint &)),
113 this, SLOT(slotCustomContextMenu(const QPoint &)));
114 Q_ASSERT(check);
115 check = connect(m_pTableView, SIGNAL(clicked(const QModelIndex &)),
116 this, SLOT(slotClicked(const QModelIndex&)));
117 Q_ASSERT(check);
118
119 m_pModel = new QStandardItemModel(m_pTableView);
120 m_pTableView->setModel(m_pModel);
121 m_pTableView->verticalHeader()->hide();
122 m_pTableView->setSelectionMode(QAbstractItemView::SingleSelection);
123 m_pTableView->setSelectionBehavior(QAbstractItemView::SelectRows);
124 m_pTableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
125 m_pModel->setHorizontalHeaderItem(0, new QStandardItem(tr("Name")));
126 m_pModel->setHorizontalHeaderItem(1, new QStandardItem(tr("Protocol")));
127 m_pModel->setHorizontalHeaderItem(2, new QStandardItem(tr("Type")));
128 m_pModel->setHorizontalHeaderItem(m_nId, new QStandardItem(tr("ID")));
129
130 slotLoad();
131
132 //必须在 setModel 后,才能应用
133 /*第二个参数可以为:
134 QHeaderView::Interactive :0 用户可设置,也可被程序设置成默认大小
135 QHeaderView::Fixed :2 用户不可更改列宽
136 QHeaderView::Stretch :1 根据空间,自动改变列宽,用户与程序不能改变列宽
137 QHeaderView::ResizeToContents:3 根据内容改变列宽,用户与程序不能改变列宽
138 */
139 m_pTableView->horizontalHeader()->setSectionResizeMode(
140#if defined(DEBUG) && !defined(Q_OS_ANDROID)
141 0,
142#endif
143 QHeaderView::Interactive);
144 //以下设置列宽函数必须要数据加载完成后使用,才能应用
145 //See: https://blog.csdn.net/qq_40450386/article/details/86083759
146 //m_pTableView->resizeColumnsToContents(); //设置所有列宽度自适应内容
147 //m_pTableView->resizeColumnToContents(0); //设置第0列宽度自适应内容
148 //m_pTableView->resizeColumnToContents(1); //设置第0列宽度自适应内容
149 //m_pTableView->resizeColumnToContents(2); //设置第0列宽度自适应内容
150 //m_pTableView->resizeColumnToContents(m_nId); //设置第1列宽度自适应内容
151
152 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
153 QModelIndexList lstIndex;
154 if(pSelect)
155 lstIndex = pSelect->selectedRows();
156 if(m_pModel->rowCount() > 0 && lstIndex.isEmpty())
157 {
158 m_pTableView->selectRow(0);
159 }
160}
161
162CFrmActive::~CFrmActive()
163{}
164
165void CFrmActive::slotCustomContextMenu(const QPoint &pos)
166{
167 QMenu menu;
168 int r = m_pTableView->currentIndex().row();
169 if(-1 < r && r < m_Operates.size())
170 {
171 auto c = m_Operates[r];
172 if(c) {
173 auto m = c->GetMenu();
174 //menu.addMenu(m);
175 if(m)
176 menu.addActions(m->actions());
177 }
178 }
179 if(!menu.isEmpty())
180 menu.addSeparator();
181 menu.addMenu(m_pRecentMenu);
182 menu.addMenu(m_pOperate);
183 menu.addAction(m_pStop);
184 menu.addSeparator();
185 menu.addAction(m_pAddToFavorite);
186 menu.exec(mapToGlobal(pos));
187}
188
189void CFrmActive::slotClicked(const QModelIndex &index)
190{
191 QVariant v = m_pModel->item(index.row(), m_nId)->data();
192 COperate* c = v.value<COperate*>();
193 emit sigChanged(c);
194}
195
196void CFrmActive::slotLoad()
197{
198 if(!m_pModel)
199 return;
200 m_pModel->removeRows(0, m_pModel->rowCount());
201 m_pAddToFavorite->setEnabled(m_Operates.size() > 0);
202 foreach(auto c, m_Operates) {
203 QList<QStandardItem*> lstItem;
204 QStandardItem* pName = new QStandardItem(c->Icon(), c->Name());
205 pName->setToolTip(c->Description());
206 lstItem << pName;
207 QStandardItem* pProtocol = new QStandardItem(c->Protocol());
208 lstItem << pProtocol;
209 QStandardItem* pType = new QStandardItem(c->GetTypeName());
210 lstItem << pType;
211 QStandardItem* pId = new QStandardItem(c->Id());
212 QVariant v;
213 v.setValue(c);
214 pId->setData(v);
215 lstItem << pId;
216 m_pModel->appendRow(lstItem);
217 }
218
219 //以下设置列宽函数必须要数据加载完成后使用,才能应用
220 //See: https://blog.csdn.net/qq_40450386/article/details/86083759
221 //m_pTableView->resizeColumnsToContents(); //设置所有列宽度自适应内容
222 m_pTableView->resizeColumnToContents(0); //设置第0列宽度自适应内容
223 //m_pTableView->resizeColumnToContents(m_nId); //设置第1列宽度自适应内容
224}
225
226void CFrmActive::slotViewChanged(const QWidget *pView)
227{
228 int nIndex = -1;
229 if(m_Operates.size() != m_pModel->rowCount())
230 slotLoad();
231 foreach (auto c, m_Operates) {
232 nIndex++;
233 if(c->GetViewer() == pView)
234 break;
235 }
236 if(-1 >= nIndex)
237 return;
238 m_pTableView->selectRow(nIndex);
239}
240
241void CFrmActive::slotAddToFavorite()
242{
243 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
244 QModelIndexList lstIndex = pSelect->selectedRows();
245 foreach(auto index, lstIndex)
246 {
247 if(!index.isValid()) continue;
248 QVariant v = m_pModel->item(index.row(), m_nId)->data();
249 COperate* c = v.value<COperate*>();
250 if(!c) continue;
251 QString szName = c->Name();
252 QIcon icon = c->Icon();
253 QString szDescription = c->Description();
254 QString szFile = c->GetSettingsFile();
255 emit sigAddToFavorite(szName, szDescription, icon, szFile);
256 }
257}
Operate interface.
Definition Operate.h:51
virtual const QIcon Icon() const
Icon.
Definition Operate.cpp:82
virtual const QString Name()
Name.
Definition Operate.cpp:41
virtual const QString Description()
Description.
Definition Operate.cpp:46