source: trunk/wx/xmission.cc @ 2467

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

for the time being, use xpm-based icons in the toolbar

  • Property svn:executable set to *
File size: 10.3 KB
Line 
1/*
2 * This file Copyright (C) 2007 Charles Kerr <charles@rebelbase.com>
3 *
4 * This file is licensed by the GPL version 2.  Works owned by the
5 * Transmission project are granted a special exemption to clause 2(b)
6 * so that the bulk of its code can remain under the MIT license.
7 * This exemption does not extend to derived works not owned by
8 * the Transmission project.
9 */
10
11#include <set>
12#include <map>
13#include <string>
14#include <vector>
15#include <iostream>
16#include <stdint.h>
17#include <wx/artprov.h>
18#include <wx/defs.h>
19#include <wx/config.h>
20#include <wx/listctrl.h>
21#include <wx/taskbar.h>
22#include <wx/toolbar.h>
23#include <wx/splitter.h>
24#include <wx/notebook.h>
25#include <wx/wx.h>
26#if wxCHECK_VERSION(2,8,0)
27#include <wx/aboutdlg.h>
28#endif
29
30extern "C"
31{
32  #include <libtransmission/transmission.h>
33  #include <libtransmission/utils.h>
34
35  #include <images/exec.xpm>
36  #include <images/fileopen.xpm>
37  #include <images/gtk-properties.xpm>
38  #include <images/gtk-remove.xpm>
39  #include <images/stop.xpm>
40  #include <images/transmission.xpm>
41}
42
43#include "torrent-list.h"
44
45class MyApp : public wxApp
46{
47    virtual bool OnInit();
48};
49
50IMPLEMENT_APP(MyApp)
51
52namespace
53{
54    tr_handle_t * handle = NULL;
55
56    typedef std::vector<tr_torrent_t*> torrents_t;
57}
58
59class MyFrame : public wxFrame
60{
61public:
62    MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
63    virtual ~MyFrame();
64    void OnQuit( wxCommandEvent& );
65    void OnAbout( wxCommandEvent& );
66    void OnOpen( wxCommandEvent& );
67    void OnTimer( wxTimerEvent& );
68
69protected:
70    wxConfig * myConfig;
71    wxTimer myPulseTimer;
72
73private:
74    TorrentListCtrl * myTorrentList;
75    wxTaskBarIcon * myTaskBarIcon;
76    wxIcon * myLogoIcon;
77    wxIcon * myTrayLogo;
78};
79
80enum
81{
82    ID_START,
83    ID_STOP,
84    ID_REMOVE,
85    ID_QUIT,
86    ID_TORRENT_INFO,
87    ID_EDIT_PREFS,
88    ID_SHOW_DEBUG_WINDOW,
89    ID_ABOUT,
90    ID_Pulse,
91    N_IDS
92};
93
94void MyFrame :: OnOpen( wxCommandEvent& event )
95{
96    const wxString key = _T("prev-directory");
97    wxString directory;
98    myConfig->Read( key, &directory );
99    wxFileDialog * w = new wxFileDialog( this, _T("message"),
100                                         directory,
101                                         _T(""), /* default file */
102                                         _T("Torrent files|*.torrent"),
103                                         wxOPEN|wxMULTIPLE );
104
105    if( w->ShowModal() == wxID_OK )
106    {
107        wxArrayString paths;
108        w->GetPaths( paths );
109        size_t nPaths = paths.GetCount();
110        for( size_t i=0; i<nPaths; ++i )
111        {
112            const wxString& w = paths[i];
113            std::cerr << w.ToAscii() << std::endl;
114        }
115        myConfig->Write( key, w->GetDirectory() );
116    }
117
118    delete w;
119}
120
121
122bool MyApp::OnInit()
123{
124    handle = tr_init( "wx" );
125
126    MyFrame * frame = new MyFrame( _T("Xmission"),
127                                   wxPoint(50,50),
128                                   wxSize(900,600));
129
130    frame->Connect( wxID_OPEN, wxEVT_COMMAND_MENU_SELECTED, (wxObjectEventFunction) &MyFrame::OnOpen );
131    frame->Connect( wxID_ABOUT, wxEVT_COMMAND_MENU_SELECTED, (wxObjectEventFunction) &MyFrame::OnAbout );
132    frame->Connect( wxID_EXIT, wxEVT_COMMAND_MENU_SELECTED, (wxObjectEventFunction) &MyFrame::OnQuit );
133    frame->Connect( ID_Pulse, wxEVT_TIMER, (wxObjectEventFunction) &MyFrame::OnTimer );
134
135    frame->Show( true );
136    SetTopWindow( frame );
137    return true;
138}
139
140/***
141****
142***/
143
144namespace
145{
146    int bestDecimal( double num ) {
147        if ( num < 10 ) return 2;
148        if ( num < 100 ) return 1;
149        return 0;
150    }
151
152    wxString toWxStr( const char * s )
153    {
154        return wxString( s, wxConvUTF8 );
155    }
156
157    wxString getReadableSize( uint64_t size )
158    {
159        int i;
160        static const char *sizestrs[] = { "B", "KiB", "MiB", "GiB", "TiB", "PiB", "EiB" };
161        for ( i=0; size>>10; ++i ) size = size>>10;
162        char buf[512];
163        snprintf( buf, sizeof(buf), "%.*f %s", bestDecimal(size), (double)size, sizestrs[i] );
164        return toWxStr( buf );
165    }
166
167    wxString getReadableSize( float f )
168    {
169        return getReadableSize( (uint64_t)f );
170    }
171
172    wxString getReadableSpeed( float f )
173    {
174        wxString xstr = getReadableSize(f);
175        xstr += _T("/s");
176        return xstr;
177    }
178}
179
180void
181MyFrame :: OnTimer(wxTimerEvent& event)
182{
183    myTorrentList->Refresh ();
184
185    float dl, ul;
186    tr_torrentRates( handle, &dl, &ul );
187    wxString s = _("Download: ");
188    s += getReadableSpeed( dl );
189    s += _T("\n");
190    s +=_("Upload: ");
191    s +=  getReadableSpeed( ul );
192    myTaskBarIcon->SetIcon( *myTrayLogo, s );
193}
194
195MyFrame::~MyFrame()
196{
197    delete myConfig;
198}
199
200MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size):
201    wxFrame((wxFrame*)NULL,-1,title,pos,size),
202    myConfig( new wxConfig( _T("xmission") ) ),
203    myPulseTimer( this, ID_Pulse )
204{
205    wxImage transmission_logo ( transmission_xpm );
206    myLogoIcon = new wxIcon;
207    myLogoIcon->CopyFromBitmap( wxBitmap( transmission_logo ) );
208    SetIcon( *myLogoIcon );
209#if wxCHECK_VERSION(2,8,0)
210    transmission_logo.Rescale( 24, 24, wxIMAGE_QUALITY_HIGH );
211#else
212    transmission_logo.Rescale( 24, 24 );
213#endif
214    myTrayLogo = new wxIcon;
215    myTrayLogo->CopyFromBitmap( wxBitmap( transmission_logo ) );
216
217
218    /**
219    ***  Menu
220    **/
221
222    wxMenuBar *menuBar = new wxMenuBar;
223
224    wxMenu * m = new wxMenu;
225    m->Append( wxID_OPEN, _T("&Open") );
226    m->Append( ID_START, _T("&Start") );
227    m->Append( wxID_STOP, _T("Sto&p") ) ;
228    m->Append( wxID_REFRESH, _T("Re&check") );
229    m->Append( wxID_REMOVE, _T("&Remove") );
230    m->AppendSeparator();
231    m->Append( wxID_NEW, _T("Create &New Torrent") );
232    m->AppendSeparator();
233    m->Append( wxID_CLOSE, _T("&Close") );
234    m->Append( wxID_EXIT, _T("&Exit") );
235    menuBar->Append( m, _T("&File") );
236
237    m = new wxMenu;
238    m->Append( ID_TORRENT_INFO, _T("Torrent &Info") );
239    m->Append( wxID_PREFERENCES, _T("Edit &Preferences") );
240    menuBar->Append( m, _T("&Edit") );
241
242    m = new wxMenu;
243    m->Append( ID_SHOW_DEBUG_WINDOW, _T("Show &Debug Window") );
244    m->AppendSeparator();
245    m->Append( wxID_ABOUT, _T("&About Xmission") );
246    menuBar->Append( m, _T("&Help") );
247
248    SetMenuBar(menuBar);
249
250    /**
251    ***  Toolbar
252    **/
253
254    wxImage open_image( fileopen_xpm );
255    wxImage exec_image( exec_xpm );
256    wxImage stop_image( stop_xpm );
257    wxImage drop_image( gtk_remove_xpm );
258    wxImage info_image( gtk_properties_xpm );
259
260    wxToolBar* toolbar = CreateToolBar( wxNO_BORDER | wxTB_HORIZONTAL | wxTB_FLAT | wxTB_TEXT );
261    toolbar->SetToolBitmapSize( wxSize( 16, 16 ) );
262    toolbar->AddTool( wxID_OPEN,   _T("Open"), open_image );
263    toolbar->AddTool( ID_START,    _T("Start"), exec_image );
264    toolbar->AddTool( wxID_STOP,   _T("Stop"), stop_image );
265    toolbar->AddTool( wxID_REMOVE, _T("Remove"), drop_image );
266    toolbar->AddSeparator();
267    toolbar->AddTool( ID_TORRENT_INFO, _("Torrent Info"), info_image );
268    toolbar->Realize();
269
270    /**
271    ***  Row 1
272    **/
273
274    wxSplitterWindow * hsplit = new wxSplitterWindow( this );
275    hsplit->SetSashGravity( 0.8 );
276
277    wxPanel * row1 = new wxPanel( hsplit, wxID_ANY );
278
279    /* Filters */
280
281    wxListCtrl * filters = new wxListCtrl( row1, wxID_ANY, wxDefaultPosition, wxDefaultSize,
282                                           wxLC_REPORT|wxLC_SINGLE_SEL|wxLC_NO_HEADER );
283    filters->InsertColumn( wxLIST_FORMAT_LEFT, _T("YYZ") );
284    int i = 0;
285    filters->InsertItem( i++, _T("All") );
286    filters->InsertItem( i++, _T("Downloading (1)") );
287    filters->InsertItem( i++, _T("Completed") );
288    filters->InsertItem( i++, _T("Active (1)") );
289    filters->InsertItem( i++, _T("Inactive") );
290
291    /* Torrent List */
292
293    myTorrentList = new TorrentListCtrl( handle, myConfig, row1 );
294
295    wxBoxSizer * boxSizer = new wxBoxSizer( wxHORIZONTAL );
296    boxSizer->Add( filters, 0, wxEXPAND|wxRIGHT, 5 );
297    boxSizer->Add( myTorrentList, 1, wxEXPAND, 0 );
298    row1->SetSizer( boxSizer );
299
300
301    wxNotebook * notebook = new wxNotebook( hsplit, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP );
302    wxButton * tmp = new wxButton( notebook, wxID_ANY, _T("Hello World"));
303    notebook->AddPage( tmp, _T("General"), false );
304    tmp = new wxButton( notebook, wxID_ANY, _T("Hello World"));
305    notebook->AddPage( tmp, _T("Peers"), false );
306    tmp = new wxButton( notebook, wxID_ANY, _T("Hello World"));
307    notebook->AddPage( tmp, _T("Pieces"), false );
308    tmp = new wxButton( notebook, wxID_ANY, _T("Hello World"));
309    notebook->AddPage( tmp, _T("Files"), false );
310    tmp = new wxButton( notebook, wxID_ANY, _T("Hello World"));
311    notebook->AddPage( tmp, _T("Logger"), false );
312
313    hsplit->SplitHorizontally( row1, notebook );
314
315    /**
316    ***  Statusbar
317    **/
318
319    CreateStatusBar();
320    SetStatusText(_T("Welcome to Xmission!"));
321
322    /**
323    ***  Refresh
324    **/
325
326    myPulseTimer.Start( 1500 );
327
328    myTaskBarIcon = new wxTaskBarIcon( );
329
330    /**
331    ***  Load the torrents
332    **/
333
334    const int flags = TR_FLAG_PAUSED;
335    const char * destination = "/home/charles/torrents";
336    int count = 0;
337    tr_torrent_t ** torrents = tr_loadTorrents ( handle, destination, flags, &count );
338    myTorrentList->Add( std::vector<tr_torrent_t*>( torrents, torrents+count ) );
339    tr_free( torrents );
340}
341
342void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
343{
344    Close( true );
345}
346
347void MyFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
348{
349    wxImage transmission_logo ( transmission_xpm );
350    wxIcon ico;
351    ico.CopyFromBitmap( wxBitmap( transmission_logo ) );
352
353#if wxCHECK_VERSION(2,8,0)
354    wxAboutDialogInfo info;
355    info.SetName(_T("Xmission"));
356    info.SetVersion(_T(LONG_VERSION_STRING));
357    info.SetCopyright(_T("Copyright 2005-2007 The Transmission Project"));
358    info.SetDescription(_T("A fast, lightweight bittorrent client"));
359    info.SetWebSite( _T( "http://transmission.m0k.org/" ) );
360    info.SetIcon( ico );
361    info.AddDeveloper( _T("Josh Elsasser (Back-end; GTK+)") );
362    info.AddDeveloper( _T("Charles Kerr (Back-end, GTK+, wxWidgets)") );
363    info.AddDeveloper( _T("Mitchell Livingston (Back-end; OS X)")  );
364    info.AddDeveloper( _T("Eric Petit (Back-end; OS X)")  );
365    info.AddDeveloper( _T("Bryan Varner (BeOS)")  );
366    wxAboutBox( info );
367#else
368    wxMessageBox(_T("Xmission " LONG_VERSION_STRING "\n"
369                    "Copyright 2005-2007 The Transmission Project"),
370                 _T("About Xmission"),
371                wxOK|wxICON_INFORMATION, this);
372#endif
373
374}
Note: See TracBrowser for help on using the repository browser.