aboutsummaryrefslogtreecommitdiff
path: root/src/QuickMedia.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/QuickMedia.cpp')
-rw-r--r--src/QuickMedia.cpp45
1 files changed, 44 insertions, 1 deletions
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp
index 9300059..74ee75e 100644
--- a/src/QuickMedia.cpp
+++ b/src/QuickMedia.cpp
@@ -3182,6 +3182,18 @@ namespace QuickMedia {
sf::Text text;
};
+ static sf::Color interpolate_colors(sf::Color source, sf::Color target, double progress) {
+ int diff_r = (int)target.r - (int)source.r;
+ int diff_g = (int)target.g - (int)source.g;
+ int diff_b = (int)target.b - (int)source.b;
+ int diff_a = (int)target.a - (int)source.a;
+ return sf::Color(
+ source.r + diff_r * progress,
+ source.g + diff_g * progress,
+ source.b + diff_b * progress,
+ source.a + diff_a * progress);
+ }
+
void Program::chat_page() {
assert(current_plugin->name == "matrix");
Matrix *matrix = static_cast<Matrix*>(current_plugin);
@@ -3349,6 +3361,10 @@ namespace QuickMedia {
sf::RoundedRectangleShape tab_background(sf::Vector2f(1.0f, 1.0f), 10.0f, 10);
tab_background.setFillColor(tab_selected_color);
+ const float gradient_height = 5.0f;
+ sf::Vertex gradient_points[4];
+ int gradient_inc = 0;
+
while (current_page == Page::CHAT) {
while (window.pollEvent(event)) {
base_event_handler(event, Page::EXIT, false, false, false);
@@ -3359,6 +3375,7 @@ namespace QuickMedia {
bool item_changed = tabs[selected_tab].body->select_previous_item();
// Top hit
if(!item_changed && !fetching_previous_messages_running) {
+ gradient_inc = 0;
fetching_previous_messages_running = true;
previous_messages_future_room_id = current_room_id;
previous_messages_future = std::async(std::launch::async, [this, &previous_messages_future_room_id]() {
@@ -3490,9 +3507,22 @@ namespace QuickMedia {
tabs[selected_tab].body->draw(window, body_pos, body_size);
const float tab_y = tab_spacer_height + std::floor(tab_vertical_offset + tab_height * 0.5f - (tab_text_size + 5.0f) * 0.5f);
- tab_shade.setSize(sf::Vector2f(window_size.x, tab_spacer_height + std::floor(tab_vertical_offset) + tab_height + 10.0f));
+ const float tab_shade_height = tab_spacer_height + std::floor(tab_vertical_offset) + tab_height + 10.0f;
+ tab_shade.setSize(sf::Vector2f(window_size.x, tab_shade_height));
window.draw(tab_shade);
+ gradient_points[0].position.x = 0.0f;
+ gradient_points[0].position.y = tab_shade_height;
+
+ gradient_points[1].position.x = window_size.x;
+ gradient_points[1].position.y = tab_shade_height;
+
+ gradient_points[2].position.x = window_size.x;
+ gradient_points[2].position.y = tab_shade_height + gradient_height;
+
+ gradient_points[3].position.x = 0.0f;
+ gradient_points[3].position.y = tab_shade_height + gradient_height;
+
int i = 0;
for(ChatTab &tab : tabs) {
if(i == selected_tab) {
@@ -3505,6 +3535,19 @@ namespace QuickMedia {
++i;
}
+ // TODO: Stop showing this when switching rooms, or have one for each room. Also add bottom one? for fetching new messages
+ if(fetching_previous_messages_running) {
+ double progress = 0.5 + std::sin((double)(gradient_inc % 360) * 0.017453292519943295 - 1.5707963267948966*0.5) * 0.5;
+ gradient_inc += 2;
+ sf::Color top_color = interpolate_colors(back_color, sf::Color(175, 180, 188), progress);
+
+ gradient_points[0].color = top_color;
+ gradient_points[1].color = top_color;
+ gradient_points[2].color = back_color;
+ gradient_points[3].color = back_color;
+ window.draw(gradient_points, 4, sf::Quads); // Note: sf::Quads doesn't work with egl
+ }
+
window.display();
}