serverlistcontextmenu.cpp
1 //------------------------------------------------------------------------------
2 // serverlistcontextmenu.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) 2010 "Zalewa" <zalewapl@gmail.com>
22 //------------------------------------------------------------------------------
23 #include "serverlistcontextmenu.h"
24 
25 #include "gui/entity/serverlistfilterinfo.h"
26 #include "gui/widgets/serverfilterbuildermenu.h"
27 #include "gui/serverlist.h"
28 #include "core/customservers.h"
29 #include "serverapi/server.h"
30 #include "clipboard.h"
31 #include "strings.hpp"
32 #include <QApplication>
33 #include <QModelIndex>
34 #include <cassert>
35 
36 DClass<ServerListContextMenu>
37 {
38 public:
39  QAction *copyAddress;
40  QAction *copyEmail;
41  QAction *copyName;
42  QAction *copyUrl;
43  QAction *clearAdditionalSorting;
44  QAction *findMissingWads;
45  QAction *join;
46  QAction *openUrlInDefaultBrowser;
47  QAction *rcon;
48  QAction *refresh;
49  QAction *removeAdditionalSortingForColumn;
50  QAction *showJoinCommandLine;
51  QAction *sortAdditionallyAscending;
52  QAction *sortAdditionallyDescending;
53  QAction *toggleServerPinned;
54  QMenu *menu;
55  ServerFilterBuilderMenu *filterBuilder;
56  ServerPtr serverAtIndex;
57  QModelIndex modelIndex;
58  ServerListFilterInfo serverFilter;
59  QList<ServerPtr> servers;
60  ServerList *parent;
61 
62  bool isServerPinned() const
63  {
64  return CustomServers::isServerPinned(
65  CustomServerInfo::fromServer(serverAtIndex.data()));
66  }
67 
68  void togglePinAllServers()
69  {
70  bool toggleTo = !isServerPinned();
71  foreach (const ServerPtr &server, servers)
72  {
73  CustomServers::setServerPinned(
74  CustomServerInfo::fromServer(server.data()),
75  toggleTo);
76  server->setCustom(toggleTo);
77  }
78  }
79 };
80 
81 DPointered(ServerListContextMenu)
82 
83 ServerListContextMenu::ServerListContextMenu(ServerPtr serverAtIndex,
84  const ServerListFilterInfo& filter,
85  const QModelIndex &modelIndex,
86  const QList<ServerPtr> &servers,
87  ServerList *parent)
88 : QObject(parent)
89 {
90  d->serverAtIndex = serverAtIndex;
91  d->parent = parent;
92  d->servers = servers;
93  d->serverFilter = filter;
94  d->modelIndex = modelIndex;
95  initializeMembers();
96  createMembers();
97 }
98 
99 ServerListContextMenu::~ServerListContextMenu()
100 {
101  delete d->menu;
102 }
103 
104 QMenu* ServerListContextMenu::createCopyMenu(QWidget* parent)
105 {
106  QMenu *copyMenu = new QMenu(tr("Copy"), parent);
107  d->copyAddress = copyMenu->addAction(tr("Copy Address"));
108 
109  if (!d->serverAtIndex->email().isEmpty())
110  {
111  d->copyEmail = copyMenu->addAction(tr("Copy E-Mail"));
112  }
113 
114  if (!d->serverAtIndex->webSite().isEmpty())
115  {
116  d->copyUrl = copyMenu->addAction(tr("Copy URL"));
117  }
118 
119  d->copyName = copyMenu->addAction(tr("Copy Name"));
120 
121  return copyMenu;
122 }
123 
124 void ServerListContextMenu::createMembers()
125 {
126  d->menu = new QMenu();
127  this->connect(d->menu, SIGNAL(aboutToHide()), SIGNAL(aboutToHide()));
128  this->connect(d->menu, SIGNAL(triggered(QAction*)), SIGNAL(triggered(QAction*)));
129 
130  d->refresh = d->menu->addAction(tr("Refresh"));
131  d->join = d->menu->addAction(tr("Join"));
132  d->showJoinCommandLine = d->menu->addAction(tr("Show join command line"));
133  d->findMissingWads = d->menu->addAction(tr("Find missing WADs"));
134 
135  // Website.
136  const QString& webSite = d->serverAtIndex->webSite();
137  bool bShouldAllowOpenUrl = !webSite.isEmpty() && Strings::isUrlSafe(webSite);
138 
139  if (bShouldAllowOpenUrl)
140  {
141  d->openUrlInDefaultBrowser = d->menu->addAction(tr("Open URL in browser"));
142  }
143 
144  // Pinning ("marking as favourite").
145  QString pinnedLabel = !d->isServerPinned() ? tr("Pin") : tr ("Unpin");
146  d->toggleServerPinned = d->menu->addAction(pinnedLabel);
147 
148  // Copy menu.
149  QMenu* copyMenu = createCopyMenu(d->menu);
150  d->menu->addMenu(copyMenu);
151 
152  // Filter builder.
153  d->filterBuilder = new ServerFilterBuilderMenu(*d->serverAtIndex, d->serverFilter, d->menu);
154  if (d->serverAtIndex->isKnown() && !d->filterBuilder->isEmpty())
155  {
156  d->menu->addMenu(d->filterBuilder);
157  }
158 
159  d->rcon = NULL;
160  if(d->serverAtIndex->hasRcon())
161  {
162  d->menu->addSeparator();
163  d->rcon = d->menu->addAction(tr("Remote Console"));
164  }
165 
166  // Sorts.
167  d->menu->addSeparator();
168  if (!d->parent->isSortingByColumn(d->modelIndex.column()))
169  {
170  d->sortAdditionallyAscending = d->menu->addAction(tr("Sort additionally ascending"));
171  d->sortAdditionallyDescending = d->menu->addAction(tr("Sort additionally descending"));
172  }
173  if (d->parent->isSortingAdditionallyByColumn(d->modelIndex.column()))
174  {
175  d->removeAdditionalSortingForColumn = d->menu->addAction(
176  tr("Remove additional sorting for column"));
177  }
178  if (d->parent->isAnyColumnSortedAdditionally())
179  {
180  d->clearAdditionalSorting = d->menu->addAction(tr("Clear additional sorting"));
181  }
182 }
183 
184 void ServerListContextMenu::initializeMembers()
185 {
186  d->clearAdditionalSorting = NULL;
187  d->removeAdditionalSortingForColumn = NULL;
188  d->sortAdditionallyAscending = NULL;
189  d->sortAdditionallyDescending = NULL;
190  d->copyAddress = NULL;
191  d->copyEmail = NULL;
192  d->copyName = NULL;
193  d->copyUrl = NULL;
194  d->filterBuilder = NULL;
195  d->findMissingWads = NULL;
196  d->join = NULL;
197  d->menu = NULL;
198  d->openUrlInDefaultBrowser = NULL;
199  d->rcon = NULL;
200  d->refresh = NULL;
201  d->showJoinCommandLine = NULL;
202  d->toggleServerPinned = NULL;
203 }
204 
205 const QModelIndex &ServerListContextMenu::modelIndex() const
206 {
207  return d->modelIndex;
208 }
209 
210 void ServerListContextMenu::popup(const QPoint& point)
211 {
212  d->menu->popup(point);
213 }
214 
215 ServerPtr ServerListContextMenu::server() const
216 {
217  return d->serverAtIndex;
218 }
219 
220 const QList<ServerPtr> &ServerListContextMenu::servers() const
221 {
222  return d->servers;
223 }
224 
225 const ServerListFilterInfo& ServerListContextMenu::serverFilter() const
226 {
227  assert(d->filterBuilder);
228  return d->filterBuilder->filter();
229 }
230 
231 ServerListContextMenu::Result ServerListContextMenu::translateQMenuResult(QAction* resultAction)
232 {
233  if (resultAction == NULL)
234  {
235  return NothingHappened;
236  }
237 
238  // Now perform checks against menu items.
239  if(resultAction == d->refresh)
240  {
241  return Refresh;
242  }
243  else if(resultAction == d->join)
244  {
245  return Join;
246  }
247  else if (resultAction == d->showJoinCommandLine)
248  {
249  return ShowJoinCommandLine;
250  }
251  else if (resultAction == d->openUrlInDefaultBrowser)
252  {
253  return OpenURL;
254  }
255  else if(resultAction == d->copyAddress)
256  {
257  QString addr = QString("%1:%2").arg(d->serverAtIndex->address().toString()).arg(d->serverAtIndex->port());
258  Clipboard::setText(addr);
259  return DataCopied;
260  }
261  else if (resultAction == d->copyEmail)
262  {
263  Clipboard::setText(d->serverAtIndex->email());
264  return DataCopied;
265  }
266  else if(resultAction == d->copyName)
267  {
268  Clipboard::setText(d->serverAtIndex->name());
269  return DataCopied;
270  }
271  else if (resultAction == d->copyUrl)
272  {
273  Clipboard::setText(d->serverAtIndex->webSite());
274  return DataCopied;
275  }
276  else if(resultAction == d->findMissingWads)
277  {
278  return FindMissingWADs;
279  }
280  else if(resultAction == d->rcon)
281  {
282  return OpenRemoteConsole;
283  }
284  else if(resultAction == d->sortAdditionallyAscending)
285  {
286  return SortAdditionallyAscending;
287  }
288  else if(resultAction == d->sortAdditionallyDescending)
289  {
290  return SortAdditionallyDescending;
291  }
292  else if(resultAction == d->clearAdditionalSorting)
293  {
294  return ClearAdditionalSorting;
295  }
296  else if(resultAction == d->removeAdditionalSortingForColumn)
297  {
298  return RemoveAdditionalSortingForColumn;
299  }
300  else if(resultAction == d->toggleServerPinned)
301  {
302  d->togglePinAllServers();
303  return TogglePinServers;
304  }
305 
306  return NothingHappened;
307 }
Structure describing server filter.
static void setText(const QString &text)
Sets text both in clipboard and selection modes.
Definition: clipboard.cpp:28
static bool isUrlSafe(const QString &url)
Unsafe URLs begin with file:// and this functions returns false for such URLs.
Definition: strings.cpp:345
This is returned when something was copied to clipboard.