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.