This is an automated email from the git hooks/post-receive script. odyx pushed a commit to branch debian/master in repository colobot.
commit 8a0c7279dc518438fcfd3b8543140edc66386f9c Author: Smok94 <to...@o2.pl> Date: Mon Jan 2 20:23:19 2017 +0100 Command history for cheat console, closes #316 (PR #869) Adds console command history. Browsable by up and down arrow keys. --- src/level/robotmain.cpp | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ src/level/robotmain.h | 12 ++++++++++++ 2 files changed, 61 insertions(+) diff --git a/src/level/robotmain.cpp b/src/level/robotmain.cpp index 80e9ce0..2797e3d 100644 --- a/src/level/robotmain.cpp +++ b/src/level/robotmain.cpp @@ -763,6 +763,7 @@ bool CRobotMain::ProcessEvent(Event &event) m_interface->SetFocus(pe); if (m_phase == PHASE_SIMUL) m_cmdEditPause = m_pause->ActivatePause(PAUSE_ENGINE); m_cmdEdit = true; + m_commandHistoryIndex = -1; // no element selected in command history } return false; } @@ -777,6 +778,28 @@ bool CRobotMain::ProcessEvent(Event &event) } } + // Browse forward command history with UP key + if (event.type == EVENT_KEY_DOWN && + event.GetData<KeyEventData>()->key == KEY(UP) && m_cmdEdit) + { + Ui::CEdit* pe = static_cast<Ui::CEdit*>(m_interface->SearchControl(EVENT_CMD)); + if (pe == nullptr) return false; + std::string cmd = GetNextFromCommandHistory(); + if (!cmd.empty()) pe->SetText(cmd); + return false; + } + + // Browse backward command history with DOWN key + if (event.type == EVENT_KEY_DOWN && + event.GetData<KeyEventData>()->key == KEY(DOWN) && m_cmdEdit) + { + Ui::CEdit* pe = static_cast<Ui::CEdit*>(m_interface->SearchControl(EVENT_CMD)); + if (pe == nullptr) return false; + std::string cmd = GetPreviousFromCommandHistory(); + if (!cmd.empty()) pe->SetText(cmd); + return false; + } + if (event.type == EVENT_KEY_DOWN && event.GetData<KeyEventData>()->key == KEY(RETURN) && m_cmdEdit) { @@ -793,6 +816,7 @@ bool CRobotMain::ProcessEvent(Event &event) m_cmdEditPause = nullptr; } ExecuteCmd(cmd); + PushToCommandHistory(cmd); m_cmdEdit = false; return false; } @@ -5768,3 +5792,28 @@ bool CRobotMain::GetDebugCrashSpheres() { return m_debugCrashSpheres; } + +void CRobotMain::PushToCommandHistory(std::string str) +{ + if (!m_commandHistory.empty() && m_commandHistory.front() == str) // already in history + return; + + m_commandHistory.push_front(str); + + if (m_commandHistory.size() > 50) // to avoid infinite growth + m_commandHistory.pop_back(); +} + +std::string CRobotMain::GetNextFromCommandHistory() +{ + if (m_commandHistory.empty() || static_cast<int>(m_commandHistory.size()) <= m_commandHistoryIndex + 1) // no next element + return ""; + return m_commandHistory[++m_commandHistoryIndex]; +} + +std::string CRobotMain::GetPreviousFromCommandHistory() +{ + if (m_commandHistory.empty() || m_commandHistoryIndex < 1) // first or none element selected + return ""; + return m_commandHistory[--m_commandHistoryIndex]; +} diff --git a/src/level/robotmain.h b/src/level/robotmain.h index 346e8fc..dad1bed 100644 --- a/src/level/robotmain.h +++ b/src/level/robotmain.h @@ -513,6 +513,13 @@ protected: void UpdateDebugCrashSpheres(); + //! Adds element to the beginning of command history + void PushToCommandHistory(std::string obj); + //! Returns next/previous element from command history and updates index + //@{ + std::string GetNextFromCommandHistory(); + std::string GetPreviousFromCommandHistory(); + //@} protected: CApplication* m_app = nullptr; @@ -685,4 +692,9 @@ protected: std::deque<CObject*> m_selectionHistory; bool m_debugCrashSpheres; + + //! Cheat console command history + std::deque<std::string> m_commandHistory; + //! Index of currently selected element in command history + int m_commandHistoryIndex; }; -- Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/colobot.git _______________________________________________ Pkg-games-commits mailing list Pkg-games-commits@lists.alioth.debian.org http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/pkg-games-commits