1 // Copyright (c) 2017 Matthew Brennan Jones <matthew.brennan.jones@gmail.com> 2 // Boost Software License - Version 1.0 3 // A simple progress dialog for the D programming language 4 // https://github.com/workhorsy/d-progress-dialog 5 6 7 module progress_dialog_dlangui; 8 9 import progress_dialog : ProgressDialogBase; 10 import std.stdio; 11 import dlangui; 12 13 14 class ProgressDialogDlangUI : ProgressDialogBase { 15 import dlangui.widgets.progressbar : ProgressBarWidget; 16 17 this(string title, string message) { 18 super(title, message); 19 } 20 21 override void show(void delegate() cb) { 22 import std.conv : to; 23 import core.thread : Thread; 24 25 // create window 26 auto flags = WindowFlag.Modal; 27 _window = Platform.instance.createWindow(_title.to!dstring, null, flags, 300, 150); 28 29 auto vlayout = new VerticalLayout(); 30 vlayout.margins = 20; 31 vlayout.padding = 10; 32 33 auto text = new MultilineTextWidget(null, _message.to!dstring); 34 35 _progress_bar = new ProgressBarWidget(); 36 _progress_bar.progress = 300; 37 _progress_bar.animationInterval = 50; 38 39 vlayout.addChild(text); 40 vlayout.addChild(_progress_bar); 41 _window.mainWidget = vlayout; 42 43 // show window 44 _window.show(); 45 46 auto composed = new Thread({ 47 try { 48 cb(); 49 } catch (Throwable err) { 50 this.fireOnError(err); 51 } 52 }); 53 composed.start(); 54 55 Platform.instance.enterMessageLoop(); 56 } 57 58 override void setPercent(int percent) { 59 _percent = percent; 60 _progress_bar.progress = _percent * 10; 61 } 62 63 override void close() { 64 this.setPercent(100); 65 _window.close(); 66 } 67 68 static bool isSupported() { 69 version (Windows) { 70 return true; 71 } else version (Have_derelict_sdl2) { 72 import progress_dialog : is_sdl2_loadable; 73 return is_sdl2_loadable; 74 } else { 75 return false; 76 } 77 } 78 79 int _retval; 80 int _percent; 81 ProgressBarWidget _progress_bar; 82 Window _window; 83 }