swift
serverlistselector.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <QString>
7 
9 #include "core/webdataservices.h"
10 #include "gui/guiapplication.h"
11 #include "misc/sequence.h"
12 
13 using namespace swift::misc;
14 using namespace swift::misc::network;
15 using namespace swift::gui;
16 using namespace swift::core;
17 using namespace swift::core::db;
18 
19 namespace swift::gui::components
20 {
21  CServerListSelector::CServerListSelector(QWidget *parent) : QComboBox(parent)
22  {
23  const CServer server = m_lastServer.get();
24  if (server.hasName()) { m_pendingPreselect = server.getName(); }
25  connect(this, &QComboBox::currentTextChanged, this, &CServerListSelector::onServerTextChanged);
26  }
27 
29  {
30  if (m_servers == servers) { return; }
31  this->setServerItems(servers);
32  if (!servers.isEmpty() && !m_pendingPreselect.isEmpty())
33  {
34  this->preSelect(m_pendingPreselect);
35  m_pendingPreselect.clear();
36  }
37  }
38 
40  {
41  const int i = currentIndex();
42  if (i < 0 || i >= m_servers.size()) { return CServer(); }
43  return m_servers[i];
44  }
45 
46  bool CServerListSelector::preSelect(const QString &name)
47  {
48  if (name.isEmpty()) { return false; }
49  if (m_servers.isEmpty())
50  {
51  m_pendingPreselect = name; // save for later
52  return false;
53  }
54  for (int i = 0; i < m_servers.size(); i++)
55  {
56  if (m_servers[i].matchesName(name))
57  {
58  this->setCurrentIndex(i);
59  return true;
60  }
61  }
62  return false;
63  }
64 
65  void CServerListSelector::setServerItems(const CServerList &servers)
66  {
67  QString currentlySelected(this->currentText());
68  int index = -1;
69  m_servers = servers;
70  m_items.clear();
71  this->clear(); // ui
72 
73  for (const CServer &server : servers)
74  {
75  const QString d(server.getName() + ": " + server.getDescription());
76  m_items.append(d);
77  if (!currentlySelected.isEmpty() && index < 0 && d == currentlySelected) { index = m_items.size() - 1; }
78 
79  this->addItem(d);
80  }
81 
82  // reselect
83  if (m_items.isEmpty()) { return; }
84  if (m_items.size() == 1) { this->setCurrentIndex(0); }
85  else if (index >= 0) { this->setCurrentIndex(index); }
86  }
87 
88  void CServerListSelector::onServerTextChanged(const QString &text)
89  {
90  Q_UNUSED(text);
91  emit this->serverChanged(this->currentServer());
92  }
93 
94 } // namespace swift::gui::components
void serverChanged(const swift::misc::network::CServer &server)
Server has been changed.
void setServers(const swift::misc::network::CServerList &servers)
Set the servers.
bool preSelect(const QString &name)
Preselect.
swift::misc::network::CServer currentServer() const
Get the current server.
T get() const
Get a copy of the current value.
Definition: valuecache.h:408
size_type size() const
Returns number of elements in the sequence.
Definition: sequence.h:273
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
Value object encapsulating information of a server.
Definition: server.h:28
bool hasName() const
Has name?
Definition: server.h:95
const QString & getName() const
Get name.
Definition: server.h:92
Value object encapsulating a list of servers.
Definition: serverlist.h:23
Classes interacting with the swift database (aka "datastore").
Backend services of the swift project, like dealing with the network or the simulators.
Definition: actionbind.cpp:7
High level reusable GUI components.
Definition: aboutdialog.cpp:13
GUI related classes.
Free functions in swift::misc.