Mercurial > projects > dynamin
comparison dynamin/gui/windows_theme.d @ 0:aa4efef0f0b1
Initial commit of code.
author | Jordan Miner <jminer7@gmail.com> |
---|---|
date | Mon, 15 Jun 2009 22:10:48 -0500 |
parents | |
children | d82c7e5b037b |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:aa4efef0f0b1 |
---|---|
1 // Written in the D programming language | |
2 // www.digitalmars.com/d/ | |
3 | |
4 /* | |
5 * The contents of this file are subject to the Mozilla Public License Version | |
6 * 1.1 (the "License"); you may not use this file except in compliance with | |
7 * the License. You may obtain a copy of the License at | |
8 * http://www.mozilla.org/MPL/ | |
9 * | |
10 * Software distributed under the License is distributed on an "AS IS" basis, | |
11 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License | |
12 * for the specific language governing rights and limitations under the | |
13 * License. | |
14 * | |
15 * The Original Code is the Dynamin library. | |
16 * | |
17 * The Initial Developer of the Original Code is Jordan Miner. | |
18 * Portions created by the Initial Developer are Copyright (C) 2007-2009 | |
19 * the Initial Developer. All Rights Reserved. | |
20 * | |
21 * Contributor(s): | |
22 * Jordan Miner <jminer7@gmail.com> | |
23 * | |
24 */ | |
25 | |
26 module dynamin.gui.windows_theme; | |
27 | |
28 import dynamin.core.string; | |
29 import dynamin.all_painting; | |
30 import dynamin.all_gui; | |
31 import tango.io.Stdout; | |
32 import Utf = tango.text.convert.Utf; | |
33 version(Windows) import dynamin.c.windows; | |
34 version(Windows) import dynamin.c.windows_tmschema; | |
35 import dynamin.gui_backend; | |
36 | |
37 version(Windows) { | |
38 } else { | |
39 enum { | |
40 COLOR_SCROLLBAR = 0, | |
41 COLOR_BACKGROUND = 1, | |
42 COLOR_ACTIVECAPTION = 2, | |
43 COLOR_INACTIVECAPTION = 3, | |
44 COLOR_MENU = 4, | |
45 COLOR_WINDOW = 5, | |
46 COLOR_WINDOWFRAME = 6, | |
47 COLOR_MENUTEXT = 7, | |
48 COLOR_WINDOWTEXT = 8, | |
49 COLOR_CAPTIONTEXT = 9, | |
50 COLOR_ACTIVEBORDER = 10, | |
51 COLOR_INACTIVEBORDER = 11, | |
52 COLOR_APPWORKSPACE = 12, | |
53 COLOR_HIGHLIGHT = 13, | |
54 COLOR_HIGHLIGHTTEXT = 14, | |
55 COLOR_BTNFACE = 15, | |
56 COLOR_BTNSHADOW = 16, | |
57 COLOR_GRAYTEXT = 17, | |
58 COLOR_BTNTEXT = 18, | |
59 COLOR_INACTIVECAPTIONTEXT = 19, | |
60 COLOR_BTNHIGHLIGHT = 20, | |
61 | |
62 COLOR_3DDKSHADOW = 21, | |
63 COLOR_3DLIGHT = 22, | |
64 COLOR_INFOTEXT = 23, | |
65 COLOR_INFOBK = 24, | |
66 | |
67 COLOR_HOTLIGHT = 26, | |
68 COLOR_GRADIENTACTIVECAPTION = 27, | |
69 COLOR_GRADIENTINACTIVECAPTION = 28, | |
70 COLOR_MENUHILIGHT = 29, | |
71 COLOR_MENUBAR = 30, | |
72 | |
73 COLOR_DESKTOP = COLOR_BACKGROUND, | |
74 COLOR_3DFACE = COLOR_BTNFACE, | |
75 COLOR_3DSHADOW = COLOR_BTNSHADOW, | |
76 COLOR_3DHIGHLIGHT = COLOR_BTNHIGHLIGHT, | |
77 COLOR_3DHILIGHT = COLOR_BTNHIGHLIGHT, | |
78 COLOR_BTNHILIGHT = COLOR_BTNHIGHLIGHT | |
79 } | |
80 } | |
81 | |
82 /** | |
83 * This file/module, even though it starts with 'windows_', is not part | |
84 * of the windows backend. It is a theme that should run on any system, | |
85 * but can only show visual styles under Windows because the | |
86 * Windows API is needed. | |
87 */ | |
88 | |
89 static this() { | |
90 Theme.add(new WindowsTheme()); | |
91 } | |
92 | |
93 /** | |
94 * This theme should work with any backend, but can only paint the Windows | |
95 * classic look if not on Windows XP, Vista, or newer. | |
96 */ | |
97 class WindowsTheme : Theme { | |
98 version(Windows) { | |
99 static string defaultFont() { // TODO: rename | |
100 NONCLIENTMETRICS ncMetrics; | |
101 ncMetrics.cbSize = NONCLIENTMETRICS.sizeof; | |
102 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, | |
103 NONCLIENTMETRICS.sizeof, &ncMetrics, 0); | |
104 // TODO: need to strip the nulls off the name | |
105 return Utf.toString(ncMetrics.lfMessageFont.lfFaceName); | |
106 } | |
107 } | |
108 version(Windows) { | |
109 static void printSysColors() { | |
110 int[string] colors = [ | |
111 "COLOR_SCROLLBAR"[] : COLOR_SCROLLBAR, | |
112 "COLOR_BACKGROUND" : COLOR_BACKGROUND, | |
113 "COLOR_ACTIVECAPTION" : COLOR_ACTIVECAPTION, | |
114 "COLOR_INACTIVECAPTION" : COLOR_INACTIVECAPTION, | |
115 "COLOR_MENU" : COLOR_MENU, | |
116 "COLOR_WINDOW" : COLOR_WINDOW, | |
117 "COLOR_WINDOWFRAME" : COLOR_WINDOWFRAME, | |
118 "COLOR_MENUTEXT" : COLOR_MENUTEXT, | |
119 "COLOR_WINDOWTEXT" : COLOR_WINDOWTEXT, | |
120 "COLOR_CAPTIONTEXT" : COLOR_CAPTIONTEXT, | |
121 "COLOR_ACTIVEBORDER" : COLOR_ACTIVEBORDER, | |
122 "COLOR_INACTIVEBORDER" : COLOR_INACTIVEBORDER, | |
123 "COLOR_APPWORKSPACE" : COLOR_APPWORKSPACE, | |
124 "COLOR_HIGHLIGHT" : COLOR_HIGHLIGHT, | |
125 "COLOR_HIGHLIGHTTEXT" : COLOR_HIGHLIGHTTEXT, | |
126 "COLOR_BTNFACE" : COLOR_BTNFACE, | |
127 "COLOR_BTNSHADOW" : COLOR_BTNSHADOW, | |
128 "COLOR_GRAYTEXT" : COLOR_GRAYTEXT, | |
129 "COLOR_BTNTEXT" : COLOR_BTNTEXT, | |
130 "COLOR_INACTIVECAPTIONTEXT" : COLOR_INACTIVECAPTIONTEXT, | |
131 "COLOR_BTNHIGHLIGHT" : COLOR_BTNHIGHLIGHT, | |
132 "COLOR_3DDKSHADOW" : COLOR_3DDKSHADOW, | |
133 "COLOR_3DLIGHT" : COLOR_3DLIGHT, | |
134 "COLOR_INFOTEXT" : COLOR_INFOTEXT, | |
135 "COLOR_INFOBK" : COLOR_INFOBK, | |
136 "COLOR_HOTLIGHT" : COLOR_HOTLIGHT, | |
137 "COLOR_GRADIENTACTIVECAPTION" : COLOR_GRADIENTACTIVECAPTION, | |
138 "COLOR_GRADIENTINACTIVECAPTION" : COLOR_GRADIENTINACTIVECAPTION, | |
139 "COLOR_MENUHILIGHT" : COLOR_MENUHILIGHT, | |
140 "COLOR_MENUBAR" : COLOR_MENUBAR, | |
141 | |
142 "COLOR_DESKTOP" : COLOR_DESKTOP, | |
143 "COLOR_3DFACE" : COLOR_3DFACE, | |
144 "COLOR_3DSHADOW" : COLOR_3DSHADOW, | |
145 "COLOR_3DHIGHLIGHT" : COLOR_3DHIGHLIGHT, | |
146 "COLOR_3DHILIGHT" : COLOR_3DHILIGHT, | |
147 "COLOR_BTNHILIGHT" : COLOR_BTNHILIGHT | |
148 ]; | |
149 foreach(key, value; colors) | |
150 Stdout.format("{,-27} : {}", key, getColor(value).toUtf8).newline; | |
151 | |
152 } | |
153 } | |
154 static Color getColor(int index) { | |
155 version(Windows) { | |
156 uint sysColor = GetSysColor(index); | |
157 return Color(GetRValue(sysColor), GetGValue(sysColor), GetBValue(sysColor)); | |
158 } else { | |
159 return Color.Black; // TODO: temp to get X backend to compile | |
160 | |
161 uint sysColor = 0; | |
162 switch(sysColor) { | |
163 default: | |
164 assert(0, "error: default case hit"); | |
165 } | |
166 } | |
167 } | |
168 | |
169 //{{{ utility functions | |
170 int findUxState(Button c, int disabled, int normal, int hot, int pressed) { | |
171 if(c.state == ButtonState.Normal) | |
172 return normal; | |
173 else if(c.state == ButtonState.Hot) | |
174 return hot; | |
175 else if(c.state == ButtonState.Pressed) | |
176 return pressed; | |
177 } | |
178 | |
179 /// draws a classic check, which is 7 wide and 7 high | |
180 void drawCheck(Graphics g, real x, real y) { | |
181 g.source = getColor(COLOR_WINDOWTEXT); | |
182 auto checkYs = [2, 3, 4, 3, 2, 1, 0]; | |
183 foreach(i, cy; checkYs) { | |
184 g.moveTo(x + i + 0.5, y + cy); | |
185 g.lineTo(x + i + 0.5, y + cy + 3); | |
186 g.stroke(); | |
187 } | |
188 } | |
189 //}}} | |
190 | |
191 string name() { | |
192 return "Windows"; | |
193 } | |
194 | |
195 void Window_paint(Window c, Graphics g) { | |
196 g.source = getColor(COLOR_3DFACE); | |
197 g.paint(); | |
198 } | |
199 //{{{ Button | |
200 Size Button_bestSize(Button c) { | |
201 // default button size is 17 points tall | |
202 return Size(75, 23); | |
203 } | |
204 | |
205 void Button_paint(Button c, Graphics g) { | |
206 version(Windows) { | |
207 if(Ux.isThemeActive()) { | |
208 auto uxState = findUxState(c, PBS_DISABLED, PBS_NORMAL, PBS_HOT, PBS_PRESSED); | |
209 Ux.drawBackground(g, Rect(0, 0, c.width, c.height), "BUTTON", BP_PUSHBUTTON, uxState); | |
210 | |
211 g.source = getColor(COLOR_WINDOWTEXT); | |
212 c.paintFore(g); | |
213 return; | |
214 } | |
215 } | |
216 g.source = getColor(COLOR_3DFACE); | |
217 g.paint(); | |
218 if(c.state == ButtonState.Pressed) { | |
219 draw3dRectangle(g, 0, 0, c.width, c.height, | |
220 getColor(COLOR_3DDKSHADOW), getColor(COLOR_3DHIGHLIGHT)); | |
221 draw3dRectangle(g, 1, 1, c.width-2, c.height-2, | |
222 getColor(COLOR_3DSHADOW), getColor(COLOR_3DLIGHT)); | |
223 } else { | |
224 draw3dRectangle(g, 0, 0, c.width, c.height, | |
225 getColor(COLOR_3DHIGHLIGHT), getColor(COLOR_3DDKSHADOW)); | |
226 draw3dRectangle(g, 1, 1, c.width-2, c.height-2, | |
227 getColor(COLOR_3DLIGHT), getColor(COLOR_3DSHADOW)); | |
228 } | |
229 if(c.focused) { | |
230 g.source = getColor(COLOR_WINDOWTEXT); | |
231 g.setDash([1, 1], 0.5); | |
232 g.rectangle(3.5, 3.5, c.width-7, c.height-7); | |
233 g.stroke(); | |
234 } | |
235 g.source = getColor(COLOR_WINDOWTEXT); | |
236 c.paintFore(g); | |
237 } | |
238 //}}} | |
239 | |
240 //{{{ CheckBox | |
241 void CheckBox_paint(CheckBox c, Graphics g) { | |
242 version(Windows) { | |
243 if(Ux.isThemeActive()) { | |
244 int uxState; | |
245 if(c.checked) { | |
246 uxState = findUxState(c, CBS_CHECKEDDISABLED, CBS_CHECKEDNORMAL, CBS_CHECKEDHOT, CBS_CHECKEDPRESSED); | |
247 } else { | |
248 uxState = findUxState(c, CBS_UNCHECKEDDISABLED, CBS_UNCHECKEDNORMAL, CBS_UNCHECKEDHOT, CBS_UNCHECKEDPRESSED); | |
249 } | |
250 Ux.drawBackground(g, Rect(0, 0, 13, c.height), "BUTTON", BP_CHECKBOX, uxState); | |
251 | |
252 g.source = getColor(COLOR_WINDOWTEXT); | |
253 g.translate(15, 0); | |
254 c.paintFore(g); | |
255 return; | |
256 } | |
257 } | |
258 | |
259 if(c.state == ButtonState.Pressed) | |
260 g.source = getColor(COLOR_3DFACE); | |
261 else | |
262 g.source = getColor(COLOR_WINDOW); | |
263 | |
264 g.rectangle(0, 0, 13, 13); | |
265 g.fill(); | |
266 draw3dRectangle(g, 0, 0, 13, 13, | |
267 getColor(COLOR_3DSHADOW), getColor(COLOR_3DHIGHLIGHT)); | |
268 draw3dRectangle(g, 1, 1, 11, 11, | |
269 getColor(COLOR_3DDKSHADOW), getColor(COLOR_3DLIGHT)); | |
270 | |
271 if(c.checked) | |
272 drawCheck(g, 3, 3); | |
273 // drawCheck(g, 0, 0, 13, 13); | |
274 | |
275 g.source = getColor(COLOR_WINDOWTEXT); | |
276 g.translate(15, 0); | |
277 c.paintFore(g); | |
278 } | |
279 //}}} | |
280 | |
281 //{{{ RadioButton | |
282 void RadioButton_paint(CheckBox c, Graphics g) { | |
283 version(Windows) { | |
284 if(Ux.isThemeActive()) { | |
285 int uxState; | |
286 if(c.checked) { | |
287 uxState = findUxState(c, RBS_CHECKEDDISABLED, RBS_CHECKEDNORMAL, RBS_CHECKEDHOT, RBS_CHECKEDPRESSED); | |
288 } else { | |
289 uxState = findUxState(c, RBS_UNCHECKEDDISABLED, RBS_UNCHECKEDNORMAL, RBS_UNCHECKEDHOT, RBS_UNCHECKEDPRESSED); | |
290 } | |
291 Ux.drawBackground(g, Rect(0, 0, 13, c.height), "BUTTON", BP_RADIOBUTTON, uxState); | |
292 | |
293 g.source = getColor(COLOR_WINDOWTEXT); | |
294 g.translate(15, 0); | |
295 c.paintFore(g); | |
296 return; | |
297 } | |
298 } | |
299 | |
300 if(c.state == ButtonState.Pressed) | |
301 g.source = getColor(COLOR_3DFACE); | |
302 else | |
303 g.source = getColor(COLOR_WINDOW); | |
304 | |
305 g.rectangle(2, 2, 8, 8); | |
306 g.fill(); | |
307 const double[][] outerLines = [ | |
308 [1.5, 8, 1.5, 10], [0.5, 4, 0.5, 8], | |
309 [1.5, 2, 1.5, 4], [2.0, 1.5, 4, 1.5], | |
310 [4.0, 0.5, 8, 0.5], [8.0, 1.5, 10, 1.5]]; | |
311 const double[][] innerLines = [ | |
312 [2.5, 8, 2.5, 9], [1.5, 4, 1.5, 8], | |
313 [2.5, 2, 2.5, 4], [3.0, 2.5, 4, 2.5], | |
314 [4.0, 1.5, 8, 1.5], [8.0, 2.5, 10, 2.5]]; | |
315 g.source = getColor(COLOR_3DSHADOW); | |
316 foreach(line; outerLines) { | |
317 g.moveTo(line[0], line[1]); | |
318 g.lineTo(line[2], line[3]); | |
319 g.stroke(); | |
320 } | |
321 g.source = getColor(COLOR_3DDKSHADOW); | |
322 foreach(line; innerLines) { | |
323 g.moveTo(line[0], line[1]); | |
324 g.lineTo(line[2], line[3]); | |
325 g.stroke(); | |
326 } | |
327 g.source = getColor(COLOR_3DHIGHLIGHT); | |
328 foreach(line; outerLines) { | |
329 g.moveTo(12-line[0], 12-line[1]); | |
330 g.lineTo(12-line[2], 12-line[3]); | |
331 g.stroke(); | |
332 } | |
333 g.source = getColor(COLOR_3DLIGHT); | |
334 foreach(line; innerLines) { | |
335 g.moveTo(12-line[0], 12-line[1]); | |
336 g.lineTo(12-line[2], 12-line[3]); | |
337 g.stroke(); | |
338 } | |
339 | |
340 if(c.checked) { | |
341 g.source = getColor(COLOR_WINDOWTEXT); | |
342 g.translate(4, 4); | |
343 g.rectangle(1, 0, 2, 1); | |
344 g.rectangle(0, 1, 4, 2); | |
345 g.rectangle(1, 3, 2, 1); | |
346 g.fill(); | |
347 g.translate(-4, -4); | |
348 } | |
349 | |
350 g.source = getColor(COLOR_WINDOWTEXT); | |
351 g.translate(15, 0); | |
352 c.paintFore(g); | |
353 } | |
354 //}}} | |
355 | |
356 //{{{ ScrollBar | |
357 void ScrollBarTrack_paint(ScrollBarTrack c, Graphics g) { | |
358 version(Windows) { | |
359 if(Ux.isThemeActive()) { | |
360 auto uxState = findUxState(c, SCRBS_DISABLED, SCRBS_NORMAL, SCRBS_HOT, SCRBS_PRESSED); | |
361 if(cast(VScrollBar)c.parent) { | |
362 Ux.drawBackground(g, Rect(0, 0, c.width, c.height), "SCROLLBAR", SBP_UPPERTRACKVERT, uxState); | |
363 } else { | |
364 Ux.drawBackground(g, Rect(0, 0, c.width, c.height), "SCROLLBAR", SBP_UPPERTRACKHORZ, uxState); | |
365 } | |
366 return; | |
367 } | |
368 } | |
369 | |
370 Color c1 = getColor(COLOR_3DHIGHLIGHT), c2 = getColor(COLOR_SCROLLBAR); | |
371 if(c.state == ButtonState.Pressed) { | |
372 c1.invert(); | |
373 c2.invert(); | |
374 } | |
375 int x = cast(int)round(c.x), y = cast(int)round(c.y); | |
376 drawCheckerboard(g, -(x & 1), -(y & 1), c.width + 1, c.height + 1, | |
377 c1, c2); | |
378 } | |
379 | |
380 void ScrollBarThumb_paint(ScrollBarThumb c, Graphics g) { | |
381 version(Windows) { | |
382 if(Ux.isThemeActive()) { | |
383 auto uxState = findUxState(c, SCRBS_DISABLED, SCRBS_NORMAL, SCRBS_HOT, SCRBS_PRESSED); | |
384 if(cast(VScrollBar)c.parent) { | |
385 Ux.drawBackground(g, Rect(0, 0, c.width, c.height), "SCROLLBAR", SBP_THUMBBTNVERT, uxState); | |
386 if(c.height > 16) | |
387 Ux.drawBackground(g, Rect(0, 0, c.width, c.height), "SCROLLBAR", SBP_GRIPPERVERT, 0); | |
388 } else { | |
389 Ux.drawBackground(g, Rect(0, 0, c.width, c.height), "SCROLLBAR", SBP_THUMBBTNHORZ, uxState); | |
390 if(c.width > 16) | |
391 Ux.drawBackground(g, Rect(0, 0, c.width, c.height), "SCROLLBAR", SBP_GRIPPERHORZ, 0); | |
392 } | |
393 return; | |
394 } | |
395 } | |
396 | |
397 g.source = getColor(COLOR_3DFACE); | |
398 g.paint(); | |
399 draw3dRectangle(g, 0, 0, c.width, c.height, | |
400 getColor(COLOR_3DLIGHT), getColor(COLOR_3DDKSHADOW)); | |
401 draw3dRectangle(g, 1, 1, c.width-2, c.height-2, | |
402 getColor(COLOR_3DHIGHLIGHT), getColor(COLOR_3DSHADOW)); | |
403 } | |
404 | |
405 real ScrollBar_size() { | |
406 // TODO: all themes should get this from SystemGui.ScrollBarSize | |
407 version(Windows) | |
408 return GetSystemMetrics(SM_CXVSCROLL); | |
409 else | |
410 return 18; | |
411 } | |
412 | |
413 void ArrowButton_paint(ArrowButton c, Graphics g) { | |
414 version(Windows) { | |
415 if(Ux.isThemeActive()) { | |
416 int uxState; | |
417 if(c.direction == ArrowDirection.Left) | |
418 uxState = findUxState(c, ABS_LEFTDISABLED, ABS_LEFTNORMAL, ABS_LEFTHOT, ABS_LEFTPRESSED); | |
419 else if(c.direction == ArrowDirection.Right) | |
420 uxState = findUxState(c, ABS_RIGHTDISABLED, ABS_RIGHTNORMAL, ABS_RIGHTHOT, ABS_RIGHTPRESSED); | |
421 else if(c.direction == ArrowDirection.Up) | |
422 uxState = findUxState(c, ABS_UPDISABLED, ABS_UPNORMAL, ABS_UPHOT, ABS_UPPRESSED); | |
423 else | |
424 uxState = findUxState(c, ABS_DOWNDISABLED, ABS_DOWNNORMAL, ABS_DOWNHOT, ABS_DOWNPRESSED); | |
425 Ux.drawBackground(g, Rect(0, 0, c.width, c.height), "SCROLLBAR", SBP_ARROWBTN, uxState); | |
426 return; | |
427 } | |
428 } | |
429 | |
430 g.source = getColor(COLOR_3DFACE); | |
431 g.paint(); | |
432 if(c.state == ButtonState.Pressed) { | |
433 g.source = getColor(COLOR_3DDKSHADOW); | |
434 g.rectangle(0.5, 0.5, c.width-1, c.height-1); | |
435 g.stroke(); | |
436 } else { | |
437 draw3dRectangle(g, 0, 0, c.width, c.height, | |
438 getColor(COLOR_3DLIGHT), getColor(COLOR_3DDKSHADOW)); | |
439 draw3dRectangle(g, 1, 1, c.width-2, c.height-2, | |
440 getColor(COLOR_3DHIGHLIGHT), getColor(COLOR_3DSHADOW)); | |
441 } | |
442 } | |
443 //}}} | |
444 | |
445 //{{{ Scrollable | |
446 BorderSize Scrollable_borderSize(Scrollable c) { | |
447 return BorderSize(2, 2, 2, 2); | |
448 } | |
449 | |
450 void Scrollable_paint(Scrollable c, Graphics g) { | |
451 version(Windows) { | |
452 if(Ux.isThemeActive()) { | |
453 Ux.drawBackground(g, Rect(0, 0, c.width, c.height), "EDIT", EP_EDITTEXT, ETS_NORMAL); | |
454 // TODO: get this working | |
455 //g.Source = c.backColor; | |
456 g.source = getColor(COLOR_WINDOW); | |
457 g.rectangle(1.5, 1.5, c.width-3, c.height-3); | |
458 g.stroke(); | |
459 return; | |
460 } | |
461 } | |
462 draw3dRectangle(g, 0, 0, c.width, c.height, | |
463 getColor(COLOR_3DSHADOW), getColor(COLOR_3DHIGHLIGHT)); | |
464 draw3dRectangle(g, 1, 1, c.width-2, c.height-2, | |
465 getColor(COLOR_3DDKSHADOW), getColor(COLOR_3DLIGHT)); | |
466 } | |
467 //}}} | |
468 | |
469 //{{{ Notebook | |
470 BorderSize Notebook_borderSize(Notebook c) { | |
471 version(Windows) { | |
472 if(Ux.isThemeActive()) | |
473 return BorderSize(2, 2, 4, 4); | |
474 } | |
475 return BorderSize(2, 2, 2, 2); | |
476 } | |
477 void Tab_paint(TabPage page, Notebook c, Graphics g) { | |
478 version(Windows) { | |
479 if(Ux.isThemeActive()) { | |
480 g.translate(page.tabLocation); | |
481 //auto uxState = findUxState(c, PBS_DISABLED, PBS_NORMAL, PBS_HOT, PBS_PRESSED); | |
482 auto uxState = TIS_NORMAL; | |
483 BorderSize selectedDelta; | |
484 if(page is c.selectedTabPage) { | |
485 uxState = TIS_SELECTED; | |
486 selectedDelta = BorderSize(2, 2, 2, 2); | |
487 } | |
488 Ux.drawBackground(g, Point() + page.tabSize + selectedDelta, "TAB", TABP_TABITEM, uxState); | |
489 g.drawText(page.text, 5, (page.tabSize.height-g.getTextExtents(page.text).height)/2); | |
490 g.translate(-page.tabLocation); | |
491 return; | |
492 } | |
493 } | |
494 g.translate(page.tabLocation); | |
495 g.source = getColor(COLOR_3DHIGHLIGHT); | |
496 g.moveTo(0.5, 2); | |
497 g.lineTo(0.5, page.tabSize.height); | |
498 g.moveTo(1, 1.5); | |
499 g.lineTo(2, 1.5); | |
500 g.moveTo(2, 0.5); | |
501 g.lineTo(page.tabSize.width-2, 0.5); | |
502 g.stroke(); | |
503 g.source = Color(128, 128, 128); | |
504 g.moveTo(page.tabSize.width-1.5, 2); | |
505 g.lineTo(page.tabSize.width-1.5, page.tabSize.height); | |
506 g.stroke(); | |
507 g.source = Color(64, 64, 64); | |
508 g.moveTo(page.tabSize.width-2, 1.5); | |
509 g.lineTo(page.tabSize.width-1, 1.5); | |
510 g.moveTo(page.tabSize.width-0.5, 2); | |
511 g.lineTo(page.tabSize.width-0.5, page.tabSize.height); | |
512 g.stroke(); | |
513 g.source = getColor(COLOR_WINDOWTEXT); | |
514 g.drawText(page.text, 5, (page.tabSize.height-g.getTextExtents(page.text).height)/2); | |
515 g.translate(-page.tabLocation); | |
516 } | |
517 void Notebook_paint(Notebook c, Graphics g) { | |
518 version(Windows) { | |
519 if(Ux.isThemeActive()) { | |
520 //auto uxState = findUxState(c, PBS_DISABLED, PBS_NORMAL, PBS_HOT, PBS_PRESSED); | |
521 Ux.drawBackground(g, Rect(0, c._tabAreaSize, c.width, c.height-c._tabAreaSize), "TAB", TABP_PANE, 0); | |
522 g.save(); | |
523 g.rectangle(4, 4, c.width-8, c.height-8); | |
524 g.clip(); | |
525 for(float i = 4; i < c.width-8+10; i += 10) | |
526 Ux.drawBackground(g, Rect(i, c._tabAreaSize+4, 10, c.height*1.7-8-(c._tabAreaSize+4)), "TAB", TABP_BODY, 0); | |
527 g.restore(); | |
528 | |
529 return; | |
530 } | |
531 } | |
532 draw3dRectangle(g, 0, c._tabAreaSize, c.width, c.height, | |
533 getColor(COLOR_3DHIGHLIGHT), Color(64, 64, 64)); | |
534 draw3dRectangle(g, 1, c._tabAreaSize+1, c.width-2, c.height-2, | |
535 Color(212, 208, 200), Color(128, 128, 128)); | |
536 | |
537 } | |
538 //}}} | |
539 | |
540 } | |
541 |