ManaPlus
editserverdialog.cpp
Go to the documentation of this file.
1 /*
2  * The ManaPlus Client
3  * Copyright (C) 2011-2012 The Mana Developers
4  * Copyright (C) 2012-2019 The ManaPlus Developers
5  * Copyright (C) 2019-2021 Andrei Karas
6  *
7  * This file is part of The ManaPlus Client.
8  *
9  * This program is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 2 of the License, or
12  * any later version.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program. If not, see <http://www.gnu.org/licenses/>.
21  */
22 
24 
26 
28 
29 #include "gui/windows/okdialog.h"
31 
32 #include "gui/widgets/button.h"
33 #include "gui/widgets/checkbox.h"
35 #include "gui/widgets/dropdown.h"
37 #include "gui/widgets/label.h"
38 #include "gui/widgets/layout.h"
39 
40 #include "utils/gettext.h"
41 
42 #include "debug.h"
43 
45  const ServerInfo &server,
46  const int index) :
47  // TRANSLATORS: edit server dialog name
48  Window(_("Edit Server"), Modal_true, parent, "editserverdialog.xml"),
50  KeyListener(),
51  mServerAddressField(new TextField(this, std::string(),
52  LoseFocusOnTab_true, nullptr, std::string(), false)),
53  mPortField(new TextField(this, std::string(),
54  LoseFocusOnTab_true, nullptr, std::string(), false)),
55  mNameField(new TextField(this, std::string(),
56  LoseFocusOnTab_true, nullptr, std::string(), false)),
57  mDescriptionField(new TextField(this, std::string(),
58  LoseFocusOnTab_true, nullptr, std::string(), false)),
59  mOnlineListUrlField(new TextField(this, std::string(),
60  LoseFocusOnTab_true, nullptr, std::string(), false)),
61  mPacketVersionField(new IntTextField(this, 0, 0, maxPacketVersion,
62  Enable_true, 0)),
63  // TRANSLATORS: edit server dialog button
64  mConnectButton(new Button(this, _("Connect"), "connect",
65  BUTTON_SKIN, this)),
66  // TRANSLATORS: edit server dialog button
67  mOkButton(new Button(this, _("OK"), "addServer", BUTTON_SKIN, this)),
68  // TRANSLATORS: edit server dialog button
69  mCancelButton(new Button(this, _("Cancel"), "cancel", BUTTON_SKIN, this)),
70  // TRANSLATORS: edit server dialog label
71  mPersistentIp(new CheckBox(this, _("Use same ip"),
72  true, this, "persistentIp")),
73  mTypeListModel(new TypeListModel),
74  mTypeField(new DropDown(this, mTypeListModel,
75  false, Modal_true, nullptr, std::string())),
76  mServerDialog(parent),
77  mServer(server),
78  mIndex(index)
79 {
80  setWindowName("EditServerDialog");
81 
82  // TRANSLATORS: edit server dialog label
83  Label *const nameLabel = new Label(this, _("Name:"));
84  // TRANSLATORS: edit server dialog label
85  Label *const serverAdressLabel = new Label(this, _("Address:"));
86  // TRANSLATORS: edit server dialog label
87  Label *const portLabel = new Label(this, _("Port:"));
88  // TRANSLATORS: edit server dialog label
89  Label *const typeLabel = new Label(this, _("Server type:"));
90  // TRANSLATORS: edit server dialog label
91  Label *const descriptionLabel = new Label(this, _("Description:"));
92  // TRANSLATORS: edit server dialog label
93  Label *const onlineListUrlLabel = new Label(this, _("Online list url:"));
94  // TRANSLATORS: edit server dialog label
95  Label *const packetVersionLabel = new Label(this, _("Packet version:"));
96  mPortField->setNumeric(true);
97  mPortField->setRange(1, 65535);
98 
99  mTypeField->setSelected(0); // TmwAthena by default
100 
103 
104  place(0, 0, nameLabel, 1, 1);
105  place(1, 0, mNameField, 4, 1).setPadding(3);
106  place(0, 1, serverAdressLabel, 1, 1);
107  place(1, 1, mServerAddressField, 4, 1).setPadding(3);
108  place(0, 2, portLabel, 1, 1);
109  place(1, 2, mPortField, 4, 1).setPadding(3);
110  place(0, 3, typeLabel, 1, 1);
111  place(1, 3, mTypeField, 1, 1).setPadding(3);
112  place(0, 4, descriptionLabel, 1, 1);
113  place(1, 4, mDescriptionField, 4, 1).setPadding(3);
114  place(0, 5, onlineListUrlLabel, 1, 1);
115  place(1, 5, mOnlineListUrlField, 4, 1).setPadding(3);
116  place(0, 6, packetVersionLabel, 1, 1);
117  place(1, 6, mPacketVersionField, 4, 1).setPadding(3);
118  place(0, 7, mPersistentIp, 4, 1).setPadding(3);
119  place(0, 8, mConnectButton, 1, 1);
120  place(4, 8, mOkButton, 1, 1);
121  place(3, 8, mCancelButton, 1, 1);
122 
123  // Do this manually instead of calling reflowLayout so we can enforce a
124  // minimum width.
125  int width = 0;
126  int height = 0;
127  getLayout().reflow(width, height);
128  if (width < 300)
129  {
130  width = 300;
131  getLayout().reflow(width, height);
132  }
133  if (height < 120)
134  {
135  height = 120;
136  getLayout().reflow(width, height);
137  }
138 
139  setContentSize(width, height);
140 
144 
145  setResizable(false);
146  addKeyListener(this);
147 
148  loadWindowState();
149 
157 
158  switch (mServer.type)
159  {
160  case ServerType::EATHENA:
161 #ifdef TMWA_SUPPORT
163 #else // TMWA_SUPPORT
165 #endif // TMWA_SUPPORT
166  break;
167  default:
168  case ServerType::UNKNOWN:
171  break;
172  case ServerType::EVOL2:
173 #ifdef TMWA_SUPPORT
175 #else // TMWA_SUPPORT
177 #endif // TMWA_SUPPORT
178  break;
179  }
180 
182 }
183 
185 {
186  delete mTypeListModel;
187 }
188 
190 {
194 }
195 
197 {
198  const std::string &eventId = event.getId();
199 
200  if (eventId == "ok")
201  {
202  // Give focus back to the server dialog.
204  }
205  if (eventId == "addServer" || eventId == "connect")
206  {
207  // Check the given information
208  if (mServerAddressField->getText().empty()
209  || mPortField->getText().empty())
210  {
211  OkDialog *const dlg = CREATEWIDGETR(OkDialog,
212  // TRANSLATORS: edit server dialog error header
213  _("Error"),
214  // TRANSLATORS: edit server dialog error message
215  _("Please at least type both the address and the port "
216  "of the server."),
217  // TRANSLATORS: ok dialog button
218  _("OK"),
220  Modal_true,
222  nullptr,
223  260);
224  dlg->addActionListener(this);
225  }
226  else
227  {
228  mCancelButton->setEnabled(false);
229  mOkButton->setEnabled(false);
230 
236  mServer.port = CAST_S16(atoi(
237  mPortField->getText().c_str()));
239 
240  if (mTypeField != nullptr)
241  {
242  switch (mTypeField->getSelected())
243  {
244 #ifdef TMWA_SUPPORT
245  case 0:
247  break;
248  case 1:
250  break;
251  case 2:
253  break;
254 #else // TMWA_SUPPORT
255 
256  case 0:
258  break;
259  case 1:
261  break;
262 #endif // TMWA_SUPPORT
263 
264  default:
266  break;
267  }
268  }
269  else
270  {
272  }
273 
274  // Tell the server has to be saved
275  mServer.save = true;
276 
277  // Add server
279  if (eventId == "connect")
281  scheduleDelete();
282  }
283  }
284  else if (eventId == "cancel")
285  {
286  scheduleDelete();
287  }
288 }
289 
291 {
292  if (event.isConsumed())
293  return;
294 
295  const InputActionT actionId = event.getActionId();
296 
297  if (actionId == InputAction::GUI_CANCEL)
298  {
299  scheduleDelete();
300  }
301  else if (actionId == InputAction::GUI_SELECT ||
302  actionId == InputAction::GUI_SELECT2)
303  {
305  }
306 }
const std::string BUTTON_SKIN
Definition: button.h:89
#define CAST_S16
Definition: cast.h:28
Definition: button.h:102
void setSelected(const bool selected)
Definition: checkbox.h:156
bool isSelected() const
Definition: checkbox.h:147
int getSelected() const
Definition: dropdown.cpp:509
void setSelected(int selected)
Definition: dropdown.cpp:514
TextField * mServerAddressField
CheckBox * mPersistentIp
void keyPressed(KeyEvent &event)
TextField * mNameField
IntTextField * mPacketVersionField
TextField * mPortField
EditServerDialog(ServerDialog *const parent, const ServerInfo &server, const int index)
ServerDialog * mServerDialog
DropDown * mTypeField
TypeListModel * mTypeListModel
TextField * mOnlineListUrlField
TextField * mDescriptionField
void action(const ActionEvent &event)
bool isConsumed() const
void setValue(const int value)
int getValue() const
Definition: label.h:91
LayoutCell & setPadding(int p)
Definition: layoutcell.h:60
void reflow(int &nW, int &nH)
Definition: layout.cpp:36
void updateServer(const ServerInfo &server, const int index)
void connectToSelectedServer()
std::string hostname
Definition: serverinfo.h:45
uint16_t port
Definition: serverinfo.h:58
std::string onlineListUrl
Definition: serverinfo.h:49
int packetVersion
Definition: serverinfo.h:60
ServerTypeT type
Definition: serverinfo.h:42
bool persistentIp
Definition: serverinfo.h:62
std::string name
Definition: serverinfo.h:44
std::string description
Definition: serverinfo.h:47
bool save
Definition: serverinfo.h:61
void setNumeric(const bool numeric)
Definition: textfield.cpp:269
const std::string & getText() const
Definition: textfield.h:224
void setText(const std::string &text)
Definition: textfield.cpp:803
void setRange(const int min, const int max)
Definition: textfield.h:137
void setEnabled(const bool enabled)
Definition: widget.h:352
void addKeyListener(KeyListener *const keyListener)
Definition: widget.cpp:272
virtual void requestFocus()
Definition: widget.cpp:204
void addActionListener(ActionListener *const actionListener)
Definition: widget.cpp:252
int getHeight() const
Definition: widget.h:240
const std::string & getActionEventId() const
Definition: widget.h:605
int getWidth() const
Definition: widget.h:221
Definition: window.h:102
void setResizable(const bool resize)
Definition: window.cpp:627
virtual void setVisible(Visible visible)
Definition: window.cpp:778
void setContentSize(int width, int height)
Definition: window.cpp:492
Window * getParentWindow() const
Definition: window.h:310
Layout & getLayout()
Definition: window.cpp:1365
void setWindowName(const std::string &name)
Definition: window.h:355
void setMinHeight(const int height)
Definition: window.cpp:604
void postInit()
Definition: window.cpp:249
void setMinWidth(const int width)
Definition: window.cpp:591
virtual void scheduleDelete()
Definition: window.cpp:831
LayoutCell & place(const int x, const int y, Widget *const wg, const int w, const int h)
Definition: window.cpp:1384
void setDefaultSize()
Definition: window.cpp:1198
void setLocationRelativeTo(const Widget *const widget)
Definition: window.cpp:509
void loadWindowState()
Definition: window.cpp:1087
#define CREATEWIDGETR(type,...)
Definition: createwidget.h:36
#define new
Definition: debug_new.h:147
const bool Enable_true
Definition: enable.h:30
#define _(s)
Definition: gettext.h:35
InputAction ::T InputActionT
Definition: inputaction.h:717
#define nullptr
Definition: localconsts.h:45
const bool LoseFocusOnTab_true
static const uint32_t maxPacketVersion
const bool Modal_true
Definition: modal.h:30
std::string toString(T const &value)
converts any type to a string
Definition: catch.hpp:1774
const bool ShowCenter_true
Definition: showcenter.h:30
const bool Visible_true
Definition: visible.h:30