source: trunk/src/highscores_dialog.cpp @ 197

Last change on this file since 197 was 181, checked in by guyru, 6 years ago

make highsocres window resizable and make list columns resize automatically

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.6 KB
Line 
1/***************************************************************************
2 *   Copyright (C) 2006-2008 by Guy Rutenberg   *
3 *   guyrutenberg@gmail.com   *
4 *                                                                         *
5 *   This program is free software; you can redistribute it and/or modify  *
6 *   it under the terms of the GNU General Public License as published by  *
7 *   the Free Software Foundation; either version 2 of the License, or     *
8 *   (at your option) any later version.                                   *
9 *                                                                         *
10 *   This program is distributed in the hope that it will be useful,       *
11 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13 *   GNU General Public License for more details.                          *
14 *                                                                         *
15 *   You should have received a copy of the GNU General Public License     *
16 *   along with this program; if not, write to the                         *
17 *   Free Software Foundation, Inc.,                                       *
18 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19 ***************************************************************************/
20
21#include <wx/button.h>
22#include <wx/sizer.h>
23
24#include "highscores_dialog.h"
25
26#include "icon32.xpm"
27
28using namespace std;
29using namespace highscores_dialog;
30
31const int HIGHSCORELIST_BORDER = 10;
32
33HighscoresDialog::HighscoresDialog(wxWindow* parent,configuration::Configuration* config, int highlight_rank) :
34        wxDialog(parent, wxID_ANY, wxT("Highscores Table"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
35{
36        this->highlight_rank = highlight_rank;
37        m_config = config;
38
39        SetIcon(wxIcon(icon32_xpm));
40
41        createControls();
42        loadData();
43        doLayout();
44        connectEventTable();
45}
46
47void HighscoresDialog::createControls()
48{
49        highscoreslist = new wxListCtrl(this,wxID_ANY,wxDefaultPosition,wxSize(450,400),wxLC_REPORT | wxBORDER_SUNKEN );
50
51        wxListItem itemCol;
52
53        itemCol.SetText(wxT("Rank"));
54        itemCol.SetImage(-1);
55        highscoreslist->InsertColumn(0, itemCol);
56
57        itemCol.SetText(wxT("Name"));
58        itemCol.SetImage(-1);
59        highscoreslist->InsertColumn(1, itemCol);
60
61        itemCol.SetText(wxT("Score"));
62        itemCol.SetImage(-1);
63        highscoreslist->InsertColumn(2, itemCol);
64
65        itemCol.SetText(wxT("Date"));
66        itemCol.SetImage(-1);
67        highscoreslist->InsertColumn(3, itemCol);
68
69        highscoreslist->SetColumnWidth(0, 50 );
70        highscoreslist->SetColumnWidth(1, 195 );
71        highscoreslist->SetColumnWidth(2, 60 );
72        highscoreslist->SetColumnWidth(3, 140 );
73}
74
75void HighscoresDialog::loadData()
76{
77        highscoreslist->DeleteAllItems();
78        const configuration::HighscoresList *list = m_config->getHighscores();
79
80        configuration::HighscoresList::const_iterator it;
81        wxString buf;
82
83        int i = 0;
84        for (it = list->begin(); it!=list->end(); it++, i++) {
85                // rank
86                buf.Clear();
87                buf<<(i+1);
88                highscoreslist->InsertItem(i,buf,-1);
89
90                // name
91                buf = wxString::FromUTF8(it->name.c_str());
92                highscoreslist->SetItem(i,1,buf);
93
94                // score
95                buf.Clear();
96                buf<< it->score;
97                highscoreslist->SetItem(i,2,buf);
98
99                // date
100                buf = wxString::FromUTF8(it->date.c_str());
101                highscoreslist->SetItem(i,3,buf);
102        }
103
104        if (highlight_rank) {
105                highscoreslist->SetItemTextColour(highlight_rank-1,*wxRED);
106        }
107}
108
109void HighscoresDialog::doLayout()
110{
111        wxBoxSizer *top_sizer = new wxBoxSizer( wxVERTICAL );
112       
113        top_sizer->Add(highscoreslist, 1, wxEXPAND | wxALL, HIGHSCORELIST_BORDER);
114
115        wxBoxSizer *button_sizer = new wxBoxSizer( wxHORIZONTAL );
116
117        wxSizerFlags flags = wxSizerFlags().Border(wxALL & ~wxLEFT, 10);
118
119        button_sizer->AddStretchSpacer();
120        button_sizer->Add(new wxButton(this,wxID_CLEAR),flags);
121        button_sizer->Add(new wxButton(this,ID_CONFIGURE,wxT("Configure")),flags);
122        button_sizer->Add( new wxButton(this,wxID_CLOSE), flags);
123
124        top_sizer->Add(button_sizer,0,wxEXPAND);
125       
126        SetSizer(top_sizer);
127        top_sizer->SetSizeHints(this);
128}
129
130
131void HighscoresDialog::connectEventTable()
132{
133        Connect(wxID_CLOSE, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(HighscoresDialog::onClose));
134
135        Connect(wxID_CLEAR, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(HighscoresDialog::onClear));
136        Connect(ID_CONFIGURE, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(HighscoresDialog::onConfigure));
137        Connect(this->GetId(), wxEVT_SIZE, wxSizeEventHandler(HighscoresDialog::onResize));
138}
139void HighscoresDialog::onClose(wxCommandEvent& event)
140{
141        Close();
142}
143
144void HighscoresDialog::onConfigure(wxCommandEvent& event)
145{
146        HighscoresSettingsDialog *dialog = new HighscoresSettingsDialog(this, m_config);
147       
148        if (dialog->ShowModal() == wxID_OK) {
149                loadData();
150        }
151
152        delete dialog;
153}
154
155void HighscoresDialog::onClear(wxCommandEvent& event)
156{
157        int answer = wxMessageBox(
158                wxT("Are you sure you want to clear the Highscores table?\nThis action cannot be reversed."),
159                wxT("Are You Sure?"),
160                wxYES | wxNO,
161                this);
162       
163        if (answer == wxYES) {
164                m_config->clearHighscores();
165                loadData();
166        }
167}
168
169
170HighscoresSettingsDialog::HighscoresSettingsDialog(wxWindow* parent, configuration::Configuration* config) :
171        wxDialog(parent, wxID_ANY, wxT("Highscores Table Settings"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE)
172{
173        this->m_config = config;
174        doLayout();
175
176        Connect(wxID_OK, wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(HighscoresSettingsDialog::onOk));
177}
178
179void HighscoresSettingsDialog::doLayout()
180{
181        wxBoxSizer* top_sizer = new wxBoxSizer(wxVERTICAL);
182
183        wxBoxSizer* size_sizer = new wxBoxSizer(wxHORIZONTAL);
184
185        size_sizer->Add(new wxStaticText(this, wxID_ANY, wxT("High score table size:")), wxSizerFlags().Border(wxALL,10));
186       
187        int size = atoi(m_config->get("highscore-list-size").c_str());
188        spin_ctrl = new wxSpinCtrl(this, wxID_ANY);
189        spin_ctrl->SetRange(10,200);
190        spin_ctrl->SetValue(size);
191
192        size_sizer->Add(spin_ctrl,wxSizerFlags().Border(wxALL & ~wxLEFT,10));
193
194        top_sizer->Add(size_sizer);
195        top_sizer->Add(CreateButtonSizer(wxOK|wxCANCEL), 1, wxBOTTOM, 10);
196
197        SetSizer(top_sizer);
198        top_sizer->SetSizeHints(this);
199}
200
201void HighscoresSettingsDialog::onOk(wxCommandEvent& event) {
202        int size = spin_ctrl->GetValue();
203        m_config->setHighscoresSize(size);
204        event.Skip();
205}
206
207void HighscoresDialog::onResize(wxSizeEvent &event) {
208
209        const int width = event.GetSize().GetWidth();
210        const int rank_width = highscoreslist->GetColumnWidth(0);
211        const int score_width = highscoreslist->GetColumnWidth(2);
212        const int date_width = highscoreslist->GetColumnWidth(3);
213        const int new_width = width - 2*HIGHSCORELIST_BORDER - rank_width - score_width - date_width;
214       
215        highscoreslist->SetColumnWidth(1,new_width);
216        event.Skip();
217}
Note: See TracBrowser for help on using the repository browser.