@@ -13,6 +13,7 @@ import (
1313 "image/color"
1414 "os"
1515 "path/filepath"
16+ "strconv"
1617)
1718
1819func main () {
@@ -26,7 +27,7 @@ func main() {
2627 defer closeDb ()
2728
2829 w .SetContent (setupLayout (w , state ))
29- w .Resize (fyne.Size {Width : 500 , Height : 400 })
30+ w .Resize (fyne.Size {Width : 700 , Height : 400 })
3031
3132 // Show the window
3233 w .ShowAndRun ()
@@ -54,6 +55,8 @@ func NewInstallState(w fyne.Window) *InstallerState {
5455 fileProgress2 : binding .NewFloat (),
5556 fileProgress3 : binding .NewFloat (),
5657 fileProgress4 : binding .NewFloat (),
58+ rateLimitEntry : binding .NewString (),
59+ formatRateLimit : binding .NewString (),
5760 baseUrl : "" ,
5861 }
5962 _ = state .folderPath .Set ("Not Set" )
@@ -70,6 +73,8 @@ func NewInstallState(w fyne.Window) *InstallerState {
7073 _ = state .fileProgress2 .Set (0 )
7174 _ = state .fileProgress3 .Set (0 )
7275 _ = state .fileProgress4 .Set (0 )
76+ _ = state .rateLimitEntry .Set ("" )
77+ _ = state .formatRateLimit .Set ("Unlimited" )
7378
7479 state .Grabber = NewDownloader (& state )
7580 return & state
@@ -181,34 +186,85 @@ func mainLayout(w fyne.Window, state *InstallerState) *fyne.Container {
181186 // Create active file bars
182187 fileLabel := widget .NewLabel ("File: " )
183188 fileHeader1 := widget .NewLabelWithData (state .fileTitle1 )
184- fileContainer1 := container . New ( layout . NewHBoxLayout (),
185- fileLabel ,
186- fileHeader1 )
189+ fileHeader1 . Alignment = fyne . TextAlignLeading
190+ fileHeader1 . Wrapping = fyne . TextTruncate
191+ fileContainer1 := container . NewBorder ( nil , nil , fileLabel , nil , fileHeader1 )
187192 fileProgressBar1 := widget .NewProgressBarWithData (state .fileProgress1 )
188193
189194 fileHeader2 := widget .NewLabelWithData (state .fileTitle2 )
190- fileContainer2 := container . New ( layout . NewHBoxLayout (),
191- fileLabel ,
192- fileHeader2 )
195+ fileHeader2 . Alignment = fyne . TextAlignLeading
196+ fileHeader2 . Wrapping = fyne . TextTruncate
197+ fileContainer2 := container . NewBorder ( nil , nil , fileLabel , nil , fileHeader2 )
193198 fileProgressBar2 := widget .NewProgressBarWithData (state .fileProgress2 )
194199
195200 fileHeader3 := widget .NewLabelWithData (state .fileTitle3 )
196- fileContainer3 := container . New ( layout . NewHBoxLayout (),
197- fileLabel ,
198- fileHeader3 )
201+ fileHeader3 . Alignment = fyne . TextAlignLeading
202+ fileHeader3 . Wrapping = fyne . TextTruncate
203+ fileContainer3 := container . NewBorder ( nil , nil , fileLabel , nil , fileHeader3 )
199204 fileProgressBar3 := widget .NewProgressBarWithData (state .fileProgress3 )
200205
201206 fileHeader4 := widget .NewLabelWithData (state .fileTitle4 )
202- fileContainer4 := container . New ( layout . NewHBoxLayout (),
203- fileLabel ,
204- fileHeader4 )
207+ fileHeader4 . Alignment = fyne . TextAlignLeading
208+ fileHeader4 . Wrapping = fyne . TextTruncate
209+ fileContainer4 := container . NewBorder ( nil , nil , fileLabel , nil , fileHeader4 )
205210 fileProgressBar4 := widget .NewProgressBarWithData (state .fileProgress4 )
206211
207212 progressBarTotal := widget .NewProgressBarWithData (state .progressBarTotal )
208213 totalLabel := canvas .NewText ("Total Progress..." , color .White )
209214
210- //rateLimitLabel := widget.NewLabel("Download Speed Limit:")
211- //rateLimitEntry := widget.NewEntry()
215+ rateLimitLabel := widget .NewLabel ("Download Speed Limit:" )
216+ rateLimitCurrentLabel := widget .NewLabelWithData (state .formatRateLimit )
217+ rateLimitEntry := widget .NewEntryWithData (state .rateLimitEntry )
218+ rateLimitSet := widget .NewButton ("Set (KB/s)" , func () {
219+ // Turn entry into number
220+ entryLimit , err := state .rateLimitEntry .Get ()
221+ if err != nil {
222+ dialog .NewError (err , w ).Show ()
223+ return
224+ }
225+ rateLimit , err := strconv .Atoi (entryLimit )
226+ if err != nil {
227+ dialog .NewError (& BadRateLimit {}, w ).Show ()
228+ return
229+ }
230+
231+ if rateLimit < 200 {
232+ rateLimit = 0
233+ }
234+
235+ // Save to downloader and update UI
236+ if rateLimit == 0 {
237+ err = state .formatRateLimit .Set ("Unlimited" )
238+ if err != nil {
239+ dialog .NewError (err , w ).Show ()
240+ return
241+ }
242+ } else {
243+ err = state .formatRateLimit .Set (fmt .Sprintf ("%dKB/s" , rateLimit ))
244+ if err != nil {
245+ dialog .NewError (err , w ).Show ()
246+ return
247+ }
248+ }
249+
250+ state .Grabber .RateLimit = rateLimit * 1024
251+
252+ // Restart downloader
253+ if state .Grabber .running {
254+ state .Grabber .Stop ()
255+ err = state .Grabber .Resume ()
256+ if err != nil {
257+ dialog .NewError (& FatalDownloadFailure {err }, w ).Show ()
258+ return
259+ }
260+ }
261+ })
262+
263+ rateLimContainer := container .New (layout .NewVBoxLayout (),
264+ container .New (layout .NewHBoxLayout (),
265+ rateLimitLabel ,
266+ rateLimitCurrentLabel ),
267+ container .NewBorder (nil , nil , nil , rateLimitSet , rateLimitEntry ))
212268
213269 // Create buttons
214270 button1 := widget .NewButton ("Start" , func () {
@@ -250,9 +306,6 @@ func mainLayout(w fyne.Window, state *InstallerState) *fyne.Container {
250306 // Create a row with buttons
251307 buttonsRow := container .NewHBox (button1 , button2 , button3 )
252308
253- // Create a sidebar label
254- sidebarLabel := widget .NewLabel ("Ultimate Updater" )
255-
256309 // Create 3 additional labels
257310 downloadedHeaderLabel := widget .NewLabel ("Downloaded:" )
258311 downloadedLabel := widget .NewLabelWithData (state .formatDownloadedSize )
@@ -278,6 +331,7 @@ func mainLayout(w fyne.Window, state *InstallerState) *fyne.Container {
278331 totalLabel ,
279332 progressBarTotal ,
280333 layout .NewSpacer (),
334+ rateLimContainer ,
281335 buttonsRow ,
282336 )
283337
@@ -291,30 +345,24 @@ func mainLayout(w fyne.Window, state *InstallerState) *fyne.Container {
291345 fileContainer4 ,
292346 fileProgressBar4 )
293347
294- mainContent := container .New (layout .NewHBoxLayout (),
295- leftMainContent ,
296- rightMainContent )
297-
298- leftSideContent := container .New (layout .NewVBoxLayout (),
299- sidebarLabel ,
300- layout .NewSpacer (),
301- downloadedHeaderLabel ,
302- downloadedContainer ,
303- speedHeaderLabel ,
304- speedLabel )
348+ mainContent := container .NewBorder (nil , nil , leftMainContent , nil , rightMainContent )
305349
306350 line := canvas .NewLine (color.Gray {Y : 0x55 })
307351 line .StrokeWidth = 2
308352
309- // Combine the grid layout and sidebar label in a horizontal box
310- mainLayout := container .New (layout .NewVBoxLayout (),
311- topBarLayout ("install" ),
312- container .New (layout .NewHBoxLayout (),
313- leftSideContent ,
314- line ,
315- mainContent ),
353+ leftSideContent := container .New (layout .NewHBoxLayout (),
354+ container .New (layout .NewVBoxLayout (),
355+ layout .NewSpacer (),
356+ downloadedHeaderLabel ,
357+ downloadedContainer ,
358+ speedHeaderLabel ,
359+ speedLabel ),
360+ line ,
316361 )
317362
363+ // Combine the grid layout and sidebar label in a horizontal box
364+ mainLayout := container .NewBorder (topBarLayout ("install" ), nil , leftSideContent , nil , mainContent )
365+
318366 return mainLayout
319367}
320368
0 commit comments