diff --git a/cockatrice/cockatrice.qrc b/cockatrice/cockatrice.qrc
index 21c2eb76..dfc24372 100644
--- a/cockatrice/cockatrice.qrc
+++ b/cockatrice/cockatrice.qrc
@@ -64,5 +64,10 @@
resources/countries/tr.svg
resources/countries/uk.svg
resources/countries/us.svg
+
+ resources/userlevels/normal.svg
+ resources/userlevels/registered.svg
+ resources/userlevels/judge.svg
+ resources/userlevels/admin.svg
diff --git a/cockatrice/resources/userlevels/admin.svg b/cockatrice/resources/userlevels/admin.svg
new file mode 100644
index 00000000..0915200f
--- /dev/null
+++ b/cockatrice/resources/userlevels/admin.svg
@@ -0,0 +1,249 @@
+
+
+
+
diff --git a/cockatrice/resources/userlevels/judge.svg b/cockatrice/resources/userlevels/judge.svg
new file mode 100644
index 00000000..c8246bca
--- /dev/null
+++ b/cockatrice/resources/userlevels/judge.svg
@@ -0,0 +1,302 @@
+
+
+
+
diff --git a/cockatrice/resources/userlevels/normal.svg b/cockatrice/resources/userlevels/normal.svg
new file mode 100644
index 00000000..85473c45
--- /dev/null
+++ b/cockatrice/resources/userlevels/normal.svg
@@ -0,0 +1,207 @@
+
+
+
+
diff --git a/cockatrice/resources/userlevels/registered.svg b/cockatrice/resources/userlevels/registered.svg
new file mode 100644
index 00000000..d1961f50
--- /dev/null
+++ b/cockatrice/resources/userlevels/registered.svg
@@ -0,0 +1,147 @@
+
+
+
+
diff --git a/cockatrice/src/dlg_create_token.cpp b/cockatrice/src/dlg_create_token.cpp
index 2d3ea9df..e7c63143 100644
--- a/cockatrice/src/dlg_create_token.cpp
+++ b/cockatrice/src/dlg_create_token.cpp
@@ -12,7 +12,8 @@ DlgCreateToken::DlgCreateToken(QWidget *parent)
: QDialog(parent)
{
nameLabel = new QLabel(tr("&Name:"));
- nameEdit = new QLineEdit;
+ nameEdit = new QLineEdit(tr("Token"));
+ nameEdit->selectAll();
nameLabel->setBuddy(nameEdit);
colorLabel = new QLabel(tr("C&olor:"));
diff --git a/cockatrice/src/main.cpp b/cockatrice/src/main.cpp
index a6245684..4bf0c48a 100644
--- a/cockatrice/src/main.cpp
+++ b/cockatrice/src/main.cpp
@@ -34,6 +34,7 @@
#include "dlg_settings.h"
#include "carddatabase.h"
#include "settingscache.h"
+#include "pixmapgenerator.h"
//Q_IMPORT_PLUGIN(qjpeg)
@@ -124,6 +125,9 @@ int main(int argc, char *argv[])
delete db;
delete settingsCache;
-
+ PingPixmapGenerator::clear();
+ CountryPixmapGenerator::clear();
+ UserLevelPixmapGenerator::clear();
+
return 0;
}
diff --git a/cockatrice/src/pixmapgenerator.cpp b/cockatrice/src/pixmapgenerator.cpp
index e3cfe87d..35ba5bc7 100644
--- a/cockatrice/src/pixmapgenerator.cpp
+++ b/cockatrice/src/pixmapgenerator.cpp
@@ -1,4 +1,5 @@
#include "pixmapgenerator.h"
+#include "protocol_datastructures.h"
#include
#include
#include
@@ -52,4 +53,32 @@ QPixmap CountryPixmapGenerator::generatePixmap(int height, const QString &countr
return pixmap;
}
-QMap CountryPixmapGenerator::pmCache;
\ No newline at end of file
+QMap CountryPixmapGenerator::pmCache;
+
+QPixmap UserLevelPixmapGenerator::generatePixmap(int height, int userLevel)
+{
+ int key = height * 10000 + userLevel;
+ if (pmCache.contains(key))
+ return pmCache.value(key);
+
+ QString levelString;
+ if (userLevel & ServerInfo_User::IsAdmin)
+ levelString = "judge";
+ else if (userLevel & ServerInfo_User::IsJudge)
+ levelString = "judge";
+ else if (userLevel &ServerInfo_User::IsRegistered)
+ levelString = "registered";
+ else
+ levelString = "normal";
+ QSvgRenderer svg(QString(":/resources/userlevels/" + levelString + ".svg"));
+ int width = (int) round(height * (double) svg.defaultSize().width() / (double) svg.defaultSize().height());
+ QPixmap pixmap(width, height);
+ pixmap.fill(Qt::transparent);
+ QPainter painter(&pixmap);
+ svg.render(&painter, QRectF(0, 0, width, height));
+
+ pmCache.insert(key, pixmap);
+ return pixmap;
+}
+
+QMap UserLevelPixmapGenerator::pmCache;
diff --git a/cockatrice/src/pixmapgenerator.h b/cockatrice/src/pixmapgenerator.h
index ee70a0fa..2479bf28 100644
--- a/cockatrice/src/pixmapgenerator.h
+++ b/cockatrice/src/pixmapgenerator.h
@@ -1,5 +1,5 @@
-#ifndef PINGPIXMAPGENERATOR_H
-#define PINGPIXMAPGENERATOR_H
+#ifndef PIXMAPGENERATOR_H
+#define PIXMAPGENERATOR_H
#include
#include
@@ -9,6 +9,7 @@ private:
static QMap pmCache;
public:
static QPixmap generatePixmap(int size, int value, int max);
+ static void clear() { pmCache.clear(); }
};
class CountryPixmapGenerator {
@@ -16,6 +17,15 @@ private:
static QMap pmCache;
public:
static QPixmap generatePixmap(int height, const QString &countryCode);
+ static void clear() { pmCache.clear(); }
+};
+
+class UserLevelPixmapGenerator {
+private:
+ static QMap pmCache;
+public:
+ static QPixmap generatePixmap(int height, int userLevel);
+ static void clear() { pmCache.clear(); }
};
#endif
diff --git a/cockatrice/src/playerlistwidget.cpp b/cockatrice/src/playerlistwidget.cpp
index f634f058..93b10b03 100644
--- a/cockatrice/src/playerlistwidget.cpp
+++ b/cockatrice/src/playerlistwidget.cpp
@@ -14,7 +14,7 @@ PlayerListWidget::PlayerListWidget(QWidget *parent)
spectatorIcon = QIcon(":/resources/icon_spectator.svg");
setIconSize(QSize(20, 15));
- setColumnCount(5);
+ setColumnCount(6);
setRootIsDecorated(false);
setSelectionMode(NoSelection);
header()->setResizeMode(QHeaderView::ResizeToContents);
@@ -26,8 +26,9 @@ void PlayerListWidget::retranslateUi()
headerItem()->setText(0, QString());
headerItem()->setText(1, QString());
headerItem()->setText(2, QString());
- headerItem()->setText(3, tr("Player name"));
- headerItem()->setText(4, tr("Deck"));
+ headerItem()->setText(3, QString());
+ headerItem()->setText(4, tr("Player name"));
+ headerItem()->setText(5, tr("Deck"));
}
void PlayerListWidget::addPlayer(ServerInfo_PlayerProperties *player)
@@ -46,9 +47,10 @@ void PlayerListWidget::updatePlayerProperties(ServerInfo_PlayerProperties *prop)
player->setIcon(1, prop->getSpectator() ? spectatorIcon : playerIcon);
player->setIcon(2, gameStarted ? (prop->getConceded() ? concededIcon : QIcon()) : (prop->getReadyStart() ? readyIcon : notReadyIcon));
- player->setText(3, prop->getUserInfo()->getName());
+ player->setIcon(3, QIcon(UserLevelPixmapGenerator::generatePixmap(12, prop->getUserInfo()->getUserLevel())));
+ player->setText(4, prop->getUserInfo()->getName());
if (!prop->getUserInfo()->getCountry().isEmpty())
- player->setIcon(3, QIcon(CountryPixmapGenerator::generatePixmap(12, prop->getUserInfo()->getCountry())));
+ player->setIcon(4, QIcon(CountryPixmapGenerator::generatePixmap(12, prop->getUserInfo()->getCountry())));
QString deckText;
if (!prop->getSpectator())
@@ -57,7 +59,7 @@ void PlayerListWidget::updatePlayerProperties(ServerInfo_PlayerProperties *prop)
case -1: deckText = tr("local"); break;
default: deckText = tr("#%1").arg(prop->getDeckId());
}
- player->setText(4, deckText);
+ player->setText(5, deckText);
}
void PlayerListWidget::removePlayer(int playerId)
@@ -76,7 +78,7 @@ void PlayerListWidget::setActivePlayer(int playerId)
i.next();
QTreeWidgetItem *twi = i.value();
QColor c = i.key() == playerId ? QColor(150, 255, 150) : Qt::white;
- twi->setBackground(3, c);
+ twi->setBackground(4, c);
}
}
@@ -85,7 +87,7 @@ void PlayerListWidget::updatePing(int playerId, int pingTime)
QTreeWidgetItem *twi = players.value(playerId, 0);
if (!twi)
return;
- twi->setIcon(0, QIcon(PingPixmapGenerator::generatePixmap(10, pingTime, 10)));
+ twi->setIcon(0, QIcon(PingPixmapGenerator::generatePixmap(12, pingTime, 10)));
}
void PlayerListWidget::setGameStarted(bool _gameStarted)
diff --git a/cockatrice/src/tab_game.cpp b/cockatrice/src/tab_game.cpp
index d0c75ef8..6e20e1ab 100644
--- a/cockatrice/src/tab_game.cpp
+++ b/cockatrice/src/tab_game.cpp
@@ -553,6 +553,8 @@ void TabGame::eventPlayerPropertiesChanged(Event_PlayerPropertiesChanged *event,
void TabGame::eventJoin(Event_Join *event, GameEventContext * /*context*/)
{
ServerInfo_PlayerProperties *playerInfo = event->getPlayer();
+ if (players.contains(playerInfo->getPlayerId()))
+ return;
if (playerInfo->getSpectator()) {
spectators.insert(playerInfo->getPlayerId(), playerInfo->getUserInfo()->getName());
messageLog->logJoinSpectator(playerInfo->getUserInfo()->getName());
diff --git a/cockatrice/src/tab_server.cpp b/cockatrice/src/tab_server.cpp
index 5439f8af..7c8d19ce 100644
--- a/cockatrice/src/tab_server.cpp
+++ b/cockatrice/src/tab_server.cpp
@@ -241,7 +241,7 @@ UserList::UserList(AbstractClient *_client, QWidget *parent)
: QGroupBox(parent)
{
userTree = new QTreeWidget;
- userTree->setColumnCount(2);
+ userTree->setColumnCount(3);
userTree->header()->setResizeMode(QHeaderView::ResizeToContents);
userTree->setHeaderHidden(true);
userTree->setRootIsDecorated(false);
@@ -273,7 +273,7 @@ void UserList::processUserInfo(ServerInfo_User *user)
QTreeWidgetItem *item = 0;
for (int i = 0; i < userTree->topLevelItemCount(); ++i) {
QTreeWidgetItem *temp = userTree->topLevelItem(i);
- if (temp->data(1, Qt::UserRole) == user->getName()) {
+ if (temp->data(2, Qt::UserRole) == user->getName()) {
item = temp;
break;
}
@@ -283,9 +283,10 @@ void UserList::processUserInfo(ServerInfo_User *user)
userTree->addTopLevelItem(item);
retranslateUi();
}
- item->setIcon(0, QIcon(CountryPixmapGenerator::generatePixmap(12, user->getCountry())));
- item->setData(1, Qt::UserRole, user->getName());
- item->setData(1, Qt::DisplayRole, user->getName());
+ item->setIcon(0, QIcon(UserLevelPixmapGenerator::generatePixmap(12, user->getUserLevel())));
+ item->setIcon(1, QIcon(CountryPixmapGenerator::generatePixmap(12, user->getCountry())));
+ item->setData(2, Qt::UserRole, user->getName());
+ item->setData(2, Qt::DisplayRole, user->getName());
}
void UserList::processResponse(ProtocolResponse *response)
@@ -310,7 +311,7 @@ void UserList::processUserJoinedEvent(Event_UserJoined *event)
void UserList::processUserLeftEvent(Event_UserLeft *event)
{
for (int i = 0; i < userTree->topLevelItemCount(); ++i)
- if (userTree->topLevelItem(i)->data(1, Qt::UserRole) == event->getUserName()) {
+ if (userTree->topLevelItem(i)->data(2, Qt::UserRole) == event->getUserName()) {
emit userLeft(event->getUserName());
delete userTree->takeTopLevelItem(i);
retranslateUi();
@@ -320,7 +321,7 @@ void UserList::processUserLeftEvent(Event_UserLeft *event)
void UserList::userClicked(QTreeWidgetItem *item, int /*column*/)
{
- emit openMessageDialog(item->data(1, Qt::UserRole).toString(), true);
+ emit openMessageDialog(item->data(2, Qt::UserRole).toString(), true);
}
TabServer::TabServer(AbstractClient *_client, QWidget *parent)
diff --git a/cockatrice/translations/cockatrice_de.ts b/cockatrice/translations/cockatrice_de.ts
index 79b570fe..eaa5a517 100644
--- a/cockatrice/translations/cockatrice_de.ts
+++ b/cockatrice/translations/cockatrice_de.ts
@@ -698,72 +698,77 @@
&Name:
-
+
+ Token
+ Spielstein
+
+
+
C&olor:
&Farbe:
-
+
white
weiß
-
+
blue
blau
-
+
black
schwarz
-
+
red
rot
-
+
green
grün
-
+
multicolor
mehrfarbig
-
+
colorless
farblos
-
+
&P/T:
&Kampfwerte:
-
+
&Annotation:
&Hinweis:
-
+
&Destroy token when it leaves the table
Spielstein &zerstören, wenn er das Spielfeld verlässt
-
+
&OK
&OK
-
+
&Cancel
A&bbrechen
-
+
Create token
Spielstein erstellen
@@ -2696,27 +2701,27 @@
PlayerListWidget
-
+
Player name
Spielername
-
+
Deck
Deck
-
+
---
---
-
+
local
lokal
-
+
#%1
#%1
diff --git a/cockatrice/translations/cockatrice_en.ts b/cockatrice/translations/cockatrice_en.ts
index 26f28146..812a29af 100644
--- a/cockatrice/translations/cockatrice_en.ts
+++ b/cockatrice/translations/cockatrice_en.ts
@@ -606,72 +606,77 @@
-
+
+ Token
+
+
+
+
C&olor:
-
+
white
-
+
blue
-
+
black
-
+
red
-
+
green
-
+
multicolor
-
+
colorless
-
+
&P/T:
-
+
&Annotation:
-
+
&Destroy token when it leaves the table
-
+
&OK
-
+
&Cancel
-
+
Create token
@@ -1843,27 +1848,27 @@
PlayerListWidget
-
+
Player name
-
+
Deck
-
+
---
-
+
local
-
+
#%1
diff --git a/common/protocol.h b/common/protocol.h
index 32fbf0ee..b7de90f3 100644
--- a/common/protocol.h
+++ b/common/protocol.h
@@ -51,7 +51,7 @@ private:
static void initializeHashAuto();
bool receiverMayDelete;
public:
- static const int protocolVersion = 8;
+ static const int protocolVersion = 9;
static void initializeHash();
virtual int getItemId() const = 0;
bool getReceiverMayDelete() const { return receiverMayDelete; }
diff --git a/common/protocol_datastructures.h b/common/protocol_datastructures.h
index 697ea76f..f6ead555 100644
--- a/common/protocol_datastructures.h
+++ b/common/protocol_datastructures.h
@@ -36,7 +36,8 @@ public:
IsNothing = 0x00,
IsUser = 0x01,
IsRegistered = 0x02,
- IsAdmin = 0x04
+ IsJudge = 0x04,
+ IsAdmin = 0x08
};
ServerInfo_User(const QString &_name = QString(), int _userLevel = IsNothing, const QString &_country = QString());
ServerInfo_User(const ServerInfo_User *other);