aboutsummaryrefslogtreecommitdiff
path: root/src/Tabs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Tabs.cpp')
-rw-r--r--src/Tabs.cpp92
1 files changed, 56 insertions, 36 deletions
diff --git a/src/Tabs.cpp b/src/Tabs.cpp
index b671262..e1a0d86 100644
--- a/src/Tabs.cpp
+++ b/src/Tabs.cpp
@@ -1,4 +1,5 @@
#include "../include/Tabs.hpp"
+#include "../include/Body.hpp"
#include "../include/ResourceLoader.hpp"
#include "../include/Utils.hpp"
#include <SFML/Window/Event.hpp>
@@ -9,7 +10,7 @@
namespace QuickMedia {
static const float tab_text_size = std::floor(16.0f * QuickMedia::get_ui_scale());
static const float tab_height = tab_text_size + std::floor(10.0f * QuickMedia::get_ui_scale());
- static const sf::Color tab_selected_color(55, 60, 68);
+ static const sf::Color tab_selected_color(60, 65, 73);
static const sf::Color arrow_color(255, 255, 255, 175);
static const float tab_min_width = 250.0f;
static const float tab_margin_x = 10.0f;
@@ -28,45 +29,64 @@ namespace QuickMedia {
shade.setFillColor(shade_color);
}
- int Tabs::add_tab(const std::string &title) {
- tab_texts.push_back(sf::Text(title, *FontLoader::get_font(FontLoader::FontType::LATIN), tab_text_size));
- tab_labels_utf8.push_back(title);
- return tab_texts.size() - 1;
+ int Tabs::add_tab(const std::string &title, Body *body) {
+ assert(body);
+ tabs.push_back({ sf::Text(title, *FontLoader::get_font(FontLoader::FontType::LATIN), tab_text_size), title, body} );
+ return tabs.size() - 1;
+ }
+
+ void Tabs::move_selected_tab(int new_tab) {
+ const int tab_diff = new_tab - selected_tab;
+
+ if(tab_diff > 0) {
+ while(selected_tab < new_tab) {
+ ++selected_tab;
+ const float scroll_fixed = scroll + (tab_offset * width_per_tab);
+ if(scroll_fixed + tab_index_to_x_offset(selected_tab) + tab_background_width > container_width - tab_margin_x)
+ --tab_offset;
+ }
+ } else if(tab_diff < 0) {
+ while(selected_tab > new_tab) {
+ --selected_tab;
+ const float scroll_fixed = scroll + (tab_offset * width_per_tab);
+ if(scroll_fixed + tab_index_to_x_offset(selected_tab) + tab_background_width < tab_margin_x)
+ ++tab_offset;
+ }
+ } else {
+ return;
+ }
+
+ if(on_change_tab)
+ on_change_tab(selected_tab);
}
void Tabs::on_event(sf::Event &event) {
- if(event.type == sf::Event::KeyPressed) {
- if(event.key.code == sf::Keyboard::Left || (event.key.control && event.key.code == sf::Keyboard::H)) {
- if(selected_tab > 0) {
- --selected_tab;
- float scroll_fixed = scroll + (tab_offset * width_per_tab);
- if(scroll_fixed + tab_index_to_x_offset(selected_tab) + tab_background_width < tab_margin_x)
- tab_offset++;
-
- if(on_change_tab)
- on_change_tab(selected_tab);
- }
- } else if(event.key.code == sf::Keyboard::Right || (event.key.control && event.key.code == sf::Keyboard::L)) {
- if(selected_tab < (int)tab_texts.size() - 1) {
- ++selected_tab;
- float scroll_fixed = scroll + (tab_offset * width_per_tab);
- if(scroll_fixed + tab_index_to_x_offset(selected_tab) + tab_background_width > container_width - tab_margin_x)
- tab_offset--;
-
- if(on_change_tab)
- on_change_tab(selected_tab);
- }
+ if(event.type == sf::Event::KeyPressed && !tabs.empty()) {
+ if(((!tabs[selected_tab].body->can_move_left() || event.key.alt) && (event.key.code == sf::Keyboard::Left || (event.key.control && event.key.code == sf::Keyboard::H)))
+ || (event.key.code == sf::Keyboard::Tab && event.key.shift))
+ {
+ if(selected_tab > 0)
+ move_selected_tab(selected_tab - 1);
+ } else if(((!tabs[selected_tab].body->can_move_right() || event.key.alt) && (event.key.code == sf::Keyboard::Right || (event.key.control && event.key.code == sf::Keyboard::L)))
+ || (event.key.code == sf::Keyboard::Tab && !event.key.shift))
+ {
+ if(selected_tab < (int)tabs.size() - 1)
+ move_selected_tab(selected_tab + 1);
+ } else if(event.key.control && event.key.code >= sf::Keyboard::Num1 && event.key.code <= sf::Keyboard::Num9) {
+ const int tab_target = event.key.code - sf::Keyboard::Num1;
+ if(tab_target < (int)tabs.size())
+ move_selected_tab(tab_target);
}
}
}
void Tabs::draw(sf::RenderWindow &window, sf::Vector2f pos, float width) {
- if(width - tab_margin_x < 0.0f || tab_texts.empty()) return;
+ if(width - tab_margin_x < 0.0f || tabs.empty()) return;
auto window_size = window.getSize();
container_width = width;
- const int num_visible_tabs = std::min((int)tab_texts.size(), std::max(1, (int)(width / tab_min_width)));
+ const int num_visible_tabs = std::min((int)tabs.size(), std::max(1, (int)(width / tab_min_width)));
width_per_tab = std::floor(width / num_visible_tabs);
const float tab_text_y = std::floor(pos.y + tab_height*0.5f - (tab_text_size + 5.0f*get_ui_scale())*0.5f);
tab_background_width = std::floor(width_per_tab - tab_margin_x*2.0f);
@@ -80,7 +100,7 @@ namespace QuickMedia {
float scroll_fixed = scroll + (tab_offset * width_per_tab);
- float overflow_last = (scroll_fixed + tab_index_to_x_offset(tab_texts.size() - 1) + tab_background_width) - (width - tab_margin_x);
+ float overflow_last = (scroll_fixed + tab_index_to_x_offset(tabs.size() - 1) + tab_background_width) - (width - tab_margin_x);
if(overflow_last < 0.0f)
scroll_fixed -= overflow_last;
@@ -96,7 +116,7 @@ namespace QuickMedia {
const auto start_pos = pos;
pos.x += scroll_fixed;
- for(size_t i = 0; i < tab_texts.size(); ++i) {
+ for(size_t i = 0; i < tabs.size(); ++i) {
const int index = i;
const float background_pos_x = std::floor(pos.x + tab_index_to_x_offset(i));
if(background_pos_x - start_pos.x >= width - tab_margin_x) {
@@ -112,7 +132,7 @@ namespace QuickMedia {
background.draw(window);
}
- sf::Text &tab_text = tab_texts[index];
+ sf::Text &tab_text = tabs[index].text;
float text_pos_x = std::floor(pos.x + i*width_per_tab + width_per_tab*0.5f - tab_text.getLocalBounds().width*0.5f);
text_pos_x = std::max(text_pos_x, background_pos_x);
tab_text.setPosition(text_pos_x, tab_text_y);
@@ -183,16 +203,16 @@ namespace QuickMedia {
}
void Tabs::set_text(int index, const std::string &text) {
- if(index < 0 || index >= (int)tab_texts.size() || text == tab_labels_utf8[index]) return;
- tab_texts[index].setString(sf::String::fromUtf8(text.begin(), text.end()));
- tab_labels_utf8[index] = text;
+ if(index < 0 || index >= (int)tabs.size() || text == tabs[index].label_utf8) return;
+ tabs[index].text.setString(sf::String::fromUtf8(text.begin(), text.end()));
+ tabs[index].label_utf8 = text;
}
void Tabs::set_selected(int index) {
- if(tab_texts.empty()) {
+ if(tabs.empty()) {
selected_tab = 0;
} else {
- selected_tab = std::min(std::max(index, 0), (int)tab_texts.size() - 1);
+ selected_tab = std::min(std::max(index, 0), (int)tabs.size() - 1);
}
}