gui/dialogs/campaign_selection.cpp

Go to the documentation of this file.
00001 /* $Id: campaign_selection.cpp 52533 2012-01-07 02:35:17Z shadowmaster $ */
00002 /*
00003    Copyright (C) 2009 - 2012 by Mark de Wever <koraq@xs4all.nl>
00004    Part of the Battle for Wesnoth Project http://www.wesnoth.org/
00005 
00006    This program is free software; you can redistribute it and/or modify
00007    it under the terms of the GNU General Public License as published by
00008    the Free Software Foundation; either version 2 of the License, or
00009    (at your option) any later version.
00010    This program is distributed in the hope that it will be useful,
00011    but WITHOUT ANY WARRANTY.
00012 
00013    See the COPYING file for more details.
00014 */
00015 
00016 #define GETTEXT_DOMAIN "wesnoth-lib"
00017 
00018 #include "gui/dialogs/campaign_selection.hpp"
00019 
00020 #include "foreach.hpp"
00021 #include "gui/dialogs/helper.hpp"
00022 #include "gui/widgets/image.hpp"
00023 #ifdef GUI2_EXPERIMENTAL_LISTBOX
00024 #include "gui/widgets/list.hpp"
00025 #else
00026 #include "gui/widgets/listbox.hpp"
00027 #endif
00028 #include "gui/widgets/multi_page.hpp"
00029 #include "gui/widgets/scroll_label.hpp"
00030 #include "gui/widgets/settings.hpp"
00031 #include "gui/widgets/tree_view.hpp"
00032 #include "gui/widgets/tree_view_node.hpp"
00033 #include "gui/widgets/window.hpp"
00034 #include "serialization/string_utils.hpp"
00035 
00036 #include <boost/bind.hpp>
00037 
00038 namespace gui2 {
00039 
00040 /*WIKI
00041  * @page = GUIWindowDefinitionWML
00042  * @order = 2_campaign_selection
00043  *
00044  * == Campaign selection ==
00045  *
00046  * This shows the dialog which allows the user to choose which campaign to
00047  * play.
00048  *
00049  * @begin{table}{dialog_widgets}
00050  *
00051  * campaign_list & & listbox & m &
00052  *         A listbox that contains all available campaigns. $
00053  *
00054  * -icon & & image & o &
00055  *         The icon for the campaign. $
00056  *
00057  * -name & & control & o &
00058  *         The name of the campaign. $
00059  *
00060  * -victory & & image & o &
00061  *         The icon to show when the user finished the campaign. The engine
00062  *         determines whether or not the user has finished the campaign and
00063  *         sets the visible flag for the widget accordingly. $
00064  *
00065  * campaign_details & & multi_page & m &
00066  *         A multi page widget that shows more details for the selected
00067  *         campaign. $
00068  *
00069  * -image & & image & o &
00070  *         The image for the campaign. $
00071  *
00072  * -description & & control & o &
00073  *         The description of the campaign. $
00074  *
00075  * @end{table}
00076  */
00077 
00078 REGISTER_DIALOG(campaign_selection)
00079 
00080 void tcampaign_selection::campaign_selected(twindow& window)
00081 {
00082     if(new_widgets && false) {
00083         ttree_view& tree = find_widget<ttree_view>(&window
00084                 , "campaign_tree"
00085                 , false);
00086 
00087         if(tree.empty()) {
00088             return;
00089         }
00090 
00091         assert(tree.selected_item());
00092         const unsigned choice =
00093                 lexical_cast<unsigned>(tree.selected_item()->id());
00094 
00095         tmulti_page& multi_page = find_widget<tmulti_page>(
00096                 &window, "campaign_details", false);
00097         multi_page.select_page(choice);
00098     } else {
00099         const int selected_row =
00100                 find_widget<tlistbox>(&window, "campaign_list", false)
00101                     .get_selected_row();
00102 
00103         tmulti_page& multi_page = find_widget<tmulti_page>(
00104                 &window, "campaign_details", false);
00105 
00106         multi_page.select_page(selected_row);
00107     }
00108 }
00109 
00110 void tcampaign_selection::pre_show(CVideo& /*video*/, twindow& window)
00111 {
00112     if(new_widgets && false) {
00113         /***** Setup campaign tree. *****/
00114         ttree_view& tree = find_widget<ttree_view>(&window
00115                 , "campaign_tree"
00116                 , false);
00117 
00118         tree.set_selection_change_callback(boost::bind(
00119                   &tcampaign_selection::campaign_selected
00120                 , this
00121                 , boost::ref(window)));
00122 
00123         window.keyboard_capture(&tree);
00124 
00125         string_map tree_group_field;
00126         std::map<std::string, string_map> tree_group_item;
00127 
00128         tree_group_field["label"] = "Campaigns won";
00129         tree_group_item["tree_view_node_label"] = tree_group_field;
00130         ttree_view_node& completed =
00131                 tree.add_node("campaign_group", tree_group_item);
00132 
00133         tree_group_field["label"] = "Campaigns to conquer";
00134         tree_group_item["tree_view_node_label"] = tree_group_field;
00135         ttree_view_node& not_completed =
00136                 tree.add_node("campaign_group", tree_group_item);
00137 
00138         /***** Setup campaign details. *****/
00139         tmulti_page& multi_page = find_widget<tmulti_page>(
00140                 &window, "campaign_details", false);
00141 
00142         unsigned id = 0;
00143         foreach(const config &campaign, campaigns_) {
00144 
00145             /*** Add tree item ***/
00146             tree_group_field["label"] = campaign["icon"];
00147             tree_group_item["icon"] = tree_group_field;
00148 
00149             tree_group_field["label"] = campaign["name"];
00150             tree_group_item["name"] = tree_group_field;
00151 
00152             if (campaign["completed"].to_bool()) {
00153                 completed.add_child("campaign", tree_group_item)
00154                         .set_id(lexical_cast<std::string>(id++));
00155             } else {
00156                 not_completed.add_child("campaign", tree_group_item)
00157                         .set_id(lexical_cast<std::string>(id++));
00158             }
00159 
00160             /*** Add detail item ***/
00161             string_map detail_item;
00162             std::map<std::string, string_map> detail_page;
00163 
00164             detail_item["label"] = campaign["description"];
00165             detail_item["use_markup"] = "true";
00166             detail_page.insert(std::make_pair("description", detail_item));
00167 
00168             detail_item["label"] = campaign["image"];
00169             detail_page.insert(std::make_pair("image", detail_item));
00170 
00171             multi_page.add_page(detail_page);
00172         }
00173 
00174         if(completed.empty()) {
00175             tree.remove_node(&completed);
00176         }
00177 
00178         if(not_completed.empty()) {
00179             tree.remove_node(&not_completed);
00180         }
00181 
00182     } else {
00183         /***** Hide the tree view. *****/
00184         if(ttree_view* tree = find_widget<ttree_view>(
00185                 &window, "campaign_tree", false, false)) {
00186 
00187             tree->set_visible(twidget::INVISIBLE);
00188         }
00189 
00190         /***** Setup campaign list. *****/
00191         tlistbox& list =
00192                 find_widget<tlistbox>(&window, "campaign_list", false);
00193 #ifdef GUI2_EXPERIMENTAL_LISTBOX
00194         connect_signal_notify_modified(list, boost::bind(
00195                   &tcampaign_selection::campaign_selected
00196                 , this
00197                 , boost::ref(window)));
00198 #else
00199         list.set_callback_value_change(dialog_callback
00200                 <tcampaign_selection
00201                 , &tcampaign_selection::campaign_selected>);
00202 #endif
00203             window.keyboard_capture(&list);
00204 
00205         /***** Setup campaign details. *****/
00206         tmulti_page& multi_page = find_widget<tmulti_page>(
00207                 &window, "campaign_details", false);
00208 
00209         foreach (const config &c, campaigns_) {
00210 
00211             /*** Add list item ***/
00212             string_map list_item;
00213             std::map<std::string, string_map> list_item_item;
00214 
00215             list_item["label"] = c["icon"];
00216             list_item_item.insert(std::make_pair("icon", list_item));
00217 
00218             list_item["label"] = c["name"];
00219             list_item_item.insert(std::make_pair("name", list_item));
00220 
00221             list.add_row(list_item_item);
00222 
00223             tgrid* grid = list.get_row_grid(list.get_item_count() - 1);
00224             assert(grid);
00225 
00226             twidget* widget = grid->find("victory", false);
00227             if (widget && !c["completed"].to_bool()) {
00228                 widget->set_visible(twidget::HIDDEN);
00229             }
00230 
00231             /*** Add detail item ***/
00232             string_map detail_item;
00233             std::map<std::string, string_map> detail_page;
00234 
00235             detail_item["label"] = c["description"];
00236             detail_item["use_markup"] = "true";
00237             detail_page.insert(std::make_pair("description", detail_item));
00238 
00239             detail_item["label"] = c["image"];
00240             detail_page.insert(std::make_pair("image", detail_item));
00241 
00242             multi_page.add_page(detail_page);
00243         }
00244     }
00245     campaign_selected(window);
00246 }
00247 
00248 void tcampaign_selection::post_show(twindow& window)
00249 {
00250     if(new_widgets && false) {
00251         ttree_view& tree = find_widget<ttree_view>(&window
00252                 , "campaign_tree"
00253                 , false);
00254 
00255         if(tree.empty()) {
00256             return;
00257         }
00258 
00259         assert(tree.selected_item());
00260         choice_ = lexical_cast<unsigned>(tree.selected_item()->id());
00261 
00262     } else {
00263         choice_ = find_widget<tlistbox>(
00264                 &window, "campaign_list", false).get_selected_row();
00265     }
00266 }
00267 
00268 } // namespace gui2
00269 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

Generated by doxygen 1.7.1 on Wed May 23 2012 01:02:43 for The Battle for Wesnoth
Gna! | Forum | Wiki | CIA | devdocs