Changeset 278


Ignore:
Timestamp:
09/01/07 18:50:59 (13 years ago)
Author:
Eoin
Message:

File priority selection working.

Files:
8 edited

Legend:

Unmodified
Added
Removed
  • res/Halite.rc

    r277 r278  
    536536        HAL_DIALOGPEER_LISTVIEW_ADV       "Peer;Country;Download;Upload;Type;Client;Status" 
    537537        HAL_DIALOGPEER_LISTVIEW_ADV_DEFAULTS      "95;64;64;50;100;500" 
    538         HAL_DIALOGFILE_LISTVIEW_ADV     "Path;Filename;Size;Progress;Priority" 
     538        HAL_DIALOGFILE_LISTVIEW_ADV     "Filename;Path;Size;Progress;Priority" 
     539         
     540        HAL_FILE_PRIORITY_0     "Don't download" 
     541        HAL_FILE_PRIORITY_1     "Normal" 
     542        HAL_FILE_PRIORITY_2     "2" 
     543        HAL_FILE_PRIORITY_3     "3" 
     544        HAL_FILE_PRIORITY_4     "4" 
     545        HAL_FILE_PRIORITY_5     "5" 
     546        HAL_FILE_PRIORITY_6     "6" 
     547        HAL_FILE_PRIORITY_7     "Maximum" 
     548END 
     549 
     550IDR_FILESLISTVIEW_MENU MENU 
     551BEGIN 
     552    POPUP "_POPUP_" 
     553    BEGIN 
     554        POPUP "Set Priority" 
     555        BEGIN 
     556            MENUITEM "Don't download",ID_HAL_FILE_PRIORITY_0 
     557            MENUITEM "Normal",ID_HAL_FILE_PRIORITY_1 
     558            MENUITEM "2",ID_HAL_FILE_PRIORITY_2 
     559            MENUITEM "3",ID_HAL_FILE_PRIORITY_3 
     560            MENUITEM "4",ID_HAL_FILE_PRIORITY_4 
     561            MENUITEM "5",ID_HAL_FILE_PRIORITY_5 
     562            MENUITEM "6",ID_HAL_FILE_PRIORITY_6 
     563            MENUITEM "Maximum",ID_HAL_FILE_PRIORITY_7 
     564        END 
     565    END 
    539566END 
    540567 
  • res/resource.h

    r277 r278  
    99#endif 
    1010 
    11 #define HALITE_VERSION                                  0,2,9,270 
    12 #define HALITE_VERSION_STRING                   "v 0.2.9 dev 270" 
     11#define HALITE_VERSION                                  0,2,9,278 
     12#define HALITE_VERSION_STRING                   "v 0.2.9 dev 278" 
    1313 
    1414#define HALITE_LANGUAGE                                 10 
     
    292292#define HAL_TORRENT_ROOT                                40133 
    293293 
     294#define HAL_FILE_PRIORITY_0                             40134 
     295#define HAL_FILE_PRIORITY_1                             40135 
     296#define HAL_FILE_PRIORITY_2                             40136 
     297#define HAL_FILE_PRIORITY_3                             40137 
     298#define HAL_FILE_PRIORITY_4                             40138 
     299#define HAL_FILE_PRIORITY_5                             40139 
     300#define HAL_FILE_PRIORITY_6                             40140 
     301#define HAL_FILE_PRIORITY_7                             40141 
     302 
     303#define ID_HAL_FILE_PRIORITY_0                  40142 
     304#define ID_HAL_FILE_PRIORITY_1                  40143 
     305#define ID_HAL_FILE_PRIORITY_2                  40144 
     306#define ID_HAL_FILE_PRIORITY_3                  40145 
     307#define ID_HAL_FILE_PRIORITY_4                  40146 
     308#define ID_HAL_FILE_PRIORITY_5                  40147 
     309#define ID_HAL_FILE_PRIORITY_6                  40148 
     310#define ID_HAL_FILE_PRIORITY_7                  40149 
     311#define IDR_FILESLISTVIEW_MENU                  40150 
     312 
  • src/HaliteSortListViewCtrl.hpp

    r276 r278  
    350350        } 
    351351         
     352        HWND Create(HWND hWndParent, ATL::_U_RECT rect = NULL, LPCTSTR szWindowName = NULL, 
     353                        DWORD dwStyle = 0, DWORD dwExStyle = 0, 
     354                        ATL::_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL) 
     355        { 
     356                HWND hwnd = parentClass::Create(hWndParent,  
     357                        rect.m_lpRect, szWindowName, dwStyle, dwExStyle, MenuOrID.m_hMenu, lpCreateParam); 
     358                         
     359                SetExtendedListViewStyle(WS_EX_CLIENTEDGE|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_DOUBLEBUFFER); 
     360                SetSortListViewExtendedStyle(SORTLV_USESHELLBITMAPS, SORTLV_USESHELLBITMAPS); 
     361                 
     362                return hwnd; 
     363        } 
     364         
    352365        bool SubclassWindow(HWND hwnd) 
    353366        { 
     
    578591                        DoSortItems(iCol, IsSortDescending());   
    579592        } 
     593                 
     594        ColumnAdapter* getColumnAdapter(size_t index) 
     595        { 
     596                boost::ptr_map<size_t, ColumnAdapter>::iterator  
     597                        i = columnAdapters_.find(index); 
     598         
     599                if (i != columnAdapters_.end()) 
     600                { 
     601                        return i->second; 
     602                }                
     603                return NULL; 
     604        } 
    580605         
    581606protected:       
     
    600625                assert (colAdapter); 
    601626                columnAdapters_.insert(key, colAdapter); 
    602         } 
    603          
    604         ColumnAdapter* getColumnAdapter(size_t index) 
    605         { 
    606                 boost::ptr_map<size_t, ColumnAdapter>::iterator  
    607                         i = columnAdapters_.find(index); 
    608          
    609                 if (i != columnAdapters_.end()) 
    610                 { 
    611                         return i->second; 
    612                 }                
    613                 return NULL; 
    614627        } 
    615628         
  • src/advtabs/Files.cpp

    r277 r278  
    2020        wstring column_names = hal::app().res_wstr(LISTVIEW_ID_COLUMNNAMES); 
    2121 
    22         // "Path;Filename;Size;Progress;Priority" 
     22        // "Filename;Path;Size;Progress;Priority" 
    2323        boost::split(names, column_names, boost::is_any_of(L";")); 
    2424         
     
    4040        ApplyDetails(); 
    4141         
     42        SetExtendedListViewStyle(WS_EX_CLIENTEDGE|LVS_EX_HEADERDRAGDROP|LVS_EX_DOUBLEBUFFER); 
     43                 
     44        SetColumnSortType(2, LVCOLSORT_CUSTOM, new ColumnAdapters::Size()); 
     45        SetColumnSortType(3, LVCOLSORT_CUSTOM, new ColumnAdapters::Progress()); 
     46        SetColumnSortType(4, LVCOLSORT_CUSTOM, new ColumnAdapters::Priority()); 
     47         
    4248        return hwnd; 
    4349} 
    44 #if 0 
    45 void FileListView::uiUpdate(const hal::TorrentDetails& tD) 
    46 { 
    47         TryUpdateLock<listClass> lock(*this); 
    48         if (lock)  
    49         {                
    50                 peerDetails_.clear(); 
    51                  
    52                 foreach (const hal::TorrentDetail_ptr torrent, tD.selectedTorrents()) 
    53                 { 
    54                         std::copy(torrent->peerDetails().begin(), torrent->peerDetails().end(),  
    55                                 std::back_inserter(peerDetails_)); 
    56                 } 
    57                  
    58                 std::sort(peerDetails_.begin(), peerDetails_.end()); 
    59                  
    60                 // Wipe details not present 
    61                 for(int i = 0; i < GetItemCount(); /*nothing here*/) 
    62                 { 
    63                         boost::array<wchar_t, MAX_PATH> ip_address; 
    64                         GetItemText(i, 0, ip_address.c_array(), MAX_PATH); 
    65                          
    66                         hal::PeerDetail ip(ip_address.data()); 
    67                         hal::PeerDetails::iterator iter =  
    68                                 std::lower_bound(peerDetails_.begin(), peerDetails_.end(), ip); 
    69                          
    70                         if (iter == peerDetails_.end() || !((*iter) == ip)) 
    71                         { 
    72                                 DeleteItem(i); 
    73                         } 
    74                         else 
    75                         { 
    76                                 SetItemData(i, std::distance(peerDetails_.begin(), iter)); 
    77                                 ++i; 
    78                         } 
    79                 } 
    80                  
    81                 // Add additional details 
    82                 for (hal::PeerDetails::iterator i=peerDetails_.begin(), e=peerDetails_.end(); 
    83                         i != e; ++i) 
    84                 {                        
    85                         LV_FINDINFO findInfo;  
    86                         findInfo.flags = LVFI_STRING; 
    87                         findInfo.psz = const_cast<LPTSTR>((*i).ipAddress.c_str()); 
    88                          
    89                         int itemPos = FindItem(&findInfo, -1); 
    90                         if (itemPos < 0) 
    91                                 itemPos = AddItem(GetItemCount(), 0, (*i).ipAddress.c_str(), 0); 
    92                          
    93                         SetItemData(itemPos, std::distance(peerDetails_.begin(), i)); 
    94                          
    95                         SetItemText(itemPos, 1, (*i).country.c_str()); 
    96                          
    97                         SetItemText(itemPos, 2, getColumnAdapter(2)->print(*i).c_str()); 
    98                          
    99                         SetItemText(itemPos, 3, getColumnAdapter(3)->print(*i).c_str()); 
    100                          
    101                         if ((*i).seed) 
    102                                 SetItemText(itemPos, 4, L"Seed"); 
    103                          
    104                         SetItemText(itemPos, 5, (*i).client.c_str()); 
    105                          
    106                         SetItemText(itemPos, 6, (*i).status.c_str()); 
    107                 } 
    108                  
    109                 ConditionallyDoAutoSort(); 
    110         } 
    111 } 
    112 #endif 
     50 
     51void FileListView::OnMenuPriority(UINT uCode, int nCtrlID, HWND hwndCtrl) 
     52{        
     53        std::vector<int> indices; 
     54         
     55        for (int i=0, e=GetItemCount(); i<e; ++i) 
     56        { 
     57                UINT flags = GetItemState(i, LVIS_SELECTED); 
     58                 
     59                if (flags & LVIS_SELECTED) 
     60                        indices.push_back(GetItemData(i)); 
     61        } 
     62         
     63        int priority = nCtrlID-ID_HAL_FILE_PRIORITY_0; 
     64         
     65        std::string torrent = hal::to_utf8(hal::bittorrent().torrentDetails().selectedTorrent()->filename()); 
     66        hal::bittorrent().setTorrentFilePriorities(torrent, indices, priority); 
     67} 
    11368 
    11469LRESULT FileTreeView::OnSelChanged(int, LPNMHDR pnmh, BOOL&) 
    115 {        
    116         wpath branch;    
     70{                
     71        wpath branch; 
    11772         
    11873        TryUpdateLock<thisClass> lock(*this); 
     
    13287                        while (ti = ti.GetParent()); 
    13388                } 
    134         } 
    135          
    136         focused_ = branch;       
    137          
    138         signal(); 
     89                 
     90                signal(); 
     91        } 
     92         
     93        focused_ = branch; 
    13994        return 0; 
    14095} 
     
    198153                std::copy(torrent->fileDetails().begin(), torrent->fileDetails().end(),  
    199154                        std::back_inserter(fileDetails)); 
    200                  
    201                 fileDetails.push_back(hal::FileDetail(L"a\\d")); 
    202                 fileDetails.push_back(hal::FileDetail(L"a\\b\\c\\e")); 
    203                 fileDetails.push_back(hal::FileDetail(L"a\\f")); 
    204                 fileDetails.push_back(hal::FileDetail(L"a\\d\\g")); 
    205         } 
     155        } 
     156         
     157        list_.setFocused(tD.focusedTorrent()); 
    206158         
    207159        std::sort(fileDetails.begin(), fileDetails.end()); 
     
    231183                { 
    232184                        boost::array<wchar_t, MAX_PATH> fullPath; 
    233                         list_.GetItemText(i, 1, fullPath.c_array(), MAX_PATH); 
     185                        list_.GetItemText(i, 0, fullPath.c_array(), MAX_PATH); 
    234186                         
    235187                        hal::FileDetail file(L"", wstring(fullPath.c_array())); 
     
    265217                                itemPos = list_.AddItem(list_.GetItemCount(), 0, (*i).filename.c_str(), 0); 
    266218                         
    267                 //      list_.SetItemData(itemPos, std::distance(peerDetails_.begin(), i)); 
    268                          
    269                         list_.SetItemText(itemPos, 1, (*i).filename.c_str()); 
    270                         list_.SetItemText(itemPos, 2, (*i).branch.string().c_str()); 
    271                          
    272                 //      list_.SetItemText(itemPos, 2, getColumnAdapter(2)->print(*i).c_str()); 
    273                          
    274                 //      list_.SetItemText(itemPos, 3, getColumnAdapter(3)->print(*i).c_str()); 
    275                          
     219                        list_.SetItemData(itemPos, (*i).order()); 
     220                         
     221                        list_.SetItemText(itemPos, 1, (*i).branch.string().c_str());                     
     222                        list_.SetItemText(itemPos, 2, list_.getColumnAdapter(2)->print(*i).c_str()); 
     223                        list_.SetItemText(itemPos, 3, list_.getColumnAdapter(3)->print(*i).c_str()); 
     224                        list_.SetItemText(itemPos, 4, list_.getColumnAdapter(4)->print(*i).c_str());                     
    276225                } 
    277226 
  • src/advtabs/Files.hpp

    r277 r278  
    2222 
    2323class FileListView : 
    24         public CHaliteSortListViewCtrl<FileListView>, 
     24        public CHaliteSortListViewCtrl<FileListView, const hal::FileDetail>, 
    2525        public CHaliteIni<FileListView>, 
    2626        private boost::noncopyable 
     
    2828public: 
    2929        typedef FileListView thisClass; 
    30         typedef CHaliteSortListViewCtrl<thisClass> listClass; 
     30        typedef const hal::FileDetail dataClass; 
     31        typedef CHaliteSortListViewCtrl<thisClass, dataClass> listClass; 
    3132        typedef CHaliteIni<thisClass> iniClass; 
    3233 
     
    3637        {        
    3738        typedef listClass::ColumnAdapter ColAdapter_t;   
     39         
     40        struct Size : public ColAdapter_t 
     41        { 
     42                virtual bool less(dataClass& l, dataClass& r)   { return l.size < r.size; }              
     43                virtual std::wstring print(dataClass& dc)  
     44                { 
     45                        return (wformat(L"%1$.2fMB") %  
     46                                (static_cast<float>(dc.size)/(1024*1024))).str();  
     47                }                
     48        }; 
     49         
     50        struct Progress : public ColAdapter_t 
     51        { 
     52                virtual bool less(dataClass& l, dataClass& r)   { return l.progress < r.progress; }              
     53                virtual std::wstring print(dataClass& t)  
     54                { 
     55                        return (wformat(L"%1$.2f%%") % (t.progress*100)).str();  
     56                }                
     57        }; 
     58         
     59        struct Priority : public ColAdapter_t 
     60        { 
     61                virtual bool less(dataClass& l, dataClass& r)   { return l.priority < r.priority; }              
     62                virtual std::wstring print(dataClass& dc)  
     63                { 
     64                        switch (dc.priority) 
     65                        { 
     66                        case 0: 
     67                                return hal::app().res_wstr(HAL_FILE_PRIORITY_0); 
     68                        case 1: 
     69                                return hal::app().res_wstr(HAL_FILE_PRIORITY_1); 
     70                        case 2: 
     71                                return hal::app().res_wstr(HAL_FILE_PRIORITY_2); 
     72                        case 3: 
     73                                return hal::app().res_wstr(HAL_FILE_PRIORITY_3); 
     74                        case 4: 
     75                                return hal::app().res_wstr(HAL_FILE_PRIORITY_4); 
     76                        case 5: 
     77                                return hal::app().res_wstr(HAL_FILE_PRIORITY_5); 
     78                        case 6: 
     79                                return hal::app().res_wstr(HAL_FILE_PRIORITY_6); 
     80                        case 7: 
     81                                return hal::app().res_wstr(HAL_FILE_PRIORITY_7); 
     82                        }        
     83                }                
     84        }; 
     85         
    3886        }; 
    3987 
    4088public:  
    4189        enum {  
    42                 LISTVIEW_ID_MENU = 0, 
     90                LISTVIEW_ID_MENU = IDR_FILESLISTVIEW_MENU, 
    4391                LISTVIEW_ID_COLUMNNAMES = HAL_DIALOGFILE_LISTVIEW_ADV, 
    4492                LISTVIEW_ID_COLUMNWIDTHS = 0 
     
    4795        BEGIN_MSG_MAP_EX(thisClass) 
    4896                MSG_WM_DESTROY(OnDestroy) 
     97                COMMAND_RANGE_HANDLER_EX(ID_HAL_FILE_PRIORITY_0, ID_HAL_FILE_PRIORITY_7, OnMenuPriority) 
    4998 
    5099                CHAIN_MSG_MAP(listClass) 
     
    69118                        return false; 
    70119                 
    71                 ApplyDetails(); 
    72                  
    73 //              SetColumnSortType(2, LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedDown()); 
    74                  
     120                ApplyDetails();          
    75121                return true; 
    76122        } 
     
    80126                saveSettings(); 
    81127        } 
     128         
     129        void OnMenuPriority(UINT, int, HWND); 
    82130         
    83131        friend class boost::serialization::access; 
     
    89137        } 
    90138         
    91         void* CustomItemConversion(LVCompareParam* param, int iSortCol) 
     139        dataClass CustomItemConversion(LVCompareParam* param, int iSortCol) 
    92140        {                        
    93                 return 0; 
     141                return focused_->fileDetails()[param->dwItemData]; 
    94142        }                
    95143         
    96         int CustomItemComparision(void* left, void* right, int iSortCol) 
    97         { 
    98                 return 0; 
    99         } 
     144        void setFocused(const hal::TorrentDetail_ptr& f) { focused_ = f; } 
     145        const hal::TorrentDetail_ptr focused() { return focused_; } 
     146 
     147private: 
     148        hal::TorrentDetail_ptr focused_; 
    100149}; 
    101150 
     
    222271        void ClearInvalid() 
    223272        { 
    224                 for(MapType::reverse_iterator i=map_.rbegin(), e=map_.rend(); i!=e; /**/) 
    225                 { 
    226                         hal::event().post(shared_ptr<hal::EventDetail>(new hal::EventDebug(hal::Event::info, (wformat(L"Aalid %1% -- %2%, %3%") % (*i).second.valid % (*i).first.string() % map_.size()).str().c_str()))); 
    227  
     273                for(MapType::iterator i=map_.begin(), e=map_.end(); i!=e; /**/) 
     274                { 
    228275                        if ((*i).second.valid) 
    229276                        { 
     
    232279                        else 
    233280                        { 
    234                         boost::array<wchar_t, MAX_PATH> buffer; 
    235                         (*i).second.treeItem.GetText(buffer.elems, MAX_PATH); 
    236                         wstring tmp(buffer.elems); 
    237                          
    238                                 hal::event().post(shared_ptr<hal::EventDetail>(new hal::EventDebug(hal::Event::info, (wformat(L"Valid %1% -- %2% -- %3%, %4%") % (*i).second.valid % tmp % (*i).first.string() % map_.size()).str().c_str()))); 
    239  
    240                                 MapType::reverse_iterator j = i; 
    241                                 ++j; 
    242281                                (*i).second.treeItem.Delete(); 
    243                                 map_.erase(i.base()); 
    244                                 if (j == e) break; 
    245                                 i = j; 
    246                                 hal::event().post(shared_ptr<hal::EventDetail>(new hal::EventDebug(hal::Event::info, (wformat(L"Zalid %1% -- %2%, %3%") % (*i).second.valid % (*i).first.string() % map_.size()).str().c_str()))); 
     282                                map_.erase(i++); 
    247283                        } 
    248                 }                
     284                }        
    249285        } 
    250286         
  • src/halTorrent.cpp

    r274 r278  
    15421542} 
    15431543 
     1544void BitTorrent::setTorrentFilePriorities(std::string filename,  
     1545        std::vector<int> fileIndices, int priority) 
     1546{ 
     1547        try { 
     1548         
     1549        TorrentMap::iterator i = pimpl->torrents.find(filename); 
     1550         
     1551        if (i != pimpl->torrents.end()) 
     1552        { 
     1553                (*i).second.setFilePriorities(fileIndices, priority); 
     1554        } 
     1555         
     1556        } HAL_GENERIC_TORRENT_EXCEPTION_CATCH(filename, "setTorrentFilePriorities") 
     1557} 
     1558 
    15441559void BitTorrent::setTorrentTrackers(std::string filename,  
    15451560        const std::vector<TrackerDetail>& trackers) 
  • src/halTorrent.hpp

    r277 r278  
    7878                progress(pg), 
    7979                priority(pr), 
    80                 order(o) 
     80                order_(o) 
    8181        {} 
    8282         
     
    8787                progress(pg), 
    8888                priority(pr), 
    89                 order(o) 
     89                order_(o) 
    9090        {} 
    9191         
     
    9999                return (branch < file.branch); 
    100100        } 
     101         
     102        size_t order() { return order_; } 
    101103         
    102104        boost::filesystem::wpath branch; 
     
    107109         
    108110private: 
    109         size_t order; 
     111        size_t order_; 
    110112}; 
    111113 
     
    391393        void resetTorrentTrackers(std::string filename); 
    392394        std::vector<TrackerDetail> getTorrentTrackers(std::string filename); 
     395         
     396        void setTorrentFilePriorities(std::string filename, std::vector<int> fileIndices, int priority); 
    393397 
    394398        void startEventReceiver(); 
  • src/halTorrentInternal.hpp

    r275 r278  
    263263                applyTrackers(); 
    264264        } 
     265         
     266        void setFilePriorities(std::vector<int> fileIndices, int priority) 
     267        { 
     268                if (!filePriorities_.empty()) 
     269                { 
     270                        foreach(int i, fileIndices) 
     271                                filePriorities_[i] = priority; 
     272                                 
     273                        applyFilePriorities(); 
     274                } 
     275        } 
     276         
     277        void applyFilePriorities() 
     278        {                
     279                if (in_session_ && the_session_)  
     280                { 
     281                        if (!filePriorities_.empty()) 
     282                                handle_.prioritize_files(filePriorities_); 
     283                } 
     284        } 
    265285 
    266286        bool inSession() const { return in_session_; } 
     
    320340                setRatio(); 
    321341                applyTrackers(); 
     342                applyFilePriorities(); 
    322343                setResolveCountries(); 
    323344        } 
Note: See TracChangeset for help on using the changeset viewer.