source: src/HaliteDialog.hpp @ 258

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

Listview flickering sorted.

Line 
1
2#pragma once
3
4#include "stdAfx.hpp"
5#include "DdxEx.hpp"
6#include "HaliteSortListViewCtrl.hpp"
7#include "HaliteDialogBase.hpp"
8#include "HaliteIni.hpp"
9
10#include "halTorrent.hpp"
11#include "halEvent.hpp"
12
13class ui_signal;
14
15class HaliteDialog :
16        public CDialogImpl<HaliteDialog>,
17        public CDialogResize<HaliteDialog>,
18        public CWinDataExchangeEx<HaliteDialog>,
19        public CHaliteDialogBase<HaliteDialog>,
20        private boost::noncopyable
21{       
22
23        typedef HaliteDialog thisClass;
24        typedef CDialogImpl<HaliteDialog> baseClass;
25        typedef CDialogResize<HaliteDialog> resizeClass;
26        typedef CHaliteDialogBase<HaliteDialog> dialogBaseClass;
27               
28        class DialogListView :
29                public CHaliteSortListViewCtrl<DialogListView, const hal::PeerDetail>,
30                public CHaliteIni<DialogListView>,
31                private boost::noncopyable
32        {
33        protected:
34                typedef HaliteDialog::DialogListView thisClass;
35                typedef CHaliteIni<thisClass> iniClass;
36                typedef CHaliteSortListViewCtrl<DialogListView, const hal::PeerDetail> listClass;
37                typedef const hal::PeerDetail pD;
38       
39                friend class listClass;
40               
41                struct ColumnAdapters
42                {
43               
44                typedef listClass::ColumnAdapter ColAdapter_t;
45               
46                struct SpeedDown : public ColAdapter_t
47                {
48                        virtual bool less(pD& l, pD& r) { return l.speed.first < r.speed.first; }               
49                        virtual std::wstring print(pD& p) 
50                        {
51                                return (wformat(L"%1$.2fkb/s") % (p.speed.first/1024)).str(); 
52                        }               
53                };
54               
55                struct SpeedUp : public ColAdapter_t
56                {
57                        virtual bool less(pD& l, pD& r) { return l.speed.second < r.speed.second; }             
58                        virtual std::wstring print(pD& p) 
59                        {
60                                return (wformat(L"%1$.2fkb/s") % (p.speed.second/1024)).str(); 
61                        }               
62                };
63               
64                };
65       
66        public: 
67                enum { 
68                        LISTVIEW_ID_MENU = 0,
69                        LISTVIEW_ID_COLUMNNAMES = HAL_DIALOGPEER_LISTVIEW_COS,
70                        LISTVIEW_ID_COLUMNWIDTHS = HAL_DIALOGPEER_LISTVIEW_COS_DEFAULTS
71                };
72       
73                BEGIN_MSG_MAP_EX(thisClass)
74                        MSG_WM_DESTROY(OnDestroy)
75       
76                        CHAIN_MSG_MAP(listClass)
77                        DEFAULT_REFLECTION_HANDLER()
78                END_MSG_MAP()
79       
80                DialogListView() :
81                        iniClass("listviews/dialog", "DialogPeersList"),
82                        listClass(true,false,false)
83                {                                       
84                        std::vector<wstring> names;     
85                        wstring column_names = hal::app().res_wstr(LISTVIEW_ID_COLUMNNAMES);
86
87                        // "Peer;Country;Download;Upload;Type;Client"
88                        boost::split(names, column_names, boost::is_any_of(L";"));
89                       
90                        array<int, 6> widths = {100,20,70,70,70,100};
91                        array<int, 6> order = {0,1,2,3,4,5};
92                        array<bool, 6> visible = {true,true,true,true,true,true};
93                       
94                        SetDefaults(names, widths, order, visible);
95                        Load();
96                }
97               
98                void saveSettings()
99                {
100                        GetListViewDetails();
101                        save();
102                }
103               
104                bool SubclassWindow(HWND hwnd)
105                {
106                        if(!parentClass::SubclassWindow(hwnd))
107                                return false;
108                               
109                        SetExtendedListViewStyle(WS_EX_CLIENTEDGE|LVS_EX_FULLROWSELECT|LVS_EX_HEADERDRAGDROP|LVS_EX_DOUBLEBUFFER);
110                        SetSortListViewExtendedStyle(SORTLV_USESHELLBITMAPS, SORTLV_USESHELLBITMAPS);
111                       
112                        ApplyDetails();
113                       
114                        SetColumnSortType(2, LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedDown());
115                        SetColumnSortType(3, LVCOLSORT_CUSTOM, new ColumnAdapters::SpeedUp());
116                               
117                        return true;
118                }
119               
120                void OnDestroy()
121                {
122                        saveSettings();
123                }
124               
125                friend class boost::serialization::access;
126                template<class Archive>
127                void serialize(Archive& ar, const unsigned int version)
128                {
129                        ar & boost::serialization::make_nvp("listview", 
130                                boost::serialization::base_object<listClass>(*this));
131                }
132               
133                pD CustomItemConversion(LVCompareParam* param, int iSortCol)
134                {                       
135                        return peerDetails_[param->dwItemData];
136                }               
137               
138                int CustomItemComparision(pD left, pD right, int iSortCol)
139                {
140                        ColumnAdapter* pCA = getColumnAdapter(iSortCol);
141                       
142                        if (pCA)
143                                return (pCA->less(left, right)) ? 1 : -1;
144                        else 
145                                return 0;
146                }
147               
148                void uiUpdate(const hal::TorrentDetails& tD);
149               
150        private:
151                hal::PeerDetails peerDetails_;
152        };
153       
154public:
155        enum { IDD = IDD_HALITEDLG };
156
157        HaliteDialog(HaliteWindow& HalWindow);
158        BOOL PreTranslateMessage(MSG* pMsg)     { return this->IsDialogMessage(pMsg); }
159
160        void saveStatus();
161
162        BEGIN_MSG_MAP_EX(thisClass)
163                MSG_WM_INITDIALOG(onInitDialog)
164                MSG_WM_CLOSE(onClose)
165                COMMAND_RANGE_CODE_HANDLER_EX(IDC_EDITTLU, IDC_EDITNCU, EN_KILLFOCUS, OnEditKillFocus)
166
167                if(uMsg == WM_FORWARDMSG)
168                        if(PreTranslateMessage((LPMSG)lParam)) return TRUE;
169
170                COMMAND_ID_HANDLER_EX(BTNPAUSE, onPause)
171                COMMAND_ID_HANDLER_EX(BTNREANNOUNCE, onReannounce)
172                COMMAND_ID_HANDLER_EX(BTNREMOVE, onRemove)
173
174        //      MSG_WM_CTLCOLORSTATIC(OnCltColor)
175
176                CHAIN_MSG_MAP(resizeClass)
177                REFLECT_NOTIFICATIONS()
178        END_MSG_MAP()
179
180        BEGIN_DDX_MAP(thisClass)
181        DDX_EX_INT_POSITIVE_LIMIT(IDC_EDITNCD, NoConnDown, 2, true)
182        DDX_EX_INT_POSITIVE_LIMIT(IDC_EDITNCU, NoConnUp, 2, true)
183        DDX_EX_FLOAT_POSITIVE(IDC_EDITTLD, TranLimitDown)
184        DDX_EX_FLOAT_POSITIVE(IDC_EDITTLU, TranLimitUp)
185    END_DDX_MAP()
186
187        BEGIN_DLGRESIZE_MAP(thisClass)
188                DLGRESIZE_CONTROL(BTNPAUSE, (DLSZ_MOVE_X))
189                DLGRESIZE_CONTROL(BTNREANNOUNCE, (DLSZ_MOVE_X))
190                DLGRESIZE_CONTROL(BTNREMOVE, (DLSZ_MOVE_X))
191
192                DLGRESIZE_CONTROL(IDC_TL, (DLSZ_MOVE_X))
193                DLGRESIZE_CONTROL(IDC_NC, (DLSZ_MOVE_X))
194                DLGRESIZE_CONTROL(IDC_TLD, (DLSZ_MOVE_X))
195                DLGRESIZE_CONTROL(IDC_TLU, (DLSZ_MOVE_X))
196                DLGRESIZE_CONTROL(IDC_NCU, (DLSZ_MOVE_X))
197                DLGRESIZE_CONTROL(IDC_NCD, (DLSZ_MOVE_X))
198
199                DLGRESIZE_CONTROL(IDC_EDITNCD, (DLSZ_MOVE_X))
200                DLGRESIZE_CONTROL(IDC_EDITTLD, (DLSZ_MOVE_X))
201                DLGRESIZE_CONTROL(IDC_EDITTLU, (DLSZ_MOVE_X))
202                DLGRESIZE_CONTROL(IDC_EDITNCU, (DLSZ_MOVE_X))
203
204                DLGRESIZE_CONTROL(TORRENTPROG, (DLSZ_SIZE_X))
205
206                DLGRESIZE_CONTROL(IDC_NAME, (DLSZ_SIZE_X))
207                DLGRESIZE_CONTROL(IDC_TRACKER, (DLSZ_SIZE_X))
208                DLGRESIZE_CONTROL(IDC_STATUS, (DLSZ_SIZE_X))
209                DLGRESIZE_CONTROL(IDC_COMPLETE, (DLSZ_SIZE_X))
210
211                DLGRESIZE_CONTROL(LISTPEERS, (DLSZ_SIZE_X | DLSZ_SIZE_Y))
212                DLGRESIZE_CONTROL(IDC_DETAILS_GROUP, (DLSZ_SIZE_X | DLSZ_SIZE_Y))
213        END_DLGRESIZE_MAP()
214       
215        void selectionChanged(const string& torrent_name);
216        void updateDialog();
217        void uiUpdate(const hal::TorrentDetails& allTorrents); 
218       
219protected:
220        LRESULT onInitDialog(HWND, LPARAM);
221        void onClose();
222
223        void onPause(UINT, int, HWND);
224        void onReannounce(UINT, int, HWND);
225        void onRemove(UINT, int, HWND);
226
227        LRESULT OnEditKillFocus(UINT uCode, int nCtrlID, HWND hwndCtrl);
228        LRESULT OnCltColor(HDC hDC, HWND hWnd);
229
230private:
231        CButton m_btn_start;
232        DialogListView m_list;
233        CContainedWindow m_wndNCD;
234        CProgressBarCtrl m_prog;
235
236        int NoConnDown, NoConnUp;
237        float TranLimitDown, TranLimitUp;
238};
Note: See TracBrowser for help on using the repository browser.