summaryrefslogblamecommitdiff
path: root/src/gui/setup.cpp
blob: 6d6cf848f4c5cd7115207745c3fa6f2a7b982505 (plain) (tree)























                                                                             


                                                        
 
                  
 
             
                   
                     
 



                                                    
                            
















                                                    

                        
 
   
                           
   


                                    
                                        
                                                    
                                               
                                         
                                                  

                                                
                                                              

                                      
  
                     

                                                      
                                                         

                                                         
  


                                     
  
                    
                                 
                                   


                                     
                                     

                                     
  
                          

                                        
  
                       
                  
                    
                  

                     
                     




                                     
 
                             
                            

                                       
                                                       

 






                        
                    

                       


                      

 


                        

                                              

                             
    









                                                                                  
    


                                                
                                       





                                        

                                       
                          



                                    
     

 


                                               

                               





                                
    
               
 
 
/*
 *  The Mana World
 *  Copyright 2004 The Mana World Development Team
 *
 *  This file is part of The Mana World.
 *
 *  The Mana World is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  any later version.
 *
 *  The Mana World is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with The Mana World; if not, write to the Free Software
 *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 *  $Id$
 */

/*
 *  This module takes care of everything relating to the
 *  setup dialog.
 */

#include "setup.h"

#ifndef WIN32
extern Sound sound;
#endif /* no WIN32 */

/*
 * Metod returns the number of elements in container
 */
int ModesListModel::getNumberOfElements() {
  //TODO after moving to SDL
  return 3;
}

/*
 * Metod returns element from container
 */
std::string ModesListModel::getElementAt(int i) {
  //TODO: change hardcoded modes after moving to SDL
  struct Modes {
    int height, width;
    char *desc;
  };
  static Modes modes[] = {
    { 640,480, "640x480"},
    { 800,600, "800x600" },
    { 1024,768, "1024x768" }
  };
  return(modes[i].desc);
}

/* 
 * Setup dialog constructor
 */
Setup::Setup(gcn::Container *parent)
  : Window(parent, "Setup")
{
  modesListModel = new ModesListModel();
  displayLabel = new gcn::Label("Display settings");
  modesList = new gcn::ListBox(modesListModel);
  scrollArea = new ScrollArea(modesList);
  fsCheckBox = new CheckBox("Full screen", false);
  soundLabel = new gcn::Label("Sound settings");
  soundCheckBox = new CheckBox("Sound", false);
  disabledRadio = new RadioButton("Disabled", "Modes", false);
  applyButton = new Button("Apply");
  cancelButton = new Button("Cancel");
  
  /* Set dimension */
  scrollArea->setDimension(gcn::Rectangle(0,0,90,50));
  modesList->setDimension(gcn::Rectangle(0,0,60,50));
  displayLabel->setDimension(gcn::Rectangle(0,0,100,16));
  applyButton->setDimension(gcn::Rectangle(0,0,80, 16));
  cancelButton->setDimension(gcn::Rectangle(0,0,80, 16));
  
  /* Set events */
  applyButton->setEventId("apply");
  cancelButton->setEventId("cancel");
  
  /* Set position */
  scrollArea->setPosition(10,40);
  displayLabel->setPosition(10,10);
  soundLabel->setPosition(10,110);
  fsCheckBox->setPosition(120,36);
  soundCheckBox->setPosition(10,130);
  disabledRadio->setPosition(10,140);
  applyButton->setPosition(10,190);
  cancelButton->setPosition(150,190);
  
  /* Listen for actions */
  applyButton->addActionListener(this);
  cancelButton->addActionListener(this);
  
  /* Assemble dialog */
  add(scrollArea);
  add(displayLabel);
  add(fsCheckBox);
  add(soundLabel);
  add(soundCheckBox);
  add(disabledRadio);
  add(applyButton);
  add(cancelButton);
  
  setSize(240,216);
  setLocationRelativeTo(getParent());

  /* load default settings */
  modesList->setSelected(1);
  if(config.getValue("screen",0) == 1) 
    fsCheckBox->setMarked(true);
  soundCheckBox->setMarked(config.getValue("sound",0));
}

/* 
 * Destructor
 */
Setup::~Setup() {
  delete modesListModel;
  delete modesList;
  delete scrollArea;
  delete fsCheckBox;
  delete soundCheckBox;
  delete soundLabel;
  delete displayLabel;
  delete applyButton;
  delete cancelButton;
}

/*
 * Event handling method
 */
void Setup::action(const std::string& eventId)
{
    if (eventId == "apply") {
        setVisible(false);
    
        /* Display settings */
        if (fsCheckBox->isMarked() == true && config.getValue("screen",0) == 2) {
    	    config.setValue("screen",1);
    	    set_gfx_mode(GFX_AUTODETECT_FULLSCREEN,800,600,0,0);
    	    
        } else 
        if (fsCheckBox->isMarked() == false && config.getValue("screen",0) == 1) {
    	    config.setValue("screen",2);
    	    set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0);
        }
    
        /* Sound settings */
#ifndef WIN32
        if (soundCheckBox->isMarked() == true) {
            config.setValue("sound",1);
            try {
                sound.init(32, 20);
            }catch(const char *err) {
                ok("Sound Engine", err);
                warning(err);   
            }
        } else {
    	    config.setValue("sound",0);
            sound.close();
        }
#endif /* not WIN32 */
    } else if(eventId == "cancel") {
        setVisible(false);
    }
}

/*
 * Static method for creating singleton objects
 */
Setup * Setup::ptr = NULL;
Setup * Setup::create_setup() {
    if(ptr == NULL) {
        ptr = new Setup(guiTop);
    }
    else {
        ptr->setVisible(true);
    }
    
    return ptr;
}