aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/SearchBar.hpp15
-rw-r--r--src/QuickMedia.cpp14
-rw-r--r--src/SearchBar.cpp85
3 files changed, 52 insertions, 62 deletions
diff --git a/include/SearchBar.hpp b/include/SearchBar.hpp
index 19cd121..514b33e 100644
--- a/include/SearchBar.hpp
+++ b/include/SearchBar.hpp
@@ -20,9 +20,15 @@ namespace QuickMedia {
using TextSubmitCallback = std::function<void(const std::string &text)>;
using TextBeginTypingCallback = std::function<void()>;
+ enum class SearchBarType {
+ Search,
+ Text,
+ Password
+ };
+
class SearchBar {
public:
- SearchBar(mgl::Texture *plugin_logo, mgl::Shader *rounded_rectangle_shader, const std::string &placeholder, bool input_masked = false);
+ SearchBar(mgl::Texture *plugin_logo, mgl::Shader *rounded_rectangle_shader, const std::string &placeholder, SearchBarType type);
void draw(mgl::Window &window, mgl::vec2f size, bool draw_background);
void on_event(mgl::Window &window, mgl::Event &event);
void update();
@@ -37,7 +43,7 @@ namespace QuickMedia {
float getBottom() const;
float getBottomWithoutShadow() const;
- std::string get_text() const;
+ const std::string& get_text() const;
bool is_empty() const;
TextUpdateCallback onTextUpdateCallback;
@@ -53,17 +59,15 @@ namespace QuickMedia {
void onTextEntered(const mgl::Event::TextEvent &text_event);
private:
mgl::Text text;
+ mgl::Text placeholder_text;
RoundedRectangle background;
mgl::Rectangle shade;
mgl::Rectangle caret;
mgl::Sprite plugin_logo_sprite;
mgl::Sprite search_icon_sprite;
- std::string placeholder_str;
- bool show_placeholder;
bool updated_search;
bool draw_logo;
bool needs_update;
- bool input_masked;
bool typing;
bool backspace_pressed;
bool mouse_left_inside;
@@ -71,5 +75,6 @@ namespace QuickMedia {
mgl::Clock time_since_search_update;
mgl::vec2f prev_size;
bool editable = true;
+ SearchBarType type;
};
} \ No newline at end of file
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp
index affdb93..15a7f50 100644
--- a/src/QuickMedia.cpp
+++ b/src/QuickMedia.cpp
@@ -1695,7 +1695,7 @@ namespace QuickMedia {
}
std::unique_ptr<SearchBar> Program::create_search_bar(const std::string &placeholder, int search_delay) {
- auto search_bar = std::make_unique<SearchBar>(&plugin_logo, &rounded_rectangle_shader, placeholder);
+ auto search_bar = std::make_unique<SearchBar>(&plugin_logo, &rounded_rectangle_shader, placeholder, SearchBarType::Search);
search_bar->text_autosearch_delay_ms = search_delay;
return search_bar;
}
@@ -4820,9 +4820,9 @@ namespace QuickMedia {
void Program::chat_login_page() {
assert(strcmp(plugin_name, "matrix") == 0);
- SearchBar login_input(nullptr, &rounded_rectangle_shader, "Username");
- SearchBar password_input(nullptr, &rounded_rectangle_shader, "Password", true);
- SearchBar homeserver_input(nullptr, &rounded_rectangle_shader, "Homeserver");
+ SearchBar login_input(nullptr, &rounded_rectangle_shader, "Username", SearchBarType::Text);
+ SearchBar password_input(nullptr, &rounded_rectangle_shader, "Password", SearchBarType::Password);
+ SearchBar homeserver_input(nullptr, &rounded_rectangle_shader, "Homeserver", SearchBarType::Text);
const int num_inputs = 3;
SearchBar *inputs[num_inputs] = { &login_input, &password_input, &homeserver_input };
@@ -4848,7 +4848,11 @@ namespace QuickMedia {
current_page = PageType::CHAT;
return true;
} else {
- show_notification("QuickMedia", "Failed to login, error: " + err_msg + ". Did you perhaps specify an invalid homeserver?", Urgency::CRITICAL);
+ // TODO: Do a proper check for this
+ if(err_msg.find("Failed to parse") != std::string::npos)
+ show_notification("QuickMedia", "Failed to login, error: " + err_msg + ". Did you perhaps specify an invalid homeserver?", Urgency::CRITICAL);
+ else
+ show_notification("QuickMedia", "Failed to login, error: " + err_msg, Urgency::CRITICAL);
return false;
}
});
diff --git a/src/SearchBar.cpp b/src/SearchBar.cpp
index bb7d358..4ec1056 100644
--- a/src/SearchBar.cpp
+++ b/src/SearchBar.cpp
@@ -10,8 +10,6 @@
#include <mglpp/window/Window.hpp>
#include <assert.h>
-// TODO: Use a seperate placeholder mgl::Text instead of switching the text to placeholder text....
-
namespace QuickMedia {
static float floor(float v) {
return (int)v;
@@ -24,30 +22,30 @@ namespace QuickMedia {
static const int character_size = get_config().search.font_size * get_config().scale * get_config().font_scale;
static const int search_icon_padding_x = 10 * get_config().scale;
- SearchBar::SearchBar(mgl::Texture *plugin_logo, mgl::Shader *rounded_rectangle_shader, const std::string &placeholder, bool input_masked) :
+ SearchBar::SearchBar(mgl::Texture *plugin_logo, mgl::Shader *rounded_rectangle_shader, const std::string &placeholder, SearchBarType type) :
onTextUpdateCallback(nullptr),
onTextSubmitCallback(nullptr),
onTextBeginTypingCallback(nullptr),
text_autosearch_delay_ms(50),
caret_visible(true),
- text(placeholder, *FontLoader::get_font(FontLoader::FontType::LATIN, character_size)),
+ text("", *FontLoader::get_font(FontLoader::FontType::LATIN, character_size)),
+ placeholder_text(placeholder, *FontLoader::get_font(FontLoader::FontType::LATIN, character_size)),
background(mgl::vec2f(1.0f, 1.0f), 10.0f * get_config().scale, get_theme().selected_color, rounded_rectangle_shader),
search_icon_sprite(TextureLoader::get_texture("images/search_icon.png")),
- placeholder_str(placeholder),
- show_placeholder(true),
updated_search(false),
draw_logo(false),
needs_update(true),
- input_masked(input_masked),
typing(false),
backspace_pressed(false),
mouse_left_inside(false),
pos(0.0f, 0.0f),
- prev_size(0.0f, 0.0f)
+ prev_size(0.0f, 0.0f),
+ type(type)
{
padding_top = padding_top_default;
padding_bottom = padding_bottom_default;
- text.set_color(get_theme().placeholder_text_color);
+ text.set_color(get_theme().text_color);
+ placeholder_text.set_color(get_theme().placeholder_text_color);
shade.set_color(get_theme().shade_color);
if(plugin_logo && plugin_logo->is_valid())
plugin_logo_sprite.set_texture(plugin_logo);
@@ -70,18 +68,21 @@ namespace QuickMedia {
background.draw(window);
- if(input_masked && !show_placeholder) {
+ const bool show_placeholder = text.get_string().empty();
+ if(type == SearchBarType::Password && !show_placeholder) {
std::string masked_str(text.get_string().size(), '*');
mgl::Text masked_text(std::move(masked_str), *text.get_font());
masked_text.set_position(text.get_position());
window.draw(masked_text);
- caret.set_position(masked_text.find_character_pos(masked_text.get_string().size()) + mgl::vec2f(0.0f, character_size * 0.4f));
+ caret.set_position(masked_text.get_position() + mgl::vec2f(masked_text.get_bounds().size.x, 0.0f).floor() + mgl::vec2f(0.0f, character_size * 0.4f));
} else {
- window.draw(text);
- if(show_placeholder || text.get_string().empty())
- caret.set_position(text.get_position() + mgl::vec2f(-caret.get_size().x, character_size * 0.4f));
- else
- caret.set_position(text.find_character_pos(text.get_string().size()) + mgl::vec2f(0.0f, character_size * 0.4f));
+ if(show_placeholder) {
+ window.draw(placeholder_text);
+ caret.set_position(placeholder_text.get_position() + mgl::vec2f(-caret.get_size().x, character_size * 0.4f));
+ } else {
+ window.draw(text);
+ caret.set_position(text.get_position() + mgl::vec2f(text.get_bounds().size.x, 0.0f).floor() + mgl::vec2f(0.0f, character_size * 0.4f));
+ }
}
if(caret_visible && is_editable())
@@ -90,7 +91,8 @@ namespace QuickMedia {
if(draw_logo)
window.draw(plugin_logo_sprite);
- window.draw(search_icon_sprite);
+ if(type == SearchBarType::Search)
+ window.draw(search_icon_sprite);
}
void SearchBar::on_event(mgl::Window &window, mgl::Event &event) {
@@ -149,11 +151,8 @@ namespace QuickMedia {
timeout_sec = 0.75;
if(updated_search && elapsed_time_sec >= timeout_sec) {
updated_search = false;
- std::string str = text.get_string();
- if(show_placeholder)
- str.clear();
if(onTextUpdateCallback)
- onTextUpdateCallback(str);
+ onTextUpdateCallback(text.get_string());
typing = false;
}
}
@@ -185,19 +184,22 @@ namespace QuickMedia {
shade.set_size(mgl::vec2f(size.x, padding_top + rect_height + padding_bottom));
caret.set_size(vec2f_floor(2.0f * get_config().scale, character_size + floor(2.0f * get_config().scale)));
+ const int search_padding = (type == SearchBarType::Search ? search_icon_padding_x : 0);
+
background.set_position(mgl::vec2f(pos.x + offset_x, pos.y + padding_top));
shade.set_position(pos);
- mgl::vec2f font_position(floor(pos.x + offset_x + background_margin_horizontal + search_icon_padding_x + search_icon_padding_x), floor(pos.y + padding_top + background_margin_vertical - character_size * 0.3f));
- text.set_position(font_position);
+ mgl::vec2f text_position(pos.x + offset_x + background_margin_horizontal + search_padding + search_padding, pos.y + padding_top + background_margin_vertical - character_size * 0.3f);
+ text.set_position(text_position.floor());
+ placeholder_text.set_position(text_position.floor());
mgl::vec2f texture_size = search_icon_sprite.get_texture()->get_size().to_vec2f();
mgl::vec2f new_size = wrap_to_size_y(texture_size, character_size);
search_icon_sprite.set_scale(get_ratio(texture_size, new_size));
- search_icon_sprite.set_position(background.get_position() + mgl::vec2f(search_icon_padding_x, background.get_size().y * 0.5f - new_size.y * 0.5f).floor());
+ search_icon_sprite.set_position(background.get_position() + mgl::vec2f(search_padding, background.get_size().y * 0.5f - new_size.y * 0.5f).floor());
}
void SearchBar::onTextEntered(const mgl::Event::TextEvent &text_event) {
- if(text_event.codepoint == 8 && !show_placeholder) { // Backspace
+ if(text_event.codepoint == 8) { // Backspace
std::string str = text.get_string();
if(str.size() > 0) {
// TODO: When it's possible to move the cursor, then check at cursor position instead of end of the string
@@ -206,13 +208,7 @@ namespace QuickMedia {
const size_t codepoint_start_index = mgl::utf8_get_start_of_codepoint((const unsigned char*)str.c_str(), str.size(), str.size() - 1);
str.erase(codepoint_start_index);
- const bool empty = str.empty();
text.set_string(std::move(str));
- if(empty) {
- show_placeholder = true;
- text.set_string(placeholder_str);
- text.set_color(get_theme().placeholder_text_color);
- }
if(!updated_search) {
typing = true;
if(onTextBeginTypingCallback)
@@ -223,12 +219,8 @@ namespace QuickMedia {
}
} else if(text_event.codepoint == 13) { // Return
backspace_pressed = false;
- if(onTextSubmitCallback) {
- std::string str = text.get_string();
- if(show_placeholder)
- str.clear();
- onTextSubmitCallback(str);
- }
+ if(onTextSubmitCallback)
+ onTextSubmitCallback(text.get_string());
} else if(text_event.codepoint > 31) { // Non-control character
append_text(std::string(text_event.str, text_event.size));
} else if(text_event.codepoint == '\n')
@@ -236,11 +228,7 @@ namespace QuickMedia {
}
void SearchBar::clear() {
- if(show_placeholder)
- return;
- show_placeholder = true;
- text.set_string(placeholder_str);
- text.set_color(get_theme().placeholder_text_color);
+ text.set_string("");
needs_update = true;
updated_search = false;
backspace_pressed = false;
@@ -260,12 +248,6 @@ namespace QuickMedia {
if(text_to_add.empty())
return;
- if(show_placeholder) {
- show_placeholder = false;
- text.set_string("");
- text.set_color(get_theme().text_color);
- }
-
text.append_string(text_to_add);
if(!updated_search) {
@@ -273,6 +255,7 @@ namespace QuickMedia {
if(onTextBeginTypingCallback)
onTextBeginTypingCallback();
}
+
updated_search = true;
time_since_search_update.restart();
backspace_pressed = false;
@@ -304,13 +287,11 @@ namespace QuickMedia {
return floor(font_height + background_margin_vertical * 2.0f + padding_top + padding_bottom);
}
- std::string SearchBar::get_text() const {
- if(show_placeholder)
- return "";
+ const std::string& SearchBar::get_text() const {
return text.get_string();
}
bool SearchBar::is_empty() const {
- return show_placeholder;
+ return text.get_string().empty();
}
} \ No newline at end of file