aboutsummaryrefslogtreecommitdiff
path: root/src/MessageBoard.cpp
diff options
context:
space:
mode:
authordec05eba <dec05eba@protonmail.com>2018-05-03 07:35:39 +0200
committerdec05eba <dec05eba@protonmail.com>2018-05-03 07:35:42 +0200
commit9cde35c64c9f569055b101a80419d900f58806a9 (patch)
treecc94d0b5e7dab9c95e702905e4d5fc42f0253103 /src/MessageBoard.cpp
parent09080c571dbc959ab073aa6aa6598e6e447b0435 (diff)
Adding theming, add new theme 'simple'
Diffstat (limited to 'src/MessageBoard.cpp')
-rw-r--r--src/MessageBoard.cpp196
1 files changed, 134 insertions, 62 deletions
diff --git a/src/MessageBoard.cpp b/src/MessageBoard.cpp
index 1c8c4ad..1e5790c 100644
--- a/src/MessageBoard.cpp
+++ b/src/MessageBoard.cpp
@@ -7,6 +7,7 @@
#include "../include/ChannelTopPanel.hpp"
#include "../include/Chatbar.hpp"
#include "../include/ColorScheme.hpp"
+#include "../include/Theme.hpp"
#include <SFML/Graphics/RectangleShape.hpp>
#include <SFML/Graphics/Sprite.hpp>
#include <SFML/Window/Mouse.hpp>
@@ -24,8 +25,6 @@ namespace dchat
};
const float USERNAME_PADDING_BOTTOM = 5.0f;
- const float MESSAGE_PADDING_TOP = 25.0f;
- const float MESSAGE_PADDING_BOTTOM = 30.0f;
const float PADDING_SIDE = 40.0f;
const float PADDING_TOP = 0.0f;
@@ -90,6 +89,128 @@ namespace dchat
scrollToBottom = true;
}
+ void MessageBoard::drawDefault(sf::RenderWindow &window, Cache &cache)
+ {
+ const float MESSAGE_PADDING_TOP = 25.0f;
+ const float MESSAGE_PADDING_BOTTOM = 30.0f;
+
+ const sf::Font *usernameFont = ResourceCache::getFont("fonts/Roboto-Regular.ttf");
+ const int usernameTextCharacterSize = 20 * Settings::getScaling();
+ const float usernameTextHeight = usernameFont->getLineSpacing(usernameTextCharacterSize);
+
+ const sf::Font *timestampFont = ResourceCache::getFont("fonts/Roboto-Regular.ttf");
+ const int timestampTextCharacterSize = 15 * Settings::getScaling();
+ const float timestampTextHeight = timestampFont->getLineSpacing(timestampTextCharacterSize);
+
+ sf::RectangleShape lineRect(sf::Vector2f(backgroundSizeWithoutPadding.x - LINE_SIDE_PADDING * Settings::getScaling() * 2.0f, LINE_HEIGHT));
+ lineRect.setFillColor(ColorScheme::getBackgroundColor() + sf::Color(10, 10, 10));
+
+ sf::Vector2<double> position(ChannelSidePanel::getWidth() + PADDING_SIDE * Settings::getScaling(), ChannelTopPanel::getHeight() + PADDING_TOP);
+ double startHeight = position.y;
+ position.y += scroll;
+ usize numMessages = messages.size();
+ for(usize i = 0; i < numMessages; ++i)
+ {
+ Message *message = messages[i];
+ position.y += (MESSAGE_PADDING_TOP * Settings::getScaling());
+ if(position.y + usernameTextHeight > 0.0f && position.y < backgroundPos.y + backgroundSize.y)
+ {
+ sf::Text usernameText(message->user->getName(), *usernameFont, usernameTextCharacterSize);
+ usernameText.setFillColor(sf::Color(15, 192, 252));
+ usernameText.setPosition(sf::Vector2f(floor(position.x), floor(position.y)));
+ window.draw(usernameText);
+
+ if(message->timestampSeconds)
+ {
+ time_t time = (time_t)message->timestampSeconds;
+ struct tm *localTimePtr = localtime(&time);
+ char date[30];
+ strftime(date, sizeof(date), "%Y-%m-%d at %T", localTimePtr);
+
+ sf::Text timestamp(date, *timestampFont, timestampTextCharacterSize);
+ timestamp.setFillColor(ColorScheme::getTextRegularColor() * sf::Color(255, 255, 255, 30));
+ timestamp.setPosition(sf::Vector2f(floor(position.x + usernameText.getLocalBounds().width + USERNAME_TIMESTAMP_SIDE_PADDING * Settings::getScaling()), floor(position.y + 2.0f * Settings::getScaling() + usernameTextHeight * 0.5f - timestampTextHeight * 0.5f)));
+ window.draw(timestamp);
+ }
+ }
+ position.y += usernameTextHeight + USERNAME_PADDING_BOTTOM * Settings::getScaling();
+
+ // No need to perform culling here, that is done in @Text draw function
+ message->text.setCharacterSize(18 * Settings::getScaling());
+ message->text.setMaxWidth(backgroundSize.x);
+ message->text.setPosition(sf::Vector2f(floor(position.x), floor(position.y)));
+ message->text.draw(window, cache);
+ position.y += (message->text.getHeight() + MESSAGE_PADDING_BOTTOM * Settings::getScaling());
+
+ if(position.y + LINE_HEIGHT > 0.0f && position.y < backgroundPos.y + backgroundSize.y && i + 1 != numMessages)
+ {
+ lineRect.setPosition(sf::Vector2f(position.x + LINE_SIDE_PADDING * Settings::getScaling() - PADDING_SIDE * Settings::getScaling(), floor(position.y)));
+ window.draw(lineRect);
+ //drawGradientLine(sf::Vector2f(position.x + LINE_SIDE_PADDING, floor(position.y)), sf::Vector2f(backgroundSizeWithoutPadding.x - LINE_SIDE_PADDING * 2.0f, LINE_HEIGHT), LINE_COLOR, window);
+ }
+
+ position.y += LINE_HEIGHT;
+ }
+ totalHeight = (position.y - scroll) - startHeight;
+ }
+
+ void MessageBoard::drawSimple(sf::RenderWindow &window, Cache &cache)
+ {
+ const float LINE_SPACING = 20.0f * Settings::getScaling();
+ const float MESSAGE_PADDING_TOP = 0.0f;
+ const float MESSAGE_PADDING_BOTTOM = 0.0f;
+
+ const sf::Font *usernameFont = ResourceCache::getFont("fonts/Roboto-Regular.ttf");
+ const int usernameTextCharacterSize = 20 * Settings::getScaling();
+ const float usernameTextHeight = usernameFont->getLineSpacing(usernameTextCharacterSize);
+ const float usernameMaxWidth = usernameTextHeight * 5.0f;
+
+ const sf::Font *timestampFont = ResourceCache::getFont("fonts/Roboto-Regular.ttf");
+ const int timestampTextCharacterSize = 15 * Settings::getScaling();
+ const float timestampTextHeight = timestampFont->getLineSpacing(timestampTextCharacterSize);
+
+ sf::Vector2<double> position(ChannelSidePanel::getWidth() + PADDING_SIDE * Settings::getScaling() + usernameMaxWidth, ChannelTopPanel::getHeight() + PADDING_TOP);
+ double startHeight = position.y;
+ position.y += scroll;
+ usize numMessages = messages.size();
+ for(usize i = 0; i < numMessages; ++i)
+ {
+ Message *message = messages[i];
+ position.y += (MESSAGE_PADDING_TOP * Settings::getScaling());
+ if(position.y + usernameTextHeight > 0.0f && position.y < backgroundPos.y + backgroundSize.y)
+ {
+ string usernameTextStr = message->user->getName();
+ usernameTextStr += " - ";
+ sf::Text usernameText(usernameTextStr, *usernameFont, usernameTextCharacterSize);
+ usernameText.setFillColor(sf::Color(15, 192, 252));
+ usernameText.setPosition(sf::Vector2f(floor(position.x - usernameText.getLocalBounds().width), floor(position.y)));
+ window.draw(usernameText);
+
+ if(message->timestampSeconds)
+ {
+ time_t time = (time_t)message->timestampSeconds;
+ struct tm *localTimePtr = localtime(&time);
+ char date[30];
+ strftime(date, sizeof(date), "%Y-%m-%d at %T", localTimePtr);
+
+ //sf::Text timestamp(date, *timestampFont, timestampTextCharacterSize);
+ //timestamp.setFillColor(ColorScheme::getTextRegularColor() * sf::Color(255, 255, 255, 30));
+ //timestamp.setPosition(sf::Vector2f(floor(position.x - usernameText.getLocalBounds().width + usernameText.getLocalBounds().width + USERNAME_TIMESTAMP_SIDE_PADDING * Settings::getScaling()), floor(position.y + 2.0f * Settings::getScaling() + usernameTextHeight * 0.5f - timestampTextHeight * 0.5f)));
+ //window.draw(timestamp);
+ }
+ }
+
+ // No need to perform culling here, that is done in @Text draw function
+ message->text.setCharacterSize(18 * Settings::getScaling());
+ message->text.setMaxWidth(backgroundSize.x - usernameMaxWidth * 2.0f);
+ message->text.setPosition(sf::Vector2f(floor(position.x), floor(position.y)));
+ message->text.setLineSpacing(LINE_SPACING);
+ message->text.draw(window, cache);
+ position.y += (message->text.getHeight() + MESSAGE_PADDING_BOTTOM * Settings::getScaling());
+ }
+ totalHeight = (position.y - scroll) - startHeight;
+ }
+
void MessageBoard::processEvent(const sf::Event &event)
{
if(event.type == sf::Event::MouseButtonPressed)
@@ -143,9 +264,9 @@ namespace dchat
void MessageBoard::draw(sf::RenderWindow &window, Cache &cache)
{
auto windowSize = window.getSize();
- sf::Vector2f backgroundSizeWithoutPadding(floor(windowSize.x - ChannelSidePanel::getWidth() - UsersSidePanel::getWidth()), floor(windowSize.y - ChannelTopPanel::getHeight() - Chatbar::getHeight()));
- sf::Vector2u backgroundSize(floor(windowSize.x - ChannelSidePanel::getWidth() - UsersSidePanel::getWidth() - PADDING_SIDE * 2.0f), floor(windowSize.y - ChannelTopPanel::getHeight() - Chatbar::getHeight() - PADDING_TOP));
- sf::Vector2f backgroundPos(ChannelSidePanel::getWidth(), ChannelTopPanel::getHeight());
+ backgroundSizeWithoutPadding = sf::Vector2f(floor(windowSize.x - ChannelSidePanel::getWidth() - UsersSidePanel::getWidth()), floor(windowSize.y - ChannelTopPanel::getHeight() - Chatbar::getHeight()));
+ backgroundSize = sf::Vector2f(floor(windowSize.x - ChannelSidePanel::getWidth() - UsersSidePanel::getWidth() - PADDING_SIDE * Settings::getScaling() * 2.0f), floor(windowSize.y - ChannelTopPanel::getHeight() - Chatbar::getHeight() - PADDING_TOP));
+ backgroundPos = sf::Vector2f(ChannelSidePanel::getWidth(), ChannelTopPanel::getHeight());
//if(backgroundSize != staticContentTexture.getSize())
// updateStaticContentTexture(backgroundSize);
@@ -160,69 +281,20 @@ namespace dchat
backgroundRect.setPosition(ChannelSidePanel::getWidth(), ChannelTopPanel::getHeight());
window.draw(backgroundRect);
- const sf::Font *usernameFont = ResourceCache::getFont("fonts/Roboto-Regular.ttf");
- const int usernameTextCharacterSize = 20 * Settings::getScaling();
- const float usernameTextHeight = usernameFont->getLineSpacing(usernameTextCharacterSize);
-
- const sf::Font *timestampFont = ResourceCache::getFont("fonts/Roboto-Regular.ttf");
- const int timestampTextCharacterSize = 15 * Settings::getScaling();
- const float timestampTextHeight = timestampFont->getLineSpacing(timestampTextCharacterSize);
-
double deltaTimeMicro = (double)frameTimer.getElapsedTime().asMicroseconds();
frameTimer.restart();
if(dirty)
{
- sf::RectangleShape lineRect(sf::Vector2f(backgroundSizeWithoutPadding.x - LINE_SIDE_PADDING * 2.0f, LINE_HEIGHT));
- lineRect.setFillColor(ColorScheme::getBackgroundColor() + sf::Color(10, 10, 10));
-
- sf::Vector2<double> position(ChannelSidePanel::getWidth(), ChannelTopPanel::getHeight() + PADDING_TOP);
- double startHeight = position.y;
- position.y += scroll;
- usize numMessages = messages.size();
- for(usize i = 0; i < numMessages; ++i)
+ switch(Theme::getType())
{
- Message *message = messages[i];
- position.y += (MESSAGE_PADDING_TOP * Settings::getScaling());
- if(position.y + usernameTextHeight > 0.0f && position.y < backgroundPos.y + backgroundSize.y)
- {
- sf::Text usernameText(message->user->getName(), *usernameFont, usernameTextCharacterSize);
- usernameText.setFillColor(sf::Color(15, 192, 252));
- usernameText.setPosition(sf::Vector2f(floor(position.x + PADDING_SIDE), floor(position.y)));
- window.draw(usernameText);
-
- if(message->timestampSeconds)
- {
- time_t time = (time_t)message->timestampSeconds;
- struct tm *localTimePtr = localtime(&time);
- char date[30];
- strftime(date, sizeof(date), "%Y-%m-%d at %T", localTimePtr);
-
- sf::Text timestamp(date, *timestampFont, timestampTextCharacterSize);
- timestamp.setFillColor(ColorScheme::getTextRegularColor() * sf::Color(255, 255, 255, 30));
- timestamp.setPosition(sf::Vector2f(floor(position.x + PADDING_SIDE + usernameText.getLocalBounds().width + USERNAME_TIMESTAMP_SIDE_PADDING * Settings::getScaling()), floor(position.y + 2.0f * Settings::getScaling() + usernameTextHeight * 0.5f - timestampTextHeight * 0.5f)));
- window.draw(timestamp);
- }
- }
- position.y += usernameTextHeight + USERNAME_PADDING_BOTTOM * Settings::getScaling();
-
- // No need to perform culling here, that is done in @Text draw function
- message->text.setCharacterSize(18 * Settings::getScaling());
- message->text.setMaxWidth(backgroundSize.x);
- message->text.setPosition(sf::Vector2f(floor(position.x + PADDING_SIDE), floor(position.y)));
- message->text.draw(window, cache);
- position.y += (message->text.getHeight() + MESSAGE_PADDING_BOTTOM * Settings::getScaling());
-
- if(position.y + LINE_HEIGHT > 0.0f && position.y < backgroundPos.y + backgroundSize.y && i + 1 != numMessages)
- {
- lineRect.setPosition(sf::Vector2f(position.x + LINE_SIDE_PADDING, floor(position.y)));
- window.draw(lineRect);
- //drawGradientLine(sf::Vector2f(position.x + LINE_SIDE_PADDING, floor(position.y)), sf::Vector2f(backgroundSizeWithoutPadding.x - LINE_SIDE_PADDING * 2.0f, LINE_HEIGHT), LINE_COLOR, window);
- }
-
- position.y += LINE_HEIGHT;
+ case Theme::Type::DEFAULT:
+ drawDefault(window, cache);
+ break;
+ case Theme::Type::SIMPLE:
+ drawSimple(window, cache);
+ break;
}
- totalHeight = (position.y - scroll) - startHeight;
}
scroll += scrollSpeed;
@@ -240,7 +312,7 @@ namespace dchat
if(abs(scrollSpeed - deltaTimeScrollMultiplier) <= deltaTimeScrollMultiplier)
scrollSpeed = 0.0;
- double textOverflow = backgroundSize.y - totalHeight;
+ double textOverflow = (double)backgroundSize.y - totalHeight;
if(scroll > 0.0 || textOverflow > 0.0)
{
scroll = 0.0;