From: <geo...@us...> - 2012-08-14 07:03:25
|
Revision: 5128 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5128&view=rev Author: geoffthemedio Date: 2012-08-14 07:03:19 +0000 (Tue, 14 Aug 2012) Log Message: ----------- Made objects appear nested under their containers in objects list. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-13 19:56:07 UTC (rev 5127) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-14 07:03:19 UTC (rev 5128) @@ -181,7 +181,7 @@ const GG::Y ICON_HEIGHT(ClientHeight()); const GG::X ICON_WIDTH(Value(ClientHeight())); - GG::X left(ICON_WIDTH * m_indent); + GG::X left(ICON_WIDTH * m_indent / 2); GG::Y top(GG::Y0); GG::Y bottom(ClientHeight()); GG::X PAD(3); @@ -253,10 +253,134 @@ const GG::Pt row_size = m_list_box->ListRowSize(); - for (ObjectMap::const_iterator it = objects.const_begin(); it != objects.const_end(); ++it) { - const UniverseObject* obj = it->second; - ObjectRow* object_row = new ObjectRow(row_size.x, row_size.y, obj, 0); - m_list_box->Insert(object_row); - object_row->Resize(row_size); + bool nested = true; + + if (nested) { + // sort objects by containment associations + std::map<int, const System*> systems; + std::map<int, std::map<int, const Fleet*> > system_fleets; + std::map<int, std::map<int, const Ship*> > fleet_ships; + std::map<int, std::map<int, const Planet*> > system_planets; + std::map<int, std::map<int, const Building*> > planet_buildings; + for (ObjectMap::const_iterator it = objects.const_begin(); it != objects.const_end(); ++it) { + const UniverseObject* obj = it->second; + if (const System* system = universe_object_cast<const System*>(obj)) { + systems[obj->ID()] = system; + } else if (const Fleet* fleet = universe_object_cast<const Fleet*>(obj)) { + system_fleets[fleet->SystemID()][fleet->ID()] = fleet; + } else if (const Ship* ship = universe_object_cast<const Ship*>(obj)) { + fleet_ships[ship->FleetID()][ship->ID()] = ship; + } else if (const Planet* planet = universe_object_cast<const Planet*>(obj)) { + system_planets[planet->SystemID()][planet->ID()] = planet; + } else if (const Building* building = universe_object_cast<const Building*>(obj)) { + planet_buildings[building->PlanetID()][building->ID()] = building; + } + } + + ObjectRow* object_row = 0; + int indent = 0; + + // add system rows + for (std::map<int, const System*>::const_iterator sys_it = systems.begin(); sys_it != systems.end(); ++sys_it) { + int system_id = sys_it->first; + const System* system = sys_it->second; + // add system row + object_row = new ObjectRow(row_size.x, row_size.y, system, indent); + m_list_box->Insert(object_row); + object_row->Resize(row_size); + + ++indent; + // add planet rows in this system + std::map<int, std::map<int, const Planet*> >::const_iterator sp_it = system_planets.find(system_id); + if (sp_it != system_planets.end()) { + const std::map<int, const Planet*>& planets = sp_it->second; + for (std::map<int, const Planet*>::const_iterator planet_it = planets.begin(); planet_it != planets.end(); ++planet_it) { + int planet_id = planet_it->first; + const Planet* planet = planet_it->second; + // add Planet row + object_row = new ObjectRow(row_size.x, row_size.y, planet, indent); + m_list_box->Insert(object_row); + object_row->Resize(row_size); + + ++indent; + // add building rows on this planet + std::map<int, std::map<int, const Building*> >::const_iterator pb_it = planet_buildings.find(planet_id); + if (pb_it != planet_buildings.end()) { + const std::map<int, const Building*>& buildings = pb_it->second; + for (std::map<int, const Building*>::const_iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { + int building_id = building_it->first; + const Building* building = building_it->second; + // add Building row + object_row = new ObjectRow(row_size.x, row_size.y, building, indent); + m_list_box->Insert(object_row); + object_row->Resize(row_size); + } + } + indent--; + } + } + + // add fleet rows in this system + std::map<int, std::map<int, const Fleet*> >::const_iterator sf_it = system_fleets.find(system_id); + if (sf_it != system_fleets.end()) { + const std::map<int, const Fleet*>& fleets = sf_it->second; + for (std::map<int, const Fleet*>::const_iterator fleet_it = fleets.begin(); fleet_it != fleets.end(); ++fleet_it) { + int fleet_id = fleet_it->first; + const Fleet* fleet = fleet_it->second; + // add Fleet row + object_row = new ObjectRow(row_size.x, row_size.y, fleet, indent); + m_list_box->Insert(object_row); + object_row->Resize(row_size); + + ++indent; + // add ship rows on this fleet + std::map<int, std::map<int, const Ship*> >::const_iterator fs_it = fleet_ships.find(fleet_id); + if (fs_it != fleet_ships.end()) { + const std::map<int, const Ship*>& ships = fs_it->second; + for (std::map<int, const Ship*>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { + int ship_id = ship_it->first; + const Ship* ship = ship_it->second; + // add Building row + object_row = new ObjectRow(row_size.x, row_size.y, ship, indent); + m_list_box->Insert(object_row); + object_row->Resize(row_size); + } + } + indent--; + } + } + + indent--; + } + + // add fleets outside systems... + std::map<int, std::map<int, const Fleet*> >::const_iterator sf_it = system_fleets.find(INVALID_OBJECT_ID); + if (sf_it != system_fleets.end()) { + const std::map<int, const Fleet*>& fleets = sf_it->second; + for (std::map<int, const Fleet*>::const_iterator fleet_it = fleets.begin(); fleet_it != fleets.end(); ++fleet_it) { + int fleet_id = fleet_it->first; + const Fleet* fleet = fleet_it->second; + // add Fleet row + object_row = new ObjectRow(row_size.x, row_size.y, fleet, indent); + m_list_box->Insert(object_row); + object_row->Resize(row_size); + + ++indent; + // add ship rows on this fleet + std::map<int, std::map<int, const Ship*> >::const_iterator fs_it = fleet_ships.find(fleet_id); + if (fs_it != fleet_ships.end()) { + const std::map<int, const Ship*>& ships = fs_it->second; + for (std::map<int, const Ship*>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { + int ship_id = ship_it->first; + const Ship* ship = ship_it->second; + // add Building row + object_row = new ObjectRow(row_size.x, row_size.y, ship, indent); + m_list_box->Insert(object_row); + object_row->Resize(row_size); + } + } + indent--; + } + } } } |
From: <geo...@us...> - 2012-08-14 10:29:59
|
Revision: 5131 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5131&view=rev Author: geoffthemedio Date: 2012-08-14 10:29:51 +0000 (Tue, 14 Aug 2012) Log Message: ----------- Made double-clicking an object in the objects window zoom to that object elsewhere in the UI (eg. sidepanel or fleets window). Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-14 10:25:50 UTC (rev 5130) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-14 10:29:51 UTC (rev 5131) @@ -392,6 +392,7 @@ int object_id = ObjectInRow(it); if (object_id != INVALID_OBJECT_ID) ObjectDoubleClickedSignal(object_id); + ClientUI::GetClientUI()->ZoomToObject(object_id); } void ObjectListWnd::ObjectRightClicked(GG::ListBox::iterator it, const GG::Pt& pt) { |
From: <geo...@us...> - 2012-08-16 19:25:49
|
Revision: 5141 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5141&view=rev Author: geoffthemedio Date: 2012-08-16 19:25:43 +0000 (Thu, 16 Aug 2012) Log Message: ----------- Semi-functional restoring of scroll position of objects list after updating. GiGi's ListBox has no simple scroll-to-position function, so this doesn't quite work right in cases when near the end of the list. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-16 19:08:51 UTC (rev 5140) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-16 19:25:43 UTC (rev 5141) @@ -328,6 +328,8 @@ } void Refresh() { + std::size_t first_visible_queue_row = std::distance(this->begin(), this->FirstRowShown()); + const ObjectMap& objects = Objects(); Clear(); @@ -495,6 +497,11 @@ } } } + + if (!this->Empty()) + this->BringRowIntoView(--this->end()); + if (first_visible_queue_row < this->NumRows()) + this->BringRowIntoView(boost::next(this->begin(), first_visible_queue_row)); } private: |
From: <geo...@us...> - 2012-08-18 00:36:20
|
Revision: 5150 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5150&view=rev Author: geoffthemedio Date: 2012-08-18 00:36:13 +0000 (Sat, 18 Aug 2012) Log Message: ----------- Seemingly got ObjectListWnd to update properly for fleet arrangement changes, though there's probably a crash bug I haven't seen. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-17 17:45:14 UTC (rev 5149) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-18 00:36:13 UTC (rev 5150) @@ -22,35 +22,36 @@ //////////////////////////////////////////////// class FilterDialog : public CUIWnd { public: - FilterDialog(GG::X x, GG::Y y) : CUIWnd(UserString("FILTERS"), x, y, GG::X(200), GG::Y(200), - GG::INTERACTIVE | GG::DRAGABLE | GG::MODAL | GG::RESIZABLE) - {} - ~FilterDialog() - {} + FilterDialog(GG::X x, GG::Y y) : CUIWnd(UserString("FILTERS"), x, y, GG::X(200), GG::Y(200), + GG::INTERACTIVE | GG::DRAGABLE | GG::MODAL | GG::RESIZABLE) + {} + ~FilterDialog() + {} //@} private: }; -static std::string EMPTY_STRING; +namespace { + static std::string EMPTY_STRING; -std::vector<boost::shared_ptr<GG::Texture> > ObjectTextures(const UniverseObject* obj) { + std::vector<boost::shared_ptr<GG::Texture> > ObjectTextures(const UniverseObject* obj) { std::vector<boost::shared_ptr<GG::Texture> > retval; if (const Ship* ship = universe_object_cast<const Ship*>(obj)) { - if (const ShipDesign* design = ship->Design()) - retval.push_back(ClientUI::ShipDesignIcon(design->ID())); - else + if (const ShipDesign* design = ship->Design()) + retval.push_back(ClientUI::ShipDesignIcon(design->ID())); + else retval.push_back(ClientUI::ShipDesignIcon(INVALID_OBJECT_ID)); // default icon } else if (const Fleet* fleet = universe_object_cast<const Fleet*>(obj)) { - boost::shared_ptr<GG::Texture> head_icon = FleetHeadIcon(fleet, FleetButton::FLEET_BUTTON_LARGE); - retval.push_back(head_icon); - boost::shared_ptr<GG::Texture> size_icon = FleetSizeIcon(fleet, FleetButton::FLEET_BUTTON_LARGE); + boost::shared_ptr<GG::Texture> head_icon = FleetHeadIcon(fleet, FleetButton::FLEET_BUTTON_LARGE); + retval.push_back(head_icon); + boost::shared_ptr<GG::Texture> size_icon = FleetSizeIcon(fleet, FleetButton::FLEET_BUTTON_LARGE); retval.push_back(size_icon); } else if (const System* system = universe_object_cast<const System*>(obj)) { - StarType star_type = system->GetStarType(); - ClientUI* ui = ClientUI::GetClientUI(); - boost::shared_ptr<GG::Texture> disc_texture = ui->GetModuloTexture( - ClientUI::ArtDir() / "stars", ClientUI::StarTypeFilePrefixes()[star_type], system->ID()); + StarType star_type = system->GetStarType(); + ClientUI* ui = ClientUI::GetClientUI(); + boost::shared_ptr<GG::Texture> disc_texture = ui->GetModuloTexture( + ClientUI::ArtDir() / "stars", ClientUI::StarTypeFilePrefixes()[star_type], system->ID()); retval.push_back(disc_texture); boost::shared_ptr<GG::Texture> halo_texture = ui->GetModuloTexture( ClientUI::ArtDir() / "stars", ClientUI::HaloStarTypeFilePrefixes()[star_type], system->ID()); @@ -67,7 +68,7 @@ return retval; } -const std::string& ObjectName(const UniverseObject* obj) { + const std::string& ObjectName(const UniverseObject* obj) { if (!obj) return EMPTY_STRING; if (const System* system = universe_object_cast<const System*>(obj)) @@ -75,60 +76,33 @@ return obj->PublicName(HumanClientApp::GetApp()->EmpireID()); } -std::pair<std::string, GG::Clr> ObjectEmpireNameAndColour(const UniverseObject* obj) { + std::pair<std::string, GG::Clr> ObjectEmpireNameAndColour(const UniverseObject* obj) { if (!obj) return std::make_pair("", ClientUI::TextColor()); if (const Empire* empire = Empires().Lookup(obj->Owner())) return std::make_pair(empire->Name(), empire->Color()); return std::make_pair("", ClientUI::TextColor()); } +} +//////////////////////////////////////////////// +// ObjectPanel +//////////////////////////////////////////////// class ObjectPanel : public GG::Control { public: - ObjectPanel(GG::X w, GG::Y h, const UniverseObject* obj, bool expanded, bool have_contents, int indent = 0) : + ObjectPanel(GG::X w, GG::Y h, const UniverseObject* obj, bool expanded, bool has_contents, int indent = 0) : Control(GG::X0, GG::Y0, w, h, GG::Flags<GG::WndFlag>()), m_object_id(obj ? obj->ID() : INVALID_OBJECT_ID), m_indent(indent), m_expanded(expanded), - m_have_contents(have_contents), + m_has_contents(has_contents), m_expand_button(0), m_dot(0), m_icon(0), m_name_label(0), m_empire_label(0) { - boost::shared_ptr<GG::Font> font = ClientUI::GetFont(); - GG::Clr clr = ClientUI::TextColor(); - int client_empire_id = HumanClientApp::GetApp()->EmpireID(); - GG::Flags<GG::GraphicStyle> style = GG::GRAPHIC_CENTER | GG::GRAPHIC_VCENTER | GG::GRAPHIC_FITGRAPHIC | GG::GRAPHIC_PROPSCALE; - - if (m_have_contents) { - m_expand_button = new GG::Button(GG::X0, GG::Y0, GG::X(16), GG::Y(16), - "", font, GG::CLR_WHITE, GG::CLR_ZERO, GG::ONTOP | GG::INTERACTIVE); - AttachChild(m_expand_button); - GG::Connect(m_expand_button->ClickedSignal, &ObjectPanel::ExpandCollapseButtonPressed, this); - } else { - m_dot = new GG::StaticGraphic(GG::X0, GG::Y0, GG::X(16), GG::Y(16), - ClientUI::GetTexture(ClientUI::ArtDir() / "icons" / "dot.png", true), - style, GG::Flags<GG::WndFlag>()); - AttachChild(m_dot); - } - - std::vector<boost::shared_ptr<GG::Texture> > textures = ObjectTextures(obj); - - m_icon = new MultiTextureStaticGraphic(GG::X0, GG::Y0, GG::X(Value(ClientHeight())), ClientHeight(), - textures, std::vector<GG::Flags<GG::GraphicStyle> >(textures.size(), style)); - AttachChild(m_icon); - - m_name_label = new GG::TextControl(GG::X0, GG::Y0, GG::X(Value(ClientHeight())), ClientHeight(), ObjectName(obj), font, clr, GG::FORMAT_LEFT); - AttachChild(m_name_label); - - std::pair<std::string, GG::Clr> empire_and_colour = ObjectEmpireNameAndColour(obj); - m_empire_label = new GG::TextControl(GG::X0, GG::Y0, GG::X(Value(ClientHeight())), ClientHeight(), empire_and_colour.first, font, empire_and_colour.second, GG::FORMAT_LEFT); - AttachChild(m_empire_label); - - Update(); - DoLayout(); + Refresh(); } int ObjectID() const { return m_object_id; } @@ -145,8 +119,23 @@ DoLayout(); } - void Update() { - if (m_expand_button) { + void Refresh() { + boost::shared_ptr<GG::Font> font = ClientUI::GetFont(); + GG::Clr clr = ClientUI::TextColor(); + int client_empire_id = HumanClientApp::GetApp()->EmpireID(); + GG::Flags<GG::GraphicStyle> style = GG::GRAPHIC_CENTER | GG::GRAPHIC_VCENTER | GG::GRAPHIC_FITGRAPHIC | GG::GRAPHIC_PROPSCALE; + + delete m_dot; m_dot = 0; + delete m_expand_button; m_expand_button = 0; + delete m_icon; m_icon = 0; + delete m_name_label; m_name_label = 0; + + if (m_has_contents) { + m_expand_button = new GG::Button(GG::X0, GG::Y0, GG::X(16), GG::Y(16), + "", font, GG::CLR_WHITE, GG::CLR_ZERO, GG::ONTOP | GG::INTERACTIVE); + AttachChild(m_expand_button); + GG::Connect(m_expand_button->ClickedSignal, &ObjectPanel::ExpandCollapseButtonPressed, this); + if (m_expanded) { m_expand_button->SetUnpressedGraphic(GG::SubTexture(ClientUI::GetTexture( ClientUI::ArtDir() / "icons" / "minusnormal.png" , true), GG::X0, GG::Y0, GG::X(32), GG::Y(32))); m_expand_button->SetPressedGraphic (GG::SubTexture(ClientUI::GetTexture( ClientUI::ArtDir() / "icons" / "minusclicked.png" , true), GG::X0, GG::Y0, GG::X(32), GG::Y(32))); @@ -156,9 +145,33 @@ m_expand_button->SetPressedGraphic (GG::SubTexture(ClientUI::GetTexture( ClientUI::ArtDir() / "icons" / "plusclicked.png" , true), GG::X0, GG::Y0, GG::X(32), GG::Y(32))); m_expand_button->SetRolloverGraphic (GG::SubTexture(ClientUI::GetTexture( ClientUI::ArtDir() / "icons" / "plusmouseover.png", true), GG::X0, GG::Y0, GG::X(32), GG::Y(32))); } - } + } else { + m_dot = new GG::StaticGraphic(GG::X0, GG::Y0, GG::X(16), GG::Y(16), + ClientUI::GetTexture(ClientUI::ArtDir() / "icons" / "dot.png", true), + style, GG::Flags<GG::WndFlag>()); + AttachChild(m_dot); + } + + const UniverseObject* obj = GetUniverseObject(m_object_id); + std::vector<boost::shared_ptr<GG::Texture> > textures = ObjectTextures(obj); + + m_icon = new MultiTextureStaticGraphic(GG::X0, GG::Y0, GG::X(Value(ClientHeight())), ClientHeight(), + textures, std::vector<GG::Flags<GG::GraphicStyle> >(textures.size(), style)); + AttachChild(m_icon); + + m_name_label = new GG::TextControl(GG::X0, GG::Y0, GG::X(Value(ClientHeight())), ClientHeight(), ObjectName(obj), font, clr, GG::FORMAT_LEFT); + AttachChild(m_name_label); + + std::pair<std::string, GG::Clr> empire_and_colour = ObjectEmpireNameAndColour(obj); + m_empire_label = new GG::TextControl(GG::X0, GG::Y0, GG::X(Value(ClientHeight())), ClientHeight(), empire_and_colour.first, font, empire_and_colour.second, GG::FORMAT_LEFT); + AttachChild(m_empire_label); + + DoLayout(); } + void SetHasContents(bool has_contents) + { m_has_contents = has_contents; } + mutable boost::signal<void ()> ExpandCollapseSignal; private: void DoLayout() { @@ -194,14 +207,13 @@ void ExpandCollapseButtonPressed() { m_expanded = !m_expanded; - Update(); ExpandCollapseSignal(); } int m_object_id; int m_indent; bool m_expanded; - bool m_have_contents; + bool m_has_contents; GG::Button* m_expand_button; GG::StaticGraphic* m_dot; @@ -215,32 +227,46 @@ //////////////////////////////////////////////// class ObjectRow : public GG::ListBox::Row { public: - ObjectRow(GG::X w, GG::Y h, const UniverseObject* obj, bool expanded, bool have_contents, int indent) : + ObjectRow(GG::X w, GG::Y h, const UniverseObject* obj, bool expanded, + int container_object_panel, + const std::vector<int>& contained_object_panels, int indent) : GG::ListBox::Row(w, h, "ObjectRow", GG::ALIGN_CENTER, 1), - m_panel(0) + m_panel(0), + m_container_object_panel(container_object_panel), + m_contained_object_panels(contained_object_panels) { SetName("ObjectRow"); SetChildClippingMode(ClipToClient); SetDragDropDataType("ObjectRow"); - m_panel = new ObjectPanel(w, h, obj, expanded, have_contents, indent); + m_panel = new ObjectPanel(w, h, obj, expanded, !m_contained_object_panels.empty(), indent); push_back(m_panel); GG::Connect(m_panel->ExpandCollapseSignal, &ObjectRow::ExpandCollapseClicked, this); } - int ObjectID() const { + int ObjectID() const { if (m_panel) return m_panel->ObjectID(); return INVALID_OBJECT_ID; } - void Update() { - if (m_panel) - m_panel->Update(); + int ContainedByPanel() const + { return m_container_object_panel; } + + const std::vector<int>& ContainedPanels() const + { return m_contained_object_panels; } + + void SetContainedPanels(const std::vector<int>& contained_object_panels) { + m_contained_object_panels = contained_object_panels; + m_panel->SetHasContents(!m_contained_object_panels.empty()); + m_panel->Refresh(); } + void Update() + { m_panel->Refresh(); } + /** This function overridden because otherwise, rows don't expand * larger than their initial size when resizing the list. */ - void SizeMove(const GG::Pt& ul, const GG::Pt& lr) { + void SizeMove(const GG::Pt& ul, const GG::Pt& lr) { const GG::Pt old_size = Size(); GG::ListBox::Row::SizeMove(ul, lr); //std::cout << "ObjectRow::SizeMove size: (" << Value(Width()) << ", " << Value(Height()) << ")" << std::endl; @@ -248,12 +274,14 @@ m_panel->Resize(Size()); } - void ExpandCollapseClicked() + void ExpandCollapseClicked() { ExpandCollapseSignal(m_panel ? m_panel->ObjectID() : INVALID_OBJECT_ID); } mutable boost::signal<void (int)> ExpandCollapseSignal; private: - ObjectPanel* m_panel; + ObjectPanel* m_panel; + int m_container_object_panel; + std::vector<int> m_contained_object_panels; }; //////////////////////////////////////////////// @@ -273,6 +301,8 @@ LockColWidths(); m_filter_condition = new Condition::All(); + + GG::Connect(GetUniverse().UniverseObjectDeleteSignal, &ObjectListBox::UniverseObjectDeleted, this); } virtual void SizeMove(const GG::Pt& ul, const GG::Pt& lr) { @@ -327,92 +357,88 @@ Refresh(); } + void ClearContents() { + Clear(); + for (std::map<int, boost::signals::connection>::iterator it = m_object_change_connections.begin(); + it != m_object_change_connections.end(); ++it) + { it->second.disconnect(); } + m_object_change_connections.clear(); + } + void Refresh() { std::size_t first_visible_queue_row = std::distance(this->begin(), this->FirstRowShown()); + ClearContents(); - const ObjectMap& objects = Objects(); - Clear(); + const ObjectMap& objects = GetUniverse().Objects(); - const GG::Pt row_size = ListRowSize(); - bool nested = true; - if (nested) { + if (!nested) { + } else { // sort objects by containment associations - std::map<int, const System*> systems; - std::map<int, std::map<int, const Fleet*> > system_fleets; - std::map<int, std::map<int, const Ship*> > fleet_ships; - std::map<int, std::map<int, const Planet*> > system_planets; - std::map<int, std::map<int, const Building*> > planet_buildings; + std::vector<int> systems; + std::map<int, std::vector<int> > system_fleets; + std::map<int, std::vector<int> > fleet_ships; + std::map<int, std::vector<int> > system_planets; + std::map<int, std::vector<int> > planet_buildings; + for (ObjectMap::const_iterator it = objects.const_begin(); it != objects.const_end(); ++it) { const UniverseObject* obj = it->second; - if (const System* system = universe_object_cast<const System*>(obj)) { - systems[obj->ID()] = system; - } else if (const Fleet* fleet = universe_object_cast<const Fleet*>(obj)) { - system_fleets[fleet->SystemID()][fleet->ID()] = fleet; - } else if (const Ship* ship = universe_object_cast<const Ship*>(obj)) { - fleet_ships[ship->FleetID()][ship->ID()] = ship; - } else if (const Planet* planet = universe_object_cast<const Planet*>(obj)) { - system_planets[planet->SystemID()][planet->ID()] = planet; - } else if (const Building* building = universe_object_cast<const Building*>(obj)) { - planet_buildings[building->PlanetID()][building->ID()] = building; - } + if (const System* system = universe_object_cast<const System*>(obj)) + systems.push_back(system->ID()); + else if (const Fleet* fleet = universe_object_cast<const Fleet*>(obj)) + system_fleets[fleet->SystemID()].push_back(fleet->ID()); + else if (const Ship* ship = universe_object_cast<const Ship*>(obj)) + fleet_ships[ship->FleetID()].push_back(ship->ID()); + else if (const Planet* planet = universe_object_cast<const Planet*>(obj)) + system_planets[planet->SystemID()].push_back(planet->ID()); + else if (const Building* building = universe_object_cast<const Building*>(obj)) + planet_buildings[building->PlanetID()].push_back(building->ID()); } - ObjectRow* object_row = 0; int indent = 0; // add system rows - for (std::map<int, const System*>::const_iterator sys_it = systems.begin(); sys_it != systems.end(); ++sys_it) { - int system_id = sys_it->first; - const System* system = sys_it->second; + for (std::vector<int>::const_iterator sys_it = systems.begin(); sys_it != systems.end(); ++sys_it) { + int system_id = *sys_it; - std::map<int, std::map<int, const Planet*> >::const_iterator sp_it = system_planets.find(system_id); - std::map<int, std::map<int, const Fleet*> >::const_iterator sf_it = system_fleets.find(system_id); - bool collapsed_system_row = ObjectCollapsed(system_id); + std::map<int, std::vector<int> >::const_iterator sp_it = system_planets.find(system_id); + std::map<int, std::vector<int> >::const_iterator sf_it = system_fleets.find(system_id); bool has_contents_system_row = sp_it != system_planets.end() || sf_it != system_fleets.end(); + std::vector<int> system_contents; + if (sp_it != system_planets.end()) + system_contents = sp_it->second; + if (sf_it != system_fleets.end()) + std::copy(sf_it->second.begin(), sf_it->second.end(), std::back_inserter(system_contents)); - // add system row - object_row = new ObjectRow(row_size.x, row_size.y, system, !collapsed_system_row, has_contents_system_row, indent); - this->Insert(object_row); - object_row->Resize(row_size); - GG::Connect(object_row->ExpandCollapseSignal, &ObjectListBox::ObjectExpandCollapseClicked, this); + AddObjectRow(system_id, INVALID_OBJECT_ID, system_contents, indent); - if (!has_contents_system_row || collapsed_system_row) + if (!has_contents_system_row || ObjectCollapsed(system_id)) continue; ++indent; // add planet rows in this system if (sp_it != system_planets.end()) { - const std::map<int, const Planet*>& planets = sp_it->second; - for (std::map<int, const Planet*>::const_iterator planet_it = planets.begin(); planet_it != planets.end(); ++planet_it) { - int planet_id = planet_it->first; - const Planet* planet = planet_it->second; + const std::vector<int>& planets = sp_it->second; + for (std::vector<int>::const_iterator planet_it = planets.begin(); planet_it != planets.end(); ++planet_it) { + int planet_id = *planet_it; - std::map<int, std::map<int, const Building*> >::const_iterator pb_it = planet_buildings.find(planet_id); - bool collapsed_planet_row = ObjectCollapsed(planet_id); + std::map<int, std::vector<int> >::const_iterator pb_it = planet_buildings.find(planet_id); bool has_contents_planet_row = pb_it != planet_buildings.end(); - // add Planet row - object_row = new ObjectRow(row_size.x, row_size.y, planet, !collapsed_planet_row, has_contents_planet_row, indent); - this->Insert(object_row); - object_row->Resize(row_size); - GG::Connect(object_row->ExpandCollapseSignal, &ObjectListBox::ObjectExpandCollapseClicked, this); + AddObjectRow(planet_id, system_id, + pb_it != planet_buildings.end() ? pb_it->second : std::vector<int>(), + indent); - if (!has_contents_planet_row || collapsed_planet_row) + if (!has_contents_planet_row || ObjectCollapsed(planet_id)) continue; ++indent; // add building rows on this planet if (pb_it != planet_buildings.end()) { - const std::map<int, const Building*>& buildings = pb_it->second; - for (std::map<int, const Building*>::const_iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { - int building_id = building_it->first; - const Building* building = building_it->second; - // add Building row - object_row = new ObjectRow(row_size.x, row_size.y, building, false, false, indent); - this->Insert(object_row); - object_row->Resize(row_size); + const std::vector<int>& buildings = pb_it->second; + for (std::vector<int>::const_iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { + AddObjectRow(*building_it, planet_id, std::vector<int>(), indent); } } indent--; @@ -421,76 +447,57 @@ // add fleet rows in this system if (sf_it != system_fleets.end()) { - const std::map<int, const Fleet*>& fleets = sf_it->second; - for (std::map<int, const Fleet*>::const_iterator fleet_it = fleets.begin(); fleet_it != fleets.end(); ++fleet_it) { - int fleet_id = fleet_it->first; - const Fleet* fleet = fleet_it->second; + const std::vector<int>& fleets = sf_it->second; + for (std::vector<int>::const_iterator fleet_it = fleets.begin(); fleet_it != fleets.end(); ++fleet_it) { + int fleet_id = *fleet_it; - std::map<int, std::map<int, const Ship*> >::const_iterator fs_it = fleet_ships.find(fleet_id); - bool collapsed_fleet_row = ObjectCollapsed(fleet_id); + std::map<int, std::vector<int> >::const_iterator fs_it = fleet_ships.find(fleet_id); bool has_contents_fleet_row = fs_it != fleet_ships.end(); - // add Fleet row - object_row = new ObjectRow(row_size.x, row_size.y, fleet, !collapsed_fleet_row, has_contents_fleet_row, indent); - this->Insert(object_row); - object_row->Resize(row_size); - GG::Connect(object_row->ExpandCollapseSignal, &ObjectListBox::ObjectExpandCollapseClicked, this); + AddObjectRow(fleet_id, system_id, + fs_it != fleet_ships.end() ? fs_it->second : std::vector<int>(), + indent); - if (!has_contents_fleet_row || collapsed_fleet_row) + if (!has_contents_fleet_row || ObjectCollapsed(fleet_id)) continue; ++indent; // add ship rows on this fleet if (fs_it != fleet_ships.end()) { - const std::map<int, const Ship*>& ships = fs_it->second; - for (std::map<int, const Ship*>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { - int ship_id = ship_it->first; - const Ship* ship = ship_it->second; - // add Building row - object_row = new ObjectRow(row_size.x, row_size.y, ship, false, false, indent); - this->Insert(object_row); - object_row->Resize(row_size); + const std::vector<int>& ships = fs_it->second; + for (std::vector<int>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { + AddObjectRow(*ship_it, fleet_id, std::vector<int>(), indent); } } indent--; } } - indent--; } // add fleets outside systems... - std::map<int, std::map<int, const Fleet*> >::const_iterator sf_it = system_fleets.find(INVALID_OBJECT_ID); + std::map<int, std::vector<int> >::const_iterator sf_it = system_fleets.find(INVALID_OBJECT_ID); if (sf_it != system_fleets.end()) { - const std::map<int, const Fleet*>& fleets = sf_it->second; - for (std::map<int, const Fleet*>::const_iterator fleet_it = fleets.begin(); fleet_it != fleets.end(); ++fleet_it) { - int fleet_id = fleet_it->first; - const Fleet* fleet = fleet_it->second; + const std::vector<int>& fleets = sf_it->second; + for (std::vector<int>::const_iterator fleet_it = fleets.begin(); fleet_it != fleets.end(); ++fleet_it) { + int fleet_id = *fleet_it; - std::map<int, std::map<int, const Ship*> >::const_iterator fs_it = fleet_ships.find(fleet_id); - bool collapsed_fleet_row = ObjectCollapsed(fleet_id); + std::map<int, std::vector<int> >::const_iterator fs_it = fleet_ships.find(fleet_id); bool has_contents_fleet_row = fs_it != fleet_ships.end(); - if (!has_contents_fleet_row || collapsed_fleet_row) + if (!has_contents_fleet_row || ObjectCollapsed(fleet_id)) continue; - // add Fleet row - object_row = new ObjectRow(row_size.x, row_size.y, fleet, !collapsed_fleet_row, has_contents_fleet_row, indent); - this->Insert(object_row); - object_row->Resize(row_size); - GG::Connect(object_row->ExpandCollapseSignal, &ObjectListBox::ObjectExpandCollapseClicked, this); + AddObjectRow(fleet_id, INVALID_OBJECT_ID, + fs_it != fleet_ships.end() ? fs_it->second : std::vector<int>(), + indent); ++indent; // add ship rows on this fleet if (fs_it != fleet_ships.end()) { - const std::map<int, const Ship*>& ships = fs_it->second; - for (std::map<int, const Ship*>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { - int ship_id = ship_it->first; - const Ship* ship = ship_it->second; - // add Building row - object_row = new ObjectRow(row_size.x, row_size.y, ship, false, false, indent); - this->Insert(object_row); - object_row->Resize(row_size); + const std::vector<int>& ships = fs_it->second; + for (std::vector<int>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { + AddObjectRow(*ship_it, fleet_id, std::vector<int>(), indent); } } indent--; @@ -500,11 +507,108 @@ if (!this->Empty()) this->BringRowIntoView(--this->end()); - if (first_visible_queue_row < this->NumRows()) - this->BringRowIntoView(boost::next(this->begin(), first_visible_queue_row)); + if (first_visible_queue_row < this->NumRows()) + this->BringRowIntoView(boost::next(this->begin(), first_visible_queue_row)); } + void UpdateObjectPanel(int object_id = INVALID_OBJECT_ID) { + if (object_id == INVALID_OBJECT_ID) + return; + for (GG::ListBox::iterator it = this->begin(); it != this->end(); ++it) { + if (ObjectRow* row = dynamic_cast<ObjectRow*>(*it)) { + row->Update(); + return; + } + } + } + private: + void AddObjectRow(int object_id, int container, const std::vector<int>& contents, int indent) + { AddObjectRow(object_id, container, contents, indent, this->end()); } + + void AddObjectRow(int object_id, int container, const std::vector<int>& contents, + int indent, GG::ListBox::iterator it) + { + const UniverseObject* obj = GetUniverseObject(object_id); + if (!obj) + return; + const GG::Pt row_size = ListRowSize(); + ObjectRow* object_row = new ObjectRow(row_size.x, row_size.y, obj, !ObjectCollapsed(object_id), + container, contents, indent); + this->Insert(object_row, it); + object_row->Resize(row_size); + GG::Connect(object_row->ExpandCollapseSignal, &ObjectListBox::ObjectExpandCollapseClicked, this, boost::signals::at_front); + m_object_change_connections[obj->ID()].disconnect(); + m_object_change_connections[obj->ID()] = GG::Connect(obj->StateChangedSignal, boost::bind(&ObjectListBox::ObjectStateChanged, this, obj->ID()), boost::signals::at_front); + } + + // Removes row of indicated object, and all contained rows, recursively. + // Also updates contents tracking of containing row, if any. + void RemoveObjectRow(int object_id) { + if (object_id == INVALID_OBJECT_ID) + return; + int container_object_id = INVALID_OBJECT_ID; + for (GG::ListBox::iterator it = this->begin(); it != this->end(); ++it) { + if (ObjectRow* object_row = dynamic_cast<ObjectRow*>(*it)) { + if (object_row->ObjectID() == object_id) { + container_object_id = object_row->ContainedByPanel(); + RemoveObjectRow(it); + break; + } + } + } + + if (container_object_id == INVALID_OBJECT_ID) + return; + + // remove this row from parent row's contents + for (GG::ListBox::iterator it = this->begin(); it != this->end(); ++it) { + if (ObjectRow* object_row = dynamic_cast<ObjectRow*>(*it)) { + if (object_row->ObjectID() == container_object_id) { + const std::vector<int>& contents = object_row->ContainedPanels(); + std::vector<int> new_contents; + for (std::vector<int>::const_iterator contents_it = contents.begin(); + contents_it != contents.end(); ++contents_it) + { + if (*contents_it != object_id) + new_contents.push_back(*contents_it); + } + object_row->SetContainedPanels(new_contents); + object_row->Update(); + break; + } + } + } + } + + // Removes row at indicated iterator location and its contained rows. + // Does not adjust containing row. + void RemoveObjectRow(GG::ListBox::iterator it) { + if (it == this->end()) + return; + ObjectRow* object_row = dynamic_cast<ObjectRow*>(*it); + + // recursively remove contained rows first + const std::vector<int>& contents = object_row->ContainedPanels(); + for (unsigned int i = 0; i < contents.size(); ++i) { + GG::ListBox::iterator next_it = it; ++next_it; + if (next_it == this->end()) + break; + ObjectRow* contained_row = dynamic_cast<ObjectRow*>(*next_it); + if (!contained_row) + continue; + // remove only rows that are contained by this row + if (contained_row->ContainedByPanel() != object_row->ObjectID()) + break; + RemoveObjectRow(next_it); + } + + // erase this row and remove any signals related to it + m_object_change_connections[object_row->ObjectID()].disconnect(); + m_object_change_connections.erase(object_row->ObjectID()); + this->Erase(it); + } + void ObjectExpandCollapseClicked(int object_id) { if (object_id == INVALID_OBJECT_ID) return; @@ -514,10 +618,38 @@ CollapseObject(object_id); } - std::set<int> m_collapsed_objects; - Condition::ConditionBase* m_filter_condition; + void ObjectStateChanged(int object_id) { + if (object_id == INVALID_OBJECT_ID) + return; + const UniverseObject* obj = GetUniverseObject(object_id); + Logger().debugStream() << "ObjectListBox::ObjectStateChanged: " << obj->Name(); + if (!obj) + return; + if (universe_object_cast<const Ship*>(obj) || + universe_object_cast<const Building*>(obj)) + { + UpdateObjectPanel(object_id); + } else if (universe_object_cast<const Fleet*>(obj) || + universe_object_cast<const Planet*>(obj) || + universe_object_cast<const System*>(obj)) + { + Refresh(); + } + } + + void UniverseObjectDeleted(const UniverseObject* obj) { + if (obj) + RemoveObjectRow(obj->ID()); + } + + std::map<int, boost::signals::connection> m_object_change_connections; + std::set<int> m_collapsed_objects; + Condition::ConditionBase* m_filter_condition; }; +//////////////////////////////////////////////// +// ObjectListWnd +//////////////////////////////////////////////// ObjectListWnd::ObjectListWnd(GG::X w, GG::Y h) : CUIWnd(UserString("MAP_BTN_OBJECTS"), GG::X1, GG::Y1, w - 1, h - 1, GG::ONTOP | GG::INTERACTIVE | GG::DRAGABLE | GG::RESIZABLE), m_list_box(0), @@ -533,22 +665,22 @@ GG::Connect(m_list_box->RightClickedSignal, &ObjectListWnd::ObjectRightClicked, this); AttachChild(m_list_box); - m_filter_button = new CUIButton(GG::X0, GG::Y0, GG::X(30), UserString("FILTERS")); - GG::Connect(m_filter_button->ClickedSignal, &ObjectListWnd::FilterClicked, this); + m_filter_button = new CUIButton(GG::X0, GG::Y0, GG::X(30), UserString("FILTERS")); + GG::Connect(m_filter_button->ClickedSignal, &ObjectListWnd::FilterClicked, this); AttachChild(m_filter_button); - m_sort_button = new CUIButton(GG::X0, GG::Y0, GG::X(30), UserString("SORT")); - GG::Connect(m_sort_button->ClickedSignal, &ObjectListWnd::SortClicked, this); + m_sort_button = new CUIButton(GG::X0, GG::Y0, GG::X(30), UserString("SORT")); + GG::Connect(m_sort_button->ClickedSignal, &ObjectListWnd::SortClicked, this); AttachChild(m_sort_button); m_sort_button->Disable(); - m_columns_button = new CUIButton(GG::X0, GG::Y0, GG::X(30), UserString("COLUMNS")); - GG::Connect(m_columns_button->ClickedSignal, &ObjectListWnd::ColumnsClicked, this); + m_columns_button = new CUIButton(GG::X0, GG::Y0, GG::X(30), UserString("COLUMNS")); + GG::Connect(m_columns_button->ClickedSignal, &ObjectListWnd::ColumnsClicked, this); AttachChild(m_columns_button); m_columns_button->Disable(); - m_collapse_button = new CUIButton(GG::X0, GG::Y0, GG::X(30), UserString("COLLAPSE_ALL")); - GG::Connect(m_collapse_button->ClickedSignal, &ObjectListWnd::CollapseExpandClicked, this); + m_collapse_button = new CUIButton(GG::X0, GG::Y0, GG::X(30), UserString("COLLAPSE_ALL")); + GG::Connect(m_collapse_button->ClickedSignal, &ObjectListWnd::CollapseExpandClicked, this); AttachChild(m_collapse_button); m_collapse_button->Disable(); @@ -556,21 +688,21 @@ } void ObjectListWnd::DoLayout() { - GG::X BUTTON_WIDTH(ClientUI::Pts()*7); - GG::Y BUTTON_HEIGHT = m_filter_button->Height(); + GG::X BUTTON_WIDTH(ClientUI::Pts()*7); + GG::Y BUTTON_HEIGHT = m_filter_button->Height(); int PAD(3); GG::Pt button_ul(GG::X0, ClientHeight() - BUTTON_HEIGHT); - m_filter_button->SizeMove(button_ul, button_ul + GG::Pt(BUTTON_WIDTH, BUTTON_HEIGHT)); - button_ul += GG::Pt(BUTTON_WIDTH + GG::X(PAD), GG::Y0); - m_sort_button->SizeMove(button_ul, button_ul + GG::Pt(BUTTON_WIDTH, BUTTON_HEIGHT)); - button_ul += GG::Pt(BUTTON_WIDTH + GG::X(PAD), GG::Y0); - m_columns_button->SizeMove(button_ul, button_ul + GG::Pt(BUTTON_WIDTH, BUTTON_HEIGHT)); - button_ul += GG::Pt(BUTTON_WIDTH + GG::X(PAD), GG::Y0); - m_collapse_button->SizeMove(button_ul, button_ul + GG::Pt(BUTTON_WIDTH, BUTTON_HEIGHT)); - button_ul += GG::Pt(BUTTON_WIDTH + GG::X(PAD), GG::Y0); - + m_filter_button->SizeMove(button_ul, button_ul + GG::Pt(BUTTON_WIDTH, BUTTON_HEIGHT)); + button_ul += GG::Pt(BUTTON_WIDTH + GG::X(PAD), GG::Y0); + m_sort_button->SizeMove(button_ul, button_ul + GG::Pt(BUTTON_WIDTH, BUTTON_HEIGHT)); + button_ul += GG::Pt(BUTTON_WIDTH + GG::X(PAD), GG::Y0); + m_columns_button->SizeMove(button_ul, button_ul + GG::Pt(BUTTON_WIDTH, BUTTON_HEIGHT)); + button_ul += GG::Pt(BUTTON_WIDTH + GG::X(PAD), GG::Y0); + m_collapse_button->SizeMove(button_ul, button_ul + GG::Pt(BUTTON_WIDTH, BUTTON_HEIGHT)); + button_ul += GG::Pt(BUTTON_WIDTH + GG::X(PAD), GG::Y0); + m_list_box->SizeMove(GG::Pt(GG::X0, GG::Y0), GG::Pt(ClientWidth(), button_ul.y)); SetMinSize(GG::Pt(5*BUTTON_WIDTH, 6*BUTTON_HEIGHT)); |
From: <geo...@us...> - 2012-08-18 00:40:50
|
Revision: 5151 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5151&view=rev Author: geoffthemedio Date: 2012-08-18 00:40:43 +0000 (Sat, 18 Aug 2012) Log Message: ----------- Fixed rows for fleets outside systems disappearing when collapsed. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-18 00:36:13 UTC (rev 5150) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-18 00:40:43 UTC (rev 5151) @@ -485,13 +485,13 @@ std::map<int, std::vector<int> >::const_iterator fs_it = fleet_ships.find(fleet_id); bool has_contents_fleet_row = fs_it != fleet_ships.end(); - if (!has_contents_fleet_row || ObjectCollapsed(fleet_id)) - continue; - AddObjectRow(fleet_id, INVALID_OBJECT_ID, fs_it != fleet_ships.end() ? fs_it->second : std::vector<int>(), indent); + if (!has_contents_fleet_row || ObjectCollapsed(fleet_id)) + continue; + ++indent; // add ship rows on this fleet if (fs_it != fleet_ships.end()) { |
From: <geo...@us...> - 2012-08-18 04:37:31
|
Revision: 5152 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5152&view=rev Author: geoffthemedio Date: 2012-08-18 04:37:24 +0000 (Sat, 18 Aug 2012) Log Message: ----------- Visibility filtering in objects list, including hackish handling of new objects created in client during turn. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-18 00:40:43 UTC (rev 5151) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-18 04:37:24 UTC (rev 5152) @@ -17,6 +17,10 @@ #include <GG/DrawUtil.h> +namespace { + enum VIS_DISPLAY { SHOW_VISIBLE, SHOW_PREVIOUSLY_VISIBLE, SHOW_DESTROYED }; +} + //////////////////////////////////////////////// // FilterDialog //////////////////////////////////////////////// @@ -229,7 +233,7 @@ public: ObjectRow(GG::X w, GG::Y h, const UniverseObject* obj, bool expanded, int container_object_panel, - const std::vector<int>& contained_object_panels, int indent) : + const std::set<int>& contained_object_panels, int indent) : GG::ListBox::Row(w, h, "ObjectRow", GG::ALIGN_CENTER, 1), m_panel(0), m_container_object_panel(container_object_panel), @@ -252,10 +256,10 @@ int ContainedByPanel() const { return m_container_object_panel; } - const std::vector<int>& ContainedPanels() const + const std::set<int>& ContainedPanels() const { return m_contained_object_panels; } - void SetContainedPanels(const std::vector<int>& contained_object_panels) { + void SetContainedPanels(const std::set<int>& contained_object_panels) { m_contained_object_panels = contained_object_panels; m_panel->SetHasContents(!m_contained_object_panels.empty()); m_panel->Refresh(); @@ -281,7 +285,7 @@ private: ObjectPanel* m_panel; int m_container_object_panel; - std::vector<int> m_contained_object_panels; + std::set<int> m_contained_object_panels; }; //////////////////////////////////////////////// @@ -291,8 +295,10 @@ public: ObjectListBox() : CUIListBox(GG::X0, GG::Y0, GG::X1, GG::Y1), + m_object_change_connections(), m_collapsed_objects(), - m_filter_condition(0) + m_filter_condition(0), + m_visibilities() { // preinitialize listbox/row column widths, because what // ListBox::Insert does on default is not suitable for this case @@ -302,6 +308,15 @@ m_filter_condition = new Condition::All(); + m_visibilities[OBJ_BUILDING].insert(SHOW_VISIBLE); + m_visibilities[OBJ_BUILDING].insert(SHOW_PREVIOUSLY_VISIBLE); + m_visibilities[OBJ_SHIP].insert(SHOW_VISIBLE); + m_visibilities[OBJ_FLEET].insert(SHOW_VISIBLE); + m_visibilities[OBJ_PLANET].insert(SHOW_VISIBLE); + m_visibilities[OBJ_PLANET].insert(SHOW_PREVIOUSLY_VISIBLE); + m_visibilities[OBJ_SYSTEM].insert(SHOW_VISIBLE); + m_visibilities[OBJ_SYSTEM].insert(SHOW_PREVIOUSLY_VISIBLE); + GG::Connect(GetUniverse().UniverseObjectDeleteSignal, &ObjectListBox::UniverseObjectDeleted, this); } @@ -365,51 +380,109 @@ m_object_change_connections.clear(); } + bool ObjectShown(int object_id, UniverseObjectType type, bool assume_visible_without_checking = false) { + if (object_id == INVALID_OBJECT_ID) + return false; + int client_empire_id = HumanClientApp::GetApp()->EmpireID(); + + if (GetUniverse().EmpireKnownDestroyedObjectIDs(client_empire_id).find(object_id) != GetUniverse().EmpireKnownDestroyedObjectIDs(client_empire_id).end()) + return m_visibilities[type].find(SHOW_DESTROYED) != m_visibilities[type].end(); + + if (assume_visible_without_checking || GetUniverse().GetObjectVisibilityByEmpire(object_id, client_empire_id)) + return m_visibilities[type].find(SHOW_VISIBLE) != m_visibilities[type].end(); + + return m_visibilities[type].find(SHOW_PREVIOUSLY_VISIBLE) != m_visibilities[type].end(); + } + void Refresh() { std::size_t first_visible_queue_row = std::distance(this->begin(), this->FirstRowShown()); ClearContents(); - const ObjectMap& objects = GetUniverse().Objects(); + const ObjectMap& visible_objects = GetUniverse().Objects(); + const ObjectMap& known_objects = GetUniverse().EmpireKnownObjects(HumanClientApp::GetApp()->EmpireID()); + std::set<int> already_filtered_objects; + bool nested = true; if (!nested) { } else { // sort objects by containment associations - std::vector<int> systems; - std::map<int, std::vector<int> > system_fleets; - std::map<int, std::vector<int> > fleet_ships; - std::map<int, std::vector<int> > system_planets; - std::map<int, std::vector<int> > planet_buildings; + std::set<int> systems; + std::map<int, std::set<int> > system_fleets; + std::map<int, std::set<int> > fleet_ships; + std::map<int, std::set<int> > system_planets; + std::map<int, std::set<int> > planet_buildings; - for (ObjectMap::const_iterator it = objects.const_begin(); it != objects.const_end(); ++it) { + for (ObjectMap::const_iterator it = visible_objects.const_begin(); it != visible_objects.const_end(); ++it) { + int object_id = it->first; + already_filtered_objects.insert(object_id); const UniverseObject* obj = it->second; - if (const System* system = universe_object_cast<const System*>(obj)) - systems.push_back(system->ID()); - else if (const Fleet* fleet = universe_object_cast<const Fleet*>(obj)) - system_fleets[fleet->SystemID()].push_back(fleet->ID()); - else if (const Ship* ship = universe_object_cast<const Ship*>(obj)) - fleet_ships[ship->FleetID()].push_back(ship->ID()); - else if (const Planet* planet = universe_object_cast<const Planet*>(obj)) - system_planets[planet->SystemID()].push_back(planet->ID()); - else if (const Building* building = universe_object_cast<const Building*>(obj)) - planet_buildings[building->PlanetID()].push_back(building->ID()); + + if (const System* system = universe_object_cast<const System*>(obj)) { + if (ObjectShown(object_id, OBJ_SYSTEM, true)) + systems.insert(object_id); + + } else if (const Fleet* fleet = universe_object_cast<const Fleet*>(obj)) { + if (ObjectShown(object_id, OBJ_FLEET, true)) + system_fleets[fleet->SystemID()].insert(object_id); + + } else if (const Ship* ship = universe_object_cast<const Ship*>(obj)) { + if (ObjectShown(object_id, OBJ_SHIP, true)) + fleet_ships[ship->FleetID()].insert(object_id); + + } else if (const Planet* planet = universe_object_cast<const Planet*>(obj)) { + if (ObjectShown(object_id, OBJ_PLANET, true)) + system_planets[planet->SystemID()].insert(object_id); + + } else if (const Building* building = universe_object_cast<const Building*>(obj)) { + if (ObjectShown(object_id, OBJ_BUILDING, true)) + planet_buildings[building->PlanetID()].insert(object_id); + } } + for (ObjectMap::const_iterator it = known_objects.const_begin(); it != known_objects.const_end(); ++it) { + int object_id = it->first; + if (already_filtered_objects.find(object_id) != already_filtered_objects.end()) + continue; + const UniverseObject* obj = it->second; + if (const System* system = universe_object_cast<const System*>(obj)) { + if (ObjectShown(object_id, OBJ_SYSTEM)) + systems.insert(object_id); + + } else if (const Fleet* fleet = universe_object_cast<const Fleet*>(obj)) { + if (ObjectShown(object_id, OBJ_FLEET)) + system_fleets[fleet->SystemID()].insert(object_id); + + } else if (const Ship* ship = universe_object_cast<const Ship*>(obj)) { + if (ObjectShown(object_id, OBJ_SHIP)) + fleet_ships[ship->FleetID()].insert(object_id); + + } else if (const Planet* planet = universe_object_cast<const Planet*>(obj)) { + if (ObjectShown(object_id, OBJ_PLANET)) + system_planets[planet->SystemID()].insert(object_id); + + } else if (const Building* building = universe_object_cast<const Building*>(obj)) { + if (ObjectShown(object_id, OBJ_BUILDING)) + planet_buildings[building->PlanetID()].insert(object_id); + } + } + + int indent = 0; // add system rows - for (std::vector<int>::const_iterator sys_it = systems.begin(); sys_it != systems.end(); ++sys_it) { + for (std::set<int>::const_iterator sys_it = systems.begin(); sys_it != systems.end(); ++sys_it) { int system_id = *sys_it; - std::map<int, std::vector<int> >::const_iterator sp_it = system_planets.find(system_id); - std::map<int, std::vector<int> >::const_iterator sf_it = system_fleets.find(system_id); + std::map<int, std::set<int> >::const_iterator sp_it = system_planets.find(system_id); + std::map<int, std::set<int> >::const_iterator sf_it = system_fleets.find(system_id); bool has_contents_system_row = sp_it != system_planets.end() || sf_it != system_fleets.end(); - std::vector<int> system_contents; + std::set<int> system_contents; if (sp_it != system_planets.end()) system_contents = sp_it->second; if (sf_it != system_fleets.end()) - std::copy(sf_it->second.begin(), sf_it->second.end(), std::back_inserter(system_contents)); + system_contents.insert(sf_it->second.begin(), sf_it->second.end()); AddObjectRow(system_id, INVALID_OBJECT_ID, system_contents, indent); @@ -419,15 +492,15 @@ ++indent; // add planet rows in this system if (sp_it != system_planets.end()) { - const std::vector<int>& planets = sp_it->second; - for (std::vector<int>::const_iterator planet_it = planets.begin(); planet_it != planets.end(); ++planet_it) { + const std::set<int>& planets = sp_it->second; + for (std::set<int>::const_iterator planet_it = planets.begin(); planet_it != planets.end(); ++planet_it) { int planet_id = *planet_it; - std::map<int, std::vector<int> >::const_iterator pb_it = planet_buildings.find(planet_id); + std::map<int, std::set<int> >::const_iterator pb_it = planet_buildings.find(planet_id); bool has_contents_planet_row = pb_it != planet_buildings.end(); AddObjectRow(planet_id, system_id, - pb_it != planet_buildings.end() ? pb_it->second : std::vector<int>(), + pb_it != planet_buildings.end() ? pb_it->second : std::set<int>(), indent); if (!has_contents_planet_row || ObjectCollapsed(planet_id)) @@ -436,9 +509,9 @@ ++indent; // add building rows on this planet if (pb_it != planet_buildings.end()) { - const std::vector<int>& buildings = pb_it->second; - for (std::vector<int>::const_iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { - AddObjectRow(*building_it, planet_id, std::vector<int>(), indent); + const std::set<int>& buildings = pb_it->second; + for (std::set<int>::const_iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { + AddObjectRow(*building_it, planet_id, std::set<int>(), indent); } } indent--; @@ -447,15 +520,15 @@ // add fleet rows in this system if (sf_it != system_fleets.end()) { - const std::vector<int>& fleets = sf_it->second; - for (std::vector<int>::const_iterator fleet_it = fleets.begin(); fleet_it != fleets.end(); ++fleet_it) { + const std::set<int>& fleets = sf_it->second; + for (std::set<int>::const_iterator fleet_it = fleets.begin(); fleet_it != fleets.end(); ++fleet_it) { int fleet_id = *fleet_it; - std::map<int, std::vector<int> >::const_iterator fs_it = fleet_ships.find(fleet_id); + std::map<int, std::set<int> >::const_iterator fs_it = fleet_ships.find(fleet_id); bool has_contents_fleet_row = fs_it != fleet_ships.end(); AddObjectRow(fleet_id, system_id, - fs_it != fleet_ships.end() ? fs_it->second : std::vector<int>(), + fs_it != fleet_ships.end() ? fs_it->second : std::set<int>(), indent); if (!has_contents_fleet_row || ObjectCollapsed(fleet_id)) @@ -464,9 +537,9 @@ ++indent; // add ship rows on this fleet if (fs_it != fleet_ships.end()) { - const std::vector<int>& ships = fs_it->second; - for (std::vector<int>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { - AddObjectRow(*ship_it, fleet_id, std::vector<int>(), indent); + const std::set<int>& ships = fs_it->second; + for (std::set<int>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { + AddObjectRow(*ship_it, fleet_id, std::set<int>(), indent); } } indent--; @@ -476,17 +549,17 @@ } // add fleets outside systems... - std::map<int, std::vector<int> >::const_iterator sf_it = system_fleets.find(INVALID_OBJECT_ID); + std::map<int, std::set<int> >::const_iterator sf_it = system_fleets.find(INVALID_OBJECT_ID); if (sf_it != system_fleets.end()) { - const std::vector<int>& fleets = sf_it->second; - for (std::vector<int>::const_iterator fleet_it = fleets.begin(); fleet_it != fleets.end(); ++fleet_it) { + const std::set<int>& fleets = sf_it->second; + for (std::set<int>::const_iterator fleet_it = fleets.begin(); fleet_it != fleets.end(); ++fleet_it) { int fleet_id = *fleet_it; - std::map<int, std::vector<int> >::const_iterator fs_it = fleet_ships.find(fleet_id); + std::map<int, std::set<int> >::const_iterator fs_it = fleet_ships.find(fleet_id); bool has_contents_fleet_row = fs_it != fleet_ships.end(); AddObjectRow(fleet_id, INVALID_OBJECT_ID, - fs_it != fleet_ships.end() ? fs_it->second : std::vector<int>(), + fs_it != fleet_ships.end() ? fs_it->second : std::set<int>(), indent); if (!has_contents_fleet_row || ObjectCollapsed(fleet_id)) @@ -495,9 +568,9 @@ ++indent; // add ship rows on this fleet if (fs_it != fleet_ships.end()) { - const std::vector<int>& ships = fs_it->second; - for (std::vector<int>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { - AddObjectRow(*ship_it, fleet_id, std::vector<int>(), indent); + const std::set<int>& ships = fs_it->second; + for (std::set<int>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { + AddObjectRow(*ship_it, fleet_id, std::set<int>(), indent); } } indent--; @@ -523,10 +596,10 @@ } private: - void AddObjectRow(int object_id, int container, const std::vector<int>& contents, int indent) + void AddObjectRow(int object_id, int container, const std::set<int>& contents, int indent) { AddObjectRow(object_id, container, contents, indent, this->end()); } - void AddObjectRow(int object_id, int container, const std::vector<int>& contents, + void AddObjectRow(int object_id, int container, const std::set<int>& contents, int indent, GG::ListBox::iterator it) { const UniverseObject* obj = GetUniverseObject(object_id); @@ -565,13 +638,13 @@ for (GG::ListBox::iterator it = this->begin(); it != this->end(); ++it) { if (ObjectRow* object_row = dynamic_cast<ObjectRow*>(*it)) { if (object_row->ObjectID() == container_object_id) { - const std::vector<int>& contents = object_row->ContainedPanels(); - std::vector<int> new_contents; - for (std::vector<int>::const_iterator contents_it = contents.begin(); + const std::set<int>& contents = object_row->ContainedPanels(); + std::set<int> new_contents; + for (std::set<int>::const_iterator contents_it = contents.begin(); contents_it != contents.end(); ++contents_it) { if (*contents_it != object_id) - new_contents.push_back(*contents_it); + new_contents.insert(*contents_it); } object_row->SetContainedPanels(new_contents); object_row->Update(); @@ -589,7 +662,7 @@ ObjectRow* object_row = dynamic_cast<ObjectRow*>(*it); // recursively remove contained rows first - const std::vector<int>& contents = object_row->ContainedPanels(); + const std::set<int>& contents = object_row->ContainedPanels(); for (unsigned int i = 0; i < contents.size(); ++i) { GG::ListBox::iterator next_it = it; ++next_it; if (next_it == this->end()) @@ -642,9 +715,10 @@ RemoveObjectRow(obj->ID()); } - std::map<int, boost::signals::connection> m_object_change_connections; - std::set<int> m_collapsed_objects; - Condition::ConditionBase* m_filter_condition; + std::map<int, boost::signals::connection> m_object_change_connections; + std::set<int> m_collapsed_objects; + Condition::ConditionBase* m_filter_condition; + std::map<UniverseObjectType, std::set<VIS_DISPLAY> >m_visibilities; }; //////////////////////////////////////////////// |
From: <ve...@us...> - 2012-08-22 08:21:04
|
Revision: 5160 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5160&view=rev Author: vezzra Date: 2012-08-22 08:20:57 +0000 (Wed, 22 Aug 2012) Log Message: ----------- renamed "...const and" to "...const and_condition" in FilterDialog::Init in ObjectListWnd.cpp (line 151&152) to fix compile error on OSX Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-21 17:58:28 UTC (rev 5159) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-22 08:20:57 UTC (rev 5160) @@ -33,7 +33,7 @@ CUIWnd(UserString("FILTERS"), x, y, w, h, GG::INTERACTIVE | GG::DRAGABLE | GG::MODAL | GG::RESIZABLE), m_vis_filters(vis_filters) { - GG::Layout* layout = new GG::Layout(GG::X0, GG::Y0, ClientWidth(), ClientHeight(), 4, 6); + GG::Layout* layout = new GG::Layout(GG::X0, GG::Y0, ClientWidth(), ClientHeight(), 4, 6); SetLayout(layout); Init(condition_filter); } @@ -132,24 +132,24 @@ layout->Add(new GG::TextControl(GG::X0, GG::Y0, uot_label, font, color, GG::FORMAT_CENTER), 0, col, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); - CUIStateButton* button = new CUIStateButton(GG::X0, GG::Y0, GG::X1, GG::Y1, " ", GG::FORMAT_CENTER); + CUIStateButton* button = new CUIStateButton(GG::X0, GG::Y0, GG::X1, GG::Y1, " ", GG::FORMAT_CENTER); button->SetCheck(vis_display.find(SHOW_VISIBLE) != vis_display.end()); layout->Add(button, 1, col, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); - - button = new CUIStateButton(GG::X0, GG::Y0, GG::X1, GG::Y1, " ", GG::FORMAT_CENTER); + + button = new CUIStateButton(GG::X0, GG::Y0, GG::X1, GG::Y1, " ", GG::FORMAT_CENTER); button->SetCheck(vis_display.find(SHOW_PREVIOUSLY_VISIBLE) != vis_display.end()); layout->Add(button, 2, col, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); - - button = new CUIStateButton(GG::X0, GG::Y0, GG::X1, GG::Y1, " ", GG::FORMAT_CENTER); + + button = new CUIStateButton(GG::X0, GG::Y0, GG::X1, GG::Y1, " ", GG::FORMAT_CENTER); button->SetCheck(vis_display.find(SHOW_DESTROYED) != vis_display.end()); layout->Add(button, 3, col, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); - } + } if (!condition_filter) { m_conditions.clear(); - } else if (const Condition::And* const and = dynamic_cast<const Condition::And* const>(condition_filter)) { - const std::vector<const Condition::ConditionBase*>& operands = and->Operands(); + } else if (const Condition::And* const and_condition = dynamic_cast<const Condition::And* const>(condition_filter)) { + const std::vector<const Condition::ConditionBase*>& operands = and_condition->Operands(); for (std::vector<const Condition::ConditionBase*>::const_iterator it = operands.begin(); it != operands.end(); ++it) { @@ -168,8 +168,8 @@ void Done() { m_done = true; } - virtual void RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { - Done(); + virtual void RClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) { + Done(); } std::map<UniverseObjectType, std::set<VIS_DISPLAY> > m_vis_filters; |
From: <geo...@us...> - 2012-08-24 01:52:33
|
Revision: 5163 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5163&view=rev Author: geoffthemedio Date: 2012-08-24 01:52:27 +0000 (Fri, 24 Aug 2012) Log Message: ----------- Moved around some buttons and added some functions to respond to their clicks. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-23 12:46:35 UTC (rev 5162) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-24 01:52:27 UTC (rev 5163) @@ -32,6 +32,7 @@ const Condition::ConditionBase* const condition_filter) : CUIWnd(UserString("FILTERS"), x, y, GG::X(400), GG::Y(250), GG::INTERACTIVE | GG::DRAGABLE | GG::MODAL), m_vis_filters(vis_filters), + m_accept_changes(false), m_filters_layout(0), m_cancel_button(0), m_apply_button(0) @@ -166,23 +167,35 @@ m_cancel_button = new CUIButton(GG::X0, GG::Y0, GG::X(ClientUI::Pts()*8), UserString("CANCEL"), font); AttachChild(m_cancel_button); + GG::Connect(m_cancel_button->ClickedSignal, &FilterDialog::CancelClicked, this); + m_apply_button = new CUIButton(GG::X0, GG::Y0, GG::X(ClientUI::Pts()*8), UserString("APPLY"), font); AttachChild(m_apply_button); + GG::Connect(m_apply_button->ClickedSignal, &FilterDialog::AcceptClicked, this); GG::Pt button_lr = this->ClientSize(); + m_cancel_button->MoveTo(GG::Pt(button_lr.x - m_cancel_button->Width(), + button_lr.y - m_cancel_button->Height())); + button_lr = button_lr - GG::Pt(m_apply_button->Width() + GG::X(3), GG::Y0); m_apply_button->MoveTo(GG::Pt(button_lr.x - m_apply_button->Width(), button_lr.y - m_apply_button->Height())); - button_lr = button_lr - GG::Pt(m_apply_button->Width() + GG::X(3), GG::Y0); - m_cancel_button->MoveTo(GG::Pt(button_lr.x - m_cancel_button->Width(), - button_lr.y - m_cancel_button->Height())); } - void Done() - { m_done = true; } + void AcceptClicked() { + m_accept_changes = true; + m_done = true; + } + void CancelClicked() { + m_accept_changes = false; + m_done = true; + } + std::map<UniverseObjectType, std::set<VIS_DISPLAY> > m_vis_filters; std::vector<const Condition::ConditionBase*> m_conditions; + bool m_accept_changes; + GG::Layout* m_filters_layout; GG::Button* m_cancel_button; GG::Button* m_apply_button; |
From: <geo...@us...> - 2012-08-24 05:04:32
|
Revision: 5164 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5164&view=rev Author: geoffthemedio Date: 2012-08-24 05:04:21 +0000 (Fri, 24 Aug 2012) Log Message: ----------- Got visibility and object type filter grid functional. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-24 01:52:27 UTC (rev 5163) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-24 05:04:21 UTC (rev 5164) @@ -41,53 +41,58 @@ } ~FilterDialog() { - for (std::vector<const Condition::ConditionBase*>::iterator it = m_conditions.begin(); + for (std::vector<Condition::ConditionBase*>::iterator it = m_conditions.begin(); it != m_conditions.end(); ++it) { delete *it; } m_conditions.clear(); } + bool ChangesAccepted() + { return m_accept_changes; } + std::map<UniverseObjectType, std::set<VIS_DISPLAY> > GetVisibilityFilters() const { return m_vis_filters; } // caller takes ownership of returned ConditionBase* - const Condition::ConditionBase* GetConditionFilter() { + Condition::ConditionBase* GetConditionFilter() { if (m_conditions.empty()) { return new Condition::All(); } else if (m_conditions.size() == 1) { - const Condition::ConditionBase* retval = *(m_conditions.begin()); + Condition::ConditionBase* retval = *(m_conditions.begin()); m_conditions.clear(); return retval; } else { - const Condition::ConditionBase* retval = new Condition::And(m_conditions); + std::vector<const Condition::ConditionBase*> params; + for (std::vector<Condition::ConditionBase*>::const_iterator it = m_conditions.begin(); + it != m_conditions.end(); ++it) + { params.push_back(*it); } + Condition::ConditionBase* retval = new Condition::And(params); m_conditions.clear(); return retval; } } - mutable boost::signal<void ()> FiltersChangedSignal; - private: - const ValueRef::ValueRefBase<std::string>* CopyStringValueRef(const ValueRef::ValueRefBase<std::string>* const value_ref) { + ValueRef::ValueRefBase<std::string>* CopyStringValueRef(const ValueRef::ValueRefBase<std::string>* const value_ref) { if (const ValueRef::Constant<std::string>* constant = dynamic_cast<const ValueRef::Constant<std::string>*>(value_ref)) { return new ValueRef::Constant<std::string>(constant->Value()); } return new ValueRef::Constant<std::string>(""); } - const ValueRef::ValueRefBase<int>* CopyIntValueRef(const ValueRef::ValueRefBase<int>* const value_ref) { + ValueRef::ValueRefBase<int>* CopyIntValueRef(const ValueRef::ValueRefBase<int>* const value_ref) { if (const ValueRef::Constant<int>* constant = dynamic_cast<const ValueRef::Constant<int>*>(value_ref)) { return new ValueRef::Constant<int>(constant->Value()); } return new ValueRef::Constant<int>(0); } - const ValueRef::ValueRefBase<double>* CopyDoubleValueRef(const ValueRef::ValueRefBase<double>* const value_ref) { + ValueRef::ValueRefBase<double>* CopyDoubleValueRef(const ValueRef::ValueRefBase<double>* const value_ref) { if (const ValueRef::Constant<double>* constant = dynamic_cast<const ValueRef::Constant<double>*>(value_ref)) { return new ValueRef::Constant<double>(constant->Value()); } return new ValueRef::Constant<double>(0.0); } - const Condition::ConditionBase* CopyCondition(const Condition::ConditionBase* const condition) { + Condition::ConditionBase* CopyCondition(const Condition::ConditionBase* const condition) { if (dynamic_cast<const Condition::Source* const>(condition)) { return new Condition::Source(); @@ -136,14 +141,17 @@ CUIStateButton* button = new CUIStateButton(GG::X0, GG::Y0, GG::X1, GG::Y1, " ", GG::FORMAT_CENTER); button->SetCheck(vis_display.find(SHOW_VISIBLE) != vis_display.end()); m_filters_layout->Add(button, 1, col, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + GG::Connect(button->CheckedSignal, &FilterDialog::UpdateVisfiltersFromStateButtons, this); button = new CUIStateButton(GG::X0, GG::Y0, GG::X1, GG::Y1, " ", GG::FORMAT_CENTER); button->SetCheck(vis_display.find(SHOW_PREVIOUSLY_VISIBLE) != vis_display.end()); m_filters_layout->Add(button, 2, col, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + GG::Connect(button->CheckedSignal, &FilterDialog::UpdateVisfiltersFromStateButtons, this); button = new CUIStateButton(GG::X0, GG::Y0, GG::X1, GG::Y1, " ", GG::FORMAT_CENTER); button->SetCheck(vis_display.find(SHOW_DESTROYED) != vis_display.end()); m_filters_layout->Add(button, 3, col, GG::ALIGN_CENTER | GG::ALIGN_VCENTER); + GG::Connect(button->CheckedSignal, &FilterDialog::UpdateVisfiltersFromStateButtons, this); } if (!condition_filter) { @@ -154,13 +162,13 @@ for (std::vector<const Condition::ConditionBase*>::const_iterator it = operands.begin(); it != operands.end(); ++it) { - const Condition::ConditionBase* copied_condition = CopyCondition(*it); + Condition::ConditionBase* copied_condition = CopyCondition(*it); if (copied_condition) m_conditions.push_back(copied_condition); } } else { - const Condition::ConditionBase* copied_condition = CopyCondition(condition_filter); + Condition::ConditionBase* copied_condition = CopyCondition(condition_filter); if (copied_condition) m_conditions.push_back(copied_condition); } @@ -191,8 +199,36 @@ m_done = true; } + void UpdateVisfiltersFromStateButtons(bool button_checked) { + std::vector<std::vector<const GG::Wnd*> > layout_cells = m_filters_layout->Cells(); + + int col = 1; + for (std::map<UniverseObjectType, std::set<VIS_DISPLAY> >::iterator uot_it = m_vis_filters.begin(); + uot_it != m_vis_filters.end(); ++uot_it, ++col) + { + const UniverseObjectType& uot = uot_it->first; + std::set<VIS_DISPLAY>& vis_display = uot_it->second; + vis_display.clear(); + + const GG::Wnd* wnd = layout_cells[1][col]; + const CUIStateButton* button = dynamic_cast<const CUIStateButton*>(wnd); + if (button && button->Checked()) + m_vis_filters[uot].insert(SHOW_VISIBLE); + + wnd = layout_cells[2][col]; + button = dynamic_cast<const CUIStateButton*>(wnd); + if (button && button->Checked()) + m_vis_filters[uot].insert(SHOW_PREVIOUSLY_VISIBLE); + + wnd = layout_cells[3][col]; + button = dynamic_cast<const CUIStateButton*>(wnd); + if (button && button->Checked()) + m_vis_filters[uot].insert(SHOW_DESTROYED); + } + } + std::map<UniverseObjectType, std::set<VIS_DISPLAY> > m_vis_filters; - std::vector<const Condition::ConditionBase*> m_conditions; + std::vector<Condition::ConditionBase*> m_conditions; bool m_accept_changes; @@ -541,6 +577,13 @@ Refresh(); } + void SetVisibilityFilters(const std::map<UniverseObjectType, std::set<VIS_DISPLAY> >& vis) { + if (vis != m_visibilities) { + m_visibilities = vis; + Refresh(); + } + } + void ClearContents() { Clear(); for (std::map<int, boost::signals::connection>::iterator it = m_object_change_connections.begin(); @@ -1006,6 +1049,11 @@ FilterDialog dlg(GG::X(100), GG::Y(100), m_list_box->Visibilities(), m_list_box->FilterCondition()); dlg.Run(); + + if (dlg.ChangesAccepted()) { + m_list_box->SetVisibilityFilters(dlg.GetVisibilityFilters()); + m_list_box->SetFilterCondition(dlg.GetConditionFilter()); + } } void ObjectListWnd::SortClicked() { |
From: <geo...@us...> - 2012-08-25 11:46:55
|
Revision: 5166 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5166&view=rev Author: geoffthemedio Date: 2012-08-25 11:46:49 +0000 (Sat, 25 Aug 2012) Log Message: ----------- -Fixed objects list crash when a nonexistant texture was added as an icon. -Added initial condition selection droplist and various related support code. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-24 16:27:28 UTC (rev 5165) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-25 11:46:49 UTC (rev 5166) @@ -2,6 +2,7 @@ #include "ClientUI.h" #include "CUIControls.h" +#include "CUISpin.h" #include "FleetButton.h" #include "../client/human/HumanClientApp.h" #include "../util/MultiplayerCommon.h" @@ -19,10 +20,163 @@ #include <GG/DrawUtil.h> #include <GG/Layout.h> -namespace -{ enum VIS_DISPLAY { SHOW_VISIBLE, SHOW_PREVIOUSLY_VISIBLE, SHOW_DESTROYED }; } +namespace { + enum VIS_DISPLAY { SHOW_VISIBLE, SHOW_PREVIOUSLY_VISIBLE, SHOW_DESTROYED }; + ValueRef::ValueRefBase<std::string>* CopyStringValueRef(const ValueRef::ValueRefBase<std::string>* const value_ref) { + if (const ValueRef::Constant<std::string>* constant = + dynamic_cast<const ValueRef::Constant<std::string>*>(value_ref)) + { return new ValueRef::Constant<std::string>(constant->Value()); } + return new ValueRef::Constant<std::string>(""); + } + ValueRef::ValueRefBase<int>* CopyIntValueRef(const ValueRef::ValueRefBase<int>* const value_ref) { + if (const ValueRef::Constant<int>* constant = + dynamic_cast<const ValueRef::Constant<int>*>(value_ref)) + { return new ValueRef::Constant<int>(constant->Value()); } + return new ValueRef::Constant<int>(0); + } + ValueRef::ValueRefBase<double>* CopyDoubleValueRef(const ValueRef::ValueRefBase<double>* const value_ref) { + if (const ValueRef::Constant<double>* constant = + dynamic_cast<const ValueRef::Constant<double>*>(value_ref)) + { return new ValueRef::Constant<double>(constant->Value()); } + return new ValueRef::Constant<double>(0.0); + } + + Condition::ConditionBase* CopyCondition(const Condition::ConditionBase* const condition) { + if (dynamic_cast<const Condition::Source* const>(condition)) { + return new Condition::Source(); + + } else if (dynamic_cast<const Condition::Homeworld* const>(condition)) { + return new Condition::Homeworld(); + + } else if (dynamic_cast<const Condition::Building* const>(condition)) { + + } + + return new Condition::All(); + } + + const std::string EMPTY_STRING; + + const std::string ALL_CONDITION("All"); + const std::string HOMEWORLD_CONDITION("Homeworld"); + const std::string CAPITAL_CONDITION("Capital"); + const std::string MONSTER_CONDITION("Monster"); + const std::string ARMED_CONDITION("Armed"); + const std::string STATIONARY_CONDITION("Stationary"); + //const std::string CAPITAL_CONDITION("Capital"); + //const std::string CAPITAL_CONDITION("Capital"); + //const std::string CAPITAL_CONDITION("Capital"); + //const std::string CAPITAL_CONDITION("Capital"); + //const std::string CAPITAL_CONDITION("Capital"); + //const std::string CAPITAL_CONDITION("Capital"); + + //struct Homeworld; + //struct Building; + //struct HasSpecial; + //struct HasTag; + //struct ProducedByEmpire; + //struct ExploredByEmpire; + //struct ContainedBy; + //struct InSystem; + //struct ObjectID; + //struct CreatedOnTurn; +} + + //////////////////////////////////////////////// +// ConditionWidget +//////////////////////////////////////////////// +class ConditionWidget : public GG::Control { +public: + ConditionWidget(GG::X x, GG::Y y, const Condition::ConditionBase* initial_condition = 0) : + GG::Control(x, y, GG::X(380), GG::Y(30), GG::INTERACTIVE), + m_class_drop(0), + m_param_edit(0), + m_param_spin(0) + { + Condition::ConditionBase* init_condition = 0; + if (!initial_condition) { + init_condition = new Condition::All(); + } else { + init_condition = CopyCondition(initial_condition); + } + Init(init_condition); + } + + ~ConditionWidget() { + delete m_class_drop; + delete m_param_edit; + delete m_param_spin; + } + + Condition::ConditionBase* GetCondition() { + Condition::ConditionBase* retval = 0; + + return retval; + } + + ValueRef::ValueRefBase<int>* GetIntValueRef() { + if (m_param_spin) + return new ValueRef::Constant<int>(m_param_spin->Value()); + else + return new ValueRef::Constant<int>(0); + } + + std::string GetString() { + if (m_param_edit) + return m_param_edit->Text(); + else + return ""; + } + + virtual void Render() { + GG::Pt ul = UpperLeft(), lr = LowerRight(); + GG::FlatRectangle(ul, lr, ClientUI::CtrlColor(), ClientUI::CtrlBorderColor()); + } + +private: + class ConditionRow : public GG::ListBox::Row { + public: + ConditionRow(GG::X w, GG::Y h, const std::string& key, const std::string& label) : + GG::ListBox::Row(w, h, "ConditionRow"), + m_condition_key(key) + { + SetChildClippingMode(ClipToClient); + push_back(label, ClientUI::GetFont(), ClientUI::TextColor()); + } + const std::string& GetKey() const + { return m_condition_key; } + private: + std::string m_condition_key; + }; + + void Init(const Condition::ConditionBase* init_condition) { + // fill droplist with basic types of conditions and select appropriate row + m_class_drop = new CUIDropDownList(GG::X0, GG::Y0, GG::X(ClientUI::Pts()*10), + GG::Y(ClientUI::Pts()*3/2), GG::Y(ClientUI::Pts()*8)); + AttachChild(m_class_drop); + m_class_drop->Insert(new ConditionRow(ClientWidth(), ClientHeight(), ALL_CONDITION, UserString("ALL"))); + m_class_drop->Insert(new ConditionRow(ClientWidth(), ClientHeight(), HOMEWORLD_CONDITION, UserString("HOMEWORLD"))); + m_class_drop->Insert(new ConditionRow(ClientWidth(), ClientHeight(), CAPITAL_CONDITION, UserString("CAPITAL"))); + m_class_drop->Insert(new ConditionRow(ClientWidth(), ClientHeight(), MONSTER_CONDITION, UserString("MONSTER"))); + m_class_drop->Insert(new ConditionRow(ClientWidth(), ClientHeight(), ARMED_CONDITION, UserString("ARMED"))); + m_class_drop->Insert(new ConditionRow(ClientWidth(), ClientHeight(), STATIONARY_CONDITION, UserString("STAIONARY"))); + + SetMinSize(m_class_drop->Size()); + + delete init_condition; + } + + void DoLayout() { + } + + CUIDropDownList* m_class_drop; + CUIEdit* m_param_edit; + CUISpin<int>* m_param_spin; +}; + +//////////////////////////////////////////////// // FilterDialog //////////////////////////////////////////////// class FilterDialog : public CUIWnd { @@ -73,39 +227,6 @@ } private: - ValueRef::ValueRefBase<std::string>* CopyStringValueRef(const ValueRef::ValueRefBase<std::string>* const value_ref) { - if (const ValueRef::Constant<std::string>* constant = - dynamic_cast<const ValueRef::Constant<std::string>*>(value_ref)) - { return new ValueRef::Constant<std::string>(constant->Value()); } - return new ValueRef::Constant<std::string>(""); - } - ValueRef::ValueRefBase<int>* CopyIntValueRef(const ValueRef::ValueRefBase<int>* const value_ref) { - if (const ValueRef::Constant<int>* constant = - dynamic_cast<const ValueRef::Constant<int>*>(value_ref)) - { return new ValueRef::Constant<int>(constant->Value()); } - return new ValueRef::Constant<int>(0); - } - ValueRef::ValueRefBase<double>* CopyDoubleValueRef(const ValueRef::ValueRefBase<double>* const value_ref) { - if (const ValueRef::Constant<double>* constant = - dynamic_cast<const ValueRef::Constant<double>*>(value_ref)) - { return new ValueRef::Constant<double>(constant->Value()); } - return new ValueRef::Constant<double>(0.0); - } - - Condition::ConditionBase* CopyCondition(const Condition::ConditionBase* const condition) { - if (dynamic_cast<const Condition::Source* const>(condition)) { - return new Condition::Source(); - - } else if (dynamic_cast<const Condition::Homeworld* const>(condition)) { - return new Condition::Homeworld(); - - } else if (dynamic_cast<const Condition::Building* const>(condition)) { - - } - - return new Condition::All(); - } - void Init(const Condition::ConditionBase* const condition_filter) { if (m_filters_layout) delete m_filters_layout; @@ -173,6 +294,9 @@ m_conditions.push_back(copied_condition); } + m_condition_widget = new ConditionWidget(GG::X(3), m_filters_layout->Height() + GG::Y(3)); + AttachChild(m_condition_widget); + m_cancel_button = new CUIButton(GG::X0, GG::Y0, GG::X(ClientUI::Pts()*8), UserString("CANCEL"), font); AttachChild(m_cancel_button); GG::Connect(m_cancel_button->ClickedSignal, &FilterDialog::CancelClicked, this); @@ -230,16 +354,16 @@ std::map<UniverseObjectType, std::set<VIS_DISPLAY> > m_vis_filters; std::vector<Condition::ConditionBase*> m_conditions; - bool m_accept_changes; + bool m_accept_changes; - GG::Layout* m_filters_layout; - GG::Button* m_cancel_button; - GG::Button* m_apply_button; + ConditionWidget* m_condition_widget; + + GG::Layout* m_filters_layout; + GG::Button* m_cancel_button; + GG::Button* m_apply_button; }; namespace { - static std::string EMPTY_STRING; - std::vector<boost::shared_ptr<GG::Texture> > ObjectTextures(const UniverseObject* obj) { std::vector<boost::shared_ptr<GG::Texture> > retval; @@ -250,24 +374,27 @@ retval.push_back(ClientUI::ShipDesignIcon(INVALID_OBJECT_ID)); // default icon } else if (const Fleet* fleet = universe_object_cast<const Fleet*>(obj)) { boost::shared_ptr<GG::Texture> head_icon = FleetHeadIcon(fleet, FleetButton::FLEET_BUTTON_LARGE); - retval.push_back(head_icon); + if (head_icon) + retval.push_back(head_icon); boost::shared_ptr<GG::Texture> size_icon = FleetSizeIcon(fleet, FleetButton::FLEET_BUTTON_LARGE); - retval.push_back(size_icon); + if (size_icon) + retval.push_back(size_icon); } else if (const System* system = universe_object_cast<const System*>(obj)) { StarType star_type = system->GetStarType(); ClientUI* ui = ClientUI::GetClientUI(); boost::shared_ptr<GG::Texture> disc_texture = ui->GetModuloTexture( ClientUI::ArtDir() / "stars", ClientUI::StarTypeFilePrefixes()[star_type], system->ID()); - retval.push_back(disc_texture); + if (disc_texture) + retval.push_back(disc_texture); boost::shared_ptr<GG::Texture> halo_texture = ui->GetModuloTexture( ClientUI::ArtDir() / "stars", ClientUI::HaloStarTypeFilePrefixes()[star_type], system->ID()); - retval.push_back(halo_texture); + if (halo_texture) + retval.push_back(halo_texture); } else if (const Planet* planet = universe_object_cast<const Planet*>(obj)) { // don't have any icons for each planet type, so use generic / default object icon } else if (const Building* building = universe_object_cast<const Building*>(obj)) { - boost::shared_ptr<GG::Texture> texture = ClientUI::BuildingIcon(building->BuildingTypeName()); - retval.push_back(texture); + retval.push_back(ClientUI::BuildingIcon(building->BuildingTypeName())); } if (retval.empty()) retval.push_back(ClientUI::GetTexture(ClientUI::ArtDir() / "icons" / "generic_object.png", true)); |
From: <geo...@us...> - 2012-08-27 02:07:30
|
Revision: 5175 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5175&view=rev Author: geoffthemedio Date: 2012-08-27 02:07:24 +0000 (Mon, 27 Aug 2012) Log Message: ----------- Filters dialog internals / layout. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-27 02:06:32 UTC (rev 5174) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-27 02:07:24 UTC (rev 5175) @@ -23,6 +23,23 @@ namespace { enum VIS_DISPLAY { SHOW_VISIBLE, SHOW_PREVIOUSLY_VISIBLE, SHOW_DESTROYED }; + const std::string EMPTY_STRING; + const std::string ALL_CONDITION("CONDITION_ALL"); + const std::string HOMEWORLD_CONDITION("CONDITION_HOMEWORLD"); + const std::string CAPITAL_CONDITION("CONDITION_CAPITAL"); + const std::string MONSTER_CONDITION("CONDITION_MONSTER"); + const std::string ARMED_CONDITION("CONDITION_ARMED"); + const std::string STATIONARY_CONDITION("CONDITION_STATIONARY"); + const std::string BUILDING_CONDITION("CONDITION_BUILDING"); + const std::string HASSPECIAL_CONDITION("CONDITION_HASSPECIAL"); + const std::string HASTAG_CONDITION("CONDITION_HASTAG"); + const std::string PRODUCEDBYEMPIRE_CONDITION("CONDITION_PRODUCEDBYEMPIRE"); + const std::string EXPLOREDBYEMPIRE_CONDITION("CONDITION_EXPLOREDBYEMPIRE"); + const std::string CONTAINEDBY_CONDITION("CONDITION_CONTAINEDBY"); + const std::string INSYSTEM_CONDITION("CONDITION_INSYSTEM"); + const std::string OBJECTID_CONDITION("CONDITION_OBJECTID"); + const std::string CREATEDONTURN_CONDITION("CONDITION_CREATEDONTURN"); + ValueRef::ValueRefBase<std::string>* CopyStringValueRef(const ValueRef::ValueRefBase<std::string>* const value_ref) { if (const ValueRef::Constant<std::string>* constant = dynamic_cast<const ValueRef::Constant<std::string>*>(value_ref)) @@ -56,31 +73,21 @@ return new Condition::All(); } - const std::string EMPTY_STRING; - - const std::string ALL_CONDITION("CONDITION_ALL"); - const std::string HOMEWORLD_CONDITION("CONDITION_HOMEWORLD"); - const std::string CAPITAL_CONDITION("CONDITION_CAPITAL"); - const std::string MONSTER_CONDITION("CONDITION_MONSTER"); - const std::string ARMED_CONDITION("CONDITION_ARMED"); - const std::string STATIONARY_CONDITION("CONDITION_STATIONARY"); - //const std::string CAPITAL_CONDITION("Capital"); - //const std::string CAPITAL_CONDITION("Capital"); - //const std::string CAPITAL_CONDITION("Capital"); - //const std::string CAPITAL_CONDITION("Capital"); - //const std::string CAPITAL_CONDITION("Capital"); - //const std::string CAPITAL_CONDITION("Capital"); - - //struct Homeworld; - //struct Building; - //struct HasSpecial; - //struct HasTag; - //struct ProducedByEmpire; - //struct ExploredByEmpire; - //struct ContainedBy; - //struct InSystem; - //struct ObjectID; - //struct CreatedOnTurn; + const std::string& ConditionClassName(const Condition::ConditionBase* const condition) { + if (dynamic_cast<const Condition::All* const>(condition)) + return ALL_CONDITION; + else if (dynamic_cast<const Condition::Homeworld* const>(condition)) + return HOMEWORLD_CONDITION; + else if (dynamic_cast<const Condition::Capital* const>(condition)) + return CAPITAL_CONDITION; + else if (dynamic_cast<const Condition::Monster* const>(condition)) + return MONSTER_CONDITION; + else if (dynamic_cast<const Condition::Armed* const>(condition)) + return ARMED_CONDITION; + else if (dynamic_cast<const Condition::Stationary* const>(condition)) + return STATIONARY_CONDITION; + else return EMPTY_STRING; + } } @@ -130,49 +137,60 @@ return ""; } - virtual void Render() { - GG::Pt ul = UpperLeft(), lr = LowerRight(); - GG::FlatRectangle(ul, lr, ClientUI::CtrlColor(), ClientUI::CtrlBorderColor()); + virtual void Render() { + GG::Pt ul = UpperLeft(), lr = LowerRight(); + GG::FlatRectangle(ul, lr, ClientUI::CtrlColor(), ClientUI::CtrlBorderColor()); } private: class ConditionRow : public GG::ListBox::Row { public: - ConditionRow(GG::X w, GG::Y h, const std::string& key) : - GG::ListBox::Row(w, h, "ConditionRow"), + ConditionRow(const std::string& key, GG::Y row_height) : + GG::ListBox::Row(GG::X1, row_height, "ConditionRow"), m_condition_key(key) { SetChildClippingMode(ClipToClient); - push_back(new GG::TextControl(GG::X0, GG::Y0, ClientWidth(), ClientHeight(), - UserString(m_condition_key), ClientUI::GetFont(), + push_back(new GG::TextControl(GG::X0, GG::Y0, UserString(m_condition_key), ClientUI::GetFont(), ClientUI::TextColor(), GG::FORMAT_LEFT | GG::FORMAT_VCENTER)); } - const std::string& GetKey() const - { return m_condition_key; } + const std::string& GetKey() const { return m_condition_key; } + private: std::string m_condition_key; }; void Init(const Condition::ConditionBase* init_condition) { // fill droplist with basic types of conditions and select appropriate row - const GG::Y DROPLIST_HEIGHT = GG::Y(ClientUI::Pts() + 4); - const GG::Y DROPLIST_DROP_HEIGHT = DROPLIST_HEIGHT * 10; + const GG::Y DROPLIST_HEIGHT(ClientUI::Pts() + 4); + const GG::Y DROPLIST_DROP_HEIGHT = DROPLIST_HEIGHT * 10; m_class_drop = new CUIDropDownList(GG::X0, GG::Y0, GG::X(ClientUI::Pts()*10), DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); m_class_drop->SetStyle(GG::LIST_NOSORT); AttachChild(m_class_drop); - m_class_drop->Insert(new ConditionRow(ClientWidth(), ClientHeight(), ALL_CONDITION)); - m_class_drop->Insert(new ConditionRow(ClientWidth(), ClientHeight(), HOMEWORLD_CONDITION)); - m_class_drop->Insert(new ConditionRow(ClientWidth(), ClientHeight(), CAPITAL_CONDITION)); - m_class_drop->Insert(new ConditionRow(ClientWidth(), ClientHeight(), MONSTER_CONDITION)); - m_class_drop->Insert(new ConditionRow(ClientWidth(), ClientHeight(), ARMED_CONDITION)); - m_class_drop->Insert(new ConditionRow(ClientWidth(), ClientHeight(), STATIONARY_CONDITION)); + std::vector<std::string> row_keys; + row_keys.push_back(ALL_CONDITION); row_keys.push_back(HOMEWORLD_CONDITION); + row_keys.push_back(CAPITAL_CONDITION); row_keys.push_back(MONSTER_CONDITION); + row_keys.push_back(ARMED_CONDITION); row_keys.push_back(STATIONARY_CONDITION); SetMinSize(m_class_drop->Size()); + GG::ListBox::iterator select_row_it = m_class_drop->end(); + const std::string& init_condition_key = ConditionClassName(init_condition); - delete init_condition; + for (std::vector<std::string>::const_iterator key_it = row_keys.begin(); + key_it != row_keys.end(); ++key_it) + { + const std::string& key = *key_it; + GG::ListBox::iterator row_it = m_class_drop->Insert(new ConditionRow(key, GG::Y(ClientUI::Pts()))); + if (init_condition_key == key) + select_row_it = row_it; + } + + if (select_row_it != m_class_drop->end()) + m_class_drop->Select(select_row_it); + else if (!m_class_drop->Empty()) + m_class_drop->Select(0); } void DoLayout() { |
From: <geo...@us...> - 2012-08-27 22:57:43
|
Revision: 5179 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5179&view=rev Author: geoffthemedio Date: 2012-08-27 22:57:37 +0000 (Mon, 27 Aug 2012) Log Message: ----------- Removed some broken code that inexplicably didn't cause a compile error in MSVC, but which did on OSX and Linux. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-27 22:56:39 UTC (rev 5178) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-27 22:57:37 UTC (rev 5179) @@ -153,14 +153,6 @@ return new Condition::All(); } - template <typename enumT> - enumT GetEnumValue() { - if (m_enum_drop) { - return m_enum_drop-> - } - return 0; - } - const std::string& GetString() { if (m_param_edit) return m_param_edit->Text(); @@ -211,13 +203,13 @@ m_value(value) { SetChildClippingMode(ClipToClient); - const std::string& label = UserString(GG::GetEnumMap<enumT>().FromEnum(m_value)); + const std::string& label = UserString(GG::GetEnumMap<typename enumT>().FromEnum(m_value)); push_back(new GG::TextControl(GG::X0, GG::Y0, UserString(label), ClientUI::GetFont(), ClientUI::TextColor(), GG::FORMAT_LEFT | GG::FORMAT_VCENTER)); } - enumT GetValue() const { return m_value; } + typename enumT GetValue() const { return m_value; } private: - enumT m_value; + typename enumT m_value; }; void Init(const Condition::ConditionBase* init_condition) { |
From: <geo...@us...> - 2012-08-28 05:56:48
|
Revision: 5181 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5181&view=rev Author: geoffthemedio Date: 2012-08-28 05:56:42 +0000 (Tue, 28 Aug 2012) Log Message: ----------- Removed some unnecessary / compile-error-causing "typename". Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-28 05:55:57 UTC (rev 5180) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-28 05:56:42 UTC (rev 5181) @@ -203,13 +203,13 @@ m_value(value) { SetChildClippingMode(ClipToClient); - const std::string& label = UserString(GG::GetEnumMap<typename enumT>().FromEnum(m_value)); + const std::string& label = UserString(GG::GetEnumMap<enumT>().FromEnum(m_value)); push_back(new GG::TextControl(GG::X0, GG::Y0, UserString(label), ClientUI::GetFont(), ClientUI::TextColor(), GG::FORMAT_LEFT | GG::FORMAT_VCENTER)); } - typename enumT GetValue() const { return m_value; } + enumT GetValue() const { return m_value; } private: - typename enumT m_value; + enumT m_value; }; void Init(const Condition::ConditionBase* init_condition) { |
From: <geo...@us...> - 2012-08-29 05:07:01
|
Revision: 5182 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5182&view=rev Author: geoffthemedio Date: 2012-08-29 05:06:55 +0000 (Wed, 29 Aug 2012) Log Message: ----------- Object list filter dialog species and special drop lists. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-28 05:56:42 UTC (rev 5181) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-29 05:06:55 UTC (rev 5182) @@ -14,12 +14,15 @@ #include "../universe/Ship.h" #include "../universe/Planet.h" #include "../universe/Building.h" +#include "../universe/Species.h" #include "../universe/Condition.h" #include "../universe/ValueRef.h" #include <GG/DrawUtil.h> #include <GG/Layout.h> +std::vector<std::string> SpecialNames(); + namespace { enum VIS_DISPLAY { SHOW_VISIBLE, SHOW_PREVIOUSLY_VISIBLE, SHOW_DESTROYED }; @@ -110,7 +113,7 @@ GG::Control(x, y, GG::X(380), GG::Y1, GG::INTERACTIVE), m_class_drop(0), m_enum_drop(0), - m_param_edit(0), + m_string_drop(0), m_param_spin(0) { Condition::ConditionBase* init_condition = 0; @@ -126,7 +129,7 @@ ~ConditionWidget() { delete m_class_drop; delete m_enum_drop; - delete m_param_edit; + delete m_string_drop; delete m_param_spin; } @@ -143,35 +146,19 @@ return new Condition::All(); } else if (condition_key == HOMEWORLD_CONDITION) { - if (!m_param_edit || m_param_edit->Empty()) { + const std::string& species_name = GetString(); + if (species_name.empty()) return new Condition::Homeworld(); - } std::vector<const ValueRef::ValueRefBase<std::string>*> names; - names.push_back(new ValueRef::Constant<std::string>(m_param_edit->Text())); + names.push_back(new ValueRef::Constant<std::string>(species_name)); return new Condition::Homeworld(names); - } - return new Condition::All(); - } - const std::string& GetString() { - if (m_param_edit) - return m_param_edit->Text(); - else - return EMPTY_STRING; - } + } else if (condition_key == HASSPECIAL_CONDITION) { + return new Condition::HasSpecial(GetString()); - ValueRef::ValueRefBase<int>* GetIntValueRef() { - if (m_param_spin) - return new ValueRef::Constant<int>(m_param_spin->Value()); - else - return new ValueRef::Constant<int>(0); - } + } - int GetInt() { - if (m_param_spin) - return m_param_spin->Value(); - else - return 0; + return new Condition::All(); } virtual void Render() { @@ -212,6 +199,44 @@ enumT m_value; }; + class StringRow : public GG::ListBox::Row { + public: + StringRow(const std::string& text, GG::Y row_height) : + GG::ListBox::Row(GG::X1, row_height, "StringRow"), + m_string(text) + { + SetChildClippingMode(ClipToClient); + const std::string& label = text.empty() ? EMPTY_STRING : UserString(text); + push_back(new GG::TextControl(GG::X0, GG::Y0, label, ClientUI::GetFont(), + ClientUI::TextColor(), GG::FORMAT_LEFT | GG::FORMAT_VCENTER)); + } + const std::string& Text() const { return m_string; } + private: + std::string m_string; + }; + + const std::string& GetString() { + if (!m_string_drop) + return EMPTY_STRING; + GG::ListBox::iterator row_it = m_string_drop->CurrentItem(); + if (row_it == m_string_drop->end()) + return EMPTY_STRING; + StringRow* string_row = dynamic_cast<StringRow*>(*row_it); + if (!string_row) + return EMPTY_STRING; + return string_row->Text(); + } + + ValueRef::ValueRefBase<int>* GetIntValueRef() + { return new ValueRef::Constant<int>(GetInt()); } + + int GetInt() { + if (m_param_spin) + return m_param_spin->Value(); + else + return 0; + } + void Init(const Condition::ConditionBase* init_condition) { // fill droplist with basic types of conditions and select appropriate row const GG::Y DROPLIST_HEIGHT(ClientUI::Pts() + 4); @@ -262,9 +287,12 @@ return; // remove old parameter controls delete m_enum_drop; m_enum_drop = 0; - delete m_param_edit; m_param_edit = 0; + delete m_string_drop; m_string_drop = 0; delete m_param_spin; m_param_spin = 0; + const GG::Y DROPLIST_HEIGHT(ClientUI::Pts() + 4); + const GG::Y DROPLIST_DROP_HEIGHT = DROPLIST_HEIGHT * 10; + // determine which condition is selected GG::ListBox::iterator row_it = m_class_drop->CurrentItem(); if (row_it == m_class_drop->end()) @@ -284,10 +312,38 @@ condition_key == MONSTER_CONDITION) { // no params - } else if (condition_key == HOMEWORLD_CONDITION || condition_key == HASSPECIAL_CONDITION) { - // just an edit to specify a string name - m_param_edit = new CUIEdit(param_widget_left, param_widget_top, GG::X(ClientUI::Pts()*6), "", ClientUI::GetFont()); - AttachChild(m_param_edit); + } else if (condition_key == HOMEWORLD_CONDITION) { + // droplist of valid species + m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, GG::X(ClientUI::Pts()*12), + DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + AttachChild(m_string_drop); + + // add empty row, allowing for matching any species' homeworld + GG::ListBox::iterator row_it = m_string_drop->Insert(new StringRow("", GG::Y(ClientUI::Pts()))); + m_string_drop->Select(row_it); + + const SpeciesManager& sm = GetSpeciesManager(); + for (SpeciesManager::iterator sp_it = sm.begin(); sp_it != sm.end(); ++sp_it) { + const std::string species_name = sp_it->first; + row_it = m_string_drop->Insert(new StringRow(species_name, GG::Y(ClientUI::Pts()))); + } + + } else if (condition_key == HASSPECIAL_CONDITION) { + // droplist of valid specials + m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, GG::X(ClientUI::Pts()*12), + DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + AttachChild(m_string_drop); + + // add empty row, allowing for matching any special + GG::ListBox::iterator row_it = m_string_drop->Insert(new StringRow("", GG::Y(ClientUI::Pts()))); + m_string_drop->Select(row_it); + + std::vector<std::string> special_names = SpecialNames(); + for (std::vector<std::string>::iterator sp_it = special_names.begin(); sp_it != special_names.end(); ++sp_it) { + const std::string special_name = *sp_it; + row_it = m_string_drop->Insert(new StringRow(special_name, GG::Y(ClientUI::Pts()))); + } + } Resize(GG::Pt(Width(), GG::Y(40))); @@ -295,7 +351,7 @@ CUIDropDownList* m_class_drop; CUIDropDownList* m_enum_drop; - CUIEdit* m_param_edit; // TODO: replace with droplist of valid options, so as to avoid needing to do reverse stringtable lookups + CUIDropDownList* m_string_drop; CUISpin<int>* m_param_spin; }; |
From: <geo...@us...> - 2012-08-29 06:46:40
|
Revision: 5184 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5184&view=rev Author: geoffthemedio Date: 2012-08-29 06:46:34 +0000 (Wed, 29 Aug 2012) Log Message: ----------- Hooked up application of filter dialog conditions to filtering contents of objects list. Seemingly functions, but very broken because if a containing object (eg. a system) isn't shown, then none of its contents will be shown. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-29 05:20:37 UTC (rev 5183) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-29 06:46:34 UTC (rev 5184) @@ -156,6 +156,8 @@ } else if (condition_key == HASSPECIAL_CONDITION) { return new Condition::HasSpecial(GetString()); + } else if (condition_key == HASTAG_CONDITION) { + return new Condition::HasTag(GetString()); } return new Condition::All(); @@ -396,13 +398,6 @@ Init(condition_filter); } - ~FilterDialog() { - for (std::vector<Condition::ConditionBase*>::iterator it = m_conditions.begin(); - it != m_conditions.end(); ++it) - { delete *it; } - m_conditions.clear(); - } - bool ChangesAccepted() { return m_accept_changes; } @@ -411,21 +406,7 @@ // caller takes ownership of returned ConditionBase* Condition::ConditionBase* GetConditionFilter() { - if (m_conditions.empty()) { - return new Condition::All(); - } else if (m_conditions.size() == 1) { - Condition::ConditionBase* retval = *(m_conditions.begin()); - m_conditions.clear(); - return retval; - } else { - std::vector<const Condition::ConditionBase*> params; - for (std::vector<Condition::ConditionBase*>::const_iterator it = m_conditions.begin(); - it != m_conditions.end(); ++it) - { params.push_back(*it); } - Condition::ConditionBase* retval = new Condition::And(params); - m_conditions.clear(); - return retval; - } + return m_condition_widget->GetCondition(); } private: @@ -477,25 +458,8 @@ GG::Connect(button->CheckedSignal, &FilterDialog::UpdateVisfiltersFromStateButtons, this); } - if (!condition_filter) { - m_conditions.clear(); - } else if (const Condition::And* const and_condition = dynamic_cast<const Condition::And* const>(condition_filter)) { - const std::vector<const Condition::ConditionBase*>& operands = and_condition->Operands(); - for (std::vector<const Condition::ConditionBase*>::const_iterator it = operands.begin(); - it != operands.end(); ++it) - { - Condition::ConditionBase* copied_condition = CopyCondition(*it); - if (copied_condition) - m_conditions.push_back(copied_condition); - } - - } else { - Condition::ConditionBase* copied_condition = CopyCondition(condition_filter); - if (copied_condition) - m_conditions.push_back(copied_condition); - } - + // TODO: Add multiple condition widgets initialized for input condition m_condition_widget = new ConditionWidget(GG::X(3), m_filters_layout->Height() + GG::Y(3)); AttachChild(m_condition_widget); @@ -554,12 +518,9 @@ } std::map<UniverseObjectType, std::set<VIS_DISPLAY> > m_vis_filters; - std::vector<Condition::ConditionBase*> m_conditions; + bool m_accept_changes; - bool m_accept_changes; - ConditionWidget* m_condition_widget; - GG::Layout* m_filters_layout; GG::Button* m_cancel_button; GG::Button* m_apply_button; @@ -926,6 +887,13 @@ return false; int client_empire_id = HumanClientApp::GetApp()->EmpireID(); + const UniverseObject* obj = GetUniverseObject(object_id); + if (!obj) + return false; + + if (!m_filter_condition->Eval(obj)) + return false; + if (GetUniverse().EmpireKnownDestroyedObjectIDs(client_empire_id).find(object_id) != GetUniverse().EmpireKnownDestroyedObjectIDs(client_empire_id).end()) return m_visibilities[type].find(SHOW_DESTROYED) != m_visibilities[type].end(); |
From: <geo...@us...> - 2012-08-30 08:01:43
|
Revision: 5186 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5186&view=rev Author: geoffthemedio Date: 2012-08-30 08:01:33 +0000 (Thu, 30 Aug 2012) Log Message: ----------- Filters appear to be functional, and objects can now be listed even if their container is hidden by a filter. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-29 09:04:42 UTC (rev 5185) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-08-30 08:01:33 UTC (rev 5186) @@ -986,7 +986,6 @@ std::map<int, std::set<int> >::const_iterator sp_it = system_planets.find(system_id); std::map<int, std::set<int> >::const_iterator sf_it = system_fleets.find(system_id); - bool has_contents_system_row = sp_it != system_planets.end() || sf_it != system_fleets.end(); std::set<int> system_contents; if (sp_it != system_planets.end()) system_contents = sp_it->second; @@ -994,11 +993,8 @@ system_contents.insert(sf_it->second.begin(), sf_it->second.end()); AddObjectRow(system_id, INVALID_OBJECT_ID, system_contents, indent); + ++indent; - if (!has_contents_system_row || ObjectCollapsed(system_id)) - continue; - - ++indent; // add planet rows in this system if (sp_it != system_planets.end()) { const std::set<int>& planets = sp_it->second; @@ -1006,25 +1002,29 @@ int planet_id = *planet_it; std::map<int, std::set<int> >::const_iterator pb_it = planet_buildings.find(planet_id); - bool has_contents_planet_row = pb_it != planet_buildings.end(); - AddObjectRow(planet_id, system_id, - pb_it != planet_buildings.end() ? pb_it->second : std::set<int>(), - indent); + if (!ObjectCollapsed(system_id)) { + AddObjectRow(planet_id, system_id, + pb_it != planet_buildings.end() ? pb_it->second : std::set<int>(), + indent); + ++indent; + } - if (!has_contents_planet_row || ObjectCollapsed(planet_id)) - continue; - - ++indent; // add building rows on this planet if (pb_it != planet_buildings.end()) { - const std::set<int>& buildings = pb_it->second; - for (std::set<int>::const_iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { - AddObjectRow(*building_it, planet_id, std::set<int>(), indent); + if (!ObjectCollapsed(planet_id) && !ObjectCollapsed(system_id)) { + const std::set<int>& buildings = pb_it->second; + for (std::set<int>::const_iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { + AddObjectRow(*building_it, planet_id, std::set<int>(), indent); + } } + planet_buildings.erase(pb_it); } - indent--; + + if (!ObjectCollapsed(system_id)) + indent--; } + system_planets.erase(sp_it); } // add fleet rows in this system @@ -1034,59 +1034,119 @@ int fleet_id = *fleet_it; std::map<int, std::set<int> >::const_iterator fs_it = fleet_ships.find(fleet_id); - bool has_contents_fleet_row = fs_it != fleet_ships.end(); - AddObjectRow(fleet_id, system_id, - fs_it != fleet_ships.end() ? fs_it->second : std::set<int>(), - indent); + if (!ObjectCollapsed(system_id)) { + AddObjectRow(fleet_id, system_id, + fs_it != fleet_ships.end() ? fs_it->second : std::set<int>(), + indent); + ++indent; + } - if (!has_contents_fleet_row || ObjectCollapsed(fleet_id)) - continue; - - ++indent; - // add ship rows on this fleet + // add ship rows in this fleet if (fs_it != fleet_ships.end()) { - const std::set<int>& ships = fs_it->second; - for (std::set<int>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { - AddObjectRow(*ship_it, fleet_id, std::set<int>(), indent); + if (!ObjectCollapsed(fleet_id) && !ObjectCollapsed(system_id)) { + const std::set<int>& ships = fs_it->second; + for (std::set<int>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { + AddObjectRow(*ship_it, fleet_id, std::set<int>(), indent); + } } + fleet_ships.erase(fs_it); } - indent--; + + if (!ObjectCollapsed(system_id)) + indent--; } + system_fleets.erase(sf_it); } + indent--; } - // add fleets outside systems... - std::map<int, std::set<int> >::const_iterator sf_it = system_fleets.find(INVALID_OBJECT_ID); - if (sf_it != system_fleets.end()) { + // add planets not in shown systems + for (std::map<int, std::set<int> >::iterator sp_it = system_planets.begin(); + sp_it != system_planets.end(); ++sp_it) + { + const std::set<int>& planets = sp_it->second; + for (std::set<int>::const_iterator planet_it = planets.begin(); planet_it != planets.end(); ++planet_it) { + int planet_id = *planet_it; + + std::map<int, std::set<int> >::const_iterator pb_it = planet_buildings.find(planet_id); + + AddObjectRow(planet_id, INVALID_OBJECT_ID, + pb_it != planet_buildings.end() ? pb_it->second : std::set<int>(), + indent); + ++indent; + + // add building rows on this planet + if (pb_it != planet_buildings.end()) { + if (!ObjectCollapsed(planet_id)) { + const std::set<int>& buildings = pb_it->second; + for (std::set<int>::const_iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { + AddObjectRow(*building_it, planet_id, std::set<int>(), indent); + } + } + planet_buildings.erase(pb_it); + } + + --indent; + } + } + system_planets.clear(); + + // add buildings not in a shown planet + for (std::map<int, std::set<int> >::iterator pb_it = planet_buildings.begin(); + pb_it != planet_buildings.end(); ++pb_it) + { + const std::set<int>& buildings = pb_it->second; + for (std::set<int>::const_iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { + AddObjectRow(*building_it, INVALID_OBJECT_ID, std::set<int>(), indent); + } + } + planet_buildings.clear(); + + // add fleets not in shown systems + for (std::map<int, std::set<int> >::iterator sf_it = system_fleets.begin(); + sf_it != system_fleets.end(); ++sf_it) + { const std::set<int>& fleets = sf_it->second; for (std::set<int>::const_iterator fleet_it = fleets.begin(); fleet_it != fleets.end(); ++fleet_it) { int fleet_id = *fleet_it; std::map<int, std::set<int> >::const_iterator fs_it = fleet_ships.find(fleet_id); - bool has_contents_fleet_row = fs_it != fleet_ships.end(); AddObjectRow(fleet_id, INVALID_OBJECT_ID, fs_it != fleet_ships.end() ? fs_it->second : std::set<int>(), indent); + ++indent; - if (!has_contents_fleet_row || ObjectCollapsed(fleet_id)) - continue; - - ++indent; // add ship rows on this fleet if (fs_it != fleet_ships.end()) { - const std::set<int>& ships = fs_it->second; - for (std::set<int>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { - AddObjectRow(*ship_it, fleet_id, std::set<int>(), indent); + if (!ObjectCollapsed(fleet_id)) { + const std::set<int>& ships = fs_it->second; + for (std::set<int>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { + AddObjectRow(*ship_it, fleet_id, std::set<int>(), indent); + } } + fleet_ships.erase(fs_it); } indent--; } } + system_fleets.clear(); + + // add any remaining ships not in shown fleets + for (std::map<int, std::set<int> >::iterator fs_it = fleet_ships.begin(); + fs_it != fleet_ships.end(); ++fs_it) + { + const std::set<int>& ships = fs_it->second; + for (std::set<int>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { + AddObjectRow(*ship_it, INVALID_OBJECT_ID, std::set<int>(), indent); + } + } + fleet_ships.clear(); } + if (!this->Empty()) this->BringRowIntoView(--this->end()); if (first_visible_queue_row < this->NumRows()) |
From: <geo...@us...> - 2012-09-02 19:09:51
|
Revision: 5197 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5197&view=rev Author: geoffthemedio Date: 2012-09-02 19:09:44 +0000 (Sun, 02 Sep 2012) Log Message: ----------- Changed some const_iterator to interator to fix gcc compile error. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-09-02 12:50:50 UTC (rev 5196) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-09-02 19:09:44 UTC (rev 5197) @@ -1011,8 +1011,8 @@ for (std::set<int>::const_iterator sys_it = systems.begin(); sys_it != systems.end(); ++sys_it) { int system_id = *sys_it; - std::map<int, std::set<int> >::const_iterator sp_it = system_planets.find(system_id); - std::map<int, std::set<int> >::const_iterator sf_it = system_fleets.find(system_id); + std::map<int, std::set<int> >::iterator sp_it = system_planets.find(system_id); + std::map<int, std::set<int> >::iterator sf_it = system_fleets.find(system_id); std::set<int> system_contents; if (sp_it != system_planets.end()) system_contents = sp_it->second; @@ -1028,7 +1028,7 @@ for (std::set<int>::const_iterator planet_it = planets.begin(); planet_it != planets.end(); ++planet_it) { int planet_id = *planet_it; - std::map<int, std::set<int> >::const_iterator pb_it = planet_buildings.find(planet_id); + std::map<int, std::set<int> >::iterator pb_it = planet_buildings.find(planet_id); if (!ObjectCollapsed(system_id)) { AddObjectRow(planet_id, system_id, @@ -1041,7 +1041,7 @@ if (pb_it != planet_buildings.end()) { if (!ObjectCollapsed(planet_id) && !ObjectCollapsed(system_id)) { const std::set<int>& buildings = pb_it->second; - for (std::set<int>::const_iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { + for (std::set<int>::iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { AddObjectRow(*building_it, planet_id, std::set<int>(), indent); } } @@ -1094,10 +1094,10 @@ sp_it != system_planets.end(); ++sp_it) { const std::set<int>& planets = sp_it->second; - for (std::set<int>::const_iterator planet_it = planets.begin(); planet_it != planets.end(); ++planet_it) { + for (std::set<int>::iterator planet_it = planets.begin(); planet_it != planets.end(); ++planet_it) { int planet_id = *planet_it; - std::map<int, std::set<int> >::const_iterator pb_it = planet_buildings.find(planet_id); + std::map<int, std::set<int> >::iterator pb_it = planet_buildings.find(planet_id); AddObjectRow(planet_id, INVALID_OBJECT_ID, pb_it != planet_buildings.end() ? pb_it->second : std::set<int>(), @@ -1108,7 +1108,7 @@ if (pb_it != planet_buildings.end()) { if (!ObjectCollapsed(planet_id)) { const std::set<int>& buildings = pb_it->second; - for (std::set<int>::const_iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { + for (std::set<int>::iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { AddObjectRow(*building_it, planet_id, std::set<int>(), indent); } } @@ -1136,10 +1136,10 @@ sf_it != system_fleets.end(); ++sf_it) { const std::set<int>& fleets = sf_it->second; - for (std::set<int>::const_iterator fleet_it = fleets.begin(); fleet_it != fleets.end(); ++fleet_it) { + for (std::set<int>::iterator fleet_it = fleets.begin(); fleet_it != fleets.end(); ++fleet_it) { int fleet_id = *fleet_it; - std::map<int, std::set<int> >::const_iterator fs_it = fleet_ships.find(fleet_id); + std::map<int, std::set<int> >::iterator fs_it = fleet_ships.find(fleet_id); AddObjectRow(fleet_id, INVALID_OBJECT_ID, fs_it != fleet_ships.end() ? fs_it->second : std::set<int>(), @@ -1150,7 +1150,7 @@ if (fs_it != fleet_ships.end()) { if (!ObjectCollapsed(fleet_id)) { const std::set<int>& ships = fs_it->second; - for (std::set<int>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { + for (std::set<int>::iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { AddObjectRow(*ship_it, fleet_id, std::set<int>(), indent); } } @@ -1166,7 +1166,7 @@ fs_it != fleet_ships.end(); ++fs_it) { const std::set<int>& ships = fs_it->second; - for (std::set<int>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { + for (std::set<int>::iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { AddObjectRow(*ship_it, INVALID_OBJECT_ID, std::set<int>(), indent); } } |
From: <geo...@us...> - 2012-09-02 20:34:18
|
Revision: 5199 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5199&view=rev Author: geoffthemedio Date: 2012-09-02 20:34:12 +0000 (Sun, 02 Sep 2012) Log Message: ----------- Another const_iterator to iterator change. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-09-02 19:29:44 UTC (rev 5198) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-09-02 20:34:12 UTC (rev 5199) @@ -1060,7 +1060,7 @@ for (std::set<int>::const_iterator fleet_it = fleets.begin(); fleet_it != fleets.end(); ++fleet_it) { int fleet_id = *fleet_it; - std::map<int, std::set<int> >::const_iterator fs_it = fleet_ships.find(fleet_id); + std::map<int, std::set<int> >::iterator fs_it = fleet_ships.find(fleet_id); if (!ObjectCollapsed(system_id)) { AddObjectRow(fleet_id, system_id, |
From: <geo...@us...> - 2012-12-21 22:12:57
|
Revision: 5566 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5566&view=rev Author: geoffthemedio Date: 2012-12-21 22:12:45 +0000 (Fri, 21 Dec 2012) Log Message: ----------- -Enabled / set up expand / collapse all button on objects list window. -Added CanProduceShips, CanColonize, PlanetSize, and PlanetType conditions to Filters dialog. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-12-21 22:10:08 UTC (rev 5565) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-12-21 22:12:45 UTC (rev 5566) @@ -34,6 +34,8 @@ const std::string MONSTER_CONDITION("CONDITION_MONSTER"); const std::string ARMED_CONDITION("CONDITION_ARMED"); const std::string STATIONARY_CONDITION("CONDITION_STATIONARY"); + const std::string CANPRODUCESHIPS_CONDITION("CONDITION_CANPRODUCESHIPS"); + const std::string CANCOLONIZE_CONDITION("CONDITION_CANCOLONIZE"); const std::string BUILDING_CONDITION("CONDITION_BUILDING"); const std::string HASSPECIAL_CONDITION("CONDITION_HASSPECIAL"); const std::string HASTAG_CONDITION("CONDITION_HASTAG"); @@ -44,6 +46,8 @@ const std::string INSYSTEM_CONDITION("CONDITION_INSYSTEM"); const std::string OBJECTID_CONDITION("CONDITION_OBJECTID"); const std::string CREATEDONTURN_CONDITION("CONDITION_CREATEDONTURN"); + const std::string PLANETSIZE_CONDITION("CONDITION_PLANETSIZE"); + const std::string PLANETTYPE_CONDITION("CONDITION_PLANETTYPE"); ValueRef::ValueRefBase<std::string>* CopyStringValueRef(const ValueRef::ValueRefBase<std::string>* const value_ref) { if (const ValueRef::Constant<std::string>* constant = @@ -99,8 +103,34 @@ return ARMED_CONDITION; else if (dynamic_cast<const Condition::Stationary* const>(condition)) return STATIONARY_CONDITION; + else if (dynamic_cast<const Condition::CanProduceShips* const>(condition)) + return CANPRODUCESHIPS_CONDITION; + else if (dynamic_cast<const Condition::CanColonize* const>(condition)) + return CANCOLONIZE_CONDITION; + else if (dynamic_cast<const Condition::Building* const>(condition)) + return BUILDING_CONDITION; else if (dynamic_cast<const Condition::HasSpecial* const>(condition)) return HASSPECIAL_CONDITION; + else if (dynamic_cast<const Condition::HasTag* const>(condition)) + return HASTAG_CONDITION; + else if (dynamic_cast<const Condition::Species* const>(condition)) + return SPECIES_CONDITION; + else if (dynamic_cast<const Condition::ProducedByEmpire* const>(condition)) + return PRODUCEDBYEMPIRE_CONDITION; + else if (dynamic_cast<const Condition::ExploredByEmpire* const>(condition)) + return EXPLOREDBYEMPIRE_CONDITION; + else if (dynamic_cast<const Condition::ContainedBy* const>(condition)) + return CONTAINEDBY_CONDITION; + else if (dynamic_cast<const Condition::InSystem* const>(condition)) + return INSYSTEM_CONDITION; + else if (dynamic_cast<const Condition::ObjectID* const>(condition)) + return OBJECTID_CONDITION; + else if (dynamic_cast<const Condition::CreatedOnTurn* const>(condition)) + return CREATEDONTURN_CONDITION; + else if (dynamic_cast<const Condition::PlanetSize* const>(condition)) + return PLANETSIZE_CONDITION; + else if (dynamic_cast<const Condition::PlanetType* const>(condition)) + return PLANETTYPE_CONDITION; else return EMPTY_STRING; } } @@ -109,12 +139,21 @@ //////////////////////////////////////////////// // ConditionWidget //////////////////////////////////////////////// +namespace { + template <typename enumT> + std::vector<std::string> StringsFromEnums(const std::vector<enumT>& enum_vals) { + std::vector<std::string> retval; + for (std::vector<enumT>::const_iterator it = enum_vals.begin(); it != enum_vals.end(); ++it) + retval.push_back(boost::lexical_cast<std::string>(*it)); + return retval; + } +} + class ConditionWidget : public GG::Control { public: ConditionWidget(GG::X x, GG::Y y, const Condition::ConditionBase* initial_condition = 0) : GG::Control(x, y, GG::X(380), GG::Y1, GG::INTERACTIVE), m_class_drop(0), - m_enum_drop(0), m_string_drop(0), m_param_spin(0) { @@ -130,7 +169,6 @@ ~ConditionWidget() { delete m_class_drop; - delete m_enum_drop; delete m_string_drop; delete m_param_spin; } @@ -176,15 +214,18 @@ } else if (condition_key == SPECIES_CONDITION) { return new Condition::Species(GetStringValueRefVec()); + } else if (condition_key == PLANETSIZE_CONDITION) { + return new Condition::PlanetSize(GetEnumValueRefVec<::PlanetSize>()); + + } else if (condition_key == PLANETTYPE_CONDITION) { + return new Condition::PlanetType(GetEnumValueRefVec<::PlanetType>()); } return new Condition::All(); } - virtual void Render() { - GG::Pt ul = UpperLeft(), lr = LowerRight(); - GG::FlatRectangle(ul, lr, ClientUI::CtrlColor(), ClientUI::CtrlBorderColor()); - } + virtual void Render() + { GG::FlatRectangle(UpperLeft(), LowerRight(), ClientUI::CtrlColor(), ClientUI::CtrlBorderColor()); } private: class ConditionRow : public GG::ListBox::Row { @@ -202,23 +243,6 @@ std::string m_condition_key; }; - template <typename enumT> - class EnumRow : public GG::ListBox::Row { - public: - EnumRow(enumT value, GG::Y row_height) : - GG::ListBox::Row(GG::X1, row_height, "EnumRow"), - m_value(value) - { - SetChildClippingMode(ClipToClient); - const std::string& label = UserString(GG::GetEnumMap<enumT>().FromEnum(m_value)); - push_back(new GG::TextControl(GG::X0, GG::Y0, UserString(label), ClientUI::GetFont(), - ClientUI::TextColor(), GG::FORMAT_LEFT | GG::FORMAT_VCENTER)); - } - enumT GetValue() const { return m_value; } - private: - enumT m_value; - }; - class StringRow : public GG::ListBox::Row { public: StringRow(const std::string& text, GG::Y row_height) : @@ -256,32 +280,53 @@ return retval; } - int GetInt() { + int GetInt() { if (m_param_spin) return m_param_spin->Value(); else return 0; } - ValueRef::ValueRefBase<int>* GetIntValueRef() + ValueRef::ValueRefBase<int>* GetIntValueRef() { return new ValueRef::Constant<int>(GetInt()); } + template <typename T> + ValueRef::ValueRefBase<T>* GetEnumValueRef() { + const std::string& text = GetString(); + T enum_val = T(-1); + try { + enum_val = boost::lexical_cast<T>(text); + } catch (...) { + Logger().errorStream() << "ConditionWidget::GetEnumValueRef unable to convert text to enum type: " << text; + } + return new ValueRef::Constant<T>(enum_val); + } + + template <typename T> + std::vector<const ValueRef::ValueRefBase<T>*> GetEnumValueRefVec() { + std::vector<const ValueRef::ValueRefBase<T>*> retval; + retval.push_back(GetEnumValueRef<T>()); + return retval; + } + void Init(const Condition::ConditionBase* init_condition) { // fill droplist with basic types of conditions and select appropriate row const GG::Y DROPLIST_HEIGHT(ClientUI::Pts() + 4); const GG::Y DROPLIST_DROP_HEIGHT = DROPLIST_HEIGHT * 10; - m_class_drop = new CUIDropDownList(GG::X0, GG::Y0, GG::X(ClientUI::Pts()*10), + m_class_drop = new CUIDropDownList(GG::X0, GG::Y0, GG::X(ClientUI::Pts()*16), DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); m_class_drop->SetStyle(GG::LIST_NOSORT); AttachChild(m_class_drop); std::vector<std::string> row_keys; - row_keys.push_back(ALL_CONDITION); row_keys.push_back(HOMEWORLD_CONDITION); - row_keys.push_back(CAPITAL_CONDITION); row_keys.push_back(MONSTER_CONDITION); - row_keys.push_back(ARMED_CONDITION); row_keys.push_back(STATIONARY_CONDITION); - row_keys.push_back(HASSPECIAL_CONDITION); row_keys.push_back(HASTAG_CONDITION); + row_keys.push_back(ALL_CONDITION); row_keys.push_back(HOMEWORLD_CONDITION); + row_keys.push_back(CAPITAL_CONDITION); row_keys.push_back(MONSTER_CONDITION); + row_keys.push_back(ARMED_CONDITION); row_keys.push_back(STATIONARY_CONDITION); + row_keys.push_back(CANPRODUCESHIPS_CONDITION); row_keys.push_back(CANCOLONIZE_CONDITION); + row_keys.push_back(HASSPECIAL_CONDITION); row_keys.push_back(HASTAG_CONDITION); row_keys.push_back(SPECIES_CONDITION); + row_keys.push_back(PLANETSIZE_CONDITION); row_keys.push_back(PLANETTYPE_CONDITION); SetMinSize(m_class_drop->Size()); GG::ListBox::iterator select_row_it = m_class_drop->end(); @@ -316,7 +361,6 @@ if (!m_class_drop) return; // remove old parameter controls - delete m_enum_drop; m_enum_drop = 0; delete m_string_drop; m_string_drop = 0; delete m_param_spin; m_param_spin = 0; @@ -337,12 +381,18 @@ GG::Y param_widget_top = m_class_drop->UpperLeft().y - ClientUpperLeft().y + GG::Y1; // create controls for selected condition - if (condition_key == ALL_CONDITION || condition_key == CAPITAL_CONDITION || - condition_key == ARMED_CONDITION || condition_key == STATIONARY_CONDITION || + if (condition_key == ALL_CONDITION || + condition_key == CAPITAL_CONDITION || + condition_key == ARMED_CONDITION || + condition_key == STATIONARY_CONDITION || + condition_key == CANPRODUCESHIPS_CONDITION || + condition_key == CANCOLONIZE_CONDITION || condition_key == MONSTER_CONDITION) { // no params - } else if (condition_key == HOMEWORLD_CONDITION || condition_key == SPECIES_CONDITION) { + } else if (condition_key == HOMEWORLD_CONDITION || + condition_key == SPECIES_CONDITION) + { // droplist of valid species m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, GG::X(ClientUI::Pts()*12), DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); @@ -391,25 +441,74 @@ } GG::ListBox::iterator row_it = m_string_drop->end(); - for (std::set<std::string>::iterator tag_it = all_tags.begin(); tag_it != all_tags.end(); ++tag_it) { - const std::string tag = *tag_it; + for (std::set<std::string>::iterator tag_it = all_tags.begin(); + tag_it != all_tags.end(); ++tag_it) + { + const std::string& tag = *tag_it; row_it = m_string_drop->Insert(new StringRow(tag, GG::Y(ClientUI::Pts()))); } if (!m_string_drop->Empty()) m_string_drop->Select(0); + + } else if (condition_key == PLANETSIZE_CONDITION) { + // droplist of valid sizes + m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, GG::X(ClientUI::Pts()*12), + DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + AttachChild(m_string_drop); + + std::vector<::PlanetSize> planet_sizes; + planet_sizes.push_back(SZ_TINY); planet_sizes.push_back(SZ_SMALL); + planet_sizes.push_back(SZ_MEDIUM); planet_sizes.push_back(SZ_LARGE); + planet_sizes.push_back(SZ_HUGE); planet_sizes.push_back(SZ_ASTEROIDS); + planet_sizes.push_back(SZ_GASGIANT); + std::vector<std::string> size_strings = StringsFromEnums(planet_sizes); + + GG::ListBox::iterator row_it = m_string_drop->end(); + for (std::vector<std::string>::iterator string_it = size_strings.begin(); + string_it != size_strings.end(); ++string_it) + { + const std::string& text = *string_it; + row_it = m_string_drop->Insert(new StringRow(text, GG::Y(ClientUI::Pts()))); + } + if (!m_string_drop->Empty()) + m_string_drop->Select(0); + + } else if (condition_key == PLANETTYPE_CONDITION) { + // droplist of valid types + m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, GG::X(ClientUI::Pts()*12), + DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + AttachChild(m_string_drop); + + std::vector<::PlanetType> planet_types; + planet_types.push_back(PT_SWAMP); planet_types.push_back(PT_TOXIC); + planet_types.push_back(PT_INFERNO); planet_types.push_back(PT_RADIATED); + planet_types.push_back(PT_BARREN); planet_types.push_back(PT_TUNDRA); + planet_types.push_back(PT_DESERT); planet_types.push_back(PT_TERRAN); + planet_types.push_back(PT_OCEAN); planet_types.push_back(PT_ASTEROIDS); + planet_types.push_back(PT_GASGIANT); + std::vector<std::string> type_strings = StringsFromEnums(planet_types); + + GG::ListBox::iterator row_it = m_string_drop->end(); + for (std::vector<std::string>::iterator string_it = type_strings.begin(); + string_it != type_strings.end(); ++string_it) + { + const std::string& text = *string_it; + row_it = m_string_drop->Insert(new StringRow(text, GG::Y(ClientUI::Pts()))); + } + if (!m_string_drop->Empty()) + m_string_drop->Select(0); } Resize(GG::Pt(Width(), GG::Y(40))); } CUIDropDownList* m_class_drop; - CUIDropDownList* m_enum_drop; CUIDropDownList* m_string_drop; CUISpin<int>* m_param_spin; }; //////////////////////////////////////////////// -// FilterDialog +// FilterDialog // //////////////////////////////////////////////// class FilterDialog : public CUIWnd { public: @@ -422,9 +521,7 @@ m_filters_layout(0), m_cancel_button(0), m_apply_button(0) - { - Init(condition_filter); - } + { Init(condition_filter); } bool ChangesAccepted() { return m_accept_changes; } @@ -433,9 +530,8 @@ { return m_vis_filters; } // caller takes ownership of returned ConditionBase* - Condition::ConditionBase* GetConditionFilter() { - return m_condition_widget->GetCondition(); - } + Condition::ConditionBase* GetConditionFilter() + { return m_condition_widget->GetCondition(); } private: void Init(const Condition::ConditionBase* const condition_filter) { @@ -556,58 +652,75 @@ namespace { std::vector<boost::shared_ptr<GG::Texture> > ObjectTextures(const UniverseObject* obj) { - std::vector<boost::shared_ptr<GG::Texture> > retval; + std::vector<boost::shared_ptr<GG::Texture> > retval; - if (const Ship* ship = universe_object_cast<const Ship*>(obj)) { - if (const ShipDesign* design = ship->Design()) - retval.push_back(ClientUI::ShipDesignIcon(design->ID())); - else - retval.push_back(ClientUI::ShipDesignIcon(INVALID_OBJECT_ID)); // default icon - } else if (const Fleet* fleet = universe_object_cast<const Fleet*>(obj)) { - boost::shared_ptr<GG::Texture> head_icon = FleetHeadIcon(fleet, FleetButton::FLEET_BUTTON_LARGE); - if (head_icon) - retval.push_back(head_icon); - boost::shared_ptr<GG::Texture> size_icon = FleetSizeIcon(fleet, FleetButton::FLEET_BUTTON_LARGE); - if (size_icon) - retval.push_back(size_icon); - } else if (const System* system = universe_object_cast<const System*>(obj)) { - StarType star_type = system->GetStarType(); - ClientUI* ui = ClientUI::GetClientUI(); - boost::shared_ptr<GG::Texture> disc_texture = ui->GetModuloTexture( - ClientUI::ArtDir() / "stars", ClientUI::StarTypeFilePrefixes()[star_type], system->ID()); - if (disc_texture) - retval.push_back(disc_texture); - boost::shared_ptr<GG::Texture> halo_texture = ui->GetModuloTexture( - ClientUI::ArtDir() / "stars", ClientUI::HaloStarTypeFilePrefixes()[star_type], system->ID()); - if (halo_texture) - retval.push_back(halo_texture); - } else if (/*const Planet* planet = */universe_object_cast<const Planet*>(obj)) { - // don't have any icons for each planet type, so use generic / default object icon + if (obj->ObjectType() == OBJ_SHIP) { + const Ship* ship = universe_object_cast<const Ship*>(obj); + if (ship) { + if (const ShipDesign* design = ship->Design()) + retval.push_back(ClientUI::ShipDesignIcon(design->ID())); + } + if (retval.empty()) { + retval.push_back(ClientUI::ShipDesignIcon(INVALID_OBJECT_ID)); // default icon + } + } else if (obj->ObjectType() == OBJ_FLEET) { + const Fleet* fleet = universe_object_cast<const Fleet*>(obj); + if (fleet) { + boost::shared_ptr<GG::Texture> head_icon = FleetHeadIcon(fleet, FleetButton::FLEET_BUTTON_LARGE); + if (head_icon) + retval.push_back(head_icon); + boost::shared_ptr<GG::Texture> size_icon = FleetSizeIcon(fleet, FleetButton::FLEET_BUTTON_LARGE); + if (size_icon) + retval.push_back(size_icon); + } + } else if (obj->ObjectType() == OBJ_SYSTEM) { + const System* system = universe_object_cast<const System*>(obj); + if (system) { + StarType star_type = system->GetStarType(); + ClientUI* ui = ClientUI::GetClientUI(); + boost::shared_ptr<GG::Texture> disc_texture = ui->GetModuloTexture( + ClientUI::ArtDir() / "stars", ClientUI::StarTypeFilePrefixes()[star_type], system->ID()); + if (disc_texture) + retval.push_back(disc_texture); + boost::shared_ptr<GG::Texture> halo_texture = ui->GetModuloTexture( + ClientUI::ArtDir() / "stars", ClientUI::HaloStarTypeFilePrefixes()[star_type], system->ID()); + if (halo_texture) + retval.push_back(halo_texture); + } + } else if (obj->ObjectType() == OBJ_PLANET) { + //const Planet* planet = */universe_object_cast<const Planet*>(obj));; + // don't have any icons for each planet type, so use generic / default object icon - } else if (const Building* building = universe_object_cast<const Building*>(obj)) { - retval.push_back(ClientUI::BuildingIcon(building->BuildingTypeName())); + } else if (obj->ObjectType() == OBJ_BUILDING) { + const Building* building = universe_object_cast<const Building*>(obj); + if (building) + retval.push_back(ClientUI::BuildingIcon(building->BuildingTypeName())); + else + retval.push_back(ClientUI::BuildingIcon("")); // default building icon + } + if (retval.empty()) + retval.push_back(ClientUI::GetTexture(ClientUI::ArtDir() / "icons" / "generic_object.png", true)); + return retval; } - if (retval.empty()) - retval.push_back(ClientUI::GetTexture(ClientUI::ArtDir() / "icons" / "generic_object.png", true)); - return retval; -} const std::string& ObjectName(const UniverseObject* obj) { if (!obj) return EMPTY_STRING; - if (const System* system = universe_object_cast<const System*>(obj)) - return system->ApparentName(HumanClientApp::GetApp()->EmpireID()); + if (obj->ObjectType() == OBJ_SYSTEM) { + if (const System* system = universe_object_cast<const System*>(obj)) + return system->ApparentName(HumanClientApp::GetApp()->EmpireID()); + } return obj->PublicName(HumanClientApp::GetApp()->EmpireID()); } std::pair<std::string, GG::Clr> ObjectEmpireNameAndColour(const UniverseObject* obj) { - if (!obj) + if (!obj) + return std::make_pair("", ClientUI::TextColor()); + if (const Empire* empire = Empires().Lookup(obj->Owner())) + return std::make_pair(empire->Name(), empire->Color()); return std::make_pair("", ClientUI::TextColor()); - if (const Empire* empire = Empires().Lookup(obj->Owner())) - return std::make_pair(empire->Name(), empire->Color()); - return std::make_pair("", ClientUI::TextColor()); + } } -} //////////////////////////////////////////////// // ObjectPanel @@ -891,6 +1004,9 @@ return m_collapsed_objects.find(object_id) != m_collapsed_objects.end(); } + bool AnythingCollapsed() const + { return !m_collapsed_objects.empty(); } + void SetFilterCondition(Condition::ConditionBase* condition) { m_filter_condition = condition; Refresh(); @@ -1168,6 +1284,8 @@ } } + mutable boost::signal<void ()> ExpandCollapseSignal; + private: void AddObjectRow(int object_id, int container, const std::set<int>& contents, int indent) { AddObjectRow(object_id, container, contents, indent, this->end()); } @@ -1262,6 +1380,7 @@ ExpandObject(object_id); else CollapseObject(object_id); + ExpandCollapseSignal(); } void ObjectStateChanged(int object_id) { @@ -1306,6 +1425,7 @@ m_list_box->SetStyle(GG::LIST_NOSEL | GG::LIST_NOSORT); GG::Connect(m_list_box->DoubleClickedSignal, &ObjectListWnd::ObjectDoubleClicked, this); GG::Connect(m_list_box->RightClickedSignal, &ObjectListWnd::ObjectRightClicked, this); + GG::Connect(m_list_box->ExpandCollapseSignal, &ObjectListWnd::DoLayout, this); AttachChild(m_list_box); m_filter_button = new CUIButton(GG::X0, GG::Y0, GG::X(30), UserString("FILTERS")); @@ -1325,7 +1445,6 @@ m_collapse_button = new CUIButton(GG::X0, GG::Y0, GG::X(30), UserString("COLLAPSE_ALL")); GG::Connect(m_collapse_button->ClickedSignal, &ObjectListWnd::CollapseExpandClicked, this); AttachChild(m_collapse_button); - m_collapse_button->Disable(); DoLayout(); } @@ -1349,6 +1468,11 @@ m_list_box->SizeMove(GG::Pt(GG::X0, GG::Y0), GG::Pt(ClientWidth(), button_ul.y)); SetMinSize(GG::Pt(5*BUTTON_WIDTH, 6*BUTTON_HEIGHT)); + + if (m_list_box->AnythingCollapsed()) + m_collapse_button->SetText(UserString("EXPAND_ALL")); + else + m_collapse_button->SetText(UserString("COLLAPSE_ALL")); } void ObjectListWnd::SizeMove(const GG::Pt& ul, const GG::Pt& lr) { @@ -1421,4 +1545,9 @@ } void ObjectListWnd::CollapseExpandClicked() { + if (m_list_box->AnythingCollapsed()) + m_list_box->ExpandObject(INVALID_OBJECT_ID); + else + m_list_box->CollapseObject(INVALID_OBJECT_ID); + DoLayout(); } |
From: <ewi...@us...> - 2012-12-22 19:07:12
|
Revision: 5569 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5569&view=rev Author: ewillgohs Date: 2012-12-22 19:07:02 +0000 (Sat, 22 Dec 2012) Log Message: ----------- a little fix to allow compilation of this file with gcc Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-12-22 02:27:54 UTC (rev 5568) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-12-22 19:07:02 UTC (rev 5569) @@ -149,7 +149,7 @@ template <typename enumT> std::vector<std::string> StringsFromEnums(const std::vector<enumT>& enum_vals) { std::vector<std::string> retval; - for (std::vector<enumT>::const_iterator it = enum_vals.begin(); it != enum_vals.end(); ++it) + for (typename std::vector<enumT>::const_iterator it = enum_vals.begin(); it != enum_vals.end(); ++it) retval.push_back(boost::lexical_cast<std::string>(*it)); return retval; } |
From: <geo...@us...> - 2012-12-23 22:17:19
|
Revision: 5572 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5572&view=rev Author: geoffthemedio Date: 2012-12-23 22:17:13 +0000 (Sun, 23 Dec 2012) Log Message: ----------- Added MeterValue ObjectList Window Filter. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-12-22 21:57:12 UTC (rev 5571) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-12-23 22:17:13 UTC (rev 5572) @@ -50,6 +50,7 @@ const std::string PLANETTYPE_CONDITION("CONDITION_PLANETTYPE"); const std::string FOCUSTYPE_CONDITION("CONDITION_FOCUSTYPE"); const std::string STARTYPE_CONDITION("CONDITION_STARTYPE"); + const std::string METERVALUE_CONDITION("CONDITION_METERVALUE"); ValueRef::ValueRefBase<std::string>* CopyStringValueRef(const ValueRef::ValueRefBase<std::string>* const value_ref) { if (const ValueRef::Constant<std::string>* constant = @@ -137,6 +138,8 @@ return FOCUSTYPE_CONDITION; else if (dynamic_cast<const Condition::StarType* const>(condition)) return STARTYPE_CONDITION; + else if (dynamic_cast<const Condition::MeterValue* const>(condition)) + return METERVALUE_CONDITION; else return EMPTY_STRING; } } @@ -161,7 +164,8 @@ GG::Control(x, y, GG::X(380), GG::Y1, GG::INTERACTIVE), m_class_drop(0), m_string_drop(0), - m_param_spin(0) + m_param_spin1(0), + m_param_spin2(0) { Condition::ConditionBase* init_condition = 0; if (!initial_condition) { @@ -176,7 +180,8 @@ ~ConditionWidget() { delete m_class_drop; delete m_string_drop; - delete m_param_spin; + delete m_param_spin1; + delete m_param_spin2; } Condition::ConditionBase* GetCondition() { @@ -231,6 +236,9 @@ } else if (condition_key == STARTYPE_CONDITION) { return new Condition::StarType(GetEnumValueRefVec< ::StarType>()); + + } else if (condition_key == METERVALUE_CONDITION) { + return new Condition::MeterValue(GetEnum< ::MeterType>(), GetDouble1ValueRef(), GetDouble2ValueRef()); } return new Condition::All(); @@ -292,42 +300,82 @@ return retval; } - int GetInt() { - if (m_param_spin) - return m_param_spin->Value(); + int GetInt1() { + if (m_param_spin1) + return m_param_spin1->Value(); else return 0; } - ValueRef::ValueRefBase<int>* GetIntValueRef() - { return new ValueRef::Constant<int>(GetInt()); } + ValueRef::ValueRefBase<int>* GetInt1ValueRef() + { return new ValueRef::Constant<int>(GetInt1()); } + int GetInt2() { + if (m_param_spin2) + return m_param_spin2->Value(); + else + return 0; + } + + ValueRef::ValueRefBase<int>* GetInt2ValueRef() + { return new ValueRef::Constant<int>(GetInt2()); } + + double GetDouble1() { + if (m_param_spin1) + return m_param_spin1->Value(); + else + return 0; + } + + ValueRef::ValueRefBase<double>* GetDouble1ValueRef() + { return new ValueRef::Constant<double>(GetDouble1()); } + + double GetDouble2() { + if (m_param_spin2) + return m_param_spin2->Value(); + else + return 0; + } + + ValueRef::ValueRefBase<double>* GetDouble2ValueRef() + { return new ValueRef::Constant<double>(GetDouble2()); } + template <typename T> - ValueRef::ValueRefBase<T>* GetEnumValueRef() { + T GetEnum() { const std::string& text = GetString(); T enum_val = T(-1); try { enum_val = boost::lexical_cast<T>(text); } catch (...) { - Logger().errorStream() << "ConditionWidget::GetEnumValueRef unable to convert text to enum type: " << text; + Logger().errorStream() << "ConditionWidget::GetEnum unable to convert text to enum type: " << text; } - return new ValueRef::Constant<T>(enum_val); + return enum_val; } template <typename T> + ValueRef::ValueRefBase<T>* GetEnumValueRef() + { return new ValueRef::Constant<T>(GetEnum<T>()); } + + template <typename T> std::vector<const ValueRef::ValueRefBase<T>*> GetEnumValueRefVec() { std::vector<const ValueRef::ValueRefBase<T>*> retval; retval.push_back(GetEnumValueRef<T>()); return retval; } + GG::X DropListWidth() const + { return GG::X(ClientUI::Pts()*16); } + + GG::Y DropListHeight() const + { return GG::Y(ClientUI::Pts() + 4); } + + GG::Y DropListDropHeight() const + { return DropListHeight() * 10; } + void Init(const Condition::ConditionBase* init_condition) { // fill droplist with basic types of conditions and select appropriate row - const GG::Y DROPLIST_HEIGHT(ClientUI::Pts() + 4); - const GG::Y DROPLIST_DROP_HEIGHT = DROPLIST_HEIGHT * 10; - - m_class_drop = new CUIDropDownList(GG::X0, GG::Y0, GG::X(ClientUI::Pts()*16), - DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + m_class_drop = new CUIDropDownList(GG::X0, GG::Y0, DropListWidth(), + DropListHeight(), DropListDropHeight()); m_class_drop->SetStyle(GG::LIST_NOSORT); AttachChild(m_class_drop); @@ -340,6 +388,7 @@ row_keys.push_back(SPECIES_CONDITION); row_keys.push_back(PLANETSIZE_CONDITION); row_keys.push_back(PLANETTYPE_CONDITION); row_keys.push_back(FOCUSTYPE_CONDITION); row_keys.push_back(STARTYPE_CONDITION); + row_keys.push_back(METERVALUE_CONDITION); SetMinSize(m_class_drop->Size()); GG::ListBox::iterator select_row_it = m_class_drop->end(); @@ -375,11 +424,9 @@ return; // remove old parameter controls delete m_string_drop; m_string_drop = 0; - delete m_param_spin; m_param_spin = 0; + delete m_param_spin1; m_param_spin1 = 0; + delete m_param_spin2; m_param_spin2 = 0; - const GG::Y DROPLIST_HEIGHT(ClientUI::Pts() + 4); - const GG::Y DROPLIST_DROP_HEIGHT = DROPLIST_HEIGHT * 10; - // determine which condition is selected GG::ListBox::iterator row_it = m_class_drop->CurrentItem(); if (row_it == m_class_drop->end()) @@ -390,8 +437,8 @@ const std::string& condition_key = condition_row->GetKey(); GG::X PAD(3); - GG::X param_widget_left = m_class_drop->LowerRight().x + PAD - ClientUpperLeft().x; - GG::Y param_widget_top = m_class_drop->UpperLeft().y - ClientUpperLeft().y + GG::Y1; + GG::X param_widget_left = DropListWidth() + PAD; + GG::Y param_widget_top = GG::Y0; // create controls for selected condition if (condition_key == ALL_CONDITION || @@ -403,14 +450,18 @@ condition_key == MONSTER_CONDITION) { // no params + param_widget_top += m_class_drop->Height(); + } else if (condition_key == HOMEWORLD_CONDITION || condition_key == SPECIES_CONDITION) { // droplist of valid species - m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, GG::X(ClientUI::Pts()*12), - DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, DropListWidth(), + DropListHeight(), DropListDropHeight()); AttachChild(m_string_drop); + param_widget_top += m_string_drop->Height(); + // add empty row, allowing for matching any species GG::ListBox::iterator row_it = m_string_drop->Insert(new StringRow("", GG::Y(ClientUI::Pts()))); m_string_drop->Select(row_it); @@ -423,10 +474,12 @@ } else if (condition_key == HASSPECIAL_CONDITION) { // droplist of valid specials - m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, GG::X(ClientUI::Pts()*12), - DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, DropListWidth(), + DropListHeight(), DropListDropHeight()); AttachChild(m_string_drop); + param_widget_top += m_string_drop->Height(); + // add empty row, allowing for matching any special GG::ListBox::iterator row_it = m_string_drop->Insert(new StringRow("", GG::Y(ClientUI::Pts()))); m_string_drop->Select(row_it); @@ -439,10 +492,12 @@ } else if (condition_key == HASTAG_CONDITION) { // droplist of valid tags - m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, GG::X(ClientUI::Pts()*12), - DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, DropListWidth(), + DropListHeight(), DropListDropHeight()); AttachChild(m_string_drop); + param_widget_top += m_string_drop->Height(); + // collect all valid tags on any object in universe std::set<std::string> all_tags; const ObjectMap& known_objects = Objects(); @@ -465,10 +520,12 @@ } else if (condition_key == PLANETSIZE_CONDITION) { // droplist of valid sizes - m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, GG::X(ClientUI::Pts()*12), - DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, DropListWidth(), + DropListHeight(), DropListDropHeight()); AttachChild(m_string_drop); + param_widget_top += m_string_drop->Height(); + std::vector< ::PlanetSize> planet_sizes; for (::PlanetSize size = SZ_TINY; size != NUM_PLANET_SIZES; size = ::PlanetSize(size + 1)) planet_sizes.push_back(size); @@ -486,8 +543,8 @@ } else if (condition_key == PLANETTYPE_CONDITION) { // droplist of valid types - m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, GG::X(ClientUI::Pts()*12), - DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, DropListWidth(), + DropListHeight(), DropListDropHeight()); AttachChild(m_string_drop); std::vector< ::PlanetType> planet_types; @@ -504,12 +561,15 @@ } if (!m_string_drop->Empty()) m_string_drop->Select(0); + } else if (condition_key == STARTYPE_CONDITION) { // droplist of valid types - m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, GG::X(ClientUI::Pts()*12), - DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, DropListWidth(), + DropListHeight(), DropListDropHeight()); AttachChild(m_string_drop); + param_widget_top += m_string_drop->Height(); + std::vector< ::StarType> star_types; for (::StarType type = STAR_BLUE; type != NUM_STAR_TYPES; type = ::StarType(type + 1)) star_types.push_back(type); @@ -524,12 +584,15 @@ } if (!m_string_drop->Empty()) m_string_drop->Select(0); + } else if (condition_key == FOCUSTYPE_CONDITION) { // droplist of valid foci - m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, GG::X(ClientUI::Pts()*12), - DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, DropListWidth(), + DropListHeight(), DropListDropHeight()); AttachChild(m_string_drop); + param_widget_top += m_string_drop->Height(); + // collect all valid foci on any object in universe std::set<std::string> all_foci; const ObjectMap& known_objects = Objects(); @@ -556,14 +619,49 @@ } if (!m_string_drop->Empty()) m_string_drop->Select(0); + + } else if (condition_key == METERVALUE_CONDITION) { + // droplist of meter types + m_string_drop = new CUIDropDownList(param_widget_left, param_widget_top, DropListWidth(), + DropListHeight(), DropListDropHeight()); + AttachChild(m_string_drop); + param_widget_left = GG::X0; + param_widget_top = m_string_drop->Height() + GG::Y(Value(PAD)); + + std::vector< ::MeterType> meter_types; + for (::MeterType type = METER_TARGET_POPULATION; type != NUM_METER_TYPES; type = ::MeterType(type + 1)) + meter_types.push_back(type); + std::vector<std::string> type_strings = StringsFromEnums(meter_types); + + GG::ListBox::iterator row_it = m_string_drop->end(); + for (std::vector<std::string>::iterator string_it = type_strings.begin(); + string_it != type_strings.end(); ++string_it) + { + const std::string& text = *string_it; + row_it = m_string_drop->Insert(new StringRow(text, GG::Y(ClientUI::Pts()))); + } + if (!m_string_drop->Empty()) + m_string_drop->Select(0); + + m_param_spin1 = new CUISpin<int>(param_widget_left, param_widget_top, DropListWidth(), + 0, 1, 0, 1000, true); + AttachChild(m_param_spin1); + param_widget_left = DropListWidth() + PAD; + + m_param_spin2 = new CUISpin<int>(param_widget_left, param_widget_top, DropListWidth(), + 0, 1, 0, 1000, true); + AttachChild(m_param_spin2); + + param_widget_top += m_param_spin1->Height(); } - Resize(GG::Pt(Width(), GG::Y(40))); + Resize(GG::Pt(Width(), param_widget_top)); } CUIDropDownList* m_class_drop; CUIDropDownList* m_string_drop; - CUISpin<int>* m_param_spin; + CUISpin<int>* m_param_spin1; + CUISpin<int>* m_param_spin2; }; //////////////////////////////////////////////// |
From: <geo...@us...> - 2012-12-27 08:40:37
|
Revision: 5580 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5580&view=rev Author: geoffthemedio Date: 2012-12-27 08:40:27 +0000 (Thu, 27 Dec 2012) Log Message: ----------- Delayed initialization for objects list. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-12-27 05:58:49 UTC (rev 5579) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2012-12-27 08:40:27 UTC (rev 5580) @@ -886,6 +886,7 @@ public: ObjectPanel(GG::X w, GG::Y h, const UniverseObject* obj, bool expanded, bool has_contents, int indent = 0) : Control(GG::X0, GG::Y0, w, h, GG::Flags<GG::WndFlag>()), + m_initialized(false), m_object_id(obj ? obj->ID() : INVALID_OBJECT_ID), m_indent(indent), m_expanded(expanded), @@ -896,12 +897,14 @@ m_name_label(0), m_empire_label(0) { - Refresh(); + SetChildClippingMode(ClipToClient); } int ObjectID() const { return m_object_id; } virtual void Render() { + if (!m_initialized) + Init(); GG::Clr background_clr = this->Disabled() ? ClientUI::WndColor() : ClientUI::CtrlColor(); GG::FlatRectangle(UpperLeft(), LowerRight(), background_clr, ClientUI::WndOuterBorderColor(), 1u); } @@ -914,6 +917,8 @@ } void Refresh() { + if (!m_initialized) + return; boost::shared_ptr<GG::Font> font = ClientUI::GetFont(); GG::Clr clr = ClientUI::TextColor(); //int client_empire_id = HumanClientApp::GetApp()->EmpireID(); @@ -969,6 +974,9 @@ mutable boost::signal<void ()> ExpandCollapseSignal; private: void DoLayout() { + if (!m_initialized) + return; + const GG::Y ICON_HEIGHT(ClientHeight()); const GG::X ICON_WIDTH(Value(ClientHeight())); @@ -1004,6 +1012,15 @@ ExpandCollapseSignal(); } + void Init() { + if (m_initialized) + return; + m_initialized = true; + Refresh(); + } + + bool m_initialized; + int m_object_id; int m_indent; bool m_expanded; |
From: <dil...@us...> - 2013-03-17 02:19:15
|
Revision: 5870 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5870&view=rev Author: dilvish-fo Date: 2013-03-17 02:19:08 +0000 (Sun, 17 Mar 2013) Log Message: ----------- moved PlanetType and PlanetSize conditions to near top of conditions dropdown list; default 'show' selections are now just Planets, visible and previously visible. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2013-03-16 10:57:19 UTC (rev 5869) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2013-03-17 02:19:08 UTC (rev 5870) @@ -403,12 +403,12 @@ std::vector<std::string> row_keys; row_keys.push_back(ALL_CONDITION); row_keys.push_back(EMPIREAFFILIATION_CONDITION); + row_keys.push_back(PLANETSIZE_CONDITION); row_keys.push_back(PLANETTYPE_CONDITION); row_keys.push_back(HOMEWORLD_CONDITION); row_keys.push_back(CAPITAL_CONDITION); row_keys.push_back(MONSTER_CONDITION); row_keys.push_back(ARMED_CONDITION); row_keys.push_back(STATIONARY_CONDITION); row_keys.push_back(CANPRODUCESHIPS_CONDITION); row_keys.push_back(CANCOLONIZE_CONDITION); row_keys.push_back(HASSPECIAL_CONDITION); row_keys.push_back(HASTAG_CONDITION); row_keys.push_back(SPECIES_CONDITION); - row_keys.push_back(PLANETSIZE_CONDITION); row_keys.push_back(PLANETTYPE_CONDITION); row_keys.push_back(FOCUSTYPE_CONDITION); row_keys.push_back(STARTYPE_CONDITION); row_keys.push_back(METERVALUE_CONDITION); @@ -1146,15 +1146,15 @@ m_filter_condition = new Condition::All(); - m_visibilities[OBJ_BUILDING].insert(SHOW_VISIBLE); - m_visibilities[OBJ_BUILDING].insert(SHOW_PREVIOUSLY_VISIBLE); - m_visibilities[OBJ_SHIP].insert(SHOW_VISIBLE); - m_visibilities[OBJ_FLEET].insert(SHOW_VISIBLE); + //m_visibilities[OBJ_BUILDING].insert(SHOW_VISIBLE); + //m_visibilities[OBJ_BUILDING].insert(SHOW_PREVIOUSLY_VISIBLE); + //m_visibilities[OBJ_SHIP].insert(SHOW_VISIBLE); + //m_visibilities[OBJ_FLEET].insert(SHOW_VISIBLE); m_visibilities[OBJ_PLANET].insert(SHOW_VISIBLE); m_visibilities[OBJ_PLANET].insert(SHOW_PREVIOUSLY_VISIBLE); - m_visibilities[OBJ_SYSTEM].insert(SHOW_VISIBLE); - m_visibilities[OBJ_SYSTEM].insert(SHOW_PREVIOUSLY_VISIBLE); - m_visibilities[OBJ_FIELD].insert(SHOW_VISIBLE); + //m_visibilities[OBJ_SYSTEM].insert(SHOW_VISIBLE); + //m_visibilities[OBJ_SYSTEM].insert(SHOW_PREVIOUSLY_VISIBLE); + //m_visibilities[OBJ_FIELD].insert(SHOW_VISIBLE); GG::Connect(GetUniverse().UniverseObjectDeleteSignal, &ObjectListBox::UniverseObjectDeleted, this); } |
From: <geo...@us...> - 2013-05-18 22:35:02
|
Revision: 6043 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=6043&view=rev Author: geoffthemedio Date: 2013-05-18 22:34:56 +0000 (Sat, 18 May 2013) Log Message: ----------- Planet icons on objects list. Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2013-05-18 22:14:48 UTC (rev 6042) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2013-05-18 22:34:56 UTC (rev 6043) @@ -876,8 +876,8 @@ retval.push_back(halo_texture); } } else if (obj->ObjectType() == OBJ_PLANET) { - //const Planet* planet = */universe_object_cast<const Planet*>(obj));; - // don't have any icons for each planet type, so use generic / default object icon + if (const Planet* planet = universe_object_cast<const Planet*>(obj)) + retval.push_back(ClientUI::PlanetIcon(planet->Type())); } else if (obj->ObjectType() == OBJ_BUILDING) { const Building* building = universe_object_cast<const Building*>(obj); |
From: <dil...@us...> - 2013-06-08 03:16:02
|
Revision: 6126 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=6126&view=rev Author: dilvish-fo Date: 2013-06-08 03:15:56 +0000 (Sat, 08 Jun 2013) Log Message: ----------- patch by yandonman to enable accessing Planet Suitability Report via right-click popup menu of the Object Window Modified Paths: -------------- trunk/FreeOrion/UI/ObjectListWnd.cpp Modified: trunk/FreeOrion/UI/ObjectListWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ObjectListWnd.cpp 2013-06-08 03:14:41 UTC (rev 6125) +++ trunk/FreeOrion/UI/ObjectListWnd.cpp 2013-06-08 03:15:56 UTC (rev 6126) @@ -1715,11 +1715,19 @@ if (app->GetClientType() == Networking::CLIENT_TYPE_HUMAN_MODERATOR) moderator = true; - // create popup menu with object commands in it GG::MenuItem menu_contents; menu_contents.next_level.push_back(GG::MenuItem(UserString("DUMP"), 1, false, false)); + const UniverseObject* obj = GetUniverseObject(object_id); + //Logger().debugStream() << "ObjectListBox::ObjectStateChanged: " << obj->Name(); + if (!obj) + return; + + UniverseObjectType type = obj->ObjectType(); + if (type == OBJ_PLANET) + menu_contents.next_level.push_back(GG::MenuItem(UserString("SP_PLANET_SUITABILITY"), 2, false, false)); + // moderator actions... if (moderator) { menu_contents.next_level.push_back(GG::MenuItem(UserString("MOD_DESTROY"), 10, false, false)); @@ -1735,6 +1743,10 @@ ObjectDumpSignal(object_id); break; } + case 2: { + ClientUI::GetClientUI()->ZoomToPlanetPedia(object_id); + break; + } case 10: { net.SendMessage(ModeratorActionMessage(app->PlayerID(), Moderator::DestroyUniverseObject(object_id))); break; |