1 /*
2 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
3
4 SPDX-FileCopyrightText: 2008 Eli J. MacKenzie <argonel at gmail.com>
5 */
6
7 #include "queuetuner.h"
8
9 #include "server.h"
10 #include "ircqueue.h"
11 #include "channel.h"
12 #include "viewcontainer.h"
13 #include "application.h"
14
15 #include <QContextMenuEvent>
16
17 #include <QMenu>
18 #include <KMessageBox>
19
20
QueueTuner(QWidget * parent,ViewContainer * container)21 QueueTuner::QueueTuner(QWidget* parent, ViewContainer *container)
22 : QWidget(parent), m_server(nullptr), m_timer(this),
23 m_vis(Preferences::self()->showQueueTunerItem()->value())
24 {
25 setupUi(this);
26
27 m_closeButton->setIcon(QIcon::fromTheme(QStringLiteral("dialog-close")));
28 connect(m_closeButton, &QToolButton::clicked, this, &QueueTuner::close);
29 connect(container, &ViewContainer::frontServerChanging, this, &QueueTuner::setServer);
30 connect(&m_timer, &QTimer::timeout, this, &QueueTuner::timerFired);
31
32 connect(m_slowRate, QOverload<int>::of(&QSpinBox::valueChanged), this, &QueueTuner::slowRateChanged);
33 connect(m_slowType, QOverload<int>::of(&KComboBox::activated), this, &QueueTuner::slowTypeChanged);
34 connect(m_slowInterval, QOverload<int>::of(&QSpinBox::valueChanged), this, &QueueTuner::slowIntervalChanged);
35
36 connect(m_normalRate, QOverload<int>::of(&QSpinBox::valueChanged), this, &QueueTuner::normalRateChanged);
37 connect(m_normalType, QOverload<int>::of(&KComboBox::activated), this, &QueueTuner::normalTypeChanged);
38 connect(m_normalInterval, QOverload<int>::of(&QSpinBox::valueChanged), this, &QueueTuner::normalIntervalChanged);
39
40 connect(m_fastRate, QOverload<int>::of(&QSpinBox::valueChanged), this, &QueueTuner::fastRateChanged);
41 connect(m_fastType, QOverload<int>::of(&KComboBox::activated), this, &QueueTuner::fastTypeChanged);
42 connect(m_fastInterval, QOverload<int>::of(&QSpinBox::valueChanged), this, &QueueTuner::fastIntervalChanged);
43
44 m_timer.setObjectName(QStringLiteral("qTuner"));
45 }
46
~QueueTuner()47 QueueTuner::~QueueTuner()
48 {
49 }
50
51 //lps, lpm, bps, kbps
rateToWidget(IRCQueue::EmptyingRate & rate,QSpinBox * r,KComboBox * t,QSpinBox * i)52 static void rateToWidget(IRCQueue::EmptyingRate& rate, QSpinBox *r, KComboBox* t, QSpinBox *i)
53 {
54 r->setValue(rate.m_rate);
55 t->setCurrentIndex(rate.m_type);
56 i->setValue(rate.m_interval/1000);
57 }
58
serverDestroyed(QObject * ref)59 void QueueTuner::serverDestroyed(QObject* ref)
60 {
61 if (ref == m_server)
62 setServer(nullptr);
63 }
64
setServer(Server * newServer)65 void QueueTuner::setServer(Server* newServer)
66 {
67 bool toShow = false;
68
69 if (!m_server && newServer)
70 toShow = true;
71 else if (!newServer && m_server)
72 hide();
73
74 // since this is tied to the new signal, we assume we're only getting called with a change
75
76 m_server = newServer;
77
78 if (toShow)
79 show();
80
81 if (m_server)
82 {
83 connect(m_server, &QObject::destroyed, this, &QueueTuner::serverDestroyed);
84
85 getRates();
86 }
87 }
88
getRates()89 void QueueTuner::getRates()
90 {
91 if (!m_server) // you can only get the popup if there is a server, but.. paranoid
92 return;
93
94 rateToWidget(m_server->m_queues[0]->getRate(), m_slowRate, m_slowType, m_slowInterval);
95 rateToWidget(m_server->m_queues[1]->getRate(), m_normalRate, m_normalType, m_normalInterval);
96 rateToWidget(m_server->m_queues[2]->getRate(), m_fastRate, m_fastType, m_fastInterval);
97 }
98
timerFired()99 void QueueTuner::timerFired()
100 {
101 if (m_server)
102 {
103 IRCQueue *q=nullptr;
104
105 q=m_server->m_queues[0];
106 m_slowAge->setNum(q->currentWait()/1000);
107 m_slowBytes->setNum(q->bytesSent());
108 m_slowCount->setNum(q->pendingMessages());
109 m_slowLines->setNum(q->linesSent());
110
111 q=m_server->m_queues[1];
112 m_normalAge->setNum(q->currentWait()/1000);
113 m_normalBytes->setNum(q->bytesSent());
114 m_normalCount->setNum(q->pendingMessages());
115 m_normalLines->setNum(q->linesSent());
116
117 q=m_server->m_queues[2];
118 m_fastAge->setNum(q->currentWait()/1000);
119 m_fastBytes->setNum(q->bytesSent());
120 m_fastCount->setNum(q->pendingMessages());
121 m_fastLines->setNum(q->linesSent());
122
123 m_srverBytes->setNum(m_server->m_encodedBytesSent);
124 m_globalBytes->setNum(m_server->m_bytesSent);
125 m_globalLines->setNum(m_server->m_linesSent);
126 m_recvBytes->setNum(m_server->m_bytesReceived);
127 }
128 }
129
open()130 void QueueTuner::open()
131 {
132 Preferences::self()->setShowQueueTuner(true);
133 show();
134 }
135
close()136 void QueueTuner::close()
137 {
138 Preferences::self()->setShowQueueTuner(false);
139 QWidget::close();
140 }
141
show()142 void QueueTuner::show()
143 {
144 if (m_server && Preferences::self()->showQueueTuner())
145 {
146 QWidget::show();
147 m_timer.start(500);
148
149 }
150 }
151
hide()152 void QueueTuner::hide()
153 {
154 QWidget::hide();
155 m_timer.stop();
156 }
157
slowRateChanged(int v)158 void QueueTuner::slowRateChanged(int v)
159 {
160 if (!m_server) return;
161 int &r=m_server->m_queues[0]->getRate().m_rate;
162 r=v;
163 }
164
slowTypeChanged(int v)165 void QueueTuner::slowTypeChanged(int v)
166 {
167 if (!m_server) return;
168 IRCQueue::EmptyingRate::RateType &r=m_server->m_queues[0]->getRate().m_type;
169 r=IRCQueue::EmptyingRate::RateType(v);
170 }
171
slowIntervalChanged(int v)172 void QueueTuner::slowIntervalChanged(int v)
173 {
174 if (!m_server) return;
175 int &r=m_server->m_queues[0]->getRate().m_interval;
176 r=v*1000;
177 }
178
normalRateChanged(int v)179 void QueueTuner::normalRateChanged(int v)
180 {
181 if (!m_server) return;
182 int &r=m_server->m_queues[1]->getRate().m_rate;
183 r=v;
184 }
185
normalTypeChanged(int v)186 void QueueTuner::normalTypeChanged(int v)
187 {
188 if (!m_server) return;
189 IRCQueue::EmptyingRate::RateType &r=m_server->m_queues[1]->getRate().m_type;
190 r=IRCQueue::EmptyingRate::RateType(v);
191 }
192
normalIntervalChanged(int v)193 void QueueTuner::normalIntervalChanged(int v)
194 {
195 if (!m_server) return;
196 int &r=m_server->m_queues[1]->getRate().m_interval;
197 r=v*1000;
198 }
199
fastRateChanged(int v)200 void QueueTuner::fastRateChanged(int v)
201 {
202 if (!m_server) return;
203 int &r=m_server->m_queues[2]->getRate().m_rate;
204 r=v;
205 }
206
fastTypeChanged(int v)207 void QueueTuner::fastTypeChanged(int v)
208 {
209 if (!m_server) return;
210 IRCQueue::EmptyingRate::RateType &r=m_server->m_queues[2]->getRate().m_type;
211 r=IRCQueue::EmptyingRate::RateType(v);
212 }
213
fastIntervalChanged(int v)214 void QueueTuner::fastIntervalChanged(int v)
215 {
216 if (!m_server) return;
217 int &r=m_server->m_queues[2]->getRate().m_interval;
218 r=v*1000;
219 }
220
contextMenuEvent(QContextMenuEvent * e)221 void QueueTuner::contextMenuEvent(QContextMenuEvent* e)
222 {
223 QMenu p(this);
224 p.addAction(i18n("Reset..."));
225 QAction *action = p.exec(e->globalPos());
226 if (action)
227 {
228
229 QString question(i18n("This cannot be undone, are you sure you wish to reset to default values?"));
230 int x = KMessageBox::warningContinueCancel(
231 this, question, i18n("Reset Values"),
232 KStandardGuiItem::reset(), KStandardGuiItem::cancel(),
233 QString(), KMessageBox::Dangerous
234 );
235 if (x == KMessageBox::Continue)
236 {
237 Application::instance()->resetQueueRates();
238 getRates();
239 }
240 }
241 e->accept();
242 }
243
244
245