-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathprogressindicator.go
80 lines (63 loc) · 2.12 KB
/
progressindicator.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
// Copyright 2012 The Walk Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package walk
import (
"unsafe"
)
import . "github.com/lxn/go-winapi"
type ProgressIndicator struct {
hwnd HWND
taskbarList3 *ITaskbarList3
completed uint32
total uint32
state PIState
}
type PIState int
const (
PINoProgress PIState = TBPF_NOPROGRESS
PIIndeterminate PIState = TBPF_INDETERMINATE
PINormal PIState = TBPF_NORMAL
PIError PIState = TBPF_ERROR
PIPaused PIState = TBPF_PAUSED
)
//newTaskbarList3 precondition: Windows version is at least 6.1 (yes, Win 7 is version 6.1).
func newTaskbarList3(hwnd HWND) (*ProgressIndicator, error) {
var classFactoryPtr unsafe.Pointer
if hr := CoGetClassObject(&CLSID_TaskbarList, CLSCTX_ALL, nil, &IID_IClassFactory, &classFactoryPtr); FAILED(hr) {
return nil, errorFromHRESULT("CoGetClassObject", hr)
}
var taskbarList3ObjectPtr unsafe.Pointer
classFactory := (*IClassFactory)(classFactoryPtr)
defer classFactory.Release()
if hr := classFactory.CreateInstance(nil, &IID_ITaskbarList3, &taskbarList3ObjectPtr); FAILED(hr) {
return nil, errorFromHRESULT("IClassFactory.CreateInstance", hr)
}
return &ProgressIndicator{taskbarList3: (*ITaskbarList3)(taskbarList3ObjectPtr), hwnd: hwnd}, nil
}
func (pi *ProgressIndicator) SetState(state PIState) error {
if hr := pi.taskbarList3.SetProgressState(pi.hwnd, (int)(state)); FAILED(hr) {
return errorFromHRESULT("ITaskbarList3.setprogressState", hr)
}
pi.state = state
return nil
}
func (pi *ProgressIndicator) State() PIState {
return pi.state
}
func (pi *ProgressIndicator) SetTotal(total uint32) {
pi.total = total
}
func (pi *ProgressIndicator) Total() uint32 {
return pi.total
}
func (pi *ProgressIndicator) SetCompleted(completed uint32) error {
if hr := pi.taskbarList3.SetProgressValue(pi.hwnd, completed, pi.total); FAILED(hr) {
return errorFromHRESULT("ITaskbarList3.SetProgressValue", hr)
}
pi.completed = completed
return nil
}
func (pi *ProgressIndicator) Completed() uint32 {
return pi.completed
}