Rabbit Remote Control 0.0.34
Loading...
Searching...
No Matches
FrmConnecters.cpp
1#include <QVBoxLayout>
2#include <QLoggingCategory>
3#include <QHeaderView>
4#include <QLabel>
5#include <QMenu>
6#include "FrmConnecters.h"
7
8static Q_LOGGING_CATEGORY(log, "App.FrmConnecters")
9
10CFrmConnecters::CFrmConnecters(QVector<CConnecter*> &Connecters,
11 CParameterApp &parameterApp,
12 QMenu* pConnect,
13 QAction* pDisconnect,
14 RabbitCommon::CRecentMenu *pRecentMenu,
15 QWidget *parent)
16 : QWidget(parent)
17 , m_pDockTitleBar(nullptr)
18 , m_pConnect(pConnect)
19 , m_pDisconnect(pDisconnect)
20 , m_pRecentMenu(pRecentMenu)
21 , m_Connecters(Connecters)
22 , m_ParameterApp(parameterApp)
23 , m_pTableView(nullptr)
24 , m_pModel(nullptr)
25 , m_pMenu(nullptr)
26 , m_pToolBar(nullptr)
27 , m_nId(2)
28{
29 bool check = false;
30 setFocusPolicy(Qt::NoFocus);
31 //setAttribute(Qt::WA_DeleteOnClose);
32 setWindowTitle(tr("List active connections"));
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.GetDockListConnectersShowToolBar());
43 // Create recent menu
44 auto ptbRecent = new QToolButton(m_pToolBar);
45 ptbRecent->setFocusPolicy(Qt::NoFocus);
46 ptbRecent->setPopupMode(QToolButton::InstantPopup);
47 //m_ptbConnect->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 connect menu
55 auto ptbConnect = new QToolButton(m_pToolBar);
56 ptbConnect->setFocusPolicy(Qt::NoFocus);
57 ptbConnect->setPopupMode(QToolButton::InstantPopup);
58 //m_ptbConnect->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
59 ptbConnect->setMenu(m_pConnect);
60 ptbConnect->setIcon(m_pConnect->icon());
61 ptbConnect->setText(m_pConnect->title());
62 ptbConnect->setToolTip(m_pConnect->title());
63 ptbConnect->setStatusTip(m_pConnect->title());
64 m_pToolBar->addWidget(ptbConnect);
65
66 m_pToolBar->addAction(m_pDisconnect);
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_pConnect);
74 m_pMenu->addAction(m_pDisconnect);
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_pDisconnect);
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.SetDockListConnectersShowToolBar(a->isChecked());
86 m_ParameterApp.Save();
87 }
88 });
89 pShowToolBar->setCheckable(true);
90 pShowToolBar->setChecked(m_ParameterApp.GetDockListConnectersShowToolBar());
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(m_nId, new QStandardItem(tr("ID")));
120
121 slotLoadConnecters();
122
123 //必须在 setModel 后,才能应用
124 /*第二个参数可以为:
125 QHeaderView::Interactive :0 用户可设置,也可被程序设置成默认大小
126 QHeaderView::Fixed :2 用户不可更改列宽
127 QHeaderView::Stretch :1 根据空间,自动改变列宽,用户与程序不能改变列宽
128 QHeaderView::ResizeToContents:3 根据内容改变列宽,用户与程序不能改变列宽
129 */
130 m_pTableView->horizontalHeader()->setSectionResizeMode(
131#if defined(DEBUG) && !defined(Q_OS_ANDROID)
132 0,
133#endif
134 QHeaderView::Interactive);
135 //以下设置列宽函数必须要数据加载完成后使用,才能应用
136 //See: https://blog.csdn.net/qq_40450386/article/details/86083759
137 //m_pTableView->resizeColumnsToContents(); //设置所有列宽度自适应内容
138 //m_pTableView->resizeColumnToContents(0); //设置第0列宽度自适应内容
139 //m_pTableView->resizeColumnToContents(m_nId); //设置第1列宽度自适应内容
140
141 QItemSelectionModel* pSelect = m_pTableView->selectionModel();
142 QModelIndexList lstIndex;
143 if(pSelect)
144 lstIndex = pSelect->selectedRows();
145 if(m_pModel->rowCount() > 0 && lstIndex.isEmpty())
146 {
147 m_pTableView->selectRow(0);
148 }
149}
150
151CFrmConnecters::~CFrmConnecters()
152{}
153
154void CFrmConnecters::slotCustomContextMenu(const QPoint &pos)
155{
156 QMenu menu;
157 menu.addMenu(m_pRecentMenu);
158 menu.addMenu(m_pConnect);
159 menu.addAction(m_pDisconnect);
160 menu.addSeparator();
161 int r = m_pTableView->currentIndex().row();
162 if(-1 < r && r < m_Connecters.size())
163 {
164 auto c = m_Connecters[r];
165 if(c) {
166 auto m = c->GetMenu();
167 //menu.addMenu(m);
168 if(m)
169 menu.addActions(m->actions());
170 }
171 }
172 menu.exec(mapToGlobal(pos));
173}
174
175void CFrmConnecters::slotClicked(const QModelIndex &index)
176{
177 QVariant v = m_pModel->item(index.row(), m_nId)->data();
178 CConnecter* c = v.value<CConnecter*>();
179 emit sigConnecterChanged(c);
180}
181
182void CFrmConnecters::slotLoadConnecters()
183{
184 if(!m_pModel)
185 return;
186 m_pModel->removeRows(0, m_pModel->rowCount());
187 foreach(auto c, m_Connecters) {
188 QList<QStandardItem*> lstItem;
189 QStandardItem* pName = new QStandardItem(c->Icon(), c->Name());
190 pName->setToolTip(c->Description());
191 lstItem << pName;
192 QStandardItem* pProtocol = new QStandardItem(c->Protocol());
193 lstItem << pProtocol;
194 QStandardItem* pId = new QStandardItem(c->Id());
195 QVariant v;
196 v.setValue(c);
197 pId->setData(v);
198 lstItem << pId;
199 m_pModel->appendRow(lstItem);
200 }
201
202 //以下设置列宽函数必须要数据加载完成后使用,才能应用
203 //See: https://blog.csdn.net/qq_40450386/article/details/86083759
204 //m_pTableView->resizeColumnsToContents(); //设置所有列宽度自适应内容
205 m_pTableView->resizeColumnToContents(0); //设置第0列宽度自适应内容
206 //m_pTableView->resizeColumnToContents(m_nId); //设置第1列宽度自适应内容
207}
208
209void CFrmConnecters::slotViewChanged(const QWidget *pView)
210{
211 int nIndex = -1;
212 if(m_Connecters.size() != m_pModel->rowCount())
213 slotLoadConnecters();
214 foreach (auto c, m_Connecters) {
215 nIndex++;
216 if(c->GetViewer() == pView)
217 break;
218 }
219 if(-1 >= nIndex)
220 return;
221 m_pTableView->selectRow(nIndex);
222}
Connecter interface.
Definition Connecter.h:62