source: trunk/src/HaliteDialog.cpp @ 778

Revision 778, 19.1 KB checked in by Eoin, 10 years ago (diff)

Made get torrent details non-blocking. Need to do same for get session details.

Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2009.
3// Distributed under the Boost Software License, Version 1.0.
4//    (See accompanying file LICENSE_1_0.txt or copy at
5//          http://www.boost.org/LICENSE_1_0.txt)
6
7#include <algorithm>
8#include <boost/format.hpp>
9#include <boost/array.hpp>
10
11#include "stdAfx.hpp"
12#include "HaliteDialog.hpp"
13#include "HaliteWindow.hpp"
14#include "HaliteListView.hpp"
15#include "halEvent.hpp"
16
17HaliteDialog::HaliteDialog(HaliteWindow& halWindow) :
18        dialogBaseClass(halWindow)
19{}
20
21LRESULT HaliteDialog::OnInitDialog(HWND, LPARAM)
22{
23
24        m_prog.Attach(GetDlgItem(TORRENTPROG));
25        m_prog.SetRange(0, 100);
26       
27        m_list.SubclassWindow(GetDlgItem(LISTPEERS));
28       
29        totalConnections_.Attach(GetDlgItem(HAL_EDITNCD));
30        uploadConnections_.Attach(GetDlgItem(HAL_EDITNCU));
31        downloadRate_.Attach(GetDlgItem(HAL_EDITTLD));
32        uploadRate_.Attach(GetDlgItem(HAL_EDITTLU));
33       
34        totalConnections_ = -1;
35        uploadConnections_ = -1;
36        downloadRate_ = -1;
37        uploadRate_ = -1;       
38       
39        DoDataExchange(false);
40
41        return 0;
42}
43
44HaliteDialog::CWindowMapStruct* HaliteDialog::GetWindowMap()
45{
46#define TORRENT_LIMITS_LAYOUT \
47        WMB_HEAD(WMB_COL(_exp|20), WMB_COL(_exp|30), WMB_COL(_exp|20), WMB_COL(_exp|30)), \
48                WMB_ROW(10,     HAL_TL, _r, _r, _r), \
49                WMB_ROW(11,     HAL_TLD, HAL_EDITTLD, HAL_TLU, HAL_EDITTLU), \
50                WMB_ROW(10,     HAL_NC, _r, _r, _r), \
51                WMB_ROW(11,     HAL_NCD, HAL_EDITNCD, HAL_NCU, HAL_EDITNCU), \
52        WMB_END()
53
54#define TORRENT_STATUS_LAYOUT \
55        WMB_HEAD(WMB_COL(45), WMB_COLNOMIN(_exp|100), WMB_COL(_eq|0), WMB_COL(_exp|200)), \
56                WMB_ROW(_gap), \
57                WMB_ROW(_auto,  HAL_NAME_STATIC, HAL_NAME, _r, _r), \
58                WMB_ROW(_auto,  HAL_TRACKER_STATIC, HAL_TRACKER, _r, _r), \
59                WMB_ROW(_auto,  HAL_STATUS_STATIC, HAL_STATUS, _r, _r), \
60                WMB_ROW(_auto,  HAL_TIME_STATIC, HAL_AVAIL, HAL_COMPLETED_STATIC, HAL_COMPLETE), \
61        WMB_END()
62       
63#define TORRENT_BUTTON_LAYOUT \
64        WMB_HEAD(WMB_COL(_exp)), \
65                WMB_ROW(_gap), \
66                WMB_ROWMINNOMAX(_exp, 13, BTNPAUSE), \
67                WMB_ROWMINNOMAX(_exp, 13, BTNREANNOUNCE), \
68                WMB_ROWMINNOMAX(_exp, 13, BTNREMOVE), \
69        WMB_END()       
70
71        BEGIN_WINDOW_MAP_INLINE(HaliteDialog, 6, 0, 3, 3)
72                WMB_HEAD(WMB_COL(_gap), WMB_COL(_exp), WMB_COL(120), WMB_COL(60), WMB_COL(_gap)), 
73                        WMB_ROW(_gap,   HAL_DETAILS_GROUP, _r, _r, _r, _r), 
74                        WMB_ROW(_auto,  _d, TORRENT_STATUS_LAYOUT, TORRENT_LIMITS_LAYOUT, TORRENT_BUTTON_LAYOUT), 
75                        WMB_ROW(_gap, _d),
76                        WMB_ROWMIN(_auto, 8, _d, TORRENTPROG, _r, _r), 
77                        WMB_ROW(_gap, _d), 
78                        WMB_ROWNOMAX(_exp, _d, LISTPEERS, _r, _r), 
79                        WMB_ROW(_gap, _d), 
80                        WMB_ROW(_gap|3), 
81                WMB_END() 
82        END_WINDOW_MAP_INLINE() 
83}
84
85void HaliteDialog::saveStatus()
86{
87        m_list.saveSettings();
88}
89
90void HaliteDialog::OnClose()
91{
92        saveStatus();
93       
94        if(::IsWindow(m_hWnd)) 
95        {
96                ::DestroyWindow(m_hWnd);
97        }
98}
99
100void HaliteDialog::OnPause(UINT, int, HWND)
101{
102        if (hal::torrent_details_ptr torrent = hal::bittorrent::Instance().torrentDetails().focused_torrent()) 
103        {
104                string torrentName = hal::to_utf8(torrent->name());
105               
106                if (!hal::bittorrent::Instance().is_torrent_active(torrentName))
107                {
108                        SetDlgItemText(BTNPAUSE,L"Pause");
109                        hal::bittorrent::Instance().resume_torrent(torrentName);
110                }
111                else
112                {
113                        SetDlgItemText(BTNPAUSE,L"Resume");
114                        hal::bittorrent::Instance().pause_torrent(torrentName);
115                }
116               
117                requestUiUpdate();
118        }
119}
120
121void HaliteDialog::OnReannounce(UINT, int, HWND)
122{
123        if (hal::torrent_details_ptr torrent = hal::bittorrent::Instance().torrentDetails().focused_torrent()) 
124                hal::bittorrent::Instance().reannounce_torrent(torrent->name());
125}
126
127void HaliteDialog::OnRemove(UINT, int, HWND)
128{
129        if (hal::torrent_details_ptr torrent = hal::bittorrent::Instance().torrentDetails().focused_torrent()) 
130        {
131                hal::bittorrent::Instance().remove_torrent(torrent->name());
132                torrentsList().erase_torrent_name(torrent->name());
133        }
134}
135
136LRESULT HaliteDialog::OnHalEditChanged(UINT uMsg, WPARAM wParam, LPARAM lParam)
137{
138        if (hal::bit::torrent t = hal::bittorrent::Instance().get(focused_torrent()))
139        {
140                t.rate_limits = std::pair<float, float>(downloadRate_, uploadRate_);
141                t.connection_limits = std::pair<int, int>(totalConnections_, uploadConnections_);
142        }
143       
144        return 0;
145}
146
147LRESULT HaliteDialog::OnCltColor(HDC hDC, HWND hWnd)
148{       
149        ::SetTextColor(hDC, RGB(255, 0, 255)); 
150       
151        return (LRESULT)::GetCurrentObject(hDC, OBJ_BRUSH);
152}
153
154bool HaliteDialog::DialogListView::sort_list_comparison(std::wstring l, std::wstring r, size_t index, bool ascending)
155{
156        hal::peer_details_vec::optional_type pdl = peer_details_.find_peer(l);
157        hal::peer_details_vec::optional_type pdr = peer_details_.find_peer(r);
158
159        if (pdl && pdr) 
160                return hal::hal_details_ptr_compare(pdl, pdr, index, ascending);
161        else
162                return false;
163}
164
165LRESULT HaliteDialog::DialogListView::OnGetDispInfo(int, LPNMHDR pnmh, BOOL&)
166{       
167        NMLVDISPINFO* pdi = (NMLVDISPINFO*)pnmh;
168
169        HAL_DEV_SORT_MSG(hal::wform(L"OnGetDispInfo index = %1% size = %2%") % pdi->item.iItem % peer_details_.size());
170
171        hal::try_update_lock<listClass> lock(*this);
172        if (lock && pdi->item.iItem >= 0 && peer_details_.size() >= numeric_cast<unsigned>(pdi->item.iItem)) 
173        {       
174
175        hal::peer_details_vec::optional_type pd = peer_details_.find_peer(key_from_index(pdi->item.iItem));
176
177        if (pd && pdi->item.mask & LVIF_TEXT)
178        {
179                wstring str = pd->to_wstring(pdi->item.iSubItem);
180               
181                size_t len = str.copy(pdi->item.pszText, min(pdi->item.cchTextMax - 1, static_cast<int>(str.size())));
182                pdi->item.pszText[len] = '\0';
183        }
184
185        }
186       
187        return 0;
188}
189
190void HaliteDialog::DialogListView::uiUpdate(const hal::torrent_details_manager& tD) 
191{       
192        hal::try_update_lock<listClass> lock(*this);
193        if (lock) 
194        {               
195                selection_from_listview();
196               
197                peer_details_.clear();
198               
199                foreach (const std::wstring filename, tD.selected_names())
200                {
201                        const hal::torrent_details_ptr t = tD.get(filename);
202                        std::copy(t->get_peer_details().begin(), t->get_peer_details().end(), 
203                                std::inserter(peer_details_, peer_details_.begin()));
204                }
205               
206                std::set<std::wstring> ip_set;
207                foreach (hal::peer_detail& pd,  peer_details_)
208                        ip_set.insert(pd.ip_address);
209               
210                erase_based_on_set(ip_set, true);
211
212                if (IsSortOnce() || AutoSort())
213                {
214                        if (GetSecondarySortColumn() != -1)
215                        {
216                                int index = GetColumnSortType(GetSecondarySortColumn());                                       
217                                if (index > WTL::LVCOLSORT_LAST)
218                                        sort(index - (WTL::LVCOLSORT_LAST+1+hal::peer_detail::ip_address_e), IsSecondarySortDescending());
219                        }
220
221                        if (GetSortColumn() != -1)
222                        {               
223                                int index = GetColumnSortType(GetSortColumn());                         
224                                if (index > WTL::LVCOLSORT_LAST)
225                                        sort(index - (WTL::LVCOLSORT_LAST+1+hal::peer_detail::ip_address_e), IsSortDescending());
226                        }
227                }
228               
229                set_keys(ip_set);               
230                InvalidateRect(NULL,true);
231        }
232}
233
234LRESULT HaliteDialog::DialogListView::OnSortChanged(int, LPNMHDR pnmh, BOOL&)
235{
236       
237        return 0;
238}
239
240void HaliteDialog::focusChanged(const hal::torrent_details_ptr pT)
241{
242        std::pair<float, float> tranLimit(-1.0, -1.0);
243        std::pair<int, int> connLimit(-1, -1);
244       
245        if (hal::bit::torrent t = hal::bittorrent::Instance().get(focused_torrent()))
246        {
247                tranLimit = t.rate_limits;
248                connLimit = t.connection_limits;
249               
250                if (!t.is_active)
251                        SetDlgItemText(BTNPAUSE, L"Resume");
252                else           
253                        SetDlgItemText(BTNPAUSE, L"Pause");
254               
255                ::EnableWindow(GetDlgItem(BTNPAUSE), true);
256                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), true);
257                ::EnableWindow(GetDlgItem(BTNREMOVE), true);
258               
259                ::EnableWindow(GetDlgItem(HAL_EDITTLD), true);
260                ::EnableWindow(GetDlgItem(HAL_EDITTLU), true);
261                ::EnableWindow(GetDlgItem(HAL_EDITNCD), true);
262                ::EnableWindow(GetDlgItem(HAL_EDITNCU), true);
263        }
264        else
265        {
266                SetDlgItemText(HAL_NAME, hal::app().res_wstr(HAL_NA).c_str());
267                SetDlgItemText(HAL_TRACKER, hal::app().res_wstr(HAL_NA).c_str());
268                SetDlgItemText(HAL_STATUS, hal::app().res_wstr(HAL_NA).c_str());
269                SetDlgItemText(HAL_AVAIL, hal::app().res_wstr(HAL_NA).c_str());
270                SetDlgItemText(HAL_COMPLETE, hal::app().res_wstr(HAL_NA).c_str());
271               
272                SetDlgItemText(BTNPAUSE, L"Pause");             
273                m_prog.SetPos(0);
274               
275                ::EnableWindow(GetDlgItem(BTNPAUSE), false);
276                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), false);
277                ::EnableWindow(GetDlgItem(BTNREMOVE), false);
278               
279                ::EnableWindow(GetDlgItem(HAL_EDITTLD), false);
280                ::EnableWindow(GetDlgItem(HAL_EDITTLU), false);
281                ::EnableWindow(GetDlgItem(HAL_EDITNCD), false);
282                ::EnableWindow(GetDlgItem(HAL_EDITNCU), false);
283        }
284       
285        totalConnections_ = connLimit.first;
286        uploadConnections_ = connLimit.second;
287        downloadRate_ = tranLimit.first;
288        uploadRate_ = tranLimit.second;
289               
290        DoDataExchange(false);
291}
292
293void HaliteDialog::uiUpdate(const hal::torrent_details_manager& tD)
294{       
295        std::pair<float, float> tranLimit(-1.0, -1.0);
296        std::pair<int, int> connLimit(-1, -1);
297       
298        if (hal::torrent_details_ptr torrent = tD.focused_torrent())   
299        {       
300                string torrent_name = hal::to_utf8(torrent->name());
301               
302                SetDlgItemText(HAL_NAME, torrent->name().c_str());
303                SetDlgItemText(HAL_TRACKER, torrent->current_tracker().c_str());
304                SetDlgItemText(HAL_STATUS, torrent->state().c_str());
305                m_prog.SetPos(static_cast<int>(torrent->completion()*100));
306               
307                if (!torrent->estimated_time_left().is_special())
308                {
309                        SetDlgItemText(HAL_AVAIL,
310                                (hal::from_utf8(boost::posix_time::to_simple_string(
311                                        torrent->estimated_time_left())).c_str()));
312                }
313                else
314                {
315                        SetDlgItemText(HAL_AVAIL, hal::app().res_wstr(HAL_INF).c_str());               
316                }
317               
318                SetDlgItemText(HAL_COMPLETE,
319                        (hal::wform(L"%1$.2fmb of %2$.2fmb") 
320                                % (static_cast<float>(torrent->total_wanted_done())/(1024*1024))
321                                % (static_cast<float>(torrent->total_wanted())/(1024*1024))
322                        ).str().c_str());
323               
324                m_list.uiUpdate(tD);
325        }
326}
Note: See TracBrowser for help on using the repository browser.