diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/SettingsPage.cpp | 73 | ||||
-rw-r--r-- | src/Theme.cpp | 5 | ||||
-rw-r--r-- | src/gui/Button.cpp | 2 | ||||
-rw-r--r-- | src/gui/CheckBox.cpp | 4 | ||||
-rw-r--r-- | src/gui/ComboBox.cpp | 4 | ||||
-rw-r--r-- | src/gui/CustomRendererWidget.cpp | 41 | ||||
-rw-r--r-- | src/gui/Entry.cpp | 2 | ||||
-rw-r--r-- | src/gui/RadioButton.cpp | 2 | ||||
-rw-r--r-- | src/main.cpp | 34 |
9 files changed, 147 insertions, 20 deletions
diff --git a/src/SettingsPage.cpp b/src/SettingsPage.cpp index 187d414..e4c41c8 100644 --- a/src/SettingsPage.cpp +++ b/src/SettingsPage.cpp @@ -8,8 +8,14 @@ #include "../include/gui/Entry.hpp" #include "../include/gui/CheckBox.hpp" #include "../include/gui/ScrollablePage.hpp" +#include "../include/gui/CustomRendererWidget.hpp" #include "../include/GsrInfo.hpp" +#include <mglpp/graphics/Rectangle.hpp> +#include <mglpp/graphics/Sprite.hpp> +#include <mglpp/graphics/Text.hpp> +#include <mglpp/window/Window.hpp> + namespace gsr { SettingsPage::SettingsPage(Type type, const GsrInfo &gsr_info, const std::vector<AudioDevice> &audio_devices, std::function<void()> back_button_callback) : page(mgl::vec2f(get_theme().window_width, get_theme().window_height).floor()), @@ -51,6 +57,26 @@ namespace gsr { back_button->on_click = back_button_callback; page.add_widget(std::move(back_button)); + auto settings_icon_widget = std::make_unique<CustomRendererWidget>(mgl::vec2f(window_size.x / 10, window_size.x / 10).floor()); + settings_icon_widget->set_position(content_page_ptr->get_position().floor() - mgl::vec2f(settings_icon_widget->get_size().x + window_size.x / 50, 0.0f).floor()); + settings_icon_widget->draw_handler = [&](mgl::Window &window, mgl::vec2f pos, mgl::vec2f size) { + mgl::Rectangle background(size); + background.set_position(pos); + background.set_color(mgl::Color(0, 0, 0, 255)); + window.draw(background); + + const int text_margin = size.y * 0.085; + mgl::Text title("Settings", get_theme().title_font); + title.set_position((pos + mgl::vec2f(size.x * 0.5f - title.get_bounds().size.x * 0.5f, text_margin)).floor()); + window.draw(title); + + mgl::Sprite icon(&get_theme().settings_texture); + icon.set_height((int)(size.y * 0.5f)); + icon.set_position((pos + size * 0.5f - icon.get_size() * 0.5f).floor()); + window.draw(icon); + }; + page.add_widget(std::move(settings_icon_widget)); + auto settings_list = std::make_unique<List>(List::Orientation::VERTICAL); { auto view_radio_button = std::make_unique<RadioButton>(&get_theme().body_font); @@ -306,10 +332,21 @@ namespace gsr { } settings_list_ptr->add_widget(std::move(file_list)); - settings_list_ptr->add_widget(std::make_unique<CheckBox>(&get_theme().body_font, "Record cursor")); - settings_list_ptr->add_widget(std::make_unique<CheckBox>(&get_theme().body_font, "Show replay started notification")); - settings_list_ptr->add_widget(std::make_unique<CheckBox>(&get_theme().body_font, "Show replay stopped notification")); - settings_list_ptr->add_widget(std::make_unique<CheckBox>(&get_theme().body_font, "Show replay saved notification")); + auto record_cursor_checkbox = std::make_unique<CheckBox>(&get_theme().body_font, "Record cursor"); + record_cursor_checkbox->set_checked(true); + settings_list_ptr->add_widget(std::move(record_cursor_checkbox)); + + auto show_replay_started_notification_checkbox = std::make_unique<CheckBox>(&get_theme().body_font, "Show replay started notification"); + show_replay_started_notification_checkbox->set_checked(true); + settings_list_ptr->add_widget(std::move(show_replay_started_notification_checkbox)); + + auto show_replay_stopped_notification_checkbox = std::make_unique<CheckBox>(&get_theme().body_font, "Show replay stopped notification"); + show_replay_stopped_notification_checkbox->set_checked(true); + settings_list_ptr->add_widget(std::move(show_replay_stopped_notification_checkbox)); + + auto show_replay_saved_notification_checkbox = std::make_unique<CheckBox>(&get_theme().body_font, "Show replay saved notification"); + show_replay_saved_notification_checkbox->set_checked(true); + settings_list_ptr->add_widget(std::move(show_replay_saved_notification_checkbox)); } void SettingsPage::add_record_widgets() { @@ -337,9 +374,17 @@ namespace gsr { } settings_list_ptr->add_widget(std::move(file_list)); - settings_list_ptr->add_widget(std::make_unique<CheckBox>(&get_theme().body_font, "Record cursor")); - settings_list_ptr->add_widget(std::make_unique<CheckBox>(&get_theme().body_font, "Show recording started notification")); - settings_list_ptr->add_widget(std::make_unique<CheckBox>(&get_theme().body_font, "Show video saved notification")); + auto record_cursor_checkbox = std::make_unique<CheckBox>(&get_theme().body_font, "Record cursor"); + record_cursor_checkbox->set_checked(true); + settings_list_ptr->add_widget(std::move(record_cursor_checkbox)); + + auto show_recording_started_notification_checkbox = std::make_unique<CheckBox>(&get_theme().body_font, "Show recording started notification"); + show_recording_started_notification_checkbox->set_checked(true); + settings_list_ptr->add_widget(std::move(show_recording_started_notification_checkbox)); + + auto show_video_saved_notification_checkbox = std::make_unique<CheckBox>(&get_theme().body_font, "Show video saved notification"); + show_video_saved_notification_checkbox->set_checked(true); + settings_list_ptr->add_widget(std::move(show_video_saved_notification_checkbox)); } void SettingsPage::add_stream_widgets() { @@ -395,9 +440,17 @@ namespace gsr { } settings_list_ptr->add_widget(std::move(streaming_info_list)); - settings_list_ptr->add_widget(std::make_unique<CheckBox>(&get_theme().body_font, "Record cursor")); - settings_list_ptr->add_widget(std::make_unique<CheckBox>(&get_theme().body_font, "Show streaming started notification")); - settings_list_ptr->add_widget(std::make_unique<CheckBox>(&get_theme().body_font, "Show streaming stopped notification")); + auto record_cursor_checkbox = std::make_unique<CheckBox>(&get_theme().body_font, "Record cursor"); + record_cursor_checkbox->set_checked(true); + settings_list_ptr->add_widget(std::move(record_cursor_checkbox)); + + auto show_streaming_started_notification_checkbox = std::make_unique<CheckBox>(&get_theme().body_font, "Show streaming started notification"); + show_streaming_started_notification_checkbox->set_checked(true); + settings_list_ptr->add_widget(std::move(show_streaming_started_notification_checkbox)); + + auto show_streaming_stopped_notification_checkbox = std::make_unique<CheckBox>(&get_theme().body_font, "Show streaming stopped notification"); + show_streaming_stopped_notification_checkbox->set_checked(true); + settings_list_ptr->add_widget(std::move(show_streaming_stopped_notification_checkbox)); streaming_service_box_ptr->on_selection_changed = [=](const std::string &text, const std::string &id) { (void)text; diff --git a/src/Theme.cpp b/src/Theme.cpp index 0849eed..946b4b2 100644 --- a/src/Theme.cpp +++ b/src/Theme.cpp @@ -47,7 +47,10 @@ namespace gsr { if(!theme->body_font.load_from_file(theme->body_font_file, std::max(13.0f, window_size.y * 0.015f))) goto error; - if(!theme->combobox_arrow.load_from_file((resources_path + "images/combobox_arrow.png").c_str(), {false, false, false})) + if(!theme->combobox_arrow_texture.load_from_file((resources_path + "images/combobox_arrow.png").c_str(), {false, false, false})) + goto error; + + if(!theme->settings_texture.load_from_file((resources_path + "images/settings.png").c_str(), {false, false, false})) goto error; return true; diff --git a/src/gui/Button.cpp b/src/gui/Button.cpp index d2c4a2c..e36d07b 100644 --- a/src/gui/Button.cpp +++ b/src/gui/Button.cpp @@ -46,7 +46,7 @@ namespace gsr { const bool mouse_inside = mgl::FloatRect(draw_pos, item_size).contains(window.get_mouse_position().to_vec2f()) && !has_parent_with_selected_child_widget(); if(mouse_inside) - draw_rectangle_outline(window, draw_pos, item_size, get_theme().tint_color, border_scale * get_theme().window_height); + draw_rectangle_outline(window, draw_pos, item_size, get_theme().tint_color, std::max(1.0f, border_scale * get_theme().window_height)); } mgl::vec2f Button::get_size() { diff --git a/src/gui/CheckBox.cpp b/src/gui/CheckBox.cpp index 94e5f9e..e0904ba 100644 --- a/src/gui/CheckBox.cpp +++ b/src/gui/CheckBox.cpp @@ -75,6 +75,10 @@ namespace gsr { return mgl::vec2f(text_bounds.y, text_bounds.y).floor(); } + void CheckBox::set_checked(bool checked) { + this->checked = checked; + } + bool CheckBox::is_checked() const { return checked; } diff --git a/src/gui/ComboBox.cpp b/src/gui/ComboBox.cpp index 6aff979..373b06b 100644 --- a/src/gui/ComboBox.cpp +++ b/src/gui/ComboBox.cpp @@ -14,7 +14,7 @@ namespace gsr { static const float padding_right_scale = 0.007f; static const float border_scale = 0.0015f; - ComboBox::ComboBox(mgl::Font *font) : font(font), dropdown_arrow(&get_theme().combobox_arrow) { + ComboBox::ComboBox(mgl::Font *font) : font(font), dropdown_arrow(&get_theme().combobox_arrow_texture) { assert(font); } @@ -109,7 +109,7 @@ namespace gsr { Item &item = items[selected_item]; item.text.set_position(pos.floor()); if(show_dropdown || mouse_inside) { - const int border_size = border_scale * get_theme().window_height; + const int border_size = std::max(1.0f, border_scale * get_theme().window_height); const mgl::Color border_color = get_theme().tint_color; draw_rectangle_outline(window, pos - mgl::vec2f(padding_left, padding_top), item_size.floor(), border_color, border_size); } diff --git a/src/gui/CustomRendererWidget.cpp b/src/gui/CustomRendererWidget.cpp new file mode 100644 index 0000000..98b7caf --- /dev/null +++ b/src/gui/CustomRendererWidget.cpp @@ -0,0 +1,41 @@ +#include "../../include/gui/CustomRendererWidget.hpp" + +#include <mglpp/window/Window.hpp> + +namespace gsr { + CustomRendererWidget::CustomRendererWidget(mgl::vec2f size) : size(size) {} + + bool CustomRendererWidget::on_event(mgl::Event &event, mgl::Window &window, mgl::vec2f offset) { + if(!visible || !event_handler) + return true; + return event_handler(event, window, position + offset, size); + } + + void CustomRendererWidget::draw(mgl::Window &window, mgl::vec2f offset) { + if(!visible) + return; + + const mgl::vec2f draw_pos = position + offset; + + mgl_scissor prev_scissor; + mgl_window_get_scissor(window.internal_window(), &prev_scissor); + + mgl_scissor new_scissor = { + mgl_vec2i{(int)draw_pos.x, (int)draw_pos.y}, + mgl_vec2i{(int)size.x, (int)size.y} + }; + mgl_window_set_scissor(window.internal_window(), &new_scissor); + + if(draw_handler) + draw_handler(window, draw_pos, size); + + mgl_window_set_scissor(window.internal_window(), &prev_scissor); + } + + mgl::vec2f CustomRendererWidget::get_size() { + if(!visible) + return {0.0f, 0.0f}; + + return size; + } +}
\ No newline at end of file diff --git a/src/gui/Entry.cpp b/src/gui/Entry.cpp index e74e41e..f337bcf 100644 --- a/src/gui/Entry.cpp +++ b/src/gui/Entry.cpp @@ -57,7 +57,7 @@ namespace gsr { window.draw(background); if(selected) { - const int border_size = border_scale * get_theme().window_height; + const int border_size = std::max(1.0f, border_scale * get_theme().window_height); draw_rectangle_outline(window, draw_pos.floor(), get_size().floor(), get_theme().tint_color, border_size); const int caret_width = std::max(1.0f, caret_width_scale * get_theme().window_height); diff --git a/src/gui/RadioButton.cpp b/src/gui/RadioButton.cpp index 15b0989..eb1f900 100644 --- a/src/gui/RadioButton.cpp +++ b/src/gui/RadioButton.cpp @@ -77,7 +77,7 @@ namespace gsr { const bool mouse_inside = mgl::FloatRect(draw_pos, item_size).contains(window.get_mouse_position().to_vec2f()); if(can_select_item && mouse_inside) { - const int border_size = border_scale * get_theme().window_height; + const int border_size = std::max(1.0f, border_scale * get_theme().window_height); const mgl::Color border_color = get_theme().tint_color; draw_rectangle_outline(window, draw_pos.floor(), item_size.floor(), border_color, border_size); } diff --git a/src/main.cpp b/src/main.cpp index 0649c09..196f7e1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,6 +1,8 @@ #include "../include/gui/StaticPage.hpp" #include "../include/gui/DropdownButton.hpp" +#include "../include/gui/CustomRendererWidget.hpp" +#include "../include/gui/Utils.hpp" #include "../include/Process.hpp" #include "../include/Theme.hpp" #include "../include/GsrInfo.hpp" @@ -620,9 +622,32 @@ int main(int argc, char **argv) { if(!close_texture.load_from_file((resources_path + "images/cross.png").c_str())) startup_error("failed to load texture: images/cross.png"); - mgl::Sprite close_sprite(&close_texture); - close_sprite.set_height(int(top_bar_background.get_size().y * 0.3f)); - close_sprite.set_position(mgl::vec2f(window_size.x - close_sprite.get_size().x - 50.0f, top_bar_background.get_size().y * 0.5f - close_sprite.get_size().y * 0.5f).floor()); + gsr::CustomRendererWidget close_button_widget(mgl::vec2f(top_bar_background.get_size().y * 0.3f, top_bar_background.get_size().y * 0.3f).floor()); + close_button_widget.set_position(mgl::vec2f(window_size.x - close_button_widget.get_size().x - 50.0f, top_bar_background.get_size().y * 0.5f - close_button_widget.get_size().y * 0.5f).floor()); + close_button_widget.draw_handler = [&](mgl::Window &window, mgl::vec2f pos, mgl::vec2f size) { + if(mgl::FloatRect(pos, size).contains(window.get_mouse_position().to_vec2f())) { + const float border_scale = 0.0015f; + const int border_size = std::max(1.0f, border_scale * gsr::get_theme().window_height); + gsr::draw_rectangle_outline(window, pos, size, gsr::get_theme().tint_color, border_size); + } + + mgl::Sprite close_sprite(&close_texture); + close_sprite.set_position(pos); + close_sprite.set_size(size); + window.draw(close_sprite); + }; + bool close_button_pressed_inside = false; + close_button_widget.event_handler = [&](mgl::Event &event, mgl::Window&, mgl::vec2f pos, mgl::vec2f size) { + if(event.type == mgl::Event::MouseButtonPressed && event.mouse_button.button == mgl::Mouse::Left) { + close_button_pressed_inside = mgl::FloatRect(pos, size).contains(mgl::vec2f(event.mouse_button.x, event.mouse_button.y)); + } else if(event.type == mgl::Event::MouseButtonReleased && event.mouse_button.button == mgl::Mouse::Left && close_button_pressed_inside) { + if(mgl::FloatRect(pos, size).contains(mgl::vec2f(event.mouse_button.x, event.mouse_button.y))) { + running = false; + return false; + } + } + return true; + }; mgl::Texture logo_texture; if(!logo_texture.load_from_file((resources_path + "images/gpu_screen_recorder_logo.png").c_str())) @@ -655,7 +680,7 @@ int main(int argc, char **argv) { window.draw(top_bar_background); window.draw(top_bar_text); window.draw(logo_sprite); - window.draw(close_sprite); + close_button_widget.draw(window, mgl::vec2f(0.0f, 0.0f)); page_stack.top()->draw(window, mgl::vec2f(0.0f, 0.0f)); window.display(); }; @@ -668,6 +693,7 @@ int main(int argc, char **argv) { while(window.poll_event(event)) { page_stack.top()->on_event(event, window, mgl::vec2f(0.0f, 0.0f)); + close_button_widget.on_event(event, window, mgl::vec2f(0.0f, 0.0f)); if(event.type == mgl::Event::KeyReleased) { if(event.key.code == mgl::Keyboard::Escape && !page_stack.empty()) page_stack.pop(); |