summaryrefslogtreecommitdiffstats
path: root/grapher/GraphWidget.cxx
diff options
context:
space:
mode:
authorTim Moore <timoore@redhat.com>2009-12-07 12:43:56 +0100
committerTim Moore <timoore@redhat.com>2009-12-07 12:43:56 +0100
commit5891de489db0e172162279247fb633a719fa3756 (patch)
tree2cda126a35ebe9ba130299455f515618b4ab898b /grapher/GraphWidget.cxx
parente88061ec1fb047b65c247424dbadb10a85ff69ae (diff)
downloadsystemtap-steved-5891de489db0e172162279247fb633a719fa3756.tar.gz
systemtap-steved-5891de489db0e172162279247fb633a719fa3756.tar.xz
systemtap-steved-5891de489db0e172162279247fb633a719fa3756.zip
option to display graph times relative to the start time
This avoids having humongous numbers displayed on the graphs' x axis. Also, the dialog for adding a data set to a graph was cleaned up. * grapher/graph-dialog.glade: Add check box for display of relative time and a label for the data set list. Force the list of data sets to be larger. * grapher/Graph.hxx (_timeBase): new member * grapher/Graph.cxx (draw): Subtract _timeBase from displayed time value. * grapher/GraphWidget.hxx (DataModelColumns): Add a column for a data set's title, which is optional at the moment. * grapher/GraphWidget.hxx (_globalTimeBase, _timeBaseInitialized, _relativeTimesButton, _displayRelativeTimes): new members * grapher/GraphWidget.hxx (GraphWidget): Hook up check button for displaying relative time. (on_expose_event): Determine base time if needed; set base time in graphs. (onDataDialogOpen): Insert graph data set's name (key) and title into the list of data sets.
Diffstat (limited to 'grapher/GraphWidget.cxx')
-rw-r--r--grapher/GraphWidget.cxx46
1 files changed, 42 insertions, 4 deletions
diff --git a/grapher/GraphWidget.cxx b/grapher/GraphWidget.cxx
index cfec0adf..9d5e12f8 100644
--- a/grapher/GraphWidget.cxx
+++ b/grapher/GraphWidget.cxx
@@ -4,6 +4,9 @@
#include <math.h>
#include <iostream>
+#define __STDC_LIMIT_MACROS
+#include <stdint.h>
+
#include <glibmm/timer.h>
#include <cairomm/context.h>
#include <libglademm.h>
@@ -22,7 +25,7 @@ namespace systemtap
GraphWidget::GraphWidget()
: _trackingDrag(false), _width(600), _height(200), _mouseX(0.0),
- _mouseY(0.0)
+ _mouseY(0.0), _globalTimeBase(0), _timeBaseInitialized(false)
{
add_events(Gdk::POINTER_MOTION_MASK | Gdk::BUTTON_PRESS_MASK
| Gdk::BUTTON_RELEASE_MASK | Gdk::SCROLL_MASK);
@@ -70,6 +73,14 @@ namespace systemtap
_listStore = Gtk::ListStore::create(_dataColumns);
_dataTreeView->set_model(_listStore);
_dataTreeView->append_column("Data", _dataColumns._dataName);
+ _dataTreeView->append_column("Title", _dataColumns._dataTitle);
+ _refXmlDataDialog->get_widget("checkbutton1", _relativeTimesButton);
+ _relativeTimesButton->signal_clicked()
+ .connect(sigc::mem_fun(*this,
+ &GraphWidget::onRelativeTimesButtonClicked));
+ // Set button's initial value from that in .glade file
+ _displayRelativeTimes = _relativeTimesButton->get_active();
+
}
catch (const Gnome::Glade::XmlError& ex )
{
@@ -100,6 +111,7 @@ namespace systemtap
shared_ptr<Graph> graph(new Graph(x, y));
_height = y + graph->_height;
graph->setOrigin(x, y);
+ graph->_timeBase = _globalTimeBase;
_graphs.push_back(graph);
queue_resize();
}
@@ -115,8 +127,29 @@ namespace systemtap
cr->save();
cr->set_source_rgba(0.0, 0.0, 0.0, 1.0);
cr->paint();
+ if (!_timeBaseInitialized && !_graphData.empty())
+ {
+ int64_t earliest = INT64_MAX;
+ for (GraphDataList::iterator gd = _graphData.begin(),
+ end = _graphData.end();
+ gd != end;
+ ++gd)
+ {
+ if (!(*gd)->times.empty() && (*gd)->times[0] < earliest)
+ earliest = (*gd)->times[0];
+ }
+ if (earliest != INT64_MAX)
+ {
+ _globalTimeBase = earliest;
+ _timeBaseInitialized = true;
+ }
+ }
for (GraphList::iterator g = _graphs.begin(); g != _graphs.end(); ++g)
{
+ if (_displayRelativeTimes && _timeBaseInitialized)
+ (*g)->_timeBase = _globalTimeBase;
+ else
+ (*g)->_timeBase = 0.0;
double x, y;
(*g)->getOrigin(x, y);
cr->save();
@@ -269,10 +302,9 @@ namespace systemtap
{
Gtk::TreeModel::iterator litr = _listStore->append();
Gtk::TreeModel::Row row = *litr;
+ row[_dataColumns._dataName] = (*itr)->name;
if (!(*itr)->title.empty())
- row[_dataColumns._dataName] = (*itr)->title;
- else
- row[_dataColumns._dataName] = (*itr)->name;
+ row[_dataColumns._dataTitle] = (*itr)->title;
row[_dataColumns._graphData] = *itr;
}
}
@@ -326,4 +358,10 @@ namespace systemtap
_hover_timeout_connection = Glib::signal_timeout()
.connect(sigc::mem_fun(*this, &GraphWidget::onHoverTimeout), 1000);
}
+
+ void GraphWidget::onRelativeTimesButtonClicked()
+ {
+ _displayRelativeTimes = _relativeTimesButton->get_active();
+ queue_draw();
+ }
}