From: <tz...@us...> - 2006-02-13 04:07:49
|
Revision: 1752 Author: tzlaine Date: 2006-02-12 20:07:31 -0800 (Sun, 12 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1752&view=rev Log Message: ----------- Changed the height of the SidePanel system droplist to be integral height, and to be either the minimimum height to show all systems, or 10 names tall, whichever is less. Modified Paths: -------------- trunk/FreeOrion/UI/GalaxySetupWnd.cpp trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/GalaxySetupWnd.cpp =================================================================== --- trunk/FreeOrion/UI/GalaxySetupWnd.cpp 2006-02-13 03:43:43 UTC (rev 1751) +++ trunk/FreeOrion/UI/GalaxySetupWnd.cpp 2006-02-13 04:07:31 UTC (rev 1752) @@ -45,7 +45,7 @@ const int DROPLIST_WIDTH = LABELS_WIDTH; const int DROPLIST_HEIGHT = ClientUI::PTS + 4; const int TEXT_ROW_HEIGHT = CUISimpleDropDownListRow::DEFAULT_ROW_HEIGHT; - const int MAX_DROPLIST_DROP_HEIGHT = CUISimpleDropDownListRow::DEFAULT_ROW_HEIGHT * 5; + const int MAX_DROPLIST_DROP_HEIGHT = TEXT_ROW_HEIGHT * 5; const int TOTAL_LISTBOX_MARGIN = 4; int row = -1; Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2006-02-13 03:43:43 UTC (rev 1751) +++ trunk/FreeOrion/UI/SidePanel.cpp 2006-02-13 04:07:31 UTC (rev 1752) @@ -1490,6 +1490,7 @@ std::vector<const System*> sys_vec = GetUniverse().FindObjects<const System>(); GG::ListBox::Row *select_row=0; + int system_names_in_droplist = 0; for (unsigned int i = 0; i < sys_vec.size(); i++) { GG::ListBox::Row *row = new SystemRow(sys_vec[i]->ID()); @@ -1499,10 +1500,16 @@ row->push_back(boost::io::str(boost::format(UserString("SP_SYSTEM_NAME")) % sys_vec[i]->Name()), ClientUI::FONT,static_cast<int>(ClientUI::PTS*1.4), ClientUI::TEXT_COLOR); m_system_name->Insert(row); + ++system_names_in_droplist; if(sys_vec[i]->ID() == system_id) select_row = row; } + const int TEXT_ROW_HEIGHT = CUISimpleDropDownListRow::DEFAULT_ROW_HEIGHT; + const int MAX_DROPLIST_DROP_HEIGHT = TEXT_ROW_HEIGHT * 10; + const int TOTAL_LISTBOX_MARGIN = 4; + int drop_height = std::min(TEXT_ROW_HEIGHT * system_names_in_droplist, MAX_DROPLIST_DROP_HEIGHT) + TOTAL_LISTBOX_MARGIN; + m_system_name->SetDropHeight(drop_height); for (int i = 0; i < m_system_name->NumRows(); i++) if(select_row == &m_system_name->GetRow(i)) |
From: <tz...@us...> - 2006-02-14 01:59:42
|
Revision: 1753 Author: tzlaine Date: 2006-02-13 17:59:26 -0800 (Mon, 13 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1753&view=rev Log Message: ----------- - Fixed broken TechTreeWnd::CenterOnTech(). - Added drop-indicators to the Research and Production queues. Also changed the placement of dropped items slightly, since the drop indicator makes the position of each drop so much clearer (the drop location was being altered slightly so that it seemed more natural). Modified Paths: -------------- trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/UI/ResearchWnd.cpp trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-13 04:07:31 UTC (rev 1752) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-14 01:59:26 UTC (rev 1753) @@ -558,7 +558,7 @@ if (m_read_only || row_index < 0 || NumRows() <= row_index) return; - + FleetDataPanel* fleet_data_panel = static_cast<FleetDataPanel*>((*static_cast<FleetRow*>(&GetRow(row_index)))[0]); if (!fleet_data_panel->Selected()) { bool valid_drop = true; Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2006-02-13 04:07:31 UTC (rev 1752) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2006-02-14 01:59:26 UTC (rev 1753) @@ -37,7 +37,8 @@ public: QueueListBox(int x, int y, int w, int h, ProductionWnd* production_wnd) : CUIListBox(x, y, w, h), - m_production_wnd(production_wnd) + m_production_wnd(production_wnd), + m_drop_point(-1) {} // HACK! This is sort of a dirty trick, but we return false here in all cases, even when we accept the dropped // item. This keeps things simpler than if we handled ListBox::DroppedRow signals, since we are explicitly @@ -56,16 +57,46 @@ } assert(original_row_idx != -1); int row_idx = RowUnderPt(pt); - if (original_row_idx < row_idx) - ++row_idx; if (row_idx < 0 || row_idx > NumRows()) row_idx = NumRows(); m_production_wnd->QueueItemMoved(row_idx, row); } wnds.clear(); } + virtual void Render() + { + ListBox::Render(); + if (m_drop_point != -1) { + GG::ListBox::Row& row = GetRow(m_drop_point == NumRows() ? NumRows() - 1 : m_drop_point); + GG::Pt row_ul = row.UpperLeft(), row_lr = row.LowerRight(); + if (m_drop_point == NumRows()) + row_ul.y = row_lr.y; + GG::FlatRectangle(row_ul.x, row_ul.y, row_lr.x, row_ul.y + 1, GG::CLR_ZERO, GG::CLR_WHITE, 1); + } + } + virtual void DragDropEnter(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) + { + DragDropHere(pt, drag_drop_wnds, keys); + } + virtual void DragDropHere(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) + { + if (drag_drop_wnds.size() == 1 && drag_drop_wnds.begin()->first->DragDropDataType() == "PRODUCTION_QUEUE_ROW") { + m_drop_point = RowUnderPt(pt); + if (m_drop_point < 0) + m_drop_point = 0; + if (NumRows() < m_drop_point) + m_drop_point = NumRows(); + } else { + m_drop_point = -1; + } + } + virtual void DragDropLeave(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) + { + m_drop_point = -1; + } private: ProductionWnd* m_production_wnd; + int m_drop_point; }; ////////////////////////////////////////////////// Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2006-02-13 04:07:31 UTC (rev 1752) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2006-02-14 01:59:26 UTC (rev 1753) @@ -37,7 +37,8 @@ public: QueueListBox(int x, int y, int w, int h, ResearchWnd* research_wnd) : CUIListBox(x, y, w, h), - m_research_wnd(research_wnd) + m_research_wnd(research_wnd), + m_drop_point(-1) {} // HACK! This is sort of a dirty trick, but we return false here in all cases, even when we accept the dropped // item. This keeps things simpler than if we handled ListBox::DroppedRow signals, since we are explicitly @@ -56,16 +57,46 @@ } assert(original_row_idx != -1); int row_idx = RowUnderPt(pt); - if (original_row_idx < row_idx) - ++row_idx; if (row_idx < 0 || row_idx > NumRows()) row_idx = NumRows(); m_research_wnd->QueueItemMoved(row_idx, row); } wnds.clear(); } + virtual void Render() + { + ListBox::Render(); + if (m_drop_point != -1) { + GG::ListBox::Row& row = GetRow(m_drop_point == NumRows() ? NumRows() - 1 : m_drop_point); + GG::Pt row_ul = row.UpperLeft(), row_lr = row.LowerRight(); + if (m_drop_point == NumRows()) + row_ul.y = row_lr.y; + GG::FlatRectangle(row_ul.x, row_ul.y, row_lr.x, row_ul.y + 1, GG::CLR_ZERO, GG::CLR_WHITE, 1); + } + } + virtual void DragDropEnter(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) + { + DragDropHere(pt, drag_drop_wnds, keys); + } + virtual void DragDropHere(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) + { + if (drag_drop_wnds.size() == 1 && drag_drop_wnds.begin()->first->DragDropDataType() == "RESEARCH_QUEUE_ROW") { + m_drop_point = RowUnderPt(pt); + if (m_drop_point < 0) + m_drop_point = 0; + if (NumRows() < m_drop_point) + m_drop_point = NumRows(); + } else { + m_drop_point = -1; + } + } + virtual void DragDropLeave(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) + { + m_drop_point = -1; + } private: ResearchWnd* m_research_wnd; + int m_drop_point; }; ////////////////////////////////////////////////// Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2006-02-13 04:07:31 UTC (rev 1752) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2006-02-14 01:59:26 UTC (rev 1753) @@ -1350,7 +1350,7 @@ std::map<const Tech*, TechPanel*>::const_iterator it = m_techs.find(tech); if (it != m_techs.end()) { TechPanel* tech_panel = it->second; - GG::Pt center_point = tech_panel->RelativeUpperLeft() + GG::Pt(tech_panel->Width() / 2, tech_panel->Height() / 2) + m_scroll_position; + GG::Pt center_point = tech_panel->RelativeUpperLeft() + GG::Pt(tech_panel->Width() / 2, tech_panel->Height() / 2); GG::Pt client_size = ClientSize(); m_hscroll->ScrollTo(center_point.x - client_size.x / 2); m_vscroll->ScrollTo(center_point.y - client_size.y / 2); |
From: <tz...@us...> - 2006-02-17 15:49:31
|
Revision: 1755 Author: tzlaine Date: 2006-02-17 07:49:27 -0800 (Fri, 17 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1755&view=rev Log Message: ----------- Muted sounds that were erroneously being played even when UI sounds were turned off. Modified Paths: -------------- trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/OptionsWnd.cpp Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2006-02-15 00:21:28 UTC (rev 1754) +++ trunk/FreeOrion/UI/CUIControls.cpp 2006-02-17 15:49:27 UTC (rev 1755) @@ -505,7 +505,9 @@ void CUIScroll::ScrollTab::MouseEnter(const GG::Pt& pt, Uint32 keys) { if (!m_being_dragged && !m_mouse_here) { - HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() + GetOptionsDB().Get<std::string>("UI.sound.button-rollover")); +#ifndef FREEORION_BUILD_UTIL + if (PlaySounds()) HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() + GetOptionsDB().Get<std::string>("UI.sound.button-rollover")); +#endif m_mouse_here = true; } } @@ -629,7 +631,9 @@ void CUIDropDownList::MouseEnter(const GG::Pt& pt, Uint32 keys) { - HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() + GetOptionsDB().Get<std::string>("UI.sound.button-rollover")); +#ifndef FREEORION_BUILD_UTIL + if (PlaySounds()) HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() + GetOptionsDB().Get<std::string>("UI.sound.button-rollover")); +#endif m_mouse_here = true; } Modified: trunk/FreeOrion/UI/OptionsWnd.cpp =================================================================== --- trunk/FreeOrion/UI/OptionsWnd.cpp 2006-02-15 00:21:28 UTC (rev 1754) +++ trunk/FreeOrion/UI/OptionsWnd.cpp 2006-02-17 15:49:27 UTC (rev 1755) @@ -787,7 +787,8 @@ { GetOptionsDB().Set("UI.sound.volume", pos); HumanClientApp::GetApp()->SetUISoundsVolume(pos); - HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() + GetOptionsDB().Get<std::string>("UI.sound.button-click")); + if (GetOptionsDB().Get<bool>("UI.sound.enabled")) + HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() + GetOptionsDB().Get<std::string>("UI.sound.button-click")); } void OptionsWnd::TextFont(int selection) |
From: <tz...@us...> - 2006-02-17 16:43:50
|
Revision: 1756 Author: tzlaine Date: 2006-02-17 08:43:45 -0800 (Fri, 17 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1756&view=rev Log Message: ----------- Changed the signatures of *::MouseLeave() and *::DragDropLeave() to keep in synch with recent GG changes. Modified Paths: -------------- trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/CUIControls.h trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/UI/FocusSelector.cpp trunk/FreeOrion/UI/FocusSelector.h trunk/FreeOrion/UI/LinkText.cpp trunk/FreeOrion/UI/LinkText.h trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/UI/ResearchWnd.cpp trunk/FreeOrion/UI/SystemIcon.cpp trunk/FreeOrion/UI/SystemIcon.h trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2006-02-17 15:49:27 UTC (rev 1755) +++ trunk/FreeOrion/UI/CUIControls.cpp 2006-02-17 16:43:45 UTC (rev 1756) @@ -391,7 +391,7 @@ m_mouse_here = true; } -void CUIStateButton::MouseLeave(const GG::Pt& pt, Uint32 keys) +void CUIStateButton::MouseLeave() { m_mouse_here = false; } @@ -512,7 +512,7 @@ } } -void CUIScroll::ScrollTab::MouseLeave(const GG::Pt& pt, Uint32 keys) +void CUIScroll::ScrollTab::MouseLeave() { if (!m_being_dragged) m_mouse_here = false; @@ -637,7 +637,7 @@ m_mouse_here = true; } -void CUIDropDownList::MouseLeave(const GG::Pt& pt, Uint32 keys) +void CUIDropDownList::MouseLeave() { m_mouse_here = false; } Modified: trunk/FreeOrion/UI/CUIControls.h =================================================================== --- trunk/FreeOrion/UI/CUIControls.h 2006-02-17 15:49:27 UTC (rev 1755) +++ trunk/FreeOrion/UI/CUIControls.h 2006-02-17 16:43:45 UTC (rev 1756) @@ -149,7 +149,7 @@ /** \name Mutators */ //@{ virtual void Render(); virtual void MouseEnter(const GG::Pt& pt, Uint32 keys); - virtual void MouseLeave(const GG::Pt& pt, Uint32 keys); + virtual void MouseLeave(); //@} private: @@ -173,7 +173,7 @@ virtual void LButtonUp(const GG::Pt& pt, Uint32 keys); virtual void LClick(const GG::Pt& pt, Uint32 keys); virtual void MouseEnter(const GG::Pt& pt, Uint32 keys); - virtual void MouseLeave(const GG::Pt& pt, Uint32 keys); + virtual void MouseLeave(); private: GG::Clr m_border_color; GG::Orientation m_orientation; @@ -229,7 +229,7 @@ virtual void Render(); virtual void LClick(const GG::Pt& pt, Uint32 keys); virtual void MouseEnter(const GG::Pt& pt, Uint32 keys); - virtual void MouseLeave(const GG::Pt& pt, Uint32 keys); + virtual void MouseLeave(); void DisableDropArrow(); ///< disables rendering of the small downward-facing arrow on the right of the control void EnableDropArrow(); ///< enables rendering of the small downward-facing arrow on the right of the control Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-17 15:49:27 UTC (rev 1755) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-17 16:43:45 UTC (rev 1756) @@ -38,7 +38,7 @@ virtual void Render(); virtual void DragDropEnter(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys); - virtual void DragDropLeave(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys); + virtual void DragDropLeave(); virtual void AcceptDrops(std::list<Wnd*>& wnds, const GG::Pt& pt); void Select(bool b); @@ -309,7 +309,7 @@ } } -void FleetDataPanel::DragDropLeave(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) +void FleetDataPanel::DragDropLeave() { Select(false); } @@ -583,7 +583,7 @@ } } - virtual void DragDropLeave(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) + virtual void DragDropLeave() { ClearSelection(); } Modified: trunk/FreeOrion/UI/FocusSelector.cpp =================================================================== --- trunk/FreeOrion/UI/FocusSelector.cpp 2006-02-17 15:49:27 UTC (rev 1755) +++ trunk/FreeOrion/UI/FocusSelector.cpp 2006-02-17 16:43:45 UTC (rev 1756) @@ -70,7 +70,7 @@ m_mouse_here = true; } -void FocusButton::MouseLeave(const GG::Pt& pt, Uint32 keys) +void FocusButton::MouseLeave() { m_mouse_here = false; } @@ -255,7 +255,7 @@ m_mouse_here = true; } -void FocusSelector::MouseLeave(const GG::Pt& pt, Uint32 keys) +void FocusSelector::MouseLeave() { m_mouse_here = false; } Modified: trunk/FreeOrion/UI/FocusSelector.h =================================================================== --- trunk/FreeOrion/UI/FocusSelector.h 2006-02-17 15:49:27 UTC (rev 1755) +++ trunk/FreeOrion/UI/FocusSelector.h 2006-02-17 16:43:45 UTC (rev 1756) @@ -16,7 +16,7 @@ virtual void Render(); virtual void RClick(const GG::Pt& pt, Uint32 keys); virtual void MouseEnter(const GG::Pt& pt, Uint32 keys); - virtual void MouseLeave(const GG::Pt& pt, Uint32 keys); + virtual void MouseLeave(); void SetImage(const boost::shared_ptr<GG::Texture>& image); mutable ClickedSignalType RightClickedSignal; @@ -54,7 +54,7 @@ virtual void LClick(const GG::Pt& pt, Uint32 keys); virtual void RClick(const GG::Pt& pt, Uint32 keys); virtual void MouseEnter(const GG::Pt& pt, Uint32 keys); - virtual void MouseLeave(const GG::Pt& pt, Uint32 keys); + virtual void MouseLeave(); void Update(const ResourceCenter& resource_center); mutable FocusChangedSignalType PrimaryFocusChangedSignal; Modified: trunk/FreeOrion/UI/LinkText.cpp =================================================================== --- trunk/FreeOrion/UI/LinkText.cpp 2006-02-17 15:49:27 UTC (rev 1755) +++ trunk/FreeOrion/UI/LinkText.cpp 2006-02-17 16:43:45 UTC (rev 1756) @@ -103,7 +103,7 @@ } } -void LinkText::MouseLeave(const GG::Pt& pt, Uint32 keys) +void LinkText::MouseLeave() { ClearOldRollover(); } Modified: trunk/FreeOrion/UI/LinkText.h =================================================================== --- trunk/FreeOrion/UI/LinkText.h 2006-02-17 15:49:27 UTC (rev 1755) +++ trunk/FreeOrion/UI/LinkText.h 2006-02-17 16:43:45 UTC (rev 1756) @@ -59,7 +59,7 @@ virtual void LButtonUp(const GG::Pt& pt, Uint32 keys); virtual void LClick(const GG::Pt& pt, Uint32 keys); virtual void MouseHere(const GG::Pt& pt, Uint32 keys); - virtual void MouseLeave(const GG::Pt& pt, Uint32 keys); + virtual void MouseLeave(); /** sets the text to \a str; may resize the window. If the window was constructed to fit the size of the text (i.e. if the second ctor type was used), calls to this function cause the window to be resized to whatever Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2006-02-17 15:49:27 UTC (rev 1755) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2006-02-17 16:43:45 UTC (rev 1756) @@ -90,7 +90,7 @@ m_drop_point = -1; } } - virtual void DragDropLeave(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) + virtual void DragDropLeave() { m_drop_point = -1; } Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2006-02-17 15:49:27 UTC (rev 1755) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2006-02-17 16:43:45 UTC (rev 1756) @@ -90,7 +90,7 @@ m_drop_point = -1; } } - virtual void DragDropLeave(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) + virtual void DragDropLeave() { m_drop_point = -1; } Modified: trunk/FreeOrion/UI/SystemIcon.cpp =================================================================== --- trunk/FreeOrion/UI/SystemIcon.cpp 2006-02-17 15:49:27 UTC (rev 1755) +++ trunk/FreeOrion/UI/SystemIcon.cpp 2006-02-17 16:43:45 UTC (rev 1756) @@ -138,7 +138,7 @@ MouseEnteringSignal(m_system.ID()); } -void SystemIcon::MouseLeave(const GG::Pt& pt, Uint32 keys) +void SystemIcon::MouseLeave() { m_static_graphic->SetColor(m_default_star_color); MouseLeavingSignal(m_system.ID()); Modified: trunk/FreeOrion/UI/SystemIcon.h =================================================================== --- trunk/FreeOrion/UI/SystemIcon.h 2006-02-17 15:49:27 UTC (rev 1755) +++ trunk/FreeOrion/UI/SystemIcon.h 2006-02-17 16:43:45 UTC (rev 1756) @@ -60,7 +60,7 @@ virtual void RClick(const GG::Pt& pt, Uint32 keys); virtual void LDoubleClick(const GG::Pt& pt, Uint32 keys); virtual void MouseEnter(const GG::Pt& pt, Uint32 keys); - virtual void MouseLeave(const GG::Pt& pt, Uint32 keys); + virtual void MouseLeave(); void Refresh(); //!< sets up the icon's fleet buttons, generates fleet movement lines, etc. Should be called after an icon is attached to the map void ClickFleetButton(Fleet* fleet); //!< clicks the FleetButton containing \a fleet Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2006-02-17 15:49:27 UTC (rev 1755) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2006-02-17 16:43:45 UTC (rev 1756) @@ -372,7 +372,7 @@ virtual void MouseEnter(const GG::Pt& pt, Uint32 keys) {m_mouse_here = true;} - virtual void MouseLeave(const GG::Pt& pt, Uint32 keys) {m_mouse_here = false;} + virtual void MouseLeave() {m_mouse_here = false;} void SetSelected(bool s) {m_selected = s;} @@ -630,7 +630,7 @@ virtual void Render(); virtual void LClick(const GG::Pt& pt, Uint32 keys) {ClickedSignal(m_tech);} virtual void MouseEnter(const GG::Pt& pt, Uint32 keys) {m_selected = true;} - virtual void MouseLeave(const GG::Pt& pt, Uint32 keys) {m_selected = false;} + virtual void MouseLeave() {m_selected = false;} const Tech * const m_tech; GG::Clr m_border_color; GG::TextControl* m_name_text; |
From: <tz...@us...> - 2006-02-17 16:57:23
|
Revision: 1757 Author: tzlaine Date: 2006-02-17 08:57:18 -0800 (Fri, 17 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1757&view=rev Log Message: ----------- Moved the drop indicator line up one pixel, and limited it to the x-extent of the list items in ResearchWnd and ProductionWnd. Modified Paths: -------------- trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/UI/ResearchWnd.cpp Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2006-02-17 16:43:45 UTC (rev 1756) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2006-02-17 16:57:18 UTC (rev 1757) @@ -68,10 +68,13 @@ ListBox::Render(); if (m_drop_point != -1) { GG::ListBox::Row& row = GetRow(m_drop_point == NumRows() ? NumRows() - 1 : m_drop_point); - GG::Pt row_ul = row.UpperLeft(), row_lr = row.LowerRight(); + GG::Control* panel = row[0]; + GG::Pt ul = row.UpperLeft(), lr = row.LowerRight(); if (m_drop_point == NumRows()) - row_ul.y = row_lr.y; - GG::FlatRectangle(row_ul.x, row_ul.y, row_lr.x, row_ul.y + 1, GG::CLR_ZERO, GG::CLR_WHITE, 1); + ul.y = lr.y; + ul.x = panel->UpperLeft().x; + lr.x = panel->LowerRight().x; + GG::FlatRectangle(ul.x, ul.y - 1, lr.x, ul.y, GG::CLR_ZERO, GG::CLR_WHITE, 1); } } virtual void DragDropEnter(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2006-02-17 16:43:45 UTC (rev 1756) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2006-02-17 16:57:18 UTC (rev 1757) @@ -68,10 +68,13 @@ ListBox::Render(); if (m_drop_point != -1) { GG::ListBox::Row& row = GetRow(m_drop_point == NumRows() ? NumRows() - 1 : m_drop_point); - GG::Pt row_ul = row.UpperLeft(), row_lr = row.LowerRight(); + GG::Control* panel = row[0]; + GG::Pt ul = row.UpperLeft(), lr = row.LowerRight(); if (m_drop_point == NumRows()) - row_ul.y = row_lr.y; - GG::FlatRectangle(row_ul.x, row_ul.y, row_lr.x, row_ul.y + 1, GG::CLR_ZERO, GG::CLR_WHITE, 1); + ul.y = lr.y; + ul.x = panel->UpperLeft().x; + lr.x = panel->LowerRight().x; + GG::FlatRectangle(ul.x, ul.y - 1, lr.x, ul.y, GG::CLR_ZERO, GG::CLR_WHITE, 1); } } virtual void DragDropEnter(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) |
From: <tz...@us...> - 2006-02-19 04:40:52
|
Revision: 1763 Author: tzlaine Date: 2006-02-18 20:40:47 -0800 (Sat, 18 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1763&view=rev Log Message: ----------- Fixed an infinite recursion in CUIWnd::ResizeMove(), and fixed the resizing of FleetWnd's contents to be larger than the FleetWnd when the ETA text was too long (now it is cut off at the right edge of the FleetWnd). Modified Paths: -------------- trunk/FreeOrion/UI/CUIWnd.cpp trunk/FreeOrion/UI/FleetWnd.cpp Modified: trunk/FreeOrion/UI/CUIWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CUIWnd.cpp 2006-02-19 04:12:55 UTC (rev 1762) +++ trunk/FreeOrion/UI/CUIWnd.cpp 2006-02-19 04:40:47 UTC (rev 1763) @@ -179,22 +179,11 @@ } CUIWnd::~CUIWnd() -{ -} +{} void CUIWnd::SizeMove(const GG::Pt& ul, const GG::Pt& lr) { Wnd::SizeMove(ul, lr); - if (Width() < MinSize().x) - Resize(GG::Pt(MinSize().x, Height())); - if (MaxSize().x < Width()) - Resize(GG::Pt(MaxSize().x, Height())); - - if (Height() < MinSize().y) - Resize(GG::Pt(Width(), MinSize().y)); - if (MaxSize().y < Height()) - Resize(GG::Pt(Width(), MaxSize().y)); - GG::Pt button_ul = GG::Pt(Width() - BUTTON_RIGHT_OFFSET, BUTTON_TOP_OFFSET) + UpperLeft() - ClientUpperLeft(); if (m_close_button) m_close_button->MoveTo(GG::Pt(button_ul.x, button_ul.y)); Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-19 04:12:55 UTC (rev 1762) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-19 04:40:47 UTC (rev 1763) @@ -655,6 +655,7 @@ m_ship_status_text(0) { SetText("FleetDetailPanel"); + EnableChildClipping(true); m_destination_text = new GG::TextControl(0, 0, FLEET_LISTBOX_WIDTH, ClientUI::PTS + 4, "temp", GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS), ClientUI::TEXT_COLOR, GG::TF_LEFT); m_ships_lb = new ShipsListBox(0, m_destination_text->LowerRight().y + CONTROL_MARGIN, FLEET_LISTBOX_WIDTH, FLEET_LISTBOX_HEIGHT, 0, read_only); @@ -668,6 +669,8 @@ m_destination_text->SetText(""); m_ship_status_text->SetText(""); + m_destination_text->SetMinSize(false); + m_ship_status_text->SetMinSize(false); SetFleet(fleet); Init(); |
From: <tz...@us...> - 2006-02-23 00:32:55
|
Revision: 1769 Author: tzlaine Date: 2006-02-22 16:32:43 -0800 (Wed, 22 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1769&view=rev Log Message: ----------- Added Empire-serialization code. Everything is implemented except for Effects serialization needed by modified Building definitions in the Empires. The serialization code has been stability tested, but its output has not been validated. Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/Empire/Empire.h trunk/FreeOrion/Empire/EmpireManager.h trunk/FreeOrion/Empire/ResourcePool.h trunk/FreeOrion/UI/ResearchWnd.cpp trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/universe/Building.h trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/Universe.h trunk/FreeOrion/util/SitRepEntry.h trunk/FreeOrion/util/VarText.h Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2006-02-22 13:58:27 UTC (rev 1768) +++ trunk/FreeOrion/Empire/Empire.cpp 2006-02-23 00:32:43 UTC (rev 1769) @@ -26,21 +26,21 @@ total_RPs_spent = 0.0; projects_in_progress = 0; for (ResearchQueue::iterator it = queue.begin(); it != queue.end(); ++it) { - const Tech* tech = it->get<0>(); + const Tech* tech = it->tech; std::map<std::string, double>::const_iterator progress_it = research_status.find(tech->Name()); double progress = progress_it == research_status.end() ? 0.0 : progress_it->second; double RPs_needed = tech->ResearchCost() * tech->ResearchTurns() - progress; double RPs_to_spend = std::min(RPs_needed, tech->ResearchCost()); if (total_RPs_spent + RPs_to_spend <= RPs - EPSILON) { - it->get<1>() = RPs_to_spend; - total_RPs_spent += it->get<1>(); + it->spending = RPs_to_spend; + total_RPs_spent += it->spending; ++projects_in_progress; } else if (total_RPs_spent < RPs - EPSILON) { - it->get<1>() = RPs - total_RPs_spent; - total_RPs_spent += it->get<1>(); + it->spending = RPs - total_RPs_spent; + total_RPs_spent += it->spending; ++projects_in_progress; } else { - it->get<1>() = 0.0; + it->spending = 0.0; } } } @@ -78,6 +78,22 @@ //////////////////////////////////////// +// ResearchQueue::Element // +//////////////////////////////////////// +ResearchQueue::Element::Element() : + tech(0), + spending(0.0), + turns_left(0) +{} + +ResearchQueue::Element::Element(const Tech* tech_, double spending_, int turns_left_) : + tech(tech_), + spending(spending_), + turns_left(turns_left_) +{} + + +//////////////////////////////////////// // ResearchQueue // //////////////////////////////////////// ResearchQueue::ResearchQueue() : @@ -137,7 +153,7 @@ ResearchQueue::const_iterator ResearchQueue::find(const Tech* tech) const { for (const_iterator it = begin(); it != end(); ++it) { - if (it->get<0>() == tech) + if (it->tech == tech) return it; } return end(); @@ -146,7 +162,7 @@ ResearchQueue::const_iterator ResearchQueue::UnderfundedProject() const { for (const_iterator it = begin(); it != end(); ++it) { - if (it->get<1>() && it->get<1>() < it->get<0>()->ResearchCost() && 1 < it->get<2>()) + if (it->spending && it->spending < it->tech->ResearchCost() && 1 < it->turns_left) return it; } return end(); @@ -157,7 +173,7 @@ XMLElement retval("ResearchQueue"); retval.AppendChild("m_queue"); for (unsigned int i = 0; i < m_queue.size(); ++i) { - retval.LastChild().AppendChild(m_queue[i].get<0>()->Name()); + retval.LastChild().AppendChild(m_queue[i].tech->Name()); } return retval; } @@ -177,9 +193,9 @@ int projects_in_progress = 0; UpdateTechQueue(RPs, sim_research_status, sim_queue, total_RPs_spent, projects_in_progress); for (unsigned int i = 0; i < sim_queue.size(); ++i) { - const Tech* tech = sim_queue[i].get<0>(); + const Tech* tech = sim_queue[i].tech; double& status = sim_research_status[tech->Name()]; - status += sim_queue[i].get<1>(); + status += sim_queue[i].spending; if (tech->ResearchCost() * tech->ResearchTurns() - EPSILON <= status) { simulation_results[tech] = turns; sim_queue.erase(sim_queue.begin() + i--); @@ -188,12 +204,12 @@ ++turns; } for (unsigned int i = 0; i < m_queue.size(); ++i) { - m_queue[i].get<2>() = simulation_results[m_queue[i].get<0>()]; + m_queue[i].turns_left = simulation_results[m_queue[i].tech]; } } else { // since there are so few RPs, indicate that the number of turns left is indeterminate by providing a number < 0 for (unsigned int i = 0; i < m_queue.size(); ++i) { - m_queue[i].get<2>() = -1; + m_queue[i].turns_left = -1; } } } @@ -217,7 +233,7 @@ ResearchQueue::iterator ResearchQueue::find(const Tech* tech) { for (iterator it = begin(); it != end(); ++it) { - if (it->get<0>() == tech) + if (it->tech == tech) return it; } return end(); @@ -236,7 +252,7 @@ ResearchQueue::iterator ResearchQueue::UnderfundedProject() { for (iterator it = begin(); it != end(); ++it) { - if (it->get<1>() && it->get<1>() < it->get<0>()->ResearchCost() && 1 < it->get<2>()) + if (it->spending && it->spending < it->tech->ResearchCost() && 1 < it->turns_left) return it; } return end(); @@ -1057,9 +1073,9 @@ m_research_queue.Update(m_research_resource_pool.Production(), m_research_status); std::vector<const Tech*> to_erase; for (ResearchQueue::iterator it = m_research_queue.begin(); it != m_research_queue.end(); ++it) { - const Tech* tech = it->get<0>(); + const Tech* tech = it->tech; double& status = m_research_status[tech->Name()]; - status += it->get<1>(); + status += it->spending; if (tech->ResearchCost() * tech->ResearchTurns() - EPSILON <= status) { m_techs.insert(tech->Name()); const std::vector<Tech::ItemSpec>& unlocked_items = tech->UnlockedItems(); Modified: trunk/FreeOrion/Empire/Empire.h =================================================================== --- trunk/FreeOrion/Empire/Empire.h 2006-02-22 13:58:27 UTC (rev 1768) +++ trunk/FreeOrion/Empire/Empire.h 2006-02-23 00:32:43 UTC (rev 1769) @@ -22,8 +22,6 @@ #include "../util/XMLDoc.h" #endif -#include <boost/tuple/tuple.hpp> - #include <deque> #include <list> #include <string> @@ -33,10 +31,22 @@ struct ResearchQueue { - /** The type of a single element in the research queue. Such an element includes the tech itself, the - spending being done on this tech, and the number of turns until this tech is completed. */ - typedef boost::tuple<const Tech*, double, int> Element; + /** The type of a single element in the research queue. */ + struct Element + { + Element(); ///< default ctor. + Element(const Tech* tech_, double spending_, int turns_left_); ///< basic ctor. + const Tech* tech; + double spending; + int turns_left; + + private: + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); + }; + typedef std::deque<Element> QueueType; /** The ResearchQueue iterator type. Dereference yields a Element. */ @@ -91,6 +101,10 @@ QueueType m_queue; int m_projects_in_progress; double m_total_RPs_spent; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); }; struct ProductionQueue @@ -106,6 +120,11 @@ BuildType build_type; std::string name; + + private: + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); }; /** The type of a single element in the production queue. */ @@ -125,6 +144,11 @@ double spending; int turns_left_to_next_item; int turns_left_to_completion; + + private: + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); }; typedef std::deque<Element> QueueType; @@ -183,6 +207,10 @@ QueueType m_queue; int m_projects_in_progress; double m_total_PPs_spent; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); }; /** @@ -522,8 +550,94 @@ PopulationResourcePool m_population_resource_pool; IndustryResourcePool m_industry_resource_pool; TradeResourcePool m_trade_resource_pool; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); }; + +// template implementations +template <class Archive> +void ResearchQueue::Element::serialize(Archive& ar, const unsigned int version) +{ + std::string tech_name; + if (Archive::is_saving::value) { + assert(tech); + tech_name = tech->Name(); + } + ar & BOOST_SERIALIZATION_NVP(tech_name) + & BOOST_SERIALIZATION_NVP(spending) + & BOOST_SERIALIZATION_NVP(turns_left); + if (Archive::is_loading::value) { + assert(tech_name != ""); + tech = GetTech(tech_name); + } +} + +template <class Archive> +void ResearchQueue::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_NVP(m_queue) + & BOOST_SERIALIZATION_NVP(m_projects_in_progress) + & BOOST_SERIALIZATION_NVP(m_total_RPs_spent); +} + +template <class Archive> +void ProductionQueue::ProductionItem::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_NVP(build_type) + & BOOST_SERIALIZATION_NVP(name); +} + +template <class Archive> +void ProductionQueue::Element::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_NVP(item) + & BOOST_SERIALIZATION_NVP(ordered) + & BOOST_SERIALIZATION_NVP(remaining) + & BOOST_SERIALIZATION_NVP(location) + & BOOST_SERIALIZATION_NVP(spending) + & BOOST_SERIALIZATION_NVP(turns_left_to_next_item) + & BOOST_SERIALIZATION_NVP(turns_left_to_completion); +} + +template <class Archive> +void ProductionQueue::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_NVP(m_queue) + & BOOST_SERIALIZATION_NVP(m_projects_in_progress) + & BOOST_SERIALIZATION_NVP(m_total_PPs_spent); +} + +template <class Archive> +void Empire::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_NVP(m_id) + & BOOST_SERIALIZATION_NVP(m_name) + & BOOST_SERIALIZATION_NVP(m_player_name) + & BOOST_SERIALIZATION_NVP(m_color); + if (m_id == Universe::s_encoding_empire) { + ar & BOOST_SERIALIZATION_NVP(m_homeworld_id) + & BOOST_SERIALIZATION_NVP(m_techs) + & BOOST_SERIALIZATION_NVP(m_research_queue) + & BOOST_SERIALIZATION_NVP(m_research_status) + & BOOST_SERIALIZATION_NVP(m_production_queue) + & BOOST_SERIALIZATION_NVP(m_production_status) + & BOOST_SERIALIZATION_NVP(m_building_types) + & BOOST_SERIALIZATION_NVP(m_modified_building_types) + & BOOST_SERIALIZATION_NVP(m_explored_systems) + & BOOST_SERIALIZATION_NVP(m_ship_designs) + & BOOST_SERIALIZATION_NVP(m_sitrep_entries) + & BOOST_SERIALIZATION_NVP(m_mineral_resource_pool) + & BOOST_SERIALIZATION_NVP(m_food_resource_pool) + & BOOST_SERIALIZATION_NVP(m_research_resource_pool) + & BOOST_SERIALIZATION_NVP(m_population_resource_pool) + & BOOST_SERIALIZATION_NVP(m_industry_resource_pool) + & BOOST_SERIALIZATION_NVP(m_trade_resource_pool); + } +} + inline std::string EmpireRevision() {return "$Id$";} Modified: trunk/FreeOrion/Empire/EmpireManager.h =================================================================== --- trunk/FreeOrion/Empire/EmpireManager.h 2006-02-22 13:58:27 UTC (rev 1768) +++ trunk/FreeOrion/Empire/EmpireManager.h 2006-02-23 00:32:43 UTC (rev 1769) @@ -129,8 +129,18 @@ // map of IDs to empires for fast lookup std::map<int, Empire*> m_empire_map; + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); }; +// template implementations +template <class Archive> +void EmpireManager::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_NVP(m_empire_map); +} + inline std::string EmpireManagerRevision() {return "$Id$";} Modified: trunk/FreeOrion/Empire/ResourcePool.h =================================================================== --- trunk/FreeOrion/Empire/ResourcePool.h 2006-02-22 13:58:27 UTC (rev 1768) +++ trunk/FreeOrion/Empire/ResourcePool.h 2006-02-23 00:32:43 UTC (rev 1769) @@ -58,7 +58,12 @@ std::vector<boost::signals::connection > m_connections;///< connection list of planets friend class PlanetChangedFunctor<ResourcePool>; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); }; +BOOST_IS_ABSTRACT(ResourcePool) /** * Resource pool for minerals. @@ -82,6 +87,10 @@ private: double m_pool_production,m_needed_pool,m_stockpile; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); }; /** @@ -107,6 +116,10 @@ private: double m_pool_production,m_needed_pool,m_stockpile; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); }; /** @@ -127,6 +140,10 @@ private: double m_pool_production; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); }; /** @@ -148,6 +165,10 @@ private: double m_overall_pool,m_growth; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); }; /** @@ -168,6 +189,10 @@ private: double m_pool_production; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); }; /** @@ -193,6 +218,10 @@ private: double m_pool_production,m_needed_pool,m_stockpile; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); }; @@ -209,6 +238,49 @@ m_pool.OnPlanetChanged(m_planet_id); } +template <class Archive> +void ResourcePool::serialize(Archive& ar, const unsigned int version) +{} + +template <class Archive> +void MineralResourcePool::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ResourcePool) + & BOOST_SERIALIZATION_NVP(m_stockpile); +} + +template <class Archive> +void FoodResourcePool::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ResourcePool) + & BOOST_SERIALIZATION_NVP(m_stockpile); +} + +template <class Archive> +void ResearchResourcePool::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ResourcePool); +} + +template <class Archive> +void PopulationResourcePool::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ResourcePool); +} + +template <class Archive> +void IndustryResourcePool::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ResourcePool); +} + +template <class Archive> +void TradeResourcePool::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ResourcePool) + & BOOST_SERIALIZATION_NVP(m_stockpile); +} + inline std::string ResourcePoolRevision() {return "$Id$";} Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2006-02-22 13:58:27 UTC (rev 1768) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2006-02-23 00:32:43 UTC (rev 1769) @@ -270,7 +270,6 @@ void ResearchWnd::UpdateQueue() { - using boost::tuples::get; const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); const ResearchQueue& queue = empire->GetResearchQueue(); int first_visible_queue_row = m_queue_lb->FirstRowShown(); @@ -278,7 +277,7 @@ m_queue_lb->Clear(); const int QUEUE_WIDTH = m_queue_lb->Width() - 8 - 14; for (ResearchQueue::const_iterator it = queue.begin(); it != queue.end(); ++it) { - m_queue_lb->Insert(new QueueRow(QUEUE_WIDTH, get<0>(*it), get<1>(*it), get<2>(*it))); + m_queue_lb->Insert(new QueueRow(QUEUE_WIDTH, it->tech, it->spending, it->turns_left)); } m_queue_lb->BringRowIntoView(m_queue_lb->NumRows() - 1); if (m_queue_lb->NumRows() <= original_queue_length) @@ -292,7 +291,7 @@ double RPs = empire->ResearchResPool().Production(); double total_queue_cost = queue.TotalRPsSpent(); ResearchQueue::const_iterator underfunded_it = queue.UnderfundedProject(); - double RPs_to_underfunded_projects = underfunded_it == queue.end() ? 0.0 : underfunded_it->get<1>(); + double RPs_to_underfunded_projects = underfunded_it == queue.end() ? 0.0 : underfunded_it->spending; m_research_info_panel->Reset(RPs, total_queue_cost, queue.ProjectsInProgress(), RPs_to_underfunded_projects, queue.size()); } Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-02-22 13:58:27 UTC (rev 1768) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-02-23 00:32:43 UTC (rev 1769) @@ -796,7 +796,7 @@ m_universe.SetUniverse(doc.root_node.Child("Universe")); -#define TEST_UNIVERSE_BOOST_SERIALIZATION 1 +#define TEST_UNIVERSE_BOOST_SERIALIZATION 0 #if TEST_UNIVERSE_BOOST_SERIALIZATION Universe boost_xml_universe; namespace io = boost::iostreams; Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2006-02-22 13:58:27 UTC (rev 1768) +++ trunk/FreeOrion/server/ServerApp.cpp 2006-02-23 00:32:43 UTC (rev 1769) @@ -1,23 +1,30 @@ +#define TEST_BINARY_ARCHIVES 0 +#if TEST_BINARY_ARCHIVES +#include <boost/archive/binary_oarchive.hpp> +#include <boost/archive/binary_iarchive.hpp> +#else +#include <boost/archive/xml_oarchive.hpp> +#include <boost/archive/xml_iarchive.hpp> +#endif + #include "ServerApp.h" +#include "../combat/CombatSystem.h" #include "../network/Message.h" -#include "../util/XMLDoc.h" - #include "../universe/Building.h" -#include "../util/OrderSet.h" -#include "../util/GZStream.h" -#include "../util/Directories.h" #include "../universe/Effect.h" #include "../universe/Fleet.h" -#include "../util/MultiplayerCommon.h" -#include "../util/OptionsDB.h" #include "../universe/Planet.h" +#include "../universe/Predicates.h" #include "../universe/Special.h" #include "../universe/System.h" -#include "../universe/Predicates.h" +#include "../util/Directories.h" +#include "../util/GZStream.h" +#include "../util/MultiplayerCommon.h" +#include "../util/OptionsDB.h" +#include "../util/OrderSet.h" +#include "../util/XMLDoc.h" -#include "../combat/CombatSystem.h" - #include <GG/Font.h> #include <GG/net/fastevents.h> @@ -69,7 +76,39 @@ # define GZIP_SAVE_FILES_COMPRESSION_LEVEL 0 #endif +#include "../universe/ShipDesign.h" +#include <boost/iostreams/device/back_inserter.hpp> +#include <boost/iostreams/filtering_stream.hpp> +#include <boost/range/iterator_range.hpp> +#include <boost/serialization/export.hpp> +#include <boost/serialization/deque.hpp> +#include <boost/serialization/list.hpp> +#include <boost/serialization/map.hpp> +#include <boost/serialization/set.hpp> +#include <boost/serialization/vector.hpp> +#include <boost/static_assert.hpp> +// exports for boost serialization of polymorphic UniverseObject hierarchy +BOOST_CLASS_EXPORT(System) +BOOST_CLASS_EXPORT(Planet) +BOOST_CLASS_EXPORT(Building) +BOOST_CLASS_EXPORT(Fleet) +BOOST_CLASS_EXPORT(Ship) + +// some endianness and size checks to ensure portability of binary save files; of one or more of these fails, it means +// that FreeOrion is not supported on your platform/compiler pair, and must be modified to provide data of the +// appropriate size(s). +BOOST_STATIC_ASSERT(SDL_BYTEORDER == SDL_LIL_ENDIAN); +BOOST_STATIC_ASSERT(sizeof(char) == 1); +BOOST_STATIC_ASSERT(sizeof(short) == 2); +BOOST_STATIC_ASSERT(sizeof(int) == 4); +BOOST_STATIC_ASSERT(sizeof(Uint32) == 4); +BOOST_STATIC_ASSERT(sizeof(long) == 4); +BOOST_STATIC_ASSERT(sizeof(long long) == 8); +BOOST_STATIC_ASSERT(sizeof(float) == 4); +BOOST_STATIC_ASSERT(sizeof(double) == 8); + + namespace { const std::string SAVE_FILE_EXTENSION = ".mps"; const std::string SAVE_DIR_NAME = "save/"; @@ -185,8 +224,7 @@ address(addr), name(player_name), host(host_) -{ -} +{} @@ -1409,19 +1447,45 @@ void ServerApp::NewGameInit() { - std::map<int, PlayerInfo>::const_iterator it; - m_universe.CreateUniverse(m_galaxy_size, m_galaxy_shape, m_galaxy_age, m_starlane_freq, m_planet_density, m_specials_freq, m_network_core.Players().size() - m_ai_clients.size(), m_ai_clients.size(), g_lobby_data.players); m_log_category.debugStream() << "ServerApp::GameInit : Created universe " << " (SERVER_GAME_SETUP)."; // add empires to turn sequence map according to spec this should be done randomly for now it's not - for (it = m_network_core.Players().begin(); it != m_network_core.Players().end(); ++it) { + for (std::map<int, PlayerInfo>::const_iterator it = m_network_core.Players().begin(); it != m_network_core.Players().end(); ++it) { AddEmpireTurn( it->first ); } +#define TEST_UNIVERSE_BOOST_SERIALIZATION 1 +#if TEST_UNIVERSE_BOOST_SERIALIZATION + { + Universe::s_encoding_empire = Universe::ALL_EMPIRES; + std::string encoded_string; + { + namespace io = boost::iostreams; + io::filtering_ostream os; + os.push(io::back_inserter(encoded_string)); +#if TEST_BINARY_ARCHIVES + boost::archive::binary_oarchive oa(os); +#else + boost::archive::xml_oarchive oa(os); +#endif + const EmpireManager& empire_manager = m_empires; + oa << boost::serialization::make_nvp("single_player_game", m_single_player_game) + << BOOST_SERIALIZATION_NVP(m_universe) + << boost::serialization::make_nvp("m_empires", empire_manager); + } +#if TEST_BINARY_ARCHIVES + boost::filesystem::ofstream ofs(GetLocalDir() / ("NewGameUniverse-boost.bin")); +#else + boost::filesystem::ofstream ofs(GetLocalDir() / ("NewGameUniverse-boost.xml")); +#endif + ofs << encoded_string; + } +#endif + // the universe creation caused the creation of empires. But now we need to assign the empires to players. - for (it = m_network_core.Players().begin(); it != m_network_core.Players().end(); ++it) { + for (std::map<int, PlayerInfo>::const_iterator it = m_network_core.Players().begin(); it != m_network_core.Players().end(); ++it) { XMLDoc doc; if (m_single_player_game) doc.root_node.AppendChild("single_player_game"); @@ -1429,11 +1493,31 @@ doc.root_node.AppendChild(m_empires.CreateClientEmpireUpdate(it->first)); doc.root_node.AppendChild(XMLElement("empire_id", boost::lexical_cast<std::string>(it->first))); -#define TEST_UNIVERSE_BOOST_SERIALIZATION 1 #if TEST_UNIVERSE_BOOST_SERIALIZATION { + Universe::s_encoding_empire = it->first; + std::string encoded_string; + { + namespace io = boost::iostreams; + io::filtering_ostream os; + os.push(io::back_inserter(encoded_string)); +#if TEST_BINARY_ARCHIVES + boost::archive::binary_oarchive oa(os); +#else + boost::archive::xml_oarchive oa(os); +#endif + const EmpireManager& empire_manager = m_empires; + oa << boost::serialization::make_nvp("single_player_game", m_single_player_game) + << boost::serialization::make_nvp("m_empire_id", it->first) + << BOOST_SERIALIZATION_NVP(m_universe) + << boost::serialization::make_nvp("m_empires", empire_manager); + } +#if TEST_BINARY_ARCHIVES + boost::filesystem::ofstream ofs(GetLocalDir() / ("NewGameUniverse-empire" + boost::lexical_cast<std::string>(it->first) + "-boost.bin")); +#else boost::filesystem::ofstream ofs(GetLocalDir() / ("NewGameUniverse-empire" + boost::lexical_cast<std::string>(it->first) + "-boost.xml")); - ofs << m_universe.Encode(it->first); +#endif + ofs << encoded_string; } #endif Modified: trunk/FreeOrion/universe/Building.h =================================================================== --- trunk/FreeOrion/universe/Building.h 2006-02-22 13:58:27 UTC (rev 1768) +++ trunk/FreeOrion/universe/Building.h 2006-02-23 00:32:43 UTC (rev 1769) @@ -89,6 +89,10 @@ double m_maintenance_cost; std::vector<boost::shared_ptr<const Effect::EffectsGroup> > m_effects; std::string m_graphic; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); }; /** Returns the BuildingType specification object for a building of type \a name. If no such BuildingType @@ -106,6 +110,18 @@ & BOOST_SERIALIZATION_NVP(m_planet_id); } +template <class Archive> +void BuildingType::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_NVP(m_name) + & BOOST_SERIALIZATION_NVP(m_description) + & BOOST_SERIALIZATION_NVP(m_build_cost) + & BOOST_SERIALIZATION_NVP(m_build_time) + & BOOST_SERIALIZATION_NVP(m_maintenance_cost) + // TODO: & BOOST_SERIALIZATION_NVP(m_effects) + & BOOST_SERIALIZATION_NVP(m_graphic); +} + inline std::string BuildingRevision() {return "$Id$";} Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2006-02-22 13:58:27 UTC (rev 1768) +++ trunk/FreeOrion/universe/Universe.cpp 2006-02-23 00:32:43 UTC (rev 1769) @@ -33,46 +33,13 @@ # include <SDL_byteorder.h> #endif -#include <boost/archive/xml_oarchive.hpp> -#include <boost/archive/xml_iarchive.hpp> #include <boost/filesystem/fstream.hpp> #include <boost/graph/dijkstra_shortest_paths.hpp> #include <boost/graph/breadth_first_search.hpp> -#include <boost/iostreams/device/back_inserter.hpp> -#include <boost/iostreams/filtering_stream.hpp> -#include <boost/range/iterator_range.hpp> -#include <boost/serialization/export.hpp> -#include <boost/serialization/list.hpp> -#include <boost/serialization/map.hpp> -#include <boost/serialization/set.hpp> -#include <boost/serialization/vector.hpp> -#include <boost/static_assert.hpp> -#include <boost/tuple/tuple.hpp> #include <cmath> #include <stdexcept> - -// exports for boost serialization of polymorphic UniverseObject hierarchy -BOOST_CLASS_EXPORT(System) -BOOST_CLASS_EXPORT(Planet) -BOOST_CLASS_EXPORT(Building) -BOOST_CLASS_EXPORT(Fleet) -BOOST_CLASS_EXPORT(Ship) - -// some endianness and size checks to ensure portability of binary save files; of one or more of these fails, it means -// that FreeOrion is not supported on your platform/compiler pair, and must be modified to provide data of the -// appropriate size(s). -BOOST_STATIC_ASSERT(SDL_BYTEORDER == SDL_LIL_ENDIAN); -BOOST_STATIC_ASSERT(sizeof(char) == 1); -BOOST_STATIC_ASSERT(sizeof(short) == 2); -BOOST_STATIC_ASSERT(sizeof(int) == 4); -BOOST_STATIC_ASSERT(sizeof(Uint32) == 4); -BOOST_STATIC_ASSERT(sizeof(long) == 4); -BOOST_STATIC_ASSERT(sizeof(long long) == 8); -BOOST_STATIC_ASSERT(sizeof(float) == 4); -BOOST_STATIC_ASSERT(sizeof(double) == 8); - namespace { // for UniverseObject factory UniverseObject* NewBuilding(const XMLElement& elem) {return new Building(elem);} @@ -974,14 +941,6 @@ InitializeSystemGraph(); } -void Universe::SetUniverse(boost::iostreams::filtering_istream& is) -{ - boost::archive::xml_iarchive ia(is); - Universe tmp; - ia >> boost::serialization::make_nvp("universe", tmp); - *this = tmp; -} - const UniverseObject* Universe::Object(int id) const { const_iterator it = m_objects.find(id); @@ -1083,20 +1042,6 @@ return retval; } -std::string Universe::Encode(int empire_id/* = ALL_EMPIRES*/) const -{ - std::string retval; - s_encoding_empire = empire_id; - { - namespace io = boost::iostreams; - io::filtering_ostream os; - os.push(io::back_inserter(retval)); - boost::archive::xml_oarchive oa(os); - oa << boost::serialization::make_nvp("universe", *this); - } - return retval; -} - void Universe::CreateUniverse(int size, Shape shape, Age age, StarlaneFrequency starlane_freq, PlanetDensity planet_density, SpecialsFrequency specials_freq, int players, int ai_players, const std::vector<PlayerSetupData>& player_setup_data/* = std::vector<PlayerSetupData>()*/) Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2006-02-22 13:58:27 UTC (rev 1768) +++ trunk/FreeOrion/universe/Universe.h 2006-02-23 00:32:43 UTC (rev 1769) @@ -145,7 +145,7 @@ /** \name Structors */ //@{ Universe(); ///< default ctor Universe(const XMLElement& elem); ///< ctor that constructs a Universe object from an XMLElement. \throw std::invalid_argument May throw std::invalid_argument if \a elem does not encode a Universe object - const Universe& operator=(Universe& rhs); ///< assignment (move semantics) + const Universe& operator=(Universe& rhs); ///< assignment operator (move semantics) virtual ~Universe(); ///< dtor //@} @@ -203,14 +203,12 @@ std::map<double, System*> ImmediateNeighbors(int system, int empire_id = ALL_EMPIRES) const; virtual XMLElement XMLEncode(int empire_id = ALL_EMPIRES) const; ///< constructs an XMLElement from a Universe object with visibility restrictions for the given empire - std::string Encode(int empire_id = ALL_EMPIRES) const; ///< constructs a serialized representation from a Universe object with visibility restrictions for the given empire mutable UniverseObjectDeleteSignalType UniverseObjectDeleteSignal; ///< the state changed signal object for this UniverseObject //@} /** \name Mutators */ //@{ void SetUniverse(const XMLElement& elem); ///< wipes out the current object map and sets the map to the XMLElement passed in. - void SetUniverse(boost::iostreams::filtering_istream& is); ///< wipes out the current object map and sets the map to the serialized representation in stream \a is. /** inserts object \a obj into the universe; returns the ID number assigned to the object, or -1 on failure. \note Universe gains ownership of \a obj once it is inserted; the caller should \a never delete \a obj after Modified: trunk/FreeOrion/util/SitRepEntry.h =================================================================== --- trunk/FreeOrion/util/SitRepEntry.h 2006-02-22 13:58:27 UTC (rev 1768) +++ trunk/FreeOrion/util/SitRepEntry.h 2006-02-23 00:32:43 UTC (rev 1769) @@ -76,14 +76,16 @@ EntryType GetType( ) { return m_type; } private: + EntryType m_type; ///< the type of SitRep this is - EntryType m_type; ///< the type of SitRep this is + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); }; -/* Sitrep constructors - for each SitRep type, there is a global constructor function - * See implementation file for examples - */ +// Sitrep constructors - for each SitRep type, there is a global constructor function See implementation file for +// examples SitRepEntry *CreateTechResearchedSitRep(const std::string& tech_name); @@ -97,6 +99,14 @@ SitRepEntry *CreatePlanetStarvedToDeathSitRep(int system_id, int planet_id); +// template implementations +template <class Archive> +void SitRepEntry::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(VarText) + & BOOST_SERIALIZATION_NVP(m_type); +} + inline std::string SitRepEntryRevision() {return "$Id$";} Modified: trunk/FreeOrion/util/VarText.h =================================================================== --- trunk/FreeOrion/util/VarText.h 2006-02-22 13:58:27 UTC (rev 1768) +++ trunk/FreeOrion/util/VarText.h 2006-02-23 00:32:43 UTC (rev 1769) @@ -3,13 +3,16 @@ #define _VarText_h_ -#include <string> - #ifndef _XMLDoc_h_ #include "XMLDoc.h" #endif +#include <boost/serialization/access.hpp> +#include <boost/serialization/nvp.hpp> +#include <string> +#include <sstream> + /** * VarText is a string tagged with variable names which are substituded for actual data at runtime * The variables are stored in a XML element tree. @@ -50,10 +53,36 @@ static const std::string BUILDING_ID_TAG; protected: - XMLElement m_variables; ///< the data describing the sitrep. See class comments for description - std::string m_text; ///< the text, including hyperlinks, that describes this entry. Built from XML data + XMLElement m_variables; ///< the data describing the sitrep. See class comments for description + std::string m_text; ///< the text, including hyperlinks, that describes this entry. Built from XML data + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); }; +// template implementations +template <class Archive> +void VarText::serialize(Archive& ar, const unsigned int version) +{ + std::string variables; + if (Archive::is_saving::value) { + XMLDoc doc; + doc.root_node = m_variables; + std::stringstream stream; + doc.WriteDoc(stream); + } + ar & BOOST_SERIALIZATION_NVP(m_text) + & BOOST_SERIALIZATION_NVP(variables); + if (Archive::is_loading::value) { + XMLDoc doc; + std::stringstream stream; + stream << variables; + doc.ReadDoc(stream); + m_variables = doc.root_node; + } +} + inline std::string VarTextRevision() {return "$Id$";} |
From: <tz...@us...> - 2006-03-05 04:00:26
|
Revision: 1801 Author: tzlaine Date: 2006-03-04 20:00:21 -0800 (Sat, 04 Mar 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1801&view=rev Log Message: ----------- Removed the independent SIDE_PANEL* font sizes from ClientUI, so that the fonts in the SidePanel respond to changes in the OptionsWnd fonts. Modified Paths: -------------- trunk/FreeOrion/UI/ClientUI.cpp trunk/FreeOrion/UI/ClientUI.h trunk/FreeOrion/UI/CombatWnd.cpp trunk/FreeOrion/UI/IntroScreen.cpp trunk/FreeOrion/UI/OptionsWnd.cpp trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/ClientUI.cpp =================================================================== --- trunk/FreeOrion/UI/ClientUI.cpp 2006-03-05 03:33:02 UTC (rev 1800) +++ trunk/FreeOrion/UI/ClientUI.cpp 2006-03-05 04:00:21 UTC (rev 1801) @@ -102,8 +102,6 @@ // game UI windows GG::Clr ClientUI::SIDE_PANEL_COLOR(0, 0, 0, 220); GG::Clr ClientUI::SIDE_PANEL_BUILD_PROGRESSBAR_COLOR(25, 40, 140, 150); -int ClientUI::SIDE_PANEL_PLANET_NAME_PTS = 15; -int ClientUI::SIDE_PANEL_PTS = 11; // tech screen GG::Clr ClientUI::KNOWN_TECH_FILL_COLOR(72, 72, 72, 255); Modified: trunk/FreeOrion/UI/ClientUI.h =================================================================== --- trunk/FreeOrion/UI/ClientUI.h 2006-03-05 03:33:02 UTC (rev 1800) +++ trunk/FreeOrion/UI/ClientUI.h 2006-03-05 04:00:21 UTC (rev 1801) @@ -189,8 +189,6 @@ // game UI windows static GG::Clr SIDE_PANEL_COLOR; static GG::Clr SIDE_PANEL_BUILD_PROGRESSBAR_COLOR; - static int SIDE_PANEL_PLANET_NAME_PTS; - static int SIDE_PANEL_PTS; // tech screen static GG::Clr KNOWN_TECH_FILL_COLOR; Modified: trunk/FreeOrion/UI/CombatWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CombatWnd.cpp 2006-03-05 03:33:02 UTC (rev 1800) +++ trunk/FreeOrion/UI/CombatWnd.cpp 2006-03-05 04:00:21 UTC (rev 1801) @@ -59,7 +59,7 @@ GG::Pt ul(UpperLeft()),lr(LowerRight()); GG::FlatRectangle(ul.x+1,ul.y+1,lr.x,lr.y,bg_color,border_color,2); - boost::shared_ptr<GG::Font> font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::SIDE_PANEL_PTS*1.0)); + boost::shared_ptr<GG::Font> font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::PTS*1.0)); Uint32 format = GG::TF_LEFT | GG::TF_VCENTER; std::string text; @@ -75,13 +75,13 @@ GG::Rect rc; rc = GG::Rect(ul+GG::Pt(20,5),ul+GG::Pt(500,25)); - font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::SIDE_PANEL_PTS*1.0)); + font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::PTS*1.0)); glColor4ubv(ClientUI::TEXT_COLOR.v); format = GG::TF_LEFT | GG::TF_BOTTOM; font->RenderText(rc.UpperLeft(),rc.LowerRight(),UserString("COMBAT_BATTLE"), format, 0); rc = GG::Rect(ul+GG::Pt(20+50,5),ul+GG::Pt(500,28)); - font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::SIDE_PANEL_PTS*1.7)); + font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::PTS*1.7)); glColor4ubv(ClientUI::TEXT_COLOR.v); format = GG::TF_LEFT | GG::TF_BOTTOM; font->RenderText(rc.UpperLeft(),rc.LowerRight(),boost::io::str(boost::format(UserString("COMBAT_SYSTEM")) % m_combat_info.m_system), format, 0); @@ -121,7 +121,7 @@ GG::FlatRectangle(area.Left(), area.Top(), area.Right()+2, area.Bottom(),bg_item_color,border_color, 2); - font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::SIDE_PANEL_PTS*1.2)); + font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::PTS*1.2)); rc = GG::Rect(area.UpperLeft()+rc_txt_empire.UpperLeft(),area.UpperLeft()+rc_txt_empire.LowerRight()); glColor4ubv(ClientUI::TEXT_COLOR.v);format = GG::TF_LEFT | GG::TF_VCENTER; @@ -137,7 +137,7 @@ img_topic[c] .OrthoBlit(col.UpperLeft()+item_img_topic .UpperLeft(),col.UpperLeft()+item_img_topic .LowerRight(), false); img_arrow_split .OrthoBlit(col.UpperLeft()+item_img_arrow_split.UpperLeft(),col.UpperLeft()+item_img_arrow_split.LowerRight(), false); - font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::SIDE_PANEL_PTS*1.0)); + font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::PTS*1.0)); for(unsigned int j=0;j<4;j++) { rc = GG::Rect(col.UpperLeft()+item_txt[j].UpperLeft(),col.UpperLeft()+item_txt[j].LowerRight()); Modified: trunk/FreeOrion/UI/IntroScreen.cpp =================================================================== --- trunk/FreeOrion/UI/IntroScreen.cpp 2006-03-05 03:33:02 UTC (rev 1800) +++ trunk/FreeOrion/UI/IntroScreen.cpp 2006-03-05 04:00:21 UTC (rev 1801) @@ -73,7 +73,7 @@ return; GG::Pt ul = UpperLeft(), lr = LowerRight(); - boost::shared_ptr<GG::Font> font=HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::SIDE_PANEL_PTS*1.3));; + boost::shared_ptr<GG::Font> font=HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::PTS*1.3));; Uint32 format = GG::TF_CENTER | GG::TF_TOP; GG::FlatRectangle(ul.x,ul.y,lr.x,lr.y,GG::Clr(0.0,0.0,0.0,0.5),GG::CLR_ZERO,0); @@ -379,7 +379,7 @@ void IntroScreen::Render() { - boost::shared_ptr<GG::Font> font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PTS); + boost::shared_ptr<GG::Font> font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, ClientUI::PTS); CUIWnd::Render(); GG::Pt size=font->TextExtent(FreeOrionVersionString()); font->RenderText(GG::GUI::GetGUI()->AppWidth()-size.x, Modified: trunk/FreeOrion/UI/OptionsWnd.cpp =================================================================== --- trunk/FreeOrion/UI/OptionsWnd.cpp 2006-03-05 03:33:02 UTC (rev 1800) +++ trunk/FreeOrion/UI/OptionsWnd.cpp 2006-03-05 04:00:21 UTC (rev 1801) @@ -293,7 +293,7 @@ control_page->AttachChild(stateBtn); // Autosave y += PAGE_ROW_HEIGHT; - textControl = new GG::TextControl(x, y, UserString("OPTIONS_AUTOSAVE"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PLANET_NAME_PTS), ClientUI::TEXT_COLOR); + textControl = new GG::TextControl(x, y, UserString("OPTIONS_AUTOSAVE"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS*4/3), ClientUI::TEXT_COLOR); control_page->AttachChild(textControl); // [x] Single Player [x] Multiplayer y += PAGE_ROW_HEIGHT - 5; @@ -356,7 +356,7 @@ // Fonts y += PAGE_ROW_HEIGHT; x = PAGE_HORZ_MARGIN; - textControl = new GG::TextControl(x, y, UserString("OPTIONS_FONTS"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PLANET_NAME_PTS), ClientUI::TEXT_COLOR); + textControl = new GG::TextControl(x, y, UserString("OPTIONS_FONTS"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS*4/3), ClientUI::TEXT_COLOR); ui_page->AttachChild(textControl); // *Text [font] *Size [size]^ y += PAGE_ROW_HEIGHT - 5; @@ -373,7 +373,7 @@ // Tech Spacing y += PAGE_ROW_HEIGHT; x = PAGE_HORZ_MARGIN; - textControl = new GG::TextControl(x, y, UserString("OPTIONS_TECH_SPACING"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PLANET_NAME_PTS), ClientUI::TEXT_COLOR); + textControl = new GG::TextControl(x, y, UserString("OPTIONS_TECH_SPACING"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS*4/3), ClientUI::TEXT_COLOR); ui_page->AttachChild(textControl); // *Horz [space]^ *Vert[space]^ y += PAGE_ROW_HEIGHT - 5; @@ -424,7 +424,7 @@ // Chat y += PAGE_ROW_HEIGHT; x = PAGE_HORZ_MARGIN; - textControl = new GG::TextControl(x, y, UserString("OPTIONS_CHAT"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PLANET_NAME_PTS), ClientUI::TEXT_COLOR); + textControl = new GG::TextControl(x, y, UserString("OPTIONS_CHAT"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS*4/3), ClientUI::TEXT_COLOR); ui_page->AttachChild(textControl); // History [count]^ y += PAGE_ROW_HEIGHT - 5; @@ -489,7 +489,7 @@ // Window y += PAGE_ROW_HEIGHT; x = PAGE_HORZ_MARGIN + PAGE_HORZ_OFFSET; - textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_SOUND_WINDOW"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PLANET_NAME_PTS), ClientUI::TEXT_COLOR); + textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_SOUND_WINDOW"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS*4/3), ClientUI::TEXT_COLOR); sound_page->AttachChild(textControl); // Close [sound] y += PAGE_ROW_HEIGHT - 5; @@ -502,7 +502,7 @@ AddSoundControls(x, y, "OPTIONS_SOUND_MINIMIZE", sound_page, "UI.sound.window-minimize", m_minimize_edit, btn); // Button y += PAGE_ROW_HEIGHT; - textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_SOUND_BUTTON"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PLANET_NAME_PTS), ClientUI::TEXT_COLOR); + textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_SOUND_BUTTON"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS*4/3), ClientUI::TEXT_COLOR); sound_page->AttachChild(textControl); // Click [sound] y += PAGE_ROW_HEIGHT - 5; @@ -512,7 +512,7 @@ AddSoundControls(x, y, "OPTIONS_SOUND_ROLLOVER", sound_page, "UI.sound.button-rollover", m_rolloverButton_edit, btn); // Fleet y += PAGE_ROW_HEIGHT; - textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_SOUND_FLEET"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PLANET_NAME_PTS), ClientUI::TEXT_COLOR); + textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_SOUND_FLEET"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS*4/3), ClientUI::TEXT_COLOR); sound_page->AttachChild(textControl); // Click [sound] y += PAGE_ROW_HEIGHT - 5; @@ -557,7 +557,7 @@ AddSoundControls(PAGE_HORZ_MARGIN, y, "OPTIONS_SOUND_PLANET", sound_page2, "UI.sound.planet-button-click", m_planet_edit, btn); // Focus y += PAGE_ROW_HEIGHT; - textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_SOUND_FOCUS"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PLANET_NAME_PTS), ClientUI::TEXT_COLOR); + textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_SOUND_FOCUS"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS*4/3), ClientUI::TEXT_COLOR); sound_page2->AttachChild(textControl); // Balanced [sound] y += PAGE_ROW_HEIGHT - 5; @@ -576,7 +576,7 @@ AddSoundControls(x, y, "OPTIONS_SOUND_RESEARCH", sound_page2, "UI.sound.research-focus", m_research_edit, btn); // List y += PAGE_ROW_HEIGHT; - textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_SOUND_LIST"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PLANET_NAME_PTS), ClientUI::TEXT_COLOR); + textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_SOUND_LIST"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS*4/3), ClientUI::TEXT_COLOR); sound_page2->AttachChild(textControl); // Drop [sound] y += PAGE_ROW_HEIGHT - 5; @@ -606,7 +606,7 @@ y = PAGE_VERT_MARGIN; x = PAGE_HORZ_MARGIN + PAGE_HORZ_OFFSET; // General - textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_COLOR_GENERAL"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PLANET_NAME_PTS), ClientUI::TEXT_COLOR); + textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_COLOR_GENERAL"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS*4/3), ClientUI::TEXT_COLOR); colors_page->AttachChild(textControl); // Color [color] y += PAGE_ROW_HEIGHT - 5; @@ -619,7 +619,7 @@ AddColorControls(x, y, "OPTIONS_COLOR_TEXT", colors_page, "UI.text-color", comboColor); // Edit y += PAGE_ROW_HEIGHT; - textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_COLOR_EDIT"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PLANET_NAME_PTS), ClientUI::TEXT_COLOR); + textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_COLOR_EDIT"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS*4/3), ClientUI::TEXT_COLOR); colors_page->AttachChild(textControl); // Highlight [color] y += PAGE_ROW_HEIGHT - 5; @@ -629,7 +629,7 @@ AddColorControls(x, y, "OPTIONS_COLOR_INTERIOR", colors_page, "UI.edit-interior", comboColor); // Window y += PAGE_ROW_HEIGHT; - textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_COLOR_WINDOW"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PLANET_NAME_PTS), ClientUI::TEXT_COLOR); + textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_COLOR_WINDOW"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS*4/3), ClientUI::TEXT_COLOR); colors_page->AttachChild(textControl); // Color [color] y += PAGE_ROW_HEIGHT - 5; @@ -662,7 +662,7 @@ y = PAGE_VERT_MARGIN; x = PAGE_HORZ_MARGIN + PAGE_HORZ_OFFSET; // Known Tech - textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_COLOR_TECH_KNOWN"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PLANET_NAME_PTS), ClientUI::TEXT_COLOR); + textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_COLOR_TECH_KNOWN"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS*4/3), ClientUI::TEXT_COLOR); colors_page2->AttachChild(textControl); // Color [color] y += PAGE_ROW_HEIGHT - 5; @@ -672,7 +672,7 @@ AddColorControls(x, y, "OPTIONS_COLOR_BORDER", colors_page2, "UI.known-tech-border", comboColor); // Researchable Tech y += PAGE_ROW_HEIGHT; - textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_COLOR_TECH_RESEARCHABLE"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PLANET_NAME_PTS), ClientUI::TEXT_COLOR); + textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_COLOR_TECH_RESEARCHABLE"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS*4/3), ClientUI::TEXT_COLOR); colors_page2->AttachChild(textControl); // Color [color] y += PAGE_ROW_HEIGHT - 5; @@ -682,7 +682,7 @@ AddColorControls(x, y, "OPTIONS_COLOR_BORDER", colors_page2, "UI.researchable-tech-border", comboColor); // Unresearchable Tech y += PAGE_ROW_HEIGHT; - textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_COLOR_TECH_UNRESEARCHABLE"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PLANET_NAME_PTS), ClientUI::TEXT_COLOR); + textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_COLOR_TECH_UNRESEARCHABLE"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS*4/3), ClientUI::TEXT_COLOR); colors_page2->AttachChild(textControl); // Color [color] y += PAGE_ROW_HEIGHT - 5; @@ -692,7 +692,7 @@ AddColorControls(x, y, "OPTIONS_COLOR_BORDER", colors_page2, "UI.unresearchable-tech-border", comboColor); // Tech Progress y += PAGE_ROW_HEIGHT; - textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_COLOR_TECH_PROGRESS"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::SIDE_PANEL_PLANET_NAME_PTS), ClientUI::TEXT_COLOR); + textControl = new GG::TextControl(PAGE_HORZ_MARGIN, y, UserString("OPTIONS_COLOR_TECH_PROGRESS"), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS*4/3), ClientUI::TEXT_COLOR); colors_page2->AttachChild(textControl); // Color [color] y += PAGE_ROW_HEIGHT - 5; Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2006-03-05 03:33:02 UTC (rev 1800) +++ trunk/FreeOrion/UI/SidePanel.cpp 2006-03-05 04:00:21 UTC (rev 1801) @@ -735,13 +735,13 @@ } } - m_planet_name = new GG::TextControl(MAX_PLANET_DIAMETER-15,10,planet.Name(),GG::GUI::GetGUI()->GetFont(ClientUI::FONT,ClientUI::SIDE_PANEL_PLANET_NAME_PTS),ClientUI::TEXT_COLOR); + m_planet_name = new GG::TextControl(MAX_PLANET_DIAMETER-15,10,planet.Name(),GG::GUI::GetGUI()->GetFont(ClientUI::FONT,ClientUI::PTS*4/3),ClientUI::TEXT_COLOR); AttachChild(m_planet_name); - m_planet_info = new GG::TextControl(m_planet_name->UpperLeft().x-UpperLeft().x+10,m_planet_name->LowerRight().y-UpperLeft().y,"",GG::GUI::GetGUI()->GetFont(ClientUI::FONT,ClientUI::SIDE_PANEL_PTS),ClientUI::TEXT_COLOR,GG::TF_LEFT|GG::TF_TOP); + m_planet_info = new GG::TextControl(m_planet_name->UpperLeft().x-UpperLeft().x+10,m_planet_name->LowerRight().y-UpperLeft().y,"",GG::GUI::GetGUI()->GetFont(ClientUI::FONT,ClientUI::PTS),ClientUI::TEXT_COLOR,GG::TF_LEFT|GG::TF_TOP); AttachChild(m_planet_info); - m_button_colonize = new CUIButton((Width()/3)*2,(Height()-ClientUI::SIDE_PANEL_PTS)/2,60,UserString("PL_COLONIZE"),GG::GUI::GetGUI()->GetFont(ClientUI::FONT,ClientUI::SIDE_PANEL_PTS),ClientUI::BUTTON_COLOR,ClientUI::CTRL_BORDER_COLOR,1,ClientUI::TEXT_COLOR,GG::CLICKABLE); + m_button_colonize = new CUIButton((Width()/3)*2,(Height()-ClientUI::PTS)/2,60,UserString("PL_COLONIZE"),GG::GUI::GetGUI()->GetFont(ClientUI::FONT,ClientUI::PTS),ClientUI::BUTTON_COLOR,ClientUI::CTRL_BORDER_COLOR,1,ClientUI::TEXT_COLOR,GG::CLICKABLE); Connect(m_button_colonize->ClickedSignal, &SidePanel::PlanetPanel::ClickColonize, this); AttachChild(m_button_colonize); @@ -969,7 +969,7 @@ bool SidePanel::PlanetPanel::RenderInhabited(const Planet &planet) { glColor4ubv(ClientUI::TEXT_COLOR.v); - boost::shared_ptr<GG::Font> font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT,ClientUI::SIDE_PANEL_PTS); + boost::shared_ptr<GG::Font> font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT,ClientUI::PTS); Uint32 format = GG::TF_LEFT | GG::TF_BOTTOM; std::string text; int x,y; @@ -989,7 +989,7 @@ boost::shared_ptr<GG::Texture> icon; const int ICON_MARGIN = 5; - font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::SIDE_PANEL_PTS*1.2)); + font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::PTS)); //population //x = m_planet_name->UpperLeft ().x+10; y = m_planet_name->LowerRight().y + RESOURCE_DISPLAY_HEIGHT+3; @@ -1006,7 +1006,7 @@ bool SidePanel::PlanetPanel::RenderOwned(const Planet &planet) { glColor4ubv(ClientUI::TEXT_COLOR.v); - boost::shared_ptr<GG::Font> font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT,ClientUI::SIDE_PANEL_PTS); + boost::shared_ptr<GG::Font> font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT,ClientUI::PTS); Uint32 format = GG::TF_LEFT | GG::TF_BOTTOM; std::string text; int x,y; @@ -1024,7 +1024,7 @@ boost::shared_ptr<GG::Texture> icon; const int ICON_MARGIN = 5; - font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::SIDE_PANEL_PTS*1.2)); + font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::PTS)); //population //x = m_planet_name->UpperLeft ().x+10; y = m_planet_name->LowerRight().y + RESOURCE_DISPLAY_HEIGHT+3; @@ -1291,7 +1291,7 @@ int farming=m_farming,mining=m_mining,trade=m_trade,research=m_research,industry=m_industry,defense=m_defense; std::string text; int x,y; boost::shared_ptr<GG::Texture> icon; - boost::shared_ptr<GG::Font> font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::SIDE_PANEL_PTS*1.2)); + boost::shared_ptr<GG::Font> font = HumanClientApp::GetApp()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::PTS)); Uint32 format = GG::TF_LEFT | GG::TF_VCENTER; const int ICON_MARGIN = 5; @@ -1365,7 +1365,7 @@ Wnd(x, y, w, h, GG::CLICKABLE), m_system(0), m_system_name(new CUIDropDownList(40, 0, w-80,SYSTEM_NAME_FONT_SIZE, 10*SYSTEM_NAME_FONT_SIZE,GG::CLR_ZERO,GG::Clr(0.0, 0.0, 0.0, 0.5))), - m_system_name_unknown(new GG::TextControl(40, 0, w-80,SYSTEM_NAME_FONT_SIZE,UserString("SP_UNKNOWN_SYSTEM"),GG::GUI::GetGUI()->GetFont(ClientUI::FONT,static_cast<int>(ClientUI::PTS*1.4)),ClientUI::TEXT_COLOR)), + m_system_name_unknown(new GG::TextControl(40, 0, w-80,SYSTEM_NAME_FONT_SIZE,UserString("SP_UNKNOWN_SYSTEM"),GG::GUI::GetGUI()->GetFont(ClientUI::FONT,SYSTEM_NAME_FONT_SIZE),ClientUI::TEXT_COLOR)), m_button_prev(new GG::Button(40-SYSTEM_NAME_FONT_SIZE,4,SYSTEM_NAME_FONT_SIZE,SYSTEM_NAME_FONT_SIZE,"",GG::GUI::GetGUI()->GetFont(ClientUI::FONT,SYSTEM_NAME_FONT_SIZE),GG::CLR_WHITE,GG::CLICKABLE)), m_button_next(new GG::Button(40+w-80 ,4,SYSTEM_NAME_FONT_SIZE,SYSTEM_NAME_FONT_SIZE,"",GG::GUI::GetGUI()->GetFont(ClientUI::FONT,SYSTEM_NAME_FONT_SIZE),GG::CLR_WHITE,GG::CLICKABLE)), m_star_graphic(0), @@ -1498,7 +1498,7 @@ if(sys_vec[i]->Name().length()==0) continue; - row->push_back(boost::io::str(boost::format(UserString("SP_SYSTEM_NAME")) % sys_vec[i]->Name()), ClientUI::FONT,static_cast<int>(ClientUI::PTS*1.4), ClientUI::TEXT_COLOR); + row->push_back(boost::io::str(boost::format(UserString("SP_SYSTEM_NAME")) % sys_vec[i]->Name()), ClientUI::FONT,SYSTEM_NAME_FONT_SIZE, ClientUI::TEXT_COLOR); m_system_name->Insert(row); ++system_names_in_droplist; |
From: <tz...@us...> - 2006-03-07 00:15:56
|
Revision: 1808 Author: tzlaine Date: 2006-03-06 16:15:43 -0800 (Mon, 06 Mar 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1808&view=rev Log Message: ----------- - Added 3 new Conditions written by Geoff: Turn, NumberOf, and ContainedBy. - Added members to UniverseObject and the App classes to account for turns. - Made several static methods of ClientApp public non-static, and added a GetApp() method returnng the singleton ClientApp instance, to be consistent with other App classes. - Fixed a bug in the And Condition which was copying, instead of moving, items between target and non_target sets. - Changed the Contains Condition to use the pattern used by other Conditions based on a sub-Condition; it now determines the matches of the sub-Condition only once, instead of once per examined item. Modified Paths: -------------- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/UI/ResearchWnd.cpp trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/UI/SystemIcon.cpp trunk/FreeOrion/UI/TurnProgressWnd.cpp trunk/FreeOrion/client/AI/AIClientApp.cpp trunk/FreeOrion/client/ClientApp.cpp trunk/FreeOrion/client/ClientApp.h trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/client/human/HumanClientApp.h trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/network/ClientNetworkCore.cpp trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/server/ServerApp.h trunk/FreeOrion/universe/Condition.cpp trunk/FreeOrion/universe/Condition.h trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/Universe.h trunk/FreeOrion/universe/UniverseObject.cpp trunk/FreeOrion/universe/UniverseObject.h trunk/FreeOrion/util/AppInterface.cpp trunk/FreeOrion/util/AppInterface.h Modified: trunk/FreeOrion/UI/BuildDesignatorWnd.cpp =================================================================== --- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2006-03-07 00:15:43 UTC (rev 1808) @@ -146,7 +146,7 @@ void BuildDesignatorWnd::BuildDetailPanel::SetBuild(int queue_idx) { - Empire* empire = HumanClientApp::Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); + Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); const ProductionQueue& queue = empire->GetProductionQueue(); if (0 <= queue_idx && queue_idx < static_cast<int>(queue.size())) { m_build_type = queue[queue_idx].item.build_type; @@ -190,7 +190,7 @@ m_num_items_to_build_connect.disconnect(); m_num_items_to_build->SetValue(1); - Empire* empire = HumanClientApp::Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); + Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); if (!empire) { m_num_items_to_build_connect = GG::Connect(m_num_items_to_build->ValueChangedSignal, &BuildDesignatorWnd::BuildDetailPanel::ItemsToBuildChangedSlot, this); return; @@ -319,7 +319,7 @@ m_num_items_to_build->Disable(true); m_num_items_to_build_label->Disable(true); } - Empire* empire = HumanClientApp::Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); + Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); if (empire && empire->BuildableItem(m_build_type, m_item, m_build_location)) { m_add_to_queue_button->Disable(false); if (m_build_type != BT_BUILDING) { @@ -477,7 +477,7 @@ m_current_build_type = build_type; m_buildable_items->Clear(); m_build_types.clear(); - Empire* empire = HumanClientApp::Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); + Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); if (!empire) return; boost::shared_ptr<GG::Font> default_font = GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS); @@ -594,7 +594,7 @@ void BuildDesignatorWnd::CenterOnBuild(int queue_idx) { m_build_detail_panel->SetBuild(queue_idx); - Empire* empire = HumanClientApp::Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); + Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); const ProductionQueue& queue = empire->GetProductionQueue(); if (0 <= queue_idx && queue_idx < static_cast<int>(queue.size())) { UniverseObject* build_location = GetUniverse().Object(queue[queue_idx].location); @@ -643,7 +643,7 @@ void BuildDesignatorWnd::BuildItemRequested(BuildType build_type, const std::string& item, int num_to_build) { - Empire* empire = HumanClientApp::Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); + Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); if (empire && empire->BuildableItem(build_type, item, m_build_location)) AddBuildToQueueSignal(build_type, item, num_to_build, m_build_location); } Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2006-03-07 00:15:43 UTC (rev 1808) @@ -569,20 +569,20 @@ for (unsigned int i = 0; i < fleets.size(); ++i) { int fleet_id = fleets[i]->ID(); - HumanClientApp::Orders().IssueOrder( + HumanClientApp::GetApp()->Orders().IssueOrder( new FleetTransferOrder(HumanClientApp::GetApp()->EmpireID(), fleets[i]->ID(), target_fleet->ID(), std::vector<int>(fleets[i]->begin(), fleets[i]->end()))); // if the transfer did not result in the indirect deletion of the fleet, delete it if it is empty Fleet* fleet = GetUniverse().Object<Fleet>(fleet_id); if (fleet && fleet->NumShips() == 0) { - HumanClientApp::Orders().IssueOrder( + HumanClientApp::GetApp()->Orders().IssueOrder( new DeleteFleetOrder(HumanClientApp::GetApp()->EmpireID(), fleets[i]->ID())); } } } else if (!ships.empty()) { if (!ValidShip(ships[0], target_fleet)) return; - HumanClientApp::Orders().IssueOrder( + HumanClientApp::GetApp()->Orders().IssueOrder( new FleetTransferOrder(HumanClientApp::GetApp()->EmpireID(), ships[0]->FleetID(), target_fleet->ID(), ship_ids)); } @@ -684,7 +684,7 @@ return; } - HumanClientApp::Orders().IssueOrder( + HumanClientApp::GetApp()->Orders().IssueOrder( new FleetTransferOrder(HumanClientApp::GetApp()->EmpireID(), ship_row->m_ship->FleetID(), m_fleet->ID(), ship_ids)); } @@ -833,7 +833,7 @@ CUIEditWnd edit_wnd(350, UserString("ENTER_NEW_NAME"), ship_name); edit_wnd.Run(); if (edit_wnd.Result() != "") { - HumanClientApp::Orders().IssueOrder(new RenameOrder(HumanClientApp::GetApp()->EmpireID(), ship->ID(), edit_wnd.Result())); + HumanClientApp::GetApp()->Orders().IssueOrder(new RenameOrder(HumanClientApp::GetApp()->EmpireID(), ship->ID(), edit_wnd.Result())); m_ships_lb->GetRow(row_idx)[0]->SetText(edit_wnd.Result()); } break;} @@ -1054,7 +1054,7 @@ } if (execute_move && !route.empty()) { - HumanClientApp::Orders().IssueOrder(new FleetMoveOrder(empire_id, fleet->ID(), start_system, system_id)); + HumanClientApp::GetApp()->Orders().IssueOrder(new FleetMoveOrder(empire_id, fleet->ID(), start_system, system_id)); if (fleet->SystemID() == UniverseObject::INVALID_OBJECT_ID) ClientUI::GetClientUI()->GetMapWnd()->SetFleetMovement(fleet); } @@ -1143,7 +1143,7 @@ CUIEditWnd edit_wnd(350, UserString("ENTER_NEW_NAME"), fleet_name); edit_wnd.Run(); if (edit_wnd.Result() != "") { - HumanClientApp::Orders().IssueOrder(new RenameOrder(HumanClientApp::GetApp()->EmpireID(), fleet->ID(), edit_wnd.Result())); + HumanClientApp::GetApp()->Orders().IssueOrder(new RenameOrder(HumanClientApp::GetApp()->EmpireID(), fleet->ID(), edit_wnd.Result())); m_fleets_lb->GetRow(row_idx)[0]->SetText(edit_wnd.Result()); } break; @@ -1223,7 +1223,7 @@ break; } } - HumanClientApp::Orders().IssueOrder(new DeleteFleetOrder(HumanClientApp::GetApp()->EmpireID(), fleet->ID())); + HumanClientApp::GetApp()->Orders().IssueOrder(new DeleteFleetOrder(HumanClientApp::GetApp()->EmpireID(), fleet->ID())); } void FleetWnd::CreateNewFleetFromDrops(Ship* first_ship, const std::vector<int>& ship_ids) @@ -1255,7 +1255,7 @@ Fleet* new_fleet = 0; if (system) { - HumanClientApp::Orders().IssueOrder(new NewFleetOrder(empire_id, fleet_name, new_fleet_id, system->ID(), ship_ids)); + HumanClientApp::GetApp()->Orders().IssueOrder(new NewFleetOrder(empire_id, fleet_name, new_fleet_id, system->ID(), ship_ids)); System::ObjectVec fleets = system->FindObjectsInOrbit(-1, StationaryFleetVisitor(empire_id)); for (unsigned int i = 0; i < fleets.size(); ++i) { if (fleets[i]->Name() == fleet_name) { @@ -1264,7 +1264,7 @@ } } } else { - HumanClientApp::Orders().IssueOrder(new NewFleetOrder(empire_id, fleet_name, new_fleet_id, some_fleet_x, some_fleet_y, ship_ids)); + HumanClientApp::GetApp()->Orders().IssueOrder(new NewFleetOrder(empire_id, fleet_name, new_fleet_id, some_fleet_x, some_fleet_y, ship_ids)); std::vector<Fleet*> fleets = GetUniverse().FindObjects<Fleet>(); for (unsigned int i = 0; i < fleets.size(); ++i) { if (fleets[i]->Name() == fleet_name && fleets[i]->X() == some_fleet_x && fleets[i]->Y() == some_fleet_y) { Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/UI/MapWnd.cpp 2006-03-07 00:15:43 UTC (rev 1808) @@ -540,7 +540,7 @@ { SetAccelerators(); - Universe& universe = ClientApp::GetUniverse(); + Universe& universe = GetUniverse(); Resize(GG::Pt(static_cast<int>(Universe::UniverseWidth() * s_max_scale_factor + GG::GUI::GetGUI()->AppWidth() * 1.5), static_cast<int>(Universe::UniverseWidth() * s_max_scale_factor + GG::GUI::GetGUI()->AppHeight() * 1.5))); Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2006-03-07 00:15:43 UTC (rev 1808) @@ -372,7 +372,7 @@ void ProductionWnd::QueueItemMoved(int row_idx, GG::ListBox::Row* row) { - HumanClientApp::Orders().IssueOrder(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), static_cast<QueueRow*>(row)->queue_index, row_idx)); + HumanClientApp::GetApp()->Orders().IssueOrder(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), static_cast<QueueRow*>(row)->queue_index, row_idx)); UpdateQueue(); ResetInfoPanel(); } @@ -412,7 +412,7 @@ void ProductionWnd::AddBuildToQueueSlot(BuildType build_type, const std::string& name, int number, int location) { - HumanClientApp::Orders().IssueOrder(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), build_type, name, number, location)); + HumanClientApp::GetApp()->Orders().IssueOrder(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), build_type, name, number, location)); UpdateQueue(); ResetInfoPanel(); m_build_designator_wnd->CenterOnBuild(m_queue_lb->NumRows() - 1); @@ -420,14 +420,14 @@ void ProductionWnd::ChangeBuildQuantitySlot(int queue_idx, int quantity) { - HumanClientApp::Orders().IssueOrder(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), queue_idx, quantity, true)); + HumanClientApp::GetApp()->Orders().IssueOrder(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), queue_idx, quantity, true)); UpdateQueue(); ResetInfoPanel(); } void ProductionWnd::QueueItemDeletedSlot(int row_idx, GG::ListBox::Row* row) { - HumanClientApp::Orders().IssueOrder(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), row_idx)); + HumanClientApp::GetApp()->Orders().IssueOrder(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), row_idx)); UpdateQueue(); ResetInfoPanel(); if (row_idx == m_build_designator_wnd->QueueIndexShown()) { Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2006-03-07 00:15:43 UTC (rev 1808) @@ -258,7 +258,7 @@ void ResearchWnd::QueueItemMoved(int row_idx, GG::ListBox::Row* row) { - HumanClientApp::Orders().IssueOrder(new ResearchQueueOrder(HumanClientApp::GetApp()->EmpireID(), dynamic_cast<QueueRow*>(row)->tech->Name(), row_idx)); + HumanClientApp::GetApp()->Orders().IssueOrder(new ResearchQueueOrder(HumanClientApp::GetApp()->EmpireID(), dynamic_cast<QueueRow*>(row)->tech->Name(), row_idx)); UpdateQueue(); ResetInfoPanel(); } @@ -300,7 +300,7 @@ const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); const ResearchQueue& queue = empire->GetResearchQueue(); if (!queue.InQueue(tech)) { - HumanClientApp::Orders().IssueOrder(new ResearchQueueOrder(HumanClientApp::GetApp()->EmpireID(), tech->Name(), -1)); + HumanClientApp::GetApp()->Orders().IssueOrder(new ResearchQueueOrder(HumanClientApp::GetApp()->EmpireID(), tech->Name(), -1)); UpdateQueue(); ResetInfoPanel(); m_tech_tree_wnd->Update(); @@ -309,7 +309,7 @@ void ResearchWnd::QueueItemDeletedSlot(int row_idx, GG::ListBox::Row* row) { - HumanClientApp::Orders().IssueOrder(new ResearchQueueOrder(HumanClientApp::GetApp()->EmpireID(), dynamic_cast<QueueRow*>(row)->tech->Name())); + HumanClientApp::GetApp()->Orders().IssueOrder(new ResearchQueueOrder(HumanClientApp::GetApp()->EmpireID(), dynamic_cast<QueueRow*>(row)->tech->Name())); UpdateQueue(); ResetInfoPanel(); m_tech_tree_wnd->Update(); Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/UI/SidePanel.cpp 2006-03-07 00:15:43 UTC (rev 1808) @@ -868,7 +868,7 @@ } if (!planet->Owners().empty()) { - Empire* planet_empire = HumanClientApp::Empires().Lookup(*(planet->Owners().begin())); + Empire* planet_empire = Empires().Lookup(*(planet->Owners().begin())); m_planet_name->SetTextColor(planet_empire?planet_empire->Color():ClientUI::TEXT_COLOR); } @@ -923,13 +923,13 @@ void SidePanel::PlanetPanel::SetPrimaryFocus(FocusType focus) { Planet *planet = GetPlanet(); - HumanClientApp::Orders().IssueOrder(new ChangeFocusOrder(HumanClientApp::GetApp()->EmpireID(),planet->ID(),focus,true)); + HumanClientApp::GetApp()->Orders().IssueOrder(new ChangeFocusOrder(HumanClientApp::GetApp()->EmpireID(),planet->ID(),focus,true)); } void SidePanel::PlanetPanel::SetSecondaryFocus(FocusType focus) { Planet *planet = GetPlanet(); - HumanClientApp::Orders().IssueOrder(new ChangeFocusOrder(HumanClientApp::GetApp()->EmpireID(),planet->ID(),focus,false)); + HumanClientApp::GetApp()->Orders().IssueOrder(new ChangeFocusOrder(HumanClientApp::GetApp()->EmpireID(),planet->ID(),focus,false)); } void SidePanel::PlanetPanel::MouseWheel(const GG::Pt& pt, int move, Uint32 keys) @@ -1099,14 +1099,14 @@ return; } - HumanClientApp::Orders().IssueOrder(new FleetColonizeOrder( empire_id, ship->ID(), planet->ID())); + HumanClientApp::GetApp()->Orders().IssueOrder(new FleetColonizeOrder( empire_id, ship->ID(), planet->ID())); } else // cancel colonization { - const FleetColonizeOrder *col_order = dynamic_cast<const FleetColonizeOrder*>(HumanClientApp::Orders().ExamineOrder(it->second)); + const FleetColonizeOrder *col_order = dynamic_cast<const FleetColonizeOrder*>(HumanClientApp::GetApp()->Orders().ExamineOrder(it->second)); int ship_id = col_order?col_order->ShipID():UniverseObject::INVALID_OBJECT_ID; - HumanClientApp::Orders().RecindOrder(it->second); + HumanClientApp::GetApp()->Orders().RecindOrder(it->second); // if the ship now buils a fleet of its own, make sure that fleet appears // at a possibly opend FleetWnd @@ -1148,7 +1148,7 @@ edit_wnd.Run(); if(edit_wnd.Result() != "") { - HumanClientApp::Orders().IssueOrder(new RenameOrder(HumanClientApp::GetApp()->EmpireID(), planet->ID(), edit_wnd.Result())); + HumanClientApp::GetApp()->Orders().IssueOrder(new RenameOrder(HumanClientApp::GetApp()->EmpireID(), planet->ID(), edit_wnd.Result())); m_planet_name->SetText(planet->Name()); } break; @@ -1467,7 +1467,7 @@ void SidePanel::SetSystem(int system_id) { - const System* new_system = HumanClientApp::GetUniverse().Object<const System>(system_id); + const System* new_system = GetUniverse().Object<const System>(system_id); if (new_system && new_system != m_system) PlaySidePanelOpenSound(); TempUISoundDisabler sound_disabler; Modified: trunk/FreeOrion/UI/SystemIcon.cpp =================================================================== --- trunk/FreeOrion/UI/SystemIcon.cpp 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/UI/SystemIcon.cpp 2006-03-07 00:15:43 UTC (rev 1808) @@ -41,7 +41,7 @@ //////////////////////////////////////////////// SystemIcon::SystemIcon(int id, double zoom) : GG::Control(0, 0, 1, 1, GG::CLICKABLE), - m_system(*ClientApp::GetUniverse().Object<const System>(id)), + m_system(*GetUniverse().Object<const System>(id)), m_static_graphic(0), m_default_star_color(GG::CLR_WHITE) { @@ -158,7 +158,7 @@ if (owners.size() < 2) { GG::Clr text_color = ClientUI::TEXT_COLOR; if (!owners.empty()) { - text_color = HumanClientApp::Empires().Lookup(*owners.begin())->Color(); + text_color = Empires().Lookup(*owners.begin())->Color(); } m_name.push_back(new GG::TextControl(0, 0, m_system.Name(), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS), text_color)); AttachChild(m_name[0]); @@ -177,7 +177,7 @@ } m_name.push_back(new GG::TextControl(0, 0, m_system.Name().substr(first_char_pos, last_char_pos - first_char_pos), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS), - HumanClientApp::Empires().Lookup(*it)->Color())); + Empires().Lookup(*it)->Color())); AttachChild(m_name.back()); first_char_pos = last_char_pos; } @@ -240,7 +240,7 @@ MapWnd* map_wnd = ClientUI::GetClientUI()->GetMapWnd(); int stationary_y = 0; int moving_y = size.y - BUTTON_SIZE; - for (EmpireManager::const_iterator it = HumanClientApp::Empires().begin(); it != HumanClientApp::Empires().end(); ++it) { + for (EmpireManager::const_iterator it = Empires().begin(); it != Empires().end(); ++it) { std::vector<int> fleet_IDs = m_system.FindObjectIDs(StationaryFleetVisitor(it->first)); FleetButton* stationary_fb = 0; if (!fleet_IDs.empty()) { Modified: trunk/FreeOrion/UI/TurnProgressWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TurnProgressWnd.cpp 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/UI/TurnProgressWnd.cpp 2006-03-07 00:15:43 UTC (rev 1808) @@ -60,10 +60,10 @@ void TurnProgressWnd::UpdateTurnProgress(const std::string& phase_str, int empire_id) { *m_phase_text << phase_str; - Empire* empire = HumanClientApp::Empires().Lookup(empire_id); + Empire* empire = Empires().Lookup(empire_id); if (empire) { *m_empire_text << empire->Name(); - GG::Clr text_color = HumanClientApp::Empires().Lookup(empire_id)->Color(); + GG::Clr text_color = Empires().Lookup(empire_id)->Color(); m_empire_text->SetColor(text_color); } else { *m_empire_text << ""; Modified: trunk/FreeOrion/client/AI/AIClientApp.cpp =================================================================== --- trunk/FreeOrion/client/AI/AIClientApp.cpp 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/client/AI/AIClientApp.cpp 2006-03-07 00:15:43 UTC (rev 1808) @@ -217,9 +217,12 @@ if (msg.Sender() == -1) { Logger().debugStream() << "AIClientApp::HandleMessageImpl : Received GAME_START message; " "starting AI turn..."; - + std::stringstream stream(msg.GetText()); + XMLDoc doc; + doc.ReadDoc(stream); + m_current_turn = boost::lexical_cast<int>(doc.root_node.Attribute("turn_number")); // as it stands now, just start turn - StartTurn( ); + StartTurn(); } break; } @@ -245,7 +248,11 @@ if (msg.Sender() == -1) { // as it stands now, just start turn Logger().debugStream() << "AIClientApp::HandleMessageImpl : Received TURN_UPDATE message; ..."; - StartTurn( ); + std::stringstream stream(msg.GetText()); + XMLDoc doc; + doc.ReadDoc(stream); + m_current_turn = boost::lexical_cast<int>(doc.root_node.Attribute("turn_number")); + StartTurn(); } break; } Modified: trunk/FreeOrion/client/ClientApp.cpp =================================================================== --- trunk/FreeOrion/client/ClientApp.cpp 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/client/ClientApp.cpp 2006-03-07 00:15:43 UTC (rev 1808) @@ -18,7 +18,9 @@ m_multiplayer_lobby_wnd(0), m_current_combat(0), m_player_id(-1), - m_empire_id(-1) + m_empire_id(-1), + m_current_turn(INVALID_GAME_TURN), + m_difficulty_level(INVALID_DIFFICULTY_LEVEL) { if (s_app) throw std::runtime_error("Attempted to construct a second instance of ClientApp"); @@ -27,9 +29,33 @@ } ClientApp::~ClientApp() +{} + +const std::string& ClientApp::PlayerName() const { + return m_player_name; } +int ClientApp::PlayerID() const +{ + return m_player_id; +} + +int ClientApp::EmpireID() const +{ + return m_empire_id; +} + +int ClientApp::CurrentTurn() const +{ + return m_current_turn; +} + +DifficultyLevel ClientApp::CurrentDifficultyLevel() const +{ + return m_difficulty_level; +} + Message ClientApp::TurnOrdersMessage(bool save_game_data/* = false*/) const { XMLDoc orders_doc; @@ -42,58 +68,56 @@ return ::TurnOrdersMessage(m_player_id, -1, orders_doc); } -void ClientApp::HandleMessage(const Message& msg) +void ClientApp::StartTurn() { - s_app->HandleMessageImpl(msg); + // send message + m_network_core.SendMessage(TurnOrdersMessage()); + + // clear order set + m_orders.Reset( ); } -void ClientApp::HandleServerDisconnect() +Universe& ClientApp::GetUniverse() { - s_app->HandleServerDisconnectImpl(); + return m_universe; } -Universe& ClientApp::GetUniverse() +ClientEmpireManager& ClientApp::Empires() { - return s_app->m_universe; + return m_empires; } -MultiplayerLobbyWnd* ClientApp::MultiplayerLobby() +OrderSet& ClientApp::Orders() { - return s_app->m_multiplayer_lobby_wnd; + return m_orders; } -ClientEmpireManager& ClientApp::Empires() +ClientNetworkCore& ClientApp::NetworkCore() { - return s_app->m_empires; + return m_network_core; } -CombatModule* ClientApp::CurrentCombat() +MultiplayerLobbyWnd* ClientApp::MultiplayerLobby() { - return s_app->m_current_combat; + return m_multiplayer_lobby_wnd; } -OrderSet& ClientApp::Orders() +CombatModule* ClientApp::CurrentCombat() { - return s_app->m_orders; + return m_current_combat; } -ClientNetworkCore& ClientApp::NetworkCore() +void ClientApp::HandleMessage(const Message& msg) { - return s_app->m_network_core; + s_app->HandleMessageImpl(msg); } - -void ClientApp::StartTurn( ) +void ClientApp::HandleServerDisconnect() { - // send message - m_network_core.SendMessage(TurnOrdersMessage()); - - // clear order set - m_orders.Reset( ); + s_app->HandleServerDisconnectImpl(); } - -int ClientApp::GetNewObjectID( ) +int ClientApp::GetNewObjectID() { int new_id = UniverseObject::INVALID_OBJECT_ID; @@ -107,8 +131,13 @@ return new_id; } -void ClientApp::UpdateTurnData( const XMLDoc &new_doc ) +ClientApp* ClientApp::GetApp() { + return s_app; +} + +void ClientApp::UpdateTurnData(const XMLDoc &new_doc) +{ if (new_doc.root_node.ContainsChild(EmpireManager::EMPIRE_UPDATE_TAG)) m_empires.HandleEmpireElementUpdate(new_doc.root_node.Child(EmpireManager::EMPIRE_UPDATE_TAG)); if (new_doc.root_node.ContainsChild("Universe")) Modified: trunk/FreeOrion/client/ClientApp.h =================================================================== --- trunk/FreeOrion/client/ClientApp.h 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/client/ClientApp.h 2006-03-07 00:15:43 UTC (rev 1808) @@ -22,6 +22,10 @@ #include "../universe/Universe.h" #endif +#ifndef _AppInterface_h_ +#include "../util/AppInterface.h" +#endif + #include <string> namespace log4cpp {class Category;}; @@ -42,9 +46,11 @@ //@} /** \name Accessors */ //@{ - const std::string& PlayerName() const {return m_player_name;} ///< returns the player name of this client - int PlayerID() const {return m_player_id;} ///< returns the player ID of this client - int EmpireID() const {return m_empire_id;} ///< returns the empire ID of this client + const std::string& PlayerName() const; ///< returns the player name of this client + int PlayerID() const; ///< returns the player ID of this client + int EmpireID() const; ///< returns the empire ID of this client + int CurrentTurn() const; ///< returns the current game turn + DifficultyLevel CurrentDifficultyLevel() const; ///< returns current turn of the client (one of the DifficultyLevel enum values) /** returns the orders message containing all orders issued so far in the turn; if \a save_game_data is true, additional client-side data may also be included */ @@ -52,7 +58,14 @@ //@} /** \name Mutators */ //@{ - virtual void StartTurn( ); ///< encodes order sets and sends turn orders message + virtual void StartTurn(); ///< encodes order sets and sends turn orders message + + Universe& GetUniverse(); ///< returns client's local copy of Universe + ClientEmpireManager& Empires(); ///< returns the set of known Empires + OrderSet& Orders(); ///< returns Order set for this client's player + ClientNetworkCore& NetworkCore(); ///< returns the network core object for this client's player + MultiplayerLobbyWnd* MultiplayerLobby(); ///< returns the multiplayer lobby window, or 0 if none exists + CombatModule* CurrentCombat(); ///< returns this client's currently executing Combat; may be 0 //@} /** handles an incoming message from the server with the appropriate action or response */ @@ -63,14 +76,9 @@ /** returns a universe object ID which can be used for new objects created by the client. Can return UniverseObject::INVALID_OBJECT_ID if an ID cannot be created. */ - static int GetNewObjectID( ); + static int GetNewObjectID(); - static MultiplayerLobbyWnd* MultiplayerLobby(); ///< returns the multiplayer lobby window, or 0 if none exists - static Universe& GetUniverse(); ///< returns client's local copy of Universe - static ClientEmpireManager& Empires(); ///< returns the set of known Empires - static CombatModule* CurrentCombat(); ///< returns this client's currently executing Combat; may be 0 - static OrderSet& Orders(); ///< returns Order set for this client's player - static ClientNetworkCore& NetworkCore(); ///< returns the network core object for this client's player + static ClientApp* GetApp(); ///< returns the singletom ClientApp object protected: /** handles universe and empire data update */ @@ -86,7 +94,9 @@ std::string m_player_name; int m_player_id; int m_empire_id; - + int m_current_turn; + DifficultyLevel m_difficulty_level; + private: const ClientApp& operator=(const ClientApp&); // disabled ClientApp(const ClientApp&); // disabled Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-03-07 00:15:43 UTC (rev 1808) @@ -36,6 +36,7 @@ #include <boost/iostreams/device/back_inserter.hpp> #include <boost/iostreams/filtering_stream.hpp> #include <boost/range/iterator_range.hpp> +#include <boost/iostreams/device/file.hpp> #endif @@ -354,7 +355,7 @@ Exit(1); } - SDL_WM_SetCaption(("FreeOrion "+FreeOrionVersionString()).c_str(), "FreeOrion"); + SDL_WM_SetCaption(("FreeOrion " + FreeOrionVersionString()).c_str(), "FreeOrion"); if (SDLNet_Init() < 0) { Logger().errorStream() << "SDL Net initialization failed: " << SDLNet_GetError(); @@ -534,7 +535,6 @@ Logger().debugStream() << "SDLQuit() complete."; } -#include <boost/iostreams/device/file.hpp> void HumanClientApp::HandleMessageImpl(const Message& msg) { m_handling_message = true; @@ -663,12 +663,11 @@ m_ui->GenerateSitRepText(*it); } - int turn_number; - turn_number = boost::lexical_cast<int>(doc.root_node.Attribute("turn_number")); + m_current_turn = boost::lexical_cast<int>(doc.root_node.Attribute("turn_number")); - Autosave(turn_number, true); + Autosave(true); m_ui->ScreenMap(); - m_ui->InitTurn( turn_number ); // init the new turn + m_ui->InitTurn(m_current_turn); // init the new turn } break; } @@ -698,13 +697,11 @@ } case Message::TURN_UPDATE: { - int turn_number; - std::stringstream stream(msg.GetText()); XMLDoc doc; doc.ReadDoc(stream); - turn_number = boost::lexical_cast<int>(doc.root_node.Attribute("turn_number")); + m_current_turn = boost::lexical_cast<int>(doc.root_node.Attribute("turn_number")); // free current sitreps Empires().Lookup(m_empire_id)->ClearSitRep(); @@ -734,7 +731,7 @@ Deserialize(&ia, boost_xml_universe); Deserialize(&ia, boost_xml_empire_manager); - assert(boost_xml_turn_number == turn_number); + assert(boost_xml_turn_number == m_current_turn); { XMLDoc doc; @@ -763,7 +760,7 @@ } Logger().debugStream() << "HumanClientApp::HandleMessageImpl : Sitrep creation complete"; - Autosave(turn_number, false); + Autosave(false); // if this is the last turn, the TCP message handling inherent in Autosave()'s synchronous message may have // processed an end-of-game message, in which case we need *not* to execute these last two lines below @@ -771,7 +768,7 @@ break; m_ui->ScreenMap(); - m_ui->InitTurn(turn_number); + m_ui->InitTurn(m_current_turn); break; } @@ -869,7 +866,7 @@ } } -void HumanClientApp::Autosave(int turn_number, bool new_game) +void HumanClientApp::Autosave(bool new_game) { if (((m_single_player_game && GetOptionsDB().Get<bool>("autosave.single-player")) || (!m_single_player_game && GetOptionsDB().Get<bool>("autosave.multiplayer"))) && @@ -886,15 +883,15 @@ std::string save_filename; if (m_single_player_game) { - save_filename = boost::io::str(boost::format("AS_%s_%04d.sav") % empire_name % turn_number); + save_filename = boost::io::str(boost::format("AS_%s_%04d.sav") % empire_name % m_current_turn); } else { unsigned int first_good_player_char = m_player_name.find_first_of(legal_chars); if (first_good_player_char == std::string::npos) { - save_filename = boost::io::str(boost::format("AS_%s_%04d.mps") % empire_name % turn_number); + save_filename = boost::io::str(boost::format("AS_%s_%04d.mps") % empire_name % m_current_turn); } else { unsigned int first_bad_player_char = m_player_name.find_first_not_of(legal_chars, first_good_player_char); std::string player_name = m_player_name.substr(first_good_player_char, first_bad_player_char - first_good_player_char); - save_filename = boost::io::str(boost::format("AS_%s_%s_%04d.mps") % player_name % empire_name % turn_number); + save_filename = boost::io::str(boost::format("AS_%s_%s_%04d.mps") % player_name % empire_name % m_current_turn); } } Modified: trunk/FreeOrion/client/human/HumanClientApp.h =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.h 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/client/human/HumanClientApp.h 2006-03-07 00:15:43 UTC (rev 1808) @@ -113,7 +113,7 @@ virtual void HandleMessageImpl(const Message& msg); virtual void HandleServerDisconnectImpl(); - void Autosave(int turn_number, bool new_game); ///< autosaves the current game, iff autosaves are enabled, and m_turns_since_autosave % autosaves.turns == 0 + void Autosave(bool new_game); ///< autosaves the current game, iff autosaves are enabled, and m_turns_since_autosave % autosaves.turns == 0 Process m_server_process; ///< the server process (when hosting a game or playing single player); will be empty when playing multiplayer as a non-host player boost::shared_ptr<ClientUI> m_ui; ///< the one and only ClientUI object! Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/default/eng_stringtable.txt 2006-03-07 00:15:43 UTC (rev 1808) @@ -1643,7 +1643,26 @@ DESC_OR_BETWEEN_OPERANDS or +DESC_TURN + when the current turn is between %1% and %2% +DESC_TURN_NOT + when the current turn is not between %1% and %2% + +DESC_NUMBER_OF + that is one of %1% objects%2% + +DESC_NUMBER_OF_NOT + that is not one of %1% objects%2% + +DESC_CONTAINED_BY + that is contained by an object%1% + +DESC_CONTAINED_BY_NOT + that is not contained by an object%1% + + + ################### # Tech Categories # ################### Modified: trunk/FreeOrion/network/ClientNetworkCore.cpp =================================================================== --- trunk/FreeOrion/network/ClientNetworkCore.cpp 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/network/ClientNetworkCore.cpp 2006-03-07 00:15:43 UTC (rev 1808) @@ -253,8 +253,8 @@ case Message::CLIENT_LOBBY_MODULE: #ifdef FREEORION_BUILD_HUMAN - if (ClientApp::MultiplayerLobby()) - ClientApp::MultiplayerLobby()->HandleMessage(msg); + if (ClientApp::GetApp()->MultiplayerLobby()) + ClientApp::GetApp()->MultiplayerLobby()->HandleMessage(msg); #endif break; @@ -267,7 +267,7 @@ break; case Message::CLIENT_COMBAT_MODULE: - if (ClientApp::CurrentCombat()) { + if (ClientApp::GetApp()->CurrentCombat()) { //ClientApp::CombatModule().HandleMessage(msg); } else { logger.errorStream()<< "ClientNetworkCore::DispatchMessage : Attempted to pass message to Combat module when " Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/server/ServerApp.cpp 2006-03-07 00:15:43 UTC (rev 1808) @@ -206,7 +206,8 @@ m_current_combat(0), m_log_category(log4cpp::Category::getRoot()), m_state(SERVER_IDLE), - m_current_turn(1) + m_current_turn(1), + m_difficulty_level(INVALID_DIFFICULTY_LEVEL) { if (s_app) throw std::runtime_error("Attempted to construct a second instance of singleton class ServerApp"); @@ -2112,7 +2113,6 @@ std::string filename = "TurnUpdate" + boost::lexical_cast<std::string>(m_current_turn) + "-empire" + boost::lexical_cast<std::string>(pEmpire->EmpireID()) + "-doc.xml"; - std::cerr << "writing \"" << filename << "\"" << std::endl; #ifdef FREEORION_LINUX boost::filesystem::ofstream ofs(GetLocalDir() / filename); #else Modified: trunk/FreeOrion/server/ServerApp.h =================================================================== --- trunk/FreeOrion/server/ServerApp.h 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/server/ServerApp.h 2006-03-07 00:15:43 UTC (rev 1808) @@ -2,10 +2,14 @@ #ifndef _ServerApp_h_ #define _ServerApp_h_ -#ifndef _Universe_h_ -#include "../universe/Universe.h" -#endif +#ifndef _AppInterface_h_ +#include "../util/AppInterface.h" +#endif +#ifndef _Process_h_ +#include "../util/Process.h" +#endif + #ifndef _ServerEmpire_h_ #include "../Empire/ServerEmpireManager.h" #endif @@ -14,9 +18,9 @@ #include "../network/ServerNetworkCore.h" #endif -#ifndef _Process_h_ -#include "../util/Process.h" -#endif +#ifndef _Universe_h_ +#include "../universe/Universe.h" +#endif #include <set> #include <vector> @@ -57,8 +61,10 @@ //@} /** \name Accessors */ //@{ - ServerState State() const {return m_state;} ///< returns the current state of the server (one of the ServerState enum values) - XMLDoc ServerStatusDoc() const; ///< returns an XMLDoc that represents the status of the server, suitable for transmission to a client + ServerState State() const {return m_state;} ///< returns the current state of the server (one of the ServerState enum values) + XMLDoc ServerStatusDoc() const; ///< returns an XMLDoc that represents the status of the server, suitable for transmission to a client + int CurrentTurn() const {return m_current_turn;} ///< returns current turn of the server + DifficultyLevel CurrentDifficultyLevel() const {return m_difficulty_level;} ///< returns current turn of the server (one of the DifficultyLevel enum values) //@} /** \name Mutators */ //@{ @@ -146,7 +152,8 @@ ServerState m_state; ///< the server's current state of execution - int m_current_turn; ///< current turn number */ + int m_current_turn; ///< current turn number + DifficultyLevel m_difficulty_level; ///< current difficulty level std::vector<Process> m_ai_clients; ///< AI client child processes std::set<int> m_ai_IDs; ///< player IDs of AI clients Modified: trunk/FreeOrion/universe/Condition.cpp =================================================================== --- trunk/FreeOrion/universe/Condition.cpp 2006-03-06 13:07:53 UTC (rev 1807) +++ trunk/FreeOrion/universe/Condition.cpp 2006-03-07 00:15:43 UTC (rev 1808) @@ -36,6 +36,9 @@ Condition::ConditionBase* NewAnd(const XMLElement& elem) {return new Condition::And(elem);} Condition::ConditionBase* NewOr(const XMLElement& elem) {return new Condition::Or(elem);} Condition::ConditionBase* NewNot(const XMLElement& elem) {return new Condition::Not(elem);} + Condition::ConditionBase* NewTurn(const XMLElement& elem) {return new Condition::Turn(elem);} + Condition::ConditionBase* NewContainedBy(const XMLElement& elem) {return new Condition::ContainedBy(elem);} + Condition::ConditionBase* NewNumberOf(const XMLElement& elem) {return new Condition::NumberOf(elem);} const Fleet* FleetFromObject(const UniverseObject* obj) { @@ -47,6 +50,21 @@ return retval; } + bool Contains(UniverseObject* a, UniverseObject* b) + { + if (const System* system = universe_object_cast<const System*>(a)) { + if (b->SystemID() == system->ID()) + return true; + } else if (const Planet* planet = universe_object_cast<const Planet*>(a)) { + if (planet->ContainsBuilding(b->ID())) + return true; + } else if (const Fleet* fleet = universe_object_cast<const Fleet*>(a)) { + if (fleet->ContainsShip(b->ID())) + return true; + } + return false; + } + bool temp_header_bool = RecordHeaderFile(ConditionRevision()); bool temp_source_bool = RecordSourceFile("$Id$"); } @@ -78,6 +96,9 @@ factory.AddGenerator("Condition::And", &NewAnd); factory.AddGenerator("Condition::Or", &NewOr); factory.AddGenerator("Condition::Not", &NewNot); + factory.AddGenerator("Condition::Turn", &NewTurn); + factory.AddGenerator("Condition::ContainedBy", &NewContainedBy); + factory.AddGenerator("Condition::NumberOf", &NewNumberOf); init = true; } return factory; @@ -87,12 +108,10 @@ // Condition::ConditionBase // /////////////////////////////////////////////////////////// Condition::ConditionBase::ConditionBase() -{ -} +{} Condition::ConditionBase::~ConditionBase() -{ -} +{} void Condition::ConditionBase::Eval(const UniverseObject* source, ObjectSet& targets, ObjectSet& non_targets, SearchDomain search_domain/* = NON_TARGETS*/) const { @@ -101,12 +120,10 @@ ObjectSet::iterator it = from_set.begin(); ObjectSet::iterator end_it = from_set.end(); for ( ; it != end_it; ) { - if (search_domain == TARGETS ? !Match(source, *it) : Match(source, *it)) { - to_set.insert(*it); - ObjectSet::iterator temp = it++; + ObjectSet::iterator temp = it++; + if (search_domain == TARGETS ? !Match(source, *temp) : Match(source, *temp)) { + to_set.insert(*temp); from_set.erase(temp); - } else { - ++it; } } } @@ -122,12 +139,140 @@ } /////////////////////////////////////////////////////////// -// All // +// Turn // /////////////////////////////////////////////////////////// -Condition::All::All() +Condition::Turn::Turn(const ValueRef::ValueRefBase<int>* low, const ValueRef::ValueRefBase<int>* high) : + m_low(low), + m_high(high) +{} + +Condition::Turn::Turn(const XMLElement& elem) { + if (elem.Tag() != "Condition::Turn") + throw std::runtime_error("Condition::Turn : Attempted to create a Turn condition from an XML element with a tag other than \"Condition::Turn\"."); + + m_low = ParseArithmeticExpression<int>(elem.Child("low").Text()); + m_high = ParseArithmeticExpression<int>(elem.Child("high").Text()); } +Condition::Turn::~Turn() +{ + delete m_low; + delete m_high; +} + +std::string Condition::Turn::Description(bool negated/* = false*/) const +{ + std::string low_str = ValueRef::ConstantExpr(m_low) ? lexical_cast<std::string>(m_low->Eval(0, 0)) : m_low->Description(); + std::string high_str = ValueRef::ConstantExpr(m_high) ? lexical_cast<std::string>(m_high->Eval(0, 0)) : m_high->Description(); + std::string description_str = "DESC_TURN"; + if (negated) + description_str += "_NOT"; + return str(format(UserString(description_str)) + % low_str + % high_str); +} + +void Condition::Turn::Eval(const UniverseObject* source, ObjectSet& targets, ObjectSet& non_targets, + SearchDomain search_domain/* = NON_TARGETS*/) const +{ + double low = std::max(0, m_low->Eval(source, source)); + double high = std::min(m_high->Eval(source, source), IMPOSSIBLY_LARGE_TURN); + int turn = CurrentTurn(); + + if (low <= turn && turn < high) { + if (search_domain == NON_TARGETS) { + targets.insert(non_targets.begin(), non_targets.end()); + non_targets.clear(); + } + } +} + +/////////////////////////////////////////////////////////// +// NumberOf // +/////////////////////////////////////////////////////////// +Condition::NumberOf::NumberOf(const ValueRef::ValueRefBase<int>* number, const ConditionBase* condition) : + m_number(number), + m_condition(condition) +{ + Logger().debugStream() << "Creating NumberOf Conditition"; +} + +Condition::NumberOf::NumberOf(const XMLElement& elem) +{ + if (elem.Tag() != "Condition::NumberOf") + throw std::runtime_error("Condition::NumberOf : Attempted to create a NumberOf condition from an XML element with a tag other than \"Condition::NumberOf\"."); + + m_number = ParseArithmeticExpression<int>(elem.Child("number").Text()); + m_condition = ConditionFactory().GenerateObject(elem.Child("condition").Child(0)); +} + +Condition::NumberOf::~NumberOf() +{ + delete m_number; + delete m_condition; +} + +std::string Condition::NumberOf::Description(bool negated/* = false*/) const +{ + std::string value_str = ValueRef::ConstantExpr(m_number) ? lexical_cast<std::string>(m_number->Eval(0, 0)) : m_number->Description(); + std::string description_str = "DESC_NUMBER_OF"; + if (negated) + description_str += "_NOT"; + return str(format(UserString(description_str)) + % value_str + % m_condition->Description()); +} + +void Condition::NumberOf::Eval(const UniverseObject* source, ObjectSet& targets, ObjectSet& non_targets, + SearchDomain search_domain/* = NON_TARGETS*/) const +{ + // get set of all UniverseObjects that satisfy m_condition + ObjectSet condition_targets; + ObjectSet condition_non_targets; + const Universe& universe = GetUniverse(); + for (Universe::const_iterator uit = universe.begin(); uit != universe.end(); ++uit) { + condition_non_targets.insert(uit->second); + } + m_condition->Eval(source, condition_targets, condition_non_targets); + + // find the desired number of objects in condition_targets + int number = m_number->Eval(0, 0); + std::vector<bool> inclusion_list(condition_targets.size()); + std::vector<int> selection_list(condition_targets.size()); + for (unsigned int i = 0; i < selection_list.size(); ++i) { + selection_list[i] = i; + } + for (int i = 0; i < std::min(number, static_cast<int>(condition_targets.size())); ++i) { + int selection = selection_list[RandSmallInt(0, selection_list.size() - 1)]; + inclusion_list[selection] = true; + selection_list.erase(selection_list.begin() + selection); + } + + int i = 0; + for (ObjectSet::const_iterator it = condition_targets.begin(); it != condition_targets.end(); ++it, ++i) { + ObjectSet& from_set = search_domain == TARGETS ? targets : non_targets; + ObjectSet& to_set = search_domain == TARGETS ? non_targets : targets; + if (search_domain == TARGETS ? !inclusion_list[i] : inclusion_list[i]) { + to_set.insert(*it); + from_set.erase(*it); + } + } + + if (search_domain == TARGETS) { + for (ObjectSet::const_iterator it = condition_non_targets.begin(); it != condition_non_targets.end(); ++it) { + non_targets.insert(*it); + targets.erase(*it); + } + } +} + +/////////////////////////////////////////////////////////// +// All // +/////////////////////////////////////////////////////////// +Condition::All::All() +{} + Condition::All::All(const XMLElement& elem) { if (elem.Tag() != "Condition::All") @@ -154,8 +299,7 @@ m_empire_id(empire_id), m_affiliation(affiliation), m_exclusive(exclusive) -{ -} +{} Condition::EmpireAffiliation::EmpireAffiliation(const XMLElement& elem) { @@ -212,8 +356,7 @@ // Self // /////////////////////////////////////////////////////////// Condition::Self::Self() -{ -} +{} Condition::Self::Self(const XMLElement& elem) { @@ -239,13 +382,12 @@ /////////////////////////////////////////////////////////// Condition::Type::Type(const ValueRef::ValueRefBase<UniverseObjectType>* type) : m_type(type) -{ -} +{} Condition::Type::Type(const XMLElement& elem) { if (elem.Tag() != "Condition::Type") - throw std::runtime_error("Condition::Type : Attempted to create aType condition from an XML element with a tag other than \"Condition::Type\"."); + throw std::runtime_error("Condition::Type : Attempted to create a Type condition from an XML element with a tag other than \"Condition::Type\"."); m_type = ParseArithmeticExpression<UniverseObjectType>(elem.Text()); } @@ -294,8 +436,7 @@ /////////////////////////////////////////////////////////// Condition::Building::Building(const std::string& name) : m_name(name) -{ -} +{} Condition::Building::Building(const XMLElement& elem) { @@ -324,8 +465,7 @@ /////////////////////////////////////////////////////////// Condition::HasSpecial::HasSpecial(const std::string& name) : m_name(name) -{ -} +{} Condition::HasSpecial::HasSpecial(const XMLElement& elem) { @@ -353,8 +493,7 @@ /////////////////////////////////////////////////////////// Condition::Contains::Contains(const ConditionBase* condition) : m_condition(condition) -{ -} +{} Condition::Contains::Contains(const XMLElement& elem) { @@ -372,7 +511,8 @@ return str(format(UserString(description_str)) % m_condition->Description()); } -bool Condition::Contains::Match(const UniverseObject* source, const UniverseObject* target) const +void Condition::Contains::Eval(const UniverseObject* source, ObjectSet& targets, ObjectSet& non_targets, + SearchDomain search_domain/* = NON_TARGETS*/) const { // get the list of all UniverseObjects that satisfy m_condition ObjectSet condition_targets; @@ -383,38 +523,72 @@ } m_condition->Eval(source, condition_targets, condition_non_targets); - if (condition_targets.empty()) - return false; - - if (const System* system = universe_object_cast<const System*>(target)) { - bool found = false; - for (ObjectSet::const_iterator it = condition_targets.begin(); it != condition_targets.end(); ++it) { - if ((*it)->SystemID() == system->ID()) { - found = true; - break; + // determine which objects in the Universe contain one or more of the objects in condition_targets + for (ObjectSet::const_iterator it = condition_targets.begin(); it != condition_targets.end(); ++it) { + ObjectSet& from_set = search_domain == TARGETS ? targets : non_targets; + ObjectSet& to_set = search_domain == TARGETS ? non_targets : targets; + ObjectSet::iterator it2 = from_set.begin(); + ObjectSet::iterator end_it2 = from_set.end(); + for ( ; it2 != end_it2; ) { + ObjectSet::iterator temp = it2++; + if (search_domain == TARGETS ? !::Contains(*temp, *it) : ::Contains(*temp, *it)) { + to_set.insert(*temp); + from_set.erase(temp); } } - return found; - } else if (const Planet* planet = universe_object_cast<const Planet*>(target)) { - bool found = false; - for (ObjectSet::const_iterator it = condition_targets.begin(); it != condition_targets.end(); ++it) { - if (planet->ContainsBuilding((*it)->ID())) { - found = true; - break; + } +} + +/////////////////////////////////////////////////////////// +// ContainedBy // +/////////////////////////////////////////////////////////// +Condition::ContainedBy::ContainedBy(const ConditionBase* condition) : + m_condition(condition) +{} + +Condition::ContainedBy::ContainedBy(const XMLElement& elem) +{ + if (elem.Tag() != "Condition::ContainedBy") { + throw std::runtime_error("Condition::ContainedBy : Attempted to create a ContainedBy condition from an XML " + "element with a tag other than \"Condition::ContainedBy\"."); + } + + m_condition = ConditionFactory().GenerateObject(elem.Child(0)); +} + +std::string Condition::ContainedBy::Description(bool negated/* = false*/) const +{ + std::string description_str = "DESC_CONTAINED_BY"; + if (negated) + description_str += "_NOT"; + return str(format(UserString(description_str)) % m_condition->Description()); +} + +void Condition::ContainedBy::Eval(const UniverseObject* source, ObjectSet& targets, ObjectSet& non_targets, + SearchDomain search_domain/* = NON_TARGETS*/) const +{ + // get the list of all UniverseObjects that satisfy m_condition + ObjectSet condition_targets; + ObjectSet condition_non_targets; + const Universe& universe = GetUniverse(); + for (Universe::const_iterator it = universe.begin(); it != universe.end(); ++it) { + condition_non_targets.insert(it->second); + } + m_condition->Eval(source, condition_targets, condition_non_targets); + + // determine which objects in the Universe are contained within one or more of the objects in condition_targets + for (ObjectSet::const_iterator it = condition_targets.begin(); it != condition_targets.end(); ++it) { + ObjectSet& from_set = search_domain == TARGETS ? targets : non_targets; + ObjectSet& to_set = search_domain == TARGETS ? non_targets : targets; + ObjectSet::iterator it2 = from_set.begin(); + ObjectSet::iterator end_it2 = from_set.end(); + for ( ; it2 != end_it2; ) { + ObjectSet::iterator temp = it2++; + if (search_domain == TARGETS ? !::Contains(*it, *temp) : ::Contains(*it, *temp)) { + to_set.insert(*temp); + from_set.erase(temp); } } - return found; - } else if (const Fleet* fleet = universe_object_cast<const Fleet*>(target)) { - bool found = false; - for (ObjectSet::const_iterator it = condition_targets.begin(); it != condition_targets.end(); ++it) { - if (fleet->ContainsShip((*it)->ID())) { - found = true; - break; - } - } - return found; - } else { - return false; } } @@ -423,8 +597,7 @@ /////////////////////////////////////////////////////////// Condition::PlanetType::PlanetType(const std::vector<const ValueRef::ValueRefBase< ::PlanetType>*>& types) : m_types(types) -{ -} +{} Condition::PlanetType::PlanetType(const XMLElement& elem) { @@ -483,8 +656,7 @@ /////////////////////////////////////////////////////////// Condition::PlanetSize::PlanetSize(const std::vector<const ValueRef::ValueRefBase< ::PlanetSize>*>& sizes) : m_sizes(sizes) -{ -} +{} Condition::PlanetSize::PlanetSize(const XMLElement& elem) { @@ -543,8 +715,7 @@ /////////////////////////////////////////////////////////// Condition::PlanetEnvironment::PlanetEnvironment(const std::vector<const ValueRef::ValueRefBase< ::PlanetEnvironment>*>& environments) : m_environments(environments) -{ -} +{} Condition::PlanetEnvironment::PlanetEnvironment(const XMLElement& elem) { @@ -604,8 +775,7 @@ Condition::FocusType::FocusType(const std::vector<const ValueRef::ValueRefBase< ::FocusType>*>& foci, bool primary) : m_foci(foci), m_primary(primary) -{ -} +{} Condition::FocusType::FocusType(const XMLElement& elem) { @@ -666,8 +836,7 @@ /////////////////////////////////////////////////////////// Condition::StarType::StarType(const std::vector<const ValueRef::ValueRefBase< ::StarType>*>& types) : m_types(types) -{ -} +{} Condition::StarType::StarType(const XMLElement& elem) { @@ -722,8 +891,7 @@ /////////////////////////////////////////////////////////// Condition::Chance::Chance(const ValueRef::ValueRefBase<double>* chance) : m_chance(chance) -{ -} +{} Condition::Chance::Chance(const XMLElement& elem) { @@ -768,8 +936,7 @@ m_low(low), m_high(high), m_max_meter(max_meter) -{ -} +{} Condition::MeterValue::MeterValue(const XMLElement& elem) { @@ -819,8 +986,7 @@ m_stockpile(stockpile), m_low(low), m_high(high) -{ -} +{} Condition::EmpireStockpileValue::EmpireStockpileValue(const XMLElement& elem) { @@ -874,8 +1040,7 @@ /////////////////////////////////////////////////////////// Condition::VisibleToEmpire::VisibleToEmpire(const std::vector<const ValueRef::ValueRefBase<int>*>& empire_ids) : m_empire_ids(empire_ids) -{ -} +{} Condition::VisibleToEmpire::VisibleToEmpire(const XMLElement& elem) { @@ -937,8 +1102,7 @@ Condition::WithinDistance::WithinDistance(const ValueRef::ValueRefBase<double>* distance, const ConditionBase* condition) : m_distance(distance), m_condition(condition) -{ -} +{} Condition::WithinDistance::WithinDistance(const XMLElement& elem) { @@ -974,12 +1138,10 @@ ObjectSet::iterator it2 = from_set.begin(); ObjectSet::iterator end_it2 = from_set.end(); for ( ; it2 != end_it2; ) { - if (search_domain == TARGETS ? !Match(*it, *it2) : Match(*it, *it2)) { - to_set.insert(*it2); - ObjectSet::iterator temp = it2++; + ObjectSet::iterator temp = it2++; + if (search_domain == TARGETS ? !Match(*it, *temp) : Match(*it, *temp)) { + to_set.insert(*temp); from_set.erase(temp); - } else { - ++it2; } } } @@ -1011,8 +1173,7 @@ Condition::WithinStarlaneJumps::WithinStarlaneJumps(const ValueRef::ValueRefBase<int>* jumps, const ConditionBase* condition) : m_jumps(jumps), m_condition(condition) -{ -} +{} Condition::WithinStarlaneJumps::WithinStarlaneJumps(const XMLElement& elem) { @@ -1048,12 +1209,10 @@ ObjectSet::iterator it2 = from_set.begin(); ObjectSet::iterator end_it2 = from_set.end(); for ( ; it2 != end_it2; ) { - if (search_domain == TARGETS ? !Match(*it, *it2) : Match(*it, *it2)) { - to_set.insert(*it2); - ObjectSet::iterator temp = it2++; + ObjectSet::iterator temp = it2++; + if (search_domain == TARGETS ? !Match(*it, *temp) : Match(*it, *temp)) { + to_set.insert(*temp); from_set.erase(temp); - } else { - ++it2; } } } @@ -1129,8 +1288,7 @@ // EffectTarget // /////////////////////////////////////////////////////////// Condition::EffectTarget::EffectTarget() -{ -} +{} Condition::EffectTarget::EffectTarget(const XMLElement& elem) { @@ -1193,7 +1351,7 @@ ... [truncated message content] |
From: <tz...@us...> - 2006-03-23 05:20:56
|
Revision: 1826 Author: tzlaine Date: 2006-03-22 21:20:46 -0800 (Wed, 22 Mar 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1826&view=rev Log Message: ----------- Added a new Message::MessageType DEBUG, and added a new keyboard accelarator Ctrl-r that sends a DEBUG message if FO is built without FREEORION_RELEASE defined. If the server is also built without FREEORION_RELEASE defined, it will execute the Condition regression tests and output the results to the appropriate files. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/network/Message.h trunk/FreeOrion/server/ServerApp.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2006-03-22 03:25:21 UTC (rev 1825) +++ trunk/FreeOrion/UI/MapWnd.cpp 2006-03-23 05:20:46 UTC (rev 1826) @@ -70,6 +70,15 @@ } bool temp_bool = RegisterOptions(&AddOptions); +#ifndef FREEORION_RELEASE + bool RequestRegressionTestDump() + { + ClientNetworkCore& network_core = HumanClientApp::GetApp()->NetworkCore(); + Message msg(Message::DEBUG, HumanClientApp::GetApp()->PlayerID(), -1, Message::CORE, "EffectsRegressionTest"); + network_core.SendMessage(msg); + return true; + } +#endif } @@ -305,6 +314,12 @@ GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_v, 0), &MapWnd::ZoomToPrevFleet, this); GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_b, 0), &MapWnd::ZoomToNextFleet, this); +#ifndef FREEORION_RELEASE + // special development-only key combo that dumps ValueRef, Condition, and Effect regression tests using the current + // Universe + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_r, GG::GGKMOD_CTRL), &RequestRegressionTestDump); +#endif + g_chat_edit_history.push_front(""); #if TEST_BROWSE_INFO @@ -1619,6 +1634,10 @@ GG::GUI::GetGUI()->SetAccelerator(GG::GGK_g, 0); GG::GUI::GetGUI()->SetAccelerator(GG::GGK_v, 0); GG::GUI::GetGUI()->SetAccelerator(GG::GGK_b, 0); + +#ifndef FREEORION_RELEASE + GG::GUI::GetGUI()->SetAccelerator(GG::GGK_r, GG::GGKMOD_CTRL); +#endif } void MapWnd::RemoveAccelerators() @@ -1653,6 +1672,10 @@ GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_g, 0); GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_v, 0); GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_b, 0); + +#ifndef FREEORION_RELEASE + GG::GUI::GetGUI()->RemoveAccelerator(GG::GGK_r, GG::GGKMOD_CTRL); +#endif } /* Disables keyboard accelerators that use an alphanumeric key Modified: trunk/FreeOrion/network/Message.h =================================================================== --- trunk/FreeOrion/network/Message.h 2006-03-22 03:25:21 UTC (rev 1825) +++ trunk/FreeOrion/network/Message.h 2006-03-23 05:20:46 UTC (rev 1826) @@ -33,6 +33,7 @@ /** Represents the type of the message */ enum MessageType { UNDEFINED, + DEBUG, ///< used to send special messages used for debugging purposes SERVER_STATUS, ///< sent to the client when requested, and when the server first recieves a connection from a client HOST_GAME, ///< sent when a client wishes to establish a game at the server JOIN_GAME, ///< sent when a client wishes to join a game being established at the server Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2006-03-22 03:25:21 UTC (rev 1825) +++ trunk/FreeOrion/server/ServerApp.cpp 2006-03-23 05:20:46 UTC (rev 1826) @@ -31,13 +31,7 @@ namespace fs = boost::filesystem; -#define TEST_VALUE_REF_VARIABLE 0 -#if TEST_VALUE_REF_VARIABLE -#include "../universe/ValueRef.h" -#endif - -#define TEST_CONDITIONS_CLASS 0 -#if TEST_CONDITIONS_CLASS +#ifndef FREEORION_RELEASE #define TEST_CONDITIONS_CLASS_CONCISE_OUTPUT 1 #include "../universe/Condition.h" namespace { @@ -48,7 +42,6 @@ db.Add("condition-test-source", "Selects source object (id) for the Condition class tests.", 528, Validator<int>()); } bool condition_test_temp_bool = RegisterOptions(&AddConditionTestOptions); - } #endif @@ -568,156 +561,152 @@ m_universe.SetUniverse(doc.root_node.Child("Universe")); LoadGameVars(doc); -#if TEST_VALUE_REF_VARIABLE - std::ofstream ofs("ValueRefTest.txt"); + CreateAIClients(std::vector<PlayerSetupData>(m_expected_players - 1)); + g_load_doc = doc; + m_state = SERVER_GAME_SETUP; + } else { + m_log_category.errorStream() << "Player #" << msg.Sender() << " attempted to initiate a game save, but is not the host, or is " + "not found in the player list."; + } + break; + } - // first, create the XML representation of an arbitrary UniverseObject - UniverseObject* object = m_universe.Object(530); - XMLDoc debug_doc; - debug_doc.root_node.AppendChild(object->XMLEncode()); - debug_doc.WriteDoc(ofs); + case Message::TURN_ORDERS: { + /* decode order set */ + std::stringstream stream(msg.GetText()); + XMLDoc doc; + doc.ReadDoc(stream); - // now, read all the ValueRef-accessible items from this object - const char* field_names[] = { - "CurrentFarming", - "MaxFarming", - "CurrentIndustry", - "MaxIndustry", - "CurrentResearch", - "MaxResearch", - "CurrentTrade", - "MaxTrade", - "CurrentMining", - "MaxMining", - "CurrentConstruction", - "MaxConstruction", - "CurrentHealth", - "MaxHealth", - "CurrentPopulation", - "MaxPopulation", - "TradeStockpile", - "MineralStockpile", - "FoodStockpile", - "TradeProduction", - "FoodProduction", - "MineralProduction", - "IndustryProduction", - "ResearchProduction", - 0 - }; + if (doc.root_node.ContainsChild("save_game_data")) { // the Orders were in answer to a save game data request + doc.root_node.RemoveChild("save_game_data"); + m_player_save_game_data[msg.Sender()].AppendChild(doc.root_node.Child("Orders")); + if (doc.root_node.ContainsChild("UI")) + m_player_save_game_data[msg.Sender()].AppendChild(doc.root_node.Child("UI")); + m_players_responded.insert(msg.Sender()); + } else { // the Orders were sent from a Player who has finished her turn + if (GetOptionsDB().Get<bool>("debug.log-turn-orders")) { + std::string dbg_file("TurnOrdersReceived_empire"); + dbg_file += boost::lexical_cast<std::string>(GetPlayerEmpire(msg.Sender())->EmpireID()); + dbg_file += ".xml"; +#ifdef FREEORION_LINUX + boost::filesystem::ofstream output(GetLocalDir() / dbg_file); +#else + std::ofstream output(dbg_file.c_str()); +#endif + doc.WriteDoc(output); + output.close(); + } - try { - ofs << "\nOBJECT:\n" << std::endl; - // first the source object version... - const char** curr_name = field_names; - while (*curr_name) { - ofs << *curr_name << "(source)= " << ValueRef::Variable<double>(true, *curr_name).Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<double>(true, *curr_name).Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<double>(ValueRef::Variable<double>(true, *curr_name).Eval(object, 0)).Description() << std::endl; - curr_name++; - } - ofs << std::endl; + m_network_core.SendMessage(TurnProgressMessage(msg.Sender(), Message::WAITING_FOR_PLAYERS, -1)); - ofs << "PlanetSize(source)= " << ValueRef::Variable<PlanetSize>(true, "PlanetSize").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<PlanetSize>(true, "PlanetSize").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<PlanetSize>(ValueRef::Variable<PlanetSize>(true, "PlanetSize").Eval(object, 0)).Description() << std::endl; - ofs << "PlanetType(source)= " << ValueRef::Variable<PlanetType>(true, "PlanetType").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<PlanetType>(true, "PlanetType").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<PlanetType>(ValueRef::Variable<PlanetType>(true, "PlanetType").Eval(object, 0)).Description() << std::endl; - ofs << "PlanetEnvironment(source)= " << ValueRef::Variable<PlanetEnvironment>(true, "PlanetEnvironment").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<PlanetEnvironment>(true, "PlanetEnvironment").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<PlanetEnvironment>(ValueRef::Variable<PlanetEnvironment>(true, "PlanetEnvironment").Eval(object, 0)).Description() << std::endl; - ofs << "ObjectType(source)= " << ValueRef::Variable<UniverseObjectType>(true, "ObjectType").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<UniverseObjectType>(true, "ObjectType").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<UniverseObjectType>(ValueRef::Variable<UniverseObjectType>(true, "ObjectType").Eval(object, 0)).Description() << std::endl; - ofs << "StarType(source)= " << ValueRef::Variable<StarType>(true, "StarType").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<StarType>(true, "StarType").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<StarType>(ValueRef::Variable<StarType>(true, "StarType").Eval(object, 0)).Description() << std::endl; - ofs << "PrimaryFocus(source)= " << ValueRef::Variable<FocusType>(true, "PrimaryFocus").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<FocusType>(true, "PrimaryFocus").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<FocusType>(ValueRef::Variable<FocusType>(true, "PrimaryFocus").Eval(object, 0)).Description() << std::endl; - ofs << "SecondaryFocus(source)= " << ValueRef::Variable<FocusType>(true, "SecondaryFocus").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<FocusType>(true, "SecondaryFocus").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<FocusType>(ValueRef::Variable<FocusType>(true, "SecondaryFocus").Eval(object, 0)).Description() << std::endl; + OrderSet *p_order_set; + p_order_set = new OrderSet( ); + XMLObjectFactory<Order> order_factory; + Order::InitOrderFactory(order_factory); + const XMLElement& root = doc.root_node.Child("Orders"); - ofs << "Owner(source)= " << ValueRef::Variable<int>(true, "Owner").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<int>(true, "Owner").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<int>(ValueRef::Variable<int>(true, "Owner").Eval(object, 0)).Description() << std::endl; - ofs << "ID(source)= " << ValueRef::Variable<int>(true, "ID").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<int>(true, "ID").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<int>(ValueRef::Variable<int>(true, "ID").Eval(object, 0)).Description() << std::endl; - ofs << "\n\n"; + // all orders must originate from this empire in order to be considered valid + Empire* empire = GetPlayerEmpire(msg.Sender()); + assert(empire); - // now the target object version - curr_name = field_names; - while (*curr_name) { - ofs << *curr_name << "(target)= " << ValueRef::Variable<double>(false, *curr_name).Eval(0, object) << std::endl; - curr_name++; + for (int i = 0; i < root.NumChildren(); ++i) { + Order* p_order = order_factory.GenerateObject(root.Child(i)); + if (p_order) { + if (empire->EmpireID() != p_order->EmpireID()) { + throw std::runtime_error( + "ServerApp::HandleMessage : Player \"" + empire->PlayerName() + "\"" + " attempted to issue an order for player " + "\"" + Empires().Lookup(p_order->EmpireID())->PlayerName() + "\"! Terminating..."); + } + p_order_set->AddOrder(p_order); + } else { + m_log_category.errorStream() << "ServerApp::HandleMessage : An Order has been received that has no factory - ignoring."; } - ofs << std::endl; + } - ofs << "PlanetSize(target)= " << ValueRef::Variable<PlanetSize>(false, "PlanetSize").Eval(0, object) << std::endl; - ofs << "PlanetType(target)= " << ValueRef::Variable<PlanetType>(false, "PlanetType").Eval(0, object) << std::endl; - ofs << "PlanetEnvironment(target)= " << ValueRef::Variable<PlanetEnvironment>(false, "PlanetEnvironment").Eval(0, object) << std::endl; - ofs << "ObjectType(target)= " << ValueRef::Variable<UniverseObjectType>(false, "ObjectType").Eval(0, object) << std::endl; - ofs << "StarType(target)= " << ValueRef::Variable<StarType>(false, "StarType").Eval(0, object) << std::endl; - ofs << "PrimaryFocus(target)= " << ValueRef::Variable<FocusType>(false, "PrimaryFocus").Eval(0, object) << std::endl; - ofs << "SecondaryFocus(target)= " << ValueRef::Variable<FocusType>(false, "SecondaryFocus").Eval(0, object) << std::endl; + m_log_category.debugStream() << "ServerApp::HandleMessage : Received orders from player " << msg.Sender(); - ofs << "Owner(target)= " << ValueRef::Variable<int>(false, "Owner").Eval(0, object) << std::endl; - ofs << "ID(target)= " << ValueRef::Variable<int>(false, "ID").Eval(0, object) << std::endl; + /* if all orders are received already, do nothing as we are processing a turn */ + if ( AllOrdersReceived( ) ) + break; - // NOW, re-run the same tests, using a reference to the object's system - ofs << "\nOBJECT'S SYSTEM:\n" << std::endl; - // first the source object version... - curr_name = field_names; - while (*curr_name) { - ofs << "System." << *curr_name << "(source)= " << ValueRef::Variable<double>(true, std::string("System.") + *curr_name).Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<double>(true, std::string("System.") + *curr_name).Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<double>(ValueRef::Variable<double>(true, std::string("System.") + *curr_name).Eval(object, 0)).Description() << std::endl; - curr_name++; - } - ofs << std::endl; + /* add orders to turn sequence */ + SetEmpireTurnOrders( GetPlayerEmpire( msg.Sender() )->EmpireID(), p_order_set ); + + /* look to see if all empires are done */ + if ( AllOrdersReceived( ) ) { + m_log_category.debugStream() << "ServerApp::HandleMessage : All orders received; processing turn..."; + ProcessTurns( ); + } + } + break; + } - ofs << "System.PlanetSize(source)= " << ValueRef::Variable<PlanetSize>(true, "System.PlanetSize").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<PlanetSize>(true, "System.PlanetSize").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<PlanetSize>(ValueRef::Variable<PlanetSize>(true, "System.PlanetSize").Eval(object, 0)).Description() << std::endl; - ofs << "System.PlanetType(source)= " << ValueRef::Variable<PlanetType>(true, "System.PlanetType").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<PlanetType>(true, "System.PlanetType").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<PlanetType>(ValueRef::Variable<PlanetType>(true, "System.PlanetType").Eval(object, 0)).Description() << std::endl; - ofs << "System.PlanetEnvironment(source)= " << ValueRef::Variable<PlanetEnvironment>(true, "System.PlanetEnvironment").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<PlanetEnvironment>(true, "System.PlanetEnvironment").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<PlanetEnvironment>(ValueRef::Variable<PlanetEnvironment>(true, "System.PlanetEnvironment").Eval(object, 0)).Description() << std::endl; - ofs << "System.ObjectType(source)= " << ValueRef::Variable<UniverseObjectType>(true, "System.ObjectType").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<UniverseObjectType>(true, "System.ObjectType").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<UniverseObjectType>(ValueRef::Variable<UniverseObjectType>(true, "System.ObjectType").Eval(object, 0)).Description() << std::endl; - ofs << "System.StarType(source)= " << ValueRef::Variable<StarType>(true, "System.StarType").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<StarType>(true, "System.StarType").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<StarType>(ValueRef::Variable<StarType>(true, "System.StarType").Eval(object, 0)).Description() << std::endl; - ofs << "System.PrimaryFocus(source)= " << ValueRef::Variable<FocusType>(true, "System.PrimaryFocus").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<FocusType>(true, "System.PrimaryFocus").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<FocusType>(ValueRef::Variable<FocusType>(true, "System.PrimaryFocus").Eval(object, 0)).Description() << std::endl; - ofs << "System.SecondaryFocus(source)= " << ValueRef::Variable<FocusType>(true, "System.SecondaryFocus").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<FocusType>(true, "System.SecondaryFocus").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<FocusType>(ValueRef::Variable<FocusType>(true, "System.SecondaryFocus").Eval(object, 0)).Description() << std::endl; + case Message::HUMAN_PLAYER_MSG: { + std::string text = msg.GetText(); - ofs << "System.Owner(source)= " << ValueRef::Variable<int>(true, "System.Owner").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<int>(true, "System.Owner").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<int>(ValueRef::Variable<int>(true, "System.Owner").Eval(object, 0)).Description() << std::endl; - ofs << "System.ID(source)= " << ValueRef::Variable<int>(true, "System.ID").Eval(object, 0) << std::endl; - ofs << " VAR: " << ValueRef::Variable<int>(true, "System.ID").Description() << std::endl; - ofs << " CONST: " << ValueRef::Constant<int>(ValueRef::Variable<int>(true, "System.ID").Eval(object, 0)).Description() << std::endl; - ofs << "\n\n"; + // if there's a colon in the message, treat all tokens before the colon as player names. + // if there are tokens before the colon, but at least one of them *is not* a valid player names, assume there has been a typo, + // and don't send the message at all, since we can't decipher which parts are message and which parts are names + unsigned int colon_position = text.find(':'); + // target_player_names.empty() implies that all players should be sent the message; otherwise, only the indicated players will receive the message + std::set<std::string> target_player_names; + if (colon_position != std::string::npos) { + std::vector<std::string> tokens = Tokenize(text.substr(0, colon_position)); + for (unsigned int i = 0; i < tokens.size(); ++i) { + bool token_is_name = false; + for (std::map<int, PlayerInfo>::const_iterator it = m_network_core.Players().begin(); it != m_network_core.Players().end(); ++it) { + if (tokens[i] == it->second.name) { + token_is_name = true; + break; + } + } + if (token_is_name) + target_player_names.insert(tokens[i]); + else + return; + } + } + if (!target_player_names.empty()) { + text = text.substr(colon_position + 1); + if (text == "") + return; + } + Empire* sender_empire = GetPlayerEmpire(msg.Sender()); + std::string final_text = RgbaTag(Empires().Lookup(sender_empire->EmpireID())->Color()) + m_network_core.Players().find(msg.Sender())->second.name + + (target_player_names.empty() ? ": " : " (whisper):") + text + "</rgba>\n"; + for (std::map<int, PlayerInfo>::const_iterator it = m_network_core.Players().begin(); it != m_network_core.Players().end(); ++it) { + if (target_player_names.empty() || target_player_names.find(it->second.name) != target_player_names.end()) + m_network_core.SendMessage(ChatMessage(msg.Sender(), it->first, final_text)); + } + break; + } - // (skip the target object version; the first round of tests determined that that works alright) - } catch (...) { - ofs.close(); - throw; + case Message::REQUEST_NEW_OBJECT_ID: { + /* get get ID and send back to client, it's waiting for this */ + m_network_core.SendMessage(DispatchObjectIDMessage(msg.Sender(), GetUniverse().GenerateObjectID( ) ) ); + break; + } + + case Message::END_GAME: { + std::map<int, PlayerInfo>::const_iterator it = m_network_core.Players().find(msg.Sender()); + if (it != m_network_core.Players().end() && it->second.host) { + for (std::map<int, PlayerInfo>::const_iterator it2 = m_network_core.Players().begin(); it2 != m_network_core.Players().end(); ++it2) { + if (it->first != it2->first) + m_network_core.SendMessage(EndGameMessage(-1, it2->first)); } + m_state = SERVER_DYING; + m_log_category.debugStream() << "ServerApp::HandleMessage : Server now in mode " << SERVER_DYING << " (SERVER_DYING)."; + m_network_core.SendMessage(Message(Message::SERVER_STATUS, -1, msg.Sender(), Message::CORE, ServerStatusDoc())); + m_network_core.DumpAllConnections(); + Exit(0); + } + break; + } - ofs.close(); -#endif -#if TEST_CONDITIONS_CLASS +#ifndef FREEORION_RELEASE + case Message::DEBUG: { + if (msg.GetText() == "EffectsRegressionTest") { for (int i = 0; i < 32; ++i) { std::ofstream ofs2(("ConditionTest" + boost::lexical_cast<std::string>(i) + ".txt").c_str()); try { @@ -740,20 +729,21 @@ condition = new Condition::Type(new ValueRef::Constant<UniverseObjectType>(OBJ_SHIP)); break; case 5: - // TODO : put a valid building name in here. - condition = new Condition::Building("building_name"); + condition = new Condition::Building("BLD_MEGALITH"); break; case 6: condition = new Condition::HasSpecial("HOMEWORLD_SPECIAL"); break; case 7: - // TODO : put a valid condition name in here. - // condition = new Condition::Contains(/*condition*/); + condition = new Condition::Contains(new Condition::Type(new ValueRef::Constant<UniverseObjectType>(OBJ_PLANET))); break; case 8: + condition = new Condition::ContainedBy(new Condition::Type(new ValueRef::Constant<UniverseObjectType>(OBJ_PLANET))); + break; + case 9: condition = new Condition::PlanetEnvironment(std::vector<const ValueRef::ValueRefBase<PlanetEnvironment>*>(1, new ValueRef::Constant<PlanetEnvironment>(PE_SUPERB))); break; - case 9: { + case 10: { std::vector<const ValueRef::ValueRefBase<PlanetSize>*> vec; vec.push_back(new ValueRef::Constant<PlanetSize>(SZ_ASTEROIDS)); vec.push_back(new ValueRef::Constant<PlanetSize>(SZ_GASGIANT)); @@ -762,7 +752,7 @@ condition = new Condition::PlanetSize(vec); break; } - case 10: { + case 11: { std::vector<const ValueRef::ValueRefBase<FocusType>*> vec; vec.push_back(new ValueRef::Constant<FocusType>(FOCUS_INDUSTRY)); vec.push_back(new ValueRef::Constant<FocusType>(FOCUS_RESEARCH)); @@ -770,73 +760,80 @@ condition = new Condition::FocusType(vec, true); break; } - case 11: + case 12: condition = new Condition::FocusType(std::vector<const ValueRef::ValueRefBase<FocusType>*>(1, new ValueRef::Constant<FocusType>(FOCUS_INDUSTRY)), false); break; - case 12: + case 13: condition = new Condition::StarType(std::vector<const ValueRef::ValueRefBase<StarType>*>(1, new ValueRef::Constant<StarType>(STAR_WHITE))); break; - case 13: + case 14: condition = new Condition::Chance(new ValueRef::Constant<double>(0.05)); break; - case 14: - // TODO : test this + case 15: condition = new Condition::MeterValue(METER_POPULATION, new ValueRef::Constant<double>(10.0), new ValueRef::Constant<double>(90.0), true); break; - case 15: - // TODO : test this + case 16: condition = new Condition::MeterValue(METER_POPULATION, new ValueRef::Constant<double>(10.0), new ValueRef::Constant<double>(90.0), false); break; - case 16: + case 17: // TODO : put a valid stockpile type in here. /*condition = new Condition::StockpileValue(new ValueRef::Constant<StockpileType>(stockpile type value), new ValueRef::Constant<double>(10.0), new ValueRef::Constant<double>(90.0));*/ break; - case 17: + case 18: condition = new Condition::VisibleToEmpire(std::vector<const ValueRef::ValueRefBase<int>*>(1, new ValueRef::Constant<int>(0))); break; - case 18: + case 19: // using condition from FocusType #2 condition = new Condition::WithinDistance(new ValueRef::Constant<double>(50.0), new Condition::FocusType(std::vector<const ValueRef::ValueRefBase<FocusType>*>(1, new ValueRef::Constant<FocusType>(FOCUS_INDUSTRY)), false)); break; - case 19: + case 20: // using condition from FocusType #2 // TODO : test more extensively with Fleets at various positions (moving between Systems, etc.) condition = new Condition::WithinStarlaneJumps(new ValueRef::Constant<int>(2), new Condition::FocusType(std::vector<const ValueRef::ValueRefBase<FocusType>*>(1, new ValueRef::Constant<FocusType>(FOCUS_INDUSTRY)), false)); break; - case 20: + case 21: // TODO (EffectTarget is currently unimplemented) //condition = new Condition::EffectTarget(); break; - /* the rest of these test And Or and Not, and their interactions; A = case 8, B = case 12, C = case 10 */ - case 21: { // A and B + case 22: { + condition = new Condition::Turn(new ValueRef::Constant<int>(2), new ValueRef::Constant<int>(4)); + break; + } + case 23: { + condition = new Condition::NumberOf(new ValueRef::Constant<int>(5), new Condition::Type(new ValueRef::Constant<UniverseObjectType>(OBJ_SYSTEM))); + break; + } + + // the rest of these test And Or and Not, and their interactions; A = case 9, B = case 13, C = case 11 + case 24: { // A and B std::vector<const Condition::ConditionBase*> operands; operands.push_back(new Condition::PlanetEnvironment(std::vector<const ValueRef::ValueRefBase<PlanetEnvironment>*>(1, new ValueRef::Constant<PlanetEnvironment>(PE_SUPERB)))); operands.push_back(new Condition::StarType(std::vector<const ValueRef::ValueRefBase<StarType>*>(1, new ValueRef::Constant<StarType>(STAR_WHITE)))); condition = new Condition::And(operands); break; } - case 22: { // A or B + case 25: { // A or B std::vector<const Condition::ConditionBase*> operands; operands.push_back(new Condition::PlanetEnvironment(std::vector<const ValueRef::ValueRefBase<PlanetEnvironment>*>(1, new ValueRef::Constant<PlanetEnvironment>(PE_SUPERB)))); operands.push_back(new Condition::StarType(std::vector<const ValueRef::ValueRefBase<StarType>*>(1, new ValueRef::Constant<StarType>(STAR_WHITE)))); condition = new Condition::Or(operands); break; } - case 23: { // not A + case 26: { // not A condition = new Condition::Not(new Condition::StarType(std::vector<const ValueRef::ValueRefBase<StarType>*>(1, new ValueRef::Constant<StarType>(STAR_WHITE)))); break; } - case 24: { // A and (B or C) + case 27: { // A and (B or C) std::vector<const Condition::ConditionBase*> operands; operands.push_back(new Condition::PlanetEnvironment(std::vector<const ValueRef::ValueRefBase<PlanetEnvironment>*>(1, new ValueRef::Constant<PlanetEnvironment>(PE_SUPERB)))); std::vector<const Condition::ConditionBase*> or_operands; @@ -846,7 +843,7 @@ condition = new Condition::And(operands); break; } - case 25: { // (A and B) or C + case 28: { // (A and B) or C std::vector<const Condition::ConditionBase*> operands; std::vector<const Condition::ConditionBase*> and_operands; and_operands.push_back(new Condition::PlanetEnvironment(std::vector<const ValueRef::ValueRefBase<PlanetEnvironment>*>(1, new ValueRef::Constant<PlanetEnvironment>(PE_SUPERB)))); @@ -856,7 +853,7 @@ condition = new Condition::Or(operands); break; } - case 26: { // A or (B and C) + case 29: { // A or (B and C) std::vector<const Condition::ConditionBase*> operands; operands.push_back(new Condition::PlanetEnvironment(std::vector<const ValueRef::ValueRefBase<PlanetEnvironment>*>(1, new ValueRef::Constant<PlanetEnvironment>(PE_SUPERB)))); std::vector<const Condition::ConditionBase*> and_operands; @@ -866,7 +863,7 @@ condition = new Condition::Or(operands); break; } - case 27: { // (A or B) and C + case 30: { // (A or B) and C std::vector<const Condition::ConditionBase*> operands; std::vector<const Condition::ConditionBase*> or_operands; or_operands.push_back(new Condition::PlanetEnvironment(std::vector<const ValueRef::ValueRefBase<PlanetEnvironment>*>(1, new ValueRef::Constant<PlanetEnvironment>(PE_SUPERB)))); @@ -876,28 +873,28 @@ condition = new Condition::And(operands); break; } - case 28: { // A or not(B) + case 31: { // A or not(B) std::vector<const Condition::ConditionBase*> operands; operands.push_back(new Condition::PlanetEnvironment(std::vector<const ValueRef::ValueRefBase<PlanetEnvironment>*>(1, new ValueRef::Constant<PlanetEnvironment>(PE_SUPERB)))); operands.push_back(new Condition::Not(new Condition::StarType(std::vector<const ValueRef::ValueRefBase<StarType>*>(1, new ValueRef::Constant<StarType>(STAR_WHITE))))); condition = new Condition::Or(operands); break; } - case 29: { // A and not(B) + case 32: { // A and not(B) std::vector<const Condition::ConditionBase*> operands; operands.push_back(new Condition::PlanetEnvironment(std::vector<const ValueRef::ValueRefBase<PlanetEnvironment>*>(1, new ValueRef::Constant<PlanetEnvironment>(PE_SUPERB)))); operands.push_back(new Condition::Not(new Condition::StarType(std::vector<const ValueRef::ValueRefBase<StarType>*>(1, new ValueRef::Constant<StarType>(STAR_WHITE))))); condition = new Condition::And(operands); break; } - case 30: { // not(B) or A + case 33: { // not(B) or A std::vector<const Condition::ConditionBase*> operands; operands.push_back(new Condition::Not(new Condition::StarType(std::vector<const ValueRef::ValueRefBase<StarType>*>(1, new ValueRef::Constant<StarType>(STAR_WHITE))))); operands.push_back(new Condition::PlanetEnvironment(std::vector<const ValueRef::ValueRefBase<PlanetEnvironment>*>(1, new ValueRef::Constant<PlanetEnvironment>(PE_SUPERB)))); condition = new Condition::Or(operands); break; } - case 31: { // not(B) and A + case 34: { // not(B) and A std::vector<const Condition::ConditionBase*> operands; operands.push_back(new Condition::Not(new Condition::StarType(std::vector<const ValueRef::ValueRefBase<StarType>*>(1, new ValueRef::Constant<StarType>(STAR_WHITE))))); operands.push_back(new Condition::PlanetEnvironment(std::vector<const ValueRef::ValueRefBase<PlanetEnvironment>*>(1, new ValueRef::Constant<PlanetEnvironment>(PE_SUPERB)))); @@ -941,151 +938,11 @@ } ofs2.close(); } -#endif - - CreateAIClients(std::vector<PlayerSetupData>(m_expected_players - 1)); - g_load_doc = doc; - m_state = SERVER_GAME_SETUP; - } else { - m_log_category.errorStream() << "Player #" << msg.Sender() << " attempted to initiate a game save, but is not the host, or is " - "not found in the player list."; } break; } - - case Message::TURN_ORDERS: { - /* decode order set */ - std::stringstream stream(msg.GetText()); - XMLDoc doc; - doc.ReadDoc(stream); - - if (doc.root_node.ContainsChild("save_game_data")) { // the Orders were in answer to a save game data request - doc.root_node.RemoveChild("save_game_data"); - m_player_save_game_data[msg.Sender()].AppendChild(doc.root_node.Child("Orders")); - if (doc.root_node.ContainsChild("UI")) - m_player_save_game_data[msg.Sender()].AppendChild(doc.root_node.Child("UI")); - m_players_responded.insert(msg.Sender()); - } else { // the Orders were sent from a Player who has finished her turn - if (GetOptionsDB().Get<bool>("debug.log-turn-orders")) { - std::string dbg_file("TurnOrdersReceived_empire"); - dbg_file += boost::lexical_cast<std::string>(GetPlayerEmpire(msg.Sender())->EmpireID()); - dbg_file += ".xml"; -#ifdef FREEORION_LINUX - boost::filesystem::ofstream output(GetLocalDir() / dbg_file); -#else - std::ofstream output(dbg_file.c_str()); #endif - doc.WriteDoc(output); - output.close(); - } - m_network_core.SendMessage(TurnProgressMessage(msg.Sender(), Message::WAITING_FOR_PLAYERS, -1)); - - OrderSet *p_order_set; - p_order_set = new OrderSet( ); - XMLObjectFactory<Order> order_factory; - Order::InitOrderFactory(order_factory); - const XMLElement& root = doc.root_node.Child("Orders"); - - // all orders must originate from this empire in order to be considered valid - Empire* empire = GetPlayerEmpire(msg.Sender()); - assert(empire); - - for (int i = 0; i < root.NumChildren(); ++i) { - Order* p_order = order_factory.GenerateObject(root.Child(i)); - if (p_order) { - if (empire->EmpireID() != p_order->EmpireID()) { - throw std::runtime_error( - "ServerApp::HandleMessage : Player \"" + empire->PlayerName() + "\"" - " attempted to issue an order for player " - "\"" + Empires().Lookup(p_order->EmpireID())->PlayerName() + "\"! Terminating..."); - } - p_order_set->AddOrder(p_order); - } else { - m_log_category.errorStream() << "ServerApp::HandleMessage : An Order has been received that has no factory - ignoring."; - } - } - - m_log_category.debugStream() << "ServerApp::HandleMessage : Received orders from player " << msg.Sender(); - - /* if all orders are received already, do nothing as we are processing a turn */ - if ( AllOrdersReceived( ) ) - break; - - /* add orders to turn sequence */ - SetEmpireTurnOrders( GetPlayerEmpire( msg.Sender() )->EmpireID(), p_order_set ); - - /* look to see if all empires are done */ - if ( AllOrdersReceived( ) ) { - m_log_category.debugStream() << "ServerApp::HandleMessage : All orders received; processing turn..."; - ProcessTurns( ); - } - } - break; - } - - case Message::HUMAN_PLAYER_MSG: { - std::string text = msg.GetText(); - - // if there's a colon in the message, treat all tokens before the colon as player names. - // if there are tokens before the colon, but at least one of them *is not* a valid player names, assume there has been a typo, - // and don't send the message at all, since we can't decipher which parts are message and which parts are names - unsigned int colon_position = text.find(':'); - // target_player_names.empty() implies that all players should be sent the message; otherwise, only the indicated players will receive the message - std::set<std::string> target_player_names; - if (colon_position != std::string::npos) { - std::vector<std::string> tokens = Tokenize(text.substr(0, colon_position)); - for (unsigned int i = 0; i < tokens.size(); ++i) { - bool token_is_name = false; - for (std::map<int, PlayerInfo>::const_iterator it = m_network_core.Players().begin(); it != m_network_core.Players().end(); ++it) { - if (tokens[i] == it->second.name) { - token_is_name = true; - break; - } - } - if (token_is_name) - target_player_names.insert(tokens[i]); - else - return; - } - } - if (!target_player_names.empty()) { - text = text.substr(colon_position + 1); - if (text == "") - return; - } - Empire* sender_empire = GetPlayerEmpire(msg.Sender()); - std::string final_text = RgbaTag(Empires().Lookup(sender_empire->EmpireID())->Color()) + m_network_core.Players().find(msg.Sender())->second.name + - (target_player_names.empty() ? ": " : " (whisper):") + text + "</rgba>\n"; - for (std::map<int, PlayerInfo>::const_iterator it = m_network_core.Players().begin(); it != m_network_core.Players().end(); ++it) { - if (target_player_names.empty() || target_player_names.find(it->second.name) != target_player_names.end()) - m_network_core.SendMessage(ChatMessage(msg.Sender(), it->first, final_text)); - } - break; - } - - case Message::REQUEST_NEW_OBJECT_ID: { - /* get get ID and send back to client, it's waiting for this */ - m_network_core.SendMessage(DispatchObjectIDMessage(msg.Sender(), GetUniverse().GenerateObjectID( ) ) ); - break; - } - - case Message::END_GAME: { - std::map<int, PlayerInfo>::const_iterator it = m_network_core.Players().find(msg.Sender()); - if (it != m_network_core.Players().end() && it->second.host) { - for (std::map<int, PlayerInfo>::const_iterator it2 = m_network_core.Players().begin(); it2 != m_network_core.Players().end(); ++it2) { - if (it->first != it2->first) - m_network_core.SendMessage(EndGameMessage(-1, it2->first)); - } - m_state = SERVER_DYING; - m_log_category.debugStream() << "ServerApp::HandleMessage : Server now in mode " << SERVER_DYING << " (SERVER_DYING)."; - m_network_core.SendMessage(Message(Message::SERVER_STATUS, -1, msg.Sender(), Message::CORE, ServerStatusDoc())); - m_network_core.DumpAllConnections(); - Exit(0); - } - break; - } - default: { m_log_category.errorStream() << "ServerApp::HandleMessage : Received an unknown message type \"" << msg.Type() << "\"."; break; |
From: <tz...@us...> - 2006-05-29 08:32:43
|
Revision: 1834 Author: tzlaine Date: 2006-05-29 01:32:37 -0700 (Mon, 29 May 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1834&view=rev Log Message: ----------- A couple of UI improvements to the production screen: - Added a valid-selection predicate to the SidePanel that allows the SidePanel to determine which planets are selectable by an arbitrary criterion (the predicate). This allows the SidePanel to highlight candidates for selection, and disallow selection of invalid planets. - Made all SidePanels track the same system. The result of these changes in the production screen is that opening a new system auto-selects the user-owned planet therein if there is only one, or indicates with a flashing circle around each owned planet that a selection needs to be made. Also, now it is impossible to select an unowned planet. Modified Paths: -------------- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/UI/SidePanel.h Modified: trunk/FreeOrion/UI/BuildDesignatorWnd.cpp =================================================================== --- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2006-05-28 23:41:32 UTC (rev 1833) +++ trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2006-05-29 08:32:37 UTC (rev 1834) @@ -549,7 +549,6 @@ m_build_selector = new BuildSelector(CHILD_WIDTHS, BUILD_SELECTOR_HEIGHT); m_build_selector->MoveTo(GG::Pt(0, h - BUILD_SELECTOR_HEIGHT)); m_side_panel = new SidePanel(CHILD_WIDTHS + SIDE_PANEL_PLANET_RADIUS, 0, MapWnd::SIDE_PANEL_WIDTH, h); - m_side_panel->HiliteSelectedPlanet(true); m_side_panel->Hide(); GG::Connect(m_build_detail_panel->RequestBuildItemSignal, &BuildDesignatorWnd::BuildItemRequested, this); @@ -614,7 +613,12 @@ if (system != UniverseObject::INVALID_OBJECT_ID && system != m_side_panel->SystemID()) { m_side_panel->Show(); m_side_panel->SetSystem(system); + m_side_panel->SetValidSelectionPredicate(boost::shared_ptr<UniverseObjectVisitor>(new OwnedVisitor<Planet>(HumanClientApp::GetApp()->EmpireID()))); m_build_location = UniverseObject::INVALID_OBJECT_ID; + System::ObjectIDVec owned_planets_ids = + GetUniverse().Object<System>(system)->FindObjectIDs(OwnedVisitor<Planet>(HumanClientApp::GetApp()->EmpireID())); + if (owned_planets_ids.size() == 1) + m_side_panel->SelectPlanet(*owned_planets_ids.begin()); } } Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2006-05-28 23:41:32 UTC (rev 1833) +++ trunk/FreeOrion/UI/MapWnd.cpp 2006-05-29 08:32:37 UTC (rev 1834) @@ -179,7 +179,7 @@ // system-view side panel m_side_panel = new SidePanel(GG::GUI::GetGUI()->AppWidth() - SIDE_PANEL_WIDTH, m_toolbar->LowerRight().y, SIDE_PANEL_WIDTH, GG::GUI::GetGUI()->AppHeight()); AttachChild(m_side_panel); - Connect(SystemLeftClickedSignal, &SidePanel::SetSystem, m_side_panel); + GG::Connect(SystemLeftClickedSignal, &SidePanel::SetSystem); m_sitrep_panel = new SitRepPanel( (GG::GUI::GetGUI()->AppWidth()-SITREP_PANEL_WIDTH)/2, (GG::GUI::GetGUI()->AppHeight()-SITREP_PANEL_HEIGHT)/2, SITREP_PANEL_WIDTH, SITREP_PANEL_HEIGHT ); AttachChild(m_sitrep_panel); Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2006-05-28 23:41:32 UTC (rev 1833) +++ trunk/FreeOrion/UI/SidePanel.cpp 2006-05-29 08:32:37 UTC (rev 1834) @@ -362,6 +362,12 @@ class SidePanel::PlanetPanel : public GG::Wnd { public: + enum HilitingType { + HILITING_NONE, + HILITING_CANDIDATE, + HILITING_SELECTED + }; + /** \name Signal Types */ //@{ typedef boost::signal<void (int)> LeftClickedSignalType; ///< emitted when the planet graphic is left clicked by the user //@} @@ -378,7 +384,7 @@ /** \name Accessors */ //@{ virtual bool InWindow(const GG::Pt& pt) const; int PlanetID() const {return m_planet_id;} - bool Hilited() const; + HilitingType Hiliting() const; //@} /** \name Mutators */ //@{ @@ -387,7 +393,7 @@ virtual void RClick(const GG::Pt& pt, Uint32 keys); virtual void MouseWheel(const GG::Pt& pt, int move, Uint32 keys); ///< respond to movement of the mouse wheel (move > 0 indicates the wheel is rolled up, < 0 indicates down) void Update(); - void Hilite(bool b); + void Hilite(HilitingType ht); //@} mutable LeftClickedSignalType PlanetImageLClickedSignal; ///< returns the left clicked signal object for this Planet panel @@ -430,7 +436,7 @@ CUIButton *m_button_colonize; ///< btn which can be pressed to colonize this planet GG::DynamicGraphic *m_planet_graphic; ///< image of the planet (can be a frameset); this is now used only for asteroids RotatingPlanetControl *m_rotating_planet_graphic; ///< a realtime-rendered planet that rotates, with a textured surface mapped onto it - bool m_hilited; + HilitingType m_hiliting; boost::signals::connection m_connection_system_changed; ///< stores connection used to handle a system change boost::signals::connection m_connection_planet_changed; ///< stores connection used to handle a planet change @@ -457,8 +463,8 @@ void Clear(); void SetPlanets(const std::vector<const Planet*> &plt_vec, StarType star_type); - void HiliteSelectedPlanet(bool b); ///< enables/disables hiliting the currently-selected planet in the container void SelectPlanet(int planet_id); + void SetValidSelectionPredicate(const boost::shared_ptr<UniverseObjectVisitor> &visitor); /** \name Accessors */ //@{ virtual bool InWindow(const GG::Pt& pt) const; @@ -474,13 +480,17 @@ mutable PlanetSelectedSignalType PlanetSelectedSignal; private: + void FindSelectionCandidates(); + void HiliteSelectionCandidates(); void PlanetSelected(int planet_id); + void VScroll(int,int,int,int); std::vector<PlanetPanel*> m_planet_panels; int m_planet_id; - bool m_hilite_selected_planet; + std::set<int> m_candidate_ids; - void VScroll(int,int,int,int); + boost::shared_ptr<UniverseObjectVisitor> m_valid_selection_predicate; + CUIScroll* m_vscroll; ///< the vertical scroll (for viewing all the planet panes) }; @@ -693,7 +703,7 @@ m_button_colonize(0), m_planet_graphic(0), m_rotating_planet_graphic(0), - m_hilited(false) + m_hiliting(HILITING_NONE) { SetText(UserString("PLANET_PANEL")); @@ -794,9 +804,9 @@ PlanetResourceCenterChanged(); } -void SidePanel::PlanetPanel::Hilite(bool b) +void SidePanel::PlanetPanel::Hilite(HilitingType ht) { - m_hilited = b; + m_hiliting = ht; } void SidePanel::PlanetPanel::EnableControl(GG::Wnd *control,bool enable) @@ -944,9 +954,9 @@ return ((ul <= pt && pt < lr) || InPlanet(pt)); } -bool SidePanel::PlanetPanel::Hilited() const +SidePanel::PlanetPanel::HilitingType SidePanel::PlanetPanel:: Hiliting() const { - return m_hilited; + return m_hiliting; } void SidePanel::PlanetPanel::LClick(const GG::Pt& pt, Uint32 keys) @@ -1046,17 +1056,24 @@ { const Planet *planet = GetPlanet(); - if(planet->Owners().size()==0 || planet->IsAboutToBeColonized()) { + if (planet->Owners().size()==0 || planet->IsAboutToBeColonized()) { RenderUnhabited(*planet); } else { - if(!planet->OwnedBy(HumanClientApp::GetApp()->EmpireID())) + if (!planet->OwnedBy(HumanClientApp::GetApp()->EmpireID())) RenderInhabited(*planet); else - RenderOwned (*planet); + RenderOwned(*planet); } - if (m_hilited && planet->Type() != PT_ASTEROIDS) { + if (m_hiliting == HILITING_CANDIDATE && planet->Type() != PT_ASTEROIDS) { GG::Rect planet_rect(m_rotating_planet_graphic->UpperLeft(), m_rotating_planet_graphic->LowerRight()); + double PERIOD_MS = 2000.0; + double PI = 3.14159; + double factor = 0.5 + std::cos(HumanClientApp::GetApp()->Ticks() / PERIOD_MS * 2 * PI) / 2; + int alpha = static_cast<int>(255 * factor); + GG::FlatCircle(planet_rect.ul.x - 3, planet_rect.ul.y - 3, planet_rect.lr.x + 3, planet_rect.lr.y + 3, GG::Clr(0, 100, 0, alpha), GG::CLR_ZERO, 0); + } else if (m_hiliting == HILITING_SELECTED && planet->Type() != PT_ASTEROIDS) { + GG::Rect planet_rect(m_rotating_planet_graphic->UpperLeft(), m_rotating_planet_graphic->LowerRight()); GG::FlatCircle(planet_rect.ul.x - 3, planet_rect.ul.y - 3, planet_rect.lr.x + 3, planet_rect.lr.y + 3, GG::CLR_WHITE, GG::CLR_ZERO, 0); } } @@ -1163,13 +1180,12 @@ Wnd(x-MAX_PLANET_DIAMETER/2, y, w+MAX_PLANET_DIAMETER/2, h, GG::CLICKABLE), m_planet_panels(), m_planet_id(UniverseObject::INVALID_OBJECT_ID), - m_hilite_selected_planet(false), m_vscroll(new CUIScroll(Width()-14,0,14,Height(),GG::VERTICAL)) { - SetText("PlanetPanelContainer"); - EnableChildClipping(true); - AttachChild(m_vscroll); - GG::Connect(m_vscroll->ScrolledSignal, &SidePanel::PlanetPanelContainer::VScroll,this); + SetText("PlanetPanelContainer"); + EnableChildClipping(true); + AttachChild(m_vscroll); + GG::Connect(m_vscroll->ScrolledSignal, &SidePanel::PlanetPanelContainer::VScroll, this); } bool SidePanel::PlanetPanelContainer::InWindow(const GG::Pt& pt) const @@ -1202,66 +1218,72 @@ void SidePanel::PlanetPanelContainer::SetPlanets(const std::vector<const Planet*> &plt_vec, StarType star_type) { - Clear(); + Clear(); + int y = 0; + const int PLANET_PANEL_HT = MAX_PLANET_DIAMETER; + for (unsigned int i = 0; i < plt_vec.size(); ++i, y += PLANET_PANEL_HT) { + const Planet* planet = plt_vec[i]; + PlanetPanel* planet_panel = new PlanetPanel(0, y, Width() - m_vscroll->Width(), PLANET_PANEL_HT, *planet, star_type); + AttachChild(planet_panel); + m_planet_panels.push_back(planet_panel); + GG::Connect(m_planet_panels.back()->PlanetImageLClickedSignal, &SidePanel::PlanetPanelContainer::PlanetSelected, this); + } + m_vscroll->SizeScroll(0, plt_vec.size() * PLANET_PANEL_HT, PLANET_PANEL_HT, Height()); + VScroll(m_vscroll->PosnRange().first, 0, 0, 0); + FindSelectionCandidates(); + HiliteSelectionCandidates(); +} - int y = 0; - const int PLANET_PANEL_HT = MAX_PLANET_DIAMETER; - for (unsigned int i = 0; i < plt_vec.size(); ++i, y += PLANET_PANEL_HT) - { - const Planet* planet = plt_vec[i]; - PlanetPanel* planet_panel = new PlanetPanel(0, y, Width()-m_vscroll->Width(), PLANET_PANEL_HT, *planet, star_type); - AttachChild(planet_panel); - m_planet_panels.push_back(planet_panel); - GG::Connect(m_planet_panels.back()->PlanetImageLClickedSignal, &SidePanel::PlanetPanelContainer::PlanetSelected, this); - } - m_vscroll->SizeScroll(0,plt_vec.size()*PLANET_PANEL_HT,PLANET_PANEL_HT,Height()); - VScroll(m_vscroll->PosnRange().first, 0, 0, 0); +void SidePanel::PlanetPanelContainer::SelectPlanet(int planet_id) +{ + PlanetSelected(planet_id); } -void SidePanel::PlanetPanelContainer::HiliteSelectedPlanet(bool b) +void SidePanel::PlanetPanelContainer::SetValidSelectionPredicate(const boost::shared_ptr<UniverseObjectVisitor> &visitor) { - m_hilite_selected_planet = b; - PlanetPanel* current_panel = 0; - for (std::vector<PlanetPanel*>::iterator it = m_planet_panels.begin(); it != m_planet_panels.end(); ++it) { - if ((*it)->PlanetID() == m_planet_id) { - current_panel = *it; - break; + m_valid_selection_predicate = visitor; + FindSelectionCandidates(); + HiliteSelectionCandidates(); +} + +void SidePanel::PlanetPanelContainer::FindSelectionCandidates() +{ + m_candidate_ids.clear(); + if (m_valid_selection_predicate) { + for (std::vector<PlanetPanel*>::iterator it = m_planet_panels.begin(); it != m_planet_panels.end(); ++it) { + Planet* planet = GetUniverse().Object<Planet>((*it)->PlanetID()); + if (planet->Accept(*m_valid_selection_predicate)) + m_candidate_ids.insert(planet->ID()); } } - if (current_panel) - current_panel->Hilite(m_hilite_selected_planet); } -void SidePanel::PlanetPanelContainer::SelectPlanet(int planet_id) +void SidePanel::PlanetPanelContainer::HiliteSelectionCandidates() { - PlanetSelected(planet_id); + if (m_candidate_ids.find(m_planet_id) != m_candidate_ids.end()) + m_planet_id = UniverseObject::INVALID_OBJECT_ID; + if (m_planet_id == UniverseObject::INVALID_OBJECT_ID) { + for (std::vector<PlanetPanel*>::iterator it = m_planet_panels.begin(); it != m_planet_panels.end(); ++it) { + (*it)->Hilite(m_candidate_ids.find((*it)->PlanetID()) != m_candidate_ids.end() ? PlanetPanel::HILITING_CANDIDATE : PlanetPanel::HILITING_NONE); + } + } } void SidePanel::PlanetPanelContainer::PlanetSelected(int planet_id) { - if (planet_id != m_planet_id) { - if (m_hilite_selected_planet) { - PlanetPanel* current_panel = 0; - for (std::vector<PlanetPanel*>::iterator it = m_planet_panels.begin(); it != m_planet_panels.end(); ++it) { - if ((*it)->PlanetID() == m_planet_id) { - current_panel = *it; - break; - } - } - if (current_panel) - current_panel->Hilite(false); - m_planet_id = planet_id; - current_panel = 0; - for (std::vector<PlanetPanel*>::iterator it = m_planet_panels.begin(); it != m_planet_panels.end(); ++it) { - if ((*it)->PlanetID() == m_planet_id) { - current_panel = *it; - break; - } - } - if (current_panel) - current_panel->Hilite(true); + if (planet_id != m_planet_id && m_candidate_ids.find(planet_id) != m_candidate_ids.end()) { + m_planet_id = planet_id; + bool planet_id_match_found = false; + for (std::vector<PlanetPanel*>::iterator it = m_planet_panels.begin(); it != m_planet_panels.end(); ++it) { + bool match = (*it)->PlanetID() == m_planet_id; + (*it)->Hilite(match ? PlanetPanel::HILITING_SELECTED : PlanetPanel::HILITING_NONE); + if (match) + planet_id_match_found = true; } - PlanetSelectedSignal(m_planet_id); + if (!planet_id_match_found) + m_planet_id = UniverseObject::INVALID_OBJECT_ID; + else + PlanetSelectedSignal(m_planet_id); } } @@ -1359,9 +1381,11 @@ const int SidePanel::MAX_PLANET_DIAMETER = 128; // size of a huge planet, in on-screen pixels const int SidePanel::MIN_PLANET_DIAMETER = MAX_PLANET_DIAMETER / 3; // size of a tiny planet, in on-screen pixels +const System* SidePanel::s_system = 0; +std::set<SidePanel*> SidePanel::s_side_panels; + SidePanel::SidePanel(int x, int y, int w, int h) : Wnd(x, y, w, h, GG::CLICKABLE), - m_system(0), m_system_name(new CUIDropDownList(40, 0, w-80,SYSTEM_NAME_FONT_SIZE, 10*SYSTEM_NAME_FONT_SIZE,GG::CLR_ZERO,GG::Clr(0.0, 0.0, 0.0, 0.5))), m_system_name_unknown(new GG::TextControl(40, 0, w-80,SYSTEM_NAME_FONT_SIZE,UserString("SP_UNKNOWN_SYSTEM"),GG::GUI::GetGUI()->GetFont(ClientUI::FONT,SYSTEM_NAME_FONT_SIZE),ClientUI::TEXT_COLOR)), m_button_prev(new GG::Button(40-SYSTEM_NAME_FONT_SIZE,4,SYSTEM_NAME_FONT_SIZE,SYSTEM_NAME_FONT_SIZE,"",GG::GUI::GetGUI()->GetFont(ClientUI::FONT,SYSTEM_NAME_FONT_SIZE),GG::CLR_WHITE,GG::CLICKABLE)), @@ -1402,8 +1426,15 @@ GG::Connect(m_planet_panel_container->PlanetSelectedSignal, &SidePanel::PlanetSelected, this); Hide(); + + s_side_panels.insert(this); } +SidePanel::~SidePanel() +{ + s_side_panels.erase(this); +} + bool SidePanel::InWindow(const GG::Pt& pt) const { return (UpperLeft() <= pt && pt < LowerRight()) || m_planet_panel_container->InWindow(pt); @@ -1415,59 +1446,8 @@ FlatRectangle(ul.x, ul.y, lr.x, lr.y, ClientUI::SIDE_PANEL_COLOR, GG::CLR_ZERO, 0); } -void SidePanel::SystemSelectionChanged(int selection) +void SidePanel::SetSystemImpl() { - int system_id = UniverseObject::INVALID_OBJECT_ID; - - if(0<= selection && selection<m_system_name->NumRows()) - system_id = static_cast<const SystemRow&>(m_system_name->GetRow(selection)).m_system_id; - - if(SystemID()!=system_id) - SetSystem(system_id); -} - -void SidePanel::PrevButtonClicked() -{ - int selected = m_system_name->CurrentItemIndex(); - m_system_name->Select(selected ? selected - 1 : m_system_name->NumRows() - 1); -} - -void SidePanel::NextButtonClicked() -{ - int selected = m_system_name->CurrentItemIndex(); - m_system_name->Select((selected < m_system_name->NumRows() - 1) ? selected + 1 : 0); -} - -void SidePanel::PlanetSelected(int planet_id) -{ - PlanetSelectedSignal(planet_id); -} - -int SidePanel::PlanetPanels() const -{ - return m_planet_panel_container->PlanetPanels(); -} - -const SidePanel::PlanetPanel* SidePanel::GetPlanetPanel(int n) const -{ - return m_planet_panel_container->GetPlanetPanel(n); -} - -int SidePanel::SystemID() const -{ - return m_system!=0?m_system->ID():UniverseObject::INVALID_OBJECT_ID; -} - -int SidePanel::PlanetID() const -{ - return m_planet_panel_container->PlanetID(); -} - -void SidePanel::SetSystem(int system_id) -{ - const System* new_system = GetUniverse().Object<const System>(system_id); - if (new_system && new_system != m_system) - PlaySidePanelOpenSound(); TempUISoundDisabler sound_disabler; m_fleet_icons.clear(); @@ -1478,12 +1458,10 @@ Hide(); - m_system = new_system; - - if (m_system) + if (s_system) { - GG::Connect(m_system->FleetAddedSignal , &SidePanel::SystemFleetAdded , this); - GG::Connect(m_system->FleetRemovedSignal, &SidePanel::SystemFleetRemoved, this); + GG::Connect(s_system->FleetAddedSignal , &SidePanel::SystemFleetAdded , this); + GG::Connect(s_system->FleetRemovedSignal, &SidePanel::SystemFleetRemoved, this); std::vector<const System*> sys_vec = GetUniverse().FindObjects<const System>(); GG::ListBox::Row *select_row=0; @@ -1500,7 +1478,7 @@ m_system_name->Insert(row); ++system_names_in_droplist; - if(sys_vec[i]->ID() == system_id) + if(sys_vec[i] == s_system) select_row = row; } const int TEXT_ROW_HEIGHT = CUISimpleDropDownListRow::DEFAULT_ROW_HEIGHT; @@ -1520,7 +1498,7 @@ boost::shared_ptr<GG::Texture> graphic; std::string star_image = ClientUI::ART_DIR + "stars_sidepanel/"; - switch (m_system->Star()) + switch (s_system->Star()) { case STAR_BLUE : star_image += "blue0" ; break; case STAR_WHITE : star_image += "white0" ; break; @@ -1531,7 +1509,7 @@ case STAR_BLACK : star_image += "blackhole0"; break; default : star_image += "white0" ; break; } - star_image += lexical_cast<std::string>(m_system->ID()%2)+".png"; + star_image += lexical_cast<std::string>(s_system->ID()%2)+".png"; graphic = GetTexture(star_image); @@ -1543,22 +1521,22 @@ AttachChild(m_star_graphic);MoveChildDown(m_star_graphic); // TODO: add fleet icons - std::pair<System::const_orbit_iterator, System::const_orbit_iterator> range = m_system->non_orbit_range(); - std::vector<const Fleet*> flt_vec = m_system->FindObjects<Fleet>(); + std::pair<System::const_orbit_iterator, System::const_orbit_iterator> range = s_system->non_orbit_range(); + std::vector<const Fleet*> flt_vec = s_system->FindObjects<Fleet>(); for(unsigned int i = 0; i < flt_vec.size(); i++) GG::Connect(flt_vec[i]->StateChangedSignal, &SidePanel::FleetsChanged, this); // add planets - std::vector<const Planet*> plt_vec = m_system->FindObjects<Planet>(); + std::vector<const Planet*> plt_vec = s_system->FindObjects<Planet>(); - m_planet_panel_container->SetPlanets(plt_vec, m_system->Star()); + m_planet_panel_container->SetPlanets(plt_vec, s_system->Star()); for(unsigned int i = 0; i < plt_vec.size(); i++) { GG::Connect(plt_vec[i]->StateChangedSignal, &SidePanel::PlanetsChanged, this); GG::Connect(plt_vec[i]->ResourceCenterChangedSignal, &SidePanel::PlanetsChanged, this); } - m_planet_panel_container->SetPlanets(plt_vec, m_system->Star()); + m_planet_panel_container->SetPlanets(plt_vec, s_system->Star()); Show();PlanetsChanged(); if(select_row==0) @@ -1578,18 +1556,77 @@ } } +void SidePanel::SystemSelectionChanged(int selection) +{ + int system_id = UniverseObject::INVALID_OBJECT_ID; + + if(0<= selection && selection<m_system_name->NumRows()) + system_id = static_cast<const SystemRow&>(m_system_name->GetRow(selection)).m_system_id; + + if(SystemID()!=system_id) + SetSystem(system_id); +} + +void SidePanel::PrevButtonClicked() +{ + int selected = m_system_name->CurrentItemIndex(); + m_system_name->Select(selected ? selected - 1 : m_system_name->NumRows() - 1); +} + +void SidePanel::NextButtonClicked() +{ + int selected = m_system_name->CurrentItemIndex(); + m_system_name->Select((selected < m_system_name->NumRows() - 1) ? selected + 1 : 0); +} + +void SidePanel::PlanetSelected(int planet_id) +{ + PlanetSelectedSignal(planet_id); +} + +int SidePanel::PlanetPanels() const +{ + return m_planet_panel_container->PlanetPanels(); +} + +const SidePanel::PlanetPanel* SidePanel::GetPlanetPanel(int n) const +{ + return m_planet_panel_container->GetPlanetPanel(n); +} + +int SidePanel::SystemID() const +{ + return s_system ? s_system->ID() : UniverseObject::INVALID_OBJECT_ID; +} + +int SidePanel::PlanetID() const +{ + return m_planet_panel_container->PlanetID(); +} + void SidePanel::SelectPlanet(int planet_id) { m_planet_panel_container->SelectPlanet(planet_id); } -void SidePanel::HiliteSelectedPlanet(bool b) +void SidePanel::SetValidSelectionPredicate(const boost::shared_ptr<UniverseObjectVisitor> &visitor) { - m_planet_panel_container->HiliteSelectedPlanet(b); + m_planet_panel_container->SetValidSelectionPredicate(visitor); } -void SidePanel::SystemFleetAdded (const Fleet &flt) +void SidePanel::SetSystem(int system_id) { + const System* system = GetUniverse().Object<const System>(system_id); + if (system && system != s_system) + PlaySidePanelOpenSound(); + s_system = system; + for (std::set<SidePanel*>::iterator it = s_side_panels.begin(); it != s_side_panels.end(); ++it) { + (*it)->SetSystemImpl(); + } +} + +void SidePanel::SystemFleetAdded(const Fleet &flt) +{ GG::Connect(flt.StateChangedSignal, &SidePanel::FleetsChanged, this); FleetsChanged(); } @@ -1607,9 +1644,9 @@ void SidePanel::PlanetsChanged() { - if(m_system) + if(s_system) { - std::vector<const Planet*> plt_vec = m_system->FindObjects<Planet>(); + std::vector<const Planet*> plt_vec = s_system->FindObjects<Planet>(); int farming=0,mining=0,trade=0,research=0,industry=0,defense=0,num_empire_planets=0; for(unsigned int i=0;i<plt_vec.size();i++) Modified: trunk/FreeOrion/UI/SidePanel.h =================================================================== --- trunk/FreeOrion/UI/SidePanel.h 2006-05-28 23:41:32 UTC (rev 1833) +++ trunk/FreeOrion/UI/SidePanel.h 2006-05-29 08:32:37 UTC (rev 1834) @@ -41,9 +41,10 @@ class CUIIconButton; class CUIScroll; class CUITextureButton; +class FocusSelector; +class RotatingPlanetControl; +class UniverseObjectVisitor; namespace GG {class TextControl;} -class RotatingPlanetControl; -class FocusSelector; class SidePanel : public GG::Wnd { @@ -56,6 +57,7 @@ /** \name Structors */ //@{ SidePanel(int x, int y, int w, int h); + ~SidePanel(); //@} /** \name Accessors */ //@{ @@ -70,11 +72,14 @@ /** \name Mutators */ //@{ virtual void Render(); - void SetSystem(int system_id); ///< sets the system currently being viewed in the side panel void SelectPlanet(int planet_id); ///< selects the planet with id \a planet_id within the current system, if such a planet exists - void HiliteSelectedPlanet(bool b); ///< enables/disables hiliting the currently-selected planet in the side panel + + /** sets the predicate that determines what planets can be selected in the side panel. If none is set, planet selection is disabled. */ + void SetValidSelectionPredicate(const boost::shared_ptr<UniverseObjectVisitor> &visitor); //@} + static void SetSystem(int system_id); ///< sets the system currently being viewed in all side panels + static const int MAX_PLANET_DIAMETER; // size of a huge planet, in on-screen pixels static const int MIN_PLANET_DIAMETER; // size of a tiny planet, in on-screen pixels @@ -84,23 +89,19 @@ class PlanetPanelContainer; class SystemResourceSummary; - void AdjustScrolls(); - + void SetSystemImpl(); void SystemSelectionChanged(int selection); - void SystemFleetAdded (const Fleet &); void SystemFleetRemoved(const Fleet &); - void FleetsChanged(); void PlanetsChanged(); void PrevButtonClicked(); void NextButtonClicked(); void PlanetSelected(int planet_id); - const System *m_system; CUIDropDownList *m_system_name; GG::TextControl *m_system_name_unknown; - GG::Button *m_button_prev,*m_button_next; + GG::Button *m_button_prev, *m_button_next; GG::DynamicGraphic *m_star_graphic; GG::TextControl *m_static_text_systemproduction; @@ -112,6 +113,9 @@ PlanetPanelContainer *m_planet_panel_container; SystemResourceSummary *m_system_resource_summary; + + static const System* s_system; + static std::set<SidePanel*> s_side_panels; }; #endif // _SidePanel_h_ |
From: <tz...@us...> - 2006-05-30 00:01:21
|
Revision: 1835 Author: tzlaine Date: 2006-05-29 17:01:08 -0700 (Mon, 29 May 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1835&view=rev Log Message: ----------- Added scaling (and mousewheel zooming) to the tech graph in the research screen. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp trunk/FreeOrion/UI/TechTreeWnd.h Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2006-05-29 08:32:37 UTC (rev 1834) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2006-05-30 00:01:08 UTC (rev 1835) @@ -58,6 +58,9 @@ const double TECH_NAVIGATOR_ROLLOVER_BRIGHTENING_FACTOR = 1.5; + const double MIN_SCALE = 0.2; + const double MAX_SCALE = 1.0; + GG::Clr CategoryColor(const std::string& category_name) { const std::vector<std::string>& tech_categories = GetTechManager().CategoryNames(); @@ -336,8 +339,10 @@ { public: // HACK! we're storing the border color here for color, and the color of the +/- symbol in text_color - ExpandCollapseButton(const GG::Clr& color, const GG::Clr& border_color) : - StateButton(0, 0, SIZE, SIZE, "", GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS), 0, border_color, color), + ExpandCollapseButton(const GG::Clr& color, const GG::Clr& border_color, double scale) : + StateButton(0, 0, static_cast<int>(SIZE * scale + 0.5), static_cast<int>(SIZE * scale + 0.5), "", + GG::GUI::GetGUI()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::PTS * scale + 0.5)), 0, border_color, color), + m_scale(scale), m_selected(false), m_mouse_here(false) {} @@ -369,7 +374,7 @@ glColor4ubv(color.v); CircleArc(ul.x, ul.y, lr.x, lr.y, 0.0, 0.0, true); glEnable(GL_LINE_SMOOTH); - glLineWidth(OUTER_LINE_THICKNESS); + glLineWidth(OUTER_LINE_THICKNESS * m_scale); DrawOutline(ul, lr, border_color, 63, 127); glLineWidth(1.0); glDisable(GL_LINE_SMOOTH); @@ -409,8 +414,10 @@ glEnd(); } - bool m_selected; - bool m_mouse_here; + double m_scale; + bool m_selected; + bool m_mouse_here; + static const int SIZE = 17; }; @@ -838,6 +845,7 @@ /** \name Accessors */ //@{ virtual GG::Pt ClientLowerRight() const; + double Scale() const; const std::string& CategoryShown() const; TechTreeWnd::TechTypesShown GetTechTypesShown() const; TechTreeWnd::TechStatusesShown GetTechStatusesShown() const; @@ -853,6 +861,7 @@ void Update(); void Clear(); void Reset(); + void SetScale(double scale); void ShowCategory(const std::string& category); void ShowTech(const Tech* tech); void CenterOnTech(const Tech* tech); @@ -878,11 +887,13 @@ { public: LayoutSurface() : Wnd(0, 0, 1, 1, GG::CLICKABLE | GG::DRAGABLE) {} - void LDrag(const GG::Pt& pt, const GG::Pt& move, Uint32 keys) {DraggedSignal(move);} + virtual void LDrag(const GG::Pt& pt, const GG::Pt& move, Uint32 keys) {DraggedSignal(move);} + virtual void MouseWheel(const GG::Pt& pt, int move, Uint32 keys) {ZoomedSignal(move);} + mutable boost::signal<void (int)> ZoomedSignal; mutable boost::signal<void (const GG::Pt&)> DraggedSignal; }; - void Layout(bool keep_position); + void Layout(bool keep_position, double old_scale = -1.0); bool TechVisible(const Tech* tech); void CollapseTechSubtree(const Tech* tech, bool collapse); void DrawArc(DependencyArcsMap::const_iterator it, GG::Clr color, bool with_arrow_head); @@ -891,7 +902,9 @@ void TechClickedSlot(const Tech* tech); void TechDoubleClickedSlot(const Tech* tech); void TreeDraggedSlot(const GG::Pt& move); + void TreeZoomedSlot(int move); + double m_scale; std::string m_category_shown; TechTypesShown m_tech_types_shown; TechStatusesShown m_tech_statuses_shown; @@ -941,7 +954,7 @@ typedef TechDoubleClickedSignalType::slot_type TechDoubleClickedSlotType; ///< type of functor(s) invoked on a TechDoubleClickedSignalType //@} - TechPanel(const Tech* tech, bool selected, bool collapsed_subtree, const std::string& category_shown, TechTypesShown types_shown, TechStatusesShown statuses_shown); + TechPanel(const Tech* tech, bool selected, bool collapsed_subtree, const std::string& category_shown, TechTypesShown types_shown, TechStatusesShown statuses_shown, double scale = 1.0); virtual bool InWindow(const GG::Pt& pt) const; virtual void Render(); @@ -960,6 +973,7 @@ GG::Rect ProgressPanelRect(const GG::Pt& ul, const GG::Pt& lr); const Tech* m_tech; + double m_scale; double m_progress; // in [0.0, 1.0] GG::Clr m_fill_color; GG::Clr m_text_and_border_color; @@ -973,9 +987,10 @@ TechTreeWnd::LayoutPanel::TechPanel::TechPanel(const Tech* tech, bool selected, bool collapsed_subtree, const std::string& category_shown, TechTypesShown types_shown, - TechStatusesShown statuses_shown) : + TechStatusesShown statuses_shown, double scale/* = 1.0*/) : GG::Wnd(0, 0, 1, 1, GG::CLICKABLE), m_tech(tech), + m_scale(scale), m_progress(0.0), m_tech_name_text(0), m_tech_cost_text(0), @@ -987,15 +1002,18 @@ GG::Pt UPPER_TECH_TEXT_OFFSET(4, 2); GG::Pt LOWER_TECH_TEXT_OFFSET(4, 0); if (m_tech->Type() == TT_THEORY) { - Resize(GG::Pt(THEORY_TECH_PANEL_LAYOUT_WIDTH, THEORY_TECH_PANEL_LAYOUT_HEIGHT)); + Resize(GG::Pt(static_cast<int>(THEORY_TECH_PANEL_LAYOUT_WIDTH * m_scale + 0.5), static_cast<int>(THEORY_TECH_PANEL_LAYOUT_HEIGHT * m_scale + 0.5))); name_font_pts += 2; UPPER_TECH_TEXT_OFFSET += GG::Pt(2, 2); LOWER_TECH_TEXT_OFFSET += GG::Pt(2, 4); } else if (m_tech->Type() == TT_APPLICATION) { - Resize(GG::Pt(APPLICATION_TECH_PANEL_LAYOUT_WIDTH, APPLICATION_TECH_PANEL_LAYOUT_HEIGHT)); + Resize(GG::Pt(static_cast<int>(APPLICATION_TECH_PANEL_LAYOUT_WIDTH * m_scale + 0.5), static_cast<int>(APPLICATION_TECH_PANEL_LAYOUT_HEIGHT * m_scale + 0.5))); } else { // m_tech->Type() == TT_REFINEMENT - Resize(GG::Pt(REFINEMENT_TECH_PANEL_LAYOUT_WIDTH, REFINEMENT_TECH_PANEL_LAYOUT_HEIGHT)); + Resize(GG::Pt(static_cast<int>(REFINEMENT_TECH_PANEL_LAYOUT_WIDTH * m_scale + 0.5), static_cast<int>(REFINEMENT_TECH_PANEL_LAYOUT_HEIGHT * m_scale + 0.5))); } + name_font_pts = static_cast<int>(name_font_pts * m_scale + 0.5); + UPPER_TECH_TEXT_OFFSET = GG::Pt(static_cast<int>(UPPER_TECH_TEXT_OFFSET.x * m_scale), static_cast<int>(UPPER_TECH_TEXT_OFFSET.y * m_scale)); + LOWER_TECH_TEXT_OFFSET = GG::Pt(static_cast<int>(LOWER_TECH_TEXT_OFFSET.x * m_scale), static_cast<int>(LOWER_TECH_TEXT_OFFSET.y * m_scale)); using boost::io::str; using boost::format; @@ -1043,8 +1061,9 @@ CategoryIcon(m_tech->Category()), GG::GR_FITGRAPHIC); m_category_icon->SetColor(CategoryColor(m_tech->Category())); - m_tech_name_text = new GG::TextControl(m_category_icon->LowerRight().x + 4, UPPER_TECH_TEXT_OFFSET.y, Width() - (m_category_icon->LowerRight().x + 4) - PROGRESS_PANEL_LEFT_EXTRUSION - 4, - font->Lineskip(), UserString(m_tech->Name()), font, m_text_and_border_color, GG::TF_TOP | GG::TF_LEFT); + m_tech_name_text = new GG::TextControl(m_category_icon->LowerRight().x + static_cast<int>(4 * m_scale), UPPER_TECH_TEXT_OFFSET.y, + Width() - m_category_icon->LowerRight().x + static_cast<int>((4 - PROGRESS_PANEL_LEFT_EXTRUSION - 4) * m_scale), font->Lineskip(), + UserString(m_tech->Name()), font, m_text_and_border_color, GG::TF_TOP | GG::TF_LEFT); m_tech_name_text->ClipText(true); AttachChild(m_category_icon); AttachChild(m_tech_name_text); @@ -1053,8 +1072,8 @@ if (!known_tech) cost_str = str(format(UserString("TECH_TOTAL_COST_STR")) % static_cast<int>(m_tech->ResearchCost() + 0.5) % m_tech->ResearchTurns()); m_tech_cost_text = new GG::TextControl(UPPER_TECH_TEXT_OFFSET.x, 0, - Width() - LOWER_TECH_TEXT_OFFSET.x, Height() - LOWER_TECH_TEXT_OFFSET.y - PROGRESS_PANEL_BOTTOM_EXTRUSION, - cost_str, GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS), m_text_and_border_color, GG::TF_BOTTOM | GG::TF_LEFT); + Width() - LOWER_TECH_TEXT_OFFSET.x, Height() - LOWER_TECH_TEXT_OFFSET.y - static_cast<int>(PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale), + cost_str, GG::GUI::GetGUI()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::PTS * m_scale + 0.5)), m_text_and_border_color, GG::TF_BOTTOM | GG::TF_LEFT); AttachChild(m_tech_cost_text); GG::Rect progress_panel = ProgressPanelRect(UpperLeft(), LowerRight()); @@ -1065,11 +1084,12 @@ progress_str = UserString("TECH_WND_TECH_QUEUED"); else if (m_progress) progress_str = UserString("TECH_WND_TECH_INCOMPLETE"); - m_progress_text = new GG::TextControl(progress_panel.ul.x - PROGRESS_PANEL_LEFT_EXTRUSION, progress_panel.ul.y - PROGRESS_PANEL_BOTTOM_EXTRUSION, progress_panel.Width(), progress_panel.Height(), - progress_str, GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS), m_text_and_border_color); + m_progress_text = new GG::TextControl(static_cast<int>(progress_panel.ul.x - PROGRESS_PANEL_LEFT_EXTRUSION * m_scale), progress_panel.ul.y - static_cast<int>(PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale), + progress_panel.Width(), progress_panel.Height(), + progress_str, GG::GUI::GetGUI()->GetFont(ClientUI::FONT, static_cast<int>(ClientUI::PTS * m_scale + 0.5)), m_text_and_border_color); AttachChild(m_progress_text); - m_toggle_button = new ExpandCollapseButton(m_fill_color, m_text_and_border_color); + m_toggle_button = new ExpandCollapseButton(m_fill_color, m_text_and_border_color, m_scale); bool show_toggle_button = false; const std::set<std::string>& unlocked_techs = m_tech->UnlockedTechs(); for (std::set<std::string>::const_iterator it = unlocked_techs.begin(); it != unlocked_techs.end(); ++it) { @@ -1087,8 +1107,8 @@ if (show_toggle_button) { if (collapsed_subtree) m_toggle_button->SetCheck(); - m_toggle_button->MoveTo(GG::Pt(Width() - PROGRESS_PANEL_LEFT_EXTRUSION + 3, - UpperLeft().x + (Height() - PROGRESS_PANEL_HEIGHT + PROGRESS_PANEL_BOTTOM_EXTRUSION) / 2 - m_toggle_button->Height() / 2)); + m_toggle_button->MoveTo(GG::Pt(Width() + static_cast<int>((-PROGRESS_PANEL_LEFT_EXTRUSION + 3) * m_scale), + UpperLeft().x + static_cast<int>(Height() + (-PROGRESS_PANEL_HEIGHT + PROGRESS_PANEL_BOTTOM_EXTRUSION) * m_scale) / 2 - m_toggle_button->Height() / 2)); } else { m_toggle_button->Hide(); } @@ -1101,13 +1121,13 @@ { GG::Pt lr = LowerRight(); return GG::Wnd::InWindow(pt) && - (pt.x <= lr.x - PROGRESS_PANEL_LEFT_EXTRUSION || lr.y - PROGRESS_PANEL_HEIGHT <= pt.y || m_toggle_button->InWindow(pt)) && - (lr.x - PROGRESS_PANEL_WIDTH <= pt.x || pt.y <= lr.y - PROGRESS_PANEL_BOTTOM_EXTRUSION); + (pt.x <= lr.x - PROGRESS_PANEL_LEFT_EXTRUSION * m_scale || lr.y - PROGRESS_PANEL_HEIGHT * m_scale <= pt.y || m_toggle_button->InWindow(pt)) && + (lr.x - PROGRESS_PANEL_WIDTH * m_scale <= pt.x || pt.y <= lr.y - PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale); } void TechTreeWnd::LayoutPanel::TechPanel::Render() { - GG::Pt ul = UpperLeft(), lr = LowerRight() - GG::Pt(PROGRESS_PANEL_LEFT_EXTRUSION, PROGRESS_PANEL_BOTTOM_EXTRUSION); + GG::Pt ul = UpperLeft(), lr = LowerRight() - GG::Pt(static_cast<int>(PROGRESS_PANEL_LEFT_EXTRUSION * m_scale), static_cast<int>(PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale)); GG::Clr interior_color_to_use = m_selected ? GG::LightColor(m_fill_color) : m_fill_color; GG::Clr border_color_to_use = m_selected ? GG::LightColor(m_text_and_border_color) : m_text_and_border_color; @@ -1117,7 +1137,7 @@ glDisable(GL_TEXTURE_2D); FillTechPanelInterior(tech_type, main_panel, progress_panel, interior_color_to_use, !m_progress_text->Empty(), m_progress); glEnable(GL_LINE_SMOOTH); - glLineWidth(OUTER_LINE_THICKNESS); + glLineWidth(OUTER_LINE_THICKNESS * m_scale); glColor4ub(border_color_to_use.r, border_color_to_use.g, border_color_to_use.b, 127); TraceTechPanelOutline(tech_type, main_panel, progress_panel, !m_progress_text->Empty()); glLineWidth(1.0); @@ -1160,8 +1180,8 @@ GG::Rect TechTreeWnd::LayoutPanel::TechPanel::ProgressPanelRect(const GG::Pt& ul, const GG::Pt& lr) { GG::Rect retval; - retval.lr = lr + GG::Pt(PROGRESS_PANEL_LEFT_EXTRUSION, PROGRESS_PANEL_BOTTOM_EXTRUSION); - retval.ul = retval.lr - GG::Pt(PROGRESS_PANEL_WIDTH, PROGRESS_PANEL_HEIGHT); + retval.lr = lr + GG::Pt(static_cast<int>(PROGRESS_PANEL_LEFT_EXTRUSION * m_scale), static_cast<int>(PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale)); + retval.ul = retval.lr - GG::Pt(PROGRESS_PANEL_WIDTH, static_cast<int>(PROGRESS_PANEL_HEIGHT * m_scale)); return retval; } @@ -1170,6 +1190,7 @@ ////////////////////////////////////////////////// TechTreeWnd::LayoutPanel::LayoutPanel(int w, int h) : GG::Wnd(0, 0, w, h, GG::CLICKABLE), + m_scale(1.0), m_category_shown("ALL"), m_tech_types_shown(ALL_TECH_TYPES), m_tech_statuses_shown(ALL_TECH_STATUSES), @@ -1189,6 +1210,7 @@ AttachChild(m_hscroll); GG::Connect(m_layout_surface->DraggedSignal, &TechTreeWnd::LayoutPanel::TreeDraggedSlot, this); + GG::Connect(m_layout_surface->ZoomedSignal, &TechTreeWnd::LayoutPanel::TreeZoomedSlot, this); GG::Connect(m_vscroll->ScrolledSignal, &TechTreeWnd::LayoutPanel::ScrolledSlot, this); GG::Connect(m_hscroll->ScrolledSignal, &TechTreeWnd::LayoutPanel::ScrolledSlot, this); } @@ -1203,6 +1225,11 @@ return m_category_shown; } +double TechTreeWnd::LayoutPanel::Scale() const +{ + return m_scale; +} + TechTreeWnd::TechTypesShown TechTreeWnd::LayoutPanel::GetTechTypesShown() const { return m_tech_types_shown; @@ -1225,7 +1252,7 @@ // first, draw arc with thck, half-alpha line glEnable(GL_LINE_SMOOTH); - glLineWidth(OUTER_LINE_THICKNESS); + glLineWidth(OUTER_LINE_THICKNESS * m_scale); GG::Clr known_half_alpha = ClientUI::KNOWN_TECH_TEXT_AND_BORDER_COLOR; known_half_alpha.a = 127; GG::Clr researchable_half_alpha = ClientUI::RESEARCHABLE_TECH_TEXT_AND_BORDER_COLOR; @@ -1337,6 +1364,19 @@ Layout(true); } +void TechTreeWnd::LayoutPanel::SetScale(double scale) +{ + if (scale < MIN_SCALE) + scale = MIN_SCALE; + if (MAX_SCALE < scale) + scale = MAX_SCALE; + if (m_scale != scale) { + double old_scale = m_scale; + m_scale = scale; + Layout(true, old_scale); + } +} + void TechTreeWnd::LayoutPanel::ShowCategory(const std::string& category) { if (m_category_shown != category) { @@ -1385,34 +1425,51 @@ } } -void TechTreeWnd::LayoutPanel::Layout(bool keep_position) +void TechTreeWnd::LayoutPanel::Layout(bool keep_position, double old_scale/* = -1.0*/) { - GG::Pt final_position = keep_position ? m_scroll_position : GG::Pt(); + if (old_scale < 0.0) + old_scale = m_scale; + GG::Pt final_position; + if (keep_position) { + if (m_scale == old_scale) { + final_position = m_scroll_position; + } else { + GG::Pt cl_sz = ClientSize(); + GG::Pt center = m_scroll_position + GG::Pt(cl_sz.x / 2, cl_sz.y / 2); + center.x = static_cast<int>(center.x * m_scale / old_scale + 0.5); + center.y = static_cast<int>(center.y * m_scale / old_scale + 0.5); + final_position = GG::Pt(center.x - cl_sz.x / 2, center.y - cl_sz.y / 2); + } + } const Tech* selected_tech = keep_position ? m_selected_tech : 0; Clear(); m_selected_tech = selected_tech; GVC_t* gvc = gvContext(); + Agraph_t* graph = agopen("FreeOrion Tech Graph", AGDIGRAPHSTRICT); + const double RANK_SEP = TECH_PANEL_LAYOUT_WIDTH * GetOptionsDB().Get<double>("UI.tech-layout-horz-spacing") * m_scale; + const double NODE_SEP = TECH_PANEL_LAYOUT_HEIGHT * GetOptionsDB().Get<double>("UI.tech-layout-vert-spacing") * m_scale; + const double WIDTH = TECH_PANEL_LAYOUT_WIDTH * m_scale; + const double HEIGHT = TECH_PANEL_LAYOUT_HEIGHT * m_scale; + // default graph properties - agraphattr(0, "rankdir", "LR"); - agraphattr(0, "ordering", "in"); - agraphattr(0, "ranksep", const_cast<char*>(boost::lexical_cast<std::string>(TECH_PANEL_LAYOUT_WIDTH * GetOptionsDB().Get<double>("UI.tech-layout-horz-spacing")).c_str())); - agraphattr(0, "nodesep", const_cast<char*>(boost::lexical_cast<std::string>(TECH_PANEL_LAYOUT_HEIGHT * GetOptionsDB().Get<double>("UI.tech-layout-vert-spacing")).c_str())); - agraphattr(0, "arrowhead", "none"); - agraphattr(0, "arrowtail", "none"); + agraphattr(graph, "rankdir", "LR"); + agraphattr(graph, "ordering", "in"); + agraphattr(graph, "ranksep", const_cast<char*>(boost::lexical_cast<std::string>(RANK_SEP).c_str())); + agraphattr(graph, "nodesep", const_cast<char*>(boost::lexical_cast<std::string>(NODE_SEP).c_str())); + agraphattr(graph, "arrowhead", "none"); + agraphattr(graph, "arrowtail", "none"); // default node properties - agnodeattr(0, "shape", "box"); - agnodeattr(0, "fixedsize", "true"); - agnodeattr(0, "width", const_cast<char*>(boost::lexical_cast<std::string>(TECH_PANEL_LAYOUT_WIDTH).c_str())); - agnodeattr(0, "height", const_cast<char*>(boost::lexical_cast<std::string>(TECH_PANEL_LAYOUT_HEIGHT).c_str())); + agnodeattr(graph, "shape", "box"); + agnodeattr(graph, "fixedsize", "true"); + agnodeattr(graph, "width", const_cast<char*>(boost::lexical_cast<std::string>(WIDTH).c_str())); + agnodeattr(graph, "height", const_cast<char*>(boost::lexical_cast<std::string>(HEIGHT).c_str())); // default edge properties - agedgeattr(0, "tailclip", "false"); + agedgeattr(graph, "tailclip", "false"); - Agraph_t* graph = agopen("FreeOrion Tech Graph", AGDIGRAPHSTRICT); - std::map<std::string, Agnode_t*> name_to_node_map; TechManager& manager = GetTechManager(); for (TechManager::iterator it = manager.begin(); it != manager.end(); ++it) { @@ -1437,15 +1494,15 @@ gvLayout(gvc, graph, "dot"); // create new tech panels and new dependency arcs - const int TECH_PANEL_MARGIN = 10; + const int TECH_PANEL_MARGIN = static_cast<int>(10 * m_scale); m_dependency_arcs.clear(); const std::set<const Tech*>& collapsed_subtree_techs = m_collapsed_subtree_techs_per_view[m_category_shown]; for (Agnode_t* node = agfstnode(graph); node; node = agnxtnode(graph, node)) { const Tech* tech = GetTech(node->name); assert(tech); - m_techs[tech] = new TechPanel(tech, tech == m_selected_tech, collapsed_subtree_techs.find(tech) != collapsed_subtree_techs.end(), m_category_shown, m_tech_types_shown, m_tech_statuses_shown); + m_techs[tech] = new TechPanel(tech, tech == m_selected_tech, collapsed_subtree_techs.find(tech) != collapsed_subtree_techs.end(), m_category_shown, m_tech_types_shown, m_tech_statuses_shown, m_scale); m_techs[tech]->MoveTo(GG::Pt(static_cast<int>(PS2INCH(ND_coord_i(node).x) - m_techs[tech]->Width() / 2 + TECH_PANEL_MARGIN), - static_cast<int>(PS2INCH(ND_coord_i(node).y) - (m_techs[tech]->Height() - PROGRESS_PANEL_BOTTOM_EXTRUSION) / 2 + TECH_PANEL_MARGIN))); + static_cast<int>(PS2INCH(ND_coord_i(node).y) - (m_techs[tech]->Height() - PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale) / 2 + TECH_PANEL_MARGIN))); m_layout_surface->AttachChild(m_techs[tech]); GG::Connect(m_techs[tech]->TechBrowsedSignal, &TechTreeWnd::LayoutPanel::TechBrowsedSlot, this); GG::Connect(m_techs[tech]->TechClickedSignal, &TechTreeWnd::LayoutPanel::TechClickedSlot, this); @@ -1488,10 +1545,10 @@ GG::Pt client_sz = ClientSize(); GG::Pt layout_size(std::max(client_sz.x, static_cast<int>(PS2INCH(GD_bb(graph).UR.x - GD_bb(graph).LL.x) + - 2 * TECH_PANEL_MARGIN + PROGRESS_PANEL_LEFT_EXTRUSION)), + 2 * TECH_PANEL_MARGIN + PROGRESS_PANEL_LEFT_EXTRUSION * m_scale)), std::max(client_sz.y, static_cast<int>(PS2INCH(GD_bb(graph).UR.y - GD_bb(graph).LL.y) + - 2 * TECH_PANEL_MARGIN + PROGRESS_PANEL_BOTTOM_EXTRUSION))); + 2 * TECH_PANEL_MARGIN + PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale))); m_layout_surface->Resize(layout_size); m_vscroll->SizeScroll(0, layout_size.y - 1, std::max(50, std::min(layout_size.y / 10, client_sz.y)), client_sz.y); m_hscroll->SizeScroll(0, layout_size.x - 1, std::max(50, std::min(layout_size.x / 10, client_sz.x)), client_sz.x); @@ -1568,8 +1625,8 @@ double final_point_y = it->second.second.back().back().second + ul.y; double second_to_final_point_x = it->second.second.back()[it->second.second.back().size() - 2].first + ul.x; double second_to_final_point_y = it->second.second.back()[it->second.second.back().size() - 2].second + ul.y; - const int ARROW_LENGTH = 10; - const int ARROW_WIDTH = 9; + const double ARROW_LENGTH = 10 * m_scale; + const double ARROW_WIDTH = 9 * m_scale; glEnable(GL_TEXTURE_2D); glPushMatrix(); glTranslated(final_point_x, final_point_y, 0.0); @@ -1617,7 +1674,16 @@ m_hscroll->ScrollTo(m_hscroll->PosnRange().first - move.x); } +void TechTreeWnd::LayoutPanel::TreeZoomedSlot(int move) +{ + const double ZOOM_STEP_SIZE = 1.25; + if (0 < move) + SetScale(m_scale * ZOOM_STEP_SIZE); + else if (move < 0) + SetScale(m_scale / ZOOM_STEP_SIZE); +} + ////////////////////////////////////////////////// // TechTreeWnd // ////////////////////////////////////////////////// @@ -1726,6 +1792,11 @@ AttachChild(m_tech_type_buttons); } +double TechTreeWnd::Scale() const +{ + return m_layout_panel->Scale(); +} + const std::string& TechTreeWnd::CategoryShown() const { return m_layout_panel->CategoryShown(); @@ -1763,6 +1834,11 @@ m_layout_panel->ShowCategory(category); } +void TechTreeWnd::SetScale(double scale) +{ + m_layout_panel->SetScale(scale); +} + void TechTreeWnd::SetTechTypesShown(TechTypesShown tech_types) { m_layout_panel->SetTechTypesShown(tech_types); Modified: trunk/FreeOrion/UI/TechTreeWnd.h =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.h 2006-05-29 08:32:37 UTC (rev 1834) +++ trunk/FreeOrion/UI/TechTreeWnd.h 2006-05-30 00:01:08 UTC (rev 1835) @@ -41,6 +41,7 @@ //@} /** \name Accessors */ //@{ + double Scale() const; const std::string& CategoryShown() const; TechTypesShown GetTechTypesShown() const; TechStatusesShown GetTechStatusesShown() const; @@ -50,6 +51,7 @@ void Update(); void Clear(); void Reset(); + void SetScale(double scale); void ShowCategory(const std::string& category); void SetTechTypesShown(TechTypesShown tech_types); void SetTechStatusesShown(TechStatusesShown tech_statuses); |
From: <tz...@us...> - 2006-05-30 04:45:17
|
Revision: 1837 Author: tzlaine Date: 2006-05-29 21:45:13 -0700 (Mon, 29 May 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1837&view=rev Log Message: ----------- Fixed two bugs introduced by the previous two commits: - The main map's SidePanel was still visible in the production screen. - The progress bars in zoomed-out tech panels were not being scaled properly. Modified Paths: -------------- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/BuildDesignatorWnd.cpp =================================================================== --- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2006-05-30 04:42:49 UTC (rev 1836) +++ trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2006-05-30 04:45:13 UTC (rev 1837) @@ -610,10 +610,10 @@ void BuildDesignatorWnd::SelectSystem(int system) { - if (system != UniverseObject::INVALID_OBJECT_ID && system != m_side_panel->SystemID()) { + if (system != UniverseObject::INVALID_OBJECT_ID) { m_side_panel->Show(); + m_side_panel->SetValidSelectionPredicate(boost::shared_ptr<UniverseObjectVisitor>(new OwnedVisitor<Planet>(HumanClientApp::GetApp()->EmpireID()))); m_side_panel->SetSystem(system); - m_side_panel->SetValidSelectionPredicate(boost::shared_ptr<UniverseObjectVisitor>(new OwnedVisitor<Planet>(HumanClientApp::GetApp()->EmpireID()))); m_build_location = UniverseObject::INVALID_OBJECT_ID; System::ObjectIDVec owned_planets_ids = GetUniverse().Object<System>(system)->FindObjectIDs(OwnedVisitor<Planet>(HumanClientApp::GetApp()->EmpireID())); @@ -630,9 +630,8 @@ void BuildDesignatorWnd::Reset() { - int planet_id = m_side_panel->PlanetID(); - m_side_panel->SetSystem(m_side_panel->SystemID()); - m_side_panel->SelectPlanet(planet_id); + if (m_side_panel->SystemID() == UniverseObject::INVALID_OBJECT_ID) + m_side_panel->Hide(); m_build_selector->Reset(true); m_build_detail_panel->Reset(); } @@ -642,6 +641,7 @@ m_build_detail_panel->Clear(); m_build_selector->Reset(false); m_side_panel->SetSystem(UniverseObject::INVALID_OBJECT_ID); + m_side_panel->Hide(); m_build_location = UniverseObject::INVALID_OBJECT_ID; } Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2006-05-30 04:42:49 UTC (rev 1836) +++ trunk/FreeOrion/UI/MapWnd.cpp 2006-05-30 04:45:13 UTC (rev 1837) @@ -522,8 +522,10 @@ void MapWnd::LClick (const GG::Pt &pt, Uint32 keys) { m_drag_offset = GG::Pt(-1, -1); - if (!m_dragged && !m_in_production_view_mode) + if (!m_dragged && !m_in_production_view_mode) { SystemLeftClickedSignal(UniverseObject::INVALID_OBJECT_ID); + m_side_panel->Hide(); + } m_dragged = false; } @@ -824,19 +826,24 @@ CenterOnMapCoord(fleet->X(), fleet->Y()); } -void MapWnd::SelectSystem(int systemID) +void MapWnd::SelectSystem(int system_id) { if (m_in_production_view_mode) { - m_production_wnd->SelectSystem(systemID); + m_production_wnd->SelectSystem(system_id); } else { - if (!m_side_panel->Visible() || systemID != m_side_panel->SystemID()) - SystemLeftClickedSignal(systemID); + if (!m_side_panel->Visible() || system_id != m_side_panel->SystemID()) { + SystemLeftClickedSignal(system_id); + if (system_id == UniverseObject::INVALID_OBJECT_ID) + m_side_panel->Hide(); + else + m_side_panel->Show(); + } } } -void MapWnd::SelectFleet(int fleetID) +void MapWnd::SelectFleet(int fleet_id) { - if (Fleet* fleet = GetUniverse().Object<Fleet>(fleetID)) + if (Fleet* fleet = GetUniverse().Object<Fleet>(fleet_id)) SelectFleet(fleet); } @@ -1409,10 +1416,12 @@ bool MapWnd::CloseSystemView() { - if (m_in_production_view_mode) + if (m_in_production_view_mode) { m_production_wnd->SelectSystem(UniverseObject::INVALID_OBJECT_ID); - else + } else { SystemLeftClickedSignal(UniverseObject::INVALID_OBJECT_ID); + m_side_panel->Hide(); + } return true; } Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2006-05-30 04:42:49 UTC (rev 1836) +++ trunk/FreeOrion/UI/SidePanel.cpp 2006-05-30 04:45:13 UTC (rev 1837) @@ -1456,50 +1456,48 @@ DeleteChild(m_star_graphic);m_star_graphic=0; - Hide(); - if (s_system) { - GG::Connect(s_system->FleetAddedSignal , &SidePanel::SystemFleetAdded , this); - GG::Connect(s_system->FleetRemovedSignal, &SidePanel::SystemFleetRemoved, this); + GG::Connect(s_system->FleetAddedSignal , &SidePanel::SystemFleetAdded , this); + GG::Connect(s_system->FleetRemovedSignal, &SidePanel::SystemFleetRemoved, this); - std::vector<const System*> sys_vec = GetUniverse().FindObjects<const System>(); - GG::ListBox::Row *select_row=0; + std::vector<const System*> sys_vec = GetUniverse().FindObjects<const System>(); + GG::ListBox::Row *select_row=0; - int system_names_in_droplist = 0; - for (unsigned int i = 0; i < sys_vec.size(); i++) - { - GG::ListBox::Row *row = new SystemRow(sys_vec[i]->ID()); + int system_names_in_droplist = 0; + for (unsigned int i = 0; i < sys_vec.size(); i++) + { + GG::ListBox::Row *row = new SystemRow(sys_vec[i]->ID()); - if(sys_vec[i]->Name().length()==0) - continue; + if(sys_vec[i]->Name().length()==0) + continue; - row->push_back(boost::io::str(boost::format(UserString("SP_SYSTEM_NAME")) % sys_vec[i]->Name()), ClientUI::FONT,SYSTEM_NAME_FONT_SIZE, ClientUI::TEXT_COLOR); - m_system_name->Insert(row); - ++system_names_in_droplist; + row->push_back(boost::io::str(boost::format(UserString("SP_SYSTEM_NAME")) % sys_vec[i]->Name()), ClientUI::FONT,SYSTEM_NAME_FONT_SIZE, ClientUI::TEXT_COLOR); + m_system_name->Insert(row); + ++system_names_in_droplist; - if(sys_vec[i] == s_system) - select_row = row; - } - const int TEXT_ROW_HEIGHT = CUISimpleDropDownListRow::DEFAULT_ROW_HEIGHT; - const int MAX_DROPLIST_DROP_HEIGHT = TEXT_ROW_HEIGHT * 10; - const int TOTAL_LISTBOX_MARGIN = 4; - int drop_height = std::min(TEXT_ROW_HEIGHT * system_names_in_droplist, MAX_DROPLIST_DROP_HEIGHT) + TOTAL_LISTBOX_MARGIN; - m_system_name->SetDropHeight(drop_height); - - for (int i = 0; i < m_system_name->NumRows(); i++) - if(select_row == &m_system_name->GetRow(i)) - { - m_system_name->Select(i); - break; + if(sys_vec[i] == s_system) + select_row = row; } + const int TEXT_ROW_HEIGHT = CUISimpleDropDownListRow::DEFAULT_ROW_HEIGHT; + const int MAX_DROPLIST_DROP_HEIGHT = TEXT_ROW_HEIGHT * 10; + const int TOTAL_LISTBOX_MARGIN = 4; + int drop_height = std::min(TEXT_ROW_HEIGHT * system_names_in_droplist, MAX_DROPLIST_DROP_HEIGHT) + TOTAL_LISTBOX_MARGIN; + m_system_name->SetDropHeight(drop_height); - std::vector<boost::shared_ptr<GG::Texture> > textures; - boost::shared_ptr<GG::Texture> graphic; + for (int i = 0; i < m_system_name->NumRows(); i++) + if(select_row == &m_system_name->GetRow(i)) + { + m_system_name->Select(i); + break; + } + + std::vector<boost::shared_ptr<GG::Texture> > textures; + boost::shared_ptr<GG::Texture> graphic; - std::string star_image = ClientUI::ART_DIR + "stars_sidepanel/"; - switch (s_system->Star()) - { + std::string star_image = ClientUI::ART_DIR + "stars_sidepanel/"; + switch (s_system->Star()) + { case STAR_BLUE : star_image += "blue0" ; break; case STAR_WHITE : star_image += "white0" ; break; case STAR_YELLOW : star_image += "yellow0" ; break; @@ -1508,51 +1506,51 @@ case STAR_NEUTRON : star_image += "neutron0" ; break; case STAR_BLACK : star_image += "blackhole0"; break; default : star_image += "white0" ; break; - } - star_image += lexical_cast<std::string>(s_system->ID()%2)+".png"; + } + star_image += lexical_cast<std::string>(s_system->ID()%2)+".png"; - graphic = GetTexture(star_image); + graphic = GetTexture(star_image); - textures.push_back(graphic); + textures.push_back(graphic); - int star_dim = (Width()*4)/5; - m_star_graphic = new GG::DynamicGraphic(Width()-(star_dim*2)/3,-(star_dim*1)/3,star_dim,star_dim,true,textures[0]->DefaultWidth(),textures[0]->DefaultHeight(),0,textures, GG::GR_FITGRAPHIC | GG::GR_PROPSCALE); + int star_dim = (Width()*4)/5; + m_star_graphic = new GG::DynamicGraphic(Width()-(star_dim*2)/3,-(star_dim*1)/3,star_dim,star_dim,true,textures[0]->DefaultWidth(),textures[0]->DefaultHeight(),0,textures, GG::GR_FITGRAPHIC | GG::GR_PROPSCALE); - AttachChild(m_star_graphic);MoveChildDown(m_star_graphic); + AttachChild(m_star_graphic);MoveChildDown(m_star_graphic); - // TODO: add fleet icons - std::pair<System::const_orbit_iterator, System::const_orbit_iterator> range = s_system->non_orbit_range(); - std::vector<const Fleet*> flt_vec = s_system->FindObjects<Fleet>(); - for(unsigned int i = 0; i < flt_vec.size(); i++) - GG::Connect(flt_vec[i]->StateChangedSignal, &SidePanel::FleetsChanged, this); + // TODO: add fleet icons + std::pair<System::const_orbit_iterator, System::const_orbit_iterator> range = s_system->non_orbit_range(); + std::vector<const Fleet*> flt_vec = s_system->FindObjects<Fleet>(); + for(unsigned int i = 0; i < flt_vec.size(); i++) + GG::Connect(flt_vec[i]->StateChangedSignal, &SidePanel::FleetsChanged, this); - // add planets - std::vector<const Planet*> plt_vec = s_system->FindObjects<Planet>(); + // add planets + std::vector<const Planet*> plt_vec = s_system->FindObjects<Planet>(); - m_planet_panel_container->SetPlanets(plt_vec, s_system->Star()); - for(unsigned int i = 0; i < plt_vec.size(); i++) - { - GG::Connect(plt_vec[i]->StateChangedSignal, &SidePanel::PlanetsChanged, this); - GG::Connect(plt_vec[i]->ResourceCenterChangedSignal, &SidePanel::PlanetsChanged, this); - } + m_planet_panel_container->SetPlanets(plt_vec, s_system->Star()); + for(unsigned int i = 0; i < plt_vec.size(); i++) + { + GG::Connect(plt_vec[i]->StateChangedSignal, &SidePanel::PlanetsChanged, this); + GG::Connect(plt_vec[i]->ResourceCenterChangedSignal, &SidePanel::PlanetsChanged, this); + } - m_planet_panel_container->SetPlanets(plt_vec, s_system->Star()); + m_planet_panel_container->SetPlanets(plt_vec, s_system->Star()); - Show();PlanetsChanged(); - if(select_row==0) - { - m_system_name_unknown->Show(); - m_system_name->Hide(); - m_button_prev->Hide(); - m_button_next->Hide(); - } - else - { - m_system_name_unknown->Hide(); - m_system_name->Show(); - m_button_prev->Show(); - m_button_next->Show(); - } + PlanetsChanged(); + if(select_row==0) + { + m_system_name_unknown->Show(); + m_system_name->Hide(); + m_button_prev->Hide(); + m_button_next->Hide(); + } + else + { + m_system_name_unknown->Hide(); + m_system_name->Show(); + m_button_prev->Show(); + m_button_next->Show(); + } } } Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2006-05-30 04:42:49 UTC (rev 1836) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2006-05-30 04:45:13 UTC (rev 1837) @@ -1181,7 +1181,7 @@ { GG::Rect retval; retval.lr = lr + GG::Pt(static_cast<int>(PROGRESS_PANEL_LEFT_EXTRUSION * m_scale), static_cast<int>(PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale)); - retval.ul = retval.lr - GG::Pt(PROGRESS_PANEL_WIDTH, static_cast<int>(PROGRESS_PANEL_HEIGHT * m_scale)); + retval.ul = retval.lr - GG::Pt(static_cast<int>(PROGRESS_PANEL_WIDTH * m_scale), static_cast<int>(PROGRESS_PANEL_HEIGHT * m_scale)); return retval; } |
From: <tz...@us...> - 2006-07-30 06:27:37
|
Revision: 1864 Author: tzlaine Date: 2006-07-29 23:27:32 -0700 (Sat, 29 Jul 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1864&view=rev Log Message: ----------- Changed the parameters used to fill in the stringtable string "SP_UNKNOWN_SYSTEM". This was necessary because this string recently lost a parameter marker, but the code had not changed, causing a segfault when clicking on unknown systems. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/default/eng_stringtable.txt Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2006-07-30 06:04:03 UTC (rev 1863) +++ trunk/FreeOrion/UI/SidePanel.cpp 2006-07-30 06:27:32 UTC (rev 1864) @@ -1469,9 +1469,9 @@ GG::ListBox::Row *row = new SystemRow(sys_vec[i]->ID()); if (sys_vec[i]->Name().length()==0) { - if (sys_vec[i] == s_system) { - row->push_back(boost::io::str(boost::format(UserString("SP_UNKNOWN_SYSTEM")) % sys_vec[i]->ID()), ClientUI::FONT,SYSTEM_NAME_FONT_SIZE, ClientUI::TEXT_COLOR); - } else + if (sys_vec[i] == s_system) + row->push_back(UserString("SP_UNKNOWN_SYSTEM"), ClientUI::FONT, SYSTEM_NAME_FONT_SIZE, ClientUI::TEXT_COLOR); + else continue; } else { row->push_back(boost::io::str(boost::format(UserString("SP_SYSTEM_NAME")) % sys_vec[i]->Name()), ClientUI::FONT,SYSTEM_NAME_FONT_SIZE, ClientUI::TEXT_COLOR); Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2006-07-30 06:04:03 UTC (rev 1863) +++ trunk/FreeOrion/default/eng_stringtable.txt 2006-07-30 06:27:32 UTC (rev 1864) @@ -79,7 +79,7 @@ All UNKNOWN_SYSTEM -unknown system +Unknown System RENAME Rename |
From: <tz...@us...> - 2006-07-30 06:36:12
|
Revision: 1865 Author: tzlaine Date: 2006-07-29 23:36:07 -0700 (Sat, 29 Jul 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1865&view=rev Log Message: ----------- This is the second part of the production screen's planet autoselection work. It was completed then, but inadvertently not committed. The planet auto-selection system now correctly selects the appropriate system the first time a system is opened, and also remembers the last selected planet for each system. Modified Paths: -------------- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp trunk/FreeOrion/UI/BuildDesignatorWnd.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/BuildDesignatorWnd.cpp =================================================================== --- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2006-07-30 06:27:32 UTC (rev 1864) +++ trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2006-07-30 06:36:07 UTC (rev 1865) @@ -614,14 +614,12 @@ void BuildDesignatorWnd::SelectSystem(int system) { if (system != UniverseObject::INVALID_OBJECT_ID) { - m_side_panel->Show(); - m_side_panel->SetValidSelectionPredicate(boost::shared_ptr<UniverseObjectVisitor>(new OwnedVisitor<Planet>(HumanClientApp::GetApp()->EmpireID()))); - m_side_panel->SetSystem(system); - m_build_location = UniverseObject::INVALID_OBJECT_ID; - System::ObjectIDVec owned_planets_ids = - GetUniverse().Object<System>(system)->FindObjectIDs(OwnedVisitor<Planet>(HumanClientApp::GetApp()->EmpireID())); - if (owned_planets_ids.size() == 1) - m_side_panel->SelectPlanet(*owned_planets_ids.begin()); + if (system != m_side_panel->SystemID()) { + m_side_panel->Show(); + m_side_panel->SetSystem(system); + m_build_location = UniverseObject::INVALID_OBJECT_ID; + } + SelectDefaultPlanet(system); } } @@ -629,12 +627,18 @@ { m_build_location = planet; m_build_detail_panel->SelectedBuildLocation(planet); + if (planet != UniverseObject::INVALID_OBJECT_ID) + m_system_default_planets[m_side_panel->SystemID()] = planet; } void BuildDesignatorWnd::Reset() { - if (m_side_panel->SystemID() == UniverseObject::INVALID_OBJECT_ID) - m_side_panel->Hide(); + // default to the home system when nothing is selected in the main map's SidePanel + if (m_side_panel->SystemID() == UniverseObject::INVALID_OBJECT_ID) { + int home_system_id = GetUniverse().Object<Planet>(Empires().Lookup(HumanClientApp::GetApp()->EmpireID())->HomeworldID())->SystemID(); + m_side_panel->SetSystem(home_system_id); + } + SelectDefaultPlanet(m_side_panel->SystemID()); m_build_selector->Reset(true); m_build_detail_panel->Reset(); } @@ -646,6 +650,7 @@ m_side_panel->SetSystem(UniverseObject::INVALID_OBJECT_ID); m_side_panel->Hide(); m_build_location = UniverseObject::INVALID_OBJECT_ID; + m_system_default_planets.clear(); } void BuildDesignatorWnd::BuildItemRequested(BuildType build_type, const std::string& item, int num_to_build) @@ -659,3 +664,27 @@ { BuildQuantityChangedSignal(queue_idx, quantity); } + +void BuildDesignatorWnd::SelectDefaultPlanet(int system) +{ + m_side_panel->SetValidSelectionPredicate(boost::shared_ptr<UniverseObjectVisitor>(new OwnedVisitor<Planet>(HumanClientApp::GetApp()->EmpireID()))); + std::map<int, int>::iterator it = m_system_default_planets.find(system); + if (it != m_system_default_planets.end()) { + m_side_panel->SelectPlanet(it->second); + } else { + System::ObjectVec owned_planets = + GetUniverse().Object<System>(system)->FindObjects(OwnedVisitor<Planet>(HumanClientApp::GetApp()->EmpireID())); + if (!owned_planets.empty()) { + int planet_id = owned_planets[0]->ID(); + double max_pop = owned_planets[0]->GetMeter(METER_POPULATION)->Current(); + for (unsigned int i = 1; i < owned_planets.size(); ++i) { + double pop = owned_planets[0]->GetMeter(METER_POPULATION)->Current(); + if (max_pop < pop) { + max_pop = pop; + planet_id = owned_planets[0]->ID(); + } + } + m_side_panel->SelectPlanet(planet_id); + } + } +} Modified: trunk/FreeOrion/UI/BuildDesignatorWnd.h =================================================================== --- trunk/FreeOrion/UI/BuildDesignatorWnd.h 2006-07-30 06:27:32 UTC (rev 1864) +++ trunk/FreeOrion/UI/BuildDesignatorWnd.h 2006-07-30 06:36:07 UTC (rev 1865) @@ -51,12 +51,14 @@ void BuildItemRequested(BuildType build_type, const std::string& item, int num_to_build); void BuildQuantityChanged(int queue_idx, int quantity); + void SelectDefaultPlanet(int system); - BuildDetailPanel* m_build_detail_panel; - BuildSelector* m_build_selector; - SidePanel* m_side_panel; - int m_build_location; - GG::Rect m_map_view_hole; + BuildDetailPanel* m_build_detail_panel; + BuildSelector* m_build_selector; + SidePanel* m_side_panel; + int m_build_location; + GG::Rect m_map_view_hole; + std::map<int, int> m_system_default_planets; }; #endif // _BuildDesignatorWnd_h_ Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2006-07-30 06:27:32 UTC (rev 1864) +++ trunk/FreeOrion/UI/MapWnd.cpp 2006-07-30 06:36:07 UTC (rev 1865) @@ -834,13 +834,14 @@ if (m_in_production_view_mode) { m_production_wnd->SelectSystem(system_id); } else { - if (!m_side_panel->Visible() || system_id != m_side_panel->SystemID()) { - if (system_id == UniverseObject::INVALID_OBJECT_ID) + if (!m_side_panel->Visible() || system_id != m_side_panel->SystemID()) { + if (system_id == UniverseObject::INVALID_OBJECT_ID) { + SystemLeftClickedSignal(system_id); m_side_panel->Hide(); - else + } else { m_side_panel->Show(); - - SystemLeftClickedSignal(system_id); + SystemLeftClickedSignal(system_id); + } } } } Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2006-07-30 06:27:32 UTC (rev 1864) +++ trunk/FreeOrion/UI/SidePanel.cpp 2006-07-30 06:36:07 UTC (rev 1865) @@ -1546,13 +1546,11 @@ void SidePanel::SystemSelectionChanged(int selection) { - int system_id = UniverseObject::INVALID_OBJECT_ID; - - if(0<= selection && selection<m_system_name->NumRows()) - system_id = static_cast<const SystemRow&>(m_system_name->GetRow(selection)).m_system_id; - - if(SystemID()!=system_id) - SetSystem(system_id); + int system_id = UniverseObject::INVALID_OBJECT_ID; + if (0 <= selection && selection < m_system_name->NumRows()) + system_id = static_cast<const SystemRow&>(m_system_name->GetRow(selection)).m_system_id; + if (SystemID() != system_id) + ClientUI::GetClientUI()->GetMapWnd()->SelectSystem(system_id); } void SidePanel::PrevButtonClicked() |
From: <tz...@us...> - 2006-07-31 00:06:15
|
Revision: 1867 Author: tzlaine Date: 2006-07-30 17:06:03 -0700 (Sun, 30 Jul 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1867&view=rev Log Message: ----------- Moved the universe creation enums (Age, Shape, etc.) to Enums.h, and created stream operations for them. This was done because these enums are now saved in the config.xml file and are settable (at least for now) on the command line. Modified Paths: -------------- trunk/FreeOrion/UI/GalaxySetupWnd.cpp trunk/FreeOrion/UI/GalaxySetupWnd.h trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/server/ServerApp.h trunk/FreeOrion/universe/Enums.h trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/Universe.h trunk/FreeOrion/util/MultiplayerCommon.cpp Modified: trunk/FreeOrion/UI/GalaxySetupWnd.cpp =================================================================== --- trunk/FreeOrion/UI/GalaxySetupWnd.cpp 2006-07-30 16:49:28 UTC (rev 1866) +++ trunk/FreeOrion/UI/GalaxySetupWnd.cpp 2006-07-31 00:06:03 UTC (rev 1867) @@ -29,13 +29,12 @@ // persistant between-executions galaxy setup settings, mainly so I don't have to redo these settings to what I want every time I run FO to test something void AddOptions(OptionsDB& db) { - Logger().debugStream() << "Adding GalaxyPanel Options"; db.Add("GameSetup.stars", "The number of stars in the galaxy to be generated.", 100, RangedValidator<int>(10, 500)); - db.Add("GameSetup.galaxy-shape", "The shape of the galaxy to be generated.", static_cast<int>(Universe::SPIRAL_3), RangedValidator<int>(0, static_cast<int>(Universe::GALAXY_SHAPES) - 1)); - db.Add("GameSetup.galaxy-age", "The shape of the galaxy to be generated.", static_cast<int>(Universe::AGE_MATURE), RangedValidator<int>(0, static_cast<int>(Universe::NUM_UNIVERSE_AGES) - 1)); - db.Add("GameSetup.planet-density", "The number of planets per system in the galaxy to be generated.", static_cast<int>(Universe::PD_AVERAGE), RangedValidator<int>(0, static_cast<int>(Universe::NUM_UNIVERSE_PLANET_DENSITIES) - 1)); - db.Add("GameSetup.starlane-frequency", "The number of starlanes in the galaxy to be generated.", static_cast<int>(Universe::LANES_SEVERAL), RangedValidator<int>(ALLOW_NO_STARLANES ? 1 : 0, static_cast<int>(Universe::NUM_STARLANE_FREQENCIES) - 1)); - db.Add("GameSetup.specials-frequency", "The frequency of specials appearing in the galaxy to be generated.", static_cast<int>(Universe::SPECIALS_UNCOMMON), RangedValidator<int>(0, static_cast<int>(Universe::NUM_SPECIALS_FREQENCIES) - 1)); + db.Add("GameSetup.galaxy-shape", "The shape of the galaxy to be generated.", SPIRAL_3, RangedValidator<Shape>(SPIRAL_2, RING)); + db.Add("GameSetup.galaxy-age", "The shape of the galaxy to be generated.", AGE_MATURE, RangedValidator<Age>(AGE_YOUNG, AGE_ANCIENT)); + db.Add("GameSetup.planet-density", "The number of planets per system in the galaxy to be generated.", PD_AVERAGE, RangedValidator<PlanetDensity>(PD_LOW, PD_HIGH)); + db.Add("GameSetup.starlane-frequency", "The number of starlanes in the galaxy to be generated.", LANES_SEVERAL, RangedValidator<StarlaneFrequency>(ALLOW_NO_STARLANES ? LANES_NONE : LANES_FEW, LANES_VERY_MANY)); + db.Add("GameSetup.specials-frequency", "The frequency of specials appearing in the galaxy to be generated.", SPECIALS_UNCOMMON, RangedValidator<SpecialsFrequency>(SPECIALS_NONE, SPECIALS_COMMON)); } bool temp_bool = RegisterOptions(&AddOptions); } @@ -69,31 +68,31 @@ m_stars_spin->OffsetMove(GG::Pt(0, (PANEL_CONTROL_SPACING - m_stars_spin->Height()) / 2)); AttachChild(new GG::TextControl(CONTROL_MARGIN, ++row * PANEL_CONTROL_SPACING, LABELS_WIDTH, CONTROL_HEIGHT, UserString("GSETUP_SHAPE"), font, ClientUI::TEXT_COLOR, GG::TF_RIGHT)); - int drop_height = std::min(TEXT_ROW_HEIGHT * Universe::GALAXY_SHAPES, MAX_DROPLIST_DROP_HEIGHT) + TOTAL_LISTBOX_MARGIN; + int drop_height = std::min(TEXT_ROW_HEIGHT * GALAXY_SHAPES, MAX_DROPLIST_DROP_HEIGHT) + TOTAL_LISTBOX_MARGIN; m_galaxy_shapes_list = new CUIDropDownList(LABELS_WIDTH + 2 * CONTROL_MARGIN, row * PANEL_CONTROL_SPACING, DROPLIST_WIDTH, DROPLIST_HEIGHT, drop_height); m_galaxy_shapes_list->OffsetMove(GG::Pt(0, (PANEL_CONTROL_SPACING - m_galaxy_shapes_list->Height()) / 2)); m_galaxy_shapes_list->SetStyle(GG::LB_NOSORT); AttachChild(new GG::TextControl(CONTROL_MARGIN, ++row * PANEL_CONTROL_SPACING, LABELS_WIDTH, CONTROL_HEIGHT, UserString("GSETUP_AGE"), font, ClientUI::TEXT_COLOR, GG::TF_RIGHT)); - drop_height = std::min(TEXT_ROW_HEIGHT * Universe::NUM_UNIVERSE_AGES, MAX_DROPLIST_DROP_HEIGHT) + TOTAL_LISTBOX_MARGIN; + drop_height = std::min(TEXT_ROW_HEIGHT * NUM_UNIVERSE_AGES, MAX_DROPLIST_DROP_HEIGHT) + TOTAL_LISTBOX_MARGIN; m_galaxy_ages_list = new CUIDropDownList(LABELS_WIDTH + 2 * CONTROL_MARGIN, row * PANEL_CONTROL_SPACING, DROPLIST_WIDTH, DROPLIST_HEIGHT, drop_height); m_galaxy_ages_list->OffsetMove(GG::Pt(0, (PANEL_CONTROL_SPACING - m_galaxy_ages_list->Height()) / 2)); m_galaxy_ages_list->SetStyle(GG::LB_NOSORT); AttachChild(new GG::TextControl(CONTROL_MARGIN, ++row * PANEL_CONTROL_SPACING, LABELS_WIDTH, CONTROL_HEIGHT, UserString("GSETUP_STARLANE_FREQ"), font, ClientUI::TEXT_COLOR, GG::TF_RIGHT)); - drop_height = std::min(TEXT_ROW_HEIGHT * Universe::NUM_STARLANE_FREQENCIES, MAX_DROPLIST_DROP_HEIGHT) + TOTAL_LISTBOX_MARGIN; + drop_height = std::min(TEXT_ROW_HEIGHT * NUM_STARLANE_FREQENCIES, MAX_DROPLIST_DROP_HEIGHT) + TOTAL_LISTBOX_MARGIN; m_starlane_freq_list = new CUIDropDownList(LABELS_WIDTH + 2 * CONTROL_MARGIN, row * PANEL_CONTROL_SPACING, DROPLIST_WIDTH, DROPLIST_HEIGHT, drop_height); m_starlane_freq_list->OffsetMove(GG::Pt(0, (PANEL_CONTROL_SPACING - m_starlane_freq_list->Height()) / 2)); m_starlane_freq_list->SetStyle(GG::LB_NOSORT); AttachChild(new GG::TextControl(CONTROL_MARGIN, ++row * PANEL_CONTROL_SPACING, LABELS_WIDTH, CONTROL_HEIGHT, UserString("GSETUP_PLANET_DENSITY"), font, ClientUI::TEXT_COLOR, GG::TF_RIGHT)); - drop_height = std::min(TEXT_ROW_HEIGHT * Universe::NUM_UNIVERSE_PLANET_DENSITIES, MAX_DROPLIST_DROP_HEIGHT) + TOTAL_LISTBOX_MARGIN; + drop_height = std::min(TEXT_ROW_HEIGHT * NUM_UNIVERSE_PLANET_DENSITIES, MAX_DROPLIST_DROP_HEIGHT) + TOTAL_LISTBOX_MARGIN; m_planet_density_list = new CUIDropDownList(LABELS_WIDTH + 2 * CONTROL_MARGIN, row* PANEL_CONTROL_SPACING, DROPLIST_WIDTH, DROPLIST_HEIGHT, drop_height); m_planet_density_list->OffsetMove(GG::Pt(0, (PANEL_CONTROL_SPACING - m_planet_density_list->Height()) / 2)); m_planet_density_list->SetStyle(GG::LB_NOSORT); AttachChild(new GG::TextControl(CONTROL_MARGIN, ++row* PANEL_CONTROL_SPACING, LABELS_WIDTH, CONTROL_HEIGHT, UserString("GSETUP_SPECIALS_FREQ"), font, ClientUI::TEXT_COLOR, GG::TF_RIGHT)); - drop_height = std::min(TEXT_ROW_HEIGHT * Universe::NUM_SPECIALS_FREQENCIES, MAX_DROPLIST_DROP_HEIGHT) + TOTAL_LISTBOX_MARGIN; + drop_height = std::min(TEXT_ROW_HEIGHT * NUM_SPECIALS_FREQENCIES, MAX_DROPLIST_DROP_HEIGHT) + TOTAL_LISTBOX_MARGIN; m_specials_freq_list = new CUIDropDownList(LABELS_WIDTH + 2 * CONTROL_MARGIN, row* PANEL_CONTROL_SPACING, DROPLIST_WIDTH, DROPLIST_HEIGHT, drop_height); m_specials_freq_list->OffsetMove(GG::Pt(0, (PANEL_CONTROL_SPACING - m_specials_freq_list->Height()) / 2)); m_specials_freq_list->SetStyle(GG::LB_NOSORT); @@ -106,34 +105,34 @@ return m_stars_spin->Value(); } -Universe::Shape GalaxySetupPanel::GalaxyShape() const +Shape GalaxySetupPanel::GetShape() const { - return Universe::Shape(m_galaxy_shapes_list->CurrentItemIndex()); + return Shape(m_galaxy_shapes_list->CurrentItemIndex()); } -Universe::Age GalaxySetupPanel::GalaxyAge() const +Age GalaxySetupPanel::GetAge() const { - return Universe::Age(m_galaxy_ages_list->CurrentItemIndex()); + return Age(m_galaxy_ages_list->CurrentItemIndex()); } -Universe::StarlaneFrequency GalaxySetupPanel::StarlaneFrequency() const +StarlaneFrequency GalaxySetupPanel::GetStarlaneFrequency() const { - return Universe::StarlaneFrequency(m_starlane_freq_list->CurrentItemIndex() + (ALLOW_NO_STARLANES ? 0 : 1)); + return StarlaneFrequency(m_starlane_freq_list->CurrentItemIndex() + (ALLOW_NO_STARLANES ? 0 : 1)); } -Universe::PlanetDensity GalaxySetupPanel::PlanetDensity() const +PlanetDensity GalaxySetupPanel::GetPlanetDensity() const { - return Universe::PlanetDensity(m_planet_density_list->CurrentItemIndex()); + return PlanetDensity(m_planet_density_list->CurrentItemIndex()); } -Universe::SpecialsFrequency GalaxySetupPanel::SpecialsFrequency() const +SpecialsFrequency GalaxySetupPanel::GetSpecialsFrequency() const { - return Universe::SpecialsFrequency(m_specials_freq_list->CurrentItemIndex()); + return SpecialsFrequency(m_specials_freq_list->CurrentItemIndex()); } boost::shared_ptr<GG::Texture> GalaxySetupPanel::PreviewImage() const { - return m_textures[GalaxyShape()]; + return m_textures[GetShape()]; } XMLElement GalaxySetupPanel::XMLEncode() const @@ -143,11 +142,11 @@ XMLElement retval("universe_params"); retval.AppendChild(XMLElement("size", lexical_cast<string>(Systems()))); - retval.AppendChild(XMLElement("shape", lexical_cast<string>(GalaxyShape()))); - retval.AppendChild(XMLElement("age", lexical_cast<string>(GalaxyAge()))); - retval.AppendChild(XMLElement("starlane_freq", lexical_cast<string>(StarlaneFrequency()))); - retval.AppendChild(XMLElement("planet_density", lexical_cast<string>(PlanetDensity()))); - retval.AppendChild(XMLElement("specials_freq", lexical_cast<string>(SpecialsFrequency()))); + retval.AppendChild(XMLElement("shape", lexical_cast<string>(GetShape()))); + retval.AppendChild(XMLElement("age", lexical_cast<string>(GetAge()))); + retval.AppendChild(XMLElement("starlane_freq", lexical_cast<string>(GetStarlaneFrequency()))); + retval.AppendChild(XMLElement("planet_density", lexical_cast<string>(GetPlanetDensity()))); + retval.AppendChild(XMLElement("specials_freq", lexical_cast<string>(GetSpecialsFrequency()))); return retval; } @@ -183,15 +182,15 @@ // create and load textures m_textures.clear(); - for (int i = 0; i < Universe::GALAXY_SHAPES; ++i) + for (int i = 0; i < GALAXY_SHAPES; ++i) m_textures.push_back(boost::shared_ptr<GG::Texture>(new GG::Texture())); - m_textures[Universe::SPIRAL_2]->Load(ClientUI::ART_DIR + "gp_spiral2.png"); - m_textures[Universe::SPIRAL_3]->Load(ClientUI::ART_DIR + "gp_spiral3.png"); - m_textures[Universe::SPIRAL_4]->Load(ClientUI::ART_DIR + "gp_spiral4.png"); - m_textures[Universe::CLUSTER]->Load(ClientUI::ART_DIR + "gp_cluster.png"); - m_textures[Universe::ELLIPTICAL]->Load(ClientUI::ART_DIR + "gp_elliptical.png"); - m_textures[Universe::IRREGULAR]->Load(ClientUI::ART_DIR + "gp_irregular.png"); - m_textures[Universe::RING]->Load(ClientUI::ART_DIR + "gp_ring.png"); + m_textures[SPIRAL_2]->Load(ClientUI::ART_DIR + "gp_spiral2.png"); + m_textures[SPIRAL_3]->Load(ClientUI::ART_DIR + "gp_spiral3.png"); + m_textures[SPIRAL_4]->Load(ClientUI::ART_DIR + "gp_spiral4.png"); + m_textures[CLUSTER]->Load(ClientUI::ART_DIR + "gp_cluster.png"); + m_textures[ELLIPTICAL]->Load(ClientUI::ART_DIR + "gp_elliptical.png"); + m_textures[IRREGULAR]->Load(ClientUI::ART_DIR + "gp_irregular.png"); + m_textures[RING]->Load(ClientUI::ART_DIR + "gp_ring.png"); // fill droplists m_galaxy_shapes_list->Insert(new CUISimpleDropDownListRow(UserString("GSETUP_2ARM"))); @@ -225,11 +224,11 @@ // default settings m_stars_spin->SetValue(GetOptionsDB().Get<int>("GameSetup.stars")); - m_galaxy_shapes_list->Select(GetOptionsDB().Get<int>("GameSetup.galaxy-shape")); - m_galaxy_ages_list->Select(GetOptionsDB().Get<int>("GameSetup.galaxy-age")); - m_starlane_freq_list->Select(GetOptionsDB().Get<int>("GameSetup.starlane-frequency") - (ALLOW_NO_STARLANES ? 0 : 1)); - m_planet_density_list->Select(GetOptionsDB().Get<int>("GameSetup.planet-density")); - m_specials_freq_list->Select(GetOptionsDB().Get<int>("GameSetup.specials-frequency")); + m_galaxy_shapes_list->Select(GetOptionsDB().Get<Shape>("GameSetup.galaxy-shape")); + m_galaxy_ages_list->Select(GetOptionsDB().Get<Age>("GameSetup.galaxy-age")); + m_starlane_freq_list->Select(GetOptionsDB().Get<StarlaneFrequency>("GameSetup.starlane-frequency") - (ALLOW_NO_STARLANES ? 0 : 1)); + m_planet_density_list->Select(GetOptionsDB().Get<PlanetDensity>("GameSetup.planet-density")); + m_specials_freq_list->Select(GetOptionsDB().Get<SpecialsFrequency>("GameSetup.specials-frequency")); } void GalaxySetupPanel::AttachSignalChildren() @@ -387,15 +386,13 @@ void GalaxySetupWnd::OkClicked() { - Logger().debugStream() << "GalaxySetupWnd::OkClicked()"; - // record selected galaxy setup options as new defaults GetOptionsDB().Set("GameSetup.stars", m_galaxy_setup_panel->Systems()); - GetOptionsDB().Set("GameSetup.galaxy-shape", static_cast<int>(m_galaxy_setup_panel->GalaxyShape())); - GetOptionsDB().Set("GameSetup.galaxy-age", static_cast<int>(m_galaxy_setup_panel->GalaxyAge())); - GetOptionsDB().Set("GameSetup.starlane-frequency", static_cast<int>(m_galaxy_setup_panel->StarlaneFrequency())); - GetOptionsDB().Set("GameSetup.planet-density", static_cast<int>(m_galaxy_setup_panel->PlanetDensity())); - GetOptionsDB().Set("GameSetup.specials-frequency", static_cast<int>(m_galaxy_setup_panel->SpecialsFrequency())); + GetOptionsDB().Set("GameSetup.galaxy-shape", m_galaxy_setup_panel->GetShape()); + GetOptionsDB().Set("GameSetup.galaxy-age", m_galaxy_setup_panel->GetAge()); + GetOptionsDB().Set("GameSetup.starlane-frequency", m_galaxy_setup_panel->GetStarlaneFrequency()); + GetOptionsDB().Set("GameSetup.planet-density", m_galaxy_setup_panel->GetPlanetDensity()); + GetOptionsDB().Set("GameSetup.specials-frequency", m_galaxy_setup_panel->GetSpecialsFrequency()); // Save the changes: boost::filesystem::ofstream ofs(GetConfigPath()); Modified: trunk/FreeOrion/UI/GalaxySetupWnd.h =================================================================== --- trunk/FreeOrion/UI/GalaxySetupWnd.h 2006-07-30 16:49:28 UTC (rev 1866) +++ trunk/FreeOrion/UI/GalaxySetupWnd.h 2006-07-31 00:06:03 UTC (rev 1867) @@ -48,11 +48,11 @@ /** \name Accessors*/ //!@{ int Systems() const; //!< Returns the number of star systems to use in generating the galaxy - Universe::Shape GalaxyShape() const; //!< Returns the shape of the galaxy - Universe::Age GalaxyAge() const; //!< Returns the age of the galaxy - Universe::StarlaneFrequency StarlaneFrequency() const; //!< Returns the frequency of starlanes in the galaxy - Universe::PlanetDensity PlanetDensity() const; //!< Returns the density of planets within systems - Universe::SpecialsFrequency SpecialsFrequency() const; //!< Returns the rarity of planetary and system specials + Shape GetShape() const; //!< Returns the shape of the galaxy + Age GetAge() const; //!< Returns the age of the galaxy + StarlaneFrequency GetStarlaneFrequency() const; //!< Returns the frequency of starlanes in the galaxy + PlanetDensity GetPlanetDensity() const; //!< Returns the density of planets within systems + SpecialsFrequency GetSpecialsFrequency() const; //!< Returns the rarity of planetary and system specials boost::shared_ptr<GG::Texture> PreviewImage() const; //!< Returns the current preview image texture Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2006-07-30 16:49:28 UTC (rev 1866) +++ trunk/FreeOrion/server/ServerApp.cpp 2006-07-31 00:06:03 UTC (rev 1867) @@ -80,11 +80,11 @@ MultiplayerLobbyData (bool build_save_game_list = true) : new_game(true), size(100), - shape(Universe::SPIRAL_2), - age(Universe::AGE_MATURE), - starlane_freq(Universe::LANES_SEVERAL), - planet_density(Universe::PD_AVERAGE), - specials_freq(Universe::SPECIALS_UNCOMMON), + shape(SPIRAL_2), + age(AGE_MATURE), + starlane_freq(LANES_SEVERAL), + planet_density(PD_AVERAGE), + specials_freq(SPECIALS_UNCOMMON), save_file(-1) { if (build_save_game_list) { @@ -139,11 +139,11 @@ bool new_game; int size; - Universe::Shape shape; - Universe::Age age; - Universe::StarlaneFrequency starlane_freq; - Universe::PlanetDensity planet_density; - Universe::SpecialsFrequency specials_freq; + Shape shape; + Age age; + StarlaneFrequency starlane_freq; + PlanetDensity planet_density; + SpecialsFrequency specials_freq; int save_file; std::vector<PlayerSetupData> players; std::vector<PlayerSetupData> AIs; @@ -436,11 +436,11 @@ if (doc.root_node.ContainsChild("universe_params")) { g_lobby_data.size = boost::lexical_cast<int>(doc.root_node.Child("universe_params").Child("size").Text()); - g_lobby_data.shape = Universe::Shape(boost::lexical_cast<int>(doc.root_node.Child("universe_params").Child("shape").Text())); - g_lobby_data.age = Universe::Age(boost::lexical_cast<int>(doc.root_node.Child("universe_params").Child("age").Text())); - g_lobby_data.starlane_freq = Universe::StarlaneFrequency(boost::lexical_cast<int>(doc.root_node.Child("universe_params").Child("starlane_freq").Text())); - g_lobby_data.planet_density = Universe::PlanetDensity(boost::lexical_cast<int>(doc.root_node.Child("universe_params").Child("planet_density").Text())); - g_lobby_data.specials_freq = Universe::SpecialsFrequency(boost::lexical_cast<int>(doc.root_node.Child("universe_params").Child("specials_freq").Text())); + g_lobby_data.shape = boost::lexical_cast<Shape>(doc.root_node.Child("universe_params").Child("shape").Text()); + g_lobby_data.age = boost::lexical_cast<Age>(doc.root_node.Child("universe_params").Child("age").Text()); + g_lobby_data.starlane_freq = boost::lexical_cast<StarlaneFrequency>(doc.root_node.Child("universe_params").Child("starlane_freq").Text()); + g_lobby_data.planet_density = boost::lexical_cast<PlanetDensity>(doc.root_node.Child("universe_params").Child("planet_density").Text()); + g_lobby_data.specials_freq = boost::lexical_cast<SpecialsFrequency>(doc.root_node.Child("universe_params").Child("specials_freq").Text()); } bool new_save_file_selected = false; @@ -986,11 +986,11 @@ m_single_player_game = true; m_expected_players = boost::lexical_cast<int>(doc.root_node.Child("num_players").Text()); m_galaxy_size = boost::lexical_cast<int>(doc.root_node.Child("universe_params").Child("size").Text()); - m_galaxy_shape = Universe::Shape(boost::lexical_cast<int>(doc.root_node.Child("universe_params").Child("shape").Text())); - m_galaxy_age = Universe::Age(boost::lexical_cast<int>(doc.root_node.Child("universe_params").Child("age").Text())); - m_starlane_freq = Universe::StarlaneFrequency(boost::lexical_cast<int>(doc.root_node.Child("universe_params").Child("starlane_freq").Text())); - m_planet_density = Universe::PlanetDensity(boost::lexical_cast<int>(doc.root_node.Child("universe_params").Child("planet_density").Text())); - m_specials_freq = Universe::SpecialsFrequency(boost::lexical_cast<int>(doc.root_node.Child("universe_params").Child("specials_freq").Text())); + m_galaxy_shape = boost::lexical_cast<Shape>(doc.root_node.Child("universe_params").Child("shape").Text()); + m_galaxy_age = boost::lexical_cast<Age>(doc.root_node.Child("universe_params").Child("age").Text()); + m_starlane_freq = boost::lexical_cast<StarlaneFrequency>(doc.root_node.Child("universe_params").Child("starlane_freq").Text()); + m_planet_density = boost::lexical_cast<PlanetDensity>(doc.root_node.Child("universe_params").Child("planet_density").Text()); + m_specials_freq = boost::lexical_cast<SpecialsFrequency>(doc.root_node.Child("universe_params").Child("specials_freq").Text()); CreateAIClients(doc.root_node); g_load_doc.root_node = XMLElement(); g_lobby_data.players.clear(); Modified: trunk/FreeOrion/server/ServerApp.h =================================================================== --- trunk/FreeOrion/server/ServerApp.h 2006-07-30 16:49:28 UTC (rev 1866) +++ trunk/FreeOrion/server/ServerApp.h 2006-07-31 00:06:03 UTC (rev 1867) @@ -161,11 +161,11 @@ int m_expected_players; ///< the total desired number of players in the game int m_galaxy_size; ///< the size of the galaxy (the number of star systems) - Universe::Shape m_galaxy_shape; ///< the shape of the galaxy - Universe::Age m_galaxy_age; ///< the age of the galaxy - Universe::StarlaneFrequency m_starlane_freq; ///< the frequency of starlanes - Universe::PlanetDensity m_planet_density; ///< the density of planets within systems - Universe::SpecialsFrequency m_specials_freq; ///< the frequency of planetary and system specials + Shape m_galaxy_shape; ///< the shape of the galaxy + Age m_galaxy_age; ///< the age of the galaxy + StarlaneFrequency m_starlane_freq; ///< the frequency of starlanes + PlanetDensity m_planet_density; ///< the density of planets within systems + SpecialsFrequency m_specials_freq; ///< the frequency of planetary and system specials std::string m_galaxy_file; ///< file to use for generating the galaxy // end SERVER_GAME_SETUP variables Modified: trunk/FreeOrion/universe/Enums.h =================================================================== --- trunk/FreeOrion/universe/Enums.h 2006-07-30 16:49:28 UTC (rev 1866) +++ trunk/FreeOrion/universe/Enums.h 2006-07-31 00:06:03 UTC (rev 1867) @@ -218,6 +218,127 @@ GG_ENUM_STREAM_IN(MeterType) GG_ENUM_STREAM_OUT(MeterType) +/** the types of universe shapes available in FreeOrion*/ +enum Shape { + INVALID_SHAPE = -1, + SPIRAL_2, ///< a two-armed spiral galaxy + SPIRAL_3, ///< a three-armed spiral galaxy + SPIRAL_4, ///< a four-armed spiral galaxy + CLUSTER, ///< a cluster galaxy + ELLIPTICAL, ///< an elliptical galaxy + IRREGULAR, ///< an irregular galaxy + RING, ///< a ring galaxy + GALAXY_SHAPES ///< the number of shapes in this enum (leave this last) +}; + +namespace GG { + GG_ENUM_MAP_BEGIN(Shape) + GG_ENUM_MAP_INSERT(INVALID_SHAPE) + GG_ENUM_MAP_INSERT(SPIRAL_2) + GG_ENUM_MAP_INSERT(SPIRAL_3) + GG_ENUM_MAP_INSERT(SPIRAL_4) + GG_ENUM_MAP_INSERT(CLUSTER) + GG_ENUM_MAP_INSERT(ELLIPTICAL) + GG_ENUM_MAP_INSERT(IRREGULAR) + GG_ENUM_MAP_INSERT(RING) + GG_ENUM_MAP_END +} +GG_ENUM_STREAM_IN(Shape) +GG_ENUM_STREAM_OUT(Shape) + + +/** types of Univervse ages*/ +enum Age { + INVALID_AGE = -1, + AGE_YOUNG, + AGE_MATURE, + AGE_ANCIENT, + NUM_UNIVERSE_AGES // keep this last, the number of universe age options +}; + +namespace GG { + GG_ENUM_MAP_BEGIN(Age) + GG_ENUM_MAP_INSERT(INVALID_AGE) + GG_ENUM_MAP_INSERT(AGE_YOUNG) + GG_ENUM_MAP_INSERT(AGE_MATURE) + GG_ENUM_MAP_INSERT(AGE_ANCIENT) + GG_ENUM_MAP_END +} +GG_ENUM_STREAM_IN(Age) +GG_ENUM_STREAM_OUT(Age) + + +/** types of Planet Density */ +enum PlanetDensity { + INVALID_PLANET_DENSITY = -1, + PD_LOW, + PD_AVERAGE, + PD_HIGH, + NUM_UNIVERSE_PLANET_DENSITIES //keep this last, the number of planet density options +}; + +namespace GG { + GG_ENUM_MAP_BEGIN(PlanetDensity) + GG_ENUM_MAP_INSERT(INVALID_PLANET_DENSITY) + GG_ENUM_MAP_INSERT(PD_LOW) + GG_ENUM_MAP_INSERT(PD_AVERAGE) + GG_ENUM_MAP_INSERT(PD_HIGH) + GG_ENUM_MAP_END +} +GG_ENUM_STREAM_IN(PlanetDensity) +GG_ENUM_STREAM_OUT(PlanetDensity) + + +/** types of starlane frequencies */ +enum StarlaneFrequency { + INVALID_STARLANE_FREQENCY = -1, + LANES_NONE, + LANES_FEW, + LANES_SOME, + LANES_SEVERAL, + LANES_MANY, + LANES_VERY_MANY, + NUM_STARLANE_FREQENCIES // keep this last, the number of starlane frequency options +}; + +namespace GG { + GG_ENUM_MAP_BEGIN(StarlaneFrequency) + GG_ENUM_MAP_INSERT(INVALID_STARLANE_FREQENCY) + GG_ENUM_MAP_INSERT(LANES_NONE) + GG_ENUM_MAP_INSERT(LANES_FEW) + GG_ENUM_MAP_INSERT(LANES_SOME) + GG_ENUM_MAP_INSERT(LANES_SEVERAL) + GG_ENUM_MAP_INSERT(LANES_MANY) + GG_ENUM_MAP_INSERT(LANES_VERY_MANY) + GG_ENUM_MAP_END +} +GG_ENUM_STREAM_IN(StarlaneFrequency) +GG_ENUM_STREAM_OUT(StarlaneFrequency) + + +/** types of starlane frequencies */ +enum SpecialsFrequency { + INVALID_SPECIALS_FREQENCY = -1, + SPECIALS_NONE, + SPECIALS_RARE, + SPECIALS_UNCOMMON, + SPECIALS_COMMON, + NUM_SPECIALS_FREQENCIES // keep this last, the number of specials frequency options +}; + +namespace GG { + GG_ENUM_MAP_BEGIN(SpecialsFrequency) + GG_ENUM_MAP_INSERT(INVALID_SPECIALS_FREQENCY) + GG_ENUM_MAP_INSERT(SPECIALS_NONE) + GG_ENUM_MAP_INSERT(SPECIALS_RARE) + GG_ENUM_MAP_INSERT(SPECIALS_UNCOMMON) + GG_ENUM_MAP_INSERT(SPECIALS_COMMON) + GG_ENUM_MAP_END +} +GG_ENUM_STREAM_IN(SpecialsFrequency) +GG_ENUM_STREAM_OUT(SpecialsFrequency) + + /** the types of diplomatic empire affiliations to a given empire*/ enum EmpireAffiliationType { INVALID_EMPIRE_AFFIL_TYPE = -1, Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2006-07-30 16:49:28 UTC (rev 1866) +++ trunk/FreeOrion/universe/Universe.cpp 2006-07-31 00:06:03 UTC (rev 1867) @@ -386,7 +386,7 @@ } } - System* GenerateSystem(Universe &universe, Universe::Age age, double x, double y) + System* GenerateSystem(Universe &universe, Age age, double x, double y) { const std::vector<int>& base_star_type_dist = UniverseDataTables()["BaseStarTypeDist"][0]; const std::vector<std::vector<int> >& universe_age_mod_to_star_type_dist = UniverseDataTables()["UniverseAgeModToStarTypeDist"]; @@ -422,7 +422,7 @@ return system; } - void GenerateStarField(Universe &universe, Universe::Age age, const std::vector<std::pair<double, double> > &positions, + void GenerateStarField(Universe &universe, Age age, const std::vector<std::pair<double, double> > &positions, Universe::AdjacencyGrid& adjacency_grid, double adjacency_box_size) { // generate star field Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2006-07-30 16:49:28 UTC (rev 1866) +++ trunk/FreeOrion/universe/Universe.h 2006-07-31 00:06:03 UTC (rev 1867) @@ -69,54 +69,6 @@ typedef std::map<int, std::set<int> > ObjectKnowledgeMap; ///< container type used to hold sets of IDs of Empires which known information about an object (or deleted object); keyed by object ID number public: - /** the types of universe shapes available in FreeOrion*/ - enum Shape { - SPIRAL_2, ///< a two-armed spiral galaxy - SPIRAL_3, ///< a three-armed spiral galaxy - SPIRAL_4, ///< a four-armed spiral galaxy - CLUSTER, ///< a cluster galaxy - ELLIPTICAL, ///< an elliptical galaxy - IRREGULAR, ///< an irregular galaxy - RING, ///< a ring galaxy - GALAXY_SHAPES ///< the number of shapes in this enum (leave this last) - }; - - /** types of Univervse ages*/ - enum Age { - AGE_YOUNG, - AGE_MATURE, - AGE_ANCIENT, - NUM_UNIVERSE_AGES // keep this last, the number of universe age options - }; - - /** types of Planet Density */ - enum PlanetDensity { - PD_LOW, - PD_AVERAGE, - PD_HIGH, - NUM_UNIVERSE_PLANET_DENSITIES //keep this last, the number of planet density options - }; - - /** types of starlane frequencies */ - enum StarlaneFrequency{ - LANES_NONE, - LANES_FEW, - LANES_SOME, - LANES_SEVERAL, - LANES_MANY, - LANES_VERY_MANY, - NUM_STARLANE_FREQENCIES // keep this last, the number of starlane frequency options - }; - - /** types of starlane frequencies */ - enum SpecialsFrequency{ - SPECIALS_NONE, - SPECIALS_RARE, - SPECIALS_UNCOMMON, - SPECIALS_COMMON, - NUM_SPECIALS_FREQENCIES // keep this last, the number of specials frequency options - }; - /** Set to true to make everything visible for everyone. Useful for debugging. */ static const bool ALL_OBJECTS_VISIBLE; Modified: trunk/FreeOrion/util/MultiplayerCommon.cpp =================================================================== --- trunk/FreeOrion/util/MultiplayerCommon.cpp 2006-07-30 16:49:28 UTC (rev 1866) +++ trunk/FreeOrion/util/MultiplayerCommon.cpp 2006-07-31 00:06:03 UTC (rev 1867) @@ -21,7 +21,7 @@ #endif db.Add<std::string>("log-level", "Sets the level at or above which log messages will be output " "(levels in order of decreasing verbosity: DEBUG, INFO, NOTICE, WARN, ERROR, CRIT, " - "ALERT, FATAL, EMERG", "WARN"); + "ALERT, FATAL, EMERG)", "WARN"); db.Add<std::string>("stringtable-filename", "Sets the language-specific string table filename.", "eng_stringtable.txt"); } bool temp_bool = RegisterOptions(&AddOptions); |
From: <tz...@us...> - 2006-10-22 22:02:49
|
Revision: 1923 http://svn.sourceforge.net/freeorion/revision/?rev=1923&view=rev Author: tzlaine Date: 2006-10-22 15:02:42 -0700 (Sun, 22 Oct 2006) Log Message: ----------- Reimplemented MinUsableSize() in CUIStateButton, since the GG::StateButton value was not quite right, and changed the initialization code for the controls in ServerConnectWnd to use a GG::Layout, in order both to fix the current arrangement of controls and to make life easier for maintainers. Modified Paths: -------------- trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/CUIControls.h trunk/FreeOrion/UI/ServerConnectWnd.cpp trunk/FreeOrion/UI/ServerConnectWnd.h Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2006-10-22 21:03:50 UTC (rev 1922) +++ trunk/FreeOrion/UI/CUIControls.cpp 2006-10-22 22:02:42 UTC (rev 1923) @@ -309,6 +309,15 @@ GG::Connect(CheckedSignal, PlayButtonCheckSound(style == GG::SBSTYLE_3D_RADIO), -1); } +GG::Pt CUIStateButton::MinUsableSize() const +{ + // HACK! This code assumes that the text_format flag GG::TF_VCENTER is in effect. This is currently the case for + // all of CUIStateButton in FO. + GG::Pt retval = StateButton::MinUsableSize(); + retval.y = TextControl::MinUsableSize().y; + return retval; +} + void CUIStateButton::Render() { if (static_cast<int>(Style()) == GG::SBSTYLE_3D_CHECKBOX || Modified: trunk/FreeOrion/UI/CUIControls.h =================================================================== --- trunk/FreeOrion/UI/CUIControls.h 2006-10-22 21:03:50 UTC (rev 1922) +++ trunk/FreeOrion/UI/CUIControls.h 2006-10-22 22:02:42 UTC (rev 1923) @@ -116,13 +116,15 @@ //@} /** \name Accessors */ //@{ - GG::Clr BorderColor() const {return m_border_color;} ///< returns the color used to render the border of the button + virtual GG::Pt MinUsableSize() const; + + GG::Clr BorderColor() const {return m_border_color;} ///< returns the color used to render the border of the button //@} /** \name Mutators */ //@{ - virtual void Render(); - virtual void MouseEnter(const GG::Pt& pt, Uint32 keys); - virtual void MouseLeave(); + virtual void Render(); + virtual void MouseEnter(const GG::Pt& pt, Uint32 keys); + virtual void MouseLeave(); //@} private: Modified: trunk/FreeOrion/UI/ServerConnectWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ServerConnectWnd.cpp 2006-10-22 21:03:50 UTC (rev 1922) +++ trunk/FreeOrion/UI/ServerConnectWnd.cpp 2006-10-22 22:02:42 UTC (rev 1923) @@ -6,6 +6,7 @@ #include "../util/MultiplayerCommon.h" #include <GG/Button.h> +#include <GG/Layout.h> #include <GG/TextControl.h> #include <GG/SDL/SDLGUI.h> @@ -14,11 +15,9 @@ #include <cctype> namespace { - const int SERVERS_LIST_BOX_WIDTH = 400; - const int OK_CANCEL_BUTTON_WIDTH = 80; - const int CONTROL_MARGIN = 5; // gap to leave between controls in the window + const int WINDOW_WIDTH = 400; + const int WINDOW_HEIGTH = 535; const int LAN_SERVER_SEARCH_TIMEOUT = 1; // in seconds - const int SERVER_CONNECT_WND_WIDTH = SERVERS_LIST_BOX_WIDTH + 6 * CONTROL_MARGIN; std::set<std::string> g_LAN_servers; // semi-persistent list of known LAN servers (persists only during runtime, but longer than the server connect window) bool NameOK(const std::string& name) @@ -33,9 +32,9 @@ } ServerConnectWnd::ServerConnectWnd() : - CUIWnd(UserString("SCONNECT_WINDOW_TITLE"), (GG::GUI::GetGUI()->AppWidth() - SERVER_CONNECT_WND_WIDTH) / 2, - (GG::GUI::GetGUI()->AppHeight() - 500 + ClientUI::Pts() + 10 + 3 * CONTROL_MARGIN) / 2, SERVER_CONNECT_WND_WIDTH, - 500 + ClientUI::Pts() + 10 + 3 * CONTROL_MARGIN, GG::CLICKABLE | GG::MODAL), + CUIWnd(UserString("SCONNECT_WINDOW_TITLE"), + (GG::GUI::GetGUI()->AppWidth() - WINDOW_WIDTH) / 2, (GG::GUI::GetGUI()->AppHeight() - WINDOW_HEIGTH) / 2, + WINDOW_WIDTH, WINDOW_HEIGTH, GG::CLICKABLE | GG::MODAL), m_host_or_join_radio_group(0), m_LAN_game_label(0), m_servers_lb(0), @@ -48,35 +47,50 @@ { TempUISoundDisabler sound_disabler; - int text_width = GG::GUI::GetGUI()->GetFont(ClientUI::Font(), ClientUI::Pts())->TextExtent(UserString("PLAYER_NAME_LABEL")).x; - const int PLAYER_NAME_EDIT_X = CONTROL_MARGIN + text_width + CONTROL_MARGIN; - m_player_name_edit = new CUIEdit(PLAYER_NAME_EDIT_X, CONTROL_MARGIN, ClientWidth() - 5 - PLAYER_NAME_EDIT_X, ""); + boost::shared_ptr<GG::Font> font = GG::GUI::GetGUI()->GetFont(ClientUI::Font(), ClientUI::Pts()); + GG::TextControl* player_name_label = new GG::TextControl(0, 0, 1, 1, UserString("PLAYER_NAME_LABEL"), font, ClientUI::TextColor(), GG::TF_LEFT); + m_player_name_edit = new CUIEdit(0, 0, 1, ""); + m_host_or_join_radio_group = new GG::RadioButtonGroup(0, 0, 1, 1, GG::VERTICAL); + m_host_or_join_radio_group->AddButton(new CUIStateButton(0, 0, 1, 1, UserString("HOST_GAME_BN"), GG::TF_LEFT, GG::SBSTYLE_3D_RADIO)); + m_host_or_join_radio_group->AddButton(new CUIStateButton(0, 0, 1, 1, UserString("JOIN_GAME_BN"), GG::TF_LEFT, GG::SBSTYLE_3D_RADIO)); + m_LAN_game_label = new GG::TextControl(0, 0, UserString("LAN_GAME_LABEL"), font, ClientUI::TextColor(), GG::TF_LEFT); + m_servers_lb = new CUIListBox(0, 0, 1, 1); + m_servers_lb->SetStyle(GG::LB_NOSORT | GG::LB_SINGLESEL); + m_find_LAN_servers_bn = new CUIButton(0, 0, 1, UserString("REFRESH_LIST_BN")); + m_internet_game_label = new GG::TextControl(0, 0, UserString("INTERNET_GAME_LABEL"), font, ClientUI::TextColor(), GG::TF_LEFT); + m_IP_address_edit = new CUIEdit(0, 0, 1, ""); + m_ok_bn = new CUIButton(0, 0, 1, UserString("OK")); + m_cancel_bn = new CUIButton(0, 0, 1, UserString("CANCEL")); - AttachChild(new GG::TextControl(CONTROL_MARGIN, CONTROL_MARGIN, text_width, m_player_name_edit->Height(), - UserString("PLAYER_NAME_LABEL"), - GG::GUI::GetGUI()->GetFont(ClientUI::Font(), ClientUI::Pts()), ClientUI::TextColor())); + const int OK_CANCEL_BUTTON_WIDTH = 80; + const int CONTROL_MARGIN = 5; - m_host_or_join_radio_group = new GG::RadioButtonGroup(CONTROL_MARGIN, m_player_name_edit->LowerRight().y + CONTROL_MARGIN, - SERVERS_LIST_BOX_WIDTH / 2, ClientUI::Pts() + 4 + CONTROL_MARGIN + ClientUI::Pts() + 4, GG::VERTICAL); - m_host_or_join_radio_group->AddButton(new CUIStateButton(0, 0, SERVERS_LIST_BOX_WIDTH / 2, ClientUI::Pts() + 4, UserString("HOST_GAME_BN"), GG::TF_LEFT, - GG::SBSTYLE_3D_RADIO)); - m_host_or_join_radio_group->AddButton(new CUIStateButton(0, ClientUI::Pts() + 4 + CONTROL_MARGIN, SERVERS_LIST_BOX_WIDTH / 2, ClientUI::Pts() + 4, - UserString("JOIN_GAME_BN"), GG::TF_LEFT, GG::SBSTYLE_3D_RADIO)); + GG::Layout* layout = new GG::Layout(0, 0, 1, 1, 8, 4, CONTROL_MARGIN); + layout->SetMinimumColumnWidth(0, player_name_label->MinUsableSize().x + CONTROL_MARGIN); + layout->SetColumnStretch(1, 1.0); + layout->SetMinimumColumnWidth(2, OK_CANCEL_BUTTON_WIDTH + CONTROL_MARGIN); + layout->SetMinimumColumnWidth(3, OK_CANCEL_BUTTON_WIDTH + CONTROL_MARGIN); + layout->SetMinimumRowHeight(0, m_player_name_edit->Height() + CONTROL_MARGIN); + layout->SetMinimumRowHeight(1, m_host_or_join_radio_group->MinUsableSize().y); + layout->SetMinimumRowHeight(2, m_LAN_game_label->Height() + 2 * CONTROL_MARGIN); + layout->SetRowStretch(3, 1.0); + layout->SetMinimumRowHeight(4, m_find_LAN_servers_bn->Height() + CONTROL_MARGIN); + layout->SetMinimumRowHeight(5, m_internet_game_label->Height() + CONTROL_MARGIN); + layout->SetMinimumRowHeight(6, m_IP_address_edit->Height() + CONTROL_MARGIN); + layout->SetMinimumRowHeight(7, m_ok_bn->Height() + CONTROL_MARGIN); - const int JOIN_CONTROLS_X = CONTROL_MARGIN + 10; - m_LAN_game_label = new GG::TextControl(JOIN_CONTROLS_X, m_host_or_join_radio_group->LowerRight().y + CONTROL_MARGIN, - UserString("LAN_GAME_LABEL"), GG::GUI::GetGUI()->GetFont(ClientUI::Font(), ClientUI::Pts()), ClientUI::TextColor()); - m_servers_lb = new CUIListBox(JOIN_CONTROLS_X, m_LAN_game_label->LowerRight().y + CONTROL_MARGIN, SERVERS_LIST_BOX_WIDTH, 300 - CONTROL_MARGIN); - m_find_LAN_servers_bn = new CUIButton(JOIN_CONTROLS_X, m_servers_lb->LowerRight().y + CONTROL_MARGIN, 100, UserString("REFRESH_LIST_BN")); - m_internet_game_label = new GG::TextControl(JOIN_CONTROLS_X, m_find_LAN_servers_bn->LowerRight().y + 2 * CONTROL_MARGIN, - UserString("INTERNET_GAME_LABEL"), GG::GUI::GetGUI()->GetFont(ClientUI::Font(), ClientUI::Pts()), ClientUI::TextColor()); - m_IP_address_edit = new CUIEdit(JOIN_CONTROLS_X, m_internet_game_label->LowerRight().y + CONTROL_MARGIN, SERVERS_LIST_BOX_WIDTH, ""); - m_ok_bn = new CUIButton(ClientWidth() - 2 * (OK_CANCEL_BUTTON_WIDTH + CONTROL_MARGIN), m_IP_address_edit->LowerRight().y + 2 * CONTROL_MARGIN, - OK_CANCEL_BUTTON_WIDTH, UserString("OK")); - m_cancel_bn = new CUIButton(ClientWidth() - (OK_CANCEL_BUTTON_WIDTH + CONTROL_MARGIN), m_IP_address_edit->LowerRight().y + 2 * CONTROL_MARGIN, - OK_CANCEL_BUTTON_WIDTH, UserString("CANCEL")); + layout->Add(player_name_label, 0, 0, 1, 1, GG::ALIGN_VCENTER); + layout->Add(m_player_name_edit, 0, 1, 1, 3, GG::ALIGN_VCENTER); + layout->Add(m_host_or_join_radio_group, 1, 0, 1, 4); + layout->Add(m_LAN_game_label, 2, 0, 1, 4, GG::ALIGN_BOTTOM); + layout->Add(m_servers_lb, 3, 0, 1, 4); + layout->Add(m_find_LAN_servers_bn, 4, 3); + layout->Add(m_internet_game_label, 5, 0, 1, 4); + layout->Add(m_IP_address_edit, 6, 0, 1, 4); + layout->Add(m_ok_bn, 7, 2); + layout->Add(m_cancel_bn, 7, 3); - m_servers_lb->SetStyle(GG::LB_NOSORT | GG::LB_SINGLESEL); + SetLayout(layout); g_LAN_servers = HumanClientApp::GetApp()->NetworkCore().DiscoverLANServers(LAN_SERVER_SEARCH_TIMEOUT); Init(); @@ -103,8 +117,6 @@ void ServerConnectWnd::Init() { - AttachSignalChildren(); - Connect(m_host_or_join_radio_group->ButtonChangedSignal, &ServerConnectWnd::HostOrJoinClicked, this); Connect(m_servers_lb->SelChangedSignal, &ServerConnectWnd::ServerSelected, this); Connect(m_find_LAN_servers_bn->ClickedSignal, &ServerConnectWnd::RefreshServerList, this); @@ -131,32 +143,6 @@ } } -void ServerConnectWnd::AttachSignalChildren() -{ - AttachChild(m_host_or_join_radio_group); - AttachChild(m_LAN_game_label); - AttachChild(m_servers_lb); - AttachChild(m_find_LAN_servers_bn); - AttachChild(m_internet_game_label); - AttachChild(m_IP_address_edit); - AttachChild(m_player_name_edit); - AttachChild(m_ok_bn); - AttachChild(m_cancel_bn); -} - -void ServerConnectWnd::DetachSignalChildren() -{ - DetachChild(m_host_or_join_radio_group); - DetachChild(m_LAN_game_label); - DetachChild(m_servers_lb); - DetachChild(m_find_LAN_servers_bn); - DetachChild(m_internet_game_label); - DetachChild(m_IP_address_edit); - DetachChild(m_player_name_edit); - DetachChild(m_ok_bn); - DetachChild(m_cancel_bn); -} - void ServerConnectWnd::RefreshServerList() { g_LAN_servers = HumanClientApp::GetApp()->NetworkCore().DiscoverLANServers(LAN_SERVER_SEARCH_TIMEOUT); Modified: trunk/FreeOrion/UI/ServerConnectWnd.h =================================================================== --- trunk/FreeOrion/UI/ServerConnectWnd.h 2006-10-22 21:03:50 UTC (rev 1922) +++ trunk/FreeOrion/UI/ServerConnectWnd.h 2006-10-22 22:02:42 UTC (rev 1923) @@ -40,8 +40,6 @@ private: void Init(); void PopulateServerList(); - void AttachSignalChildren(); - void DetachSignalChildren(); void RefreshServerList(); void HostOrJoinClicked(int idx); void ServerSelected(const std::set<int>& selections); |
From: <tz...@us...> - 2006-10-23 03:45:30
|
Revision: 1925 http://svn.sourceforge.net/freeorion/revision/?rev=1925&view=rev Author: tzlaine Date: 2006-10-22 20:45:27 -0700 (Sun, 22 Oct 2006) Log Message: ----------- - Changed the OptionsWnd music volume slider to update the music volume continuously as the slider moves. - Changed the way nebula textures are loaded. Instead of a fixed number of canonical textures being searched, any texture in [settings-dir]data/art that starts with "nebula" will be loaded. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/OptionsWnd.cpp trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2006-10-23 03:41:21 UTC (rev 1924) +++ trunk/FreeOrion/UI/MapWnd.cpp 2006-10-23 03:45:27 UTC (rev 1925) @@ -1,5 +1,3 @@ -//MapWnd.cpp - #include "MapWnd.h" #include "ClientUI.h" @@ -29,6 +27,10 @@ #include <GG/DrawUtil.h> #include <GG/MultiEdit.h> +#include <boost/algorithm/string/predicate.hpp> +#include <boost/filesystem/operations.hpp> +#include <boost/filesystem/exception.hpp> + #include <vector> #include <deque> @@ -49,7 +51,6 @@ namespace { const double ZOOM_STEP_SIZE = 1.25; - const int NUM_NEBULA_TEXTURES = 5; const int MIN_NEBULAE = 3; // this min and max are for a 1000.0-width galaxy const int MAX_NEBULAE = 6; const int END_TURN_BTN_WIDTH = 60; @@ -79,6 +80,29 @@ return true; } #endif + + boost::shared_ptr<GG::Texture> RandomNebula() + { + static std::vector<boost::shared_ptr<GG::Texture> > nebulae; + static boost::shared_ptr<SmallIntDistType> rand_int; + if (nebulae.empty()) { + namespace fs = boost::filesystem; + fs::directory_iterator end_it; + for (fs::directory_iterator it(ClientUI::ArtDir()); it != end_it; ++it) { + try { + if (fs::exists(*it) && !fs::is_directory(*it) && boost::algorithm::starts_with(it->leaf(), "nebula")) + nebulae.push_back(ClientUI::GetTexture(*it)); + } catch (const fs::filesystem_error& e) { + // ignore files for which permission is denied, and rethrow other exceptions + if (e.error() != fs::security_error) + throw; + } + } + rand_int.reset(new SmallIntDistType(SmallIntDist(0, nebulae.size() - 1))); + } + assert(2 <= nebulae.size()); + return nebulae[(*rand_int)()]; + } } @@ -579,9 +603,8 @@ m_nebulae.resize(num_nebulae); m_nebula_centers.resize(num_nebulae); SmallIntDistType universe_placement = SmallIntDist(0, static_cast<int>(Universe::UniverseWidth())); - SmallIntDistType nebula_type = SmallIntDist(1, NUM_NEBULA_TEXTURES); for (int i = 0; i < num_nebulae; ++i) { - m_nebulae[i] = ClientUI::GetTexture(ClientUI::ArtDir() / "nebula" / (boost::lexical_cast<std::string>(nebula_type()) + ".png")); + m_nebulae[i] = RandomNebula(); m_nebula_centers[i] = GG::Pt(universe_placement(), universe_placement()); } } Modified: trunk/FreeOrion/UI/OptionsWnd.cpp =================================================================== --- trunk/FreeOrion/UI/OptionsWnd.cpp 2006-10-23 03:41:21 UTC (rev 1924) +++ trunk/FreeOrion/UI/OptionsWnd.cpp 2006-10-23 03:45:27 UTC (rev 1925) @@ -372,7 +372,7 @@ slider->SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); slider->SetBrowseText(UserString(GetOptionsDB().GetDescription("music-volume"))); GG::Connect(button->CheckedSignal, &OptionsWnd::MusicClicked, this); - GG::Connect(slider->SlidAndStoppedSignal, &OptionsWnd::MusicVolumeSlid, this); + GG::Connect(slider->SlidSignal, &OptionsWnd::MusicVolumeSlid, this); } void OptionsWnd::VolumeOption(const std::string& toggle_option_name, const std::string& volume_option_name, const std::string& text, Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2006-10-23 03:41:21 UTC (rev 1924) +++ trunk/FreeOrion/UI/SidePanel.cpp 2006-10-23 03:45:27 UTC (rev 1925) @@ -31,10 +31,9 @@ #include <fstream> + using boost::lexical_cast; -#define ROTATING_PLANET_IMAGES 1 // set this to 1 to use the OpenGL-rendered rotating planets code - namespace { bool PlaySounds() {return GetOptionsDB().Get<bool>("UI.sound.enabled");} void PlaySidePanelOpenSound() {if (PlaySounds()) HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() / GetOptionsDB().Get<std::string>("UI.sound.sidepanel-open"));} |
From: <tz...@us...> - 2006-10-24 02:19:24
|
Revision: 1926 http://svn.sourceforge.net/freeorion/revision/?rev=1926&view=rev Author: tzlaine Date: 2006-10-23 19:19:20 -0700 (Mon, 23 Oct 2006) Log Message: ----------- Broke the system name details out of SystemIcon into their own class, OwnerColoredSystemName. Using this new class, the drop-down systems list in the SidePanel now has empire-colored system names. Modified Paths: -------------- trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/UI/SystemIcon.cpp trunk/FreeOrion/UI/SystemIcon.h Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2006-10-23 03:45:27 UTC (rev 1925) +++ trunk/FreeOrion/UI/SidePanel.cpp 2006-10-24 02:19:20 UTC (rev 1926) @@ -2,15 +2,20 @@ #include "CUIWnd.h" #include "CUIControls.h" - #include "../client/human/HumanClientApp.h" #include "../util/MultiplayerCommon.h" #include "../universe/Predicates.h" #include "../universe/ShipDesign.h" +#include "SystemIcon.h" #include "../util/Random.h" +#include "FleetWnd.h" #include "FocusSelector.h" +#include "MapWnd.h" #include "../util/XMLDoc.h" #include "../Empire/Empire.h" +#include "../universe/Fleet.h" +#include "../universe/Ship.h" +#include "../util/OptionsDB.h" #include <GG/DrawUtil.h> #include <GG/StaticGraphic.h> @@ -18,17 +23,9 @@ #include <GG/Scroll.h> #include <GG/dialogs/ThreeButtonDlg.h> -#include "../universe/Fleet.h" -#include "../universe/Ship.h" -#include "../util/OptionsDB.h" - -#include "../UI/FleetWnd.h" - #include <boost/filesystem/fstream.hpp> #include <boost/format.hpp> -#include "MapWnd.h" - #include <fstream> @@ -1465,7 +1462,7 @@ else continue; } else { - row->push_back(boost::io::str(boost::format(UserString("SP_SYSTEM_NAME")) % sys_vec[i]->Name()), ClientUI::Font(),SystemNameFontSize(), ClientUI::TextColor()); + row->push_back(new OwnerColoredSystemName(sys_vec[i], HumanClientApp::GetApp()->GetFont(ClientUI::Font(), SystemNameFontSize()), UserString("SP_SYSTEM_NAME"))); } m_system_name->Insert(row); Modified: trunk/FreeOrion/UI/SystemIcon.cpp =================================================================== --- trunk/FreeOrion/UI/SystemIcon.cpp 2006-10-23 03:45:27 UTC (rev 1925) +++ trunk/FreeOrion/UI/SystemIcon.cpp 2006-10-24 02:19:20 UTC (rev 1926) @@ -1,5 +1,3 @@ -//SystemIcon.cpp - #include "SystemIcon.h" #include "ClientUI.h" @@ -17,8 +15,10 @@ #include <GG/StaticGraphic.h> #include <GG/TextControl.h> +#include <boost/format.hpp> #include <boost/lexical_cast.hpp> + namespace { const std::map<int, std::string>& StarTypesNames() { @@ -32,9 +32,50 @@ star_type_names[STAR_BLACK] = "black"; return star_type_names; } +} +//////////////////////////////////////////////// +// OwnerColoredSystemName +//////////////////////////////////////////////// +OwnerColoredSystemName::OwnerColoredSystemName(const System* system, const boost::shared_ptr<GG::Font>& font, const std::string& format_text/* = ""*/, Uint32 flags/* = 0*/) : + Control(0, 0, 1, 1, flags) +{ + std::string str = format_text == "" ? system->Name() : boost::io::str(boost::format(format_text) % system->Name()); + int width = 0; + const std::set<int>& owners = system->Owners(); + if (owners.size() <= 1) { + GG::Clr text_color = ClientUI::TextColor(); + if (!owners.empty()) + text_color = Empires().Lookup(*owners.begin())->Color(); + GG::TextControl* text = new GG::TextControl(width, 0, str, font, text_color); + m_subcontrols.push_back(text); + AttachChild(m_subcontrols.back()); + width += m_subcontrols.back()->Width(); + } else { + Uint32 format = 0; + std::vector<GG::Font::LineData> lines; + GG::Pt extent = font->DetermineLines(str, format, 1000, lines); + unsigned int first_char_pos = 0; + unsigned int last_char_pos = 0; + int pixels_per_owner = extent.x / owners.size() + 1; // the +1 is to make sure there is not a stray character left off the end + int owner_idx = 1; + for (std::set<int>::const_iterator it = owners.begin(); it != owners.end(); ++it, ++owner_idx) { + while (last_char_pos < str.size() && lines[0].char_data[last_char_pos].extent < (owner_idx * pixels_per_owner)) { + ++last_char_pos; + } + m_subcontrols.push_back(new GG::TextControl(width, 0, str.substr(first_char_pos, last_char_pos - first_char_pos), + font, Empires().Lookup(*it)->Color())); + AttachChild(m_subcontrols.back()); + first_char_pos = last_char_pos; + width += m_subcontrols.back()->Width(); + } + } + Resize(GG::Pt(width, m_subcontrols[0]->Height())); } +void OwnerColoredSystemName::Render() +{} + //////////////////////////////////////////////// // SystemIcon //////////////////////////////////////////////// @@ -43,6 +84,7 @@ m_system(*GetUniverse().Object<const System>(id)), m_static_graphic(0), m_selection_indicator(0), + m_name(0), m_default_star_color(GG::CLR_WHITE) { Connect(m_system.StateChangedSignal, &SystemIcon::Refresh, this); @@ -57,7 +99,6 @@ static_cast<int>(ul.y + ClientUI::SystemIconSize() * zoom + 0.5))); // static graphic - //boost::shared_ptr<GG::Texture> graphic = GetStarTexture(m_system.Star(), m_system.ID()); boost::shared_ptr<GG::Texture> graphic = ClientUI::GetNumberedTexture("stars", StarTypesNames(), m_system.Star(), m_system.ID()); m_static_graphic = new GG::StaticGraphic(0, 0, Width(), Height(), graphic, GG::GR_FITGRAPHIC); AdjustBrightness(m_default_star_color, 0.80); @@ -153,40 +194,13 @@ SetText(m_system.Name()); // set up the name text controls - for (unsigned int i = 0; i < m_name.size(); ++i) { - DeleteChild(m_name[i]); - } - m_name.clear(); - - const std::set<int>& owners = m_system.Owners(); - if (owners.size() < 2) { - GG::Clr text_color = ClientUI::TextColor(); - if (!owners.empty()) { - text_color = Empires().Lookup(*owners.begin())->Color(); - } - m_name.push_back(new GG::TextControl(0, 0, m_system.Name(), GG::GUI::GetGUI()->GetFont(ClientUI::Font(), ClientUI::Pts()), text_color)); - AttachChild(m_name[0]); - } else { + if (!m_system.Name().empty()) { + delete m_name; boost::shared_ptr<GG::Font> font = GG::GUI::GetGUI()->GetFont(ClientUI::Font(), ClientUI::Pts()); - Uint32 format = 0; - std::vector<GG::Font::LineData> lines; - GG::Pt extent = font->DetermineLines(m_system.Name(), format, 1000, lines); - unsigned int first_char_pos = 0; - unsigned int last_char_pos = 0; - int pixels_per_owner = extent.x / owners.size() + 1; // the +1 is to make sure there is not a stray character left off the end - int owner_idx = 1; - for (std::set<int>::const_iterator it = owners.begin(); it != owners.end(); ++it, ++owner_idx) { - while (last_char_pos < m_system.Name().size() && lines[0].char_data[last_char_pos].extent < (owner_idx * pixels_per_owner)) { - ++last_char_pos; - } - m_name.push_back(new GG::TextControl(0, 0, m_system.Name().substr(first_char_pos, last_char_pos - first_char_pos), - GG::GUI::GetGUI()->GetFont(ClientUI::Font(), ClientUI::Pts()), - Empires().Lookup(*it)->Color())); - AttachChild(m_name.back()); - first_char_pos = last_char_pos; - } + m_name = new OwnerColoredSystemName(&m_system, font); + AttachChild(m_name); + PositionSystemName(); } - PositionSystemName(); std::vector<const Fleet*> fleets = m_system.FindObjects<Fleet>(); for (unsigned int i = 0; i < fleets.size(); ++i) @@ -217,16 +231,14 @@ void SystemIcon::ShowName() { - for (unsigned int i = 0; i < m_name.size(); ++i) { - m_name[i]->Show(); - } + if (m_name) + m_name->Show(); } void SystemIcon::HideName() { - for (unsigned int i = 0; i < m_name.size(); ++i) { - m_name[i]->Hide(); - } + if (m_name) + m_name->Hide(); } void SystemIcon::CreateFleetButtons() @@ -272,17 +284,8 @@ void SystemIcon::PositionSystemName() { - if (!m_name.empty()) { - int total_width = 0; - std::vector<int> extents; - for (unsigned int i = 0; i < m_name.size(); ++i) { - extents.push_back(total_width); - total_width += m_name[i]->Width(); - } - for (unsigned int i = 0; i < m_name.size(); ++i) { - m_name[i]->MoveTo(GG::Pt((Width() - total_width) / 2 + extents[i], Height())); - } - } + if (m_name) + m_name->MoveTo(GG::Pt((Width() - m_name->Width()) / 2, Height())); } void SystemIcon::FleetCreatedOrDestroyed(const Fleet&) Modified: trunk/FreeOrion/UI/SystemIcon.h =================================================================== --- trunk/FreeOrion/UI/SystemIcon.h 2006-10-23 03:45:27 UTC (rev 1925) +++ trunk/FreeOrion/UI/SystemIcon.h 2006-10-24 02:19:20 UTC (rev 1926) @@ -11,6 +11,7 @@ #include "CUIDrawUtil.h" #endif + class Fleet; class FleetButton; class System; @@ -19,11 +20,20 @@ class TextControl; } -/** a GUI control that allows interaction with a star system. - This class allows user interaction with star systems - on the galaxy map. It contains the graphic to display the - system, along with the object ID of the UniverseObject associated - with it. */ +/** A TextControl-like GG::Control that displays the name of a system in the color(s) of the owning empire(s). */ +class OwnerColoredSystemName : public GG::Control +{ +public: + OwnerColoredSystemName(const System* system, const boost::shared_ptr<GG::Font>& font, const std::string& format_text = "", Uint32 flags = 0); + virtual void Render(); + +private: + std::vector<GG::TextControl*> m_subcontrols; +}; + +/** a GUI control that allows interaction with a star system. This class allows user interaction with star systems on + the galaxy map. It contains the graphic to display the system, along with the object ID of the UniverseObject + associated with it. */ class SystemIcon : public GG::Control { public: @@ -82,7 +92,7 @@ const System& m_system; //!< the System object associated with this SystemIcon GG::StaticGraphic* m_static_graphic; //!< the control used to render the displayed texture GG::StaticGraphic* m_selection_indicator; //!< shown to indicate system is selected in sidepanel - std::vector<GG::TextControl*> m_name; //!< the control that holds the name of the system (multiple controls may be needed, since there may be multiple owners and thus colors) + OwnerColoredSystemName* m_name; //!< the control that holds the name of the system GG::Clr m_default_star_color; std::map<int, FleetButton*> m_stationary_fleet_markers; //!< the fleet buttons for the fleets that are stationary in the system, indexed by Empire ID of the owner |
From: <tz...@us...> - 2006-10-27 06:07:38
|
Revision: 1933 http://svn.sourceforge.net/freeorion/revision/?rev=1933&view=rev Author: tzlaine Date: 2006-10-26 23:07:18 -0700 (Thu, 26 Oct 2006) Log Message: ----------- Updates to account for recent GG::Clr API change. Modified Paths: -------------- trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/CUIDrawUtil.cpp trunk/FreeOrion/UI/CUIWnd.cpp trunk/FreeOrion/UI/CombatWnd.cpp trunk/FreeOrion/UI/FocusSelector.cpp trunk/FreeOrion/UI/IntroScreen.cpp trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/UI/ResearchWnd.cpp trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2006-10-27 01:13:36 UTC (rev 1932) +++ trunk/FreeOrion/UI/CUIControls.cpp 2006-10-27 06:07:18 UTC (rev 1933) @@ -345,7 +345,7 @@ bn_lr -= GG::Pt(MARGIN, MARGIN); const int OFFSET = (bn_lr.y - bn_ul.y) / 2; glDisable(GL_TEXTURE_2D); - glColor4ubv(inside_color.v); + glColor(inside_color); glBegin(GL_QUADS); glVertex2i(bn_lr.x, bn_ul.y); glVertex2i(bn_ul.x + OFFSET, bn_ul.y); @@ -357,7 +357,7 @@ glVertex2i(bn_lr.x, bn_ul.y); glEnd(); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); - glColor4ubv(outside_color.v); + glColor(outside_color); glBegin(GL_POLYGON); glVertex2i(bn_lr.x, bn_ul.y); glVertex2i(bn_ul.x + OFFSET, bn_ul.y); @@ -494,7 +494,7 @@ AdjustBrightness(light_color, 35); if (!Disabled() && m_mouse_here) AdjustBrightness(light_color, TAB_BRIGHTENING_SCALE_FACTOR); - glColor4ubv(light_color.v); + glColor(light_color); glDisable(GL_TEXTURE_2D); glBegin(GL_POLYGON); if (m_orientation == GG::VERTICAL) { @@ -1327,7 +1327,7 @@ void ProductionInfoPanel::Draw(GG::Clr clr, bool fill) { GG::Pt ul = UpperLeft() + GG::Pt(3, 3), lr = LowerRight() - GG::Pt(3, 3); - glColor4ubv(clr.v); + glColor(clr); PartlyRoundedRect(ul, GG::Pt(lr.x, m_title->LowerRight().y + 2), CORNER_RADIUS, true, true, false, false, fill); std::pair<int, int> gap_to_use(m_center_gap.first + ul.x, m_center_gap.second + ul.x); @@ -1361,7 +1361,7 @@ int h = Height(); const double TURN_SEGMENT_WIDTH = Width() / static_cast<double>(m_total_turns); glDisable(GL_TEXTURE_2D); - glColor4ubv(m_background.v); + glColor(m_background); if (m_partially_complete_turn && m_turns_completed == m_total_turns - 1) { GG::BeginScissorClipping(static_cast<int>(lr.x - TURN_SEGMENT_WIDTH), ul.y, lr.x, static_cast<int>(lr.y - m_partially_complete_turn * h)); @@ -1372,12 +1372,12 @@ GG::BeginScissorClipping(static_cast<int>(lr.x - TURN_SEGMENT_WIDTH), static_cast<int>(lr.y - m_partially_complete_turn * h), lr.x, lr.y); - glColor4ubv(m_bar_color.v); + glColor(m_bar_color); glBegin(GL_POLYGON); RightEndVertices(lr.x - TURN_SEGMENT_WIDTH, ul.y, lr.x, lr.y); glEnd(); GG::EndScissorClipping(); - glColor4ubv(m_background.v); + glColor(m_background); } else { glBegin(GL_POLYGON); RightEndVertices(lr.x - TURN_SEGMENT_WIDTH, ul.y, lr.x, lr.y); @@ -1396,7 +1396,7 @@ glVertex2d(ul.x + TURN_SEGMENT_WIDTH * m_turns_completed, lr.y - h * m_partially_complete_turn); glVertex2d(ul.x + TURN_SEGMENT_WIDTH * (m_turns_completed + 1), lr.y - h * m_partially_complete_turn); } - glColor4ubv(m_bar_color.v); + glColor(m_bar_color); if (0 < m_turns_completed && m_turns_completed < m_total_turns - 1) { glVertex2d(ul.x + TURN_SEGMENT_WIDTH * (m_turns_completed + 1), lr.y - h * m_partially_complete_turn); glVertex2d(ul.x + TURN_SEGMENT_WIDTH * m_turns_completed, lr.y - h * m_partially_complete_turn); @@ -1420,19 +1420,19 @@ GG::BeginScissorClipping(ul.x, ul.y, static_cast<int>(ul.x + TURN_SEGMENT_WIDTH), static_cast<int>(lr.y - m_partially_complete_turn * h)); - glColor4ubv(m_background.v); + glColor(m_background); glBegin(GL_POLYGON); LeftEndVertices(ul.x, ul.y, ul.x + TURN_SEGMENT_WIDTH, lr.y); glEnd(); GG::EndScissorClipping(); } else { if (!m_turns_completed) - glColor4ubv(m_background.v); + glColor(m_background); glBegin(GL_POLYGON); LeftEndVertices(ul.x, ul.y, ul.x + TURN_SEGMENT_WIDTH, lr.y); glEnd(); } - glColor4ubv(m_outline_color.v); + glColor(m_outline_color); glBegin(GL_LINES); for (double x = ul.x + TURN_SEGMENT_WIDTH; x < lr.x - 1.0e-5; x += TURN_SEGMENT_WIDTH) { glVertex2d(x, ul.y); Modified: trunk/FreeOrion/UI/CUIDrawUtil.cpp =================================================================== --- trunk/FreeOrion/UI/CUIDrawUtil.cpp 2006-10-27 01:13:36 UTC (rev 1932) +++ trunk/FreeOrion/UI/CUIDrawUtil.cpp 2006-10-27 06:07:18 UTC (rev 1933) @@ -2,8 +2,11 @@ #include "../util/MultiplayerCommon.h" +#include <GG/DrawUtil.h> + #include <cmath> + namespace { void FindIsoscelesTriangleVertices(int x1, int y1, int x2, int y2, ShapeOrientation orientation, double& x1_, double& y1_, double& x2_, double& y2_, double& x3_, double& y3_) @@ -92,7 +95,7 @@ // draw border if (thick) { glBegin(GL_QUADS); - glColor4ubv(border.v); + glColor(border); // the top glVertex2i(inner_x2, inner_y1); @@ -160,7 +163,7 @@ } // draw interior of rectangle - glColor4ubv(color.v); + glColor(color); glBegin(GL_POLYGON); if (upper_left_angled) { glVertex2i(inner_ul_corner_x1, inner_ul_corner_y1); @@ -200,7 +203,7 @@ void Triangle(double x1, double y1, double x2, double y2, double x3, double y3, GG::Clr color, bool border/*= true*/) { glDisable(GL_TEXTURE_2D); - glColor4ubv(color.v); + glColor(color); glBegin(GL_TRIANGLES); glVertex2d(x1, y1); glVertex2d(x2, y2); @@ -209,7 +212,7 @@ if (border) { AdjustBrightness(color, 75); // trace the lines both ways, to ensure that this small polygon looks symmetrical - glColor4ubv(color.v); + glColor(color); glBegin(GL_LINE_LOOP); glVertex2d(x3, y3); glVertex2d(x2, y2); @@ -276,7 +279,7 @@ AdjustBrightness(border_color, 75); border_color.a = 255; if (orientation == SHAPE_LEFT) { - glColor4ubv(color.v); + glColor(color); glBegin(GL_QUADS); glVertex2d(cutout_point, middle); glVertex2d(base, cutout_top); @@ -288,7 +291,7 @@ glVertex2d(cutout_point, middle); glEnd(); - glColor4ubv(border_color.v); + glColor(border_color); glBegin(GL_LINE_STRIP); glVertex2d(cutout_point, middle); glVertex2d(base, cutout_top); @@ -302,7 +305,7 @@ glVertex2d(cutout_point, middle); glEnd(); } else { - glColor4ubv(color.v); + glColor(color); glBegin(GL_QUADS); glVertex2d(point, middle); glVertex2d(base, top); @@ -314,7 +317,7 @@ glVertex2d(point, middle); glEnd(); - glColor4ubv(border_color.v); + glColor(border_color); glBegin(GL_LINE_STRIP); glVertex2d(point, middle); glVertex2d(base, top); Modified: trunk/FreeOrion/UI/CUIWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CUIWnd.cpp 2006-10-27 01:13:36 UTC (rev 1932) +++ trunk/FreeOrion/UI/CUIWnd.cpp 2006-10-27 06:07:18 UTC (rev 1933) @@ -98,7 +98,7 @@ // draw a dash to signify the minimize command int middle_y = (lr.y + ul.y) / 2; glDisable(GL_TEXTURE_2D); - glColor4ubv(color_to_use.v); + glColor(color_to_use); glBegin(GL_LINES); glVertex2i(ul.x, middle_y); glVertex2i(lr.x, middle_y); @@ -139,7 +139,7 @@ if (State() != BN_ROLLOVER) AdjustBrightness(color_to_use, BUTTON_DIMMING_SCALE_FACTOR); glDisable(GL_TEXTURE_2D); - glColor4ubv(color_to_use.v); + glColor(color_to_use); // this is slightly less efficient than using GL_LINES, but the lines are rasterized differently on different // OpengGL implementaions, so we do it this way to produce the "x" we want glBegin(GL_POINTS); @@ -205,7 +205,7 @@ // draw background glPolygonMode(GL_BACK, GL_FILL); glBegin(GL_POLYGON); - glColor4ubv(ClientUI::WndColor().v); + glColor(ClientUI::WndColor()); glVertex2i(ul.x, ul.y); glVertex2i(lr.x, ul.y); glVertex2i(lr.x, lr.y - OUTER_EDGE_ANGLE_OFFSET); @@ -217,7 +217,7 @@ // draw outer border on pixel inside of the outer edge of the window glPolygonMode(GL_BACK, GL_LINE); glBegin(GL_POLYGON); - glColor4ubv(ClientUI::WndOuterBorderColor().v); + glColor(ClientUI::WndOuterBorderColor()); glVertex2i(ul.x, ul.y); glVertex2i(lr.x, ul.y); glVertex2i(lr.x, lr.y - OUTER_EDGE_ANGLE_OFFSET); @@ -231,7 +231,7 @@ // draw inner border, including extra resize-tab lines glBegin(GL_LINE_STRIP); - glColor4ubv(ClientUI::WndInnerBorderColor().v); + glColor(ClientUI::WndInnerBorderColor()); glVertex2i(cl_ul.x, cl_ul.y); glVertex2i(cl_lr.x, cl_ul.y); glVertex2i(cl_lr.x, cl_lr.y - INNER_BORDER_ANGLE_OFFSET); @@ -242,9 +242,9 @@ glBegin(GL_LINES); // draw the extra lines of the resize tab if (m_resizable) { - glColor4ubv(ClientUI::WndInnerBorderColor().v); + glColor(ClientUI::WndInnerBorderColor()); } else { - glColor4ubv(GG::DisabledColor(ClientUI::WndInnerBorderColor()).v); + glColor(GG::DisabledColor(ClientUI::WndInnerBorderColor())); } glVertex2i(cl_lr.x, cl_lr.y - RESIZE_HASHMARK1_OFFSET); glVertex2i(cl_lr.x - RESIZE_HASHMARK1_OFFSET, cl_lr.y); @@ -257,7 +257,7 @@ GG::FlatRectangle(ul.x, ul.y, lr.x, lr.y, ClientUI::WndColor(), ClientUI::WndOuterBorderColor(), 1); } - glColor4ubv(ClientUI::TextColor().v); + glColor(ClientUI::TextColor()); boost::shared_ptr<GG::Font> font = GG::GUI::GetGUI()->GetFont(ClientUI::TitleFont(), ClientUI::TitlePts()); font->RenderText(ul.x + BORDER_LEFT, ul.y, WindowText()); } Modified: trunk/FreeOrion/UI/CombatWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CombatWnd.cpp 2006-10-27 01:13:36 UTC (rev 1932) +++ trunk/FreeOrion/UI/CombatWnd.cpp 2006-10-27 06:07:18 UTC (rev 1933) @@ -60,13 +60,13 @@ rc = GG::Rect(ul+GG::Pt(20,5),ul+GG::Pt(500,25)); font = HumanClientApp::GetApp()->GetFont(ClientUI::Font(), static_cast<int>(ClientUI::Pts()*1.0)); - glColor4ubv(ClientUI::TextColor().v); + glColor(ClientUI::TextColor()); format = GG::TF_LEFT | GG::TF_BOTTOM; font->RenderText(rc.UpperLeft(),rc.LowerRight(),UserString("COMBAT_BATTLE"), format, 0); rc = GG::Rect(ul+GG::Pt(20+50,5),ul+GG::Pt(500,28)); font = HumanClientApp::GetApp()->GetFont(ClientUI::Font(), static_cast<int>(ClientUI::Pts()*1.7)); - glColor4ubv(ClientUI::TextColor().v); + glColor(ClientUI::TextColor()); format = GG::TF_LEFT | GG::TF_BOTTOM; font->RenderText(rc.UpperLeft(),rc.LowerRight(),boost::io::str(boost::format(UserString("COMBAT_SYSTEM")) % m_combat_info.m_system), format, 0); @@ -107,7 +107,7 @@ font = HumanClientApp::GetApp()->GetFont(ClientUI::Font(), static_cast<int>(ClientUI::Pts()*1.2)); rc = GG::Rect(area.UpperLeft()+rc_txt_empire.UpperLeft(),area.UpperLeft()+rc_txt_empire.LowerRight()); - glColor4ubv(ClientUI::TextColor().v);format = GG::TF_LEFT | GG::TF_VCENTER; + glColor(ClientUI::TextColor());format = GG::TF_LEFT | GG::TF_VCENTER; font->RenderText(rc.UpperLeft(),rc.LowerRight(),m_combat_info.m_opponents[i].empire, format, 0); for(unsigned int c=0;c<3;c++) @@ -115,7 +115,7 @@ GG::Rect col (area.Left()+c*ITEM_WIDTH, area.Top(),area.Left()+(c+1)*ITEM_WIDTH, area.Bottom()); GG::FlatRectangle(col.Left(), col.Top()+38, col.Right()+2, col.Bottom(), GG::CLR_ZERO,border_color, 2); - glColor4ubv(ClientUI::TextColor().v); + glColor(ClientUI::TextColor()); img_topic[c] .OrthoBlit(col.UpperLeft()+item_img_topic .UpperLeft(),col.UpperLeft()+item_img_topic .LowerRight(), false); img_arrow_split .OrthoBlit(col.UpperLeft()+item_img_arrow_split.UpperLeft(),col.UpperLeft()+item_img_arrow_split.LowerRight(), false); @@ -125,7 +125,7 @@ { rc = GG::Rect(col.UpperLeft()+item_txt[j].UpperLeft(),col.UpperLeft()+item_txt[j].LowerRight()); GG::FlatRectangle(rc.Left(), rc.Top(), rc.Right(), rc.Bottom(),entries[c][j].bg_clr,entries[c][j].border_clr,entries[c][j].border_width); - glColor4ubv(ClientUI::TextColor().v); + glColor(ClientUI::TextColor()); font->RenderText(rc.UpperLeft(),rc.LowerRight(),entries[c][j].txt, entries[c][j].txt_fmt, 0); } } Modified: trunk/FreeOrion/UI/FocusSelector.cpp =================================================================== --- trunk/FreeOrion/UI/FocusSelector.cpp 2006-10-27 01:13:36 UTC (rev 1932) +++ trunk/FreeOrion/UI/FocusSelector.cpp 2006-10-27 06:07:18 UTC (rev 1933) @@ -55,7 +55,7 @@ if (m_mouse_here) GG::FlatRectangle(ul.x, ul.y, lr.x, lr.y, GG::CLR_SHADOW, GG::CLR_ZERO, 0); if (m_texture) { - glColor4ubv(GG::CLR_WHITE.v); + glColor(GG::CLR_WHITE); m_texture->OrthoBlit(ul, lr, 0, false); } } Modified: trunk/FreeOrion/UI/IntroScreen.cpp =================================================================== --- trunk/FreeOrion/UI/IntroScreen.cpp 2006-10-27 01:13:36 UTC (rev 1932) +++ trunk/FreeOrion/UI/IntroScreen.cpp 2006-10-27 06:07:18 UTC (rev 1933) @@ -76,7 +76,7 @@ Uint32 format = GG::TF_CENTER | GG::TF_TOP; GG::FlatRectangle(ul.x,ul.y,lr.x,lr.y,GG::Clr(0.0,0.0,0.0,0.5),GG::CLR_ZERO,0); - glColor4ubv(GG::CLR_WHITE.v); + glColor(GG::CLR_WHITE); int offset=m_co; @@ -93,7 +93,7 @@ transparency = static_cast<int>(255*fade_in); } - glColor4ubv(GG::Clr(transparency,transparency,transparency,255).v); + glColor(GG::Clr(transparency,transparency,transparency,255)); GG::BeginScissorClipping(ul.x+m_cx,ul.y+m_cy,ul.x+m_cx+m_cw,ul.y+m_cy+m_ch); Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2006-10-27 01:13:36 UTC (rev 1932) +++ trunk/FreeOrion/UI/MapWnd.cpp 2006-10-27 06:07:18 UTC (rev 1933) @@ -1117,23 +1117,23 @@ glBegin(GL_TRIANGLE_STRIP); color.a = static_cast<unsigned char>(255 * OUTER_LINE_EDGE_ALPHA); - glColor4ubv(color.v); + glColor(color); glVertex2dv(far_left2); glVertex2dv(far_left1); color.a = static_cast<unsigned char>(255 * INNER_LINE_EDGE_ALPHA); - glColor4ubv(color.v); + glColor(color); glVertex2dv(left2); glVertex2dv(left1); color.a = static_cast<unsigned char>(255 * CENTER_ALPHA); - glColor4ubv(color.v); + glColor(color); glVertex2dv(center2); glVertex2dv(center1); color.a = static_cast<unsigned char>(255 * INNER_LINE_EDGE_ALPHA); - glColor4ubv(color.v); + glColor(color); glVertex2dv(right2); glVertex2dv(right1); color.a = static_cast<unsigned char>(255 * OUTER_LINE_EDGE_ALPHA); - glColor4ubv(color.v); + glColor(color); glVertex2dv(far_right2); glVertex2dv(far_right1); glEnd(); @@ -1167,7 +1167,7 @@ // this is obviously less efficient than using GL_LINE_STRIP, but GL_LINE_STRIP sometimes produces nasty artifacts // when the begining of a line segment starts offscreen glBegin(GL_LINES); - glColor4ubv(it->second.color.v); + glColor(it->second.color); const std::list<System*>& destinations = it->second.destinations; glVertex2d(ul.x + it->second.x * m_zoom_factor, ul.y + it->second.y * m_zoom_factor); for (std::list<System*>::const_iterator dest_it = destinations.begin(); dest_it != destinations.end(); ++dest_it) { @@ -1184,7 +1184,7 @@ glLineStipple(static_cast<int>(LINE_SCALE), PROJECTED_PATH_STIPPLE); if (!m_projected_fleet_lines.destinations.empty()) { glBegin(GL_LINES); - glColor4ubv(m_projected_fleet_lines.color.v); + glColor(m_projected_fleet_lines.color); const std::list<System*>& destinations = m_projected_fleet_lines.destinations; glVertex2d(ul.x + m_projected_fleet_lines.x * m_zoom_factor, ul.y + m_projected_fleet_lines.y * m_zoom_factor); for (std::list<System*>::const_iterator dest_it = destinations.begin(); dest_it != destinations.end(); ++dest_it) { Modified: trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp 2006-10-27 01:13:36 UTC (rev 1932) +++ trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp 2006-10-27 06:07:18 UTC (rev 1933) @@ -486,13 +486,18 @@ bool MultiplayerLobbyWnd::PlayerDataAcceptable() const { std::set<std::string> empire_names; - std::set<int> empire_colors; + std::set<Uint32> empire_colors; for (int i = 0; i < m_players_lb->NumRows(); ++i) { const PlayerRow& row = dynamic_cast<const PlayerRow&>(m_players_lb->GetRow(i)); if (row.player_data.empire_name.empty()) return false; empire_names.insert(row.player_data.empire_name); - empire_colors.insert(row.player_data.empire_color.i); + Uint32 color_as_uint = + row.player_data.empire_color.r << 24 | + row.player_data.empire_color.g << 16 | + row.player_data.empire_color.b << 8 | + row.player_data.empire_color.a; + empire_colors.insert(color_as_uint); } return static_cast<int>(empire_names.size()) == m_players_lb->NumRows() && static_cast<int>(empire_colors.size()) == m_players_lb->NumRows(); Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2006-10-27 01:13:36 UTC (rev 1932) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2006-10-27 06:07:18 UTC (rev 1933) @@ -206,7 +206,7 @@ { const int CORNER_RADIUS = 7; GG::Pt ul = UpperLeft(), lr = LowerRight(); - glColor4ubv(clr.v); + glColor(clr); PartlyRoundedRect(UpperLeft(), LowerRight(), CORNER_RADIUS, true, false, true, false, fill); } } @@ -278,7 +278,7 @@ // draw background glPolygonMode(GL_BACK, GL_FILL); - glColor4ubv(ClientUI::WndColor().v); + glColor(ClientUI::WndColor()); glBegin(GL_QUADS); glVertex2i(ul.x, ul.y); glVertex2i(lr.x, ul.y); @@ -308,7 +308,7 @@ // draw outer border on pixel inside of the outer edge of the window glPolygonMode(GL_BACK, GL_LINE); glBegin(GL_POLYGON); - glColor4ubv(ClientUI::WndOuterBorderColor().v); + glColor(ClientUI::WndOuterBorderColor()); glVertex2i(ul.x, ul.y); glVertex2i(lr.x, ul.y); glVertex2i(lr.x, lr.y - OUTER_EDGE_ANGLE_OFFSET); @@ -322,7 +322,7 @@ // draw inner border, including extra resize-tab lines glBegin(GL_LINE_STRIP); - glColor4ubv(ClientUI::WndInnerBorderColor().v); + glColor(ClientUI::WndInnerBorderColor()); glVertex2i(cl_ul.x, cl_ul.y); glVertex2i(cl_lr.x, cl_ul.y); glVertex2i(cl_lr.x, cl_lr.y - INNER_BORDER_ANGLE_OFFSET); @@ -333,9 +333,9 @@ glBegin(GL_LINES); // draw the extra lines of the resize tab if (m_resizable) { - glColor4ubv(ClientUI::WndInnerBorderColor().v); + glColor(ClientUI::WndInnerBorderColor()); } else { - glColor4ubv(GG::DisabledColor(ClientUI::WndInnerBorderColor()).v); + glColor(GG::DisabledColor(ClientUI::WndInnerBorderColor())); } glVertex2i(cl_lr.x, cl_lr.y - RESIZE_HASHMARK1_OFFSET); glVertex2i(cl_lr.x - RESIZE_HASHMARK1_OFFSET, cl_lr.y); @@ -345,7 +345,7 @@ glEnd(); glEnable(GL_TEXTURE_2D); - glColor4ubv(ClientUI::TextColor().v); + glColor(ClientUI::TextColor()); boost::shared_ptr<GG::Font> font = GG::GUI::GetGUI()->GetFont(ClientUI::TitleFont(), ClientUI::TitlePts()); font->RenderText(ul.x + BORDER_LEFT, ul.y, WindowText()); } Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2006-10-27 01:13:36 UTC (rev 1932) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2006-10-27 06:07:18 UTC (rev 1933) @@ -197,7 +197,7 @@ { const int CORNER_RADIUS = 7; GG::Pt ul = UpperLeft(), lr = LowerRight(); - glColor4ubv(clr.v); + glColor(clr); PartlyRoundedRect(UpperLeft(), LowerRight(), CORNER_RADIUS, true, false, true, false, fill); } Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2006-10-27 01:13:36 UTC (rev 1932) +++ trunk/FreeOrion/UI/SidePanel.cpp 2006-10-27 06:07:18 UTC (rev 1933) @@ -238,7 +238,7 @@ gluQuadricNormals(quad, GLU_SMOOTH); gluQuadricOrientation(quad, GLU_OUTSIDE); - glColor4ubv(GG::CLR_WHITE.v); + glColor(GG::CLR_WHITE); gluSphere(quad, r, 100, 100); } } @@ -965,7 +965,7 @@ bool SidePanel::PlanetPanel::RenderInhabited(const Planet &planet) { - glColor4ubv(ClientUI::TextColor().v); + glColor(ClientUI::TextColor()); boost::shared_ptr<GG::Font> font = HumanClientApp::GetApp()->GetFont(ClientUI::Font(),ClientUI::Pts()); Uint32 format = GG::TF_LEFT | GG::TF_BOTTOM; @@ -990,7 +990,7 @@ //population //x = m_planet_name->UpperLeft ().x+10; y = m_planet_name->LowerRight().y + RESOURCE_DISPLAY_HEIGHT+3; - glColor4ubv(ClientUI::TextColor().v); + glColor(ClientUI::TextColor()); icon=IconPopulation(); icon->OrthoBlit(x,y,x+font->Height(),y+font->Height(), 0, false); x+=font->Height(); text = lexical_cast<std::string>(population)+"/"+lexical_cast<std::string>(static_cast<int>(planet.MaxPop())); @@ -1002,7 +1002,7 @@ bool SidePanel::PlanetPanel::RenderOwned(const Planet &planet) { - glColor4ubv(ClientUI::TextColor().v); + glColor(ClientUI::TextColor()); boost::shared_ptr<GG::Font> font = HumanClientApp::GetApp()->GetFont(ClientUI::Font(),ClientUI::Pts()); Uint32 format = GG::TF_LEFT | GG::TF_BOTTOM; @@ -1025,7 +1025,7 @@ //population //x = m_planet_name->UpperLeft ().x+10; y = m_planet_name->LowerRight().y + RESOURCE_DISPLAY_HEIGHT+3; - glColor4ubv(ClientUI::TextColor().v); + glColor(ClientUI::TextColor()); icon=IconPopulation(); icon->OrthoBlit(x,y,x+font->Height(),y+font->Height(), 0, false); x+=font->Height(); @@ -1309,7 +1309,7 @@ int info_elem_width = (Width()-(6+1)*ICON_MARGIN)/6; //farming - glColor4ubv(ClientUI::TextColor().v); + glColor(ClientUI::TextColor()); icon=IconFarming(); icon->OrthoBlit(x,y,x+font->Height(),y+font->Height(), 0, false); //x+=font->Height(); text = (farming<0?"-":"+") + lexical_cast<std::string>(farming); @@ -1318,7 +1318,7 @@ x+=info_elem_width+ICON_MARGIN; //mining - glColor4ubv(ClientUI::TextColor().v); + glColor(ClientUI::TextColor()); icon=IconMining(); icon->OrthoBlit(x,y,x+font->Height(),y+font->Height(), 0, false); //x+=font->Height(); text = (mining<0?"-":"+") + lexical_cast<std::string>(mining); @@ -1327,7 +1327,7 @@ x+=info_elem_width+ICON_MARGIN; //trade - glColor4ubv(ClientUI::TextColor().v); + glColor(ClientUI::TextColor()); icon=IconTrade(); icon->OrthoBlit(x,y,x+font->Height(),y+font->Height(), 0, false); //x+=font->Height(); text = (trade<0?"-":"+") + lexical_cast<std::string>(trade); @@ -1336,7 +1336,7 @@ x+=info_elem_width+ICON_MARGIN; //research - glColor4ubv(ClientUI::TextColor().v); + glColor(ClientUI::TextColor()); icon=IconResearch(); icon->OrthoBlit(x,y,x+font->Height(),y+font->Height(), 0, false); //x+=font->Height(); text = (research<0?"-":"+") + lexical_cast<std::string>(research); @@ -1345,7 +1345,7 @@ x+=info_elem_width+ICON_MARGIN; //industy - glColor4ubv(ClientUI::TextColor().v); + glColor(ClientUI::TextColor()); icon=IconIndustry(); icon->OrthoBlit(x,y,x+font->Height(),y+font->Height(), 0, false); //x+=font->Height(); text = (industry<0?"-":"+") + lexical_cast<std::string>(industry); @@ -1354,7 +1354,7 @@ x+=info_elem_width+ICON_MARGIN; //defense - glColor4ubv(ClientUI::TextColor().v); + glColor(ClientUI::TextColor()); icon=IconDefense(); icon->OrthoBlit(x,y,x+font->Height(),y+font->Height(), 0, false); //x+=font->Height(); text = lexical_cast<std::string>(defense)+"/"+lexical_cast<std::string>(defense*3); @@ -1376,8 +1376,8 @@ SidePanel::SidePanel(int x, int y, int w, int h) : Wnd(x, y, w, h, GG::CLICKABLE), m_system_name(new CUIDropDownList(40, 0, w-80,SystemNameFontSize(), 10*SystemNameFontSize(),GG::CLR_ZERO,GG::Clr(0.0, 0.0, 0.0, 0.5))), - m_button_prev(new GG::Button(40-SystemNameFontSize(),4,SystemNameFontSize(),SystemNameFontSize(),"",GG::GUI::GetGUI()->GetFont(ClientUI::Font(),SystemNameFontSize()),GG::CLR_WHITE,GG::CLICKABLE)), - m_button_next(new GG::Button(40+w-80 ,4,SystemNameFontSize(),SystemNameFontSize(),"",GG::GUI::GetGUI()->GetFont(ClientUI::Font(),SystemNameFontSize()),GG::CLR_WHITE,GG::CLICKABLE)), + m_button_prev(new GG::Button(40-SystemNameFontSize(),4,SystemNameFontSize(),SystemNameFontSize(),"",GG::GUI::GetGUI()->GetFont(ClientUI::Font(),SystemNameFontSize()),GG::CLR_WHITE)), + m_button_next(new GG::Button(40+w-80 ,4,SystemNameFontSize(),SystemNameFontSize(),"",GG::GUI::GetGUI()->GetFont(ClientUI::Font(),SystemNameFontSize()),GG::CLR_WHITE)), m_star_graphic(0), m_static_text_systemproduction(new GG::TextControl(0,100-20-ClientUI::Pts()-5,UserString("SP_SYSTEM_PRODUCTION"),GG::GUI::GetGUI()->GetFont(ClientUI::Font(),ClientUI::Pts()),ClientUI::TextColor())), m_next_pltview_fade_in(0),m_next_pltview_planet_id(UniverseObject::INVALID_OBJECT_ID),m_next_pltview_fade_out(-1), Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2006-10-27 01:13:36 UTC (rev 1932) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2006-10-27 06:07:18 UTC (rev 1933) @@ -191,15 +191,15 @@ { GG::Clr progress_background_color = ClientUI::TechWndProgressBarBackground(); GG::Clr progress_color = ClientUI::TechWndProgressBar(); - glColor4ubv(color.v); + glColor(color); int progress_extent = (0.0 < progress && progress < 1.0) ? (progress_panel.ul.x + static_cast<int>(progress * PROGRESS_PANEL_WIDTH + 0.5)) : 0; if (tech_type == TT_THEORY) { FillTheoryPanel(main_panel, MAIN_PANEL_CORNER_RADIUS); if (show_progress) { if (progress_extent) { - glColor4ubv(progress_background_color.v); + glColor(progress_background_color); FillTheoryPanel(progress_panel, PROGRESS_PANEL_CORNER_RADIUS); - glColor4ubv(progress_color.v); + glColor(progress_color); GG::BeginScissorClipping(progress_panel.ul.x, progress_panel.ul.y, progress_extent, progress_panel.lr.y); FillTheoryPanel(progress_panel, PROGRESS_PANEL_CORNER_RADIUS); GG::EndScissorClipping(); @@ -211,9 +211,9 @@ FillApplicationPanel(main_panel, MAIN_PANEL_CORNER_RADIUS); if (show_progress) { if (progress_extent) { - glColor4ubv(progress_background_color.v); + glColor(progress_background_color); FillApplicationPanel(progress_panel, PROGRESS_PANEL_CORNER_RADIUS); - glColor4ubv(progress_color.v); + glColor(progress_color); GG::BeginScissorClipping(progress_panel.ul.x, progress_panel.ul.y, progress_extent, progress_panel.lr.y); FillApplicationPanel(progress_panel, PROGRESS_PANEL_CORNER_RADIUS); GG::EndScissorClipping(); @@ -225,9 +225,9 @@ FillRefinementPanel(main_panel); if (show_progress) { if (progress_extent) { - glColor4ubv(progress_background_color.v); + glColor(progress_background_color); FillRefinementPanel(progress_panel); - glColor4ubv(progress_color.v); + glColor(progress_color); GG::BeginScissorClipping(progress_panel.ul.x, progress_panel.ul.y, progress_extent, progress_panel.lr.y); FillRefinementPanel(progress_panel); GG::EndScissorClipping(); @@ -373,7 +373,7 @@ AdjustBrightness(border_color, ROLLOVER_BRIGHTENING_FACTOR); } glDisable(GL_TEXTURE_2D); - glColor4ubv(color.v); + glColor(color); CircleArc(ul.x, ul.y, lr.x, lr.y, 0.0, 0.0, true); glEnable(GL_LINE_SMOOTH); glLineWidth(OUTER_LINE_THICKNESS * m_scale); @@ -529,7 +529,7 @@ if (m_tech) { GG::Clr category_color = CategoryColor(m_tech->Category()); category_color.a = 127; - glColor4ubv(category_color.v); + glColor(category_color); GG::Pt ul = m_description_box->ClientUpperLeft(), lr = m_description_box->ClientLowerRight(); int icon_size = lr.y - ul.y; int x1 = (ul.x + lr.x) / 2 - icon_size / 2; @@ -719,7 +719,7 @@ GG::Pt ul = UpperLeft(), lr = LowerRight() + GG::Pt(0, 11); glDisable(GL_TEXTURE_2D); const int CORNER_RADIUS = 5; - glColor4ubv(ClientUI::KnownTechFillColor().v); + glColor(ClientUI::KnownTechFillColor()); CircleArc(lr.x - 2 * CORNER_RADIUS, ul.y, lr.x, ul.y + 2 * CORNER_RADIUS, 0.0, PI / 2.0, true); @@ -747,7 +747,7 @@ glEnd(); glLineWidth(1.0); glDisable(GL_LINE_SMOOTH); - glColor4ubv(ClientUI::KnownTechTextAndBorderColor().v); + glColor(ClientUI::KnownTechTextAndBorderColor()); glBegin(GL_LINE_STRIP); CircleArc(lr.x - 2 * CORNER_RADIUS, ul.y, lr.x, ul.y + 2 * CORNER_RADIUS, @@ -816,7 +816,7 @@ TraceTechPanelOutline(tech_type, rect, GG::Rect(), false); glLineWidth(1.0); glDisable(GL_LINE_SMOOTH); - glColor4ubv(border_color_to_use.v); + glColor(border_color_to_use); TraceTechPanelOutline(tech_type, rect, GG::Rect(), false); glEnable(GL_TEXTURE_2D); } @@ -1144,7 +1144,7 @@ TraceTechPanelOutline(tech_type, main_panel, progress_panel, !m_progress_text->Empty()); glLineWidth(1.0); glDisable(GL_LINE_SMOOTH); - glColor4ubv(border_color_to_use.v); + glColor(border_color_to_use); TraceTechPanelOutline(tech_type, main_panel, progress_panel, !m_progress_text->Empty()); glEnable(GL_TEXTURE_2D); } @@ -1269,7 +1269,7 @@ case RESEARCHABLE: arc_color = researchable_half_alpha; break; case UNRESEARCHABLE: arc_color = unresearchable_half_alpha; break; } - glColor4ubv(arc_color.v); + glColor(arc_color); for (DependencyArcsMap::const_iterator it2 = it->second.begin(); it2 != it->second.end(); ++it2) { bool selected_arc = it2->first == m_selected_tech || it2->second.first == m_selected_tech; if (selected_arc) { @@ -1291,7 +1291,7 @@ case RESEARCHABLE: arc_color = researchable_half_alpha_selected; break; case UNRESEARCHABLE: arc_color = unresearchable_half_alpha_selected; break; } - glColor4ubv(arc_color.v); + glColor(arc_color); for (unsigned int i = 0; i < it->second.size(); ++i) { DrawArc(it->second[i], arc_color, false); } @@ -1307,7 +1307,7 @@ case RESEARCHABLE: arc_color = ClientUI::ResearchableTechTextAndBorderColor(); break; case UNRESEARCHABLE: arc_color = ClientUI::UnresearchableTechTextAndBorderColor(); break; } - glColor4ubv(arc_color.v); + glColor(arc_color); for (DependencyArcsMap::const_iterator it2 = it->second.begin(); it2 != it->second.end(); ++it2) { bool selected_arc = it2->first == m_selected_tech || it2->second.first == m_selected_tech; if (selected_arc) { @@ -1329,7 +1329,7 @@ case RESEARCHABLE: arc_color = researchable_selected; break; case UNRESEARCHABLE: arc_color = unresearchable_selected; break; } - glColor4ubv(arc_color.v); + glColor(arc_color); for (unsigned int i = 0; i < it->second.size(); ++i) { DrawArc(it->second[i], arc_color, true); } |
From: <tz...@us...> - 2006-10-27 22:06:42
|
Revision: 1935 http://svn.sourceforge.net/freeorion/revision/?rev=1935&view=rev Author: tzlaine Date: 2006-10-27 15:06:40 -0700 (Fri, 27 Oct 2006) Log Message: ----------- Made minor changes to sync up with recent GG changes. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h trunk/FreeOrion/UI/ResearchWnd.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2006-10-27 17:09:27 UTC (rev 1934) +++ trunk/FreeOrion/UI/MapWnd.cpp 2006-10-27 22:06:40 UTC (rev 1935) @@ -26,6 +26,7 @@ #include <GG/DrawUtil.h> #include <GG/MultiEdit.h> +#include <GG/WndEvent.h> #include <vector> #include <deque> @@ -956,9 +957,9 @@ } } -bool MapWnd::EventFilter(GG::Wnd* w, const GG::Wnd::Event& event) +bool MapWnd::EventFilter(GG::Wnd* w, const GG::WndEvent& event) { - if (event.Type() == GG::Wnd::Event::RClick && !FleetWnd::FleetWndsOpen()) { + if (event.Type() == GG::WndEvent::RClick && !FleetWnd::FleetWndsOpen()) { // Attempt to close the SidePanel (if open); if this fails, just let Wnd w handle it. // Note that this enforces a one-close-per-click policy. Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2006-10-27 17:09:27 UTC (rev 1934) +++ trunk/FreeOrion/UI/MapWnd.h 2006-10-27 22:06:40 UTC (rev 1935) @@ -27,6 +27,7 @@ namespace GG { class Texture; class MultiEdit; + class WndEvent; } /** This class is a window that graphically displays everything in the universe */ @@ -102,7 +103,7 @@ static const int SIDE_PANEL_WIDTH; protected: - virtual bool EventFilter(GG::Wnd* w, const GG::Wnd::Event& event); + virtual bool EventFilter(GG::Wnd* w, const GG::WndEvent& event); private: void RefreshFoodResourceIndicator(); ///< gets stockpile and expected change and updates resource indicator Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2006-10-27 17:09:27 UTC (rev 1934) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2006-10-27 22:06:40 UTC (rev 1935) @@ -39,14 +39,16 @@ CUIListBox(x, y, w, h), m_research_wnd(research_wnd), m_drop_point(-1) - {} + { + AllowDropType("RESEARCH_QUEUE_ROW"); + } // HACK! This is sort of a dirty trick, but we return false here in all cases, even when we accept the dropped // item. This keeps things simpler than if we handled ListBox::DroppedRow signals, since we are explicitly // updating everything on drops anyway. virtual void AcceptDrops(std::list<Wnd*>& wnds, const GG::Pt& pt) { assert(wnds.size() == 1); - if ((*wnds.begin())->DragDropDataType() == "RESEARCH_QUEUE_ROW") { + if (AllowedDropTypes().find((*wnds.begin())->DragDropDataType()) != AllowedDropTypes().end()) { GG::ListBox::Row* row = static_cast<GG::ListBox::Row*>(*wnds.begin()); int original_row_idx = -1; for (int i = 0; i < NumRows(); ++i) { @@ -77,13 +79,9 @@ GG::FlatRectangle(ul.x, ul.y - 1, lr.x, ul.y, GG::CLR_ZERO, GG::CLR_WHITE, 1); } } - virtual void DragDropEnter(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) - { - DragDropHere(pt, drag_drop_wnds, keys); - } virtual void DragDropHere(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) { - if (drag_drop_wnds.size() == 1 && drag_drop_wnds.begin()->first->DragDropDataType() == "RESEARCH_QUEUE_ROW") { + if (drag_drop_wnds.size() == 1 && AllowedDropTypes().find(drag_drop_wnds.begin()->first->DragDropDataType()) != AllowedDropTypes().end()) { m_drop_point = RowUnderPt(pt); if (m_drop_point < 0) m_drop_point = 0; @@ -92,10 +90,12 @@ } else { m_drop_point = -1; } + ListBox::DragDropHere(pt, drag_drop_wnds, keys); } virtual void DragDropLeave() { m_drop_point = -1; + ListBox::DragDropLeave(); } private: ResearchWnd* m_research_wnd; |
From: <geo...@us...> - 2007-01-14 12:34:19
|
Revision: 1982 http://svn.sourceforge.net/freeorion/revision/?rev=1982&view=rev Author: geoffthemedio Date: 2007-01-14 04:34:05 -0800 (Sun, 14 Jan 2007) Log Message: ----------- -Disabled focus setting DropDownList on ResourcePanel when player doesn't own planet (prevents crash if setting focus on non-owned world) -Moved Colonize button out from under info panels to top right of PlanetPanel -Removed redundant rendering code from SidePanel Modified Paths: -------------- trunk/FreeOrion/UI/InfoPanels.cpp trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/InfoPanels.cpp =================================================================== --- trunk/FreeOrion/UI/InfoPanels.cpp 2007-01-13 10:21:23 UTC (rev 1981) +++ trunk/FreeOrion/UI/InfoPanels.cpp 2007-01-14 12:34:05 UTC (rev 1982) @@ -95,13 +95,13 @@ // manually delete all pointed-to controls that may or may not be attached as a child window at time of deletion DetachChild(m_pop_stat); - if (m_pop_stat) delete m_pop_stat; + delete m_pop_stat; DetachChild(m_health_stat); - if (m_health_stat) delete m_health_stat; + delete m_health_stat; DetachChild(m_pop_meter_bar); - if (m_pop_meter_bar) delete m_pop_meter_bar; + delete m_pop_meter_bar; DetachChild(m_health_meter_bar); - if (m_health_meter_bar) delete m_health_meter_bar; + delete m_health_meter_bar; // don't need to manually delete m_expand_button, as it is attached as a child so will be deleted by ~Wnd } @@ -502,35 +502,35 @@ // manually delete all pointed-to controls that may or may not be attached as a child window at time of deletion DetachChild(m_farming_stat); - if (m_farming_stat) delete m_farming_stat; + delete m_farming_stat; DetachChild(m_mining_stat); - if (m_mining_stat) delete m_mining_stat; + delete m_mining_stat; DetachChild(m_industry_stat); - if (m_industry_stat) delete m_industry_stat; + delete m_industry_stat; DetachChild(m_research_stat); - if (m_research_stat) delete m_research_stat; + delete m_research_stat; DetachChild(m_trade_stat); - if (m_trade_stat) delete m_trade_stat; + delete m_trade_stat; DetachChild(m_construction_stat); - if (m_construction_stat) delete m_construction_stat; + delete m_construction_stat; DetachChild(m_farming_meter_bar); - if (m_farming_meter_bar) delete m_farming_meter_bar; + delete m_farming_meter_bar; DetachChild(m_mining_meter_bar); - if (m_mining_meter_bar) delete m_mining_meter_bar; + delete m_mining_meter_bar; DetachChild(m_industry_meter_bar); - if (m_industry_meter_bar) delete m_industry_meter_bar; + delete m_industry_meter_bar; DetachChild(m_research_meter_bar); - if (m_research_meter_bar) delete m_research_meter_bar; + delete m_research_meter_bar; DetachChild(m_trade_meter_bar); - if (m_trade_meter_bar) delete m_trade_meter_bar; + delete m_trade_meter_bar; DetachChild(m_construction_meter_bar); - if (m_construction_meter_bar) delete m_construction_meter_bar; + delete m_construction_meter_bar; DetachChild(m_primary_focus_drop); - if (m_primary_focus_drop) delete m_primary_focus_drop; + delete m_primary_focus_drop; DetachChild(m_secondary_focus_drop); - if (m_secondary_focus_drop) delete m_secondary_focus_drop; + delete m_secondary_focus_drop; // don't need to manually delete m_expand_button, as it is attached as a child so will be deleted by ~Wnd } @@ -564,62 +564,13 @@ m_primary_focus_drop->Hide(); DetachChild(m_primary_focus_drop); - /*const ResourceCenter* res = GetResourceCenter(); - FocusType first; - - switch (res->PrimaryFocus()) - { - case FOCUS_BALANCED: - case FOCUS_FARMING: - first = FOCUS_FARMING; - m_farming_stat->MoveTo(GG::Pt(0, 0)); - break; - case FOCUS_MINING: - first = FOCUS_MINING; - m_mining_stat->MoveTo(GG::Pt(0, 0)); - break; - case FOCUS_INDUSTRY: - first = FOCUS_INDUSTRY; - m_industry_stat->MoveTo(GG::Pt(0, 0)); - break; - case FOCUS_RESEARCH: - first = FOCUS_RESEARCH; - m_research_stat->MoveTo(GG::Pt(0, 0)); - break; - case FOCUS_TRADE: - first = FOCUS_TRADE; - m_trade_stat->MoveTo(GG::Pt(0, 0)); - break; - } - - switch (res->SecondaryFocus()) - { - case FOCUS_BALANCED: - - break; - case FOCUS_FARMING: - first = FOCUS_FARMING; - m_farming_stat->MoveTo(GG::Pt(0, 0)); - break; - case FOCUS_MINING: - first = FOCUS_MINING; - m_mining_stat->MoveTo(GG::Pt(0, 0)); - break; - case FOCUS_INDUSTRY: - first = FOCUS_INDUSTRY; - m_industry_stat->MoveTo(GG::Pt(0, 0)); - break; - case FOCUS_RESEARCH: - first = FOCUS_RESEARCH; - m_research_stat->MoveTo(GG::Pt(0, 0)); - break; - case FOCUS_TRADE: - first = FOCUS_TRADE; - m_trade_stat->MoveTo(GG::Pt(0, 0)); - break; - }*/ - - + /* Ordering of indicators in collapsed mode: + - if primary focus is specialized: + - primary focus resource goes first. + - if secondary focus is specialized to something else + - secondary focus goes second + */ + m_farming_stat->MoveTo(GG::Pt(0, 0)); //m_farming_stat->Hide(); //DetachChild(m_farming_stat); @@ -804,80 +755,76 @@ enum OWNERSHIP {OS_NONE, OS_FOREIGN, OS_SELF} owner = OS_NONE; - // determine ownership - if(obj->Owners().empty()) + // determine ownership + const std::set<int> owners = obj->Owners(); + + if(owners.empty()) { owner = OS_NONE; // uninhabited - else { + } else { if(!obj->OwnedBy(HumanClientApp::GetApp()->EmpireID())) owner = OS_FOREIGN; // inhabited by other empire else owner = OS_SELF; // inhabited by this empire (and possibly other empires) } - if (owner = OS_SELF) { - m_farming_stat->SetValue(res->FarmingPoints()); - m_farming_meter_bar->SetProjectedCurrent(res->ProjectedCurrent(METER_FARMING)); - m_farming_meter_bar->SetProjectedMax(res->FarmingMeter().Max()); - - m_mining_stat->SetValue(res->MiningPoints()); - m_mining_meter_bar->SetProjectedCurrent(res->ProjectedCurrent(METER_MINING)); - m_mining_meter_bar->SetProjectedMax(res->MiningMeter().Max()); + if (owner == OS_SELF) { + m_primary_focus_drop->Disable(false); + m_secondary_focus_drop->Disable(false); + } else { + m_primary_focus_drop->Disable(true); + m_secondary_focus_drop->Disable(true); + } - m_industry_stat->SetValue(res->IndustryPoints()); - m_industry_meter_bar->SetProjectedCurrent(res->ProjectedCurrent(METER_INDUSTRY)); - m_industry_meter_bar->SetProjectedMax(res->IndustryMeter().Max()); + m_farming_stat->SetValue(res->FarmingPoints()); + m_farming_meter_bar->SetProjectedCurrent(res->ProjectedCurrent(METER_FARMING)); + m_farming_meter_bar->SetProjectedMax(res->FarmingMeter().Max()); + + m_mining_stat->SetValue(res->MiningPoints()); + m_mining_meter_bar->SetProjectedCurrent(res->ProjectedCurrent(METER_MINING)); + m_mining_meter_bar->SetProjectedMax(res->MiningMeter().Max()); - m_research_stat->SetValue(res->ResearchPoints()); - m_research_meter_bar->SetProjectedCurrent(res->ProjectedCurrent(METER_RESEARCH)); - m_research_meter_bar->SetProjectedMax(res->ResearchMeter().Max()); - - m_trade_stat->SetValue(res->TradePoints()); - m_trade_meter_bar->SetProjectedCurrent(res->ProjectedCurrent(METER_TRADE)); - m_trade_meter_bar->SetProjectedMax(res->TradeMeter().Max()); - } + m_industry_stat->SetValue(res->IndustryPoints()); + m_industry_meter_bar->SetProjectedCurrent(res->ProjectedCurrent(METER_INDUSTRY)); + m_industry_meter_bar->SetProjectedMax(res->IndustryMeter().Max()); + m_research_stat->SetValue(res->ResearchPoints()); + m_research_meter_bar->SetProjectedCurrent(res->ProjectedCurrent(METER_RESEARCH)); + m_research_meter_bar->SetProjectedMax(res->ResearchMeter().Max()); + + m_trade_stat->SetValue(res->TradePoints()); + m_trade_meter_bar->SetProjectedCurrent(res->ProjectedCurrent(METER_TRADE)); + m_trade_meter_bar->SetProjectedMax(res->TradeMeter().Max()); + switch (res->PrimaryFocus()) { case FOCUS_BALANCED: - m_primary_focus_drop->Select(0); - break; + m_primary_focus_drop->Select(0); break; case FOCUS_FARMING: - m_primary_focus_drop->Select(1); - break; + m_primary_focus_drop->Select(1); break; case FOCUS_MINING: - m_primary_focus_drop->Select(2); - break; + m_primary_focus_drop->Select(2); break; case FOCUS_INDUSTRY: - m_primary_focus_drop->Select(3); - break; + m_primary_focus_drop->Select(3); break; case FOCUS_RESEARCH: - m_primary_focus_drop->Select(4); - break; + m_primary_focus_drop->Select(4); break; case FOCUS_TRADE: - m_primary_focus_drop->Select(5); - break; + m_primary_focus_drop->Select(5); break; } switch (res->SecondaryFocus()) { case FOCUS_BALANCED: - m_secondary_focus_drop->Select(0); - break; + m_secondary_focus_drop->Select(0); break; case FOCUS_FARMING: - m_secondary_focus_drop->Select(1); - break; + m_secondary_focus_drop->Select(1); break; case FOCUS_MINING: - m_secondary_focus_drop->Select(2); - break; + m_secondary_focus_drop->Select(2); break; case FOCUS_INDUSTRY: - m_secondary_focus_drop->Select(3); - break; + m_secondary_focus_drop->Select(3); break; case FOCUS_RESEARCH: - m_secondary_focus_drop->Select(4); - break; + m_secondary_focus_drop->Select(4); break; case FOCUS_TRADE: - m_secondary_focus_drop->Select(5); - break; + m_secondary_focus_drop->Select(5); break; } } Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2007-01-13 10:21:23 UTC (rev 1981) +++ trunk/FreeOrion/UI/SidePanel.cpp 2007-01-14 12:34:05 UTC (rev 1982) @@ -421,10 +421,6 @@ void DoLayout(); - bool RenderUnhabited(const Planet &planet); ///< renders uninhabited planet - bool RenderInhabited(const Planet &planet); ///< renders planet inhabited by someone else - bool RenderOwned (const Planet &planet); ///< renders planet inhabited by the player - int PlanetDiameter() const; bool InPlanet(const GG::Pt& pt) const; ///< returns true if pt is within the planet image @@ -438,7 +434,6 @@ int m_planet_id; ///< id for the planet with is representet by this planet panel GG::TextControl* m_planet_name; ///< planet name - GG::TextControl* m_planet_info; ///< planet size and type info CUIButton* m_button_colonize; ///< btn which can be pressed to colonize this planet GG::DynamicGraphic* m_planet_graphic; ///< image of the planet (can be a frameset); this is now used only for asteroids RotatingPlanetControl* m_rotating_planet_graphic; ///< a realtime-rendered planet that rotates, with a textured surface mapped onto it @@ -697,7 +692,6 @@ Wnd(0, 0, w, MAX_PLANET_DIAMETER, GG::CLICKABLE), m_planet_id(planet.ID()), m_planet_name(0), - m_planet_info(0), m_button_colonize(0), m_planet_graphic(0), m_rotating_planet_graphic(0), @@ -746,10 +740,11 @@ m_planet_name = new GG::TextControl(MAX_PLANET_DIAMETER-15,10,planet.Name(),GG::GUI::GetGUI()->GetFont(ClientUI::Font(),ClientUI::Pts()*4/3),ClientUI::TextColor()); AttachChild(m_planet_name); - m_planet_info = new GG::TextControl(m_planet_name->UpperLeft().x-UpperLeft().x+10,m_planet_name->LowerRight().y-UpperLeft().y,"",GG::GUI::GetGUI()->GetFont(ClientUI::Font(),ClientUI::Pts()),ClientUI::TextColor(),GG::TF_LEFT|GG::TF_TOP); - AttachChild(m_planet_info); - - m_button_colonize = new CUIButton((Width()/3)*2,(Height()-ClientUI::Pts())/2,60,UserString("PL_COLONIZE"),GG::GUI::GetGUI()->GetFont(ClientUI::Font(),ClientUI::Pts()),ClientUI::ButtonColor(),ClientUI::CtrlBorderColor(),1,ClientUI::TextColor(),GG::CLICKABLE); + int col_but_wid = 80; + m_button_colonize = new CUIButton(Width() - col_but_wid, 10, col_but_wid, UserString("PL_COLONIZE"), + GG::GUI::GetGUI()->GetFont(ClientUI::Font(), ClientUI::Pts()), + ClientUI::ButtonColor(), ClientUI::CtrlBorderColor(), 1, + ClientUI::TextColor(), GG::CLICKABLE); Connect(m_button_colonize->ClickedSignal, &SidePanel::PlanetPanel::ClickColonize, this); AttachChild(m_button_colonize); @@ -856,43 +851,20 @@ { const Planet *planet = GetPlanet(); - enum OWNERSHIP {OS_NONE,OS_FOREIGN,OS_SELF} owner = OS_NONE; + enum OWNERSHIP {OS_NONE, OS_FOREIGN, OS_SELF} owner = OS_NONE; - std::string text; - if(planet->Owners().size()==0 || planet->IsAboutToBeColonized()) + if(planet->Owners().empty() || planet->IsAboutToBeColonized()) { //uninhabited owner = OS_NONE; - text = GetPlanetSizeName(*planet); - if(text.length()>0) - text+=" "; - text+= GetPlanetTypeName(*planet); - - text+="\n"; - if(planet->MaxPop()==0) text+= UserString("PE_UNINHABITABLE"); - else text+= UserString("PL_SIZE") + " " + lexical_cast<std::string>(static_cast<int>(planet->MaxPop())); - - m_planet_info->SetText(text); } else if(!planet->OwnedBy(HumanClientApp::GetApp()->EmpireID())) {//inhabited owner = OS_FOREIGN; - text = GetPlanetSizeName(*planet); - if(text.length()>0) - text+=" "; - text+= GetPlanetTypeName(*planet); - - m_planet_info->SetText(text); } else {//Owned owner = OS_SELF; - text = GetPlanetSizeName(*planet); - if(text.length()>0) - text+="\n"; - text+= GetPlanetTypeName(*planet); - - m_planet_info->SetText(text); } if (!planet->Owners().empty()) { @@ -902,7 +874,7 @@ // visibility if (owner==OS_NONE - && planet->MaxPop()>0 + && planet->MaxPop() > 0 && !planet->IsAboutToBeColonized() && FindColonyShip(planet->SystemID())) { @@ -983,102 +955,11 @@ } } -bool SidePanel::PlanetPanel::RenderUnhabited(const Planet &planet) -{ - return true; -} -bool SidePanel::PlanetPanel::RenderInhabited(const Planet &planet) -{ - glColor(ClientUI::TextColor()); - boost::shared_ptr<GG::Font> font = HumanClientApp::GetApp()->GetFont(ClientUI::Font(),ClientUI::Pts()); - Uint32 format = GG::TF_LEFT | GG::TF_BOTTOM; - - std::string text; int x,y; - - x = m_planet_name->UpperLeft ().x+10; - y = m_planet_name->LowerRight().y+ 5; - - //text = GetPlanetSizeName(planet); - //font->RenderText(x,y,x + 500, y+font->Height(), text, format, 0); - y+=font->Height(); - - //text = GetPlanetTypeName(planet); - //font->RenderText(x,y,x + 500, y+font->Height(), text, format, 0); - y+=font->Height(); - - int population=static_cast<int>(planet.PopPoints()); - - boost::shared_ptr<GG::Texture> icon; - const int ICON_MARGIN = 5; - font = HumanClientApp::GetApp()->GetFont(ClientUI::Font(), static_cast<int>(ClientUI::Pts())); - - //population - //x = m_planet_name->UpperLeft ().x+10; y = m_planet_name->LowerRight().y + RESOURCE_DISPLAY_HEIGHT+3; - glColor(ClientUI::TextColor()); - icon=IconPopulation(); icon->OrthoBlit(x,y,x+font->Height(),y+font->Height(), 0, false); - x+=font->Height(); - text = lexical_cast<std::string>(population)+"/"+lexical_cast<std::string>(static_cast<int>(planet.MaxPop())); - font->RenderText(x,y,x + 500, y+font->Height(), text, format, 0); - x+=font->TextExtent(text, format).x+ICON_MARGIN; - - return true; -} - -bool SidePanel::PlanetPanel::RenderOwned(const Planet &planet) -{ - glColor(ClientUI::TextColor()); - boost::shared_ptr<GG::Font> font = HumanClientApp::GetApp()->GetFont(ClientUI::Font(),ClientUI::Pts()); - Uint32 format = GG::TF_LEFT | GG::TF_BOTTOM; - - std::string text; int x,y; - - x = m_planet_name->UpperLeft ().x+10; - y = m_planet_name->LowerRight().y+ 5; - - //text = GetPlanetSizeName(planet); - //font->RenderText(x,y,x + 500, y+font->Height(), text, format, 0); - y+=font->Height(); - - //text = GetPlanetTypeName(planet); - //font->RenderText(x,y,x + 500, y+font->Height(), text, format, 0); - y+=font->Height(); - - boost::shared_ptr<GG::Texture> icon; - const int ICON_MARGIN = 5; - font = HumanClientApp::GetApp()->GetFont(ClientUI::Font(), static_cast<int>(ClientUI::Pts())); - - //population - //x = m_planet_name->UpperLeft ().x+10; y = m_planet_name->LowerRight().y + RESOURCE_DISPLAY_HEIGHT+3; - glColor(ClientUI::TextColor()); - icon=IconPopulation(); icon->OrthoBlit(x,y,x+font->Height(),y+font->Height(), 0, false); - x+=font->Height(); - - double future_pop_growth = static_cast<int>(planet.FuturePopGrowth()*100.0) / 100.0; - if (future_pop_growth<0.0) text=GG::RgbaTag(GG::CLR_RED); - else if(future_pop_growth>0.0) text=GG::RgbaTag(GG::CLR_GREEN); - else text=GG::RgbaTag(ClientUI::TextColor()); - - text+= lexical_cast<std::string>(static_cast<int>(planet.PopPoints())) + "</rgba>/"+lexical_cast<std::string>(static_cast<int>(planet.MaxPop())); - font->RenderText(x,y,x + 500, y+font->Height(), text, format, 0); - x+=font->TextExtent(text, format).x+ICON_MARGIN; - - return true; -} - void SidePanel::PlanetPanel::Render() { const Planet *planet = GetPlanet(); - if (planet->Owners().size()==0 || planet->IsAboutToBeColonized()) { - RenderUnhabited(*planet); - } else { - if (!planet->OwnedBy(HumanClientApp::GetApp()->EmpireID())) - RenderInhabited(*planet); - else - RenderOwned(*planet); - } - if (m_hiliting == HILITING_CANDIDATE && planet->Type() != PT_ASTEROIDS) { GG::Rect planet_rect(m_rotating_planet_graphic->UpperLeft(), m_rotating_planet_graphic->LowerRight()); double PERIOD_MS = 2000.0; |
From: <geo...@us...> - 2007-02-22 12:51:53
|
Revision: 2013 http://svn.sourceforge.net/freeorion/revision/?rev=2013&view=rev Author: geoffthemedio Date: 2007-02-22 04:51:53 -0800 (Thu, 22 Feb 2007) Log Message: ----------- -Added some margins around the edges of the draggable tech tree layer, so that the floating controls window can't end up covering up any techs on the tree in a manner that can't be corrected by user dragging. -Removed collapsible subtrees stuff. The tree is too multiply-connected for this to be useful. Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp trunk/FreeOrion/UI/TechTreeWnd.h Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2007-02-20 12:19:32 UTC (rev 2012) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2007-02-22 12:51:53 UTC (rev 2013) @@ -1207,12 +1207,12 @@ void CenterOnTech(const Tech* tech); void SetTechTypesShown(std::set<TechType> tech_types); void SetTechStatusesShown(std::set<TechStatus> tech_statuses); - void UncollapseAll(); //@} + static const double ZOOM_STEP_SIZE; + private: class TechPanel; - struct CollapseSubtreeFunctor; typedef std::multimap<const Tech*, std::pair<const Tech*, std::vector<std::vector<std::pair<double, double> > > > > DependencyArcsMap; @@ -1230,7 +1230,6 @@ void Layout(bool keep_position, double old_scale = -1.0); bool TechVisible(const Tech* tech); - void CollapseTechSubtree(const Tech* tech, bool collapse); void DrawArc(DependencyArcsMap::const_iterator it, GG::Clr color, bool with_arrow_head); void ScrolledSlot(int, int, int, int); void TechBrowsedSlot(const Tech* tech); @@ -1247,9 +1246,6 @@ std::set<TechStatus> m_tech_statuses_shown; const Tech* m_selected_tech; - // indexed by category-view (including "ALL"), the techs whose subtrees are desired collapsed - //std::map<std::string, std::set<const Tech*> > m_collapsed_subtree_techs_per_view; - std::map<const Tech*, TechPanel*> m_techs; DependencyArcsMapsByArcType m_dependency_arcs; @@ -1259,21 +1255,8 @@ GG::Pt m_scroll_position; CUIButton* m_zoom_in_button; CUIButton* m_zoom_out_button; - - friend struct CollapseSubtreeFunctor; }; -////////////////////////////////////////////////////// -// TechTreeWnd::LayoutPanel::CollapseSubtreeFunctor // -////////////////////////////////////////////////////// -struct TechTreeWnd::LayoutPanel::CollapseSubtreeFunctor -{ - CollapseSubtreeFunctor(TechTreeWnd::LayoutPanel* layout_panel, const Tech* tech) : m_layout_panel(layout_panel), m_tech(tech) {} - void operator()(bool checked) {m_layout_panel->CollapseTechSubtree(m_tech, checked);} - TechTreeWnd::LayoutPanel* const m_layout_panel; - const Tech* const m_tech; -}; - ////////////////////////////////////////////////// // TechTreeWnd::LayoutPanel::TechPanel // ////////////////////////////////////////////////// @@ -1293,7 +1276,7 @@ typedef TechDoubleClickedSignalType::slot_type TechDoubleClickedSlotType; ///< type of functor(s) invoked on a TechDoubleClickedSignalType //@} - TechPanel(const Tech* tech, bool selected, bool collapsed_subtree, std::set<std::string> categories_shown, std::set<TechType> types_shown, std::set<TechStatus> statuses_shown, double scale = 1.0); + TechPanel(const Tech* tech, bool selected, std::set<std::string> categories_shown, std::set<TechType> types_shown, std::set<TechStatus> statuses_shown, double scale = 1.0); virtual bool InWindow(const GG::Pt& pt) const; virtual void Render(); @@ -1306,7 +1289,6 @@ mutable boost::signal<void (const Tech*)> TechBrowsedSignal; mutable boost::signal<void (const Tech*)> TechClickedSignal; mutable boost::signal<void (const Tech*)> TechDoubleClickedSignal; - GG::StateButton::CheckedSignalType& CollapseSubtreeSignal() {return m_toggle_button->CheckedSignal;} private: GG::Rect ProgressPanelRect(const GG::Pt& ul, const GG::Pt& lr); @@ -1320,11 +1302,10 @@ GG::TextControl* m_tech_name_text; GG::TextControl* m_tech_cost_text; GG::TextControl* m_progress_text; - ExpandCollapseButton* m_toggle_button; bool m_selected; }; -TechTreeWnd::LayoutPanel::TechPanel::TechPanel(const Tech* tech, bool selected, bool collapsed_subtree, +TechTreeWnd::LayoutPanel::TechPanel::TechPanel(const Tech* tech, bool selected, std::set<std::string> categories_shown, std::set<TechType> types_shown, std::set<TechStatus> statuses_shown, double scale/* = 1.0*/) : GG::Wnd(0, 0, 1, 1, GG::CLICKABLE), @@ -1334,7 +1315,6 @@ m_tech_name_text(0), m_tech_cost_text(0), m_progress_text(0), - m_toggle_button(0), m_selected(selected) { int name_font_pts = ClientUI::Pts() + 2; @@ -1383,7 +1363,6 @@ researchable_tech = true; } #endif - if (known_tech) { m_fill_color = ClientUI::KnownTechFillColor(); m_text_and_border_color = ClientUI::KnownTechTextAndBorderColor(); @@ -1428,37 +1407,6 @@ progress_str, GG::GUI::GetGUI()->GetFont(ClientUI::Font(), static_cast<int>(ClientUI::Pts() * m_scale + 0.5)), m_text_and_border_color); AttachChild(m_progress_text); - /* - m_toggle_button = new ExpandCollapseButton(m_fill_color, m_text_and_border_color, m_scale); - bool show_toggle_button = false; - const std::set<std::string>& unlocked_techs = m_tech->UnlockedTechs(); - for (std::set<std::string>::const_iterator it = unlocked_techs.begin(); it != unlocked_techs.end(); ++it) { - const Tech* unlocked_tech = GetTech(*it); - - std::string category = unlocked_tech->Category(); - if (categories_shown.find(category) == categories_shown.end()) continue; - - TechType type = unlocked_tech->Type(); - if (types_shown.find(type) == types_shown.end()) continue; - - TechStatus status = empire->TechStatus(unlocked_tech->Name()); - if (statuses_shown.find(status) == statuses_shown.end()) continue; - - if (RootOfSubtree(unlocked_tech, categories_shown)) { - show_toggle_button = true; - break; - } - } - if (show_toggle_button) { - if (collapsed_subtree) - m_toggle_button->SetCheck(); - m_toggle_button->MoveTo(GG::Pt(Width() + static_cast<int>((-PROGRESS_PANEL_LEFT_EXTRUSION + 3) * m_scale), - UpperLeft().x + static_cast<int>(Height() + (-PROGRESS_PANEL_HEIGHT + PROGRESS_PANEL_BOTTOM_EXTRUSION) * m_scale) / 2 - m_toggle_button->Height() / 2)); - } else { - m_toggle_button->Hide(); - } - AttachChild(m_toggle_button);*/ - Select(m_selected); } @@ -1533,6 +1481,7 @@ ////////////////////////////////////////////////// // TechTreeWnd::LayoutPanel // ////////////////////////////////////////////////// +const double TechTreeWnd::LayoutPanel::ZOOM_STEP_SIZE = 1.25; TechTreeWnd::LayoutPanel::LayoutPanel(int w, int h) : GG::Wnd(0, 0, w, h, GG::CLICKABLE), m_scale(1.0), @@ -1548,6 +1497,8 @@ { EnableChildClipping(true); + m_scale = 1.0 / ZOOM_STEP_SIZE; // because fully zoomed in is too close + m_layout_surface = new LayoutSurface(); m_vscroll = new CUIScroll(w - ClientUI::ScrollWidth(), 0, ClientUI::ScrollWidth(), h - ClientUI::ScrollWidth(), GG::VERTICAL); m_hscroll = new CUIScroll(0, h - ClientUI::ScrollWidth(), w - ClientUI::ScrollWidth(), ClientUI::ScrollWidth(), GG::HORIZONTAL); @@ -1574,11 +1525,11 @@ GG::Connect(m_zoom_in_button->ClickedSignal, &TechTreeWnd::LayoutPanel::TreeZoomInClicked, this); GG::Connect(m_zoom_out_button->ClickedSignal, &TechTreeWnd::LayoutPanel::TreeZoomOutClicked, this); - TechManager& manager = GetTechManager(); + // show all categories... m_categories_shown.clear(); - const std::vector<std::string> categories = manager.CategoryNames(); + const std::vector<std::string> categories = GetTechManager().CategoryNames(); for (std::vector<std::string>::const_iterator it = categories.begin(); it != categories.end(); ++it) m_categories_shown.insert(*it); @@ -1761,7 +1712,7 @@ { if (m_categories_shown.find(category) == m_categories_shown.end()) { m_categories_shown.insert(category); - Layout(false); + Layout(true); } } @@ -1770,7 +1721,7 @@ std::set<std::string>::iterator it = m_categories_shown.find(category); if (it != m_categories_shown.end()) { m_categories_shown.erase(it); - Layout(false); + Layout(true); } } @@ -1795,23 +1746,15 @@ void TechTreeWnd::LayoutPanel::SetTechTypesShown(std::set<TechType> tech_types) { m_tech_types_shown = tech_types; - Layout(false); + Layout(true); } void TechTreeWnd::LayoutPanel::SetTechStatusesShown(std::set<TechStatus> tech_statuses) { m_tech_statuses_shown = tech_statuses; - Layout(false); + Layout(true); } -void TechTreeWnd::LayoutPanel::UncollapseAll() -{ - /*if (!m_collapsed_subtree_techs_per_view["ALL"].empty()) { - m_collapsed_subtree_techs_per_view.clear(); - Layout(false); - }*/ -} - void TechTreeWnd::LayoutPanel::Layout(bool keep_position, double old_scale/* = -1.0*/) { if (old_scale < 0.0) @@ -1881,13 +1824,13 @@ gvLayout(gvc, graph, "dot"); // create new tech panels and new dependency arcs - const int TECH_PANEL_MARGIN = static_cast<int>(10 * m_scale); + const int TECH_PANEL_MARGIN = ClientUI::Pts()*16; m_dependency_arcs.clear(); //const std::set<const Tech*>& collapsed_subtree_techs = m_collapsed_subtree_techs_per_view[m_category_shown]; for (Agnode_t* node = agfstnode(graph); node; node = agnxtnode(graph, node)) { const Tech* tech = GetTech(node->name); assert(tech); - m_techs[tech] = new TechPanel(tech, tech == m_selected_tech, false /*collapsed_subtree_techs.find(tech) != collapsed_subtree_techs.end()*/, m_categories_shown, m_tech_types_shown, m_tech_statuses_shown, m_scale); + m_techs[tech] = new TechPanel(tech, tech == m_selected_tech, m_categories_shown, m_tech_types_shown, m_tech_statuses_shown, m_scale); m_techs[tech]->MoveTo(GG::Pt(static_cast<int>(PS2INCH(ND_coord_i(node).x) - m_techs[tech]->Width() / 2 + TECH_PANEL_MARGIN), static_cast<int>(PS2INCH(ND_coord_i(node).y) - (m_techs[tech]->Height() - PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale) / 2 + TECH_PANEL_MARGIN))); m_layout_surface->AttachChild(m_techs[tech]); @@ -1909,20 +1852,16 @@ } points.push_back(Spline(temp)); } - TechStatus arc_type = TS_UNRESEARCHABLE; #ifndef FREEORION_BUILD_UTIL const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); - if (empire->TechResearched(to->Name())) { - arc_type = TS_COMPLETE; - } else if (empire->ResearchableTech(to->Name())) { - arc_type = TS_RESEARCHABLE; - } + + TechStatus arc_type = empire->TechStatus(to->Name()); #else // these values are arbitrary; they're only useful for displaying techs in the tech-view utility app if (to->Type() == TT_THEORY) { - arc_type = KNOWN; + arc_type = TS_COMPLETE; } else if (to->Type() == TT_APPLICATION) { - arc_type = RESEARCHABLE; + arc_type = TS_RESEARCHABLE; } #endif m_dependency_arcs[arc_type].insert(std::make_pair(from, std::make_pair(to, points))); @@ -1968,34 +1907,9 @@ if (m_tech_statuses_shown.find(empire->TechStatus(tech->Name())) == m_tech_statuses_shown.end()) return false; - /*std::set<std::string> category_prereqs; - const std::set<std::string> prereqs = tech->Prerequisites(); - for (std::set<std::string>::const_iterator it = prereqs.begin(); it != prereqs.end(); ++it) { - const Tech* prereq = GetTech(*it); - if (m_category_shown == "ALL" || prereq->Category() == m_category_shown) - category_prereqs.insert(*it); - } - if (category_prereqs.size() == 1) { - const std::set<const Tech*>& collapsed_subtree_techs = m_collapsed_subtree_techs_per_view[m_category_shown]; - const Tech* prereq = GetTech(*category_prereqs.begin()); - if (collapsed_subtree_techs.find(prereq) != collapsed_subtree_techs.end()) - return false; - }*/ return true; } -void TechTreeWnd::LayoutPanel::CollapseTechSubtree(const Tech* tech, bool collapse) -{ - /*if (collapse) { - m_collapsed_subtree_techs_per_view["ALL"].insert(tech); - m_collapsed_subtree_techs_per_view[tech->Category()].insert(tech); - } else { - m_collapsed_subtree_techs_per_view["ALL"].erase(tech); - m_collapsed_subtree_techs_per_view[tech->Category()].erase(tech); - } - Layout(true);*/ -} - void TechTreeWnd::LayoutPanel::DrawArc(DependencyArcsMap::const_iterator it, GG::Clr color, bool with_arrow_head) { GG::Pt ul = UpperLeft(); @@ -2062,7 +1976,6 @@ void TechTreeWnd::LayoutPanel::TreeZoomedSlot(int move) { - const double ZOOM_STEP_SIZE = 1.25; if (0 < move) SetScale(m_scale * ZOOM_STEP_SIZE); else if (move < 0) @@ -2319,12 +2232,6 @@ m_layout_panel->SetScale(scale); } - -void TechTreeWnd::UncollapseAll() -{ - m_layout_panel->UncollapseAll(); -} - void TechTreeWnd::CenterOnTech(const Tech* tech) { m_layout_panel->ShowTech(tech); Modified: trunk/FreeOrion/UI/TechTreeWnd.h =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.h 2007-02-20 12:19:32 UTC (rev 2012) +++ trunk/FreeOrion/UI/TechTreeWnd.h 2007-02-22 12:51:53 UTC (rev 2013) @@ -59,7 +59,6 @@ void HideType(const TechType type); void ToggleType(const TechType type); - void UncollapseAll(); void CenterOnTech(const Tech* tech); //@} |
From: <geo...@us...> - 2007-03-03 20:07:15
|
Revision: 2019 http://svn.sourceforge.net/freeorion/revision/?rev=2019&view=rev Author: geoffthemedio Date: 2007-03-03 12:07:15 -0800 (Sat, 03 Mar 2007) Log Message: ----------- Made enqueuing a currently-unresearchable tech enqueue all its prerequisites in order of lowest to highest per-turn cost Modified Paths: -------------- trunk/FreeOrion/UI/TechTreeWnd.cpp trunk/FreeOrion/UI/TechTreeWnd.h Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2007-03-01 02:52:17 UTC (rev 2018) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2007-03-03 20:07:15 UTC (rev 2019) @@ -2115,18 +2115,144 @@ void TechTreeWnd::TechDoubleClickedSlot(const Tech* tech) { const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); + std::string name = tech->Name(); + const TechStatus tech_status = empire->GetTechStatus(name); // if tech can be researched already, just add it - if (empire->ResearchableTech(tech->Name())) { + if (tech_status == TS_RESEARCHABLE) { AddTechToQueueSignal(tech); return; } + if (tech_status != TS_UNRESEARCHABLE) return; + // if tech can't yet be researched, add any prerequisites it requires (recursively) and then add it - if (empire->GetTechStatus(tech->Name()) == TS_UNRESEARCHABLE) { - AddTechToQueueSignal(tech); - //std::deque<std::s + + TechManager& manager = GetTechManager(); + // compile set of recursive prereqs + std::list<std::string> prereqs_list; // working list of prereqs as being processed. may contain duplicates + std::set<std::string> prereqs_set; // set of (unique) prereqs leading to tech + std::multimap<double, const Tech*> techs_to_add_map; // indexed and sorted by cost per turn + + // initialize working list with 1st order prereqs + std::set<std::string> cur_prereqs = tech->Prerequisites(); + std::copy(cur_prereqs.begin(), cur_prereqs.end(), std::back_inserter(prereqs_list)); + + // traverse list, appending new prereqs to it, and putting unique prereqs into set + for (std::list<std::string>::iterator it = prereqs_list.begin(); it != prereqs_list.end(); ++it) { + std::string cur_name = *it; + const Tech* cur_tech = manager.GetTech(cur_name); + + // check if this tech is already in the map of prereqs. If so, it has already been processed, and can be skipped. + if (prereqs_set.find(cur_name) != prereqs_set.end()) continue; + + // tech is new, so put it into the set of already-processed prereqs + prereqs_set.insert(cur_name); + // and the map of techs, sorted by cost + techs_to_add_map.insert(std::pair<double, const Tech*>(cur_tech->ResearchCost(), cur_tech)); + + // get prereqs of new tech, append to list + cur_prereqs = cur_tech->Prerequisites(); + std::copy(cur_prereqs.begin(), cur_prereqs.end(), std::back_inserter(prereqs_list)); } - // if tech has already been researched (not caught by above checks), then do nothing + // extract sorted techs into vector, to be passed to signal... + std::vector<const Tech*> tech_vec; + for (std::multimap<double, const Tech*>::const_iterator it = techs_to_add_map.begin(); it != techs_to_add_map.end(); ++it) + tech_vec.push_back(it->second); + // put original tech to be enqueued into vector last + tech_vec.push_back(tech); + AddMultipleTechsToQueueSignal(tech_vec); + + /* Alternative automatic tech ordering code. Written first and seemed to work, but had undesirable + behaviour in practice. Leaving here, commented out, incase wanted later... + + std::map<std::string, TechStatus> prereq_status_map; // set of (unique) prereqs leading to tech, with TechStatus of each + + // traverse list, appending new prereqs to it, and putting unique prereqs into set + for (std::list<std::string>::iterator it = prereqs_list.begin(); it != prereqs_list.end(); ++it) { + std::string cur_name = *it; + Logger().errorStream() << "traversing list: tech: " << cur_name; + const Tech* cur_tech = manager.GetTech(cur_name); + + // check if this tech is already in the map of prereqs. If so, it has already been processed, and can be skipped. + if (prereq_status_map.find(cur_name) != prereq_status_map.end()) continue; + + // tech is new, so put it into the map of prereqs + prereq_status_map[cur_name] = empire->GetTechStatus(cur_name); + + Logger().errorStream() << ".. tech is new. adding its prereqs to end of list"; + Logger().errorStream() << ".. and adding its status to prereq_status_map: " << prereq_status_map[cur_name]; + + // get prereqs of new tech, append to list + const std::set<std::string> cur_prereqs = cur_tech->Prerequisites(); + std::copy(cur_prereqs.begin(), cur_prereqs.end(), std::back_inserter(prereqs_list)); + } + + // repeatedly traverse set, enqueuing that are researchable (because their prereqs are complete or they + // are initially researchable), then marking enqueued techs as complete so the next iteration will + // find the techs that they are prereqs of to now have completed prereqs and thus enequeue the next layer + // of techs in the prereqs tree. within each level, currently enqueues techs in order of cost. + // in future, could instead determine optimal order of enqueuing to minimize total research time using + // a more sophisticated scheduling algorithm. + + std::multimap<double, const Tech*> techs_to_add_map; // indexed and sorted by turns to research + while (true) { + techs_to_add_map.clear(); + + Logger().errorStream() << "determining techs to add"; + for (std::map<std::string, TechStatus>::iterator it = prereq_status_map.begin(); it != prereq_status_map.end(); ++it) { + const std::string cur_name = it->first; + const Tech* cur_tech = manager.GetTech(cur_name); + + Logger().errorStream() << ".. considering tech: " << cur_name; + TechStatus status = it->second; + + // if tech is marked as complete, don't need to do anything with it + if (status == TS_COMPLETE) { + Logger().errorStream() << ".... tech is already complete. skipping."; + continue; + } + if (status == TS_RESEARCHABLE) { + Logger().errorStream() << ".... tech is researchable, adding to map of techs to enqueue"; + techs_to_add_map.insert(std::pair<double, const Tech*>(cur_tech->ResearchTurns(), cur_tech)); + continue; + } + + Logger().errorStream() << ".... tech is not yet researchable. checking its prereqs"; + // if tech's prereqs are all complete, tech is researchable (even if not marked TS_RESEARCHABLE initially) + const std::set<std::string> cur_prereqs = cur_tech->Prerequisites(); + bool all_prereqs_complete = true; // until proven otherwise by a tech being not TS_COMPLETE + for (std::set<std::string>::const_iterator it = cur_prereqs.begin(); it != cur_prereqs.end(); ++it) { + if (prereq_status_map[*it] != TS_COMPLETE) { + Logger().errorStream() << "...... prereq " << *it << " is not complete. skipping."; + all_prereqs_complete = false; + break; + } + } + + // if all prereqs complete, tech is researchable + if (all_prereqs_complete) { + Logger().errorStream() << "...... all prereqs are complete. adding tech to map of techs to enqueue"; + techs_to_add_map.insert(std::pair<double, const Tech*>(cur_tech->ResearchTurns(), cur_tech)); + } + } + + Logger().errorStream() << "adding techs, and marking as TS_COMPLETE for next round..."; + + // if no techs were researchable, must be done + if (techs_to_add_map.empty()) { + Logger().errorStream() << "... no techs to add! DONE!"; + break; // exit while loop + } + + for (std::multimap<double, const Tech*>::const_iterator it = techs_to_add_map.begin(); it != techs_to_add_map.end(); ++it) { + const Tech* cur_tech = it->second; + const std::string cur_name = cur_tech->Name(); + tech_vec.push_back(cur_tech); + prereq_status_map[cur_name] = TS_COMPLETE; + Logger().errorStream() << ".. adding and marking tech: " << cur_name;; + } + } + */ } Modified: trunk/FreeOrion/UI/TechTreeWnd.h =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.h 2007-03-01 02:52:17 UTC (rev 2018) +++ trunk/FreeOrion/UI/TechTreeWnd.h 2007-03-03 20:07:15 UTC (rev 2019) @@ -12,9 +12,10 @@ { public: /** \name Signal Types */ //@{ - typedef boost::signal<void (const Tech*)> TechBrowsedSignalType; ///< emitted when a technology is single-clicked - typedef boost::signal<void (const Tech*)> TechClickedSignalType; ///< emitted when the mouse rolls over a technology - typedef boost::signal<void (const Tech*)> TechDoubleClickedSignalType; ///< emitted when a technology is double-clicked + typedef boost::signal<void (const Tech*)> TechBrowsedSignalType; ///< emitted when a technology is single-clicked + typedef boost::signal<void (const Tech*)> TechClickedSignalType; ///< emitted when the mouse rolls over a technology + typedef boost::signal<void (const Tech*)> TechDoubleClickedSignalType; ///< emitted when a technology is double-clicked + typedef boost::signal<void (std::vector<const Tech*>)> AddMultipleTechsToQueueSignalType; ///< emitted to enqueue multiple techs simultaneously, without updating the GUI after each //@} /** \name Slot Types */ //@{ @@ -60,9 +61,10 @@ static const int NAVIGATOR_AND_DETAIL_HEIGHT = 200; - mutable TechBrowsedSignalType TechBrowsedSignal; - mutable TechClickedSignalType TechSelectedSignal; - mutable TechDoubleClickedSignalType AddTechToQueueSignal; + mutable TechBrowsedSignalType TechBrowsedSignal; + mutable TechClickedSignalType TechSelectedSignal; + mutable TechDoubleClickedSignalType AddTechToQueueSignal; + mutable AddMultipleTechsToQueueSignalType AddMultipleTechsToQueueSignal; private: class TechTreeControls; |
From: <geo...@us...> - 2007-03-09 14:40:33
|
Revision: 2022 http://svn.sourceforge.net/freeorion/revision/?rev=2022&view=rev Author: geoffthemedio Date: 2007-03-09 06:40:29 -0800 (Fri, 09 Mar 2007) Log Message: ----------- - Commited some previously-missed changes to the ResearchWnd files related to enqueuing unresearchable techs and their prerequisites - Reorganized how FleetButton, FleetWnd and MapWnd interact. Now clicking the FleetButtons causes the MapWnd to open a FleetWnd, rather than doing so directly. Fleet move path plotting and move order issuing happens in the MapWnd. FleetWnds are now contained by the MapWnd, rather than a static set. This will hopefully fix some crash bugs on Linux that are possibly related to signals being connected between the MapWnd and the FleetWnd by code in the FleetButton class, but even if not, this organization seems more consistent with the MapWnd doing most of the work, as is the case with SidePanel UI interactions. Modified Paths: -------------- trunk/FreeOrion/UI/ClientUI.cpp trunk/FreeOrion/UI/FleetButton.cpp trunk/FreeOrion/UI/FleetButton.h trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/UI/FleetWnd.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h trunk/FreeOrion/UI/ResearchWnd.cpp trunk/FreeOrion/UI/ResearchWnd.h trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/UI/SystemIcon.cpp trunk/FreeOrion/UI/SystemIcon.h Modified: trunk/FreeOrion/UI/ClientUI.cpp =================================================================== --- trunk/FreeOrion/UI/ClientUI.cpp 2007-03-09 13:30:42 UTC (rev 2021) +++ trunk/FreeOrion/UI/ClientUI.cpp 2007-03-09 14:40:29 UTC (rev 2022) @@ -416,7 +416,7 @@ #ifndef FREEORION_BUILD_UTIL m_map_wnd->CenterOnFleet(fleet->ID()); m_map_wnd->SelectFleet(fleet->ID()); - for (FleetWnd::FleetWndItr it = FleetWnd::FleetWndBegin(); it != FleetWnd::FleetWndEnd(); ++it) { + for (MapWnd::FleetWndIter it = m_map_wnd->FleetWndBegin(); it != m_map_wnd->FleetWndEnd(); ++it) { if ((*it)->ContainsFleet(fleet->ID())) { (*it)->SelectFleet(fleet); break; Modified: trunk/FreeOrion/UI/FleetButton.cpp =================================================================== --- trunk/FreeOrion/UI/FleetButton.cpp 2007-03-09 13:30:42 UTC (rev 2021) +++ trunk/FreeOrion/UI/FleetButton.cpp 2007-03-09 14:40:29 UTC (rev 2022) @@ -15,11 +15,9 @@ namespace { - bool PlaySounds() - { - return GetOptionsDB().Get<bool>("UI.sound.enabled"); - } - + bool PlaySounds() {return GetOptionsDB().Get<bool>("UI.sound.enabled");} + void PlayFleetButtonOpenSound() {if (PlaySounds()) HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() / GetOptionsDB().Get<std::string>("UI.sound.fleet-button-click"));} + void PlayFleetButtonRolloverSound() {if (PlaySounds()) HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() / GetOptionsDB().Get<std::string>("UI.sound.fleet-button-rollover"));} } @@ -27,14 +25,9 @@ // SystemIcon::FleetButton //////////////////////////////////////////////// -// static(s) -std::map<Fleet*, FleetWnd*> FleetButton::s_open_fleets; - FleetButton::FleetButton(GG::Clr color, const std::vector<int>& fleet_IDs, double zoom) : Button(0, 0, 1, 1, "", boost::shared_ptr<GG::Font>(), color), - m_orientation(), - m_selected_fleet(0), - m_compliment(0) + m_orientation() { Universe& universe = GetUniverse(); for (unsigned int i = 0; i < fleet_IDs.size(); ++i) { @@ -51,24 +44,17 @@ static_cast<int>(button_ul.y + ClientUI::SystemIconSize() * ClientUI::FleetButtonSize() * zoom + 0.5))); m_orientation = GetUniverse().Object<System>(fleet->NextSystemID())->X() - fleet->X() < 0 ? SHAPE_LEFT : SHAPE_RIGHT; - - GG::Connect(ClickedSignal, &FleetButton::Clicked, this); - GG::Connect(GetUniverse().UniverseObjectDeleteSignal, &FleetButton::FleetDeleted, this); } FleetButton::FleetButton(int x, int y, int w, int h, GG::Clr color, const std::vector<int>& fleet_IDs, ShapeOrientation orientation) : Button(x, y, w, h, "", boost::shared_ptr<GG::Font>(), color), - m_orientation(orientation), - m_selected_fleet(0), - m_compliment(0) + m_orientation(orientation) { Universe& universe = GetUniverse(); for (unsigned int i = 0; i < fleet_IDs.size(); ++i) { Fleet* fleet = universe.Object<Fleet>(fleet_IDs[i]); m_fleets.push_back(fleet); } - GG::Connect(ClickedSignal, &FleetButton::Clicked, this); - GG::Connect(GetUniverse().UniverseObjectDeleteSignal, &FleetButton::FleetDeleted, this); } bool FleetButton::InWindow(const GG::Pt& pt) const @@ -82,14 +68,17 @@ MapWnd* map_wnd = ClientUI::GetClientUI()->GetMapWnd(); if (!Disabled() && (!map_wnd || !map_wnd->InProductionViewMode())) { if (State() != BN_ROLLOVER && PlaySounds()) - HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() / GetOptionsDB().Get<std::string>("UI.sound.fleet-button-rollover")); + PlayFleetButtonRolloverSound(); SetState(BN_ROLLOVER); } } -void FleetButton::SelectFleet(Fleet* fleet) +void FleetButton::LClick(const GG::Pt& pt, Uint32 keys) { - m_selected_fleet = fleet; + MapWnd* map_wnd = ClientUI::GetClientUI()->GetMapWnd(); + if (!Disabled() && (!map_wnd || !map_wnd->InProductionViewMode())) + PlayFleetButtonOpenSound(); + GG::Button::LClick(pt, keys); } void FleetButton::RenderUnpressed() @@ -118,91 +107,3 @@ FleetMarker(ul.x-Width()/4, ul.y-Height()/4, lr.x+Width()/4, lr.y+Height()/4, m_orientation, color_to_use); glEnable(GL_TEXTURE_2D); } - -void FleetButton::Clicked() -{ - MapWnd* map_wnd = ClientUI::GetClientUI()->GetMapWnd(); - if (map_wnd && map_wnd->InProductionViewMode()) - return; - - int selected_fleet = 0; - std::vector<Fleet*> fleets(m_fleets); - if (m_compliment) - fleets.insert(m_orientation == SHAPE_RIGHT ? fleets.end() : fleets.begin(), m_compliment->m_fleets.begin(), m_compliment->m_fleets.end()); - if (m_selected_fleet) { - selected_fleet = std::distance(fleets.begin(), std::find(fleets.begin(), fleets.end(), m_selected_fleet)); - m_selected_fleet = 0; - } else if (m_compliment) { - selected_fleet = m_orientation == SHAPE_RIGHT ? 0 : m_compliment->m_fleets.size(); - } - - bool multiple_fleet_windows = GetOptionsDB().Get<bool>("UI.multiple-fleet-windows"); - - if (multiple_fleet_windows) { - // only open a fleet window if there is not one open already for these fleets - for (unsigned int i = 0; i < fleets.size(); ++i) { - if (s_open_fleets.find(fleets[i]) != s_open_fleets.end()) - return; - } - } else { - // close the open fleet window, if there is one - std::map<Fleet*, FleetWnd*>::iterator it = s_open_fleets.begin(); - if (it != s_open_fleets.end()) { - it->second->Close(); - } - } - - if (PlaySounds()) - HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() / GetOptionsDB().Get<std::string>("UI.sound.fleet-button-click")); - - GG::Pt ul = UpperLeft(); - bool read_only = *fleets[0]->Owners().begin() != HumanClientApp::GetApp()->EmpireID() || - (fleets[0]->FinalDestinationID() != UniverseObject::INVALID_OBJECT_ID && - fleets[0]->SystemID() == UniverseObject::INVALID_OBJECT_ID); - FleetWnd* fleet_wnd = new FleetWnd(ul.x + 50, ul.y + 50, fleets, selected_fleet, read_only); - - if (!multiple_fleet_windows) { - // for one-fleet-at-a-time, place them in the lower-left corner of the screen, or wherever the user has moved them - fleet_wnd->MoveTo(FleetWnd::LastPosition() == GG::Pt() ? - GG::Pt(5, GG::GUI::GetGUI()->AppHeight() - fleet_wnd->Height() - 5) : - FleetWnd::LastPosition()); - } - - if (GG::GUI::GetGUI()->AppWidth() - 5 < fleet_wnd->LowerRight().x) - fleet_wnd->OffsetMove(GG::Pt(GG::GUI::GetGUI()->AppWidth() - 5 - fleet_wnd->LowerRight().x, 0)); - if (GG::GUI::GetGUI()->AppHeight() - 5 < fleet_wnd->LowerRight().y) - fleet_wnd->OffsetMove(GG::Pt(0, GG::GUI::GetGUI()->AppHeight() - 5 - fleet_wnd->LowerRight().y)); - - if (map_wnd) { - GG::Connect(map_wnd->SystemRightClickedSignal, &FleetWnd::SystemClicked, fleet_wnd); - GG::Connect(map_wnd->SystemBrowsedSignal, &FleetWnd::SystemBrowsed, fleet_wnd); - } - - for (unsigned int i = 0; i < fleets.size(); ++i) { - s_open_fleets[fleets[i]] = fleet_wnd; - } - - GG::Connect(fleet_wnd->ShowingFleetSignal, &FleetButton::FleetIsBeingExamined); - GG::Connect(fleet_wnd->NotShowingFleetSignal, &FleetButton::FleetIsNotBeingExamined); - GG::GUI::GetGUI()->Register(fleet_wnd); -} - -void FleetButton::FleetDeleted(const UniverseObject* obj) -{ - if (const Fleet* fleet = dynamic_cast<const Fleet*>(obj)) { - std::vector<Fleet*>::iterator it = std::find(m_fleets.begin(), m_fleets.end(), const_cast<Fleet*>(fleet)); - if (it != m_fleets.end()) - m_fleets.erase(it); - s_open_fleets.erase(const_cast<Fleet*>(fleet)); - } -} - -void FleetButton::FleetIsBeingExamined(Fleet* fleet, FleetWnd* fleet_wnd) -{ - s_open_fleets[fleet] = fleet_wnd; -} - -void FleetButton::FleetIsNotBeingExamined(Fleet* fleet) -{ - s_open_fleets.erase(fleet); -} Modified: trunk/FreeOrion/UI/FleetButton.h =================================================================== --- trunk/FreeOrion/UI/FleetButton.h 2007-03-09 13:30:42 UTC (rev 2021) +++ trunk/FreeOrion/UI/FleetButton.h 2007-03-09 14:40:29 UTC (rev 2022) @@ -3,13 +3,8 @@ #ifndef _FleetButton_h_ #define _FleetButton_h_ -#ifndef _GG_Button_h_ #include <GG/Button.h> -#endif - -#ifndef _CUIDrawUtil_h_ #include "CUIDrawUtil.h" -#endif class Fleet; class FleetWnd; @@ -28,27 +23,20 @@ /** \name Accessors */ //@{ virtual bool InWindow(const GG::Pt& pt) const; - const std::vector<Fleet*>& Fleets() const {return m_fleets;} ///< returns the ID numbers of the fleets represented by this control + const std::vector<Fleet*>& Fleets() const {return m_fleets;} ///< returns the fleets represented by this control /** returns the orientation of the fleet marker (will be one of SHAPE_LEFT ans SHAPE_RIGHT) */ ShapeOrientation Orientation() const {return m_orientation;} //@} /** \name Mutators */ //@{ + virtual void LClick(const GG::Pt& pt, Uint32 keys); virtual void MouseHere(const GG::Pt& pt, Uint32 keys); /** sets the orientation of the fleet marker (must be one of SHAPE_LEFT and SHAPE_RIGHT; otherwise, SHAPE_LEFT will be used) */ void SetOrientation(ShapeOrientation orientation) {m_orientation = orientation;} - /** sets the FleetButton that represents moving fleets at the same system as this button (if this button represents stationary fleets at a system) - or stationary fleets at the same system as this button (if this button represents moving fleets at a system) */ - void SetCompliment(FleetButton* compliment) {m_compliment = compliment;} - - /** Makes fleet \a fleet the currently-selected fleet the next time the button is clicked. */ - void SelectFleet(Fleet* fleet); - //@} - protected: /** \name Mutators */ //@{ virtual void RenderUnpressed(); @@ -57,22 +45,8 @@ //@} private: - void Clicked(); - void FleetDeleted(const UniverseObject* obj); - std::vector<Fleet*> m_fleets; ///< the fleets represented by this button ShapeOrientation m_orientation; - - Fleet* m_selected_fleet; - - /** the FleetButton that represents the other moving or stationary fleets at the same system as this button - (if this one is stationary or moving, respectively) */ - FleetButton* m_compliment; - - static void FleetIsBeingExamined(Fleet* fleet, FleetWnd* fleet_wnd); - static void FleetIsNotBeingExamined(Fleet* fleet); - - static std::map<Fleet*, FleetWnd*> s_open_fleets; }; #endif // _FleetButton_h_ Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2007-03-09 13:30:42 UTC (rev 2021) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2007-03-09 14:40:29 UTC (rev 2022) @@ -929,10 +929,7 @@ // FleetWnd //////////////////////////////////////////////// // static(s) -std::set<FleetWnd*> FleetWnd::s_open_fleet_wnds; GG::Pt FleetWnd::s_last_position; -FleetWnd::FleetWndItr FleetWnd::FleetWndBegin() {return s_open_fleet_wnds.begin();} -FleetWnd::FleetWndItr FleetWnd::FleetWndEnd() {return s_open_fleet_wnds.end();} FleetWnd::FleetWnd(int x, int y, std::vector<Fleet*> fleets, int selected_fleet, bool read_only, Uint32 flags/* = CLICKABLE | DRAGABLE | ONTOP | CLOSABLE*/) : @@ -985,15 +982,12 @@ if (const System* system = fleets.back()->GetSystem()) m_system_changed_connection = Connect(system->StateChangedSignal, &FleetWnd::SystemChangedSlot, this); - s_open_fleet_wnds.insert(this); - SetMaxSize(GG::Pt(Width(), MaxSize().y)); } FleetWnd::~FleetWnd() { ClientUI::GetClientUI()->GetMapWnd()->SetProjectedFleetMovement(0, std::list<System*>()); - s_open_fleet_wnds.erase(this); } void FleetWnd::CloseClicked() @@ -1008,6 +1002,7 @@ NotShowingFleetSignal(fleet); } CUIWnd::CloseClicked(); + ClosingSignal(this); delete this; } @@ -1054,49 +1049,6 @@ } } -void FleetWnd::PlotMovement(int system_id, bool execute_move) -{ - if (system_id != UniverseObject::INVALID_OBJECT_ID) { - int empire_id = HumanClientApp::GetApp()->EmpireID(); - for (std::set<int>::const_iterator it = m_fleets_lb->Selections().begin(); it != m_fleets_lb->Selections().end(); ++it) { - Fleet* fleet = FleetInRow(*it); - if (fleet->OwnedBy(empire_id) && fleet->NumShips()) { - // TODO: allow technologies or other factors to allow a fleet to turn around in mid-flight, without completing its current leg - int start_system = fleet->SystemID() == UniverseObject::INVALID_OBJECT_ID ? fleet->NextSystemID() : fleet->SystemID(); - - std::list<System*> route = GetUniverse().ShortestPath(start_system, system_id, empire_id).first; - - // disallow "offroad" (direct non-starlane non-wormhole) travel - if (route.size() == 2 && *route.begin() != *route.rbegin() && - !(*route.begin())->HasStarlaneTo((*route.rbegin())->ID()) && !(*route.begin())->HasWormholeTo((*route.rbegin())->ID()) && - !(*route.rbegin())->HasStarlaneTo((*route.begin())->ID()) && !(*route.rbegin())->HasWormholeTo((*route.begin())->ID())) { - return; - } - - if (execute_move && !route.empty()) { - HumanClientApp::GetApp()->Orders().IssueOrder(new FleetMoveOrder(empire_id, fleet->ID(), start_system, system_id)); - if (fleet->SystemID() == UniverseObject::INVALID_OBJECT_ID) - ClientUI::GetClientUI()->GetMapWnd()->SetFleetMovement(fleet); - } - ClientUI::GetClientUI()->GetMapWnd()->SetProjectedFleetMovement(fleet, route); - } - } - } -} - -void FleetWnd::SystemClicked(int system_id) -{ - PlotMovement(system_id, true); -} - -void FleetWnd::SystemBrowsed(int system_id) -{ - if (system_id == UniverseObject::INVALID_OBJECT_ID) - ClientUI::GetClientUI()->GetMapWnd()->SetProjectedFleetMovement(0, std::list<System*>()) ; - else - PlotMovement(system_id, false); -} - void FleetWnd::AddFleet(Fleet* fleet) { m_fleets_lb->Insert(new FleetRow(fleet)); @@ -1133,6 +1085,29 @@ return false; } +std::set<Fleet*> FleetWnd::Fleets() const +{ + std::set<Fleet*> retval; + for (int i = 0; i < m_fleets_lb->NumRows(); ++i) { + if (Fleet* fleet = FleetInRow(i)) { + retval.insert(fleet); + } + } + return retval; +} + +std::set<Fleet*> FleetWnd::SelectedFleets() const +{ + std::set<Fleet*> retval; + for (int i = 0; i < m_fleets_lb->NumRows(); ++i) { + if (m_fleets_lb->Selected(i)) { + Fleet* fleet = FleetInRow(i); + if (fleet) retval.insert(fleet); + } + } + return retval; +} + void FleetWnd::FleetSelectionChanged(const std::set<int>& rows) { m_current_fleet = m_fleets_lb->Caret(); @@ -1324,8 +1299,9 @@ break; } } - - // TODO: CloseClicked() if the fleets lb is empty + + if (m_fleets_lb->Empty() || m_fleets_lb->NumRows() == 1 && !FleetInRow(0)) + CloseClicked(); } void FleetWnd::SystemChangedSlot() @@ -1344,24 +1320,6 @@ } } -bool FleetWnd::FleetWndsOpen() -{ - return !s_open_fleet_wnds.empty(); -} - -bool FleetWnd::CloseAllFleetWnds() -{ - bool retval = 0 < s_open_fleet_wnds.size(); - - while (0 < s_open_fleet_wnds.size()) { - FleetWnd* fleet_wnd = *s_open_fleet_wnds.begin(); - fleet_wnd->Close(); - s_open_fleet_wnds.erase(fleet_wnd); - } - - return retval; -} - GG::Pt FleetWnd::LastPosition() { return s_last_position; Modified: trunk/FreeOrion/UI/FleetWnd.h =================================================================== --- trunk/FreeOrion/UI/FleetWnd.h 2007-03-09 13:30:42 UTC (rev 2021) +++ trunk/FreeOrion/UI/FleetWnd.h 2007-03-09 14:40:29 UTC (rev 2022) @@ -2,17 +2,9 @@ #ifndef _FleetWnd_h_ #define _FleetWnd_h_ -#ifndef _CUIWnd_h_ #include "CUIWnd.h" -#endif - -#ifndef _GG_ListBox_h_ #include <GG/ListBox.h> -#endif - -#ifndef _MapWnd_h_ #include "MapWnd.h" -#endif class CUIListBox; class Fleet; @@ -61,8 +53,9 @@ { public: /** \name Signal Types */ //@{ - typedef boost::signal<void (Fleet*, FleetWnd*)> ShowingFleetSignalType; ///< emitted to indicate to the rest of the UI that this window is showing the given fleet, so duplicates are avoided - typedef boost::signal<void (Fleet*)> NotShowingFleetSignalType; ///< emitted to indicate that this window is not showing the given fleet + typedef boost::signal<void (Fleet*, FleetWnd*)> ShowingFleetSignalType; ///< emitted to indicate to the rest of the UI that this window is showing the given fleet + typedef boost::signal<void (Fleet*)> NotShowingFleetSignalType; ///< emitted to indicate that this window is not showing the given fleet + typedef boost::signal<void (FleetWnd*)> ClosingSignalType; ///< emitted when the window is closing, due to last fleet being deleted, or being closed manually by user //@} /** \name Slot Types */ //@{ @@ -79,25 +72,20 @@ //! \name Accessors //@{ int SystemID() const; bool ContainsFleet(int fleet_id) const; + std::set<Fleet*> Fleets() const; + std::set<Fleet*> SelectedFleets() const; //@} //! \name Mutators //@{ - void SystemClicked(int system_id); ///< invoked when a system is clicked on the main map, indicating that the currently-selected fleet should move there - void SystemBrowsed(int system_id); ///< invoked when the mouse is over a system on the main map, indicating that the projected movement to that system should be shown void AddFleet(Fleet* fleet); ///< adds a new fleet to a currently-open FletWnd void SelectFleet(Fleet* fleet); ///< selects the indicated fleet, bringing it into the fleet detail window //@} - mutable ShowingFleetSignalType ShowingFleetSignal; - mutable NotShowingFleetSignalType NotShowingFleetSignal; + mutable ShowingFleetSignalType ShowingFleetSignal; + mutable NotShowingFleetSignalType NotShowingFleetSignal; + mutable ClosingSignalType ClosingSignal; - static bool FleetWndsOpen(); ///< returns true iff one or more fleet windows are open - static bool CloseAllFleetWnds(); ///< returns true iff fleet windows were open before it was called. Used most often for fleet window quick-close. static GG::Pt LastPosition(); ///< returns the last position of the last FleetWnd that was closed - - typedef std::set<FleetWnd*>::const_iterator FleetWndItr; - static FleetWndItr FleetWndBegin(); - static FleetWndItr FleetWndEnd(); protected: //! \name Mutators //@{ @@ -106,16 +94,13 @@ private: void Init(const std::vector<Fleet*>& fleet_ids, int selected_fleet); - void PlotMovement(int system_id, bool execute_move); void FleetSelectionChanged(const std::set<int>& rows); void FleetRightClicked(int row_idx, GG::ListBox::Row* row, const GG::Pt& pt); void FleetDoubleClicked(int row_idx, GG::ListBox::Row* row); void FleetDeleted(int row_idx, GG::ListBox::Row* row); - void NewFleetButtonClicked(); void FleetDetailWndClosing(Fleet* fleet); Fleet* FleetInRow(int idx) const; std::string TitleText() const; - void FleetPanelEmpty(Fleet* fleet); void DeleteFleet(Fleet* fleet); void CreateNewFleetFromDrops(Ship* first_ship, const std::vector<int>& ship_ids); void UniverseObjectDeleted(const UniverseObject *); @@ -137,8 +122,8 @@ boost::signals::connection m_lb_delete_connection; boost::signals::connection m_system_changed_connection; + std::vector<boost::signals::connection> m_misc_connections; - static std::set<FleetWnd*> s_open_fleet_wnds; static GG::Pt s_last_position; ///< the latest position to which any FleetWnd has been moved. This is used to keep the place of the fleet window in single-fleetwindow mode. }; Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2007-03-09 13:30:42 UTC (rev 2021) +++ trunk/FreeOrion/UI/MapWnd.cpp 2007-03-09 14:40:29 UTC (rev 2022) @@ -133,7 +133,7 @@ delete this; } -void MapWndPopup::Close( ) +void MapWndPopup::Close() { // close window as though it's been clicked closed by the user. CloseClicked( ); @@ -164,6 +164,7 @@ m_dragged(false), m_current_owned_system(UniverseObject::INVALID_OBJECT_ID), m_current_fleet(UniverseObject::INVALID_OBJECT_ID), + m_active_fleet_wnd(0), m_in_production_view_mode(false) { SetText("MapWnd"); @@ -367,6 +368,11 @@ return m_in_production_view_mode; } +bool MapWnd::FleetWndsOpen() const +{ + return !m_fleet_wnds.empty(); +} + void MapWnd::Render() { RenderBackgrounds(); @@ -540,7 +546,7 @@ // if these fail, go ahead with the context-sensitive popup menu . Note that this enforces a one-close-per-click policy. if (GetOptionsDB().Get<bool>("UI.window-quickclose")) { - if (FleetWnd::CloseAllFleetWnds()) + if (CloseAllFleetWnds()) return; if (m_side_panel->Visible()) { @@ -604,6 +610,7 @@ GG::Connect(icon->LeftDoubleClickedSignal, &MapWnd::SystemDoubleClicked, this); GG::Connect(icon->MouseEnteringSignal, &MapWnd::MouseEnteringSystem, this); GG::Connect(icon->MouseLeavingSignal, &MapWnd::MouseLeavingSystem, this); + GG::Connect(icon->FleetButtonClickedSignal, &MapWnd::FleetButtonLeftClicked, this); // system's starlanes for (System::lane_iterator it = systems[i]->begin_lanes(); it != systems[i]->end_lanes(); ++it) { @@ -640,9 +647,12 @@ m_moving_fleet_buttons.push_back(fb); AttachChild(fb); SetFleetMovement(fb); + GG::Connect(fb->ClickedSignal, FleetButtonClickedFunctor(*fb, *this)); } } + m_active_fleet_wnd = 0; + MoveChildUp(m_side_panel); // set turn button to current turn @@ -762,6 +772,22 @@ } } +bool MapWnd::CloseAllFleetWnds() +{ + bool retval = 0 < m_fleet_wnds.size(); + if (!retval) return retval; + + m_active_fleet_wnd = 0; + + // TODO: close the currently open FleetWnd last, so that FleetWnd::LastPosition is preserved + while (0 < m_fleet_wnds.size()) { + FleetWnd* fleet_wnd = *m_fleet_wnds.begin(); + fleet_wnd->Close(); // this erases fleet_wnd from m_fleet_wnds + } + + return retval; +} + void MapWnd::ShowSystemNames() { for (std::map<int, SystemIcon*>::iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { @@ -956,7 +982,7 @@ bool MapWnd::EventFilter(GG::Wnd* w, const GG::WndEvent& event) { - if (event.Type() == GG::WndEvent::RClick && !FleetWnd::FleetWndsOpen()) { + if (event.Type() == GG::WndEvent::RClick && !FleetWndsOpen()) { // Attempt to close the SidePanel (if open); if this fails, just let Wnd w handle it. // Note that this enforces a one-close-per-click policy. @@ -1261,25 +1287,172 @@ void MapWnd::SystemRightClicked(int system_id) { - if (!m_in_production_view_mode) - SystemRightClickedSignal(system_id); + if (!m_in_production_view_mode && m_active_fleet_wnd) { + if (system_id == UniverseObject::INVALID_OBJECT_ID) + SetProjectedFleetMovement(0, std::list<System*>()) ; + else + PlotFleetMovement(system_id, true); + } + SystemRightClickedSignal(system_id); } void MapWnd::MouseEnteringSystem(int system_id) { - if (!m_in_production_view_mode) - SystemBrowsedSignal(system_id); + if (!m_in_production_view_mode && m_active_fleet_wnd) { + PlotFleetMovement(system_id, false); + } + SystemBrowsedSignal(system_id); } void MapWnd::MouseLeavingSystem(int system_id) { - if (!m_in_production_view_mode) - SystemBrowsedSignal(UniverseObject::INVALID_OBJECT_ID); + MouseEnteringSystem(UniverseObject::INVALID_OBJECT_ID); } +void MapWnd::PlotFleetMovement(int system_id, bool execute_move) +{ + if (!m_active_fleet_wnd) return; + + int empire_id = HumanClientApp::GetApp()->EmpireID(); + + std::set<Fleet*> fleets = m_active_fleet_wnd->SelectedFleets(); + + for (std::set<Fleet*>::iterator it = fleets.begin(); it != fleets.end(); ++it) { + Fleet* fleet = *it; + // only give orders / plot prospective move paths of fleets owned by player + if (!(fleet->OwnedBy(empire_id)) || !(fleet->NumShips())) continue; + + // plot empty move pathes if destination is not a known system + if (system_id == UniverseObject::INVALID_OBJECT_ID) { + SetProjectedFleetMovement(fleet, std::list<System*>()) ; + continue; + } + + int fleet_sys_id = fleet->SystemID(); + + int start_system = fleet_sys_id; + if (fleet_sys_id == UniverseObject::INVALID_OBJECT_ID) + start_system = fleet->NextSystemID(); + + // get path to destination... + std::list<System*> route = GetUniverse().ShortestPath(start_system, system_id, empire_id).first; + + // disallow "offroad" (direct non-starlane non-wormhole) travel + if (route.size() == 2 && *route.begin() != *route.rbegin() && + !(*route.begin())->HasStarlaneTo((*route.rbegin())->ID()) && !(*route.begin())->HasWormholeTo((*route.rbegin())->ID()) && + !(*route.rbegin())->HasStarlaneTo((*route.begin())->ID()) && !(*route.rbegin())->HasWormholeTo((*route.begin())->ID())) { + continue; + } + + // if actually ordering fleet movement, not just prospectively previewing, ... do so + if (execute_move && !route.empty()) { + HumanClientApp::GetApp()->Orders().IssueOrder(new FleetMoveOrder(empire_id, fleet->ID(), start_system, system_id)); + if (fleet_sys_id == UniverseObject::INVALID_OBJECT_ID) + SetFleetMovement(fleet); + } + + // show route on map + SetProjectedFleetMovement(fleet, route); + } +} + +void MapWnd::FleetButtonLeftClicked(FleetButton& fleet_btn) +{ + if (m_in_production_view_mode) return; + + const std::vector<Fleet*>& btn_fleets = fleet_btn.Fleets(); + if (btn_fleets.empty()) + throw std::runtime_error("caught clicked signal for empty fleet button"); + + bool multiple_fleet_windows = GetOptionsDB().Get<bool>("UI.multiple-fleet-windows"); + + Fleet* fleet = btn_fleets[0]; + + System* system = fleet->GetSystem(); + int X = fleet->X(); + int Y = fleet->Y(); + int owner = *(fleet->Owners().begin()); + + // find if a FleetWnd for this FleetButton's fleet(s) is already open + FleetWnd* wnd_for_button = 0; + for (std::set<FleetWnd*>::iterator it = m_fleet_wnds.begin(); it != m_fleet_wnds.end(); ++it) { + if ((*it)->ContainsFleet(fleet->ID())) { + wnd_for_button = *it; + break; + } + } + + if (!wnd_for_button) { + // there was no preexisting open FleetWnd for this button's fleets + if (!multiple_fleet_windows) + CloseAllFleetWnds(); + + // get all fleets at this location. may be in a system, in which case fleets are separated into + // departing or stationary; or may be away from any system, moving + std::vector<Fleet*> fleets; + if (system) { + const System::ObjectVec owned_fleets = system->FindObjects(OwnedVisitor<Fleet>(owner)); + for (System::ObjectVec::const_iterator it = owned_fleets.begin(); it != owned_fleets.end(); ++it) { + Fleet* owned_fleet = dynamic_cast<Fleet*>(*it); + if (owned_fleet) fleets.push_back(owned_fleet); + } + } else { + std::copy(btn_fleets.begin(), btn_fleets.end(), std::back_inserter(fleets)); + } + + // determine whether this FleetWnd can't be manipulated by the users: can't manipulate other + // empires FleetWnds, and can't give orders to your fleets while they're en-route. + bool read_only = false; + if (owner != HumanClientApp::GetApp()->EmpireID() || !system) + read_only = true; + + wnd_for_button = new FleetWnd(0, 0, fleets, 0, read_only); + m_fleet_wnds.insert(wnd_for_button); + + GG::Connect(wnd_for_button->ClosingSignal, &MapWnd::FleetWndClosing, this); + + // position new FleetWnd. default to last user-set position... + GG::Pt wnd_position = FleetWnd::LastPosition(); + // unless the user hasn't opened and closed a FleetWnd yet, in which case use the lower-right + if (wnd_position == GG::Pt()) + wnd_position = GG::Pt(5, GG::GUI::GetGUI()->AppHeight() - wnd_for_button->Height() - 5); + + wnd_for_button->MoveTo(wnd_position); + + // safety check to ensure window is on screen... may be redundant + if (GG::GUI::GetGUI()->AppWidth() - 5 < wnd_for_button->LowerRight().x) + wnd_for_button->OffsetMove(GG::Pt(GG::GUI::GetGUI()->AppWidth() - 5 - wnd_for_button->LowerRight().x, 0)); + if (GG::GUI::GetGUI()->AppHeight() - 5 < wnd_for_button->LowerRight().y) + wnd_for_button->OffsetMove(GG::Pt(0, GG::GUI::GetGUI()->AppHeight() - 5 - wnd_for_button->LowerRight().y)); + + GG::GUI::GetGUI()->Register(wnd_for_button); + //wnd_for_button->Show(); + + } + + // make FleetWnd for clicked button the selected fleet wnd + m_active_fleet_wnd = wnd_for_button; + + // TODO: select next fleet in wnd, amongst fleets belonging to clicked button +} + +void MapWnd::FleetWndClosing(FleetWnd* fleet_wnd) +{ + m_fleet_wnds.erase(fleet_wnd); + if (fleet_wnd == m_active_fleet_wnd) { + if (m_fleet_wnds.empty()) + m_active_fleet_wnd = 0; + else + m_active_fleet_wnd = *(m_fleet_wnds.begin()); + } +} + void MapWnd::UniverseObjectDeleted(const UniverseObject *obj) { - m_fleet_lines.erase(const_cast<Fleet*>(universe_object_cast<const Fleet*>(obj))); + Fleet* fleet = const_cast<Fleet*>(universe_object_cast<const Fleet*>(obj)); + if (fleet) { + m_fleet_lines.erase(const_cast<Fleet*>(universe_object_cast<const Fleet*>(obj))); + } } void MapWnd::RegisterPopup( MapWndPopup* popup ) @@ -1818,3 +1991,13 @@ (*it)->Show(); } } + +MapWnd::FleetButtonClickedFunctor::FleetButtonClickedFunctor(FleetButton& fleet_btn, MapWnd& map_wnd) : + m_fleet_btn(fleet_btn), + m_map_wnd(map_wnd) +{} + +void MapWnd::FleetButtonClickedFunctor::operator()() +{ + m_map_wnd.FleetButtonLeftClicked(m_fleet_btn); +} \ No newline at end of file Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2007-03-09 13:30:42 UTC (rev 2021) +++ trunk/FreeOrion/UI/MapWnd.h 2007-03-09 14:40:29 UTC (rev 2022) @@ -12,6 +12,7 @@ class CUITurnButton; class Fleet; class FleetButton; +class FleetWnd; class MapWndPopup; class ProductionWnd; class ResearchWnd; @@ -54,10 +55,16 @@ //! \name Accessors //!@{ virtual GG::Pt ClientUpperLeft() const; - double ZoomFactor() const {return m_zoom_factor;} - SidePanel* GetSidePanel() const {return m_side_panel;} - void GetSaveGameUIData(SaveGameUIData& data) const; //!< populates the relevant UI state that should be restored after a save-and-load cycle - bool InProductionViewMode() const; //!< returns true iff this MapWnd is visible and usable for interaction, but the allowed interactions are restricted to those appropriate to the production screen + double ZoomFactor() const {return m_zoom_factor;} + SidePanel* GetSidePanel() const {return m_side_panel;} + void GetSaveGameUIData(SaveGameUIData& data) const; //!< populates the relevant UI state that should be restored after a save-and-load cycle + bool InProductionViewMode() const; //!< returns true iff this MapWnd is visible and usable for interaction, but the allowed interactions are restricted to those appropriate to the production screen + bool FleetWndsOpen() const; //!< returns true iff there is at least one open FleetWnd + + typedef std::set<FleetWnd*>::const_iterator FleetWndIter; + FleetWndIter FleetWndBegin() {return m_fleet_wnds.begin();} + FleetWndIter FleetWndEnd() {return m_fleet_wnds.end();} + //!@} //! \name Mutators //!@{ @@ -72,6 +79,7 @@ void InitTurn( int turn_number ); //!< called at the start of each turn void RestoreFromSaveData(const SaveGameUIData& data); //!< restores the UI state that was saved in an earlier call to GetSaveGameUIData(). + bool CloseAllFleetWnds(); //!< closes all open FleetWnds. returns true if there was at least one open FleetWnd, otherwise false void ShowSystemNames(); //!< enables the system name text void HideSystemNames(); //!< disables the system name text void HandlePlayerChatMessage(const std::string& msg); //!< displays incoming player chat text @@ -148,6 +156,8 @@ void SystemRightClicked(int system_id); void MouseEnteringSystem(int system_id); void MouseLeavingSystem(int system_id); + void PlotFleetMovement(int system_id, bool execute_move); + void FleetButtonLeftClicked(FleetButton& fleet_btn); void UniverseObjectDeleted(const UniverseObject *obj); bool ReturnToMap(); bool OpenChatWindow(); @@ -176,46 +186,58 @@ void HideAllPopups(); void ShowAllPopups(); - std::set<GG::Key> m_disabled_accels_list; //!< the list of Accelerators disabled by \a DisableAlphaNumAccels + void FleetWndClosing(FleetWnd* fleet_wnd); - std::vector<boost::shared_ptr<GG::Texture> > m_backgrounds; //!< starfield backgrounds - std::vector<boost::shared_ptr<GG::Texture> > m_nebulae; //!< decorative nebula textures - std::vector<GG::Pt> m_nebula_centers; //!< the centerpoints of each of the nebula textures - std::vector<double> m_bg_scroll_rate; //!< array, the rates at which each background scrolls - std::vector<double> m_bg_position_X; //!< array, the X position of the first full background image - std::vector<double> m_bg_position_Y; //!< array, the Y positions of the backgrounds + std::set<GG::Key> m_disabled_accels_list; //!< the list of Accelerators disabled by \a DisableAlphaNumAccels - double m_zoom_factor; //! the current zoom level; clamped to [MIN_SCALE_FACTOR, MAX_SCALE_FACTOR] - SidePanel* m_side_panel; //! the planet view panel on the side of the main map - std::map<int, SystemIcon*> m_system_icons; //! the system icons in the main map, indexed by system id - SitRepPanel* m_sitrep_panel; //! the sitrep panel - ResearchWnd* m_research_wnd; //! the research screen - ProductionWnd* m_production_wnd; //! the production screen - GG::MultiEdit* m_chat_display; //! the (read-only) MP-chat output multi-line edit box - CUIEdit* m_chat_edit; //! the MP-chat input edit box - std::vector<FleetButton*> m_moving_fleet_buttons; //! the moving fleets in the main map - std::set<StarlaneData> m_starlanes; //! the starlanes between systems + std::vector<boost::shared_ptr<GG::Texture> > m_backgrounds; //!< starfield backgrounds + std::vector<boost::shared_ptr<GG::Texture> > m_nebulae; //!< decorative nebula textures + std::vector<GG::Pt> m_nebula_centers; //!< the centerpoints of each of the nebula textures + std::vector<double> m_bg_scroll_rate; //!< array, the rates at which each background scrolls + std::vector<double> m_bg_position_X; //!< array, the X position of the first full background image + std::vector<double> m_bg_position_Y; //!< array, the Y positions of the backgrounds + + double m_zoom_factor; //! current zoom level; clamped to [MIN_SCALE_FACTOR, MAX_SCALE_FACTOR] + SidePanel* m_side_panel; //! planet view panel on the side of the main map + std::set<FleetWnd*> m_fleet_wnds; //! currently-open fleet wnds + FleetWnd* m_active_fleet_wnd; //! currently active FleetWnd is showing fleets. Active FleetWnd chosen by clicking FleetButtons + std::map<int, SystemIcon*> m_system_icons; //! system icons in the main map, indexed by system id + SitRepPanel* m_sitrep_panel; //! sitrep panel + ResearchWnd* m_research_wnd; //! research screen + ProductionWnd* m_production_wnd; //! production screen + GG::MultiEdit* m_chat_display; //! (read-only) MP-chat output multi-line edit box + CUIEdit* m_chat_edit; //! MP-chat input edit box + std::vector<FleetButton*> m_moving_fleet_buttons; //! moving fleets in the main map (SystemIcons contain stationary fleet buttons) + std::set<StarlaneData> m_starlanes; //! starlanes between systems std::map<Fleet*, - MovementLineData> m_fleet_lines; //! the lines used for moving fleets in the main map - MovementLineData m_projected_fleet_lines; //! the lines that show the projected path of the active fleet in the FleetWnd - GG::Pt m_drag_offset; //! the distance the cursor is from the upper-left corner of the window during a drag ((-1, -1) if no drag is occurring) - bool m_dragged; //! tracks whether or not a drag occurs during a left button down sequence of events - CUITurnButton* m_turn_update; //!< button that updates player's turn - std::list<MapWndPopup*> m_popups; //!< list of currently active popup windows - bool m_menu_showing; //!< set during ShowMenu() to prevent reentrency - int m_current_owned_system; - int m_current_fleet; - bool m_in_production_view_mode; + MovementLineData> m_fleet_lines; //! lines used for moving fleets in the main map + MovementLineData m_projected_fleet_lines; //! lines that show the projected path of the active fleet in the FleetWnd + GG::Pt m_drag_offset; //! distance the cursor is from the upper-left corner of the window during a drag ((-1, -1) if no drag is occurring) + bool m_dragged; //! tracks whether or not a drag occurs during a left button down sequence of events + CUITurnButton* m_turn_update; //!< button that updates player's turn + std::list<MapWndPopup*> m_popups; //!< list of currently active popup windows + bool m_menu_showing; //!< set during ShowMenu() to prevent reentrency + int m_current_owned_system; + int m_current_fleet; + bool m_in_production_view_mode; - CUIToolBar *m_toolbar; - StatisticIcon *m_food,*m_mineral,*m_trade,*m_population,*m_research,*m_industry; + CUIToolBar *m_toolbar; + StatisticIcon *m_food, *m_mineral, *m_trade, *m_population, *m_research, *m_industry; - CUIButton *m_btn_siterep,*m_btn_research,*m_btn_production,*m_btn_menu; + CUIButton *m_btn_siterep, *m_btn_research, *m_btn_production, *m_btn_menu; static const int NUM_BACKGROUNDS; static double s_min_scale_factor; static double s_max_scale_factor; static int s_nebula_size; // width of nebula at zoom = 1 + + struct FleetButtonClickedFunctor + { + FleetButtonClickedFunctor(FleetButton& fleet_btn, MapWnd& map_wnd); + void operator()(); + FleetButton& m_fleet_btn; + MapWnd& m_map_wnd; + }; }; Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2007-03-09 13:30:42 UTC (rev 2021) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2007-03-09 14:40:29 UTC (rev 2022) @@ -222,6 +222,7 @@ m_tech_tree_wnd->MoveTo(GG::Pt(m_research_info_panel->Width() + 3, 3)); GG::Connect(m_tech_tree_wnd->AddTechToQueueSignal, &ResearchWnd::AddTechToQueueSlot, this); + GG::Connect(m_tech_tree_wnd->AddMultipleTechsToQueueSignal, &ResearchWnd::AddMultipleTechsToQueueSlot, this); GG::Connect(m_queue_lb->ErasedSignal, &ResearchWnd::QueueItemDeletedSlot, this); GG::Connect(m_queue_lb->LeftClickedSignal, &ResearchWnd::QueueItemClickedSlot, this); GG::Connect(m_queue_lb->DoubleClickedSignal, &ResearchWnd::QueueItemDoubleClickedSlot, this); @@ -330,6 +331,23 @@ } } +void ResearchWnd::AddMultipleTechsToQueueSlot(std::vector<const Tech*> tech_vec) +{ + const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); + const ResearchQueue& queue = empire->GetResearchQueue(); + const int id = HumanClientApp::GetApp()->EmpireID(); + OrderSet& orders = HumanClientApp::GetApp()->Orders(); + for (std::vector<const Tech*>::const_iterator it = tech_vec.begin(); it != tech_vec.end(); ++it) { + const Tech* tech = *it; + if (!queue.InQueue(tech)) + orders.IssueOrder(new ResearchQueueOrder(id, tech->Name(), -1)); + } + + UpdateQueue(); + ResetInfoPanel(); + m_tech_tree_wnd->Update(); +} + void ResearchWnd::QueueItemDeletedSlot(int row_idx, GG::ListBox::Row* row) { HumanClientApp::GetApp()->Orders().IssueOrder(new ResearchQueueOrder(HumanClientApp::GetApp()->EmpireID(), dynamic_cast<QueueRow*>(row)->tech->Name())); Modified: trunk/FreeOrion/UI/ResearchWnd.h =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.h 2007-03-09 13:30:42 UTC (rev 2021) +++ trunk/FreeOrion/UI/ResearchWnd.h 2007-03-09 14:40:29 UTC (rev 2022) @@ -32,6 +32,7 @@ void UpdateQueue(); void ResetInfoPanel(); ///< 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); + void AddMultipleTechsToQueueSlot(std::vector<const Tech*> tech_vec); void QueueItemDeletedSlot(int row_idx, GG::ListBox::Row* row); void QueueItemClickedSlot(int row_idx, GG::ListBox::Row* row, const GG::Pt& pt); void QueueItemDoubleClickedSlot(int row_idx, GG::ListBox::Row* row); Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2007-03-09 13:30:42 UTC (rev 2021) +++ trunk/FreeOrion/UI/SidePanel.cpp 2007-03-09 14:40:29 UTC (rev 2022) @@ -978,11 +978,12 @@ HumanClientApp::GetApp()->Orders().RecindOrder(it->second); // if the ship now buils a fleet of its own, make sure that fleet appears - // at a possibly opend FleetWnd - Ship *ship = GetUniverse().Object<Ship>(ship_id); - Fleet *fleet= ship?GetUniverse().Object<Fleet>(ship->FleetID()):NULL; + // at a possibly opened FleetWnd + Ship* ship = GetUniverse().Object<Ship>(ship_id); + Fleet* fleet= ship ? GetUniverse().Object<Fleet>(ship->FleetID()) : NULL; + MapWnd* map_wnd = ClientUI::GetClientUI()->GetMapWnd(); if(fleet) - for( FleetWnd::FleetWndItr it = FleetWnd::FleetWndBegin();it != FleetWnd::FleetWndEnd();++it) + for( MapWnd::FleetWndIter it = map_wnd->FleetWndBegin();it != map_wnd->FleetWndEnd();++it) { FleetWnd *fleet_wnd = *it; if(fleet->SystemID() == fleet_wnd->SystemID() Modified: trunk/FreeOrion/UI/SystemIcon.cpp =================================================================== --- trunk/FreeOrion/UI/SystemIcon.cpp 2007-03-09 13:30:42 UTC (rev 2021) +++ trunk/FreeOrion/UI/SystemIcon.cpp 2007-03-09 14:40:29 UTC (rev 2022) @@ -119,7 +119,6 @@ m_mouseover_indicator->Hide(); } - SystemIcon::~SystemIcon() {} @@ -272,14 +271,12 @@ { for (std::map<int, FleetButton*>::iterator it = m_stationary_fleet_markers.begin(); it != m_stationary_fleet_markers.end(); ++it) { if (std::find(it->second->Fleets().begin(), it->second->Fleets().end(), fleet) != it->second->Fleets().end()) { - it->second->SelectFleet(fleet); it->second->LClick(GG::Pt(), 0); return; } } for (std::map<int, FleetButton*>::iterator it = m_moving_fleet_markers.begin(); it != m_moving_fleet_markers.end(); ++it) { if (std::find(it->second->Fleets().begin(), it->second->Fleets().end(), fleet) != it->second->Fleets().end()) { - it->second->SelectFleet(fleet); it->second->LClick(GG::Pt(), 0); return; } @@ -321,6 +318,7 @@ m_stationary_fleet_markers[it->first] = stationary_fb; AttachChild(m_stationary_fleet_markers[it->first]); map_wnd->SetFleetMovement(stationary_fb); + GG::Connect(stationary_fb->ClickedSignal, FleetButtonClickedFunctor(*stationary_fb, *this)); stationary_y += BUTTON_SIZE; } fleet_IDs = m_system.FindObjectIDs(OrderedMovingFleetVisitor(it->first)); @@ -332,10 +330,6 @@ map_wnd->SetFleetMovement(moving_fb); moving_y -= BUTTON_SIZE; } - if (stationary_fb && moving_fb) { - moving_fb->SetCompliment(stationary_fb); - stationary_fb->SetCompliment(moving_fb); - } } } @@ -349,3 +343,13 @@ { CreateFleetButtons(); } + +SystemIcon::FleetButtonClickedFunctor::FleetButtonClickedFunctor(FleetButton& fleet_btn, SystemIcon& system_icon) : + m_fleet_btn(fleet_btn), + m_system_icon(system_icon) +{} + +void SystemIcon::FleetButtonClickedFunctor::operator()() +{ + m_system_icon.FleetButtonClickedSignal(m_fleet_btn); +} \ No newline at end of file Modified: trunk/FreeOrion/UI/SystemIcon.h =================================================================== --- trunk/FreeOrion/UI/SystemIcon.h 2007-03-09 13:30:42 UTC (rev 2021) +++ trunk/FreeOrion/UI/SystemIcon.h 2007-03-09 14:40:29 UTC (rev 2022) @@ -3,15 +3,9 @@ #ifndef _SystemIcon_h_ #define _SystemIcon_h_ -#ifndef _GG_Button_h_ #include <GG/Button.h> -#endif - -#ifndef _CUIDrawUtil_h_ #include "CUIDrawUtil.h" -#endif - class Fleet; class FleetButton; class System; @@ -38,21 +32,14 @@ { public: //! \name Signal Types //!@{ - typedef boost::signal<void (int)> MouseEnteringSignalType; //!< emitted when the user moves the cursor over the icon; returns the object id - typedef boost::signal<void (int)> MouseLeavingSignalType; //!< emitted when the user moves the cursor off of the icon; returns the object id - typedef boost::signal<void (int)> LeftClickedSignalType; //!< emitted when the user left clicks the icon; returns the objectID - typedef boost::signal<void (int)> RightClickedSignalType; //!< emitted when the user right clicks the icon; returns the objectID - typedef boost::signal<void (int)> LeftDoubleClickedSignalType; //!< emitted when the user left double-clicks the icon; returns the object id + typedef boost::signal<void (int)> MouseEnteringSignalType; //!< emitted when the user moves the cursor over the icon; returns the object id + typedef boost::signal<void (int)> MouseLeavingSignalType; //!< emitted when the user moves the cursor off of the icon; returns the object id + typedef boost::signal<void (int)> LeftClickedSignalType; //!< emitted when the user left clicks the icon; returns the objectID + typedef boost::signal<void (int)> RightClickedSignalType; //!< emitted when the user right clicks the icon; returns the objectID + typedef boost::signal<void (int)> LeftDoubleClickedSignalType; //!< emitted when the user left double-clicks the icon; returns the object id + typedef boost::signal<void (FleetButton&)> FleetButtonClickedSignalType; //!< emitted when one of the fleet buttons on this icon is clicked //!@} - //! \name Slot Types //!@{ - typedef MouseEnteringSignalType::slot_type MouseEnteringSlotType; //!< type of functor invoked when the user moves over the system - typedef MouseLeavingSignalType::slot_type MouseLeavingSlotType; //!< type of functor invoked when the user moves off of the system - typedef LeftClickedSignalType::slot_type LeftClickedSlotType; //!< type of functor invoked when the user left clicks - typedef RightClickedSignalType::slot_type RightClickedSlotType; //!< type of functor invoked when the user right clicks - typedef LeftDoubleClickedSignalType::slot_type LeftDoubleClickedSlotType; //!< type of functor invoked when the user left double-clicks - //!@} - //! \name Structors //!@{ SystemIcon(int id, double zoom); //!< construct from a universe ID, to be placed in a MapWnd at zoom level \a zoom ~SystemIcon(); //!< dtor @@ -78,11 +65,12 @@ void ShowName(); //!< enables the system name text void HideName(); //!< disables the system name text - mutable MouseEnteringSignalType MouseEnteringSignal; - mutable MouseLeavingSignalType MouseLeavingSignal; - mutable LeftClickedSignalType LeftClickedSignal; - mutable RightClickedSignalType RightClickedSignal; - mutable LeftDoubleClickedSignalType LeftDoubleClickedSignal; + mutable MouseEnteringSignalType MouseEnteringSignal; + mutable MouseLeavingSignalType MouseLeavingSignal; + mutable LeftClickedSignalType LeftClickedSignal; + mutable RightClickedSignalType RightClickedSignal; + mutable LeftDoubleClickedSignalType LeftDoubleClickedSignal; + mutable FleetButtonClickedSignalType FleetButtonClickedSignal; //!@} private: @@ -101,7 +89,13 @@ std::map<int, FleetButton*> m_stationary_fleet_markers; //!< the fleet buttons for the fleets that are stationary in the system, indexed by Empire ID of the owner std::map<int, FleetButton*> m_moving_fleet_markers; //!< the fleet buttons for the fleets that are under orders to move out of the system, indexed by Empire ID of the owner - friend class FleetButtonClickedFunctor; + struct FleetButtonClickedFunctor + { + FleetButtonClickedFunctor(FleetButton& fleet_btn, SystemIcon& system_icon); + void operator()(); + FleetButton& m_fleet_btn; + SystemIcon& m_system_icon; + }; }; #endif // _SystemIcon_h_ |