summaryrefslogtreecommitdiffstats
path: root/src/statdock.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/statdock.cpp')
-rw-r--r--src/statdock.cpp270
1 files changed, 270 insertions, 0 deletions
diff --git a/src/statdock.cpp b/src/statdock.cpp
new file mode 100644
index 0000000..36d33cc
--- /dev/null
+++ b/src/statdock.cpp
@@ -0,0 +1,270 @@
+
+/***************************************************************************
+ * *
+ * KCPULoad and KNetLoad are copyright (c) 1999-2000, Markus Gustavsson *
+ * (c) 2002, Ben Burton *
+ * *
+ * This program is free software; you can redistribute it and/or modify *
+ * it under the terms of the GNU General Public License as published by *
+ * the Free Software Foundation; either version 2 of the License, or *
+ * (at your option) any later version. *
+ * *
+ ***************************************************************************/
+
+#include "statdock.h"
+#include "statpopup.h"
+#include <tqpainter.h>
+
+const int StatDock::fillLines = 0;
+const int StatDock::fillBars = 1;
+const int StatDock::fillShaded = 2;
+
+const TQColor StatDock::colorGrid(120, 120, 120);
+const TQColor StatDock::colorGridInactive(60, 60, 60);
+const TQColor StatDock::colorLabel(255, 255, 255);
+const TQColor StatDock::colorLabelInactive(125, 125, 125);
+const TQColor StatDock::colorLower(255, 255, 255);
+const TQColor StatDock::colorLowerInactive(125, 125, 125);
+const TQColor StatDock::colorBlack(0, 0, 0);
+
+//#define DOCK_SIZE 24
+#define DOCK_SIZE width()
+#define DOCK_SCALE (((float) 105)/((float) (DOCK_SIZE-1)))
+#define SOFT_STEP 3
+
+StatDock::StatDock(int whichDock, const TQString& useLabel,
+ StatPopup *parent, const char *name) :
+ KSystemTray(parent,name),
+ label(useLabel),
+ bufUpper(0),
+ bufLower(0),
+ pos(0) {
+
+ bufUpper = new int[DOCK_SIZE];
+ bufLower = new int[DOCK_SIZE];
+
+ // Initialise the stored readings.
+ for (i = 0; i < DOCK_SIZE; i++)
+ bufUpper[i] = bufLower[i] = 0;
+
+ // Initialise the display.
+ parent->initDock(this, contextMenu(), whichDock);
+ setBackgroundColor(colorBlack);
+ resize(DOCK_SIZE, DOCK_SIZE);
+ show();
+}
+
+StatDock::~StatDock() {
+ delete[] bufUpper;
+ delete[] bufLower;
+}
+
+void StatDock::resizeEvent ( TQResizeEvent * )
+{
+ // Honor Free Desktop specifications that allow for arbitrary system tray icon sizes
+ int* bufUpperOld;
+ int* bufLowerOld;
+
+ bufUpperOld = bufUpper;
+ bufLowerOld = bufLower;
+
+ bufUpper = new int[DOCK_SIZE];
+ bufLower = new int[DOCK_SIZE];
+
+ // Re-initialise the stored readings.
+ for (i = 0; i < DOCK_SIZE; i++)
+ bufUpper[i] = bufLower[i] = 0;
+
+ delete[] bufUpperOld;
+ delete[] bufLowerOld;
+
+ repaint();
+}
+
+void StatDock::setGrid(bool set) {
+ grid = set;
+ repaint();
+}
+
+void StatDock::setActive(bool set) {
+ active = set;
+ repaint();
+}
+
+void StatDock::setSoft(bool set) {
+ soft = set;
+ repaint();
+}
+
+void StatDock::setSplit(bool set) {
+ split = set;
+ repaint();
+}
+
+void StatDock::setLabelled(bool set) {
+ labelled = set;
+ repaint();
+}
+
+void StatDock::setLabel(const TQString& set) {
+ label = set;
+ repaint();
+}
+
+void StatDock::setFill(int set) {
+ fill = set;
+ repaint();
+}
+
+void StatDock::setColor(const TQColor& set) {
+ colorUpper = set;
+ colorUpperInactive = colorUpper.dark();
+ repaint();
+}
+
+void StatDock::clearHistory(void) {
+ for (i = 0; i < DOCK_SIZE; i++)
+ bufUpper[i] = bufLower[i] = 0;
+ repaint();
+}
+
+void StatDock::addPercentReading(int upper, int lower) {
+ // Rescale the readings to a measure in pixels.
+ upper = (int) (((float) upper) / DOCK_SCALE);
+ lower = (split ? (int) (((float) lower) / DOCK_SCALE) : 0);
+
+ if (soft) {
+ // Do a bit of juggling to obtain a soft reading.
+ oldUpper = bufUpper[pos];
+ oldLower = bufLower[pos];
+ if(++pos >= DOCK_SIZE)
+ pos = 0;
+
+ // Modify the upper reading.
+ if (upper > oldUpper + SOFT_STEP)
+ upper = oldUpper + SOFT_STEP;
+ else if (upper < oldUpper - SOFT_STEP)
+ upper = oldUpper - SOFT_STEP;
+ bufUpper[pos] = upper;
+
+ // Modify the lower reading.
+ if (split) {
+ if (lower > oldLower + SOFT_STEP)
+ lower = oldLower + SOFT_STEP;
+ else if (lower < oldLower - SOFT_STEP)
+ lower = oldLower - SOFT_STEP;
+ }
+ bufLower[pos] = lower;
+ } else {
+ // Just a straight update.
+ if(++pos >= DOCK_SIZE)
+ pos = 0;
+ bufUpper[pos] = upper;
+ bufLower[pos] = lower;
+ }
+
+ // Refresh the diagram.
+ repaint();
+}
+
+void StatDock::paintEvent(TQPaintEvent*) {
+ TQPainter p(this);
+
+ // Start by drawing the grid.
+ if(grid) {
+ p.setPen((active) ? colorGrid : colorGridInactive);
+ for(i = (((DOCK_SIZE+1)/5)-1); i < (DOCK_SIZE-1); i=i+((DOCK_SIZE+1)/5)) {
+ p.drawLine(0, i, (DOCK_SIZE-1), i);
+ }
+ }
+
+ if(fill == fillShaded) {
+ // Shaded
+ for(i = 0; i < DOCK_SIZE; i++) {
+ tmpPos = (pos + i + 1) % DOCK_SIZE;
+ for(j = 0; j <= bufUpper[tmpPos]; j++) {
+ if (bufUpper[tmpPos] == 0 || j == 0)
+ p.setPen(colorBlack);
+ else if (active)
+ p.setPen(colorUpper.dark((100 * bufUpper[tmpPos]) / j));
+ else
+ p.setPen(colorUpper.dark((200 * bufUpper[tmpPos]) / j));
+
+ if(split)
+ p.drawPoint(i, DOCK_SIZE - 1 - j - bufLower[tmpPos]);
+ else
+ p.drawPoint(i, DOCK_SIZE - j);
+ }
+
+ if(split) {
+ for(j = 0; j <= bufLower[tmpPos]; j++) {
+ if (bufLower[tmpPos] == 0 || j == 0)
+ p.setPen(colorBlack);
+ else if (active)
+ p.setPen(colorLower.dark((100 * bufLower[tmpPos]) / j));
+ else
+ p.setPen(colorLower.dark((200 * bufLower[tmpPos]) / j));
+
+ p.drawPoint(i, (DOCK_SIZE-1) - j);
+ }
+ }
+ }
+ } else if (fill == fillBars) {
+ // Bars
+ if(split) {
+ // Draw the upper bars, then the lower to save on pen
+ // adjustments.
+ p.setPen(active ? colorUpper : colorUpperInactive);
+ for(i = 0; i < DOCK_SIZE; i++) {
+ tmpPos = (pos + i + 1) % DOCK_SIZE;
+ p.drawLine(i, DOCK_SIZE - 1 - bufUpper[tmpPos] -
+ bufLower[tmpPos], i, DOCK_SIZE - 1 - bufLower[tmpPos]);
+ }
+ p.setPen(active ? colorLower : colorLowerInactive);
+ for(i = 0; i < DOCK_SIZE; i++) {
+ tmpPos = (pos + i + 1) % DOCK_SIZE;
+ p.drawLine(i, DOCK_SIZE - 1 - bufLower[tmpPos],
+ i, DOCK_SIZE - 1);
+ }
+ } else {
+ p.setPen(active ? colorUpper : colorUpperInactive);
+ for(i = 0; i < DOCK_SIZE; i++) {
+ tmpPos = (pos + i + 1) % DOCK_SIZE;
+ p.drawLine(i, DOCK_SIZE - 1 - bufUpper[tmpPos],
+ i, DOCK_SIZE - 1);
+ }
+ }
+ } else {
+ // Lines
+ if(split) {
+ // Draw the upper line, then the lower to save on pen
+ // adjustments.
+ p.setPen(active ? colorUpper : colorUpperInactive);
+ for(i = 0; i < DOCK_SIZE; i++) {
+ tmpPos = (pos + i + 1) % DOCK_SIZE;
+ p.drawPoint(i, DOCK_SIZE - 1 -
+ bufUpper[tmpPos] - bufLower[tmpPos]);
+ }
+ p.setPen(active ? colorLower : colorLowerInactive);
+ for(i = 0; i < DOCK_SIZE; i++) {
+ tmpPos = (pos + i + 1) % DOCK_SIZE;
+ p.drawPoint(i, DOCK_SIZE - 1 - bufLower[tmpPos]);
+ }
+ } else {
+ p.setPen(active ? colorUpper : colorUpperInactive);
+ for(i = 0; i < DOCK_SIZE; i++) {
+ tmpPos = (pos + i + 1) % DOCK_SIZE;
+ p.drawPoint(i, DOCK_SIZE - 1 - bufUpper[tmpPos]);
+ }
+ }
+ }
+
+ // Finally label the diagrams.
+ if(labelled) {
+ p.setFont(TQFont( "Helvetica", ((8*DOCK_SIZE)/24) ));
+ p.setPen((active) ? colorLabel : colorLabelInactive);
+ p.drawText(rect(), AlignLeft | AlignTop, label);
+ }
+}
+
+#include "statdock.moc"