Author: dragonking
Date: Thu Mar 10 19:07:57 2011
New Revision: 48834

URL: http://svn.gna.org/viewcvs/wesnoth?rev=48834&view=rev
Log:
Improvements and fixes for replay controller and control buttons

Modified:
    branches/1.8/src/display.cpp
    branches/1.8/src/display.hpp
    branches/1.8/src/play_controller.cpp
    branches/1.8/src/play_controller.hpp
    branches/1.8/src/replay.cpp
    branches/1.8/src/replay_controller.cpp
    branches/1.8/src/replay_controller.hpp
    branches/1.8/src/theme.cpp
    branches/1.8/src/theme.hpp

Modified: branches/1.8/src/display.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/display.cpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/display.cpp (original)
+++ branches/1.8/src/display.cpp Thu Mar 10 19:07:57 2011
@@ -101,6 +101,7 @@
        fog_image_("terrain/" + 
get_map().get_terrain_info(t_translation::FOGGED).minimap_image() + ".png"),
        tod_(time_of_day()),
        scroll_event_("scrolled"),
+       complete_redraw_event_("completely_redrawn"),
        nextDraw_(0),
        report_(),
        buttons_(),
@@ -1864,6 +1865,8 @@
        foreach (boost::function<void(display&)> f, redraw_observers_) {
                f(*this);
        }
+       
+       complete_redraw_event_.notify_observers();
 }
 
 void display::add_redraw_observer(boost::function<void(display&)> f)

Modified: branches/1.8/src/display.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/display.hpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/display.hpp (original)
+++ branches/1.8/src/display.hpp Thu Mar 10 19:07:57 2011
@@ -434,6 +434,8 @@
 
        /** Expose the event, so observers can be notified about map scrolling. 
*/
        events::generic_event &scroll_event() const { return scroll_event_; }
+       
+       events::generic_event& complete_redraw_event() { return 
complete_redraw_event_; }
 
        /** Check if a tile is fully visible on screen. */
        bool tile_fully_on_screen(const map_location& loc);
@@ -586,6 +588,12 @@
 
        /** Event raised when the map is being scrolled */
        mutable events::generic_event scroll_event_;
+       
+       /**
+        * notify observers that the screen has been redrawn completely
+        * atm this is used for replay_controller to add replay controls to the 
standard theme
+        */
+       events::generic_event complete_redraw_event_;
 
        /**
         * Holds the tick count for when the next drawing event is scheduled.

Modified: branches/1.8/src/play_controller.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/play_controller.cpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/play_controller.cpp (original)
+++ branches/1.8/src/play_controller.cpp Thu Mar 10 19:07:57 2011
@@ -482,7 +482,7 @@
        team& current_team = teams_[team_index];
 
        mouse_handler_.set_side(team_index + 1);
-
+       
        // If we are observers we move to watch next team if it is allowed
        if (is_observer()
                && !current_team.get_disallow_observers()) {
@@ -502,13 +502,13 @@
                || is_replay)
                return;
        if (!loading_game_) recorder.init_side();
-       do_init_side(team_index);
+       do_init_side(team_index, is_replay);
 }
 
 /**
  * Called by replay handler or init_side() to do actual work for turn change.
  */
-void play_controller::do_init_side(const unsigned int team_index){
+void play_controller::do_init_side(const unsigned int team_index, bool 
is_replay) {
        log_scope("player turn");
        team& current_team = teams_[team_index];
 

Modified: branches/1.8/src/play_controller.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/play_controller.hpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/play_controller.hpp (original)
+++ branches/1.8/src/play_controller.hpp Thu Mar 10 19:07:57 2011
@@ -92,7 +92,7 @@
        virtual void toggle_grid();
        virtual void search();
 
-       virtual void do_init_side(const unsigned int team_index);
+       virtual void do_init_side(const unsigned int team_index, bool is_replay 
= false);
        virtual void play_side(const unsigned int team_num, bool save) = 0;
 
        virtual void force_end_turn() = 0;

Modified: branches/1.8/src/replay.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/replay.cpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/replay.cpp (original)
+++ branches/1.8/src/replay.cpp Thu Mar 10 19:07:57 2011
@@ -905,7 +905,7 @@
 
                else if (cfg->child("init_side"))
                {
-                       resources::controller->do_init_side(side_num - 1);
+                       resources::controller->do_init_side(side_num - 1, true);
                }
 
                //if there is an end turn directive

Modified: branches/1.8/src/replay_controller.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/replay_controller.cpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/replay_controller.cpp (original)
+++ branches/1.8/src/replay_controller.cpp Thu Mar 10 19:07:57 2011
@@ -66,7 +66,8 @@
        delay_(0),
        is_playing_(false),
        show_everything_(false),
-       show_team_(state_of_game.classification().campaign_type == 
"multiplayer" ? 0 : 1)
+       show_team_(state_of_game.classification().campaign_type == 
"multiplayer" ? 0 : 1),
+       buttons_()
 {
        init();
        gamestate_start_ = gamestate_;
@@ -77,7 +78,8 @@
        //YogiHH
        //not absolutely sure if this is needed, but it makes me feel a lot 
better ;-)
        //feel free to delete this if it is not necessary
-       gui_->get_theme().theme_reset().detach_handler(this);
+       gui_->get_theme().theme_reset_event().detach_handler(this);
+       gui_->complete_redraw_event().detach_handler(this);
 }
 
 void replay_controller::init(){
@@ -116,13 +118,16 @@
        for(std::vector<team>::iterator t = teams_.begin(); t != teams_.end(); 
++t) {
                t->reset_objectives_changed();
        }
+       
+       buttons_.update(gui_);
 }
 
 void replay_controller::init_replay_display(){
        DBG_REPLAY << "initializing replay-display... " << (SDL_GetTicks() - 
ticks_) << "\n";
 
        rebuild_replay_theme();
-       gui_->get_theme().theme_reset().attach_handler(this);
+       gui_->get_theme().theme_reset_event().attach_handler(this);
+       gui_->complete_redraw_event().attach_handler(this);
        DBG_REPLAY << "done initializing replay-display... " << (SDL_GetTicks() 
- ticks_) << "\n";
 }
 
@@ -140,17 +145,120 @@
        }
 }
 
+
+void 
replay_controller::replay_buttons_wrapper::update(boost::scoped_ptr<game_display>&
 gui_)
+{
+       play_button_ = gui_->find_button("button-playreplay");
+       stop_button_ = gui_->find_button("button-stopreplay");
+       reset_button_ = gui_->find_button("button-resetreplay");
+       play_turn_button_ = gui_->find_button("button-nextturn");
+       play_side_button_ = gui_->find_button("button-nextside");
+       
+       //check if we have all buttons - if someone messed with theme then some 
buttons may be missing
+       //if any of the buttons is missing, we just disable everything
+       if( !play_button_ || !stop_button_ || !reset_button_ || 
!play_turn_button_ || !play_side_button_ ) {
+        
+               is_valid_ = false;
+               enabled_buttons_ = 0;
+       } else {
+               is_valid_ = true;
+               if( enabled_buttons_ == 0)
+                       enabled_buttons_ = PLAY_BUTTON_ENABLED | 
PLAY_TURN_BUTTON_ENABLED | PLAY_SIDE_BUTTON_ENABLED;
+       }
+       
+       update_buttons_states();
+}
+
+void replay_controller::replay_buttons_wrapper::update_buttons_states()
+{
+       if( enabled_buttons_ & PLAY_BUTTON_ENABLED ) {
+               play_button_->enable(true);
+       } else
+               play_button_->enable(false);
+       
+       if( enabled_buttons_ & STOP_BUTTON_ENABLED ) {
+               stop_button_->enable(true);
+       } else
+               stop_button_->enable(false);
+       
+       if( enabled_buttons_ & RESET_BUTTON_ENABLED ) {
+               reset_button_->enable(true);
+       } else
+               reset_button_->enable(false);           
+       
+       if( enabled_buttons_ & PLAY_TURN_BUTTON_ENABLED ) {
+               play_turn_button_->enable(true);
+       } else
+               play_turn_button_->enable(false);
+       
+       if( enabled_buttons_ & PLAY_SIDE_BUTTON_ENABLED ) {
+               play_side_button_->enable(true);
+       } else
+               play_side_button_->enable(false);       
+}
+
+void replay_controller::replay_buttons_wrapper::playback_should_start() 
+{
+       if( !is_valid_ )
+               return;
+       
+       play_button_->enable(false);
+       stop_button_->enable(true);
+       reset_button_->enable(false);
+       play_turn_button_->enable(false);
+       play_side_button_->enable(false);
+       
+       enabled_buttons_ = STOP_BUTTON_ENABLED;
+}
+
+void replay_controller::replay_buttons_wrapper::playback_should_stop(bool 
is_playing) 
+{
+       if( !is_valid_)
+               return;
+       
+       if( !recorder.at_end() ) {
+               
+               enabled_buttons_ = PLAY_BUTTON_ENABLED | RESET_BUTTON_ENABLED | 
PLAY_TURN_BUTTON_ENABLED | PLAY_SIDE_BUTTON_ENABLED;    
+               
+               update_buttons_states();
+       
+               play_button_->release();
+               play_turn_button_->release();
+               play_side_button_->release();
+       } else {
+               enabled_buttons_ = RESET_BUTTON_ENABLED;
+               
+               update_buttons_states();
+       }
+       
+       if( !is_playing ) {
+               //user interrupted
+               stop_button_->release();
+       }       
+}
+
+void replay_controller::replay_buttons_wrapper::reset_buttons() 
+{
+       if( !is_valid_ )
+               return;
+       
+       enabled_buttons_ = PLAY_BUTTON_ENABLED | PLAY_TURN_BUTTON_ENABLED | 
PLAY_SIDE_BUTTON_ENABLED;
+       
+       stop_button_->release();
+       reset_button_->release();
+       
+       update_buttons_states();
+}
+
 void replay_controller::reset_replay(){
-       gui::button* b = gui_->find_button("button-playreplay");
-       if (b != NULL) { b->release(); }
-       b = gui_->find_button("button-stopreplay");
-       if (b != NULL) { b->release(); }
        gui_->clear_chat_messages();
        is_playing_ = false;
        player_number_ = 1;
        current_turn_ = 1;
+       skip_replay_ = false;
        tod_manager_= tod_manager_start_;
        recorder.start_replay();
+       recorder.set_skip(false);
        units_ = units_start_;
        gamestate_ = gamestate_start_;
        teams_ = teams_start_;
@@ -177,30 +285,33 @@
        events::raise_draw_event();
        (*gui_).invalidate_all();
        (*gui_).draw();
-       b = gui_->find_button("button-resetreplay");
-       if (b != NULL) { b->release(); }
+       gui_->set_team(player_number_-1, show_everything_);
+       //gui_->scroll_to_leader(units_, 
player_number_,game_display::ONSCREEN,false);
+
+       buttons_.reset_buttons();
 }
 
 void replay_controller::stop_replay(){
        is_playing_ = false;
-       gui::button* b = gui_->find_button("button-playreplay");
-       if (b != NULL) { b->release(); }
 }
 
 void replay_controller::replay_next_turn(){
        is_playing_ = true;
+       buttons_.playback_should_start();
+       
        play_turn();
 
-       if (!skip_replay_){
+       if (!skip_replay_ || !is_playing_){
                gui_->scroll_to_leader(units_, 
player_number_,game_display::ONSCREEN,false);
        }
-       is_playing_ = false;
-       gui::button* b = gui_->find_button("button-nextturn");
-       if (b != NULL) { b->release(); }
+
+       buttons_.playback_should_stop(is_playing_);
 }
 
 void replay_controller::replay_next_side(){
        is_playing_ = true;
+       buttons_.playback_should_start();
+       
        play_side(player_number_ - 1, false);
 
        if (static_cast<size_t>(player_number_) > teams_.size()) {
@@ -208,13 +319,11 @@
                current_turn_++;
        }
 
-       if (!skip_replay_) {
+       if (!skip_replay_ || !is_playing_) {
                gui_->scroll_to_leader(units_, 
player_number_,game_display::ONSCREEN,false);
        }
 
-       is_playing_ = false;
-       gui::button* b = gui_->find_button("button-nextside");
-       if (b != NULL) { b->release(); }
+       buttons_.playback_should_stop(is_playing_);
 }
 
 void replay_controller::process_oos(const std::string& msg) const
@@ -252,35 +361,37 @@
 }
 
 void replay_controller::replay_skip_animation(){
-       recorder.set_skip(!recorder.is_skipping());
        skip_replay_ = !skip_replay_;
+       recorder.set_skip(skip_replay_);
 }
 
 void replay_controller::play_replay(){
-       gui::button* b = gui_->find_button("button-stopreplay");
-       if (b != NULL) { b->release(); }
+
        if (recorder.at_end()){
                return;
        }
 
        try{
                is_playing_ = true;
+               buttons_.playback_should_start();
 
                DBG_REPLAY << "starting main loop\n" << (SDL_GetTicks() - 
ticks_) << "\n";
                for(; !recorder.at_end() && is_playing_; first_player_ = 1) {
                        play_turn();
                } //end for loop
-               is_playing_ = false;
+               
+               if (!is_playing_) {
+                       gui_->scroll_to_leader(units_, 
player_number_,game_display::ONSCREEN,false);
+               }
        }
        catch(end_level_exception& e){
                if (e.result == QUIT) { throw e; }
        }
+       
+       buttons_.playback_should_stop(is_playing_);
 }
 
 void replay_controller::play_turn(){
-       if (recorder.at_end()){
-               return;
-       }
 
        LOG_REPLAY << "turn: " << current_turn_ << "\n";
 
@@ -298,9 +409,6 @@
 }
 
 void replay_controller::play_side(const unsigned int /*team_index*/, bool){
-       if (recorder.at_end()){
-               return;
-       }
 
        DBG_REPLAY << "Status turn number: " << turn() << "\n";
        DBG_REPLAY << "Replay_Controller turn number: " << current_turn_ << 
"\n";
@@ -333,6 +441,7 @@
                        finish_turn();
                        player_number_ = 1;
                        current_turn_++;
+                       gui_->new_turn();
                }
 
                update_teams();
@@ -350,10 +459,14 @@
                next_team = 1;
        }
 
-       if (!show_team_)
-               gui_->set_team(next_team - 1, show_everything_);
+       if (!show_team_) {
+               gui_->set_team(next_team - 1, show_everything_);
+       } else {
+               gui_->set_team(show_team_ - 1, show_everything_);
+       }
 
        ::clear_shroud(next_team);
+       
        gui_->set_playing_team(next_team - 1);
        gui_->invalidate_all();
 }
@@ -375,8 +488,17 @@
        menu_handler_.show_statistics(gui_->playing_team()+1);
 }
 
-void replay_controller::handle_generic_event(const std::string& /*name*/){
-       rebuild_replay_theme();
+void replay_controller::handle_generic_event(const std::string& name){
+       
+       if( name == "completely_redrawn" ) {
+               buttons_.update(gui_);
+               
+               gui::button* skip_animation_button = 
gui_->find_button("skip-animation");
+               
+               skip_animation_button->set_check(skip_replay_);
+       } else {
+               rebuild_replay_theme();
+       }
 }
 
 bool replay_controller::can_execute_command(hotkey::HOTKEY_COMMAND command, 
int index) const

Modified: branches/1.8/src/replay_controller.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/replay_controller.hpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/replay_controller.hpp (original)
+++ branches/1.8/src/replay_controller.hpp Thu Mar 10 19:07:57 2011
@@ -64,7 +64,7 @@
        void update_gui();
        void init_replay_display();
        void rebuild_replay_theme();
-       void handle_generic_event(const std::string& /*name*/);
+       void handle_generic_event(const std::string& name);
 
        game_state gamestate_start_;
        unit_map units_start_;
@@ -76,6 +76,39 @@
 
        bool show_everything_;
        unsigned int show_team_;
+       
+       class replay_buttons_wrapper {
+       
+               bool is_valid_;
+               
+               //bit mask
+               uint enabled_buttons_;
+               
+               void update_buttons_states();
+       
+       public:
+               static const uint PLAY_BUTTON_ENABLED = 1;
+               static const uint STOP_BUTTON_ENABLED = 2;
+               static const uint RESET_BUTTON_ENABLED = 4;
+               static const uint PLAY_TURN_BUTTON_ENABLED = 8;
+               static const uint PLAY_SIDE_BUTTON_ENABLED = 16;
+               
+               replay_buttons_wrapper() : is_valid_(false), enabled_buttons_() 
{}
+       
+               gui::button* play_button_;
+               gui::button* stop_button_;
+               gui::button* reset_button_;
+               gui::button* play_turn_button_;
+               gui::button* play_side_button_;
+
+               void update(boost::scoped_ptr<game_display>& gui_);
+               void playback_should_start();
+               void playback_should_stop(bool is_playing);
+
+               void reset_buttons();
+       };
+       
+       replay_buttons_wrapper buttons_;
 };
 
 

Modified: branches/1.8/src/theme.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/theme.cpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/theme.cpp (original)
+++ branches/1.8/src/theme.cpp Thu Mar 10 19:07:57 2011
@@ -522,7 +522,7 @@
 }
 
 theme::theme(const config& cfg, const SDL_Rect& screen) :
-       theme_reset_("theme_reset"),
+       theme_reset_event_("theme_reset"),
        cur_theme(),
        cfg_(),
        panels_(),
@@ -594,7 +594,7 @@
                        m->set_title(title_stash[m->get_id()]);
        }
 
-       theme_reset_.notify_observers();
+       theme_reset_event_.notify_observers();
 
        return result;
 }

Modified: branches/1.8/src/theme.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/branches/1.8/src/theme.hpp?rev=48834&r1=48833&r2=48834&view=diff
==============================================================================
--- branches/1.8/src/theme.hpp (original)
+++ branches/1.8/src/theme.hpp Thu Mar 10 19:07:57 2011
@@ -226,7 +226,7 @@
 
        const tborder& border() const { return border_; }
 
-       events::generic_event& theme_reset() { return theme_reset_; }
+       events::generic_event& theme_reset_event() { return theme_reset_event_; 
}
 
 private:
        theme::object& find_element(std::string id);
@@ -236,7 +236,7 @@
 
        //notify observers that the theme has been rebuilt completely
        //atm this is used for replay_controller to add replay controls to the 
standard theme
-       events::generic_event theme_reset_;
+       events::generic_event theme_reset_event_;
 
        static std::map<std::string, config> known_themes;
        std::string cur_theme;


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to