1 module demo; 2 version(demo){ 3 import qui.qui; 4 import qui.widgets; 5 import std.conv : to; 6 import std.path; 7 import std.file : thisExePath; 8 import utils.misc : uinteger, integer, fileToArray; 9 10 void main (){ 11 App appInstance = new App(); 12 appInstance.run(); 13 // not doing this causes an exception 14 .destroy (appInstance); 15 } 16 /// the app 17 class App{ 18 private: 19 QTerminal term; 20 ProgressbarWidget progressBar; 21 TextLabelWidget label; 22 EditLineWidget edit; 23 MemoWidget memo; 24 LogWidget log; 25 QLayout hLayout; 26 SplitterWidget split; 27 public: 28 /// constructor 29 this(){ 30 // construct all widgets 31 term = new QTerminal(QLayout.Type.Vertical); 32 progressBar = new ProgressbarWidget(); 33 label = new TextLabelWidget(); 34 edit = new EditLineWidget("EditLineWidget, one line text editor: "); 35 hLayout = new QLayout(QLayout.Type.Horizontal); 36 memo = new MemoWidget(); 37 log = new LogWidget(); 38 split = new SplitterWidget(); 39 40 // prepare the layout in for the Memo and log 41 hLayout.addWidget([memo, split, log]); 42 { 43 string[] lines = fileToArray(dirName(thisExePath)~dirSeparator~"README.md"); 44 foreach (line; lines){ 45 memo.lines.append(line.to!dstring); 46 } 47 } 48 memo.wantsTab = false; 49 split.size.maxWidth = 1; 50 split.color = Color.white; 51 52 // put all widgets in the order they are to appear in terminal 53 term.addWidget([label, edit, progressBar, hLayout]); 54 55 // set some properties 56 label.caption = "this is a label widget. To show single line text. Below is a progress bar:"; 57 progressBar.caption = "this is the progress bar"; 58 progressBar.size.maxHeight = 1; 59 progressBar.max = 10; 60 progressBar.progress = 0; 61 62 // hide progress bar on Ctrl+O 63 term.onKeyboardEvent = delegate(QWidget caller, KeyboardEvent key){ 64 log.add(to!dstring("Terminal Keyboard Event: "~key.tostring)); 65 if (key.isCtrlKey){ 66 if (key.key == KeyboardEvent.CtrlKeys.CtrlO){ 67 progressBar.show = !progressBar.show; 68 if (progressBar.show) 69 log.add("progressbar shown"); 70 else 71 log.add("progressbar hidden"); 72 }else if (key.key == KeyboardEvent.CtrlKeys.CtrlP){ 73 progressBar.size.maxHeight = (progressBar.size.maxHeight % 3) + 1; 74 progressBar.requestResize(); 75 log.add("progressbar resized: "~progressBar.size.maxHeight.to!dstring); 76 } 77 } 78 return false; 79 }; 80 81 // and this is how timerEvent can be used 82 progressBar.onTimerEvent = delegate(QWidget caller, uinteger msecs){ 83 static increasing = true; 84 ProgressbarWidget owner = cast(ProgressbarWidget)caller; 85 if (owner.progress >= owner.max){ 86 increasing = false; 87 }else if (owner.progress == 0){ 88 increasing = true; 89 } 90 if (increasing) 91 owner.progress = owner.progress + 1; 92 else 93 owner.progress = owner.progress -1; 94 return false; 95 }; 96 memo.onActivateEvent = delegate(QWidget, bool isActive){ 97 log.add(to!dstring("Memo is now "~(isActive?"active":"inactive"))); 98 return false; 99 }; 100 edit.onActivateEvent = delegate(QWidget, bool isActive){ 101 log.add(to!dstring("EditLine is now "~(isActive?"active":"inactive"))); 102 return false; 103 }; 104 term.onMouseEvent = delegate(QWidget, MouseEvent mouse){ 105 log.add(to!dstring("Terminal MouseEvent: (" ~ mouse.x.to!string ~ ',' ~ mouse.y.to!string~')')); 106 return false; 107 }; 108 } 109 ~this(){ 110 // destroy all widgets 111 .destroy(term); 112 .destroy(progressBar); 113 .destroy(label); 114 .destroy(edit); 115 .destroy(memo); 116 .destroy(log); 117 .destroy(hLayout); 118 .destroy(split); 119 } 120 /// run the app 121 void run(){ 122 term.timerMsecs = 500; 123 term.run; 124 } 125 } 126 }