Index: simwerkz.cc =================================================================== --- simwerkz.cc (revision 2534) +++ simwerkz.cc (working copy) @@ -447,6 +447,10 @@ } wo->entferne(sp); delete wo; + depot_t *dep = gr->get_depot(); + if( dep ) { + dep->update_win(); + } return true; } @@ -1905,6 +1909,16 @@ } } } + + // Update depots (new electric tab?). Depots can only be on first and last tile. + for( uint8 j = 0; j < 2; j++ ) { + uint8 i = j==0 ? 0 : verbindung.get_max_n(); + depot_t *dep = welt->lookup( verbindung.position_bei(i) )->get_depot(); + if( dep ) { + dep->update_win(); + } + } + return NULL; } Index: gui/depot_frame.h =================================================================== --- gui/depot_frame.h (revision 2534) +++ gui/depot_frame.h (working copy) @@ -10,6 +10,7 @@ #include "gui_frame.h" #include "components/gui_label.h" +#include "components/gui_image.h" #include "components/gui_image_list.h" #include "components/gui_textinput.h" #include "components/gui_combobox.h" @@ -119,6 +120,8 @@ static char no_line_text[128]; gui_combobox_t line_selector; + gui_image_t img_bolt; + linehandle_t selected_line; /** @@ -217,6 +220,20 @@ */ void build_vehicle_lists(); + /* + * Will update the tabs (don't show empty ones). + * @author Gerd Wachsmuth + * @date 08.05.2009 + */ + void update_tabs(); + + /* + * Will update all stuff (Bolt image, vehicle list). + * @author Gerd Wachsmuth + * @date 16.6.2009 + */ + void update(); + /** * Manche Fenster haben einen Hilfetext assoziiert. * @return den Dateinamen für die Hilfe, oder NULL Index: gui/components/gui_tab_panel.cc =================================================================== --- gui/components/gui_tab_panel.cc (revision 2534) +++ gui/components/gui_tab_panel.cc (working copy) @@ -148,3 +148,8 @@ } } } + +void gui_tab_panel_t::clear() { + tabs.clear(); + active_tab = 0; +} Index: gui/components/gui_tab_panel.h =================================================================== --- gui/components/gui_tab_panel.h (revision 2534) +++ gui/components/gui_tab_panel.h (working copy) @@ -51,8 +51,10 @@ * Gibt die aktuell angezeigte Komponente zurück. * @author Hj. Malthaner */ - gui_komponente_t* get_aktives_tab() const { return tabs.at(active_tab).component; } + gui_komponente_t* get_aktives_tab() const { return get_tab(active_tab); } + gui_komponente_t* get_tab( uint8 i ) const { return i < tabs.get_count() ? tabs.at(i).component : NULL; } + int get_active_tab_index() const { return min(tabs.get_count()-1,active_tab); } void set_active_tab_index( int i ) { active_tab = min(tabs.get_count()-1,i); } @@ -75,6 +77,20 @@ * @date 18.06.2003 */ void set_groesse(koord groesse); + + /* + * Remove all tabs. + * @author Gerd Wachsmuth + * @date 08.05.2009 + */ + void clear(); + + /* + * How many tabs we have? + * @author Gerd Wachsmuth + * @date 08.05.2009 + */ + uint32 get_count () const { return tabs.get_count(); } }; #endif Index: gui/depot_frame.cc =================================================================== --- gui/depot_frame.cc (revision 2534) +++ gui/depot_frame.cc (working copy) @@ -172,69 +172,7 @@ /* * [PANEL] - * to test for presence, we must fist switch on all vehicles, - * and switch off the timeline ... - * otherwise the tabs will not be present at all */ - bool old_retired=show_retired_vehicles; - bool old_show_all=show_all; - show_retired_vehicles = true; - show_all = true; - einstellungen_t* e = get_welt()->get_einstellungen(); - char timeline = e->get_use_timeline(); - e->set_use_timeline(0); - build_vehicle_lists(); - e->set_use_timeline(timeline); - show_retired_vehicles = old_retired; - show_all = old_show_all; - - bool one = false; - - cont_pas.add_komponente(&pas); - scrolly_pas.set_show_scroll_x(false); - scrolly_pas.set_size_corner(false); - scrolly_pas.set_read_only(false); - // add only if there are any - if(!pas_vec.empty()) { - tabs.add_tab(&scrolly_pas, translator::translate( depot->get_passenger_name() ) ); - one = true; - } - - cont_electrics.add_komponente(&electrics); - scrolly_electrics.set_show_scroll_x(false); - scrolly_electrics.set_size_corner(false); - scrolly_electrics.set_read_only(false); - // add only if there are any trolleybuses - if(!electrics_vec.empty()) { - tabs.add_tab(&scrolly_electrics, translator::translate( depot->get_electrics_name() ) ); - one = true; - } - - cont_loks.add_komponente(&loks); - scrolly_loks.set_show_scroll_x(false); - scrolly_loks.set_size_corner(false); - scrolly_loks.set_read_only(false); - // add, if waggons are there ... - if (!loks_vec.empty() || !waggons_vec.empty()) { - tabs.add_tab(&scrolly_loks, translator::translate( depot->get_zieher_name() ) ); - one = true; - } - - cont_waggons.add_komponente(&waggons); - scrolly_waggons.set_show_scroll_x(false); - scrolly_waggons.set_size_corner(false); - scrolly_waggons.set_read_only(false); - // only add, if there are waggons - if (!waggons_vec.empty()) { - tabs.add_tab(&scrolly_waggons, translator::translate( depot->get_haenger_name() ) ); - one = true; - } - - if(!one) { - // add passenger as default - tabs.add_tab(&scrolly_pas, translator::translate( depot->get_passenger_name() ) ); - } - pas.set_player_nr(depot->get_player_nr()); pas.add_listener(this); @@ -271,7 +209,7 @@ koord gr = koord(0,0); layout(&gr); - update_data(); + update(); gui_frame_t::set_fenstergroesse(gr); // text will be translated by ourselves (after update data)! @@ -281,6 +219,9 @@ lb_convoi_value.set_text_pointer(txt_convoi_value); lb_convoi_line.set_text_pointer(txt_convoi_line); + // Bolt image for electrified depots: + add_komponente(&img_bolt); + // Hajo: Trigger layouting set_resizemode(diagonal_resize); } @@ -539,6 +480,9 @@ bt_obsolete.set_pos(koord(TOTAL_WIDTH-(ABUTTON_WIDTH*5)/2, PANEL_VSTART + PANEL_HEIGHT + 16)); bt_obsolete.set_groesse(koord(ABUTTON_WIDTH, ABUTTON_HEIGHT)); bt_obsolete.pressed = show_retired_vehicles; + + const uint8 margin = 4; + img_bolt.set_pos(koord(get_fenstergroesse().x-skinverwaltung_t::electricity->get_bild(0)->get_pic()->w-margin,margin)); } @@ -612,6 +556,11 @@ const int month_now = get_welt()->get_timeline_year_month(); + /* + * The next block calculates upper bounds for the sizes of the vectors. + * If the vectors get resized, the vehicle_map becomes invalid, therefore + * we need to resize them before filling them. + */ if(electrics_vec.empty() && pas_vec.empty() && loks_vec.empty() && waggons_vec.empty()) { int loks = 0, waggons = 0, pax=0, electrics = 0; slist_iterator_tpl vehinfo(depot->get_vehicle_type()); @@ -640,6 +589,11 @@ loks_vec.clear(); waggons_vec.clear(); + pas_vec.resize(depot->get_vehicle_type()->get_count()); + electrics_vec.resize(depot->get_vehicle_type()->get_count()); + loks_vec.resize(depot->get_vehicle_type()->get_count()); + waggons_vec.resize(depot->get_vehicle_type()->get_count()); + vehicle_map.clear(); // we do not allow to built electric vehicle in a depot without electrification @@ -689,6 +643,8 @@ } } DBG_DEBUG("depot_frame_t::build_vehicle_lists()","finally %i passenger vehicle, %i engines, %i good wagons",pas_vec.get_count(),loks_vec.get_count(),waggons_vec.get_count()); + update_data(); + update_tabs(); } @@ -814,6 +770,9 @@ } else if(!convoi_t::pruefe_nachfolger(info, NULL)) { iter1.get_current_value()->rcolor = COL_YELLOW; } + } else if( veh_action == va_sell ) { + iter1.get_current_value()->lcolor = COL_RED; + iter1.get_current_value()->rcolor = COL_RED; } //DBG_DEBUG("depot_frame_t::update_data()","current %i = %s with color %i",info->get_name(),iter1.get_current_value()->lcolor); @@ -957,7 +916,6 @@ } build_vehicle_lists(); - update_data(); layout(NULL); } } @@ -1049,8 +1007,10 @@ image_from_storage_list(&waggons_vec[p.i]); } else if(komp == &bt_obsolete) { show_retired_vehicles = (show_retired_vehicles==0); + depot_t::update_all_win(); } else if(komp == &bt_show_all) { show_all = (show_all==0); + depot_t::update_all_win(); } else if(komp == &bt_veh_action) { if(veh_action== va_sell) { veh_action = va_append; @@ -1095,7 +1055,10 @@ } build_vehicle_lists(); } - update_data(); + else { + update_data(); + update_tabs(); + } layout(NULL); return true; } @@ -1136,10 +1099,6 @@ } else if(IS_WINDOW_REZOOM(ev)) { koord gr = get_fenstergroesse(); set_fenstergroesse(gr); - } else if(ev->ev_class == INFOWIN && ev->ev_code == WIN_OPEN) { - build_vehicle_lists(); - update_data(); - layout(NULL); } else { if(IS_LEFTCLICK(ev) && !line_selector.getroffen(ev->cx, ev->cy-16)) { @@ -1450,3 +1409,80 @@ display_multiline_text( pos.x + 200, pos.y + tabs.get_pos().y + tabs.get_groesse().y + 31 + LINESPACE*2 + 4, buf, COL_BLACK); } } + +void depot_frame_t::update_tabs() { + gui_komponente_t *old_tab = tabs.get_aktives_tab(); + tabs.clear(); + + bool one = false; + + cont_pas.add_komponente(&pas); + scrolly_pas.set_show_scroll_x(false); + scrolly_pas.set_size_corner(false); + scrolly_pas.set_read_only(false); + // add only if there are any + if(!pas_vec.empty()) { + tabs.add_tab(&scrolly_pas, translator::translate( depot->get_passenger_name() ) ); + one = true; + } + + cont_electrics.add_komponente(&electrics); + scrolly_electrics.set_show_scroll_x(false); + scrolly_electrics.set_size_corner(false); + scrolly_electrics.set_read_only(false); + // add only if there are any trolleybuses + if(!electrics_vec.empty()) { + tabs.add_tab(&scrolly_electrics, translator::translate( depot->get_electrics_name() ) ); + one = true; + } + + cont_loks.add_komponente(&loks); + scrolly_loks.set_show_scroll_x(false); + scrolly_loks.set_size_corner(false); + scrolly_loks.set_read_only(false); + // add, if waggons are there ... + if (!loks_vec.empty() || !waggons_vec.empty()) { + tabs.add_tab(&scrolly_loks, translator::translate( depot->get_zieher_name() ) ); + one = true; + } + + cont_waggons.add_komponente(&waggons); + scrolly_waggons.set_show_scroll_x(false); + scrolly_waggons.set_size_corner(false); + scrolly_waggons.set_read_only(false); + // only add, if there are waggons + if (!waggons_vec.empty()) { + tabs.add_tab(&scrolly_waggons, translator::translate( depot->get_haenger_name() ) ); + one = true; + } + + if(!one) { + // add passenger as default + tabs.add_tab(&scrolly_pas, translator::translate( depot->get_passenger_name() ) ); + } + + // Look, if there is our old tab present again (otherwise it will be 0 by tabs.clear()). + for( uint8 i = 0; i < tabs.get_count(); i++ ) { + if( old_tab == tabs.get_tab(i) ) { + // Found it! + tabs.set_active_tab_index(i); + break; + } + } +} + +void depot_frame_t::update() +{ + build_vehicle_lists(); + + // Update bolt image: + const waytype_t wt = depot->get_wegtyp(); + const weg_t *w = get_welt()->lookup(depot->get_pos())->get_weg(wt!=tram_wt ? wt : track_wt); + const bool way_electrified = ( w && w->is_electrified() ); + if( way_electrified ) { + img_bolt.set_image(skinverwaltung_t::electricity->get_bild_nr(0)); + } + else { + img_bolt.set_image(IMG_LEER); + } +} Index: simdepot.h =================================================================== --- simdepot.h (revision 2534) +++ simdepot.h (working copy) @@ -201,6 +201,18 @@ void set_selected_line(const linehandle_t sel_line); linehandle_t get_selected_line(); + + /* + * Will update all depot_frame_t (new vehicles!) + */ + static void update_all_win(); + static void neuer_monat(); + + /* + * Update the depot_frame_t. + */ + void update_win(); + private: linehandle_t selected_line; }; Index: simworld.cc =================================================================== --- simworld.cc (revision 2534) +++ simworld.cc (working copy) @@ -2519,6 +2519,9 @@ INT_CHECK("simworld 1877"); } + INT_CHECK("simworld 2522"); + depot_t::neuer_monat(); + // now switch year to get the right year for all timeline stuff ... if(letzter_monat==0) { neues_jahr(); Index: simdepot.cc =================================================================== --- simdepot.cc (revision 2534) +++ simdepot.cc (working copy) @@ -521,3 +521,21 @@ } return success; } + +void depot_t::update_win() { + depot_frame_t *depot_frame = dynamic_cast(win_get_magic( (long)this )); + if(depot_frame) { + depot_frame->update(); + } +} + +void depot_t::neuer_monat() { + update_all_win(); +} + +void depot_t::update_all_win() { + slist_iterator_tpl iter(all_depots); + while(iter.next()) { + iter.access_current()->update_win(); + } +}