~ubuntu-branches/ubuntu/raring/simutrans/raring-proposed

« back to all changes in this revision

Viewing changes to gui/fabrik_info.cc

  • Committer: Package Import Robot
  • Author(s): Ansgar Burchardt
  • Date: 2011-11-03 19:59:02 UTC
  • mfrom: (1.2.7)
  • Revision ID: package-import@ubuntu.com-20111103195902-uopgwf488mfctb75
Tags: 111.0-1
* New upstream release.
* debian/rules: Update get-orig-source target for new upstream release.
* Use xz compression for source and binary packages.
* Use override_* targets to simplify debian/rules.

Show diffs side-by-side

added added

removed removed

Lines of Context:
8
8
#include "fabrik_info.h"
9
9
 
10
10
#include "components/gui_button.h"
 
11
#include "components/list_button.h"
11
12
#include "help_frame.h"
 
13
#include "factory_chart.h"
12
14
 
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"
22
26
 
23
27
 
24
 
cbuffer_t fabrik_info_t::info_buf(8192);
25
 
 
26
 
fabrik_info_t::fabrik_info_t(const fabrik_t* fab_, const gebaeude_t* gb) :
27
 
        ding_infowin_t(gb),
 
28
fabrik_info_t::fabrik_info_t(fabrik_t* fab_, const gebaeude_t* gb) :
 
29
        gui_frame_t("", fab_->get_besitzer()),
28
30
        fab(fab_),
 
31
        chart(fab_),
 
32
        view(gb, koord( max(64, get_base_tile_raster_width()), max(56, (get_base_tile_raster_width() * 7) / 8))),
29
33
        scrolly(&cont),
30
 
        txt("\n")
 
34
        prod(&prod_buf),
 
35
        txt(&info_buf)
31
36
{
32
 
        about = lieferbuttons = supplierbuttons = stadtbuttons = NULL;
33
 
 
34
 
        const sint16 width = max(290, 226+view.get_groesse().x);
 
37
        lieferbuttons = supplierbuttons = stadtbuttons = NULL;
 
38
        welt = fab->get_besitzer()->get_welt();
 
39
 
 
40
        tstrncpy( fabname, fab->get_name(), lengthof(fabname) );
 
41
        gui_frame_t::set_name( fabname );
 
42
 
 
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);
 
48
 
 
49
        view.set_pos( koord(TOTAL_WIDTH - view.get_groesse().x - 10 , 21) );
 
50
        add_komponente(&view);
 
51
 
 
52
        prod.set_pos( koord( 10, 14 ) );
 
53
        fab->info_prod( prod_buf );
 
54
        prod.recalc_size();
 
55
        add_komponente( &prod );
 
56
 
 
57
        const sint16 offset_below_viewport = max( 14+prod.get_groesse().y+LINESPACE+5, 21 + view.get_groesse().y + 14);
 
58
 
 
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);
35
63
 
36
64
        // Hajo: "About" button only if translation is available
37
65
        char key[256];
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);
45
73
        }
46
74
 
 
75
        // calculate height
 
76
        fab->info_prod(prod_buf);
 
77
 
47
78
        // fill position buttons etc
 
79
        fab->info_conn(info_buf);
 
80
        txt.recalc_size();
48
81
        update_info();
49
82
 
50
 
        // calculate height
51
 
        info_buf.clear();
52
 
        fab->info(info_buf);
53
 
 
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));
58
 
 
 
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);
63
86
 
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));
66
89
 
67
 
        set_name( fab->get_name() );
 
90
        set_resizemode(vertical_resize);
 
91
        resize(koord(0,0));
68
92
}
69
93
 
70
94
 
71
95
fabrik_info_t::~fabrik_info_t()
72
96
{
 
97
        rename_factory();
 
98
        fabname[0] = 0;
 
99
 
73
100
        delete [] lieferbuttons;
74
101
        delete [] supplierbuttons;
75
102
        delete [] stadtbuttons;
76
 
        delete about;
77
 
}
78
 
 
 
103
}
 
104
 
 
105
 
 
106
void fabrik_info_t::rename_factory()
 
107
{
 
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
 
110
                cbuffer_t buf;
 
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
 
116
                delete w;
 
117
        }
 
118
}
 
119
 
 
120
 
 
121
/**
 
122
 * Set window size and adjust component sizes and/or positions accordingly
 
123
 * @author Markus Weber
 
124
 */
 
125
void fabrik_info_t::set_fenstergroesse(koord groesse)
 
126
{
 
127
        gui_frame_t::set_fenstergroesse(groesse);
 
128
 
 
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));
 
132
 
 
133
        scrolly.set_groesse(get_client_windowsize()-scrolly.get_pos());
 
134
}
79
135
 
80
136
 
81
137
/**
87
143
 */
88
144
void fabrik_info_t::zeichnen(koord pos, koord gr)
89
145
{
90
 
        buf.clear();    // clear the buffer of the base class
91
 
        info_buf.clear();
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 );
 
148
        txt.recalc_size();
 
149
        if(  cont.get_groesse().y!=txt.get_groesse().y-3  ) {
95
150
                update_info();
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));
99
151
        }
100
 
 
101
152
        gui_frame_t::zeichnen(pos,gr);
102
153
 
 
154
        prod_buf.clear();
 
155
        prod_buf.append( translator::translate("Durchsatz") );
 
156
        prod_buf.append( fab->get_current_production(), 0 );
 
157
        prod_buf.append( translator::translate("units/day") );
 
158
 
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;
 
169
                }
 
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;
 
174
                }
 
175
        }
 
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);
 
179
                }
 
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;
 
183
                }
 
184
        }
 
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);
 
188
                }
 
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);
 
191
                }
108
192
        }
109
193
}
110
194
 
111
195
 
112
 
 
113
196
/**
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.
119
202
 * V.Meyer
120
 
   */
 
203
 */
121
204
bool fabrik_info_t::action_triggered( gui_action_creator_t *komp, value_t v)
122
205
{
123
 
        if(komp == about) {
 
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 );
 
211
                }
 
212
                else {
 
213
                        chart.set_pos( koord( 0, offset_below_viewport ) );
 
214
                        add_komponente( &chart );
 
215
                        offset_below_viewport += chart.get_groesse().y;
 
216
                }
 
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) ) );
 
222
        }
 
223
        else if(komp == &input) {
 
224
                rename_factory();
 
225
        }
 
226
        else if(komp == &details_button) {
124
227
                help_frame_t * frame = new help_frame_t();
125
228
                char key[256];
126
229
                sprintf(key, "factory_%s_details", fab->get_besch()->get_name());
129
232
        }
130
233
        else if(v.i&~1) {
131
234
                koord k = *(const koord *)v.p;
132
 
                karte_t* const welt = get_ding()->get_welt();
 
235
                karte_t* const welt = fab->get_besitzer()->get_welt();
133
236
                welt->change_world_position( koord3d(k,welt->max_hgt(k)) );
134
237
        }
135
238
 
137
240
}
138
241
 
139
242
 
140
 
 
141
243
void fabrik_info_t::update_info()
142
244
{
 
245
        tstrncpy( fabname, fab->get_name(), lengthof(fabname) );
 
246
        gui_frame_t::set_name( fabname );
 
247
        input.set_text( fabname, lengthof(fabname) );
 
248
 
143
249
        cont.remove_all();
144
250
 
145
251
        delete [] lieferbuttons;
147
253
        delete [] stadtbuttons;
148
254
 
149
255
        // needs to update all text
150
 
        txt.set_pos(koord(16,4));
151
 
        txt.set_text(info_buf);
 
256
        cont.set_pos( koord(0,0) );
 
257
        txt.set_pos( koord(10,-LINESPACE) );
152
258
        cont.add_komponente(&txt);
153
259
 
 
260
        int y_off = LINESPACE-3;
 
261
 
154
262
        const vector_tpl <koord> & lieferziele =  fab->get_lieferziele();
155
263
#ifdef _MSC_VER
156
264
        // V.Meyer: MFC has a bug with "new x[0]"
159
267
        lieferbuttons = new button_t [lieferziele.get_count()];
160
268
#endif
161
269
        for(unsigned i=0; i<lieferziele.get_count(); i++) {
162
 
                lieferbuttons[i].set_pos(koord(16, 46+i*LINESPACE));
 
270
                lieferbuttons[i].set_pos(koord(10, y_off));
 
271
                y_off += LINESPACE;
163
272
                lieferbuttons[i].set_typ(button_t::posbutton);
164
273
                lieferbuttons[i].set_targetpos(lieferziele[i]);
165
274
                lieferbuttons[i].add_listener(this);
166
275
                cont.add_komponente(&lieferbuttons[i]);
167
276
        }
168
277
 
169
 
        int y_off = (lieferziele.get_count() ? (int)lieferziele.get_count()-1 : -3)*LINESPACE;
 
278
        y_off += (lieferziele.get_count() ? 2*LINESPACE : 0);
170
279
        const vector_tpl <koord> & suppliers =  fab->get_suppliers();
171
280
#ifdef _MSC_VER
172
281
        // V.Meyer: MFC has a bug with "new x[0]"
175
284
        supplierbuttons = new button_t [suppliers.get_count()];
176
285
#endif
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));
 
288
                y_off += LINESPACE;
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]);
183
293
        }
184
294
 
185
 
        int yy_off = (suppliers.get_count() ? (int)suppliers.get_count()-1 : -3)*LINESPACE;
186
 
        y_off += yy_off;
187
 
        const slist_tpl <stadt_t *> & arbeiterziele = fab->get_arbeiterziele();
 
295
        y_off += (suppliers.get_count() ? 2*LINESPACE : 0);
 
296
 
 
297
        const vector_tpl<stadt_t *> &target_cities = fab->get_target_cities();
188
298
#ifdef _MSC_VER
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];
191
301
#else
192
 
        stadtbuttons = new button_t [arbeiterziele.get_count()];
 
302
        stadtbuttons = new button_t [target_cities.get_count()];
193
303
#endif
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));
 
306
                y_off += LINESPACE;
 
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]);
200
311
        }
 
312
        cont.set_groesse( koord( cont.get_groesse().x, txt.get_groesse().y-3 ) );
201
313
}