source: src/HaliteDialog.cpp @ 335

Revision 335, 16.9 KB checked in by Eoin, 12 years ago (diff)

Minor UI Tweak.

Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2007.
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        m_prog.Attach(GetDlgItem(TORRENTPROG));
24        m_prog.SetRange(0, 100);
25       
26        m_list.SubclassWindow(GetDlgItem(LISTPEERS));
27       
28        NoConnDown = -1;
29        NoConnUp = -1;
30        TranLimitDown = -1;
31        TranLimitUp = -1;       
32       
33        DoDataExchange(false);
34        return 0;
35}
36
37HaliteDialog::CWindowMapStruct* HaliteDialog::GetWindowMap()
38{
39#define TORRENT_LIMITS_LAYOUT \
40        WMB_HEAD(WMB_COL(_exp|20), WMB_COL(_exp|30), WMB_COL(_exp|20), WMB_COL(_exp|30)), \
41                WMB_ROW(10,     IDC_TL, _r, _r, _r), \
42                WMB_ROW(11,     IDC_TLD, IDC_EDITTLD, IDC_TLU, IDC_EDITTLU), \
43                WMB_ROW(10,     IDC_NC, _r, _r, _r), \
44                WMB_ROW(11,     IDC_NCD, IDC_EDITNCD, IDC_NCU, IDC_EDITNCU), \
45        WMB_END()
46
47#define TORRENT_STATUS_LAYOUT \
48        WMB_HEAD(WMB_COL(45), WMB_COLNOMIN(_exp|100), WMB_COL(_eq|0), WMB_COL(_exp|200)), \
49                WMB_ROW(_auto,  IDC_NAME_STATIC, IDC_NAME, _r, _r), \
50                WMB_ROW(_auto,  IDC_TRACKER_STATIC, IDC_TRACKER, _r, _r), \
51                WMB_ROW(_auto,  IDC_STATUS_STATIC, IDC_STATUS, _r, _r), \
52                WMB_ROW(_auto,  IDC_TIME_STATIC, IDC_AVAIL, IDC_COMPLETED_STATIC, IDC_COMPLETE), \
53        WMB_END()
54       
55#define TORRENT_BUTTON_LAYOUT \
56        WMB_HEAD(WMB_COL(_exp)), \
57                WMB_ROW(_gap), \
58                WMB_ROWMINNOMAX(_exp, 13, BTNPAUSE), \
59                WMB_ROWMINNOMAX(_exp, 13, BTNREANNOUNCE), \
60                WMB_ROWMINNOMAX(_exp, 13, BTNREMOVE), \
61        WMB_END()       
62
63        BEGIN_WINDOW_MAP_INLINE(HaliteDialog, 6, 0, 3, 3)
64                WMB_HEAD(WMB_COL(_gap), WMB_COL(_exp), WMB_COL(120), WMB_COL(60), WMB_COL(_gap)), 
65                        WMB_ROW(_gap,   IDC_DETAILS_GROUP, _r, _r, _r, _r), 
66                        WMB_ROW(_auto,  _d, TORRENT_STATUS_LAYOUT, TORRENT_LIMITS_LAYOUT, TORRENT_BUTTON_LAYOUT), 
67                        WMB_ROWMIN(_auto, 8, _d, TORRENTPROG, _r, _r), 
68                        WMB_ROW(_gap, _d), 
69                        WMB_ROWNOMAX(_exp, _d, LISTPEERS, _r, _r), 
70                        WMB_ROW(_gap, _d), 
71                        WMB_ROW(_gap|3), 
72                WMB_END() 
73        END_WINDOW_MAP_INLINE() 
74}
75
76void HaliteDialog::saveStatus()
77{
78        m_list.saveSettings();
79}
80
81void HaliteDialog::OnClose()
82{
83        saveStatus();
84       
85        if(::IsWindow(m_hWnd)) 
86        {
87                ::DestroyWindow(m_hWnd);
88        }
89}
90
91void HaliteDialog::OnPause(UINT, int, HWND)
92{
93        if (hal::TorrentDetail_ptr torrent = hal::bittorrent().torrentDetails().focusedTorrent()) 
94        {
95                string torrentName = hal::to_utf8(torrent->name());
96               
97                if (!hal::bittorrent().isTorrentActive(torrentName))
98                {
99                        SetDlgItemText(BTNPAUSE,L"Pause");
100                        hal::bittorrent().resumeTorrent(torrentName);
101                }
102                else
103                {
104                        SetDlgItemText(BTNPAUSE,L"Resume");
105                        hal::bittorrent().pauseTorrent(torrentName);
106                }
107               
108                requestUiUpdate();
109        }
110}
111
112void HaliteDialog::OnReannounce(UINT, int, HWND)
113{
114        if (hal::TorrentDetail_ptr torrent = hal::bittorrent().torrentDetails().focusedTorrent()) 
115                hal::bittorrent().reannounceTorrent(hal::to_utf8(torrent->name()));
116}
117
118void HaliteDialog::OnRemove(UINT, int, HWND)
119{
120        if (hal::TorrentDetail_ptr torrent = hal::bittorrent().torrentDetails().focusedTorrent()) 
121        {
122                string torrentName = hal::to_utf8(torrent->name());
123
124                hal::bittorrent().removeTorrent(torrentName);
125                torrentsList().clearFocused();
126        }
127}
128
129LRESULT HaliteDialog::OnEditKillFocus(UINT uCode, int nCtrlID, HWND hwndCtrl)
130{
131        DoDataExchange(true);
132       
133        if (hal::TorrentDetail_ptr torrent = hal::bittorrent().torrentDetails().focusedTorrent()) 
134        {
135                string torrentName = hal::to_utf8(torrent->name());
136               
137                hal::bittorrent().setTorrentSpeed(torrentName, TranLimitDown, TranLimitUp);
138                hal::bittorrent().setTorrentLimit(torrentName, NoConnDown, NoConnUp);
139        }
140       
141        return 0;
142}
143
144LRESULT HaliteDialog::OnCltColor(HDC hDC, HWND hWnd)
145{       
146        ::SetTextColor(hDC, RGB(255, 0, 255)); 
147       
148        return (LRESULT)::GetCurrentObject(hDC, OBJ_BRUSH);
149}
150
151void HaliteDialog::DialogListView::uiUpdate(const hal::TorrentDetails& tD) 
152{       
153        TryUpdateLock<listClass> lock(*this);
154        if (lock) 
155        {               
156                peerDetails_ = tD.focusedTorrent()->peerDetails();
157               
158                std::sort(peerDetails_.begin(), peerDetails_.end());
159               
160                // Wipe details not present
161                for(int i = 0; i < GetItemCount(); /*nothing here*/)
162                {
163                        boost::array<wchar_t, MAX_PATH> ip_address;
164                        GetItemText(i, 0, ip_address.c_array(), MAX_PATH);
165                       
166                        hal::PeerDetail ip(ip_address.data());
167                        hal::PeerDetails::iterator iter = 
168                                std::lower_bound(peerDetails_.begin(), peerDetails_.end(), ip);
169                       
170                        if (iter == peerDetails_.end() || !((*iter) == ip))
171                        {
172                                DeleteItem(i);
173                        }
174                        else
175                        {
176                                SetItemData(i, std::distance(peerDetails_.begin(), iter));
177                                ++i;
178                        }
179                }
180               
181                // Add additional details
182                for (hal::PeerDetails::iterator i=peerDetails_.begin(), e=peerDetails_.end();
183                        i != e; ++i)
184                {                       
185                        LV_FINDINFO findInfo; 
186                        findInfo.flags = LVFI_STRING;
187                        findInfo.psz = const_cast<LPTSTR>((*i).ipAddress.c_str());
188                       
189                        int itemPos = FindItem(&findInfo, -1);
190                        if (itemPos < 0)
191                                itemPos = AddItem(GetItemCount(), 0, (*i).ipAddress.c_str(), 0);
192                       
193                        SetItemData(itemPos, std::distance(peerDetails_.begin(), i));
194                       
195                        SetItemText(itemPos, 1, (*i).country.c_str());
196                       
197                        SetItemText(itemPos, 2, getColumnAdapter(2)->print(*i).c_str());
198                       
199                        SetItemText(itemPos, 3, getColumnAdapter(3)->print(*i).c_str());
200                       
201                        if ((*i).seed)
202                                SetItemText(itemPos, 4, L"Seed");
203                       
204                        SetItemText(itemPos, 5, (*i).client.c_str());
205                }
206               
207                ConditionallyDoAutoSort();
208        }
209}
210
211void HaliteDialog::focusChanged(const hal::TorrentDetail_ptr pT)
212{
213        pair<float, float> tranLimit(-1.0, -1.0);
214        pair<int, int> connLimit(-1, -1);
215       
216        if (pT)
217        {
218                tranLimit = hal::bittorrent().getTorrentSpeed(pT->name());
219                connLimit = hal::bittorrent().getTorrentLimit(pT->name());
220               
221                if (!hal::bittorrent().isTorrentActive(pT->name()))
222                        SetDlgItemText(BTNPAUSE, L"Resume");
223                else           
224                        SetDlgItemText(BTNPAUSE, L"Pause");
225               
226                ::EnableWindow(GetDlgItem(BTNPAUSE), true);
227                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), true);
228                ::EnableWindow(GetDlgItem(BTNREMOVE), true);
229               
230                ::EnableWindow(GetDlgItem(IDC_EDITTLD), true);
231                ::EnableWindow(GetDlgItem(IDC_EDITTLU), true);
232                ::EnableWindow(GetDlgItem(IDC_EDITNCD), true);
233                ::EnableWindow(GetDlgItem(IDC_EDITNCU), true);
234        }
235        else
236        {
237                SetDlgItemText(IDC_NAME, hal::app().res_wstr(HAL_NA).c_str());
238                SetDlgItemText(IDC_TRACKER, hal::app().res_wstr(HAL_NA).c_str());
239                SetDlgItemText(IDC_STATUS, hal::app().res_wstr(HAL_NA).c_str());
240                SetDlgItemText(IDC_AVAIL, hal::app().res_wstr(HAL_NA).c_str());
241                SetDlgItemText(IDC_COMPLETE, hal::app().res_wstr(HAL_NA).c_str());
242               
243                SetDlgItemText(BTNPAUSE, L"Pause");             
244                m_prog.SetPos(0);
245               
246                ::EnableWindow(GetDlgItem(BTNPAUSE), false);
247                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), false);
248                ::EnableWindow(GetDlgItem(BTNREMOVE), false);
249               
250                ::EnableWindow(GetDlgItem(IDC_EDITTLD), false);
251                ::EnableWindow(GetDlgItem(IDC_EDITTLU), false);
252                ::EnableWindow(GetDlgItem(IDC_EDITNCD), false);
253                ::EnableWindow(GetDlgItem(IDC_EDITNCU), false);
254        }
255       
256        NoConnDown = connLimit.first;
257        NoConnUp = connLimit.second;
258        TranLimitDown = tranLimit.first;
259        TranLimitUp = tranLimit.second;
260       
261        m_list.clearAll();
262       
263        DoDataExchange(false); 
264}
265
266void HaliteDialog::uiUpdate(const hal::TorrentDetails& tD) 
267{       
268        pair<float, float> tranLimit(-1.0, -1.0);
269        pair<int, int> connLimit(-1, -1);
270       
271        if (hal::TorrentDetail_ptr torrent = tD.focusedTorrent())       
272        {       
273                string torrent_name = hal::to_utf8(torrent->name());
274               
275                SetDlgItemText(IDC_NAME, torrent->name().c_str());
276                SetDlgItemText(IDC_TRACKER, torrent->currentTracker().c_str());
277                SetDlgItemText(IDC_STATUS, torrent->state().c_str());
278                m_prog.SetPos(static_cast<int>(torrent->completion()*100));
279               
280                if (!torrent->estimatedTimeLeft().is_special())
281                {
282                        SetDlgItemText(IDC_AVAIL,
283                                (hal::from_utf8(boost::posix_time::to_simple_string(
284                                        torrent->estimatedTimeLeft())).c_str()));
285                }
286                else
287                {
288                        SetDlgItemText(IDC_AVAIL, hal::app().res_wstr(HAL_INF).c_str());               
289                }
290               
291                SetDlgItemText(IDC_COMPLETE,
292                        (wformat(L"%1$.2fmb of %2$.2fmb") 
293                                % (static_cast<float>(torrent->totalWantedDone())/(1024*1024))
294                                % (static_cast<float>(torrent->totalWanted())/(1024*1024))
295                        ).str().c_str());
296               
297                m_list.uiUpdate(tD);
298        }
299}
Note: See TracBrowser for help on using the repository browser.