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