serverlistmodel.cpp
1 //------------------------------------------------------------------------------
2 // serverlistmodel.cpp
3 //------------------------------------------------------------------------------
4 //
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
9 //
10 // This program 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
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with this program; 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/serverlist.h"
29 #include "configuration/doomseekerconfig.h"
30 #include "serverapi/server.h"
31 #include "log.h"
32 #include <QItemDelegate>
33 #include <QTime>
34 
35 using namespace ServerListColumnId;
36 
38 
39 ServerListModel::ServerListModel(ServerListHandler* parent)
40 : QStandardItemModel(parent),
41  parentHandler(parent)
42 {
43  setSortRole(SLDT_SORT);
44 }
45 
46 int ServerListModel::addServer(ServerPtr server, int response)
47 {
48  QList<QStandardItem*> columns;
49  ServerListColumns::generateListOfCells(columns);
50 
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()->isActiveWindow())
59  {
60  rowHandler.setCountryFlag();
61  }
62 
63  return rowHandler.updateServer(response);
64 }
65 
66 void ServerListModel::destroyRows()
67 {
68  int rows = rowCount();
69  removeRows(0, rows);
70  emit modelCleared();
71 }
72 
74 {
75  if (server != NULL)
76  {
77  for (int i = 0; i < rowCount(); ++i)
78  {
79  ServerCPtr savedServ = serverFromList(i);
80  if (server == savedServ)
81  {
82  return i;
83  }
84  }
85  }
86  return -1;
87 }
88 
90 {
91  ServerPtr server = serverFromList(row);
92  ServerListRowHandler rowHandler(this, row, server);
93  rowHandler.redraw();
94 }
95 
96 void ServerListModel::redrawAll()
97 {
98  int slotstyle = gConfig.doomseeker.slotStyle;
99  PlayersDiagram::loadImages(slotstyle);
100 
101  for (int i = 0; i < rowCount(); ++i)
102  {
103  redraw(i);
104  }
105 }
106 
107 void ServerListModel::removeCustomServers()
108 {
109  QList<ServerPtr> serversToRemove;
110  for (int i = 0; i < rowCount(); ++i)
111  {
112  ServerPtr server = serverFromList(i);
113  if (server->isCustom())
114  {
115  serversToRemove.append(server);
116  }
117  }
118 
119  foreach (ServerPtr server, serversToRemove)
120  {
121  int index = findServerOnTheList(server.data());
122  if (index >= 0)
123  {
124  removeRow(index);
125  }
126  }
127 }
128 
129 ServerPtr ServerListModel::serverFromList(int rowIndex)
130 {
131  return ServerListRowHandler::serverFromList(this, rowIndex);
132 }
133 
134 ServerPtr ServerListModel::serverFromList(const QModelIndex& index)
135 {
136  return ServerListRowHandler::serverFromList(this, index.row());
137 }
138 
139 ServerListModel::ServerGroup ServerListModel::serverGroup(int row)
140 {
141  QStandardItem* qstdItem = item(row, IDHiddenGroup);
142  return static_cast<ServerListModel::ServerGroup>(qstdItem->data(SLDT_SORT).toInt());
143 }
144 
145 void ServerListModel::setRefreshing(ServerPtr server)
146 {
147  int rowIndex = findServerOnTheList(server.data());
148  if (rowIndex >= 0)
149  {
150  ServerListRowHandler rowHandler(this, rowIndex, server);
151  rowHandler.setRefreshing();
152  }
153 }
154 
155 void ServerListModel::prepareHeaders()
156 {
157  QStringList labels;
158  ServerListColumns::generateColumnHeaderLabels(labels);
159  setHorizontalHeaderLabels(labels);
160 }
161 
162 int ServerListModel::updateServer(int row, ServerPtr server, int response)
163 {
164  ServerListRowHandler rowHandler(this, row, server);
165  rowHandler.updateServer(response);
166 
167  return row;
168 }
169 
170 QVariant ServerListModel::columnSortData(int row, int column)
171 {
172  QStandardItem* it = item(row, column);
173  return it->data(SLDT_SORT);
174 }
175 
176 void ServerListModel::updateFlag(int row, bool force)
177 {
178  ServerPtr server = serverFromList(row);
179  ServerListRowHandler rowHandler(this, row, server);
180  QStandardItem* itm = item(row, IDServerName);
181 
182  if (force || itm->icon().isNull())
183  {
184  rowHandler.setCountryFlag();
185  }
186 }
static void loadImages(int style)
void redraw(int row)
A representation of a server for a given game.
Definition: server.h:93
int updateServer(int row, ServerPtr server, int response)
int addServer(ServerPtr server, int response)
int findServerOnTheList(const Server *server)
Finds index of the row where server is contained.
void updateFlag(int row, bool force=true)