aboutsummaryrefslogtreecommitdiff
path: root/src/UsersSidePanel.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/UsersSidePanel.cpp')
-rw-r--r--src/UsersSidePanel.cpp126
1 files changed, 55 insertions, 71 deletions
diff --git a/src/UsersSidePanel.cpp b/src/UsersSidePanel.cpp
index 687b976..b1f7843 100644
--- a/src/UsersSidePanel.cpp
+++ b/src/UsersSidePanel.cpp
@@ -11,6 +11,7 @@
#include <SFML/Graphics/Text.hpp>
#include <vector>
#include <cmath>
+#include <sibs/Functional.hpp>
using namespace std;
@@ -24,47 +25,50 @@ namespace dchat
const float PADDING_BOTTOM = 20.0f;
const i64 USER_TIMEOUT_SEC = 25;
- static void renderUser(Cache &cache, User *user, sf::Shader *circleShader, sf::RenderWindow &window, sf::Vector2f &position, const sf::Font *font, const float textHeight, bool isUserOnline)
+ static void renderUser(Cache &cache, const User *user, sf::Shader *circleShader, sf::RenderWindow &window, sf::Vector2f &position, const sf::Font *font, const float textHeight, bool isUserOnline)
{
- // Max avatar size = 1mb
- const ContentByUrlResult avatarResult = cache.getContentByUrl(user->avatarUrl, 1024 * 1024);
- if(avatarResult.type == ContentByUrlResult::Type::CACHED)
+ if(position.y + AVATAR_DIAMETER > 0.0f && position.y < window.getSize().y)
{
- circleShader->setUniform("texture", sf::Shader::CurrentTexture);
-
- if(avatarResult.cachedType == ContentByUrlResult::CachedType::TEXTURE)
+ // Max avatar size = 1mb
+ const ContentByUrlResult avatarResult = cache.getContentByUrl(user->avatarUrl, 1024 * 1024);
+ if(avatarResult.type == ContentByUrlResult::Type::CACHED)
{
- // TODO: Store this sprite somewhere, might not be efficient to create a new sprite object every frame
- sf::Sprite sprite(*avatarResult.texture);
- auto textureSize = avatarResult.texture->getSize();
- sprite.setPosition(sf::Vector2f(floor(position.x), floor(position.y)));
- sprite.setScale(sf::Vector2f(AVATAR_DIAMETER * Settings::getScaling() / (float)textureSize.x, AVATAR_DIAMETER * Settings::getScaling() / (float)textureSize.y));
- sprite.setColor(isUserOnline ? sf::Color::White : sf::Color(255, 255, 255, 100));
- window.draw(sprite, circleShader);
+ circleShader->setUniform("texture", sf::Shader::CurrentTexture);
+
+ if(avatarResult.cachedType == ContentByUrlResult::CachedType::TEXTURE)
+ {
+ // TODO: Store this sprite somewhere, might not be efficient to create a new sprite object every frame
+ sf::Sprite sprite(*avatarResult.texture);
+ auto textureSize = avatarResult.texture->getSize();
+ sprite.setPosition(sf::Vector2f(floor(position.x), floor(position.y)));
+ sprite.setScale(sf::Vector2f(AVATAR_DIAMETER * Settings::getScaling() / (float)textureSize.x, AVATAR_DIAMETER * Settings::getScaling() / (float)textureSize.y));
+ sprite.setColor(isUserOnline ? sf::Color::White : sf::Color(255, 255, 255, 100));
+ window.draw(sprite, circleShader);
+ }
+ else if(avatarResult.cachedType == ContentByUrlResult::CachedType::GIF)
+ {
+ auto gifSize = avatarResult.gif->getSize();
+ avatarResult.gif->setPosition(sf::Vector2f(floor(position.x), floor(position.y)));
+ avatarResult.gif->setScale(sf::Vector2f(AVATAR_DIAMETER * Settings::getScaling() / (float)gifSize.x, AVATAR_DIAMETER * Settings::getScaling() / (float)gifSize.y));
+ avatarResult.gif->setColor(isUserOnline ? sf::Color::White : sf::Color(255, 255, 255, 100));
+ avatarResult.gif->draw(window, circleShader);
+ }
}
- else if(avatarResult.cachedType == ContentByUrlResult::CachedType::GIF)
+ else
{
- auto gifSize = avatarResult.gif->getSize();
- avatarResult.gif->setPosition(sf::Vector2f(floor(position.x), floor(position.y)));
- avatarResult.gif->setScale(sf::Vector2f(AVATAR_DIAMETER * Settings::getScaling() / (float)gifSize.x, AVATAR_DIAMETER * Settings::getScaling() / (float)gifSize.y));
- avatarResult.gif->setColor(isUserOnline ? sf::Color::White : sf::Color(255, 255, 255, 100));
- avatarResult.gif->draw(window, circleShader);
+ sf::CircleShape avatarCircle(AVATAR_DIAMETER * 0.5f * Settings::getScaling(), 60 * Settings::getScaling());
+ avatarCircle.setPosition(sf::Vector2f(floor(position.x), floor(position.y)));
+ avatarCircle.setFillColor(isUserOnline ? ColorScheme::getBackgroundColor() + sf::Color(30, 30, 30) : ColorScheme::getBackgroundColor() * sf::Color(255, 255, 255, 100));
+ window.draw(avatarCircle);
}
+
+ // TODO: Remove this shit
+ sf::String str = sf::String::fromUtf8(user->getName().begin(), user->getName().end());
+ sf::Text text(str, *font, FONT_SIZE * Settings::getScaling());
+ text.setPosition(floor(position.x + (AVATAR_DIAMETER + AVATAR_PADDING_SIDE) * Settings::getScaling()), floor(position.y + AVATAR_DIAMETER * 0.5f - textHeight * 0.5f));
+ text.setFillColor(isUserOnline ? sf::Color(15, 192, 252) : sf::Color(15, 192, 252, 100));
+ window.draw(text);
}
- else
- {
- sf::CircleShape avatarCircle(AVATAR_DIAMETER * 0.5f * Settings::getScaling(), 60 * Settings::getScaling());
- avatarCircle.setPosition(sf::Vector2f(floor(position.x), floor(position.y)));
- avatarCircle.setFillColor(isUserOnline ? ColorScheme::getBackgroundColor() + sf::Color(30, 30, 30) : ColorScheme::getBackgroundColor() * sf::Color(255, 255, 255, 100));
- window.draw(avatarCircle);
- }
-
- // TODO: Remove this shit
- sf::String str = sf::String::fromUtf8(user->getName().begin(), user->getName().end());
- sf::Text text(str, *font, FONT_SIZE * Settings::getScaling());
- text.setPosition(floor(position.x + (AVATAR_DIAMETER + AVATAR_PADDING_SIDE) * Settings::getScaling()), floor(position.y + AVATAR_DIAMETER * 0.5f - textHeight * 0.5f));
- text.setFillColor(isUserOnline ? sf::Color(15, 192, 252) : sf::Color(15, 192, 252, 100));
- window.draw(text);
position.y += ((AVATAR_DIAMETER + PADDING_BOTTOM) * Settings::getScaling());
}
@@ -86,24 +90,22 @@ namespace dchat
const float textHeight = font->getLineSpacing(FONT_SIZE * Settings::getScaling());
i64 timestampSec = currentChannel->getSyncedTimestampUtcInSec();
+ auto &channelUsers = currentChannel->getUsers();
+ auto currentChannelUsers = sibs::makeFunction(channelUsers.data(), channelUsers.data() + channelUsers.size());
+ for(BridgeService *bridgeService : currentChannel->getBridgeServices())
+ {
+ auto &bridgeServiceUsers = bridgeService->getUsers();
+ currentChannelUsers.merge(sibs::makeFunction(bridgeServiceUsers.data(), bridgeServiceUsers.data() + bridgeServiceUsers.size()));
+ }
u32 numOnlineUsers = 0;
u32 numOfflineUsers = 0;
- for(User *user : currentChannel->getUsers())
+ for(const User *user : currentChannelUsers)
{
- bool hasUserTimedOut = false;
- if(user->isOnlineUser())
- {
- auto onlineUser = static_cast<OnlineUser*>(user);
- i64 pingTimeDiffSec = timestampSec - (i64)onlineUser->pingTimestampSec;
- if(pingTimeDiffSec > USER_TIMEOUT_SEC)
- hasUserTimedOut = true;
- }
-
- if(hasUserTimedOut)
- ++numOfflineUsers;
- else
+ if(user->isConnected(timestampSec))
++numOnlineUsers;
+ else
+ ++numOfflineUsers;
}
// TODO: Remove this shit
@@ -118,19 +120,10 @@ namespace dchat
sf::Shader *circleShader = ResourceCache::getShader("shaders/circleMask.glsl", sf::Shader::Fragment);
- for(User *user : currentChannel->getUsers())
+ for(const User *user : currentChannelUsers)
{
- bool isUserOnline = true;
- if(user->isOnlineUser())
- {
- auto onlineUser = static_cast<OnlineUser*>(user);
- i64 pingTimeDiffSec = timestampSec - (i64)onlineUser->pingTimestampSec;
- if(pingTimeDiffSec > USER_TIMEOUT_SEC)
- isUserOnline = false;
- }
-
- if(isUserOnline)
- renderUser(cache, user, circleShader, window, position, font, textHeight, isUserOnline);
+ if(user->isConnected(timestampSec))
+ renderUser(cache, user, circleShader, window, position, font, textHeight, true);
}
if(numOfflineUsers == 0) return;
@@ -146,19 +139,10 @@ namespace dchat
position.y += floor(font->getLineSpacing(text.getCharacterSize()));
position.y += PADDING_BOTTOM * Settings::getScaling() * 0.5f;
- for(User *user : currentChannel->getUsers())
+ for(const User *user : currentChannelUsers)
{
- bool isUserOnline = true;
- if(user->isOnlineUser())
- {
- auto onlineUser = static_cast<OnlineUser*>(user);
- i64 pingTimeDiffSec = timestampSec - (i64)onlineUser->pingTimestampSec;
- if(pingTimeDiffSec > USER_TIMEOUT_SEC)
- isUserOnline = false;
- }
-
- if(!isUserOnline)
- renderUser(cache, user, circleShader, window, position, font, textHeight, isUserOnline);
+ if(!user->isConnected(timestampSec))
+ renderUser(cache, user, circleShader, window, position, font, textHeight, false);
}
}