diff options
Diffstat (limited to 'src/Tabs.cpp')
-rw-r--r-- | src/Tabs.cpp | 92 |
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); } } |