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