1 /*
2  * This file is part of the Colobot: Gold Edition source code
3  * Copyright (C) 2001-2020, Daniel Roux, EPSITEC SA & TerranovaTeam
4  * http://epsitec.ch; http://colobot.info; http://github.com/colobot
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14  * See the GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see http://gnu.org/licenses
18  */
19 
20 #pragma once
21 
22 #include "common/event.h"
23 
24 #include "graphics/engine/text.h"
25 
26 #include <string>
27 
28 class CRobotMain;
29 class CSoundInterface;
30 class CSettings;
31 
32 namespace Gfx
33 {
34 class CEngine;
35 class CParticle;
36 }
37 
38 
39 namespace Ui
40 {
41 
42 enum ControlState
43 {
44     STATE_ENABLE    = (1<<0),   // active
45     STATE_CHECK     = (1<<1),   // pressed
46     STATE_HILIGHT   = (1<<2),   // overflown by mouse
47     STATE_PRESS     = (1<<3),   // pressed by mouse
48     STATE_VISIBLE   = (1<<4),   // visible
49     STATE_DEAD      = (1<<5),   // inaccessible (x)
50     STATE_DEFAULT   = (1<<6),   // actuated by RETURN
51     STATE_OKAY      = (1<<7),   // green point at the bottom right
52     STATE_SHADOW    = (1<<8),   // shadow
53     STATE_GLINT     = (1<<9),   // dynamic reflection
54     STATE_CARD      = (1<<10),  // tab
55     STATE_EXTEND    = (1<<11),  // extended mode
56     STATE_SIMPLY    = (1<<12),  // undecorated
57     STATE_FRAME     = (1<<13),  // framework highlighting
58     STATE_WARNING   = (1<<14),  // framework hatched yellow / black
59     STATE_VALUE     = (1<<15),  // displays the value
60     STATE_RUN       = (1<<16),  // running program
61     STATE_DAMAGE    = (1<<17)   // taking damage
62 };
63 
64 
65 
66 class CControl
67 {
68 public:
69     CControl();
70     virtual ~CControl();
71 
72     virtual bool          Create(Math::Point pos, Math::Point dim, int icon, EventType eventType);
73 
74     virtual bool          EventProcess(const Event &event);
75 
76     virtual void          SetPos(Math::Point pos);
77     virtual Math::Point   GetPos();
78     virtual void          SetDim(Math::Point dim);
79     virtual Math::Point   GetDim();
80     virtual bool          SetState(int state, bool bState);
81     virtual bool          SetState(int state);
82     virtual bool          ClearState(int state);
83     virtual bool          TestState(int state);
84     virtual int           GetState();
85     virtual void          SetIcon(int icon);
86     virtual int           GetIcon();
87     virtual void          SetName(std::string name, bool bTooltip=true);
88     virtual std::string   GetName();
89     virtual void          SetTextAlign(Gfx::TextAlign mode);
90     virtual int           GetTextAlign();
91     virtual void          SetFontSize(float size);
92     virtual float         GetFontSize();
93     virtual void          SetFontStretch(float stretch);
94     virtual float         GetFontStretch();
95     virtual void          SetFontType(Gfx::FontType font);
96     virtual Gfx::FontType GetFontType();
97     virtual bool          SetTooltip(std::string name);
98     virtual bool          GetTooltip(Math::Point pos, std::string &name);
99     virtual void          SetFocus(CControl* focusControl);
100     virtual bool          GetFocus();
101 
102     virtual EventType     GetEventType();
103 
104     virtual void          Draw();
105 
106 protected:
107             void    GlintDelete();
108             void    GlintCreate(Math::Point ref, bool bLeft=true, bool bUp=true);
109             void    GlintFrame(const Event &event);
110             void    DrawPart(int icon, float zoom, float ex);
111             void    DrawIcon(Math::Point pos, Math::Point dim, Math::Point uv1, Math::Point uv2, float ex=0.0f);
112             void    DrawIcon(Math::Point pos, Math::Point dim, Math::Point uv1, Math::Point uv2, Math::Point corner, float ex);
113             void    DrawWarning(Math::Point pos, Math::Point dim);
114             void    DrawShadow(Math::Point pos, Math::Point dim, float deep=1.0f);
115     virtual bool    Detect(Math::Point pos);
116 
117     std::string     GetResourceName(EventType eventType);
118 
119     /**
120      * \brief Set texture in m_engine to correct buttonX.png for given icon
121      * \param icon Icon to draw
122      * \return Index inside the selected texture of the icon to draw
123      */
124     int             SetButtonTextureForIcon(int icon);
125 
126 protected:
127     Gfx::CEngine*     m_engine;
128     Gfx::CParticle*   m_particle;
129     CEventQueue*      m_event;
130     CRobotMain*       m_main;
131     CSoundInterface*  m_sound;
132     CSettings*        m_settings;
133 
134     Math::Point       m_pos;          // corner upper / left
135     Math::Point       m_dim;          // dimensions
136     int               m_icon;
137     EventType         m_eventType;     // message to send when clicking
138     int               m_state;        // states (STATE_ *)
139     float             m_fontSize;     // size of the button name
140     float             m_fontStretch;      // stretch of the font
141     Gfx::FontType     m_fontType;     // type of font
142     Gfx::TextAlign    m_textAlign;    //type of alignment //comes in the place of m_justif
143     std::string       m_name;        // name of the button
144     std::string       m_tooltip;     // name of tooltip
145     bool              m_bFocus;
146     bool              m_bCapture;
147 
148     bool              m_bGlint;
149     Math::Point       m_glintCorner1;
150     Math::Point       m_glintCorner2;
151     float             m_glintProgress;
152     Math::Point       m_glintMouse;
153 };
154 
155 } // namespace Ui
156