From 15c4434de0c2cd12e09c2f41e898c0b124194a97 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Tue, 8 May 2018 18:06:43 +0200 Subject: Add context menu, add context menu to delete message --- src/MessageBoard.cpp | 98 +++++++++++++++++++++++++++------------------------- 1 file changed, 50 insertions(+), 48 deletions(-) (limited to 'src/MessageBoard.cpp') diff --git a/src/MessageBoard.cpp b/src/MessageBoard.cpp index 49d84e8..bdaccf3 100644 --- a/src/MessageBoard.cpp +++ b/src/MessageBoard.cpp @@ -8,6 +8,8 @@ #include "../include/Chatbar.hpp" #include "../include/ColorScheme.hpp" #include "../include/Theme.hpp" +#include "../include/GlobalContextMenu.hpp" +#include "../include/Channel.hpp" #include #include #include @@ -39,15 +41,14 @@ namespace dchat // Merge messages from same user that are sent within one minute const int MERGE_TEXT_TIMESTAMP_DIFF_SEC = 60; - MessageBoard::MessageBoard(const sf::Vector2u &size) : - selectingText(false), - leftMouseButtonPressed(false), + MessageBoard::MessageBoard(Channel *_channel) : + channel(_channel), scroll(0.0), scrollSpeed(0.0), totalHeight(0.0), scrollToBottom(false) { - updateStaticContentTexture(size); + } MessageBoard::~MessageBoard() @@ -65,13 +66,35 @@ namespace dchat dirty = true; } - void MessageBoard::addMessage(Message *message) + void MessageBoard::addMessage(Message *message, const odhtdb::Hash &id) { + lock_guard lock(messageProcessMutex); messages.push_back(message); + if(!id.isEmpty()) + messageIdMap[id] = message; dirty = true; scrollToBottom = true; } + void MessageBoard::deleteMessage(const odhtdb::Hash &id) + { + lock_guard lock(messageProcessMutex); + auto it = messageIdMap.find(id); + if(it == messageIdMap.end()) return; + + for(usize i = 0; i < messages.size(); ++i) + { + Message *message = messages[i]; + if(message == it->second) + { + delete message; + messages.erase(messages.begin() + i); + messageIdMap.erase(it); + break; + } + } + } + void MessageBoard::drawDefault(sf::RenderWindow &window, Cache &cache) { const float LINE_SPACING = 5.0f * Settings::getScaling(); @@ -253,32 +276,32 @@ namespace dchat void MessageBoard::processEvent(const sf::Event &event) { - if(event.type == sf::Event::MouseButtonPressed) + lock_guard lock(messageProcessMutex); + for(Message *message : messages) { - if(event.mouseButton.button == sf::Mouse::Button::Left) - { - leftMouseButtonPressed = true; - mousePos.x = event.mouseButton.x; - mousePos.y = event.mouseButton.y; - } + message->text.processEvent(event); } - else if(event.type == sf::Event::MouseButtonReleased) + + if(event.type == sf::Event::MouseButtonPressed && event.mouseButton.button == sf::Mouse::Button::Right) { - if(event.mouseButton.button == sf::Mouse::Button::Left) + for(auto it : messageIdMap) { - leftMouseButtonPressed = false; - mousePos.x = event.mouseButton.x; - mousePos.y = event.mouseButton.y; + it.second->text.processEvent(event); + auto textPos = it.second->text.getPosition(); + if(event.mouseButton.x >= textPos.x && event.mouseButton.x <= textPos.x + it.second->text.getMaxWidth() && event.mouseButton.y >= textPos.y && event.mouseButton.y <= textPos.y + it.second->text.getHeight()) + { + auto contextMenu = GlobalContextMenu::getEditMessageContextMenu(); + contextMenu->setPosition(sf::Vector2f(event.mouseButton.x, event.mouseButton.y)); + contextMenu->setVisible(true); + GlobalContextMenu::setClickDeleteMessageCallbackFunc([this, it](ContextMenuItem *menuItem) + { + channel->deleteMessage(it.first); + GlobalContextMenu::setClickDeleteMessageCallbackFunc(nullptr); + }); + return; + } } - } - else if(event.type == sf::Event::LostFocus) - { - leftMouseButtonPressed = false; - } - else if(event.type == sf::Event::MouseMoved) - { - mousePos.x = event.mouseMove.x; - mousePos.y = event.mouseMove.y; + GlobalContextMenu::setClickDeleteMessageCallbackFunc(nullptr); } else if(event.type == sf::Event::MouseWheelScrolled && event.mouseWheelScroll.wheel == sf::Mouse::Wheel::VerticalWheel) { @@ -288,22 +311,6 @@ namespace dchat else if(scrollSpeed < -SCROLL_MAX_SPEED) scrollSpeed = -SCROLL_MAX_SPEED; } - - if(selectingText && !leftMouseButtonPressed) - { - selectingText = false; - } - else if(!selectingText && leftMouseButtonPressed) - { - selectingText = true; - selectingTextStart.x = mousePos.x; - selectingTextStart.y = mousePos.y; - } - - for(Message *message : messages) - { - message->text.processEvent(event); - } } void MessageBoard::draw(sf::RenderWindow &window, Cache &cache) @@ -331,6 +338,7 @@ namespace dchat if(dirty) { + lock_guard lock(messageProcessMutex); switch(Theme::getType()) { case Theme::Type::DEFAULT: @@ -385,11 +393,5 @@ namespace dchat //sf::Sprite textureSprite(staticContentTexture.getTexture()); //textureSprite.setPosition(backgroundPos); //window.draw(textureSprite); - - if(!selectingText) return; - - sf::Vector2f selectionRectStart(min((float)mousePos.x, selectingTextStart.x), min((float)mousePos.y, selectingTextStart.y)); - sf::Vector2f selectionRectEnd(max((float)mousePos.x, selectingTextStart.x), max((float)mousePos.y, selectingTextStart.y)); - sf::FloatRect selectionRect(selectionRectStart, selectionRectEnd - selectionRectStart); } } -- cgit v1.2.3