serverlistcontextmenu.cpp
1 //------------------------------------------------------------------------------
2 // serverlistcontextmenu.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) 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 "serverapi/server.h"
29 #include "strings.h"
30 #include <QApplication>
31 #include <QClipboard>
32 #include <QModelIndex>
33 #include <cassert>
34 
35 DClass<ServerListContextMenu>
36 {
37 public:
38  QAction *copyAddress;
39  QAction *copyEmail;
40  QAction *copyName;
41  QAction *copyUrl;
42  QAction *clearAdditionalSorting;
43  QAction *findMissingWads;
44  QAction *join;
45  QAction *openUrlInDefaultBrowser;
46  QAction *rcon;
47  QAction *refresh;
48  QAction *removeAdditionalSortingForColumn;
49  QAction *showJoinCommandLine;
50  QAction *sortAdditionallyAscending;
51  QAction *sortAdditionallyDescending;
52  QMenu *menu;
53  ServerFilterBuilderMenu *filterBuilder;
54  ServerPtr pServer;
55  QModelIndex modelIndex;
56  ServerListFilterInfo serverFilter;
57  ServerList *parent;
58 };
59 
60 DPointered(ServerListContextMenu)
61 
63  const QModelIndex &modelIndex, ServerList *parent)
64 : QObject(parent)
65 {
66  d->pServer = server;
67  d->parent = parent;
68  d->serverFilter = filter;
69  d->modelIndex = modelIndex;
70  initializeMembers();
71  createMembers();
72 }
73 
74 ServerListContextMenu::~ServerListContextMenu()
75 {
76  delete d->menu;
77 }
78 
79 QMenu* ServerListContextMenu::createCopyMenu(QWidget* parent)
80 {
81  QMenu *copyMenu = new QMenu(tr("Copy"), parent);
82  d->copyAddress = copyMenu->addAction(tr("Copy Address"));
83 
84  if (!d->pServer->email().isEmpty())
85  {
86  d->copyEmail = copyMenu->addAction(tr("Copy E-Mail"));
87  }
88 
89  if (!d->pServer->webSite().isEmpty())
90  {
91  d->copyUrl = copyMenu->addAction(tr("Copy URL"));
92  }
93 
94  d->copyName = copyMenu->addAction(tr("Copy Name"));
95 
96  return copyMenu;
97 }
98 
99 void ServerListContextMenu::createMembers()
100 {
101  d->menu = new QMenu();
102  this->connect(d->menu, SIGNAL(aboutToHide()), SIGNAL(aboutToHide()));
103  this->connect(d->menu, SIGNAL(triggered(QAction*)), SIGNAL(triggered(QAction*)));
104 
105  d->refresh = d->menu->addAction(tr("Refresh"));
106  d->join = d->menu->addAction(tr("Join"));
107  d->showJoinCommandLine = d->menu->addAction(tr("Show join command line"));
108  d->findMissingWads = d->menu->addAction(tr("Find missing WADs"));
109 
110  // Website.
111  const QString& webSite = d->pServer->webSite();
112  bool bShouldAllowOpenUrl = !webSite.isEmpty() && Strings::isUrlSafe(webSite);
113 
114  if (bShouldAllowOpenUrl)
115  {
116  d->openUrlInDefaultBrowser = d->menu->addAction(tr("Open URL in browser"));
117  }
118 
119  // Copy menu.
120  QMenu* copyMenu = createCopyMenu(d->menu);
121  d->menu->addMenu(copyMenu);
122 
123  // Filter builder.
124  d->filterBuilder = new ServerFilterBuilderMenu(*d->pServer, d->serverFilter, d->menu);
125  if (d->pServer->isKnown() && !d->filterBuilder->isEmpty())
126  {
127  d->menu->addMenu(d->filterBuilder);
128  }
129 
130  d->rcon = NULL;
131  if(d->pServer->hasRcon())
132  {
133  d->menu->addSeparator();
134  d->rcon = d->menu->addAction(tr("Remote Console"));
135  }
136 
137  // Sorts.
138  d->menu->addSeparator();
139  if (!d->parent->isSortingByColumn(d->modelIndex.column()))
140  {
141  d->sortAdditionallyAscending = d->menu->addAction(tr("Sort additionally ascending"));
142  d->sortAdditionallyDescending = d->menu->addAction(tr("Sort additionally descending"));
143  }
144  if (d->parent->isSortingAdditionallyByColumn(d->modelIndex.column()))
145  {
146  d->removeAdditionalSortingForColumn = d->menu->addAction(
147  tr("Remove additional sorting for column"));
148  }
149  if (d->parent->isAnyColumnSortedAdditionally())
150  {
151  d->clearAdditionalSorting = d->menu->addAction(tr("Clear additional sorting"));
152  }
153 }
154 
155 void ServerListContextMenu::initializeMembers()
156 {
157  d->clearAdditionalSorting = NULL;
158  d->removeAdditionalSortingForColumn = NULL;
159  d->sortAdditionallyAscending = NULL;
160  d->sortAdditionallyDescending = NULL;
161  d->copyAddress = NULL;
162  d->copyEmail = NULL;
163  d->copyName = NULL;
164  d->copyUrl = NULL;
165  d->filterBuilder = NULL;
166  d->findMissingWads = NULL;
167  d->join = NULL;
168  d->menu = NULL;
169  d->openUrlInDefaultBrowser = NULL;
170  d->rcon = NULL;
171  d->refresh = NULL;
172  d->showJoinCommandLine = NULL;
173 }
174 
175 const QModelIndex &ServerListContextMenu::modelIndex() const
176 {
177  return d->modelIndex;
178 }
179 
180 void ServerListContextMenu::popup(const QPoint& point)
181 {
182  d->menu->popup(point);
183 }
184 
185 ServerPtr ServerListContextMenu::server() const
186 {
187  return d->pServer;
188 }
189 
190 const ServerListFilterInfo& ServerListContextMenu::serverFilter() const
191 {
192  assert(d->filterBuilder);
193  return d->filterBuilder->filter();
194 }
195 
196 ServerListContextMenu::Result ServerListContextMenu::translateQMenuResult(QAction* resultAction)
197 {
198  if (resultAction == NULL)
199  {
200  return NothingHappened;
201  }
202 
203  // Now perform checks against menu items.
204  if(resultAction == d->refresh)
205  {
206  return Refresh;
207  }
208  else if(resultAction == d->join)
209  {
210  return Join;
211  }
212  else if (resultAction == d->showJoinCommandLine)
213  {
214  return ShowJoinCommandLine;
215  }
216  else if (resultAction == d->openUrlInDefaultBrowser)
217  {
218  return OpenURL;
219  }
220  else if(resultAction == d->copyAddress)
221  {
222  QString addr = QString("%1:%2").arg(d->pServer->address().toString()).arg(d->pServer->port());
223  QApplication::clipboard()->setText(addr);
224  return DataCopied;
225  }
226  else if (resultAction == d->copyEmail)
227  {
228  QApplication::clipboard()->setText(d->pServer->email());
229  return DataCopied;
230  }
231  else if(resultAction == d->copyName)
232  {
233  QApplication::clipboard()->setText(d->pServer->name());
234  return DataCopied;
235  }
236  else if (resultAction == d->copyUrl)
237  {
238  QApplication::clipboard()->setText(d->pServer->webSite());
239  return DataCopied;
240  }
241  else if(resultAction == d->findMissingWads)
242  {
243  return FindMissingWADs;
244  }
245  else if(resultAction == d->rcon)
246  {
247  return OpenRemoteConsole;
248  }
249  else if(resultAction == d->sortAdditionallyAscending)
250  {
251  return SortAdditionallyAscending;
252  }
253  else if(resultAction == d->sortAdditionallyDescending)
254  {
255  return SortAdditionallyDescending;
256  }
257  else if(resultAction == d->clearAdditionalSorting)
258  {
259  return ClearAdditionalSorting;
260  }
261  else if(resultAction == d->removeAdditionalSortingForColumn)
262  {
263  return RemoveAdditionalSortingForColumn;
264  }
265 
266  return NothingHappened;
267 }
Structure describing server filter.
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.