serverlistmodel.cpp
1 //------------------------------------------------------------------------------
2 // serverlistmodel.cpp
3 //------------------------------------------------------------------------------
4 //
5 // This library is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU Lesser General Public
7 // License as published by the Free Software Foundation; either
8 // version 2.1 of the License, or (at your option) any later version.
9 //
10 // This library 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 GNU
13 // Lesser General Public License for more details.
14 //
15 // You should have received a copy of the GNU Lesser General Public
16 // License along with this library; if not, write to the Free Software
17 // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
18 // 02110-1301 USA
19 //
20 //------------------------------------------------------------------------------
21 // Copyright (C) 2009 "Zalewa" <zalewapl@gmail.com>
22 //------------------------------------------------------------------------------
23 #include "configuration/doomseekerconfig.h"
24 #include "gui/helpers/playersdiagram.h"
25 #include "gui/mainwindow.h"
26 #include "gui/models/serverlistcolumn.h"
27 #include "gui/models/serverlistmodel.h"
28 #include "gui/models/serverlistrowhandler.h"
29 #include "gui/serverlist.h"
30 #include "gui/widgets/serverlistview.h"
31 #include "log.h"
32 #include "serverapi/server.h"
33 #include "serverapi/serverid.h"
34 #include <QItemDelegate>
35 #include <QTime>
36 
37 using namespace ServerListColumnId;
38 
40 
41 ServerListModel::ServerListModel(ServerList *parent)
42  : QStandardItemModel(parent),
43  parentHandler(parent)
44 {
45  setSortRole(SLDT_SORT);
46 }
47 
48 int ServerListModel::addServer(ServerPtr server)
49 {
50  QList<QStandardItem *> columns = ServerListColumns::generateListOfCells();
51  appendRow(columns);
52 
53  // Country flag is set only once. Set it here and avoid setting it in
54  // updateServer() method.
55 
56  QModelIndex index = indexFromItem(columns[0]);
57  ServerListRowHandler rowHandler(this, index.row(), server);
58  if (parentHandler->getMainWindow()->isEffectivelyActiveWindow())
59  rowHandler.setCountryFlag();
60 
61  return rowHandler.updateServer();
62 }
63 
64 ServerPtr ServerListModel::findSameServer(const Server *server)
65 {
66  const ServerRuntimeId serverInfo = ServerRuntimeId::fromServer(server);
67  for (int i = 0; i < rowCount(); ++i)
68  {
69  ServerPtr serverOnList = serverFromList(i);
70  const ServerRuntimeId serverOnListInfo = ServerRuntimeId::fromServer(serverOnList.data());
71  if (serverOnListInfo == serverInfo)
72  return serverOnList;
73  }
74  return ServerPtr();
75 }
76 
78 {
79  if (server != nullptr)
80  {
81  for (int i = 0; i < rowCount(); ++i)
82  {
83  ServerCPtr serverOnList = serverFromList(i);
84  if (server == serverOnList)
85  return i;
86  }
87  }
88  return -1;
89 }
90 
92 {
93  ServerPtr server = serverFromList(row);
94  ServerListRowHandler rowHandler(this, row, server);
95  rowHandler.redraw();
96 }
97 
99 {
100  int row = findServerOnTheList(server);
101  if (row >= 0)
102  redraw(row);
103 }
104 
105 void ServerListModel::redrawAll()
106 {
107  PlayersDiagram::loadImages(gConfig.doomseeker.slotStyle);
108 
109  for (int i = 0; i < rowCount(); ++i)
110  redraw(i);
111 }
112 
113 QList<ServerPtr> ServerListModel::customServers() const
114 {
115  QList<ServerPtr> servers;
116  for (int i = 0; i < rowCount(); ++i)
117  {
118  ServerPtr server = serverFromList(i);
119  if (server->isCustom())
120  servers << server;
121  }
122  return servers;
123 }
124 
125 QList<ServerPtr> ServerListModel::nonSpecialServers() const
126 {
127  QList<ServerPtr> servers;
128  for (int i = 0; i < rowCount(); ++i)
129  {
130  ServerPtr server = serverFromList(i);
131  if (!server->isCustom() && !server->isLan())
132  servers << server;
133  }
134  return servers;
135 }
136 
137 QList<ServerPtr> ServerListModel::servers() const
138 {
139  QList<ServerPtr> servers;
140  for (int i = 0; i < rowCount(); ++i)
141  servers << serverFromList(i);
142  return servers;
143 }
144 
145 QList<ServerPtr> ServerListModel::serversForPlugin(const EnginePlugin *plugin) const
146 {
147  QList<ServerPtr> servers;
148  for (int i = 0; i < rowCount(); ++i)
149  {
150  ServerPtr server = serverFromList(i);
151  if (server->plugin() == plugin)
152  servers << server;
153  }
154  return servers;
155 }
156 
157 void ServerListModel::removeServer(const ServerPtr &server)
158 {
159  int index = findServerOnTheList(server.data());
160  if (index >= 0)
161  removeRow(index);
162 }
163 
164 ServerPtr ServerListModel::serverFromList(int rowIndex) const
165 {
166  return ServerListRowHandler::serverFromList(this, rowIndex);
167 }
168 
169 ServerPtr ServerListModel::serverFromList(const QModelIndex &index) const
170 {
171  return ServerListRowHandler::serverFromList(this, index.row());
172 }
173 
174 ServerListModel::ServerGroup ServerListModel::serverGroup(int row)
175 {
176  QStandardItem *qstdItem = item(row, COL_META);
177  return static_cast<ServerListModel::ServerGroup>(qstdItem->data(SLDT_SERVER_GROUP).toInt());
178 }
179 
180 void ServerListModel::setRefreshing(ServerPtr server)
181 {
182  int rowIndex = findServerOnTheList(server.data());
183  if (rowIndex >= 0)
184  {
185  ServerListRowHandler rowHandler(this, rowIndex, server);
186  rowHandler.setRefreshing();
187  }
188 }
189 
190 void ServerListModel::prepareHeaders()
191 {
192  setHorizontalHeaderLabels(ServerListColumns::generateColumnHeaderLabels());
193 }
194 
195 int ServerListModel::updateServer(int row, ServerPtr server)
196 {
197  ServerListRowHandler rowHandler(this, row, server);
198  rowHandler.updateServer();
199 
200  return row;
201 }
202 
203 QVariant ServerListModel::columnSortData(int row, int column)
204 {
205  QStandardItem *it = item(row, column);
206  return it->data(SLDT_SORT);
207 }
208 
209 void ServerListModel::updateFlag(int row, bool force)
210 {
211  ServerPtr server = serverFromList(row);
212  ServerListRowHandler rowHandler(this, row, server);
213  QStandardItem *itm = item(row, IDServerName);
214 
215  if (force || itm->icon().isNull())
216  rowHandler.setCountryFlag();
217 }