From f550cb0605cda32022aad9f2ca67309db691319d Mon Sep 17 00:00:00 2001 From: Srivats P Date: Mon, 3 Dec 2018 21:14:05 +0530 Subject: [PATCH] Adorn portList linkState icon with transmit/capture indicators The new 'exclusive' indicator may need more work in the future --- client/icons/deco_exclusive.png | Bin 793 -> 0 bytes client/icons/frag_capture.png | Bin 0 -> 268 bytes client/icons/frag_exclusive.png | Bin 0 -> 317 bytes client/icons/frag_link_down.png | Bin 0 -> 293 bytes client/icons/frag_link_unknown.png | Bin 0 -> 253 bytes client/icons/frag_link_up.png | Bin 0 -> 316 bytes client/icons/frag_transmit.png | Bin 0 -> 286 bytes client/ostinato.qrc | 9 +++- client/port.cpp | 4 +- client/port.h | 4 ++ client/portmodel.cpp | 67 +++++++++++++++++++++-------- client/portmodel.h | 12 +++--- 12 files changed, 69 insertions(+), 27 deletions(-) delete mode 100644 client/icons/deco_exclusive.png create mode 100644 client/icons/frag_capture.png create mode 100644 client/icons/frag_exclusive.png create mode 100644 client/icons/frag_link_down.png create mode 100644 client/icons/frag_link_unknown.png create mode 100644 client/icons/frag_link_up.png create mode 100644 client/icons/frag_transmit.png diff --git a/client/icons/deco_exclusive.png b/client/icons/deco_exclusive.png deleted file mode 100644 index 911da3f1d31fca4494a4beb22014e5c5c724c236..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 793 zcmV+!1LpjRP)`EB*FHYdKr%;k=xO&(k^EfNlSiKZ>5l+xr|%SFOV@6-ysFmD2F5 ze93OiS+LaQym;|2f6tbH%~V`D+ND?vc>4J^KSLxEMifJQ`8>*~y^+pGr&o-n=LJ zGWB(yB#;DR8&Lhqi{0(#wc#SwSB~jZKzIFx`8od>2Fo-Pfe7*M8^q#qw2yTxiXzd~ zRaz|F*rr78G`JZXG*YX~5K@5k>G@0HdlBo-6v1jHye?%qRwO@+-hO7J^4LlPG>@A1#{ zQFl4x7tnG)+cz_2Mq_f*H!U)kgg{iHqxT)Yr3ec@K!`)z_%h1c0Y2Eu(dMPkrhq5v zY+bKWfx|sTiOEB71HuwS*CDzA%ReBv4*7Zy7RM0n6`5#chfOJK`ze)Y6>d6Z?UmyNHH!3DdsP-ARyDo}1HO+>7_um7 zx_gj{+_aU_OUH_~Jd?KI#ICZujD`of2mDpCv_zFGE%6}tfL|j!WGu_i-u>4%{%d{$ X7`zMSfT21V00000NkvXXu0mjfkBx0` diff --git a/client/icons/frag_capture.png b/client/icons/frag_capture.png new file mode 100644 index 0000000000000000000000000000000000000000..2702f43e018cd0a3786b722fad26db7ed2fdac35 GIT binary patch literal 268 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!G)eKjv*HQZ~Lsd4jTx#Tz7KqXgL`B%f!-u z-9tZj!54PB+@x4TBzBtoit0_~+};_y#N#3R?#)NfY$z!Bz%8ZubW(9!m!Hhz9q%^k(OP-aR{#%-}(>zI2CeJ+1l(I-1$>$j|)kB=>`@wX*1EDiZ`@4oqY z_gR}-1jL`;nJiFrDeCyv7so8GU){*8wfcSaW-ndsU%5Zz87df4+dUSTy!)LDbS#6X LtDnm{r-UW|zbR&_ literal 0 HcmV?d00001 diff --git a/client/icons/frag_exclusive.png b/client/icons/frag_exclusive.png new file mode 100644 index 0000000000000000000000000000000000000000..89e1aea6f35ed1168e5e3776cd02a2093a0eb38f GIT binary patch literal 317 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1quc!AqVljv*HQZztGtwHOGrZsz`%urxuHBT2Wc zY3bC2%1VO37Qf^Pg93(y^W-UOBIP z)v7T6OWPkD_qc2_`w8o@O@?kNrV-btK2%!Czew%eKEnr>O?p-Ir=<#->cuWfjdYc0 zlPv0)>3aM5<9+Yr=X{RJN|0!4))RW8B>H=Sk-JI9w-9^YXc5VzL$rYjwme2`jzQA l^}We4=XKLi0KxcBV6Y0 z&rWdpxE}m^LE%Vz&Xky$3bC{OH{D}y&Xtt=mu~q*DEsYf!*7nOqq9p=1I#s_PUqWh z@%);AQ@>%~hkNBZyMo@C#@$(L`Fuig+Z3S*@AqbV`G{H^lk1Xiw=XSYa-Q2NpnPI_ v5RdAz=^c0Ly^k1dz2>WFy8TGIHbYtCj^Mc)W{1uIx{krq)z4*}Q$iB}mj_%n literal 0 HcmV?d00001 diff --git a/client/icons/frag_link_up.png b/client/icons/frag_link_up.png new file mode 100644 index 0000000000000000000000000000000000000000..552cd58240c2867545262be485398ecdc11ff61e GIT binary patch literal 316 zcmV-C0mJ@@P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0MSWAK~y+TV;BXL z14bx~7r5@Smiqnwf7<_l|3evm|7ZCB``_xnzkbg;8hQR13senW0MZ;S8(Xi=qs8#^ z?@xwXZ*SBuzPJD+)xZQ+K>+;!`#)5bTa)4Phbs){-kxLN=MZ4{|NVC;NRBuIe*I(k z`uhvRw_jfw{`~vR@bk|PhCko_f#rxY;NSPZs~^0-%OJra&LGAn#_;*mCx*YTf3F6~ z5fzBma}A~b{`#Nx_xqpFzu*5d{CV?x_0Nw#XWg9l_!(5mC?Fp&FaQ9!bzz;x`}QON O0000n5k#5i|x&ycK;toXM! zB_SzFVdQ&MBb@05O - icons/transmit_on.png icons/about.png icons/add.png icons/arrow_down.png @@ -15,12 +14,17 @@ icons/bullet_yellow.png icons/control_play.png icons/control_stop.png - icons/deco_exclusive.png icons/delete.png icons/devicegroup_add.png icons/devicegroup_delete.png icons/devicegroup_edit.png icons/exit.png + icons/frag_capture.png + icons/frag_exclusive.png + icons/frag_link_down.png + icons/frag_link_unknown.png + icons/frag_link_up.png + icons/frag_transmit.png icons/gaps.png icons/help.png icons/logo.png @@ -45,5 +49,6 @@ icons/stream_duplicate.png icons/stream_edit.png icons/stream_stats.png + icons/transmit_on.png diff --git a/client/port.cpp b/client/port.cpp index e9da599..c7154e7 100644 --- a/client/port.cpp +++ b/client/port.cpp @@ -531,7 +531,9 @@ void Port::updateStats(OstProto::PortStats *portStats) oldState = stats.state(); stats.MergeFrom(*portStats); - if (oldState.link_state() != stats.state().link_state()) + if ((oldState.link_state() != stats.state().link_state()) + || (oldState.is_transmit_on() != stats.state().is_transmit_on()) + || (oldState.is_capture_on() != stats.state().is_capture_on())) { qDebug("portstate changed"); emit portDataChanged(mPortGroupId, mPortId); diff --git a/client/port.h b/client/port.h index d794480..9a7d7e6 100644 --- a/client/port.h +++ b/client/port.h @@ -130,6 +130,10 @@ public: } OstProto::LinkState linkState() { return stats.state().link_state(); } + bool isTransmitting() + { return stats.state().is_transmit_on(); } + bool isCapturing() + { return stats.state().is_capture_on(); } OstProto::PortStats getStats() { return stats; } QTemporaryFile* getCaptureFile() diff --git a/client/portmodel.cpp b/client/portmodel.cpp index ae3d81e..da371d2 100644 --- a/client/portmodel.cpp +++ b/client/portmodel.cpp @@ -22,6 +22,7 @@ along with this program. If not, see #include #include +#include #if 0 #define DBG0(x) qDebug(x) @@ -35,23 +36,6 @@ PortModel::PortModel(PortGroupList *p, QObject *parent) : QAbstractItemModel(parent) { pgl = p; - - portIconFactory[OstProto::LinkStateUnknown][false] = - QIcon(":/icons/bullet_white.png"); - portIconFactory[OstProto::LinkStateDown][false] = - QIcon(":/icons/bullet_red.png"); - portIconFactory[OstProto::LinkStateUp][false] = - QIcon(":/icons/bullet_green.png"); - - for (int linkState = 0; linkState < kLinkStatesCount; linkState++) - { - QPixmap pixmap(":/icons/deco_exclusive.png"); - QPainter painter(&pixmap); - QIcon icon = portIconFactory[linkState][false]; - - painter.drawPixmap(0, 0, icon.pixmap(QSize(32,32))); - portIconFactory[linkState][true] = QIcon(pixmap); - } } int PortModel::rowCount(const QModelIndex &parent) const @@ -185,7 +169,11 @@ QVariant PortModel::data(const QModelIndex &index, int role) const } else if (role == Qt::DecorationRole) { - return portIconFactory[port->linkState()][port->hasExclusiveControl()]; + return statusIcon( + port->linkState(), + port->hasExclusiveControl(), + port->isTransmitting(), + port->isCapturing()); } else if (role == Qt::ForegroundRole) { @@ -294,7 +282,50 @@ quint32 PortModel::portId(const QModelIndex& index) return (index.internalId()) & 0xFFFF; } +QPixmap PortModel::statusIcon( + int linkState, bool exclusive, bool transmit, bool capture) const +{ + QPixmap pixmap; + QString key = QString("$ost:portStatusIcon:%1:%2:%3:%4") + .arg(linkState).arg(exclusive).arg(transmit).arg(capture); + if (QPixmapCache::find(key, pixmap)) + return pixmap; + + static int sz = QPixmap(":/icons/frag_link_up.png").width(); + + // All frag_* icons must be of same size and can be overlayed + // on top of each other; assume square icons + + pixmap = QPixmap(sz, sz); + pixmap.fill(Qt::transparent); + + QPainter painter(&pixmap); + + switch (linkState) { + case OstProto::LinkStateUp: + painter.drawPixmap(0, 0, QPixmap(":/icons/frag_link_up.png")); + break; + case OstProto::LinkStateDown: + painter.drawPixmap(0, 0, QPixmap(":/icons/frag_link_down.png")); + break; + case OstProto::LinkStateUnknown: + painter.drawPixmap(0, 0, QPixmap(":/icons/frag_link_unknown.png")); + break; + } + + if (exclusive) + painter.drawPixmap(0, 0, QPixmap(":/icons/frag_exclusive.png")); + + if (transmit) + painter.drawPixmap(0, 0, QPixmap(":/icons/frag_transmit.png")); + + if (capture) + painter.drawPixmap(0, 0, QPixmap(":/icons/frag_capture.png")); + + QPixmapCache::insert(key, pixmap); + return pixmap; +} // ---------------------------------------------- // Slots diff --git a/client/portmodel.h b/client/portmodel.h index 4464fdf..0bfdf6a 100644 --- a/client/portmodel.h +++ b/client/portmodel.h @@ -50,12 +50,6 @@ public: quint32 portGroupId(const QModelIndex& index); quint32 portId(const QModelIndex& index); -private: - PortGroupList *pgl; - static const int kLinkStatesCount = 3; - static const int kExclusiveStatesCount = 2; - QIcon portIconFactory[kLinkStatesCount][kExclusiveStatesCount]; - private slots: // FIXME: these are invoked from outside - how come they are "private"? void when_portGroupDataChanged(int portGroupId, int portId); @@ -71,6 +65,12 @@ private slots: void triggerLayoutAboutToBeChanged(); void triggerLayoutChanged(); #endif + +private: + QPixmap statusIcon(int linkState, bool exclusive, + bool transmit, bool capture) const; + + PortGroupList *pgl; }; #endif