diff --git a/wx/speed-stats.cc b/wx/speed-stats.cc index f3ad025c5..8f89ef7b5 100644 --- a/wx/speed-stats.cc +++ b/wx/speed-stats.cc @@ -18,15 +18,22 @@ * $Id$ */ -#include +#include +#include +#include #include #include #include +#include +#include "foreach.h" #include "speed-stats.h" +#define SNAPSHOT_PIXEL_WIDTH 8 + BEGIN_EVENT_TABLE( SpeedStats, wxPanel ) +EVT_SIZE( SpeedStats::OnSize ) +EVT_PAINT( SpeedStats::OnPaint ) END_EVENT_TABLE() - //EVT_PAINT( SpeedStats::OnPaint ) SpeedStats :: SpeedStats( wxWindow * parent, wxWindowID id, @@ -34,30 +41,167 @@ SpeedStats :: SpeedStats( wxWindow * parent, const wxSize & size, long style, const wxString & name ): - wxPanel( parent, id, pos, size, style, name ) + wxPanel( parent, id, pos, size, style|wxFULL_REPAINT_ON_RESIZE, name ), + myBitmap( 0 ), + myTorrent( 0 ), + myMaxSpeed( -1 ), + myHistory( 0 ) { + myColors[BACKGROUND] = wxColour( 0, 0, 0 ); // black + myColors[FRAME] = wxColour( 34, 139, 34 ); // forest green + myColors[ALL_UP] = wxColour( 255, 0, 0 ); + myColors[TORRENT_UP] = wxColour( 255, 255, 0 ); + + myColors[ALL_DOWN] = wxColour( 255, 0, 255 ); + myColors[TORRENT_DOWN] = wxColour( 0, 255, 128 ); +} + +SpeedStats :: ~SpeedStats() +{ + delete myBitmap; } void -SpeedStats :: Update( tr_handle_t * WXUNUSED(handle) ) +SpeedStats :: OnSize( wxSizeEvent& event ) { + delete myBitmap; + + const wxSize size = event.GetSize(); + myBitmap = new wxBitmap( size.GetWidth(), size.GetHeight() ); + myHistory = size.GetWidth() / SNAPSHOT_PIXEL_WIDTH; } void SpeedStats :: OnPaint( wxPaintEvent& WXUNUSED(event) ) { -#if 0 - int w, h; - mySpeedPanel->GetSize( &w, &h ); - wxMemoryDC dc; - wxBitmap bitmap( w, h ); - dc.SelectObject( bitmap ); + const int draw_width = myBitmap->GetWidth(); + const int draw_height = myBitmap->GetHeight(); - wxColour backgroundColor = *wxBLACK; - dc.SetBrush( wxBrush( backgroundColor ) ); - dc.SetPen( wxBrush( backgroundColor ) ); - dc.DrawRectangle( 0, 0, w, h ); + const int top = (((int)myMaxSpeed + 11) / 10) * 10; + const double y_scale = (double)draw_height / top; + const int num_bars = 4; + const int per_bar = top / num_bars; - std::cerr << "paint" << std::endl; -#endif + // clear + wxMemoryDC memDC( *myBitmap ); + memDC.SetBackground( myColors[BACKGROUND] ); + memDC.Clear( ); + + // draw the frame + + memDC.SetPen( wxPen ( myColors[FRAME] ) ); + memDC.SetTextForeground( myColors[FRAME] ); + + const int fontsize = 10; + const int dely = int( draw_height / num_bars ); + + wxString xstr; + + memDC.SetFont( wxFont ( fontsize, wxFONTFAMILY_SWISS, + wxFONTSTYLE_NORMAL, + wxFONTWEIGHT_NORMAL ) ); + + for( int i=0; i<=num_bars; ++i ) + { + const int y = (int)(draw_height - (i*dely+0.5)); + + // line + memDC.DrawLine( wxCoord(0), wxCoord(draw_height - (i*dely+0.5)), + wxCoord(draw_width), wxCoord(draw_height - (i*dely+0.5)) ); + + xstr.Printf( _("%d KiB/s"), (per_bar*i) ); + memDC.DrawText( xstr, wxCoord(0), wxCoord(y+2) ); + } + + const int n = myStats.size( ); + if( n ) + { + wxPoint * points = new wxPoint[ n ]; + + int x = draw_width - (n * SNAPSHOT_PIXEL_WIDTH); + for( int i=0; itorrentUp = 0; + it->torrentDown = 0; + myMaxSpeed = std::max( myMaxSpeed, it->allUp ); + myMaxSpeed = std::max( myMaxSpeed, it->allDown ); + } + } +} + +void +SpeedStats :: Pulse( tr_handle_t * handle ) +{ + // add a new record + float allUp, allDown; + tr_torrentRates( handle, &allDown, &allUp ); + Speed s; + s.time = time( NULL ); + s.allUp = s.time % 30;//allUp; + s.allDown = s.time % 15;//allDown; + //if( myTorrent ) { + //const tr_stat_t * stat = tr_torrentStat( myTorrent ); + s.torrentUp = s.time % 40;//stat->rateUpload; + s.torrentDown = s.time % 25;//stat->rateDownload; + //} + myStats.push_back( s ); + + // age off old data + const int eraseCount = myStats.size() - myHistory; + if( eraseCount > 0 ) + myStats.erase( myStats.begin(), + myStats.begin() + eraseCount ); + + // update max + myMaxSpeed = std::max( myMaxSpeed, s.allUp ); + myMaxSpeed = std::max( myMaxSpeed, s.allDown ); + myMaxSpeed = std::max( myMaxSpeed, s.torrentUp ); + myMaxSpeed = std::max( myMaxSpeed, s.torrentDown ); + + Refresh( false ); } diff --git a/wx/speed-stats.h b/wx/speed-stats.h index df6a3e48f..178c0074e 100644 --- a/wx/speed-stats.h +++ b/wx/speed-stats.h @@ -21,31 +21,81 @@ #ifndef __XMISSION_SPEED_STATS_H__ #define __XMISSION_SPEED_STATS_H__ +#include +#include +#include #include #include +extern "C" +{ + struct tr_torrent_s; +} + class SpeedStats: public wxPanel { public: SpeedStats( wxWindow * parent, - wxWindowID id = wxID_ANY, - const wxPoint& pos = wxDefaultPosition, - const wxSize& size = wxDefaultSize, - long style = wxTAB_TRAVERSAL, - const wxString& name = _T("panel")); + wxWindowID id = wxID_ANY, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxTAB_TRAVERSAL, + const wxString& name = _T("panel")); - virtual ~SpeedStats() {} - - void Update( tr_handle_t * handle ); + virtual ~SpeedStats(); public: - void OnPaint( wxPaintEvent& ); + void SetTorrent( struct tr_torrent_s * ); + + void Pulse( tr_handle_t * handle ); private: - DECLARE_EVENT_TABLE() + virtual void OnSize( wxSizeEvent& event ); + + void OnPaint( wxPaintEvent& ); + + DECLARE_EVENT_TABLE() + + private: + + wxBitmap * myBitmap; + + struct tr_torrent_s * myTorrent; + + struct Speed + { + time_t time; + double torrentUp; + double torrentDown; + double allUp; + double allDown; + Speed(): time(0), + torrentUp(0), torrentDown(0), + allUp(0), allDown(0) {} + }; + + typedef std::vector stats_t; + + stats_t myStats; + + double myMaxSpeed; + + int myHistory; + + enum { + BACKGROUND, + FRAME, + TORRENT_UP, + TORRENT_DOWN, + ALL_UP, + ALL_DOWN, + N_COLORS + }; + + wxColour myColors[N_COLORS]; }; #endif diff --git a/wx/xmission.cc b/wx/xmission.cc index 621357347..f8cf2e461 100755 --- a/wx/xmission.cc +++ b/wx/xmission.cc @@ -380,7 +380,7 @@ void MyFrame :: OnOpen( wxCommandEvent& WXUNUSED(event) ) bool MyApp::OnInit() { - handle = tr_init( "gui" ); + handle = tr_init( "wx" ); wxCmdLineParser cmdParser( cmdLineDesc, argc, argv ); if( cmdParser.Parse ( ) ) @@ -437,6 +437,9 @@ MyFrame :: OnTorrentListSelectionChanged( TorrentListCtrl* list, { assert( list == myTorrentList ); mySelectedTorrents.assign( torrents.begin(), torrents.end() ); + + tr_torrent_t * tor = mySelectedTorrents.empty() ? NULL : mySelectedTorrents.front(); + mySpeedStats->SetTorrent( tor ); } void @@ -454,7 +457,7 @@ MyFrame :: OnPulse(wxTimerEvent& WXUNUSED(event) ) RefreshFilterCounts( ); ApplyCurrentFilter( ); - mySpeedStats->Update( handle ); + mySpeedStats->Pulse( handle ); float down, up; tr_torrentRates( handle, &down, &up ); @@ -489,6 +492,7 @@ MyFrame :: MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size myPulseTimer( this, ID_Pulse ), myLogoIcon( transmission_xpm ), myTrayIconIcon( systray_xpm ), + mySpeedStats( 0 ), myFilterFlags( ~0 ), myExitTime( 0 ) {