1 // Copyright (c) Warwick Allison, 1999.
2 // Qt4 conversion copyright (c) Ray Chason, 2012-2014.
3 // NetHack may be freely redistributed.  See license for details.
4 
5 // qt4icon.cpp -- a labelled icon
6 
7 #include "hack.h"
8 #undef Invisible
9 #undef Warning
10 #undef index
11 #undef msleep
12 #undef rindex
13 #undef wizard
14 #undef yn
15 #undef min
16 #undef max
17 
18 #include <QtGui/QtGui>
19 #if QT_VERSION >= 0x050000
20 #include <QtWidgets/QtWidgets>
21 #endif
22 #include "qt4icon.h"
23 
24 namespace nethack_qt4 {
25 
NetHackQtLabelledIcon(QWidget * parent,const char * l)26 NetHackQtLabelledIcon::NetHackQtLabelledIcon(QWidget* parent, const char* l) :
27     QWidget(parent),
28     low_is_good(false),
29     prev_value(-123),
30     turn_count(-1),
31     label(new QLabel(l,this)),
32     icon(0)
33 {
34     initHighlight();
35 }
36 
NetHackQtLabelledIcon(QWidget * parent,const char * l,const QPixmap & i)37 NetHackQtLabelledIcon::NetHackQtLabelledIcon(QWidget* parent, const char* l, const QPixmap& i) :
38     QWidget(parent),
39     low_is_good(false),
40     prev_value(-123),
41     turn_count(-1),
42     label(new QLabel(l,this)),
43     icon(new QLabel(this))
44 {
45     setIcon(i);
46     initHighlight();
47 }
48 
initHighlight()49 void NetHackQtLabelledIcon::initHighlight()
50 {
51     hl_good = "QLabel { background-color : green; color : white }";
52     hl_bad  = "QLabel { background-color : red  ; color : white }";
53 }
54 
setLabel(const QString & t,bool lower)55 void NetHackQtLabelledIcon::setLabel(const QString& t, bool lower)
56 {
57     if (!label) {
58 	label=new QLabel(this);
59 	label->setFont(font());
60 	resizeEvent(0);
61     }
62     if (label->text() != t) {
63 	label->setText(t);
64 	highlight(lower==low_is_good ? hl_good : hl_bad);
65     }
66 }
67 
setLabel(const QString & t,long v,long cv,const QString & tail)68 void NetHackQtLabelledIcon::setLabel(const QString& t, long v, long cv, const QString& tail)
69 {
70     QString buf;
71     if (v==NoNum) {
72 	buf = "";
73     } else {
74 	buf.sprintf("%ld", v);
75     }
76     setLabel(t + buf + tail, cv < prev_value);
77     prev_value=cv;
78 }
79 
setLabel(const QString & t,long v,const QString & tail)80 void NetHackQtLabelledIcon::setLabel(const QString& t, long v, const QString& tail)
81 {
82     setLabel(t,v,v,tail);
83 }
84 
setIcon(const QPixmap & i)85 void NetHackQtLabelledIcon::setIcon(const QPixmap& i)
86 {
87     if (icon) icon->setPixmap(i);
88     else { icon=new QLabel(this); icon->setPixmap(i); resizeEvent(0); }
89     icon->resize(i.width(),i.height());
90 }
91 
setFont(const QFont & f)92 void NetHackQtLabelledIcon::setFont(const QFont& f)
93 {
94     QWidget::setFont(f);
95     if (label) label->setFont(f);
96 }
97 
show()98 void NetHackQtLabelledIcon::show()
99 {
100 #if QT_VERSION >= 300
101     if (isHidden())
102 #else
103     if (!isVisible())
104 #endif
105 	highlight(hl_bad);
106     QWidget::show();
107 }
108 
sizeHint() const109 QSize NetHackQtLabelledIcon::sizeHint() const
110 {
111     QSize iconsize, textsize;
112 
113     if (label && !icon) return label->sizeHint();
114     if (icon && !label) return icon->sizeHint();
115     if (!label && !icon) return QWidget::sizeHint();
116 
117     iconsize = icon->sizeHint();
118     textsize = label->sizeHint();
119     return QSize(
120 	std::max(iconsize.width(), textsize.width()),
121 	iconsize.height() + textsize.height());
122 }
123 
minimumSizeHint() const124 QSize NetHackQtLabelledIcon::minimumSizeHint() const
125 {
126     QSize iconsize, textsize;
127 
128     if (label && !icon) return label->minimumSizeHint();
129     if (icon && !label) return icon->minimumSizeHint();
130     if (!label && !icon) return QWidget::minimumSizeHint();
131 
132     iconsize = icon->minimumSizeHint();
133     textsize = label->minimumSizeHint();
134     return QSize(
135 	std::max(iconsize.width(), textsize.width()),
136 	iconsize.height() + textsize.height());
137 }
138 
highlightWhenChanging()139 void NetHackQtLabelledIcon::highlightWhenChanging()
140 {
141     turn_count=0;
142 }
143 
lowIsGood()144 void NetHackQtLabelledIcon::lowIsGood()
145 {
146     low_is_good=true;
147 }
148 
dissipateHighlight()149 void NetHackQtLabelledIcon::dissipateHighlight()
150 {
151     if (turn_count>0) {
152 	turn_count--;
153 	if (!turn_count)
154 	    unhighlight();
155     }
156 }
157 
highlight(const QString & hl)158 void NetHackQtLabelledIcon::highlight(const QString& hl)
159 {
160     if (label) { // Surely it is?!
161 	if (turn_count>=0) {
162 	    label->setStyleSheet(hl);
163 	    turn_count=4;
164 	    // `4' includes this turn, so dissipates after
165 	    // 3 more keypresses.
166 	} else {
167 	    label->setStyleSheet("");
168 	}
169     }
170 }
171 
unhighlight()172 void NetHackQtLabelledIcon::unhighlight()
173 {
174     if (label) { // Surely it is?!
175 	label->setStyleSheet("");
176     }
177 }
178 
resizeEvent(QResizeEvent *)179 void NetHackQtLabelledIcon::resizeEvent(QResizeEvent*)
180 {
181     setAlignments();
182 
183     //int labw=label ? label->fontMetrics().width(label->text()) : 0;
184     int labh=label ? label->fontMetrics().height() : 0;
185     int icoh=icon ? icon->height() : 0;
186     int h=icoh+labh;
187     int icoy=(h>height() ? height()-labh-icoh : height()/2-h/2);
188     int laby=icoy+icoh;
189     if (icon) {
190 	icon->setGeometry(0,icoy,width(),icoh);
191     }
192     if (label) {
193 	label->setGeometry(0,laby,width(),labh);
194     }
195 }
196 
setAlignments()197 void NetHackQtLabelledIcon::setAlignments()
198 {
199     if (label) label->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
200     if (icon) icon->setAlignment(Qt::AlignHCenter|Qt::AlignVCenter);
201 }
202 
203 } // namespace nethack_qt4
204