From 285bbe723777b53921075656258ee9fcb8c897c9 Mon Sep 17 00:00:00 2001 From: "Ignacio R. Morelle" Date: Mon, 3 Oct 2016 05:38:14 -0300 Subject: [PATCH] gui: Remove GUI1 filechooser This switches all existing callsites to using gui2::tfile_dialog, and fixes a build issue due to editor/controller/editor_controller.cpp relying on an indirect include from gui/dialogs/editor/custom_tod.hpp for a full type declaration. --- projectfiles/CodeBlocks/wesnoth.cbp | 4 - src/CMakeLists.txt | 2 - src/SConscript | 2 - src/editor/controller/editor_controller.cpp | 1 + src/editor/map/context_manager.cpp | 67 +++- src/filechooser.cpp | 303 ------------------ src/filechooser.hpp | 80 ----- src/gui/dialogs/editor/custom_tod.cpp | 14 +- src/gui/dialogs/editor/custom_tod.hpp | 1 - src/menu_events.cpp | 13 +- src/preferences_display.cpp | 20 +- src/widgets/file_menu.cpp | 325 -------------------- src/widgets/file_menu.hpp | 101 ------ 13 files changed, 84 insertions(+), 849 deletions(-) delete mode 100644 src/filechooser.cpp delete mode 100644 src/filechooser.hpp delete mode 100644 src/widgets/file_menu.cpp delete mode 100644 src/widgets/file_menu.hpp diff --git a/projectfiles/CodeBlocks/wesnoth.cbp b/projectfiles/CodeBlocks/wesnoth.cbp index 17a8992dfe0a..e62421407d39 100644 --- a/projectfiles/CodeBlocks/wesnoth.cbp +++ b/projectfiles/CodeBlocks/wesnoth.cbp @@ -322,8 +322,6 @@ - - @@ -1153,8 +1151,6 @@ - - diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8a081f3bdb7e..b98ab91eae85 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -726,7 +726,6 @@ set(wesnoth-main_SRC editor/map/context_manager.cpp fake_unit_manager.cpp fake_unit_ptr.cpp - filechooser.cpp filesystem_sdl.cpp game_initialization/flg_manager.cpp floating_textbox.cpp @@ -1026,7 +1025,6 @@ set(libwesnoth-game_STAT_SRC video.cpp theme.cpp widgets/button.cpp - widgets/file_menu.cpp widgets/label.cpp widgets/menu.cpp widgets/menu_style.cpp diff --git a/src/SConscript b/src/SConscript index 44f874c40fb2..bbdb4f682296 100644 --- a/src/SConscript +++ b/src/SConscript @@ -131,7 +131,6 @@ libwesnoth_sources = Split(""" utils/make_enum.cpp video.cpp widgets/button.cpp - widgets/file_menu.cpp widgets/label.cpp widgets/menu_style.cpp widgets/menu.cpp @@ -284,7 +283,6 @@ wesnoth_sources = Split(""" editor/toolkit/editor_toolkit.cpp fake_unit_manager.cpp fake_unit_ptr.cpp - filechooser.cpp filesystem_sdl.cpp floating_textbox.cpp formula/callable_objects.cpp diff --git a/src/editor/controller/editor_controller.cpp b/src/editor/controller/editor_controller.cpp index 62f6dbd25ce8..eac66014fe7e 100644 --- a/src/editor/controller/editor_controller.cpp +++ b/src/editor/controller/editor_controller.cpp @@ -42,6 +42,7 @@ #include "reports.hpp" #include "desktop/clipboard.hpp" +#include "floating_label.hpp" #include "game_board.hpp" #include "game_preferences.hpp" #include "gettext.hpp" diff --git a/src/editor/map/context_manager.cpp b/src/editor/map/context_manager.cpp index 76a0575d4e3b..11858f3a3823 100644 --- a/src/editor/map/context_manager.cpp +++ b/src/editor/map/context_manager.cpp @@ -19,7 +19,6 @@ #include "context_manager.hpp" #include "display.hpp" #include "filesystem.hpp" -#include "filechooser.hpp" #include "formula/string_utils.hpp" #include "game_board.hpp" #include "gettext.hpp" @@ -35,6 +34,7 @@ #include "gui/dialogs/editor/new_map.hpp" #include "gui/dialogs/editor/resize_map.hpp" #include "gui/dialogs/edit_text.hpp" +#include "gui/dialogs/file_dialog.hpp" #include "gui/dialogs/message.hpp" #include "gui/dialogs/transient_message.hpp" #include "gui/widgets/window.hpp" @@ -190,9 +190,14 @@ void context_manager::load_map_dialog(bool force_same_context /* = false */) if (fn.empty()) { fn = default_dir_; } - int res = dialogs::show_file_chooser_dialog(gui_.video(), fn, _("Choose a File to Open")); - if (res == 0) { - load_map(fn, !force_same_context); + + gui2::tfile_dialog dlg; + + dlg.set_title(_("Choose a File to Open")) + .set_path(fn); + + if(dlg.show(gui_.video())) { + load_map(dlg.path(), !force_same_context); } } @@ -444,10 +449,15 @@ void context_manager::apply_mask_dialog() if (fn.empty()) { fn = default_dir_; } - int res = dialogs::show_file_chooser_dialog(gui_.video(), fn, _("Choose a Mask to Apply")); - if (res == 0) { + + gui2::tfile_dialog dlg; + + dlg.set_title(_("Choose a Mask to Apply")) + .set_path(fn); + + if(dlg.show(gui_.video())) { try { - map_context mask(game_config_, fn, gui_); + map_context mask(game_config_, dlg.path(), gui_); editor_action_apply_mask a(mask.get_map()); perform_refresh(a); } catch (editor_map_load_exception& e) { @@ -481,10 +491,15 @@ void context_manager::create_mask_to_dialog() if (fn.empty()) { fn = default_dir_; } - int res = dialogs::show_file_chooser_dialog(gui_.video(), fn, _("Choose Target Map")); - if (res == 0) { + + gui2::tfile_dialog dlg; + + dlg.set_title(_("Choose Target Map")) + .set_path(fn); + + if(dlg.show(gui_.video())) { try { - map_context map(game_config_, fn, gui_); + map_context map(game_config_, dlg.path(), gui_); editor_action_create_mask a(map.get_map()); perform_refresh(a); } catch (editor_map_load_exception& e) { @@ -605,10 +620,20 @@ void context_manager::save_map_as_dialog() int overwrite_res = 1; do { input_name = old_input_name; - int res = dialogs::show_file_chooser_dialog_save(gui_.video(), input_name, _("Save the Map As"), ".map"); - if (res == 0) { + + gui2::tfile_dialog dlg; + + dlg.set_title(_("Save the Map As")) + .set_ok_label(_("Save")) + .set_save_mode(true) + .set_path(input_name) + .set_extension(".map"); + + if(dlg.show(gui_.video())) { + input_name = dlg.path(); + if (filesystem::file_exists(input_name)) { - res = gui2::show_message(gui_.video(), "", + int res = gui2::show_message(gui_.video(), "", _("The file already exists. Do you want to overwrite it?"), gui2::tmessage::yes_no_buttons); overwrite_res = gui2::twindow::CANCEL == res ? 1 : 0; } else { @@ -633,10 +658,20 @@ void context_manager::save_scenario_as_dialog() int overwrite_res = 1; do { input_name = old_input_name; - int res = dialogs::show_file_chooser_dialog_save(gui_.video(), input_name, _("Save the Scenario As"), ".cfg"); - if (res == 0) { + + gui2::tfile_dialog dlg; + + dlg.set_title(_("Save the Scenario As")) + .set_ok_label(_("Save")) + .set_save_mode(true) + .set_path(input_name) + .set_extension(".cfg"); + + if(dlg.show(gui_.video())) { + input_name = dlg.path(); + if (filesystem::file_exists(input_name)) { - res = gui2::show_message(gui_.video(), "", + int res = gui2::show_message(gui_.video(), "", _("The file already exists. Do you want to overwrite it?"), gui2::tmessage::yes_no_buttons); overwrite_res = gui2::twindow::CANCEL == res ? 1 : 0; } else { diff --git a/src/filechooser.cpp b/src/filechooser.cpp deleted file mode 100644 index 3420a4eb0882..000000000000 --- a/src/filechooser.cpp +++ /dev/null @@ -1,303 +0,0 @@ -/* - Copyright (C) 2003 - 2016 by David White - Part of the Battle for Wesnoth Project http://www.wesnoth.org/ - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY. - - See the COPYING file for more details. -*/ - -#include "global.hpp" - -#define GETTEXT_DOMAIN "wesnoth-lib" - -#include "video.hpp" -#include "gettext.hpp" -#include "gui/dialogs/file_dialog.hpp" -#include "gui/dialogs/folder_create.hpp" -#include "gui/dialogs/transient_message.hpp" -#include "filechooser.hpp" -#include "widgets/file_menu.hpp" - - -namespace dialogs -{ - -int show_file_chooser_dialog(CVideo& video, std::string &filename, - std::string const &title, bool show_directory_buttons, - const std::string& type_a_head, - int xloc, int yloc) -{ - if(true) { - gui2::tfile_dialog dlg; - dlg.set_path(filename).set_title(title).set_read_only(!show_directory_buttons).set_filename(type_a_head); - if(dlg.show(video)) { - filename = dlg.path(); - std::cerr << filename << '\n'; - return 0; - } - - return -1; - } - - file_dialog d(video, filename, title, "", show_directory_buttons); - if (!type_a_head.empty()) - d.select_file(type_a_head); - if(d.show(xloc, yloc) >= 0) { - filename = d.get_choice(); - } - return d.result(); -} - -int show_file_chooser_dialog_save(CVideo& video, std::string &filename, - std::string const &title, - const std::string& default_file_name, - bool show_directory_buttons, - const std::string& type_a_head, - int xloc, int yloc) -{ - if(true) { - gui2::tfile_dialog dlg; - dlg.set_path(filename).set_title(title).set_read_only(!show_directory_buttons).set_filename(type_a_head).set_save_mode(true); - if(dlg.show(video)) { - filename = dlg.path(); - std::cerr << filename << '\n'; - return 0; - } - - return -1; - } - - file_dialog d(video, filename, title, default_file_name, show_directory_buttons); - d.set_autocomplete(false); - if (!type_a_head.empty()) - d.select_file(type_a_head); - if(d.show(xloc, yloc) >= 0) { - filename = d.get_choice(); - } - return d.result(); -} - -file_dialog::file_dialog(CVideo& video, const std::string& file_path, - const std::string& title, const std::string& default_file_name, - bool show_directory_buttons) : - gui::dialog(video, title, file_path, gui::OK_CANCEL), - show_directory_buttons_(show_directory_buttons), - files_list_(nullptr), - last_selection_(-1), - last_textbox_text_(), - chosen_file_(".."), - autocomplete_(true) -{ - files_list_ = new gui::file_menu(video, file_path); - const unsigned file_list_height = (video.gety() / 2); - const unsigned file_list_width = std::min(files_list_->width(), (video.gety() / 4)); - files_list_->set_measurements(file_list_width, file_list_height); - files_list_->set_max_height(file_list_height); - set_menu(files_list_); - default_file_name_ = default_file_name; - get_message().set_text(format_dirname(files_list_->get_directory())); - set_textbox(_("File: "), format_filename(file_path), 100); - if (show_directory_buttons_) - { - add_button( new gui::dialog_button(video, _("Delete File"), - gui::button::TYPE_PRESS, gui::DELETE_ITEM), dialog::BUTTON_EXTRA); - add_button( new gui::dialog_button(video, _("New Folder"), - gui::button::TYPE_PRESS, gui::CREATE_ITEM), dialog::BUTTON_EXTRA_LEFT); - } -} - -gui::dialog::dimension_measurements file_dialog::layout(int xloc, int yloc) -{ - gui::dialog::dimension_measurements dim = dialog::layout(xloc, yloc); - - //shift the menu up - unsigned y_shift = dim.menu_y - std::min(dim.label_y, dim.textbox.y); - int y_max = dim.menu_y + get_menu().height(); - dim.menu_y -= y_shift; - - //shift the extra buttons up - if (show_directory_buttons_) - { - std::map >::iterator i; - for(i = dim.buttons.begin(); i != dim.buttons.end(); ++i) - { - const int btn_h = i->first->height(); - int& btn_y = i->second.second; - y_max = std::max(y_max, btn_y + btn_h); - btn_y -= y_shift; - } - } - - //shift the textbox down - const int textbox_bottom_y = dim.textbox.y + get_textbox().height(); - const int label_bottom_y = dim.label_y + get_textbox().get_label()->height(); - y_shift = y_max - std::max(textbox_bottom_y, label_bottom_y); - dim.textbox.y += y_shift; - dim.label_y += y_shift; - - set_layout(dim); - return dim; -} - -std::string file_dialog::unformat_filename(const std::string& filename) const -{ - return files_list_->add_path(files_list_->get_directory(), filename); -} - -std::string file_dialog::format_filename(const std::string& filename) const -{ - if(files_list_->is_directory(filename)) { - return default_file_name_; - } - std::string::size_type last_delim = filename.find_last_of(gui::file_menu::path_delim); - if(last_delim != std::string::npos) { - return filename.substr(last_delim + 1); - } - return filename; -} - -void file_dialog::select_file(const std::string& file) -{ - chosen_file_ = file; - get_textbox().set_text(format_filename(chosen_file_)); - files_list_->select_file(file); -} - -std::string file_dialog::format_dirname(const std::string& dirname) const -{ - int menu_font_size = font::SIZE_NORMAL; - std::string tmp = files_list_->strip_last_delim(dirname); - - // If the text get out of bounds, make it shorter; - // Take the prefix of the dir (ie. /home/ or c:/) put three dot's behind it - // and shorten the rest of the dir: - // /home/.../rest_of_the_dir - // Note that this is a dirty hack and fundamental changes in the widget subdir - // needs to be made... - if(font::line_width(tmp, menu_font_size) <= 390) { - return tmp; - } - static const int filler_width = font::line_width("...", menu_font_size); - - // Find the first part of the dir - std::string dir_prefix = "/"; - std::string::size_type pos_first = 0; - if((pos_first = tmp.find_first_of("\\/", 1)) != std::string::npos) - { - dir_prefix = tmp.substr(0, pos_first) + "/..."; - tmp = tmp.substr(pos_first); - } - - static const int prefix_width = font::line_width(dir_prefix, menu_font_size); - - // Try to cut off text at the '/' or '\' tokens - while(font::line_width(tmp, menu_font_size) + filler_width + prefix_width > 390 && tmp.length() != 0) - { - std::string::size_type pos; - if((pos = tmp.find_first_of("\\/", 1)) != std::string::npos) - tmp = tmp.substr(pos, tmp.length()); - else - tmp = tmp.substr(1, tmp.length()); - } - - return dir_prefix + tmp; -} - -void file_dialog::set_save_text(const std::string& filename) -{ - const std::string fn = format_filename(filename); - const size_t filename_dot = fn.find_last_of('.'); - get_textbox().set_text(fn); - get_textbox().set_selection(0, filename_dot != std::string::npos ? filename_dot : fn.length()); - get_textbox().set_cursor_pos(0); -} - -void file_dialog::action(gui::dialog_process_info &dp_info) -{ - if(result() == gui::CLOSE_DIALOG) - return; - - //handle "delete item" requests - if(result() == gui::DELETE_ITEM) - { - if(!chosen_file_.empty()) - { - if(files_list_->delete_chosen_file() == -1) { - gui2::show_transient_error_message(get_video() - , _("Deletion of the file failed.")); - dp_info.clear_buttons(); - } else { - dp_info.first_time = true; - } - } - set_result(gui::CONTINUE_DIALOG); - } - //handle "create item" requests - else if(result() == gui::CREATE_ITEM) - { - std::string new_dir_name = ""; - if(gui2::tfolder_create::execute(new_dir_name, get_video())) - { - if( !files_list_->make_directory(new_dir_name) ) { - gui2::show_transient_error_message(get_video() - , _("Creation of the directory failed.")); - } else { - dp_info.first_time = true; - } - } - dp_info.clear_buttons(); - set_result(gui::CONTINUE_DIALOG); - } - - //update the chosen file - if((dp_info.selection != last_selection_ - || dp_info.first_time - || dp_info.double_clicked) - && (!files_list_->type_a_head() - || dp_info.new_left_button)) - { - files_list_->reset_type_a_head(); - - chosen_file_ = files_list_->get_choice(); - set_save_text(chosen_file_); - last_selection_ = (dp_info.double_clicked) ? -1 : dp_info.selection; - last_textbox_text_ = textbox_text(); - } - else if(textbox_text() != last_textbox_text_) - { - chosen_file_ = unformat_filename(textbox_text()); - last_textbox_text_ = textbox_text(); - - // Do type-a-head search in listbox - if (autocomplete_) { - files_list_->select_file(textbox_text()); - } - } - - if(result() >=0) { - //if a directory has been chosen, enter it - if(files_list_->is_directory(chosen_file_)) - { - files_list_->change_directory(chosen_file_); - get_message().set_text(format_dirname(files_list_->get_directory())); - - //reset the chosen file - chosen_file_ = ".."; - get_textbox().set_text(format_filename(chosen_file_)); - set_result(gui::CONTINUE_DIALOG); - } - //if a file has been chosen, return button index "Ok" - else - { - set_result(0); - } - } -} - -} //end namespace dialogs diff --git a/src/filechooser.hpp b/src/filechooser.hpp deleted file mode 100644 index dfd732ac8919..000000000000 --- a/src/filechooser.hpp +++ /dev/null @@ -1,80 +0,0 @@ -/* - Copyright (C) 2003 - 2016 by David White - Part of the Battle for Wesnoth Project http://www.wesnoth.org/ - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY. - - See the COPYING file for more details. -*/ -#ifndef FILE_CHOOSER_H_INCLUDED -#define FILE_CHOOSER_H_INCLUDED - -class config; -class CVideo; - -#include "construct_dialog.hpp" - -namespace gui -{ - class file_menu; -} - -namespace dialogs -{ - -class file_dialog : public gui::dialog { -public: - file_dialog(CVideo& video, const std::string& file_path, const std::string& title, const std::string& default_file_name, bool show_directory_buttons); - - virtual gui::dialog::dimension_measurements layout(int xloc=-1, int yloc=-1); - - /// Return the chosen file. - std::string get_choice() const { return chosen_file_; } - - void select_file(const std::string& file); - - void set_autocomplete(bool value) { autocomplete_ = value; } - -protected: - void action(gui::dialog_process_info &dp_info); - void set_save_text(const std::string& filename); - std::string unformat_filename(const std::string& filename) const; - std::string format_filename(const std::string& filename) const; - std::string format_dirname(const std::string& dirname) const; - -private: - bool show_directory_buttons_; - gui::file_menu *files_list_; - int last_selection_; - std::string last_textbox_text_; - std::string chosen_file_; - std::string default_file_name_; - bool autocomplete_; -}; - -/// Show a dialog where the user can navigate through files and select a -/// file. The filename is used as a starting point in the navigation and -/// contains the chosen file when the function returns. Return the -/// index of the button pressed, or -1 if the dialog was canceled -/// through keypress. -int show_file_chooser_dialog(CVideo& video, std::string &filename, - std::string const &title, bool show_directory_buttons = true, - const std::string& file_to_search = "", - int xloc = -1, int yloc = -1); - -/// Show a filechooser dialog in a "save" mode, that is, without relying -/// on autocomplete to allow saving under any filename -int show_file_chooser_dialog_save(CVideo& video, std::string &filename, - std::string const &title, - const std::string& default_file_name = "", - bool show_directory_buttons = true, - const std::string& file_to_search = "", - int xloc = -1, int yloc = -1); -} // end of dialogs namespace - -#endif diff --git a/src/gui/dialogs/editor/custom_tod.cpp b/src/gui/dialogs/editor/custom_tod.cpp index f6674db8e0e9..ce3c447b5e97 100644 --- a/src/gui/dialogs/editor/custom_tod.cpp +++ b/src/gui/dialogs/editor/custom_tod.cpp @@ -17,10 +17,10 @@ #include "gui/dialogs/editor/custom_tod.hpp" #include "filesystem.hpp" -#include "filechooser.hpp" #include "editor/editor_preferences.hpp" #include "editor/editor_display.hpp" #include "gui/auxiliary/field.hpp" +#include "gui/dialogs/file_dialog.hpp" #include "gui/dialogs/helper.hpp" #include "gui/widgets/button.hpp" #include "gui/widgets/label.hpp" @@ -114,9 +114,15 @@ void tcustom_tod::select_file(const std::string& filename, dn = default_dir; } - int res = dialogs::show_file_chooser_dialog( - display_.video(), dn, _("Choose File")); - if(res == 0) { + gui2::tfile_dialog dlg; + + dlg.set_title(_("Choose File")) + .set_ok_label(_("Select")) + .set_path(dn); + + if(dlg.show(display_.video())) { + dn = dlg.path(); + if(attribute == "image") { tods_[current_tod_].image = dn; } else if(attribute == "mask") { diff --git a/src/gui/dialogs/editor/custom_tod.hpp b/src/gui/dialogs/editor/custom_tod.hpp index edc647509c82..b2b7579c1197 100644 --- a/src/gui/dialogs/editor/custom_tod.hpp +++ b/src/gui/dialogs/editor/custom_tod.hpp @@ -15,7 +15,6 @@ #ifndef GUI_DIALOGS_CUSTOM_TOD_HPP_INCLUDED #define GUI_DIALOGS_CUSTOM_TOD_HPP_INCLUDED -#include "filechooser.hpp" #include "time_of_day.hpp" #include "gui/widgets/image.hpp" #include "gui/widgets/text_box.hpp" diff --git a/src/menu_events.cpp b/src/menu_events.cpp index ab7f8bd1d808..c8a90109baa2 100644 --- a/src/menu_events.cpp +++ b/src/menu_events.cpp @@ -30,7 +30,6 @@ #include "chat_command_handler.hpp" #include "config_assign.hpp" #include "display_chat_manager.hpp" -#include "filechooser.hpp" #include "formatter.hpp" #include "formula/string_utils.hpp" #include "game_board.hpp" @@ -43,6 +42,7 @@ #include "gettext.hpp" #include "gui/dialogs/chat_log.hpp" #include "gui/dialogs/edit_label.hpp" +#include "gui/dialogs/file_dialog.hpp" #include "gui/dialogs/label_settings.hpp" #include "gui/dialogs/message.hpp" #include "gui/dialogs/transient_message.hpp" @@ -166,8 +166,15 @@ void menu_handler::save_map() int res = 0; int overwrite = 1; do { - res = dialogs::show_file_chooser_dialog_save(gui_->video(), input_name, _("Save the Map As"), ".map"); - if (res == 0) { + gui2::tfile_dialog dlg; + + dlg.set_title(_("Save the Map As")) + .set_save_mode(true) + .set_path(input_name) + .set_extension(".map"); + + if(dlg.show(gui_->video())) { + input_name = dlg.path(); if (filesystem::file_exists(input_name)) { const int res = gui2::show_message((*gui_).video(), "", _("The map already exists. Do you want to overwrite it?"), gui2::tmessage::yes_no_buttons); diff --git a/src/preferences_display.cpp b/src/preferences_display.cpp index 1a57aabf09ae..c05f1c3e3465 100644 --- a/src/preferences_display.cpp +++ b/src/preferences_display.cpp @@ -23,12 +23,12 @@ #include "preferences_display.hpp" #include "display.hpp" -#include "filechooser.hpp" #include "filesystem.hpp" #include "formatter.hpp" #include "formula/string_utils.hpp" #include "game_preferences.hpp" #include "gettext.hpp" +#include "gui/dialogs/file_dialog.hpp" #include "gui/dialogs/message.hpp" #include "gui/dialogs/preferences_dialog.hpp" #include "gui/dialogs/theme_list.hpp" @@ -164,16 +164,20 @@ void show_wesnothd_server_search(CVideo& video) path = old_path; } - utils::string_map symbols; + const std::string msg = vgettext( + "The $filename server application provides multiplayer server functionality and is required for hosting local network games. It will normally be found in the same folder where the game executable is installed.", {{"filename", filename}}); - symbols["filename"] = filename; + gui2::tfile_dialog dlg; - const std::string title = utils::interpolate_variables_into_string( - _("Find $filename server binary") - , &symbols); + dlg.set_title(_("Find Server Application")) + .set_message(msg) + .set_ok_label(_("Select")) + .set_read_only(true) + .set_filename(filename) + .set_path(path); - int res = dialogs::show_file_chooser_dialog(video, path, title, false, filename); - if (res == 0) { + if(dlg.show(video)) { + path = dlg.path(); preferences::set_mp_server_program_name(path); } } diff --git a/src/widgets/file_menu.cpp b/src/widgets/file_menu.cpp deleted file mode 100644 index 0fed9da93507..000000000000 --- a/src/widgets/file_menu.cpp +++ /dev/null @@ -1,325 +0,0 @@ -/* - Copyright (C) 2003 - 2016 by David White - Part of the Battle for Wesnoth Project http://www.wesnoth.org/ - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY. - - See the COPYING file for more details. -*/ - -#include "global.hpp" - -#define GETTEXT_DOMAIN "wesnoth-lib" - -#include "filesystem.hpp" -#include "marked-up_text.hpp" -#include "wml_separators.hpp" -#include "widgets/file_menu.hpp" - - -namespace { - std::vector empty_string_vector; - - - std::string uniform_path(const std::string& path) - { -#ifdef _WIN32 - std::string res = path; - std::replace(res.begin(), res.end(), '/', '\\'); - return res; -#else - return path; -#endif - } - -} - -namespace gui { - -static const std::string dir_picture("misc/folder-icon.png"); -static const std::string path_up(".."); -#ifdef _WIN32 -const char file_menu::path_delim('\\'); -#else -const char file_menu::path_delim('/'); -#endif - -file_menu::file_menu(CVideo &disp, std::string start_file) - : menu(disp, empty_string_vector, false), - current_dir_(uniform_path(get_path(start_file))), - chosen_file_(start_file), last_selection_(-1), - type_a_head_(-1) -{ - // If the start file is not a file or directory, use the root. - if((!filesystem::file_exists(chosen_file_) && !::filesystem::is_directory(chosen_file_)) - || !::filesystem::is_directory(current_dir_)) { - current_dir_ = path_delim; - chosen_file_ = current_dir_; - } - // FIXME: quick hack - // on a high-res screen the initial max_items_onscreen is based - // on .66 of y dimension, eg. 17 menu items, exceeding the - // starting box which can only take 13 or so: force it to be smaller -// set_measurements(400, 384); - update_file_lists(); -} - -void file_menu::display_current_files() { - std::vector to_show; - if (!is_root(current_dir_)) { - to_show.push_back(path_up); - } - std::vector::iterator it; - for (it = dirs_in_current_dir_.begin(); it != dirs_in_current_dir_.end(); ++it) { - // Add an image to show that these are directories. - std::stringstream ss; - ss << font::IMAGE << dir_picture << COLUMN_SEPARATOR << font::NULL_MARKUP << *it; - to_show.push_back(ss.str()); - } - for (it = files_in_current_dir_.begin(); it != files_in_current_dir_.end(); ++it) { - const std::string display_string = COLUMN_SEPARATOR + std::string(1, font::NULL_MARKUP) + *it; - to_show.push_back(display_string); - } - const int menu_font_size = font::SIZE_NORMAL; // Known from menu.cpp. - for (it = to_show.begin(); it != to_show.end(); ++it) { - // Make sure that all lines fit. - // Guess the width of the scrollbar to be 30 since it is not accessible from here. - // -25 to compensate for the picture column. - if (get_max_width() != -1) { - while(font::line_width(*it, menu_font_size) > width() - 30 - 25) { - //we cannot decrease its size if its empty. - assert(!(*it).empty()); - (*it).resize((*it).size() - 1); - } - } - } - set_items(to_show); -} - -int file_menu::delete_chosen_file() { - const int ret = filesystem::delete_file(chosen_file_); - if (ret == -1) { - // gui2::show_transient_message(disp_.video(), "", _("Deletion of the file failed.")); - } - else { - last_selection_ = -1; - update_file_lists(); - chosen_file_ = current_dir_; - } - return ret; -} - -bool file_menu::make_directory(const std::string& subdir_name) { - bool ret = ::filesystem::make_directory(add_path(current_dir_, subdir_name)); - if (ret == false) { - // gui2::show_transient_message(disp_.video(), "", _("Creation of the directory failed.")); - } - else { - last_selection_ = -1; - update_file_lists(); - chosen_file_ = current_dir_; - } - return ret; -} - -void file_menu::handle_event(const SDL_Event& event) { - menu::handle_event(event); - - if(selection() != last_selection_ - && !type_a_head()) { - type_a_head_ = -1; - entry_selected(selection()); - last_selection_ = selection(); - } -} - -void file_menu::entry_selected(const unsigned entry) { - const int entry_index = entry - (is_root(current_dir_) ? 0 : 1); - if (entry_index >= 0) { - std::string selected; - if(static_cast(entry_index) < dirs_in_current_dir_.size()) { - const int dir_index = entry_index; - selected = dirs_in_current_dir_[dir_index]; - } - else { - const int file_index = entry_index - dirs_in_current_dir_.size(); - if(file_index >= 0 && size_t(file_index) < files_in_current_dir_.size()) { - selected = files_in_current_dir_[file_index]; - } else { - return; - } - } - chosen_file_ = add_path(current_dir_, selected); - } else { - chosen_file_ = path_up; - } -} - -bool file_menu::is_directory(const std::string& fname) const { - if(fname == path_up) - return true; - return ::filesystem::is_directory(fname); -} - -void file_menu::change_directory(const std::string& path) { - if(path == path_up) - { - // Parent dir wanted. - if (!is_root(current_dir_)) { - current_dir_ = get_path_up(current_dir_); - last_selection_ = -1; - update_file_lists(); - chosen_file_ = current_dir_; - } - else { - return; - } - - } else { - current_dir_ = uniform_path(path); - chosen_file_ = current_dir_; - last_selection_ = -1; - update_file_lists(); - } -} - -std::string file_menu::get_choice() const { - return chosen_file_; -} - - -std::string file_menu::get_path(const std::string& file_or_dir) const { - std::string res_path = file_or_dir; - if (!::filesystem::is_directory(file_or_dir)) { - size_t index = file_or_dir.find_last_of(path_delim); - if (index != std::string::npos) { - res_path = file_or_dir.substr(0, index); - } - } - return res_path; -} - -std::string file_menu::get_path_up(const std::string& path, const unsigned levels) const { - std::string curr_path = get_path(path); - for (unsigned i = 0; i < levels; i++) { - if (is_root(curr_path)) { - break; - } - curr_path = strip_last_delim(curr_path); - size_t index = curr_path.find_last_of(path_delim); - if (index != std::string::npos) { - curr_path = curr_path.substr(0, index); - } - else { - break; - } - } - if (curr_path.empty()) { - // The root was reached, represent this as one delimiter only. - curr_path = path_delim; - } -#ifdef _WIN32 - if (curr_path.size() == 2 && curr_path[1] == ':') curr_path += path_delim; -#endif - return curr_path; -} - -std::string file_menu::strip_last_delim(const std::string& path) const { - std::string res_string = path; - if (path[path.size() - 1] == path_delim) { - res_string = path.substr(0, path.size() - 1); - } - return res_string; -} - -bool file_menu::is_root(const std::string& path) const { - return path.empty() || (path.size() == 1 && path[0] == path_delim); -} - -std::string file_menu::add_path(const std::string& path, const std::string& to_add) const -{ - std::string joined_path = strip_last_delim(path); - if (!to_add.empty()) { - if (to_add == path_up) { - return get_path_up(path); - } -#ifdef _WIN32 - else if (to_add.size() > 1 && to_add[1] == ':') { - joined_path = to_add; - } -#else - else if (to_add[0] == path_delim) { - joined_path = to_add; - } -#endif - else { - joined_path += "/" + to_add; - } - } - return joined_path; -} - -struct match_begin { - match_begin(const std::string& begin) : begin_(begin) - {} - - bool operator()(const std::string& o) const - { - return o.compare(0, begin_.size(), begin_) == 0; - } - - private: - const std::string& begin_; -}; - -bool file_menu::type_a_head() const -{ - return selection() == type_a_head_; -} - -void file_menu::reset_type_a_head() -{ - if (type_a_head_ >= 0) - { - entry_selected(type_a_head_); - last_selection_ = type_a_head_; - } - type_a_head_ = -1; -} - -void file_menu::select_file(const std::string& begin_of_filename) -{ - size_t additional_index = is_root(current_dir_) ? 0 : 1; - std::vector::iterator it; - it = std::find_if(dirs_in_current_dir_.begin(), dirs_in_current_dir_.end(), match_begin(begin_of_filename)); - if (it != dirs_in_current_dir_.end()) - { - type_a_head_ = additional_index + it - dirs_in_current_dir_.begin(); - move_selection(type_a_head_); - return; - } - additional_index += dirs_in_current_dir_.size(); - - it = std::find_if(files_in_current_dir_.begin(), files_in_current_dir_.end(), match_begin(begin_of_filename)); - if (it != files_in_current_dir_.end()) - { - type_a_head_ = it - files_in_current_dir_.begin() + additional_index; - move_selection(type_a_head_); - return; - } -} - -void file_menu::update_file_lists() { - files_in_current_dir_.clear(); - dirs_in_current_dir_.clear(); - filesystem::get_files_in_dir(current_dir_, &files_in_current_dir_, - &dirs_in_current_dir_, filesystem::FILE_NAME_ONLY); - display_current_files(); -} - -} diff --git a/src/widgets/file_menu.hpp b/src/widgets/file_menu.hpp deleted file mode 100644 index edaf7bef9ece..000000000000 --- a/src/widgets/file_menu.hpp +++ /dev/null @@ -1,101 +0,0 @@ -/* - Copyright (C) 2003 - 2016 by David White - Part of the Battle for Wesnoth Project http://www.wesnoth.org/ - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY. - - See the COPYING file for more details. -*/ - -#ifndef FILE_MENU_H_INCLUDED -#define FILE_MENU_H_INCLUDED - -#include "construct_dialog.hpp" - -namespace gui { - - -/// A widget where the user may navigate through directories and choose -/// a file. -class file_menu : public menu { -public: - //Static members - static const char path_delim; - - /// Initialize the file menu. start_file is the file that will be - /// selected initially. The current directory will be - /// the one the file is in. - file_menu(CVideo &disp, std::string start_file=""); - - /// Return the chosen file. - std::string get_choice() const; - - int delete_chosen_file(); - - std::string get_directory() const { return current_dir_; } - - /// Return path with to_add added, using a path delimiter between them. - std::string add_path(const std::string& path, const std::string& to_add) const; - - /// Return the string with the last path delimiter removed, if one - /// was there. - std::string strip_last_delim(const std::string& path) const; - - bool is_directory(const std::string& fname) const; - - void change_directory(const std::string& path); - bool make_directory(const std::string& subdir_name); - - /** - * Selects file (type-a-head search) - **/ - void select_file(const std::string& begin_of_filename); - - bool type_a_head() const; - void reset_type_a_head(); - -protected: - void handle_event(const SDL_Event& event); - -private: - /// If file_or_dir is a file, return the directory the file is in, - /// if it is a directory, return the directory name. If no path - /// delimiters could be found, return the unchanged argument. - std::string get_path(const std::string& file_or_dir) const; - - /// Return the path that is the specified number of levels up from - /// the path. If the movement could not proceed due to being at the - /// root or having an invalid argument, return the path that the - /// movement ended on. - std::string get_path_up(const std::string& path, - const unsigned levels=1) const; - - - /// Return true if the path is the root of the filesystem. - bool is_root(const std::string& path) const; - - /// Show the files in the current directory. - void display_current_files(); - - /// Updated the locally maintained lists of files and directories in - /// the current directory. - void update_file_lists(); - - /// Set the textbox to reflect the selected file. - void entry_selected(const unsigned entry); - - std::string current_dir_; - std::string chosen_file_; - std::vector files_in_current_dir_, dirs_in_current_dir_; - int last_selection_; - int type_a_head_; -}; - -} //end namespace gui - -#endif // FILE_MENU_H_INCLUDED