Stub implementation of persistence data management dialog.

To access, in ingame console type 'debug' and then 'manage'.
This commit is contained in:
Jody Northup 2010-07-02 22:59:05 +00:00
parent 8b4ee2a399
commit bc4fab5ab6
5 changed files with 737 additions and 0 deletions

View file

@ -0,0 +1,370 @@
#textdomain wesnoth-lib
###
### Definition of the window to ask for the savegame filename
###
[window]
id = "data_manage"
description = "Persistence data management dialog."
[resolution]
definition = "default"
automatic_placement = "true"
vertical_placement = "top"
horizontal_placement = "center"
[linked_group]
id = "filename"
fixed_width = "true"
[/linked_group]
[linked_group]
id = "date"
fixed_width = "true"
[/linked_group]
[grid]
[row]
grow_factor = 0
[column]
grow_factor = 1
border = "all"
border_size = 5
horizontal_alignment = "left"
[label]
id = "lblTitle"
definition = "title"
label = _ "Manage Data"
[/label]
[/column]
[/row]
[row]
grow_factor = 1
[column]
grow_factor = 1
horizontal_grow = "true"
[grid]
[row]
grow_factor = 1
[column]
grow_factor = 1
border = "all"
border_size = 5
horizontal_grow = "true"
[grid]
[row]
[column]
horizontal_alignment = "left"
border = "bottom"
border_size = 10
[label]
id = "lblChoose"
definition = "default"
label = _ "Choose the game to load"
[/label]
[/column]
[/row]
[row]
[column]
horizontal_alignment = "left"
[grid]
[row]
[column]
border = "right"
border_size = 10
vertical_alignment = "center"
[label]
id = "lblFilter"
definition = "default"
label = _ "Filter"
[/label]
[/column]
[column]
border = "bottom"
border_size = 10
[text_box]
id = "txtFilter"
definition = "default"
label = ""
[/text_box]
[/column]
[/row]
[/grid]
[/column]
[/row]
[row]
[column]
grow_factor = 1
horizontal_grow = "true"
border = "bottom"
border_size = 10
[listbox]
id = "persist_list"
definition = "default"
[header]
[row]
[column]
grow_factor = 1
horizontal_grow = "true"
[label]
id = "filename"
definition = "default"
linked_group = "filename"
label = _ "Name"
[/label]
[/column]
[column]
grow_factor = 1
horizontal_grow = "true"
[label]
id = "date"
definition = "default"
linked_group = "date"
label = _ "Date"
[/label]
[/column]
[/row]
[/header]
[list_definition]
[row]
[column]
[toggle_panel]
definition = "default"
return_value_id = "ok"
[grid]
[row]
[column]
grow_factor = 1
horizontal_grow = "true"
border = "bottom"
border_size = 5
[label]
id = "filename"
definition = "default"
linked_group = "filename"
[/label]
[/column]
[column]
grow_factor = 1
horizontal_grow = "true"
border = "bottom"
border_size = 5
[label]
id = "date"
definition = "default"
linked_group = "date"
[/label]
[/column]
[/row]
[/grid]
[/toggle_panel]
[/column]
[/row]
[/list_definition]
[/listbox]
[/column]
[/row]
[row]
[column]
[grid]
[row]
[column]
horizontal_alignment = "left"
border = "bottom"
border_size = 10
[button]
id = "clear"
definition = "default"
size_text = _ "Clear"
label = _ "Clear"
[/button]
[/column]
[column]
grow_factor = 1
horizontal_grow = "true"
border = "bottom"
border_size = 10
[button]
id = "restore"
definition = "default"
size_text = _ "Restore"
label = _ "Restore"
[/button]
[/column]
[column]
grow_factor = 1
horizontal_grow = "true"
border = "bottom"
border_size = 10
[button]
id = "backup"
definition = "default"
size_text = _ "Backup"
label = _ "Backup"
[/button]
[/column]
[/row]
[/grid]
[/column]
[/row]
[/grid]
[/column]
[/row]
[/grid]
[/column]
[/row]
[row]
grow_factor = 0
[column]
grow_factor = 1
horizontal_grow = "true"
[grid]
[row]
[column]
grow_factor = 1
border = "all"
border_size = 5
horizontal_alignment = "right"
[button]
id = "ok"
definition = "default"
size_text = _ "OK"
label = _ "OK"
[/button]
[/column]
[column]
border = "all"
border_size = 5
[button]
id = "cancel"
definition = "default"
label = _ "Cancel"
[/button]
[/column]
[/row]
[/grid]
[/column]
[/row]
[/grid]
[/resolution]
[/window]

View file

@ -1858,6 +1858,34 @@
/>
</FileConfiguration>
</File>
<File
RelativePath="..\..\src\gui\dialogs\data_manage.cpp"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\Gui\Dialogs\"
/>
</FileConfiguration>
<FileConfiguration
Name="Release|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\Gui\Dialogs\"
/>
</FileConfiguration>
<FileConfiguration
Name="Debug (fast)|Win32"
>
<Tool
Name="VCCLCompilerTool"
ObjectFile="$(IntDir)\Gui\Dialogs\"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\..\src\gui\dialogs\dialog.cpp"
>
@ -6989,6 +7017,10 @@
RelativePath="..\..\src\gui\dialogs\campaign_selection.hpp"
>
</File>
<File
RelativePath="..\..\src\gui\dialogs\data_manage.hpp"
>
</File>
<File
RelativePath="..\..\src\gui\dialogs\dialog.hpp"
>

View file

@ -0,0 +1,260 @@
/* $Id$ */
/*
Copyright (C) 2010 by Jody Northup
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 version 2
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.
*/
#define GETTEXT_DOMAIN "wesnoth-lib"
#include "gui/dialogs/data_manage.hpp"
#include "foreach.hpp"
#include "formula_string_utils.hpp"
#include "gettext.hpp"
#include "gui/auxiliary/log.hpp"
#include "gui/dialogs/field.hpp"
#include "gui/dialogs/game_delete.hpp"
#include "gui/dialogs/helper.hpp"
#include "gui/widgets/button.hpp"
#include "gui/widgets/image.hpp"
#include "gui/widgets/label.hpp"
#ifdef GUI2_EXPERIMENTAL_LISTBOX
#include "gui/widgets/list.hpp"
#else
#include "gui/widgets/listbox.hpp"
#endif
#include "gui/widgets/minimap.hpp"
#include "gui/widgets/settings.hpp"
#include "gui/widgets/text_box.hpp"
#include "gui/widgets/window.hpp"
#include "language.hpp"
#include "preferences_display.hpp"
#include <cctype>
#include <boost/bind.hpp>
namespace gui2 {
REGISTER_WINDOW(data_manage)
tdata_manage::tdata_manage(const config& cache_config)
: txtFilter_(register_text("txtFilter", false))
, filename_()
, games_()
, cache_config_(cache_config)
, last_words_()
{
}
void tdata_manage::pre_show(CVideo& /*video*/, twindow& window)
{
assert(txtFilter_);
ttext_box* filter = find_widget<ttext_box>(
&window, "txtFilter", false, true);
window.keyboard_capture(filter);
filter->set_text_changed_callback(boost::bind(
&tdata_manage::filter_text_changed, this, _1, _2));
tlistbox* list = find_widget<tlistbox>(
&window, "persist_list", false, true);
window.keyboard_capture(list);
#ifdef GUI2_EXPERIMENTAL_LISTBOX
connect_signal_notify_modified(*list, boost::bind(
&tdata_manage::list_item_clicked
, *this
, boost::ref(window)));
#else
list->set_callback_value_change(
dialog_callback<tdata_manage, &tdata_manage::list_item_clicked>);
#endif
{
cursor::setter cur(cursor::WAIT);
games_ = savegame::manager::get_saves_list();
}
fill_game_list(window, games_);
connect_signal_mouse_left_click(
find_widget<tbutton>(&window, "clear", false)
, boost::bind(
&tdata_manage::delete_button_callback
, this
, boost::ref(window)));
}
void tdata_manage::fill_game_list(twindow& window
, std::vector<savegame::save_info>& games)
{
tlistbox& list = find_widget<tlistbox>(&window, "persist_list", false);
list.clear();
foreach(const savegame::save_info game, games) {
std::map<std::string, string_map> data;
string_map item;
item["label"] = game.name;
data.insert(std::make_pair("filename", item));
item["label"] = game.format_time_summary();
data.insert(std::make_pair("date", item));
list.add_row(data);
}
}
void tdata_manage::list_item_clicked(twindow& window)
{
}
bool tdata_manage::filter_text_changed(ttext_* textbox, const std::string& text)
{
twindow& window = *textbox->get_window();
tlistbox& list = find_widget<tlistbox>(&window, "persist_list", false);
const std::vector<std::string> words = utils::split(text, ' ');
if (words == last_words_)
return false;
last_words_ = words;
std::vector<bool> show_items(list.get_item_count(), true);
if(!text.empty()) {
for(unsigned int i = 0; i < list.get_item_count(); i++) {
tgrid* row = list.get_row_grid(i);
tgrid::iterator it = row->begin();
tlabel& filename_label =
find_widget<tlabel>(*it, "filename", false);
bool found = false;
foreach (const std::string& word, words){
found = std::search(filename_label.label().str().begin()
, filename_label.label().str().end()
, word.begin(), word.end()
, chars_equal_insensitive)
!= filename_label.label().str().end();
if (! found) {
// one word doesn't match, we don't reach words.end()
break;
}
}
show_items[i] = found;
}
}
list.set_row_shown(show_items);
return false;
}
void tdata_manage::post_show(twindow& window)
{
}
void tdata_manage::evaluate_summary_string(std::stringstream& str
, const config& cfg_summary){
const std::string& campaign_type = cfg_summary["campaign_type"];
if (cfg_summary["corrupt"].to_bool()) {
str << "\n" << _("#(Invalid)");
} else if (!campaign_type.empty()) {
str << "\n";
if(campaign_type == "scenario") {
const std::string campaign_id = cfg_summary["campaign"];
const config *campaign = NULL;
if (!campaign_id.empty()) {
if (const config &c = cache_config_.find_child(
"campaign", "id", campaign_id))
campaign = &c;
}
utils::string_map symbols;
if (campaign != NULL) {
symbols["campaign_name"] = (*campaign)["name"];
} else {
// Fallback to nontranslatable campaign id.
symbols["campaign_name"] = "(" + campaign_id + ")";
}
str << vgettext("Campaign: $campaign_name", symbols);
// Display internal id for debug purposes if we didn't above
if (game_config::debug && (campaign != NULL)) {
str << '\n' << "(" << campaign_id << ")";
}
} else if(campaign_type == "multiplayer") {
str << _("Multiplayer");
} else if(campaign_type == "tutorial") {
str << _("Tutorial");
} else {
str << campaign_type;
}
str << "\n";
if (cfg_summary["replay"].to_bool() && !cfg_summary["snapshot"].to_bool(true)) {
str << _("replay");
} else if (!cfg_summary["turn"].empty()) {
str << _("Turn") << " " << cfg_summary["turn"];
} else {
str << _("Scenario Start");
}
str << "\n" << _("Difficulty: ")
<< string_table[cfg_summary["difficulty"]];
if(!cfg_summary["version"].empty()) {
str << "\n" << _("Version: ") << cfg_summary["version"];
}
}
}
void tdata_manage::delete_button_callback(twindow& window)
{
tlistbox& list = find_widget<tlistbox>(&window, "persist_list", false);
const size_t index = size_t(list.get_selected_row());
if(index < games_.size()) {
// See if we should ask the user for deletion confirmation
if(preferences::ask_delete_saves()) {
gui2::tgame_delete dlg_delete;
dlg_delete.show(window.video(), 0);
int res = dlg_delete.get_retval();
if (res == twindow::CANCEL)
return;
if (dlg_delete.dont_ask_again()) {
preferences::set_ask_delete_saves(false);
}
}
// Delete the file
savegame::manager::delete_game(games_[index].name);
// Remove it from the list of saves
games_.erase(games_.begin() + index);
list.remove_row(index);
}
}
} // namespace gui2

View file

@ -0,0 +1,65 @@
/* $Id$ */
/*
Copyright (C) 2010 by Jody Northup
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 version 2
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 GUI_DIALOGS_MANAGE_DATA_HPP_INCLUDED
#define GUI_DIALOGS_MANAGE_DATA_HPP_INCLUDED
#include "gui/dialogs/dialog.hpp"
#include "gui/widgets/listbox.hpp"
#include "gui/widgets/text.hpp"
#include "savegame.hpp"
#include "tstring.hpp"
namespace gui2 {
class tdata_manage : public tdialog
{
public:
tdata_manage(const config& cache_config);
const std::string& filename() const { return filename_; }
protected:
/** Inherited from tdialog. */
void pre_show(CVideo& video, twindow& window);
/** Inherited from tdialog. */
void post_show(twindow& window);
private:
/** Inherited from tdialog, implemented by REGISTER_WINDOW. */
virtual const std::string& window_id() const;
bool filter_text_changed(ttext_* textbox, const std::string& text);
void list_item_clicked(twindow& window);
void delete_button_callback(twindow& window);
void evaluate_summary_string(std::stringstream& str, const config& cfg_summary);
void fill_game_list(twindow& window, std::vector<savegame::save_info>& games);
tfield_text* txtFilter_;
std::string filename_;
std::vector<savegame::save_info> games_;
const config& cache_config_;
std::vector<std::string> last_words_;
};
}
#endif

View file

@ -33,6 +33,7 @@
#include "gui/dialogs/transient_message.hpp"
#include "gui/dialogs/wml_message.hpp"
#include "gui/dialogs/gamestate_inspector.hpp"
#include "gui/dialogs/data_manage.hpp"
#include "gui/dialogs/unit_create.hpp"
#include "gui/widgets/settings.hpp"
#include "gui/widgets/window.hpp"
@ -2377,6 +2378,7 @@ class console_handler : public map_command_handler<console_handler>, private cha
void do_set_var();
void do_show_var();
void do_inspect();
void do_manage();
void do_unit();
// void do_buff();
// void do_unbuff();
@ -2466,6 +2468,8 @@ class console_handler : public map_command_handler<console_handler>, private cha
_("Set the command used by the custom command hotkey"), _("<command>[;<command>...]"));
register_command("inspect", &console_handler::do_inspect,
_("Launch the gamestate inspector"), "", "D");
register_command("manage", &console_handler::do_manage,
_("Manage persistence data"), "", "D");
register_command("alias", &console_handler::do_set_alias,
_("Set or show alias to a command"), _("<name>[=<command>]"));
register_command("set_var", &console_handler::do_set_var,
@ -3250,6 +3254,12 @@ void console_handler::do_inspect() {
inspect_dialog.show(resources::screen->video());
}
void console_handler::do_manage() {
config cfg;
gui2::tdata_manage manager(cfg);
manager.show(resources::screen->video());
}
void console_handler::do_unit() {
// prevent SIGSEGV due to attempt to set HP during a fight
if (events::commands_disabled > 0)