From: <geo...@us...> - 2012-06-16 17:04:02
|
Revision: 4911 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4911&view=rev Author: geoffthemedio Date: 2012-06-16 17:03:55 +0000 (Sat, 16 Jun 2012) Log Message: ----------- Removed habitability requirement from UI, so uninhabitable planets can have colonies (or "outposts") placed on them by colony ships of a particular species. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2012-06-15 04:11:15 UTC (rev 4910) +++ trunk/FreeOrion/UI/SidePanel.cpp 2012-06-16 17:03:55 UTC (rev 4911) @@ -1169,7 +1169,7 @@ bool visible = GetUniverse().GetObjectVisibilityByEmpire(m_planet_id, client_empire_id) >= VIS_PARTIAL_VISIBILITY; bool vulnerable = planet->CurrentMeterValue(METER_SHIELD) <= 0.; bool being_colonized = planet->IsAboutToBeColonized(); - bool colonizable = !populated && habitable && visible && !being_colonized; + bool colonizable = !populated && /*habitable &&*/ visible && !being_colonized; bool can_colonize = colonizable && colony_ship; // bool could_colonize = colonizable && OwnedColonyShipsInSystem(client_empire_id, SidePanel::SystemID()); bool could_colonize = (!populated || (has_owner && !mine)) && visible && !being_colonized && OwnedColonyShipsInSystem(client_empire_id, SidePanel::SystemID()); |
From: <geo...@us...> - 2012-10-21 06:09:57
|
Revision: 5320 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5320&view=rev Author: geoffthemedio Date: 2012-10-21 06:09:51 +0000 (Sun, 21 Oct 2012) Log Message: ----------- Made planet environmental rating show for all populated planets. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2012-10-21 05:55:07 UTC (rev 5319) +++ trunk/FreeOrion/UI/SidePanel.cpp 2012-10-21 06:09:51 UTC (rev 5320) @@ -871,8 +871,7 @@ m_specials_panel = new SpecialsPanel(panel_width, m_planet_id); AttachChild(m_specials_panel); - std::string env_size_text = boost::io::str(FlexibleFormat(UserString("PL_TYPE_SIZE")) % GetPlanetSizeName(*planet) % GetPlanetTypeName(*planet)); - m_env_size = new GG::TextControl(GG::X(MaxPlanetDiameter()), GG::Y0, env_size_text, ClientUI::GetFont(), ClientUI::TextColor()); + m_env_size = new GG::TextControl(GG::X(MaxPlanetDiameter()), GG::Y0, "", ClientUI::GetFont(), ClientUI::TextColor()); AttachChild(m_env_size); @@ -1180,8 +1179,16 @@ DetachChild(m_invade_button); DetachChild(m_colonize_button); DetachChild(m_colonize_instruction); + + std::string species_name; + if (!planet->SpeciesName().empty()) + species_name = planet->SpeciesName(); + else if (!colony_ship_species_name.empty()) + species_name = colony_ship_species_name; + std::string env_size_text; - if (colony_ship_species_name.empty()) + + if (species_name.empty()) env_size_text = boost::io::str(FlexibleFormat(UserString("PL_TYPE_SIZE")) % GetPlanetSizeName(*planet) % GetPlanetTypeName(*planet)); @@ -1189,7 +1196,7 @@ env_size_text = boost::io::str(FlexibleFormat(UserString("PL_TYPE_SIZE_ENV")) % GetPlanetSizeName(*planet) % GetPlanetTypeName(*planet) - % GetPlanetEnvironmentName(*planet, colony_ship_species_name)); + % GetPlanetEnvironmentName(*planet, species_name)); if (Disabled() || !(can_colonize || could_colonize || being_colonized || invadable || being_invaded)) { |
From: <geo...@us...> - 2012-10-28 05:45:45
|
Revision: 5348 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5348&view=rev Author: geoffthemedio Date: 2012-10-28 05:45:39 +0000 (Sun, 28 Oct 2012) Log Message: ----------- Made prospective colony target population indications on colonize button red (if <= 0) or green (if > colony ship capacity). Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2012-10-28 05:44:34 UTC (rev 5347) +++ trunk/FreeOrion/UI/SidePanel.cpp 2012-10-28 05:45:39 UTC (rev 5348) @@ -1208,7 +1208,15 @@ std::string colonize_text; if (colony_ship_capacity > 0.0) { std::string initial_pop = DoubleToString(colony_ship_capacity, 2, false); - std::string target_pop = DoubleToString(planet_capacity, 2, false); + + std::string clr_tag; + if (planet_capacity < colony_ship_capacity && colony_ship_capacity > 0.0) + clr_tag = GG::RgbaTag(ClientUI::StatDecrColor()); + else if (planet_capacity > colony_ship_capacity && colony_ship_capacity > 0.0) + clr_tag = GG::RgbaTag(ClientUI::StatIncrColor()); + std::string clr_tag_close = (clr_tag.empty() ? "" : "</rgba>"); + std::string target_pop = clr_tag + DoubleToString(planet_capacity, 2, false) + clr_tag_close; + colonize_text = boost::io::str(FlexibleFormat(UserString("PL_COLONIZE")) % initial_pop % target_pop); } else { colonize_text = UserString("PL_OUTPOST"); |
From: <geo...@us...> - 2012-11-28 16:39:03
|
Revision: 5475 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5475&view=rev Author: geoffthemedio Date: 2012-11-28 16:38:57 +0000 (Wed, 28 Nov 2012) Log Message: ----------- Added visibility test to AvailableToColonize function in the hope of preventing "sensor ghosts" from making a colonize button appear when no colony ships are actually present. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2012-11-28 12:59:40 UTC (rev 5474) +++ trunk/FreeOrion/UI/SidePanel.cpp 2012-11-28 16:38:57 UTC (rev 5475) @@ -1021,6 +1021,7 @@ return false; if (ship->SystemID() == system_id && ship->OwnedBy(empire_id) && + ship->GetVisibility(empire_id) >= VIS_PARTIAL_VISIBILITY && ship->CanColonize() && ship->OrderedColonizePlanet() == INVALID_OBJECT_ID && ship->OrderedScrapped() == false && |
From: <geo...@us...> - 2012-12-01 19:34:23
|
Revision: 5494 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5494&view=rev Author: geoffthemedio Date: 2012-12-01 19:34:17 +0000 (Sat, 01 Dec 2012) Log Message: ----------- Removed colonize instruction text on planet panels. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2012-12-01 19:02:36 UTC (rev 5493) +++ trunk/FreeOrion/UI/SidePanel.cpp 2012-12-01 19:34:17 UTC (rev 5494) @@ -485,7 +485,6 @@ GG::TextControl* m_env_size; ///< indicates size and planet environment rating uncolonized planets CUIButton* m_colonize_button; ///< btn which can be pressed to colonize this planet CUIButton* m_invade_button; ///< btn which can be pressed to invade this planet - GG::TextControl* m_colonize_instruction; ///< text that tells the player to pick a colony ship to colonize GG::DynamicGraphic* m_planet_graphic; ///< image of the planet (can be a frameset); this is now used only for asteroids RotatingPlanetControl* m_rotating_planet_graphic; ///< a realtime-rendered planet that rotates, with a textured surface mapped onto it bool m_selected; ///< is this planet panel selected @@ -764,7 +763,6 @@ m_env_size(0), m_colonize_button(0), m_invade_button(0), - m_colonize_instruction(0), m_planet_graphic(0), m_rotating_planet_graphic(0), m_selected(false), @@ -888,10 +886,6 @@ ClientUI::TextColor(), GG::INTERACTIVE); GG::Connect(m_invade_button->ClickedSignal, &SidePanel::PlanetPanel::ClickInvade, this); - m_colonize_instruction = new GG::TextControl(GG::X(MaxPlanetDiameter()), GG::Y0, - UserString("PL_SELECT_COLONY_SHIP_INSTRUCTION"), - ClientUI::GetFont(), ClientUI::TextColor()); - if (m_planet_graphic) MoveChildDown(m_planet_graphic); @@ -903,7 +897,6 @@ SidePanel::PlanetPanel::~PlanetPanel() { delete m_colonize_button; delete m_invade_button; - delete m_colonize_instruction; delete m_env_size; delete m_population_panel; delete m_resource_panel; @@ -932,10 +925,7 @@ y += m_env_size->Height() + EDGE_PAD; } - if (m_colonize_instruction && m_colonize_instruction->Parent() == this) { - m_colonize_instruction->MoveTo(GG::Pt(left, y)); - y += m_colonize_instruction->Height() + EDGE_PAD; - } else if (m_colonize_button && m_colonize_button->Parent() == this) { + if (m_colonize_button && m_colonize_button->Parent() == this) { m_colonize_button->MoveTo(GG::Pt(left, y)); y += m_colonize_button->Height() + EDGE_PAD; } else if (m_invade_button && m_invade_button->Parent() == this) { @@ -1171,9 +1161,6 @@ DetachChild(m_invade_button); delete m_invade_button; m_invade_button = 0; - DetachChild(m_colonize_instruction); - delete m_colonize_instruction; m_colonize_instruction = 0; - DetachChild(m_specials_panel); delete m_specials_panel; m_specials_panel = 0; @@ -1255,7 +1242,6 @@ DetachChild(m_invade_button); DetachChild(m_colonize_button); - DetachChild(m_colonize_instruction); std::string species_name; if (!planet->SpeciesName().empty()) @@ -1328,10 +1314,6 @@ AttachChild(m_invade_button); if (m_invade_button) m_invade_button->SetText(UserString("PL_CANCEL_INVADE")); - - } else if (!selected_colony_ship && could_colonize) { - // show colonization instruction text - AttachChild(m_colonize_instruction); } m_env_size->SetText(env_size_text); |
From: <geo...@us...> - 2012-12-06 16:58:52
|
Revision: 5521 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5521&view=rev Author: geoffthemedio Date: 2012-12-06 16:58:45 +0000 (Thu, 06 Dec 2012) Log Message: ----------- Removed some seemingly unnecessary instance counting from RotatingPlanetControl. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2012-12-06 14:46:41 UTC (rev 5520) +++ trunk/FreeOrion/UI/SidePanel.cpp 2012-12-06 16:58:45 UTC (rev 5521) @@ -576,16 +576,9 @@ s_scanline_shader = boost::shared_ptr<ShaderProgram>( ShaderProgram::shaderProgramFactory("", shader_text)); } - s_instances_counter++; Refresh(); } - ~RotatingPlanetControl() { - s_instances_counter--; - if (!s_instances_counter && s_scanline_shader) - s_scanline_shader.reset(); - } - virtual void Render() { GG::Pt ul = UpperLeft(), lr = LowerRight(); // render rotating base planet texture @@ -675,11 +668,10 @@ StarType m_star_type; static boost::shared_ptr<ShaderProgram> s_scanline_shader; - static int s_instances_counter; }; boost::shared_ptr<ShaderProgram> RotatingPlanetControl::s_scanline_shader = boost::shared_ptr<ShaderProgram>(); -int RotatingPlanetControl::s_instances_counter = 0; + namespace { int SystemNameFontSize() { return ClientUI::Pts()*1.5; @@ -1211,7 +1203,7 @@ bool mine = planet->OwnedBy(client_empire_id); bool populated = planet->CurrentMeterValue(METER_POPULATION) > 0.0; bool habitable = planet_env_for_colony_species >= PE_HOSTILE && planet_env_for_colony_species <= PE_GOOD; - bool visible = GetUniverse().GetObjectVisibilityByEmpire(m_planet_id, client_empire_id) >= VIS_PARTIAL_VISIBILITY; + bool visible = GetUniverse().GetObjectVisibilityByEmpire(m_planet_id, client_empire_id) >= VIS_BASIC_VISIBILITY; bool shielded = planet->CurrentMeterValue(METER_SHIELD) > 0.0; bool being_colonized = planet->IsAboutToBeColonized(); bool outpostable = !populated && ( !has_owner /*&& !shielded*/ ) && visible && !being_colonized; @@ -1633,9 +1625,7 @@ // cancel previous invasion orders for this planet for (std::set<int>::const_iterator o_it = planet_invade_orders.begin(); o_it != planet_invade_orders.end(); ++o_it) - { - HumanClientApp::GetApp()->Orders().RecindOrder(*o_it); - } + { HumanClientApp::GetApp()->Orders().RecindOrder(*o_it); } } else { // order selected invasion ships to invade planet @@ -1650,7 +1640,8 @@ CancelColonizeInvadeScrapShipOrders(ship); - HumanClientApp::GetApp()->Orders().IssueOrder(OrderPtr(new InvadeOrder(empire_id, ship->ID(), m_planet_id))); + HumanClientApp::GetApp()->Orders().IssueOrder(OrderPtr( + new InvadeOrder(empire_id, ship->ID(), m_planet_id))); } } } |
From: <geo...@us...> - 2012-12-31 16:01:24
|
Revision: 5594 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5594&view=rev Author: geoffthemedio Date: 2012-12-31 16:01:17 +0000 (Mon, 31 Dec 2012) Log Message: ----------- Slightly groomed patch by yandonman adding one-click invading. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2012-12-31 15:53:25 UTC (rev 5593) +++ trunk/FreeOrion/UI/SidePanel.cpp 2012-12-31 16:01:17 UTC (rev 5594) @@ -1001,7 +1001,7 @@ } namespace { - bool AvailableToColonize(const Ship* ship, int system_id, int empire_id) { + bool IsAvailable(const Ship* ship, int system_id, int empire_id) { if (!ship) return false; Fleet* fleet = GetFleet(ship->FleetID()); @@ -1010,14 +1010,38 @@ if (ship->SystemID() == system_id && ship->OwnedBy(empire_id) && ship->GetVisibility(empire_id) >= VIS_PARTIAL_VISIBILITY && - ship->CanColonize() && - ship->OrderedColonizePlanet() == INVALID_OBJECT_ID && ship->OrderedScrapped() == false && fleet->FinalDestinationID() == INVALID_OBJECT_ID ) { return true; } return false; + } + + bool AvailableToColonize(const Ship* ship, int system_id, int empire_id) { + if (!ship) + return false; + Fleet* fleet = GetFleet(ship->FleetID()); + if (!fleet) + return false; + if ( IsAvailable(ship, system_id, empire_id) && + ship->CanColonize() && + ship->OrderedColonizePlanet() == INVALID_OBJECT_ID ) + { return true; } + return false; }; + bool AvailableToInvade(const Ship* ship, int system_id, int empire_id) { + if (!ship) + return false; + Fleet* fleet = GetFleet(ship->FleetID()); + if (!fleet) + return false; + if (IsAvailable(ship, system_id, empire_id) && + ship->HasTroops() && + ship->OrderedInvadePlanet() == INVALID_OBJECT_ID ) + { return true; } + return false; + }; + bool CanColonizePlanetType(const Ship* ship, PlanetType planet_type) { if (!ship || planet_type == INVALID_PLANET_TYPE) return false; @@ -1042,8 +1066,8 @@ return 0; } - std::set<Ship*> ValidSelectedInvasionShips(int system_id) { - std::set<Ship*> retval; + std::set<const Ship*> ValidSelectedInvasionShips(int system_id) { + std::set<const Ship*> retval; // if not looking in a valid system, no valid colony ship can be available if (system_id == INVALID_OBJECT_ID) @@ -1127,6 +1151,56 @@ return (*capable_and_available_colony_ships.begin())->ID(); } + +std::set<const Ship*> AutomaticallyChosenInvasionShips(int target_planet_id) { + std::set<const Ship*> retval; + + int empire_id = HumanClientApp::GetApp()->EmpireID(); + if (empire_id == ALL_EMPIRES) + return retval; + + const Planet* target_planet = GetPlanet(target_planet_id); + if (!target_planet) + return retval; + int system_id = target_planet->SystemID(); + const System* system = GetSystem(system_id); + if (!system) + return retval; + + //Can't invade owned-by-self planets; early exit + if ( target_planet->OwnedBy(empire_id)) + return retval; + + + // get "just enough" ships that can invade and that are free to do so + + double defending_troops = target_planet->CurrentMeterValue(METER_TROOPS); + + + const ObjectMap& objects = Objects(); + std::vector<const Ship*> ships = objects.FindObjects<Ship>(); + + double invasion_troops = 0; + for (std::vector<const Ship*>::const_iterator it = ships.begin(); it != ships.end(); ++it) { + const Ship* ship = *it; + if (!AvailableToInvade(ship, system_id, empire_id)) + continue; + + if (const ShipDesign* design = ship->Design()) + invasion_troops += design->TroopCapacity(); + + + retval.insert(ship); + + //Rational for "+1" : Based on observation, ground combat seems to round up the defending troops value when it's fractional. + //Either that or growth of the planet's troop meter tends to need a little buffer when invading. + if (invasion_troops > (defending_troops +1)) + break; + } + + return retval; +} + void SidePanel::PlanetPanel::Refresh() { int client_empire_id = HumanClientApp::GetApp()->EmpireID(); m_planet_connection.disconnect(); @@ -1180,8 +1254,13 @@ const Ship* selected_colony_ship = ValidSelectedColonyShip(SidePanel::SystemID()); if (!selected_colony_ship) selected_colony_ship = GetShip(AutomaticallyChosenColonyShip(m_planet_id)); - std::set<Ship*> invasion_ships = ValidSelectedInvasionShips(SidePanel::SystemID()); + std::set<const Ship*> invasion_ships = ValidSelectedInvasionShips(SidePanel::SystemID()); + if( invasion_ships.empty() ){ + std::set<const Ship*> autoselected_invasion_ships = AutomaticallyChosenInvasionShips(m_planet_id); + invasion_ships.insert(autoselected_invasion_ships.begin(), autoselected_invasion_ships.end()); + } + std::string colony_ship_species_name; const ShipDesign* design = 0; double colony_ship_capacity = 0.0; @@ -1295,7 +1374,7 @@ // show invade button AttachChild(m_invade_button); double invasion_troops = 0.0; - for (std::set<Ship*>::const_iterator ship_it = invasion_ships.begin(); + for (std::set<const Ship*>::const_iterator ship_it = invasion_ships.begin(); ship_it != invasion_ships.end(); ++ship_it) { const Ship* invasion_ship = *ship_it; @@ -1629,12 +1708,18 @@ } else { // order selected invasion ships to invade planet - std::set<Ship*> invasion_ships = ValidSelectedInvasionShips(planet->SystemID()); + + std::set<const Ship*> invasion_ships = ValidSelectedInvasionShips(planet->SystemID()); - for (std::set<Ship*>::const_iterator ship_it = invasion_ships.begin(); + if( invasion_ships.empty() ){ + std::set<const Ship*> autoselected_invasion_ships = AutomaticallyChosenInvasionShips(m_planet_id); + invasion_ships.insert(autoselected_invasion_ships.begin(), autoselected_invasion_ships.end()); + } + + for (std::set<const Ship*>::const_iterator ship_it = invasion_ships.begin(); ship_it != invasion_ships.end(); ++ship_it) { - Ship* ship = *ship_it; + const Ship* ship = *ship_it; if (!ship) continue; |
From: <geo...@us...> - 2013-01-12 10:48:35
|
Revision: 5634 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5634&view=rev Author: geoffthemedio Date: 2013-01-12 10:48:25 +0000 (Sat, 12 Jan 2013) Log Message: ----------- Removed unneeded could colonize test. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2013-01-12 09:57:57 UTC (rev 5633) +++ trunk/FreeOrion/UI/SidePanel.cpp 2013-01-12 10:48:25 UTC (rev 5634) @@ -1255,7 +1255,7 @@ if (!selected_colony_ship) selected_colony_ship = GetShip(AutomaticallyChosenColonyShip(m_planet_id)); std::set<const Ship*> invasion_ships = ValidSelectedInvasionShips(SidePanel::SystemID()); - if( invasion_ships.empty() ){ + if (invasion_ships.empty()){ std::set<const Ship*> autoselected_invasion_ships = AutomaticallyChosenInvasionShips(m_planet_id); invasion_ships.insert(autoselected_invasion_ships.begin(), autoselected_invasion_ships.end()); } @@ -1289,9 +1289,6 @@ bool colonizable = habitable && !populated && ( (!has_owner /*&& !shielded*/) || mine) && visible && !being_colonized; bool can_colonize = selected_colony_ship && (colonizable || (outpostable && colony_ship_capacity == 0.0)); - bool could_colonize = OwnedColonyShipsInSystem(client_empire_id, SidePanel::SystemID()) && - !populated && (!has_owner || mine) && visible && !being_colonized /*&& !shielded*/; - bool being_invaded = planet->IsAboutToBeInvaded(); bool at_war_with_me = !mine && (populated || (has_owner && Empires().GetDiplomaticStatus(client_empire_id, planet->Owner()) == DIPLO_WAR)); bool invadable = at_war_with_me && !shielded && visible && !being_invaded && !invasion_ships.empty(); @@ -1339,7 +1336,7 @@ % GetPlanetEnvironmentName(*planet, species_name)); - if (Disabled() || !(can_colonize || could_colonize || being_colonized || invadable || being_invaded)) { + if (Disabled() || !(can_colonize || being_colonized || invadable || being_invaded)) { // hide everything } else if (can_colonize) { |
From: <geo...@us...> - 2013-01-19 15:25:37
|
Revision: 5656 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5656&view=rev Author: geoffthemedio Date: 2013-01-19 15:25:30 +0000 (Sat, 19 Jan 2013) Log Message: ----------- Groomed patch by yandonman tweaking one-click colonize and outpost button function. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2013-01-19 06:42:15 UTC (rev 5655) +++ trunk/FreeOrion/UI/SidePanel.cpp 2013-01-19 15:25:30 UTC (rev 5656) @@ -1045,9 +1045,25 @@ bool CanColonizePlanetType(const Ship* ship, PlanetType planet_type) { if (!ship || planet_type == INVALID_PLANET_TYPE) return false; + + const ShipDesign* design = 0; + double colony_ship_capacity = 0.0; + + design = ship->Design(); + if (design) + colony_ship_capacity = design->ColonyCapacity(); + if (const Species* colony_ship_species = GetSpecies(ship->SpeciesName())) { PlanetEnvironment planet_env_for_colony_species = colony_ship_species->GetPlanetEnvironment(planet_type); - return planet_env_for_colony_species >= PE_HOSTILE && planet_env_for_colony_species <= PE_GOOD; + + // One-Click Colonize planets that are colonizable (even if they are + // not hospitable), and One-Click Outpost planets that are not + // colonizable. + if (colony_ship_capacity > 0.0) { + return planet_env_for_colony_species >= PE_HOSTILE && planet_env_for_colony_species <= PE_GOOD; + } else { + return planet_env_for_colony_species < PE_HOSTILE || planet_env_for_colony_species > PE_GOOD; + } } return false; } |
From: <geo...@us...> - 2013-01-27 16:52:14
|
Revision: 5686 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5686&view=rev Author: geoffthemedio Date: 2013-01-27 16:52:08 +0000 (Sun, 27 Jan 2013) Log Message: ----------- Tweaked automatic invasion planning to use expected next turn meter value instead of current meter value + 1 to ensure successful invasions. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2013-01-27 13:26:48 UTC (rev 5685) +++ trunk/FreeOrion/UI/SidePanel.cpp 2013-01-27 16:52:08 UTC (rev 5686) @@ -1183,15 +1183,13 @@ return retval; //Can't invade owned-by-self planets; early exit - if ( target_planet->OwnedBy(empire_id)) + if (target_planet->OwnedBy(empire_id)) return retval; // get "just enough" ships that can invade and that are free to do so + double defending_troops = target_planet->NextTurnCurrentMeterValue(METER_TROOPS); - double defending_troops = target_planet->CurrentMeterValue(METER_TROOPS); - - const ObjectMap& objects = Objects(); std::vector<const Ship*> ships = objects.FindObjects<Ship>(); @@ -1204,12 +1202,9 @@ if (const ShipDesign* design = ship->Design()) invasion_troops += design->TroopCapacity(); - retval.insert(ship); - //Rational for "+1" : Based on observation, ground combat seems to round up the defending troops value when it's fractional. - //Either that or growth of the planet's troop meter tends to need a little buffer when invading. - if (invasion_troops > (defending_troops +1)) + if (invasion_troops > defending_troops) break; } |
From: <geo...@us...> - 2013-06-16 10:21:35
|
Revision: 6160 http://sourceforge.net/p/freeorion/code/6160 Author: geoffthemedio Date: 2013-06-16 10:21:31 +0000 (Sun, 16 Jun 2013) Log Message: ----------- Changed how asteroid graphics are loaded to hopefully avoid brief hangs that sometimes occurred when viewing systems with asteroids in them. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2013-06-16 05:46:34 UTC (rev 6159) +++ trunk/FreeOrion/UI/SidePanel.cpp 2013-06-16 10:21:31 UTC (rev 6160) @@ -724,13 +724,13 @@ : XMLElement(); } - void GetAsteroidTextures(int planet_id, std::vector<boost::shared_ptr<GG::Texture> > &textures) { - const int NUM_ASTEROID_SETS = 3; - const int NUM_IMAGES_PER_SET = 256; - const int SET = (planet_id % NUM_ASTEROID_SETS) + 1; - - for (int i = 0; i < NUM_IMAGES_PER_SET; ++i) - textures.push_back(ClientUI::GetTexture(ClientUI::ArtDir() / "planets" / "asteroids" / boost::io::str(boost::format("asteroids%d_%03d.png") % SET % i))); + const std::vector<boost::shared_ptr<GG::Texture> >& GetAsteroidTextures() { + static std::vector<boost::shared_ptr<GG::Texture> > retval; + if (retval.empty()) { + retval = ClientUI::GetClientUI()->GetPrefixedTextures( + ClientUI::ArtDir() / "planets" / "asteroids", "asteroids1_", false); + } + return retval; } const std::string EMPTY_STRING; @@ -1021,8 +1021,9 @@ m_rotating_planet_graphic = 0; if (planet->Type() == PT_ASTEROIDS) { - std::vector<boost::shared_ptr<GG::Texture> > textures; - GetAsteroidTextures(m_planet_id, textures); + const std::vector<boost::shared_ptr<GG::Texture> >& textures = GetAsteroidTextures(); + if (textures.empty()) + return; GG::X texture_width = textures[0]->DefaultWidth(); GG::Y texture_height = textures[0]->DefaultHeight(); GG::Pt planet_image_pos(GG::X(MaxPlanetDiameter() / 2 - texture_width / 2 + 3), GG::Y0); |
From: <dil...@us...> - 2013-06-16 20:25:08
|
Revision: 6161 http://sourceforge.net/p/freeorion/code/6161 Author: dilvish-fo Date: 2013-06-16 20:25:02 +0000 (Sun, 16 Jun 2013) Log Message: ----------- changes AutomaticallyChosenColonyShip to use a hopefully more efficient way of getting list of local colony ships Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2013-06-16 10:21:31 UTC (rev 6160) +++ trunk/FreeOrion/UI/SidePanel.cpp 2013-06-16 20:25:02 UTC (rev 6161) @@ -18,6 +18,7 @@ #include "../universe/Ship.h" #include "../universe/Building.h" #include "../universe/Species.h" +#include "../universe/System.h" #include "../Empire/Empire.h" #include "../util/Directories.h" #include "../util/i18n.h" @@ -1186,15 +1187,15 @@ PlanetType target_planet_type = target_planet->Type(); - const ObjectMap& objects = Objects(); - std::vector<const Ship*> ships = objects.FindObjects<Ship>(); + //const ObjectMap& objects = Objects(); + std::vector<int> ships = system->FindObjectIDs<Ship>(); std::vector<const Ship*> capable_and_available_colony_ships; capable_and_available_colony_ships.reserve(ships.size()); // get all ships that can colonize and that are free to do so in the // specified planet'ssystem and that can colonize the requested planet - for (std::vector<const Ship*>::const_iterator it = ships.begin(); it != ships.end(); ++it) { - const Ship* ship = *it; + for (std::vector<int>::const_iterator it = ships.begin(); it != ships.end(); ++it) { + const Ship* ship = GetShip(*it); if (!AvailableToColonize(ship, system_id, empire_id)) continue; if (!CanColonizePlanetType(ship, target_planet_type)) |
From: <dil...@us...> - 2013-06-16 22:18:50
|
Revision: 6162 http://sourceforge.net/p/freeorion/code/6162 Author: dilvish-fo Date: 2013-06-16 22:18:47 +0000 (Sun, 16 Jun 2013) Log Message: ----------- fixes bug where auto colony code would sometimes leave the client universe in a state of modified planet ownership Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2013-06-16 20:25:02 UTC (rev 6161) +++ trunk/FreeOrion/UI/SidePanel.cpp 2013-06-16 22:18:47 UTC (rev 6162) @@ -1213,7 +1213,6 @@ // pick the "best" one. std::string orig_species = target_planet->SpeciesName(); //should be just "" int orig_owner = target_planet->Owner(); - target_planet->SetOwner(empire_id); int best_ship = INVALID_OBJECT_ID; float best_capacity = -999; bool changed_planet = false; @@ -1230,6 +1229,7 @@ planet_capacity = pair_it->second; } else { changed_planet = true; + target_planet->SetOwner(empire_id); target_planet->SetSpecies((*ship_it)->SpeciesName()); GetUniverse().UpdateMeterEstimates(target_planet_id); const Species* species = GetSpecies((*ship_it)->SpeciesName()); |
From: <geo...@us...> - 2013-06-21 21:57:53
|
Revision: 6182 http://sourceforge.net/p/freeorion/code/6182 Author: geoffthemedio Date: 2013-06-21 21:57:50 +0000 (Fri, 21 Jun 2013) Log Message: ----------- minor grooming Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2013-06-21 21:57:22 UTC (rev 6181) +++ trunk/FreeOrion/UI/SidePanel.cpp 2013-06-21 21:57:50 UTC (rev 6182) @@ -1888,10 +1888,9 @@ } else { // order selected invasion ships to invade planet - std::set<const Ship*> invasion_ships = ValidSelectedInvasionShips(planet->SystemID()); - if( invasion_ships.empty() ){ + if (invasion_ships.empty()) { std::set<const Ship*> autoselected_invasion_ships = AutomaticallyChosenInvasionShips(m_planet_id); invasion_ships.insert(autoselected_invasion_ships.begin(), autoselected_invasion_ships.end()); } |
From: <dil...@us...> - 2013-06-22 23:32:54
|
Revision: 6186 http://sourceforge.net/p/freeorion/code/6186 Author: dilvish-fo Date: 2013-06-22 23:32:51 +0000 (Sat, 22 Jun 2013) Log Message: ----------- - fixes an outpost/colony conflict in the auto colony feature, also improves its efficiency Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2013-06-22 23:09:12 UTC (rev 6185) +++ trunk/FreeOrion/UI/SidePanel.cpp 2013-06-22 23:32:51 UTC (rev 6186) @@ -46,6 +46,7 @@ const int EDGE_PAD(3); const double TWO_PI(2.0*3.1415926536); std::map<std::pair<int,int>,float> colony_projections; + std::map<std::pair<std::string,int>,float> species_colony_projections; void PlaySidePanelOpenSound() {Sound::GetSound().PlaySound(GetOptionsDB().Get<std::string>("UI.sound.sidepanel-open"), true);} void PlayFarmingFocusClickSound() {Sound::GetSound().PlaySound(GetOptionsDB().Get<std::string>("UI.sound.farming-focus"), true);} @@ -1220,39 +1221,60 @@ GetUniverse().InhibitUniverseObjectSignals(true); for (std::vector<const Ship*>::const_iterator ship_it = capable_and_available_colony_ships.begin(); ship_it != capable_and_available_colony_ships.end(); ship_it++) - { - int ship_id = (*ship_it)->ID(); - double planet_capacity = -999; - std::pair<int,int> this_pair = std::make_pair<int,int>(ship_id, target_planet_id); - std::map<std::pair<int,int>,float>::iterator pair_it = colony_projections.find(this_pair); - if (pair_it != colony_projections.end()) { - planet_capacity = pair_it->second; - } else { - changed_planet = true; - target_planet->SetOwner(empire_id); - target_planet->SetSpecies((*ship_it)->SpeciesName()); - GetUniverse().UpdateMeterEstimates(target_planet_id); - const Species* species = GetSpecies((*ship_it)->SpeciesName()); - PlanetEnvironment planet_environment = PE_UNINHABITABLE; - if (species) - planet_environment = species->GetPlanetEnvironment(target_planet->Type()); - planet_capacity = ((planet_environment == PE_UNINHABITABLE) ? 0 : target_planet->CurrentMeterValue(METER_TARGET_POPULATION)); - colony_projections[this_pair] = planet_capacity; - } - if (planet_capacity > best_capacity) { - best_capacity = planet_capacity; - best_ship = ship_id; - } - } - if (changed_planet) { - target_planet->SetOwner(orig_owner); - target_planet->SetSpecies(orig_species); - GetUniverse().UpdateMeterEstimates(target_planet_id); - Logger().debugStream() << "Autoselected colony ship " << best_ship << " for planet " << target_planet->Name(); - } - GetUniverse().InhibitUniverseObjectSignals(false); + { + const Ship* ship = *ship_it; + if (!ship) + continue; + int ship_id = ship->ID(); + double planet_capacity = -999; + std::pair<int,int> this_pair = std::make_pair<int,int>(ship_id, target_planet_id); + std::map<std::pair<int,int>,float>::iterator pair_it = colony_projections.find(this_pair); + if (pair_it != colony_projections.end()) { + planet_capacity = pair_it->second; + } else { + double colony_ship_capacity = 0.0; + std::string ship_species_name; + const ShipDesign* design = ship->Design(); + if (!design) + continue; + colony_ship_capacity = design->ColonyCapacity(); + if (colony_ship_capacity > 0.0 ) { + ship_species_name = ship->SpeciesName(); + std::pair<std::string,int> spec_pair = std::make_pair<std::string,int>(ship_species_name, target_planet_id); + std::map<std::pair<std::string,int>,float>::iterator spec_pair_it = species_colony_projections.find(spec_pair); + if (spec_pair_it != species_colony_projections.end()) { + planet_capacity = spec_pair_it->second; + } else { + const Species* species = GetSpecies(ship_species_name); + PlanetEnvironment planet_environment = PE_UNINHABITABLE; + if (species) + planet_environment = species->GetPlanetEnvironment(target_planet->Type()); + if (planet_environment != PE_UNINHABITABLE) { + changed_planet = true; + target_planet->SetOwner(empire_id); + target_planet->SetSpecies(ship_species_name); + GetUniverse().UpdateMeterEstimates(target_planet_id); + planet_capacity = target_planet->CurrentMeterValue(METER_TARGET_POPULATION); + } + species_colony_projections[spec_pair] = planet_capacity; + } + } + colony_projections[this_pair] = planet_capacity; + } + if (planet_capacity > best_capacity) { + best_capacity = planet_capacity; + best_ship = ship_id; + } + } + if (changed_planet) { + target_planet->SetOwner(orig_owner); + target_planet->SetSpecies(orig_species); + GetUniverse().UpdateMeterEstimates(target_planet_id); + Logger().debugStream() << "Autoselected colony ship " << best_ship << " for planet " << target_planet->Name(); + } + GetUniverse().InhibitUniverseObjectSignals(false); - return best_ship; + return best_ship; } std::set<const Ship*> AutomaticallyChosenInvasionShips(int target_planet_id) { @@ -1388,7 +1410,7 @@ bool being_colonized = planet->IsAboutToBeColonized(); bool outpostable = !populated && ( !has_owner /*&& !shielded*/ ) && visible && !being_colonized; bool colonizable = habitable && !populated && ( (!has_owner /*&& !shielded*/) || mine) && visible && !being_colonized; - bool can_colonize = selected_colony_ship && (colonizable || (outpostable && colony_ship_capacity == 0.0)); + bool can_colonize = selected_colony_ship && (colonizable && colony_ship_capacity > 0.0 || (outpostable && colony_ship_capacity == 0.0)); bool being_invaded = planet->IsAboutToBeInvaded(); bool at_war_with_me = !mine && (populated || (has_owner && Empires().GetDiplomaticStatus(client_empire_id, planet->Owner()) == DIPLO_WAR)); @@ -1453,6 +1475,9 @@ std::map<std::pair<int,int>,float>::iterator pair_it = colony_projections.find(this_pair); if (pair_it != colony_projections.end()) { planet_capacity = pair_it->second; + } else if (colony_ship_capacity==0.0) { + planet_capacity = 0.0; + colony_projections[this_pair] = planet_capacity; } else { GetUniverse().InhibitUniverseObjectSignals(true); std::string orig_species = planet->SpeciesName(); //should be just "" @@ -2443,6 +2468,7 @@ // clear any previous colony projections colony_projections.clear(); + species_colony_projections.clear(); // refresh individual panels' contents |
From: <dil...@us...> - 2013-07-06 15:44:11
|
Revision: 6225 http://sourceforge.net/p/freeorion/code/6225 Author: dilvish-fo Date: 2013-07-06 15:44:05 +0000 (Sat, 06 Jul 2013) Log Message: ----------- - fixes autocolony problem failing to suggest outposting if two outpost ships in system Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2013-07-06 02:35:17 UTC (rev 6224) +++ trunk/FreeOrion/UI/SidePanel.cpp 2013-07-06 15:44:05 UTC (rev 6225) @@ -1258,6 +1258,8 @@ } species_colony_projections[spec_pair] = planet_capacity; } + } else { + planet_capacity = 0; } colony_projections[this_pair] = planet_capacity; } |
From: <dil...@us...> - 2013-07-25 07:18:44
|
Revision: 6262 http://sourceforge.net/p/freeorion/code/6262 Author: dilvish-fo Date: 2013-07-25 07:18:42 +0000 (Thu, 25 Jul 2013) Log Message: ----------- fix for interaction of Planet Focus change with pop projection on colonize button Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2013-07-24 16:02:01 UTC (rev 6261) +++ trunk/FreeOrion/UI/SidePanel.cpp 2013-07-25 07:18:42 UTC (rev 6262) @@ -1614,6 +1614,8 @@ const Planet* planet = GetPlanet(m_planet_id); if (!planet || !planet->OwnedBy(HumanClientApp::GetApp()->EmpireID())) return; + colony_projections.clear();// in case new or old focus was Growth (important that be cleared BEFORE Order is issued) + species_colony_projections.clear(); HumanClientApp::GetApp()->Orders().IssueOrder(OrderPtr( new ChangeFocusOrder(HumanClientApp::GetApp()->EmpireID(), planet->ID(), focus))); } |
From: <geo...@us...> - 2013-07-27 12:14:36
|
Revision: 6273 http://sourceforge.net/p/freeorion/code/6273 Author: geoffthemedio Date: 2013-07-27 12:14:32 +0000 (Sat, 27 Jul 2013) Log Message: ----------- Added code to set the initial meter values of planets to 0 before doing potential colonization test meter updating. Some conditions have target population tests which required 0 or greater, which fail on some currently uncolonized planets due to their negative target populations when without a species, even though when colonized the species would boost the target population above zero. This change artificially sets the initial population value for those planets to 0 so that those conditions will pass. This essentially recreates the effect of a recently fixed bug where unpopulated planet meter values were sent as 0 from the server even when they were negative, which hid this issue by similarly letting the conditions pass. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2013-07-27 10:22:42 UTC (rev 6272) +++ trunk/FreeOrion/UI/SidePanel.cpp 2013-07-27 12:14:32 UTC (rev 6273) @@ -1214,10 +1214,10 @@ // pick the "best" one. std::string orig_species = target_planet->SpeciesName(); //should be just "" int orig_owner = target_planet->Owner(); + float orig_initial_target_pop = target_planet->GetMeter(METER_TARGET_POPULATION)->Initial(); int best_ship = INVALID_OBJECT_ID; float best_capacity = -999; bool changed_planet = false; - std::vector<int> planet_vec(1, target_planet_id); GetUniverse().InhibitUniverseObjectSignals(true); for (std::vector<const Ship*>::const_iterator ship_it = capable_and_available_colony_ships.begin(); @@ -1254,8 +1254,8 @@ changed_planet = true; target_planet->SetOwner(empire_id); target_planet->SetSpecies(ship_species_name); - //GetUniverse().UpdateMeterEstimates(target_planet_id); - GetUniverse().ApplyMeterEffectsAndUpdateMeters(planet_vec); //use this instead of UpdateMeterEstimates so that clamping is done + target_planet->GetMeter(METER_TARGET_POPULATION)->Set(0.0, 0.0); + GetUniverse().UpdateMeterEstimates(target_planet_id); planet_capacity = target_planet->CurrentMeterValue(METER_TARGET_POPULATION); } species_colony_projections[spec_pair] = planet_capacity; @@ -1271,11 +1271,10 @@ } } if (changed_planet) { - //Logger().debugStream() << "Autoselected colony ship " << best_ship << " for planet " << target_planet->Name() << "; capacity " << best_capacity; target_planet->SetOwner(orig_owner); target_planet->SetSpecies(orig_species); - //GetUniverse().UpdateMeterEstimates(target_planet_id); - GetUniverse().ApplyMeterEffectsAndUpdateMeters(planet_vec); //use this instead of UpdateMeterEstimates so that clamping is done + target_planet->GetMeter(METER_TARGET_POPULATION)->Set(orig_initial_target_pop, orig_initial_target_pop); + GetUniverse().UpdateMeterEstimates(target_planet_id); } GetUniverse().InhibitUniverseObjectSignals(false); @@ -1475,28 +1474,28 @@ // then setting the planet back as it was. The results are cached for the duration of the turn // in the colony_projections map. AttachChild(m_colonize_button); - double planet_capacity = 0.0; - std::vector<int> planet_vec(1, m_planet_id); + double planet_capacity; std::pair<int,int> this_pair = std::make_pair<int,int>(selected_colony_ship->ID(), m_planet_id); std::map<std::pair<int,int>,float>::iterator pair_it = colony_projections.find(this_pair); if (pair_it != colony_projections.end()) { planet_capacity = pair_it->second; } else if (colony_ship_capacity==0.0) { + planet_capacity = 0.0; colony_projections[this_pair] = planet_capacity; } else { GetUniverse().InhibitUniverseObjectSignals(true); std::string orig_species = planet->SpeciesName(); //should be just "" int orig_owner = planet->Owner(); + float orig_initial_target_pop = planet->GetMeter(METER_TARGET_POPULATION)->Initial(); planet->SetOwner(client_empire_id); planet->SetSpecies(colony_ship_species_name); - //GetUniverse().UpdateMeterEstimates(m_planet_id); - GetUniverse().ApplyMeterEffectsAndUpdateMeters(planet_vec); //use this instead of UpdateMeterEstimates so that clamping is done - if (planet_env_for_colony_species != PE_UNINHABITABLE) - planet_capacity = planet->CurrentMeterValue(METER_TARGET_POPULATION); + planet->GetMeter(METER_TARGET_POPULATION)->Set(0.0, 0.0); + GetUniverse().UpdateMeterEstimates(m_planet_id); + planet_capacity = ((planet_env_for_colony_species == PE_UNINHABITABLE) ? 0 : planet->CurrentMeterValue(METER_TARGET_POPULATION)); planet->SetOwner(orig_owner); planet->SetSpecies(orig_species); - //GetUniverse().UpdateMeterEstimates(m_planet_id); - GetUniverse().ApplyMeterEffectsAndUpdateMeters(planet_vec); //use this instead of UpdateMeterEstimates so that clamping is done + planet->GetMeter(METER_TARGET_POPULATION)->Set(orig_initial_target_pop, orig_initial_target_pop); + GetUniverse().UpdateMeterEstimates(m_planet_id); colony_projections[this_pair] = planet_capacity; GetUniverse().InhibitUniverseObjectSignals(false); } |
From: <dil...@us...> - 2013-11-27 23:28:11
|
Revision: 6543 http://sourceforge.net/p/freeorion/code/6543 Author: dilvish-fo Date: 2013-11-27 23:28:06 +0000 (Wed, 27 Nov 2013) Log Message: ----------- sorts System Selection DropDown list alphabetically. Caveat: done by true name, so 'deep space' listings will still be scattered throughout Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2013-11-27 18:38:30 UTC (rev 6542) +++ trunk/FreeOrion/UI/SidePanel.cpp 2013-11-27 23:28:06 UTC (rev 6543) @@ -2731,17 +2731,17 @@ // populate droplist of system names { ScopedTimer("SidePanel::RefreshImpl droplist population", true); - int system_names_in_droplist = 0; + std::map< std::string, int > system_map; //alphabetize Systems here for (ObjectMap::const_iterator<System> sys_it = Objects().const_begin<System>(); - sys_it != Objects().const_end<System>(); ++sys_it) + sys_it != Objects().const_end<System>(); ++sys_it) { - int sys_id = sys_it->ID(); + if (!sys_it->Name().empty() || sys_it->ID()==s_system_id) // skip rows for systems that aren't known to this client, except the selected system + system_map.insert(std::make_pair<std::string, int>(sys_it->Name(), sys_it->ID())); + } + for ( std::map< std::string, int >::iterator sys_it = system_map.begin(); sys_it != system_map.end(); sys_it++) { + int sys_id = sys_it->second; - if (sys_it->Name().empty() && sys_id != s_system_id) - continue; // skip rows for systems that aren't known to this client, except the selected system - GG::DropDownList::iterator latest_it = m_system_name->Insert(new SystemRow(sys_id)); - ++system_names_in_droplist; if (sys_id == s_system_id) m_system_name->Select(latest_it); @@ -2752,7 +2752,7 @@ const GG::Y TEXT_ROW_HEIGHT = CUISimpleDropDownListRow::DEFAULT_ROW_HEIGHT; const GG::Y MAX_DROPLIST_DROP_HEIGHT = TEXT_ROW_HEIGHT * 10; const int TOTAL_LISTBOX_MARGIN = 4; - GG::Y drop_height = std::min(TEXT_ROW_HEIGHT * system_names_in_droplist, MAX_DROPLIST_DROP_HEIGHT) + TOTAL_LISTBOX_MARGIN; + GG::Y drop_height = std::min(TEXT_ROW_HEIGHT * int(system_map.size()), MAX_DROPLIST_DROP_HEIGHT) + TOTAL_LISTBOX_MARGIN; m_system_name->SetDropHeight(drop_height); } |
From: <geo...@us...> - 2014-01-27 11:17:04
|
Revision: 6756 http://sourceforge.net/p/freeorion/code/6756 Author: geoffthemedio Date: 2014-01-27 11:17:01 +0000 (Mon, 27 Jan 2014) Log Message: ----------- Fixed bombard button layout when invasion button is also present. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2014-01-27 11:11:28 UTC (rev 6755) +++ trunk/FreeOrion/UI/SidePanel.cpp 2014-01-27 11:17:01 UTC (rev 6756) @@ -996,10 +996,12 @@ if (m_colonize_button && m_colonize_button->Parent() == this) { m_colonize_button->MoveTo(GG::Pt(left, y)); y += m_colonize_button->Height() + EDGE_PAD; - } else if (m_invade_button && m_invade_button->Parent() == this) { + } + if (m_invade_button && m_invade_button->Parent() == this) { m_invade_button->MoveTo(GG::Pt(left, y)); y += m_invade_button->Height() + EDGE_PAD; - } else if (m_bombard_button && m_bombard_button->Parent() == this) { + } + if (m_bombard_button && m_bombard_button->Parent() == this) { m_bombard_button->MoveTo(GG::Pt(left, y)); y += m_bombard_button->Height() + EDGE_PAD; } |
From: <geo...@us...> - 2014-01-31 02:24:52
|
Revision: 6778 http://sourceforge.net/p/freeorion/code/6778 Author: geoffthemedio Date: 2014-01-31 02:24:49 +0000 (Fri, 31 Jan 2014) Log Message: ----------- Added right-click menu give planet to empire and cancel commands. Not yet marked in the UI as is done for fleets. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2014-01-31 02:23:01 UTC (rev 6777) +++ trunk/FreeOrion/UI/SidePanel.cpp 2014-01-31 02:24:49 UTC (rev 6778) @@ -579,8 +579,7 @@ private: void DisableNonSelectionCandidates(); //!< disables planet panels that aren't selection candidates - void PlanetLeftClicked(int planet_id); //!< responds to user clicking a planet panel. emits PlanetSelectedSignal - void DoPanelsLayout(GG::Y top); //!< repositions PlanetPanels, positioning the top panel at y position \a top relative to the to of the container. + void PlanetLeftClicked(int planet_id); //!< responds to user clicking a planet panel. emits PlanetSelectedSignal void DoPanelsLayout(); //!< repositions PlanetPanels, without moving top panel. Panels below may shift if ones above them have resized. void DoLayout(); @@ -1819,10 +1818,37 @@ } void SidePanel::PlanetPanel::RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { + int client_empire_id = HumanClientApp::GetApp()->EmpireID(); + TemporaryPtr<const Planet> planet = GetPlanet(m_planet_id); if (!planet) return; + TemporaryPtr<const System> system = GetSystem(planet->SystemID()); // may be null + + // determine which other empires are at peace with client empire and have + // an owned object in this fleet's system + std::set<int> peaceful_empires_in_system; + if (system) { + std::vector<TemporaryPtr<const UniverseObject> > system_objects = + Objects().FindObjects<const UniverseObject>(system->ObjectIDs()); + for (std::vector<TemporaryPtr<const UniverseObject> >::const_iterator it = system_objects.begin(); + it != system_objects.end(); ++it) + { + TemporaryPtr<const UniverseObject> obj = *it; + if (obj->GetVisibility(client_empire_id) < VIS_PARTIAL_VISIBILITY) + continue; + if (obj->Owner() == client_empire_id || obj->Unowned()) + continue; + if (peaceful_empires_in_system.find(obj->Owner()) != peaceful_empires_in_system.end()) + continue; + if (Empires().GetDiplomaticStatus(client_empire_id, obj->Owner()) != DIPLO_PEACE) + continue; + peaceful_empires_in_system.insert(obj->Owner()); + } + } + + const MapWnd* map_wnd = ClientUI::GetClientUI()->GetMapWnd(); if (ClientPlayerIsModerator() && map_wnd->GetModeratorActionSetting() != MAS_NoAction) { RightClickedSignal(planet->ID()); // response handled in MapWnd @@ -1834,6 +1860,32 @@ menu_contents.next_level.push_back(GG::MenuItem(UserString("SP_RENAME_PLANET"), 1, false, false)); menu_contents.next_level.push_back(GG::MenuItem(UserString("SP_PLANET_SUITABILITY"), 2, false, false)); + + if (planet->OwnedBy(client_empire_id) + && !peaceful_empires_in_system.empty() + && !ClientPlayerIsModerator()) + { + menu_contents.next_level.push_back(GG::MenuItem(true)); + + // submenus for each available recipient empire + GG::MenuItem give_away_menu(UserString("ORDER_GIVE_PLANET_TO_EMPIRE"), -1, false, false); + for (EmpireManager::const_iterator it = Empires().begin(); + it != Empires().end(); ++it) + { + int other_empire_id = it->first; + if (peaceful_empires_in_system.find(other_empire_id) == peaceful_empires_in_system.end()) + continue; + give_away_menu.next_level.push_back(GG::MenuItem(it->second->Name(), 100 + other_empire_id, false, false)); + } + menu_contents.next_level.push_back(give_away_menu); + + if (planet->OrderedGivenToEmpire() != ALL_EMPIRES) { + GG::MenuItem cancel_give_away_menu(UserString("ORCER_CANCEL_GIVE_PLANET"), 12, false, false); + menu_contents.next_level.push_back(cancel_give_away_menu); + } + } + + GG::PopupMenu popup(pt.x, pt.y, ClientUI::GetFont(), menu_contents, ClientUI::TextColor(), ClientUI::WndOuterBorderColor(), ClientUI::WndColor(), ClientUI::EditHiliteColor()); @@ -1855,9 +1907,30 @@ { // colonizable/suitability report ClientUI::GetClientUI()->ZoomToPlanetPedia(m_planet_id); } - default: - break; + + case 12: { // cancel give away order for this fleet + const OrderSet orders = HumanClientApp::GetApp()->Orders(); + for (OrderSet::const_iterator it = orders.begin(); it != orders.end(); ++it) { + if (boost::shared_ptr<GiveObjectToEmpireOrder> order = + boost::dynamic_pointer_cast<GiveObjectToEmpireOrder>(it->second)) + { + if (order->ObjectID() == planet->ID()) { + HumanClientApp::GetApp()->Orders().RecindOrder(it->first); + // could break here, but won't to ensure there are no problems with doubled orders + } + } + } } + + default: { // check for menu item indicating give to other empire order + if (popup.MenuID() > 100) { + int recipient_empire_id = popup.MenuID() - 100; + HumanClientApp::GetApp()->Orders().IssueOrder( + OrderPtr(new GiveObjectToEmpireOrder(client_empire_id, planet->ID(), recipient_empire_id))); + } + break; + } + } } } @@ -2335,9 +2408,6 @@ GG::Connect(m_planet_panels.back()->ResizedSignal, &SidePanel::PlanetPanelContainer::DoPanelsLayout, this); } - // reset scroll when resetting planets to ensure new set of planets won't be stuck scrolled up out of view - VScroll(0, 0, 0, 0); - // disable non-selectable planet panels DisableNonSelectionCandidates(); @@ -2348,16 +2418,13 @@ SelectPlanet(initial_selected_planet_panel); } -void SidePanel::PlanetPanelContainer::DoPanelsLayout() -{ DoPanelsLayout(m_planet_panels_top); } - -void SidePanel::PlanetPanelContainer::DoPanelsLayout(GG::Y top) { - if (top > 0) - Logger().errorStream() << "SidePanel::PlanetPanelContainer::DoPanelsLaout passed positive top. It is expected to be 0 or negative only."; - m_planet_panels_top = top; - GG::Y y = m_planet_panels_top; +void SidePanel::PlanetPanelContainer::DoPanelsLayout() { + GG::Y y = GG::Y0; GG::X x = GG::X0; + if (m_vscroll && m_vscroll->Parent() == this) + y = GG::Y(-m_vscroll->PosnRange().first); + for (std::vector<PlanetPanel*>::iterator it = m_planet_panels.begin(); it != m_planet_panels.end(); ++it) { PlanetPanel* panel = *it; const GG::Y PANEL_HEIGHT = panel->Height(); // panel height may be different for each panel depending whether that panel has been previously left expanded or collapsed @@ -2394,9 +2461,9 @@ void SidePanel::PlanetPanelContainer::DoLayout() { GG::Pt scroll_ul(Width() - ClientUI::ScrollWidth(), GG::Y0); - //GG::Pt scroll_ul(ClientLowerRight().x - GG::X(ClientUI::ScrollWidth()), ClientUpperLeft().y); GG::Pt scroll_lr = scroll_ul + GG::Pt(GG::X(ClientUI::ScrollWidth()), Height()); m_vscroll->SizeMove(scroll_ul, scroll_lr); + DoPanelsLayout(); } @@ -2477,14 +2544,13 @@ int extra = pos_bottom - range_max; pos_top -= extra; } - DoPanelsLayout(GG::Y(-pos_top)); // scrolling bar down pos_top pixels causes the panels to move up that many pixels + + DoPanelsLayout(); } void SidePanel::PlanetPanelContainer::RefreshAllPlanetPanels() { - //std::cout << "SidePanel::PlanetPanelContainer::RefreshAllPlanetPanels. selected planet id: " << m_selected_planet_id << std::endl; for (std::vector<PlanetPanel*>::iterator it = m_planet_panels.begin(); it != m_planet_panels.end(); ++it) (*it)->Refresh(); - //std::cout << " ... after refreshing all planet panels: selected planet id: " << m_selected_planet_id << std::endl<< std::endl<< std::endl; } void SidePanel::PlanetPanelContainer::SizeMove(const GG::Pt& ul, const GG::Pt& lr) { @@ -2820,13 +2886,6 @@ m_planet_panel_container->SetPlanets(known_system_planet_ids, system->GetStarType()); - // restore planet panel container scroll position from before clearing - m_planet_panel_container->ScrollTo(initial_scroll_pos); - - // restore planet selection - m_planet_panel_container->SelectPlanet(initial_selected_planet_id); - - // populate system resource summary // get planets owned by player's empire @@ -2868,6 +2927,12 @@ } DoLayout(); + + // restore planet panel container scroll position from before clearing + m_planet_panel_container->ScrollTo(initial_scroll_pos); + + // restore planet selection + m_planet_panel_container->SelectPlanet(initial_selected_planet_id); } void SidePanel::DoLayout() { |
From: <geo...@us...> - 2014-02-05 07:05:24
|
Revision: 6838 http://sourceforge.net/p/freeorion/code/6838 Author: geoffthemedio Date: 2014-02-05 07:05:20 +0000 (Wed, 05 Feb 2014) Log Message: ----------- Modified sidepanel to collect a system's planet ids from the system object's list of planets, instead of scanning through all known planets for ones that think they're in the system. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2014-02-05 07:04:16 UTC (rev 6837) +++ trunk/FreeOrion/UI/SidePanel.cpp 2014-02-05 07:05:20 UTC (rev 6838) @@ -2880,36 +2880,23 @@ // update planet panel container contents (applying just-set selection predicate) //std::cout << " ... setting planet panel container planets" << std::endl; + const std::set<int>& planet_ids = system->PlanetIDs(); + std::vector<int> planet_ids_vec(planet_ids.begin(), planet_ids.end()); + m_planet_panel_container->SetPlanets(planet_ids_vec, system->GetStarType()); - // find all planets in this system. need to check all known planets, since - // the objects this system object reports to contain don't include objects - // that aren't visible this turn to this client's player. Also need to - // make sure that a known object isn't also known to be destroyed, in which - // case it shouldn't be shown. - const std::set<int>& destroyed_object_ids = GetUniverse().EmpireKnownDestroyedObjectIDs(app_empire_id); - std::vector<int> known_system_planet_ids; - const ObjectMap& objects = Objects(); - std::vector<TemporaryPtr<const Planet> > all_planets = objects.FindObjects<Planet>(); - for (std::vector<TemporaryPtr<const Planet> >::const_iterator it = all_planets.begin(); it != all_planets.end(); ++it) { - TemporaryPtr<const Planet> planet = *it; - int planet_id = planet->ID(); - if (planet->SystemID() == s_system_id) { - if (destroyed_object_ids.find(planet_id) == destroyed_object_ids.end()) // to be displayed, planet should not be in set of known destroyed objects - known_system_planet_ids.push_back(planet_id); - } - } - m_planet_panel_container->SetPlanets(known_system_planet_ids, system->GetStarType()); - // populate system resource summary - // get planets owned by player's empire + // get just planets owned by player's empire int empire_id = HumanClientApp::GetApp()->EmpireID(); std::vector<int> owned_planets; - for (std::vector<int>::const_iterator it = known_system_planet_ids.begin(); it != known_system_planet_ids.end(); ++it) { - TemporaryPtr<const Planet> planet = GetPlanet(*it); - if (planet && planet->OwnedBy(empire_id)) - owned_planets.push_back(*it); + std::vector<TemporaryPtr<const Planet> > planets_here = Objects().FindObjects<const Planet>(planet_ids); + for (std::vector<TemporaryPtr<const Planet> >::const_iterator it = planets_here.begin(); + it != planets_here.end(); ++it) + { + TemporaryPtr<const Planet> planet = *it; + if (planet->OwnedBy(empire_id)) + owned_planets.push_back(planet->ID()); } // specify which meter types to include in resource summary. Oddly enough, these are the resource meters. @@ -2919,8 +2906,10 @@ meter_types.push_back(std::make_pair(METER_TRADE, METER_TARGET_TRADE)); // refresh the system resource summary. - m_system_resource_summary = new MultiIconValueIndicator(Width() - MaxPlanetDiameter() - 8, owned_planets, meter_types); - m_system_resource_summary->MoveTo(GG::Pt(GG::X(MaxPlanetDiameter() + 4), 140 - m_system_resource_summary->Height())); + m_system_resource_summary = new MultiIconValueIndicator(Width() - MaxPlanetDiameter() - 8, + owned_planets, meter_types); + m_system_resource_summary->MoveTo(GG::Pt(GG::X(MaxPlanetDiameter() + 4), + 140 - m_system_resource_summary->Height())); AttachChild(m_system_resource_summary); @@ -2929,7 +2918,9 @@ DetachChild(m_system_resource_summary); } else { // add tooltips to the system resource summary - for (std::vector<std::pair<MeterType, MeterType> >::const_iterator it = meter_types.begin(); it != meter_types.end(); ++it) { + for (std::vector<std::pair<MeterType, MeterType> >::const_iterator it = meter_types.begin(); + it != meter_types.end(); ++it) + { MeterType type = it->first; // add tooltip for each meter type boost::shared_ptr<GG::BrowseInfoWnd> browse_wnd = boost::shared_ptr<GG::BrowseInfoWnd>( |
From: <geo...@us...> - 2014-02-27 13:14:17
|
Revision: 6934 http://sourceforge.net/p/freeorion/code/6934 Author: geoffthemedio Date: 2014-02-27 13:14:11 +0000 (Thu, 27 Feb 2014) Log Message: ----------- Fixed some sidepanel planets scrolling quirks: can now see bottom of list of panels, and position doesn't reset when ending turn. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2014-02-27 12:29:10 UTC (rev 6933) +++ trunk/FreeOrion/UI/SidePanel.cpp 2014-02-27 13:14:11 UTC (rev 6934) @@ -580,7 +580,6 @@ void VScroll(int pos_top, int pos_bottom, int range_min, int range_max); //!< responds to user scrolling of planet panels list. all but first parameter ignored std::vector<PlanetPanel*> m_planet_panels; - GG::Y m_planet_panels_top; int m_selected_planet_id; std::set<int> m_candidate_ids; @@ -2265,7 +2264,6 @@ SidePanel::PlanetPanelContainer::PlanetPanelContainer(GG::X x, GG::Y y, GG::X w, GG::Y h) : Wnd(x, y, w, h, GG::INTERACTIVE), m_planet_panels(), - m_planet_panels_top(GG::Y0), m_selected_planet_id(INVALID_OBJECT_ID), m_vscroll(new CUIScroll(Width() - GG::X(ClientUI::ScrollWidth()), GG::Y0, @@ -2392,9 +2390,14 @@ GG::Y y = GG::Y0; GG::X x = GG::X0; + // if scrollbar present, start placing panels above the top of this + // container by a distances determined by the scrollbar position if (m_vscroll && m_vscroll->Parent() == this) y = GG::Y(-m_vscroll->PosnRange().first); + GG::Y starting_y = y; + + // place panels in sequence from the top, each below the previous for (std::vector<PlanetPanel*>::iterator it = m_planet_panels.begin(); it != m_planet_panels.end(); ++it) { PlanetPanel* panel = *it; const GG::Y PANEL_HEIGHT = panel->Height(); // panel height may be different for each panel depending whether that panel has been previously left expanded or collapsed @@ -2404,29 +2407,28 @@ y += PANEL_HEIGHT + EDGE_PAD; } + // how much vertical space did panels consume? + const GG::Y BIG_PAD_TO_BE_SAFE = GG::Y(185); + GG::Y used_height = y - starting_y + BIG_PAD_TO_BE_SAFE; + + // how much vertical space is actuall available to display panels? GG::Y available_height = Height(); - if (GG::Wnd* parent = Parent()) { - GG::Y containing_height = parent->Height(); - const GG::Y BIG_PAD_TO_BE_SAFE = GG::Y(185); - available_height = containing_height - BIG_PAD_TO_BE_SAFE; // height of visible "page" of panels - } - // adjust size of scrollbar to account for panel resizing // hide scrollbar if all panels are visible and fit into the available height - if (Value(m_planet_panels_top) >= 0 && Value(y - m_planet_panels_top) < available_height + 1) { + if (Value(starting_y) >= 0 && available_height >= used_height) { DetachChild(m_vscroll); - } else { - // need to show scrollbar. + return; + } - // if only need scrollbar due to being scrolled down (but would - // otherwise fit in available space), make scroll range larger - // to allow scrolling back up - int scroll_max = std::max(Value(y - m_planet_panels_top), Value(available_height - m_planet_panels_top)); - m_vscroll->SizeScroll(0, scroll_max, MaxPlanetDiameter(), Value(available_height)); - AttachChild(m_vscroll); - m_vscroll->Show(); - } + // show and adjust scrollbar size to represent space needed for panels + AttachChild(m_vscroll); + m_vscroll->Show(); + + unsigned int line_size = MaxPlanetDiameter(); + unsigned int page_size = Value(available_height); + int scroll_max = Value(used_height); + m_vscroll->SizeScroll(0, scroll_max, line_size, page_size); } void SidePanel::PlanetPanelContainer::DoLayout() { |
From: <geo...@us...> - 2014-03-05 10:27:24
|
Revision: 6945 http://sourceforge.net/p/freeorion/code/6945 Author: geoffthemedio Date: 2014-03-05 10:27:20 +0000 (Wed, 05 Mar 2014) Log Message: ----------- Renamed function for "clarity". Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2014-03-04 20:41:56 UTC (rev 6944) +++ trunk/FreeOrion/UI/SidePanel.cpp 2014-03-05 10:27:20 UTC (rev 6945) @@ -495,7 +495,7 @@ private: void DoLayout(); - void CheckDisplayPlanets(); + void RefreshPlanetGraphic(); void SetFocus(const std::string& focus); ///< set the focus of the planet to \a focus void ClickColonize(); ///< called if colonize button is pressed void ClickInvade(); ///< called if invade button is pressed @@ -1014,7 +1014,7 @@ GG::Y min_height(MaxPlanetDiameter()); - CheckDisplayPlanets(); + RefreshPlanetGraphic(); if (m_planet_graphic) min_height = m_planet_graphic->Height(); // TODO: get following to resize panel properly... @@ -1026,7 +1026,7 @@ ResizedSignal(); } -void SidePanel::PlanetPanel::CheckDisplayPlanets() { +void SidePanel::PlanetPanel::RefreshPlanetGraphic() { TemporaryPtr<const Planet> planet = GetPlanet(m_planet_id); if (!planet || !GetOptionsDB().Get<bool>("UI.sidepanel-planet-shown")) return; |
From: <geo...@us...> - 2014-03-15 15:27:08
|
Revision: 6970 http://sourceforge.net/p/freeorion/code/6970 Author: geoffthemedio Date: 2014-03-15 15:27:04 +0000 (Sat, 15 Mar 2014) Log Message: ----------- Modified population of system and focus droplists to use multiple-row Insert functions. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2014-03-15 15:26:16 UTC (rev 6969) +++ trunk/FreeOrion/UI/SidePanel.cpp 2014-03-15 15:27:04 UTC (rev 6970) @@ -888,6 +888,7 @@ GG::Connect(this->FocusChangedSignal, &SidePanel::PlanetPanel::SetFocus, this); m_focus_drop->MoveTo(GG::Pt(GG::X1, GG::Y1)); // force auto-resize so height is correct for subsequent layout stuff m_focus_drop->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); + m_focus_drop->SetStyle(GG::LIST_NOSORT | GG::LIST_SINGLESEL); // meter panels @@ -1612,19 +1613,29 @@ // refresh items in list m_focus_drop->Clear(); + std::vector<GG::DropDownList::Row*> rows; + rows.reserve(available_foci.size()); for (std::vector<std::string>::const_iterator it = available_foci.begin(); it != available_foci.end(); ++it) { boost::shared_ptr<GG::Texture> texture = ClientUI::GetTexture( ClientUI::ArtDir() / planet->FocusIcon(*it), true); + std::cout << "focus icon for (" << *it << "): " << planet->FocusIcon(*it) << std::endl; GG::StaticGraphic* graphic = new GG::StaticGraphic(GG::X0, GG::Y0, MeterIconSize().x*3/2, MeterIconSize().y*3/2, texture, GG::GRAPHIC_FITGRAPHIC | GG::GRAPHIC_PROPSCALE); GG::DropDownList::Row* row = new GG::DropDownList::Row(graphic->Width(), graphic->Height(), "FOCUS"); row->push_back(dynamic_cast<GG::Control*>(graphic)); - m_focus_drop->Insert(row); + rows.push_back(row); + std::cout << " ... row: " << row << std::endl; } + m_focus_drop->Insert(rows, false); + std::cout << "all rows: " << std::endl; + for (std::vector<GG::DropDownList::Row*>::const_iterator row_it = rows.begin(); + row_it != rows.end(); ++row_it) + { std::cout << *row_it << std::endl; } + int drop_items = std::min(5, static_cast<int>(available_foci.size())); m_focus_drop->SetDropHeight(drop_items * MeterIconSize().y*3/2 + GG::Y(5)); @@ -2780,23 +2791,31 @@ // populate droplist of system names { ScopedTimer droplist_population_timer("SidePanel::RefreshImpl droplist population", true); - std::map< std::string, int > system_map; //alphabetize Systems here + std::map<std::string, int> system_map; //alphabetize Systems here for (ObjectMap::const_iterator<System> sys_it = Objects().const_begin<System>(); sys_it != Objects().const_end<System>(); ++sys_it) { - if (!sys_it->Name().empty() || sys_it->ID()==s_system_id) // skip rows for systems that aren't known to this client, except the selected system + if (!sys_it->Name().empty() || sys_it->ID() == s_system_id) // skip rows for systems that aren't known to this client, except the selected system system_map.insert(std::make_pair<std::string, int>(sys_it->Name(), sys_it->ID())); } - for ( std::map< std::string, int >::iterator sys_it = system_map.begin(); sys_it != system_map.end(); sys_it++) { + std::vector<GG::DropDownList::Row*> rows; + rows.reserve(system_map.size()); + for (std::map< std::string, int>::iterator sys_it = system_map.begin(); sys_it != system_map.end(); sys_it++) { int sys_id = sys_it->second; - - GG::DropDownList::iterator latest_it = m_system_name->Insert(new SystemRow(sys_id)); - - if (sys_id == s_system_id) - m_system_name->Select(latest_it); + rows.push_back(new SystemRow(sys_id)); } + m_system_name->Insert(rows, false); + for (GG::DropDownList::iterator it = m_system_name->begin(); + it != m_system_name->end(); ++it) + { + if (const SystemRow* row = dynamic_cast<const SystemRow*>(*it)) { + if (s_system_id == row->SystemID()) { + m_system_name->Select(it); + break; + } + } + } - // set dropheight. shrink to fit a small number, but cap at a reasonable max const GG::Y TEXT_ROW_HEIGHT = CUISimpleDropDownListRow::DEFAULT_ROW_HEIGHT; const GG::Y MAX_DROPLIST_DROP_HEIGHT = TEXT_ROW_HEIGHT * 10; |