1 module calcface;
2 
3 import bindbc.cocoa;
4 
5 import calcbrain;
6 
7 struct CalcFace
8 {
9     NSWindow parent;
10     alias parent this;
11     mixin NSObjectTemplate!(NSWindow, "NSWindow");
12 
13     NSButton[18] buttons;
14     NSTextField display;
15 
16     void build(){
17         display = NSTextField.alloc; display.initWithFrame(NSMakeRect (40, 84, 182, 24));
18         display.setEditable(NO);
19         display.setBezeled(YES);
20         display.setDrawsBackground(YES);
21         display.setAlignment(right);
22         display.setSelectable(NO);
23 
24         buttons[0] = NSButton.alloc; buttons[0].initWithFrame(NSMakeRect (77, 3, 34, 24));
25         buttons[0].setButtonType(NSToggleButton);
26         buttons[0].setTitle(NSString.stringWith("0"w));
27         buttons[0].setTag(0);
28         buttons[0].setState(NO);
29         buttons[0].setKeyEquivalent(NSString.stringWith("0"w));
30 
31         buttons[1] = NSButton.alloc; buttons[1].initWithFrame(NSMakeRect (114, 3, 34, 24));
32         buttons[1].setButtonType(NSToggleButton);
33         buttons[1].setTitle(NSString.stringWith("1"w));
34         buttons[1].setTag(1);
35         buttons[1].setState(NO);
36         buttons[1].setKeyEquivalent(NSString.stringWith("1"w));
37 
38         buttons[2] = NSButton.alloc; buttons[2].initWithFrame(NSMakeRect (151, 3, 34, 24));
39         buttons[2].setButtonType(NSToggleButton);
40         buttons[2].setTitle(NSString.stringWith("2"w));
41         buttons[2].setTag(2);
42         buttons[2].setState(NO);
43         buttons[2].setKeyEquivalent(NSString.stringWith("2"w));
44 
45         buttons[3] = NSButton.alloc; buttons[3].initWithFrame(NSMakeRect (188, 3, 34, 24));
46         buttons[3].setButtonType(NSToggleButton);
47         buttons[3].setTitle(NSString.stringWith("3"w));
48         buttons[3].setTag(3);
49         buttons[3].setState(NO);
50         buttons[3].setKeyEquivalent(NSString.stringWith("3"w));
51 
52         buttons[4] = NSButton.alloc; buttons[4].initWithFrame(NSMakeRect (114, 30, 34, 24));
53         buttons[4].setButtonType(NSToggleButton);
54         buttons[4].setTitle(NSString.stringWith("4"w));
55         buttons[4].setTag(4);
56         buttons[4].setState(NO);
57         buttons[4].setKeyEquivalent(NSString.stringWith("4"w));
58 
59         buttons[5] = NSButton.alloc; buttons[5].initWithFrame(NSMakeRect (151, 30, 34, 24));
60         buttons[5].setButtonType(NSToggleButton);
61         buttons[5].setTitle(NSString.stringWith("5"w));
62         buttons[5].setTag(5);
63         buttons[5].setState(NO);
64         buttons[5].setKeyEquivalent(NSString.stringWith("5"w));
65 
66         buttons[6] = NSButton.alloc; buttons[6].initWithFrame(NSMakeRect (188, 30, 34, 24));
67         buttons[6].setButtonType(NSToggleButton);
68         buttons[6].setTitle(NSString.stringWith("6"w));
69         buttons[6].setTag(6);
70         buttons[6].setState(NO);
71         buttons[6].setKeyEquivalent(NSString.stringWith("6"w));
72 
73         buttons[7] = NSButton.alloc; buttons[7].initWithFrame(NSMakeRect (114, 57, 34, 24));
74         buttons[7].setButtonType(NSToggleButton);
75         buttons[7].setTitle(NSString.stringWith("7"w));
76         buttons[7].setTag(7);
77         buttons[7].setState(NO);
78         buttons[7].setKeyEquivalent(NSString.stringWith("7"w));
79 
80         buttons[8] = NSButton.alloc; buttons[8].initWithFrame(NSMakeRect (151, 57, 34, 24));
81         buttons[8].setButtonType(NSToggleButton);
82         buttons[8].setTitle(NSString.stringWith("8"w));
83         buttons[8].setTag(8);
84         buttons[8].setState(NO);
85         buttons[8].setKeyEquivalent(NSString.stringWith("8"w));
86 
87         buttons[9] = NSButton.alloc; buttons[9].initWithFrame(NSMakeRect (188, 57, 34, 24));
88         buttons[9].setButtonType(NSToggleButton);
89         buttons[9].setTitle(NSString.stringWith("9"w));
90         buttons[9].setTag(9);
91         buttons[9].setState(NO);
92         buttons[9].setKeyEquivalent(NSString.stringWith("9"w));
93         
94         foreach (i; 0..10){
95             buttons[i].setAction(&calcbrain.digit);
96         }
97 
98         buttons[10] = NSButton.alloc; buttons[10].initWithFrame(NSMakeRect (77, 30, 34, 24));
99         buttons[10].setButtonType(NSToggleButton);
100         buttons[10].setTitle(NSString.stringWith("."w));
101         buttons[10].setState(NO);
102         buttons[10].setKeyEquivalent(NSString.stringWith("."w));
103         buttons[10].setAction(&calcbrain.decimalSeparator);
104 
105         buttons[11] = NSButton.alloc; buttons[11].initWithFrame(NSMakeRect (77, 57, 34, 24));
106         buttons[11].setButtonType(NSToggleButton);
107         buttons[11].setTitle(NSString.stringWith("SQR"w));
108         buttons[11].setState(NO);
109         buttons[11].setKeyEquivalent(NSString.stringWith("S"w));
110         buttons[11].setAction(&calcbrain.squareRoot);
111 
112         buttons[12] = NSButton.alloc; buttons[12].initWithFrame(NSMakeRect (3, 30, 34, 24));
113         buttons[12].setButtonType(NSToggleButton);
114         buttons[12].setTitle(NSString.stringWith("+"w));
115         buttons[12].setTag(addition);
116         buttons[12].setState(NO);
117         buttons[12].setKeyEquivalent(NSString.stringWith("+"w));
118         buttons[12].setAction(&calcbrain.operation);
119 
120         buttons[13] = NSButton.alloc; buttons[13].initWithFrame(NSMakeRect (40, 30, 34, 24));
121         buttons[13].setButtonType(NSToggleButton);
122         buttons[13].setTitle(NSString.stringWith("-"w));
123         buttons[13].setTag(subtraction);
124         buttons[13].setState(NO);
125         buttons[13].setKeyEquivalent(NSString.stringWith("-"w));
126         buttons[13].setAction(&calcbrain.operation);
127 
128         buttons[14] = NSButton.alloc; buttons[14].initWithFrame(NSMakeRect (3, 57, 34, 24));
129         buttons[14].setButtonType(NSToggleButton);
130         buttons[14].setTitle(NSString.stringWith("*"w));
131         buttons[14].setTag(multiplication);
132         buttons[14].setState(NO);
133         buttons[14].setKeyEquivalent(NSString.stringWith("*"w));
134         buttons[14].setAction(&calcbrain.operation);
135 
136         buttons[15] = NSButton.alloc; buttons[15].initWithFrame(NSMakeRect (40, 57, 34, 24));
137         buttons[15].setButtonType(NSToggleButton);
138         buttons[15].setTitle(NSString.stringWith("/"w));
139         buttons[15].setTag(division);
140         buttons[15].setState(NO);
141         buttons[15].setKeyEquivalent(NSString.stringWith("/"w));
142         buttons[15].setAction(&calcbrain.operation);
143 
144         buttons[16] = NSButton.alloc; buttons[16].initWithFrame(NSMakeRect (3, 84, 34, 24));
145         buttons[16].setButtonType(NSToggleButton);
146         buttons[16].setTitle(NSString.stringWith("CL"w));
147         buttons[16].setState(NO);
148         buttons[16].setKeyEquivalent(NSString.stringWith("C"w));
149         buttons[16].setAction(&calcbrain.clear);
150 
151         buttons[17] = NSButton.alloc; buttons[17].initWithFrame(NSMakeRect (3, 3, 34, 24));
152         buttons[17].setButtonType(NSToggleButton);
153         buttons[17].setTitle(NSString.stringWith("="w));
154         buttons[17].setState(NO);
155         buttons[17].setKeyEquivalent(NSString.stringWith("="w));
156         buttons[17].setAction(&calcbrain.equal);
157 
158         this.makeFirstResponder(NSResponder(buttons[17]._id));
159 
160         foreach (ref but; buttons)
161         {
162             this.contentView().addSubview(but.contentView());
163             but.release;
164         }
165 
166         this.contentView().addSubview(display.contentView());
167         display.release;
168 
169         this.setTitle(NSString.stringWith("Calculator"w));
170         
171         this.center();
172 
173         calcbrain.setFace(this);
174     }
175 
176     void setDisplayedNumber(double aNumber, BOOL displayDecimalSeparator, int fractionalDigits)
177     {
178         import std.format, std.conv;
179         if (displayDecimalSeparator)
180         {
181             display.setStringValue(NSString.stringWith(format(format!"%%#.%df"(fractionalDigits), aNumber).to!wstring));
182         }
183         else // !displayDecimalSeparator
184             display.setStringValue(NSString.stringWith(format("%.0f", aNumber).to!wstring));
185 
186     }
187 
188     void setError(){
189         display.setStringValue(NSString.stringWith("Error"w));
190     }
191 }
192 
193 /*
194 void onClicked(id self, SEL sel, ...){
195     import std.conv;
196     import std.stdio;
197     writefln("You clicked the button with title `%s`", NSButton(self).title.UTF8String.to!string);
198 }
199 */
200 enum : NSInteger{
201     none = 0,
202     addition = 1,
203     subtraction = 2,
204     multiplication = 3,
205     division = 4
206 }