From: <tz...@us...> - 2006-01-29 20:28:27
|
Revision: 1706 Author: tzlaine Date: 2006-01-29 12:27:50 -0800 (Sun, 29 Jan 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1706&view=rev Log Message: ----------- - Added debugging code to Orders.cpp and Universe.cpp to help track down a persistent crash when executing movement orders. - Changed the interface of NewFleetOrder to accept one or more ships, instead of strictly one. - Substantial rewrite of FleetWnd and its supporting classes, for simplification and to fix crash bugs when drag-dropping introduced by the GG SVN conversion. - Fixed a naming typo in ProductionWnd.cpp. - Changed the behavior of CUIWnd::CloseClicked() so that it does not delete the closing window. Subclass implementations' CloseClicked() methods have been altered to do so as necessary. This fixes possible double deletions and several known leaks. Modified Paths: -------------- trunk/FreeOrion/UI/CUIWnd.cpp trunk/FreeOrion/UI/CombatWnd.cpp trunk/FreeOrion/UI/CombatWnd.h trunk/FreeOrion/UI/FleetWindow.cpp trunk/FreeOrion/UI/FleetWindow.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/UI/ProductionWnd.h trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/universe/UniverseObject.h trunk/FreeOrion/util/Order.cpp trunk/FreeOrion/util/Order.h Modified: trunk/FreeOrion/UI/CUIWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CUIWnd.cpp 2006-01-22 22:53:16 UTC (rev 1705) +++ trunk/FreeOrion/UI/CUIWnd.cpp 2006-01-29 20:27:50 UTC (rev 1706) @@ -364,11 +364,10 @@ void CUIWnd::CloseClicked() { m_done = true; - if (Parent()) { - Parent()->DeleteChild(this); - } else { + if (Parent()) + Parent()->DetachChild(this); + else GG::GUI::GetGUI()->Remove(this); - } } void CUIWnd::MinimizeClicked() @@ -447,5 +446,6 @@ void CUIEditWnd::OkClicked() { - m_result = m_edit->WindowText(); CloseClicked(); + m_result = m_edit->WindowText(); + CloseClicked(); } Modified: trunk/FreeOrion/UI/CombatWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CombatWnd.cpp 2006-01-22 22:53:16 UTC (rev 1705) +++ trunk/FreeOrion/UI/CombatWnd.cpp 2006-01-29 20:27:50 UTC (rev 1706) @@ -182,7 +182,6 @@ { } - void CombatWnd::UpdateCombatTurnProgress(const std::string& message) { std::stringstream stream(message); Modified: trunk/FreeOrion/UI/CombatWnd.h =================================================================== --- trunk/FreeOrion/UI/CombatWnd.h 2006-01-22 22:53:16 UTC (rev 1705) +++ trunk/FreeOrion/UI/CombatWnd.h 2006-01-29 20:27:50 UTC (rev 1706) @@ -20,8 +20,8 @@ /** \name Structors */ //@{ CombatWnd(int x,int y); + ~CombatWnd(); //@} - ~CombatWnd(); void UpdateCombatTurnProgress(const std::string& message); Modified: trunk/FreeOrion/UI/FleetWindow.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWindow.cpp 2006-01-22 22:53:16 UTC (rev 1705) +++ trunk/FreeOrion/UI/FleetWindow.cpp 2006-01-29 20:27:50 UTC (rev 1706) @@ -16,6 +16,7 @@ #include <GG/DrawUtil.h> #include <GG/Menu.h> +#include <GG/Layout.h> #include <GG/StaticGraphic.h> #include <GG/TextControl.h> @@ -27,20 +28,25 @@ const int FLEET_LISTBOX_WIDTH = 250; const int FLEET_LISTBOX_HEIGHT = 150; const int CONTROL_MARGIN = 5; // gap to leave between controls in these window + const std::string SHIP_DROP_TYPE_STRING = "FLeetWnd ShipRow"; + const std::string FLEET_DROP_TYPE_STRING = "FleetWnd FleetRow"; class FleetDataPanel : public GG::Control { public: - enum {FLEET_ICON_SZ = 38, - FLEET_NAME_HT = 20, - STAT_ICON_WD = 40}; + enum { + FLEET_ICON_SZ = 38, + FLEET_NAME_HT = 20, + STAT_ICON_WD = 40 + }; FleetDataPanel(int w, int h, const Fleet* fleet) : Control(0, 0, w, h, 0), m_fleet(fleet), m_fleet_icon(0), - m_fleet_name_text(new GG::TextControl(h, 0, w - h - 5, FLEET_NAME_HT, m_fleet ? m_fleet->Name() : "<i>" + UserString("FW_NEW_FLEET_LABEL") + "</i>", - GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS), m_fleet ? ClientUI::TEXT_COLOR : GG::CLR_BLACK, GG::TF_RIGHT | GG::TF_VCENTER)), + m_fleet_name_text(new GG::TextControl(h, 0, w - h - 5, FLEET_NAME_HT, m_fleet ? m_fleet->Name() : "<i>" + UserString("FW_NEW_FLEET_LABEL") + "</i>", + GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS), m_fleet ? ClientUI::TEXT_COLOR : GG::CLR_BLACK, + GG::TF_RIGHT | GG::TF_VCENTER)), m_num_ships_stat(0), m_fleet_strength_stat(0), m_damage_icon(0), @@ -52,10 +58,10 @@ AttachChild(m_fleet_name_text); if (m_fleet) { - m_num_ships_stat = new StatisticIcon(h, FLEET_NAME_HT, STAT_ICON_WD, h - FLEET_NAME_HT - 1, ClientUI::ART_DIR + "icons/3shipfleet.png", - ClientUI::TEXT_COLOR, 0); - m_fleet_strength_stat = new StatisticIcon(h + STAT_ICON_WD, FLEET_NAME_HT, STAT_ICON_WD, h - FLEET_NAME_HT - 1, ClientUI::ART_DIR + "icons/combatstrength.png", - ClientUI::TEXT_COLOR, 0); + m_num_ships_stat = new StatisticIcon(h, FLEET_NAME_HT, STAT_ICON_WD, h - FLEET_NAME_HT - 1, + ClientUI::ART_DIR + "icons/3shipfleet.png", ClientUI::TEXT_COLOR, 0); + m_fleet_strength_stat = new StatisticIcon(h + STAT_ICON_WD, FLEET_NAME_HT, STAT_ICON_WD, h - FLEET_NAME_HT - 1, + ClientUI::ART_DIR + "icons/combatstrength.png", ClientUI::TEXT_COLOR, 0); AttachChild(m_num_ships_stat); AttachChild(m_fleet_strength_stat); GG::Connect(m_fleet->StateChangedSignal, &FleetDataPanel::Refresh, this); @@ -200,16 +206,18 @@ class ShipDataPanel : public GG::Control { public: - enum {SHIP_ICON_SZ = FleetDataPanel::FLEET_ICON_SZ, - SHIP_NAME_HT = FleetDataPanel::FLEET_NAME_HT, - STAT_ICON_WD = FleetDataPanel::STAT_ICON_WD}; + enum { + SHIP_ICON_SZ = FleetDataPanel::FLEET_ICON_SZ, + SHIP_NAME_HT = FleetDataPanel::FLEET_NAME_HT, + STAT_ICON_WD = FleetDataPanel::STAT_ICON_WD + }; ShipDataPanel(int w, int h, const Ship* ship) : Control(0, 0, w, h, 0), m_ship(ship), m_ship_icon(0), - m_ship_name_text(new GG::TextControl(h, 0, w - h - 5, SHIP_NAME_HT, m_ship->Name(), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS), ClientUI::TEXT_COLOR, - GG::TF_RIGHT | GG::TF_VCENTER)), + m_ship_name_text(new GG::TextControl(h, 0, w - h - 5, SHIP_NAME_HT, m_ship->Name(), GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS), + ClientUI::TEXT_COLOR, GG::TF_RIGHT | GG::TF_VCENTER)), m_ship_strength_stat(0), m_damage_stat(0), m_colonizer_icon(0), @@ -328,9 +336,10 @@ enum {PANEL_WD = FLEET_LISTBOX_WIDTH - 8, PANEL_HT = 38}; FleetRow(Fleet* fleet) : - GG::ListBox::Row(PANEL_WD - ClientUI::SCROLL_WIDTH, PANEL_HT + 4, "Fleet"), + GG::ListBox::Row(PANEL_WD - ClientUI::SCROLL_WIDTH, PANEL_HT + 4, fleet ? FLEET_DROP_TYPE_STRING : ""), m_fleet(fleet) { + SetText("FleetRow"); EnableChildClipping(); push_back(new FleetDataPanel(Width(), PANEL_HT, m_fleet)); } @@ -345,9 +354,10 @@ enum {PANEL_WD = FleetRow::PANEL_WD, PANEL_HT = FleetRow::PANEL_HT}; ShipRow(Ship* ship) : - GG::ListBox::Row(PANEL_WD - ClientUI::SCROLL_WIDTH, PANEL_HT + 4, "Ship"), + GG::ListBox::Row(PANEL_WD - ClientUI::SCROLL_WIDTH, PANEL_HT + 4, SHIP_DROP_TYPE_STRING), m_ship(ship) { + SetText("ShipRow"); if (!ship) throw std::invalid_argument("ShipRow::ShipRow() : Attempted to contruct a ShipRow using a null ship pointer."); @@ -362,8 +372,8 @@ bool CanJoin(const Ship* ship, const Fleet* fleet) { - const Fleet* home_fleet = ship->GetFleet(); - return home_fleet->ID() != fleet->ID() && (home_fleet->X() == fleet->X() && home_fleet->Y() == fleet->Y()); + const Fleet* current_fleet = ship->GetFleet(); + return current_fleet->ID() != fleet->ID() && (current_fleet->X() == fleet->X() && current_fleet->Y() == fleet->Y()); } bool temp_header_bool = RecordHeaderFile(FleetWindowRevision()); @@ -371,34 +381,190 @@ } //////////////////////////////////////////////// +// FleetsListBox +//////////////////////////////////////////////// +class FleetsListBox : public CUIListBox +{ +public: + FleetsListBox(int x, int y, int w, int h, bool read_only) : + CUIListBox(x, y, w, h), + m_read_only(read_only) + {} + + mutable boost::signal<void (Ship*, const std::vector<int>&)> NewFleetFromShipsSignal; + + // 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 all the Fleet- and + // Ship-display Wnds respond to changes in the system or fleet they display anyway. + virtual void AcceptDrops(std::list<Wnd*>& wnds, const GG::Pt& pt) + { + std::vector<Ship*> ships; + std::vector<int> ship_ids; + for (std::list<Wnd*>::const_iterator it = wnds.begin(); it != wnds.end(); ++it) { + if ((*it)->DragDropDataType() == SHIP_DROP_TYPE_STRING) { + ships.push_back(static_cast<ShipRow*>(*it)->m_ship); + ship_ids.push_back(ships.back()->ID()); + } else if ((*it)->DragDropDataType() != FLEET_DROP_TYPE_STRING) { + wnds.clear(); + return; + } + } + + int row_index = RowUnderPt(pt); + if (m_read_only || row_index < 0 || NumRows() <= row_index) { + wnds.clear(); + return; + } + + if (static_cast<FleetRow*>(&GetRow(row_index))->m_fleet) { + if (wnds.front()->DragDropDataType() == SHIP_DROP_TYPE_STRING) { + Fleet* target_fleet = static_cast<FleetRow*>(&GetRow(row_index))->m_fleet; + if (!CanJoin(ships[0], target_fleet)) { + wnds.clear(); + return; + } + HumanClientApp::Orders().IssueOrder(new FleetTransferOrder(HumanClientApp::GetApp()->EmpireID(), ships[0]->FleetID(), + target_fleet->ID(), ship_ids)); + } else if (wnds.front()->DragDropDataType() == FLEET_DROP_TYPE_STRING) { + FleetRow* fleet_row = static_cast<FleetRow*>(wnds.front()); + Fleet* target_fleet = static_cast<FleetRow*>(&GetRow(row_index))->m_fleet; + // disallow drops across fleet windows; fleets must be at the same location + if (target_fleet->X() != fleet_row->m_fleet->X() || target_fleet->Y() != fleet_row->m_fleet->Y()) { + wnds.clear(); + return; + } + HumanClientApp::Orders().IssueOrder( + new FleetTransferOrder(HumanClientApp::GetApp()->EmpireID(), fleet_row->FleetID(), + target_fleet->ID(), std::vector<int>(fleet_row->m_fleet->begin(), fleet_row->m_fleet->end()))); + } + } else { + if (wnds.front()->DragDropDataType() == SHIP_DROP_TYPE_STRING) { + // special case: disallow drag-dropping a ship into the new fleet row when there is exactly 1 fleet + // containing exactly 1 ship + // TODO: This "2" need to change when the new fleet row is no longer a row. + if (NumRows() == 2) { // if there is exactly one fleet in the window ("2" is used because there is also the new fleet row) + assert(ships[0]->GetFleet()); + if (ships[0]->GetFleet()->NumShips() == 1) { + wnds.clear(); + return; + } + } + NewFleetFromShipsSignal(ships[0], ship_ids); + } + } + wnds.clear(); + } + +private: + const bool m_read_only; +}; + +//////////////////////////////////////////////// +// ShipsListBox +//////////////////////////////////////////////// +class ShipsListBox : public CUIListBox +{ +public: + ShipsListBox(int x, int y, int w, int h, Fleet* fleet, bool read_only) : + CUIListBox(x, y, w, h), + m_fleet(fleet), + m_read_only(read_only) + {} + + void SetFleet(Fleet* fleet) {m_fleet = fleet;} + + // see comments above FleetsListBox::FleetsListBox() + virtual void AcceptDrops(std::list<Wnd*>& wnds, const GG::Pt& pt) + { + if (wnds.front()->DragDropDataType() == SHIP_DROP_TYPE_STRING) { + std::vector<int> ship_ids; + for (std::list<Wnd*>::const_iterator it = wnds.begin(); it != wnds.end(); ++it) { + if ((*it)->DragDropDataType() == SHIP_DROP_TYPE_STRING) { + ship_ids.push_back(static_cast<ShipRow*>(*it)->m_ship->ID()); + } + } + + ShipRow* ship_row = 0; + if (m_read_only || !(ship_row = dynamic_cast<ShipRow*>(wnds.front())) || !CanJoin(ship_row->m_ship, m_fleet)) { + wnds.clear(); + return; + } + + HumanClientApp::Orders().IssueOrder( + new FleetTransferOrder(HumanClientApp::GetApp()->EmpireID(), ship_row->m_ship->FleetID(), + m_fleet->ID(), ship_ids)); + } + wnds.clear(); + } + +private: + Fleet* m_fleet; + const bool m_read_only; +}; + +//////////////////////////////////////////////// // FleetDetailPanel //////////////////////////////////////////////// -FleetDetailPanel::FleetDetailPanel(int x, int y, Fleet* fleet, bool read_only, Uint32 flags/* = 0*/) : - Wnd(x, y, 1, 1, flags), +class FleetDetailPanel : public GG::Wnd +{ +public: + FleetDetailPanel(Fleet* fleet, bool read_only, Uint32 flags = 0); ///< ctor + + Fleet* GetFleet() const {return m_fleet;} ///< returns the currently-displayed fleet (may be 0) + + void SetFleet(Fleet* fleet); ///< sets the currently-displayed Fleet (may be null) + + mutable boost::signal<void (Fleet*)> PanelEmptySignal; + +private: + int GetShipIDOfListRow(int row_idx) const; ///< returns the ID number of the ship in row \a row_idx of the ships listbox + void Init(); + void Refresh(); + void UniverseObjectDeleted(const UniverseObject *); + void ShipSelectionChanged(const std::set<int>& rows); + void ShipBrowsed(int row_idx); + void ShipRightClicked(int row_idx, GG::ListBox::Row* row, const GG::Pt& pt); + std::string DestinationText() const; + std::string ShipStatusText(int ship_id) const; + + Fleet* m_fleet; + const bool m_read_only; + boost::signals::connection m_fleet_connection; + + GG::TextControl* m_destination_text; + ShipsListBox* m_ships_lb; + GG::TextControl* m_ship_status_text; +}; + +FleetDetailPanel::FleetDetailPanel(Fleet* fleet, bool read_only, Uint32 flags/* = 0*/) : + Wnd(0, 0, 1, 1, flags), m_fleet(0), m_read_only(read_only), m_destination_text(0), m_ships_lb(0), m_ship_status_text(0) { - m_destination_text = new GG::TextControl(0, 0, FLEET_LISTBOX_WIDTH, ClientUI::PTS + 4, "", GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS), ClientUI::TEXT_COLOR, GG::TF_LEFT); - m_ships_lb = new CUIListBox(0, m_destination_text->LowerRight().y + CONTROL_MARGIN, FLEET_LISTBOX_WIDTH, FLEET_LISTBOX_HEIGHT); + SetText("FleetDetailPanel"); + + 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); m_ship_status_text = new GG::TextControl(0, m_ships_lb->LowerRight().y + CONTROL_MARGIN, m_ships_lb->Width(), ClientUI::PTS + 4, - "", GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS), ClientUI::TEXT_COLOR, GG::TF_LEFT); + "temp", GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS), ClientUI::TEXT_COLOR, GG::TF_LEFT); + m_destination_text->SetMinSize(true); + m_ships_lb->SetMinSize(m_ships_lb->Size()); m_ships_lb->SetHiliteColor(GG::CLR_ZERO); + m_ship_status_text->SetMinSize(true); Resize(m_ship_status_text->LowerRight()); + m_destination_text->SetText(""); + m_ship_status_text->SetText(""); + SetFleet(fleet); Init(); - m_universe_object_delete_connection = GG::Connect(GetUniverse().UniverseObjectDeleteSignal, &FleetDetailPanel::UniverseObjectDelete, this); + GG::Connect(GetUniverse().UniverseObjectDeleteSignal, &FleetDetailPanel::UniverseObjectDeleted, this); } -FleetDetailPanel::~FleetDetailPanel() -{ - m_universe_object_delete_connection.disconnect(); -} - int FleetDetailPanel::GetShipIDOfListRow(int row_idx) const { return dynamic_cast<ShipRow&>(m_ships_lb->GetRow(row_idx)).ShipID(); @@ -412,6 +578,7 @@ *m_destination_text << ""; *m_ship_status_text << ""; m_ships_lb->Clear(); + m_ships_lb->SetFleet(fleet); if ((m_fleet = fleet)) { Universe& universe = GetUniverse(); if (m_fleet->NumShips()) { @@ -423,55 +590,43 @@ return; // return immediately, since the signal above may invalidate this } *m_destination_text << DestinationText(); - if (fleet != old_fleet) + if (fleet != old_fleet) { + m_fleet_connection.disconnect(); m_fleet_connection = GG::Connect(m_fleet->StateChangedSignal, &FleetDetailPanel::Refresh, this); + } } } -void FleetDetailPanel::CloseClicked() -{ -} - void FleetDetailPanel::Init() { if (m_read_only) { m_ships_lb->SetStyle(GG::LB_NOSEL | GG::LB_BROWSEUPDATES); } else { m_ships_lb->SetStyle(GG::LB_QUICKSEL | GG::LB_BROWSEUPDATES); - m_ships_lb->AllowDropType("Ship"); + m_ships_lb->AllowDropType(SHIP_DROP_TYPE_STRING); } - AttachSignalChildren(); + AttachChild(m_destination_text); + AttachChild(m_ships_lb); + AttachChild(m_ship_status_text); + VerticalLayout(); + GetLayout()->SetCellMargin(4); + GetLayout()->SetRowStretch(1, 1); GG::Connect(m_ships_lb->SelChangedSignal, &FleetDetailPanel::ShipSelectionChanged, this); GG::Connect(m_ships_lb->BrowsedSignal, &FleetDetailPanel::ShipBrowsed, this); - GG::Connect(m_ships_lb->DroppedSignal, &FleetDetailPanel::ShipDroppedIntoList, this); GG::Connect(m_ships_lb->RightClickedSignal, &FleetDetailPanel::ShipRightClicked, this); } -void FleetDetailPanel::AttachSignalChildren() -{ - AttachChild(m_destination_text); - AttachChild(m_ships_lb); - AttachChild(m_ship_status_text); -} - -void FleetDetailPanel::DetachSignalChildren() -{ - DetachChild(m_destination_text); - DetachChild(m_ships_lb); - DetachChild(m_ship_status_text); -} - void FleetDetailPanel::Refresh() { SetFleet(m_fleet); } -void FleetDetailPanel::UniverseObjectDelete(const UniverseObject *obj) +void FleetDetailPanel::UniverseObjectDeleted(const UniverseObject *obj) { - if(obj == m_fleet) - SetFleet(NULL); + if (obj == m_fleet) + SetFleet(0); } void FleetDetailPanel::ShipSelectionChanged(const std::set<int>& rows) @@ -491,29 +646,6 @@ } } -void FleetDetailPanel::ShipDroppedIntoList(int row_idx, GG::ListBox::Row* row) -{ - ShipRow* ship_row = dynamic_cast<ShipRow*>(row); - int ship_id = ship_row->ShipID(); - if (!m_fleet) { - // creating a new fleet can fail but will be handled by listbox exception - m_fleet = NeedNewFleetSignal(ship_id); - - m_fleet_connection.disconnect(); - m_fleet_connection = GG::Connect(m_fleet->StateChangedSignal, &FleetDetailPanel::Refresh, this); - - *m_destination_text << DestinationText(); - if (Parent()) - Parent()->SetText(m_fleet->Name()); - } - Ship* ship = GetUniverse().Object<Ship>(ship_id); - if (CanJoin(ship, m_fleet)) { - HumanClientApp::Orders().IssueOrder(new FleetTransferOrder(HumanClientApp::GetApp()->EmpireID(), ship->FleetID(), m_fleet->ID(), std::vector<int>(1, ship_id))); - } else { - throw GG::ListBox::DontAcceptDrop(); - } -} - void FleetDetailPanel::ShipRightClicked(int row_idx, GG::ListBox::Row* row, const GG::Pt& pt) { ShipRow* ship_row = dynamic_cast<ShipRow*>(row); @@ -572,47 +704,39 @@ //////////////////////////////////////////////// // FleetDetailWnd //////////////////////////////////////////////// -FleetDetailWnd::FleetDetailWnd(int x, int y, Fleet* fleet, bool read_only, Uint32 flags/* = CLICKABLE | DRAGABLE | ONTOP | CLOSABLE | MINIMIZABLE*/) : +FleetDetailWnd::FleetDetailWnd(int x, int y, Fleet* fleet, bool read_only, Uint32 flags/* = CLICKABLE | DRAGABLE | RESIZABLE | ONTOP | CLOSABLE | MINIMIZABLE*/) : CUIWnd("", x, y, 1, 1, flags), m_fleet_panel(0) { TempUISoundDisabler sound_disabler; - m_fleet_panel = new FleetDetailPanel(3, 3, fleet, read_only); - Resize(m_fleet_panel->Size() + GG::Pt(3, 3) + (Size() - ClientSize())); - AttachSignalChildren(); + m_fleet_panel = new FleetDetailPanel(fleet, read_only); + Resize(m_fleet_panel->Size() + (Size() - ClientSize()) + GG::Pt(14, 14)); + AttachChild(m_fleet_panel); + GridLayout(); + GetLayout()->SetBorderMargin(7); + SetMaxSize(GG::Pt(Width(), MaxSize().y)); SetText(TitleText()); - GG::Connect(m_fleet_panel->NeedNewFleetSignal, &FleetDetailWnd::PanelNeedsNewFleet, this); EnableChildClipping(false); + GG::Connect(m_fleet_panel->PanelEmptySignal, PanelEmptySignal); } FleetDetailWnd::~FleetDetailWnd() { + ClosingSignal(m_fleet_panel->GetFleet()); } void FleetDetailWnd::CloseClicked() { CUIWnd::CloseClicked(); - ClosingSignal(this); + std::cout << "FleetDetailWnd::CloseClicked() : Deleting this" << std::endl; delete this; } -void FleetDetailWnd::AttachSignalChildren() -{ - AttachChild(m_fleet_panel); -} - -void FleetDetailWnd::DetachSignalChildren() -{ - DetachChild(m_fleet_panel); -} - std::string FleetDetailWnd::TitleText() const { - std::string retval = UserString("FW_NEW_FLEET_NAME"); - if (const Fleet* fleet = m_fleet_panel->GetFleet()) { - retval = fleet->Name(); - } - return retval; + const Fleet* fleet = m_fleet_panel->GetFleet(); + assert(fleet); + return fleet->Name(); } @@ -624,7 +748,7 @@ 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::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 | MINIMIZABLE*/) : @@ -650,10 +774,12 @@ TempUISoundDisabler sound_disabler; - m_fleets_lb = new CUIListBox(3, 3, FLEET_LISTBOX_WIDTH, FLEET_LISTBOX_HEIGHT); - m_fleet_detail_panel = new FleetDetailPanel(3, m_fleets_lb->LowerRight().y + CONTROL_MARGIN, 0, read_only); + m_fleets_lb = new FleetsListBox(0, 0, FLEET_LISTBOX_WIDTH, FLEET_LISTBOX_HEIGHT, read_only); + m_fleet_detail_panel = new FleetDetailPanel(0, read_only); + m_fleet_detail_panel->MoveTo(GG::Pt(1, 1)); m_fleets_lb->SetHiliteColor(GG::CLR_ZERO); + m_fleets_lb->SetMinSize(m_fleets_lb->Size()); Resize(m_fleet_detail_panel->LowerRight() + GG::Pt(3, 3) + (Size() - ClientSize())); GG::Pt window_posn = UpperLeft(); @@ -666,37 +792,33 @@ EnableChildClipping(false); Init(fleets, selected_fleet); - m_universe_object_delete_connection = GG::Connect(GetUniverse().UniverseObjectDeleteSignal, &FleetWnd::UniverseObjectDelete, this); + GG::Connect(GetUniverse().UniverseObjectDeleteSignal, &FleetWnd::UniverseObjectDeleted, this); 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() { - RemoveEmptyFleets(); - m_universe_object_delete_connection.disconnect(); - s_open_fleet_wnds.erase(this); } void FleetWnd::CloseClicked() { s_last_position = UpperLeft(); - CUIWnd::CloseClicked(); m_lb_delete_connection.disconnect(); - for (std::map<Fleet*, FleetDetailWnd*>::iterator it = m_open_fleet_windows.begin(); it != m_open_fleet_windows.end(); ++it) { + for (std::map<Fleet*, FleetDetailWnd*>::iterator it = m_open_fleet_detail_wnds.begin(); it != m_open_fleet_detail_wnds.end(); ++it) { delete it->second; } - for (std::set<FleetDetailWnd*>::iterator it = m_new_fleet_windows.begin(); it != m_new_fleet_windows.end(); ++it) { - delete *it; - } for (int i = 0; i < m_fleets_lb->NumRows(); ++i) { if (Fleet* fleet = FleetInRow(i)) NotShowingFleetSignal(fleet); } + CUIWnd::CloseClicked(); delete this; } @@ -706,8 +828,8 @@ m_fleets_lb->SetStyle(GG::LB_NOSORT | GG::LB_BROWSEUPDATES | GG::LB_SINGLESEL); } else { m_fleets_lb->SetStyle(GG::LB_NOSORT | GG::LB_BROWSEUPDATES); - m_fleets_lb->AllowDropType("Ship"); - m_fleets_lb->AllowDropType("Fleet"); + m_fleets_lb->AllowDropType(SHIP_DROP_TYPE_STRING); + m_fleets_lb->AllowDropType(FLEET_DROP_TYPE_STRING); } if (!m_read_only) { @@ -717,17 +839,17 @@ AddFleet(fleets[i]); } - AttachSignalChildren(); + AttachChild(m_fleets_lb); + AttachChild(m_fleet_detail_panel); + VerticalLayout(); + GetLayout()->SetBorderMargin(7); - // everyone seems to hate the rollover effect, so it's disabled here, but all the other code for it is still in place - //GG::Connect(m_fleets_lb->BrowsedSignal, &FleetWnd::FleetBrowsed, this); - - GG::Connect(m_fleet_detail_panel->PanelEmptySignal, &FleetWnd::FleetPanelEmpty, this); + GG::Connect(m_fleet_detail_panel->PanelEmptySignal, &FleetWnd::DeleteFleet, this); GG::Connect(m_fleets_lb->SelChangedSignal, &FleetWnd::FleetSelectionChanged, this); GG::Connect(m_fleets_lb->RightClickedSignal, &FleetWnd::FleetRightClicked, this); GG::Connect(m_fleets_lb->DoubleClickedSignal, &FleetWnd::FleetDoubleClicked, this); m_lb_delete_connection = GG::Connect(m_fleets_lb->ErasedSignal, &FleetWnd::FleetDeleted, this); - GG::Connect(m_fleets_lb->DroppedSignal, &FleetWnd::ObjectDroppedIntoList, this); + GG::Connect(m_fleets_lb->NewFleetFromShipsSignal, &FleetWnd::CreateNewFleetFromDrops, this); SetText(TitleText()); @@ -739,18 +861,6 @@ } } -void FleetWnd::AttachSignalChildren() -{ - AttachChild(m_fleets_lb); - AttachChild(m_fleet_detail_panel); -} - -void FleetWnd::DetachSignalChildren() -{ - DetachChild(m_fleets_lb); - DetachChild(m_fleet_detail_panel); -} - void FleetWnd::SystemClicked(int system_id) { if (system_id != -1) { @@ -798,6 +908,11 @@ } } +int FleetWnd::SystemID() const +{ + return m_system_id; +} + bool FleetWnd::ContainsFleet(int fleet_id) const { for (int i = 0; i < m_fleets_lb->NumRows(); i++) { @@ -808,13 +923,6 @@ return false; } -void FleetWnd::FleetBrowsed(int row_idx) -{ - Fleet* fleet = 0 <= row_idx ? FleetInRow(row_idx) : (0 <= m_current_fleet ? FleetInRow(m_current_fleet) : 0); - if (m_fleet_detail_panel->GetFleet() != fleet) - m_fleet_detail_panel->SetFleet(fleet); -} - void FleetWnd::FleetSelectionChanged(const std::set<int>& rows) { // disallow selection of the new fleet slot @@ -870,17 +978,20 @@ return; Fleet* row_fleet = FleetInRow(row_idx); - int num_open_windows = m_new_fleet_windows.size() + m_open_fleet_windows.size(); + int num_open_windows = m_open_fleet_detail_wnds.size(); GG::Pt window_posn(std::max(0, 25 + LowerRight().x + num_open_windows * 25), std::max(0, UpperLeft().y + num_open_windows * 25)); - if (!m_open_fleet_windows[row_fleet]) { - FleetDetailWnd* fleet_wnd = m_open_fleet_windows[row_fleet] = new FleetDetailWnd(window_posn.x, window_posn.y, row_fleet, m_read_only); + if (!m_open_fleet_detail_wnds[row_fleet]) { + FleetDetailWnd* fleet_wnd = new FleetDetailWnd(window_posn.x, window_posn.y, row_fleet, m_read_only); + m_open_fleet_detail_wnds[row_fleet] = fleet_wnd; if (GG::GUI::GetGUI()->AppWidth() < fleet_wnd->LowerRight().x) window_posn.x = GG::GUI::GetGUI()->AppWidth() - fleet_wnd->Width(); if (GG::GUI::GetGUI()->AppHeight() < fleet_wnd->LowerRight().y) window_posn.y = GG::GUI::GetGUI()->AppHeight() - fleet_wnd->Height(); fleet_wnd->MoveTo(window_posn); + m_open_fleet_detail_wnd_connections[fleet_wnd] = + GG::Connect(fleet_wnd->ClosingSignal, &FleetWnd::FleetDetailWndClosing, this); + GG::Connect(fleet_wnd->PanelEmptySignal, &FleetWnd::DeleteFleet, this); GG::GUI::GetGUI()->Register(fleet_wnd); - GG::Connect(fleet_wnd->ClosingSignal, &FleetWnd::FleetDetailWndClosing, this); } } @@ -892,83 +1003,11 @@ CloseClicked(); } -void FleetWnd::ObjectDroppedIntoList(int row_idx, GG::ListBox::Row* row) +void FleetWnd::FleetDetailWndClosing(Fleet* fleet) { - if (m_read_only) - throw GG::ListBox::DontAcceptDrop(); - - // disallow drops that aren't over an item; "- 1" is used, because the list - // is now 1 larger, since "row" was just dropped into it - if (row_idx < 0 || m_fleets_lb->NumRows() - 1 <= row_idx) - throw GG::ListBox::DontAcceptDrop(); - - FleetRow* fleet_row = dynamic_cast<FleetRow*>(row); - ShipRow* ship_row = fleet_row ? 0 : dynamic_cast<ShipRow*>(row); - - // disallow drops of unknown Row types - if (!ship_row && !fleet_row) - throw GG::ListBox::DontAcceptDrop(); - - if (row_idx == m_fleets_lb->NumRows() - 2) { // drop was into the new fleet row; "- 2" is used, because the list is now 1 larger, since the ShipRow was just dropped into it - if (ship_row) { - int ship_id = ship_row->ShipID(); - // special case: disallow drag-dropping a ship into the new fleet row when there is only 1, and only 1 fleet - if (m_fleets_lb->NumRows() == 3) { // if there is exactly one fleet in the window ("3" is used because there is also the new fleet row and the just-dropped ship - Ship* ship = GetUniverse().Object<Ship>(ship_id); - assert(ship->GetFleet()); - if (ship->GetFleet()->NumShips() == 1) - throw GG::ListBox::DontAcceptDrop(); - } - delete m_fleets_lb->Erase(row_idx); // remove the ship from the list, since it will be placed into a fleet - CreateNewFleetFromDrop(ship_id); - } else if (fleet_row) { // disallow drops of fleets onto the new fleet row - throw GG::ListBox::DontAcceptDrop(); - } - } else { // drop was onto some existing fleet - if (ship_row) { - Fleet* target_fleet = FleetInRow(row_idx + 1); - - if (!CanJoin(ship_row->m_ship, target_fleet)) - throw GG::ListBox::DontAcceptDrop(); - - delete m_fleets_lb->Erase(row_idx); // remove the ship from the list, since it will be placed into a fleet - HumanClientApp::Orders().IssueOrder(new FleetTransferOrder(HumanClientApp::GetApp()->EmpireID(), ship_row->m_ship->FleetID(), - target_fleet->ID(), std::vector<int>(1, ship_row->ShipID()))); - } else if (fleet_row) { - Fleet* target_fleet = FleetInRow(row_idx + 1); - - // disallow drops across fleet windows; fleets must be at the same location - if (target_fleet == fleet_row->m_fleet || target_fleet->X() != fleet_row->m_fleet->X() || target_fleet->Y() != fleet_row->m_fleet->Y()) - throw GG::ListBox::DontAcceptDrop(); - - delete m_fleets_lb->Erase(row_idx); // remove the fleet from the list; we don't want this duplicate lying about - std::vector<int> ships; - ships.insert(ships.end(), fleet_row->m_fleet->begin(), fleet_row->m_fleet->end()); - HumanClientApp::Orders().IssueOrder(new FleetTransferOrder(HumanClientApp::GetApp()->EmpireID(), fleet_row->FleetID(), - target_fleet->ID(), ships)); - } - } - - RemoveEmptyFleets(); + m_open_fleet_detail_wnds.erase(fleet); } -void FleetWnd::FleetDetailWndClosing(FleetDetailWnd* wnd) -{ - Fleet* fleet = wnd->GetFleetDetailPanel().GetFleet(); - - if (m_new_fleet_windows.find(wnd) != m_new_fleet_windows.end()) { - m_new_fleet_windows.erase(wnd); - } else { - m_open_fleet_windows.erase(fleet); - } - - if (fleet && !fleet->NumShips()) { - DeleteFleet(fleet); - } - - RemoveEmptyFleets(); -} - Fleet* FleetWnd::FleetInRow(int idx) const { FleetRow* fleet_row = dynamic_cast<FleetRow*>(&m_fleets_lb->GetRow(idx)); @@ -991,10 +1030,12 @@ if (m_fleet_detail_panel->GetFleet() == fleet) m_fleet_detail_panel->SetFleet(0); - std::map<Fleet*, FleetDetailWnd*>::iterator it = m_open_fleet_windows.find(fleet); - if (it != m_open_fleet_windows.end()) { + std::map<Fleet*, FleetDetailWnd*>::iterator it = m_open_fleet_detail_wnds.find(fleet); + if (it != m_open_fleet_detail_wnds.end()) { + m_open_fleet_detail_wnd_connections[it->second].disconnect(); delete it->second; - m_open_fleet_windows.erase(it); + m_open_fleet_detail_wnd_connections.erase(it->second); + m_open_fleet_detail_wnds.erase(it); } NotShowingFleetSignal(fleet); for (int i = 0; i < m_fleets_lb->NumRows(); ++i) { @@ -1006,37 +1047,32 @@ HumanClientApp::Orders().IssueOrder(new DeleteFleetOrder(HumanClientApp::GetApp()->EmpireID(), fleet->ID())); } -void FleetWnd::FleetPanelEmpty(Fleet* fleet) +void FleetWnd::CreateNewFleetFromDrops(Ship* first_ship, const std::vector<int>& ship_ids) { - DeleteFleet(fleet); -} + Fleet* some_existing_fleet = FleetInRow(0); -Fleet* FleetWnd::CreateNewFleetFromDrop(int ship_id) -{ - Fleet* existing_fleet = FleetInRow(0); - Ship *ship = GetUniverse().Object<Ship>(ship_id); + if (!some_existing_fleet || !first_ship || + some_existing_fleet->SystemID() != first_ship->GetFleet()->SystemID() || + some_existing_fleet->X() != first_ship->GetFleet()->X() || + some_existing_fleet->Y() != first_ship->GetFleet()->Y()) + return; - if (!existing_fleet || !ship || existing_fleet->SystemID() != ship->GetFleet()->SystemID()) - throw GG::ListBox::DontAcceptDrop(); + System* system = some_existing_fleet->GetSystem(); + double some_existing_fleet_x = some_existing_fleet->X(); + double some_existing_fleet_y = some_existing_fleet->Y(); - System* system = existing_fleet->GetSystem(); - double existing_fleet_x = existing_fleet->X(); - double existing_fleet_y = existing_fleet->Y(); - int empire_id = HumanClientApp::GetApp()->EmpireID(); int new_fleet_id = ClientApp::GetNewObjectID(); - if (new_fleet_id == UniverseObject::INVALID_OBJECT_ID) { ClientUI::MessageBox(UserString("SERVER_TIMEOUT"), true); - throw GG::ListBox::DontAcceptDrop(); + return; } std::string fleet_name = UserString("FW_NEW_FLEET_NAME") + boost::lexical_cast<std::string>(new_fleet_id); Fleet* new_fleet = 0; if (system) { - m_system_changed_connection.disconnect(); - HumanClientApp::Orders().IssueOrder(new NewFleetOrder(empire_id, fleet_name, new_fleet_id, system->ID(), ship_id)); + HumanClientApp::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) { @@ -1044,50 +1080,37 @@ break; } } - m_system_changed_connection = Connect(system->StateChangedSignal, &FleetWnd::SystemChangedSlot, this); } else { - HumanClientApp::Orders().IssueOrder(new NewFleetOrder(empire_id, fleet_name, new_fleet_id, existing_fleet_x, existing_fleet_y, ship_id)); + HumanClientApp::Orders().IssueOrder(new NewFleetOrder(empire_id, fleet_name, new_fleet_id, some_existing_fleet_x, some_existing_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() == existing_fleet_x && fleets[i]->Y() == existing_fleet_y) { + if (fleets[i]->Name() == fleet_name && fleets[i]->X() == some_existing_fleet_x && fleets[i]->Y() == some_existing_fleet_y) { new_fleet = fleets[i]; break; } } + AddFleet(new_fleet); } - - AddFleet(new_fleet); - - return new_fleet; } -void FleetWnd::RemoveEmptyFleets() +void FleetWnd::UniverseObjectDeleted(const UniverseObject *obj) { - // check for leftover empty fleets in fleet list - for (int i = m_fleets_lb->NumRows() - 1; i >= 0; --i) { - Fleet* current_fleet = 0; - if ((current_fleet = FleetInRow(i)) && !current_fleet->NumShips()) { - std::cout << "FleetWnd::RemoveEmptyFleets(): removing " << current_fleet->Name() << std::endl; - DeleteFleet(current_fleet); - } - } -} - -void FleetWnd::UniverseObjectDelete(const UniverseObject *obj) -{ - const Fleet *fleet; + const Fleet* fleet; // only look for obj if FleetWnd contains fleets and obj is a fleet - if ((m_open_fleet_windows.empty() && m_fleets_lb->NumRows() == (m_read_only ? 0 : 1)) - || !(fleet = universe_object_cast<const Fleet *>(obj))) + // TODO: change the 0 : 1 when the new fleet row is no longer a row + if ((m_open_fleet_detail_wnds.empty() && m_fleets_lb->NumRows() == (m_read_only ? 0 : 1)) || + !(fleet = universe_object_cast<const Fleet*>(obj))) return; if (m_fleet_detail_panel->GetFleet() == fleet) m_fleet_detail_panel->SetFleet(0); - for (std::map<Fleet*, FleetDetailWnd*>::iterator it = m_open_fleet_windows.begin(); it != m_open_fleet_windows.end(); ++it) { + for (std::map<Fleet*, FleetDetailWnd*>::iterator it = m_open_fleet_detail_wnds.begin(); it != m_open_fleet_detail_wnds.end(); ++it) { if (it->first == fleet) { + m_open_fleet_detail_wnd_connections[it->second].disconnect(); delete it->second; - m_open_fleet_windows.erase(it); + m_open_fleet_detail_wnd_connections.erase(it->second); + m_open_fleet_detail_wnds.erase(it); break; } } @@ -1099,6 +1122,8 @@ break; } } + + // TODO: CloseClicked() if the fleets lb is empty } void FleetWnd::SystemChangedSlot() Modified: trunk/FreeOrion/UI/FleetWindow.h =================================================================== --- trunk/FreeOrion/UI/FleetWindow.h 2006-01-22 22:53:16 UTC (rev 1705) +++ trunk/FreeOrion/UI/FleetWindow.h 2006-01-29 20:27:50 UTC (rev 1706) @@ -14,115 +14,45 @@ #include "MapWnd.h" #endif -class CUIButton; class CUIListBox; class Fleet; +class FleetDetailPanel; +class FleetsListBox; class Ship; class System; class UniverseObject; namespace GG { -class TextControl; + class TextControl; } -class FleetsWnd; - -class FleetDetailPanel : public GG::Wnd -{ -public: - /** \name Signal Types */ //@{ - typedef boost::signal<void (Fleet*)> PanelEmptySignalType; ///< emitted when the panel is empty (no ships) - typedef boost::signal<Fleet* (int)> NeedNewFleetSignalType; ///< emitted when ships are dragged and dropped into a null fleet - //@} - - /** \name Slot Types */ //@{ - typedef PanelEmptySignalType::slot_type PanelEmptySlotType; ///< type of functor(s) invoked on a PanelEmptySignalType - typedef NeedNewFleetSignalType::slot_type NeedNewFleetSlotType; ///< type of functor(s) invoked on a CreateNewFleetSignalType - //@} - - /** \name Structors */ //@{ - FleetDetailPanel(int x, int y, Fleet* fleet, bool read_only, Uint32 flags = 0); ///< ctor - virtual ~FleetDetailPanel(); - //@} - - /** \name Accessors */ //@{ - int GetShipIDOfListRow(int row_idx) const; ///< returns the ID number of the ship in row \a row_idx of the ships listbox - Fleet* GetFleet() const {return m_fleet;} ///< returns the currently-displayed fleet (may be 0) - - mutable PanelEmptySignalType PanelEmptySignal; - mutable NeedNewFleetSignalType NeedNewFleetSignal; - //@} - - //! \name Mutators //@{ - void SetFleet(Fleet* fleet); ///< sets the currently-displayed Fleet (may be null) - //@} - -protected: - //! \name Mutators //@{ - virtual void CloseClicked(); - //@} - -private: - void Init(); - void AttachSignalChildren(); - void DetachSignalChildren(); - void Refresh(); - void UniverseObjectDelete(const UniverseObject *); - - void ShipSelectionChanged(const std::set<int>& rows); - void ShipBrowsed(int row_idx); - void ShipDroppedIntoList(int row_idx, GG::ListBox::Row* row); - void ShipRightClicked(int row_idx, GG::ListBox::Row* row, const GG::Pt& pt); - std::string DestinationText() const; - std::string ShipStatusText(int ship_id) const; - - Fleet* m_fleet; - const bool m_read_only; - boost::signals::connection m_fleet_connection; - boost::signals::connection m_universe_object_delete_connection; - - GG::TextControl* m_destination_text; - CUIListBox* m_ships_lb; - GG::TextControl* m_ship_status_text; -}; - class FleetDetailWnd : public CUIWnd { public: /** \name Signal Types */ //@{ - typedef boost::signal<void (FleetDetailWnd*)> ClosingSignalType; ///< emitted when this window is about to close - typedef boost::signal<Fleet* (FleetDetailWnd*, int)> NeedNewFleetSignalType; ///< emitted when ships are dragged and dropped into a null fleet + typedef boost::signal<void (Fleet*)> ClosingSignalType; ///< emitted when the detail wnd is closing + typedef boost::signal<void (Fleet*)> PanelEmptySignalType; ///< emitted when the detail wnd's fleet detail panel is empty //@} /** \name Slot Types */ //@{ - typedef ClosingSignalType::slot_type ClosingSlotType; ///< type of functor(s) invoked on a ClosingSignalType - typedef NeedNewFleetSignalType::slot_type NeedNewFleetSlotType; ///< type of functor(s) invoked on a NeedNewFleetSignalType + typedef ClosingSignalType::slot_type ClosingSlotType; ///< type of functor(s) invoked on a ClosingSignalType + typedef PanelEmptySignalType::slot_type PanelEmptySlotType; ///< type of functor(s) invoked on a PanelEmptySignalType //@} /** \name Structors */ //@{ - FleetDetailWnd(int x, int y, Fleet* fleet, bool read_only, Uint32 flags = GG::CLICKABLE | GG::DRAGABLE | GG::ONTOP | CLOSABLE | MINIMIZABLE); ///< basic ctor - ~FleetDetailWnd(); ///< dtor + FleetDetailWnd(int x, int y, Fleet* fleet, bool read_only, Uint32 flags = GG::CLICKABLE | GG::DRAGABLE | GG::RESIZABLE | GG::ONTOP | CLOSABLE | MINIMIZABLE); ///< basic ctor + ~FleetDetailWnd(); ///< virtual dtor //@} - //! \name Accessors //@{ - FleetDetailPanel& GetFleetDetailPanel() const {return *m_fleet_panel;} ///< returns the internally-held fleet panel for theis window + void CloseClicked(); - mutable NeedNewFleetSignalType NeedNewFleetSignal; - mutable ClosingSignalType ClosingSignal; - //@} + mutable ClosingSignalType ClosingSignal; + mutable PanelEmptySignalType PanelEmptySignal; -protected: - //! \name Mutators //@{ - virtual void CloseClicked(); - //@} - private: - Fleet* PanelNeedsNewFleet(int ship_id) {return NeedNewFleetSignal(this, ship_id);} - void AttachSignalChildren(); - void DetachSignalChildren(); std::string TitleText() const; - FleetDetailPanel* m_fleet_panel; + FleetDetailPanel* m_fleet_panel; }; @@ -145,9 +75,9 @@ ~FleetWnd(); ///< dtor //@} - //! \name Mutators //@{ - mutable ShowingFleetSignalType ShowingFleetSignal; - mutable NotShowingFleetSignalType NotShowingFleetSignal; + //! \name Accessors //@{ + int SystemID() const; + bool ContainsFleet(int fleet_id) const; //@} //! \name Mutators //@{ @@ -155,17 +85,17 @@ 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 //@} - - int SystemID() const {return m_system_id;} - bool ContainsFleet(int fleet_id) const; + mutable ShowingFleetSignalType ShowingFleetSignal; + mutable NotShowingFleetSignalType NotShowingFleetSignal; + 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 (); + static FleetWndItr FleetWndEnd(); protected: //! \name Mutators //@{ @@ -174,23 +104,18 @@ private: void Init(const std::vector<Fleet*>& fleet_ids, int selected_fleet); - void AttachSignalChildren(); - void DetachSignalChildren(); - void FleetBrowsed(int row_idx); 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 ObjectDroppedIntoList(int row_idx, GG::ListBox::Row* row); void NewFleetButtonClicked(); - void FleetDetailWndClosing(FleetDetailWnd* wnd); + void FleetDetailWndClosing(Fleet* fleet); Fleet* FleetInRow(int idx) const; std::string TitleText() const; void FleetPanelEmpty(Fleet* fleet); void DeleteFleet(Fleet* fleet); - Fleet* CreateNewFleetFromDrop(int ship_id); - void RemoveEmptyFleets(); - void UniverseObjectDelete(const UniverseObject *); + void CreateNewFleetFromDrops(Ship* first_ship, const std::vector<int>& ship_ids); + void UniverseObjectDeleted(const UniverseObject *); void SystemChangedSlot(); const int m_empire_id; @@ -200,13 +125,12 @@ int m_current_fleet; - std::map<Fleet*, FleetDetailWnd*> m_open_fleet_windows; - std::set<FleetDetailWnd*> m_new_fleet_windows; + std::map<Fleet*, FleetDetailWnd*> m_open_fleet_detail_wnds; + std::map<FleetDetailWnd*, boost::signals::connection> m_open_fleet_detail_wnd_connections; - CUIListBox* m_fleets_lb; + FleetsListBox* m_fleets_lb; FleetDetailPanel* m_fleet_detail_panel; - boost::signals::connection m_universe_object_delete_connection; boost::signals::connection m_lb_delete_connection; boost::signals::connection m_system_changed_connection; @@ -218,4 +142,3 @@ {return std::pair<std::string, std::string>("$RCSfile$", "$Revision$");} #endif // _FleetWindow_h_ - Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2006-01-22 22:53:16 UTC (rev 1705) +++ trunk/FreeOrion/UI/MapWnd.cpp 2006-01-29 20:27:50 UTC (rev 1706) @@ -136,6 +136,12 @@ ClientUI::GetClientUI()->GetMapWnd()->RemovePopup( this ); } +void MapWndPopup::CloseClicked() +{ + CUIWnd::CloseClicked(); + delete this; +} + void MapWndPopup::Close( ) { // close window as though it's been clicked closed by the user. Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2006-01-22 22:53:16 UTC (rev 1705) +++ trunk/FreeOrion/UI/MapWnd.h 2006-01-29 20:27:50 UTC (rev 1706) @@ -204,9 +204,11 @@ public: MapWndPopup( const std::string& t, int x, int y, int h, int w, Uint32 flags ); MapWndPopup(const XMLElement& elem); - virtual ~MapWndPopup( ); + virtual ~MapWndPopup(); - void Close( ); //!< closes the MapWndPopup + void CloseClicked(); + + void Close(); //!< closes the MapWndPopup }; inline std::pair<std::string, std::string> MapWndRevision() Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2006-01-22 22:53:16 UTC (rev 1705) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2006-01-29 20:27:50 UTC (rev 1706) @@ -148,18 +148,18 @@ CUIWnd(UserString("PRODUCTION_WND_TITLE"), 0, 0, w, h, GG::CLICKABLE | GG::ONTOP), m_production_info_panel(0), m_queue_lb(0), - m_buid_designator_wnd(0) + m_build_designator_wnd(0) { m_production_info_panel = new ProductionInfoPanel(PRODUCTION_INFO_AND_QUEUE_WIDTH, 200, UserString("PRODUCTION_INFO_PANEL_TITLE"), UserString("PRODUCTION_INFO_PP"), OUTER_LINE_THICKNESS, ClientUI::KNOWN_TECH_FILL_COLOR, ClientUI::KNOWN_TECH_TEXT_AND_BORDER_COLOR); m_queue_lb = new CUIListBox(2, m_production_info_panel->LowerRight().y, m_production_info_panel->Width() - 4, ClientSize().y - 4 - m_production_info_panel->Height()); m_queue_lb->SetStyle(GG::LB_NOSORT | GG::LB_NOSEL | GG::LB_USERDELETE); GG::Pt buid_designator_wnd_size = ClientSize() - GG::Pt(m_production_info_panel->Width() + 6, 6); - m_buid_designator_wnd = new BuildDesignatorWnd(buid_designator_wnd_size.x, buid_designator_wnd_size.y); - m_buid_designator_wnd->MoveTo(GG::Pt(m_production_info_panel->Width() + 3, 3)); + m_build_designator_wnd = new BuildDesignatorWnd(buid_designator_wnd_size.x, buid_designator_wnd_size.y); + m_build_designator_wnd->MoveTo(GG::Pt(m_production_info_panel->Width() + 3, 3)); - GG::Connect(m_buid_designator_wnd->AddBuildToQueueSignal, &ProductionWnd::AddBuildToQueueSlot, this); - GG::Connect(m_buid_designator_wnd->BuildQuantityChangedSignal, &ProductionWnd::ChangeBuildQuantitySlot, this); + GG::Connect(m_build_designator_wnd->AddBuildToQueueSignal, &ProductionWnd::AddBuildToQueueSlot, this); + GG::Connect(m_build_designator_wnd->BuildQuantityChangedSignal, &ProductionWnd::ChangeBuildQuantitySlot, this); GG::Connect(m_queue_lb->DroppedSignal, &ProductionWnd::QueueItemMovedSlot, this); GG::Connect(m_queue_lb->ErasedSignal, &ProductionWnd::QueueItemDeletedSlot, this); GG::Connect(m_queue_lb->LeftClickedSignal, &ProductionWnd::QueueItemClickedSlot, this); @@ -167,7 +167,7 @@ AttachChild(m_production_info_panel); AttachChild(m_queue_lb); - AttachChild(m_buid_designator_wnd); + AttachChild(m_build_designator_wnd); } GG::Pt ProductionWnd::ClientUpperLeft() const @@ -182,19 +182,19 @@ bool ProductionWnd::InWindow(const GG::Pt& pt) const { - GG::Rect clip_rect = m_buid_designator_wnd->MapViewHole() + m_buid_designator_wnd->UpperLeft(); - return clip_rect.Contains(pt) ? m_buid_designator_wnd->InWindow(pt) : CUIWnd::InWindow(pt); + GG::Rect clip_rect = m_build_designator_wnd->MapViewHole() + m_build_designator_wnd->UpperLeft(); + return clip_rect.Contains(pt) ? m_build_designator_wnd->InWindow(pt) : CUIWnd::InWindow(pt); } bool ProductionWnd::InClient(const GG::Pt& pt) const { - GG::Rect clip_rect = m_buid_designator_wnd->MapViewHole() + m_buid_designator_wnd->UpperLeft(); - return clip_rect.Contains(pt) ? m_buid_designator_wnd->InClient(pt) : CUIWnd::InClient(pt); + GG::Rect clip_rect = m_build_designator_wnd->MapViewHole() + m_build_designator_wnd->UpperLeft(); + return clip_rect.Contains(pt) ? m_build_designator_wnd->InClient(pt) : CUIWnd::InClient(pt); } void ProductionWnd::Render() { - GG::Rect clip_rect = m_buid_designator_wnd->MapViewHole() + m_buid_designator_wnd->UpperLeft(); + GG::Rect clip_rect = m_build_designator_wnd->MapViewHole() + m_build_designator_wnd->UpperLeft(); GG::Pt ul = UpperLeft(); GG::Pt lr = LowerRight(); GG::Pt cl_ul = ul + GG::Pt(BORDER_LEFT, BORDER_TOP); @@ -284,22 +284,22 @@ ResetInfoPanel(); UpdateQueue(); m_queue_lb->BringRowIntoView(0); - m_buid_designator_wnd->Reset(); + m_build_designator_wnd->Reset(); } void ProductionWnd::CenterOnBuild(int queue_idx) { - m_buid_designator_wnd->CenterOnBuild(queue_idx); + m_build_designator_wnd->CenterOnBuild(queue_idx); } void ProductionWnd::SelectSystem(int system) { - m_buid_designator_wnd->SelectSystem(system); + m_build_designator_wnd->SelectSystem(system); } void ProductionWnd::Sanitize() { - m_buid_designator_wnd->Clear(); + m_build_designator_wnd->Clear(); } void ProductionWnd::UpdateQueue() @@ -335,7 +335,7 @@ HumanClientApp::Orders().IssueOrder(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), build_type, name, number, location)); UpdateQueue(); ResetInfoPanel(); - m_buid_designator_wnd->CenterOnBuild(m_queue_lb->NumRows() - 1); + m_build_designator_wnd->CenterOnBuild(m_queue_lb->NumRows() - 1); } void ProductionWnd::ChangeBuildQuantitySlot(int queue_idx, int quantity) @@ -350,10 +350,10 @@ HumanClientApp::Orders().IssueOrder(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), row_idx)); UpdateQueue(); ResetInfoPanel(); - if (row_idx == m_buid_designator_wnd->QueueIndexShown()) { - m_buid_designator_wnd->CenterOnBuild(-1); - } else if (row_idx < m_buid_designator_wnd->QueueIndexShown()) { - m_buid_designator_wnd->CenterOnBuild(m_buid_designator_wnd->QueueIndexShown() - 1); + if (row_idx == m_build_designator_wnd->QueueIndexShown()) { + m_build_designator_wnd->CenterOnBuild(-1); + } else if (row_idx < m_build_designator_wnd->QueueIndexShown()) { + m_build_designator_wnd->CenterOnBuild(m_build_designator_wnd->QueueIndexShown() - 1); } } @@ -366,7 +366,7 @@ void ProductionWnd::QueueItemClickedSlot(int row_idx, GG::ListBox::Row* row, const GG::Pt& pt) { - m_buid_designator_wnd->CenterOnBuild(row_idx); + m_build_designator_wnd->CenterOnBuild(row_idx); } void ProductionWnd::QueueItemDoubleClickedSlot(int row_idx, GG::ListBox::Row* row) Modified: trunk/FreeOrion/UI/ProductionWnd.h =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.h 2006-01-22 22:53:16 UTC (rev 1705) +++ trunk/FreeOrion/UI/ProductionWnd.h 2006-01-29 20:27:50 UTC (rev 1706) @@ -44,7 +44,7 @@ ProductionInfoPanel* m_production_info_panel; CUIListBox* m_queue_lb; - BuildDesignatorWnd* m_buid_designator_wnd; + BuildDesignatorWnd* m_build_designator_wnd; }; inline std::pair<std::string, std::string> ProductionWndRevision() Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2006-01-22 22:53:16 UTC (rev 1705) +++ trunk/FreeOrion/server/ServerApp.cpp 2006-01-29 20:27:50 UTC (rev 1706) @@ -1911,7 +1911,19 @@ m_network_core.SendMessage(TurnProgressMessage( player_it->first, Message::FLEET_MOVEMENT, -1)); for (Universe::const_iterator it = GetUniverse().begin(); it != GetUniverse().end(); ++it) + { + if (Fleet* fleet = dynamic_cast<Fleet*>(it->second)) { + std::cerr << "[PRE MOVE] Fleet \"" << fleet->Name() << "\"'s owner: " + << *it->second->Owners().begin() + << std::endl; + } it->second->MovementPhase(); + if (Fleet* fleet = dynamic_cast<Fleet*>(it->second)) { + std::cerr << "[POST MOVE] Fleet \"" << fleet->Name() << "\"'s owner: " + << *it->second->Owners().begin() + << std::endl; + } + } // find planets which have starved to death @@ -2003,6 +2015,11 @@ GetUniverse().RebuildEmpireViewSystemGraphs(); for (Universe::const_iterator it = GetUniverse().begin(); it != GetUniverse().end(); ++it) { + if (Fleet* fleet = dynamic_cast<Fleet*>(it->second)) { + std::cerr << "[PRE GROWTH] Fleet \"" << fleet->Name() << "\"'s owner: " + << *it->second->Owners().begin() + << std::endl; + } it->second->PopGrowthProductionResearchPhase(); it->second->ClampMeters(); for (MeterType i = MeterType(0); i != NUM_METER_TYPES; i = MeterType(i + 1)) { Modified: trunk/FreeOrion/universe/UniverseObject.h =================================================================== --- trunk/FreeOrion/universe/UniverseObject.h 2006-01-22 22:53:16 UTC (rev 1705) +++ trunk/FreeOrion/universe/UniverseObject.h 2006-01-29 20:27:50 UTC (rev 1706) @@ -56,7 +56,7 @@ /** \name Structors */ //@{ UniverseObject(); ///< default ctor - + /** general ctor. \throw std::invalid_argument May throw std::invalid_argument if the either x or y coordinate is outside the map area.*/ Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2006-01-22 22:53:16 UTC (rev 1705) +++ trunk/FreeOrion/util/Order.cpp 2006-01-29 20:27:50 UTC (rev 1706) @@ -19,6 +19,12 @@ using boost::lexical_cast; using std::vector; +#define DEBUG_CREATE_FLEET_ORDER 0 +#define DEBUG_FLEET_MOVE_ORDER 0 +#if DEBUG_CREATE_FLEET_ORDER || DEBUG_FLEET_MOVE_ORDER +# include <iostream> +#endif + // TEMPORARY! This should go into some sort of external // XML file that the server uses for game rules like this // I will be coding such a class in the near future -- jbarcz1 @@ -68,7 +74,7 @@ void Order::ValidateEmpireID() const { EmpireManager* empire = &Empires(); - if(empire->Lookup(EmpireID()) == NULL) + if (empire->Lookup(EmpireID()) == NULL) { throw std::runtime_error("Invalid empire ID specified for order."); } @@ -183,27 +189,58 @@ m_position = std::make_pair(lexical_cast<double>(elem.Child("m_position").Child("x"... [truncated message content] |
From: <tz...@us...> - 2006-01-30 01:32:40
|
Revision: 1707 Author: tzlaine Date: 2006-01-29 17:32:26 -0800 (Sun, 29 Jan 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1707&view=rev Log Message: ----------- Changed the construction of RadioButtonGroups in MultiplayerLobbyWnd and TechWnd to accomodate the recent change to RadioButtonGroup in GG. Modified Paths: -------------- trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp trunk/FreeOrion/UI/ServerConnectWnd.cpp trunk/FreeOrion/UI/TechWnd.cpp Modified: trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp 2006-01-29 20:27:50 UTC (rev 1706) +++ trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp 2006-01-30 01:32:26 UTC (rev 1707) @@ -155,10 +155,15 @@ m_galaxy_setup_panel = new GalaxySetupPanel(CHAT_WIDTH + 2 * CONTROL_MARGIN, RADIO_BN_HT, GALAXY_SETUP_PANEL_WIDTH); - m_new_load_game_buttons = new GG::RadioButtonGroup(CHAT_WIDTH + CONTROL_MARGIN, CONTROL_MARGIN, m_galaxy_setup_panel->LowerRight().y + 100, 2 * RADIO_BN_HT, GG::VERTICAL); - m_new_load_game_buttons->AddButton(new CUIStateButton(0, 0, 100, RADIO_BN_HT, UserString("NEW_GAME_BN"), GG::TF_LEFT, CUIStateButton::SBSTYLE_CUI_RADIO_BUTTON)); - m_new_load_game_buttons->AddButton(new CUIStateButton(0, m_galaxy_setup_panel->LowerRight().y, 100, RADIO_BN_HT, UserString("LOAD_GAME_BN"), - GG::TF_LEFT, CUIStateButton::SBSTYLE_CUI_RADIO_BUTTON)); + m_new_load_game_buttons = + new GG::RadioButtonGroup(CHAT_WIDTH + CONTROL_MARGIN, CONTROL_MARGIN, + m_galaxy_setup_panel->LowerRight().y + 100, m_galaxy_setup_panel->LowerRight().y + RADIO_BN_HT - CONTROL_MARGIN, + GG::VERTICAL); + m_new_load_game_buttons->AddButton( + new CUIStateButton(0, 0, 100, RADIO_BN_HT, UserString("NEW_GAME_BN"), GG::TF_LEFT, CUIStateButton::SBSTYLE_CUI_RADIO_BUTTON)); + m_new_load_game_buttons->AddButton( + new CUIStateButton(0, 0, 100, RADIO_BN_HT, UserString("LOAD_GAME_BN"), + GG::TF_LEFT, CUIStateButton::SBSTYLE_CUI_RADIO_BUTTON)); m_saved_games_list = new CUIDropDownList(CHAT_WIDTH + 2 * CONTROL_MARGIN, m_new_load_game_buttons->LowerRight().y + CONTROL_MARGIN, GALAXY_SETUP_PANEL_WIDTH, SAVED_GAMES_LIST_ROW_HEIGHT, SAVED_GAMES_LIST_DROP_HEIGHT); @@ -178,7 +183,8 @@ m_cancel_bn = new CUIButton(0, 0, 125, UserString("CANCEL")); m_cancel_bn->MoveTo(GG::Pt(ClientWidth() - m_cancel_bn->Width() - CONTROL_MARGIN, ClientHeight() - m_cancel_bn->Height() - CONTROL_MARGIN)); if (m_host) - m_start_game_bn->MoveTo(GG::Pt(m_cancel_bn->UpperLeft().x - CONTROL_MARGIN - m_start_game_bn->Width(), ClientHeight() - m_cancel_bn->Height() - CONTROL_MARGIN)); + m_start_game_bn->MoveTo(GG::Pt(m_cancel_bn->UpperLeft().x - CONTROL_MARGIN - m_start_game_bn->Width(), + ClientHeight() - m_cancel_bn->Height() - CONTROL_MARGIN)); Init(); Modified: trunk/FreeOrion/UI/ServerConnectWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ServerConnectWnd.cpp 2006-01-29 20:27:50 UTC (rev 1706) +++ trunk/FreeOrion/UI/ServerConnectWnd.cpp 2006-01-30 01:32:26 UTC (rev 1707) @@ -54,10 +54,9 @@ 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, ""); - GG::TextControl* temp = 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::TEXT_COLOR); - AttachChild(temp); + 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::TEXT_COLOR)); 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); Modified: trunk/FreeOrion/UI/TechWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechWnd.cpp 2006-01-29 20:27:50 UTC (rev 1706) +++ trunk/FreeOrion/UI/TechWnd.cpp 2006-01-30 01:32:26 UTC (rev 1707) @@ -1640,22 +1640,15 @@ font->TextExtent(UserString("TECH_WND_TECH_TYPES_THEORIES_ONLY")).x + RADIO_BUTTON_MARGIN; m_tech_type_buttons = new GG::RadioButtonGroup(button_start, h - LAYOUT_MARGIN_BOTTOM, total_text_width, LAYOUT_MARGIN_BOTTOM / 2, GG::HORIZONTAL); AttachChild(tech_types_to_show_label); - int accum = 0; text_width = font->TextExtent(UserString("TECH_WND_TECH_TYPES_ALL")).x + RADIO_BUTTON_MARGIN; - CUIStateButton* button = new CUIStateButton(accum, 0, text_width, LAYOUT_MARGIN_BOTTOM / 2, UserString("TECH_WND_TECH_TYPES_ALL"), GG::TF_LEFT, CUIStateButton::SBSTYLE_CUI_RADIO_BUTTON); + CUIStateButton* button = new CUIStateButton(0, 0, text_width, LAYOUT_MARGIN_BOTTOM / 2, UserString("TECH_WND_TECH_TYPES_ALL"), GG::TF_LEFT, CUIStateButton::SBSTYLE_CUI_RADIO_BUTTON); m_tech_type_buttons->AddButton(button); - GG::Layout* layout = m_tech_type_buttons->GetLayout(); - layout->SetColumnStretch(0, text_width); - accum += text_width; text_width = font->TextExtent(UserString("TECH_WND_TECH_TYPES_THEORIES_AND_APPS")).x + RADIO_BUTTON_MARGIN; - button = new CUIStateButton(accum, 0, text_width, LAYOUT_MARGIN_BOTTOM / 2, UserString("TECH_WND_TECH_TYPES_THEORIES_AND_APPS"), GG::TF_LEFT, CUIStateButton::SBSTYLE_CUI_RADIO_BUTTON); + button = new CUIStateButton(0, 0, text_width, LAYOUT_MARGIN_BOTTOM / 2, UserString("TECH_WND_TECH_TYPES_THEORIES_AND_APPS"), GG::TF_LEFT, CUIStateButton::SBSTYLE_CUI_RADIO_BUTTON); m_tech_type_buttons->AddButton(button); - layout->SetColumnStretch(1, text_width); - accum += text_width; text_width = font->TextExtent(UserString("TECH_WND_TECH_TYPES_THEORIES_ONLY")).x + RADIO_BUTTON_MARGIN; - button = new CUIStateButton(accum, 0, text_width, LAYOUT_MARGIN_BOTTOM / 2, UserString("TECH_WND_TECH_TYPES_THEORIES_ONLY"), GG::TF_LEFT, CUIStateButton::SBSTYLE_CUI_RADIO_BUTTON); + button = new CUIStateButton(0, 0, text_width, LAYOUT_MARGIN_BOTTOM / 2, UserString("TECH_WND_TECH_TYPES_THEORIES_ONLY"), GG::TF_LEFT, CUIStateButton::SBSTYLE_CUI_RADIO_BUTTON); m_tech_type_buttons->AddButton(button); - layout->SetColumnStretch(2, text_width); m_tech_type_buttons->SetCheck(0); GG::Connect(m_tech_type_buttons->ButtonChangedSignal, &TechTreeWnd::TechTypesShownSlot, this); @@ -1670,22 +1663,15 @@ font->TextExtent(UserString("TECH_WND_TECH_STATUS_AVAILABLE_ONLY")).x + RADIO_BUTTON_MARGIN; m_tech_status_buttons = new GG::RadioButtonGroup(button_start, h - LAYOUT_MARGIN_BOTTOM / 2, total_text_width, LAYOUT_MARGIN_BOTTOM / 2, GG::HORIZONTAL); AttachChild(tech_statuses_to_show_label); - accum = 0; text_width = font->TextExtent(UserString("TECH_WND_TECH_STATUS_ALL")).x + RADIO_BUTTON_MARGIN; - button = new CUIStateButton(accum, 0, text_width, LAYOUT_MARGIN_BOTTOM / 2, UserString("TECH_WND_TECH_STATUS_ALL"), GG::TF_LEFT, CUIStateButton::SBSTYLE_CUI_RADIO_BUTTON); + button = new CUIStateButton(0, 0, text_width, LAYOUT_MARGIN_BOTTOM / 2, UserString("TECH_WND_TECH_STATUS_ALL"), GG::TF_LEFT, CUIStateButton::SBSTYLE_CUI_RADIO_BUTTON); m_tech_status_buttons->AddButton(button); - layout = m_tech_status_buttons->GetLayout(); - layout->SetColumnStretch(0, text_width); - accum += text_width; text_width = font->TextExtent(UserString("TECH_WND_TECH_STATUS_AVAILABLE_AND_COMPLETE")).x + RADIO_BUTTON_MARGIN; - button = new CUIStateButton(accum, 0, text_width, LAYOUT_MARGIN_BOTTOM / 2, UserString("TECH_WND_TECH_STATUS_AVAILABLE_AND_COMPLETE"), GG::TF_LEFT, CUIStateButton::SBSTYLE_CUI_RADIO_BUTTON); + button = new CUIStateButton(0, 0, text_width, LAYOUT_MARGIN_BOTTOM / 2, UserString("TECH_WND_TECH_STATUS_AVAILABLE_AND_COMPLETE"), GG::TF_LEFT, CUIStateButton::SBSTYLE_CUI_RADIO_BUTTON); m_tech_status_buttons->AddButton(button); - layout->SetColumnStretch(1, text_width); - accum += text_width; text_width = font->TextExtent(UserString("TECH_WND_TECH_STATUS_AVAILABLE_ONLY")).x + RADIO_BUTTON_MARGIN; - button = new CUIStateButton(accum, 0, text_width, LAYOUT_MARGIN_BOTTOM / 2, UserString("TECH_WND_TECH_STATUS_AVAILABLE_ONLY"), GG::TF_LEFT, CUIStateButton::SBSTYLE_CUI_RADIO_BUTTON); + button = new CUIStateButton(0, 0, text_width, LAYOUT_MARGIN_BOTTOM / 2, UserString("TECH_WND_TECH_STATUS_AVAILABLE_ONLY"), GG::TF_LEFT, CUIStateButton::SBSTYLE_CUI_RADIO_BUTTON); m_tech_status_buttons->AddButton(button); - layout->SetColumnStretch(2, text_width); m_tech_status_buttons->SetCheck(0); GG::Connect(m_tech_status_buttons->ButtonChangedSignal, &TechTreeWnd::TechStatusesShownSlot, this); |
From: <tz...@us...> - 2006-01-30 01:52:54
|
Revision: 1708 Author: tzlaine Date: 2006-01-29 17:52:07 -0800 (Sun, 29 Jan 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1708&view=rev Log Message: ----------- Changed Keypress() to KeyPress(), the new name for the function in GG. Modified Paths: -------------- trunk/FreeOrion/UI/About.cpp trunk/FreeOrion/UI/About.h trunk/FreeOrion/UI/CUIWnd.cpp trunk/FreeOrion/UI/CUIWnd.h trunk/FreeOrion/UI/GalaxySetupWnd.cpp trunk/FreeOrion/UI/GalaxySetupWnd.h trunk/FreeOrion/UI/InGameMenu.cpp trunk/FreeOrion/UI/InGameMenu.h trunk/FreeOrion/UI/IntroScreen.cpp trunk/FreeOrion/UI/IntroScreen.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp trunk/FreeOrion/UI/MultiplayerLobbyWnd.h trunk/FreeOrion/UI/OptionsWnd.cpp trunk/FreeOrion/UI/OptionsWnd.h trunk/FreeOrion/UI/ServerConnectWnd.cpp trunk/FreeOrion/UI/ServerConnectWnd.h trunk/FreeOrion/UI/SitRepPanel.cpp trunk/FreeOrion/UI/SitRepPanel.h Modified: trunk/FreeOrion/UI/About.cpp =================================================================== --- trunk/FreeOrion/UI/About.cpp 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/About.cpp 2006-01-30 01:52:07 UTC (rev 1708) @@ -85,7 +85,7 @@ CUIWnd::Render(); } -void About::Keypress (GG::Key key, Uint32 key_mods) +void About::KeyPress (GG::Key key, Uint32 key_mods) { if ((key == GG::GGK_RETURN) || (key == GG::GGK_ESCAPE)) // Same behaviour as if "done" was pressed { Modified: trunk/FreeOrion/UI/About.h =================================================================== --- trunk/FreeOrion/UI/About.h 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/About.h 2006-01-30 01:52:07 UTC (rev 1708) @@ -52,7 +52,7 @@ //! \name Mutators //!@{ virtual void Render(); //!< drawing code - virtual void Keypress (GG::Key key, Uint32 key_mods); + virtual void KeyPress (GG::Key key, Uint32 key_mods); //!@} Modified: trunk/FreeOrion/UI/CUIWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CUIWnd.cpp 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/CUIWnd.cpp 2006-01-30 01:52:07 UTC (rev 1708) @@ -430,7 +430,7 @@ GG::GUI::GetGUI()->SetFocusWnd(m_edit); } -void CUIEditWnd::Keypress(GG::Key key, Uint32 key_mods) +void CUIEditWnd::KeyPress(GG::Key key, Uint32 key_mods) { switch (key) { case GG::GGK_RETURN: if (!m_ok_bn->Disabled()) OkClicked(); break; Modified: trunk/FreeOrion/UI/CUIWnd.h =================================================================== --- trunk/FreeOrion/UI/CUIWnd.h 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/CUIWnd.h 2006-01-30 01:52:07 UTC (rev 1708) @@ -164,7 +164,7 @@ CUIEditWnd(int w, const std::string& prompt_text, const std::string& edit_text, Uint32 flags = GG::MODAL); virtual void ModalInit(); - virtual void Keypress(GG::Key key, Uint32 key_mods); + virtual void KeyPress(GG::Key key, Uint32 key_mods); const std::string& Result() const; Modified: trunk/FreeOrion/UI/GalaxySetupWnd.cpp =================================================================== --- trunk/FreeOrion/UI/GalaxySetupWnd.cpp 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/GalaxySetupWnd.cpp 2006-01-30 01:52:07 UTC (rev 1708) @@ -305,7 +305,7 @@ ClientUpperLeft().y + m_preview_ul.y + PREVIEW_SZ.y + 2, GG::CLR_BLACK, ClientUI::WND_INNER_BORDER_COLOR, 1); } -void GalaxySetupWnd::Keypress (GG::Key key, Uint32 key_mods) +void GalaxySetupWnd::KeyPress (GG::Key key, Uint32 key_mods) { if (!m_ok->Disabled() && (key == GG::GGK_RETURN || key == GG::GGK_KP_ENTER)) // Same behaviour as if "OK" was pressed OkClicked(); Modified: trunk/FreeOrion/UI/GalaxySetupWnd.h =================================================================== --- trunk/FreeOrion/UI/GalaxySetupWnd.h 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/GalaxySetupWnd.h 2006-01-30 01:52:07 UTC (rev 1708) @@ -109,7 +109,7 @@ /** \name Mutators*/ //!@{ virtual void Render(); //!< drawing code - virtual void Keypress (GG::Key key, Uint32 key_mods); + virtual void KeyPress (GG::Key key, Uint32 key_mods); //!@} private: Modified: trunk/FreeOrion/UI/InGameMenu.cpp =================================================================== --- trunk/FreeOrion/UI/InGameMenu.cpp 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/InGameMenu.cpp 2006-01-30 01:52:07 UTC (rev 1708) @@ -69,7 +69,7 @@ CUIWnd::Render(); } -void InGameMenu::Keypress (GG::Key key, Uint32 key_mods) +void InGameMenu::KeyPress (GG::Key key, Uint32 key_mods) { if (key == GG::GGK_RETURN || key == GG::GGK_ESCAPE || key == GG::GGK_F10) // Same behaviour as if "done" was pressed Done(); Modified: trunk/FreeOrion/UI/InGameMenu.h =================================================================== --- trunk/FreeOrion/UI/InGameMenu.h 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/InGameMenu.h 2006-01-30 01:52:07 UTC (rev 1708) @@ -19,7 +19,7 @@ /** \name Mutators */ //@{ virtual void Render(); - virtual void Keypress (GG::Key key, Uint32 key_mods); + virtual void KeyPress (GG::Key key, Uint32 key_mods); //@} protected: Modified: trunk/FreeOrion/UI/IntroScreen.cpp =================================================================== --- trunk/FreeOrion/UI/IntroScreen.cpp 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/IntroScreen.cpp 2006-01-30 01:52:07 UTC (rev 1708) @@ -370,7 +370,7 @@ GG::GUI::GetGUI()->Exit(0); // exit with 0, good error code } -void IntroScreen::Keypress (GG::Key key, Uint32 key_mods) +void IntroScreen::KeyPress (GG::Key key, Uint32 key_mods) { if (key == GG::GGK_ESCAPE) // Same behaviour as if "done" was pressed OnExitGame(); Modified: trunk/FreeOrion/UI/IntroScreen.h =================================================================== --- trunk/FreeOrion/UI/IntroScreen.h 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/IntroScreen.h 2006-01-30 01:52:07 UTC (rev 1708) @@ -36,7 +36,7 @@ void OnAbout(); //!< called when about is clicked void OnCredits(); //!< called when credits is clicked void OnExitGame(); //!< called when exit_game is clicked - virtual void Keypress (GG::Key key, Uint32 key_mods); + virtual void KeyPress (GG::Key key, Uint32 key_mods); virtual void Close() {OnExitGame();} //!< override to exit the game //!@} Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/MapWnd.cpp 2006-01-30 01:52:07 UTC (rev 1708) @@ -374,7 +374,7 @@ } } -void MapWnd::Keypress (GG::Key key, Uint32 key_mods) +void MapWnd::KeyPress (GG::Key key, Uint32 key_mods) { switch (key) { case GG::GGK_TAB: { // auto-complete current chat edit word Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/MapWnd.h 2006-01-30 01:52:07 UTC (rev 1708) @@ -60,7 +60,7 @@ //! \name Mutators //!@{ virtual void Render(); - virtual void Keypress (GG::Key key, Uint32 key_mods); + virtual void KeyPress (GG::Key key, Uint32 key_mods); virtual void LButtonDown(const GG::Pt& pt, Uint32 keys); virtual void LDrag(const GG::Pt& pt, const GG::Pt& move, Uint32 keys); virtual void LButtonUp(const GG::Pt& pt, Uint32 keys); Modified: trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/MultiplayerLobbyWnd.cpp 2006-01-30 01:52:07 UTC (rev 1708) @@ -217,7 +217,7 @@ GG::CLR_BLACK, ClientUI::WND_INNER_BORDER_COLOR, 1); } -void MultiplayerLobbyWnd::Keypress(GG::Key key, Uint32 key_mods) +void MultiplayerLobbyWnd::KeyPress(GG::Key key, Uint32 key_mods) { if ((key == GG::GGK_RETURN || key == GG::GGK_KP_ENTER) && GG::GUI::GetGUI()->FocusWnd() == m_chat_input_edit) { int receiver = -1; // all players by default Modified: trunk/FreeOrion/UI/MultiplayerLobbyWnd.h =================================================================== --- trunk/FreeOrion/UI/MultiplayerLobbyWnd.h 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/MultiplayerLobbyWnd.h 2006-01-30 01:52:07 UTC (rev 1708) @@ -40,7 +40,7 @@ /** \name Mutators */ //@{ virtual void Render(); - virtual void Keypress(GG::Key key, Uint32 key_mods); + virtual void KeyPress(GG::Key key, Uint32 key_mods); void HandleMessage(const Message& msg); void Cancel() {CancelClicked();} Modified: trunk/FreeOrion/UI/OptionsWnd.cpp =================================================================== --- trunk/FreeOrion/UI/OptionsWnd.cpp 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/OptionsWnd.cpp 2006-01-30 01:52:07 UTC (rev 1708) @@ -744,7 +744,7 @@ { } -void OptionsWnd::Keypress (GG::Key key, Uint32 key_mods) +void OptionsWnd::KeyPress (GG::Key key, Uint32 key_mods) { if (key == GG::GGK_ESCAPE || key == GG::GGK_RETURN || key == GG::GGK_KP_ENTER) // Same behaviour as if "done" was pressed DoneClicked(); Modified: trunk/FreeOrion/UI/OptionsWnd.h =================================================================== --- trunk/FreeOrion/UI/OptionsWnd.h 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/OptionsWnd.h 2006-01-30 01:52:07 UTC (rev 1708) @@ -29,7 +29,7 @@ //! \name Mutators //!@{ - virtual void Keypress (GG::Key key, Uint32 key_mods); + virtual void KeyPress (GG::Key key, Uint32 key_mods); //!@} bool m_end_with_done; //!< determines whether or not we ended the dialog with OK or not Modified: trunk/FreeOrion/UI/ServerConnectWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ServerConnectWnd.cpp 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/ServerConnectWnd.cpp 2006-01-30 01:52:07 UTC (rev 1708) @@ -89,7 +89,7 @@ GG::GUI::GetGUI()->SetFocusWnd(m_player_name_edit); } -void ServerConnectWnd::Keypress (GG::Key key, Uint32 key_mods) +void ServerConnectWnd::KeyPress(GG::Key key, Uint32 key_mods) { if (!m_ok_bn->Disabled() && (key == GG::GGK_RETURN || key == GG::GGK_KP_ENTER)) { // Same behaviour as if "OK" was pressed OkClicked(); Modified: trunk/FreeOrion/UI/ServerConnectWnd.h =================================================================== --- trunk/FreeOrion/UI/ServerConnectWnd.h 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/ServerConnectWnd.h 2006-01-30 01:52:07 UTC (rev 1708) @@ -28,7 +28,7 @@ //! \name Mutators //!@{ virtual void ModalInit (); - virtual void Keypress (GG::Key key, Uint32 key_mods); + virtual void KeyPress (GG::Key key, Uint32 key_mods); //!@} /** \name Accessors */ //@{ Modified: trunk/FreeOrion/UI/SitRepPanel.cpp =================================================================== --- trunk/FreeOrion/UI/SitRepPanel.cpp 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/SitRepPanel.cpp 2006-01-30 01:52:07 UTC (rev 1708) @@ -30,7 +30,7 @@ Hide(); } -void SitRepPanel::Keypress (GG::Key key, Uint32 key_mods) +void SitRepPanel::KeyPress (GG::Key key, Uint32 key_mods) { switch (key) { case GG::GGK_RETURN: Modified: trunk/FreeOrion/UI/SitRepPanel.h =================================================================== --- trunk/FreeOrion/UI/SitRepPanel.h 2006-01-30 01:32:26 UTC (rev 1707) +++ trunk/FreeOrion/UI/SitRepPanel.h 2006-01-30 01:52:07 UTC (rev 1708) @@ -20,7 +20,7 @@ //@} /** \name Mutators */ //@{ - virtual void Keypress (GG::Key key, Uint32 key_mods); + virtual void KeyPress (GG::Key key, Uint32 key_mods); virtual void SizeMove(const GG::Pt& ul, const GG::Pt& lr); void Update(); ///< loads all the relevant SitReps into the window |
From: <tz...@us...> - 2006-01-30 02:11:49
|
Revision: 1709 Author: tzlaine Date: 2006-01-29 18:11:34 -0800 (Sun, 29 Jan 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1709&view=rev Log Message: ----------- - Adjusted the default brightness of SystemIcons from 70% to 80%, which still allows for reasonable rollover brightening, without appearing as washed out when not being rolled over. - Added rollover brightening to CUIStateButtons. Modified Paths: -------------- trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/CUIControls.h trunk/FreeOrion/UI/SystemIcon.cpp Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2006-01-30 01:52:07 UTC (rev 1708) +++ trunk/FreeOrion/UI/CUIControls.cpp 2006-01-30 02:11:34 UTC (rev 1709) @@ -83,6 +83,7 @@ } const double ARROW_BRIGHTENING_SCALE_FACTOR = 1.5; + const double STATE_BUTTON_BRIGHTENING_SCALE_FACTOR = 1.25; bool temp_header_bool = RecordHeaderFile(CUIControlsRevision()); bool temp_source_bool = RecordSourceFile("$RCSfile$", "$Revision$"); @@ -280,7 +281,8 @@ GG::Clr text_color/* = ClientUI::TEXT_COLOR*/, GG::Clr interior/* = GG::CLR_ZERO*/, GG::Clr border/* = ClientUI::CTRL_BORDER_COLOR*/, Uint32 flags/* = GG::CLICKABLE*/) : StateButton(x, y, w, h, str, FontOrDefaultFont(font), text_fmt, color, text_color, interior, GG::StateButtonStyle(style), flags), - m_border_color(border) + m_border_color(border), + m_mouse_here(false) { // HACK! radio buttons should only emit sounds when they are checked, and *not* when they are unchecked; currently, there's no // other way to detect the difference between these two kinds of CUIStateButton within the CUIStateButton ctor other than @@ -298,6 +300,11 @@ GG::Clr color_to_use = Disabled() ? DisabledColor(Color()) : Color(); GG::Clr int_color_to_use = Disabled() ? DisabledColor(InteriorColor()) : InteriorColor(); GG::Clr border_color_to_use = Disabled() ? DisabledColor(BorderColor()) : BorderColor(); + if (!Disabled() && !Checked() && m_mouse_here) { + AdjustBrightness(color_to_use, STATE_BUTTON_BRIGHTENING_SCALE_FACTOR); + AdjustBrightness(int_color_to_use, STATE_BUTTON_BRIGHTENING_SCALE_FACTOR); + AdjustBrightness(border_color_to_use, STATE_BUTTON_BRIGHTENING_SCALE_FACTOR); + } if (static_cast<int>(Style()) == SBSTYLE_CUI_CHECKBOX) { const int MARGIN = 3; @@ -378,7 +385,17 @@ } } +void CUIStateButton::MouseEnter(const GG::Pt& pt, Uint32 keys) +{ + m_mouse_here = true; +} +void CUIStateButton::MouseLeave(const GG::Pt& pt, Uint32 keys) +{ + m_mouse_here = false; +} + + /////////////////////////////////////// // class CUIScroll /////////////////////////////////////// Modified: trunk/FreeOrion/UI/CUIControls.h =================================================================== --- trunk/FreeOrion/UI/CUIControls.h 2006-01-30 01:52:07 UTC (rev 1708) +++ trunk/FreeOrion/UI/CUIControls.h 2006-01-30 02:11:34 UTC (rev 1709) @@ -65,14 +65,14 @@ //@} /** \name Accessors */ //@{ - GG::Clr BorderColor() const {return m_border_color;} ///< returns the color used to render the border of the button - int BorderThickness() const {return m_border_thick;} ///< returns the width used to render the border of the button + GG::Clr BorderColor() const {return m_border_color;} ///< returns the color used to render the border of the button + int BorderThickness() const {return m_border_thick;} ///< returns the width used to render the border of the button - virtual bool InWindow(const GG::Pt& pt) const; + virtual bool InWindow(const GG::Pt& pt) const; //@} /** \name Mutators */ //@{ - virtual void MouseHere(const GG::Pt& pt, Uint32 keys); + virtual void MouseHere(const GG::Pt& pt, Uint32 keys); //@} protected: @@ -109,11 +109,11 @@ //@} /** \name Accessors */ //@{ - virtual bool InWindow(const GG::Pt& pt) const; + virtual bool InWindow(const GG::Pt& pt) const; //@} /** \name Mutators */ //@{ - virtual void MouseHere(const GG::Pt& pt, Uint32 keys); + virtual void MouseHere(const GG::Pt& pt, Uint32 keys); //@} protected: @@ -143,15 +143,18 @@ //@} /** \name Accessors */ //@{ - GG::Clr BorderColor() const {return m_border_color;} ///< returns the color used to render the border of the button + 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 Render(); + virtual void MouseEnter(const GG::Pt& pt, Uint32 keys); + virtual void MouseLeave(const GG::Pt& pt, Uint32 keys); //@} private: GG::Clr m_border_color; + bool m_mouse_here; }; @@ -178,12 +181,12 @@ //@} /** \name Accessors */ //@{ - GG::Clr BorderColor() const {return m_border_color;} ///< returns the color used to render the border of the control + GG::Clr BorderColor() const {return m_border_color;} ///< returns the color used to render the border of the control //@} /** \name Mutators */ //@{ - virtual void Render(); - virtual void SizeMove(const GG::Pt& ul, const GG::Pt& lr); + virtual void Render(); + virtual void SizeMove(const GG::Pt& ul, const GG::Pt& lr); //@} private: @@ -201,7 +204,7 @@ //@} /** \name Mutators */ //@{ - virtual void Render(); + virtual void Render(); //@} }; @@ -216,13 +219,13 @@ //@} /** \name Mutators */ //@{ - 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 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); - 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 + 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 //@} private: @@ -242,7 +245,7 @@ //@} /** \name Mutators */ //@{ - virtual void Render(); + virtual void Render(); //@} }; @@ -259,7 +262,7 @@ //@} /** \name Mutators */ //@{ - virtual void Render(); + virtual void Render(); //@} }; @@ -273,7 +276,7 @@ //@} /** \name Mutators */ //@{ - virtual void Render(); + virtual void Render(); //@} }; @@ -392,9 +395,6 @@ CUIToolBar(int x, int y, int w, int h); //@} - /** \name Accessors */ //@{ - //@} - /** \name Mutators */ //@{ void Render(); //@} Modified: trunk/FreeOrion/UI/SystemIcon.cpp =================================================================== --- trunk/FreeOrion/UI/SystemIcon.cpp 2006-01-30 01:52:07 UTC (rev 1708) +++ trunk/FreeOrion/UI/SystemIcon.cpp 2006-01-30 02:11:34 UTC (rev 1709) @@ -62,7 +62,7 @@ //setup static graphic m_static_graphic = new GG::StaticGraphic(0, 0, Width(), Height(), graphic, GG::GR_FITGRAPHIC); - AdjustBrightness(m_default_star_color, 0.70); + AdjustBrightness(m_default_star_color, 0.80); m_static_graphic->SetColor(m_default_star_color); AttachChild(m_static_graphic); } |
From: <tz...@us...> - 2006-01-30 02:42:55
|
Revision: 1710 Author: tzlaine Date: 2006-01-29 18:42:41 -0800 (Sun, 29 Jan 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1710&view=rev Log Message: ----------- - Added rollover brightening to the CUIWnd minimize and close buttons. - Fixed ugly layout of CUIEditWnd. - Removed minimizable button from FleetWnd and FleetDetailWnd. Modified Paths: -------------- trunk/FreeOrion/UI/CUIWnd.cpp trunk/FreeOrion/UI/FleetWindow.cpp trunk/FreeOrion/UI/FleetWindow.h Modified: trunk/FreeOrion/UI/CUIWnd.cpp =================================================================== --- trunk/FreeOrion/UI/CUIWnd.cpp 2006-01-30 02:11:34 UTC (rev 1709) +++ trunk/FreeOrion/UI/CUIWnd.cpp 2006-01-30 02:42:41 UTC (rev 1710) @@ -73,6 +73,8 @@ #endif } + const double BUTTON_DIMMING_SCALE_FACTOR = 0.75; + bool temp_header_bool = RecordHeaderFile(CUIWndRevision()); bool temp_source_bool = RecordSourceFile("$RCSfile$", "$Revision$"); } @@ -91,11 +93,14 @@ { GG::Pt ul = UpperLeft(); GG::Pt lr = LowerRight(); + GG::Clr color_to_use = ClientUI::WND_INNER_BORDER_COLOR; + if (State() != BN_ROLLOVER) + AdjustBrightness(color_to_use, BUTTON_DIMMING_SCALE_FACTOR); if (m_mode == MIN_BUTTON) { // draw a dash to signify the minimize command int middle_y = (lr.y + ul.y) / 2; glDisable(GL_TEXTURE_2D); - glColor4ubv(ClientUI::WND_INNER_BORDER_COLOR.v); + glColor4ubv(color_to_use.v); glBegin(GL_LINES); glVertex2i(ul.x, middle_y); glVertex2i(lr.x, middle_y); @@ -132,8 +137,11 @@ { GG::Pt ul = UpperLeft(); GG::Pt lr = LowerRight(); + GG::Clr color_to_use = ClientUI::WND_INNER_BORDER_COLOR; + if (State() != BN_ROLLOVER) + AdjustBrightness(color_to_use, BUTTON_DIMMING_SCALE_FACTOR); glDisable(GL_TEXTURE_2D); - glColor4ubv(ClientUI::WND_INNER_BORDER_COLOR.v); + glColor4ubv(color_to_use.v); // 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); @@ -406,11 +414,13 @@ /////////////////////////////////////// CUIEditWnd::CUIEditWnd(int w, const std::string& prompt_text, const std::string& edit_text, Uint32 flags/* = Wnd::MODAL*/) : - CUIWnd(prompt_text, 0, 0, 1, 1, flags) + CUIWnd(prompt_text, 0, 0, w, 1, flags) { - m_edit = new CUIEdit(LeftBorder() + 3, TopBorder() + 3, w - 2 * BUTTON_WIDTH - 2 * CONTROL_MARGIN - 6 - LeftBorder() - RightBorder(), edit_text); + m_edit = new CUIEdit(LeftBorder() + 3, TopBorder() + 3, ClientWidth() - 2 * BUTTON_WIDTH - 2 * CONTROL_MARGIN - 6 - LeftBorder() - RightBorder(), edit_text); m_ok_bn = new CUIButton(m_edit->LowerRight().x + CONTROL_MARGIN, TopBorder() + 3, BUTTON_WIDTH, UserString("OK")); m_cancel_bn = new CUIButton(m_ok_bn->LowerRight().x + CONTROL_MARGIN, TopBorder() + 3, BUTTON_WIDTH, UserString("CANCEL")); + m_ok_bn->OffsetMove(GG::Pt(0, (m_edit->Height() - m_ok_bn->Height()) / 2)); + m_cancel_bn->OffsetMove(GG::Pt(0, (m_edit->Height() - m_ok_bn->Height()) / 2)); Resize(GG::Pt(w, std::max(m_edit->LowerRight().y, m_cancel_bn->LowerRight().y) + BottomBorder() + 3)); MoveTo(GG::Pt((GG::GUI::GetGUI()->AppWidth() - w) / 2, (GG::GUI::GetGUI()->AppHeight() - Height()) / 2)); Modified: trunk/FreeOrion/UI/FleetWindow.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWindow.cpp 2006-01-30 02:11:34 UTC (rev 1709) +++ trunk/FreeOrion/UI/FleetWindow.cpp 2006-01-30 02:42:41 UTC (rev 1710) @@ -704,7 +704,7 @@ //////////////////////////////////////////////// // FleetDetailWnd //////////////////////////////////////////////// -FleetDetailWnd::FleetDetailWnd(int x, int y, Fleet* fleet, bool read_only, Uint32 flags/* = CLICKABLE | DRAGABLE | RESIZABLE | ONTOP | CLOSABLE | MINIMIZABLE*/) : +FleetDetailWnd::FleetDetailWnd(int x, int y, Fleet* fleet, bool read_only, Uint32 flags/* = CLICKABLE | DRAGABLE | RESIZABLE | ONTOP | CLOSABLE*/) : CUIWnd("", x, y, 1, 1, flags), m_fleet_panel(0) { @@ -751,7 +751,7 @@ 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 | MINIMIZABLE*/) : + Uint32 flags/* = CLICKABLE | DRAGABLE | ONTOP | CLOSABLE*/) : MapWndPopup("", x, y, 1, 1, flags | GG::RESIZABLE), m_empire_id(-1), m_system_id(UniverseObject::INVALID_OBJECT_ID), Modified: trunk/FreeOrion/UI/FleetWindow.h =================================================================== --- trunk/FreeOrion/UI/FleetWindow.h 2006-01-30 02:11:34 UTC (rev 1709) +++ trunk/FreeOrion/UI/FleetWindow.h 2006-01-30 02:42:41 UTC (rev 1710) @@ -40,7 +40,7 @@ //@} /** \name Structors */ //@{ - FleetDetailWnd(int x, int y, Fleet* fleet, bool read_only, Uint32 flags = GG::CLICKABLE | GG::DRAGABLE | GG::RESIZABLE | GG::ONTOP | CLOSABLE | MINIMIZABLE); ///< basic ctor + FleetDetailWnd(int x, int y, Fleet* fleet, bool read_only, Uint32 flags = GG::CLICKABLE | GG::DRAGABLE | GG::RESIZABLE | GG::ONTOP | CLOSABLE); ///< basic ctor ~FleetDetailWnd(); ///< virtual dtor //@} @@ -71,7 +71,7 @@ /** \name Structors */ //@{ /** constructs a fleet window for fleets in transit between systems */ - FleetWnd(int x, int y, std::vector<Fleet*> fleets, int selected_fleet, bool read_only, Uint32 flags = GG::CLICKABLE | GG::DRAGABLE | GG::ONTOP | CLOSABLE | MINIMIZABLE); + FleetWnd(int x, int y, std::vector<Fleet*> fleets, int selected_fleet, bool read_only, Uint32 flags = GG::CLICKABLE | GG::DRAGABLE | GG::ONTOP | CLOSABLE); ~FleetWnd(); ///< dtor //@} |
From: <tz...@us...> - 2006-01-30 03:43:11
|
Revision: 1714 Author: tzlaine Date: 2006-01-29 19:42:55 -0800 (Sun, 29 Jan 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1714&view=rev Log Message: ----------- Got rid of the FleetWnd's new fleet row; now there is a new-fleet drop zone instead, that works the same way, but which is always visible. Modified Paths: -------------- trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/UI/FleetWnd.h Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2006-01-30 03:02:32 UTC (rev 1713) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2006-01-30 03:42:55 UTC (rev 1714) @@ -23,6 +23,38 @@ #include <boost/format.hpp> #include <iostream> + +class FleetDataPanel : public GG::Control +{ +public: + enum { + FLEET_ICON_SZ = 38, + FLEET_NAME_HT = 20, + STAT_ICON_WD = 40 + }; + + FleetDataPanel(int w, int h, const Fleet* fleet); + + virtual void Render(); + virtual void AcceptDrops(std::list<Wnd*>& wnds, const GG::Pt& pt); + void Select(bool b); + + mutable boost::signal<void (Ship*, const std::vector<int>&)> NewFleetFromShipsSignal; + +private: + void SetFleetIcon(); + void Refresh(); + + const Fleet* const m_fleet; + GG::StaticGraphic* m_fleet_icon; + GG::TextControl* m_fleet_name_text; + StatisticIcon* m_num_ships_stat; + StatisticIcon* m_fleet_strength_stat; + GG::StaticGraphic* m_damage_icon; + GG::StaticGraphic* m_colonizer_icon; + bool m_selected; +}; + namespace { const int NEW_FLEET_BUTTON_WIDTH = 75; const int FLEET_LISTBOX_WIDTH = 250; @@ -31,178 +63,6 @@ const std::string SHIP_DROP_TYPE_STRING = "FLeetWnd ShipRow"; const std::string FLEET_DROP_TYPE_STRING = "FleetWnd FleetRow"; - class FleetDataPanel : public GG::Control - { - public: - enum { - FLEET_ICON_SZ = 38, - FLEET_NAME_HT = 20, - STAT_ICON_WD = 40 - }; - - FleetDataPanel(int w, int h, const Fleet* fleet) : - Control(0, 0, w, h, 0), - m_fleet(fleet), - m_fleet_icon(0), - m_fleet_name_text(new GG::TextControl(h, 0, w - h - 5, FLEET_NAME_HT, m_fleet ? m_fleet->Name() : "<i>" + UserString("FW_NEW_FLEET_LABEL") + "</i>", - GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS), m_fleet ? ClientUI::TEXT_COLOR : GG::CLR_BLACK, - GG::TF_RIGHT | GG::TF_VCENTER)), - m_num_ships_stat(0), - m_fleet_strength_stat(0), - m_damage_icon(0), - m_colonizer_icon(0), - m_selected(false) - { - EnableChildClipping(); - - AttachChild(m_fleet_name_text); - - if (m_fleet) { - m_num_ships_stat = new StatisticIcon(h, FLEET_NAME_HT, STAT_ICON_WD, h - FLEET_NAME_HT - 1, - ClientUI::ART_DIR + "icons/3shipfleet.png", ClientUI::TEXT_COLOR, 0); - m_fleet_strength_stat = new StatisticIcon(h + STAT_ICON_WD, FLEET_NAME_HT, STAT_ICON_WD, h - FLEET_NAME_HT - 1, - ClientUI::ART_DIR + "icons/combatstrength.png", ClientUI::TEXT_COLOR, 0); - AttachChild(m_num_ships_stat); - AttachChild(m_fleet_strength_stat); - GG::Connect(m_fleet->StateChangedSignal, &FleetDataPanel::Refresh, this); - } - - Refresh(); - } - - virtual void Render() - { - const GG::Clr& unselected_color = GG::CLR_GRAY; - const GG::Clr& selected_color = GG::CLR_WHITE; - - GG::Clr color_to_use = m_selected ? selected_color : unselected_color; - - if (Disabled()) - color_to_use = DisabledColor(color_to_use); - - GG::Pt ul = UpperLeft(), lr = LowerRight(); - GG::Pt text_ul = m_fleet_name_text->UpperLeft(), text_lr = m_fleet_name_text->LowerRight(); - - GG::FlatRectangle(ul.x, ul.y, lr.x, lr.y, GG::CLR_ZERO, color_to_use, 1); - GG::FlatRectangle(text_ul.x, text_ul.y, text_lr.x + 5, text_lr.y, color_to_use, GG::CLR_ZERO, 0); - } - - void Select(bool b) - { - if (m_selected != b) { - m_selected = b; - - const GG::Clr& unselected_text_color = ClientUI::TEXT_COLOR; - const GG::Clr& selected_text_color = GG::CLR_BLACK; - - GG::Clr text_color_to_use = m_selected ? selected_text_color : unselected_text_color; - - if (!m_fleet) // use different colors for the "new fleet" panel - text_color_to_use = GG::CLR_BLACK; - - if (Disabled()) - text_color_to_use = DisabledColor(text_color_to_use); - - m_fleet_name_text->SetTextColor(text_color_to_use); - } - } - - private: - void SetFleetIcon() - { - DeleteChild(m_fleet_icon); - - const int ICON_OFFSET = (Size().y - FLEET_ICON_SZ) / 2; - boost::shared_ptr<GG::Texture> icon; - - if (m_fleet) { // a regular fleet data panel - if (2 <= m_fleet->NumShips() && m_fleet->NumShips() <= 5) { - icon = GG::GUI::GetGUI()->GetTexture(ClientUI::ART_DIR + "icons/" + - boost::lexical_cast<std::string>(m_fleet->NumShips()) + "shipfleet.png"); - } else if (5 < m_fleet->NumShips()) { - icon = GG::GUI::GetGUI()->GetTexture(ClientUI::ART_DIR + "icons/5shipfleet.png"); - } else if (m_fleet->NumShips() == 1) { - Ship* ship = GetUniverse().Object<Ship>(*m_fleet->begin()); - std::string design_name; - if (ship->Design()) { - design_name = ship->Design()->name; - unsigned int space; - if ((space = design_name.find(' ')) != std::string::npos) { - design_name[space] = '_'; - } - } else { - design_name = "Scout"; - } - icon = GG::GUI::GetGUI()->GetTexture(ClientUI::ART_DIR + "icons/" + design_name + ".png"); - } - } else { // the "new fleet" data panel - icon = GG::GUI::GetGUI()->GetTexture(ClientUI::ART_DIR + "icons/newfleet.png"); - } - - if (icon) { - m_fleet_icon = new GG::StaticGraphic(ICON_OFFSET, ICON_OFFSET, FLEET_ICON_SZ, FLEET_ICON_SZ, icon, GG::GR_FITGRAPHIC); - AttachChild(m_fleet_icon); - } - } - void Refresh() - { - SetFleetIcon(); - if (m_fleet) { - m_fleet_name_text->SetText(m_fleet->Name()); - m_num_ships_stat->SetValue(m_fleet->NumShips()); - int attack_strength = 0; - bool damaged_ships = false; - bool contains_colony_ship = false; - bool attack_factor_unknown = true; - for (Fleet::const_iterator it = m_fleet->begin(); it != m_fleet->end(); ++it) { - Ship* ship = GetUniverse().Object<Ship>(*it); - const ShipDesign* design = ship->Design(); - if (design) { - if (design->colonize) - contains_colony_ship = true; - attack_strength += design->attack; - attack_factor_unknown = false; - } - // TODO: account for damaged ships once damage system is in place - } - m_fleet_strength_stat->SetValue(attack_factor_unknown ? StatisticIcon::UNKNOWN_VALUE : attack_strength); - - const int ICON_SPACING = 5; - const int ICON_SZ = Height() - FLEET_NAME_HT - 1; - int x_position = m_fleet_strength_stat->LowerRight().x - ClientUpperLeft().x + ICON_SPACING; - if (damaged_ships) { - if (!m_damage_icon) { - m_damage_icon = new GG::StaticGraphic(x_position, FLEET_NAME_HT, ICON_SZ, ICON_SZ, - GG::GUI::GetGUI()->GetTexture(ClientUI::ART_DIR + "icons/damagemarker.png"), GG::GR_FITGRAPHIC); - AttachChild(m_damage_icon); - } - x_position += m_damage_icon->Width() + ICON_SPACING; - } else if (m_damage_icon) { - DeleteChild(m_damage_icon); - } - if (contains_colony_ship) { - if (!m_colonizer_icon) { - m_colonizer_icon = new GG::StaticGraphic(x_position, FLEET_NAME_HT, ICON_SZ, ICON_SZ, - GG::GUI::GetGUI()->GetTexture(ClientUI::ART_DIR + "icons/colonymarker.png"), GG::GR_FITGRAPHIC); - AttachChild(m_colonizer_icon); - } - x_position += m_colonizer_icon->Width() + ICON_SPACING; - } else if (m_colonizer_icon) { - DeleteChild(m_colonizer_icon); - } - } - } - - const Fleet* const m_fleet; - GG::StaticGraphic* m_fleet_icon; - GG::TextControl* m_fleet_name_text; - StatisticIcon* m_num_ships_stat; - StatisticIcon* m_fleet_strength_stat; - GG::StaticGraphic* m_damage_icon; - GG::StaticGraphic* m_colonizer_icon; - bool m_selected; - }; - class ShipDataPanel : public GG::Control { public: @@ -381,6 +241,182 @@ } //////////////////////////////////////////////// +// FleetDataPanel +//////////////////////////////////////////////// +FleetDataPanel::FleetDataPanel(int w, int h, const Fleet* fleet) : + Control(0, 0, w, h, fleet ? 0 : GG::CLICKABLE), + m_fleet(fleet), + m_fleet_icon(0), + m_fleet_name_text(new GG::TextControl(h, 0, w - h - 5, FLEET_NAME_HT, m_fleet ? m_fleet->Name() : "<i>" + UserString("FW_NEW_FLEET_LABEL") + "</i>", + GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS), m_fleet ? ClientUI::TEXT_COLOR : GG::CLR_BLACK, + GG::TF_RIGHT | GG::TF_VCENTER)), + m_num_ships_stat(0), + m_fleet_strength_stat(0), + m_damage_icon(0), + m_colonizer_icon(0), + m_selected(false) +{ + EnableChildClipping(); + + AttachChild(m_fleet_name_text); + + if (m_fleet) { + m_num_ships_stat = new StatisticIcon(h, FLEET_NAME_HT, STAT_ICON_WD, h - FLEET_NAME_HT - 1, + ClientUI::ART_DIR + "icons/3shipfleet.png", ClientUI::TEXT_COLOR, 0); + m_fleet_strength_stat = new StatisticIcon(h + STAT_ICON_WD, FLEET_NAME_HT, STAT_ICON_WD, h - FLEET_NAME_HT - 1, + ClientUI::ART_DIR + "icons/combatstrength.png", ClientUI::TEXT_COLOR, 0); + AttachChild(m_num_ships_stat); + AttachChild(m_fleet_strength_stat); + GG::Connect(m_fleet->StateChangedSignal, &FleetDataPanel::Refresh, this); + } + + Refresh(); +} + +void FleetDataPanel::Render() +{ + const GG::Clr& unselected_color = GG::CLR_GRAY; + const GG::Clr& selected_color = GG::CLR_WHITE; + + GG::Clr color_to_use = m_selected ? selected_color : unselected_color; + + if (Disabled()) + color_to_use = DisabledColor(color_to_use); + + GG::Pt ul = UpperLeft(), lr = LowerRight(); + GG::Pt text_ul = m_fleet_name_text->UpperLeft(), text_lr = m_fleet_name_text->LowerRight(); + + GG::FlatRectangle(ul.x, ul.y, lr.x, lr.y, GG::CLR_ZERO, color_to_use, 1); + GG::FlatRectangle(text_ul.x, text_ul.y, text_lr.x + 5, text_lr.y, color_to_use, GG::CLR_ZERO, 0); +} + +void FleetDataPanel::AcceptDrops(std::list<Wnd*>& wnds, const GG::Pt& pt) +{ + std::vector<Ship*> ships; + std::vector<int> ship_ids; + for (std::list<Wnd*>::const_iterator it = wnds.begin(); it != wnds.end(); ++it) { + if ((*it)->DragDropDataType() == SHIP_DROP_TYPE_STRING) { + ships.push_back(static_cast<ShipRow*>(*it)->m_ship); + ship_ids.push_back(ships.back()->ID()); + } else { + wnds.clear(); + return; + } + } + if (wnds.front()->DragDropDataType() == SHIP_DROP_TYPE_STRING) { + NewFleetFromShipsSignal(ships[0], ship_ids); + } + wnds.clear(); +} + +void FleetDataPanel::Select(bool b) +{ + if (m_fleet && m_selected != b) { + m_selected = b; + + const GG::Clr& unselected_text_color = ClientUI::TEXT_COLOR; + const GG::Clr& selected_text_color = GG::CLR_BLACK; + + GG::Clr text_color_to_use = m_selected ? selected_text_color : unselected_text_color; + + if (!m_fleet) // use different colors for the "new fleet" panel + text_color_to_use = GG::CLR_BLACK; + + if (Disabled()) + text_color_to_use = DisabledColor(text_color_to_use); + + m_fleet_name_text->SetTextColor(text_color_to_use); + } +} + +void FleetDataPanel::SetFleetIcon() +{ + DeleteChild(m_fleet_icon); + + const int ICON_OFFSET = (Size().y - FLEET_ICON_SZ) / 2; + boost::shared_ptr<GG::Texture> icon; + + if (m_fleet) { // a regular fleet data panel + if (2 <= m_fleet->NumShips() && m_fleet->NumShips() <= 5) { + icon = GG::GUI::GetGUI()->GetTexture(ClientUI::ART_DIR + "icons/" + + boost::lexical_cast<std::string>(m_fleet->NumShips()) + "shipfleet.png"); + } else if (5 < m_fleet->NumShips()) { + icon = GG::GUI::GetGUI()->GetTexture(ClientUI::ART_DIR + "icons/5shipfleet.png"); + } else if (m_fleet->NumShips() == 1) { + Ship* ship = GetUniverse().Object<Ship>(*m_fleet->begin()); + std::string design_name; + if (ship->Design()) { + design_name = ship->Design()->name; + unsigned int space; + if ((space = design_name.find(' ')) != std::string::npos) { + design_name[space] = '_'; + } + } else { + design_name = "Scout"; + } + icon = GG::GUI::GetGUI()->GetTexture(ClientUI::ART_DIR + "icons/" + design_name + ".png"); + } + } else { // the "new fleet" data panel + icon = GG::GUI::GetGUI()->GetTexture(ClientUI::ART_DIR + "icons/newfleet.png"); + } + + if (icon) { + m_fleet_icon = new GG::StaticGraphic(ICON_OFFSET, ICON_OFFSET, FLEET_ICON_SZ, FLEET_ICON_SZ, icon, GG::GR_FITGRAPHIC); + AttachChild(m_fleet_icon); + } +} + +void FleetDataPanel::Refresh() +{ + SetFleetIcon(); + if (m_fleet) { + m_fleet_name_text->SetText(m_fleet->Name()); + m_num_ships_stat->SetValue(m_fleet->NumShips()); + int attack_strength = 0; + bool damaged_ships = false; + bool contains_colony_ship = false; + bool attack_factor_unknown = true; + for (Fleet::const_iterator it = m_fleet->begin(); it != m_fleet->end(); ++it) { + Ship* ship = GetUniverse().Object<Ship>(*it); + const ShipDesign* design = ship->Design(); + if (design) { + if (design->colonize) + contains_colony_ship = true; + attack_strength += design->attack; + attack_factor_unknown = false; + } + // TODO: account for damaged ships once damage system is in place + } + m_fleet_strength_stat->SetValue(attack_factor_unknown ? StatisticIcon::UNKNOWN_VALUE : attack_strength); + + const int ICON_SPACING = 5; + const int ICON_SZ = Height() - FLEET_NAME_HT - 1; + int x_position = m_fleet_strength_stat->LowerRight().x - ClientUpperLeft().x + ICON_SPACING; + if (damaged_ships) { + if (!m_damage_icon) { + m_damage_icon = new GG::StaticGraphic(x_position, FLEET_NAME_HT, ICON_SZ, ICON_SZ, + GG::GUI::GetGUI()->GetTexture(ClientUI::ART_DIR + "icons/damagemarker.png"), GG::GR_FITGRAPHIC); + AttachChild(m_damage_icon); + } + x_position += m_damage_icon->Width() + ICON_SPACING; + } else if (m_damage_icon) { + DeleteChild(m_damage_icon); + } + if (contains_colony_ship) { + if (!m_colonizer_icon) { + m_colonizer_icon = new GG::StaticGraphic(x_position, FLEET_NAME_HT, ICON_SZ, ICON_SZ, + GG::GUI::GetGUI()->GetTexture(ClientUI::ART_DIR + "icons/colonymarker.png"), GG::GR_FITGRAPHIC); + AttachChild(m_colonizer_icon); + } + x_position += m_colonizer_icon->Width() + ICON_SPACING; + } else if (m_colonizer_icon) { + DeleteChild(m_colonizer_icon); + } + } +} + + +//////////////////////////////////////////////// // FleetsListBox //////////////////////////////////////////////// class FleetsListBox : public CUIListBox @@ -416,41 +452,26 @@ return; } - if (static_cast<FleetRow*>(&GetRow(row_index))->m_fleet) { - if (wnds.front()->DragDropDataType() == SHIP_DROP_TYPE_STRING) { - Fleet* target_fleet = static_cast<FleetRow*>(&GetRow(row_index))->m_fleet; - if (!CanJoin(ships[0], target_fleet)) { - wnds.clear(); - return; - } - HumanClientApp::Orders().IssueOrder(new FleetTransferOrder(HumanClientApp::GetApp()->EmpireID(), ships[0]->FleetID(), - target_fleet->ID(), ship_ids)); - } else if (wnds.front()->DragDropDataType() == FLEET_DROP_TYPE_STRING) { - FleetRow* fleet_row = static_cast<FleetRow*>(wnds.front()); - Fleet* target_fleet = static_cast<FleetRow*>(&GetRow(row_index))->m_fleet; - // disallow drops across fleet windows; fleets must be at the same location - if (target_fleet->X() != fleet_row->m_fleet->X() || target_fleet->Y() != fleet_row->m_fleet->Y()) { - wnds.clear(); - return; - } - HumanClientApp::Orders().IssueOrder( - new FleetTransferOrder(HumanClientApp::GetApp()->EmpireID(), fleet_row->FleetID(), - target_fleet->ID(), std::vector<int>(fleet_row->m_fleet->begin(), fleet_row->m_fleet->end()))); + assert(static_cast<FleetRow*>(&GetRow(row_index))->m_fleet); + if (wnds.front()->DragDropDataType() == SHIP_DROP_TYPE_STRING) { + Fleet* target_fleet = static_cast<FleetRow*>(&GetRow(row_index))->m_fleet; + if (!CanJoin(ships[0], target_fleet)) { + wnds.clear(); + return; } - } else { - if (wnds.front()->DragDropDataType() == SHIP_DROP_TYPE_STRING) { - // special case: disallow drag-dropping a ship into the new fleet row when there is exactly 1 fleet - // containing exactly 1 ship - // TODO: This "2" need to change when the new fleet row is no longer a row. - if (NumRows() == 2) { // if there is exactly one fleet in the window ("2" is used because there is also the new fleet row) - assert(ships[0]->GetFleet()); - if (ships[0]->GetFleet()->NumShips() == 1) { - wnds.clear(); - return; - } - } - NewFleetFromShipsSignal(ships[0], ship_ids); + HumanClientApp::Orders().IssueOrder(new FleetTransferOrder(HumanClientApp::GetApp()->EmpireID(), ships[0]->FleetID(), + target_fleet->ID(), ship_ids)); + } else if (wnds.front()->DragDropDataType() == FLEET_DROP_TYPE_STRING) { + FleetRow* fleet_row = static_cast<FleetRow*>(wnds.front()); + Fleet* target_fleet = static_cast<FleetRow*>(&GetRow(row_index))->m_fleet; + // disallow drops across fleet windows; fleets must be at the same location + if (target_fleet->X() != fleet_row->m_fleet->X() || target_fleet->Y() != fleet_row->m_fleet->Y()) { + wnds.clear(); + return; } + HumanClientApp::Orders().IssueOrder( + new FleetTransferOrder(HumanClientApp::GetApp()->EmpireID(), fleet_row->FleetID(), + target_fleet->ID(), std::vector<int>(fleet_row->m_fleet->begin(), fleet_row->m_fleet->end()))); } wnds.clear(); } @@ -759,6 +780,7 @@ m_moving_fleets(true), m_current_fleet(-1), m_fleets_lb(0), + m_new_fleet_drop_target(0), m_fleet_detail_panel(0) { assert(0 <= selected_fleet && selected_fleet < static_cast<int>(fleets.size())); @@ -775,8 +797,13 @@ TempUISoundDisabler sound_disabler; m_fleets_lb = new FleetsListBox(0, 0, FLEET_LISTBOX_WIDTH, FLEET_LISTBOX_HEIGHT, read_only); + if (!m_read_only) { + m_new_fleet_drop_target = new FleetDataPanel(FleetRow::PANEL_WD, FleetRow::PANEL_HT, 0); + m_new_fleet_drop_target->SetMinSize(GG::Pt(1, FleetRow::PANEL_HT)); + m_new_fleet_drop_target->MoveTo(GG::Pt(0, 5)); + } m_fleet_detail_panel = new FleetDetailPanel(0, read_only); - m_fleet_detail_panel->MoveTo(GG::Pt(1, 1)); + m_fleet_detail_panel->MoveTo(GG::Pt(0, 10)); m_fleets_lb->SetHiliteColor(GG::CLR_ZERO); m_fleets_lb->SetMinSize(m_fleets_lb->Size()); @@ -832,16 +859,19 @@ m_fleets_lb->AllowDropType(FLEET_DROP_TYPE_STRING); } - if (!m_read_only) { - m_fleets_lb->Insert(new FleetRow(0)); - } for (unsigned int i = 0; i < fleets.size(); ++i) { AddFleet(fleets[i]); } AttachChild(m_fleets_lb); AttachChild(m_fleet_detail_panel); + if (!m_read_only) + AttachChild(m_new_fleet_drop_target); VerticalLayout(); + if (!m_read_only) { + GetLayout()->SetRowStretch(0, 1.0); + GetLayout()->SetRowStretch(2, 1.0); + } GetLayout()->SetBorderMargin(7); GG::Connect(m_fleet_detail_panel->PanelEmptySignal, &FleetWnd::DeleteFleet, this); @@ -849,7 +879,8 @@ GG::Connect(m_fleets_lb->RightClickedSignal, &FleetWnd::FleetRightClicked, this); GG::Connect(m_fleets_lb->DoubleClickedSignal, &FleetWnd::FleetDoubleClicked, this); m_lb_delete_connection = GG::Connect(m_fleets_lb->ErasedSignal, &FleetWnd::FleetDeleted, this); - GG::Connect(m_fleets_lb->NewFleetFromShipsSignal, &FleetWnd::CreateNewFleetFromDrops, this); + if (!m_read_only) + GG::Connect(m_new_fleet_drop_target->NewFleetFromShipsSignal, &FleetWnd::CreateNewFleetFromDrops, this); SetText(TitleText()); @@ -889,7 +920,7 @@ void FleetWnd::AddFleet(Fleet* fleet) { - m_fleets_lb->Insert(new FleetRow(fleet), m_fleets_lb->NumRows() - (m_read_only ? 0 : 1)); + m_fleets_lb->Insert(new FleetRow(fleet)); ShowingFleetSignal(fleet, this); } @@ -925,11 +956,6 @@ void FleetWnd::FleetSelectionChanged(const std::set<int>& rows) { - // disallow selection of the new fleet slot - if (!m_read_only && rows.find(m_fleets_lb->NumRows() - 1) != rows.end()) { - m_fleets_lb->DeselectRow(m_fleets_lb->NumRows() - 1); - } - m_current_fleet = m_fleets_lb->Caret(); Fleet* fleet = 0 <= m_current_fleet ? FleetInRow(m_current_fleet) : 0; @@ -943,9 +969,6 @@ void FleetWnd::FleetRightClicked(int row_idx, GG::ListBox::Row* row, const GG::Pt& pt) { - if (!m_read_only && row_idx == m_fleets_lb->NumRows() - 1) - return; - Fleet* fleet = FleetInRow(row_idx); if (fleet->Owners().size() != 1 || HumanClientApp::GetApp()->EmpireID() != *fleet->Owners().begin()) return; @@ -974,9 +997,6 @@ void FleetWnd::FleetDoubleClicked(int row_idx, GG::ListBox::Row* row) { - if (!m_read_only && row_idx == m_fleets_lb->NumRows() - 1) - return; - Fleet* row_fleet = FleetInRow(row_idx); int num_open_windows = m_open_fleet_detail_wnds.size(); GG::Pt window_posn(std::max(0, 25 + LowerRight().x + num_open_windows * 25), std::max(0, UpperLeft().y + num_open_windows * 25)); @@ -1051,6 +1071,13 @@ { Fleet* some_existing_fleet = FleetInRow(0); + // special case: disallow creating a new fleet from a ship when there is exactly 1 fleet containing exactly 1 ship + if (m_fleets_lb->NumRows() == 1) { // if there is exactly one fleet in the list + assert(first_ship->GetFleet()); + if (first_ship->GetFleet()->NumShips() == 1) + return; + } + if (!some_existing_fleet || !first_ship || some_existing_fleet->SystemID() != first_ship->GetFleet()->SystemID() || some_existing_fleet->X() != first_ship->GetFleet()->X() || @@ -1097,8 +1124,7 @@ { const Fleet* fleet; // only look for obj if FleetWnd contains fleets and obj is a fleet - // TODO: change the 0 : 1 when the new fleet row is no longer a row - if ((m_open_fleet_detail_wnds.empty() && m_fleets_lb->NumRows() == (m_read_only ? 0 : 1)) || + if ((m_open_fleet_detail_wnds.empty() && m_fleets_lb->NumRows() == 0) || !(fleet = universe_object_cast<const Fleet*>(obj))) return; Modified: trunk/FreeOrion/UI/FleetWnd.h =================================================================== --- trunk/FreeOrion/UI/FleetWnd.h 2006-01-30 03:02:32 UTC (rev 1713) +++ trunk/FreeOrion/UI/FleetWnd.h 2006-01-30 03:42:55 UTC (rev 1714) @@ -16,6 +16,7 @@ class CUIListBox; class Fleet; +class FleetDataPanel; class FleetDetailPanel; class FleetsListBox; class Ship; @@ -129,6 +130,7 @@ std::map<FleetDetailWnd*, boost::signals::connection> m_open_fleet_detail_wnd_connections; FleetsListBox* m_fleets_lb; + FleetDataPanel* m_new_fleet_drop_target; FleetDetailPanel* m_fleet_detail_panel; boost::signals::connection m_lb_delete_connection; |
From: <tz...@us...> - 2006-02-02 00:24:33
|
Revision: 1720 Author: tzlaine Date: 2006-02-01 16:24:13 -0800 (Wed, 01 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1720&view=rev Log Message: ----------- Added support for plotting projected movement lines when a fleet is selected and the mouse moves over a reachable system. Modified Paths: -------------- trunk/FreeOrion/UI/FleetButton.cpp trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/UI/FleetWnd.h trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h trunk/FreeOrion/UI/SystemIcon.cpp trunk/FreeOrion/UI/SystemIcon.h Modified: trunk/FreeOrion/UI/FleetButton.cpp =================================================================== --- trunk/FreeOrion/UI/FleetButton.cpp 2006-02-01 04:00:20 UTC (rev 1719) +++ trunk/FreeOrion/UI/FleetButton.cpp 2006-02-02 00:24:13 UTC (rev 1720) @@ -177,8 +177,10 @@ FleetWnd::LastPosition()); } - if (map_wnd) + 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; Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-01 04:00:20 UTC (rev 1719) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-02 00:24:13 UTC (rev 1720) @@ -452,9 +452,9 @@ return; } - assert(static_cast<FleetRow*>(&GetRow(row_index))->m_fleet); + Fleet* target_fleet = static_cast<FleetRow*>(&GetRow(row_index))->m_fleet; + assert(target_fleet); if (wnds.front()->DragDropDataType() == SHIP_DROP_TYPE_STRING) { - Fleet* target_fleet = static_cast<FleetRow*>(&GetRow(row_index))->m_fleet; if (!CanJoin(ships[0], target_fleet)) { wnds.clear(); return; @@ -462,8 +462,8 @@ HumanClientApp::Orders().IssueOrder(new FleetTransferOrder(HumanClientApp::GetApp()->EmpireID(), ships[0]->FleetID(), target_fleet->ID(), ship_ids)); } else if (wnds.front()->DragDropDataType() == FLEET_DROP_TYPE_STRING) { + assert(wnds.size() == 1); FleetRow* fleet_row = static_cast<FleetRow*>(wnds.front()); - Fleet* target_fleet = static_cast<FleetRow*>(&GetRow(row_index))->m_fleet; // disallow drops across fleet windows; fleets must be at the same location if (target_fleet->X() != fleet_row->m_fleet->X() || target_fleet->Y() != fleet_row->m_fleet->Y()) { wnds.clear(); @@ -892,7 +892,7 @@ } } -void FleetWnd::SystemClicked(int system_id) +void FleetWnd::PlotMovement(int system_id, bool execute_move) { if (system_id != -1) { int empire_id = HumanClientApp::GetApp()->EmpireID(); @@ -910,14 +910,31 @@ return; } - HumanClientApp::Orders().IssueOrder(new FleetMoveOrder(empire_id, fleet->ID(), start_system, system_id)); - if (fleet->SystemID() == UniverseObject::INVALID_OBJECT_ID) - ClientUI::GetClientUI()->GetMapWnd()->SetFleetMovement(fleet); + if (execute_move) { + HumanClientApp::Orders().IssueOrder(new FleetMoveOrder(empire_id, fleet->ID(), start_system, system_id)); + if (fleet->SystemID() == UniverseObject::INVALID_OBJECT_ID) + ClientUI::GetClientUI()->GetMapWnd()->SetFleetMovement(fleet); + } else { + 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)); Modified: trunk/FreeOrion/UI/FleetWnd.h =================================================================== --- trunk/FreeOrion/UI/FleetWnd.h 2006-02-01 04:00:20 UTC (rev 1719) +++ trunk/FreeOrion/UI/FleetWnd.h 2006-02-02 00:24:13 UTC (rev 1720) @@ -82,7 +82,8 @@ //@} //! \name Mutators //@{ - void SystemClicked(int system_id); ///< invoked when a system is clicked on the main map, possibly indicating that the currently-selected fleet should move there + 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 //@} @@ -105,6 +106,7 @@ 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); Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2006-02-01 04:00:20 UTC (rev 1719) +++ trunk/FreeOrion/UI/MapWnd.cpp 2006-02-02 00:24:13 UTC (rev 1720) @@ -105,20 +105,6 @@ }; -//////////////////////////////////////////////// -// MapWnd::MovementLineData -//////////////////////////////////////////////// -struct MapWnd::MovementLineData -{ - MovementLineData() {} - MovementLineData(double x_, double y_, const std::list<System*>& dest) : x(x_), y(y_), destinations(dest) {} - double x; - double y; - std::list<System*> destinations; - // TODO : color, other properties(?), based on moving empire and destination, etc. -}; - - //////////////////////////////////////////////////////////// // MapWndPopup //////////////////////////////////////////////////////////// @@ -578,8 +564,8 @@ m_fleet_lines.clear(); // systems and starlanes - for (unsigned int i = 0; i < m_system_icons.size(); ++i) { - DeleteChild(m_system_icons[i]); + for (std::map<int, SystemIcon*>::iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { + DeleteChild(it->second); } m_system_icons.clear(); m_starlanes.clear(); @@ -588,13 +574,15 @@ for (unsigned int i = 0; i < systems.size(); ++i) { // system SystemIcon* icon = new SystemIcon(systems[i]->ID(), m_zoom_factor); - m_system_icons.push_back(icon); + m_system_icons[systems[i]->ID()] = icon; icon->InstallEventFilter(this); AttachChild(icon); icon->Refresh(); GG::Connect(icon->LeftClickedSignal, &MapWnd::SelectSystem, this); GG::Connect(icon->RightClickedSignal, &MapWnd::SystemRightClicked, this); GG::Connect(icon->LeftDoubleClickedSignal, &MapWnd::SystemDoubleClicked, this); + GG::Connect(icon->MouseEnteringSignal, &MapWnd::MouseEnteringSystem, this); + GG::Connect(icon->MouseLeavingSignal, &MapWnd::MouseLeavingSystem, this); // system's starlanes for (System::lane_iterator it = systems[i]->begin_lanes(); it != systems[i]->end_lanes(); ++it) { @@ -684,13 +672,13 @@ { m_zoom_factor = boost::lexical_cast<double>(elem.Child("m_zoom_factor").Text()); - for (unsigned int i = 0; i < m_system_icons.size(); ++i) { - const System& system = m_system_icons[i]->GetSystem(); + for (std::map<int, SystemIcon*>::iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { + const System& system = it->second->GetSystem(); GG::Pt icon_ul(static_cast<int>((system.X() - ClientUI::SYSTEM_ICON_SIZE / 2) * m_zoom_factor), static_cast<int>((system.Y() - ClientUI::SYSTEM_ICON_SIZE / 2) * m_zoom_factor)); - m_system_icons[i]->SizeMove(icon_ul, - GG::Pt(static_cast<int>(icon_ul.x + ClientUI::SYSTEM_ICON_SIZE * m_zoom_factor + 0.5), - static_cast<int>(icon_ul.y + ClientUI::SYSTEM_ICON_SIZE * m_zoom_factor + 0.5))); + it->second->SizeMove(icon_ul, + GG::Pt(static_cast<int>(icon_ul.x + ClientUI::SYSTEM_ICON_SIZE * m_zoom_factor + 0.5), + static_cast<int>(icon_ul.y + ClientUI::SYSTEM_ICON_SIZE * m_zoom_factor + 0.5))); } for (unsigned int i = 0; i < m_moving_fleet_buttons.size(); ++i) { @@ -741,14 +729,16 @@ void MapWnd::ShowSystemNames() { - for (unsigned int i = 0; i < m_system_icons.size(); ++i) - m_system_icons[i]->ShowName(); + for (std::map<int, SystemIcon*>::iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { + it->second->ShowName(); + } } void MapWnd::HideSystemNames() { - for (unsigned int i = 0; i < m_system_icons.size(); ++i) - m_system_icons[i]->HideName(); + for (std::map<int, SystemIcon*>::iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { + it->second->HideName(); + } } void MapWnd::HandlePlayerChatMessage(const std::string& msg) @@ -838,9 +828,9 @@ void MapWnd::SelectFleet(Fleet* fleet) { if (System* system = fleet->GetSystem()) { - for (unsigned int i = 0; i < m_system_icons.size(); ++i) { - if (&m_system_icons[i]->GetSystem() == system) { - m_system_icons[i]->ClickFleetButton(fleet); + for (std::map<int, SystemIcon*>::iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { + if (&it->second->GetSystem() == system) { + it->second->ClickFleetButton(fleet); break; } } @@ -859,15 +849,15 @@ std::set<int> destinations; for (unsigned int i = 0; i < fleet_button->Fleets().size(); ++i) { Fleet* fleet = fleet_button->Fleets()[i]; - GG::Pt ul = ClientUpperLeft(); + GG::Pt cl_ul = ClientUpperLeft(); if (fleet->FinalDestinationID() != UniverseObject::INVALID_OBJECT_ID && fleet->FinalDestinationID() != fleet->SystemID() && destinations.find(fleet->FinalDestinationID()) == destinations.end()) { destinations.insert(fleet->FinalDestinationID()); - GG::Pt fleet_ul = fleet_button->UpperLeft(); GG::Pt sz = fleet_button->Size(); - m_fleet_lines[fleet] = MovementLineData((fleet_ul.x + sz.x / 2 - ul.x) / m_zoom_factor, - (fleet_ul.y + sz.y / 2 - ul.y) / m_zoom_factor, + GG::Pt fleet_center = fleet_button->UpperLeft() + GG::Pt(sz.x / 2, sz.y / 2); + m_fleet_lines[fleet] = MovementLineData((fleet_center - cl_ul).x / m_zoom_factor, + (fleet_center - cl_ul).y / m_zoom_factor, fleet->TravelRoute()); } else { m_fleet_lines.erase(fleet); @@ -884,6 +874,29 @@ } } +void MapWnd::SetProjectedFleetMovement(Fleet* fleet, const std::list<System*>& travel_route) +{ + if (!fleet || travel_route.empty()) { + m_projected_fleet_lines = MovementLineData(); + } else { + std::map<Fleet*, MovementLineData>::iterator it = m_fleet_lines.find(fleet); + GG::Clr line_color = Empires().Lookup(*fleet->Owners().begin())->Color(); + if (it != m_fleet_lines.end()) { + m_projected_fleet_lines = m_fleet_lines[fleet]; + m_projected_fleet_lines.destinations = travel_route; + m_projected_fleet_lines.color = line_color; + } else { + GG::Pt cl_ul = ClientUpperLeft(); + const FleetButton* fleet_button = m_system_icons[fleet->SystemID()]->GetFleetButton(fleet); + GG::Pt sz = fleet_button->Size(); + GG::Pt fleet_center = fleet_button->UpperLeft() + GG::Pt(sz.x / 2, sz.y / 2); + m_projected_fleet_lines = MovementLineData((fleet_center - cl_ul).x / m_zoom_factor, + (fleet_center - cl_ul).y / m_zoom_factor, + travel_route, line_color); + } + } +} + bool MapWnd::EventFilter(GG::Wnd* w, const GG::Wnd::Event& event) { if (event.Type() == GG::Wnd::Event::RClick && !FleetWnd::FleetWndsOpen()) { @@ -935,13 +948,13 @@ else ShowSystemNames(); - for (unsigned int i = 0; i < m_system_icons.size(); ++i) { - const System& system = m_system_icons[i]->GetSystem(); + for (std::map<int, SystemIcon*>::iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { + const System& system = it->second->GetSystem(); GG::Pt icon_ul(static_cast<int>((system.X() - ClientUI::SYSTEM_ICON_SIZE / 2.0) * m_zoom_factor), static_cast<int>((system.Y() - ClientUI::SYSTEM_ICON_SIZE / 2.0) * m_zoom_factor)); - m_system_icons[i]->SizeMove(icon_ul, - GG::Pt(static_cast<int>(icon_ul.x + ClientUI::SYSTEM_ICON_SIZE * m_zoom_factor), - static_cast<int>(icon_ul.y + ClientUI::SYSTEM_ICON_SIZE * m_zoom_factor))); + it->second->SizeMove(icon_ul, + GG::Pt(static_cast<int>(icon_ul.x + ClientUI::SYSTEM_ICON_SIZE * m_zoom_factor), + static_cast<int>(icon_ul.y + ClientUI::SYSTEM_ICON_SIZE * m_zoom_factor))); } for (unsigned int i = 0; i < m_moving_fleet_buttons.size(); ++i) { @@ -1075,8 +1088,13 @@ const GLushort PATTERN = 0xF0F0; const int GLUSHORT_BIT_LENGTH = sizeof(GLushort) * 8; const double RATE = 0.25; + const double PROJECTED_PATH_RATE = 0.35; const int SHIFT = static_cast<int>(GG::GUI::GetGUI()->Ticks() * RATE / GLUSHORT_BIT_LENGTH) % GLUSHORT_BIT_LENGTH; + const int PROJECTED_PATH_SHIFT = + static_cast<int>(GG::GUI::GetGUI()->Ticks() * PROJECTED_PATH_RATE / GLUSHORT_BIT_LENGTH) % GLUSHORT_BIT_LENGTH; const unsigned int STIPPLE = (PATTERN << SHIFT) | (PATTERN >> (GLUSHORT_BIT_LENGTH - SHIFT)); + const unsigned int PROJECTED_PATH_STIPPLE = + (PATTERN << PROJECTED_PATH_SHIFT) | (PATTERN >> (GLUSHORT_BIT_LENGTH - PROJECTED_PATH_SHIFT)); double LINE_SCALE = std::max(1.0, 1.333 * m_zoom_factor); glDisable(GL_TEXTURE_2D); @@ -1084,13 +1102,13 @@ glEnable(GL_LINE_STIPPLE); glLineStipple(static_cast<int>(LINE_SCALE), STIPPLE); glLineWidth(LINE_SCALE); - glColor4d(1.0, 1.0, 1.0, 1.0); GG::Pt ul = ClientUpperLeft(); for (std::map<Fleet*, MovementLineData>::iterator it = m_fleet_lines.begin(); it != m_fleet_lines.end(); ++it) { // 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); 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) { @@ -1104,6 +1122,21 @@ glEnd(); } + 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); + 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) { + glVertex2d(ul.x + (*dest_it)->X() * m_zoom_factor, ul.y + (*dest_it)->Y() * m_zoom_factor); + std::list<System*>::const_iterator temp_it = dest_it; + if (++temp_it != destinations.end()) + glVertex2d(ul.x + (*dest_it)->X() * m_zoom_factor, ul.y + (*dest_it)->Y() * m_zoom_factor); + } + glEnd(); + } + glLineWidth(1.0); glDisable(GL_LINE_SMOOTH); glDisable(GL_LINE_STIPPLE); @@ -1166,6 +1199,18 @@ SystemRightClickedSignal(system_id); } +void MapWnd::MouseEnteringSystem(int system_id) +{ + if (!m_in_production_view_mode) + SystemBrowsedSignal(system_id); +} + +void MapWnd::MouseLeavingSystem(int system_id) +{ + if (!m_in_production_view_mode) + SystemBrowsedSignal(UniverseObject::INVALID_OBJECT_ID); +} + void MapWnd::UniverseObjectDeleted(const UniverseObject *obj) { m_fleet_lines.erase(const_cast<Fleet*>(universe_object_cast<const Fleet*>(obj))); Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2006-02-01 04:00:20 UTC (rev 1719) +++ trunk/FreeOrion/UI/MapWnd.h 2006-02-02 00:24:13 UTC (rev 1720) @@ -37,11 +37,13 @@ //! \name Signal Types //!@{ typedef boost::signal<void (int)> SystemLeftClickedSignalType; //!< emitted when the user left-clicks a star system typedef boost::signal<void (int)> SystemRightClickedSignalType; //!< emitted when the user right-clicks a star system + typedef boost::signal<void (int)> SystemBrowsedSignalType; //!< emitted when the user moves the mouse over a star system //!@} //! \name Slot Types //!@{ typedef SystemLeftClickedSignalType::slot_type SystemLeftClickedSlotType; //!< type of functor invoked when the user left-clicks a star system typedef SystemRightClickedSignalType::slot_type SystemRightClickedSlotType; //!< type of functor invoked when the user right-clicks a star system + typedef SystemBrowsedSignalType::slot_type SystemBrowsedSlotType; //!< type of functor invoked when the user moves the mouse over a star system //!@} //! \name Structors //!@{ @@ -76,6 +78,7 @@ mutable SystemLeftClickedSignalType SystemLeftClickedSignal; mutable SystemRightClickedSignalType SystemRightClickedSignal; + mutable SystemBrowsedSignalType SystemBrowsedSignal; void CenterOnMapCoord(double x, double y); //!< centers the map on map position (x, y) void CenterOnSystem(int systemID); //!< centers the map on system \a systemID @@ -88,8 +91,9 @@ void SelectSystem(System* system); //!< allows programmatic selection of planets void SelectFleet(Fleet* fleet); //!< allows programmatic selection of fleets - void SetFleetMovement(FleetButton* fleet_button); //!< allows code that creates FleetButtons to indicate where (and whether) they are moving - void SetFleetMovement(Fleet* fleet); //!< allows updates for single fleets that are already moving + void SetFleetMovement(FleetButton* fleet_button); //!< creates fleet movement lines for all fleets in the given FleetButton to indicate where (and whether) they are moving + void SetFleetMovement(Fleet* fleet); //!< creates fleet movement lines for a single fleet that are already moving + void SetProjectedFleetMovement(Fleet* fleet, const std::list<System*>& travel_route); //!< creates projected fleet movement lines for a fleet that the user has selected void RegisterPopup( MapWndPopup* popup ); //!< registers a MapWndPopup, which can be cleaned up with a call to DeleteAllPopups( ) void RemovePopup( MapWndPopup* popup ); //!< removes a MapWndPopup from the list cleaned up on a call to DeleteAllPopups( ) @@ -117,8 +121,20 @@ void SitRepBtnClicked() {ToggleSitRep();} struct StarlaneData; ///< contains all the information necessary to render a single fleet movement line on the main map - struct MovementLineData; ///< contains all the information necessary to render a single fleet movement line on the main map + /** contains all the information necessary to render a single fleet movement line on the main map */ + struct MovementLineData + { + MovementLineData() {} + MovementLineData(double x_, double y_, const std::list<System*>& dest, GG::Clr clr = GG::CLR_WHITE) : + x(x_), y(y_), destinations(dest), color(clr) {} + double x; + double y; + std::list<System*> destinations; + GG::Clr color; + // TODO : other properties, based on moving empire and destination, etc. (?) + }; + void Zoom(int delta); //!< changes the zoomlevel of the main map void RenderBackgrounds(); //!< renders the backgrounds onto the screen void RenderStarlanes(); //!< renders the starlanes between the systems @@ -127,6 +143,8 @@ void CorrectMapPosition(GG::Pt &move_to_pt); //!< ensures that the map data are positioned sensibly void SystemDoubleClicked(int system_id); void SystemRightClicked(int system_id); + void MouseEnteringSystem(int system_id); + void MouseLeavingSystem(int system_id); void UniverseObjectDeleted(const UniverseObject *obj); bool ReturnToMap(); bool OpenChatWindow(); @@ -166,7 +184,7 @@ 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::vector<SystemIcon*> m_system_icons; //! the system icons in 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 @@ -176,6 +194,7 @@ std::set<StarlaneData> m_starlanes; //! the 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 Modified: trunk/FreeOrion/UI/SystemIcon.cpp =================================================================== --- trunk/FreeOrion/UI/SystemIcon.cpp 2006-02-01 04:00:20 UTC (rev 1719) +++ trunk/FreeOrion/UI/SystemIcon.cpp 2006-02-02 00:24:13 UTC (rev 1720) @@ -71,6 +71,28 @@ SystemIcon::~SystemIcon() {} +const System& SystemIcon::GetSystem() const +{ + return m_system; +} + +const FleetButton* SystemIcon::GetFleetButton(Fleet* fleet) const +{ + std::map<int, FleetButton*>::const_iterator it = m_stationary_fleet_markers.find(*fleet->Owners().begin()); + if (it != m_stationary_fleet_markers.end()) { + const std::vector<Fleet*>& fleets = it->second->Fleets(); + if (std::find(fleets.begin(), fleets.end(), fleet) != fleets.end()) + return it->second; + } + it = m_moving_fleet_markers.find(*fleet->Owners().begin()); + if (it != m_moving_fleet_markers.end()) { + const std::vector<Fleet*>& fleets = it->second->Fleets(); + if (std::find(fleets.begin(), fleets.end(), fleet) != fleets.end()) + return it->second; + } + return 0; +} + void SystemIcon::SizeMove(const GG::Pt& ul, const GG::Pt& lr) { Wnd::SizeMove(ul, lr); @@ -113,11 +135,13 @@ void SystemIcon::MouseEnter(const GG::Pt& pt, Uint32 keys) { m_static_graphic->SetColor(GG::CLR_WHITE); + MouseEnteringSignal(m_system.ID()); } void SystemIcon::MouseLeave(const GG::Pt& pt, Uint32 keys) { m_static_graphic->SetColor(m_default_star_color); + MouseLeavingSignal(m_system.ID()); } void SystemIcon::Refresh() Modified: trunk/FreeOrion/UI/SystemIcon.h =================================================================== --- trunk/FreeOrion/UI/SystemIcon.h 2006-02-01 04:00:20 UTC (rev 1719) +++ trunk/FreeOrion/UI/SystemIcon.h 2006-02-02 00:24:13 UTC (rev 1720) @@ -28,14 +28,16 @@ { public: //! \name Signal Types //!@{ - typedef boost::signal<void (int)> BrowsedSignalType; //!< emitted when the user moves the cursor over 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 //!@} //! \name Slot Types //!@{ - typedef BrowsedSignalType::slot_type BrowsedSlotType; //!< type of functor invoked when the user moves over the system + 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 @@ -47,7 +49,8 @@ //!@} //! \name Accessors //!@{ - const System& GetSystem() const {return m_system;} + const System& GetSystem() const; + const FleetButton* GetFleetButton(Fleet* fleet) const; //!@} //! \name Mutators //!@{ @@ -64,7 +67,8 @@ void ShowName(); //!< enables the system name text void HideName(); //!< disables the system name text - mutable BrowsedSignalType BrowsedSignal; + mutable MouseEnteringSignalType MouseEnteringSignal; + mutable MouseLeavingSignalType MouseLeavingSignal; mutable LeftClickedSignalType LeftClickedSignal; mutable RightClickedSignalType RightClickedSignal; mutable LeftDoubleClickedSignalType LeftDoubleClickedSignal; |
From: <tz...@us...> - 2006-02-02 02:50:55
|
Revision: 1722 Author: tzlaine Date: 2006-02-01 18:50:41 -0800 (Wed, 01 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1722&view=rev Log Message: ----------- Added rollover highlighting to the FocusSelector. Modified Paths: -------------- trunk/FreeOrion/UI/FocusSelector.cpp trunk/FreeOrion/UI/FocusSelector.h trunk/FreeOrion/UI/MapWnd.cpp Modified: trunk/FreeOrion/UI/FocusSelector.cpp =================================================================== --- trunk/FreeOrion/UI/FocusSelector.cpp 2006-02-02 02:27:42 UTC (rev 1721) +++ trunk/FreeOrion/UI/FocusSelector.cpp 2006-02-02 02:50:41 UTC (rev 1722) @@ -45,12 +45,15 @@ FocusButton::FocusButton(GG::Clr color, const boost::shared_ptr<GG::Texture>& image) : Button(0, 0, 1, 1, "", boost::shared_ptr<GG::Font>(), color), - m_texture(image) + m_texture(image), + m_mouse_here(false) {} void FocusButton::Render() { GG::Pt ul = UpperLeft(), lr = LowerRight(); + 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); m_texture->OrthoBlit(ul, lr, 0, false); @@ -62,6 +65,16 @@ RightClickedSignal(); } +void FocusButton::MouseEnter(const GG::Pt& pt, Uint32 keys) +{ + m_mouse_here = true; +} + +void FocusButton::MouseLeave(const GG::Pt& pt, Uint32 keys) +{ + m_mouse_here = false; +} + void FocusButton::SetImage(const boost::shared_ptr<GG::Texture>& image) { m_texture = image; @@ -152,7 +165,8 @@ Control(0, 0, w, w / (FOCUS_SELECTOR_LAST_FOCUS - FOCUS_SELECTOR_FIRST_FOCUS) + FOCUS_SELECTOR_METER_BAR_HEIGHT + FOCUS_SELECTOR_TEXT_HEIGHT), m_primary_focus(resource_center.PrimaryFocus()), m_secondary_focus(resource_center.SecondaryFocus()), - m_first_button_focus(FOCUS_SELECTOR_FIRST_FOCUS) + m_first_button_focus(FOCUS_SELECTOR_FIRST_FOCUS), + m_mouse_here(false) { SetColor(FOCUS_SELECTOR_COLOR); GG::Layout* layout = new GG::Layout(0, 0, Width(), Height(), 3, (FOCUS_SELECTOR_LAST_FOCUS - FOCUS_SELECTOR_FIRST_FOCUS), 1); @@ -204,9 +218,14 @@ void FocusSelector::Render() { + if (m_mouse_here) { + GG::Pt ul = m_focus_buttons[0]->UpperLeft() - GG::Pt(1, 1); + GG::Pt lr = m_focus_buttons.back()->LowerRight() + GG::Pt(1, 1); + GG::FlatRectangle(ul.x, ul.y, lr.x, lr.y, GG::CLR_SHADOW, GG::CLR_ZERO, 0); + } for (unsigned int i = 0; i < m_focus_buttons.size(); ++i) { - GG::Pt ul = m_focus_buttons[i]->UpperLeft() - GG::Pt(1, 1), - lr = m_focus_buttons[i]->LowerRight() + GG::Pt(1, 1); + GG::Pt ul = m_focus_buttons[i]->UpperLeft() - GG::Pt(1, 1); + GG::Pt lr = m_focus_buttons[i]->LowerRight() + GG::Pt(1, 1); GG::FlatRectangle(ul.x, ul.y, lr.x, lr.y, GG::CLR_ZERO, Color(), 1); } GG::Pt ul, lr; @@ -231,6 +250,16 @@ SecondaryFocusChangedSignal(FOCUS_BALANCED); } +void FocusSelector::MouseEnter(const GG::Pt& pt, Uint32 keys) +{ + m_mouse_here = true; +} + +void FocusSelector::MouseLeave(const GG::Pt& pt, Uint32 keys) +{ + m_mouse_here = false; +} + void FocusSelector::Update(const ResourceCenter& resource_center) { m_primary_focus = resource_center.PrimaryFocus(); Modified: trunk/FreeOrion/UI/FocusSelector.h =================================================================== --- trunk/FreeOrion/UI/FocusSelector.h 2006-02-02 02:27:42 UTC (rev 1721) +++ trunk/FreeOrion/UI/FocusSelector.h 2006-02-02 02:50:41 UTC (rev 1722) @@ -15,12 +15,15 @@ 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); void SetImage(const boost::shared_ptr<GG::Texture>& image); mutable ClickedSignalType RightClickedSignal; private: boost::shared_ptr<GG::Texture> m_texture; + bool m_mouse_here; }; class MeterStatusBar : public GG::Wnd @@ -50,6 +53,8 @@ virtual void Render(); 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); void Update(const ResourceCenter& resource_center); mutable FocusChangedSignalType PrimaryFocusChangedSignal; @@ -78,6 +83,7 @@ std::map<FocusType, MeterStatusBar*> m_meter_status_bars; std::vector<FocusButton*> m_focus_buttons; std::vector<GG::TextControl*> m_meter_deltas; + bool m_mouse_here; }; #endif Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2006-02-02 02:27:42 UTC (rev 1721) +++ trunk/FreeOrion/UI/MapWnd.cpp 2006-02-02 02:50:41 UTC (rev 1722) @@ -876,7 +876,8 @@ void MapWnd::SetProjectedFleetMovement(Fleet* fleet, const std::list<System*>& travel_route) { - if (!fleet || travel_route.empty()) { + if (!fleet || travel_route.empty() || + travel_route.size() == 2 && travel_route.front() == travel_route.back()) { m_projected_fleet_lines = MovementLineData(); } else { std::map<Fleet*, MovementLineData>::iterator it = m_fleet_lines.find(fleet); |
From: <tz...@us...> - 2006-02-03 04:58:08
|
Revision: 1724 Author: tzlaine Date: 2006-02-02 20:57:39 -0800 (Thu, 02 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1724&view=rev Log Message: ----------- - Removed all references to the now-obsolete Wnd::DRAG_KEEPER flag. - Added highlighting to the new fleet "drop target" when a valid ship drag-drop moves over it. Modified Paths: -------------- trunk/FreeOrion/UI/About.cpp trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/CUIControls.h trunk/FreeOrion/UI/CUIStyle.cpp trunk/FreeOrion/UI/CUIStyle.h trunk/FreeOrion/UI/FleetWnd.cpp Modified: trunk/FreeOrion/UI/About.cpp =================================================================== --- trunk/FreeOrion/UI/About.cpp 2006-02-02 05:18:59 UTC (rev 1723) +++ trunk/FreeOrion/UI/About.cpp 2006-02-03 04:57:39 UTC (rev 1724) @@ -35,7 +35,7 @@ GG::TF_WORDBREAK | GG::MultiEdit::READ_ONLY, GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS), ClientUI::CTRL_BORDER_COLOR, ClientUI::TEXT_COLOR, - ClientUI::MULTIEDIT_INT_COLOR, GG::CLICKABLE | GG::DRAG_KEEPER); + ClientUI::MULTIEDIT_INT_COLOR, GG::CLICKABLE); GG::Layout* layout = new GG::Layout(0, 0, ClientWidth(), ClientHeight(), 2, 6, 5); layout->SetMinimumRowHeight(1, m_license->Height() + 5); layout->SetRowStretch(0, 1); Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2006-02-02 05:18:59 UTC (rev 1723) +++ trunk/FreeOrion/UI/CUIControls.cpp 2006-02-03 04:57:39 UTC (rev 1724) @@ -507,7 +507,7 @@ // class CUIListBox /////////////////////////////////////// CUIListBox::CUIListBox(int x, int y, int w, int h, GG::Clr color/* = ClientUI::CTRL_BORDER_COLOR*/, - GG::Clr interior/* = GG::CLR_ZERO*/, Uint32 flags/* = CLICKABLE | DRAG_KEEPER*/) : + GG::Clr interior/* = GG::CLR_ZERO*/, Uint32 flags/* = CLICKABLE*/) : ListBox(x, y, w, h, color, interior, flags) { RecreateScrolls(); @@ -614,7 +614,7 @@ CUIEdit::CUIEdit(int x, int y, int w, const std::string& str, const boost::shared_ptr<GG::Font>& font/* = boost::shared_ptr<GG::Font>()*/, GG::Clr color/* = ClientUI::CTRL_BORDER_COLOR*/, GG::Clr text_color/* = ClientUI::TEXT_COLOR*/, GG::Clr interior/* = ClientUI::EDIT_INT_COLOR*/, - Uint32 flags/* = CLICKABLE | DRAG_KEEPER*/) : + Uint32 flags/* = CLICKABLE*/) : Edit(x, y, w, str, FontOrDefaultFont(font), color, text_color, interior, flags) { GG::Connect(EditedSignal, &PlayTextTypingSound, -1); @@ -643,7 +643,7 @@ CUIMultiEdit::CUIMultiEdit(int x, int y, int w, int h, const std::string& str, Uint32 style/* = TF_LINEWRAP*/, const boost::shared_ptr<GG::Font>& font/* = boost::shared_ptr<GG::Font>()*/, GG::Clr color/* = ClientUI::CTRL_BORDER_COLOR*/, GG::Clr text_color/* = ClientUI::TEXT_COLOR*/, - GG::Clr interior/* = ClientUI::MULTIEDIT_INT_COLOR*/, Uint32 flags/* = CLICKABLE | DRAG_KEEPER*/) : + GG::Clr interior/* = ClientUI::MULTIEDIT_INT_COLOR*/, Uint32 flags/* = CLICKABLE*/) : MultiEdit(x, y, w, h, str, FontOrDefaultFont(font), color, style, text_color, interior, flags) { RecreateScrolls(); Modified: trunk/FreeOrion/UI/CUIControls.h =================================================================== --- trunk/FreeOrion/UI/CUIControls.h 2006-02-02 05:18:59 UTC (rev 1723) +++ trunk/FreeOrion/UI/CUIControls.h 2006-02-03 04:57:39 UTC (rev 1724) @@ -200,7 +200,7 @@ public: /** \name Structors */ //@{ CUIListBox(int x, int y, int w, int h, GG::Clr color = ClientUI::CTRL_BORDER_COLOR, GG::Clr interior = GG::CLR_ZERO, - Uint32 flags = GG::CLICKABLE | GG::DRAG_KEEPER); ///< basic ctor + Uint32 flags = GG::CLICKABLE); ///< basic ctor //@} /** \name Mutators */ //@{ @@ -241,7 +241,7 @@ /** \name Structors */ //@{ CUIEdit(int x, int y, int w, const std::string& str, const boost::shared_ptr<GG::Font>& font = boost::shared_ptr<GG::Font>(), GG::Clr color = ClientUI::CTRL_BORDER_COLOR, GG::Clr text_color = ClientUI::TEXT_COLOR, - GG::Clr interior = ClientUI::EDIT_INT_COLOR, Uint32 flags = GG::CLICKABLE | GG::DRAG_KEEPER); ///< basic ctor + GG::Clr interior = ClientUI::EDIT_INT_COLOR, Uint32 flags = GG::CLICKABLE); ///< basic ctor //@} /** \name Mutators */ //@{ @@ -258,7 +258,7 @@ CUIMultiEdit(int x, int y, int w, int h, const std::string& str, Uint32 style = GG::TF_LINEWRAP, const boost::shared_ptr<GG::Font>& font = boost::shared_ptr<GG::Font>(), GG::Clr color = ClientUI::CTRL_BORDER_COLOR, GG::Clr text_color = ClientUI::TEXT_COLOR, - GG::Clr interior = ClientUI::MULTIEDIT_INT_COLOR, Uint32 flags = GG::CLICKABLE | GG::DRAG_KEEPER); ///< basic ctor + GG::Clr interior = ClientUI::MULTIEDIT_INT_COLOR, Uint32 flags = GG::CLICKABLE); ///< basic ctor //@} /** \name Mutators */ //@{ Modified: trunk/FreeOrion/UI/CUIStyle.cpp =================================================================== --- trunk/FreeOrion/UI/CUIStyle.cpp 2006-02-02 05:18:59 UTC (rev 1723) +++ trunk/FreeOrion/UI/CUIStyle.cpp 2006-02-03 04:57:39 UTC (rev 1724) @@ -27,13 +27,13 @@ GG::Edit* CUIStyle::NewEdit(int x, int y, int w, const std::string& str, const boost::shared_ptr<GG::Font>& font, GG::Clr color, GG::Clr text_color/* = GG::CLR_BLACK*/, GG::Clr interior/* = GG::CLR_ZERO*/, - Uint32 flags/* = GG::CLICKABLE | GG::DRAG_KEEPER*/) const + Uint32 flags/* = GG::CLICKABLE*/) const { return new CUIEdit(x, y, w, str); } GG::ListBox* CUIStyle::NewListBox(int x, int y, int w, int h, GG::Clr color, GG::Clr interior/* = GG::CLR_ZERO*/, - Uint32 flags/* = GG::CLICKABLE | GG::DRAG_KEEPER*/) const + Uint32 flags/* = GG::CLICKABLE*/) const { return new CUIListBox(x, y, w, h); } @@ -41,7 +41,7 @@ GG::MultiEdit* CUIStyle::NewMultiEdit(int x, int y, int w, int h, const std::string& str, const boost::shared_ptr<GG::Font>& font, GG::Clr color, Uint32 style/* = GG::TF_LINEWRAP*/, GG::Clr text_color/* = GG::CLR_BLACK*/, GG::Clr interior/* = GG::CLR_ZERO*/, - Uint32 flags/* = GG::CLICKABLE |GG::DRAG_KEEPER*/) const + Uint32 flags/* = GG::CLICKABLE*/) const { return new CUIMultiEdit(x, y, w, h, str); } @@ -61,14 +61,14 @@ GG::Spin<int>* CUIStyle::NewIntSpin(int x, int y, int w, int value, int step, int min, int max, bool edits, const boost::shared_ptr<GG::Font>& font, GG::Clr color, GG::Clr text_color/* = GG::CLR_BLACK*/, - GG::Clr interior/* = GG::CLR_ZERO*/, Uint32 flags/* = GG::CLICKABLE | GG::DRAG_KEEPER*/) const + GG::Clr interior/* = GG::CLR_ZERO*/, Uint32 flags/* = GG::CLICKABLE*/) const { return new CUISpin<int>(x, y, w, value, step, min, max, edits); } GG::Spin<double>* CUIStyle::NewDoubleSpin(int x, int y, int w, double value, double step, double min, double max, bool edits, const boost::shared_ptr<GG::Font>& font, GG::Clr color, GG::Clr text_color/* = GG::CLR_BLACK*/, - GG::Clr interior/* = GG::CLR_ZERO*/, Uint32 flags/* = GG::CLICKABLE | GG::DRAG_KEEPER*/) const + GG::Clr interior/* = GG::CLR_ZERO*/, Uint32 flags/* = GG::CLICKABLE*/) const { return new CUISpin<double>(x, y, w, value, step, min, max, edits); } Modified: trunk/FreeOrion/UI/CUIStyle.h =================================================================== --- trunk/FreeOrion/UI/CUIStyle.h 2006-02-02 05:18:59 UTC (rev 1723) +++ trunk/FreeOrion/UI/CUIStyle.h 2006-02-03 04:57:39 UTC (rev 1724) @@ -21,15 +21,15 @@ virtual GG::Edit* NewEdit(int x, int y, int w, const std::string& str, const boost::shared_ptr<GG::Font>& font, GG::Clr color, GG::Clr text_color = GG::CLR_BLACK, GG::Clr interior = GG::CLR_ZERO, - Uint32 flags = GG::CLICKABLE | GG::DRAG_KEEPER) const; + Uint32 flags = GG::CLICKABLE) const; virtual GG::ListBox* NewListBox(int x, int y, int w, int h, GG::Clr color, GG::Clr interior = GG::CLR_ZERO, - Uint32 flags = GG::CLICKABLE | GG::DRAG_KEEPER) const; + Uint32 flags = GG::CLICKABLE) const; virtual GG::MultiEdit* NewMultiEdit(int x, int y, int w, int h, const std::string& str, const boost::shared_ptr<GG::Font>& font, GG::Clr color, Uint32 style = GG::TF_LINEWRAP, GG::Clr text_color = GG::CLR_BLACK, GG::Clr interior = GG::CLR_ZERO, - Uint32 flags = GG::CLICKABLE |GG::DRAG_KEEPER) const; + Uint32 flags = GG::CLICKABLE) const; virtual GG::Scroll* NewScroll(int x, int y, int w, int h, GG::Orientation orientation, GG::Clr color, GG::Clr interior, Uint32 flags = GG::CLICKABLE | GG::REPEAT_BUTTON_DOWN) const; @@ -40,11 +40,11 @@ virtual GG::Spin<int>* NewIntSpin(int x, int y, int w, int value, int step, int min, int max, bool edits, const boost::shared_ptr<GG::Font>& font, GG::Clr color, GG::Clr text_color = GG::CLR_BLACK, - GG::Clr interior = GG::CLR_ZERO, Uint32 flags = GG::CLICKABLE | GG::DRAG_KEEPER) const; + GG::Clr interior = GG::CLR_ZERO, Uint32 flags = GG::CLICKABLE) const; virtual GG::Spin<double>* NewDoubleSpin(int x, int y, int w, double value, double step, double min, double max, bool edits, const boost::shared_ptr<GG::Font>& font, GG::Clr color, GG::Clr text_color = GG::CLR_BLACK, - GG::Clr interior = GG::CLR_ZERO, Uint32 flags = GG::CLICKABLE | GG::DRAG_KEEPER) const; + GG::Clr interior = GG::CLR_ZERO, Uint32 flags = GG::CLICKABLE) const; virtual GG::Button* NewScrollUpButton(int x, int y, int w, int h, const std::string& str, const boost::shared_ptr<GG::Font>& font, GG::Clr color, GG::Clr text_color = GG::CLR_BLACK, Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-02 05:18:59 UTC (rev 1723) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-03 04:57:39 UTC (rev 1724) @@ -36,6 +36,8 @@ FleetDataPanel(int w, int h, const Fleet* fleet); 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 AcceptDrops(std::list<Wnd*>& wnds, const GG::Pt& pt); void Select(bool b); @@ -290,6 +292,22 @@ GG::FlatRectangle(text_ul.x, text_ul.y, text_lr.x + 5, text_lr.y, color_to_use, GG::CLR_ZERO, 0); } +void FleetDataPanel::DragDropEnter(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) +{ + Select(true); + for (std::map<Wnd*, GG::Pt>::const_iterator it = drag_drop_wnds.begin(); it != drag_drop_wnds.end(); ++it) { + if (it->first->DragDropDataType() != SHIP_DROP_TYPE_STRING) { + Select(false); + break; + } + } +} + +void FleetDataPanel::DragDropLeave(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) +{ + Select(false); +} + void FleetDataPanel::AcceptDrops(std::list<Wnd*>& wnds, const GG::Pt& pt) { std::vector<Ship*> ships; @@ -307,11 +325,12 @@ NewFleetFromShipsSignal(ships[0], ship_ids); } wnds.clear(); + Select(false); } void FleetDataPanel::Select(bool b) { - if (m_fleet && m_selected != b) { + if (m_selected != b) { m_selected = b; const GG::Clr& unselected_text_color = ClientUI::TEXT_COLOR; |
From: <tz...@us...> - 2006-02-04 20:21:35
|
Revision: 1727 Author: tzlaine Date: 2006-02-04 12:21:20 -0800 (Sat, 04 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1727&view=rev Log Message: ----------- Removed obsolete UI/ToolWnd.* and UI/ToolContainer.* files. Removed Paths: ------------- trunk/FreeOrion/UI/ToolContainer.cpp trunk/FreeOrion/UI/ToolContainer.h trunk/FreeOrion/UI/ToolWnd.cpp trunk/FreeOrion/UI/ToolWnd.h Deleted: trunk/FreeOrion/UI/ToolContainer.cpp =================================================================== --- trunk/FreeOrion/UI/ToolContainer.cpp 2006-02-03 22:53:17 UTC (rev 1726) +++ trunk/FreeOrion/UI/ToolContainer.cpp 2006-02-04 20:21:20 UTC (rev 1727) @@ -1,64 +0,0 @@ -#include "ToolContainer.h" - -#include "GGApp.h" -#include "GGWnd.h" -#include "../util/MultiplayerCommon.h" - - -namespace { - bool temp_header_bool = RecordHeaderFile(ToolContainerRevision()); - bool temp_source_bool = RecordSourceFile("$Id$"); -} - - -ToolContainer::ToolContainer(int delay/* = 1000*/) : - m_timer_id(SDL_AddTimer(delay, &Callback, static_cast<void*>(this))) -{ -} - -ToolContainer::~ToolContainer() -{ -} - -bool ToolContainer::AttachToolWnd(GG::Wnd* parent, GG::Wnd* tool_tip) -{ - // this function attaches the tool tip wnd as a child to the parent it also adds it to the map - - if (!parent) - return false; - - parent->AttachChild(tool_tip); - - if (!tool_tip) // if its NULL its the same as erasing - m_tool_tip_wnds.erase(parent); - else // add to the map...will overwrite if it exists - m_tool_tip_wnds[parent] = tool_tip; - - return true; -} - -Uint32 ToolContainer::Callback(Uint32 interval, void* param) -{ - static GG::Wnd* prev_tool_tip_wnd = 0; - ToolContainer* this_ptr = reinterpret_cast<ToolContainer*>(param); - - GG::Wnd* wnd = GG::App::GetApp()->GetWindowUnder(GG::App::GetApp()->MousePosition()); - - if (wnd == prev_tool_tip_wnd) - return interval; - - // if there is an old tooltip window active, hide it - std::map<GG::Wnd*, GG::Wnd*>::iterator it = this_ptr->m_tool_tip_wnds.find(prev_tool_tip_wnd); - if (it != this_ptr->m_tool_tip_wnds.end()) { - it->second->Hide(); - } - - // if wnd is in our list of tool tip windows, show it - if ((it = this_ptr->m_tool_tip_wnds.find(wnd)) != this_ptr->m_tool_tip_wnds.end()) { - it->second->Show(); - } - - prev_tool_tip_wnd = wnd; - - return interval; -} Deleted: trunk/FreeOrion/UI/ToolContainer.h =================================================================== --- trunk/FreeOrion/UI/ToolContainer.h 2006-02-03 22:53:17 UTC (rev 1726) +++ trunk/FreeOrion/UI/ToolContainer.h 2006-02-04 20:21:20 UTC (rev 1727) @@ -1,50 +0,0 @@ -// -*- C++ -*- -#ifndef _ToolContainer_h_ -#define _ToolContainer_h_ - -#ifndef _SDL_timer_h -#include "SDL_timer.h" -#endif - -#include <map> -#include <string> - -namespace GG {class Wnd;} - -//!ToolContainer acts as a container for all of the tool tip windows in an -//!entire application. Once initialized, the container operates without any -//!intervention until it is destroyed. Only one object should be active at a -//!time. Windows are added to the ToolContainer using the AttachToolWnd() function. -class ToolContainer -{ -public: - //! \name Structors - //!@{ - //! Basic ctor - //! @param delay number of milliseconds the mouse must hover before a window appears. - ToolContainer(int delay = 1000); - - ~ToolContainer(); ///< dtor - //!@} - - //! \name Initialization - //!@{ - //! Attaches a ToolWnd to its parent window - //! @param parent a pointer to a GG::Wnd representing the parent of the tool tip - //! @param tool the pointer to the ToolWnd - //! A ToolWnd attached in this way will be destroyed by GG when the application exits. - //! DO NOT MANUALLY delete() A ToolWnd THAT HAS BEEN ATTACHED TO A PARENT!!!! - bool AttachToolWnd(GG::Wnd* parent, GG::Wnd* tool_tip); - //!@} - -private: - std::map<GG::Wnd*, GG::Wnd*> m_tool_tip_wnds; //!< a map of wnds to toolwnds - SDL_TimerID m_timer_id; //!< SDL_Timer usage - - static Uint32 Callback(Uint32, void*); //!< callback function for SDL_Timer -}; - -inline std::string ToolContainerRevision() -{return "$Id$";} - -#endif // _ToolContainer_h_ Deleted: trunk/FreeOrion/UI/ToolWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ToolWnd.cpp 2006-02-03 22:53:17 UTC (rev 1726) +++ trunk/FreeOrion/UI/ToolWnd.cpp 2006-02-04 20:21:20 UTC (rev 1727) @@ -1,33 +0,0 @@ -#include "ToolWnd.h" - -#include "GGDrawUtil.h" -#include "../util/MultiplayerCommon.h" - - -namespace { - bool temp_header_bool = RecordHeaderFile(ToolWndRevision()); - bool temp_source_bool = RecordSourceFile("$Id$"); -} - - -ToolWnd::ToolWnd(int x, int y, const std::string& text, const GG::Clr& wnd_color, const GG::Clr& border_color, - const GG::Clr& text_color, const std::string& font_name /* = "arial.ttf"*/, int pts /*= 10*/) : - GG::Wnd(x, y, 10, 10, 0), - m_color(wnd_color), - m_border_color(border_color) -{ - m_text = new GG::TextControl(4, 4, text.c_str(), font_name, pts, text_color); - Resize(m_text->GG::Wnd::Width() + 8, m_text->GG::Wnd::Height() + 8); - AttachChild(m_text); - Hide(); -} - -bool ToolWnd::Render() -{ - GG::Pt ul = UpperLeft(), lr = LowerRight(); - GG::FlatRectangle(ul.x, ul.y, lr.x, lr.y, m_color, m_border_color, 1); - GG::FlatRectangle(ul.x + 2, ul.y + 2, lr.x - 2, lr.y - 2, GG::CLR_ZERO, m_border_color); - return true; -} - - Deleted: trunk/FreeOrion/UI/ToolWnd.h =================================================================== --- trunk/FreeOrion/UI/ToolWnd.h 2006-02-03 22:53:17 UTC (rev 1726) +++ trunk/FreeOrion/UI/ToolWnd.h 2006-02-04 20:21:20 UTC (rev 1727) @@ -1,44 +0,0 @@ -// -*- C++ -*- -//ToolWnd.h -#ifndef _ToolWnd_h_ -#define _ToolWnd_h_ - -#ifndef _GGWnd_h_ -#include "GGWnd.h" -#endif - -#ifndef _GGTextControl_h_ -#include "GGTextControl.h" -#endif - -/** Implements a Tooltip window containing a string. This window appears when the mouse hovers over its parent - window for a specified amount of time. */ -class ToolWnd : public GG::Wnd -{ -public: - //! \name Structors - //!@{ - //! Constructs a Tooltip window at (x,y) containing text with the specified background color. - //! @param x the x coordinate of the tooltip. - //! @param y the y coordinate of the tooltip. - //! @param text the string that the tooltip will display - //! @param clr the background color of the window. Text is always black. - ToolWnd(int x, int y, const std::string& text, const GG::Clr& wnd_color, const GG::Clr& border_color, - const GG::Clr& text_color, const std::string& font_name = "arial.ttf", int pts = 10); - //!@} - - //! \name Mutators - //!@{ - virtual bool Render(); - //!@} - -private: - GG::TextControl* m_text; //!< where the text is contained - GG::Clr m_color; //!< the color of the tool window - GG::Clr m_border_color; //!< the color of the border of the tool window -}; - -inline std::string ToolWndRevision() -{return "$Id$";} - -#endif // _ToolWnd_h_ |
From: <tz...@us...> - 2006-02-06 00:29:10
|
Revision: 1729 Author: tzlaine Date: 2006-02-05 16:28:50 -0800 (Sun, 05 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1729&view=rev Log Message: ----------- Several UI improvements: - Fixed the off-center appearance of CUISpin up/down buttons. - Added drag-drop rollover highlighting to Fleet rows in the FleetWnd (formerly, highlighting only appeared on the new fleet drop target). - Added a call to GUI::SetMinDragTime(0), to reduce the latency when dragging the map, without reintroducing the blinking effect of clicking draggable Wnds (the MinDragDistance() remains the default). Modified Paths: -------------- trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/CUIDrawUtil.cpp trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/client/human/HumanClientApp.cpp Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2006-02-06 00:24:59 UTC (rev 1728) +++ trunk/FreeOrion/UI/CUIControls.cpp 2006-02-06 00:28:50 UTC (rev 1729) @@ -234,7 +234,7 @@ bool CUIArrowButton::InWindow(const GG::Pt& pt) const { - GG::Pt ul = UpperLeft(), lr = LowerRight(); + GG::Pt ul = UpperLeft() + GG::Pt(3, 1), lr = LowerRight() - GG::Pt(2, 1); return InIsoscelesTriangle(pt, ul.x, ul.y, lr.x, lr.y, m_orientation); } @@ -258,7 +258,7 @@ void CUIArrowButton::RenderRollover() { - GG::Pt ul = UpperLeft() + GG::Pt(2, 1), lr = LowerRight() - GG::Pt(2, 1); + GG::Pt ul = UpperLeft() + GG::Pt(3, 1), lr = LowerRight() - GG::Pt(2, 1); GG::Clr color_to_use = Disabled() ? DisabledColor(Color()) : Color(); if (!Disabled()) AdjustBrightness(color_to_use, ARROW_BRIGHTENING_SCALE_FACTOR); @@ -267,7 +267,7 @@ void CUIArrowButton::RenderUnpressed() { - GG::Pt ul = UpperLeft() + GG::Pt(2, 1), lr = LowerRight() - GG::Pt(2, 1); + GG::Pt ul = UpperLeft() + GG::Pt(3, 1), lr = LowerRight() - GG::Pt(2, 1); GG::Clr color_to_use = Disabled() ? DisabledColor(Color()) : Color(); IsoscelesTriangle(ul.x, ul.y, lr.x, lr.y, m_orientation, color_to_use); } Modified: trunk/FreeOrion/UI/CUIDrawUtil.cpp =================================================================== --- trunk/FreeOrion/UI/CUIDrawUtil.cpp 2006-02-06 00:24:59 UTC (rev 1728) +++ trunk/FreeOrion/UI/CUIDrawUtil.cpp 2006-02-06 00:28:50 UTC (rev 1729) @@ -6,7 +6,7 @@ namespace { void FindIsoscelesTriangleVertices(int x1, int y1, int x2, int y2, ShapeOrientation orientation, - int& x1_, int& y1_, int& x2_, int& y2_, int& x3_, int& y3_) + double& x1_, double& y1_, double& x2_, double& y2_, double& x3_, double& y3_) { switch (orientation) { case SHAPE_UP: @@ -14,7 +14,7 @@ y1_ = y2; x2_ = x2; y2_ = y2; - x3_ = (x1 + x2) / 2; + x3_ = (x1 + x2) / 2.0; y3_ = y1; break; case SHAPE_DOWN: @@ -22,7 +22,7 @@ y1_ = y1; x2_ = x1; y2_ = y1; - x3_ = (x1 + x2) / 2; + x3_ = (x1 + x2) / 2.0; y3_ = y2; break; case SHAPE_LEFT: @@ -31,7 +31,7 @@ x2_ = x2; y2_ = y1; x3_ = x1; - y3_ = (y1 + y2) / 2; + y3_ = (y1 + y2) / 2.0; break; case SHAPE_RIGHT: x1_ = x1; @@ -39,7 +39,7 @@ x2_ = x1; y2_ = y2; x3_ = x2; - y3_ = (y1 + y2) / 2; + y3_ = (y1 + y2) / 2.0; break; } } @@ -181,56 +181,59 @@ return retval; } -void Triangle(int x1, int y1, int x2, int y2, int x3, int y3, GG::Clr color, bool border/*= true*/) +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); glBegin(GL_TRIANGLES); - glVertex2i(x1, y1); - glVertex2i(x2, y2); - glVertex2i(x3, y3); + glVertex2d(x1, y1); + glVertex2d(x2, y2); + glVertex2d(x3, y3); glEnd(); if (border) { AdjustBrightness(color, 75); // trace the lines both ways, to ensure that this small polygon looks symmetrical glColor4ubv(color.v); glBegin(GL_LINE_LOOP); - glVertex2i(x3, y3); - glVertex2i(x2, y2); - glVertex2i(x1, y1); + glVertex2d(x3, y3); + glVertex2d(x2, y2); + glVertex2d(x1, y1); glEnd(); glBegin(GL_LINE_LOOP); - glVertex2i(x1, y1); - glVertex2i(x2, y2); - glVertex2i(x3, y3); + glVertex2d(x1, y1); + glVertex2d(x2, y2); + glVertex2d(x3, y3); glEnd(); } glEnable(GL_TEXTURE_2D); } -bool InTriangle(const GG::Pt& pt, int x1, int y1, int x2, int y2, int x3, int y3) +bool InTriangle(const GG::Pt& pt, double x1, double y1, double x2, double y2, double x3, double y3) { - GG::Pt vec_A(x2 - x1, y2 - y1); // side A is the vector from pt1 to pt2 - GG::Pt vec_B(x3 - x2, y3 - y2); // side B is the vector from pt2 to pt3 - GG::Pt vec_C(x1 - x3, y1 - y3); // side C is the vector from pt3 to pt1 + double vec_A_x = x2 - x1; // side A is the vector from pt1 to pt2 + double vec_A_y = y2 - y1; // side A is the vector from pt1 to pt2 + double vec_B_x = x3 - x2; // side B is the vector from pt2 to pt3 + double vec_B_y = y3 - y2; // side B is the vector from pt2 to pt3 + double vec_C_x = x1 - x3; // side C is the vector from pt3 to pt1 + double vec_C_y = y1 - y3; // side C is the vector from pt3 to pt1 // take dot products of perpendicular vectors (normals of sides) with point pt, and sum the signs of these products - int sum = (0 < (pt.x - x1) * vec_A.y + (pt.y - y1) * -vec_A.x ? 1 : 0) + - (0 < (pt.x - x2) * vec_B.y + (pt.y - y2) * -vec_B.x ? 1 : 0) + - (0 < (pt.x - x3) * vec_C.y + (pt.y - y3) * -vec_C.x ? 1 : 0); + int sum = (0 < (pt.x - x1) * vec_A_y + (pt.y - y1) * -vec_A_x ? 1 : 0) + + (0 < (pt.x - x2) * vec_B_y + (pt.y - y2) * -vec_B_x ? 1 : 0) + + (0 < (pt.x - x3) * vec_C_y + (pt.y - y3) * -vec_C_x ? 1 : 0); // if the products are all the same sign, the point is in the triangle return (sum == 3 || sum == 0); } void IsoscelesTriangle(int x1, int y1, int x2, int y2, ShapeOrientation orientation, GG::Clr color, bool border/* = true*/) { - int x1_, y1_, x2_, y2_, x3_, y3_; + double x1_, y1_, x2_, y2_, x3_, y3_; FindIsoscelesTriangleVertices(x1, y1, x2, y2, orientation, x1_, y1_, x2_, y2_, x3_, y3_); Triangle(x1_, y1_, x2_, y2_, x3_, y3_, color, border); } bool InIsoscelesTriangle(const GG::Pt& pt, int x1, int y1, int x2, int y2, ShapeOrientation orientation) { - int x1_, y1_, x2_, y2_, x3_, y3_; + double x1_, y1_, x2_, y2_, x3_, y3_; FindIsoscelesTriangleVertices(x1, y1, x2, y2, orientation, x1_, y1_, x2_, y2_, x3_, y3_); return InTriangle(pt, x1_, y1_, x2_, y2_, x3_, y3_); } @@ -315,7 +318,7 @@ { if (orientation == SHAPE_UP || orientation == SHAPE_DOWN) orientation = SHAPE_LEFT; - int x1_, y1_, x2_, y2_, x3_, y3_; + double x1_, y1_, x2_, y2_, x3_, y3_; FindIsoscelesTriangleVertices(x1, y1, x2, y2, orientation, x1_, y1_, x2_, y2_, x3_, y3_); return InTriangle(pt, x1_, y1_, x2_, y2_, x3_, y3_); } Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-06 00:24:59 UTC (rev 1728) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-06 00:28:50 UTC (rev 1729) @@ -21,7 +21,6 @@ #include <GG/TextControl.h> #include <boost/format.hpp> -#include <iostream> class FleetDataPanel : public GG::Control @@ -35,6 +34,8 @@ FleetDataPanel(int w, int h, const Fleet* fleet); + bool Selected() const; + 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); @@ -61,7 +62,7 @@ const int NEW_FLEET_BUTTON_WIDTH = 75; const int FLEET_LISTBOX_WIDTH = 250; const int FLEET_LISTBOX_HEIGHT = 150; - const int CONTROL_MARGIN = 5; // gap to leave between controls in these window + const int CONTROL_MARGIN = 5; // gap to leave between controls in these windows const std::string SHIP_DROP_TYPE_STRING = "FLeetWnd ShipRow"; const std::string FLEET_DROP_TYPE_STRING = "FleetWnd FleetRow"; @@ -275,6 +276,11 @@ Refresh(); } +bool FleetDataPanel::Selected() const +{ + return m_selected; +} + void FleetDataPanel::Render() { const GG::Clr& unselected_color = GG::CLR_GRAY; @@ -436,6 +442,41 @@ //////////////////////////////////////////////// +// FleetDetailPanel +//////////////////////////////////////////////// +class ShipsListBox; +class FleetDetailPanel : public GG::Wnd +{ +public: + FleetDetailPanel(Fleet* fleet, bool read_only, Uint32 flags = 0); ///< ctor + + Fleet* GetFleet() const {return m_fleet;} ///< returns the currently-displayed fleet (may be 0) + + void SetFleet(Fleet* fleet); ///< sets the currently-displayed Fleet (may be null) + + mutable boost::signal<void (Fleet*)> PanelEmptySignal; + +private: + int GetShipIDOfListRow(int row_idx) const; ///< returns the ID number of the ship in row \a row_idx of the ships listbox + void Init(); + void Refresh(); + void UniverseObjectDeleted(const UniverseObject *); + void ShipSelectionChanged(const std::set<int>& rows); + void ShipBrowsed(int row_idx); + void ShipRightClicked(int row_idx, GG::ListBox::Row* row, const GG::Pt& pt); + std::string DestinationText() const; + std::string ShipStatusText(int ship_id) const; + + Fleet* m_fleet; + const bool m_read_only; + boost::signals::connection m_fleet_connection; + + GG::TextControl* m_destination_text; + ShipsListBox* m_ships_lb; + GG::TextControl* m_ship_status_text; +}; + +//////////////////////////////////////////////// // FleetsListBox //////////////////////////////////////////////// class FleetsListBox : public CUIListBox @@ -443,6 +484,7 @@ public: FleetsListBox(int x, int y, int w, int h, bool read_only) : CUIListBox(x, y, w, h), + m_selected_fleet_row(-1), m_read_only(read_only) {} @@ -499,7 +541,59 @@ } } + 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) + { + int row_index = RowUnderPt(pt); + + if (m_selected_fleet_row != row_index) + ClearSelection(); + + 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; + bool fleets_seen = false; + bool ships_seen = false; + for (std::map<Wnd*, GG::Pt>::const_iterator it = drag_drop_wnds.begin(); it != drag_drop_wnds.end(); ++it) { + if (it->first->DragDropDataType() == FLEET_DROP_TYPE_STRING) { + fleets_seen = true; + } else if (it->first->DragDropDataType() == SHIP_DROP_TYPE_STRING) { + ships_seen = true; + } else { + valid_drop = false; + break; + } + } + if (fleets_seen && ships_seen) + valid_drop = false; + if (valid_drop) { + fleet_data_panel->Select(true); + m_selected_fleet_row = row_index; + } + } + } + + virtual void DragDropLeave(const GG::Pt& pt, const std::map<Wnd*, GG::Pt>& drag_drop_wnds, Uint32 keys) + { + ClearSelection(); + } + private: + void ClearSelection() + { + if (m_selected_fleet_row != -1) + static_cast<FleetDataPanel*>((*static_cast<FleetRow*>(&GetRow(m_selected_fleet_row)))[0])->Select(false); + m_selected_fleet_row = -1; + } + + int m_selected_fleet_row; const bool m_read_only; }; @@ -547,39 +641,8 @@ }; //////////////////////////////////////////////// -// FleetDetailPanel +// FleetDetailPanel implementation //////////////////////////////////////////////// -class FleetDetailPanel : public GG::Wnd -{ -public: - FleetDetailPanel(Fleet* fleet, bool read_only, Uint32 flags = 0); ///< ctor - - Fleet* GetFleet() const {return m_fleet;} ///< returns the currently-displayed fleet (may be 0) - - void SetFleet(Fleet* fleet); ///< sets the currently-displayed Fleet (may be null) - - mutable boost::signal<void (Fleet*)> PanelEmptySignal; - -private: - int GetShipIDOfListRow(int row_idx) const; ///< returns the ID number of the ship in row \a row_idx of the ships listbox - void Init(); - void Refresh(); - void UniverseObjectDeleted(const UniverseObject *); - void ShipSelectionChanged(const std::set<int>& rows); - void ShipBrowsed(int row_idx); - void ShipRightClicked(int row_idx, GG::ListBox::Row* row, const GG::Pt& pt); - std::string DestinationText() const; - std::string ShipStatusText(int ship_id) const; - - Fleet* m_fleet; - const bool m_read_only; - boost::signals::connection m_fleet_connection; - - GG::TextControl* m_destination_text; - ShipsListBox* m_ships_lb; - GG::TextControl* m_ship_status_text; -}; - FleetDetailPanel::FleetDetailPanel(Fleet* fleet, bool read_only, Uint32 flags/* = 0*/) : Wnd(0, 0, 1, 1, flags), m_fleet(0), @@ -1103,7 +1166,6 @@ break; } } - std::cout << "DeleteFleetOrder(fleet_id=" << fleet->ID() << ")" << std::endl; HumanClientApp::Orders().IssueOrder(new DeleteFleetOrder(HumanClientApp::GetApp()->EmpireID(), fleet->ID())); } Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-02-06 00:24:59 UTC (rev 1728) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-02-06 00:28:50 UTC (rev 1729) @@ -233,6 +233,8 @@ boost::shared_ptr<GG::StyleFactory> style(new CUIStyle()); SetStyleFactory(style); + + GUI::SetMinDragTime(0); } HumanClientApp::~HumanClientApp() |
From: <tz...@us...> - 2006-02-06 01:18:33
|
Revision: 1730 Author: tzlaine Date: 2006-02-05 17:18:13 -0800 (Sun, 05 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1730&view=rev Log Message: ----------- Several UI improvements: - "The <System Name> System" is now just "<System Name>" in the SidePanel. - Projected movement lines now skip the fleet's current system. - Projected movement lines update when the destination for the fleet is changed. - The planet name is no longer partially obscured behind very large planets in the SidePanel. - The expand/collapse button on TEchs in the TechTreeWnd now exhibit rollover highlighting, like most other buttons. Modified Paths: -------------- trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/UI/TechTreeWnd.cpp trunk/FreeOrion/default/eng_stringtable.txt Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-06 00:28:50 UTC (rev 1729) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-06 01:18:13 UTC (rev 1730) @@ -999,9 +999,8 @@ HumanClientApp::Orders().IssueOrder(new FleetMoveOrder(empire_id, fleet->ID(), start_system, system_id)); if (fleet->SystemID() == UniverseObject::INVALID_OBJECT_ID) ClientUI::GetClientUI()->GetMapWnd()->SetFleetMovement(fleet); - } else { - ClientUI::GetClientUI()->GetMapWnd()->SetProjectedFleetMovement(fleet, route); } + ClientUI::GetClientUI()->GetMapWnd()->SetProjectedFleetMovement(fleet, route); } } } Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2006-02-06 00:28:50 UTC (rev 1729) +++ trunk/FreeOrion/UI/MapWnd.cpp 2006-02-06 01:18:13 UTC (rev 1730) @@ -880,11 +880,14 @@ travel_route.size() == 2 && travel_route.front() == travel_route.back()) { m_projected_fleet_lines = MovementLineData(); } else { + std::list<System*> route = travel_route; + if (route.front() == fleet->GetSystem()) + route.pop_front(); std::map<Fleet*, MovementLineData>::iterator it = m_fleet_lines.find(fleet); GG::Clr line_color = Empires().Lookup(*fleet->Owners().begin())->Color(); if (it != m_fleet_lines.end()) { m_projected_fleet_lines = m_fleet_lines[fleet]; - m_projected_fleet_lines.destinations = travel_route; + m_projected_fleet_lines.destinations = route; m_projected_fleet_lines.color = line_color; } else { GG::Pt cl_ul = ClientUpperLeft(); @@ -893,7 +896,7 @@ GG::Pt fleet_center = fleet_button->UpperLeft() + GG::Pt(sz.x / 2, sz.y / 2); m_projected_fleet_lines = MovementLineData((fleet_center - cl_ul).x / m_zoom_factor, (fleet_center - cl_ul).y / m_zoom_factor, - travel_route, line_color); + route, line_color); } } } Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2006-02-06 00:28:50 UTC (rev 1729) +++ trunk/FreeOrion/UI/SidePanel.cpp 2006-02-06 01:18:13 UTC (rev 1730) @@ -699,9 +699,6 @@ { SetText(UserString("PLANET_PANEL")); - 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); - AttachChild(m_planet_name); - GG::Pt ul = UpperLeft(), lr = LowerRight(); int planet_image_sz = PlanetDiameter(); GG::Pt planet_image_pos(MAX_PLANET_DIAMETER / 2 - planet_image_sz / 2 + 3, Height() / 2 - planet_image_sz / 2); @@ -738,6 +735,9 @@ } } + 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); + 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); AttachChild(m_planet_info); @@ -1380,6 +1380,7 @@ m_system_name->DisableDropArrow(); m_system_name->SetStyle(GG::LB_CENTER); + m_system_name->SetInteriorColor(GG::Clr(0, 0, 0, 200)); m_button_prev->SetUnpressedGraphic(GG::SubTexture(GetTexture( ClientUI::ART_DIR + "icons/leftarrownormal.png" ), 0, 0, 32, 32)); m_button_prev->SetPressedGraphic (GG::SubTexture(GetTexture( ClientUI::ART_DIR + "icons/leftarrowclicked.png" ), 0, 0, 32, 32)); Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2006-02-06 00:28:50 UTC (rev 1729) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2006-02-06 01:18:13 UTC (rev 1730) @@ -329,7 +329,8 @@ // 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), - m_selected(false) + m_selected(false), + m_mouse_here(false) {} virtual bool InWindow(const GG::Pt& pt) const @@ -350,6 +351,11 @@ color = GG::LightColor(color); border_color = GG::LightColor(border_color); } + const double ROLLOVER_BRIGHTENING_FACTOR = 1.5; + if (!Disabled() && m_mouse_here) { + AdjustBrightness(color, ROLLOVER_BRIGHTENING_FACTOR); + AdjustBrightness(border_color, ROLLOVER_BRIGHTENING_FACTOR); + } glDisable(GL_TEXTURE_2D); glColor4ubv(color.v); CircleArc(ul.x, ul.y, lr.x, lr.y, 0.0, 0.0, true); @@ -362,6 +368,10 @@ glEnable(GL_TEXTURE_2D); } + 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;} + void SetSelected(bool s) {m_selected = s;} private: @@ -391,6 +401,7 @@ } bool m_selected; + bool m_mouse_here; static const int SIZE = 17; }; Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2006-02-06 00:28:50 UTC (rev 1729) +++ trunk/FreeOrion/default/eng_stringtable.txt 2006-02-06 01:18:13 UTC (rev 1730) @@ -703,7 +703,7 @@ unknown system SP_SYSTEM_NAME -The %1% System +%1% SP_RENAME_PLANET Rename Planet |
From: <tz...@us...> - 2006-02-06 01:41:22
|
Revision: 1731 Author: tzlaine Date: 2006-02-05 17:40:55 -0800 (Sun, 05 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1731&view=rev Log Message: ----------- Added code to clear the projected fleet movement lines at several transition points, such as when a new "screen" is opened, at the start of a new turn, or when the FleetWnd is closed. Modified Paths: -------------- trunk/FreeOrion/UI/ClientUI.cpp trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/MapWnd.h Modified: trunk/FreeOrion/UI/ClientUI.cpp =================================================================== --- trunk/FreeOrion/UI/ClientUI.cpp 2006-02-06 01:18:13 UTC (rev 1730) +++ trunk/FreeOrion/UI/ClientUI.cpp 2006-02-06 01:40:55 UTC (rev 1731) @@ -432,10 +432,10 @@ ///////////////////////////////////////////////////// //Screen Functions/////////////////////////////////// -void ClientUI::InitTurn( int turn_number ) +void ClientUI::InitTurn(int turn_number) { #ifndef FREEORION_BUILD_UTIL - m_map_wnd->InitTurn( turn_number ); + m_map_wnd->InitTurn(turn_number); #endif } @@ -543,14 +543,14 @@ SwitchState(STATE_MAP); } -void ClientUI::UpdateTurnProgress( const std::string& phase_str, const int empire_id ) +void ClientUI::UpdateTurnProgress(const std::string& phase_str, const int empire_id) { #ifndef FREEORION_BUILD_UTIL - m_turn_progress_wnd->UpdateTurnProgress( phase_str, empire_id ); + m_turn_progress_wnd->UpdateTurnProgress(phase_str, empire_id); #endif } -void ClientUI::UpdateCombatTurnProgress( const std::string& msg) +void ClientUI::UpdateCombatTurnProgress(const std::string& msg) { #ifndef FREEORION_BUILD_UTIL m_turn_progress_wnd->UpdateCombatTurnProgress(msg); @@ -588,10 +588,10 @@ s_logger.debug(msg); } -void ClientUI::GenerateSitRepText( SitRepEntry *p_sit_rep ) +void ClientUI::GenerateSitRepText(SitRepEntry *p_sit_rep) { // get template string - std::string template_str( UserString( g_string_id_lut[ p_sit_rep->GetType() ] ) ); + std::string template_str(UserString(g_string_id_lut[p_sit_rep->GetType()])); // parse string p_sit_rep->GenerateVarText( template_str ); @@ -634,7 +634,7 @@ } } - int star_variant = image_names[type].second!=0?(hash_key % image_names[type].second):0; + int star_variant = image_names[type].second ? (hash_key % image_names[type].second) : 0; std::string filename = ClientUI::ART_DIR + "stars/" + image_names[type].first + lexical_cast<string>(star_variant + 1) + ".png"; return GG::GUI::GetGUI()->GetTexture(filename); @@ -676,16 +676,14 @@ g(0), b(0), a(0) -{ -} +{} StreamableColor::StreamableColor(const GG::Clr& clr) : r(clr.r), g(clr.g), b(clr.b), a(clr.a) -{ -} +{} GG::Clr StreamableColor::ToClr() const { Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-06 01:18:13 UTC (rev 1730) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-06 01:40:55 UTC (rev 1731) @@ -916,6 +916,7 @@ FleetWnd::~FleetWnd() { + ClientUI::GetClientUI()->GetMapWnd()->SetProjectedFleetMovement(0, std::list<System*>()); s_open_fleet_wnds.erase(this); } Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2006-02-06 01:18:13 UTC (rev 1730) +++ trunk/FreeOrion/UI/MapWnd.cpp 2006-02-06 01:40:55 UTC (rev 1731) @@ -251,7 +251,7 @@ m_chat_edit->Hide(); EnableAlphaNumAccels(); - m_options_showing = false; + m_menu_showing = false; //set up background images m_backgrounds[0].reset(new GG::Texture()); @@ -284,7 +284,7 @@ GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_F2, 0), &MapWnd::ToggleSitRep, this); GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_F3, 0), &MapWnd::ToggleResearch, this); GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_F4, 0), &MapWnd::ToggleProduction, this); - GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_F10, 0), &MapWnd::ShowOptions, this); + GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_F10, 0), &MapWnd::ShowMenu, this); GG::Connect(GG::GUI::GetGUI()->AcceleratorSignal(GG::GGK_s, 0), &MapWnd::CloseSystemView, this); // Keys for zooming @@ -562,6 +562,7 @@ // this gets cleared here instead of with the movement line stuff because that would clear some movement lines that come from the SystemIcons below m_fleet_lines.clear(); + m_projected_fleet_lines = MovementLineData(); // systems and starlanes for (std::map<int, SystemIcon*>::iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { @@ -1303,6 +1304,7 @@ bool MapWnd::ToggleSitRep() { + m_projected_fleet_lines = MovementLineData(); if (m_sitrep_panel->Visible()) { m_sitrep_panel->Hide(); } else { @@ -1326,6 +1328,7 @@ bool MapWnd::ToggleResearch() { + m_projected_fleet_lines = MovementLineData(); if (m_research_wnd->Visible()) { m_research_wnd->Hide(); } else { @@ -1349,6 +1352,7 @@ bool MapWnd::ToggleProduction() { + m_projected_fleet_lines = MovementLineData(); if (m_production_wnd->Visible()) { m_production_wnd->Hide(); m_in_production_view_mode = false; @@ -1371,13 +1375,14 @@ return true; } -bool MapWnd::ShowOptions() +bool MapWnd::ShowMenu() { - if (!m_options_showing) { - m_options_showing = true; + if (!m_menu_showing) { + m_projected_fleet_lines = MovementLineData(); + m_menu_showing = true; InGameMenu menu; menu.Run(); - m_options_showing = false; + m_menu_showing = false; } return true; } Modified: trunk/FreeOrion/UI/MapWnd.h =================================================================== --- trunk/FreeOrion/UI/MapWnd.h 2006-02-06 01:18:13 UTC (rev 1730) +++ trunk/FreeOrion/UI/MapWnd.h 2006-02-06 01:40:55 UTC (rev 1731) @@ -115,7 +115,7 @@ void IndustryResourcePoolChanged(); void TurnBtnClicked() {EndTurn();} - void MenuBtnClicked() {ShowOptions();} + void MenuBtnClicked() {ShowMenu();} void ProductionBtnClicked() {ToggleProduction();} void ResearchBtnClicked() {ToggleResearch();} void SitRepBtnClicked() {ToggleSitRep();} @@ -153,7 +153,7 @@ bool ToggleSitRep(); bool ToggleResearch(); bool ToggleProduction(); - bool ShowOptions(); + bool ShowMenu(); bool CloseSystemView(); //!< closes off the current system view bool KeyboardZoomIn(); bool KeyboardZoomOut(); @@ -199,7 +199,7 @@ 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_options_showing; //!< set during ShowOptions() to prevent reentrency + 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; |
From: <tz...@us...> - 2006-02-06 02:39:35
|
Revision: 1732 Author: tzlaine Date: 2006-02-05 18:39:19 -0800 (Sun, 05 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1732&view=rev Log Message: ----------- Corrected a double-deletion segfault in FleetWnd. Modified Paths: -------------- trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/util/Order.cpp Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-06 01:40:55 UTC (rev 1731) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2006-02-06 02:39:19 UTC (rev 1732) @@ -524,10 +524,13 @@ // disallow drops across fleet windows; fleets must be at the same location if (target_fleet->X() != fleets[i]->X() || target_fleet->Y() != fleets[i]->Y()) continue; + int fleet_id = fleets[i]->ID(); HumanClientApp::Orders().IssueOrder( new FleetTransferOrder(HumanClientApp::GetApp()->EmpireID(), fleets[i]->ID(), target_fleet->ID(), std::vector<int>(fleets[i]->begin(), fleets[i]->end()))); - if (fleets[i]->NumShips() == 0) { + // 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( new DeleteFleetOrder(HumanClientApp::GetApp()->EmpireID(), fleets[i]->ID())); } Modified: trunk/FreeOrion/util/Order.cpp =================================================================== --- trunk/FreeOrion/util/Order.cpp 2006-02-06 01:40:55 UTC (rev 1731) +++ trunk/FreeOrion/util/Order.cpp 2006-02-06 02:39:19 UTC (rev 1732) @@ -680,7 +680,7 @@ Fleet* fleet = GetUniverse().Object<Fleet>(FleetID()); if (!fleet) - throw std::runtime_error("Illegal fleet id specified in fleet colonize order."); + throw std::runtime_error("Illegal fleet id specified in fleet delete order."); if (!fleet->OwnedBy(EmpireID())) throw std::runtime_error("Empire attempted to issue deletion order to another's fleet."); |
From: <tz...@us...> - 2006-02-10 01:17:42
|
Revision: 1744 Author: tzlaine Date: 2006-02-09 17:17:12 -0800 (Thu, 09 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1744&view=rev Log Message: ----------- Changed the locations returned by GetLocalDir() and GetConfigPath() for Win32 to point to [HOMEDRIVE][HOMEPATH]/FreeOrion and [HOMEDRIVE][HOMEPATH]/FreeOrion/config.xml. This should solve the permissions problems suffered by WinXP and Win2k users not running as root. Modified Paths: -------------- trunk/FreeOrion/UI/InGameMenu.cpp trunk/FreeOrion/UI/StringTable.cpp trunk/FreeOrion/client/AI/AIClientApp.cpp trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/client/human/chmain.cpp trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/util/Directories.cpp trunk/FreeOrion/util/Directories.h Modified: trunk/FreeOrion/UI/InGameMenu.cpp =================================================================== --- trunk/FreeOrion/UI/InGameMenu.cpp 2006-02-08 22:29:23 UTC (rev 1743) +++ trunk/FreeOrion/UI/InGameMenu.cpp 2006-02-10 01:17:12 UTC (rev 1744) @@ -21,12 +21,9 @@ { db.Add<std::string>('S', "save-dir", - "The directory in which saved games are saved and from which they are loaded. Directory names are taken to be relative to the location of the executable.", -#ifdef FREEORION_LINUX + "The directory in which saved games are saved and from which they are loaded. Directory " + "names are taken to be relative to the location of the executable.", (GetLocalDir() / "save").native_directory_string()); -#else - "save"); -#endif } bool foo_bool = RegisterOptions(&Options); Modified: trunk/FreeOrion/UI/StringTable.cpp =================================================================== --- trunk/FreeOrion/UI/StringTable.cpp 2006-02-08 22:29:23 UTC (rev 1743) +++ trunk/FreeOrion/UI/StringTable.cpp 2006-02-10 01:17:12 UTC (rev 1744) @@ -67,9 +67,7 @@ string temp2; std::ifstream ifs; try { - //std::cerr << "FN: " << m_filename << std::endl; - // ifs.open((GetGlobalDir().native_directory_string() + m_filename).c_str()); //open the file - ifs.open(m_filename.c_str()); + ifs.open(m_filename.c_str()); } catch (const exception& e) { Logger().errorStream() << "Error opening StringTable file \"" << m_filename << "\": " << e.what(); return; // handle exception by showing error msg and then get out! Modified: trunk/FreeOrion/client/AI/AIClientApp.cpp =================================================================== --- trunk/FreeOrion/client/AI/AIClientApp.cpp 2006-02-08 22:29:23 UTC (rev 1743) +++ trunk/FreeOrion/client/AI/AIClientApp.cpp 2006-02-10 01:17:12 UTC (rev 1744) @@ -35,18 +35,14 @@ s_app = this; if (argc < 2) { - m_log_category.fatal("The AI client should not be called directly!"); - Exit(1); + m_log_category.fatal("The AI client should not be called directly!"); + Exit(1); } // read command line args m_player_name = argv[1]; -#ifdef FREEORION_LINUX const std::string AICLIENT_LOG_FILENAME((GetLocalDir() / (m_player_name + ".log")).native_file_string()); -#else - const std::string AICLIENT_LOG_FILENAME = m_player_name + ".log"; -#endif // a platform-independent way to erase the old log std::ofstream temp(AICLIENT_LOG_FILENAME.c_str()); @@ -55,7 +51,7 @@ // establish debug logging log4cpp::Appender* appender = new log4cpp::FileAppender("FileAppender", AICLIENT_LOG_FILENAME); log4cpp::PatternLayout* layout = new log4cpp::PatternLayout(); - layout->setConversionPattern("%d %p : %m%n"); + layout->setConversionPattern("%d %p AI : %m%n"); appender->setLayout(layout); m_log_category.setAdditivity(false); // make appender the only appender used... m_log_category.setAppender(appender); Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-02-08 22:29:23 UTC (rev 1743) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-02-10 01:17:12 UTC (rev 1744) @@ -207,11 +207,7 @@ signal(SIGSEGV, SigHandler); #endif -#ifdef FREEORION_LINUX const std::string LOG_FILENAME((GetLocalDir() / "freeorion.log").native_file_string()); -#else - const std::string LOG_FILENAME = "freeorion.log"; -#endif // a platform-independent way to erase the old log We cannot use // boost::filesystem::ofstream here, as stupid b::f won't allow us @@ -222,7 +218,7 @@ log4cpp::Appender* appender = new log4cpp::FileAppender("FileAppender", LOG_FILENAME); log4cpp::PatternLayout* layout = new log4cpp::PatternLayout(); - layout->setConversionPattern("%d %p : %m%n"); + layout->setConversionPattern("%d %p Client : %m%n"); appender->setLayout(layout); Logger().setAdditivity(false); // make appender the only appender used... Logger().setAppender(appender); Modified: trunk/FreeOrion/client/human/chmain.cpp =================================================================== --- trunk/FreeOrion/client/human/chmain.cpp 2006-02-08 22:29:23 UTC (rev 1743) +++ trunk/FreeOrion/client/human/chmain.cpp 2006-02-10 01:17:12 UTC (rev 1744) @@ -41,7 +41,7 @@ } if (GetOptionsDB().Get<bool>("generate-config-xml")) { GetOptionsDB().Remove("generate-config-xml"); - boost::filesystem::ofstream ofs(GetConfigPath()); + boost::filesystem::ofstream ofs(GetConfigPath()); GetOptionsDB().GetXML().WriteDoc(ofs); ofs.close(); } Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2006-02-08 22:29:23 UTC (rev 1743) +++ trunk/FreeOrion/server/ServerApp.cpp 2006-02-10 01:17:12 UTC (rev 1744) @@ -88,11 +88,7 @@ { if (build_save_game_list) { // build a list of save files -#ifdef FREEORION_LINUX fs::path save_dir((GetLocalDir() / SAVE_DIR_NAME).native_directory_string()); -#else - fs::path save_dir = boost::filesystem::initial_path() / SAVE_DIR_NAME; -#endif fs::directory_iterator end_it; for (fs::directory_iterator it(save_dir); it != end_it; ++it) { try { @@ -121,13 +117,8 @@ save_game_empire_data.clear(); if (0 <= save_file && save_file < static_cast<int>(save_games.size())) { XMLDoc doc; - // GZStream does not yet support - // boost::filesystem::path, so we do it manually -#ifdef FREEORION_LINUX + // GZStream does not yet support boost::filesystem::path, so we do it manually GZStream::igzstream ifs((GetLocalDir() / SAVE_DIR_NAME / save_games[save_file]).native_file_string().c_str()); -#else - GZStream::igzstream ifs((fs::path(SAVE_DIR_NAME) / save_games[save_file]).native_file_string().c_str()); -#endif doc.ReadDoc(ifs); ifs.close(); @@ -165,8 +156,7 @@ #ifdef FREEORION_WIN32 const std::string AI_CLIENT_EXE = "freeorionca.exe"; #else - const fs::path BIN_DIR = GetBinDir(); - const std::string AI_CLIENT_EXE = (BIN_DIR / "freeorionca").native_file_string(); + const std::string AI_CLIENT_EXE = (GetBinDir() / "freeorionca").native_file_string(); #endif const std::string LAST_TURN_UPDATE_SAVE_ELEM_PREFIX = "empire_"; XMLDoc g_load_doc; @@ -217,11 +207,7 @@ s_app = this; -#ifdef FREEORION_LINUX const std::string SERVER_LOG_FILENAME((GetLocalDir() / "freeoriond.log").native_file_string()); -#else - const std::string SERVER_LOG_FILENAME = "freeoriond.log"; -#endif // a platform-independent way to erase the old log std::ofstream temp(SERVER_LOG_FILENAME.c_str()); @@ -229,7 +215,7 @@ log4cpp::Appender* appender = new log4cpp::FileAppender("FileAppender", SERVER_LOG_FILENAME); log4cpp::PatternLayout* layout = new log4cpp::PatternLayout(); - layout->setConversionPattern("%d %p : %m%n"); + layout->setConversionPattern("%d %p Server : %m%n"); appender->setLayout(layout); m_log_category.setAdditivity(false); // make appender the only appender used... m_log_category.setAppender(appender); @@ -345,11 +331,7 @@ m_empires.RemoveAllEmpires(); m_single_player_game = false; -#ifdef FREEORION_LINUX std::string load_filename = (GetLocalDir() / SAVE_DIR_NAME / g_lobby_data.save_games[g_lobby_data.save_file]).native_file_string(); -#else - std::string load_filename = (fs::path(SAVE_DIR_NAME) / g_lobby_data.save_games[g_lobby_data.save_file]).native_file_string(); -#endif XMLDoc doc; GZStream::igzstream ifs(load_filename.c_str()); doc.ReadDoc(ifs); Modified: trunk/FreeOrion/util/Directories.cpp =================================================================== --- trunk/FreeOrion/util/Directories.cpp 2006-02-08 22:29:23 UTC (rev 1743) +++ trunk/FreeOrion/util/Directories.cpp 2006-02-10 01:17:12 UTC (rev 1744) @@ -89,7 +89,11 @@ fs::path::default_name_check(fs::native); - fs::path p = fs::initial_path() / "save"; + fs::path local_dir = GetLocalDir(); + if (!exists(local_dir)) + fs::create_directories(local_dir); + + fs::path p = GetLocalDir() / "save"; if (!exists(p)) fs::create_directories(p); @@ -98,7 +102,10 @@ const fs::path GetLocalDir() { - return fs::initial_path(); + if (fs::path::default_name_check_writable()) + fs::path::default_name_check(fs::native); + static fs::path p = fs::path(std::string(getenv("HOMEDRIVE")) + getenv("HOMEPATH")) / "FreeOrion"; + return p; } const fs::path GetGlobalDir() Modified: trunk/FreeOrion/util/Directories.h =================================================================== --- trunk/FreeOrion/util/Directories.h 2006-02-08 22:29:23 UTC (rev 1743) +++ trunk/FreeOrion/util/Directories.h 2006-02-10 01:17:12 UTC (rev 1744) @@ -5,37 +5,29 @@ #include <boost/filesystem/path.hpp> #include <string> -/** This function must be called before any Get*Dir function is - called. It stores the current working directory as well as - creating local directories if they do not yet exist. +/** This function must be called before any Get*Dir function is called. It stores the current working directory as well + as creating local directories if they do not yet exist. */ void InitDirs(); -/** This function returns the directory where FreeOrion should store - user specific data, like the configuration file and savegames. - Under Unix, this would be <tt>~/.freeorion</tt>, under Windows, - this might be something along the lines of <tt>C:\\Documents and - settings\\Username\\FreeOrion</tt> or even <tt>\\\\Gandalf\\Users\\Frodo\\Settings\\FreeOrion</tt>. \note <ul><li> If the directory does not - exist, it will be created.<li>This directory is the only one that - can be considered writable!</ul> +/** This function returns the directory where FreeOrion should store user specific data, like the configuration file and + savegames. Under Unix, this would be <tt>~/.freeorion</tt>, under Windows, this might be something along the lines + of <tt>C:\\Documents and settings\\Username\\FreeOrion</tt> or even + <tt>\\\\Gandalf\\Users\\Frodo\\Settings\\FreeOrion</tt>. \note <ul><li> If the directory does not exist, it will be + created.<li>This directory is the only one that can be considered writable!</ul> */ const boost::filesystem::path GetLocalDir(); -/** This function returns the main data directory of FreeOrion. Under - Windows, it is the directory where FreeOrion is installed, under - Linux, this can be <tt>/usr/local/share/freeorion</tt>, - <tt>/opt/share/freorion</tt>, or even (when FreeOrion was - installed locally with autopackage) - <tt>~/.local/share/freeorion</tt>. \note This directory and +/** This function returns the main data directory of FreeOrion. Under Windows, it is the directory where FreeOrion is + installed, under Linux, this can be <tt>/usr/local/share/freeorion</tt>, <tt>/opt/share/freorion</tt>, or even (when + FreeOrion was installed locally with autopackage) <tt>~/.local/share/freeorion</tt>. \note This directory and everything in it should be assumed read-only! */ const boost::filesystem::path GetGlobalDir(); -/** This function returns the directory where the binaries are - located. Under Unix, it will be something along the lines of - <tt>/usr/local/bin</tt>, under Windows, it will probably be the - installation directory. \note This directory and everything in it - should be assumed read-only! +/** This function returns the directory where the binaries are located. Under Unix, it will be something along the lines + of <tt>/usr/local/bin</tt>, under Windows, it will probably be the installation directory. \note This directory and + everything in it should be assumed read-only! */ const boost::filesystem::path GetBinDir(); |
From: <tz...@us...> - 2006-02-10 07:46:29
|
Revision: 1746 Author: tzlaine Date: 2006-02-09 23:46:12 -0800 (Thu, 09 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1746&view=rev Log Message: ----------- Implemented mouse rollover highlighting for scrolls and scliders, and slightly widened the SidePanel scroll. Modified Paths: -------------- trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/CUIControls.h trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2006-02-10 01:58:28 UTC (rev 1745) +++ trunk/FreeOrion/UI/CUIControls.cpp 2006-02-10 07:46:12 UTC (rev 1746) @@ -84,6 +84,7 @@ const double ARROW_BRIGHTENING_SCALE_FACTOR = 1.5; const double STATE_BUTTON_BRIGHTENING_SCALE_FACTOR = 1.25; + const double TAB_BRIGHTENING_SCALE_FACTOR = 1.25; bool temp_header_bool = RecordHeaderFile(CUIControlsRevision()); bool temp_source_bool = RecordSourceFile("$Id$"); @@ -411,7 +412,8 @@ orientation == GG::VERTICAL ? 2 : 0, scroll_width, scroll_width, "", boost::shared_ptr<GG::Font>(), color), m_border_color(border_color), - m_orientation(orientation) + m_orientation(orientation), + m_mouse_here(false) { SetMinSize(GG::Pt(m_orientation == GG::VERTICAL ? MinSize().x : 10, m_orientation == GG::VERTICAL ? 10 : MinSize().y)); @@ -433,11 +435,21 @@ ul.y += 3; lr.y -= 3; } + + GG::Clr color_to_use = Disabled() ? DisabledColor(Color()) : Color(); + GG::Clr border_color_to_use = Disabled() ? DisabledColor(m_border_color) : m_border_color; + if (!Disabled() && m_mouse_here) { + AdjustBrightness(color_to_use, TAB_BRIGHTENING_SCALE_FACTOR); + AdjustBrightness(border_color_to_use, TAB_BRIGHTENING_SCALE_FACTOR); + } + // basic shape, no border - AngledCornerRectangle(ul.x, ul.y, lr.x, lr.y, Color(), GG::CLR_ZERO, CUISCROLL_ANGLE_OFFSET, 0); + AngledCornerRectangle(ul.x, ul.y, lr.x, lr.y, color_to_use, GG::CLR_ZERO, CUISCROLL_ANGLE_OFFSET, 0); // upper left diagonal stripe GG::Clr light_color = Color(); AdjustBrightness(light_color, 35); + if (!Disabled() && m_mouse_here) + AdjustBrightness(light_color, TAB_BRIGHTENING_SCALE_FACTOR); glColor4ubv(light_color.v); glDisable(GL_TEXTURE_2D); glBegin(GL_POLYGON); @@ -445,9 +457,9 @@ glVertex2i(lr.x, ul.y); glVertex2i(ul.x + CUISCROLL_ANGLE_OFFSET, ul.y); glVertex2i(ul.x, ul.y + CUISCROLL_ANGLE_OFFSET); - glVertex2i(ul.x, ul.y + (lr.x - ul.x)); + glVertex2i(ul.x, ul.y + std::min(lr.x - ul.x, lr.y - ul.y)); } else { - glVertex2i(ul.x + (lr.y - ul.y), ul.y); + glVertex2i(ul.x + std::min(lr.x - ul.x, lr.y - ul.y), ul.y); glVertex2i(ul.x + CUISCROLL_ANGLE_OFFSET, ul.y); glVertex2i(ul.x, lr.y - CUISCROLL_ANGLE_OFFSET); glVertex2i(ul.x, lr.y); @@ -456,23 +468,34 @@ // lower right diagonal stripe glBegin(GL_POLYGON); if (m_orientation == GG::VERTICAL) { - glVertex2i(lr.x, lr.y - (lr.x - ul.x)); + glVertex2i(lr.x, lr.y - std::min(lr.x - ul.x, lr.y - ul.y)); glVertex2i(ul.x, lr.y); glVertex2i(lr.x - CUISCROLL_ANGLE_OFFSET, lr.y); glVertex2i(lr.x, lr.y - CUISCROLL_ANGLE_OFFSET); } else { glVertex2i(lr.x, ul.y); - glVertex2i(lr.x - (lr.y - ul.y), lr.y); + glVertex2i(lr.x - std::min(lr.x - ul.x, lr.y - ul.y), lr.y); glVertex2i(lr.x - CUISCROLL_ANGLE_OFFSET, lr.y); glVertex2i(lr.x, lr.y - CUISCROLL_ANGLE_OFFSET); } glEnd(); glEnable(GL_TEXTURE_2D); // border - AngledCornerRectangle(ul.x, ul.y, lr.x, lr.y, GG::CLR_ZERO, m_border_color, CUISCROLL_ANGLE_OFFSET, 1); + AngledCornerRectangle(ul.x, ul.y, lr.x, lr.y, GG::CLR_ZERO, border_color_to_use, CUISCROLL_ANGLE_OFFSET, 1); } +void CUIScroll::ScrollTab::MouseEnter(const GG::Pt& pt, Uint32 keys) +{ + HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() + GetOptionsDB().Get<std::string>("UI.sound.button-rollover")); + m_mouse_here = true; +} +void CUIScroll::ScrollTab::MouseLeave(const GG::Pt& pt, Uint32 keys) +{ + m_mouse_here = false; +} + + /////////////////////////////////////// // class CUIScroll /////////////////////////////////////// Modified: trunk/FreeOrion/UI/CUIControls.h =================================================================== --- trunk/FreeOrion/UI/CUIControls.h 2006-02-10 01:58:28 UTC (rev 1745) +++ trunk/FreeOrion/UI/CUIControls.h 2006-02-10 07:46:12 UTC (rev 1746) @@ -169,9 +169,12 @@ ScrollTab(GG::Orientation orientation, int scroll_width, GG::Clr color, GG::Clr border_color); ///< basic ctor virtual void SetColor(GG::Clr c); virtual void Render(); + virtual void MouseEnter(const GG::Pt& pt, Uint32 keys); + virtual void MouseLeave(const GG::Pt& pt, Uint32 keys); private: GG::Clr m_border_color; GG::Orientation m_orientation; + bool m_mouse_here; }; /** \name Structors */ //@{ Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2006-02-10 01:58:28 UTC (rev 1745) +++ trunk/FreeOrion/UI/SidePanel.cpp 2006-02-10 07:46:12 UTC (rev 1746) @@ -1166,7 +1166,7 @@ m_planet_panels(), m_planet_id(UniverseObject::INVALID_OBJECT_ID), m_hilite_selected_planet(false), - m_vscroll(new CUIScroll(Width()-10,0,10,Height(),GG::VERTICAL)) + m_vscroll(new CUIScroll(Width()-14,0,14,Height(),GG::VERTICAL)) { SetText("PlanetPanelContainer"); EnableChildClipping(true); |
From: <tz...@us...> - 2006-02-11 06:51:39
|
Revision: 1748 Author: tzlaine Date: 2006-02-10 22:51:26 -0800 (Fri, 10 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1748&view=rev Log Message: ----------- Changed the behavior of ScrollTab such that it remains roolver-lit when being dragged, and does not emit sounds when rolled over during a drag. Modified Paths: -------------- trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/CUIControls.h Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2006-02-11 03:12:47 UTC (rev 1747) +++ trunk/FreeOrion/UI/CUIControls.cpp 2006-02-11 06:51:26 UTC (rev 1748) @@ -401,7 +401,7 @@ // class CUIScroll /////////////////////////////////////// namespace { -const int CUISCROLL_ANGLE_OFFSET = 3; + const int CUISCROLL_ANGLE_OFFSET = 3; } /////////////////////////////////////// @@ -413,7 +413,8 @@ scroll_width, scroll_width, "", boost::shared_ptr<GG::Font>(), color), m_border_color(border_color), m_orientation(orientation), - m_mouse_here(false) + m_mouse_here(false), + m_being_dragged(false) { SetMinSize(GG::Pt(m_orientation == GG::VERTICAL ? MinSize().x : 10, m_orientation == GG::VERTICAL ? 10 : MinSize().y)); @@ -484,15 +485,34 @@ AngledCornerRectangle(ul.x, ul.y, lr.x, lr.y, GG::CLR_ZERO, border_color_to_use, CUISCROLL_ANGLE_OFFSET, 1); } +void CUIScroll::ScrollTab::LButtonDown(const GG::Pt& pt, Uint32 keys) +{ + m_being_dragged = true; +} + +void CUIScroll::ScrollTab::LButtonUp(const GG::Pt& pt, Uint32 keys) +{ + m_being_dragged = false; + m_mouse_here = false; +} + +void CUIScroll::ScrollTab::LClick(const GG::Pt& pt, Uint32 keys) +{ + m_being_dragged = false; +} + void CUIScroll::ScrollTab::MouseEnter(const GG::Pt& pt, Uint32 keys) { - HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() + GetOptionsDB().Get<std::string>("UI.sound.button-rollover")); - m_mouse_here = true; + if (!m_being_dragged) { + HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() + GetOptionsDB().Get<std::string>("UI.sound.button-rollover")); + m_mouse_here = true; + } } void CUIScroll::ScrollTab::MouseLeave(const GG::Pt& pt, Uint32 keys) { - m_mouse_here = false; + if (!m_being_dragged) + m_mouse_here = false; } Modified: trunk/FreeOrion/UI/CUIControls.h =================================================================== --- trunk/FreeOrion/UI/CUIControls.h 2006-02-11 03:12:47 UTC (rev 1747) +++ trunk/FreeOrion/UI/CUIControls.h 2006-02-11 06:51:26 UTC (rev 1748) @@ -169,12 +169,16 @@ ScrollTab(GG::Orientation orientation, int scroll_width, GG::Clr color, GG::Clr border_color); ///< basic ctor virtual void SetColor(GG::Clr c); virtual void Render(); + virtual void LButtonDown(const GG::Pt& pt, Uint32 keys); + 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); private: GG::Clr m_border_color; GG::Orientation m_orientation; bool m_mouse_here; + bool m_being_dragged; }; /** \name Structors */ //@{ |
From: <tz...@us...> - 2006-02-13 02:17:58
|
Revision: 1750 Author: tzlaine Date: 2006-02-12 18:17:43 -0800 (Sun, 12 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1750&view=rev Log Message: ----------- - Eliminated the extra click when the button is released over a ScrollTab. - Eliminated the background showing through the outer edge of CUIListBoxes. - Fixed the broken scrolling in TechTreeWnd::LayoutWnd. - Changed the heights of the drop-lists in GalaxySetupWnd to be either the exact size of the available choices in the list, or 5 rows tall, whichever is less. Modified Paths: -------------- trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/GalaxySetupWnd.cpp trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/UI/ResearchWnd.cpp trunk/FreeOrion/UI/TechTreeWnd.cpp Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2006-02-12 23:20:37 UTC (rev 1749) +++ trunk/FreeOrion/UI/CUIControls.cpp 2006-02-13 02:17:43 UTC (rev 1750) @@ -493,7 +493,8 @@ void CUIScroll::ScrollTab::LButtonUp(const GG::Pt& pt, Uint32 keys) { m_being_dragged = false; - m_mouse_here = false; + if (!InWindow(GG::GUI::GetGUI()->MousePosition())) + m_mouse_here = false; } void CUIScroll::ScrollTab::LClick(const GG::Pt& pt, Uint32 keys) @@ -503,7 +504,7 @@ void CUIScroll::ScrollTab::MouseEnter(const GG::Pt& pt, Uint32 keys) { - if (!m_being_dragged) { + if (!m_being_dragged && !m_mouse_here) { HumanClientApp::GetApp()->PlaySound(ClientUI::SoundDir() + GetOptionsDB().Get<std::string>("UI.sound.button-rollover")); m_mouse_here = true; } @@ -560,14 +561,13 @@ void CUIListBox::Render() { + GG::Pt ul = UpperLeft(), lr = LowerRight(); GG::Clr color = Color(); // save color + GG::Clr color_to_use = Disabled() ? DisabledColor(color) : color; + FlatRectangle(ul.x, ul.y, lr.x, lr.y, InteriorColor(), color_to_use, 1); SetColor(GG::CLR_ZERO); // disable the default border by rendering it transparently ListBox::Render(); SetColor(color); // restore color - GG::Clr color_to_use = Disabled() ? DisabledColor(Color()) : Color(); - GG::Pt ul = UpperLeft(); - GG::Pt lr = LowerRight(); - FlatRectangle(ul.x, ul.y, lr.x, lr.y, GG::CLR_ZERO, color_to_use, 1); } Modified: trunk/FreeOrion/UI/GalaxySetupWnd.cpp =================================================================== --- trunk/FreeOrion/UI/GalaxySetupWnd.cpp 2006-02-12 23:20:37 UTC (rev 1749) +++ trunk/FreeOrion/UI/GalaxySetupWnd.cpp 2006-02-13 02:17:43 UTC (rev 1750) @@ -44,7 +44,9 @@ const int LABELS_WIDTH = (w - CONTROL_MARGIN) / 2; const int DROPLIST_WIDTH = LABELS_WIDTH; const int DROPLIST_HEIGHT = ClientUI::PTS + 4; - const int DROPLIST_DROP_HEIGHT = DROPLIST_HEIGHT * 5; + const int TEXT_ROW_HEIGHT = CUISimpleDropDownListRow::DEFAULT_ROW_HEIGHT; + const int MAX_DROPLIST_DROP_HEIGHT = CUISimpleDropDownListRow::DEFAULT_ROW_HEIGHT * 5; + const int TOTAL_LISTBOX_MARGIN = 4; int row = -1; boost::shared_ptr<GG::Font> font = GG::GUI::GetGUI()->GetFont(ClientUI::FONT, ClientUI::PTS); @@ -54,27 +56,32 @@ 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)); - m_galaxy_shapes_list = new CUIDropDownList(LABELS_WIDTH + 2 * CONTROL_MARGIN, row * PANEL_CONTROL_SPACING, DROPLIST_WIDTH, DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + int drop_height = std::min(TEXT_ROW_HEIGHT * Universe::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)); - m_galaxy_ages_list = new CUIDropDownList(LABELS_WIDTH + 2 * CONTROL_MARGIN, row * PANEL_CONTROL_SPACING, DROPLIST_WIDTH, DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + drop_height = std::min(TEXT_ROW_HEIGHT * Universe::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)); - m_starlane_freq_list = new CUIDropDownList(LABELS_WIDTH + 2 * CONTROL_MARGIN, row * PANEL_CONTROL_SPACING, DROPLIST_WIDTH, DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + drop_height = std::min(TEXT_ROW_HEIGHT * Universe::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)); - m_planet_density_list = new CUIDropDownList(LABELS_WIDTH + 2 * CONTROL_MARGIN, row* PANEL_CONTROL_SPACING, DROPLIST_WIDTH, DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + drop_height = std::min(TEXT_ROW_HEIGHT * Universe::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)); - m_specials_freq_list = new CUIDropDownList(LABELS_WIDTH + 2 * CONTROL_MARGIN, row* PANEL_CONTROL_SPACING, DROPLIST_WIDTH, DROPLIST_HEIGHT, DROPLIST_DROP_HEIGHT); + drop_height = std::min(TEXT_ROW_HEIGHT * Universe::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); Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2006-02-12 23:20:37 UTC (rev 1749) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2006-02-13 02:17:43 UTC (rev 1750) @@ -68,6 +68,7 @@ if (progress == -1.0) progress = 0.0; push_back(new QueueBuildPanel(w, build, turn_cost, turns, build.remaining, static_cast<int>(progress / turn_cost), std::fmod(progress, turn_cost) / turn_cost)); + SetDragDropDataType("PRODUCTION_QUEUE_ROW"); } ////////////////////////////////////////////////// @@ -154,6 +155,7 @@ OUTER_LINE_THICKNESS, ClientUI::KNOWN_TECH_FILL_COLOR, ClientUI::KNOWN_TECH_TEXT_AND_BORDER_COLOR); m_queue_lb = new CUIListBox(2, m_production_info_panel->LowerRight().y, m_production_info_panel->Width() - 4, ClientSize().y - 4 - m_production_info_panel->Height()); m_queue_lb->SetStyle(GG::LB_NOSORT | GG::LB_NOSEL | GG::LB_USERDELETE); + m_queue_lb->AllowDropType("PRODUCTION_QUEUE_ROW"); GG::Pt buid_designator_wnd_size = ClientSize() - GG::Pt(m_production_info_panel->Width() + 6, 6); m_build_designator_wnd = new BuildDesignatorWnd(buid_designator_wnd_size.x, buid_designator_wnd_size.y); m_build_designator_wnd->MoveTo(GG::Pt(m_production_info_panel->Width() + 3, 3)); Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2006-02-12 23:20:37 UTC (rev 1749) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2006-02-13 02:17:43 UTC (rev 1750) @@ -65,6 +65,7 @@ if (progress == -1.0) progress = 0.0; push_back(new QueueTechPanel(w, tech_, in_progress, turns_left, static_cast<int>(progress / turn_cost), std::fmod(progress, turn_cost) / turn_cost)); + SetDragDropDataType("RESEARCH_QUEUE_ROW"); } ////////////////////////////////////////////////// @@ -145,6 +146,7 @@ OUTER_LINE_THICKNESS, ClientUI::KNOWN_TECH_FILL_COLOR, ClientUI::KNOWN_TECH_TEXT_AND_BORDER_COLOR); m_queue_lb = new CUIListBox(2, m_research_info_panel->LowerRight().y, m_research_info_panel->Width() - 4, ClientSize().y - 4 - m_research_info_panel->Height()); m_queue_lb->SetStyle(GG::LB_NOSORT | GG::LB_NOSEL | GG::LB_USERDELETE); + m_queue_lb->AllowDropType("RESEARCH_QUEUE_ROW"); GG::Pt tech_tree_wnd_size = ClientSize() - GG::Pt(m_research_info_panel->Width() + 6, 6); m_tech_tree_wnd = new TechTreeWnd(tech_tree_wnd_size.x, tech_tree_wnd_size.y); m_tech_tree_wnd->MoveTo(GG::Pt(m_research_info_panel->Width() + 3, 3)); Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2006-02-12 23:20:37 UTC (rev 1749) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2006-02-13 02:17:43 UTC (rev 1750) @@ -832,7 +832,6 @@ /** \name Accessors */ //@{ virtual GG::Pt ClientLowerRight() const; - virtual void LDrag(const GG::Pt& pt, const GG::Pt& move, Uint32 keys); const std::string& CategoryShown() const; TechTreeWnd::TechTypesShown GetTechTypesShown() const; @@ -870,6 +869,14 @@ std::vector<std::vector<std::pair<double, double> > > > > DependencyArcsMap; typedef std::map<TechStatus, DependencyArcsMap> DependencyArcsMapsByArcType; + class LayoutSurface : public GG::Wnd + { + 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);} + mutable boost::signal<void (const GG::Pt&)> DraggedSignal; + }; + void Layout(bool keep_position); bool TechVisible(const Tech* tech); void CollapseTechSubtree(const Tech* tech, bool collapse); @@ -878,6 +885,7 @@ void TechBrowsedSlot(const Tech* tech); void TechClickedSlot(const Tech* tech); void TechDoubleClickedSlot(const Tech* tech); + void TreeDraggedSlot(const GG::Pt& move); std::string m_category_shown; TechTypesShown m_tech_types_shown; @@ -890,6 +898,7 @@ std::map<const Tech*, TechPanel*> m_techs; DependencyArcsMapsByArcType m_dependency_arcs; + LayoutSurface* m_layout_surface; CUIScroll* m_vscroll; CUIScroll* m_hscroll; GG::Pt m_scroll_position; @@ -1158,17 +1167,21 @@ m_tech_types_shown(ALL_TECH_TYPES), m_tech_statuses_shown(ALL_TECH_STATUSES), m_selected_tech(0), + m_layout_surface(0), m_vscroll(0), m_hscroll(0) { EnableChildClipping(true); + m_layout_surface = new LayoutSurface(); m_vscroll = new CUIScroll(w - ClientUI::SCROLL_WIDTH, 0, ClientUI::SCROLL_WIDTH, h - ClientUI::SCROLL_WIDTH, GG::VERTICAL); m_hscroll = new CUIScroll(0, h - ClientUI::SCROLL_WIDTH, w - ClientUI::SCROLL_WIDTH, ClientUI::SCROLL_WIDTH, GG::HORIZONTAL); + AttachChild(m_layout_surface); AttachChild(m_vscroll); AttachChild(m_hscroll); + GG::Connect(m_layout_surface->DraggedSignal, &TechTreeWnd::LayoutPanel::TreeDraggedSlot, this); GG::Connect(m_vscroll->ScrolledSignal, &TechTreeWnd::LayoutPanel::ScrolledSlot, this); GG::Connect(m_hscroll->ScrolledSignal, &TechTreeWnd::LayoutPanel::ScrolledSlot, this); } @@ -1178,12 +1191,6 @@ return LowerRight() - GG::Pt(ClientUI::SCROLL_WIDTH, ClientUI::SCROLL_WIDTH); } -void TechTreeWnd::LayoutPanel::LDrag(const GG::Pt& pt, const GG::Pt& move, Uint32 keys) -{ - m_vscroll->ScrollTo(m_vscroll->PosnRange().first - move.y); - m_hscroll->ScrollTo(m_hscroll->PosnRange().first - move.x); -} - const std::string& TechTreeWnd::LayoutPanel::CategoryShown() const { return m_category_shown; @@ -1311,7 +1318,7 @@ m_vscroll->SizeScroll(0, 1, 1, 1); m_hscroll->SizeScroll(0, 1, 1, 1); for (std::map<const Tech*, TechPanel*>::const_iterator it = m_techs.begin(); it != m_techs.end(); ++it) { - DeleteChild(it->second); + delete it->second; } m_techs.clear(); m_dependency_arcs.clear(); @@ -1343,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->UpperLeft() + GG::Pt(tech_panel->Width() / 2, tech_panel->Height() / 2) - ClientUpperLeft() + m_scroll_position; + GG::Pt center_point = tech_panel->RelativeUpperLeft() + GG::Pt(tech_panel->Width() / 2, tech_panel->Height() / 2) + m_scroll_position; 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); @@ -1432,7 +1439,7 @@ 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]->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))); - AttachChild(m_techs[tech]); + 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); GG::Connect(m_techs[tech]->TechDoubleClickedSignal, &TechTreeWnd::LayoutPanel::TechDoubleClickedSlot, this); @@ -1474,6 +1481,7 @@ GG::Pt client_sz = ClientSize(); GG::Pt layout_size(static_cast<int>(PS2INCH(GD_bb(graph).UR.x - GD_bb(graph).LL.x) + 2 * TECH_PANEL_MARGIN + PROGRESS_PANEL_LEFT_EXTRUSION), static_cast<int>(PS2INCH(GD_bb(graph).UR.y - GD_bb(graph).LL.y) + 2 * TECH_PANEL_MARGIN + PROGRESS_PANEL_BOTTOM_EXTRUSION)); + 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); @@ -1566,13 +1574,9 @@ { int scroll_x = m_hscroll->PosnRange().first; int scroll_y = m_vscroll->PosnRange().first; - int delta_x = m_scroll_position.x - scroll_x; - int delta_y = m_scroll_position.y - scroll_y; m_scroll_position.x = scroll_x; m_scroll_position.y = scroll_y; - for (std::map<const Tech*, TechPanel*>::iterator it = m_techs.begin(); it != m_techs.end(); ++it) { - it->second->OffsetMove(GG::Pt(delta_x, delta_y)); - } + m_layout_surface->MoveTo(GG::Pt(-scroll_x, -scroll_y)); } void TechTreeWnd::LayoutPanel::TechBrowsedSlot(const Tech* tech) @@ -1594,7 +1598,13 @@ TechDoubleClickedSignal(tech); } +void TechTreeWnd::LayoutPanel::TreeDraggedSlot(const GG::Pt& move) +{ + m_vscroll->ScrollTo(m_vscroll->PosnRange().first - move.y); + m_hscroll->ScrollTo(m_hscroll->PosnRange().first - move.x); +} + ////////////////////////////////////////////////// // TechTreeWnd // ////////////////////////////////////////////////// |
From: <tz...@us...> - 2006-07-16 18:09:30
|
Revision: 1861 Author: tzlaine Date: 2006-07-16 11:09:24 -0700 (Sun, 16 Jul 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1861&view=rev Log Message: ----------- Changed the type of every variable that stores the result of a std::string::find() call to std::string::size_type, for compatibility with 64-bit environments. Modified Paths: -------------- trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/client/human/HumanClientApp.cpp trunk/FreeOrion/combat/CombatSystem.cpp trunk/FreeOrion/network/NetworkCore.cpp trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/util/OptionsDB.cpp trunk/FreeOrion/util/XMLDoc.cpp Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2006-06-24 18:58:46 UTC (rev 1860) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2006-07-16 18:09:24 UTC (rev 1861) @@ -152,8 +152,8 @@ const ShipDesign* design = m_ship->Design(); if (design) { design_name = design->name; - unsigned int space; - if ((space = design_name.find(' ')) != std::string::npos) { + std::string::size_type space = design_name.find(' '); + if (space != std::string::npos) { design_name[space] = '_'; } } else { @@ -412,8 +412,8 @@ std::string design_name; if (design) { design_name = design->name; - unsigned int space; - if ((space = design_name.find(' ')) != std::string::npos) { + std::string::size_type space = design_name.find(' '); + if (space != std::string::npos) { design_name[space] = '_'; } } else { Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2006-06-24 18:58:46 UTC (rev 1860) +++ trunk/FreeOrion/UI/MapWnd.cpp 2006-07-16 18:09:24 UTC (rev 1861) @@ -385,7 +385,7 @@ std::string text = m_chat_edit->WindowText(); std::pair<int, int> cursor_pos = m_chat_edit->CursorPosn(); if (cursor_pos.first == cursor_pos.second && 0 < cursor_pos.first && cursor_pos.first <= static_cast<int>(text.size())) { - unsigned int word_start = text.substr(0, cursor_pos.first).find_last_of(" :"); + std::string::size_type word_start = text.substr(0, cursor_pos.first).find_last_of(" :"); if (word_start == std::string::npos) word_start = 0; else Modified: trunk/FreeOrion/client/human/HumanClientApp.cpp =================================================================== --- trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-06-24 18:58:46 UTC (rev 1860) +++ trunk/FreeOrion/client/human/HumanClientApp.cpp 2006-07-16 18:09:24 UTC (rev 1861) @@ -874,11 +874,11 @@ (m_turns_since_autosave++ % GetOptionsDB().Get<int>("autosave.turns")) == 0) { const char* legal_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; std::string empire_name = Empires().Lookup(EmpireID())->Name(); - unsigned int first_good_empire_char = empire_name.find_first_of(legal_chars); + std::string::size_type first_good_empire_char = empire_name.find_first_of(legal_chars); if (first_good_empire_char == std::string::npos) { empire_name = ""; } else { - unsigned int first_bad_empire_char = empire_name.find_first_not_of(legal_chars, first_good_empire_char); + std::string::size_type first_bad_empire_char = empire_name.find_first_not_of(legal_chars, first_good_empire_char); empire_name = empire_name.substr(first_good_empire_char, first_bad_empire_char - first_good_empire_char); } @@ -886,11 +886,11 @@ if (m_single_player_game) { 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); + std::string::size_type 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 % 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::size_type 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 % m_current_turn); } Modified: trunk/FreeOrion/combat/CombatSystem.cpp =================================================================== --- trunk/FreeOrion/combat/CombatSystem.cpp 2006-06-24 18:58:46 UTC (rev 1860) +++ trunk/FreeOrion/combat/CombatSystem.cpp 2006-07-16 18:09:24 UTC (rev 1861) @@ -70,7 +70,7 @@ flt->RemoveShip(shp->ID()); if (flt->NumShips() == 0) { - if (sys = flt->GetSystem()) + if ((sys = flt->GetSystem())) sys->Remove(flt->ID()); GetUniverse().Destroy(flt->ID()); } Modified: trunk/FreeOrion/network/NetworkCore.cpp =================================================================== --- trunk/FreeOrion/network/NetworkCore.cpp 2006-06-24 18:58:46 UTC (rev 1860) +++ trunk/FreeOrion/network/NetworkCore.cpp 2006-07-16 18:09:24 UTC (rev 1861) @@ -85,7 +85,7 @@ } // construct Message(s) from data, and dispatch them as appropriate - unsigned int next_EOM = std::string::npos; + std::string::size_type next_EOM = std::string::npos; while ((next_EOM = stream.find(NetworkCore::EOM_STR)) != std::string::npos) { Message msg(stream.substr(0, next_EOM)); stream = stream.substr(next_EOM + NetworkCore::EOM_STR.size()); Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2006-06-24 18:58:46 UTC (rev 1860) +++ trunk/FreeOrion/server/ServerApp.cpp 2006-07-16 18:09:24 UTC (rev 1861) @@ -650,7 +650,7 @@ // 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(':'); + std::string::size_type 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) { Modified: trunk/FreeOrion/util/OptionsDB.cpp =================================================================== --- trunk/FreeOrion/util/OptionsDB.cpp 2006-06-24 18:58:46 UTC (rev 1860) +++ trunk/FreeOrion/util/OptionsDB.cpp 2006-07-16 18:09:24 UTC (rev 1861) @@ -189,7 +189,7 @@ elem_stack.push_back(&doc.root_node); for (std::map<std::string, Option>::const_iterator it = m_options.begin(); it != m_options.end(); ++it) { - unsigned int last_dot = it->first.find_last_of('.'); + std::string::size_type last_dot = it->first.find_last_of('.'); std::string section_name = last_dot == std::string::npos ? "" : it->first.substr(0, last_dot); std::string name = it->first.substr(last_dot == std::string::npos ? 0 : last_dot + 1); while (1 < elem_stack.size()) { @@ -204,8 +204,8 @@ elem_stack.pop_back(); } if (!section_name.empty()) { - unsigned int last_pos = 0; - unsigned int pos = 0; + std::string::size_type last_pos = 0; + std::string::size_type pos = 0; while ((pos = section_name.find('.', last_pos)) != std::string::npos) { XMLElement temp(section_name.substr(last_pos, pos - last_pos)); elem_stack.back()->AppendChild(temp); Modified: trunk/FreeOrion/util/XMLDoc.cpp =================================================================== --- trunk/FreeOrion/util/XMLDoc.cpp 2006-06-24 18:58:46 UTC (rev 1860) +++ trunk/FreeOrion/util/XMLDoc.cpp 2006-07-16 18:09:24 UTC (rev 1861) @@ -436,8 +436,8 @@ { if (!s_element_stack.empty()) { std::string text(first, last); - unsigned int first_good_posn = (text[0] != '\"') ? 0 : 1; - unsigned int last_good_posn = text.find_last_not_of(" \t\n\"\r\f"); + std::string::size_type first_good_posn = (text[0] != '\"') ? 0 : 1; + std::string::size_type last_good_posn = text.find_last_not_of(" \t\n\"\r\f"); // strip of leading quote and/or trailing quote, and/or trailing whitespace if (last_good_posn != std::string::npos) s_element_stack.back()->m_text += text.substr(first_good_posn, (last_good_posn + 1) - first_good_posn); |
From: <tz...@us...> - 2006-12-01 21:44:37
|
Revision: 1961 http://svn.sourceforge.net/freeorion/revision/?rev=1961&view=rev Author: tzlaine Date: 2006-12-01 13:44:35 -0800 (Fri, 01 Dec 2006) Log Message: ----------- Changed FileDlg to use GG::FileDlg's new ability to place forgotten extensions on the ends of filenames in save mode. This keeps all checks for filename validity/overwriting within FileDlg. Modified Paths: -------------- trunk/FreeOrion/UI/CUIControls.cpp trunk/FreeOrion/UI/InGameMenu.cpp Modified: trunk/FreeOrion/UI/CUIControls.cpp =================================================================== --- trunk/FreeOrion/UI/CUIControls.cpp 2006-12-01 20:55:34 UTC (rev 1960) +++ trunk/FreeOrion/UI/CUIControls.cpp 2006-12-01 21:44:35 UTC (rev 1961) @@ -1228,6 +1228,7 @@ ClientUI::CtrlColor(), ClientUI::CtrlBorderColor(), ClientUI::TextColor()) { SetFileFilters(types); + AppendMissingSaveExtension(true); SetFilesString(UserString("FILE_DLG_FILES")); SetFileTypesString(UserString("FILE_DLG_FILE_TYPES")); Modified: trunk/FreeOrion/UI/InGameMenu.cpp =================================================================== --- trunk/FreeOrion/UI/InGameMenu.cpp 2006-12-01 20:55:34 UTC (rev 1960) +++ trunk/FreeOrion/UI/InGameMenu.cpp 2006-12-01 21:44:35 UTC (rev 1961) @@ -100,9 +100,6 @@ std::string filename; if (!dlg.Result().empty()) { filename = *dlg.Result().begin(); - if (filename.find(SAVE_GAME_EXTENSION) != filename.size() - SAVE_GAME_EXTENSION.size()) - filename += SAVE_GAME_EXTENSION; - Message response; bool save_succeeded = HumanClientApp::GetApp()->NetworkCore().SendSynchronousMessage(HostSaveGameMessage(HumanClientApp::GetApp()->PlayerID(), filename), response); if (save_succeeded) { |
From: <geo...@us...> - 2007-06-22 22:03:03
|
Revision: 2079 http://svn.sourceforge.net/freeorion/revision/?rev=2079&view=rev Author: geoffthemedio Date: 2007-06-22 15:03:04 -0700 (Fri, 22 Jun 2007) Log Message: ----------- Made SitRepPanel more selective about when it updates itself: now it updates only if it is visible and has been resized. This makes map scrolling much less laggy on turns after there has been a sitrep entry, or after the SitRepPanel has been opened and closed. Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/SitRepPanel.cpp Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2007-06-22 19:50:57 UTC (rev 2078) +++ trunk/FreeOrion/UI/MapWnd.cpp 2007-06-22 22:03:04 UTC (rev 2079) @@ -664,8 +664,8 @@ assert(empire); m_sitrep_panel->Update(); // HACK! The first time this SitRepPanel gets an update, the report row(s) are misaligned. I have no idea why, and - // I am sick of dealing with it, so I'm forcing a resize in order to force it to behave. - m_sitrep_panel->Resize(m_sitrep_panel->Size()); + // I am sick of dealing with it, so I'm forcing an update in order to force it to behave. + m_sitrep_panel->Update(); if (empire->NumSitRepEntries()) m_sitrep_panel->Show(); else @@ -1544,9 +1544,11 @@ { m_projected_fleet_lines = MovementLineData(); if (m_sitrep_panel->Visible()) { + Logger().debugStream() << "sitrep visible"; DetachChild(m_sitrep_panel); m_sitrep_panel->Hide(); // necessary so it won't be visible when next toggled } else { + Logger().debugStream() << "sitrep not visible"; // hide other "competing" windows m_research_wnd->Hide(); HumanClientApp::GetApp()->MoveDown(m_research_wnd); Modified: trunk/FreeOrion/UI/SitRepPanel.cpp =================================================================== --- trunk/FreeOrion/UI/SitRepPanel.cpp 2007-06-22 19:50:57 UTC (rev 2078) +++ trunk/FreeOrion/UI/SitRepPanel.cpp 2007-06-22 22:03:04 UTC (rev 2079) @@ -46,10 +46,13 @@ void SitRepPanel::SizeMove(const GG::Pt& ul, const GG::Pt& lr) { + GG::Pt old_size = GG::Wnd::LowerRight() - GG::Wnd::UpperLeft(); + CUIWnd::SizeMove(ul, lr); m_sitreps_lb->SizeMove(GG::Pt(SITREP_LB_MARGIN_X, SITREP_LB_MARGIN_Y), GG::Pt(ClientWidth() - SITREP_LB_MARGIN_X, ClientHeight() - SITREP_LB_MARGIN_Y)); - Update(); + if (Visible() && old_size != GG::Wnd::Size()) + Update(); } void SitRepPanel::OnClose() |
From: <tz...@us...> - 2007-06-23 20:27:48
|
Revision: 2085 http://svn.sourceforge.net/freeorion/revision/?rev=2085&view=rev Author: tzlaine Date: 2007-06-23 13:27:47 -0700 (Sat, 23 Jun 2007) Log Message: ----------- Applied a very elegant patch that fixes the problem of not being able to select fleet icons that drop outside of the bounding rect of the SystemIcon they are attached to. Thanks to "Mike a.k.a. maelstrom512" for the patch. Modified Paths: -------------- trunk/FreeOrion/UI/SystemIcon.cpp trunk/FreeOrion/UI/SystemIcon.h Modified: trunk/FreeOrion/UI/SystemIcon.cpp =================================================================== --- trunk/FreeOrion/UI/SystemIcon.cpp 2007-06-23 20:19:15 UTC (rev 2084) +++ trunk/FreeOrion/UI/SystemIcon.cpp 2007-06-23 20:27:47 UTC (rev 2085) @@ -349,3 +349,14 @@ { m_system_icon.FleetButtonClickedSignal(m_fleet_btn); } + +bool SystemIcon::InWindow(const GG::Pt& pt) const +{ + // Before we blindly check our bounding rect, make sure it doesn't fall in any of our fleets. + for (std::map<int, FleetButton*>::const_iterator it = m_stationary_fleet_markers.begin(); it != m_stationary_fleet_markers.end(); ++it) { + if (it->second->InWindow(pt)) + return true; + } + + return Wnd::InWindow(pt); +} Modified: trunk/FreeOrion/UI/SystemIcon.h =================================================================== --- trunk/FreeOrion/UI/SystemIcon.h 2007-06-23 20:19:15 UTC (rev 2084) +++ trunk/FreeOrion/UI/SystemIcon.h 2007-06-23 20:27:47 UTC (rev 2085) @@ -48,6 +48,7 @@ //! \name Accessors //!@{ const System& GetSystem() const; const FleetButton* GetFleetButton(Fleet* fleet) const; + virtual bool InWindow(const GG::Pt& pt) const; //!< Overrides GG::Wnd::InWindow. Checks to see if point lies inside in-system fleet buttons before checking main InWindow method. //!@} //! \name Mutators //!@{ |
From: <geo...@us...> - 2007-08-20 14:20:21
|
Revision: 2234 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2234&view=rev Author: geoffthemedio Date: 2007-08-20 07:20:20 -0700 (Mon, 20 Aug 2007) Log Message: ----------- -Minor tweaks to MultiIconValueIndicator constructors -Made smallest rendered planets smaller on sidepanel Modified Paths: -------------- trunk/FreeOrion/UI/InfoPanels.cpp trunk/FreeOrion/UI/InfoPanels.h trunk/FreeOrion/UI/SidePanel.cpp Modified: trunk/FreeOrion/UI/InfoPanels.cpp =================================================================== --- trunk/FreeOrion/UI/InfoPanels.cpp 2007-08-20 09:11:27 UTC (rev 2233) +++ trunk/FreeOrion/UI/InfoPanels.cpp 2007-08-20 14:20:20 UTC (rev 2234) @@ -1327,7 +1327,7 @@ ///////////////////////////////////// // MultiIconValueIndicator // ///////////////////////////////////// -MultiIconValueIndicator::MultiIconValueIndicator(int w, const UniverseObject& obj, std::vector<MeterType>& meter_types) : +MultiIconValueIndicator::MultiIconValueIndicator(int w, const UniverseObject& obj, const std::vector<MeterType>& meter_types) : GG::Wnd(0, 0, w, 1, GG::CLICKABLE), m_meter_types(meter_types), m_obj_vec(), m_icons() { @@ -1349,7 +1349,7 @@ Update(); } -MultiIconValueIndicator::MultiIconValueIndicator(int w, const std::vector<const UniverseObject*>& obj_vec, std::vector<MeterType>& meter_types) : +MultiIconValueIndicator::MultiIconValueIndicator(int w, const std::vector<const UniverseObject*>& obj_vec, const std::vector<MeterType>& meter_types) : GG::Wnd(0, 0, w, 1, GG::CLICKABLE), m_meter_types(meter_types), m_obj_vec(obj_vec), m_icons() { @@ -1369,6 +1369,13 @@ Update(); } +MultiIconValueIndicator::MultiIconValueIndicator(int w) : + GG::Wnd(0, 0, w, 1, GG::CLICKABLE), + m_meter_types(), m_obj_vec(), m_icons() +{ + SetText("MultiIconValueIndicator"); +} + void MultiIconValueIndicator::Render() { GG::Pt ul = UpperLeft(); @@ -1388,7 +1395,7 @@ void MultiIconValueIndicator::Update() { for (unsigned int i = 0; i < m_icons.size(); ++i) { - double sum = 0; + double sum = 0.0; for (unsigned int j = 0; j < m_obj_vec.size(); ++j) { const UniverseObject* obj = m_obj_vec.at(j); sum += ProjectedResourceAmount(obj, m_meter_types.at(i)); Modified: trunk/FreeOrion/UI/InfoPanels.h =================================================================== --- trunk/FreeOrion/UI/InfoPanels.h 2007-08-20 09:11:27 UTC (rev 2233) +++ trunk/FreeOrion/UI/InfoPanels.h 2007-08-20 14:20:20 UTC (rev 2234) @@ -249,8 +249,9 @@ class MultiIconValueIndicator : public GG::Wnd { public: - MultiIconValueIndicator(int w, const UniverseObject& obj, std::vector<MeterType>& meter_types); - MultiIconValueIndicator(int w, const std::vector<const UniverseObject*>& obj_vec, std::vector<MeterType>& meter_types); + MultiIconValueIndicator(int w, const UniverseObject& obj, const std::vector<MeterType>& meter_types); + MultiIconValueIndicator(int w, const std::vector<const UniverseObject*>& obj_vec, const std::vector<MeterType>& meter_types); + MultiIconValueIndicator(int w); ///< initializes with no icons shown virtual void Render(); virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys); Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2007-08-20 09:11:27 UTC (rev 2233) +++ trunk/FreeOrion/UI/SidePanel.cpp 2007-08-20 14:20:20 UTC (rev 2234) @@ -1186,7 +1186,7 @@ //////////////////////////////////////////////// // static(s) 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 int SidePanel::MIN_PLANET_DIAMETER = MAX_PLANET_DIAMETER / 4; // size of a tiny planet, in on-screen pixels const System* SidePanel::s_system = 0; std::set<SidePanel*> SidePanel::s_side_panels; @@ -1217,9 +1217,7 @@ m_button_next->SetPressedGraphic (GG::SubTexture(ClientUI::GetTexture( ClientUI::ArtDir() / "icons" / "rightarrowclicked.png" ), 0, 0, 32, 32)); m_button_next->SetRolloverGraphic (GG::SubTexture(ClientUI::GetTexture( ClientUI::ArtDir() / "icons" / "rightarrowmouseover.png"), 0, 0, 32, 32)); - std::vector<const UniverseObject*> no_objects_vec; - std::vector<MeterType> no_meter_types_vec; - m_system_resource_summary = new MultiIconValueIndicator(w - MAX_PLANET_DIAMETER - 8, no_objects_vec, no_meter_types_vec); + m_system_resource_summary = new MultiIconValueIndicator(w - MAX_PLANET_DIAMETER - 8); m_system_resource_summary->MoveTo(GG::Pt(MAX_PLANET_DIAMETER + 4, 140 - m_system_resource_summary->Height())); |
From: <geo...@us...> - 2008-06-17 21:10:38
|
Revision: 2590 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2590&view=rev Author: geoffthemedio Date: 2008-06-17 14:10:31 -0700 (Tue, 17 Jun 2008) Log Message: ----------- -Fixed [ 1994423 ] Researched Techs Not Removed From Queue -Added code to update the tech tree view without fully redoing the layout (by updating individual tech panels) in order to speed up simpler updates that don't require a full re-layout -In process of doing the above, made Research screen open much faster when its button is clicked Modified Paths: -------------- trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/UI/ProductionWnd.h trunk/FreeOrion/UI/ResearchWnd.cpp trunk/FreeOrion/UI/ResearchWnd.h trunk/FreeOrion/UI/TechTreeWnd.cpp trunk/FreeOrion/UI/TechTreeWnd.h Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2008-06-17 03:55:20 UTC (rev 2589) +++ trunk/FreeOrion/UI/MapWnd.cpp 2008-06-17 21:10:31 UTC (rev 2590) @@ -1035,6 +1035,8 @@ empire->UpdateResourcePools(); + m_research_wnd->Update(); + // clear out all the old buffers for (std::map<boost::shared_ptr<GG::Texture>, GLBuffer>::const_iterator it = m_star_core_quad_vertices.begin(); Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2008-06-17 03:55:20 UTC (rev 2589) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2008-06-17 21:10:31 UTC (rev 2590) @@ -381,7 +381,7 @@ void ProductionWnd::Reset() { - ResetInfoPanel(); + UpdateInfoPanel(); UpdateQueue(); m_queue_lb->BringRowIntoView(0); m_build_designator_wnd->Reset(); @@ -411,7 +411,7 @@ { HumanClientApp::GetApp()->Orders().IssueOrder(OrderPtr(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), boost::polymorphic_downcast<QueueRow*>(row)->queue_index, row_idx))); UpdateQueue(); - ResetInfoPanel(); + UpdateInfoPanel(); } void ProductionWnd::Sanitize() @@ -437,7 +437,7 @@ m_queue_lb->BringRowIntoView(first_visible_queue_row); } -void ProductionWnd::ResetInfoPanel() +void ProductionWnd::UpdateInfoPanel() { const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); const ProductionQueue& queue = empire->GetProductionQueue(); @@ -457,7 +457,7 @@ { HumanClientApp::GetApp()->Orders().IssueOrder(OrderPtr(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), build_type, name, number, location))); UpdateQueue(); - ResetInfoPanel(); + UpdateInfoPanel(); m_build_designator_wnd->CenterOnBuild(m_queue_lb->NumRows() - 1); } @@ -465,7 +465,7 @@ { HumanClientApp::GetApp()->Orders().IssueOrder(OrderPtr(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), build_type, design_id, number, location))); UpdateQueue(); - ResetInfoPanel(); + UpdateInfoPanel(); m_build_designator_wnd->CenterOnBuild(m_queue_lb->NumRows() - 1); } @@ -473,14 +473,14 @@ { HumanClientApp::GetApp()->Orders().IssueOrder(OrderPtr(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), queue_idx, quantity, true))); UpdateQueue(); - ResetInfoPanel(); + UpdateInfoPanel(); } void ProductionWnd::QueueItemDeletedSlot(int row_idx, GG::ListBox::Row* row) { HumanClientApp::GetApp()->Orders().IssueOrder(OrderPtr(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), row_idx))); UpdateQueue(); ///< rebuild on-screen queue - ResetInfoPanel(); + UpdateInfoPanel(); } void ProductionWnd::QueueItemClickedSlot(int row_idx, GG::ListBox::Row* row, const GG::Pt& pt) Modified: trunk/FreeOrion/UI/ProductionWnd.h =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.h 2008-06-17 03:55:20 UTC (rev 2589) +++ trunk/FreeOrion/UI/ProductionWnd.h 2008-06-17 21:10:31 UTC (rev 2590) @@ -43,7 +43,7 @@ private: void UpdateQueue(); ///< Clears and repopulates queue list with listitems corresponding to contents of empire's production queue - void ResetInfoPanel(); ///< Updates production summary at top left of production screen, and signals that the empire's minerals resource pool has changed (propegates to the mapwnd to update indicator) + void UpdateInfoPanel(); ///< Updates production summary at top left of production screen, and signals that the empire's minerals resource pool has changed (propegates to the mapwnd to update indicator) void AddBuildToQueueSlot(BuildType build_type, const std::string& name, int number, int location); void AddBuildToQueueSlot(BuildType build_type, int design_id, int number, int location); void ChangeBuildQuantitySlot(int queue_idx, int quantity); Modified: trunk/FreeOrion/UI/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2008-06-17 03:55:20 UTC (rev 2589) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2008-06-17 21:10:31 UTC (rev 2590) @@ -288,8 +288,8 @@ void ResearchWnd::Reset() { m_tech_tree_wnd->Reset(); - ResetInfoPanel(); UpdateQueue(); + UpdateInfoPanel(); m_queue_lb->BringRowIntoView(0); } @@ -297,6 +297,7 @@ { m_tech_tree_wnd->Update(); UpdateQueue(); + UpdateInfoPanel(); } void ResearchWnd::CenterOnTech(const std::string& tech_name) @@ -308,7 +309,7 @@ { HumanClientApp::GetApp()->Orders().IssueOrder(OrderPtr(new ResearchQueueOrder(HumanClientApp::GetApp()->EmpireID(), dynamic_cast<QueueRow*>(row)->tech->Name(), row_idx))); UpdateQueue(); - ResetInfoPanel(); + UpdateInfoPanel(); } void ResearchWnd::Sanitize() @@ -358,7 +359,7 @@ m_queue_lb->BringRowIntoView(first_visible_queue_row); } -void ResearchWnd::ResetInfoPanel() +void ResearchWnd::UpdateInfoPanel() { const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); const ResearchQueue& queue = empire->GetResearchQueue(); @@ -373,7 +374,6 @@ determine how many RPs are being spent). If/when RP are stockpilable, this might matter, so then the following line should be uncommented.*/ //empire->GetResearchResPool().ChangedSignal(); - } void ResearchWnd::AddTechToQueueSlot(const Tech* tech) @@ -383,7 +383,7 @@ if (!queue.InQueue(tech)) { HumanClientApp::GetApp()->Orders().IssueOrder(OrderPtr(new ResearchQueueOrder(HumanClientApp::GetApp()->EmpireID(), tech->Name(), -1))); UpdateQueue(); - ResetInfoPanel(); + UpdateInfoPanel(); m_tech_tree_wnd->Update(); } } @@ -399,9 +399,9 @@ if (!queue.InQueue(tech)) orders.IssueOrder(OrderPtr(new ResearchQueueOrder(id, tech->Name(), -1))); } - + UpdateQueue(); - ResetInfoPanel(); + UpdateInfoPanel(); m_tech_tree_wnd->Update(); } @@ -409,7 +409,7 @@ { HumanClientApp::GetApp()->Orders().IssueOrder(OrderPtr(new ResearchQueueOrder(HumanClientApp::GetApp()->EmpireID(), dynamic_cast<QueueRow*>(row)->tech->Name()))); UpdateQueue(); - ResetInfoPanel(); + UpdateInfoPanel(); m_tech_tree_wnd->Update(); } Modified: trunk/FreeOrion/UI/ResearchWnd.h =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.h 2008-06-17 03:55:20 UTC (rev 2589) +++ trunk/FreeOrion/UI/ResearchWnd.h 2008-06-17 21:10:31 UTC (rev 2590) @@ -31,7 +31,7 @@ private: 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 UpdateInfoPanel(); ///< Updates research summary at top left of production screen, and signals that the empire's minerals research pool has changed (propegates to the mapwnd to update indicator) void AddTechToQueueSlot(const Tech* tech); void AddMultipleTechsToQueueSlot(std::vector<const Tech*> tech_vec); void QueueItemDeletedSlot(int row_idx, GG::ListBox::Row* row); Modified: trunk/FreeOrion/UI/TechTreeWnd.cpp =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.cpp 2008-06-17 03:55:20 UTC (rev 2589) +++ trunk/FreeOrion/UI/TechTreeWnd.cpp 2008-06-17 21:10:31 UTC (rev 2590) @@ -1209,7 +1209,7 @@ //@} /** \name Accessors */ //@{ - virtual GG::Pt ClientLowerRight() const; + virtual GG::Pt ClientLowerRight() const; double Scale() const; std::set<std::string> GetCategoriesShown() const; @@ -1224,9 +1224,9 @@ //! \name Mutators //@{ virtual void Render(); - void Update(); - void Clear(); - void Reset(); + void Update(const Tech* tech = 0); ///< update indicated \a tech panel or all panels if \a tech is 0, without without redoing layout + void Clear(); ///< remove all tech panels + void Reset(); ///< redo layout, recentre on a tech void SetScale(double scale); void ShowCategory(const std::string& category); void HideCategory(const std::string& category); @@ -1299,7 +1299,7 @@ typedef boost::signal<void (const Tech*)> TechDoubleClickedSignalType; ///< emitted when a technology is double-clicked //@} - 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); + TechPanel(const Tech* tech, bool selected, double scale = 1.0); virtual bool InWindow(const GG::Pt& pt) const; virtual void Render(); @@ -1307,6 +1307,9 @@ virtual void LDoubleClick(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void MouseHere(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys); virtual void MouseWheel(const GG::Pt& pt, int move, GG::Flags<GG::ModKey> mod_keys) {ZoomedSignal(move);} + + void Update(); + mutable boost::signal<void (int)> ZoomedSignal; void Select(bool select); @@ -1330,9 +1333,7 @@ bool m_selected; }; -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*/) : +TechTreeWnd::LayoutPanel::TechPanel::TechPanel(const Tech* tech, bool selected, double scale/* = 1.0*/) : GG::Wnd(0, 0, 1, 1, GG::CLICKABLE), m_tech(tech), m_scale(scale), @@ -1342,10 +1343,6 @@ m_progress_text(0), m_selected(selected) { - const int FONT_PTS = std::max(static_cast<const int>(ClientUI::Pts() * m_scale + 0.5), 3); - - GG::Pt UPPER_TECH_TEXT_OFFSET(4, 2); - GG::Pt LOWER_TECH_TEXT_OFFSET(4, 0); GG::Pt size; if (m_tech->Type() == TT_THEORY) { size = 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)); @@ -1356,78 +1353,56 @@ } Resize(size); - 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; - bool known_tech = false; - bool queued_tech = false; - bool researchable_tech = false; + const int FONT_PTS = std::max(static_cast<const int>(ClientUI::Pts() * m_scale + 0.5), 3); + boost::shared_ptr<GG::Font> font = GG::GUI::GetGUI()->GetFont(ClientUI::Font(), FONT_PTS); - const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); - if (empire->TechResearched(m_tech->Name())) { - known_tech = true; - } else { - ResearchQueue queue = empire->GetResearchQueue(); - if (queue.InQueue(m_tech)) - queued_tech = true; - double rps_spent = empire->ResearchStatus(m_tech->Name()); - if (0.0 <= rps_spent) { - m_progress = rps_spent / (m_tech->ResearchTurns() * m_tech->ResearchCost()); - assert(0.0 <= m_progress && m_progress <= 1.0); - } - researchable_tech = empire->ResearchableTech(m_tech->Name()); - } - if (known_tech) { - m_fill_color = ClientUI::KnownTechFillColor(); - m_text_and_border_color = ClientUI::KnownTechTextAndBorderColor(); - } else if (researchable_tech) { - m_fill_color = ClientUI::ResearchableTechFillColor(); - m_text_and_border_color = ClientUI::ResearchableTechTextAndBorderColor(); - } else { - m_fill_color = ClientUI::UnresearchableTechFillColor(); - m_text_and_border_color = ClientUI::UnresearchableTechTextAndBorderColor(); - } - + // tech icon int graphic_size = size.y - static_cast<int>(PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale) - 2; m_icon = new GG::StaticGraphic(1, 1, graphic_size, graphic_size, ClientUI::TechTexture(m_tech->Name()), GG::GRAPHIC_FITGRAPHIC); m_icon->SetColor(ClientUI::CategoryColor(m_tech->Category())); + AttachChild(m_icon); - boost::shared_ptr<GG::Font> font = GG::GUI::GetGUI()->GetFont(ClientUI::Font(), FONT_PTS); + // tech name text + GG::Pt UPPER_TECH_TEXT_OFFSET(4, 2); + GG::Pt LOWER_TECH_TEXT_OFFSET(4, 0); + 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)); + int text_left = m_icon->LowerRight().x + static_cast<int>(4 * m_scale); m_tech_name_text = new GG::TextControl(text_left, UPPER_TECH_TEXT_OFFSET.y, - Width() - m_icon->LowerRight().x - static_cast<int>(PROGRESS_PANEL_LEFT_EXTRUSION * m_scale), font->Lineskip(), - UserString(m_tech->Name()), font, m_text_and_border_color, GG::FORMAT_TOP | GG::FORMAT_LEFT); + Width() - m_icon->LowerRight().x - static_cast<int>(PROGRESS_PANEL_LEFT_EXTRUSION * m_scale), + font->Lineskip(), UserString(m_tech->Name()), font, + m_text_and_border_color, GG::FORMAT_TOP | GG::FORMAT_LEFT); m_tech_name_text->ClipText(true); - AttachChild(m_icon); AttachChild(m_tech_name_text); - std::string cost_str; - if (!known_tech) - cost_str = str(format(UserString("TECH_TOTAL_COST_STR")) % static_cast<int>(m_tech->ResearchCost() + 0.5) % m_tech->ResearchTurns()); + + // cost text box m_tech_cost_text = new GG::TextControl(text_left, 0, - Width() - text_left, Height() - LOWER_TECH_TEXT_OFFSET.y - static_cast<int>(PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale), - cost_str, font, m_text_and_border_color, GG::FORMAT_BOTTOM | GG::FORMAT_LEFT); + Width() - text_left, + Height() - LOWER_TECH_TEXT_OFFSET.y - static_cast<int>(PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale), + "Tech Cost Text", font, m_text_and_border_color, + GG::FORMAT_BOTTOM | GG::FORMAT_LEFT); AttachChild(m_tech_cost_text); + + // progress text box GG::Rect progress_panel = ProgressPanelRect(UpperLeft(), LowerRight()); - std::string progress_str; - if (known_tech) - progress_str = UserString("TECH_WND_TECH_COMPLETED"); - else if (queued_tech) - progress_str = UserString("TECH_WND_TECH_QUEUED"); - else if (m_progress) - progress_str = UserString("TECH_WND_TECH_INCOMPLETE"); - 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), + m_progress_text = new GG::TextControl(progress_panel.ul.x - static_cast<int>(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, font, m_text_and_border_color); + "Progress Panel", font, m_text_and_border_color); AttachChild(m_progress_text); + + // constrain long text that would otherwise overflow planel boundaries EnableChildClipping(true); - Select(m_selected); + + // set text box text + Update(); } bool TechTreeWnd::LayoutPanel::TechPanel::InWindow(const GG::Pt& pt) const @@ -1490,6 +1465,69 @@ //m_toggle_button->SetSelected(m_selected); } +void TechTreeWnd::LayoutPanel::TechPanel::Update() +{ + bool known_tech = false; + bool queued_tech = false; + bool researchable_tech = false; + + const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); + if (empire) { + // determine if tech is known, researchable or queued + if (empire->TechResearched(m_tech->Name())) { + known_tech = true; + } else { + ResearchQueue queue = empire->GetResearchQueue(); + if (queue.InQueue(m_tech)) + queued_tech = true; + double rps_spent = empire->ResearchStatus(m_tech->Name()); + if (0.0 <= rps_spent) { + m_progress = rps_spent / (m_tech->ResearchTurns() * m_tech->ResearchCost()); + assert(0.0 <= m_progress && m_progress <= 1.0); + } + researchable_tech = empire->ResearchableTech(m_tech->Name()); + } + } else { // (!empire) + researchable_tech = true; + } + + + // set colours according to whether tech is known, researchable or queued + if (known_tech) { + m_fill_color = ClientUI::KnownTechFillColor(); + m_text_and_border_color = ClientUI::KnownTechTextAndBorderColor(); + } else if (researchable_tech) { + m_fill_color = ClientUI::ResearchableTechFillColor(); + m_text_and_border_color = ClientUI::ResearchableTechTextAndBorderColor(); + } else { + m_fill_color = ClientUI::UnresearchableTechFillColor(); + m_text_and_border_color = ClientUI::UnresearchableTechTextAndBorderColor(); + } + + + // update cost text + std::string cost_str; + if (!known_tech) + cost_str = boost::io::str(FlexibleFormat(UserString("TECH_TOTAL_COST_STR")) % + static_cast<int>(m_tech->ResearchCost() + 0.5) % + m_tech->ResearchTurns()); + m_tech_cost_text->SetText(cost_str); + + + // update progress text + std::string progress_str; + if (known_tech) + progress_str = UserString("TECH_WND_TECH_COMPLETED"); + else if (queued_tech) + progress_str = UserString("TECH_WND_TECH_QUEUED"); + else if (m_progress) + progress_str = UserString("TECH_WND_TECH_INCOMPLETE"); + m_progress_text->SetText(progress_str); + + + Select(m_selected); +} + GG::Rect TechTreeWnd::LayoutPanel::TechPanel::ProgressPanelRect(const GG::Pt& ul, const GG::Pt& lr) { GG::Rect retval; @@ -1693,9 +1731,19 @@ GG::GUI::RenderWindow(m_hscroll); } -void TechTreeWnd::LayoutPanel::Update() +void TechTreeWnd::LayoutPanel::Update(const Tech* tech) { - Layout(true); + TechManager& manager = GetTechManager(); + if (!tech) { + // update all tech panels + for (std::map<const Tech*, TechPanel*>::iterator tech_it = m_techs.begin(); tech_it != m_techs.end(); ++tech_it) + tech_it->second->Update(); + } else { + // update just specified tech's panel + std::map<const Tech*, TechPanel*>::iterator tech_it = m_techs.find(tech); + if (tech_it != m_techs.end()) + tech_it->second->Update(); + } } void TechTreeWnd::LayoutPanel::Clear() @@ -1704,21 +1752,21 @@ m_hscroll->ScrollTo(0); m_vscroll->SizeScroll(0, 1, 1, 1); m_hscroll->SizeScroll(0, 1, 1, 1); - for (std::map<const Tech*, TechPanel*>::const_iterator it = m_techs.begin(); it != m_techs.end(); ++it) { + + // delete all panels + for (std::map<const Tech*, TechPanel*>::const_iterator it = m_techs.begin(); it != m_techs.end(); ++it) delete it->second; - } m_techs.clear(); + m_dependency_arcs.clear(); + m_selected_tech = 0; } void TechTreeWnd::LayoutPanel::Reset() { - Layout(true); - TechManager& manager = GetTechManager(); - TechManager::iterator it = manager.begin(); - if (it != manager.end()) - CenterOnTech(*it); + // regenerate graph of panels and dependency lines + Layout(false); } void TechTreeWnd::LayoutPanel::SetScale(double scale) @@ -1877,7 +1925,7 @@ 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, m_categories_shown, m_tech_types_shown, m_tech_statuses_shown, m_scale); + m_techs[tech] = new TechPanel(tech, tech == m_selected_tech, 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_X), static_cast<int>(PS2INCH(ND_coord_i(node).y) - (m_techs[tech]->Height() - PROGRESS_PANEL_BOTTOM_EXTRUSION * m_scale) / 2 + TECH_PANEL_MARGIN_Y))); m_layout_surface->AttachChild(m_techs[tech]); @@ -1900,7 +1948,7 @@ points.push_back(Spline(temp)); } const Empire* empire = Empires().Lookup(HumanClientApp::GetApp()->EmpireID()); - + TechStatus arc_type = empire->GetTechStatus(to->Name()); m_dependency_arcs[arc_type].insert(std::make_pair(from, std::make_pair(to, points))); } @@ -2405,10 +2453,10 @@ return m_layout_panel->GetTechStatusesShown(); } -void TechTreeWnd::Update() +void TechTreeWnd::Update(const Tech* tech) { - m_layout_panel->Update(); - m_tech_list->Reset(); + m_layout_panel->Update(tech); + // no list update available or needed as of this writing } void TechTreeWnd::Clear() Modified: trunk/FreeOrion/UI/TechTreeWnd.h =================================================================== --- trunk/FreeOrion/UI/TechTreeWnd.h 2008-06-17 03:55:20 UTC (rev 2589) +++ trunk/FreeOrion/UI/TechTreeWnd.h 2008-06-17 21:10:31 UTC (rev 2590) @@ -30,7 +30,7 @@ //@} //! \name Mutators //@{ - void Update(); + void Update(const Tech* tech = 0); void Clear(); void Reset(); void SetScale(double scale); |
From: <tz...@us...> - 2006-02-13 03:43:57
|
Revision: 1751 Author: tzlaine Date: 2006-02-12 19:43:43 -0800 (Sun, 12 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1751&view=rev Log Message: ----------- Fixed drag-rearrangement of ProductionWnd and ResearchWnd items broken by recent GG changes. Modified Paths: -------------- trunk/FreeOrion/UI/ProductionWnd.cpp trunk/FreeOrion/UI/ProductionWnd.h trunk/FreeOrion/UI/ResearchWnd.cpp trunk/FreeOrion/UI/ResearchWnd.h Modified: trunk/FreeOrion/UI/ProductionWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.cpp 2006-02-13 02:17:43 UTC (rev 1750) +++ trunk/FreeOrion/UI/ProductionWnd.cpp 2006-02-13 03:43:43 UTC (rev 1751) @@ -30,6 +30,45 @@ }; ////////////////////////////////////////////////// + // QueueListBox + ////////////////////////////////////////////////// + class QueueListBox : public CUIListBox + { + public: + QueueListBox(int x, int y, int w, int h, ProductionWnd* production_wnd) : + CUIListBox(x, y, w, h), + m_production_wnd(production_wnd) + {} + // 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() == "PRODUCTION_QUEUE_ROW") { + GG::ListBox::Row* row = static_cast<GG::ListBox::Row*>(*wnds.begin()); + int original_row_idx = -1; + for (int i = 0; i < NumRows(); ++i) { + if (&GetRow(i) == row) { + original_row_idx = i; + break; + } + } + 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(); + } + private: + ProductionWnd* m_production_wnd; + }; + + ////////////////////////////////////////////////// // QueueBuildPanel ////////////////////////////////////////////////// class QueueBuildPanel : public GG::Control @@ -153,16 +192,14 @@ { m_production_info_panel = new ProductionInfoPanel(PRODUCTION_INFO_AND_QUEUE_WIDTH, 200, UserString("PRODUCTION_INFO_PANEL_TITLE"), UserString("PRODUCTION_INFO_PP"), OUTER_LINE_THICKNESS, ClientUI::KNOWN_TECH_FILL_COLOR, ClientUI::KNOWN_TECH_TEXT_AND_BORDER_COLOR); - m_queue_lb = new CUIListBox(2, m_production_info_panel->LowerRight().y, m_production_info_panel->Width() - 4, ClientSize().y - 4 - m_production_info_panel->Height()); + m_queue_lb = new QueueListBox(2, m_production_info_panel->LowerRight().y, m_production_info_panel->Width() - 4, ClientSize().y - 4 - m_production_info_panel->Height(), this); m_queue_lb->SetStyle(GG::LB_NOSORT | GG::LB_NOSEL | GG::LB_USERDELETE); - m_queue_lb->AllowDropType("PRODUCTION_QUEUE_ROW"); GG::Pt buid_designator_wnd_size = ClientSize() - GG::Pt(m_production_info_panel->Width() + 6, 6); m_build_designator_wnd = new BuildDesignatorWnd(buid_designator_wnd_size.x, buid_designator_wnd_size.y); m_build_designator_wnd->MoveTo(GG::Pt(m_production_info_panel->Width() + 3, 3)); GG::Connect(m_build_designator_wnd->AddBuildToQueueSignal, &ProductionWnd::AddBuildToQueueSlot, this); GG::Connect(m_build_designator_wnd->BuildQuantityChangedSignal, &ProductionWnd::ChangeBuildQuantitySlot, this); - GG::Connect(m_queue_lb->DroppedSignal, &ProductionWnd::QueueItemMovedSlot, this); GG::Connect(m_queue_lb->ErasedSignal, &ProductionWnd::QueueItemDeletedSlot, this); GG::Connect(m_queue_lb->LeftClickedSignal, &ProductionWnd::QueueItemClickedSlot, this); GG::Connect(m_queue_lb->DoubleClickedSignal, &ProductionWnd::QueueItemDoubleClickedSlot, this); @@ -299,6 +336,13 @@ m_build_designator_wnd->SelectSystem(system); } +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)); + UpdateQueue(); + ResetInfoPanel(); +} + void ProductionWnd::Sanitize() { m_build_designator_wnd->Clear(); @@ -359,13 +403,6 @@ } } -void ProductionWnd::QueueItemMovedSlot(int row_idx, GG::ListBox::Row* row) -{ - HumanClientApp::Orders().IssueOrder(new ProductionQueueOrder(HumanClientApp::GetApp()->EmpireID(), static_cast<QueueRow*>(row)->queue_index, row_idx)); - UpdateQueue(); - ResetInfoPanel(); -} - void ProductionWnd::QueueItemClickedSlot(int row_idx, GG::ListBox::Row* row, const GG::Pt& pt) { m_build_designator_wnd->CenterOnBuild(row_idx); Modified: trunk/FreeOrion/UI/ProductionWnd.h =================================================================== --- trunk/FreeOrion/UI/ProductionWnd.h 2006-02-13 02:17:43 UTC (rev 1750) +++ trunk/FreeOrion/UI/ProductionWnd.h 2006-02-13 03:43:43 UTC (rev 1751) @@ -29,6 +29,7 @@ void Reset(); void CenterOnBuild(int queue_idx); void SelectSystem(int system); + void QueueItemMoved(int row_idx, GG::ListBox::Row* row); void Sanitize(); //@} @@ -38,7 +39,6 @@ void AddBuildToQueueSlot(BuildType build_type, const std::string& name, int number, int location); void ChangeBuildQuantitySlot(int queue_idx, int quantity); void QueueItemDeletedSlot(int row_idx, GG::ListBox::Row* row); - void QueueItemMovedSlot(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/ResearchWnd.cpp =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.cpp 2006-02-13 02:17:43 UTC (rev 1750) +++ trunk/FreeOrion/UI/ResearchWnd.cpp 2006-02-13 03:43:43 UTC (rev 1751) @@ -30,6 +30,45 @@ }; ////////////////////////////////////////////////// + // QueueListBox + ////////////////////////////////////////////////// + class QueueListBox : public CUIListBox + { + public: + QueueListBox(int x, int y, int w, int h, ResearchWnd* research_wnd) : + CUIListBox(x, y, w, h), + m_research_wnd(research_wnd) + {} + // 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") { + GG::ListBox::Row* row = static_cast<GG::ListBox::Row*>(*wnds.begin()); + int original_row_idx = -1; + for (int i = 0; i < NumRows(); ++i) { + if (&GetRow(i) == row) { + original_row_idx = i; + break; + } + } + 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(); + } + private: + ResearchWnd* m_research_wnd; + }; + + ////////////////////////////////////////////////// // QueueTechPanel ////////////////////////////////////////////////// class QueueTechPanel : public GG::Control @@ -144,15 +183,13 @@ { m_research_info_panel = new ProductionInfoPanel(RESEARCH_INFO_AND_QUEUE_WIDTH, 200, UserString("RESEARCH_INFO_PANEL_TITLE"), UserString("RESEARCH_INFO_RP"), OUTER_LINE_THICKNESS, ClientUI::KNOWN_TECH_FILL_COLOR, ClientUI::KNOWN_TECH_TEXT_AND_BORDER_COLOR); - m_queue_lb = new CUIListBox(2, m_research_info_panel->LowerRight().y, m_research_info_panel->Width() - 4, ClientSize().y - 4 - m_research_info_panel->Height()); + m_queue_lb = new QueueListBox(2, m_research_info_panel->LowerRight().y, m_research_info_panel->Width() - 4, ClientSize().y - 4 - m_research_info_panel->Height(), this); m_queue_lb->SetStyle(GG::LB_NOSORT | GG::LB_NOSEL | GG::LB_USERDELETE); - m_queue_lb->AllowDropType("RESEARCH_QUEUE_ROW"); GG::Pt tech_tree_wnd_size = ClientSize() - GG::Pt(m_research_info_panel->Width() + 6, 6); m_tech_tree_wnd = new TechTreeWnd(tech_tree_wnd_size.x, tech_tree_wnd_size.y); 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_queue_lb->DroppedSignal, &ResearchWnd::QueueItemMovedSlot, 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); @@ -185,6 +222,13 @@ m_tech_tree_wnd->CenterOnTech(GetTech(tech_name)); } +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)); + UpdateQueue(); + ResetInfoPanel(); +} + void ResearchWnd::Sanitize() { m_tech_tree_wnd->Clear(); @@ -238,13 +282,6 @@ m_tech_tree_wnd->Update(); } -void ResearchWnd::QueueItemMovedSlot(int row_idx, GG::ListBox::Row* row) -{ - HumanClientApp::Orders().IssueOrder(new ResearchQueueOrder(HumanClientApp::GetApp()->EmpireID(), dynamic_cast<QueueRow*>(row)->tech->Name(), row_idx)); - UpdateQueue(); - ResetInfoPanel(); -} - void ResearchWnd::QueueItemClickedSlot(int row_idx, GG::ListBox::Row* row, const GG::Pt& pt) { m_tech_tree_wnd->CenterOnTech(dynamic_cast<QueueRow*>(row)->tech); Modified: trunk/FreeOrion/UI/ResearchWnd.h =================================================================== --- trunk/FreeOrion/UI/ResearchWnd.h 2006-02-13 02:17:43 UTC (rev 1750) +++ trunk/FreeOrion/UI/ResearchWnd.h 2006-02-13 03:43:43 UTC (rev 1751) @@ -25,6 +25,7 @@ void Reset(); void CenterOnTech(const std::string& tech_name); + void QueueItemMoved(int row_idx, GG::ListBox::Row* row); void Sanitize(); //@} @@ -33,7 +34,6 @@ void ResetInfoPanel(); void AddTechToQueueSlot(const Tech* tech); void QueueItemDeletedSlot(int row_idx, GG::ListBox::Row* row); - void QueueItemMovedSlot(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); |