diff --git a/tools/chatgui/src/flagpainter.cpp b/tools/chatgui/src/flagpainter.cpp index cba8d0b6..2292e700 100644 --- a/tools/chatgui/src/flagpainter.cpp +++ b/tools/chatgui/src/flagpainter.cpp @@ -21,26 +21,24 @@ void FlagPainter::drawRadio(QPainter* p, int x, int y, int sz, const QColor& col void FlagPainter::draw(QPainter* p, uint8_t flags, int x, int y, int sz) { if (!flags) return; int cx = x; - if (flags & MEMBER_FLAG_SUPERNODE) { drawLightning(p, cx, y, sz); cx += sz + 2; } if (flags & MEMBER_FLAG_ADMIN) { drawStar(p, cx, y, sz); cx += sz + 2; } if (flags & MEMBER_FLAG_MODER) { drawShield(p, cx, y, sz); cx += sz + 2; } } -void FlagPainter::drawLightning(QPainter* p, int x, int y, int sz) { +// Три блока серверной стойки; масштабируется вместе с аватаром. +void FlagPainter::drawServer(QPainter* p, int x, int y, int sz) { p->save(); p->setRenderHint(QPainter::Antialiasing); - QPainterPath path; - qreal cx = x + sz / 2.0, t = y + 1.0, b = y + sz - 1.0; - path.moveTo(cx, t); - path.lineTo(cx - sz * 0.3, t + sz * 0.55); - path.lineTo(cx - sz * 0.05, t + sz * 0.5); - path.lineTo(cx + sz * 0.15, b); - path.lineTo(cx + sz * 0.1, t + sz * 0.55); - path.lineTo(cx + sz * 0.35, t + sz * 0.4); - path.closeSubpath(); - p->setPen(Qt::NoPen); - p->setBrush(QColor("#FFC107")); - p->drawPath(path); + p->translate(x, y); + p->scale(sz / 24.0, sz / 24.0); + for (int top : {2, 9, 16}) { + p->setPen(QPen(QColor("#37474F"), 0.8)); p->setBrush(QColor("#607D8B")); + p->drawRoundedRect(QRectF(2, top, 20, 5.5), 1, 1); + p->setPen(QPen(QColor("#ECEFF1"), 1.2, Qt::SolidLine, Qt::RoundCap)); + p->drawLine(QPointF(5, top + 2.75), QPointF(11, top + 2.75)); + p->setPen(Qt::NoPen); p->setBrush(QColor("#B0BEC5")); + p->drawEllipse(QPointF(18, top + 2.75), 1, 1); + } p->restore(); } diff --git a/tools/chatgui/src/flagpainter.h b/tools/chatgui/src/flagpainter.h index e516cd26..4e381caa 100644 --- a/tools/chatgui/src/flagpainter.h +++ b/tools/chatgui/src/flagpainter.h @@ -10,7 +10,7 @@ #include // Значения совпадают с CHAT_MEMBER_FLAG_* (src/chat/chat_member.h). -#define MEMBER_FLAG_SUPERNODE 0x01 // молния +#define MEMBER_FLAG_SUPERNODE 0x01 // сервер вместо аватара; draw игнорирует #define MEMBER_FLAG_ADMIN 0x02 // звезда #define MEMBER_FLAG_MODER 0x04 // щит #define MEMBER_FLAG_DELETED 0x08 // draw игнорирует; делегат отдельно зачёркивает имя @@ -18,14 +18,14 @@ class FlagPainter { public: - // SUPERNODE -> ADMIN -> MODER, только установленные биты, с промежутком 2 между квадратами sz×sz. + // ADMIN -> MODER, только установленные биты, с промежутком 2 между квадратами sz×sz. // Общая ширина при n>0: n*sz+(n-1)*2; flags без этих битов не рисует ничего. static void draw(QPainter* p, uint8_t flags, int x, int y, int sz); + static void drawServer(QPainter* p, int x, int y, int sz); // серверная стойка в квадрате sz×sz static void drawStorage(QPainter* p, int x, int y, int sz); // серый значок диска в квадрате sz×sz static void drawRadio(QPainter* p, int x, int y, int sz, const QColor& color); // контур рации заданного цвета, без заливки private: - static void drawLightning(QPainter* p, int x, int y, int sz); static void drawStar(QPainter* p, int x, int y, int sz); static void drawShield(QPainter* p, int x, int y, int sz); };