18 QAbstractListModel(parent)
36 if (m_servers.empty())
39 return m_servers.size() + 1;
44 const int row = index.row();
45 const int customServerRow = (m_servers.empty() ? 1 : m_servers.size());
47 if ((row == 0) && m_servers.empty()) {
48 if (role == Qt::DisplayRole) {
49 return tr(
"No servers available");
55 if (row == customServerRow) {
56 if (role == Qt::DisplayRole) {
57 return tr(
"Custom server");
65 const ServerInfo& sv(m_servers.at(row));
66 if (role == Qt::DisplayRole) {
67 return tr(
"%1 - %2").arg(sv.name).arg(sv.location);
79 QHash<int, QByteArray> result = QAbstractListModel::roleNames();
86 if (m_mpServerRequest.get()) {
90 std::string url(
fgGetString(
"/sim/multiplay/serverlist-url",
91 "http://liveries.flightgear.org/mpstatus/mpservers.xml"));
97 SGPropertyNode *targetnode =
fgGetNode(
"/sim/multiplay/server-list",
true);
108 SGPropertyNode *targetnode =
fgGetNode(
"/sim/multiplay/server-list",
true);
111 for (
int i=0;
i<targetnode->nChildren(); ++
i) {
112 SGPropertyNode* c = targetnode->getChild(
i);
113 if (c->getNameString() !=
"server") {
117 if (c->getBoolValue(
"online") !=
true) {
122 QString
name = QString::fromStdString(c->getStringValue(
"name"));
123 QString loc = QString::fromStdString(c->getStringValue(
"location"));
124 QString host = QString::fromStdString(c->getStringValue(
"hostname"));
125 int port = c->getIntValue(
"port");
126 m_servers.push_back(ServerInfo(
name, loc, host, port));
132 m_mpServerRequest.clear();
137 qWarning() <<
"refreshing MP servers failed:" << QString::fromStdString(m_mpServerRequest->responseReason());
138 m_mpServerRequest.clear();
149 if (m_doRestoreMPServer) {
151 settings.beginGroup(
"mpSettings");
152 QString host = settings.value(
"mp-server").toString();
153 if (host ==
"__custom__") {
157 auto it = std::find_if(m_servers.begin(), m_servers.end(), [host](
const ServerInfo& info)
158 { return (info.host == host); });
160 if (it != m_servers.end()) {
169 m_doRestoreMPServer =
false;
175 m_doRestoreMPServer =
true;
181 return (m_currentIndex == 1) ?
"__custom__" :
"__noservers__";
184 if (
static_cast<std::vector<MPServersModel::ServerInfo>::size_type
>(m_currentIndex) == m_servers.size()) {
188 return m_servers.at(m_currentIndex).host;
196 return m_servers.at(m_currentIndex).port;
201 return !m_servers.empty();
213MPServersModel::ServerInfo::ServerInfo(QString n, QString l, QString h,
int p)
const int IsCustomIndexRole
MPServersModel(QObject *parent=nullptr)
~MPServersModel() override
QVariant data(const QModelIndex &index, int role) const override
void onRefreshMPServersDone(simgear::HTTP::Request *)
QHash< int, QByteArray > roleNames() const override
void setCurrentIndex(int currentIndex)
void onRefreshMPServersFailed(simgear::HTTP::Request *)
void currentIndexChanged(int currentIndex)
void restoreMPServerSelection()
int rowCount(const QModelIndex &index) const override
std::string fgGetString(const char *name, const char *defaultValue)
Get a string value for a property.
SGPropertyNode * fgGetNode(const char *path, bool create)
Get a property node.