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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + 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 @@ + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + 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);