source: trunk/src/ProgressDialog.hpp @ 438

Revision 438, 2.1 KB checked in by Eoin, 12 years ago (diff)

Cleaned up Progress Dialog and NewTorrent? Dialog.
Ruby language script now splits up ';' strings.
More ignores for language script.

Line 
1
2//         Copyright Eóin O'Callaghan 2006 - 2007.
3// Distributed under the Boost Software License, Version 1.0.
4//    (See accompanying file LICENSE_1_0.txt or copy at
5//          http://www.boost.org/LICENSE_1_0.txt)
6
7#pragma once
8
9#define IDD_PROGRESS                    15000
10#define ID_PROGRESS_BEGIN                               15001
11
12#define IDC_PROG_DESCP                  ID_PROGRESS_BEGIN + 1
13#define IDC_PROG_CANCEL                 ID_PROGRESS_BEGIN + 2
14#define IDC_PROG_PROGRESS               ID_PROGRESS_BEGIN + 3
15
16#ifndef RC_INVOKED
17
18#include <boost/function.hpp>
19
20#include "Halite.hpp"
21#include "halTorrent.hpp"
22
23class ProgressDialog :
24        public CDialogImpl<ProgressDialog>
25{
26protected:
27        typedef ProgressDialog thisClass;
28        typedef CDialogImpl<ProgressDialog> baseClass;
29       
30        typedef boost::function<bool (hal::progress_callback fn)> threadFunction;
31
32public:
33        ProgressDialog(wstring windowText, threadFunction fn) :
34                fn_(fn),
35                windowText_(windowText),
36                stop_(false)
37        {}
38       
39        enum { IDD = IDD_PROGRESS };
40
41    BEGIN_MSG_MAP_EX(ProgressDialog)
42                MSG_WM_INITDIALOG(onInitDialog)
43
44                COMMAND_ID_HANDLER_EX(IDC_PROG_CANCEL, onCancel)
45    END_MSG_MAP()
46       
47        LRESULT onInitDialog(HWND, LPARAM)
48        {
49                CenterWindow();
50                SetWindowText(windowText_.c_str());
51                prog_.Attach(GetDlgItem(IDC_PROG_PROGRESS));
52                prog_.SetRange(0, 100);
53               
54                thread_ptr.reset(new thread(bind(&ProgressDialog::ProgressThread, this)));
55               
56                return TRUE;
57        }
58
59        void ProgressThread()
60        {
61                int err_code = (fn_(bind(&ProgressDialog::Callback, this, _1, _2)) ? 1 : 0);
62               
63                EndDialog(err_code);
64        }
65       
66        bool Callback(size_t progress, wstring description)
67        {
68                SetDlgItemText(IDC_PROG_DESCP, description.c_str());
69                prog_.SetPos(progress);
70               
71                return stop_;
72        }
73       
74        BOOL PreTranslateMessage(MSG* pMsg)
75        {
76                return this->IsDialogMessage(pMsg);
77        }
78       
79        void onCancel(UINT, int, HWND hWnd)
80        {
81                stop_ = true;
82        }
83       
84private:
85        boost::scoped_ptr<thread> thread_ptr;
86        threadFunction fn_;
87       
88        wstring windowText_;
89        bool stop_;
90        WTL::CProgressBarCtrl prog_;
91};
92
93#endif // RC_INVOKED
Note: See TracBrowser for help on using the repository browser.