source: trunk/wx/speed-stats.cc @ 2907

Last change on this file since 2907 was 2907, checked in by charles, 15 years ago

implement the `speed' tab.

  • Property svn:keywords set to Date Rev Author Id
File size: 6.1 KB
Line 
1/*
2 * Xmission - a cross-platform bittorrent client
3 * Copyright (C) 2007 Charles Kerr <charles@rebelbase.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; version 2 of the License.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17 *
18 * $Id: speed-stats.cc 2907 2007-08-22 19:49:24Z charles $
19 */
20
21#include <wx/dcclient.h>
22#include <wx/dcmemory.h>
23#include <wx/event.h>
24#include <wx/gbsizer.h>
25#include <wx/stattext.h>
26#include <wx/intl.h>
27#include <libtransmission/transmission.h>
28#include "foreach.h"
29#include "speed-stats.h"
30
31#define SNAPSHOT_PIXEL_WIDTH 8
32
33BEGIN_EVENT_TABLE( SpeedStats, wxPanel )
34EVT_SIZE( SpeedStats::OnSize )
35EVT_PAINT( SpeedStats::OnPaint )
36END_EVENT_TABLE()
37
38SpeedStats :: SpeedStats( wxWindow         * parent,
39                          wxWindowID         id,
40                          const wxPoint    & pos,
41                          const wxSize     & size,
42                          long               style,
43                          const wxString   & name ):
44    wxPanel( parent, id, pos, size, style|wxFULL_REPAINT_ON_RESIZE, name ),
45    myBitmap( 0 ),
46    myTorrent( 0 ),
47    myMaxSpeed( -1 ),
48    myHistory( 0 )
49{
50    myColors[BACKGROUND] = wxColour( 0, 0, 0 ); // black
51    myColors[FRAME] = wxColour( 34, 139, 34 ); // forest green
52    myColors[ALL_UP] = wxColour( 255, 0, 0 );
53    myColors[TORRENT_UP] = wxColour( 255, 255, 0 );
54
55    myColors[ALL_DOWN] = wxColour( 255, 0, 255 );
56    myColors[TORRENT_DOWN] = wxColour( 0, 255, 128 );
57}
58
59SpeedStats :: ~SpeedStats()
60{
61    delete myBitmap;
62}
63
64void
65SpeedStats :: OnSize( wxSizeEvent& event )
66{
67    delete myBitmap;
68
69    const wxSize size = event.GetSize();
70    myBitmap = new wxBitmap( size.GetWidth(), size.GetHeight() );
71    myHistory = size.GetWidth() / SNAPSHOT_PIXEL_WIDTH;
72}
73
74void
75SpeedStats :: OnPaint( wxPaintEvent& WXUNUSED(event) )
76{
77    const int draw_width = myBitmap->GetWidth();
78    const int draw_height = myBitmap->GetHeight();
79
80    const int top = (((int)myMaxSpeed + 11) / 10) * 10;
81    const double y_scale = (double)draw_height / top;
82    const int num_bars = 4;
83    const int per_bar = top / num_bars;
84
85    // clear
86    wxMemoryDC memDC( *myBitmap );
87    memDC.SetBackground( myColors[BACKGROUND] );
88    memDC.Clear( );
89
90    // draw the frame
91
92    memDC.SetPen( wxPen ( myColors[FRAME] ) );
93    memDC.SetTextForeground( myColors[FRAME] );
94
95    const int fontsize = 10;
96    const int dely = int( draw_height / num_bars );
97
98    wxString xstr;
99
100    memDC.SetFont( wxFont ( fontsize, wxFONTFAMILY_SWISS,
101                                      wxFONTSTYLE_NORMAL,
102                                      wxFONTWEIGHT_NORMAL ) );
103
104    for( int i=0; i<=num_bars; ++i )
105    {
106        const int y = (int)(draw_height - (i*dely+0.5));
107
108        // line
109        memDC.DrawLine( wxCoord(0),          wxCoord(draw_height - (i*dely+0.5)),
110                        wxCoord(draw_width), wxCoord(draw_height - (i*dely+0.5)) );
111
112        xstr.Printf( _("%d KiB/s"), (per_bar*i) );
113        memDC.DrawText( xstr, wxCoord(0), wxCoord(y+2) );
114    }
115
116    const int n = myStats.size( );
117    if( n )
118    {
119        wxPoint * points = new wxPoint[ n ];
120
121        int x = draw_width - (n * SNAPSHOT_PIXEL_WIDTH);
122        for( int i=0; i<n; ++i ) {
123            points[i].x = x;
124            x += SNAPSHOT_PIXEL_WIDTH;
125        }
126
127        // torrent upload
128        for( int i=0; i<n; ++i )
129            points[i].y = draw_height - 10 - int(myStats[i].torrentUp * y_scale);
130        memDC.SetPen( wxPen ( myColors[TORRENT_UP] ) );
131        memDC.DrawLines( n, points, 0, 0 );
132
133        // torrent download
134        for( int i=0; i<n; ++i )
135            points[i].y = draw_height - int(myStats[i].torrentDown * y_scale);
136        memDC.SetPen( wxPen ( myColors[TORRENT_DOWN] ) );
137        memDC.DrawLines( n, points, 0, 0 );
138
139        // all upload
140        for( int i=0; i<n; ++i )
141            points[i].y = draw_height - int(myStats[i].torrentUp * y_scale);
142        memDC.SetPen( wxPen ( myColors[ALL_UP] ) );
143        memDC.DrawLines( n, points, 0, 0 );
144
145        // all download
146        for( int i=0; i<n; ++i )
147            points[i].y = draw_height - int(myStats[i].torrentDown * y_scale);
148        memDC.SetPen( wxPen ( myColors[ALL_DOWN] ) );
149        memDC.DrawLines( n, points, 0, 0 );
150
151        delete [] points;
152    }
153
154    wxPaintDC dc( this );
155    dc.Blit( 0, 0, draw_width, draw_height, &memDC, 0, 0 );
156    memDC.SelectObject( wxNullBitmap );
157}
158
159void
160SpeedStats :: SetTorrent( tr_torrent_t * tor )
161{
162    if( tor != myTorrent )
163    {
164        myTorrent = tor;
165
166        myMaxSpeed = 0;
167        foreach( stats_t, myStats, it )
168        {
169            it->torrentUp = 0;
170            it->torrentDown = 0;
171            myMaxSpeed = std::max( myMaxSpeed, it->allUp );
172            myMaxSpeed = std::max( myMaxSpeed, it->allDown );
173        }
174    }
175}
176
177void
178SpeedStats :: Pulse( tr_handle_t * handle )
179{
180    // add a new record
181    float allUp, allDown;
182    tr_torrentRates( handle, &allDown, &allUp );
183    Speed s;
184    s.time = time( NULL );
185    s.allUp = s.time % 30;//allUp;
186    s.allDown = s.time % 15;//allDown;
187    //if( myTorrent ) {
188        //const tr_stat_t * stat = tr_torrentStat( myTorrent );
189        s.torrentUp = s.time % 40;//stat->rateUpload;
190        s.torrentDown = s.time % 25;//stat->rateDownload;
191    //}
192    myStats.push_back( s );
193
194    // age off old data
195    const int eraseCount = myStats.size() - myHistory;
196    if( eraseCount > 0 )
197        myStats.erase( myStats.begin(),
198                       myStats.begin() + eraseCount );
199
200    // update max
201    myMaxSpeed = std::max( myMaxSpeed, s.allUp );
202    myMaxSpeed = std::max( myMaxSpeed, s.allDown );
203    myMaxSpeed = std::max( myMaxSpeed, s.torrentUp );
204    myMaxSpeed = std::max( myMaxSpeed, s.torrentDown );
205
206    Refresh( false );
207}
Note: See TracBrowser for help on using the repository browser.