8
8
#include "fabrik_info.h"
10
10
#include "components/gui_button.h"
11
#include "components/list_button.h"
11
12
#include "help_frame.h"
13
#include "factory_chart.h"
13
15
#include "../simfab.h"
14
16
#include "../simcolor.h"
15
17
#include "../simgraph.h"
16
18
#include "../simcity.h"
17
19
#include "../simwin.h"
20
#include "../simmenu.h"
21
#include "../player/simplay.h"
18
22
#include "../simworld.h"
19
23
#include "../simskin.h"
20
24
#include "../dataobj/translator.h"
21
25
#include "../utils/simstring.h"
24
cbuffer_t fabrik_info_t::info_buf(8192);
26
fabrik_info_t::fabrik_info_t(const fabrik_t* fab_, const gebaeude_t* gb) :
28
fabrik_info_t::fabrik_info_t(fabrik_t* fab_, const gebaeude_t* gb) :
29
gui_frame_t("", fab_->get_besitzer()),
32
view(gb, koord( max(64, get_base_tile_raster_width()), max(56, (get_base_tile_raster_width() * 7) / 8))),
32
about = lieferbuttons = supplierbuttons = stadtbuttons = NULL;
34
const sint16 width = max(290, 226+view.get_groesse().x);
37
lieferbuttons = supplierbuttons = stadtbuttons = NULL;
38
welt = fab->get_besitzer()->get_welt();
40
tstrncpy( fabname, fab->get_name(), lengthof(fabname) );
41
gui_frame_t::set_name( fabname );
43
input.set_pos(koord(10,4));
44
input.set_groesse( koord(TOTAL_WIDTH-20, 13));
45
input.set_text( fabname, lengthof(fabname) );
46
input.add_listener(this);
47
add_komponente(&input);
49
view.set_pos( koord(TOTAL_WIDTH - view.get_groesse().x - 10 , 21) );
50
add_komponente(&view);
52
prod.set_pos( koord( 10, 14 ) );
53
fab->info_prod( prod_buf );
55
add_komponente( &prod );
57
const sint16 offset_below_viewport = max( 14+prod.get_groesse().y+LINESPACE+5, 21 + view.get_groesse().y + 14);
59
chart_button.init(button_t::roundbox_state, "Chart", koord(BUTTON3_X,offset_below_viewport), koord(BUTTON_WIDTH, BUTTON_HEIGHT));
60
chart_button.set_tooltip("Show/hide statistics");
61
chart_button.add_listener(this);
62
add_komponente(&chart_button);
36
64
// Hajo: "About" button only if translation is available
38
66
sprintf(key, "factory_%s_details", fab->get_besch()->get_name());
39
67
const char * value = translator::translate(key);
40
68
if(value && *value != 'f') {
41
about = new button_t();
42
about->init(button_t::roundbox,translator::translate("About"),koord(width - view.get_groesse().x - 20, view.get_groesse().y + 18), koord(view.get_groesse().x, 14));
43
about->add_listener(this);
44
add_komponente(about);
69
details_button.init( button_t::roundbox, "Details", koord(BUTTON4_X,offset_below_viewport), koord(BUTTON_WIDTH, BUTTON_HEIGHT));
70
// details_button.set_tooltip("Factory details");
71
details_button.add_listener(this);
72
add_komponente(&details_button);
76
fab->info_prod(prod_buf);
47
78
// fill position buttons etc
79
fab->info_conn(info_buf);
54
// check, if something changed ...
55
const sint16 height = max(count_char(info_buf, '\n')*LINESPACE+36, view.get_groesse().y+8+14+36 );
56
set_fenstergroesse(koord(width, min(height+10, 408)));
57
cont.set_groesse(koord(width, height-10));
83
scrolly.set_pos(koord(0, offset_below_viewport+BUTTON_HEIGHT));
59
84
scrolly.set_show_scroll_x(false);
60
scrolly.set_size_corner(false);
61
scrolly.set_groesse(get_fenstergroesse()-koord(1,16));
62
85
add_komponente(&scrolly);
64
view.set_pos(koord(width - view.get_groesse().x - 20, 10)); // view is actually borrowed from ding-info ...
65
add_komponente(&view);
87
gui_frame_t::set_fenstergroesse(koord(TOTAL_WIDTH, 16+offset_below_viewport+BUTTON_HEIGHT+cont.get_groesse().y+10));
88
set_min_windowsize(koord(TOTAL_WIDTH, 16+offset_below_viewport+BUTTON_HEIGHT+LINESPACE*3));
67
set_name( fab->get_name() );
90
set_resizemode(vertical_resize);
71
95
fabrik_info_t::~fabrik_info_t()
73
100
delete [] lieferbuttons;
74
101
delete [] supplierbuttons;
75
102
delete [] stadtbuttons;
106
void fabrik_info_t::rename_factory()
108
if( fabname[0] && welt->get_fab_list().is_contained(fab) && strcmp(fabname, fab->get_name()) ) {
109
// text changed and factory still exists => call tool
111
buf.printf( "f%s,%s", fab->get_pos().get_str(), fabname );
112
werkzeug_t *w = create_tool( WKZ_RENAME_TOOL | SIMPLE_TOOL );
113
w->set_default_param( buf );
114
welt->set_werkzeug( w, welt->get_spieler(1));
115
// since init always returns false, it is save to delete immediately
122
* Set window size and adjust component sizes and/or positions accordingly
123
* @author Markus Weber
125
void fabrik_info_t::set_fenstergroesse(koord groesse)
127
gui_frame_t::set_fenstergroesse(groesse);
129
// would be only needed in case of enabling horizontal resizes
130
// input.set_groesse(koord(get_fenstergroesse().x-20, 13));
131
// view.set_pos(koord(get_fenstergroesse().x - view.get_groesse().x - 10 , 21));
133
scrolly.set_groesse(get_client_windowsize()-scrolly.get_pos());
88
144
void fabrik_info_t::zeichnen(koord pos, koord gr)
90
buf.clear(); // clear the buffer of the base class
92
fab->info( info_buf );
93
const sint16 height = max(count_char(info_buf, '\n')*LINESPACE+36, view.get_groesse().y+8+14+36 );
94
if((cont.get_groesse().y+10)!=height) {
146
fab->info_prod( prod_buf );
147
fab->info_conn( info_buf );
149
if( cont.get_groesse().y!=txt.get_groesse().y-3 ) {
96
cont.set_groesse(koord(cont.get_groesse().x, height-10));
97
set_fenstergroesse(koord(get_fenstergroesse().x, min(height+10, 408)));
98
scrolly.set_groesse(get_fenstergroesse()-koord(1,16));
101
152
gui_frame_t::zeichnen(pos,gr);
155
prod_buf.append( translator::translate("Durchsatz") );
156
prod_buf.append( fab->get_current_production(), 0 );
157
prod_buf.append( translator::translate("units/day") );
103
159
unsigned indikatorfarbe = fabrik_t::status_to_color[fab->get_status()];
104
160
display_ddd_box_clip(pos.x + view.get_pos().x, pos.y + view.get_pos().y + view.get_groesse().y + 16, view.get_groesse().x, 8, MN_GREY0, MN_GREY4);
105
161
display_fillbox_wh_clip(pos.x + view.get_pos().x + 1, pos.y + view.get_pos().y + view.get_groesse().y + 17, view.get_groesse().x - 2, 6, indikatorfarbe, true);
106
if (fab->get_prodfaktor() > 16) {
107
display_color_img(skinverwaltung_t::electricity->get_bild_nr(0), pos.x + view.get_pos().x + 4, pos.y + view.get_pos().y + 20, 0, false, false);
162
KOORD_VAL x_view_pos = 4;
163
KOORD_VAL x_prod_pos = 4+proportional_string_width(prod_buf)+10;
164
if( skinverwaltung_t::electricity->get_bild_nr(0)!=IMG_LEER ) {
165
// indicator for recieving
166
if( fab->get_prodfactor_electric()>0 ) {
167
display_color_img(skinverwaltung_t::electricity->get_bild_nr(0), pos.x + view.get_pos().x + x_view_pos, pos.y + view.get_pos().y + 20, 0, false, false);
168
x_view_pos += skinverwaltung_t::electricity->get_bild(0)->get_pic()->w+4;
170
// indicator for enabled
171
if( fab->get_besch()->get_electric_boost() ) {
172
display_color_img( skinverwaltung_t::electricity->get_bild_nr(0), pos.x + x_prod_pos, pos.y + view.get_pos().y + 20, 0, false, false);
173
x_prod_pos += skinverwaltung_t::electricity->get_bild(0)->get_pic()->w+4;
176
if( skinverwaltung_t::electricity->get_bild_nr(0)!=IMG_LEER ) {
177
if( fab->get_prodfactor_pax()>0 ) {
178
display_color_img(skinverwaltung_t::passagiere->get_bild_nr(0), pos.x + view.get_pos().x + 4 + 8, pos.y + view.get_pos().y + 20, 0, false, false);
180
if( fab->get_besch()->get_pax_boost() ) {
181
display_color_img( skinverwaltung_t::passagiere->get_bild_nr(0), pos.x + x_prod_pos, pos.y + view.get_pos().y + 20, 0, false, false);
182
x_prod_pos += skinverwaltung_t::passagiere->get_bild(0)->get_pic()->w+4;
185
if( skinverwaltung_t::post->get_bild_nr(0)!=IMG_LEER ) {
186
if( fab->get_prodfactor_mail()>0 ) {
187
display_color_img(skinverwaltung_t::post->get_bild_nr(0), pos.x + view.get_pos().x + 4 + 18, pos.y + view.get_pos().y + 20, 0, false, false);
189
if( fab->get_besch()->get_mail_boost() ) {
190
display_color_img( skinverwaltung_t::post->get_bild_nr(0), pos.x + x_prod_pos, pos.y + view.get_pos().y + 20, 0, false, false);
114
197
* This method is called if an action is triggered
115
198
* @author Hj. Malthaner
117
200
* Returns true, if action is done and no more
118
201
* components should be triggered.
121
204
bool fabrik_info_t::action_triggered( gui_action_creator_t *komp, value_t v)
206
if(komp == &chart_button) {
207
chart_button.pressed ^= 1;
208
KOORD_VAL offset_below_viewport = max( 14+prod.get_groesse().y+LINESPACE+5, 21 + view.get_groesse().y + 14);
209
if( !chart_button.pressed ) {
210
remove_komponente( &chart );
213
chart.set_pos( koord( 0, offset_below_viewport ) );
214
add_komponente( &chart );
215
offset_below_viewport += chart.get_groesse().y;
217
chart_button.set_pos( koord(BUTTON3_X,offset_below_viewport) );
218
details_button.set_pos( koord(BUTTON4_X,offset_below_viewport) );
219
scrolly.set_pos( koord(0,offset_below_viewport+BUTTON_HEIGHT) );
220
set_min_windowsize(koord(TOTAL_WIDTH, 16+offset_below_viewport+BUTTON_HEIGHT+LINESPACE*3));
221
resize( koord(0,(chart_button.pressed ? chart.get_groesse().y : -chart.get_groesse().y) ) );
223
else if(komp == &input) {
226
else if(komp == &details_button) {
124
227
help_frame_t * frame = new help_frame_t();
126
229
sprintf(key, "factory_%s_details", fab->get_besch()->get_name());
175
284
supplierbuttons = new button_t [suppliers.get_count()];
177
286
for(unsigned i=0; i<suppliers.get_count(); i++) {
178
supplierbuttons[i].set_pos(koord(16, 79+y_off+i*LINESPACE));
287
supplierbuttons[i].set_pos(koord(10, y_off));
179
289
supplierbuttons[i].set_typ(button_t::posbutton);
180
290
supplierbuttons[i].set_targetpos(suppliers[i]);
181
291
supplierbuttons[i].add_listener(this);
182
292
cont.add_komponente(&supplierbuttons[i]);
185
int yy_off = (suppliers.get_count() ? (int)suppliers.get_count()-1 : -3)*LINESPACE;
187
const slist_tpl <stadt_t *> & arbeiterziele = fab->get_arbeiterziele();
295
y_off += (suppliers.get_count() ? 2*LINESPACE : 0);
297
const vector_tpl<stadt_t *> &target_cities = fab->get_target_cities();
189
299
// V.Meyer: MFC has a bug with "new x[0]"
190
stadtbuttons = new button_t [arbeiterziele.get_count()+1];
300
stadtbuttons = new button_t [target_cities.get_count()+1];
192
stadtbuttons = new button_t [arbeiterziele.get_count()];
302
stadtbuttons = new button_t [target_cities.get_count()];
194
for(unsigned i=0; i<arbeiterziele.get_count(); i++) {
195
stadtbuttons[i].set_pos(koord(16, 112+y_off+i*LINESPACE));
196
stadtbuttons[i].set_typ(button_t::posbutton);
197
stadtbuttons[i].set_targetpos(arbeiterziele.at(i)->get_pos());
198
stadtbuttons[i].add_listener(this);
199
cont.add_komponente(&stadtbuttons[i]);
304
for( uint32 c=0; c<target_cities.get_count(); ++c ) {
305
stadtbuttons[c].set_pos(koord(10, y_off));
307
stadtbuttons[c].set_typ(button_t::posbutton);
308
stadtbuttons[c].set_targetpos(target_cities[c]->get_pos());
309
stadtbuttons[c].add_listener(this);
310
cont.add_komponente(&stadtbuttons[c]);
312
cont.set_groesse( koord( cont.get_groesse().x, txt.get_groesse().y-3 ) );