-
Notifications
You must be signed in to change notification settings - Fork 71
/
Progress2.ahk
240 lines (217 loc) · 7.62 KB
/
Progress2.ahk
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
; ahk v2
; ============================================================================================
; Progress bar window contains a MainText element (above the progress bar), a SubText element
; (below the progress bar), the progress bar itself, and an optional title bar.
;
; Here are the defaults:
; Font = Verdana
; Font Size (subText) = 8
; Font Size (mainText) = subTextSize + 2
; Main/SubText value = blank unless specified
; display coords = primary monitor
; default range = 0-100
;
; ============================================================================================
; Create Progress Bar
; obj := progress2.New(rangeStart := 0, rangeEnd := 100, sOptions := "")
; > specify start and end range
; > specify options to initialize certain values on creation (optional)
;
; Methods:
; obj.Update(value := "", mainText := "", subText := "")
; > value = numeric within the specified range
; > mainText / subText: update the text above / below the progress bar
; > if you want to clear the mainText or subText pass a space, ie. " "
; > to leave mainText / SubText unchanged, pass a zero-length string, ie. ""
;
; obj.Close()
; > closes the progress bar
;
; ============================================================================================
; Options on create. Comma separated string including zero or more of the below options.
; MainText / SubText are the text above / below the progress bar.
;
; fontFace:font_str
; > set the font for MainText / SubText
;
; fontSize:###
; > set font size for MainText / SubText (MainText is 2 pts larger than SubText)
;
; mainText:text_str
; > creates the Progress Bar with specified mainText (above the progress bar)
;
; mainTextAlign:left/right/center
; > specifies alignment of mainText element.
;
; mainTextSize:#
; > sets custom size for mainText element.
;
; modal:Hwnd
; > same as parent, but also disables the parent window while progressbar is active
;
; parent:Hwnd
; > defines the parent GUI window, and prevents a taskbar icon from appearing
;
; start:#
; > defines the starting numeric withing the specified range on creation
;
; subText:text_str
; > creates the Pogress Bar with specified subText (below the progress bar)
;
; subTextAlign:left/right/center
; > specifies alignment of subText element.
;
; title:title_str
; > Defines a title and ensures there is a title bar. This allows normal moving of the
; progress bar by click-dragging the title bar. No title hides the title bar and
; prevents the window from being moved by the mouse (by normal means).
;
; w:###
; > sets a specific pixel width for the progress bar
;
; x:### And y:### (specify both and separate by comma in options string)
; > sets custom x/y coords to display the progress bar window. Specify both or none.
;
; ============================================================================================
; Example
; ============================================================================================
; Global prog, g
; prog := ""
; g := Gui.New()
; g.OnEvent("close","close_gui")
; g.Add("Text","w600 h300","Test GUI")
; g.Add("Button",,"Test Progress - click 2 times slowly").OnEvent("click","click_btn")
; g.show("x200 y200")
; click_btn(p*) {
; If (!IsObject(prog)) {
; options := "mainText:Test Main Text,subText:Test Sub Text,title:test title,"
; options .= "start:25,parent:" g.hwnd
; prog := progress2.New(0,100,options)
; } Else {
; prog.Update(50," ","Test 3")
; Sleep 2000
; prog.Close()
; }
; }
; close_gui(g) {
; ExitApp
; }
; ============================================================================================
; End Example
; ============================================================================================
class progress2 {
__New(rangeStart := 0, rangeEnd := 100, sOptions := "") {
; ====================================================
; default options
; ====================================================
this.rangeStart := rangeStart, this.rangeEnd := rangeEnd
this.fontFace := "Verdana", this.fontSize := 8
this.mainTextSize := this.fontSize + 2
this.mainTextAlign := "left", this.subTextAlign := "left"
this.mainText := " ", this.subText := " ", this.title := ""
this.start := 0
this.modal := false, this.hParent := 0
this.width := 300
this.x := "", this.y := ""
this.mainTextHwnd := 0, this.subTextHwnd := 0
; ====================================================
; read user defined options
; ====================================================
optArr := StrSplit(sOptions,Chr(44))
Loop optArr.Length {
valArr := StrSplit(optArr[A_Index],":")
curOpt := valArr[1], curVal := valArr[2]
If (curOpt = "fontFace")
this.fontFace := curVal ? curVal : fontFace
Else If (curOpt = "fontSize")
this.fontSize := curVal ? curVal : fontSize
Else If (curOpt = "mainText")
this.mainText := curVal
Else If (curOpt = "subText")
this.subText := curVal
Else If (curOpt = "start")
this.start := curVal ? curVal : start
Else if (curOpt = "title")
this.title := curVal
Else If (curOpt = "parent")
this.hParent := curVal ? curVal : 0
Else If (curOpt = "modal")
this.hParent := curVal ? curVal : 0, this.modal := curVal ? true : false
Else if (curOpt = "w")
this.width := curVal ? curVal : 300
Else If (curOpt = "mainTextSize")
this.mainTextSize := curVal ? curVal : this.mainTextSize
Else If (curOpt = "mainTextAlign")
this.mainTextAlign := curVal ? curVal : this.mainTextAlign
Else if (curOpt = "subTextAlign")
this.subTextAlign := curVal ? curVal : this.subTextAlign
Else If (curOpt = "x")
this.x := curVal ? curVal : ""
Else If (curOpt = "y")
this.y := curVal ? curVal : ""
}
this.ShowProgress()
}
ShowProgress() {
showTitle := this.title ? "" : " -Caption +0x40000" ; 0x40000 = thick border
range := this.rangeStart "-" this.rangeEnd
g := Gui.New("AlwaysOnTop -DPIScale -SysMenu" showTitle,this.title)
g.SetFont("s" this.fontSize,this.fontFace)
align := this.mainTextAlign
mT := g.AddText("vMainText " align " w" this.width,this.mainText)
this.mainTextHwnd := mT.hwnd
mT.SetFont("s" this.mainTextSize)
prog := g.AddProgress("vProgBar y+m xp w" this.width " Range" range,this.start)
this.progHwnd := prog.hwnd
align := this.subTextAlign
sT := g.AddText("vSubText " align " w" this.width,this.subText)
this.subTextHwnd := sT.hwnd
If (this.hParent) {
WinGetPos pX, pY, pW, pH, "ahk_id " this.hParent
Cx := pX + (pW/2), Cy := pY + (pH/2)
borderW := SysGet(32)
captionH := SysGet(4)
captionH := this.title ? captionH : 0
borderH := SysGet(7)
prog.GetPos(,,progW,h)
mT.GetPos(,,mTh)
sT.GetPos(,,sTh)
g.GetPos(,,gH)
w := progW + (g.MarginX * 2) + (borderW * 2)
h := gH + captionH + (borderH * 2) + mTh + sTh + (g.MarginY * 4)
x := Cx - (w/2), y := Cy - (h/2)
g.Opt("+Owner" this.hParent)
If (this.modal)
WinSetEnabled 0, "ahk_id " this.hParent
}
If (this.x != "" And this.y != "")
x := this.x, y := this.y
coords := ""
If (x And y)
coords := "x" x " y" y
g.Show(coords)
this.guiHwnd := g.hwnd
this.gui := g
}
Update(value := "", mainText := "", subText := "") {
If (value != "")
this.gui["ProgBar"].Value := value
If (this.mainTextHwnd And mainText)
this.gui["MainText"].Text := mainText
If (this.subTextHwnd And subText)
this.gui["SubText"].Text := subText
}
Close() {
If (IsObject(this.gui))
this.gui.Destroy()
If (this.modal)
WinSetEnabled 0, "ahk_id " this.hParent
If (this.hParent)
WinActivate "ahk_id " this.hParent
this.__Delete()
}
__Delete() {
this.gui := ""
this := ""
}
}