-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcalc4gwidget.cpp
More file actions
148 lines (124 loc) · 4.59 KB
/
Copy pathcalc4gwidget.cpp
File metadata and controls
148 lines (124 loc) · 4.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
#include "calc4gwidget.h"
#include "ui_calc4gwidget.h"
#include "carrierrow4g.h"
#include <QVBoxLayout>
#include <QOpenGLWidget>
#include <QScroller>
Calc4gWidget::Calc4gWidget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Calc4gWidget)
{
ui->setupUi(this);
// Fix scrolling and gesture recognition
QScroller::grabGesture(ui->scrollArea, QScroller::TouchGesture);
if (isOpenGLSupported()) {
// Safely "extract" the content panel created by the .ui file (which contains the carriersLayout)
// takeWidget() will remove the parent-child relationship but will not delete the object.
QWidget* contentWidget = ui->scrollArea->takeWidget();
// Now safe to set a new OpenGL viewport
ui->scrollArea->setViewport(new QOpenGLWidget());
// Put the removed content panel "back" to the QScrollArea.
// setWidget() will automatically set it as a child of the new viewport and manage its size.
ui->scrollArea->setWidget(contentWidget);
}
connect(ui->addCarrierButton, &QPushButton::clicked, this, &Calc4gWidget::addCarrierRow);
addCarrierRow(); // Add the primary carrier on init
}
Calc4gWidget::~Calc4gWidget()
{
delete ui;
}
void Calc4gWidget::addCarrierRow()
{
int newId = m_carrierRows.count();
bool isPrimary = (newId == m_primaryCarrierId);
CarrierRow4G *row = new CarrierRow4G(newId, isPrimary, this);
ui->carriersLayout->addWidget(row);
m_carrierRows.append(row);
connect(row, &CarrierRow4G::removeClicked, this, &Calc4gWidget::removeCarrierRow);
connect(row, &CarrierRow4G::uplinkAggClicked, this, &Calc4gWidget::toggleUplinkAggregation);
connect(row, &CarrierRow4G::dataChanged, this, &Calc4gWidget::calculateAll, Qt::QueuedConnection);
calculateAll();
}
void Calc4gWidget::removeCarrierRow(int carrierId)
{
if (carrierId == m_primaryCarrierId) return;
CarrierRow4G *rowToRemove = nullptr;
int indexToRemove = -1;
for (int i = 0; i < m_carrierRows.size(); ++i) {
if (m_carrierRows[i]->id() == carrierId) {
rowToRemove = m_carrierRows[i];
indexToRemove = i;
break;
}
}
if (rowToRemove) {
// Remove from data model
m_carrierRows.removeAt(indexToRemove);
// Remove and delete objects from the UI layout
ui->carriersLayout->removeWidget(rowToRemove);
rowToRemove->deleteLater();
// Update uplink aggregated carrier ID (important)
QSet<int> updatedUplinkCarriers;
for (int id : m_uplinkCarriers) {
if (id > carrierId) {
updatedUplinkCarriers.insert(id - 1);
} else if (id < carrierId) {
updatedUplinkCarriers.insert(id);
}
}
m_uplinkCarriers = updatedUplinkCarriers;
// Reindex all remaining carriers (important)
reindexCarriers();
// In the end recalculate all
calculateAll();
}
}
void Calc4gWidget::reindexCarriers()
{
for (int i = 0; i < m_carrierRows.count(); ++i) {
CarrierRow4G *row = m_carrierRows.at(i);
row->setId(i);
}
}
void Calc4gWidget::toggleUplinkAggregation(int carrierId)
{
if (m_uplinkCarriers.contains(carrierId)) {
m_uplinkCarriers.remove(carrierId);
} else {
m_uplinkCarriers.insert(carrierId);
}
calculateAll();
}
void Calc4gWidget::calculateAll()
{
double totalDownlink = 0.0;
double totalUplink = 0.0;
QString errorMessage;
for (int i = 0; i < m_carrierRows.size(); ++i) {
CarrierRow4G* row = m_carrierRows[i];
Calc4GResult result = row->calculate();
if (result.hasUnselectedBands) {
errorMessage = QString("Please select a band for Carrier #%1").arg(i + 1);
break;
}
totalDownlink += result.downlink;
if (m_uplinkCarriers.contains(row->id()) || row->id() == m_primaryCarrierId || row->isSUL()) {
totalUplink += result.uplink;
}
}
if (!errorMessage.isEmpty()) {
ui->totalSpeedLabel->setText(errorMessage);
} else {
QString dlTxt = totalDownlink > 0 ? QString("%1Mbps ↓").arg(round2(totalDownlink)) : "";
QString ulTxt = totalUplink > 0 ? QString("%1Mbps ↑").arg(round2(totalUplink)) : "";
QStringList parts;
if (!dlTxt.isEmpty()) parts << dlTxt;
if (!ulTxt.isEmpty()) parts << ulTxt;
QString displayText = parts.join(" & "); // Label does not require '&&' escape
if (displayText.isEmpty()) {
displayText = "Please select carrier options";
}
ui->totalSpeedLabel->setText(displayText);
}
}