1 // Written in the D programming language.
2 
3 /**
4 This module contains definition for status line control.
5 
6 Status line is usually shown in the bottom of window, and shows status of app.
7 
8 Contains one or more text and/or icon items
9 
10 Synopsis:
11 
12 ----
13 import dlangui.widgets.statusline;
14 
15 ----
16 
17 Copyright: Vadim Lopatin, 2015
18 License:   Boost License 1.0
19 Authors:   Vadim Lopatin, coolreader.org@gmail.com
20 */
21 module dlangui.widgets.statusline;
22 
23 import dlangui.widgets.layouts;
24 import dlangui.widgets.controls;
25 
26 class StatusLinePanelBase : HorizontalLayout {
27     this(string ID) {
28         super(ID);
29     }
30 }
31 
32 class StatusLineTextPanel : StatusLinePanelBase {
33     protected TextWidget _text;
34     this(string ID) {
35         super(ID);
36         _text = new TextWidget(null, ""d);
37         addChild(_text);
38     }
39     /// returns widget content text (override to support this)
40     override @property dstring text() { return _text.text; }
41     /// sets widget content text (override to support this)
42     override @property Widget text(dstring s) { _text.text = s; return this; }
43     /// sets widget content text (override to support this)
44     override @property Widget text(UIString s) { _text.text = s; return this; }
45 }
46 
47 class StatusLineIconPanel : StatusLinePanelBase {
48     protected ImageWidget _icon;
49     this(string ID) {
50         super(ID);
51         _icon = new ImageWidget(null);
52         addChild(_icon);
53     }
54     @property string iconId() {
55         return _icon.drawableId;
56     }
57     @property void iconId(string icon) {
58         _icon.drawableId = icon;
59     }
60 }
61 
62 class StatusLineTextAndIconPanel : StatusLineTextPanel {
63     protected ImageWidget _icon;
64     this(string ID) {
65         super(ID);
66         _icon = new ImageWidget(null);
67         _icon.minWidth = BACKEND_CONSOLE ? 1 : 20;
68         _icon.minHeight = BACKEND_CONSOLE ? 1 : 20;
69         _icon.alignment = Align.Center;
70         addChild(_icon);
71     }
72     @property string iconId() {
73         return _icon.drawableId;
74     }
75     @property void iconId(string icon) {
76         _icon.drawableId = icon;
77     }
78 }
79 
80 class StatusLineBackgroundOperationPanel : StatusLineTextAndIconPanel {
81     this(string ID) {
82         super(ID);
83         visibility = Visibility.Gone;
84     }
85     protected uint animationProgress;
86     /// show / update / animate background operation status; when both parameters are nulls, hide background op status panel
87     void setBackgroundOperationStatus(string icon, dstring statusText) {
88         if (icon || statusText) {
89             visibility = Visibility.Visible;
90             text = statusText;
91             iconId = icon;
92             animationProgress = (animationProgress + 30) % 512;
93             uint a = animationProgress;
94             if (a >= 256)
95                 a = 512 - a;
96             _icon.backgroundColor((a << 24) | (0x00FF00));
97         } else {
98             visibility = Visibility.Gone;
99         }
100     }
101 }
102 
103 /// Status line control
104 class StatusLine : HorizontalLayout {
105     protected TextWidget _defStatus;
106     protected StatusLineBackgroundOperationPanel _backgroundOperationPanel;
107     this() {
108         super("STATUS_LINE");
109         styleId = STYLE_STATUS_LINE;
110         initialize();
111     }
112     void initialize() {
113         _defStatus = new TextWidget("STATUS_LINE_TEXT");
114         _defStatus.layoutWidth(FILL_PARENT);
115         _defStatus.text = "DLANGUI"d;
116         addChild(_defStatus);
117         _backgroundOperationPanel = new StatusLineBackgroundOperationPanel("BACKGROUND_OP_STATUS");
118         addChild(_backgroundOperationPanel);
119     }
120     /// set text to show in status line in specific panel
121     void setStatusText(string itemId, dstring value) {
122         _defStatus.text = value;
123     }
124     /// set text to show in status line
125     void setStatusText(dstring value) {
126         setStatusText(null, value);
127     }
128     /// show / update / animate background operation status; when both parameters are nulls, hide background op status panel
129     void setBackgroundOperationStatus(string icon, dstring statusText = null) {
130         _backgroundOperationPanel.setBackgroundOperationStatus(icon, statusText);
131     }
132 }