1 #ifndef _FleetButton_h_
2 #define _FleetButton_h_
3 
4 
5 #include <GG/Button.h>
6 #include <GG/StaticGraphic.h>
7 
8 #include <memory>
9 
10 
11 class Fleet;
12 class RotatingGraphic;
13 class ScanlineControl;
14 
15 /** represents one or more fleets of an empire at a location on the map. */
16 class FleetButton : public GG::Button {
17 public:
18     enum class SizeType {
19         NONE,
20         TINY,
21         SMALL,
22         MEDIUM,
23         LARGE
24     };
25 
26     /** \name Structors */ //@{
27     FleetButton(const std::vector<int>& fleet_IDs, SizeType size_type = SizeType::LARGE);
28     FleetButton(int fleet_id, SizeType size_type = SizeType::LARGE);
29     void CompleteConstruction() override;
30     virtual ~FleetButton();
31     //@}
32 
33     /** \name Accessors */ //@{
34     /** Returns true if \a pt is within or over the button. */
35     bool InWindow(const GG::Pt& pt) const override;
36 
Fleets()37     const std::vector<int>& Fleets() const      { return m_fleets; }    ///< returns the fleets represented by this control
Selected()38     bool                    Selected() const    { return m_selected; }  ///< returns whether this button has been marked selected
39     //@}
40 
41     /** \name Mutators */ //@{
42     void MouseHere(const GG::Pt& pt, GG::Flags<GG::ModKey> mod_keys) override;
43 
44     void SizeMove(const GG::Pt& ul, const GG::Pt& lr) override;
45 
46     void                    SetSelected(bool selected = true);      ///< sets selection status of button.  if selected = true, marks button as selected.  otherwise marks button as not selected
47     //@}
48 
49     static void             PlayFleetButtonOpenSound();
50     static void             PlayFleetButtonRolloverSound();
51 
52 protected:
53     /** \name Mutators */ //@{
54     void RenderUnpressed() override;
55     void RenderPressed() override;
56     void RenderRollover() override;
57     //@}
58 
59 private:
60     void LayoutIcons();
61 
62     std::vector<int>                                m_fleets;   ///< the fleets represented by this button
63     std::vector<std::shared_ptr<GG::StaticGraphic>> m_icons;
64     std::shared_ptr<RotatingGraphic>                m_selection_indicator;
65     std::shared_ptr<ScanlineControl>                m_scanline_control;
66     bool                                            m_selected = false; ///< should this button render itself specially to show that it is selected?
67     bool                                            m_fleet_blockaded = false;
68 };
69 
70 /* returns head icon for passed fleet at passed icon size */
71 std::vector<std::shared_ptr<GG::Texture>> FleetHeadIcons(std::shared_ptr<const Fleet>, FleetButton::SizeType size_type);
72 
73 /* returns head icon for passed fleets at passed icon size */
74 std::vector<std::shared_ptr<GG::Texture>> FleetHeadIcons(const std::vector<std::shared_ptr<const Fleet>>& fleets, FleetButton::SizeType size_type);
75 
76 /* returns size icon for passed fleet at passed icon size */
77 std::shared_ptr<GG::Texture> FleetSizeIcon(std::shared_ptr<const Fleet> fleet, FleetButton::SizeType size_type);
78 
79 /* returns head icon for passed fleet size at passed icon size */
80 std::shared_ptr<GG::Texture> FleetSizeIcon(unsigned int fleet_size, FleetButton::SizeType size_type);
81 
82 /* returns blockade icon if a fleet is being blockaded */
83 std::shared_ptr<GG::Texture> FleetBlockadedIcon(FleetButton::SizeType size_type);
84 
85 /* returns icon for indication fleet icon selection */
86 std::shared_ptr<GG::Texture> FleetSelectionIndicatorIcon();
87 
88 #endif // _FleetButton_h_
89