Changeset 256


Ignore:
Timestamp:
08/16/07 18:38:59 (13 years ago)
Author:
Eoin
Message:

Advances Peers, Trackers and Logging Tab completely reworking.

Files:
13 edited

Legend:

Unmodified
Added
Removed
  • res/Halite.rc

    r253 r256  
    491491        HAL_DIALOGPEER_LISTVIEW_COS       "Peer;Country;Download;Upload;Type;Client" 
    492492        HAL_DIALOGPEER_LISTVIEW_COS_DEFAULTS      "100;70;70;70;100" 
    493         HAL_DIALOGPEER_LISTVIEW_ADV       "Peer;Download;Upload;Type;Client;Status" 
     493        HAL_DIALOGPEER_LISTVIEW_ADV       "Peer;Country;Download;Upload;Type;Client;Status" 
    494494        HAL_DIALOGPEER_LISTVIEW_ADV_DEFAULTS      "95;64;64;50;100;500" 
    495495END 
  • src/HaliteDialog.cpp

    r255 r256  
    215215                } 
    216216                 
    217                 int iCol = GetSortColumn(); 
    218                 if (autoSort() && iCol >= 0 && iCol < m_arrColSortType.GetSize()) 
    219                         DoSortItems(iCol, IsSortDescending()); 
     217                ConditionallyDoAutoSort(); 
    220218        } 
    221219} 
  • src/HaliteSortListViewCtrl.hpp

    r255 r256  
    210210                param_type selected() const { return selected_; } 
    211211                 
    212                 int selectedIndex() 
     212                int selectedIndex() const 
    213213                { 
    214214                        LV_FINDINFO findInfo = { sizeof(LV_FINDINFO) };          
     
    338338public: 
    339339        typedef selection_manager SelectionManager; 
    340         typedef SelectionManager selection_manager_class; 
     340        typedef SelectionManager selection_manage_class; 
    341341         
    342342        thisClass(bool resMenu=true, bool resNames=true, bool resWidthsAndOrder=true) : 
     
    581581        void clearFocused() { manager_.clear(); } 
    582582        void clearSelected() { manager_.clear_all_selected(); } 
    583         void clearAll() { manager_.clear(); } 
     583        void clearAll() { manager_.clear_all(); } 
    584584         
    585585        int CompareItemsCustom(LVCompareParam* pItem1, LVCompareParam* pItem2, int iSortCol) 
     
    630630                }                
    631631                return NULL; 
     632        } 
     633         
     634        void ConditionallyDoAutoSort() 
     635        { 
     636                int iCol = GetSortColumn(); 
     637                if (autoSort() && iCol >= 0 && iCol < m_arrColSortType.GetSize()) 
     638                        DoSortItems(iCol, IsSortDescending());   
    632639        } 
    633640         
  • src/advtabs/Debug.cpp

    r240 r256  
    55 
    66#include "Debug.hpp" 
    7  
    8 void AdvDebugDialog::selectionChanged(const string& torrent_name) 
    9 {        
    10 #       if 0 
    11         if (hal::bittorrent().isTorrent(torrent_name)) 
    12         {                
    13                 ::EnableWindow(GetDlgItem(IDC_TRACKER_LOGINCHECK), true); 
    14                 ::EnableWindow(GetDlgItem(IDC_TRACKERLIST), true); 
    15         } 
    16         else 
    17         {                
    18                 ::EnableWindow(GetDlgItem(IDC_TRACKER_LOGINCHECK), false); 
    19                 ::EnableWindow(GetDlgItem(IDC_TRACKERLIST), false); 
    20         } 
    21          
    22         onLoginCheck(0, 0, GetDlgItem(IDC_TRACKER_LOGINCHECK)); 
    23  
    24 #       endif    
    25         DoDataExchange(false);   
    26 //      ui().update(); 
    27 } 
    287 
    298void AdvDebugDialog::onLoginCheck(UINT, int, HWND hWnd) 
     
    4524LRESULT AdvDebugDialog::onInitDialog(HWND, LPARAM) 
    4625{ 
    47         dialogBaseClass::InitializeHalDialogBase();      
     26        logList.Attach(GetDlgItem(IDC_DEBUGLISTVIEW)); 
     27 
    4828        resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);       
    49         logList.Attach(GetDlgItem(IDC_DEBUGLISTVIEW)); 
     29        DoDataExchange(false); 
    5030         
    51         DoDataExchange(false); 
    5231        return 0; 
    5332} 
     
    6948} 
    7049 
    71 LRESULT AdvDebugDialog::OnEditKillFocus(UINT uCode, int nCtrlID, HWND hwndCtrl) 
    72 { 
    73 /*      string torrent_name = selection_manager().selected(); 
    74          
    75         if (hal::bittorrent().isTorrent(torrent_name)) 
    76         {                        
    77                 const int buffer_size = 512; 
    78                 array<wchar_t, buffer_size> username; 
    79                 array<wchar_t, buffer_size> password; 
    80                  
    81                 GetDlgItemText(IDC_TRACKER_USER, username.elems, buffer_size); 
    82                 GetDlgItemText(IDC_TRACKER_PASS, password.elems, buffer_size); 
    83                  
    84                 hal::bittorrent().setTorrentLogin(torrent_name, wstring(username.elems), 
    85                         wstring(password.elems)); 
    86         } 
    87 */               
    88         DoDataExchange(true); 
    89  
    90         return 0; 
    91 } 
    92  
    9350void AdvDebugDialog::onDebugOption(UINT, int, HWND) 
    9451{ 
    9552        DoDataExchange(true); 
    9653} 
    97  
    98 void AdvDebugDialog::updateDialog() 
    99 {} 
  • src/advtabs/Debug.hpp

    r249 r256  
    5757 
    5858class LogListViewCtrl : 
    59         public CHaliteListViewCtrl<LogListViewCtrl>, 
     59        public CHaliteSortListViewCtrl<LogListViewCtrl>, 
    6060        public CHaliteIni<LogListViewCtrl>, 
    6161        private boost::noncopyable 
     
    6363protected: 
    6464        typedef CHaliteIni<LogListViewCtrl> iniClass; 
    65         typedef CHaliteListViewCtrl<LogListViewCtrl> listClass; 
     65        typedef CHaliteSortListViewCtrl<LogListViewCtrl> listClass; 
    6666 
    6767        friend class listClass; 
     
    7070        enum {  
    7171                LISTVIEW_ID_MENU = 0, 
    72                 LISTVIEW_ID_COLUMNNAMES = HAL_DEBUG_LISTVIEW_COLUMNS, 
    73                 LISTVIEW_ID_COLUMNWIDTHS = HAL_DEBUG_LISTVIEW_DEFAULTS 
     72                LISTVIEW_ID_COLUMNNAMES = 0, 
     73                LISTVIEW_ID_COLUMNWIDTHS = 0 
    7474        }; 
    7575 
     
    7777                MSG_WM_DESTROY(OnDestroy) 
    7878 
    79                 CHAIN_MSG_MAP(CHaliteListViewCtrl<LogListViewCtrl>) 
     79                CHAIN_MSG_MAP(listClass) 
    8080                DEFAULT_REFLECTION_HANDLER() 
    8181        END_MSG_MAP() 
    8282 
    8383        LogListViewCtrl() : 
     84                listClass(false, false, false), 
    8485                iniClass("listviews/eventLog", "LogListView") 
    8586        { 
     87                std::vector<wstring> names;      
     88                wstring column_names = hal::app().res_wstr(HAL_DEBUG_LISTVIEW_COLUMNS); 
     89 
     90                // "Time;Message;Severity" 
     91                boost::split(names, column_names, boost::is_any_of(L";")); 
     92                 
     93                array<int, 3> widths = {67,419,69}; 
     94                array<int, 3> order = {0,1,2}; 
     95                array<bool, 3> visible = {true,true,true}; 
     96                 
     97                SetDefaults(names, widths, order, visible, true); 
     98                 
    8699                load(); 
    87100        } 
     
    102115    void serialize(Archive& ar, const unsigned int version) 
    103116    { 
    104                 ar & boost::serialization::make_nvp("listview", boost::serialization::base_object<listClass>(*this)); 
     117                ar & boost::serialization::make_nvp("listview",  
     118                        boost::serialization::base_object<listClass>(*this)); 
    105119    } 
    106120 
     
    120134private: 
    121135        void OnAttach() 
    122         { 
    123                 SetListViewDetails(); 
     136        {                
     137                SetExtendedListViewStyle(WS_EX_CLIENTEDGE|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP); 
     138                SetSortListViewExtendedStyle(SORTLV_USESHELLBITMAPS, SORTLV_USESHELLBITMAPS); 
     139                 
     140                ApplyDetails(); 
     141                 
    124142                conn_ = hal::event().attach(bind(&LogListViewCtrl::operator(), this, _1)); 
    125143        } 
     
    189207        void onDebugCheck(UINT, int, HWND hWnd) { DoDataExchange(true); } 
    190208 
    191         LRESULT OnEditKillFocus(UINT uCode, int nCtrlID, HWND hwndCtrl); 
    192209        void onDebugOption(UINT, int, HWND); 
    193  
    194         void selectionChanged(const string& torrent_name); 
    195         void updateDialog(); 
    196210 
    197211protected: 
  • src/advtabs/Peers.cpp

    r229 r256  
    88#include "Peers.hpp" 
    99 
    10 void AdvPeerDialog::selectionChanged(const string& torrent_name) 
    11 {        
    12         AdvPeerDialog::updateDialog(); 
    13 } 
     10#if 0 
    1411 
    1512void AdvPeerDialog::updateDialog() 
    1613{ 
    17 #       if 0 
    1814        hal::PeerDetails peerDetails; 
    1915        hal::bittorrent().getAllPeerDetails(selection_manager().selected(), peerDetails); 
     
    7571                m_list.DeleteAllItems(); 
    7672        } 
    77 #       endif 
     73} 
     74 
     75#endif 
     76 
     77void PeerListView::uiUpdate(const hal::TorrentDetails& tD) 
     78{ 
     79        TryUpdateLock<listClass> lock(*this); 
     80        if (lock)  
     81        {                
     82                peerDetails_.clear(); 
     83                 
     84                foreach (const hal::TorrentDetail_ptr torrent, tD.selectedTorrents()) 
     85                { 
     86                        std::copy(torrent->peerDetails().begin(), torrent->peerDetails().end(),  
     87                                std::back_inserter(peerDetails_)); 
     88                } 
     89                 
     90                std::sort(peerDetails_.begin(), peerDetails_.end()); 
     91                 
     92                // Wipe details not present 
     93                for(int i = 0; i < GetItemCount(); /*nothing here*/) 
     94                { 
     95                        boost::array<wchar_t, MAX_PATH> ip_address; 
     96                        GetItemText(i, 0, ip_address.c_array(), MAX_PATH); 
     97                         
     98                        hal::PeerDetail ip(ip_address.data()); 
     99                        hal::PeerDetails::iterator iter =  
     100                                std::lower_bound(peerDetails_.begin(), peerDetails_.end(), ip); 
     101                         
     102                        if (iter == peerDetails_.end() || !((*iter) == ip)) 
     103                        { 
     104                                DeleteItem(i); 
     105                        } 
     106                        else 
     107                        { 
     108                                SetItemData(i, std::distance(peerDetails_.begin(), iter)); 
     109                                ++i; 
     110                        } 
     111                } 
     112                 
     113                // Add additional details 
     114                for (hal::PeerDetails::iterator i=peerDetails_.begin(), e=peerDetails_.end(); 
     115                        i != e; ++i) 
     116                {                        
     117                        LV_FINDINFO findInfo;  
     118                        findInfo.flags = LVFI_STRING; 
     119                        findInfo.psz = const_cast<LPTSTR>((*i).ipAddress.c_str()); 
     120                         
     121                        int itemPos = FindItem(&findInfo, -1); 
     122                        if (itemPos < 0) 
     123                                itemPos = AddItem(GetItemCount(), 0, (*i).ipAddress.c_str(), 0); 
     124                         
     125                        SetItemData(itemPos, std::distance(peerDetails_.begin(), i)); 
     126                         
     127                        SetItemText(itemPos, 1, (*i).country.c_str()); 
     128                         
     129                        SetItemText(itemPos, 2, getColumnAdapter(2)->print(*i).c_str()); 
     130                         
     131                        SetItemText(itemPos, 3, getColumnAdapter(3)->print(*i).c_str()); 
     132                         
     133                        if ((*i).seed) 
     134                                SetItemText(itemPos, 4, L"Seed"); 
     135                         
     136                        SetItemText(itemPos, 5, (*i).client.c_str()); 
     137                         
     138                        SetItemText(itemPos, 6, (*i).status.c_str()); 
     139                } 
     140                 
     141                ConditionallyDoAutoSort(); 
     142        } 
     143} 
     144 
     145void AdvPeerDialog::uiUpdate(const hal::TorrentDetails& tD) 
     146{ 
     147        peerList_.uiUpdate(tD); 
    78148} 
    79149 
    80150LRESULT AdvPeerDialog::onInitDialog(HWND, LPARAM) 
    81 { 
    82         dialogBaseClass::InitializeHalDialogBase();      
     151{        
     152        peerList_.Attach(GetDlgItem(IDC_PEERLIST)); 
     153         
    83154        resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN);       
    84         m_list.Attach(GetDlgItem(IDC_PEERLIST)); 
    85155         
    86156        return 0; 
  • src/advtabs/Peers.hpp

    r251 r256  
    1212#include "../HaliteListManager.hpp" 
    1313 
    14 class PeerListViewCtrl : 
    15         public CHaliteSortListViewCtrl<PeerListViewCtrl>, 
    16         public CHaliteIni<PeerListViewCtrl>, 
     14class PeerListView : 
     15        public CHaliteSortListViewCtrl<PeerListView, const hal::PeerDetail>, 
     16        public CHaliteIni<PeerListView>, 
    1717        private boost::noncopyable 
    1818{ 
    19         typedef PeerListViewCtrl thisClass; 
     19protected: 
     20        typedef PeerListView thisClass; 
    2021        typedef CHaliteIni<thisClass> iniClass; 
    21         typedef CHaliteSortListViewCtrl<thisClass> listClass; 
     22        typedef CHaliteSortListViewCtrl<thisClass, const hal::PeerDetail> listClass; 
     23        typedef const hal::PeerDetail pD; 
    2224 
    2325        friend class listClass; 
    2426         
    25 public: 
     27        struct ColumnAdapters 
     28        { 
     29         
     30        typedef listClass::ColumnAdapter ColAdapter_t; 
     31         
     32        struct SpeedDown : public ColAdapter_t 
     33        { 
     34                virtual bool less(pD& l, pD& r) { return l.speed.first < r.speed.first; }                
     35                virtual std::wstring print(pD& p)  
     36                { 
     37                        return (wformat(L"%1$.2fkb/s") % (p.speed.first/1024)).str();  
     38                }                
     39        }; 
     40         
     41        struct SpeedUp : public ColAdapter_t 
     42        { 
     43                virtual bool less(pD& l, pD& r) { return l.speed.second < r.speed.second; }              
     44                virtual std::wstring print(pD& p)  
     45                { 
     46                        return (wformat(L"%1$.2fkb/s") % (p.speed.second/1024)).str();  
     47                }                
     48        }; 
     49         
     50        }; 
     51 
     52public:  
    2653        enum {  
    2754                LISTVIEW_ID_MENU = IDR_LISTVIEW_MENU, 
     
    3057        }; 
    3158         
    32         thisClass() : 
    33                 iniClass("listviews/advPeers", "PeerListView") 
    34         { 
    35                 load(); 
    36         } 
    3759 
    3860        BEGIN_MSG_MAP_EX(thisClass) 
     
    4062 
    4163                CHAIN_MSG_MAP(listClass) 
    42  
    4364                DEFAULT_REFLECTION_HANDLER() 
    4465        END_MSG_MAP() 
    45          
    46         void updateListView() 
    47         {} 
     66 
     67        thisClass() : 
     68                iniClass("listviews/advPeers", "PeerListView"), 
     69                listClass(true,false,false) 
     70        {                                        
     71                std::vector<wstring> names;      
     72                wstring column_names = hal::app().res_wstr(LISTVIEW_ID_COLUMNNAMES); 
     73 
     74                // "Peer;Country;Download;Upload;Type;Client,Status" 
     75                boost::split(names, column_names, boost::is_any_of(L";")); 
     76                 
     77                array<int, 7> widths = {100,20,70,70,70,100,200}; 
     78                array<int, 7> order = {0,1,2,3,4,5,6}; 
     79                array<bool, 7> visible = {true,true,true,true,true,true,true}; 
     80                 
     81                SetDefaults(names, widths, order, visible, true); 
     82                Load(); 
     83        } 
    4884         
    4985        void saveSettings() 
     
    5288                save(); 
    5389        } 
    54  
    55     friend class boost::serialization::access; 
    56     template<class Archive> 
    57     void serialize(Archive& ar, const unsigned int version) 
    58     { 
    59                 ar & boost::serialization::make_nvp("listview", boost::serialization::base_object<listClass>(*this)); 
    60     } 
    61  
    62 private: 
     90         
    6391        void OnAttach() 
    6492        { 
    65                 SetListViewDetails(); 
     93                SetExtendedListViewStyle(WS_EX_CLIENTEDGE|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP); 
     94                SetSortListViewExtendedStyle(SORTLV_USESHELLBITMAPS, SORTLV_USESHELLBITMAPS); 
     95                 
     96                ApplyDetails(); 
     97                 
     98                SetColumnSortType(2, LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedDown()); 
     99                SetColumnSortType(3, LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedUp()); 
    66100        } 
    67101         
     
    70104                saveSettings(); 
    71105        } 
     106         
     107        friend class boost::serialization::access; 
     108        template<class Archive> 
     109        void serialize(Archive& ar, const unsigned int version) 
     110        { 
     111                ar & boost::serialization::make_nvp("listview",  
     112                        boost::serialization::base_object<listClass>(*this)); 
     113        } 
     114         
     115        pD CustomItemConversion(LVCompareParam* param, int iSortCol) 
     116        {                        
     117                return peerDetails_[param->dwItemData]; 
     118        }                
     119         
     120        int CustomItemComparision(pD left, pD right, int iSortCol) 
     121        { 
     122                ColumnAdapter* pCA = getColumnAdapter(iSortCol); 
     123                 
     124                if (pCA) 
     125                        return (pCA->less(left, right)) ? 1 : -1; 
     126                else  
     127                        return 0; 
     128        } 
     129         
     130        void uiUpdate(const hal::TorrentDetails& tD); 
     131         
     132private: 
     133        hal::PeerDetails peerDetails_; 
    72134}; 
    73135 
     
    115177 
    116178        LRESULT OnEditKillFocus(UINT uCode, int nCtrlID, HWND hwndCtrl); 
    117  
    118         void selectionChanged(const string& torrent_name); 
    119         void updateDialog(); 
     179         
     180        void uiUpdate(const hal::TorrentDetails& tD); 
    120181 
    121182protected: 
    122         PeerListViewCtrl m_list; 
     183        PeerListView peerList_; 
    123184}; 
  • src/advtabs/Torrent.hpp

    r241 r256  
    9595 
    9696        void selectionChanged(const string& torrent_name); 
    97         void updateDialog();     
     97        void updateDialog(); 
    9898        void uiUpdate(const hal::TorrentDetails& tD); 
    9999        void uiUpdateMultiple(const hal::TorrentDetail_vec& torrents); 
  • src/advtabs/Tracker.cpp

    r240 r256  
    33#include "../HaliteWindow.hpp" 
    44#include "../HaliteListView.hpp" 
    5  
    65#include "../global/logger.hpp" 
    76 
    87#include "Tracker.hpp" 
    98 
    10 void AdvTrackerDialog::selectionChanged(const string& torrent_name) 
     9void AdvTrackerDialog::uiUpdate(const hal::TorrentDetails& tD) 
    1110{        
    12  
    13 #       if 0 
     11        if (!tD.selectedTorrent()) 
     12                return; 
     13 
     14        string torrent_name = hal::to_utf8(tD.selectedTorrent()->filename()); 
     15        if (current_torrent_name_ == torrent_name) 
     16                return; 
     17                 
     18        current_torrent_name_ = torrent_name; 
     19         
    1420        if (hal::bittorrent().isTorrent(torrent_name)) 
    1521        {                
     
    1824                 
    1925                pair<wstring, wstring> details =  
    20                         hal::bittorrent().getTorrentLogin(selection_manager().selected()); 
     26                        hal::bittorrent().getTorrentLogin(torrent_name); 
    2127                 
    2228                username_ = details.first; 
    2329                password_ = details.second; 
    24                  
    25                 std::vector<hal::TrackerDetail> trackers = 
    26                         hal::bittorrent().getTorrentTrackers(torrent_name); 
    27                 m_list.manager().clearAll(); 
    28                  
    29                 foreach (const hal::TrackerDetail& tracker, trackers) 
    30                 { 
    31                         int itemPos = m_list.AddItem(0, 0, tracker.url.c_str(), 0); 
    32                         m_list.SetItemText(itemPos, 1, lexical_cast<wstring>(tracker.tier).c_str()); 
    33                 } 
     30        } 
     31        else 
     32        {                                
     33                ::EnableWindow(GetDlgItem(IDC_TRACKER_LOGINCHECK), false); 
     34                ::EnableWindow(GetDlgItem(IDC_TRACKERLIST), false); 
     35                 
     36                username_ = L""; 
     37                password_ = L""; 
     38        } 
     39         
     40        m_list.uiUpdate(tD); 
     41                         
     42        ::EnableWindow(GetDlgItem(IDC_TRACKER_APPLY), false);    
     43        setLoginUiState(torrent_name); 
     44 
     45        DoDataExchange(false); 
     46 
     47} 
     48 
     49void AdvTrackerDialog::onLoginCheck(UINT, int, HWND hWnd) 
     50{ 
     51        LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0); 
     52         
     53        if (result == BST_CHECKED) 
     54        { 
     55                ::EnableWindow(GetDlgItem(IDC_TRACKER_USER), true); 
     56                ::EnableWindow(GetDlgItem(IDC_TRACKER_PASS), true); 
     57        } 
     58        else 
     59        { 
     60                ::EnableWindow(GetDlgItem(IDC_TRACKER_USER), false); 
     61                ::EnableWindow(GetDlgItem(IDC_TRACKER_PASS), false);     
     62 
     63                username_ = L"";         
     64                password_ = L""; 
     65                 
     66                if (hal::bittorrent().torrentDetails().selectedTorrent()) 
     67                        hal::bittorrent().setTorrentLogin(hal::to_utf8(hal::bittorrent().torrentDetails().selectedTorrent()->filename()), 
     68                                username_, password_); 
     69                 
     70                DoDataExchange(false);           
     71        } 
     72} 
     73 
     74LRESULT AdvTrackerDialog::onInitDialog(HWND, LPARAM) 
     75{ 
     76        dialogBaseClass::InitializeHalDialogBase();      
     77        resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN); 
     78         
     79        m_list.Attach(GetDlgItem(IDC_TRACKERLIST));      
     80        m_list.attachEditedConnection(bind(&AdvTrackerDialog::trackerListEdited, this)); 
     81 
     82        string torrent_name;     
     83         
     84        if (hal::bittorrent().torrentDetails().selectedTorrent()) 
     85                torrent_name = hal::to_utf8(hal::bittorrent().torrentDetails().selectedTorrent()->filename()); 
     86         
     87        if (hal::bittorrent().isTorrent(torrent_name)) 
     88        {                
     89                ::EnableWindow(GetDlgItem(IDC_TRACKER_LOGINCHECK), true); 
     90                ::EnableWindow(GetDlgItem(IDC_TRACKERLIST), true); 
     91                 
     92                pair<wstring, wstring> details =  
     93                        hal::bittorrent().getTorrentLogin(torrent_name); 
     94                 
     95                username_ = details.first; 
     96                password_ = details.second; 
    3497        } 
    3598        else 
     
    41104                password_ = L""; 
    42105        } 
    43          
    44         ::EnableWindow(GetDlgItem(IDC_TRACKER_APPLY), false); 
    45          
     106                 
    46107        setLoginUiState(torrent_name); 
    47 #       endif    
    48  
    49         DoDataExchange(false);   
    50 //      ui().update(); 
    51 } 
    52  
    53 void AdvTrackerDialog::onLoginCheck(UINT, int, HWND hWnd) 
    54 { 
    55         LRESULT result = ::SendMessage(hWnd, BM_GETCHECK, 0, 0); 
    56          
    57         if (result == BST_CHECKED) 
    58         { 
    59                 ::EnableWindow(GetDlgItem(IDC_TRACKER_USER), true); 
    60                 ::EnableWindow(GetDlgItem(IDC_TRACKER_PASS), true); 
    61         } 
    62         else 
    63         { 
    64                 ::EnableWindow(GetDlgItem(IDC_TRACKER_USER), false); 
    65                 ::EnableWindow(GetDlgItem(IDC_TRACKER_PASS), false);     
    66  
    67                 username_ = L"";         
    68                 password_ = L""; 
    69                  
    70                 DoDataExchange(false);           
    71         } 
    72 } 
    73  
    74 LRESULT AdvTrackerDialog::onInitDialog(HWND, LPARAM) 
    75 { 
    76         dialogBaseClass::InitializeHalDialogBase();      
    77         resizeClass::DlgResize_Init(false, true, WS_CLIPCHILDREN); 
    78          
    79         m_list.Attach(GetDlgItem(IDC_TRACKERLIST));      
    80         m_list.attachEditedConnection(bind(&AdvTrackerDialog::trackerListEdited, this)); 
    81          
    82 /*      if (hal::bittorrent().isTorrent(selection_manager().selected())) 
    83         {                
    84                 ::EnableWindow(GetDlgItem(IDC_TRACKER_LOGINCHECK), true); 
    85                 ::EnableWindow(GetDlgItem(IDC_TRACKERLIST), true); 
    86                  
    87                 pair<wstring, wstring> details =  
    88                         hal::bittorrent().getTorrentLogin(selection_manager().selected()); 
    89                  
    90                 username_ = details.first; 
    91                 password_ = details.second; 
    92         } 
    93         else 
    94         {                
    95                 ::EnableWindow(GetDlgItem(IDC_TRACKER_LOGINCHECK), false); 
    96                 ::EnableWindow(GetDlgItem(IDC_TRACKERLIST), false); 
    97                  
    98                 username_ = L""; 
    99                 password_ = L""; 
    100         } 
    101                  
    102         setLoginUiState(selection_manager().selected());*/ 
    103108        DoDataExchange(false);   
    104109        return 0; 
     
    132137        DoDataExchange(true); 
    133138         
    134 //      setLoginUiState(selection_manager().selected()); 
    135 //      hal::bittorrent().setTorrentLogin(selection_manager().selected(), username_, password_); 
     139        string torrent_name;     
     140        if (hal::bittorrent().torrentDetails().selectedTorrent()) 
     141                torrent_name = hal::to_utf8(hal::bittorrent().torrentDetails().selectedTorrent()->filename()); 
     142         
     143        setLoginUiState(torrent_name); 
     144        hal::bittorrent().setTorrentLogin(torrent_name, username_, password_); 
    136145         
    137146        return 0; 
     
    140149void AdvTrackerDialog::onReannounce(UINT, int, HWND) 
    141150{ 
    142 //      hal::bittorrent().reannounceTorrent(selection_manager().selected()); 
     151        if (hal::bittorrent().torrentDetails().selectedTorrent()) 
     152                hal::bittorrent().reannounceTorrent(hal::to_utf8(hal::bittorrent().torrentDetails().selectedTorrent()->filename())); 
    143153         
    144154//      hal::event().post(shared_ptr<hal::EventDetail>(new hal::EventDetail(hal::Event::critical,  
     
    151161} 
    152162 
    153 void AdvTrackerDialog::updateDialog() 
    154 {} 
    155  
    156163void AdvTrackerDialog::onReset(UINT, int, HWND) 
    157164{ 
    158 /*      hal::bittorrent().resetTorrentTrackers(selection_manager().selected()); 
     165        string torrent_name;     
     166        if (hal::bittorrent().torrentDetails().selectedTorrent()) 
     167                torrent_name = hal::to_utf8(hal::bittorrent().torrentDetails().selectedTorrent()->filename()); 
     168                 
     169        hal::bittorrent().resetTorrentTrackers(torrent_name); 
    159170         
    160171        std::vector<hal::TrackerDetail> trackers = 
    161                 hal::bittorrent().getTorrentTrackers(selection_manager().selected()); 
    162         m_list.manager().clearAll(); 
     172                hal::bittorrent().getTorrentTrackers(torrent_name); 
     173        m_list.clearAll(); 
    163174         
    164175        foreach (const hal::TrackerDetail& tracker, trackers) 
     
    169180 
    170181        ::EnableWindow(GetDlgItem(IDC_TRACKER_APPLY), false); 
    171         */ 
    172182} 
    173183 
     
    187197                trackers.back().tier = lexical_cast<int>(wstring(buffer.elems)); 
    188198        } 
    189          
    190 //      hal::bittorrent().setTorrentTrackers(selection_manager().selected(), trackers); 
     199                 
     200        if (hal::bittorrent().torrentDetails().selectedTorrent()) 
     201                hal::bittorrent().setTorrentTrackers(hal::to_utf8(hal::bittorrent().torrentDetails().selectedTorrent()->filename()), trackers); 
    191202         
    192203        ::EnableWindow(GetDlgItem(IDC_TRACKER_APPLY), false); 
  • src/advtabs/Tracker.hpp

    r240 r256  
    1212#include "../HaliteListManager.hpp" 
    1313#include "../HaliteDialogBase.hpp" 
    14  
    15 //class ui_signal; 
    16  
    17 //typedef selection_manager<CHaliteListViewCtrl<HaliteListViewCtrl> > ListViewManager; 
    1814 
    1915class AdvTrackerDialog : 
     
    8884        void onReset(UINT, int, HWND); 
    8985 
    90         void setLoginUiState(const string& torrent_name); 
    91         void selectionChanged(const string& torrent_name); 
    92         void updateDialog(); 
    93  
     86        void setLoginUiState(const string& torrent_name);        
     87        void uiUpdate(const hal::TorrentDetails& tD); 
    9488        void trackerListEdited(); 
    9589 
    9690protected: 
     91        string current_torrent_name_; 
    9792        TrackerListViewCtrl m_list; 
    9893 
  • src/advtabs/TrackerListView.cpp

    r152 r256  
    99void TrackerListViewCtrl::OnAttach() 
    1010{ 
    11         SetListViewDetails(); 
    12 /*      SetExtendedListViewStyle(WS_EX_CLIENTEDGE|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP); 
    13  
    14         CHeaderCtrl hdr = GetHeader(); 
    15         hdr.ModifyStyle(0, HDS_DRAGDROP|HDS_FULLDRAG); 
    16  
    17         AddColumn(L"Tracker", hdr.GetItemCount()); 
    18         AddColumn(L"Tier", hdr.GetItemCount()); 
     11        SetExtendedListViewStyle(WS_EX_CLIENTEDGE|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP); 
     12        SetSortListViewExtendedStyle(SORTLV_USESHELLBITMAPS, SORTLV_USESHELLBITMAPS); 
    1913         
    20         assert (hdr.GetItemCount() == numListColumnWidth); 
     14        ApplyDetails(); 
    2115         
    22         for (int i=0; i<numListColumnWidth; ++i) 
    23         { 
    24                 SetColumnWidth(i, listColumnWidth[i]); 
    25         } 
    26          
    27         SetColumnOrderArray(numListColumnWidth, (int*)&listColumnOrder);         
    28 */ 
     16        SetColumnSortType(1, LVCOLSORT_LONG); 
    2917} 
    3018 
     
    3725{                
    3826        GetListViewDetails(); 
    39 /*      assert (GetHeader().GetItemCount() == numListColumnWidth); 
    40          
    41         GetColumnOrderArray(numListColumnWidth, (int*)&listColumnOrder); 
    42          
    43         for (int i=0; i<numListColumnWidth; ++i) 
    44         { 
    45                 listColumnWidth[i] = GetColumnWidth(i); 
    46         } 
    47 */       
    4827        save(); 
    4928} 
    5029 
    51 void TrackerListViewCtrl::updateListView() 
    52 { 
    53         // Should I be doing something here? 
     30void TrackerListViewCtrl::uiUpdate(const hal::TorrentDetails& tD) 
     31{        
     32        if (!tD.selectedTorrent()) 
     33                return; 
     34                 
     35        string torrent_name = hal::to_utf8(tD.selectedTorrent()->filename()); 
     36 
     37        if (hal::bittorrent().isTorrent(torrent_name)) 
     38        {                        
     39                TryUpdateLock<listClass> lock(*this); 
     40                if (lock)  
     41                {                        
     42                        std::vector<hal::TrackerDetail> trackers = 
     43                                hal::bittorrent().getTorrentTrackers(torrent_name); 
     44                        clearAll(); 
     45                         
     46                        foreach (const hal::TrackerDetail& tracker, trackers) 
     47                        { 
     48                                int itemPos = AddItem(0, 0, tracker.url.c_str(), 0); 
     49                                SetItemText(itemPos, 1, lexical_cast<wstring>(tracker.tier).c_str()); 
     50                        } 
     51                } 
     52        } 
     53        else 
     54        {                
     55                clearAll(); 
     56        } 
    5457} 
    5558 
  • src/advtabs/TrackerListView.hpp

    r235 r256  
    88#include "../global/string_conv.hpp" 
    99#include "../HaliteIni.hpp" 
    10 #include "../HaliteListViewCtrl.hpp" 
     10#include "../HaliteSortListViewCtrl.hpp" 
    1111 
    1212class TrackerListViewCtrl : 
    13         public CHaliteListViewCtrl<TrackerListViewCtrl>, 
     13        public CHaliteSortListViewCtrl<TrackerListViewCtrl>, 
    1414        public CHaliteIni<TrackerListViewCtrl>, 
    1515        private boost::noncopyable 
     
    1717 
    1818        typedef CHaliteIni<TrackerListViewCtrl> iniClass; 
    19         typedef CHaliteListViewCtrl<TrackerListViewCtrl> listClass; 
     19        typedef CHaliteSortListViewCtrl<TrackerListViewCtrl> listClass; 
    2020 
    2121        friend class listClass; 
     
    2929         
    3030        TrackerListViewCtrl() : 
     31                listClass(true,false,false), 
    3132                iniClass("listviews/tracker", "TrackerListView") 
    3233        { 
    33                 load(); 
     34                std::vector<wstring> names;      
     35                wstring column_names = hal::app().res_wstr(HAL_TRACKER_LISTVIEW_COLUMNS); 
     36 
     37                // "Tracker;Tier" 
     38                boost::split(names, column_names, boost::is_any_of(L";")); 
     39                 
     40                array<int, 2> widths = {287,50}; 
     41                array<int, 2> order = {0,1}; 
     42                array<bool, 2> visible = {true,true}; 
     43                 
     44                SetDefaults(names, widths, order, visible, true); 
     45                Load(); 
    3446        } 
    3547 
     
    4355                REFLECTED_NOTIFY_CODE_HANDLER(NM_DBLCLK, OnDoubleClick) 
    4456 
    45                 CHAIN_MSG_MAP(CHaliteListViewCtrl<TrackerListViewCtrl>) 
    46  
     57                CHAIN_MSG_MAP(listClass) 
    4758                DEFAULT_REFLECTION_HANDLER() 
    4859        END_MSG_MAP() 
    4960 
    50         void updateListView(); 
     61        void uiUpdate(const hal::TorrentDetails& tD); 
    5162        void enterNewTracker(); 
    5263        void saveSettings(); 
     
    7081        void OnDestroy(); 
    7182 
    72 /*      static const size_t numListColumnWidth = 2; 
    73         int listColumnWidth[numListColumnWidth]; 
    74         int listColumnOrder[numListColumnWidth]; 
    75 */ 
    7683        boost::signal<void ()> listEdited_; 
    7784}; 
    7885 
    79 typedef TrackerListViewCtrl::selection_manage_class TrackerListViewManager; 
     86typedef TrackerListViewCtrl::SelectionManager TrackerListViewManager; 
  • src/halTorrent.cpp

    r255 r256  
    11021102                { 
    11031103                        (*i).second.handle().pause(); // NB. internal pause, not registered in Torrents.xml 
     1104                } 
     1105        } 
     1106         
     1107        // Ok this polling loop here is a bit curde, but a blocking wait is actually appropiate. 
     1108        lbt::session_status status = pimpl->theSession.status();         
     1109        while (status.download_rate > 0 || status.upload_rate > 0) 
     1110        { 
     1111                Sleep(200); 
     1112                status = pimpl->theSession.status(); 
     1113        } 
     1114         
     1115        for (TorrentMap::const_iterator i=pimpl->torrents.begin(), e=pimpl->torrents.end(); i != e; ++i) 
     1116        { 
     1117                if ((*i).second.inSession()) 
     1118                { 
    11041119                        lbt::entry resumedata = (*i).second.handle().write_resume_data(); 
    11051120                        pimpl->theSession.remove_torrent((*i).second.handle()); 
Note: See TracChangeset for help on using the changeset viewer.