From 530a7383f26e57b61748d76502229283462a0ede Mon Sep 17 00:00:00 2001 From: Robert Roebling Date: Tue, 15 Feb 2000 09:37:39 +0000 Subject: [PATCH] Many plot window gooddies. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@6023 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/latex/wx/plotwindow.tex | 18 +++++++ docs/latex/wx/scrlwevt.tex | 15 +++--- docs/latex/wx/scrolevt.tex | 1 + include/wx/generic/plot.h | 18 ++++++- src/generic/plot.cpp | 92 ++++++++++++++++++++++++++++-------- src/generic/scrolwin.cpp | 1 + 6 files changed, 117 insertions(+), 28 deletions(-) diff --git a/docs/latex/wx/plotwindow.tex b/docs/latex/wx/plotwindow.tex index cb37e22179..1ae78ccccf 100644 --- a/docs/latex/wx/plotwindow.tex +++ b/docs/latex/wx/plotwindow.tex @@ -153,3 +153,21 @@ Helper function which redraws the X axis. Helper function which redraws the Y axis. +\membersection{wxPlotWindow::SetScrollOnThumbRelease}\label{wxplotwindowsetscrollonthumbrelease} + +\func{void}{SetScrollOnThumbRelease}{\param{bool}{ onrelease = TRUE}} + +This function controls if the plot area will get scrolled only if the scrollbar thumb +has been release or also if the thumb is being dragged. When displaying large amounts +of data, it might become impossible to display the data fast enough to produce smooth +scrolling and then this function should be called. + +\membersection{wxPlotWindow::SetEnlargeAroundWindowCentre}\label{wxplotwindowsetenlargearoundwindowcentre} + +\func{void}{SetEnlargeAroundWindowCentre}{\param{bool}{ aroundwindow = TRUE}} + +Depending on the kind of data you display, the enlarging the individual curves might +have different desired effects. Sometimes, the data will be supposed to get enlarged +with the fixed point being the origin, sometimes the fixed point should be the centre +of the current drawing area. This function controls this behaviour. + diff --git a/docs/latex/wx/scrlwevt.tex b/docs/latex/wx/scrlwevt.tex index 37c45afe0e..302b8eb0a0 100644 --- a/docs/latex/wx/scrlwevt.tex +++ b/docs/latex/wx/scrlwevt.tex @@ -20,14 +20,15 @@ for intercepting scroll window events from the receiving window. \twocolwidtha{7cm} \begin{twocollist}\itemsep=0pt \twocolitem{{\bf EVT\_SCROLLWIN(func)}}{Process all scroll events.} -\twocolitem{{\bf EVT\_SCROLLWIN\_TOP(func)}}{Process wxEVT\_SCROLL\_TOP scroll-to-top events.} -\twocolitem{{\bf EVT\_SCROLLWIN\_BOTTOM(func)}}{Process wxEVT\_SCROLL\_TOP scroll-to-bottom events.} -\twocolitem{{\bf EVT\_SCROLLWIN\_LINEUP(func)}}{Process wxEVT\_SCROLL\_LINEUP line up events.} -\twocolitem{{\bf EVT\_SCROLLWIN\_LINEDOWN(func)}}{Process wxEVT\_SCROLL\_LINEDOWN line down events.} -\twocolitem{{\bf EVT\_SCROLLWIN\_PAGEUP(func)}}{Process wxEVT\_SCROLL\_PAGEUP page up events.} -\twocolitem{{\bf EVT\_SCROLLWIN\_PAGEDOWN(func)}}{Process wxEVT\_SCROLL\_PAGEDOWN page down events.} -\twocolitem{{\bf EVT\_SCROLLWIN\_THUMBTRACK(func)}}{Process wxEVT\_SCROLL\_THUMBTRACK thumbtrack events (frequent events +\twocolitem{{\bf EVT\_SCROLLWIN\_TOP(func)}}{Process wxEVT\_SCROLLWIN\_TOP scroll-to-top events.} +\twocolitem{{\bf EVT\_SCROLLWIN\_BOTTOM(func)}}{Process wxEVT\_SCROLLWIN\_TOP scroll-to-bottom events.} +\twocolitem{{\bf EVT\_SCROLLWIN\_LINEUP(func)}}{Process wxEVT\_SCROLLWIN\_LINEUP line up events.} +\twocolitem{{\bf EVT\_SCROLLWIN\_LINEDOWN(func)}}{Process wxEVT\_SCROLLWIN\_LINEDOWN line down events.} +\twocolitem{{\bf EVT\_SCROLLWIN\_PAGEUP(func)}}{Process wxEVT\_SCROLLWIN\_PAGEUP page up events.} +\twocolitem{{\bf EVT\_SCROLLWIN\_PAGEDOWN(func)}}{Process wxEVT\_SCROLLWIN\_PAGEDOWN page down events.} +\twocolitem{{\bf EVT\_SCROLLWIN\_THUMBTRACK(func)}}{Process wxEVT\_SCROLLWIN\_THUMBTRACK thumbtrack events (frequent events sent as the user drags the thumtrack).} +\twocolitem{{\bf EVT\_SCROLLWIN\_THUMBRELEASE(func)}}{Process wxEVT\_SCROLLWIN\_THUMBRELEASE thumb release events.} \end{twocollist}% \wxheading{See also} diff --git a/docs/latex/wx/scrolevt.tex b/docs/latex/wx/scrolevt.tex index 3b5f782119..f0870eaf54 100644 --- a/docs/latex/wx/scrolevt.tex +++ b/docs/latex/wx/scrolevt.tex @@ -33,6 +33,7 @@ without window IDs for intercepting scroll events from the receiving window. \twocolitem{{\bf EVT\_SCROLL\_PAGEDOWN(func)}}{Process wxEVT\_SCROLL\_PAGEDOWN page down events.} \twocolitem{{\bf EVT\_SCROLL\_THUMBTRACK(func)}}{Process wxEVT\_SCROLL\_THUMBTRACK thumbtrack events (frequent events sent as the user drags the thumtrack).} +\twocolitem{{\bf EVT\_SCROLL\_THUMBRELEASE(func)}}{Process wxEVT\_SCROLL\_THUMBRELEASE thumb release events.} \twocolitem{{\bf EVT\_COMMAND\_SCROLL(id, func)}}{Process all scroll events.} \twocolitem{{\bf EVT\_COMMAND\_SCROLL\_TOP(id, func)}}{Process wxEVT\_SCROLL\_TOP scroll-to-top events.} \twocolitem{{\bf EVT\_COMMAND\_SCROLL\_BOTTOM(id, func)}}{Process wxEVT\_SCROLL\_TOP scroll-to-bottom events.} diff --git a/include/wx/generic/plot.h b/include/wx/generic/plot.h index 919bbebc82..f046a6e78d 100644 --- a/include/wx/generic/plot.h +++ b/include/wx/generic/plot.h @@ -213,7 +213,20 @@ public: void SetZoom( double zoom ); double GetZoom() { return m_xZoom; } - + + // options + // ------- + + void SetScrollOnThumbRelease( bool scrollOnThumbRelease = TRUE ) + { m_scrollOnThumbRelease = scrollOnThumbRelease; } + bool GetScrollOnThumbRelease() + { return m_scrollOnThumbRelease; } + + void SetEnlargeAroundWindowCentre( bool enlargeAroundWindowCentre = TRUE ) + { m_enlargeAroundWindowCentre = enlargeAroundWindowCentre; } + bool GetEnlargeAroundWindowCentre() + { return m_enlargeAroundWindowCentre; } + // events (may be overridden) // -------------------------- @@ -249,6 +262,9 @@ private: wxPlotXAxisArea *m_xaxis; wxPlotYAxisArea *m_yaxis; wxPlotCurve *m_current; + + bool m_scrollOnThumbRelease; + bool m_enlargeAroundWindowCentre; DECLARE_CLASS(wxPlotWindow) DECLARE_EVENT_TABLE() diff --git a/src/generic/plot.cpp b/src/generic/plot.cpp index 4d21d4e87b..46ded83bd8 100644 --- a/src/generic/plot.cpp +++ b/src/generic/plot.cpp @@ -60,6 +60,12 @@ static wxBitmap *GetZoomOutBitmap(); static wxBitmap *GetUpBitmap(); static wxBitmap *GetDownBitmap(); +//----------------------------------------------------------------------------- +// consts +//----------------------------------------------------------------------------- + +#define wxPLOT_SCROLL_STEP 30 + //----------------------------------------------------------------------------- // wxPlotEvent //----------------------------------------------------------------------------- @@ -115,8 +121,8 @@ void wxPlotArea::OnMouse( wxMouseEvent &event ) int view_x; int view_y; m_owner->GetViewStart( &view_x, &view_y ); - view_x *= 10; - view_y *= 10; + view_x *= wxPLOT_SCROLL_STEP; + view_y *= wxPLOT_SCROLL_STEP; int x = event.GetX(); int y = event.GetY(); @@ -176,7 +182,7 @@ void wxPlotArea::DrawCurve( wxDC *dc, wxPlotCurve *curve, int from, int to ) int view_x; int view_y; m_owner->GetViewStart( &view_x, &view_y ); - view_x *= 10; + view_x *= wxPLOT_SCROLL_STEP; if (from == -1) from = view_x; @@ -187,6 +193,8 @@ void wxPlotArea::DrawCurve( wxDC *dc, wxPlotCurve *curve, int from, int to ) if (to == -1) to = view_x + client_width; + + to += 2; // no idea why this is needed double zoom = m_owner->GetZoom(); @@ -219,8 +227,8 @@ void wxPlotArea::OnPaint( wxPaintEvent &WXUNUSED(event) ) int view_x; int view_y; m_owner->GetViewStart( &view_x, &view_y ); - view_x *= 10; - view_y *= 10; + view_x *= wxPLOT_SCROLL_STEP; + view_y *= wxPLOT_SCROLL_STEP; wxPaintDC dc( this ); m_owner->PrepareDC( dc ); @@ -286,6 +294,7 @@ wxPlotXAxisArea::wxPlotXAxisArea( wxPlotWindow *parent ) m_owner = parent; SetBackgroundColour( *wxWHITE ); + SetFont( *wxSMALL_FONT ); } void wxPlotXAxisArea::OnMouse( wxMouseEvent &event ) @@ -296,8 +305,8 @@ void wxPlotXAxisArea::OnMouse( wxMouseEvent &event ) int view_x; int view_y; m_owner->GetViewStart( &view_x, &view_y ); - view_x *= 10; - view_y *= 10; + view_x *= wxPLOT_SCROLL_STEP; + view_y *= wxPLOT_SCROLL_STEP; int x = event.GetX(); int y = event.GetY(); @@ -312,8 +321,8 @@ void wxPlotXAxisArea::OnPaint( wxPaintEvent &WXUNUSED(event) ) int view_x; int view_y; m_owner->GetViewStart( &view_x, &view_y ); - view_x *= 10; - view_y *= 10; + view_x *= wxPLOT_SCROLL_STEP; + view_y *= wxPLOT_SCROLL_STEP; wxPaintDC dc( this ); @@ -374,8 +383,14 @@ void wxPlotXAxisArea::OnPaint( wxPaintEvent &WXUNUSED(event) ) { dc.DrawLine( x, 5, x, 15 ); wxString label; - if (range < 10) - label.Printf( wxT("%.1f"), current ); + if (range < 50) + { + label.Printf( wxT("%f"), current ); + while (label.Last() == wxT('0')) + label.RemoveLast(); + if ((label.Last() == wxT('.')) || (label.Last() == wxT(','))) + label.Append( wxT('0') ); + } else label.Printf( wxT("%d"), (int)floor(current) ); dc.DrawText( label, x-4, 20 ); @@ -406,6 +421,7 @@ wxPlotYAxisArea::wxPlotYAxisArea( wxPlotWindow *parent ) m_owner = parent; SetBackgroundColour( *wxWHITE ); + SetFont( *wxSMALL_FONT ); } void wxPlotYAxisArea::OnMouse( wxMouseEvent &WXUNUSED(event) ) @@ -473,7 +489,16 @@ void wxPlotYAxisArea::OnPaint( wxPaintEvent &WXUNUSED(event) ) { dc.DrawLine( client_width-15, y, client_width-7, y ); wxString label; - label.Printf( wxT("%.1f"), current ); + if (range < 50) + { + label.Printf( wxT("%f"), current ); + while (label.Last() == wxT('0')) + label.RemoveLast(); + if ((label.Last() == wxT('.')) || (label.Last() == wxT(','))) + label.Append( wxT('0') ); + } + else + label.Printf( wxT("%d"), (int)floor(current) ); dc.DrawText( label, 5, y-7 ); } @@ -519,6 +544,9 @@ wxPlotWindow::wxPlotWindow( wxWindow *parent, wxWindowID id, const wxPoint &pos, { m_xUnitsPerValue = 1.0; m_xZoom = 1.0; + + m_enlargeAroundWindowCentre = FALSE; + m_scrollOnThumbRelease = FALSE; m_area = new wxPlotArea( this ); wxBoxSizer *mainsizer = new wxBoxSizer( wxHORIZONTAL ); @@ -675,11 +703,29 @@ void wxPlotWindow::Enlarge( wxPlotCurve *curve, double factor ) { m_area->DeleteCurve( curve ); + int client_width; + int client_height; + m_area->GetClientSize( &client_width, &client_height); + double offset = (double)curve->GetOffsetY() / (double)client_height; + double range = curve->GetEndY() - curve->GetStartY(); + offset *= range; + double new_range = range / factor; - double middle = curve->GetEndY() - range/2; - curve->SetStartY( middle - new_range / 2 ); - curve->SetEndY( middle + new_range / 2 ); + double new_offset = offset / factor; + + if (m_enlargeAroundWindowCentre) + { + double middle = curve->GetStartY() - offset + range/2; + + curve->SetStartY( middle - new_range / 2 + new_offset ); + curve->SetEndY( middle + new_range / 2 + new_offset ); + } + else + { + curve->SetStartY( (curve->GetStartY() - offset)/factor + new_offset ); + curve->SetEndY( (curve->GetEndY() - offset)/factor + new_offset ); + } m_area->Refresh( FALSE ); RedrawYAxis(); @@ -710,7 +756,10 @@ void wxPlotWindow::SetZoom( double zoom ) max = curve->GetEndX(); node = node->Next(); } - SetScrollbars( 10, 10, (int)((max*m_xZoom)/10)+1, 0, (int)view_x*zoom/old_zoom, 0 ); + SetScrollbars( wxPLOT_SCROLL_STEP, wxPLOT_SCROLL_STEP, + (int)((max*m_xZoom)/wxPLOT_SCROLL_STEP)+1, 0, + (int)view_x*zoom/old_zoom, 0, + TRUE ); RedrawXAxis(); m_area->Refresh( TRUE ); @@ -728,7 +777,8 @@ void wxPlotWindow::ResetScrollbar() node = node->Next(); } - SetScrollbars( 10, 10, ((max*m_xZoom)/10)+1, 0 ); + SetScrollbars( wxPLOT_SCROLL_STEP, wxPLOT_SCROLL_STEP, + ((max*m_xZoom)/wxPLOT_SCROLL_STEP)+1, 0 ); } void wxPlotWindow::RedrawXAxis() @@ -778,9 +828,11 @@ void wxPlotWindow::OnShrink( wxCommandEvent& WXUNUSED(event) ) void wxPlotWindow::OnScroll2( wxScrollWinEvent& event ) { - wxScrolledWindow::OnScroll( event ); - - RedrawXAxis(); + if ((!m_scrollOnThumbRelease) || (event.GetEventType() != wxEVT_SCROLLWIN_THUMBTRACK)) + { + wxScrolledWindow::OnScroll( event ); + RedrawXAxis(); + } } // ---------------------------------------------------------------------------- diff --git a/src/generic/scrolwin.cpp b/src/generic/scrolwin.cpp index 17facb6ea2..74b4d6bbd2 100644 --- a/src/generic/scrolwin.cpp +++ b/src/generic/scrolwin.cpp @@ -317,6 +317,7 @@ int wxScrolledWindow::CalcScrollInc(wxScrollWinEvent& event) break; } case wxEVT_SCROLLWIN_THUMBTRACK: + case wxEVT_SCROLLWIN_THUMBRELEASE: { if (orient == wxHORIZONTAL) nScrollInc = pos - m_xScrollPosition;