source: src/HaliteDialog.cpp @ 258

Revision 258, 10.3 KB checked in by Eoin, 13 years ago (diff)

Listview flickering sorted.

Line 
1
2#include <algorithm>
3#include <boost/format.hpp>
4#include <boost/array.hpp>
5
6#include "stdAfx.hpp"
7#include "HaliteDialog.hpp"
8#include "HaliteWindow.hpp"
9#include "HaliteListView.hpp"
10#include "halEvent.hpp"
11
12HaliteDialog::HaliteDialog(HaliteWindow& halWindow) :
13                dialogBaseClass(halWindow)
14{       
15//      load();
16}
17
18void HaliteDialog::selectionChanged(const string& torrent_name)
19{       
20#       if 0   
21        pair<float, float> tranLimit(-1.0, -1.0);
22        pair<int, int> connLimit(-1, -1);
23       
24        if (hal::bittorrent().isTorrent(torrent_name))
25        {
26                tranLimit = hal::bittorrent().getTorrentSpeed(torrent_name);
27                connLimit = hal::bittorrent().getTorrentLimit(torrent_name);
28               
29                if (!hal::bittorrent().isTorrentActive(torrent_name))
30                        SetDlgItemText(BTNPAUSE, L"Resume");
31                else           
32                        SetDlgItemText(BTNPAUSE, L"Pause");
33               
34                ::EnableWindow(GetDlgItem(BTNPAUSE), true);
35                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), true);
36                ::EnableWindow(GetDlgItem(BTNREMOVE), true);
37               
38                ::EnableWindow(GetDlgItem(IDC_EDITTLD), true);
39                ::EnableWindow(GetDlgItem(IDC_EDITTLU), true);
40                ::EnableWindow(GetDlgItem(IDC_EDITNCD), true);
41                ::EnableWindow(GetDlgItem(IDC_EDITNCU), true);
42        }
43        else
44        {
45                SetDlgItemText(IDC_NAME, L"N/A");
46                SetDlgItemText(IDC_TRACKER, L"N/A");
47                SetDlgItemText(IDC_STATUS, L"N/A");
48                SetDlgItemText(IDC_AVAIL, L"N/A");
49                SetDlgItemText(IDC_COMPLETE, L"N/A");
50               
51                SetDlgItemText(BTNPAUSE, L"Pause");             
52                m_prog.SetPos(0);
53               
54                ::EnableWindow(GetDlgItem(BTNPAUSE), false);
55                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), false);
56                ::EnableWindow(GetDlgItem(BTNREMOVE), false);
57               
58                ::EnableWindow(GetDlgItem(IDC_EDITTLD), false);
59                ::EnableWindow(GetDlgItem(IDC_EDITTLU), false);
60                ::EnableWindow(GetDlgItem(IDC_EDITNCD), false);
61                ::EnableWindow(GetDlgItem(IDC_EDITNCU), false);
62        }
63       
64        NoConnDown = connLimit.first;
65        NoConnUp = connLimit.second;
66        TranLimitDown = tranLimit.first;
67        TranLimitUp = tranLimit.second;
68       
69        DoDataExchange(false); 
70        m_list.DeleteAllItems();       
71        ui().update();
72#       endif
73}
74
75LRESULT HaliteDialog::onInitDialog(HWND, LPARAM)
76{
77        dialogBaseClass::InitializeHalDialogBase();
78        resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);
79       
80{       m_prog.Attach(GetDlgItem(TORRENTPROG));
81        m_prog.SetRange(0, 100);
82}       
83        m_list.SubclassWindow(GetDlgItem(LISTPEERS));
84       
85        NoConnDown = -1;
86        NoConnUp = -1;
87        TranLimitDown = -1;
88        TranLimitUp = -1;       
89       
90        DoDataExchange(false);
91        return 0;
92}
93
94void HaliteDialog::saveStatus()
95{
96        m_list.saveSettings();
97}
98
99void HaliteDialog::onClose()
100{
101        saveStatus();
102       
103        if(::IsWindow(m_hWnd)) 
104        {
105                ::DestroyWindow(m_hWnd);
106        }
107}
108
109void HaliteDialog::onPause(UINT, int, HWND)
110{
111        string torrentName = hal::to_utf8(hal::bittorrent().torrentDetails().selectedTorrent()->filename());
112       
113        if (!hal::bittorrent().isTorrentActive(torrentName))
114        {
115                SetDlgItemText(BTNPAUSE,L"Pause");
116                hal::bittorrent().resumeTorrent(torrentName);
117        }
118        else
119        {
120                SetDlgItemText(BTNPAUSE,L"Resume");
121                hal::bittorrent().pauseTorrent(torrentName);
122        }
123       
124        requestUiUpdate();     
125}
126
127void HaliteDialog::onReannounce(UINT, int, HWND)
128{
129//      hal::event().post(boost::shared_ptr<hal::EventDetail>(
130//              new hal::EventXmlException(hal::to_wstr("I'm an exception!"), hal::to_wstr("I'm a name!"))));
131
132/*      hal::bittorrent().reannounceTorrent(selection_manager().selected());
133*/
134}
135
136void HaliteDialog::onRemove(UINT, int, HWND)
137{
138        string torrentName = hal::to_utf8(hal::bittorrent().torrentDetails().selectedTorrent()->filename());
139
140        hal::bittorrent().removeTorrent(torrentName);
141        torrentsList().clearFocused();
142}
143
144LRESULT HaliteDialog::OnEditKillFocus(UINT uCode, int nCtrlID, HWND hwndCtrl)
145{
146        DoDataExchange(true);
147       
148/*      hal::bittorrent().setTorrentSpeed(selection_manager().selected(), TranLimitDown, TranLimitUp);
149        hal::bittorrent().setTorrentLimit(selection_manager().selected(), NoConnDown, NoConnUp);
150*/     
151        return 0;
152}
153
154LRESULT HaliteDialog::OnCltColor(HDC hDC, HWND hWnd)
155{       
156        ::SetTextColor(hDC, RGB(255, 0, 255)); 
157       
158        return (LRESULT)::GetCurrentObject(hDC, OBJ_BRUSH);
159}
160
161void HaliteDialog::DialogListView::uiUpdate(const hal::TorrentDetails& tD) 
162{       
163        TryUpdateLock<listClass> lock(*this);
164        if (lock) 
165        {               
166                peerDetails_ = tD.selectedTorrent()->peerDetails();
167               
168                std::sort(peerDetails_.begin(), peerDetails_.end());
169               
170                // Wipe details not present
171                for(int i = 0; i < GetItemCount(); /*nothing here*/)
172                {
173                        boost::array<wchar_t, MAX_PATH> ip_address;
174                        GetItemText(i, 0, ip_address.c_array(), MAX_PATH);
175                       
176                        hal::PeerDetail ip(ip_address.data());
177                        hal::PeerDetails::iterator iter = 
178                                std::lower_bound(peerDetails_.begin(), peerDetails_.end(), ip);
179                       
180                        if (iter == peerDetails_.end() || !((*iter) == ip))
181                        {
182                                DeleteItem(i);
183                        }
184                        else
185                        {
186                                SetItemData(i, std::distance(peerDetails_.begin(), iter));
187                                ++i;
188                        }
189                }
190               
191                // Add additional details
192                for (hal::PeerDetails::iterator i=peerDetails_.begin(), e=peerDetails_.end();
193                        i != e; ++i)
194                {                       
195                        LV_FINDINFO findInfo; 
196                        findInfo.flags = LVFI_STRING;
197                        findInfo.psz = const_cast<LPTSTR>((*i).ipAddress.c_str());
198                       
199                        int itemPos = FindItem(&findInfo, -1);
200                        if (itemPos < 0)
201                                itemPos = AddItem(GetItemCount(), 0, (*i).ipAddress.c_str(), 0);
202                       
203                        SetItemData(itemPos, std::distance(peerDetails_.begin(), i));
204                       
205                        SetItemText(itemPos, 1, (*i).country.c_str());
206                       
207                        SetItemText(itemPos, 2, getColumnAdapter(2)->print(*i).c_str());
208                       
209                        SetItemText(itemPos, 3, getColumnAdapter(3)->print(*i).c_str());
210                       
211                        if ((*i).seed)
212                                SetItemText(itemPos, 4, L"Seed");
213                       
214                        SetItemText(itemPos, 5, (*i).client.c_str());
215                }
216               
217                ConditionallyDoAutoSort();
218        }
219}
220
221void HaliteDialog::uiUpdate(const hal::TorrentDetails& tD) 
222{       
223        if (tD.selectedTorrent())       
224        {
225                SetDlgItemText(IDC_NAME, tD.selectedTorrent()->filename().c_str());
226                SetDlgItemText(IDC_TRACKER, tD.selectedTorrent()->currentTracker().c_str());
227                SetDlgItemText(IDC_STATUS, tD.selectedTorrent()->state().c_str());
228                m_prog.SetPos(static_cast<int>(tD.selectedTorrent()->completion()*100));
229               
230                if (!tD.selectedTorrent()->estimatedTimeLeft().is_special())
231                {
232                        SetDlgItemText(IDC_AVAIL,
233                                (hal::from_utf8(boost::posix_time::to_simple_string(
234                                        tD.selectedTorrent()->estimatedTimeLeft())).c_str()));
235                }
236                else
237                {
238                        SetDlgItemText(IDC_AVAIL,L"∞");         
239                }
240               
241                SetDlgItemText(IDC_COMPLETE,
242                        (wformat(L"%1$.2fmb of %2$.2fmb") 
243                                % (static_cast<float>(tD.selectedTorrent()->totalWantedDone())/(1024*1024))
244                                % (static_cast<float>(tD.selectedTorrent()->totalWanted())/(1024*1024))
245                        ).str().c_str());
246               
247                m_list.uiUpdate(tD);
248        }
249        else
250        {
251               
252/*              SetDlgItemText(IDC_NAME, L"N/A");
253                SetDlgItemText(IDC_TRACKER, L"N/A");
254                SetDlgItemText(IDC_STATUS, L"N/A");
255                SetDlgItemText(IDC_AVAIL, L"N/A");
256                SetDlgItemText(IDC_COMPLETE, L"N/A");
257               
258                SetDlgItemText(BTNPAUSE, L"Pause");
259               
260                ::EnableWindow(GetDlgItem(BTNPAUSE), false);
261                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), false);
262                ::EnableWindow(GetDlgItem(BTNREMOVE), false);
263               
264                ::EnableWindow(GetDlgItem(IDC_EDITTLD), false);
265                ::EnableWindow(GetDlgItem(IDC_EDITTLU), false);
266                ::EnableWindow(GetDlgItem(IDC_EDITNCD), false);
267                ::EnableWindow(GetDlgItem(IDC_EDITNCU), false);
268               
269                m_list.DeleteAllItems();
270*/
271        }
272}
273
274void HaliteDialog::updateDialog()
275{
276#       if 0
277
278        hal::TorrentDetail_ptr pTD = hal::bittorrent().getTorrentDetail_vec(
279                selection_manager().selected());
280       
281        if (pTD)       
282        {
283                SetDlgItemText(IDC_NAME, pTD->filename().c_str());
284                SetDlgItemText(IDC_TRACKER, pTD->currentTracker().c_str());
285                SetDlgItemText(IDC_STATUS, pTD->state().c_str());
286                m_prog.SetPos(static_cast<int>(pTD->completion()*100));
287               
288                if (!pTD->estimatedTimeLeft().is_special())
289                {
290                        SetDlgItemText(IDC_AVAIL,
291                                (hal::from_utf8(boost::posix_time::to_simple_string(pTD->estimatedTimeLeft())).c_str()));
292                }
293                else
294                {
295                        SetDlgItemText(IDC_AVAIL,L"∞");         
296                }
297               
298                SetDlgItemText(IDC_COMPLETE,
299                        (wformat(L"%1$.2fmb of %2$.2fmb") 
300                                % (static_cast<float>(pTD->totalWantedDone())/(1024*1024))
301                                % (static_cast<float>(pTD->totalWanted())/(1024*1024))
302                        ).str().c_str());
303               
304                hal::PeerDetails peerDetails;
305                hal::bittorrent().getAllPeerDetails(selection_manager().selected(), peerDetails);
306               
307                if (!peerDetails.empty())
308                {
309                        // Here we remove any peers no longer connected.
310                       
311                        std::sort(peerDetails.begin(), peerDetails.end());
312                       
313                        for(int i = 0; i < m_list.GetItemCount(); /*nothing here*/)
314                        {
315                                boost::array<wchar_t, MAX_PATH> ip_address;
316                                m_list.GetItemText(i, 0, ip_address.c_array(), MAX_PATH);
317                               
318                                hal::PeerDetail ip(ip_address.data());
319                                hal::PeerDetails::iterator iter = 
320                                        std::lower_bound(peerDetails.begin(), peerDetails.end(), ip);
321                               
322                                if (iter == peerDetails.end() || !((*iter) == ip))
323                                        m_list.DeleteItem(i);
324                                else
325                                        ++i;
326                        }
327                       
328                        // And now here we add/update the connected peers
329                       
330                        for (hal::PeerDetails::iterator i = peerDetails.begin(); 
331                                i != peerDetails.end(); ++i)
332                        {                       
333                                LV_FINDINFO findInfo; 
334                                findInfo.flags = LVFI_STRING;
335                                findInfo.psz = const_cast<LPTSTR>((*i).ipAddress.c_str());
336                               
337                                int itemPos = m_list.FindItem(&findInfo, -1);
338                                if (itemPos < 0)
339                                        itemPos = m_list.AddItem(0, 0, (*i).ipAddress.c_str(), 0);
340                               
341                                m_list.SetItemText(itemPos, 1,
342                                        (wformat(L"%1$.2fKB/s") 
343                                                % ((*i).speed.first/1024)
344                                        ).str().c_str());       
345                               
346                                m_list.SetItemText(itemPos, 2,
347                                        (wformat(L"%1$.2fKB/s") 
348                                                % ((*i).speed.second/1024)
349                                        ).str().c_str());       
350                               
351                                if ((*i).seed)
352                                        m_list.SetItemText(itemPos, 3, L"Seed");
353                               
354                                m_list.SetItemText(itemPos, 4, (*i).client.c_str());
355                        }                       
356                }
357        }
358        else
359        {
360               
361/*              SetDlgItemText(IDC_NAME, L"N/A");
362                SetDlgItemText(IDC_TRACKER, L"N/A");
363                SetDlgItemText(IDC_STATUS, L"N/A");
364                SetDlgItemText(IDC_AVAIL, L"N/A");
365                SetDlgItemText(IDC_COMPLETE, L"N/A");
366               
367                SetDlgItemText(BTNPAUSE, L"Pause");
368               
369                ::EnableWindow(GetDlgItem(BTNPAUSE), false);
370                ::EnableWindow(GetDlgItem(BTNREANNOUNCE), false);
371                ::EnableWindow(GetDlgItem(BTNREMOVE), false);
372               
373                ::EnableWindow(GetDlgItem(IDC_EDITTLD), false);
374                ::EnableWindow(GetDlgItem(IDC_EDITTLU), false);
375                ::EnableWindow(GetDlgItem(IDC_EDITNCD), false);
376                ::EnableWindow(GetDlgItem(IDC_EDITNCU), false);
377               
378                m_list.DeleteAllItems();
379*/
380        }
381#       endif
382}
383
Note: See TracBrowser for help on using the repository browser.