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 <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  rowHandler.setCountryFlag();
59 
60  return rowHandler.updateServer();
61 }
62 
63 ServerPtr ServerListModel::findSameServer(const Server *server)
64 {
65  CustomServerInfo serverInfo = CustomServerInfo::fromServer(server);
66  for (int i = 0; i < rowCount(); ++i)
67  {
68  ServerPtr serverOnList = serverFromList(i);
69  CustomServerInfo serverOnListInfo = CustomServerInfo::fromServer(serverOnList.data());
70  if (serverOnListInfo.isSameServer(serverInfo))
71  return serverOnList;
72  }
73  return ServerPtr();
74 }
75 
77 {
78  if (server != nullptr)
79  {
80  for (int i = 0; i < rowCount(); ++i)
81  {
82  ServerCPtr serverOnList = serverFromList(i);
83  if (server == serverOnList)
84  return i;
85  }
86  }
87  return -1;
88 }
89 
91 {
92  ServerPtr server = serverFromList(row);
93  ServerListRowHandler rowHandler(this, row, server);
94  rowHandler.redraw();
95 }
96 
98 {
99  int row = findServerOnTheList(server);
100  if (row >= 0)
101  redraw(row);
102 }
103 
104 void ServerListModel::redrawAll()
105 {
106  PlayersDiagram::loadImages(gConfig.doomseeker.slotStyle);
107 
108  for (int i = 0; i < rowCount(); ++i)
109  redraw(i);
110 }
111 
112 QList<ServerPtr> ServerListModel::customServers() const
113 {
114  QList<ServerPtr> servers;
115  for (int i = 0; i < rowCount(); ++i)
116  {
117  ServerPtr server = serverFromList(i);
118  if (server->isCustom())
119  servers << server;
120  }
121  return servers;
122 }
123 
124 QList<ServerPtr> ServerListModel::nonSpecialServers() const
125 {
126  QList<ServerPtr> servers;
127  for (int i = 0; i < rowCount(); ++i)
128  {
129  ServerPtr server = serverFromList(i);
130  if (!server->isCustom() && !server->isLan())
131  servers << server;
132  }
133  return servers;
134 }
135 
136 QList<ServerPtr> ServerListModel::servers() const
137 {
138  QList<ServerPtr> servers;
139  for (int i = 0; i < rowCount(); ++i)
140  servers << serverFromList(i);
141  return servers;
142 }
143 
144 QList<ServerPtr> ServerListModel::serversForPlugin(const EnginePlugin *plugin) const
145 {
146  QList<ServerPtr> servers;
147  for (int i = 0; i < rowCount(); ++i)
148  {
149  ServerPtr server = serverFromList(i);
150  if (server->plugin() == plugin)
151  servers << server;
152  }
153  return servers;
154 }
155 
156 void ServerListModel::removeServer(const ServerPtr &server)
157 {
158  int index = findServerOnTheList(server.data());
159  if (index >= 0)
160  removeRow(index);
161 }
162 
163 ServerPtr ServerListModel::serverFromList(int rowIndex) const
164 {
165  return ServerListRowHandler::serverFromList(this, rowIndex);
166 }
167 
168 ServerPtr ServerListModel::serverFromList(const QModelIndex &index) const
169 {
170  return ServerListRowHandler::serverFromList(this, index.row());
171 }
172 
173 ServerListModel::ServerGroup ServerListModel::serverGroup(int row)
174 {
175  QStandardItem *qstdItem = item(row, COL_META);
176  return static_cast<ServerListModel::ServerGroup>(qstdItem->data(SLDT_SERVER_GROUP).toInt());
177 }
178 
179 void ServerListModel::setRefreshing(ServerPtr server)
180 {
181  int rowIndex = findServerOnTheList(server.data());
182  if (rowIndex >= 0)
183  {
184  ServerListRowHandler rowHandler(this, rowIndex, server);
185  rowHandler.setRefreshing();
186  }
187 }
188 
189 void ServerListModel::prepareHeaders()
190 {
191  setHorizontalHeaderLabels(ServerListColumns::generateColumnHeaderLabels());
192 }
193 
194 int ServerListModel::updateServer(int row, ServerPtr server)
195 {
196  ServerListRowHandler rowHandler(this, row, server);
197  rowHandler.updateServer();
198 
199  return row;
200 }
201 
202 QVariant ServerListModel::columnSortData(int row, int column)
203 {
204  QStandardItem *it = item(row, column);
205  return it->data(SLDT_SORT);
206 }
207 
208 void ServerListModel::updateFlag(int row, bool force)
209 {
210  ServerPtr server = serverFromList(row);
211  ServerListRowHandler rowHandler(this, row, server);
212  QStandardItem *itm = item(row, IDServerName);
213 
214  if (force || itm->icon().isNull())
215  rowHandler.setCountryFlag();
216 }