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 "gui/models/serverlistmodel.h"
24 #include "gui/models/serverlistcolumn.h"
25 #include "gui/models/serverlistrowhandler.h"
26 #include "gui/helpers/playersdiagram.h"
27 #include "gui/widgets/serverlistview.h"
28 #include "gui/mainwindow.h"
29 #include "gui/serverlist.h"
30 #include "configuration/doomseekerconfig.h"
31 #include "serverapi/server.h"
32 #include "log.h"
33 #include <QItemDelegate>
34 #include <QTime>
35 
36 using namespace ServerListColumnId;
37 
39 
40 ServerListModel::ServerListModel(ServerList* parent)
41 : QStandardItemModel(parent),
42  parentHandler(parent)
43 {
44  setSortRole(SLDT_SORT);
45 }
46 
47 int ServerListModel::addServer(ServerPtr server)
48 {
49  QList<QStandardItem*> columns = ServerListColumns::generateListOfCells();
50  appendRow(columns);
51 
52  // Country flag is set only once. Set it here and avoid setting it in
53  // updateServer() method.
54 
55  QModelIndex index = indexFromItem(columns[0]);
56  ServerListRowHandler rowHandler(this, index.row(), server);
57  if (parentHandler->getMainWindow()->isEffectivelyActiveWindow())
58  {
59  rowHandler.setCountryFlag();
60  }
61 
62  return rowHandler.updateServer();
63 }
64 
65 ServerPtr ServerListModel::findSameServer(const Server *server)
66 {
67  CustomServerInfo serverInfo = CustomServerInfo::fromServer(server);
68  for (int i = 0; i < rowCount(); ++i)
69  {
70  ServerPtr serverOnList = serverFromList(i);
71  CustomServerInfo serverOnListInfo = CustomServerInfo::fromServer(serverOnList.data());
72  if (serverOnListInfo.isSameServer(serverInfo))
73  return serverOnList;
74  }
75  return ServerPtr();
76 }
77 
79 {
80  if (server != NULL)
81  {
82  for (int i = 0; i < rowCount(); ++i)
83  {
84  ServerCPtr serverOnList = serverFromList(i);
85  if (server == serverOnList)
86  {
87  return i;
88  }
89  }
90  }
91  return -1;
92 }
93 
95 {
96  ServerPtr server = serverFromList(row);
97  ServerListRowHandler rowHandler(this, row, server);
98  rowHandler.redraw();
99 }
100 
102 {
103  int row = findServerOnTheList(server);
104  if (row >= 0)
105  redraw(row);
106 }
107 
108 void ServerListModel::redrawAll()
109 {
110  PlayersDiagram::loadImages(gConfig.doomseeker.slotStyle);
111 
112  for (int i = 0; i < rowCount(); ++i)
113  {
114  redraw(i);
115  }
116 }
117 
118 QList<ServerPtr> ServerListModel::customServers() const
119 {
120  QList<ServerPtr> servers;
121  for (int i = 0; i < rowCount(); ++i)
122  {
123  ServerPtr server = serverFromList(i);
124  if (server->isCustom())
125  {
126  servers << server;
127  }
128  }
129  return servers;
130 }
131 
132 QList<ServerPtr> ServerListModel::nonSpecialServers() const
133 {
134  QList<ServerPtr> servers;
135  for (int i = 0; i < rowCount(); ++i)
136  {
137  ServerPtr server = serverFromList(i);
138  if (!server->isCustom() && !server->isLan())
139  {
140  servers << server;
141  }
142  }
143  return servers;
144 }
145 
146 QList<ServerPtr> ServerListModel::servers() const
147 {
148  QList<ServerPtr> servers;
149  for (int i = 0; i < rowCount(); ++i)
150  {
151  servers << serverFromList(i);
152  }
153  return servers;
154 }
155 
156 QList<ServerPtr> ServerListModel::serversForPlugin(const EnginePlugin *plugin) const
157 {
158  QList<ServerPtr> servers;
159  for (int i = 0; i < rowCount(); ++i)
160  {
161  ServerPtr server = serverFromList(i);
162  if (server->plugin() == plugin)
163  {
164  servers << server;
165  }
166  }
167  return servers;
168 }
169 
170 void ServerListModel::removeServer(const ServerPtr &server)
171 {
172  int index = findServerOnTheList(server.data());
173  if (index >= 0)
174  {
175  removeRow(index);
176  }
177 }
178 
179 ServerPtr ServerListModel::serverFromList(int rowIndex) const
180 {
181  return ServerListRowHandler::serverFromList(this, rowIndex);
182 }
183 
184 ServerPtr ServerListModel::serverFromList(const QModelIndex& index) const
185 {
186  return ServerListRowHandler::serverFromList(this, index.row());
187 }
188 
189 ServerListModel::ServerGroup ServerListModel::serverGroup(int row)
190 {
191  QStandardItem* qstdItem = item(row, IDHiddenGroup);
192  return static_cast<ServerListModel::ServerGroup>(qstdItem->data(SLDT_SORT).toInt());
193 }
194 
195 void ServerListModel::setRefreshing(ServerPtr server)
196 {
197  int rowIndex = findServerOnTheList(server.data());
198  if (rowIndex >= 0)
199  {
200  ServerListRowHandler rowHandler(this, rowIndex, server);
201  rowHandler.setRefreshing();
202  }
203 }
204 
205 void ServerListModel::prepareHeaders()
206 {
207  setHorizontalHeaderLabels(ServerListColumns::generateColumnHeaderLabels());
208 }
209 
210 int ServerListModel::updateServer(int row, ServerPtr server)
211 {
212  ServerListRowHandler rowHandler(this, row, server);
213  rowHandler.updateServer();
214 
215  return row;
216 }
217 
218 QVariant ServerListModel::columnSortData(int row, int column)
219 {
220  QStandardItem* it = item(row, column);
221  return it->data(SLDT_SORT);
222 }
223 
224 void ServerListModel::updateFlag(int row, bool force)
225 {
226  ServerPtr server = serverFromList(row);
227  ServerListRowHandler rowHandler(this, row, server);
228  QStandardItem* itm = item(row, IDServerName);
229 
230  if (force || itm->icon().isNull())
231  {
232  rowHandler.setCountryFlag();
233  }
234 }
static void loadImages(const QString &style)
int addServer(ServerPtr server)
void redraw(int row)
A representation of a server for a given game.
Definition: server.h:93
bool isSameServer(const CustomServerInfo &other) const
int updateServer(int row, ServerPtr server)
int findServerOnTheList(const Server *server)
Finds index of the row where server is contained.
void updateFlag(int row, bool force=true)
ServerPtr findSameServer(const Server *server)