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