aboutsummaryrefslogtreecommitdiff
path: root/src/QuickMedia.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/QuickMedia.cpp')
-rw-r--r--src/QuickMedia.cpp165
1 files changed, 94 insertions, 71 deletions
diff --git a/src/QuickMedia.cpp b/src/QuickMedia.cpp
index 57b6162..0475964 100644
--- a/src/QuickMedia.cpp
+++ b/src/QuickMedia.cpp
@@ -73,46 +73,68 @@ static const double IDLE_TIMEOUT_SEC = 2.0;
static const mgl::vec2i AVATAR_THUMBNAIL_SIZE(std::floor(32), std::floor(32));
static const int FPS_SYNC_TO_VSYNC = 0;
-static const std::pair<const char*, const char*> valid_plugins[] = {
- std::make_pair("launcher", nullptr),
- std::make_pair("manganelo", "manganelo_logo.png"),
- std::make_pair("manganelos", "manganelos_logo.png"),
- std::make_pair("mangatown", "mangatown_logo.png"),
- std::make_pair("mangakatana", "mangakatana_logo.png"),
- std::make_pair("mangadex", "mangadex_logo.png"),
- std::make_pair("onimanga", nullptr),
- std::make_pair("readm", "readm_logo.png"),
- std::make_pair("local-manga", nullptr),
- std::make_pair("local-anime", nullptr),
- std::make_pair("manga", nullptr),
- std::make_pair("youtube", "yt_logo_rgb_dark_small.png"),
- std::make_pair("peertube", "peertube_logo.png"),
- std::make_pair("dramacool", "dramacool_logo.png"),
- std::make_pair("soundcloud", "soundcloud_logo.png"),
- std::make_pair("lbry", "lbry_logo.png"),
- std::make_pair("pornhub", "pornhub_logo.png"),
- std::make_pair("spankbang", "spankbang_logo.png"),
- std::make_pair("xvideos", "xvideos_logo.png"),
- std::make_pair("xhamster", "xhamster_logo.png"),
- std::make_pair("4chan", "4chan_logo.png"),
- std::make_pair("nyaa.si", "nyaa_si_logo.png"),
- std::make_pair("matrix", "matrix_logo.png"),
- std::make_pair("anilist", "anilist_logo.png"),
- std::make_pair("hotexamples", nullptr),
- std::make_pair("file-manager", nullptr),
- std::make_pair("stdin", nullptr),
- std::make_pair("saucenao", nullptr),
- std::make_pair("download", nullptr)
+struct Logo {
+ const char *dark_theme_path;
+ const char *light_theme_path;
+
+ Logo(const char *path) : dark_theme_path(path), light_theme_path(path) {
+
+ }
+
+ Logo(const char *dark_theme_path, const char *light_theme_path) : dark_theme_path(dark_theme_path), light_theme_path(light_theme_path) {
+
+ }
};
+static const std::pair<const char*, Logo> valid_plugins[] = {
+ std::make_pair<const char*, Logo>("launcher", nullptr),
+ std::make_pair<const char*, Logo>("manganelo", "manganelo_logo.png"),
+ std::make_pair<const char*, Logo>("manganelos", "manganelos_logo.png"),
+ std::make_pair<const char*, Logo>("mangatown", { "mangatown_logo.png", "mangatown_logo_light.png" }),
+ std::make_pair<const char*, Logo>("mangakatana", "mangakatana_logo.png"),
+ std::make_pair<const char*, Logo>("mangadex", { "mangadex_logo.png", "mangadex_logo_light.png" }),
+ std::make_pair<const char*, Logo>("onimanga", nullptr),
+ std::make_pair<const char*, Logo>("readm", { "readm_logo.png", "readm_logo_light.png" }),
+ std::make_pair<const char*, Logo>("local-manga", nullptr),
+ std::make_pair<const char*, Logo>("local-anime", nullptr),
+ std::make_pair<const char*, Logo>("manga", nullptr),
+ std::make_pair<const char*, Logo>("youtube", { "yt_logo_rgb_dark_small.png", "yt_logo_rgb_light_small.png" }),
+ std::make_pair<const char*, Logo>("peertube", "peertube_logo.png"),
+ std::make_pair<const char*, Logo>("dramacool", "dramacool_logo.png"),
+ std::make_pair<const char*, Logo>("soundcloud", "soundcloud_logo.png"),
+ std::make_pair<const char*, Logo>("lbry", "lbry_logo.png"),
+ std::make_pair<const char*, Logo>("pornhub", "pornhub_logo.png"),
+ std::make_pair<const char*, Logo>("spankbang", "spankbang_logo.png"),
+ std::make_pair<const char*, Logo>("xvideos", "xvideos_logo.png"),
+ std::make_pair<const char*, Logo>("xhamster", "xhamster_logo.png"),
+ std::make_pair<const char*, Logo>("4chan", "4chan_logo.png"),
+ std::make_pair<const char*, Logo>("nyaa.si", { "nyaa_si_logo.png", "nyaa_si_logo_light.png" }),
+ std::make_pair<const char*, Logo>("matrix", { "matrix_logo.png", "matrix_logo_light.png" }),
+ std::make_pair<const char*, Logo>("anilist", "anilist_logo.png"),
+ std::make_pair<const char*, Logo>("hotexamples", nullptr),
+ std::make_pair<const char*, Logo>("file-manager", nullptr),
+ std::make_pair<const char*, Logo>("stdin", nullptr),
+ std::make_pair<const char*, Logo>("saucenao", nullptr),
+ std::make_pair<const char*, Logo>("download", nullptr)
+};
+
+static bool is_color_scheme_dark() {
+ mgl::Color col = QuickMedia::get_theme().shade_color;
+ return (col.r + col.g + col.b) / 3 < 128;
+}
+
static const char* get_plugin_logo_name(const char *plugin_name) {
for(const auto &valid_plugin : valid_plugins) {
if(strcmp(plugin_name, valid_plugin.first) == 0)
- return valid_plugin.second;
+ return is_color_scheme_dark() ? valid_plugin.second.dark_theme_path : valid_plugin.second.light_theme_path;
}
return nullptr;
}
+static std::string get_no_avatar_image_path() {
+ return is_color_scheme_dark() ? "images/no_avatar.png" : "images/no_avatar_light.png";
+}
+
// Prevent writing to broken pipe from exiting the program
static void sigpipe_handler(int) {
@@ -347,11 +369,12 @@ namespace QuickMedia {
|| strcmp(plugin_name, "local-manga") == 0;
}
- static std::shared_ptr<BodyItem> create_launcher_body_item(const char *title, const char *plugin_name, const std::string &thumbnail_url) {
+ static std::shared_ptr<BodyItem> create_launcher_body_item(const char *title, const char *plugin_name, const std::string &dark_theme_thumbnail_url, const std::string &light_theme_thumbnail_url) {
auto body_item = BodyItem::create(title);
body_item->url = plugin_name;
+ std::string thumbnail_url = is_color_scheme_dark() ? dark_theme_thumbnail_url : light_theme_thumbnail_url;
if(!thumbnail_url.empty()) {
- body_item->thumbnail_url = thumbnail_url;
+ body_item->thumbnail_url = std::move(thumbnail_url);
body_item->thumbnail_is_local = true;
}
body_item->thumbnail_size.x = 32;
@@ -359,6 +382,10 @@ namespace QuickMedia {
return body_item;
}
+ static std::shared_ptr<BodyItem> create_launcher_body_item(const char *title, const char *plugin_name, const std::string &thumbnail_url) {
+ return create_launcher_body_item(title, plugin_name, thumbnail_url, thumbnail_url);
+ }
+
static bool convert_to_absolute_path(std::filesystem::path &path) {
char resolved[PATH_MAX];
if(!realpath(path.c_str(), resolved))
@@ -735,8 +762,9 @@ namespace QuickMedia {
}
}
- if(!loading_icon.load_from_file((resources_root + "images/loading_icon.png").c_str())) {
- show_notification("QuickMedia", "Failed to load " + resources_root + "/images/loading_icon.png", Urgency::CRITICAL);
+ const char *loading_icon_path = is_color_scheme_dark() ? "images/loading_icon.png" : "images/loading_icon_light.png";
+ if(!loading_icon.load_from_file((resources_root + loading_icon_path).c_str())) {
+ show_notification("QuickMedia", "Failed to load " + resources_root + loading_icon_path, Urgency::CRITICAL);
abort();
}
load_sprite.set_texture(&loading_icon);
@@ -1131,7 +1159,7 @@ namespace QuickMedia {
create_launcher_body_item("Mangakatana", "mangakatana", resources_root + "icons/mangakatana_launcher.png"),
create_launcher_body_item("Manganelo", "manganelo", resources_root + "icons/manganelo_launcher.png"),
create_launcher_body_item("Manganelos", "manganelos", resources_root + "icons/manganelos_launcher.png"),
- create_launcher_body_item("Mangatown", "mangatown", resources_root + "icons/mangatown_launcher.png"),
+ create_launcher_body_item("Mangatown", "mangatown", resources_root + "icons/mangatown_launcher.png", resources_root + "icons/mangatown_launcher_light.png"),
create_launcher_body_item("Onimanga", "onimanga", ""),
create_launcher_body_item("Readm", "readm", resources_root + "icons/readm_launcher.png"),
create_launcher_body_item("Matrix", "matrix", resources_root + "icons/matrix_launcher.png"),
@@ -2049,7 +2077,8 @@ namespace QuickMedia {
}
if(!tabs[selected_tab].page->is_ready()) {
- mgl::Text loading_text("Loading...", *FontLoader::get_font(FontLoader::FontType::LATIN, 30 * get_config().scale * get_config().font_scale));
+ mgl::Text loading_text("Loading...", *FontLoader::get_font(FontLoader::FontType::LATIN, get_config().body.loading_text_font_size * get_config().scale * get_config().font_scale));
+ loading_text.set_color(get_theme().text_color);
auto text_bounds = loading_text.get_bounds();
loading_text.set_position(mgl::vec2f(
std::floor(body_pos.x + body_size.x * 0.5f - text_bounds.size.x * 0.5f),
@@ -2135,7 +2164,8 @@ namespace QuickMedia {
std::vector<TabAssociatedData> tab_associated_data;
for(size_t i = 0; i < tabs.size(); ++i) {
TabAssociatedData data;
- data.search_result_text = mgl::Text("", *FontLoader::get_font(FontLoader::FontType::LATIN, 30 * get_config().scale * get_config().font_scale));
+ data.search_result_text = mgl::Text("", *FontLoader::get_font(FontLoader::FontType::LATIN, get_config().body.loading_text_font_size * get_config().scale * get_config().font_scale));
+ data.search_result_text.set_color(get_theme().text_color);
data.card_view = tabs[i].body ? tabs[i].body->card_view : false;
tab_associated_data.push_back(std::move(data));
}
@@ -4201,7 +4231,7 @@ namespace QuickMedia {
mgl::Texture image_texture;
mgl::Sprite image;
- mgl::Text error_message("", *FontLoader::get_font(FontLoader::FontType::LATIN, 30 * get_config().scale * get_config().font_scale));
+ mgl::Text error_message("", *FontLoader::get_font(FontLoader::FontType::LATIN, get_config().body.loading_text_font_size * get_config().scale * get_config().font_scale));
error_message.set_color(get_theme().text_color);
bool download_in_progress = false;
@@ -4242,9 +4272,9 @@ namespace QuickMedia {
mgl::Text chapter_text(images_page->manga_name + " | " + images_page->get_chapter_name() + " | Page " + std::to_string(image_index + 1) + "/" + std::to_string(num_manga_pages), *FontLoader::get_font(FontLoader::FontType::LATIN, chapter_text_character_size));
if(image_index == num_manga_pages)
chapter_text.set_string(images_page->manga_name + " | " + images_page->get_chapter_name() + " | End");
- chapter_text.set_color(mgl::Color(255, 255, 255, 255));
+ chapter_text.set_color(get_theme().text_color);
mgl::Rectangle chapter_text_background;
- chapter_text_background.set_color(mgl::Color(0, 0, 0, 150));
+ chapter_text_background.set_color(get_theme().shade_color);
mgl::vec2i texture_size;
mgl::vec2f texture_size_f;
@@ -4510,6 +4540,7 @@ namespace QuickMedia {
return;
}
+ thread_body->show_drop_shadow = false;
thread_body->set_items(std::move(result_items));
std::deque<int> comment_navigation_stack;
@@ -4596,6 +4627,7 @@ namespace QuickMedia {
std::string comment_to_post;
const int captcha_solution_text_height = 18 * get_config().scale * get_config().font_scale;
mgl::Text captcha_solution_text("", *FontLoader::get_font(FontLoader::FontType::LATIN_BOLD, captcha_solution_text_height));
+ captcha_solution_text.set_color(get_theme().text_color);
int solved_captcha_ttl = 0;
int64_t last_posted_time = time(nullptr);
int64_t seconds_until_post_again = 60; // TODO: Timeout for other imageboards
@@ -4617,8 +4649,8 @@ namespace QuickMedia {
bool redraw = true;
Entry comment_input("Press i to start writing a comment...", &rounded_rectangle_shader);
- comment_input.draw_background = false;
comment_input.set_editable(false);
+ comment_input.set_padding_scale(1.5f);
std::string selected_file_for_upload;
@@ -4692,9 +4724,6 @@ namespace QuickMedia {
return false;
};
- mgl::Rectangle comment_input_shade;
- comment_input_shade.set_color(get_theme().shade_color);
-
mgl::Sprite logo_sprite(&plugin_logo);
logo_sprite.set_scale(mgl::vec2f(0.8f * get_config().scale, 0.8f * get_config().scale));
mgl::vec2f logo_size(std::floor(plugin_logo.get_size().x * logo_sprite.get_scale().x), std::floor(plugin_logo.get_size().y * logo_sprite.get_scale().y));
@@ -5099,11 +5128,8 @@ namespace QuickMedia {
const float body_width = window_size.x;
- comment_input_shade.set_size(mgl::vec2f(window_size.x, chat_input_height_full));
- comment_input_shade.set_position(mgl::vec2f(0.0f, 0.0f));
-
- body_pos = mgl::vec2f(0.0f, comment_input_shade.get_size().y);
- body_size = mgl::vec2f(body_width, window_size.y - comment_input_shade.get_size().y);
+ body_pos = mgl::vec2f(0.0f, chat_input_height_full);
+ body_size = mgl::vec2f(body_width, window_size.y - chat_input_height_full);
logo_sprite.set_position(mgl::vec2f(logo_padding_x, chat_input_padding_y));
file_to_upload_sprite.set_position(logo_sprite.get_position() + mgl::vec2f(0.0f, logo_size.y + logo_file_to_upload_spacing));
@@ -5221,14 +5247,12 @@ namespace QuickMedia {
window.draw(load_sprite);
}
} else if(navigation_stage == NavigationStage::REPLYING) {
- window.draw(comment_input_shade);
window.draw(logo_sprite);
if(file_to_upload_thumbnail_data && file_to_upload_thumbnail_data->loading_state == LoadingState::APPLIED_TO_TEXTURE)
window.draw(file_to_upload_sprite);
comment_input.draw(window);
thread_body->draw(window, body_pos, body_size);
} else if(navigation_stage == NavigationStage::VIEWING_COMMENTS) {
- window.draw(comment_input_shade);
window.draw(logo_sprite);
if(file_to_upload_thumbnail_data && file_to_upload_thumbnail_data->loading_state == LoadingState::APPLIED_TO_TEXTURE)
window.draw(file_to_upload_sprite);
@@ -5239,12 +5263,12 @@ namespace QuickMedia {
if((navigation_stage == NavigationStage::REPLYING || navigation_stage == NavigationStage::VIEWING_COMMENTS) && has_post_timeout) {
int64_t time_left_until_post_again = seconds_until_post_again - (time(nullptr) - last_posted_time);
if(time_left_until_post_again > 0) {
- mgl::Rectangle time_left_bg(comment_input_shade.get_size());
- time_left_bg.set_position(comment_input_shade.get_position());
+ mgl::Rectangle time_left_bg(mgl::vec2f(window_size.x, chat_input_height_full));
time_left_bg.set_color(mgl::Color(0, 0, 0, 100));
window.draw(time_left_bg);
mgl::Text time_left_text("Wait " + std::to_string(time_left_until_post_again) + " second(s) before posting again", *FontLoader::get_font(FontLoader::FontType::LATIN, 18 * get_config().scale * get_config().font_scale));
+ time_left_text.set_color(get_theme().text_color);
time_left_text.set_position(time_left_bg.get_position() +
mgl::vec2f(
std::floor(time_left_bg.get_size().x * 0.5f - time_left_text.get_bounds().size.x * 0.5f),
@@ -5424,7 +5448,7 @@ namespace QuickMedia {
} else {
body_item->thumbnail_url = room->get_user_avatar_url(message->user);
if(body_item->thumbnail_url.empty()) {
- body_item->thumbnail_url = get_resource_loader_root_path() + std::string("images/no_avatar.png");
+ body_item->thumbnail_url = get_resource_loader_root_path() + get_no_avatar_image_path();
body_item->thumbnail_is_local = true;
}
body_item->thumbnail_mask_type = ThumbnailMaskType::CIRCLE;
@@ -5502,7 +5526,7 @@ namespace QuickMedia {
if(!is_visual_media_message_type(message->type)) {
body_item->thumbnail_url = room->get_user_avatar_url(message->user);
if(body_item->thumbnail_url.empty()) {
- body_item->thumbnail_url = get_resource_loader_root_path() + std::string("images/no_avatar.png");
+ body_item->thumbnail_url = get_resource_loader_root_path() + get_no_avatar_image_path();
body_item->thumbnail_is_local = true;
}
body_item->thumbnail_mask_type = ThumbnailMaskType::CIRCLE;
@@ -5527,17 +5551,19 @@ namespace QuickMedia {
// Year 2500.. The year that humanity is wiped out. Also we want our local message to appear at the bottom even if time is not synced with ntp, until it's replaced by the server
constexpr int64_t timestamp_provisional_event = 16755030000LL * 1000LL;
- const float room_name_text_height = std::floor(18.0f * get_config().scale * get_config().font_scale);
+ const float room_name_text_height = std::floor(get_config().matrix.room_name_font_size * get_config().scale * get_config().font_scale);
mgl::Text room_name_text("", *FontLoader::get_font(FontLoader::FontType::LATIN_BOLD, room_name_text_height));
+ room_name_text.set_color(get_theme().text_color);
const float room_name_text_padding_y = std::floor(10.0f * get_config().scale);
const float room_name_total_height = room_name_text_height + room_name_text_padding_y * 2.0f;
const float room_avatar_height = 32.0f;
- const float room_topic_text_height = std::floor(12.0f * get_config().scale * get_config().font_scale);
+ const float room_topic_text_height = std::floor(get_config().matrix.room_description_font_size * get_config().scale * get_config().font_scale);
mgl::Text room_topic_text("", *FontLoader::get_font(FontLoader::FontType::LATIN, room_topic_text_height));
room_topic_text.set_color(get_theme().faded_text_color);
- mgl::Text room_label(matrix_chat_page->rooms_page->get_title(), *FontLoader::get_font(FontLoader::FontType::LATIN_BOLD, 18 * get_config().scale * get_config().font_scale));
+ mgl::Text room_label(matrix_chat_page->rooms_page->get_title(), *FontLoader::get_font(FontLoader::FontType::LATIN_BOLD, get_config().matrix.room_name_font_size * get_config().scale * get_config().font_scale));
+ room_label.set_color(get_theme().text_color);
room_label.set_position(mgl::vec2f(15.0f, room_name_text_padding_y + 4.0f));
mgl::Sprite room_avatar_sprite;
@@ -5657,10 +5683,7 @@ namespace QuickMedia {
std::shared_ptr<BodyItem> currently_operating_on_item;
mgl::Text replying_to_text("Replying to:", *FontLoader::get_font(FontLoader::FontType::LATIN, 18 * get_config().scale * get_config().font_scale));
-
- mgl::Sprite logo_sprite(&plugin_logo);
- logo_sprite.set_scale(mgl::vec2f(0.8f * get_config().scale, 0.8f * get_config().scale));
- mgl::vec2f logo_size(plugin_logo.get_size().x * logo_sprite.get_scale().x, plugin_logo.get_size().y * logo_sprite.get_scale().y);
+ replying_to_text.set_color(get_theme().text_color);
bool draw_room_list = show_room_side_panel;
@@ -5677,7 +5700,7 @@ namespace QuickMedia {
if(original_message && !is_system_message_type(original_message->type)) {
body_item->thumbnail_url = current_room->get_user_avatar_url(original_message->user);
if(body_item->thumbnail_url.empty()) {
- body_item->thumbnail_url = get_resource_loader_root_path() + std::string("images/no_avatar.png");
+ body_item->thumbnail_url = get_resource_loader_root_path() + get_no_avatar_image_path();
body_item->thumbnail_is_local = true;
}
body_item->thumbnail_mask_type = ThumbnailMaskType::CIRCLE;
@@ -5917,8 +5940,8 @@ namespace QuickMedia {
redraw = true;
Entry chat_input("Press i to start writing a message...", &rounded_rectangle_shader);
- chat_input.draw_background = false;
chat_input.set_editable(false);
+ chat_input.set_padding_scale(1.5f);
struct ProvisionalMessage {
std::shared_ptr<BodyItem> body_item;
@@ -6482,7 +6505,6 @@ namespace QuickMedia {
float prev_chat_height = chat_input.get_height();
float chat_input_height_full = 0.0f;
- const float logo_padding_x = std::floor(10.0f * get_config().scale * get_config().spacing_scale);
const float chat_input_padding_x = std::floor(10.0f * get_config().scale * get_config().spacing_scale);
const float chat_input_padding_y = std::floor(10.0f * get_config().scale * get_config().spacing_scale);
@@ -7524,13 +7546,11 @@ namespace QuickMedia {
chat_input_shade.set_size(mgl::vec2f(window_size.x - body_pos.x, chat_input_height_full));
chat_input_shade.set_position(mgl::vec2f(body_pos.x, window_size.y - chat_input_shade.get_size().y));
- chat_input.set_max_width(window_size.x - (logo_padding_x + logo_size.x + chat_input_padding_x + logo_padding_x + body_pos.x));
- chat_input.set_position(vec2f_floor(body_pos.x + logo_padding_x + logo_size.x + chat_input_padding_x, window_size.y - chat_height - chat_input_padding_y));
+ chat_input.set_max_width(window_size.x - body_pos.x - chat_input_padding_x * 2.0f);
+ chat_input.set_position(vec2f_floor(body_pos.x + chat_input_padding_x, window_size.y - chat_height - chat_input_padding_y));
more_messages_below_rect.set_size(mgl::vec2f(chat_input_shade.get_size().x, gradient_height));
more_messages_below_rect.set_position(mgl::vec2f(chat_input_shade.get_position().x, std::floor(window_size.y - chat_input_height_full - gradient_height)));
-
- logo_sprite.set_position(mgl::vec2f(body_pos.x + logo_padding_x, std::floor(window_size.y - chat_input_height_full * 0.5f - logo_size.y * 0.5f)));
}
sync_data.messages.clear();
@@ -7813,7 +7833,6 @@ namespace QuickMedia {
if(selected_tab == MESSAGES_TAB_INDEX) {
//window.draw(chat_input_shade);
chat_input.draw(window); //chat_input.draw(window, false);
- window.draw(logo_sprite);
}
if(matrix && !matrix->is_initial_sync_finished()) {
@@ -8206,7 +8225,9 @@ namespace QuickMedia {
const float loading_bar_height = std::floor(20.0f * get_config().scale);
mgl::Text progress_text("0kb/Unknown", *FontLoader::get_font(FontLoader::FontType::LATIN, 20.0f * get_config().scale * get_config().font_scale));
+ progress_text.set_color(get_theme().text_color);
mgl::Text status_text("Downloading", *FontLoader::get_font(FontLoader::FontType::LATIN, 20.0f * get_config().scale * get_config().font_scale));
+ status_text.set_color(get_theme().text_color);
mgl::Text filename_text(filename.c_str(), *FontLoader::get_font(FontLoader::FontType::LATIN, 14.0f * get_config().scale * get_config().font_scale));
filename_text.set_color(get_theme().faded_text_color);
mgl::Text download_speed_text("0 bytes/s", *FontLoader::get_font(FontLoader::FontType::LATIN, 14.0f * get_config().scale * get_config().font_scale));
@@ -8404,11 +8425,13 @@ namespace QuickMedia {
save_button.set_background_color(get_theme().confirm_button_background_color);
mgl::Text file_name_label("File name:", *FontLoader::get_font(FontLoader::FontType::LATIN, 16.0f * get_config().scale * get_config().font_scale));
+ file_name_label.set_color(get_theme().text_color);
Entry file_name_entry("", &rounded_rectangle_shader);
file_name_entry.set_text(filename);
file_name_entry.set_single_line(true);
file_name_entry.set_editable(false);
+ file_name_entry.set_background_color(get_theme().selected_color);
mgl::Rectangle bottom_panel_background;
bottom_panel_background.set_color(get_theme().shade_color);