summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoursoir <chat@joursoir.net>2020-12-10 16:02:46 +0000
committerJoursoir <chat@joursoir.net>2020-12-10 16:02:46 +0000
commit05750c44046f320109055aa5954ef0bbd977705f (patch)
treea39094e5eead788c48c9b4df0db379f4f45be26c
parent4131de177e36b19b20b8bbdb7bd43b18b6e22690 (diff)
downloadwant-chat-05750c44046f320109055aa5954ef0bbd977705f.tar.gz
want-chat-05750c44046f320109055aa5954ef0bbd977705f.tar.bz2
want-chat-05750c44046f320109055aa5954ef0bbd977705f.zip
refactor clui: delete class ChatRoom, create own class for chat, players, tips (new), input
-rw-r--r--src/client/clui/Client.cpp44
-rw-r--r--src/client/clui/Client.hpp42
-rw-r--r--src/client/clui/Makefile4
-rw-r--r--src/client/clui/WindowInterface.cpp33
-rw-r--r--src/client/clui/WindowInterface.hpp22
-rw-r--r--src/client/clui/clui.cpp121
-rw-r--r--src/client/clui/clui.hpp69
-rw-r--r--src/client/clui/main.cpp5
8 files changed, 180 insertions, 160 deletions
diff --git a/src/client/clui/Client.cpp b/src/client/clui/Client.cpp
index 36859ce..9859794 100644
--- a/src/client/clui/Client.cpp
+++ b/src/client/clui/Client.cpp
@@ -3,22 +3,52 @@
#include "Client.hpp"
#include "clui.hpp"
+#define CHAT_HEIGHT 20
+#define CHAT_WIDTH 59
+#define PLAYERS_WIDTH 20
+#define PLAYERS_HEIGHT 12
+#define TIPS_WIDTH 20
+#define TIPS_HEIGHT 8
+#define INPUT_HEIGHT 4
+#define INPUT_WIDTH 80
+
const int key_enter = 10;
const int key_escape = 27;
const int key_backspace = 127;
+Client::Client(const char* ip, int port)
+ : ClientBase(ip, port), in_buf_used(0), exit_flag(false)
+{
+ chat = new WindowChat(CHAT_HEIGHT, CHAT_WIDTH, 0, 0, 0);
+ players = new WindowPlayers(PLAYERS_HEIGHT, PLAYERS_WIDTH, 0, 60, 0);
+ tips = new WindowTips(TIPS_HEIGHT, TIPS_WIDTH, PLAYERS_HEIGHT, 60, 0);
+ input = new WindowInput(INPUT_HEIGHT, INPUT_WIDTH, 20, 0, 0);
+}
+
+Client::~Client()
+{
+ if(chat)
+ delete chat;
+ if(players)
+ delete players;
+ if(tips)
+ delete tips;
+ if(input)
+ delete input;
+}
+
void Client::HandleActions()
{
- int key = room->InputGetch();
+ int key = input->GetChar();
switch(key)
{
case key_escape: {
- this->BreakLoop();
+ BreakLoop();
break;
}
case ' '...'~': { // ascii table 32...126
AddCharToBuffer(key);
- room->AddCharToSendMsg(key);
+ input->AddCharToSendMsg(key);
break;
}
case '\n': { // send message
@@ -28,13 +58,13 @@ void Client::HandleActions()
memset(in_buffer, 0, (in_buf_used+1)*sizeof(char));
in_buf_used = 0;
- room->InputClear();
- room->SetInputCursor(1, 1);
+ input->Clear(false);
+ input->SetPosCursor(1, 1);
break;
}
case key_backspace: {
RemoveCharFromBuffer();
- room->RemoveCharFromMsg();
+ input->RemoveCharFromMsg();
break;
}
default: break;
@@ -43,7 +73,7 @@ void Client::HandleActions()
void Client::AddMessage(const char *msg, int type)
{
- room->AddMessage(msg, type);
+ chat->AddMessage(msg, type);
}
void Client::AddCharToBuffer(char ch)
diff --git a/src/client/clui/Client.hpp b/src/client/clui/Client.hpp
index 37bc3e0..5dbcfd6 100644
--- a/src/client/clui/Client.hpp
+++ b/src/client/clui/Client.hpp
@@ -4,7 +4,10 @@
#include "../../const_vars.hpp"
#include "../ClientBase.hpp"
-class ChatRoom;
+class WindowChat;
+class WindowPlayers;
+class WindowTips;
+class WindowInput;
class Client : public ClientBase {
char in_buffer[max_usermsg_len]; // for input
@@ -12,12 +15,13 @@ class Client : public ClientBase {
bool exit_flag;
- ChatRoom *room;
+ WindowChat *chat;
+ WindowPlayers *players;
+ WindowTips *tips;
+ WindowInput *input;
public:
- Client(const char* ip, int port, ChatRoom *i_room)
- : ClientBase(ip, port), in_buf_used(0),
- exit_flag(false), room(i_room) {}
- ~Client() {}
+ Client(const char* ip, int port);
+ ~Client();
virtual void HandleActions();
virtual void AddMessage(const char *msg, int type);
@@ -26,30 +30,4 @@ private:
void RemoveCharFromBuffer();
};
-
-/*class Client {
- int fd;
- char in_buffer[max_usermsg_len]; // for input
- int in_buf_used;
-
- char out_buffer[max_msg_len]; // for message
- int out_buf_used;
-
- bool exit_flag;
-
- Client(int i_fd) : fd(i_fd), in_buf_used(0),
- out_buf_used(0), exit_flag(false) {}
-public:
- ~Client() { close(fd); }
-
- static Client *Start(const char* ip, int port);
- void Run(ChatRoom *room);
- void BreakLoop() { exit_flag = true; }
- void HandleButton(ChatRoom *room);
-
- void AddCharToBuffer(char ch);
- void RemoveCharFromBuffer();
- void SendMessage();
-};*/
-
#endif \ No newline at end of file
diff --git a/src/client/clui/Makefile b/src/client/clui/Makefile
index b77c8f6..3b0c825 100644
--- a/src/client/clui/Makefile
+++ b/src/client/clui/Makefile
@@ -1,7 +1,7 @@
CPP = g++
CPPFLAGS = -Wall -g -lncurses
-SOURCES = main.cpp clui.cpp Client.cpp ../ClientBase.cpp
-OBJECTS = main.o clui.o Client.o ClientBase.o
+SOURCES = main.cpp clui.cpp Client.cpp ../ClientBase.cpp WindowInterface.cpp
+OBJECTS = main.o clui.o Client.o ClientBase.o WindowInterface.o
EXECUTABLE = client
.PHONY: all clean
diff --git a/src/client/clui/WindowInterface.cpp b/src/client/clui/WindowInterface.cpp
new file mode 100644
index 0000000..336d3b1
--- /dev/null
+++ b/src/client/clui/WindowInterface.cpp
@@ -0,0 +1,33 @@
+#include "WindowInterface.hpp"
+
+WindowInterface::WindowInterface(int num_y, int num_x, int by,
+ int bx, char ch)
+ : ny(num_y), nx(num_x), beg_y(by), beg_x(bx), ch_line(ch)
+{
+ w = newwin(ny, nx, beg_y, beg_x);
+ box(w, ch_line, ch_line);
+ Update();
+}
+WindowInterface::~WindowInterface()
+{
+ Clear(true);
+ Update();
+ delwin(w);
+}
+
+void WindowInterface::SetCursor(int y, int x)
+{
+ wmove(w, y, x);
+}
+
+void WindowInterface::Clear(bool full)
+{
+ werase(this->GetWindow());
+ if(!full)
+ box(this->GetWindow(), ch_line, ch_line);
+}
+
+void WindowInterface::Update()
+{
+ wrefresh(w);
+} \ No newline at end of file
diff --git a/src/client/clui/WindowInterface.hpp b/src/client/clui/WindowInterface.hpp
new file mode 100644
index 0000000..9151637
--- /dev/null
+++ b/src/client/clui/WindowInterface.hpp
@@ -0,0 +1,22 @@
+#ifndef WC_WINDOW_INTERFACE_H
+#define WC_WINDOW_INTERFACE_H
+
+#include <ncurses.h>
+
+class WindowInterface {
+protected:
+ WINDOW *w;
+ int ny, nx;
+ int beg_y, beg_x;
+ int ch_line;
+public:
+ WindowInterface(int num_y, int num_x, int by, int bx, char ch);
+ ~WindowInterface();
+
+ WINDOW *GetWindow() { return w; }
+ void SetCursor(int y, int x);
+ void Clear(bool full);
+ void Update();
+};
+
+#endif \ No newline at end of file
diff --git a/src/client/clui/clui.cpp b/src/client/clui/clui.cpp
index a7f908e..0010ff7 100644
--- a/src/client/clui/clui.cpp
+++ b/src/client/clui/clui.cpp
@@ -1,60 +1,11 @@
#include <string.h>
#include <unistd.h>
+#include <ncurses.h>
#include "clui.hpp"
-#define CHAT_HEIGHT 20
-#define CHAT_WIDTH 59
-#define PLAYERS_WIDTH 20
-#define PLAYERS_HEIGHT 20
-#define INPUT_HEIGHT 4
-#define INPUT_WIDTH 80
-
-Interface_wc::Interface_wc(int num_y, int num_x, int by,
- int bx, char ch) : ny(num_y), nx(num_x), beg_y(by),
- beg_x(bx), ch_line(ch)
-{
- w = newwin(ny, nx, beg_y, beg_x);
- box(w, ch_line, ch_line);
- this->Update();
-}
-
-void Interface_wc::Hide()
-{
- this->Clear(true);
- this->Update();
- this->Delete();
-}
-
-void Interface_wc::Clear(bool full)
-{
- werase(this->GetWindow());
- if(!full)
- box(this->GetWindow(), ch_line, ch_line);
-}
-
-////////////////////////////////////////////////////////////////////////
-
-ChatRoom::ChatRoom() : first(0)
-{
- chat = new Interface_wc(CHAT_HEIGHT, CHAT_WIDTH, 0, 0, 0);
- players = new Interface_wc(PLAYERS_HEIGHT, PLAYERS_WIDTH, 0, 60, 0);
- input = new Interface_wc(INPUT_HEIGHT, INPUT_WIDTH, 20, 0, 0);
- nodelay(input->GetWindow(), true);
- keypad(input->GetWindow(), true);
- i_nx = 1;
- i_ny = 1;
-}
-
-ChatRoom::~ChatRoom()
+WindowChat::~WindowChat()
{
- if(chat)
- delete chat;
- if(players)
- delete players;
- if(input)
- delete input;
-
while(first) {
message *tmp = first;
first = first->prev;
@@ -62,14 +13,14 @@ ChatRoom::~ChatRoom()
}
}
-void ChatRoom::AddMessage(const char *msg, int type)
+void WindowChat::AddMessage(const char *msg, int type)
{
message *recent_msg = new message;
int len = strlen(msg);
int lines = (len / oneline_len) + 1;
- strcpy(recent_msg->msg, msg);
+ strcpy(recent_msg->text, msg);
recent_msg->num_lines = lines;
recent_msg->type = type;
@@ -79,12 +30,12 @@ void ChatRoom::AddMessage(const char *msg, int type)
ChatRedraw();
}
-void ChatRoom::ChatRedraw()
+void WindowChat::ChatRedraw()
{
if(!first)
return;
- chat->Clear(false);
+ Clear(false);
int available_lines = lines_in_chat;
bool remove = false;
message *tmp;
@@ -112,39 +63,55 @@ void ChatRoom::ChatRedraw()
}
}
- SetInputCursor(i_ny, i_nx);
- chat->Update();
+ //SetInputCursor(i_ny, i_nx);
+ Update();
}
-void ChatRoom::PrintMessage(int line, message *m)
+void WindowChat::PrintMessage(int line, message *m)
{
- WINDOW *win = this->chat->GetWindow();
int need_print = m->num_lines;
-
while(need_print != 0) {
- if(m->type == system_msg) wattron(win, A_ITALIC);
- else wattron(win, A_BOLD);
- wmove(win, line-need_print+1, 1);
+ if(m->type == system_msg) wattron(w, A_ITALIC);
+ else wattron(w, A_BOLD);
+ wmove(w, line-need_print+1, 1);
char *tmp = new char[oneline_len];
int str = oneline_len * (m->num_lines - need_print);
- memcpy(tmp, m->msg + str, oneline_len);
+ memcpy(tmp, m->text + str, oneline_len);
- wprintw(win, tmp);
- if(m->type == system_msg) wattroff(win, A_ITALIC);
- else wattroff(win, A_BOLD);
+ wprintw(w, tmp);
+ if(m->type == system_msg) wattroff(w, A_ITALIC);
+ else wattroff(w, A_BOLD);
delete[] tmp;
need_print--;
}
}
-bool ChatRoom::AddCharToSendMsg(char ch)
+////////////////////////////////////////////////////////////////////////
+
+
+
+////////////////////////////////////////////////////////////////////////
+
+WindowInput::WindowInput(int num_y, int num_x, int by, int bx, char ch)
+ : WindowInterface(num_y, num_x, by, bx, ch), i_ny(1), i_nx(1)
+{
+ nodelay(w, true);
+ keypad(w, true);
+}
+
+int WindowInput::GetChar()
+{
+ return wgetch(w);
+}
+
+bool WindowInput::AddCharToSendMsg(char ch)
{
if(i_ny == 2 && i_nx == max_usermsg_len/2-1)
return 0;
- mvwaddch(input->GetWindow(), i_ny, i_nx, ch);
+ mvwaddch(w, i_ny, i_nx, ch);
i_nx++;
if(i_nx >= max_usermsg_len/2-1) {
if(i_ny == 1) {
@@ -153,14 +120,14 @@ bool ChatRoom::AddCharToSendMsg(char ch)
}
else if(i_ny == 2)
i_nx--;
- wmove(input->GetWindow(), i_ny, i_nx);
+ wmove(w, i_ny, i_nx);
}
- input->Update();
+ Update();
return 1;
}
-bool ChatRoom::RemoveCharFromMsg()
+bool WindowInput::RemoveCharFromMsg()
{
if(i_ny == 1 && i_nx == 1)
return 0;
@@ -170,16 +137,16 @@ bool ChatRoom::RemoveCharFromMsg()
i_ny--;
i_nx = max_usermsg_len/2-1;
}
- mvwaddch(input->GetWindow(), i_ny, i_nx, ' ');
- wmove(input->GetWindow(), i_ny, i_nx);
+ mvwaddch(w, i_ny, i_nx, ' ');
+ wmove(w, i_ny, i_nx);
- input->Update();
+ Update();
return 1;
}
-void ChatRoom::SetInputCursor(int y, int x)
+void WindowInput::SetPosCursor(int y, int x)
{
- input->SetCursor(y, x);
+ SetCursor(y, x);
i_ny = y;
i_nx = x;
} \ No newline at end of file
diff --git a/src/client/clui/clui.hpp b/src/client/clui/clui.hpp
index e337aa9..87445db 100644
--- a/src/client/clui/clui.hpp
+++ b/src/client/clui/clui.hpp
@@ -3,59 +3,52 @@
#ifndef WC_CLUI_H
#define WC_CLUI_H
-#include <ncurses.h>
+#include "WindowInterface.hpp"
#include "../../const_vars.hpp"
-class Interface_wc {
- WINDOW *w;
- int ny, nx;
- int beg_y, beg_x;
- int ch_line;
-public:
- Interface_wc(int num_y, int num_x, int by, int bx, char ch);
-
- WINDOW *GetWindow() { return w; }
- void SetCursor(int y, int x) { wmove(w, y, x); }
- void Clear(bool full);
- void Update() { wrefresh(w); }
- void Delete() { delwin(w); }
-
- void Hide();
-};
-
-class ChatRoom {
- Interface_wc *chat;
- Interface_wc *players;
- Interface_wc *input;
- int i_nx, i_ny;
-
+class WindowChat : public WindowInterface {
struct message {
- char msg[max_msg_len];
+ char text[max_msg_len];
int num_lines; // number of lines
int type;
message *prev;
};
message *first;
public:
- ChatRoom();
- ~ChatRoom();
+ WindowChat(int num_y, int num_x, int by, int bx, char ch)
+ : WindowInterface(num_y, num_x, by, bx, ch), first(0) {}
+ ~WindowChat();
- // for chat:
void AddMessage(const char *msg, int type);
+private:
+ void ChatRedraw();
+ void PrintMessage(int line, message *m);
+};
- // for players:
- //void AddPlayer()
+class WindowPlayers : public WindowInterface {
+public:
+ WindowPlayers(int num_y, int num_x, int by, int bx, char ch)
+ : WindowInterface(num_y, num_x, by, bx, ch) {}
+ ~WindowPlayers() {}
+};
+
+class WindowTips : public WindowInterface {
+public:
+ WindowTips(int num_y, int num_x, int by, int bx, char ch)
+ : WindowInterface(num_y, num_x, by, bx, ch) {}
+ ~WindowTips() {}
+};
- // for input:
- int InputGetch() { return wgetch(input->GetWindow()); }
+class WindowInput : public WindowInterface {
+ int i_ny, i_nx;
+public:
+ WindowInput(int num_y, int num_x, int by, int bx, char ch);
+ ~WindowInput() {}
+
+ int GetChar();
bool AddCharToSendMsg(char ch);
bool RemoveCharFromMsg();
- void InputClear() { input->Clear(false); }
- void SetInputCursor(int y, int x);
-private:
- // for chat:
- void ChatRedraw();
- void PrintMessage(int line, message *m);
+ void SetPosCursor(int y, int x);
};
#endif \ No newline at end of file
diff --git a/src/client/clui/main.cpp b/src/client/clui/main.cpp
index fd77708..876e6f9 100644
--- a/src/client/clui/main.cpp
+++ b/src/client/clui/main.cpp
@@ -5,7 +5,6 @@
#include "../../config.hpp"
#include "Client.hpp"
-#include "clui.hpp"
int main(int argc, char *argv[])
{
@@ -20,8 +19,7 @@ int main(int argc, char *argv[])
return 1;
}
- ChatRoom *room = new ChatRoom();
- Client *user = new Client(SERVER_IP, SERVER_PORT, room);
+ Client *user = new Client(SERVER_IP, SERVER_PORT);
if(user->ConstuctorError()) {
endwin();
perror("server");
@@ -29,7 +27,6 @@ int main(int argc, char *argv[])
}
while(user->Run());
- delete room;
delete user;
endwin();