Move the PositionLabels to above the panels
[cs356-p1-elevator.git] / elevatorgui.cpp
index 2c82772..3db7c3d 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+3)
+       , 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 */
@@ -27,6 +26,11 @@ ElevatorGUI::ElevatorGUI (int floors, int elevators)
        int i, j, e, f, e_num, f_num, f_attach;
        std::ostringstream str;
 
+       /* Set Table Spacing / Window Border Size */
+       table_.set_col_spacings (8);
+       table_.set_row_spacings (8);
+       set_border_width (10);
+
        /* Fill in all of the ElevatorDoors and CallButtons */
        for (f_attach=0, f=floors-1; f>=0; --f, ++f_attach)
        {
@@ -51,6 +55,11 @@ ElevatorGUI::ElevatorGUI (int floors, int elevators)
                        call_buttons_.push_back (callbutton);
                        box->pack_start (*callbutton);
                }
+               else // we are on the top floor, create a dummy label
+               {
+                       Gtk::Label *label = new Gtk::Label ("");
+                       box->pack_start (*label);
+               }
 
                /* Only create the DOWN CallButton if we are not on the bottom floor */
                if (f != 0)
@@ -69,6 +78,11 @@ ElevatorGUI::ElevatorGUI (int floors, int elevators)
                        call_buttons_.push_back (callbutton);
                        box->pack_end (*callbutton);
                }
+               else // we are on the bottom floor, create a dummy label
+               {
+                       Gtk::Label *label = new Gtk::Label ("");
+                       box->pack_end (*label);
+               }
 
                for (e=0; e<elevators; ++e) // run left-to-right
                {
@@ -80,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)
        {
@@ -117,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 */
@@ -163,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;
@@ -192,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;
@@ -199,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