From: <tz...@us...> - 2009-05-18 03:42:18
|
Revision: 3055 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3055&view=rev Author: tzlaine Date: 2009-05-18 03:42:03 +0000 (Mon, 18 May 2009) Log Message: ----------- Added ResearchQueueChangedSignal to ResearchQueue, and hooked it and ProductionQueue's ProductionQueueChangedSignal up to ResearchWnd and ProductionWnd. Also changed the FocusChanged order to emit both *QueueChangedSignals. The net result is that changes to focus are reflected in the queues' time estimates for research/build completion immediately. Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/Empire/Empire.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/UI/ProductionWnd.h trunk/FreeOrion/UI/ResearchWnd.cpp trunk/FreeOrion/UI/ResearchWnd.h trunk/FreeOrion/UI/TechTreeWnd.cpp trunk/FreeOrion/util/Order.cpp Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2009-05-17 04:02:16 UTC (rev 3054) +++ trunk/FreeOrion/Empire/Empire.cpp 2009-05-18 03:42:03 UTC (rev 3055) @@ -394,6 +394,8 @@ m_queue[i].turns_left = -1; } } + + ResearchQueueChangedSignal(); } void ResearchQueue::push_back(const Tech* tech) Modified: trunk/FreeOrion/Empire/Empire.h =================================================================== --- trunk/FreeOrion/Empire/Empire.h 2009-05-17 04:02:16 UTC (rev 3054) +++ trunk/FreeOrion/Empire/Empire.h 2009-05-18 03:42:03 UTC (rev 3055) @@ -61,6 +61,10 @@ /** The const ResearchQueue iterator type. Dereference yields an Element. */ typedef QueueType::const_iterator const_iterator; + /** \name Signal Types */ //@{ + typedef boost::signal<void ()> ResearchQueueChangedSignalType; ///< emitted when something is added to, removed from or altered on the queue + //@} + /** \name Structors */ //@{ ResearchQueue(); ///< Basic ctor. //@} @@ -100,6 +104,8 @@ /** Returns an iterator to the underfunded research project, or end() if none exists. */ iterator UnderfundedProject(); + + mutable ResearchQueueChangedSignalType ResearchQueueChangedSignal; //@} private: Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2009-05-17 04:02:16 UTC (rev 3054) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-05-18 03:42:03 UTC (rev 3055) @@ -954,8 +954,8 @@ for (EmpireManager::iterator it = manager.begin(); it != manager.end(); ++it) it->second->UpdateResourcePools(); - m_research_wnd->Update(); - m_production_wnd->Update(); + m_research_wnd->InitTurn(); + m_production_wnd->InitTurn(); } void MapWnd::InitTurnRendering() Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2009-05-17 04:02:16 UTC (rev 3054) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2009-05-18 03:42:03 UTC (rev 3055) @@ -298,6 +298,17 @@ glEnable(GL_TEXTURE_2D); } +void ProductionWnd::InitTurn() +{ + // empire is recreated each turn based on turn update from server, so + // connections of signals emitted from the empire must be remade each turn + EmpireManager& manager = HumanClientApp::GetApp()->Empires(); + Empire* empire = manager.Lookup(HumanClientApp::GetApp()->EmpireID()); + GG::Connect(empire->GetProductionQueue().ProductionQueueChangedSignal, + &ProductionWnd::ProductionQueueChangedSlot, this); + Update(); +} + void ProductionWnd::Reset() { UpdateInfoPanel(); @@ -332,8 +343,6 @@ OrderPtr(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), boost::polymorphic_downcast<QueueRow*>(row)->queue_index, position))); - UpdateQueue(); - UpdateInfoPanel(); } void ProductionWnd::Sanitize() @@ -341,6 +350,12 @@ m_build_designator_wnd->Clear(); } +void ProductionWnd::ProductionQueueChangedSlot() +{ + UpdateInfoPanel(); + UpdateQueue(); +} + void ProductionWnd::UpdateQueue() { const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); @@ -378,24 +393,18 @@ void ProductionWnd::AddBuildToQueueSlot(BuildType build_type, const std::string& name, int number, int location) { HumanClientApp::GetApp()->Orders().IssueOrder(OrderPtr(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), build_type, name, number, location))); - UpdateQueue(); - UpdateInfoPanel(); m_build_designator_wnd->CenterOnBuild(m_queue_lb->NumRows() - 1); } void ProductionWnd::AddBuildToQueueSlot(BuildType build_type, int design_id, int number, int location) { HumanClientApp::GetApp()->Orders().IssueOrder(OrderPtr(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), build_type, design_id, number, location))); - UpdateQueue(); - UpdateInfoPanel(); m_build_designator_wnd->CenterOnBuild(m_queue_lb->NumRows() - 1); } void ProductionWnd::ChangeBuildQuantitySlot(int queue_idx, int quantity) { HumanClientApp::GetApp()->Orders().IssueOrder(OrderPtr(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), queue_idx, quantity, true))); - UpdateQueue(); - UpdateInfoPanel(); } void ProductionWnd::QueueItemDeletedSlot(GG::ListBox::iterator it) @@ -404,8 +413,6 @@ HumanClientApp::GetApp()->Orders().IssueOrder( OrderPtr(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), std::distance(m_queue_lb->begin(), it)))); - UpdateQueue(); - UpdateInfoPanel(); } void ProductionWnd::QueueItemClickedSlot(GG::ListBox::iterator it, const GG::Pt& pt) Modified: trunk/FreeOrion/UI/ProductionWnd.h =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.h 2009-05-17 04:02:16 UTC (rev 3054) +++ trunk/FreeOrion/UI/ProductionWnd.h 2009-05-18 03:42:03 UTC (rev 3055) @@ -30,6 +30,7 @@ void Render(); + void InitTurn(); void Reset(); void Update(); void CenterOnBuild(int queue_idx); @@ -42,6 +43,7 @@ mutable SystemSelectedSignalType SystemSelectedSignal; private: + void ProductionQueueChangedSlot(); void UpdateQueue(); ///< Clears and repopulates queue list with listitems corresponding to contents of empire's production queue void UpdateInfoPanel(); ///< Updates production summary at top left of production screen, and signals that the empire's minerals resource pool has changed (propegates to the mapwnd to update indicator) void AddBuildToQueueSlot(BuildType build_type, const std::string& name, int number, int location); Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2009-05-17 04:02:16 UTC (rev 3054) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2009-05-18 03:42:03 UTC (rev 3055) @@ -207,6 +207,17 @@ EnableChildClipping(true); } +void ResearchWnd::InitTurn() +{ + // empire is recreated each turn based on turn update from server, so + // connections of signals emitted from the empire must be remade each turn + EmpireManager& manager = HumanClientApp::GetApp()->Empires(); + Empire* empire = manager.Lookup(HumanClientApp::GetApp()->EmpireID()); + GG::Connect(empire->GetResearchQueue().ResearchQueueChangedSignal, + &ResearchWnd::ResearchQueueChangedSlot, this); + Update(); +} + void ResearchWnd::Reset() { m_tech_tree_wnd->Reset(); @@ -233,8 +244,6 @@ OrderPtr(new ResearchQueueOrder(HumanClientApp::GetApp()->EmpireID(), boost::polymorphic_downcast<QueueRow*>(row)->tech->Name(), position))); - UpdateQueue(); - UpdateInfoPanel(); } void ResearchWnd::Sanitize() @@ -268,6 +277,12 @@ glEnable(GL_TEXTURE_2D); } +void ResearchWnd::ResearchQueueChangedSlot() +{ + UpdateQueue(); + UpdateInfoPanel(); +} + void ResearchWnd::UpdateQueue() { const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); @@ -309,8 +324,6 @@ const ResearchQueue& queue = empire->GetResearchQueue(); if (!queue.InQueue(tech)) { HumanClientApp::GetApp()->Orders().IssueOrder(OrderPtr(new ResearchQueueOrder(HumanClientApp::GetApp()->EmpireID(), tech->Name(), -1))); - UpdateQueue(); - UpdateInfoPanel(); m_tech_tree_wnd->Update(); } } @@ -327,8 +340,6 @@ orders.IssueOrder(OrderPtr(new ResearchQueueOrder(id, tech->Name(), -1))); } - UpdateQueue(); - UpdateInfoPanel(); m_tech_tree_wnd->Update(); } @@ -337,8 +348,6 @@ HumanClientApp::GetApp()->Orders().IssueOrder( OrderPtr(new ResearchQueueOrder(HumanClientApp::GetApp()->EmpireID(), boost::polymorphic_downcast<QueueRow*>(*it)->tech->Name()))); - UpdateQueue(); - UpdateInfoPanel(); m_tech_tree_wnd->Update(); } Modified: trunk/FreeOrion/UI/ResearchWnd.h =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.h 2009-05-17 04:02:16 UTC (rev 3054) +++ trunk/FreeOrion/UI/ResearchWnd.h 2009-05-18 03:42:03 UTC (rev 3055) @@ -20,6 +20,7 @@ //@} /** \name Mutators */ //@{ + void InitTurn(); void Reset(); void Update(); void CenterOnTech(const std::string& tech_name); @@ -30,6 +31,7 @@ //@} private: + void ResearchQueueChangedSlot(); void UpdateQueue(); void UpdateInfoPanel(); ///< Updates research summary at top left of production screen, and signals that the empire's minerals research pool has changed (propegates to the mapwnd to update indicator) void AddTechToQueueSlot(const Tech* tech); Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2009-05-17 04:02:16 UTC (rev 3054) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2009-05-18 03:42:03 UTC (rev 3055) @@ -1210,7 +1210,7 @@ if (empire->TechResearched(m_tech->Name())) { known_tech = true; } else { - ResearchQueue queue = empire->GetResearchQueue(); + const ResearchQueue& queue = empire->GetResearchQueue(); if (queue.InQueue(m_tech)) queued_tech = true; double rps_spent = empire->ResearchStatus(m_tech->Name()); Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2009-05-17 04:02:16 UTC (rev 3054) +++ trunk/FreeOrion/util/Order.cpp 2009-05-18 03:42:03 UTC (rev 3055) @@ -567,6 +567,10 @@ throw std::runtime_error("Empire attempted to issue change planet focus to another's planet."); m_primary ? planet->SetPrimaryFocus(m_focus) : planet->SetSecondaryFocus(m_focus); + + Empire* empire = Empires().Lookup(EmpireID()); + empire->UpdateResearchQueue(); + empire->UpdateProductionQueue(); } //////////////////////////////////////////////// |