aboutsummaryrefslogtreecommitdiff
path: root/src/MessageBoard.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2018-05-08 18:06:43 +0200
committerdec05eba <dec05eba@protonmail.com>2018-05-08 18:06:51 +0200
commit15c4434de0c2cd12e09c2f41e898c0b124194a97 (patch)
tree0bf01cd49a22b7aa79304ed0e9d34ac265d8393c /src/MessageBoard.cpp
parent4f6c843523f45708d8bbed25b3677f69c4208a38 (diff)
Add context menu, add context menu to delete message
Diffstat (limited to 'src/MessageBoard.cpp')
-rw-r--r--src/MessageBoard.cpp98
1 files changed, 50 insertions, 48 deletions
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 <SFML/Graphics/CircleShape.hpp>
#include <SFML/Graphics/RectangleShape.hpp>
#include <SFML/Graphics/Sprite.hpp>
@@ -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<mutex> 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<mutex> 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<mutex> 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<mutex> 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);
}
}