Changeset 663 for trunk


Ignore:
Timestamp:
12/29/08 17:42:48 (11 years ago)
Author:
Eoin
Message:

File sorting works! ...again

Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/sln/HaliteWix/Product.wxs

    r642 r663  
    117117    </Feature> 
    118118 
    119     <Icon Id="HaliteIcon.exe" SourceFile="WiXIcon.exe" /> 
     119    <Icon Id="HaliteIcon.exe" SourceFile="$(var.ProjectDir)\..\..\$(var.ReleaseFolder)Halite.exe" /> 
    120120 
    121121    <UIRef Id="WixUI_FeatureTree" /> 
  • trunk/src/HaliteListView.cpp

    r658 r663  
    5454                SetColumnSortType(i, i + (WTL::LVCOLSORT_LAST+1+hal::torrent_details::name_e), NULL); 
    5555         
    56         SetColumnSortType(0, WTL::LVCOLSORT_TEXTNOCASE, NULL); 
     56//      SetColumnSortType(0, WTL::LVCOLSORT_TEXTNOCASE, NULL); 
    5757         
    5858        queue_view_mode(); 
  • trunk/src/advtabs/Files.cpp

    r662 r663  
    1616#define TVS_EX_DOUBLEBUFFER 0x0004 
    1717 
    18 FileListView::FileListView() : 
    19         iniClass("listviews/advFiles", "FileListView") 
     18FileListView::FileListView(do_ui_update_fn uiu) : 
     19        iniClass("listviews/advFiles", "FileListView"), 
     20        do_ui_update_(uiu) 
    2021{} 
    2122 
     
    4445                AddColumn(names[i].c_str(), i, visible[i], widths[i]); 
    4546        }        
     47         
     48        for (unsigned i=0, e = hal::file_details::priority_e-hal::file_details::filename_e; i <= e; ++i) 
     49                SetColumnSortType(i, i + (WTL::LVCOLSORT_LAST+1+hal::file_details::filename_e), NULL); 
    4650 
    4751        load_from_ini(); 
    48          
    49 /*      SetColumnSortType(2, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Size()); 
    50         SetColumnSortType(3, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Progress()); 
    51         SetColumnSortType(4, WTL::LVCOLSORT_CUSTOM, new ColumnAdapters::Priority()); 
    52         */ 
     52 
    5353        return hwnd; 
    5454} 
     
    5656void FileListView::OnMenuPriority(UINT uCode, int nCtrlID, HWND hwndCtrl) 
    5757{        
     58        hal::mutex_t::scoped_lock l(mutex_); 
     59 
    5860        std::vector<int> indices; 
    5961         
    60         for (int i=0, e=GetItemCount(); i<e; ++i) 
    61         { 
    62                 UINT flags = GetItemState(i, LVIS_SELECTED); 
    63                  
    64                 if (flags & LVIS_SELECTED) 
    65                         indices.push_back(GetItemData(i)); 
     62        foreach(const list_value_type val, std::make_pair(is_selected_begin(), is_selected_end())) 
     63        { 
     64                HAL_DEV_MSG(hal::wform(L"OnMenuPriority() = %1%, %2%, %3%")  
     65                                % std::wstring(winstl::c_str_ptr(val)) % val.index() % files_[val.index()].order()); 
     66                indices.push_back(files_[val.index()].order()); 
    6667        } 
    6768         
     
    7879        NMLVDISPINFO* pdi = (NMLVDISPINFO*)pnmh; 
    7980 
    80         HAL_DEV_MSG(hal::wform(L"OnGetDispInfo() LV Item = %1%, Subitem = %2%")  
    81                 % pdi->item.iItem % pdi->item.iSubItem); 
    82  
    83         if (pdi->item.mask & LVIF_TEXT && pdi->item.iItem < files_.size()) 
    84         { 
    85                 wstring str = files_[pdi->item.iItem].to_wstring(pdi->item.iSubItem); 
    86                  
    87                 int len = str.copy(pdi->item.pszText, min(pdi->item.cchTextMax - 1, str.size())); 
    88                 pdi->item.pszText[len] = '\0'; 
    89  
    90                 HAL_DEV_MSG(hal::wform(L"OnGetDispInfo() LV String = %1%, length = %2%, max = %3%, len = %4%")  
    91                         % str % str.size() % pdi->item.cchTextMax % len); 
    92         }        
    93          
    94         return 0; 
    95 } 
    96  
    97 LRESULT AdvFilesDialog::OnGetDispInfo(int, LPNMHDR pnmh, BOOL&) 
    98 {        
    99         NMLVDISPINFO* pdi = (NMLVDISPINFO*)pnmh; 
    100  
    101         HAL_DEV_MSG(hal::wform(L"OnGetDispInfo() Dlg Item = %1%, Subitem = %2%")  
    102                 % pdi->item.iItem % pdi->item.iSubItem); 
     81        if (pdi->item.iItem < files_.size()) 
     82        { 
     83                if (pdi->item.mask & LVIF_TEXT) 
     84                { 
     85                        wstring str = files_[pdi->item.iItem].to_wstring(pdi->item.iSubItem); 
     86                         
     87                        int len = str.copy(pdi->item.pszText, min(pdi->item.cchTextMax - 1, str.size())); 
     88                        pdi->item.pszText[len] = '\0'; 
     89                }        
     90                 
     91                if (pdi->item.mask & LVIF_PARAM) 
     92                {                        
     93                        HAL_DEV_MSG(hal::wform(L"LVIF_PARAM() = %1%, %2%")  
     94                                % pdi->item.iItem % files_[pdi->item.iItem].order()); 
     95 
     96                        pdi->item.lParam = files_[pdi->item.iItem].order(); 
     97                } 
     98        } 
     99         
     100        return 0; 
     101} 
     102 
     103LRESULT FileListView::OnSortChanged(int, LPNMHDR pnmh, BOOL&) 
     104{ 
     105        do_ui_update_(); 
    103106         
    104107        return 0; 
     
    217220                determineFocused(); 
    218221                signal(); 
    219         } 
    220          
    221         return 0; 
     222        }        
     223        return 0; 
     224} 
     225 
     226AdvFilesDialog::AdvFilesDialog(HaliteWindow& halWindow) : 
     227        dialogBaseClass(halWindow), 
     228        treeManager_(tree_), 
     229        iniClass("AdvFilesDlg", "settings"), 
     230        splitterPos(150), 
     231        list_(boost::bind(&AdvFilesDialog::doUiUpdate, this)) 
     232{ 
     233        load_from_ini(); 
    222234} 
    223235 
     
    236248                LVS_REPORT|WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|LVS_SHOWSELALWAYS, 
    237249                WS_EX_STATICEDGE|LVS_EX_DOUBLEBUFFER); 
    238  
    239         list_.SetDlgCtrlID(31415); 
    240250                 
    241251        tree_.Create(splitter_, rc, NULL,  
     
    277287         
    278288        std::sort(range_.first, range_.second, &FileLinkNamesLess); 
    279          
    280         requestUiUpdate(); 
    281 } 
    282  
    283 void AdvFilesDialog::uiUpdate(const hal::torrent_details_manager& tD) 
    284 { 
    285         list_.setFocused(focusedTorrent()); 
    286          
    287         if (fileLinks_.empty() || !(focusedTorrent() && !focusedTorrent()->get_file_details().empty()))  
    288         { 
    289                 list_.DeleteAllItems(); 
    290                 return; 
    291         } 
    292          
    293         hal::try_update_lock<FileListView::listClass> lock(list_); 
    294         if (lock)  
    295         { 
    296                 hal::file_details_vec all_files = focusedTorrent()->get_file_details(); 
    297  
     289 
     290        if (focusedTorrent()) 
     291        { 
     292                hal::file_details_vec all_files = focusedTorrent()->get_file_details();  
    298293                FileListView::scoped_files list_files = list_.files(); 
     294 
    299295                list_files->clear(); 
    300296 
     
    304300                        list_files->push_back(all_files[(*i).order()]); 
    305301                } 
    306  
    307                 if (list_files->size() != list_.GetItemCount()) 
    308                         list_.SetItemCount(list_files->size()); 
    309  
    310                 // Wipe details not present 
    311 /*              for(int i = 0; i < list_.GetItemCount(); /*nothing here*//*) 
    312                 { 
    313                         boost::array<wchar_t, MAX_PATH> fullPath; 
    314                         list_.GetItemText(i, 0, fullPath.c_array(), MAX_PATH); 
    315                          
    316                         FileLink file(wstring(fullPath.c_array())); 
    317                         std::vector<FileLink>::iterator iter =  
    318                                 std::lower_bound(range_.first, range_.second, file, &FileLinkNamesLess); 
    319                          
    320                         if (iter == range_.second || !(FileLinkNamesEqual((*iter), file))) 
    321                         { 
    322                                 list_.DeleteItem(i); 
     302                         
     303                list_.SetItemCountEx(list_files->size(),LVSICF_NOSCROLL); 
     304        } 
     305 
     306        requestUiUpdate(); 
     307} 
     308 
     309void AdvFilesDialog::uiUpdate(const hal::torrent_details_manager& tD) 
     310{ 
     311        list_.setFocused(focusedTorrent()); 
     312         
     313        if (fileLinks_.empty() || !(focusedTorrent() && !focusedTorrent()->get_file_details().empty()))  
     314        { 
     315                list_.DeleteAllItems(); 
     316                return; 
     317        } 
     318         
     319        hal::try_update_lock<FileListView::listClass> lock(list_); 
     320        if (lock)  
     321        { 
     322                hal::file_details_vec all_files = focusedTorrent()->get_file_details();  
     323                FileListView::scoped_files list_files = list_.files(); 
     324 
     325                foreach (hal::file_details& file, *list_files) 
     326                { 
     327                        file = all_files[file.order()]; 
     328                } 
     329 
     330                if (list_.AutoSort() || list_.IsSortOnce()) 
     331                { 
     332                        int col_sort_index = list_.GetSortColumn(); 
     333 
     334                        if (col_sort_index != -1) 
     335                        {                
     336                                int index = list_.GetColumnSortType(col_sort_index); 
     337                 
     338                                if (index > WTL::LVCOLSORT_LAST) 
     339                                { 
     340                                        hal::file_details_sort(*list_files, index - (WTL::LVCOLSORT_LAST+1+hal::file_details::filename_e),  
     341                                                list_.IsSortDescending()); 
     342                                } 
    323343                        } 
    324                         else 
    325                         { 
    326                                 list_.SetItemData(i, std::distance(range_.first, iter)); 
    327                                 ++i; 
    328                         } 
    329                 } 
    330  
    331                 int col_sort_index = list_.GetSortColumn(); 
    332                 if (col_sort_index != -1) 
    333                 {                
    334                         int index = list_.GetColumnSortType(col_sort_index); 
    335                          
    336                         HAL_DEV_MSG(hal::wform(L"col_sort_index() = %1%, index() = %2%")  
    337                                 % col_sort_index % index); 
    338  
    339                         if (index > WTL::LVCOLSORT_LAST) 
    340                                 hal::file_details_sort(files, index - (WTL::LVCOLSORT_LAST+1+hal::file_details::branch_e),  
    341                                         list_.IsSortDescending()); 
    342                 } 
    343  
    344                 bool sort_once = list_.IsSortOnce(); 
    345  
    346                 if (list_.GetItemCount() < files.size()) 
    347                 { 
    348                 // Add additional details 
    349                 for (size_t index = 0, e = files.size(); index < e; ++index) 
    350                 { 
    351                         hal::file_details& fd = files[index]; 
    352                          
    353                         int item_pos = index; 
    354                  
    355                         HAL_DEV_SORT_MSG(hal::wform(L"AutoSort() = %1%, SortOnce() = %2%, !AutoSort() && !SortOnce() = %3%")  
    356                                 % AutoSort() % sort_once % (!AutoSort() && !sort_once)); 
    357  
    358                         if (!list_.AutoSort() && !sort_once) 
    359                         { 
    360                                 LV_FINDINFO findInfo;  
    361                                 findInfo.flags = LVFI_STRING; 
    362                                 findInfo.psz = const_cast<LPTSTR>(fd.to_wstring(hal::file_details::filename_e).c_str()); 
    363                                  
    364                                 item_pos = list_.FindItem(&findInfo, -1); 
    365                         } 
    366  
    367                         if (item_pos == -1 || item_pos > list_.GetItemCount()) 
    368                                 item_pos = list_.AddItem(list_.GetItemCount(), 0, fd.to_wstring(hal::file_details::filename_e).c_str(), 0); 
    369                          
    370                         list_.SetItemData(item_pos, fd.order()); 
    371                          
    372                         list_.SetItemText(item_pos, 0, fd.filename.c_str());             
    373                         for (size_t i = hal::file_details::filename_e; i <= hal::file_details::priority_e; ++i) 
    374                         { 
    375                                 list_.SetItemText(item_pos, i, fd.to_wstring(i).c_str()); 
    376                         }        
    377                 } 
    378                 } 
    379  
    380                 if (list_.AutoSort() && col_sort_index >= 0 && col_sort_index < list_.m_arrColSortType.GetSize()) 
    381                 { 
    382                         if (list_.GetColumnSortType(col_sort_index) <= WTL::LVCOLSORT_CUSTOM) 
    383                                 list_.DoSortItems(col_sort_index, list_.IsSortDescending()); 
    384                 } 
    385                 */ 
     344                } 
    386345        } 
    387346 
     
    399358         
    400359        list_.setFocused(pT); 
    401          
     360 
    402361        std::sort(fileLinks_.begin(), fileLinks_.end()); 
    403362         
  • trunk/src/advtabs/Files.hpp

    r662 r663  
    3939                filename(f.filename), 
    4040                order_(f.order()) 
    41         { 
    42 //              hal::event_log.post(shared_ptr<hal::EventDetail>( 
    43 //                      new hal::EventMsg(hal::wform(L"Con -> %1% - %2%.") % filename % order())));      
    44         } 
     41        {} 
    4542         
    4643        bool operator==(const FileLink& f) const 
     
    9188        typedef CHaliteSortListViewCtrl<thisClass, dataClass> listClass; 
    9289        typedef hal::IniBase<thisClass> iniClass; 
     90         
     91        typedef boost::function<void ()> do_ui_update_fn; 
    9392 
    9493        friend class listClass; 
    95          
    96 /*      struct ColumnAdapters 
    97         {        
    98         typedef listClass::ColumnAdapter ColAdapter_t;   
    99          
    100         struct Size : public ColAdapter_t 
    101         { 
    102                 virtual int compare(dataClass& l, dataClass& r) { return hal::compare(l.size, r.size); }                 
    103                 virtual std::wstring print(dataClass& dc)  
    104                 { 
    105                         return (hal::wform(L"%1$.2fMB") %  
    106                                 (static_cast<double>(dc.size)/(1024*1024))).str();  
    107                 }                
    108         }; 
    109          
    110         struct Progress : public ColAdapter_t 
    111         { 
    112                 virtual int compare(dataClass& l, dataClass& r) { return hal::compare(static_cast<double>(l.progress)/l.size,  
    113                         static_cast<double>(r.progress)/r.size); }               
    114                 virtual std::wstring print(dataClass& t)  
    115                 { 
    116                         return (hal::wform(L"%1$.2f%%") % (static_cast<double>(t.progress)/t.size*100)).str();  
    117                 }                
    118         }; 
    119          
    120         struct Priority : public ColAdapter_t 
    121         { 
    122                 virtual int compare(dataClass& l, dataClass& r) { return hal::compare(l.priority, r.priority); }                 
    123                 virtual std::wstring print(dataClass& dc)  
    124                 { 
    125                         switch (dc.priority) 
    126                         { 
    127                         case 0: 
    128                                 return hal::app().res_wstr(HAL_FILE_PRIORITY_0); 
    129                         case 1: 
    130                                 return hal::app().res_wstr(HAL_FILE_PRIORITY_1); 
    131                         case 2: 
    132                                 return hal::app().res_wstr(HAL_FILE_PRIORITY_2); 
    133                         case 3: 
    134                                 return hal::app().res_wstr(HAL_FILE_PRIORITY_3); 
    135                         case 4: 
    136                                 return hal::app().res_wstr(HAL_FILE_PRIORITY_4); 
    137                         case 5: 
    138                                 return hal::app().res_wstr(HAL_FILE_PRIORITY_5); 
    139                         case 6: 
    140                                 return hal::app().res_wstr(HAL_FILE_PRIORITY_6); 
    141                         case 7: 
    142                                 return hal::app().res_wstr(HAL_FILE_PRIORITY_7); 
    143                         default: 
    144                                 return hal::app().res_wstr(HAL_FILE_PRIORITY_0); 
    145                         }        
    146                 }                
    147         }; 
    148          
    149         }; 
    150 */ 
     94 
    15195public:  
    152  
    15396        class scoped_files 
    15497        { 
     
    162105                hal::file_details_vec* operator->() const { return f_; } 
    163106 
     107                hal::file_details_vec& operator*() const { return *f_; } 
     108 
    164109        private: 
    165110                hal::mutex_t::scoped_lock l_; 
     
    176121        BEGIN_MSG_MAP_EX(thisClass) 
    177122                MSG_WM_DESTROY(OnDestroy) 
     123 
    178124                COMMAND_RANGE_HANDLER_EX(ID_HAL_FILE_PRIORITY_0, ID_HAL_FILE_PRIORITY_7, OnMenuPriority) 
     125 
    179126                REFLECTED_NOTIFY_CODE_HANDLER(LVN_GETDISPINFO, OnGetDispInfo) 
     127                REFLECTED_NOTIFY_CODE_HANDLER(SLVN_SORTCHANGED, OnSortChanged) 
    180128 
    181129                CHAIN_MSG_MAP(listClass) 
    182                 FORWARD_NOTIFICATIONS() 
     130                DEFAULT_REFLECTION_HANDLER() 
    183131        END_MSG_MAP() 
    184132 
    185         FileListView(); 
     133        FileListView(do_ui_update_fn uiu); 
    186134         
    187135        void saveSettings() 
     
    209157                        boost::serialization::base_object<listClass>(*this)); 
    210158        } 
    211          
    212 /*      dataClass CustomItemConversion(LVCompareParam* param, int iSortCol) 
    213         {                        
    214                 return focused_->get_file_details()[param->dwItemData]; 
    215         }               */ 
     159 
    216160         
    217161        void setFocused(const hal::torrent_details_ptr& f) { focused_ = f; } 
     
    222166protected:       
    223167        LRESULT OnGetDispInfo(int, LPNMHDR pnmh, BOOL&); 
     168        LRESULT OnSortChanged(int, LPNMHDR pnmh, BOOL&); 
    224169 
    225170private: 
    226171        //mutable hal::mutex_t mutex_; 
    227172 
     173        do_ui_update_fn do_ui_update_; 
    228174        hal::file_details_vec files_; 
    229175        hal::torrent_details_ptr focused_; 
     
    413359        enum { IDD = HAL_ADVFILES }; 
    414360 
    415         AdvFilesDialog(HaliteWindow& halWindow) : 
    416                 dialogBaseClass(halWindow), 
    417                 treeManager_(tree_), 
    418                 iniClass("AdvFilesDlg", "settings"), 
    419                 splitterPos(150) 
    420         { 
    421                 load_from_ini(); 
    422         } 
    423          
    424         ~AdvFilesDialog()  
    425         {} 
     361        AdvFilesDialog(HaliteWindow& halWindow); 
     362         
     363        ~AdvFilesDialog() {} 
    426364         
    427365        BOOL PreTranslateMessage(MSG* pMsg) 
     
    433371                MSG_WM_INITDIALOG(onInitDialog) 
    434372                MSG_WM_CLOSE(onClose) 
    435                 NOTIFY_HANDLER(31415, LVN_GETDISPINFO, OnGetDispInfo) 
    436373                MSG_WM_DESTROY(OnDestroy) 
    437374                 
  • trunk/src/halTorrent.cpp

    r661 r663  
    4848        case size_e: return size < r.size; 
    4949 
    50         case progress_e: return progress < r.progress; 
     50        case progress_e: return (static_cast<double>(progress)/size) < (static_cast<double>(r.progress)/r.size); 
    5151        case priority_e: return priority < r.priority; 
    5252 
Note: See TracChangeset for help on using the changeset viewer.