[colobot] 90/100: Make initial scoreboard values editable

Didier Raboud odyx at moszumanska.debian.org
Thu Jun 1 18:10:24 UTC 2017


This is an automated email from the git hooks/post-receive script.

odyx pushed a commit to branch debian/master
in repository colobot.

commit 08d87fa9757a05b66325b9ea77123d098143ddbd
Author: krzys-h <krzys_h at interia.pl>
Date:   Wed May 24 12:39:05 2017 +0200

    Make initial scoreboard values editable
---
 src/app/app.cpp          |  5 ++--
 src/app/app.h            |  5 +++-
 src/level/robotmain.cpp  | 59 ++++++++++++++++++++++++++++++++++++++++--------
 src/level/robotmain.h    |  1 +
 src/level/scoreboard.cpp |  5 ++++
 src/level/scoreboard.h   |  1 +
 src/ui/controls/edit.cpp | 31 +++++++++++++++----------
 7 files changed, 83 insertions(+), 24 deletions(-)

diff --git a/src/app/app.cpp b/src/app/app.cpp
index 806a17c..f019ccc 100644
--- a/src/app/app.cpp
+++ b/src/app/app.cpp
@@ -1854,9 +1854,10 @@ bool CApplication::GetSceneTestMode()
     return m_sceneTest;
 }
 
-void CApplication::SetTextInput(bool textInputEnabled)
+void CApplication::SetTextInput(bool textInputEnabled, int id)
 {
-    if (textInputEnabled)
+    m_textInputEnabled[id] = textInputEnabled;
+    if (std::any_of(m_textInputEnabled.begin(), m_textInputEnabled.end(), [](std::pair<int, bool> v) { return v.second; }))
     {
         SDL_StartTextInput();
     }
diff --git a/src/app/app.h b/src/app/app.h
index 1b3b3a2..ac8769c 100644
--- a/src/app/app.h
+++ b/src/app/app.h
@@ -35,6 +35,7 @@
 
 #include <string>
 #include <vector>
+#include <map>
 
 
 class CEventQueue;
@@ -245,7 +246,7 @@ public:
 
     //! Enable/disable text input, this toggles the on-screen keyboard on some platforms
     /** This also allows for writing in CJK languages (not tested!), see https://wiki.libsdl.org/Tutorials/TextInput for detailed explanation */
-    void        SetTextInput(bool textInputEnabled);
+    void        SetTextInput(bool textInputEnabled, int id);
 
     //! Moves (warps) the mouse cursor to the specified position (in interface coords)
     void        MoveMouse(Math::Point pos);
@@ -403,6 +404,8 @@ protected:
 
     //! Static buffer for putenv locale
     static char m_languageLocale[50];
+
+    std::map<int, bool> m_textInputEnabled;
 };
 
 template<> CApplication* CSingleton<CApplication>::m_instance;
diff --git a/src/level/robotmain.cpp b/src/level/robotmain.cpp
index 7f4181f..30f55e3 100644
--- a/src/level/robotmain.cpp
+++ b/src/level/robotmain.cpp
@@ -2563,6 +2563,7 @@ bool CRobotMain::EventFrame(const Event &event)
         if (!m_codeBattleStarted && m_userPause == nullptr)
         {
             m_codeBattleStarted = true;
+            ApplyCodeBattleInterface();
             CreateCodeBattleInterface();
 
             SetCodeBattleSpectatorMode(true);
@@ -5793,7 +5794,7 @@ void CRobotMain::CreateCodeBattleInterface()
 
         int numTeams = m_scoreboard ? GetAllTeams().size() : 0;
         assert(numTeams < EVENT_SCOREBOARD_MAX-EVENT_SCOREBOARD+1);
-        float textHeight = m_engine->GetText()->GetAscent(Gfx::FONT_COLOBOT, Gfx::FONT_SIZE_SMALL);
+        float textHeight = m_engine->GetText()->GetHeight(Gfx::FONT_COLOBOT, Gfx::FONT_SIZE_SMALL);
 
         ddim.x = 100.0f/640.0f;
         ddim.y = 100.0f/480.0f + numTeams * textHeight;
@@ -5825,18 +5826,59 @@ void CRobotMain::CreateCodeBattleInterface()
 
         pos.y += ddim.y;
         ddim.y = textHeight;
-        for (int i = 0; i < numTeams; i++)
+        int i = 0;
+        auto teams = GetAllTeams();
+        for (auto it = teams.rbegin(); it != teams.rend(); ++it)
         {
-            Ui::CLabel* pl;
-            pl = pw->CreateLabel(pos, ddim, 0, static_cast<EventType>(EVENT_SCOREBOARD+2*(numTeams-i-1)+0), "XXXXX");
+            int team = *it;
+            Ui::CControl* pl;
+            ddim.x = 55.0f/640.0f;
+            pl = m_codeBattleStarted
+                 ? static_cast<Ui::CControl*>(pw->CreateLabel(pos, ddim, 0, static_cast<EventType>(EVENT_SCOREBOARD+2*(numTeams-i-1)+0), "XXXXX"))
+                 : static_cast<Ui::CControl*>(pw->CreateEdit( pos, ddim, 0, static_cast<EventType>(EVENT_SCOREBOARD+2*(numTeams-i-1)+0)));
             pl->SetTextAlign(Gfx::TEXT_ALIGN_LEFT);
-            pl = pw->CreateLabel(pos, ddim, 0, static_cast<EventType>(EVENT_SCOREBOARD+2*(numTeams-i-1)+1), "???");
+            pl->SetFontSize(m_codeBattleStarted ? Gfx::FONT_SIZE_SMALL : Gfx::FONT_SIZE_SMALL*0.75f);
+            m_codeBattleStarted ? pl->SetName(GetTeamName(team)) : static_cast<Ui::CEdit*>(pl)->SetText(GetTeamName(team));
+            pos.x += 57.5f/640.0f;
+            ddim.x = 22.5f/640.0f;
+            pl = m_codeBattleStarted
+                 ? static_cast<Ui::CControl*>(pw->CreateLabel(pos, ddim, 0, static_cast<EventType>(EVENT_SCOREBOARD+2*(numTeams-i-1)+1), "???"))
+                 : static_cast<Ui::CControl*>(pw->CreateEdit( pos, ddim, 0, static_cast<EventType>(EVENT_SCOREBOARD+2*(numTeams-i-1)+1)));
             pl->SetTextAlign(Gfx::TEXT_ALIGN_RIGHT);
+            pl->SetFontSize(m_codeBattleStarted ? Gfx::FONT_SIZE_SMALL : Gfx::FONT_SIZE_SMALL*0.75f);
+            m_codeBattleStarted ? pl->SetName(StrUtils::ToString<int>(m_scoreboard->GetScore(team))) : static_cast<Ui::CEdit*>(pl)->SetText(StrUtils::ToString<int>(m_scoreboard->GetScore(team)));
+            pos.x -= 57.5f/640.0f;
             pos.y += ddim.y;
+            i++;
         }
     }
 }
 
+void CRobotMain::ApplyCodeBattleInterface()
+{
+    assert(GetMissionType() == MISSION_CODE_BATTLE);
+    if (!m_scoreboard) return;
+
+    Ui::CWindow* pw = static_cast<Ui::CWindow*>(m_interface->SearchControl(EVENT_WINDOW6));
+    assert(pw != nullptr);
+
+    int i = 0;
+    for (int team : GetAllTeams())
+    {
+        Ui::CEdit* pl;
+
+        pl = static_cast<Ui::CEdit*>(pw->SearchControl(static_cast<EventType>(EVENT_SCOREBOARD+2*i+0)));
+        assert(pl != nullptr);
+        m_teamNames[team] = pl->GetText(pl->GetTextLength());
+
+        pl = static_cast<Ui::CEdit*>(pw->SearchControl(static_cast<EventType>(EVENT_SCOREBOARD+2*i+1)));
+        assert(pl != nullptr);
+        m_scoreboard->SetScore(team, StrUtils::FromString<int>(pl->GetText(pl->GetTextLength())));
+
+        i++;
+    }
+}
+
 void CRobotMain::UpdateCodeBattleInterface()
 {
     assert(GetMissionType() == MISSION_CODE_BATTLE);
@@ -5848,19 +5890,18 @@ void CRobotMain::UpdateCodeBattleInterface()
     int i = 0;
     for (int team : GetAllTeams())
     {
-        Ui::CLabel* pl;
+        Ui::CControl* pl;
 
-        pl = static_cast<Ui::CLabel*>(pw->SearchControl(static_cast<EventType>(EVENT_SCOREBOARD+2*i+0)));
+        pl = pw->SearchControl(static_cast<EventType>(EVENT_SCOREBOARD+2*i+0));
         assert(pl != nullptr);
         pl->SetName(GetTeamName(team));
 
-        pl = static_cast<Ui::CLabel*>(pw->SearchControl(static_cast<EventType>(EVENT_SCOREBOARD+2*i+1)));
+        pl = pw->SearchControl(static_cast<EventType>(EVENT_SCOREBOARD+2*i+1));
         assert(pl != nullptr);
         pl->SetName(StrUtils::ToString<int>(m_scoreboard->GetScore(team)));
 
         i++;
     }
-
 }
 
 void CRobotMain::DestroyCodeBattleInterface()
diff --git a/src/level/robotmain.h b/src/level/robotmain.h
index a683e20..d4e1852 100644
--- a/src/level/robotmain.h
+++ b/src/level/robotmain.h
@@ -518,6 +518,7 @@ protected:
     //@{
     void        CreateCodeBattleInterface();
     void        UpdateCodeBattleInterface();
+    void        ApplyCodeBattleInterface();
     void        DestroyCodeBattleInterface();
     void        SetCodeBattleSpectatorMode(bool mode);
     //@}
diff --git a/src/level/scoreboard.cpp b/src/level/scoreboard.cpp
index 0f388c6..7e4b5b0 100644
--- a/src/level/scoreboard.cpp
+++ b/src/level/scoreboard.cpp
@@ -106,3 +106,8 @@ int CScoreboard::GetScore(int team)
 {
     return m_score[team];
 }
+
+void CScoreboard::SetScore(int team, int points)
+{
+    m_score[team] = points;
+}
diff --git a/src/level/scoreboard.h b/src/level/scoreboard.h
index 6768a59..58a5acb 100644
--- a/src/level/scoreboard.h
+++ b/src/level/scoreboard.h
@@ -115,6 +115,7 @@ public:
 
     void AddPoints(int team, int points);
     int GetScore(int team);
+    void SetScore(int team, int score);
 
 private:
     std::vector<std::unique_ptr<CScoreboardKillRule>> m_rulesKill = {};
diff --git a/src/ui/controls/edit.cpp b/src/ui/controls/edit.cpp
index af04d93..1269284 100644
--- a/src/ui/controls/edit.cpp
+++ b/src/ui/controls/edit.cpp
@@ -94,7 +94,7 @@ bool IsBreaker(char c)
 bool IsDelimiter(char c)
 {
     return IsSpace( c ) || IsBreaker( c );
-}
+}
 
 //! Object's constructor.
 CEdit::CEdit()
@@ -148,7 +148,7 @@ CEdit::~CEdit()
 
     if (m_bFocus)
     {
-        CApplication::GetInstancePointer()->SetTextInput(false);
+        CApplication::GetInstancePointer()->SetTextInput(false, EVENT_OBJECT_PEN3);
     }
 }
 
@@ -520,13 +520,20 @@ bool CEdit::EventProcess(const Event &event)
                 MouseClick(event.mousePos);
                 if ( m_bEdit || m_bHilite )  m_bCapture = true;
             }
-            m_bFocus = true;
-            UpdateFocus();
+
+            if (!m_bFocus)
+            {
+                m_bFocus = true;
+                UpdateFocus();
+            }
         }
         else
         {
-            m_bFocus = false;
-            UpdateFocus();
+            if (m_bFocus)
+            {
+                m_bFocus = false;
+                UpdateFocus();
+            }
         }
     }
 
@@ -730,7 +737,7 @@ int CEdit::MouseDetect(Math::Point mouse)
 
         if ( i >= m_lineFirst+m_lineVisible )  break;
 
-        pos.x = m_pos.x+(10.0f/640.0f);
+        pos.x = m_pos.x+(7.5f/640.0f)*(m_fontSize/Gfx::FONT_SIZE_SMALL);
         if ( m_bAutoIndent )
         {
             pos.x += indentLength*m_lineIndent[i];
@@ -945,7 +952,7 @@ void CEdit::Draw()
 
         if ( i >= m_lineFirst+m_lineVisible )  break;
 
-        pos.x = m_pos.x+(10.0f/640.0f);
+        pos.x = m_pos.x+(7.5f/640.0f)*(m_fontSize/Gfx::FONT_SIZE_SMALL);
         if ( m_bAutoIndent )
         {
             const char *s = "\t";  // line | dotted
@@ -1107,7 +1114,7 @@ void CEdit::Draw()
         {
             if ( i == m_lineTotal-1 || m_cursor1 < m_lineOffset[i+1] )
             {
-                pos.x = m_pos.x+(10.0f/640.0f);
+                pos.x = m_pos.x+(7.5f/640.0f)*(m_fontSize/Gfx::FONT_SIZE_SMALL);
                 if ( m_bAutoIndent )
                 {
                     pos.x += indentLength*m_lineIndent[i];
@@ -2767,7 +2774,7 @@ void CEdit::DeleteOne(int dir)
     }
     m_len -= hole;
     m_cursor2 = m_cursor1;
-}
+}
 
 // Delete word
 
@@ -3003,7 +3010,7 @@ void CEdit::Justif()
     {
         bDual = false;
 
-        width = m_dim.x-(10.0f/640.0f)*2.0f-(m_bMulti?MARGX*2.0f+SCROLL_WIDTH:0.0f);
+        width = m_dim.x-(7.5f/640.0f)*(m_fontSize/Gfx::FONT_SIZE_SMALL)*2.0f-(m_bMulti?MARGX*2.0f+SCROLL_WIDTH:0.0f);
         if ( m_bAutoIndent )
         {
             width -= indentLength*m_lineIndent[m_lineTotal-1];
@@ -3276,7 +3283,7 @@ void CEdit::SetFocus(CControl* control)
 
 void CEdit::UpdateFocus()
 {
-    CApplication::GetInstancePointer()->SetTextInput(m_bFocus);
+    CApplication::GetInstancePointer()->SetTextInput(m_bFocus, m_eventType);
 }
 
 }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git



More information about the Pkg-games-commits mailing list