diff options
Diffstat (limited to 'src/ChatWindow.cpp')
-rw-r--r-- | src/ChatWindow.cpp | 89 |
1 files changed, 80 insertions, 9 deletions
diff --git a/src/ChatWindow.cpp b/src/ChatWindow.cpp index bebc644..b0bb696 100644 --- a/src/ChatWindow.cpp +++ b/src/ChatWindow.cpp @@ -5,8 +5,12 @@ namespace dchat { + // Merge all messages that are written by the same user without interrupt within a timeframe + const int MERGE_MESSAGE_TIMESTAMP_DIFF_SEC = 60; + ChatWindow::ChatWindow() : - channelCount(0) + channelCount(0), + lastMessage(nullptr) { setupTopBar(); @@ -66,15 +70,14 @@ namespace dchat leftPanelChannels.attach(*channelsTitle, 0, 0, 1, 1); //// - Gtk::Grid *leftPanelUsers = Gtk::manage(new Gtk::Grid()); - leftPanelUsers->set_vexpand(true); - leftPanel->add2(*leftPanelUsers); + leftPanelUsers.set_vexpand(true); + leftPanel->add2(leftPanelUsers); Gtk::Label *usersTitle = Gtk::manage(new Gtk::Label()); usersTitle->set_name("users-title"); usersTitle->set_text("Users"); usersTitle->set_halign(Gtk::ALIGN_START); - leftPanelUsers->attach(*usersTitle, 0, 0, 1, 1); + leftPanelUsers.attach(*usersTitle, 0, 0, 1, 1); } void ChatWindow::setupMessageArea(Gtk::Grid *rightPanel) @@ -102,8 +105,9 @@ namespace dchat void ChatWindow::addChannel(const odhtdb::Hash &nodeHash) { assert(channelDataById.find(nodeHash) == channelDataById.end()); - printf("Added channel\n"); - Gtk::Button *channelButton = Gtk::manage(new Gtk::Button("Channel name")); + fprintf(stderr, "Added channel %s\n", nodeHash.toString().c_str()); + Gtk::ToggleButton *channelButton = Gtk::manage(new Gtk::ToggleButton("Channel name")); + channelButton->set_active(true); channelButton->get_style_context()->add_class("channel-button"); channelButton->set_hexpand(true); channelButton->get_child()->set_halign(Gtk::ALIGN_START); @@ -113,15 +117,82 @@ namespace dchat channelDataById[nodeHash] = { channelButton, 0 }; } - void ChatWindow::addLocalMessage(const odhtdb::Hash &channelId, Glib::ustring msg) + void ChatWindow::addLocalMessage(const odhtdb::Hash &channelId, const odhtdb::Signature::PublicKey &userPublicKey, uint32_t timestampSeconds, Glib::ustring msg) { auto it = channelDataById.find(channelId); assert(it != channelDataById.end()); - ChatMessage *message = Gtk::manage(new ChatMessage("Arezu", msg)); + User *user = getUserByPublicKey(userPublicKey); + if(!user) + { + fprintf(stderr, "Unable to add message to channel because the user %s doesn't exist in it\n", userPublicKey.toString().c_str()); + return; + } + + if(lastMessage && lastMessage->user->publicKey == userPublicKey) + { + int64_t msgTimeDiff = (int64_t)timestampSeconds - (int64_t)lastMessage->timestampSeconds; + if(msgTimeDiff <= MERGE_MESSAGE_TIMESTAMP_DIFF_SEC) + { + lastMessage->text.set_text(lastMessage->text.get_text() + "\n" + msg); + return; + } + } + + ChatMessage *message = Gtk::manage(new ChatMessage(user->name, msg, timestampSeconds, user)); + lastMessage = message; message->set_valign(Gtk::Align::ALIGN_START); message->set_hexpand(true); message->show_all(); chatAreaLayout.attach(*message, 0, it->second.messageCount, 1, 1); ++it->second.messageCount; } + + void ChatWindow::addUser(const odhtdb::Signature::PublicKey &userPublicKey) + { + User *existingUser = getUserByPublicKey(userPublicKey); + if(existingUser) + { + fprintf(stderr, "ChatWindow::addUser: user %s was not added because the user has already been added\n", userPublicKey.toString().c_str()); + return; + } + + Gtk::Label *username = Gtk::manage(new Gtk::Label("NoName")); + username->set_halign(Gtk::ALIGN_START); + username->show(); + username->get_style_context()->add_class("username-list-username"); + leftPanelUsers.attach(*username, 0, 1 + users.size(), 1, 1); + users.push_back(new User { userPublicKey, "NoName" }); + fprintf(stderr, "Added user %s\n", userPublicKey.toString().c_str()); + } + + void ChatWindow::setUserNickname(const odhtdb::Signature::PublicKey &userPublicKey, const Glib::ustring &name) + { + for(size_t i = 0; i < users.size(); ++i) + { + User *user = users[i]; + if(user->publicKey == userPublicKey) + { + user->name = name; + Gtk::Widget *usernameLabel = leftPanelUsers.get_child_at(0, 1 + i); + assert(usernameLabel); + //assert(usernameLabel->get_type() == Gtk::Label::get_type()); + static_cast<Gtk::Label*>(usernameLabel)->set_text(name); + fprintf(stderr, "Set nickname for user %s to %s\n", userPublicKey.toString().c_str(), name.c_str()); + return; + } + } + fprintf(stderr, "ChatWindow::setUserNickname: user %s doesn't exist\n", userPublicKey.toString().c_str()); + } + + User* ChatWindow::getUserByPublicKey(const odhtdb::Signature::PublicKey &publicKey) const + { + for(User *user : users) + { + if(user->publicKey == publicKey) + { + return user; + } + } + return nullptr; + } }
\ No newline at end of file |