Changeset 726


Ignore:
Timestamp:
02/20/09 17:58:28 (10 years ago)
Author:
Eoin
Message:

Fixed the sorting on the HaliteDialog?.

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/res/Halite.rc

    r720 r726  
    395395    PUSHBUTTON      "Reannounce",BTNREANNOUNCE,314,19,52,14 
    396396    PUSHBUTTON      "Remove",BTNREMOVE,314,35,52,14 
    397     CONTROL         "",LISTPEERS,"SysListView32",WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT,4,64,362,6 
     397    CONTROL         "",LISTPEERS,"SysListView32",WS_TABSTOP | WS_BORDER | LVS_ALIGNLEFT | LVS_REPORT | LVS_OWNERDATA,4,64,362,6 
    398398    EDITTEXT        HAL_EDITTLU,277,36,34,12,ES_AUTOHSCROLL 
    399399    EDITTEXT        HAL_EDITTLD,220,36,34,12,ES_AUTOHSCROLL 
  • trunk/src/HaliteDialog.cpp

    r723 r726  
    2121LRESULT HaliteDialog::OnInitDialog(HWND, LPARAM) 
    2222{ 
    23  
    24 //              MARGINS m = {20, 20, 0, 100}; 
    25 //              SetMargins(m); 
    2623 
    2724        m_prog.Attach(GetDlgItem(TORRENTPROG)); 
     
    157154} 
    158155 
     156bool HaliteDialog::DialogListView::sort_list_comparison(std::wstring l, std::wstring r, size_t index, bool ascending) 
     157{ 
     158        hal::peer_details_vec::optional_type pdl = peer_details_.find_peer(l); 
     159        hal::peer_details_vec::optional_type pdr = peer_details_.find_peer(r); 
     160 
     161        if (pdl && pdr)  
     162                return hal::hal_details_ptr_compare(pdl, pdr, index, ascending); 
     163        else 
     164                return false; 
     165} 
     166 
     167LRESULT HaliteDialog::DialogListView::OnGetDispInfo(int, LPNMHDR pnmh, BOOL&) 
     168{        
     169        NMLVDISPINFO* pdi = (NMLVDISPINFO*)pnmh; 
     170 
     171        HAL_DEV_SORT_MSG(hal::wform(L"OnGetDispInfo index = %1% size = %2%") % pdi->item.iItem % peer_details_.size()); 
     172 
     173        hal::try_update_lock<listClass> lock(*this); 
     174        if (lock && peer_details_.size() >= pdi->item.iItem)  
     175        {        
     176 
     177        hal::peer_details_vec::optional_type pd = peer_details_.find_peer(key_from_index(pdi->item.iItem)); 
     178 
     179        if (pd && pdi->item.mask & LVIF_TEXT) 
     180        { 
     181                wstring str = pd->to_wstring(pdi->item.iSubItem); 
     182                 
     183                size_t len = str.copy(pdi->item.pszText, min(pdi->item.cchTextMax - 1, static_cast<int>(str.size()))); 
     184                pdi->item.pszText[len] = '\0'; 
     185        } 
     186 
     187        } 
     188         
     189        return 0; 
     190} 
     191 
    159192void HaliteDialog::DialogListView::uiUpdate(const hal::torrent_details_manager& tD)  
    160193{        
     
    162195        if (lock)  
    163196        {                
    164 #if 0 
    165                 peer_details_ = tD.focusedTorrent()->get_peer_details(); 
    166                  
    167                 std::sort(peer_details_.begin(), peer_details_.end()); 
    168                  
    169                 // Wipe details not present 
    170                 for(int i = 0; i < GetItemCount(); /*nothing here*/) 
    171                 { 
    172                         boost::array<wchar_t, MAX_PATH> ip_address; 
    173                         GetItemText(i, 0, ip_address.c_array(), MAX_PATH); 
    174                          
    175                         hal::peer_detail ip(ip_address.data()); 
    176                         hal::peer_details_vec::iterator iter =  
    177                                 std::lower_bound(peer_details_.begin(), peer_details_.end(), ip); 
    178                          
    179                         if (iter == peer_details_.end() || !((*iter) == ip)) 
     197                selection_from_listview(); 
     198                 
     199                peer_details_.clear(); 
     200                 
     201                foreach (const hal::torrent_details_ptr torrent, tD.selectedTorrents()) 
     202                { 
     203                        std::copy(torrent->get_peer_details().begin(), torrent->get_peer_details().end(),  
     204                                std::inserter(peer_details_, peer_details_.begin())); 
     205                } 
     206                 
     207                std::set<std::wstring> ip_set; 
     208                foreach (hal::peer_detail& pd,  peer_details_) 
     209                        ip_set.insert(pd.ip_address); 
     210                 
     211                erase_based_on_set(ip_set, true); 
     212 
     213                if (IsSortOnce() || AutoSort()) 
     214                { 
     215                        if (GetSecondarySortColumn() != -1) 
    180216                        { 
    181                                 DeleteItem(i); 
     217                                int index = GetColumnSortType(GetSecondarySortColumn());                                         
     218                                if (index > WTL::LVCOLSORT_LAST) 
     219                                        sort(index - (WTL::LVCOLSORT_LAST+1+hal::peer_detail::ip_address_e), IsSecondarySortDescending()); 
    182220                        } 
    183                         else 
    184                         { 
    185                                 SetItemData(i, std::distance(peer_details_.begin(), iter)); 
    186                                 ++i; 
     221 
     222                        if (GetSortColumn() != -1) 
     223                        {                
     224                                int index = GetColumnSortType(GetSortColumn());                          
     225                                if (index > WTL::LVCOLSORT_LAST) 
     226                                        sort(index - (WTL::LVCOLSORT_LAST+1+hal::peer_detail::ip_address_e), IsSortDescending()); 
    187227                        } 
    188228                } 
    189229                 
    190                 // Add additional details 
    191                 for (hal::peer_details_vec::iterator i=peer_details_.begin(), e=peer_details_.end(); 
    192                         i != e; ++i) 
    193                 {                        
    194                         LV_FINDINFO findInfo;  
    195                         findInfo.flags = LVFI_STRING; 
    196                         findInfo.psz = const_cast<LPTSTR>((*i).ip_address.c_str()); 
    197                          
    198                         int itemPos = FindItem(&findInfo, -1); 
    199                         if (itemPos < 0) 
    200                                 itemPos = AddItem(GetItemCount(), 0, (*i).ip_address.c_str(), 0); 
    201                          
    202                         SetItemData(itemPos, std::distance(peer_details_.begin(), i)); 
    203                          
    204                         SetItemText(itemPos, 1, (*i).country.c_str()); 
    205                          
    206                         SetItemText(itemPos, 2, (hal::wform(L"%1$.2fkb/s") % ((*i).speed.first/1024)).str().c_str()); 
    207                          
    208                         SetItemText(itemPos, 3, (hal::wform(L"%1$.2fkb/s") % ((*i).speed.second/1024)).str().c_str()); 
    209                          
    210                         if ((*i).seed) 
    211                                 SetItemText(itemPos, 4, L"Seed"); 
    212                          
    213                         SetItemText(itemPos, 5, (*i).client.c_str()); 
    214                 } 
    215                  
    216 //              ConditionallyDoAutoSort(); 
    217 #endif 
    218         } 
     230                set_keys(ip_set);                
     231                InvalidateRect(NULL,true); 
     232        } 
     233} 
     234 
     235LRESULT HaliteDialog::DialogListView::OnSortChanged(int, LPNMHDR pnmh, BOOL&) 
     236{ 
     237         
     238        return 0; 
    219239} 
    220240 
     
    268288        downloadRate_ = tranLimit.first; 
    269289        uploadRate_ = tranLimit.second; 
    270          
    271 //      m_list.clearAll(); 
    272          
     290                 
    273291        DoDataExchange(false); 
    274292} 
  • trunk/src/HaliteDialog.hpp

    r715 r726  
    4242                 
    4343        class DialogListView : 
    44                 public CHaliteSortListViewCtrl<DialogListView, const hal::peer_detail>, 
     44                public CHaliteSortListViewCtrl<DialogListView, std::wstring>, 
    4545                public hal::IniBase<DialogListView>, 
    4646                private boost::noncopyable 
     
    4949                typedef HaliteDialog::DialogListView thisClass; 
    5050                typedef hal::IniBase<thisClass> iniClass; 
    51                 typedef CHaliteSortListViewCtrl<DialogListView, const hal::peer_detail> listClass; 
     51                typedef CHaliteSortListViewCtrl<DialogListView, std::wstring> listClass; 
    5252                typedef const hal::peer_detail pD; 
    5353         
    5454                friend class listClass; 
    55                  
    56 /*              struct ColumnAdapters 
    57                 { 
    58                  
    59                 typedef listClass::ColumnAdapter ColAdapter_t; 
    60                  
    61                 struct SpeedDown : public ColAdapter_t 
    62                 { 
    63                         virtual int compare(pD& l, pD& r)       { return hal::compare(l.speed.first, r.speed.first); }           
    64                         virtual std::wstring print(pD& p)  
    65                         { 
    66                                 return (hal::wform(L"%1$.2fkb/s") % (p.speed.first/1024)).str();  
    67                         }                
    68                 }; 
    69                  
    70                 struct SpeedUp : public ColAdapter_t 
    71                 { 
    72                         virtual int compare(pD& l, pD& r)       { return hal::compare(l.speed.second, r.speed.second); }                 
    73                         virtual std::wstring print(pD& p)  
    74                         { 
    75                                 return (hal::wform(L"%1$.2fkb/s") % (p.speed.second/1024)).str();  
    76                         }                
    77                 }; 
    78                  
    79                 }; 
    80 */       
     55 
    8156        public:  
    8257                enum {  
     
    8863                BEGIN_MSG_MAP_EX(thisClass) 
    8964                        MSG_WM_DESTROY(OnDestroy) 
     65 
     66                        REFLECTED_NOTIFY_CODE_HANDLER(SLVN_SORTCHANGED, OnSortChanged) 
     67                        REFLECTED_NOTIFY_CODE_HANDLER(LVN_GETDISPINFO, OnGetDispInfo) 
     68 
    9069                        CHAIN_MSG_MAP(listClass) 
    9170                        DEFAULT_REFLECTION_HANDLER() 
     
    10786                                return false; 
    10887                                 
    109                         WTL::CMenuHandle menu; 
    110                         BOOL menu_created = menu.LoadMenu(LISTVIEW_ID_MENU); 
    111                         InitialSetup(menu);      
    112  
     88                        InitialSetup();  
     89                         
    11390                        std::vector<wstring> names;      
    11491                        wstring column_names = hal::app().res_wstr(LISTVIEW_ID_COLUMNNAMES); 
    11592 
    116                         // "Peer;Country;Download;Upload;Type;Client" 
     93                        // "Peer;Country;Download;Upload;Type;Client,Status" 
    11794                        boost::split(names, column_names, boost::is_any_of(L";")); 
    11895                         
     
    125102                                AddColumn(names[i].c_str(), i, visible[i], widths[i]); 
    126103                        }        
    127                          
    128                         load_from_ini(); 
    129                          
    130 //                      SetColumnSortType(2, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedDown()); 
    131 //                      SetColumnSortType(3, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedUp()); 
     104                                                 
     105                        load_from_ini();                 
     106 
     107                        for (unsigned i=0, e = hal::peer_detail::client_e-hal::peer_detail::ip_address_e; i <= e; ++i) 
     108                                SetColumnSortType(i, i + (WTL::LVCOLSORT_LAST+1+hal::peer_detail::ip_address_e));        
    132109                                 
    133110                        return true; 
     
    146123                                boost::serialization::base_object<listClass>(*this)); 
    147124                } 
    148                  
    149 /*              pD CustomItemConversion(LVCompareParam* param, int iSortCol) 
    150                 {                        
    151                         return peer_details_[param->dwItemData]; 
    152                 }               */ 
     125 
     126                LRESULT OnGetDispInfo(int, LPNMHDR pnmh, BOOL&); 
     127                LRESULT OnSortChanged(int, LPNMHDR pnmh, BOOL&); 
     128 
     129                bool sort_list_comparison(std::wstring l,  std::wstring r, size_t index, bool ascending); 
    153130                 
    154131                void uiUpdate(const hal::torrent_details_manager& tD); 
  • trunk/src/HaliteListView.cpp

    r725 r726  
    5151 
    5252        for (unsigned i=0, e = hal::torrent_details::queue_position_e-hal::torrent_details::name_e; i <= e; ++i) 
    53                 SetColumnSortType(i, i + (WTL::LVCOLSORT_LAST+1+hal::torrent_details::name_e), NULL); 
    54          
    55 //      SetColumnSortType(0, WTL::LVCOLSORT_TEXTNOCASE, NULL); 
     53                SetColumnSortType(i, i + (WTL::LVCOLSORT_LAST+1+hal::torrent_details::name_e)); 
    5654         
    5755        queue_view_mode(); 
     
    154152        InvalidateRect(NULL,true); 
    155153 
    156 /*      // Update details here. 
    157         for (size_t td_index=0, e=tD.torrents().size(); td_index<e; ++td_index) 
    158         { 
    159                 hal::torrent_details_ptr td = tD.torrents()[td_index]; 
    160          
    161                 int item_pos = td_index; 
    162                  
    163                 HAL_DEV_SORT_MSG(hal::wform(L"AutoSort() = %1%, SortOnce() = %2%, !AutoSort() && !SortOnce() = %3%")  
    164                         % AutoSort() % sort_once % (!AutoSort() && !sort_once)); 
    165                  
    166                 HAL_DEV_SORT_MSG(hal::wform(L"Item = %1%, Index = %2%") % td->name() % item_pos); 
    167  
    168                 LVITEM lvItem = { 0 }; 
    169                 lvItem.mask = LVIF_TEXT|LVIF_STATE; 
    170                 lvItem.stateMask = LVIS_SELECTED; 
    171                 lvItem.state = 0; 
    172                 lvItem.iSubItem = 0; 
    173                 lvItem.pszText = (LPTSTR)td->name().c_str(); 
    174  
    175                 if (tD.selected_names().find(td->name()) != tD.selected_names().end()) 
    176                         lvItem.state = LVIS_SELECTED; 
    177  
    178                 if (IsGroupViewEnabled()) 
    179                 { 
    180                         lvItem.mask |= LVIF_GROUPID|LVIF_COLUMNS; 
    181  
    182                         if (td->managed()) 
    183                                 lvItem.iGroupId = HAL_AUTO_MANAGED; 
    184                         else 
    185                                 lvItem.iGroupId = HAL_UNMANAGED; 
    186                 } 
    187  
    188                 lvItem.mask |= LVIF_IMAGE; 
    189                 lvItem.iImage = 0; 
    190                 item_pos = set_key_item(td->name(), &lvItem); 
    191  
    192                 InvalidateRect(NULL,true); 
    193         } 
    194 */ 
    195154        } 
    196155} 
Note: See TracChangeset for help on using the changeset viewer.