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 }