Libksysguard

Formatter.cpp
1/*
2 SPDX-FileCopyrightText: 2019 Vlad Zahorodnii <vlad.zahorodnii@kde.org>
3
4 formatBootTimestamp is based on TimeUtil class:
5 SPDX-FileCopyrightText: 2014 Gregor Mi <codestruct@posteo.org>
6
7 SPDX-License-Identifier: LGPL-2.0-or-later
8*/
9
10#include "Formatter.h"
11
12#include <KFormat>
13#include <KLocalizedString>
14
15#include <QFontMetrics>
16#include <QLocale>
17#include <QTime>
18
19#include <cmath>
20#include <ctime>
21
22#include <time.h>
23#include <unistd.h>
24
25#include "formatter_debug.h"
26
27namespace KSysGuard
28{
29// TODO: Is there a bit nicer way to handle formatting?
30
31static KLocalizedString unitFormat(Unit unit)
32{
33 const static KLocalizedString B = ki18nc("Bytes unit symbol", "%1 B");
34 const static KLocalizedString KiB = ki18nc("Kilobytes unit symbol", "%1 KiB");
35 const static KLocalizedString MiB = ki18nc("Megabytes unit symbol", "%1 MiB");
36 const static KLocalizedString GiB = ki18nc("Gigabytes unit symbol", "%1 GiB");
37 const static KLocalizedString TiB = ki18nc("Terabytes unit symbol", "%1 TiB");
38 const static KLocalizedString PiB = ki18nc("Petabytes unit symbol", "%1 PiB");
39
40 const static KLocalizedString bps = ki18nc("Bytes per second unit symbol", "%1 B/s");
41 const static KLocalizedString Kbps = ki18nc("Kilobytes per second unit symbol", "%1 KiB/s");
42 const static KLocalizedString Mbps = ki18nc("Megabytes per second unit symbol", "%1 MiB/s");
43 const static KLocalizedString Gbps = ki18nc("Gigabytes per second unit symbol", "%1 GiB/s");
44 const static KLocalizedString Tbps = ki18nc("Terabytes per second unit symbol", "%1 TiB/s");
45 const static KLocalizedString Pbps = ki18nc("Petabytes per second unit symbol", "%1 PiB/s");
46
47 const static KLocalizedString bitsps = ki18nc("Bits per second unit symbol", "%1 bps");
48 const static KLocalizedString Kbitsps = ki18nc("Kilobits per second unit symbol", "%1 Kbps");
49 const static KLocalizedString Mbitsps = ki18nc("Megabits per second unit symbol", "%1 Mbps");
50 const static KLocalizedString Gbitsps = ki18nc("Gigabits per second unit symbol", "%1 Gbps");
51 const static KLocalizedString Tbitsps = ki18nc("Terabits per second unit symbol", "%1 Tbps");
52 const static KLocalizedString Pbitsps = ki18nc("Petabits per second unit symbol", "%1 Pbps");
53
54 const static KLocalizedString Hz = ki18nc("Hertz unit symbol", "%1 Hz");
55 const static KLocalizedString kHz = ki18nc("Kilohertz unit symbol", "%1 kHz");
56 const static KLocalizedString MHz = ki18nc("Megahertz unit symbol", "%1 MHz");
57 const static KLocalizedString GHz = ki18nc("Gigahertz unit symbol", "%1 GHz");
58 const static KLocalizedString THz = ki18nc("Terahertz unit symbol", "%1 THz");
59 const static KLocalizedString PHz = ki18nc("Petahertz unit symbol", "%1 PHz");
60
61 const static KLocalizedString V = ki18nc("Volts unit symbol", "%1 V");
62 const static KLocalizedString kV = ki18nc("Kilovolts unit symbol", "%1 kV");
63 const static KLocalizedString MV = ki18nc("Megavolts unit symbol", "%1 MV");
64 const static KLocalizedString GV = ki18nc("Gigavolts unit symbol", "%1 GV");
65 const static KLocalizedString TV = ki18nc("Teravolts unit symbol", "%1 TV");
66 const static KLocalizedString PV = ki18nc("Petavolts unit symbol", "%1 PV");
67
68 const static KLocalizedString W = ki18nc("Watts unit symbol", "%1 W");
69 const static KLocalizedString kW = ki18nc("Kilowatts unit symbol", "%1 kW");
70 const static KLocalizedString MW = ki18nc("Megawatts unit symbol", "%1 MW");
71 const static KLocalizedString GW = ki18nc("Gigawatts unit symbol", "%1 GW");
72 const static KLocalizedString TW = ki18nc("Terawatts unit symbol", "%1 TW");
73 const static KLocalizedString PW = ki18nc("Petawatts unit symbol", "%1 PW");
74
75 const static KLocalizedString Wh = ki18nc("Watt-hours unit symbol", "%1 Wh");
76 const static KLocalizedString kWh = ki18nc("Kilowatt-hours unit symbol", "%1 kWh");
77 const static KLocalizedString MWh = ki18nc("Megawatt-hours unit symbol", "%1 MWh");
78 const static KLocalizedString GWh = ki18nc("Gigawatt-hours unit symbol", "%1 GWh");
79 const static KLocalizedString TWh = ki18nc("Terawatt-hours unit symbol", "%1 TWh");
80 const static KLocalizedString PWh = ki18nc("Petawatt-hours unit symbol", "%1 PWh");
81
82 const static KLocalizedString A = ki18nc("Ampere unit symbol", "%1 A");
83 const static KLocalizedString kA = ki18nc("Kiloamperes unit symbol", "%1 kA");
84 const static KLocalizedString MA = ki18nc("Megaamperes unit symbol", "%1 MA");
85 const static KLocalizedString GA = ki18nc("Gigaamperes unit symbol", "%1 GA");
86 const static KLocalizedString TA = ki18nc("Teraamperes unit symbol", "%1 TA");
87 const static KLocalizedString PA = ki18nc("Petaamperes unit symbol", "%1 PA");
88
89 const static KLocalizedString percent = ki18nc("Percent unit", "%1%");
90 const static KLocalizedString RPM = ki18nc("Revolutions per minute unit symbol", "%1 RPM");
91 const static KLocalizedString C = ki18nc("Celsius unit symbol", "%1°C");
92 const static KLocalizedString dBm = ki18nc("Decibels unit symbol", "%1 dBm");
93 const static KLocalizedString s = ki18nc("Seconds unit symbol", "%1s");
94 const static KLocalizedString rate = ki18nc("Rate unit symbol", "%1 s⁻¹");
95 const static KLocalizedString unitless = ki18nc("Unitless", "%1");
96
97 switch (unit) {
98 case UnitByte:
99 return B;
100 case UnitKiloByte:
101 return KiB;
102 case UnitMegaByte:
103 return MiB;
104 case UnitGigaByte:
105 return GiB;
106 case UnitTeraByte:
107 return TiB;
108 case UnitPetaByte:
109 return PiB;
110
111 case UnitByteRate:
112 return bps;
113 case UnitKiloByteRate:
114 return Kbps;
115 case UnitMegaByteRate:
116 return Mbps;
117 case UnitGigaByteRate:
118 return Gbps;
119 case UnitTeraByteRate:
120 return Tbps;
121 case UnitPetaByteRate:
122 return Pbps;
123
124 case UnitBitRate:
125 return bitsps;
126 case UnitKiloBitRate:
127 return Kbitsps;
128 case UnitMegaBitRate:
129 return Mbitsps;
130 case UnitGigaBitRate:
131 return Gbitsps;
132 case UnitTeraBitRate:
133 return Tbitsps;
134 case UnitPetaBitRate:
135 return Pbitsps;
136
137 case UnitHertz:
138 return Hz;
139 case UnitKiloHertz:
140 return kHz;
141 case UnitMegaHertz:
142 return MHz;
143 case UnitGigaHertz:
144 return GHz;
145 case UnitTeraHertz:
146 return THz;
147 case UnitPetaHertz:
148 return PHz;
149
150 case UnitVolt:
151 return V;
152 case UnitKiloVolt:
153 return kV;
154 case UnitMegaVolt:
155 return MV;
156 case UnitGigaVolt:
157 return GV;
158 case UnitTeraVolt:
159 return TV;
160 case UnitPetaVolt:
161 return PV;
162
163 case UnitWatt:
164 return W;
165 case UnitKiloWatt:
166 return kW;
167 case UnitMegaWatt:
168 return MW;
169 case UnitGigaWatt:
170 return GW;
171 case UnitTeraWatt:
172 return TW;
173 case UnitPetaWatt:
174 return PV;
175
176 case UnitWattHour:
177 return Wh;
178 case UnitKiloWattHour:
179 return kWh;
180 case UnitMegaWattHour:
181 return MWh;
182 case UnitGigaWattHour:
183 return GWh;
184 case UnitTeraWattHour:
185 return TWh;
186 case UnitPetaWattHour:
187 return PWh;
188
189 case UnitAmpere:
190 return A;
191 case UnitKiloAmpere:
192 return kA;
193 case UnitMegaAmpere:
194 return MA;
195 case UnitGigaAmpere:
196 return GA;
197 case UnitTeraAmpere:
198 return TA;
199 case UnitPetaAmpere:
200 return PA;
201
202 case UnitCelsius:
203 return C;
204 case UnitDecibelMilliWatts:
205 return dBm;
206 case UnitPercent:
207 return percent;
208 case UnitRate:
209 return rate;
210 case UnitRpm:
211 return RPM;
212 case UnitSecond:
213 return s;
214
215 default:
216 return unitless;
217 }
218}
219
220static int unitOrder(Unit unit)
221{
222 switch (unit) {
223 case UnitByte:
224 case UnitKiloByte:
225 case UnitMegaByte:
226 case UnitGigaByte:
227 case UnitTeraByte:
228 case UnitPetaByte:
229 case UnitByteRate:
230 case UnitKiloByteRate:
231 case UnitMegaByteRate:
232 case UnitGigaByteRate:
233 case UnitTeraByteRate:
234 case UnitPetaByteRate:
235 case UnitBitRate:
236 case UnitKiloBitRate:
237 case UnitMegaBitRate:
238 case UnitGigaBitRate:
239 case UnitTeraBitRate:
240 case UnitPetaBitRate:
241 return 1024;
242
243 case UnitHertz:
244 case UnitKiloHertz:
245 case UnitMegaHertz:
246 case UnitGigaHertz:
247 case UnitTeraHertz:
248 case UnitPetaHertz:
249
250 case UnitWatt:
251 case UnitKiloWatt:
252 case UnitMegaWatt:
253 case UnitGigaWatt:
254 case UnitTeraWatt:
255 case UnitPetaWatt:
256
257 case UnitWattHour:
258 case UnitKiloWattHour:
259 case UnitMegaWattHour:
260 case UnitGigaWattHour:
261 case UnitTeraWattHour:
262 case UnitPetaWattHour:
263
264 case UnitAmpere:
265 case UnitKiloAmpere:
266 case UnitMegaAmpere:
267 case UnitGigaAmpere:
268 case UnitTeraAmpere:
269 case UnitPetaAmpere:
270
271 case UnitVolt:
272 case UnitKiloVolt:
273 case UnitMegaVolt:
274 case UnitGigaVolt:
275 case UnitTeraVolt:
276 case UnitPetaVolt:
277 return 1000;
278
279 default:
280 return 0;
281 }
282}
283
284static Unit unitBase(Unit unit)
285{
286 switch (unit) {
287 case UnitByte:
288 case UnitKiloByte:
289 case UnitMegaByte:
290 case UnitGigaByte:
291 case UnitTeraByte:
292 case UnitPetaByte:
293 return UnitByte;
294
295 case UnitByteRate:
296 case UnitKiloByteRate:
297 case UnitMegaByteRate:
298 case UnitGigaByteRate:
299 case UnitTeraByteRate:
300 case UnitPetaByteRate:
301 return UnitByteRate;
302
303 case UnitBitRate:
304 case UnitKiloBitRate:
305 case UnitMegaBitRate:
306 case UnitGigaBitRate:
307 case UnitTeraBitRate:
308 case UnitPetaBitRate:
309 return UnitBitRate;
310
311 case UnitHertz:
312 case UnitKiloHertz:
313 case UnitMegaHertz:
314 case UnitGigaHertz:
315 case UnitTeraHertz:
316 case UnitPetaHertz:
317 return UnitHertz;
318
319 case UnitVolt:
320 case UnitKiloVolt:
321 case UnitMegaVolt:
322 case UnitGigaVolt:
323 case UnitTeraVolt:
324 case UnitPetaVolt:
325 return UnitVolt;
326
327 case UnitWatt:
328 case UnitKiloWatt:
329 case UnitMegaWatt:
330 case UnitGigaWatt:
331 case UnitTeraWatt:
332 case UnitPetaWatt:
333 return UnitWatt;
334
335 case UnitWattHour:
336 case UnitKiloWattHour:
337 case UnitMegaWattHour:
338 case UnitGigaWattHour:
339 case UnitTeraWattHour:
340 case UnitPetaWattHour:
341 return UnitWattHour;
342
343 case UnitAmpere:
344 case UnitKiloAmpere:
345 case UnitMegaAmpere:
346 case UnitGigaAmpere:
347 case UnitTeraAmpere:
348 case UnitPetaAmpere:
349 return UnitAmpere;
350
351 default:
352 return unit;
353 }
354}
355
356static Unit adjustedUnit(qreal value, Unit unit, MetricPrefix prefix)
357{
358 const int order = unitOrder(unit);
359 if (!order) {
360 return unit;
361 }
362
363 const Unit baseUnit = unitBase(unit);
364 const MetricPrefix basePrefix = MetricPrefix(unit - baseUnit);
365
366 if (prefix == MetricPrefixAutoAdjust) {
367 const qreal absoluteValue = value * std::pow(order, int(basePrefix));
368 if (absoluteValue > 0) {
369 const int targetPrefix = std::log2(absoluteValue) / std::log2(order);
370 if (targetPrefix <= MetricPrefixLast) {
371 prefix = MetricPrefix(targetPrefix);
372 }
373 }
374 if (prefix == MetricPrefixAutoAdjust) {
375 prefix = basePrefix;
376 }
377 }
378
379 const Unit newUnit = Unit(prefix + baseUnit);
380 // If there is no prefixed unit,
381 // don't overflow into the following unrelated units.
382 if (unitBase(newUnit) != baseUnit) {
383 return unit;
384 }
385
386 return newUnit;
387}
388
389static QString formatNumber(const QVariant &value, Unit unit, MetricPrefix prefix, FormatOptions options)
390{
391 qreal amount = value.toDouble();
392
393 if (!options.testFlag(FormatOptionShowNull) && (qFuzzyIsNull(amount) || qIsNaN(amount))) {
394 return QString();
395 }
396
397 const Unit adjusted = adjustedUnit(amount, unit, prefix);
398 if (adjusted != unit) {
399 amount /= std::pow(unitOrder(unit), adjusted - unit);
400 }
401
402 const int precision = (value.type() != QVariant::Double && adjusted <= unit) ? 0 : 1;
403 const QString text = QLocale().toString(amount, 'f', precision);
404
405 return unitFormat(adjusted).subs(text).toString();
406}
407
408static QString formatTime(const QVariant &value)
409{
410 return KFormat().formatDuration(value.toLongLong() * 1000);
411}
412
413static QString formatTicks(const QVariant &value)
414{
415 auto seconds = value.toLongLong() / sysconf(_SC_CLK_TCK);
416 return KFormat().formatDuration(seconds * 1000);
417}
418
419static QString formatBootTimestamp(const QVariant &value)
420{
421 timespec tp;
422#ifdef Q_OS_LINUX
423 clock_gettime(CLOCK_BOOTTIME, &tp);
424#else
425 clock_gettime(CLOCK_MONOTONIC, &tp);
426#endif
427
428 const QDateTime systemBootTime = QDateTime::currentDateTime().addSecs(-tp.tv_sec);
429
430 const qreal secondsSinceSystemBoot = value.toReal() / sysconf(_SC_CLK_TCK);
431 const QDateTime absoluteTimeSinceBoot = systemBootTime.addSecs(secondsSinceSystemBoot);
432
433 return KFormat().formatRelativeDateTime(absoluteTimeSinceBoot, QLocale::ShortFormat);
434}
435
436qreal Formatter::scaleDownFactor(const QVariant &value, Unit unit, MetricPrefix targetPrefix)
437{
438 const Unit adjusted = adjustedUnit(value.toDouble(), unit, targetPrefix);
439 if (adjusted == unit) {
440 return 1;
441 }
442
443 return std::pow(unitOrder(unit), adjusted - unit);
444}
445
446KLocalizedString Formatter::localizedString(const QVariant &value, Unit unit, MetricPrefix targetPrefix)
447{
448 const Unit adjusted = adjustedUnit(value.toDouble(), unit, targetPrefix);
449 return unitFormat(adjusted);
450}
451
452QString Formatter::formatValue(const QVariant &value, Unit unit, MetricPrefix targetPrefix, FormatOptions options)
453{
454 switch (unit) {
455 case UnitByte:
456 case UnitKiloByte:
457 case UnitMegaByte:
458 case UnitGigaByte:
459 case UnitTeraByte:
460 case UnitPetaByte:
461 case UnitByteRate:
462 case UnitKiloByteRate:
463 case UnitMegaByteRate:
464 case UnitGigaByteRate:
465 case UnitTeraByteRate:
466 case UnitPetaByteRate:
467 case UnitBitRate:
468 case UnitKiloBitRate:
469 case UnitMegaBitRate:
470 case UnitGigaBitRate:
471 case UnitTeraBitRate:
472 case UnitPetaBitRate:
473 case UnitHertz:
474 case UnitKiloHertz:
475 case UnitMegaHertz:
476 case UnitGigaHertz:
477 case UnitTeraHertz:
478 case UnitPetaHertz:
479 case UnitVolt:
480 case UnitKiloVolt:
481 case UnitMegaVolt:
482 case UnitGigaVolt:
483 case UnitTeraVolt:
484 case UnitPetaVolt:
485 case UnitWatt:
486 case UnitKiloWatt:
487 case UnitMegaWatt:
488 case UnitGigaWatt:
489 case UnitTeraWatt:
490 case UnitPetaWatt:
491 case UnitWattHour:
492 case UnitKiloWattHour:
493 case UnitMegaWattHour:
494 case UnitGigaWattHour:
495 case UnitTeraWattHour:
496 case UnitPetaWattHour:
497 case UnitAmpere:
498 case UnitKiloAmpere:
499 case UnitMegaAmpere:
500 case UnitGigaAmpere:
501 case UnitTeraAmpere:
502 case UnitPetaAmpere:
503 case UnitSecond:
504 case UnitPercent:
505 case UnitRate:
506 case UnitRpm:
507 case UnitCelsius:
508 case UnitDecibelMilliWatts:
509 return formatNumber(value, unit, targetPrefix, options);
510
511 case UnitBootTimestamp:
512 return formatBootTimestamp(value);
513 case UnitTime:
514 return formatTime(value);
515 case UnitNone:
516 return formatNumber(value, unit, MetricPrefix::MetricPrefixUnity, options);
517 case UnitTicks:
518 return formatTicks(value);
519
520 default:
521 return value.toString();
522 }
523}
524
526{
527 // TODO: Is it possible to avoid duplication of these symbols?
528 switch (unit) {
529 case UnitByte:
530 return i18nc("Bytes unit symbol", "B");
531 case UnitKiloByte:
532 return i18nc("Kilobytes unit symbol", "KiB");
533 case UnitMegaByte:
534 return i18nc("Megabytes unit symbol", "MiB");
535 case UnitGigaByte:
536 return i18nc("Gigabytes unit symbol", "GiB");
537 case UnitTeraByte:
538 return i18nc("Terabytes unit symbol", "TiB");
539 case UnitPetaByte:
540 return i18nc("Petabytes unit symbol", "PiB");
541
542 case UnitByteRate:
543 return i18nc("Bytes per second unit symbol", "B/s");
544 case UnitKiloByteRate:
545 return i18nc("Kilobytes per second unit symbol", "KiB/s");
546 case UnitMegaByteRate:
547 return i18nc("Megabytes per second unit symbol", "MiB/s");
548 case UnitGigaByteRate:
549 return i18nc("Gigabytes per second unit symbol", "GiB/s");
550 case UnitTeraByteRate:
551 return i18nc("Terabytes per second unit symbol", "TiB/s");
552 case UnitPetaByteRate:
553 return i18nc("Petabytes per second unit symbol", "PiB/s");
554
555 case UnitBitRate:
556 return i18nc("Bits per second unit symbol", "bps");
557 case UnitKiloBitRate:
558 return i18nc("Kilobits per second unit symbol", "Kbps");
559 case UnitMegaBitRate:
560 return i18nc("Megabits per second unit symbol", "Mbps");
561 case UnitGigaBitRate:
562 return i18nc("Gigabits per second unit symbol", "Gbps");
563 case UnitTeraBitRate:
564 return i18nc("Terabits per second unit symbol", "Tbps");
565 case UnitPetaBitRate:
566 return i18nc("Petabits per second unit symbol", "Pbps");
567
568 case UnitHertz:
569 return i18nc("Hertz unit symbol", "Hz");
570 case UnitKiloHertz:
571 return i18nc("Kilohertz unit symbol", "kHz");
572 case UnitMegaHertz:
573 return i18nc("Megahertz unit symbol", "MHz");
574 case UnitGigaHertz:
575 return i18nc("Gigahertz unit symbol", "GHz");
576 case UnitTeraHertz:
577 return i18nc("Terahertz unit symbol", "THz");
578 case UnitPetaHertz:
579 return i18nc("Petahertz unit symbol", "PHz");
580
581 case UnitVolt:
582 return i18nc("Volts unit symbol", "V");
583 case UnitKiloVolt:
584 return i18nc("Kilovolts unit symbol", "kV");
585 case UnitMegaVolt:
586 return i18nc("Megavolts unit symbol", "MV");
587 case UnitGigaVolt:
588 return i18nc("Gigavolts unit symbol", "GV");
589 case UnitTeraVolt:
590 return i18nc("Teravolts unit symbol", "TV");
591 case UnitPetaVolt:
592 return i18nc("Petavolts unit symbol", "PV");
593
594 case UnitWatt:
595 return i18nc("Watts unit symbol", "W");
596 case UnitKiloWatt:
597 return i18nc("Kilowatts unit symbol", "kW");
598 case UnitMegaWatt:
599 return i18nc("Megawatts unit symbol", "MW");
600 case UnitGigaWatt:
601 return i18nc("Gigawatts unit symbol", "GW");
602 case UnitTeraWatt:
603 return i18nc("Terawatts unit symbol", "TW");
604 case UnitPetaWatt:
605 return i18nc("Petawatts unit symbol", "PW");
606
607 case UnitWattHour:
608 return i18nc("Watt-hours unit symbol", "Wh");
609 case UnitKiloWattHour:
610 return i18nc("Kilo-watthours unit symbol", "kWh");
611 case UnitMegaWattHour:
612 return i18nc("Mega-watthours unit symbol", "MWh");
613 case UnitGigaWattHour:
614 return i18nc("Giga-watthours unit symbol", "GWh");
615 case UnitTeraWattHour:
616 return i18nc("Tera-watthours unit symbol", "TWh");
617 case UnitPetaWattHour:
618 return i18nc("Peta-watthours unit symbol", "PWh");
619
620 case UnitAmpere:
621 return i18nc("Ampere unit symbol", "A");
622 case UnitKiloAmpere:
623 return i18nc("Kiloamperes unit symbol", "kA");
624 case UnitMegaAmpere:
625 return i18nc("Megaamperes unit symbol", "MA");
626 case UnitGigaAmpere:
627 return i18nc("Gigaamperes unit symbol", "GA");
628 case UnitTeraAmpere:
629 return i18nc("Teraamperes unit symbol", "TA");
630 case UnitPetaAmpere:
631 return i18nc("Petaamperes unit symbol", "PA");
632
633 case UnitPercent:
634 return i18nc("Percent unit", "%");
635 case UnitRpm:
636 return i18nc("Revolutions per minute unit symbol", "RPM");
637 case UnitCelsius:
638 return i18nc("Celsius unit symbol", "°C");
639 case UnitDecibelMilliWatts:
640 return i18nc("Decibels unit symbol", "dBm");
641 case UnitSecond:
642 return i18nc("Seconds unit symbol", "s");
643
644 case UnitRate:
645 return i18nc("Rate unit symbol", "s⁻¹");
646
647 default:
648 return QString();
649 }
650}
651
652qreal Formatter::maximumLength(Unit unit, const QFont &font)
653{
654 auto order = unitOrder(unit);
655
656 QString maximum;
657 switch (unitBase(unit)) {
658 case UnitByte:
659 maximum = formatValue(order - 0.5, UnitMegaByte, MetricPrefixMega);
660 break;
661 case UnitByteRate:
662 maximum = formatValue(order - 0.5, UnitMegaByteRate, MetricPrefixMega);
663 break;
664 case UnitBitRate:
665 maximum = formatValue(order - 0.5, UnitMegaBitRate, MetricPrefixMega);
666 break;
667 case UnitHertz:
668 maximum = formatValue(order - 0.5, UnitMegaHertz, MetricPrefixMega);
669 break;
670 case UnitPercent:
671 maximum = formatValue(9999.9, UnitPercent);
672 break;
673 default:
674 return -1.0;
675 }
676
677 auto metrics = QFontMetrics{font};
678 return metrics.horizontalAdvance(maximum);
679}
680
681} // namespace KSysGuard
QString formatRelativeDateTime(const QDateTime &dateTime, QLocale::FormatType format) const
QString formatDuration(quint64 msecs, KFormat::DurationFormatOptions options=KFormat::DefaultDuration) const
QString toString() const
KLocalizedString subs(const KLocalizedString &a, int fieldWidth=0, QChar fillChar=QLatin1Char(' ')) const
static KLocalizedString localizedString(const QVariant &value, Unit unit, MetricPrefix targetPrefix=MetricPrefixAutoAdjust)
Returns localized string that is suitable for display.
static QString formatValue(const QVariant &value, Unit unit, MetricPrefix targetPrefix=MetricPrefixAutoAdjust, FormatOptions options=FormatOptionNone)
Converts value to the appropriate displayable string.
static qreal maximumLength(Unit unit, const QFont &font)
Return the maximum length of a formatted string for the specified unit and font.
static QString symbol(Unit unit)
Returns a symbol that corresponds to the given unit.
static qreal scaleDownFactor(const QVariant &value, Unit unit, MetricPrefix targetPrefix=MetricPrefixAutoAdjust)
Returns the scale factor suitable for display.
QString i18nc(const char *context, const char *text, const TYPE &arg...)
KLocalizedString KI18N_EXPORT ki18nc(const char *context, const char *text)
QDateTime addSecs(qint64 s) const const
QDateTime currentDateTime()
QString toString(QDate date, FormatType format) const const
Type type() const const
double toDouble(bool *ok) const const
qlonglong toLongLong(bool *ok) const const
qreal toReal(bool *ok) const const
QString toString() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:21:23 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.