18 const GdkColor GtkStatsGraph::rgb_white = {
    19   0, 0xffff, 0xffff, 0xffff
    21 const GdkColor GtkStatsGraph::rgb_light_gray = {
    22   0, 0x9a9a, 0x9a9a, 0x9a9a,
    24 const GdkColor GtkStatsGraph::rgb_dark_gray = {
    25   0, 0x3333, 0x3333, 0x3333,
    27 const GdkColor GtkStatsGraph::rgb_black = {
    28   0, 0x0000, 0x0000, 0x0000
    30 const GdkColor GtkStatsGraph::rgb_user_guide_bar = {
    31   0, 0x8282, 0x9696, 0xffff
    41   _parent_window = 
nullptr;
    43   _graph_window = 
nullptr;
    44   _scale_area = 
nullptr;
    46   GtkWidget *parent_window = monitor->
get_window();
    48   GdkDisplay *display = gdk_drawable_get_display(parent_window->window);
    49   _hand_cursor = gdk_cursor_new_for_display(display, GDK_HAND2);
    57   _window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
    64   gtk_widget_add_events(_window,
    65       GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
    66       GDK_POINTER_MOTION_MASK);
    67   g_signal_connect(G_OBJECT(_window), 
"delete_event",
    68        G_CALLBACK(window_delete_event), 
this);
    69   g_signal_connect(G_OBJECT(_window), 
"destroy",
    70        G_CALLBACK(window_destroy), 
this);
    71   g_signal_connect(G_OBJECT(_window), 
"button_press_event",
    72        G_CALLBACK(button_press_event_callback), 
this);
    73   g_signal_connect(G_OBJECT(_window), 
"button_release_event",
    74        G_CALLBACK(button_release_event_callback), 
this);
    75   g_signal_connect(G_OBJECT(_window), 
"motion_notify_event",
    76        G_CALLBACK(motion_notify_event_callback), 
this);
    78   _graph_window = gtk_drawing_area_new();
    79   gtk_widget_add_events(_graph_window,
    80       GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK |
    81       GDK_POINTER_MOTION_MASK);
    82   g_signal_connect(G_OBJECT(_graph_window), 
"expose_event",
    83        G_CALLBACK(graph_expose_callback), 
this);
    84   g_signal_connect(G_OBJECT(_graph_window), 
"configure_event",
    85        G_CALLBACK(configure_graph_callback), 
this);
    86   g_signal_connect(G_OBJECT(_graph_window), 
"button_press_event",
    87        G_CALLBACK(button_press_event_callback), 
this);
    88   g_signal_connect(G_OBJECT(_graph_window), 
"button_release_event",
    89        G_CALLBACK(button_release_event_callback), 
this);
    90   g_signal_connect(G_OBJECT(_graph_window), 
"motion_notify_event",
    91        G_CALLBACK(motion_notify_event_callback), 
this);
    94   GtkWidget *graph_frame = gtk_frame_new(
nullptr);
    95   gtk_frame_set_shadow_type(GTK_FRAME(graph_frame), GTK_SHADOW_IN);
    96   gtk_container_add(GTK_CONTAINER(graph_frame), _graph_window);
   100   _graph_vbox = gtk_vbox_new(FALSE, 0);
   101   gtk_box_pack_end(GTK_BOX(_graph_vbox), graph_frame,
   106   _graph_hbox = gtk_hbox_new(FALSE, 0);
   107   gtk_box_pack_start(GTK_BOX(_graph_hbox), _graph_vbox,
   111   _hpaned = gtk_hpaned_new();
   112   gtk_container_add(GTK_CONTAINER(_window), _hpaned);
   113   gtk_container_set_border_width(GTK_CONTAINER(_window), 8);
   115   gtk_paned_pack1(GTK_PANED(_hpaned), _label_stack.get_widget(), TRUE, TRUE);
   116   gtk_paned_pack2(GTK_PANED(_hpaned), _graph_hbox, TRUE, TRUE);
   118   _drag_mode = DM_none;
   119   _potential_drag_mode = DM_none;
   120   _drag_scale_start = 0.0f;
   133   Brushes::iterator bi;
   134   for (bi = _brushes.begin(); bi != _brushes.end(); ++bi) {
   135     GdkGC *gc = (*bi).second;
   141   if (_window != 
nullptr) {
   142     GtkWidget *window = _window;
   144     gtk_widget_destroy(window);
   207   if (_scale_area != 
nullptr) {
   208     gtk_widget_queue_draw(_scale_area);
   210   gtk_widget_queue_draw(_graph_window);
   227   if (_window != 
nullptr) {
   232     if (monitor != 
nullptr) {
   233       monitor->remove_graph(
this);
   241 GdkGC *GtkStatsGraph::
   242 get_collector_gc(
int collector_index) {
   243   Brushes::iterator bi;
   244   bi = _brushes.find(collector_index);
   245   if (bi != _brushes.end()) {
   253   c.red = (int)(rgb[0] * 65535.0f);
   254   c.green = (int)(rgb[1] * 65535.0f);
   255   c.blue = (int)(rgb[2] * 65535.0f);
   256   GdkGC *gc = gdk_gc_new(_pixmap);
   258   gdk_gc_set_rgb_fg_color(gc, &c);
   260   _brushes[collector_index] = gc;
   269 additional_graph_window_paint() {
   277 GtkStatsGraph::DragMode GtkStatsGraph::
   278 consider_drag_start(
int graph_x, 
int graph_y) {
   287 set_drag_mode(GtkStatsGraph::DragMode drag_mode) {
   288   _drag_mode = drag_mode;
   295 gboolean GtkStatsGraph::
   296 handle_button_press(GtkWidget *widget, 
int graph_x, 
int graph_y,
   298   if (_potential_drag_mode != DM_none) {
   299     set_drag_mode(_potential_drag_mode);
   300     _drag_start_x = graph_x;
   301     _drag_start_y = graph_y;
   311 gboolean GtkStatsGraph::
   312 handle_button_release(GtkWidget *widget, 
int graph_x, 
int graph_y) {
   313   set_drag_mode(DM_none);
   316   return handle_motion(widget, graph_x, graph_y);
   322 gboolean GtkStatsGraph::
   323 handle_motion(GtkWidget *widget, 
int graph_x, 
int graph_y) {
   324   _potential_drag_mode = consider_drag_start(graph_x, graph_y);
   326   if (_potential_drag_mode == DM_guide_bar ||
   327       _drag_mode == DM_guide_bar) {
   328     gdk_window_set_cursor(_window->window, _hand_cursor);
   331     gdk_window_set_cursor(_window->window, 
nullptr);
   341 setup_pixmap(
int xsize, 
int ysize) {
   344   _pixmap_xsize = std::max(xsize, 0);
   345   _pixmap_ysize = std::max(ysize, 0);
   347   _pixmap = gdk_pixmap_new(_graph_window->window, _pixmap_xsize, _pixmap_ysize, -1);
   349   _pixmap_gc = gdk_gc_new(_pixmap);
   352   gdk_gc_set_rgb_fg_color(_pixmap_gc, &rgb_white);
   353   gdk_draw_rectangle(_pixmap, _pixmap_gc, TRUE, 0, 0,
   354          _pixmap_xsize, _pixmap_ysize);
   362   if (_pixmap != 
nullptr) {
   363     g_object_unref(_pixmap);
   364     g_object_unref(_pixmap_gc);
   371 gboolean GtkStatsGraph::
   372 window_delete_event(GtkWidget *widget, GdkEvent *event, gpointer data) {
   382 window_destroy(GtkWidget *widget, gpointer data) {
   390 gboolean GtkStatsGraph::
   391 graph_expose_callback(GtkWidget *widget, GdkEventExpose *event, gpointer data) {
   394   if (self->_pixmap != 
nullptr) {
   395     gdk_draw_drawable(self->_graph_window->window,
   396           self->_graph_window->style->fg_gc[0],
   397           self->_pixmap, 0, 0, 0, 0,
   398           self->_pixmap_xsize, self->_pixmap_ysize);
   401   self->additional_graph_window_paint();
   409 gboolean GtkStatsGraph::
   410 configure_graph_callback(GtkWidget *widget, GdkEventConfigure *event,
   415   self->setup_pixmap(event->width, event->height);
   416   self->force_redraw();
   425 gboolean GtkStatsGraph::
   426 button_press_event_callback(GtkWidget *widget, GdkEventButton *event,
   429   int graph_x, graph_y;
   430   gtk_widget_translate_coordinates(widget, self->_graph_window,
   431            (
int)event->x, (
int)event->y,
   434   bool double_click = (
event->type == GDK_2BUTTON_PRESS);
   436   return self->handle_button_press(widget, graph_x, graph_y, double_click);
   443 gboolean GtkStatsGraph::
   444 button_release_event_callback(GtkWidget *widget, GdkEventButton *event,
   447   int graph_x, graph_y;
   448   gtk_widget_translate_coordinates(widget, self->_graph_window,
   449            (
int)event->x, (
int)event->y,
   452   return self->handle_button_release(widget, graph_x, graph_y);
   458 gboolean GtkStatsGraph::
   459 motion_notify_event_callback(GtkWidget *widget, GdkEventMotion *event,
   462   int graph_x, graph_y;
   463   gtk_widget_translate_coordinates(widget, self->_graph_window,
   464            (
int)event->x, (
int)event->y,
   467   return self->handle_motion(widget, graph_x, graph_y);
 virtual void new_data(int thread_index, int frame_number)
Called whenever new data arrives.
void user_guide_bars_changed()
Called when the user guide bars have been changed.
void set_pause(bool pause)
Changes the pause flag for the graph.
const LRGBColor & get_collector_color(int collector_index)
Returns the color associated with the indicated collector.
void clear_labels(bool delete_widgets=true)
Removes the set of labels and starts a new set.
virtual void new_collector(int collector_index)
Called whenever a new Collector definition is received from the client.
virtual void force_redraw()
Called when it is necessary to redraw the entire graph.
virtual void clicked_label(int collector_index)
Called when the user single-clicks on a label.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
virtual void set_scroll_speed(double scroll_speed)
Called when the user selects a new scroll speed from the monitor pulldown menu, this should adjust th...
This is just an abstract base class to provide a common pointer type for the various kinds of graphs ...
This class represents a connection to a PStatsClient and manages the data exchange with the client.
virtual void set_time_units(int unit_mask)
Called when the user selects a new time units from the monitor pulldown menu, this should adjust the ...
GtkWidget * get_window() const
Returns the window handle to the monitor's window.
virtual void changed_graph_size(int graph_xsize, int graph_ysize)
Called when the user has resized the window, forcing a resize of the graph.