Project::OSiRiON - Git repositories
Project::OSiRiON
News . About . Screenshots . Downloads . Forum . Wiki . Tracker . Git
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStijn Buys <ingar@osirion.org>2008-02-23 17:10:35 +0000
committerStijn Buys <ingar@osirion.org>2008-02-23 17:10:35 +0000
commit5c734fe66e9ace93c03937adc2fc56336fb474fb (patch)
treed4d4ffebd4215b0f1f42d6a4ac9275ec8cd686ea /src/client/chat.cc
parent82c06412ef39522c4deab457ce7a3e78160d8a19 (diff)
client chatbox and message notifications
Diffstat (limited to 'src/client/chat.cc')
-rw-r--r--src/client/chat.cc172
1 files changed, 172 insertions, 0 deletions
diff --git a/src/client/chat.cc b/src/client/chat.cc
new file mode 100644
index 0000000..4e7416f
--- /dev/null
+++ b/src/client/chat.cc
@@ -0,0 +1,172 @@
+/*
+ client/chat.cc
+ This file is part of the Osirion project and is distributed under
+ the terms and conditions of the GNU General Public License version 2
+*/
+
+#include "core/core.h"
+#include "client/chat.h"
+#include "client/console.h"
+#include "client/keyboard.h"
+#include "render/render.h"
+
+namespace client {
+
+namespace chat {
+
+// input history
+std::deque<std::string> history;
+std::deque<std::string>::reverse_iterator history_pos;
+size_t input_pos = 0;
+
+// chatbox visibility
+bool chat_visible = false;
+
+//--- engine functions --------------------------------------------
+
+void func_con_chat(std::string const &args)
+{
+ std::istringstream argstream(args);
+ int i;
+
+ if (argstream >> i) {
+ if (i) chat_visible = true; else chat_visible = false;
+ } else
+ chat_visible = !chat_visible;
+}
+
+//--- public ------------------------------------------------------
+
+void init()
+{
+ // add engine functions
+ core::Func::add("con_chat", (core::FuncPtr) func_con_chat);
+
+ history.clear();
+ history.push_back("");
+ history_pos = history.rbegin();
+ input_pos = 0;
+
+}
+
+void shutdown()
+{
+ // remove engine functions
+ core::Func::remove("con_chat");
+
+ history.clear();
+ input_pos = 0;
+}
+
+
+bool visible()
+{
+ return chat_visible;
+}
+
+void draw()
+{
+ using namespace render;
+
+ if (console::visible() || !visible())
+ return;
+
+ // draw the console input
+ gl::enable(GL_TEXTURE_2D);
+ gl::color(0.0f, 1.0f, 0.0f, 1.0f);
+ draw_text(CHARWIDTH , 4 + CHARHEIGHT * (MAXNOTIFYLINES+1), "Say:");
+
+ gl::color(1.0f, 1.0f, 1.0f, 1.0f);
+ draw_text(CHARWIDTH*6, 4 + CHARHEIGHT * (MAXNOTIFYLINES+1), (*history_pos));
+
+ // draw cursor
+ if ((core::application()->time() - ::floorf(core::application()->time())) < 0.5f) {
+ std::string cursor("_");
+ draw_text(CHARWIDTH*(input_pos+6), 4 + CHARHEIGHT * (MAXNOTIFYLINES+1) , cursor);
+ }
+ gl::disable(GL_TEXTURE_2D);
+}
+
+void toggle()
+{
+ chat_visible = !chat_visible;
+ if (chat_visible) {
+ input_pos = 0;
+ history_pos = history.rbegin();
+ (*history_pos).clear();
+ }
+}
+
+void keypressed(int key)
+{
+ std::deque<std::string>::reverse_iterator upit;
+
+ switch( key ) {
+ case SDLK_TAB:
+ core::CommandBuffer::complete( (*history_pos), input_pos);
+ break;
+ case SDLK_RETURN:
+ if ((*history_pos).size()) {
+ // store input into history
+ while (history.size() >= MAXHISTOLINES) {
+ history.pop_front();
+ }
+
+ core::cmd() << "say " << (*history_pos) << std::endl;
+ (*history.rbegin()) = (*history_pos);
+
+ history.push_back("");
+ history_pos = history.rbegin();
+ input_pos = 0;
+ }
+ toggle();
+ break;
+ case SDLK_UP:
+ upit = history_pos;
+ ++upit;
+ if (upit != history.rend()) {
+ history_pos = upit;
+ input_pos = (*history_pos).size();
+ }
+ break;
+ case SDLK_DOWN:
+ if (history_pos != history.rbegin()) {
+ --history_pos;
+ input_pos = (*history_pos).size();
+ }
+ break;
+ case SDLK_HOME:
+ input_pos = 0;
+ break;
+ case SDLK_END:
+ input_pos = (*history_pos).size();
+ break;
+ case SDLK_LEFT:
+ if (input_pos > 0)
+ input_pos--;
+ break;
+ case SDLK_RIGHT:
+ if (input_pos < (*history_pos).size())
+ input_pos++;
+ break;
+ case SDLK_BACKSPACE:
+ if ((*history_pos).size() && input_pos) {
+ (*history_pos).erase(input_pos-1, 1);
+ input_pos--;
+ }
+ break;
+ default:
+ if ((key >= 32 ) && (key <175)) {
+ if (input_pos == (*history_pos).size())
+ (*history_pos) += (char)key;
+ else
+ (*history_pos).insert(input_pos, 1, (char)key);
+ input_pos++;
+ }
+ break;
+ }
+}
+
+}
+
+}