1 /*
2 * Copyright (c) 1997 - 2001 Hansj�rg Malthaner
3 *
4 * This file is part of the Simutrans project under the artistic licence.
5 * (see licence.txt)
6 */
7
8 /* this file has all functions for variable gui elements */
9
10
11 #include "gui_theme.h"
12 #include "../simskin.h"
13 #include "../simmenu.h"
14 #include "../simsys.h"
15 #include "../dataobj/environment.h"
16 #include "../dataobj/tabfile.h"
17 #include "components/gui_button.h"
18 #include "components/gui_tab_panel.h"
19 #include "../descriptor/skin_desc.h"
20 #include "../descriptor/reader/obj_reader.h"
21
22 /**
23 * Colours
24 */
25 PIXVAL gui_theme_t::gui_color_text;
26 PIXVAL gui_theme_t::gui_color_text_highlight;
27 PIXVAL gui_theme_t::gui_color_text_shadow;
28 PIXVAL gui_theme_t::gui_color_text_title;
29 PIXVAL gui_theme_t::gui_color_text_strong;
30 PIXVAL gui_theme_t::gui_color_text_minus;
31 PIXVAL gui_theme_t::gui_color_text_plus;
32 PIXVAL gui_theme_t::gui_color_text_unused;
33 PIXVAL gui_theme_t::gui_color_edit_text;
34 PIXVAL gui_theme_t::gui_color_edit_text_selected;
35 PIXVAL gui_theme_t::gui_color_edit_text_disabled;
36 PIXVAL gui_theme_t::gui_color_edit_background_selected;
37 PIXVAL gui_theme_t::gui_color_edit_beam;
38 PIXVAL gui_theme_t::gui_color_chart_background;
39 PIXVAL gui_theme_t::gui_color_chart_lines_zero;
40 PIXVAL gui_theme_t::gui_color_chart_lines_odd;
41 PIXVAL gui_theme_t::gui_color_chart_lines_even;
42 PIXVAL gui_theme_t::gui_color_list_text_selected_focus;
43 PIXVAL gui_theme_t::gui_color_list_text_selected_nofocus;
44 PIXVAL gui_theme_t::gui_color_list_background_selected_f;
45 PIXVAL gui_theme_t::gui_color_list_background_selected_nf;
46 PIXVAL gui_theme_t::gui_color_button_text;
47 PIXVAL gui_theme_t::gui_color_button_text_disabled;
48 PIXVAL gui_theme_t::gui_color_button_text_selected;
49 PIXVAL gui_theme_t::gui_color_colored_button_text;
50 PIXVAL gui_theme_t::gui_color_colored_button_text_selected;
51 PIXVAL gui_theme_t::gui_color_checkbox_text;
52 PIXVAL gui_theme_t::gui_color_checkbox_text_disabled;
53 PIXVAL gui_theme_t::gui_color_ticker_background;
54 PIXVAL gui_theme_t::gui_color_ticker_divider;
55 PIXVAL gui_theme_t::gui_color_statusbar_text;
56 PIXVAL gui_theme_t::gui_color_statusbar_background;
57 PIXVAL gui_theme_t::gui_color_statusbar_divider;
58 PIXVAL gui_theme_t::gui_highlight_color;
59 PIXVAL gui_theme_t::gui_shadow_color;
60
61 /**
62 * Max Kielland
63 * These are the built in default theme element sizes and
64 * are overridden by the PAK file if a new image is defined.
65 */
66 scr_size gui_theme_t::gui_button_size;
67 scr_size gui_theme_t::gui_button_text_offset;
68 scr_size gui_theme_t::gui_color_button_size;
69 scr_size gui_theme_t::gui_color_button_text_offset;
70 scr_size gui_theme_t::gui_divider_size;
71 scr_size gui_theme_t::gui_checkbox_size;
72 scr_size gui_theme_t::gui_pos_button_size;
73 scr_size gui_theme_t::gui_arrow_left_size;
74 scr_size gui_theme_t::gui_arrow_right_size;
75 scr_size gui_theme_t::gui_arrow_up_size;
76 scr_size gui_theme_t::gui_arrow_down_size;
77 scr_size gui_theme_t::gui_scrollbar_size;
78 scr_size gui_theme_t::gui_min_scrollbar_size;
79 scr_size gui_theme_t::gui_label_size;
80 scr_size gui_theme_t::gui_edit_size;
81 scr_size gui_theme_t::gui_gadget_size;
82 scr_size gui_theme_t::gui_indicator_size;
83 scr_coord gui_theme_t::gui_focus_offset;
84 scr_coord gui_theme_t::gui_button_text_offset_right;
85 scr_coord gui_theme_t::gui_color_button_text_offset_right;
86
87 KOORD_VAL gui_theme_t::gui_titlebar_height;
88 KOORD_VAL gui_theme_t::gui_frame_left;
89 KOORD_VAL gui_theme_t::gui_frame_top;
90 KOORD_VAL gui_theme_t::gui_frame_right;
91 KOORD_VAL gui_theme_t::gui_frame_bottom;
92 KOORD_VAL gui_theme_t::gui_hspace;
93 KOORD_VAL gui_theme_t::gui_vspace;
94
95 /* those are the 3x3 images which are used for stretching
96 * also 1x3 and 3x1 subsets are possible
97 * first entry is the normal state
98 * second entry is the selected state
99 * third entry is disabled state
100 * button has a fourth one, which is the mask for the background color blending
101 */
102 stretch_map_t gui_theme_t::button_tiles[3];
103 stretch_map_t gui_theme_t::button_color_tiles[2];
104 stretch_map_t gui_theme_t::round_button_tiles[3];
105 stretch_map_t gui_theme_t::h_scroll_back_tiles;
106 stretch_map_t gui_theme_t::h_scroll_knob_tiles;
107 stretch_map_t gui_theme_t::v_scroll_back_tiles;
108 stretch_map_t gui_theme_t::v_scroll_knob_tiles;
109 stretch_map_t gui_theme_t::divider;
110 stretch_map_t gui_theme_t::editfield;
111 stretch_map_t gui_theme_t::listbox;
112 stretch_map_t gui_theme_t::windowback;
113
114 // and the simple buttons
115 image_id gui_theme_t::arrow_button_left_img[3];
116 image_id gui_theme_t::arrow_button_right_img[3];
117 image_id gui_theme_t::arrow_button_up_img[3];
118 image_id gui_theme_t::arrow_button_down_img[3];
119 image_id gui_theme_t::check_button_img[3];
120 image_id gui_theme_t::pos_button_img[3];
121
122 bool gui_theme_t::gui_drop_shadows;
123
124 /**
125 * Initializes theme related parameters to hard coded default values.
126 * @author Max Kielland
127 */
init_gui_defaults()128 void gui_theme_t::init_gui_defaults()
129 {
130 gui_color_text = color_idx_to_rgb(COL_BLACK);
131 gui_color_text_highlight = color_idx_to_rgb(COL_WHITE);
132 gui_color_text_shadow = color_idx_to_rgb(COL_BLACK);
133 gui_color_text_title = color_idx_to_rgb(207);
134 gui_color_text_strong = color_idx_to_rgb(COL_RED);
135 gui_color_text_minus = color_idx_to_rgb(COL_RED);
136 gui_color_text_plus = color_idx_to_rgb(COL_BLACK);
137 gui_color_text_unused = color_idx_to_rgb(COL_YELLOW);
138
139 gui_color_edit_text = color_idx_to_rgb(COL_WHITE);
140 gui_color_edit_text_selected = color_idx_to_rgb(COL_GREY5);
141 gui_color_edit_text_disabled = color_idx_to_rgb(COL_GREY3);
142 gui_color_edit_background_selected = color_idx_to_rgb(COL_GREY2);
143 gui_color_edit_beam = color_idx_to_rgb(COL_WHITE);
144
145 gui_color_chart_background = color_idx_to_rgb(MN_GREY1);
146 gui_color_chart_lines_zero = color_idx_to_rgb(MN_GREY4);
147 gui_color_chart_lines_odd = color_idx_to_rgb(COL_WHITE);
148 gui_color_chart_lines_even = color_idx_to_rgb(MN_GREY0);
149
150 gui_color_list_text_selected_focus = color_idx_to_rgb(COL_WHITE);
151 gui_color_list_text_selected_nofocus = color_idx_to_rgb(MN_GREY3);
152 gui_color_list_background_selected_f = color_idx_to_rgb(COL_BLUE);
153 gui_color_list_background_selected_nf = color_idx_to_rgb(COL_LIGHT_BLUE);
154
155 gui_color_button_text = color_idx_to_rgb(COL_BLACK);
156 gui_color_button_text_disabled = color_idx_to_rgb(MN_GREY0);
157 gui_color_button_text_selected = color_idx_to_rgb(COL_BLACK);
158
159 gui_color_colored_button_text = color_idx_to_rgb(COL_BLACK);
160 gui_color_colored_button_text_selected = color_idx_to_rgb(COL_WHITE);
161 gui_color_checkbox_text = color_idx_to_rgb(COL_BLACK);
162 gui_color_checkbox_text_disabled = color_idx_to_rgb(MN_GREY0);
163 gui_color_ticker_background = color_idx_to_rgb(MN_GREY2);
164 gui_color_ticker_divider = color_idx_to_rgb(COL_BLACK);
165 gui_color_statusbar_text = color_idx_to_rgb(COL_BLACK);
166 gui_color_statusbar_background = color_idx_to_rgb(MN_GREY1);
167 gui_color_statusbar_divider = color_idx_to_rgb(MN_GREY4);
168
169 gui_highlight_color = color_idx_to_rgb(MN_GREY4);
170 gui_shadow_color = color_idx_to_rgb(MN_GREY0);
171
172 gui_button_size = scr_size(92,14);
173 gui_color_button_size = scr_size(92,16);
174 gui_button_text_offset = scr_size(0,0);
175 gui_color_button_text_offset = scr_size(0,0);
176 gui_divider_size = scr_size(92,2+D_V_SPACE*2);
177 gui_checkbox_size = scr_size(10,10);
178 gui_pos_button_size = scr_size(14,LINESPACE);
179 gui_arrow_left_size = scr_size(14,14);
180 gui_arrow_right_size = scr_size(14,14);
181 gui_arrow_up_size = scr_size(14,14);
182 gui_arrow_down_size = scr_size(14,14);
183 gui_scrollbar_size = scr_size(14,14);
184 gui_min_scrollbar_size = scr_size(3,3);
185 gui_label_size = scr_size(92,LINESPACE);
186 gui_edit_size = scr_size(92,max(LINESPACE+2, max(D_ARROW_LEFT_HEIGHT, D_ARROW_RIGHT_HEIGHT) ));
187 gui_gadget_size = scr_size(16,16);
188 gui_indicator_size = scr_size(20,4);
189 gui_focus_offset = scr_coord(1,1);
190
191 gui_titlebar_height = 16;
192 gui_frame_left = 10;
193 gui_frame_top = 10;
194 gui_frame_right = 10;
195 gui_frame_bottom = 10;
196 gui_hspace = 4;
197 gui_vspace = 4;
198 gui_divider_size.h = D_V_SPACE*2;
199
200 gui_drop_shadows = false;
201 }
202
203
204 // helper for easier init
init_size_from_image(const image_t * image,scr_size & k)205 void gui_theme_t::init_size_from_image( const image_t *image, scr_size &k )
206 {
207 if( image ) {
208 k = scr_size(image->x+image->w,image->y+image->h);
209 }
210 }
211
212
213 /**
214 * Lazy button image number init
215 */
init_gui_from_images()216 void gui_theme_t::init_gui_from_images()
217 {
218 // Calculate posbutton size
219 if( skinverwaltung_t::divider == NULL ) {
220 // usually there should be a default theme which would provided missing images even for outdated themes
221 dbg->fatal( "gui_theme_t::init_gui_themes", "Wrong theme loaded" );
222 }
223
224 init_size_from_image( skinverwaltung_t::posbutton->get_image( SKIN_BUTTON_POS ), gui_pos_button_size );
225 init_size_from_image( skinverwaltung_t::check_button->get_image( SKIN_BUTTON_CHECKBOX ), gui_checkbox_size );
226 for( int i=0; i<3; i++ ) {
227 pos_button_img[i] = skinverwaltung_t::posbutton->get_image_id( SKIN_BUTTON_POS+i );
228 check_button_img[i] = skinverwaltung_t::check_button->get_image_id( SKIN_BUTTON_CHECKBOX+i );
229 }
230
231 // Normal buttons (colorful ones)
232 scr_coord_val y = gui_button_size.h;
233 scr_size k;
234 init_size_from_image( skinverwaltung_t::button->get_image( SKIN_BUTTON_SIDE_LEFT ), k );
235 y = max( y, k.h );
236 init_size_from_image( skinverwaltung_t::button->get_image( SKIN_BUTTON_SIDE_RIGHT ), k );
237 y = max( y, k.h );
238 init_size_from_image( skinverwaltung_t::button->get_image( SKIN_BUTTON_BODY ), k );
239 y = max( y, k.h );
240 for( int i=0; i<3; i++ ) {
241 for( int j=0; j<9; j++ ) {
242 button_tiles[i][j%3][j/3] = skinverwaltung_t::button->get_image_id( i*9+j );
243 }
244 }
245 image_id has_second_mask;
246 for( int i=0; i<2; i++ ) {
247 has_second_mask = 0xFFFF;
248 for( int j=0; j<9; j++ ) {
249 button_color_tiles[i][j%3][j/3] = skinverwaltung_t::button->get_image_id( i*9+j+27 );
250 has_second_mask &= button_color_tiles[i][j%3][j/3];
251 }
252 }
253 if( has_second_mask == 0xFFFF ) {
254 // has no second mask => copy first
255 for( int j=0; j<9; j++ ) {
256 button_color_tiles[1][j%3][j/3] = button_color_tiles[0][j%3][j/3];
257 }
258 }
259
260 // Round buttons
261 for( int i=0; i<3; i++ ) {
262 for( int j=0; j<9; j++ ) {
263 round_button_tiles[i][j%3][j/3] = skinverwaltung_t::round_button->get_image_id( i*9+j );
264 }
265 }
266
267 // background for editfields, listbuttons, and windows
268 for( int j=0; j<9; j++ ) {
269 editfield[j%3][j/3] = skinverwaltung_t::editfield->get_image_id( j );
270 listbox[j%3][j/3] = skinverwaltung_t::listbox->get_image_id( j );
271 windowback[j%3][j/3] = skinverwaltung_t::back->get_image_id( j );
272 }
273
274 // Divider (vspace will be added later on)
275 init_size_from_image( skinverwaltung_t::divider->get_image(1), gui_divider_size );
276 for( int i=0; i<3; i++ ) {
277 divider[i][0] = skinverwaltung_t::divider->get_image_id( i );
278 divider[i][1] = IMG_EMPTY;
279 divider[i][2] = IMG_EMPTY;
280 }
281
282 // Calculate arrow size
283 init_size_from_image( skinverwaltung_t::scrollbar->get_image( SKIN_BUTTON_ARROW_LEFT ), gui_arrow_left_size );
284 init_size_from_image( skinverwaltung_t::scrollbar->get_image( SKIN_BUTTON_ARROW_RIGHT ), gui_arrow_right_size );
285 init_size_from_image( skinverwaltung_t::scrollbar->get_image( SKIN_BUTTON_ARROW_UP ), gui_arrow_up_size );
286 init_size_from_image( skinverwaltung_t::scrollbar->get_image( SKIN_BUTTON_ARROW_DOWN ), gui_arrow_down_size );
287 for( int i=0; i<3; i++ ) {
288 arrow_button_left_img[i] = skinverwaltung_t::scrollbar->get_image_id( SKIN_BUTTON_ARROW_LEFT+i );
289 arrow_button_right_img[i] = skinverwaltung_t::scrollbar->get_image_id( SKIN_BUTTON_ARROW_RIGHT+i );
290 arrow_button_up_img[i] = skinverwaltung_t::scrollbar->get_image_id( SKIN_BUTTON_ARROW_UP+i );
291 arrow_button_down_img[i] = skinverwaltung_t::scrollbar->get_image_id( SKIN_BUTTON_ARROW_DOWN+i );
292 }
293 if( gui_theme_t::gui_arrow_right_size != gui_theme_t::gui_arrow_left_size ) {
294 dbg->warning( "gui_theme_t::themes_init()", "Size of left and right arrows differ" );
295 }
296 if( gui_theme_t::gui_arrow_up_size != gui_theme_t::gui_arrow_down_size ) {
297 dbg->warning( "gui_theme_t::themes_init()", "Size of up and down arrows differ" );
298 }
299
300 // now init this button dependent size here too
301 gui_edit_size = scr_size(92,max(LINESPACE+2, max(D_ARROW_LEFT_HEIGHT, D_ARROW_RIGHT_HEIGHT) ));
302
303 // init horizontal scrollbar buttons
304 for( int i=0; i<3; i++ ) {
305 h_scroll_back_tiles[i][0] = skinverwaltung_t::scrollbar->get_image_id( SKIN_SCROLLBAR_H_BACKGROUND_LEFT+i );
306 h_scroll_back_tiles[i][1] = IMG_EMPTY;
307 h_scroll_back_tiles[i][2] = IMG_EMPTY;
308 h_scroll_knob_tiles[i][0] = skinverwaltung_t::scrollbar->get_image_id( SKIN_SCROLLBAR_H_KNOB_LEFT+i );
309 h_scroll_knob_tiles[i][1] = IMG_EMPTY;
310 h_scroll_knob_tiles[i][2] = IMG_EMPTY;
311 }
312
313 // init vertical scrollbar buttons
314 for( int i=0; i<3; i++ ) {
315 v_scroll_back_tiles[0][i] = skinverwaltung_t::scrollbar->get_image_id( SKIN_SCROLLBAR_V_BACKGROUND_TOP+i );
316 v_scroll_back_tiles[1][i] = IMG_EMPTY;
317 v_scroll_back_tiles[2][i] = IMG_EMPTY;
318 v_scroll_knob_tiles[0][i] = skinverwaltung_t::scrollbar->get_image_id( SKIN_SCROLLBAR_V_KNOB_TOP+i );
319 v_scroll_knob_tiles[1][i] = IMG_EMPTY;
320 v_scroll_knob_tiles[2][i] = IMG_EMPTY;
321 }
322
323 // Calculate V scrollbar size
324 {
325 scr_size back, front;
326 init_size_from_image( skinverwaltung_t::scrollbar->get_image( SKIN_SCROLLBAR_V_BACKGROUND ), back );
327 init_size_from_image( skinverwaltung_t::scrollbar->get_image( SKIN_SCROLLBAR_V_KNOB_BODY ), front );
328 gui_scrollbar_size.w = max(front.w, back.w);
329
330 // Calculate H scrollbar size
331 init_size_from_image( skinverwaltung_t::scrollbar->get_image( SKIN_SCROLLBAR_H_BACKGROUND ), back );
332 init_size_from_image( skinverwaltung_t::scrollbar->get_image( SKIN_SCROLLBAR_H_KNOB_BODY ), front );
333 gui_scrollbar_size.h = max(front.h, back.h);
334
335 // calculate minimum width
336 init_size_from_image( skinverwaltung_t::scrollbar->get_image( SKIN_SCROLLBAR_H_KNOB_LEFT ), back );
337 init_size_from_image( skinverwaltung_t::scrollbar->get_image( SKIN_SCROLLBAR_H_KNOB_RIGHT ), front );
338 gui_min_scrollbar_size.w = back.w + front.w;
339
340 // calculate minimum height
341 init_size_from_image( skinverwaltung_t::scrollbar->get_image( SKIN_SCROLLBAR_V_KNOB_TOP ), back );
342 init_size_from_image( skinverwaltung_t::scrollbar->get_image( SKIN_SCROLLBAR_V_KNOB_BOTTOM ), front );
343 gui_min_scrollbar_size.h = back.h + front.h;
344 }
345
346 // gadgets
347 init_size_from_image( skinverwaltung_t::gadget->get_image( SKIN_GADGET_CLOSE ), gui_gadget_size );
348 }
349
350
351 /**
352 * Reads theme configuration data, still not final
353 * @author prissi
354 *
355 * Max Kielland:
356 * Note, there will be a theme manager later on and
357 * each gui object will find their own parameters by
358 * themselves after registering its class to the theme
359 * manager. This will be done as the last step in
360 * the chain when loading a theme.
361 */
themes_init(const char * file_name,bool init_fonts)362 bool gui_theme_t::themes_init(const char *file_name, bool init_fonts )
363 {
364 tabfile_t themesconf;
365
366 // first take user data, then user global data
367 if( !themesconf.open(file_name) ) {
368 dbg->warning("simwin.cc themes_init()", "Can't read themes from %s", file_name );
369 return false;
370 }
371
372 // define a default even when stuff is missing from the table
373 init_gui_defaults();
374
375 tabfileobj_t contents;
376 themesconf.read(contents);
377
378 // theme name to find out current theme
379 std::string theme_name = contents.get( "name" );
380
381 // reload current font if requested size differs and we are allowed to do so
382 uint8 new_size = contents.get_int("font_size", env_t::fontsize );
383 if( init_fonts && new_size!=0 && LINESPACE!=new_size ) {
384 if( display_load_font( env_t::fontname.c_str() ) ) {
385 env_t::fontsize = new_size;
386 }
387 }
388
389 // first get the images ( to be able to overload default sizes)
390 const std::string buttonpak = contents.get("themeimages");
391 if( buttonpak.length()>0 ) {
392 std::string path;
393 char *pathname = strdup(file_name);
394 if( char *s = strrchr( pathname, '/' ) ) {
395 *s = 0;
396 }
397 else if( char *s = strrchr( pathname, '\\' ) ) {
398 *s = 0;
399 }
400 dr_chdir( pathname );
401 obj_reader_t::read_file(buttonpak.c_str());
402 gui_theme_t::init_gui_from_images();
403 free(pathname);
404 }
405
406 // first the stuff for the dialogues
407 gui_theme_t::gui_titlebar_height = (uint32)contents.get_int("gui_titlebar_height", gui_theme_t::gui_titlebar_height );
408 gui_theme_t::gui_frame_left = (uint32)contents.get_int("gui_frame_left", gui_theme_t::gui_frame_left );
409 gui_theme_t::gui_frame_top = (uint32)contents.get_int("gui_frame_top", gui_theme_t::gui_frame_top );
410 gui_theme_t::gui_frame_right = (uint32)contents.get_int("gui_frame_right", gui_theme_t::gui_frame_right );
411 gui_theme_t::gui_frame_bottom = (uint32)contents.get_int("gui_frame_bottom", gui_theme_t::gui_frame_bottom );
412 gui_theme_t::gui_hspace = (uint32)contents.get_int("gui_hspace", gui_theme_t::gui_hspace );
413 gui_theme_t::gui_vspace = (uint32)contents.get_int("gui_vspace", gui_theme_t::gui_vspace );
414
415 // the divider needs the vspace added to it for know
416 gui_divider_size.h += gui_vspace*2;
417 gui_theme_t::gui_divider_size.h = contents.get_int("gui_divider_vsize", gui_theme_t::gui_divider_size.h );
418
419 gui_theme_t::gui_button_size.w = (uint32)contents.get_int("gui_button_width", gui_theme_t::gui_button_size.w );
420 gui_theme_t::gui_button_size.h = (uint32)contents.get_int("gui_button_height", gui_theme_t::gui_button_size.h );
421 gui_theme_t::gui_edit_size.h = (uint32)contents.get_int("gui_edit_height", gui_theme_t::gui_edit_size.h );
422
423 gui_theme_t::gui_checkbox_size.w = (uint32)contents.get_int("gui_checkbox_width", gui_theme_t::gui_checkbox_size.w );
424 gui_theme_t::gui_checkbox_size.h = (uint32)contents.get_int("gui_checkbox_height", gui_theme_t::gui_checkbox_size.h );
425
426 // make them fit at least the font height
427 gui_theme_t::gui_titlebar_height = max( LINESPACE+2, gui_theme_t::gui_titlebar_height );
428 gui_theme_t::gui_button_size.h = max( LINESPACE+2, gui_theme_t::gui_button_size.h );
429 gui_theme_t::gui_edit_size.h = max( LINESPACE+2, gui_theme_t::gui_edit_size.h );
430
431
432 // since the arrows are used in scrollbars, the need similar sizes
433 gui_theme_t::gui_arrow_left_size.w = (uint32)contents.get_int("gui_horizontal_arrow_width", gui_theme_t::gui_arrow_left_size.w );
434 gui_theme_t::gui_arrow_left_size.h = (uint32)contents.get_int("gui_horizontal_arrow_height", gui_theme_t::gui_arrow_left_size.h );
435 gui_theme_t::gui_arrow_right_size = gui_theme_t::gui_arrow_left_size;
436
437 gui_theme_t::gui_arrow_up_size.w = (uint32)contents.get_int("gui_vertical_arrow_width", gui_theme_t::gui_arrow_up_size.w );
438 gui_theme_t::gui_arrow_up_size.h = (uint32)contents.get_int("gui_vertical_arrow_height", gui_theme_t::gui_arrow_up_size.h );
439 gui_theme_t::gui_arrow_down_size = gui_theme_t::gui_arrow_up_size;
440
441 // since scrollbar must have a certain size
442 gui_theme_t::gui_scrollbar_size.w = max( gui_min_scrollbar_size.w, (uint32)contents.get_int("gui_scrollbar_width", gui_theme_t::gui_scrollbar_size.w ) );
443 gui_theme_t::gui_scrollbar_size.h = max( gui_min_scrollbar_size.h, (uint32)contents.get_int("gui_scrollbar_height", gui_theme_t::gui_scrollbar_size.h ) );
444
445 // in practice, posbutton min height better is LINESPACE
446 gui_theme_t::gui_pos_button_size.w = (uint32)contents.get_int("gui_posbutton_width", gui_theme_t::gui_pos_button_size.w );
447 gui_theme_t::gui_pos_button_size.h = (uint32)contents.get_int("gui_posbutton_height", gui_theme_t::gui_pos_button_size.h );
448
449 // read ../dataobj/tabfile.h for clarification of this area
450 int *color_button_text_offsets = contents.get_ints("gui_color_button_text_offset");
451 int *button_text_offsets = contents.get_ints("gui_button_text_offset");
452 if( color_button_text_offsets[0] > 2 ) {
453 gui_theme_t::gui_color_button_text_offset = scr_size(color_button_text_offsets[1], color_button_text_offsets[2]);
454 gui_theme_t::gui_color_button_text_offset_right = scr_coord(color_button_text_offsets[3], 0);
455 }
456 if( button_text_offsets[0] > 2 ) {
457 gui_theme_t::gui_button_text_offset = scr_size(button_text_offsets[1], button_text_offsets[2]);
458 gui_theme_t::gui_button_text_offset_right = scr_coord(button_text_offsets[3], 0);
459 }
460 delete [] color_button_text_offsets;
461 delete [] button_text_offsets;
462
463 // default iconsize (square for now)
464 env_t::iconsize.h = env_t::iconsize.w = contents.get_int("icon_width",env_t::iconsize.w );
465
466 // maybe not the best place, rather use simwin for the static defines?
467 gui_theme_t::gui_color_text = (PIXVAL)contents.get_color("gui_color_text", SYSCOL_TEXT);
468 gui_theme_t::gui_color_text_highlight = (PIXVAL)contents.get_color("gui_color_text_highlight", SYSCOL_TEXT_HIGHLIGHT);
469 gui_theme_t::gui_color_text_shadow = (PIXVAL)contents.get_color("gui_color_text_shadow", SYSCOL_TEXT_SHADOW);
470 gui_theme_t::gui_color_text_title = (PIXVAL)contents.get_color("gui_color_text_title", SYSCOL_TEXT_TITLE);
471 gui_theme_t::gui_color_text_strong = (PIXVAL)contents.get_color("gui_color_text_strong", SYSCOL_TEXT_STRONG);
472 gui_theme_t::gui_color_text_minus = (PIXVAL)contents.get_color("gui_color_text_minus", MONEY_MINUS);
473 gui_theme_t::gui_color_text_plus = (PIXVAL)contents.get_color("gui_color_text_plus", MONEY_PLUS);
474 gui_theme_t::gui_color_text_unused = (PIXVAL)contents.get_color("gui_color_text_unused", SYSCOL_TEXT_UNUSED);
475 gui_theme_t::gui_color_edit_text = (PIXVAL)contents.get_color("gui_color_edit_text", SYSCOL_EDIT_TEXT);
476 gui_theme_t::gui_color_edit_text_selected = (PIXVAL)contents.get_color("gui_color_edit_text_selected", SYSCOL_EDIT_TEXT_SELECTED);
477 gui_theme_t::gui_color_edit_text_disabled = (PIXVAL)contents.get_color("gui_color_edit_text_disabled", SYSCOL_EDIT_TEXT_DISABLED);
478 gui_theme_t::gui_color_edit_background_selected = (PIXVAL)contents.get_color("gui_color_edit_background_selected", SYSCOL_EDIT_BACKGROUND_SELECTED);
479 gui_theme_t::gui_color_edit_beam = (PIXVAL)contents.get_color("gui_color_edit_beam", SYSCOL_CURSOR_BEAM);
480 gui_theme_t::gui_color_chart_background = (PIXVAL)contents.get_color("gui_color_chart_background", SYSCOL_CHART_BACKGROUND);
481 gui_theme_t::gui_color_chart_lines_zero = (PIXVAL)contents.get_color("gui_color_chart_lines_zero", SYSCOL_CHART_LINES_ZERO);
482 gui_theme_t::gui_color_chart_lines_odd = (PIXVAL)contents.get_color("gui_color_chart_lines_odd", SYSCOL_CHART_LINES_ODD);
483 gui_theme_t::gui_color_chart_lines_even = (PIXVAL)contents.get_color("gui_color_chart_lines_even", SYSCOL_CHART_LINES_EVEN);
484 gui_theme_t::gui_color_list_text_selected_focus = (PIXVAL)contents.get_color("gui_color_list_text_selected_focus", SYSCOL_LIST_TEXT_SELECTED_FOCUS);
485 gui_theme_t::gui_color_list_text_selected_nofocus = (PIXVAL)contents.get_color("gui_color_list_text_selected_nofocus", SYSCOL_LIST_TEXT_SELECTED_NOFOCUS);
486 gui_theme_t::gui_color_list_background_selected_f = (PIXVAL)contents.get_color("gui_color_list_background_selected_focus", SYSCOL_LIST_BACKGROUND_SELECTED_F);
487 gui_theme_t::gui_color_list_background_selected_nf = (PIXVAL)contents.get_color("gui_color_list_background_selected_nofocus", SYSCOL_LIST_BACKGROUND_SELECTED_NF);
488 gui_theme_t::gui_color_button_text = (PIXVAL)contents.get_color("gui_color_button_text", SYSCOL_BUTTON_TEXT);
489 gui_theme_t::gui_color_button_text_disabled = (PIXVAL)contents.get_color("gui_color_button_text_disabled", SYSCOL_BUTTON_TEXT_DISABLED);
490 gui_theme_t::gui_color_button_text_selected = (PIXVAL)contents.get_color("gui_color_button_text_selected", SYSCOL_BUTTON_TEXT_SELECTED);
491 gui_theme_t::gui_color_colored_button_text = (PIXVAL)contents.get_color("gui_color_colored_button_text", SYSCOL_COLORED_BUTTON_TEXT);
492 gui_theme_t::gui_color_colored_button_text_selected = (PIXVAL)contents.get_color("gui_color_colored_button_text_selected", SYSCOL_COLORED_BUTTON_TEXT_SELECTED);
493 gui_theme_t::gui_color_checkbox_text = (PIXVAL)contents.get_color("gui_color_checkbox_text", SYSCOL_CHECKBOX_TEXT);
494 gui_theme_t::gui_color_checkbox_text_disabled = (PIXVAL)contents.get_color("gui_color_checkbox_text_disabled", SYSCOL_CHECKBOX_TEXT_DISABLED);
495 gui_theme_t::gui_color_ticker_background = (PIXVAL)contents.get_color("gui_color_ticker_background", SYSCOL_TICKER_BACKGROUND);
496 gui_theme_t::gui_color_ticker_divider = (PIXVAL)contents.get_color("gui_color_ticker_divider", SYSCOL_TICKER_DIVIDER);
497 gui_theme_t::gui_color_statusbar_text = (PIXVAL)contents.get_color("gui_color_statusbar_text", SYSCOL_STATUSBAR_TEXT);
498 gui_theme_t::gui_color_statusbar_background = (PIXVAL)contents.get_color("gui_color_statusbar_background", SYSCOL_STATUSBAR_BACKGROUND);
499 gui_theme_t::gui_color_statusbar_divider = (PIXVAL)contents.get_color("gui_color_statusbar_divider", SYSCOL_STATUSBAR_DIVIDER);
500 gui_theme_t::gui_highlight_color = (PIXVAL)contents.get_color("gui_highlight_color", SYSCOL_HIGHLIGHT);
501 gui_theme_t::gui_shadow_color = (PIXVAL)contents.get_color("gui_shadow_color", SYSCOL_SHADOW);
502
503 // those two may be rather an own control later on?
504 gui_theme_t::gui_indicator_size = contents.get_scr_size("gui_indicator_size", gui_theme_t::gui_indicator_size );
505
506 gui_tab_panel_t::header_vsize = (uint32)contents.get_int("gui_tab_header_vsize", gui_tab_panel_t::header_vsize );
507
508 // stuff in env_t but rather GUI
509 env_t::window_buttons_right = contents.get_int("window_buttons_right", env_t::window_buttons_right );
510 env_t::left_to_right_graphs = contents.get_int("left_to_right_graphs", env_t::left_to_right_graphs );
511 env_t::window_frame_active = contents.get_int("window_frame_active", env_t::window_frame_active );
512 env_t::second_open_closes_win = contents.get_int("second_open_closes_win", env_t::second_open_closes_win );
513 env_t::remember_window_positions = contents.get_int("remember_window_positions", env_t::remember_window_positions );
514 env_t::window_snap_distance = contents.get_int("window_snap_distance", env_t::window_snap_distance );
515 gui_theme_t::gui_drop_shadows = contents.get_int("gui_drop_shadows", gui_theme_t::gui_drop_shadows );
516 env_t::bottom_window_darkness = contents.get_int("bottom_window_darkness", env_t::bottom_window_darkness );
517
518 env_t::default_window_title_color = contents.get_color("default_window_title_color", env_t::default_window_title_color, &env_t::default_window_title_color_rgb );
519 env_t::front_window_text_color = contents.get_color("front_window_text_color", env_t::front_window_text_color, &env_t::front_window_text_color_rgb );
520 env_t::bottom_window_text_color = contents.get_color("bottom_window_text_color", env_t::bottom_window_text_color, &env_t::bottom_window_text_color_rgb );
521 env_t::cursor_overlay_color = contents.get_color("cursor_overlay_color", env_t::cursor_overlay_color, &env_t::cursor_overlay_color_rgb );
522 env_t::tooltip_color = contents.get_color("tooltip_background_color", env_t::tooltip_color, &env_t::tooltip_color_rgb );
523 env_t::tooltip_textcolor = contents.get_color("tooltip_text_color", env_t::tooltip_textcolor, &env_t::tooltip_textcolor_rgb );
524
525 env_t::show_tooltips = contents.get_int("show_tooltips", env_t::show_tooltips );
526 env_t::tooltip_delay = contents.get_int("tooltip_delay", env_t::tooltip_delay );
527 env_t::tooltip_duration = contents.get_int("tooltip_duration", env_t::tooltip_duration );
528 env_t::toolbar_max_width = contents.get_int("toolbar_max_width", env_t::toolbar_max_width );
529 env_t::toolbar_max_height = contents.get_int("toolbar_max_height", env_t::toolbar_max_height );
530
531 if( toolbar_last_used_t::last_used_tools ) {
532 // only re-init if already inited
533 tool_t::update_toolbars();
534 }
535 env_t::default_theme = file_name;
536
537 return true;
538 }
539