source: trunk/wx/xmission.cc @ 2468

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

more image work

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