Add the hacks to fix disabling of buttons
[cs356-p1-elevator.git] / elevatorgui.cpp
index 4ca5fe9..f18a334 100644 (file)
@@ -4,7 +4,7 @@ ElevatorGUI::ElevatorGUI (int floors, int elevators)
        : Gtk::Window()
        , number_of_floors_(floors)
        , number_of_elevators_(elevators)
-       , simulation_status_(STOPPED)
+       , simulation_status_(PAUSED)
 
        /* The ElevatorController */
        , ec_(floors, elevators)
@@ -13,9 +13,8 @@ ElevatorGUI::ElevatorGUI (int floors, int elevators)
        , timer_()
 
        /* GUI Elements */
-       , table_(floors+1, elevators+2)
+       , table_(floors+3, elevators+1)
        , button_playpause_(Gtk::Stock::MEDIA_PLAY)
-       , button_stop_(Gtk::Stock::STOP)
        , button_quit_(Gtk::Stock::QUIT)
 
        /* Storage for GUI elements for later lookup */
@@ -95,6 +94,16 @@ ElevatorGUI::ElevatorGUI (int floors, int elevators)
 
 
 
+       /* Fill in all of the PositionLabels */
+       for (e=0; e<elevators; ++e)
+       {
+               PositionLabel *label = new PositionLabel (e);
+               position_labels_.push_back (label);
+               table_.attach (*label, e+1, e+2, floors, floors+1);
+       }
+
+
+
        /* Fill in all of the Elevator Request Panels */
        for (e=0; e<elevators; ++e)
        {
@@ -132,32 +141,23 @@ ElevatorGUI::ElevatorGUI (int floors, int elevators)
                }
 
                // Attach the Panel
-               table_.attach (*panel, e+1, e+2, floors, floors+1);
-       }
-
-
-
-       /* Fill in all of the PositionLabels */
-       for (e=0; e<elevators; ++e)
-       {
-               PositionLabel *label = new PositionLabel (e);
-               position_labels_.push_back (label);
-               table_.attach (*label, e+1, e+2, floors+1, floors+2);
+               table_.attach (*panel, e+1, e+2, floors+1, floors+2);
        }
 
 
        /* Fill in the control buttons */
        Gtk::HBox *box = new Gtk::HBox ();
 
+       /* Tell the Play/Pause button to use the StockID so we can change it's image */
+       button_playpause_.set_use_stock (true);
+
+       /* Signals for control buttons */
        button_quit_.signal_clicked().connect (
                        sigc::mem_fun (*this, &ElevatorGUI::on_quit_button_clicked));
-       button_stop_.signal_clicked().connect (
-                       sigc::mem_fun (*this, &ElevatorGUI::on_stop_button_clicked));
        button_playpause_.signal_clicked().connect (
                        sigc::mem_fun (*this, &ElevatorGUI::on_playpause_button_clicked));
 
        box->pack_start (button_playpause_);
-       box->pack_start (button_stop_);
        box->pack_start (button_quit_);
 
        /* Attach the box to the bottom of the GUI */
@@ -178,26 +178,20 @@ void ElevatorGUI::on_quit_button_clicked ()
 
 void ElevatorGUI::on_playpause_button_clicked ()
 {
-       std::string names[] = { "STOPPED", "RUNNING", "PAUSED" };
+       std::string names[] = { "RUNNING", "PAUSED" };
        std::cout << "Play/Pause pressed with status=" << names[simulation_status_] << std::endl;
 
        switch (simulation_status_)
        {
-               case STOPPED:
-                       simulation_status_ = RUNNING;
-
-                       // add and start timer
-                       timer_ = Glib::signal_timeout().connect (
-                                               sigc::mem_fun (*this, &ElevatorGUI::on_timer_tick),
-                                               timer_tick_ms_);
-
-                       break;
                case RUNNING:
                        simulation_status_= PAUSED;
 
                        // stop and remove timer
                        timer_.disconnect ();
 
+                       // Set the StockID of the button
+                       button_playpause_.set_label ("gtk-media-play");
+
                        break;
                case PAUSED:
                        simulation_status_ = RUNNING;
@@ -207,6 +201,9 @@ void ElevatorGUI::on_playpause_button_clicked ()
                                                sigc::mem_fun (*this, &ElevatorGUI::on_timer_tick),
                                                timer_tick_ms_);
 
+                       // Set the StockID of the button
+                       button_playpause_.set_label ("gtk-media-pause");
+
                        break;
                default:
                        std::cout << "Bad Simulation Status in Play/Pause" << std::endl;
@@ -214,14 +211,6 @@ void ElevatorGUI::on_playpause_button_clicked ()
        }
 }
 
-void ElevatorGUI::on_stop_button_clicked ()
-{
-       // FIXME: implement this
-       std::cout << "STOP Button Clicked" << std::endl;
-
-       simulation_status_ = STOPPED;
-}
-
 void ElevatorGUI::on_request_button_toggled (RequestButton *button)
 {
        // Only send an elevator if we are toggled to on
@@ -258,6 +247,10 @@ void ElevatorGUI::gui_unpress_call_button (int floor, Direction direction)
 {
        CallButtonVector::iterator it;
 
+       /* If there is still an elevator coming, don't turn it off! */
+       if (ec_.oneElevatorWillStillStopAt (floor, direction))
+               return;
+
        for (it=call_buttons_.begin(); it!=call_buttons_.end(); it++)
                if ((*it)->getFloorNumber() == floor && (*it)->getDirection() == direction)
                        (*it)->set_active (false);