source: trunk/wx/xmission.cc @ 6792

Last change on this file since 6792 was 6792, checked in by charles, 13 years ago

(wx) get the wxWidgets port building again. :)

  • Property svn:executable set to *
  • Property svn:keywords set to Date Rev Author Id
File size: 19.8 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: xmission.cc 6792 2008-09-19 17:17:34Z charles $
19 */
20
21#include <ctype.h>
22#include <inttypes.h>
23#include <set>
24#include <map>
25#include <string>
26#include <vector>
27#include <iostream>
28
29#include <wx/artprov.h>
30#include <wx/bitmap.h>
31#include <wx/cmdline.h>
32#include <wx/config.h>
33#include <wx/dcmemory.h>
34#include <wx/defs.h>
35#include <wx/filename.h>
36#include <wx/image.h>
37#include <wx/intl.h>
38#include <wx/listctrl.h>
39#include <wx/notebook.h>
40#include <wx/snglinst.h>
41#include <wx/splitter.h>
42#include <wx/statline.h>
43#include <wx/stdpaths.h>
44#include <wx/taskbar.h>
45#include <wx/tglbtn.h>
46#include <wx/toolbar.h>
47#include <wx/wx.h>
48#if wxCHECK_VERSION(2,8,0)
49#include <wx/aboutdlg.h>
50#endif
51
52extern "C"
53{
54  #include <libtransmission/transmission.h>
55  #include <libtransmission/utils.h>
56
57  #include <images/play.xpm>
58  #include <images/stop.xpm>
59  #include <images/plus.xpm>
60  #include <images/minus.xpm>
61
62  #include <images/systray.xpm>
63  #include <images/transmission.xpm>
64}
65
66#include "foreach.h"
67#include "speed-stats.h"
68#include "filter.h"
69#include "torrent-list.h"
70#include "torrent-stats.h"
71
72/***
73****
74***/
75
76namespace
77{
78    int bestDecimal( double num ) {
79        if ( num < 10 ) return 2;
80        if ( num < 100 ) return 1;
81        return 0;
82    }
83
84    wxString toWxStr( const char * s )
85    {
86        return wxString( s, wxConvUTF8 );
87    }
88
89    std::string toStr( const wxString& xstr )
90    {
91        return std::string( xstr.mb_str( *wxConvCurrent ) );
92    }
93
94    wxString getReadableSize( uint64_t size )
95    {
96        int i;
97        static const char *sizestrs[] = { "B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB" };
98        for ( i=0; size>>10; ++i ) size = size>>10;
99        char buf[512];
100        snprintf( buf, sizeof(buf), "%.*f %s", bestDecimal(size), (double)size, sizestrs[i] );
101        return toWxStr( buf );
102    }
103
104    wxString getReadableSize( float f )
105    {
106        return getReadableSize( (uint64_t)f );
107    }
108
109    wxString getReadableSpeed( float kib_sec )
110    {
111        wxString xstr = getReadableSize(1024*kib_sec);
112        xstr += _T("/s");
113        return xstr;
114    }
115}
116
117namespace
118{
119    const wxCmdLineEntryDesc cmdLineDesc[] =
120    {
121        { wxCMD_LINE_SWITCH, _T("p"), _("pause"), _("pauses all the torrents on startup"), wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL },
122        { wxCMD_LINE_NONE, NULL, NULL, NULL, wxCMD_LINE_VAL_STRING, 0 }
123    };
124}
125
126/***
127****
128***/
129
130class MyApp : public wxApp
131{
132    virtual bool OnInit();
133    virtual ~MyApp();
134    wxSingleInstanceChecker * myChecker;
135};
136
137namespace
138{
139    tr_handle * handle = NULL;
140
141    typedef std::vector<tr_torrent*> torrents_v;
142}
143
144class MyFrame : public wxFrame, public TorrentListCtrl::Listener
145{
146public:
147    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size, bool paused);
148    virtual ~MyFrame();
149
150public:
151    void OnExit( wxCommandEvent& );
152    void OnAbout( wxCommandEvent& );
153    void OnOpen( wxCommandEvent& );
154
155    void OnStart( wxCommandEvent& );
156    void OnStartUpdate( wxUpdateUIEvent& );
157
158    void OnStop( wxCommandEvent& );
159    void OnStopUpdate( wxUpdateUIEvent& );
160
161    void OnRemove( wxCommandEvent& );
162    void OnRemoveUpdate( wxUpdateUIEvent& );
163
164    void OnRecheck( wxCommandEvent& );
165    void OnRecheckUpdate( wxUpdateUIEvent& );
166
167    void OnSelectAll( wxCommandEvent& );
168    void OnSelectAllUpdate( wxUpdateUIEvent& );
169    void OnDeselectAll( wxCommandEvent& );
170    void OnDeselectAllUpdate( wxUpdateUIEvent& );
171
172    void OnFilterChanged( wxCommandEvent& );
173
174    void OnPulse( wxTimerEvent& );
175
176    virtual void OnTorrentListSelectionChanged( TorrentListCtrl*, const std::set<tr_torrent*>& );
177
178private:
179    void RefreshFilterCounts( );
180    void ApplyCurrentFilter( );
181
182protected:
183    wxConfig * myConfig;
184    wxTimer myPulseTimer;
185
186private:
187    TorrentListCtrl * myTorrentList;
188    TorrentStats * myTorrentStats;
189    wxListCtrl * myFilters;
190    wxTaskBarIcon * myTrayIcon;
191    wxIcon myLogoIcon;
192    wxIcon myTrayIconIcon;
193    SpeedStats * mySpeedStats;
194    torrents_v myTorrents;
195    torrents_v mySelectedTorrents;
196    int myFilter;
197    std::string mySavePath;
198    time_t myExitTime;
199    wxToggleButton* myFilterButtons[TorrentFilter::N_FILTERS];
200
201private:
202    DECLARE_EVENT_TABLE()
203};
204
205enum
206{
207    ID_START,
208    ID_DESELECTALL,
209    ID_EDIT_PREFS,
210    ID_SHOW_DEBUG_WINDOW,
211    ID_Pulse,
212    ID_Filter
213};
214
215BEGIN_EVENT_TABLE(MyFrame, wxFrame)
216    EVT_COMMAND_RANGE( ID_Filter, ID_Filter+TorrentFilter::N_FILTERS, wxEVT_COMMAND_TOGGLEBUTTON_CLICKED, MyFrame::OnFilterChanged )
217    EVT_MENU     ( wxID_ABOUT, MyFrame::OnAbout )
218    EVT_TIMER    ( ID_Pulse, MyFrame::OnPulse )
219    EVT_MENU     ( wxID_EXIT, MyFrame::OnExit )
220    EVT_MENU     ( wxID_OPEN, MyFrame::OnOpen )
221    EVT_MENU     ( ID_START, MyFrame::OnStart )
222    EVT_UPDATE_UI( ID_START, MyFrame::OnStartUpdate )
223    EVT_MENU     ( wxID_STOP, MyFrame::OnStop )
224    EVT_UPDATE_UI( wxID_STOP, MyFrame::OnStopUpdate )
225    EVT_MENU     ( wxID_REFRESH, MyFrame::OnRecheck )
226    EVT_UPDATE_UI( wxID_REFRESH, MyFrame::OnRecheckUpdate )
227    EVT_MENU     ( wxID_REMOVE, MyFrame::OnRemove )
228    EVT_UPDATE_UI( wxID_REMOVE, MyFrame::OnRemoveUpdate )
229    EVT_MENU     ( wxID_SELECTALL, MyFrame::OnSelectAll )
230    EVT_UPDATE_UI( wxID_SELECTALL, MyFrame::OnSelectAllUpdate )
231    EVT_MENU     ( ID_DESELECTALL, MyFrame::OnDeselectAll )
232    EVT_UPDATE_UI( ID_DESELECTALL, MyFrame::OnDeselectAllUpdate )
233END_EVENT_TABLE()
234
235IMPLEMENT_APP(MyApp)
236
237
238void
239MyFrame :: OnFilterChanged( wxCommandEvent& e )
240{
241    static bool ignore = false;
242
243    if( !ignore )
244    {
245        myFilter = e.GetId() - ID_Filter;
246        std::cerr << " OnFilterChanged, myFilter is now " << myFilter << std::endl;
247        ApplyCurrentFilter ( );
248
249        ignore = true;
250        for( int i=0; i<TorrentFilter::N_FILTERS; ++i )
251            myFilterButtons[i]->SetValue( i==myFilter );
252        ignore = false;
253    }
254}
255
256void
257MyFrame :: OnSelectAll( wxCommandEvent& )
258{
259    myTorrentList->SelectAll( );
260}
261
262void
263MyFrame :: OnSelectAllUpdate( wxUpdateUIEvent& event )
264{
265    event.Enable( mySelectedTorrents.size() < myTorrents.size() );
266}
267
268void
269MyFrame :: OnDeselectAll( wxCommandEvent& )
270{
271    myTorrentList->DeselectAll ( );
272}
273
274void
275MyFrame :: OnDeselectAllUpdate( wxUpdateUIEvent& event )
276{
277    event.Enable( !mySelectedTorrents.empty() );
278}
279
280/**
281**/
282
283void
284MyFrame :: OnStartUpdate( wxUpdateUIEvent& event )
285{
286    bool enable = false;
287    foreach( torrents_v, mySelectedTorrents, it )
288        if( tr_torrentStatCached(*it)->status == TR_STATUS_STOPPED )
289            enable = true;
290    event.Enable( enable );
291}
292void
293MyFrame :: OnStart( wxCommandEvent& WXUNUSED(unused) )
294{
295    foreach( torrents_v, mySelectedTorrents, it )
296        if( tr_torrentStatCached(*it)->status == TR_STATUS_STOPPED )
297            tr_torrentStart( *it );
298}
299
300/**
301**/
302
303void
304MyFrame :: OnStopUpdate( wxUpdateUIEvent& event )
305{
306    bool enable = false;
307    foreach( torrents_v, mySelectedTorrents, it )
308        if( tr_torrentStatCached(*it)->status != TR_STATUS_STOPPED )
309            enable = true;
310    event.Enable( enable );
311}
312void
313MyFrame :: OnStop( wxCommandEvent& WXUNUSED(unused) )
314{
315    foreach( torrents_v, mySelectedTorrents, it )
316        if( tr_torrentStat(*it)->status != TR_STATUS_STOPPED )
317            tr_torrentStop( *it );
318}
319
320/**
321**/
322
323void
324MyFrame :: OnRemoveUpdate( wxUpdateUIEvent& event )
325{
326    event.Enable( !mySelectedTorrents.empty() );
327}
328void
329MyFrame :: OnRemove( wxCommandEvent& WXUNUSED(unused) )
330{
331    foreach( torrents_v, mySelectedTorrents, it )
332        tr_torrentRemove( *it );
333}
334
335/**
336**/
337
338void
339MyFrame :: OnRecheckUpdate( wxUpdateUIEvent& event )
340{
341   event.Enable( !mySelectedTorrents.empty() );
342}
343void
344MyFrame :: OnRecheck( wxCommandEvent& WXUNUSED(unused) )
345{
346    foreach( torrents_v, mySelectedTorrents, it )
347        tr_torrentVerify( *it );
348}
349
350/**
351**/
352
353void MyFrame :: OnOpen( wxCommandEvent& WXUNUSED(event) )
354{
355    const wxString key = _T("prev-directory");
356    wxString directory;
357    myConfig->Read( key, &directory );
358    wxFileDialog * w = new wxFileDialog( this, _T("message"),
359                                         directory,
360                                         _T(""), /* default file */
361                                         _T("Torrent files|*.torrent"),
362                                         wxOPEN|wxMULTIPLE );
363
364    if( w->ShowModal() == wxID_OK )
365    {
366        wxArrayString paths;
367        w->GetPaths( paths );
368        size_t nPaths = paths.GetCount();
369        for( size_t i=0; i<nPaths; ++i )
370        {
371            const std::string filename = toStr( paths[i] );
372            tr_ctor * ctor = tr_ctorNew( handle );
373            tr_ctorSetMetainfoFromFile( ctor, filename.c_str() );
374            tr_ctorSetDownloadDir( ctor, TR_FALLBACK, mySavePath.c_str() );
375            tr_torrent * tor = tr_torrentNew( handle, ctor, NULL );
376            tr_ctorFree( ctor );
377
378            if( tor )
379                myTorrents.push_back( tor );
380        }
381        ApplyCurrentFilter( );
382
383        myConfig->Write( key, w->GetDirectory() );
384    }
385
386    delete w;
387}
388
389
390bool
391MyApp :: OnInit( )
392{
393    const wxString downloadDir = wxStandardPaths::Get().GetDocumentsDir( );
394
395    handle = tr_sessionInit( tr_getDefaultConfigDir(),
396                             toStr(downloadDir).c_str(),
397                             "wx" );
398
399    wxCmdLineParser cmdParser( cmdLineDesc, argc, argv );
400    if( cmdParser.Parse ( ) )
401        return false;
402
403    const wxString name = wxString::Format( _T("Xmission-%s"), wxGetUserId().c_str());
404    myChecker = new wxSingleInstanceChecker( name );
405    if ( myChecker->IsAnotherRunning() ) {
406        wxLogError(_("An instance of Xmission is already running."));
407        return false;
408    }
409
410    const bool paused = cmdParser.Found( _("p") );
411
412    MyFrame * frame = new MyFrame( _("Xmission"),
413                                   wxPoint(50,50),
414                                   wxSize(900,600),
415                                   paused);
416
417    frame->Show( true );
418    SetTopWindow( frame );
419    return true;
420}
421
422MyApp :: ~MyApp()
423{
424    delete myChecker;
425}
426
427/***
428****
429***/
430
431void
432MyFrame :: RefreshFilterCounts( )
433{
434    int hits[ TorrentFilter :: N_FILTERS ];
435    TorrentFilter::CountHits( myTorrents, hits );
436    for( int i=0; i<TorrentFilter::N_FILTERS; ++i )
437        myFilterButtons[i]->SetLabel( TorrentFilter::GetName( i, hits[i] ) );
438}
439
440void
441MyFrame :: ApplyCurrentFilter( )
442{
443    torrents_v tmp( myTorrents );
444    TorrentFilter :: RemoveFailures( myFilter, tmp );
445    myTorrentList->Assign( tmp );
446}
447
448void
449MyFrame :: OnTorrentListSelectionChanged( TorrentListCtrl* list,
450                                          const std::set<tr_torrent*>& torrents )
451{
452    assert( list == myTorrentList );
453    mySelectedTorrents.assign( torrents.begin(), torrents.end() );
454
455    tr_torrent * tor = mySelectedTorrents.empty() ? NULL : mySelectedTorrents.front();
456    mySpeedStats->SetTorrent( tor );
457}
458
459void
460MyFrame :: OnPulse(wxTimerEvent& WXUNUSED(event) )
461{
462    if( myExitTime ) {
463        if ( !tr_sessionCountTorrents(handle) ||  myExitTime<time(0) ) {
464            delete myTrayIcon;
465            myTrayIcon = 0;
466            Destroy( );
467            return;
468        }
469    }
470
471    RefreshFilterCounts( );
472    ApplyCurrentFilter( );
473
474    mySpeedStats->Pulse( handle );
475
476    float down, up;
477    tr_sessionGetSpeed( handle, &down, &up );
478    wxString xstr = _("Total DL: ");
479    xstr += getReadableSpeed( down );
480    SetStatusText( xstr, 1 );
481    xstr = _("Total UL: ");
482    xstr += getReadableSpeed( up );
483    SetStatusText( xstr, 2 );
484
485    xstr = _("Download: ");
486    xstr += getReadableSpeed( down );
487    xstr += _T("\n");
488    xstr +=_("Upload: ");
489    xstr +=  getReadableSpeed( up );
490    myTrayIcon->SetIcon( myTrayIconIcon, xstr );
491
492    myTorrentList->Refresh ( );
493}
494
495MyFrame::~MyFrame()
496{
497    myTorrentList->RemoveListener( this );
498    delete myTorrentList;
499
500    delete myConfig;
501}
502
503MyFrame :: MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size, bool paused):
504    wxFrame((wxFrame*)NULL,-1,title,pos,size),
505    myConfig( new wxConfig( _T("xmission") ) ),
506    myPulseTimer( this, ID_Pulse ),
507    myLogoIcon( transmission_xpm ),
508    myTrayIconIcon( systray_xpm ),
509    mySpeedStats( 0 ),
510    myFilter( TorrentFilter::ALL ),
511    myExitTime( 0 )
512{
513    myTrayIcon = new wxTaskBarIcon;
514    SetIcon( myLogoIcon );
515
516    /**
517    ***  Prefs
518    **/
519
520    long port;
521    wxString key = _T("port");
522    if( !myConfig->Read( key, &port, TR_DEFAULT_PORT ) )
523        myConfig->Write( key, port );
524    tr_sessionSetPeerPort( handle, port );
525
526    key = _T("save-path");
527    wxString wxstr;
528    if( !myConfig->Read( key, &wxstr, wxFileName::GetHomeDir() ) )
529         myConfig->Write( key, wxstr );
530    mySavePath = toStr( wxstr );
531
532    const wxString default_colors[SpeedStats::N_COLORS] = {
533        _T("#000000"), // background
534        _T("#32cd32"), // frame
535        _T("#ff0000"), // all up
536        _T("#ff00ff"), // all down
537        _T("#ffff00"), // torrent up
538        _T("#00ff88")  // torrent down
539    };
540    wxColor speedColors[SpeedStats::N_COLORS];
541    for( int i=0; i<SpeedStats::N_COLORS; ++i )
542    {
543        key = SpeedStats::GetColorName( i );
544        myConfig->Read( key, &wxstr, _T("") );
545        std::string str = toStr( wxstr );
546        if( (str.size()!=7)
547            || (str[0]!='#')
548            || !isxdigit(str[1]) || !isxdigit(str[2])
549            || !isxdigit(str[3]) || !isxdigit(str[4])
550            || !isxdigit(str[5]) || !isxdigit(str[6]))
551        {
552            myConfig->Write( key, default_colors[i] );
553            str = toStr( default_colors[i] );
554        }
555        int r, g, b;
556        sscanf( str.c_str()+1, "%02x%02x%02x", &r, &g, &b );
557        speedColors[i].Set( r, g, b );
558    }
559
560    /**
561    ***  Menu
562    **/
563
564    wxMenuBar *menuBar = new wxMenuBar;
565
566    wxMenu * m = new wxMenu;
567    m->Append( wxID_OPEN, _T("&Open") );
568    m->Append( ID_START, _T("&Start") );
569    m->Append( wxID_STOP, _T("Sto&p") ) ;
570    m->Append( wxID_REFRESH, _T("Re&check") );
571    m->Append( wxID_REMOVE, _T("&Remove") );
572    m->AppendSeparator();
573    m->Append( wxID_NEW, _T("Create &New Torrent") );
574    m->AppendSeparator();
575    m->Append( wxID_CLOSE, _T("&Close") );
576    m->Append( wxID_EXIT, _T("&Exit") );
577    menuBar->Append( m, _T("&File") );
578
579    m = new wxMenu;
580    m->Append( wxID_SELECTALL, _T("Select &All") );
581    m->Append( ID_DESELECTALL, _T("&Deselect All") );
582    m->AppendSeparator();
583    m->Append( wxID_PREFERENCES, _T("Edit &Preferences") );
584    menuBar->Append( m, _T("&Edit") );
585
586    m = new wxMenu;
587    m->Append( ID_SHOW_DEBUG_WINDOW, _T("Show &Debug Window") );
588    m->AppendSeparator();
589    m->Append( wxID_ABOUT, _T("&About Xmission") );
590    menuBar->Append( m, _T("&Help") );
591
592    SetMenuBar(menuBar);
593
594    /**
595    ***  Toolbar
596    **/
597
598    wxIcon open_icon( plus_xpm );
599    wxIcon exec_icon( play_xpm );
600    wxIcon stop_icon( stop_xpm );
601    wxIcon drop_icon( minus_xpm );
602    wxBitmap bitmap;
603
604    wxToolBar* toolbar = CreateToolBar( wxTB_FLAT );
605    toolbar->SetToolBitmapSize( wxSize( 24, 24 ) );
606    bitmap.CopyFromIcon( open_icon );
607    toolbar->AddTool( wxID_OPEN,   _T("Open"), bitmap );
608    bitmap.CopyFromIcon( exec_icon );
609    toolbar->AddTool( ID_START,    _T("Start"), bitmap );
610    bitmap.CopyFromIcon( stop_icon );
611    toolbar->AddTool( wxID_STOP,   _T("Stop"), bitmap );
612    bitmap.CopyFromIcon( drop_icon );
613    toolbar->AddTool( wxID_REMOVE, _T("Remove"), bitmap );
614    toolbar->Realize();
615
616    /**
617    ***  Row 1
618    **/
619
620    wxSplitterWindow * hsplit = new wxSplitterWindow( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxSP_3DSASH );
621#if wxCHECK_VERSION(2,5,4)
622    hsplit->SetSashGravity( 0.8 );
623#endif
624
625    wxPanel * panel_1 = new wxPanel( hsplit, wxID_ANY );
626
627    wxBoxSizer * buttonSizer = new wxBoxSizer( wxVERTICAL );
628
629    for( int i=0; i<TorrentFilter::N_FILTERS; ++i ) {
630        wxToggleButton * b = new wxToggleButton( panel_1, ID_Filter+i, TorrentFilter::GetName(i), wxDefaultPosition, wxDefaultSize, (i==0)?wxRB_GROUP:0 );
631        b->SetValue( i==0 );
632        myFilterButtons[i] = b;
633        buttonSizer->Add( b, 1, wxGROW, 0 );
634    }
635
636    myTorrentList = new TorrentListCtrl( handle, myConfig, panel_1 );
637    myTorrentList->AddListener( this );
638
639    wxBoxSizer * panelSizer = new wxBoxSizer( wxHORIZONTAL );
640    panelSizer->Add( buttonSizer, 0, wxALL, 5 );
641    panelSizer->Add( myTorrentList, 1, wxGROW|wxALL, 5 );
642
643    panel_1->SetSizer( panelSizer );
644
645
646    wxNotebook * notebook = new wxNotebook( hsplit, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP );
647    myTorrentStats = new TorrentStats( notebook );
648    notebook->AddPage( myTorrentStats, _T("General"), false );
649    wxButton * tmp = new wxButton( notebook, wxID_ANY, _T("Hello &World"));
650    notebook->AddPage( tmp, _T("Peers") );
651    tmp = new wxButton( notebook, wxID_ANY, _T("&Hello World"));
652    notebook->AddPage( tmp, _T("Pieces") );
653    tmp = new wxButton( notebook, wxID_ANY, _T("Hello World"));
654    notebook->AddPage( tmp, _T("Files") );
655    mySpeedStats = new SpeedStats( notebook, wxID_ANY );
656    for( int i=0; i<SpeedStats::N_COLORS; ++i )
657        mySpeedStats->SetColor( i, speedColors[i] );
658    notebook->AddPage( mySpeedStats, _T("Speed"), true );
659    tmp = new wxButton( notebook, wxID_ANY, _T("Hello World"));
660    notebook->AddPage( tmp, _T("Logger") );
661
662    hsplit->SplitHorizontally( panel_1, notebook );
663
664    /**
665    ***  Statusbar
666    **/
667
668    const int widths[] = { -1, 150, 150 };
669    wxStatusBar * statusBar = CreateStatusBar( WXSIZEOF(widths) );
670    SetStatusWidths( WXSIZEOF(widths), widths );
671    const int styles[] = { wxSB_FLAT, wxSB_NORMAL, wxSB_NORMAL };
672    statusBar->SetStatusStyles(  WXSIZEOF(widths), styles );
673
674    /**
675    ***  Refresh
676    **/
677
678    myPulseTimer.Start( 500 );
679
680    /**
681    ***  Load the torrents
682    **/
683
684    int count = 0;
685    tr_ctor * ctor = tr_ctorNew( handle );
686    tr_ctorSetPaused( ctor, TR_FORCE, paused );
687    tr_ctorSetDownloadDir( ctor, TR_FALLBACK, mySavePath.c_str() );
688    tr_torrent ** torrents = tr_sessionLoadTorrents( handle, ctor, &count );
689    myTorrents.insert( myTorrents.end(), torrents, torrents+count );
690    tr_free( torrents );
691    tr_ctorFree( ctor );
692
693    wxTimerEvent dummy;
694    OnPulse( dummy );
695}
696
697void
698MyFrame :: OnExit( wxCommandEvent& WXUNUSED( event ) )
699{
700    Enable( false );
701
702    myTorrents.clear( );
703    mySelectedTorrents.clear( );
704    ApplyCurrentFilter( );
705
706    tr_sessionClose( handle );
707
708    /* give the connections a max of 10 seconds to shut themselves down */
709    myExitTime = time(0) + 10;
710}
711
712void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
713{
714    wxIcon ico( transmission_xpm );
715
716#if wxCHECK_VERSION(2,8,0)
717    wxAboutDialogInfo info;
718    info.SetName(_T("Xmission"));
719    info.SetVersion(_T(LONG_VERSION_STRING));
720    info.SetCopyright(_T("Copyright 2005-2007 The Transmission Project"));
721    info.SetDescription(_T("A fast and easy BitTorrent client"));
722    info.SetWebSite( _T( "http://www.transmissionbt.com/" ) );
723    info.SetIcon( ico );
724    info.AddDeveloper( _T("Charles Kerr (Back-end, GTK+, wxWidgets)") );
725    info.AddDeveloper( _T("Mitchell Livingston (Back-end; OS X)")  );
726    info.AddDeveloper( _T("Eric Petit (Back-end; OS X)")  );
727    info.AddDeveloper( _T("Josh Elsasser (Back-end; GTK+)") );
728    info.AddDeveloper( _T("Bryan Varner (BeOS)")  );
729    wxAboutBox( info );
730#else
731    wxMessageBox(_T("Xmission " LONG_VERSION_STRING "\n"
732                    "Copyright 2005-2007 The Transmission Project"),
733                 _T("About Xmission"),
734                wxOK|wxICON_INFORMATION, this);
735#endif
736
737}
Note: See TracBrowser for help on using the repository browser.