servertooltip.cpp
1 //------------------------------------------------------------------------------
2 // servertooltip.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) 2015 "Zalewa" <zalewapl@gmail.com>
22 //------------------------------------------------------------------------------
23 #include "servertooltip.h"
24 
25 #include "configuration/doomseekerconfig.h"
26 #include "pathfinder/pathfinder.h"
27 #include "pathfinder/wadpathfinder.h"
28 #include "serverapi/playerslist.h"
29 #include "serverapi/server.h"
31 #include "serverapi/tooltips/tooltipgenerator.h"
32 
33 namespace ServerTooltip
34 {
35 QString FONT_COLOR_MISSING = "#ff0000";
36 QString FONT_COLOR_WARNING = "#ff9f00";
37 QString FONT_COLOR_FOUND = "#009f00";
38 }
39 
40 QString ServerTooltip::createIwadToolTip(ServerPtr server)
41 {
42  if (!server->isKnown())
43  {
44  return QString();
45  }
46 
47  bool bFindIwad = gConfig.doomseeker.bTellMeWhereAreTheWADsWhenIHoverCursorOverWADSColumn;
48  if (bFindIwad)
49  {
50  static const QString FORMAT_TEMPLATE = "<font color=\"%1\">%2</font>";
51 
52  WadFindResult path = findWad(server, server->iwad());
53  if (path.isValid())
54  {
55  QString msg = path.path().toHtmlEscaped();
56  if (path.isAlias())
57  {
58  msg += " " + L10n::tr("(alias of: %1)").arg(server->iwad().toHtmlEscaped());
59  }
60  return FORMAT_TEMPLATE.arg(FONT_COLOR_FOUND, msg);
61  }
62  else
63  {
64  return FORMAT_TEMPLATE.arg(FONT_COLOR_MISSING, L10n::tr("MISSING"));
65  }
66  }
67 
68  return QString();
69 }
70 
71 QString ServerTooltip::createPlayersToolTip(const TooltipRenderHint &renderHint, ServerCPtr server)
72 {
73  if (server == nullptr || !server->isKnown())
74  {
75  return QString();
76  }
77 
78  TooltipGenerator *tooltipGenerator = server->tooltipGenerator();
79  tooltipGenerator->setRenderHint(renderHint);
80 
81  QString ret;
82  ret = "<div style='white-space: pre'>";
83  ret += tooltipGenerator->gameInfoTableHTML();
84  if (server->players().numClients() != 0)
85  {
86  ret += tooltipGenerator->playerTableHTML();
87  }
88  ret += "</div>";
89 
90  delete tooltipGenerator;
91  return ret;
92 }
93 
94 QString ServerTooltip::createPortToolTip(ServerCPtr server)
95 {
96  if (server == nullptr || !server->isKnown())
97  return QString();
98 
99  QString ret;
100  if (server->isLocked())
101  ret += "Password protected\n";
102  if (server->isLockedInGame())
103  ret += "Password protected in-game\n";
104  if (server->isSecure())
105  ret += "Enforces master bans\n";
106  return ret.trimmed();
107 }
108 
109 QString ServerTooltip::createPwadsToolTip(ServerPtr server)
110 {
111  if (server == nullptr || !server->isKnown() || server->numWads() == 0)
112  {
113  return QString();
114  }
115 
116  // Prepare initial formatting.
117  static const QString toolTip = "<div style='white-space: pre'>%1</div>";
118  QString content;
119 
120  const QList<PWad> &pwads = server->wads();
121 
122  // Check if we should seek and colorize.
123  bool bFindWads = gConfig.doomseeker.bTellMeWhereAreTheWADsWhenIHoverCursorOverWADSColumn;
124 
125  // Engage!
126  if (bFindWads)
127  {
128  QStringList pwadsFormatted;
129  PathFinder pathFinder = server->wadPathFinder();
130  WadPathFinder wadFinder(pathFinder);
131  for (const PWad &wad : pwads)
132  {
133  pwadsFormatted << createPwadToolTipInfo(wad, wadFinder);
134  }
135 
136  content = "<table cellspacing=1>";
137  content += pwadsFormatted.join("\n");
138  content += "</table>";
139  }
140  else
141  {
142  for (const PWad &wad : pwads)
143  {
144  content += wad.name().toHtmlEscaped() + "\n";
145  }
146  content.chop(1); // Get rid of extra \n.
147  }
148 
149  return toolTip.arg(content);
150 }
151 
152 QString ServerTooltip::createPwadToolTipInfo(const PWad &pwad, WadPathFinder &wadFinder)
153 {
154  WadFindResult findResult = wadFinder.find(pwad.name());
155 
156  QString fontColor = "#777777";
157  QStringList cells;
158 
159  cells << pwad.name().toHtmlEscaped();
160  if (findResult.isValid())
161  {
162  fontColor = FONT_COLOR_FOUND;
163  cells << findResult.path().toHtmlEscaped();
164  }
165  else
166  {
167  if (pwad.isOptional())
168  {
169  fontColor = FONT_COLOR_WARNING;
170  cells << L10n::tr("OPTIONAL");
171  }
172  else
173  {
174  fontColor = FONT_COLOR_MISSING;
175  cells << L10n::tr("MISSING");
176  }
177  }
178  if (findResult.isAlias())
179  {
180  cells << L10n::tr("ALIAS");
181  }
182  else
183  {
184  cells << "";
185  }
186 
187  QString formattedStringBegin = QString("<tr style=\"color: %1;\">").arg(fontColor);
188  QString formattedStringMiddle;
189  QString space = "";
190  for (const QString &cell : cells)
191  {
192  formattedStringMiddle += QString("<td style=\"padding-right: 5;\">%1</td>").arg(cell);
193  space = " ";
194  }
195  return formattedStringBegin + formattedStringMiddle + "</tr>";
196 }
197 
198 QString ServerTooltip::createServerNameToolTip(ServerCPtr server)
199 {
200  if (server == nullptr)
201  {
202  return QString();
203  }
204 
205  TooltipGenerator *tooltipGenerator = server->tooltipGenerator();
206 
207  QString ret;
208  QString generalInfo = tooltipGenerator->generalInfoHTML();
209 
210  if (!generalInfo.isEmpty())
211  {
212  ret = "<div style='white-space: pre'>";
213  ret += generalInfo;
214  ret += "</div>";
215  }
216 
217  delete tooltipGenerator;
218  return ret;
219 }