mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-02 01:44:06 -04:00
highlight labels on rollover
This commit is contained in:
parent
c6dea19887
commit
a25b9372ea
@ -61,8 +61,10 @@ WinStatsLabel(WinStatsMonitor *monitor, int thread_index,
|
|||||||
|
|
||||||
if (bright >= 0.5) {
|
if (bright >= 0.5) {
|
||||||
_fg_color = RGB(0, 0, 0);
|
_fg_color = RGB(0, 0, 0);
|
||||||
|
_highlight_brush = (HBRUSH)GetStockObject(BLACK_BRUSH);
|
||||||
} else {
|
} else {
|
||||||
_fg_color = RGB(255, 255, 255);
|
_fg_color = RGB(255, 255, 255);
|
||||||
|
_highlight_brush = (HBRUSH)GetStockObject(WHITE_BRUSH);
|
||||||
}
|
}
|
||||||
|
|
||||||
_x = 0;
|
_x = 0;
|
||||||
@ -70,6 +72,8 @@ WinStatsLabel(WinStatsMonitor *monitor, int thread_index,
|
|||||||
_width = 0;
|
_width = 0;
|
||||||
_height = 0;
|
_height = 0;
|
||||||
_ideal_width = 0;
|
_ideal_width = 0;
|
||||||
|
_highlight = false;
|
||||||
|
_mouse_within = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -178,6 +182,55 @@ get_ideal_width() const {
|
|||||||
return _ideal_width;
|
return _ideal_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: WinStatsLabel::get_collector_index
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns the collector this label represents.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
int WinStatsLabel::
|
||||||
|
get_collector_index() const {
|
||||||
|
return _collector_index;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: WinStatsLabel::set_highlight
|
||||||
|
// Access: Public
|
||||||
|
// Description: Enables or disables the visual highlight for this
|
||||||
|
// label.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void WinStatsLabel::
|
||||||
|
set_highlight(bool highlight) {
|
||||||
|
if (_highlight != highlight) {
|
||||||
|
_highlight = highlight;
|
||||||
|
InvalidateRect(_window, NULL, TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: WinStatsLabel::get_highlight
|
||||||
|
// Access: Public
|
||||||
|
// Description: Returns true if the visual highlight for this
|
||||||
|
// label is enabled.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
bool WinStatsLabel::
|
||||||
|
get_highlight() const {
|
||||||
|
return _highlight;
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: WinStatsLabel::set_mouse_within
|
||||||
|
// Access: Private
|
||||||
|
// Description: Used internally to indicate whether the mouse is
|
||||||
|
// within the label's window.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void WinStatsLabel::
|
||||||
|
set_mouse_within(bool mouse_within) {
|
||||||
|
if (_mouse_within != mouse_within) {
|
||||||
|
_mouse_within = mouse_within;
|
||||||
|
InvalidateRect(_window, NULL, TRUE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: WinStatsLabel::create_window
|
// Function: WinStatsLabel::create_window
|
||||||
// Access: Private
|
// Access: Private
|
||||||
@ -265,6 +318,27 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
|
|||||||
_monitor->open_strip_chart(_thread_index, _collector_index);
|
_monitor->open_strip_chart(_thread_index, _collector_index);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
case WM_MOUSEMOVE:
|
||||||
|
{
|
||||||
|
// When the mouse enters the label area, highlight the label.
|
||||||
|
set_mouse_within(true);
|
||||||
|
|
||||||
|
// Now we want to get a WM_MOUSELEAVE when the mouse leaves the
|
||||||
|
// graph window.
|
||||||
|
TRACKMOUSEEVENT tme = {
|
||||||
|
sizeof(TRACKMOUSEEVENT),
|
||||||
|
TME_LEAVE,
|
||||||
|
_window,
|
||||||
|
0
|
||||||
|
};
|
||||||
|
TrackMouseEvent(&tme);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case WM_MOUSELEAVE:
|
||||||
|
set_mouse_within(false);
|
||||||
|
break;
|
||||||
|
|
||||||
case WM_PAINT:
|
case WM_PAINT:
|
||||||
{
|
{
|
||||||
PAINTSTRUCT ps;
|
PAINTSTRUCT ps;
|
||||||
@ -273,6 +347,10 @@ window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
|
|||||||
RECT rect = { 0, 0, _width, _height };
|
RECT rect = { 0, 0, _width, _height };
|
||||||
FillRect(hdc, &rect, _bg_brush);
|
FillRect(hdc, &rect, _bg_brush);
|
||||||
|
|
||||||
|
if (_highlight || _mouse_within) {
|
||||||
|
FrameRect(hdc, &rect, _highlight_brush);
|
||||||
|
}
|
||||||
|
|
||||||
HFONT hfnt = (HFONT)GetStockObject(ANSI_VAR_FONT);
|
HFONT hfnt = (HFONT)GetStockObject(ANSI_VAR_FONT);
|
||||||
SelectObject(hdc, hfnt);
|
SelectObject(hdc, hfnt);
|
||||||
SetTextAlign(hdc, TA_RIGHT | TA_TOP);
|
SetTextAlign(hdc, TA_RIGHT | TA_TOP);
|
||||||
|
@ -47,7 +47,14 @@ public:
|
|||||||
int get_height() const;
|
int get_height() const;
|
||||||
int get_ideal_width() const;
|
int get_ideal_width() const;
|
||||||
|
|
||||||
|
int get_collector_index() const;
|
||||||
|
|
||||||
|
void set_highlight(bool highlight);
|
||||||
|
bool get_highlight() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void set_mouse_within(bool mouse_within);
|
||||||
|
|
||||||
void create_window(HWND parent_window);
|
void create_window(HWND parent_window);
|
||||||
static void register_window_class(HINSTANCE application);
|
static void register_window_class(HINSTANCE application);
|
||||||
|
|
||||||
@ -62,12 +69,15 @@ private:
|
|||||||
COLORREF _bg_color;
|
COLORREF _bg_color;
|
||||||
COLORREF _fg_color;
|
COLORREF _fg_color;
|
||||||
HBRUSH _bg_brush;
|
HBRUSH _bg_brush;
|
||||||
|
HBRUSH _highlight_brush;
|
||||||
|
|
||||||
int _x;
|
int _x;
|
||||||
int _y;
|
int _y;
|
||||||
int _width;
|
int _width;
|
||||||
int _height;
|
int _height;
|
||||||
int _ideal_width;
|
int _ideal_width;
|
||||||
|
bool _highlight;
|
||||||
|
bool _mouse_within;
|
||||||
|
|
||||||
static int _left_margin, _right_margin;
|
static int _left_margin, _right_margin;
|
||||||
static int _top_margin, _bottom_margin;
|
static int _top_margin, _bottom_margin;
|
||||||
|
@ -37,6 +37,8 @@ WinStatsLabelStack() {
|
|||||||
_width = 0;
|
_width = 0;
|
||||||
_height = 0;
|
_height = 0;
|
||||||
_ideal_width = 0;
|
_ideal_width = 0;
|
||||||
|
|
||||||
|
_highlight_label = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -236,6 +238,26 @@ get_num_labels() const {
|
|||||||
return _labels.size();
|
return _labels.size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: WinStatsLabelStack::highlight_label
|
||||||
|
// Access: Public
|
||||||
|
// Description: Draws a highlight around the label representing the
|
||||||
|
// indicated collector, and removes the highlight from
|
||||||
|
// any other label. Specify -1 to remove the highlight
|
||||||
|
// from all labels.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void WinStatsLabelStack::
|
||||||
|
highlight_label(int collector_index) {
|
||||||
|
if (_highlight_label != collector_index) {
|
||||||
|
_highlight_label = collector_index;
|
||||||
|
Labels::iterator li;
|
||||||
|
for (li = _labels.begin(); li != _labels.end(); ++li) {
|
||||||
|
WinStatsLabel *label = (*li);
|
||||||
|
label->set_highlight(label->get_collector_index() == _highlight_label);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: WinStatsLabelStack::create_window
|
// Function: WinStatsLabelStack::create_window
|
||||||
|
@ -55,6 +55,8 @@ public:
|
|||||||
int collector_index, bool use_fullname);
|
int collector_index, bool use_fullname);
|
||||||
int get_num_labels() const;
|
int get_num_labels() const;
|
||||||
|
|
||||||
|
void highlight_label(int collector_index);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void create_window(HWND parent_window);
|
void create_window(HWND parent_window);
|
||||||
static void register_window_class(HINSTANCE application);
|
static void register_window_class(HINSTANCE application);
|
||||||
@ -68,6 +70,7 @@ private:
|
|||||||
int _width;
|
int _width;
|
||||||
int _height;
|
int _height;
|
||||||
int _ideal_width;
|
int _ideal_width;
|
||||||
|
int _highlight_label;
|
||||||
|
|
||||||
typedef pvector<WinStatsLabel *> Labels;
|
typedef pvector<WinStatsLabel *> Labels;
|
||||||
Labels _labels;
|
Labels _labels;
|
||||||
|
@ -357,6 +357,27 @@ graph_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case WM_MOUSEMOVE:
|
case WM_MOUSEMOVE:
|
||||||
|
if (_drag_mode == DM_none && _potential_drag_mode == DM_none) {
|
||||||
|
// When the mouse is over a color bar, highlight it.
|
||||||
|
PN_int16 x = LOWORD(lparam);
|
||||||
|
PN_int16 y = HIWORD(lparam);
|
||||||
|
_label_stack.highlight_label(get_collector_under_pixel(x, y));
|
||||||
|
|
||||||
|
// Now we want to get a WM_MOUSELEAVE when the mouse leaves the
|
||||||
|
// graph window.
|
||||||
|
TRACKMOUSEEVENT tme = {
|
||||||
|
sizeof(TRACKMOUSEEVENT),
|
||||||
|
TME_LEAVE,
|
||||||
|
_graph_window,
|
||||||
|
0
|
||||||
|
};
|
||||||
|
TrackMouseEvent(&tme);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// If the mouse is in some drag mode, stop highlighting.
|
||||||
|
_label_stack.highlight_label(-1);
|
||||||
|
}
|
||||||
|
|
||||||
if (_drag_mode == DM_scale) {
|
if (_drag_mode == DM_scale) {
|
||||||
PN_int16 y = HIWORD(lparam);
|
PN_int16 y = HIWORD(lparam);
|
||||||
float ratio = 1.0f - ((float)y / (float)get_ysize());
|
float ratio = 1.0f - ((float)y / (float)get_ysize());
|
||||||
@ -382,6 +403,11 @@ graph_window_proc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) {
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case WM_MOUSELEAVE:
|
||||||
|
// When the mouse leaves the graph, stop highlighting.
|
||||||
|
_label_stack.highlight_label(-1);
|
||||||
|
break;
|
||||||
|
|
||||||
case WM_LBUTTONUP:
|
case WM_LBUTTONUP:
|
||||||
if (_drag_mode == DM_scale) {
|
if (_drag_mode == DM_scale) {
|
||||||
_drag_mode = DM_none;
|
_drag_mode = DM_none;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user