summaryrefslogtreecommitdiff
path: root/src/gui/setup.cpp
blob: 84c3b2be2d4daf2b347d831ff2942f8f93628285 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*----------------------------------------------------------------
 * setup.cpp -- setup routines
 *----------------------------------------------------------------
 *  This module takes care of everything relating to the
 *  setup dialog.
 */
#include "setup.h"
#include <allegro.h>

/*
 * 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");
  modesList = new gcn::ListBox(modesListModel);
  scrollArea = new gcn::ScrollArea(modesList);
  fsCheckBox = new CheckBox("Full screen", false);
  applyButton = new Button("Apply");
  cancelButton = new Button("Cancel");
  
  /* Set dimension */
  scrollArea->setDimension(gcn::Rectangle(0,0,120,50));
  displayLabel->setDimension(gcn::Rectangle(0,0,80, 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);
  fsCheckBox->setPosition(100,16);
  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(applyButton);
  add(cancelButton);
  
  setSize(240,216);
  setLocationRelativeTo(getParent());

  //TODO: load default settings
  modesList->setSelected(1);
}

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

/*
 * Event handling method
 */
void Setup::action(const std::string& eventId)
{
  if(eventId == "apply") {
    setVisible(false);
    //TODO: Save&apply setup changes
    if(fsCheckBox->isMarked() == true) {
	    set_gfx_mode(GFX_AUTODETECT_FULLSCREEN,800,600,0,0);
    } else {
	    set_gfx_mode(GFX_AUTODETECT_WINDOWED,800,600,0,0);
    }
    
  } 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;
}