00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
#include "kbuttonbox.moc"
00049
#include <qpushbutton.h>
00050
#include <qptrlist.h>
00051
#include <assert.h>
00052
00053
#define minButtonWidth 50
00054
00055
class KButtonBox::Item {
00056
public:
00057
QPushButton *button;
00058
bool noexpand;
00059
unsigned short stretch;
00060
unsigned short actual_size;
00061 };
00062
00063
template class QPtrList<KButtonBox::Item>;
00064
00065
class KButtonBoxPrivate {
00066
public:
00067
unsigned short border;
00068
unsigned short autoborder;
00069
unsigned short orientation;
00070
bool activated;
00071
QPtrList<KButtonBox::Item> buttons;
00072 };
00073
00074 KButtonBox::KButtonBox(
QWidget *parent, Orientation _orientation,
00075
int border,
int autoborder)
00076 :
QWidget(parent)
00077 {
00078 data =
new KButtonBoxPrivate;
00079 assert(data != 0);
00080
00081 data->orientation = _orientation;
00082 data->border = border;
00083 data->autoborder = autoborder < 0 ? border : autoborder;
00084 data->buttons.setAutoDelete(
true);
00085 }
00086
00087 KButtonBox::~KButtonBox() {
00088
delete data;
00089 }
00090
00091 QPushButton *
KButtonBox::addButton(
const QString& text,
bool noexpand) {
00092 Item *item =
new Item;
00093
00094 item->button =
new QPushButton(text,
this);
00095 item->noexpand = noexpand;
00096 data->buttons.append(item);
00097 item->button->adjustSize();
00098
00099 this->updateGeometry();
00100
00101
return item->button;
00102 }
00103
00104
QPushButton *
00105 KButtonBox::addButton(
00106
const QString & text,
00107
QObject * receiver,
00108
const char * slot,
00109
bool noexpand
00110 )
00111 {
00112
QPushButton * pb =
addButton(text, noexpand);
00113
00114
if ((0 != receiver) && (0 != slot))
00115 QObject::connect(pb, SIGNAL(clicked()), receiver, slot);
00116
00117
return pb;
00118 }
00119
00120
00121 void KButtonBox::addStretch(
int scale) {
00122
if(scale > 0) {
00123 Item *item =
new Item;
00124 item->button = 0;
00125 item->noexpand =
false;
00126 item->stretch = scale;
00127 data->buttons.append(item);
00128 }
00129 }
00130
00131 void KButtonBox::layout() {
00132
00133
QSize bs =
bestButtonSize();
00134
00135
for(
unsigned int i = 0; i < data->buttons.count(); i++) {
00136 Item *item = data->buttons.at(i);
00137
QPushButton *b = item->button;
00138
if(b != 0) {
00139
if(item->noexpand)
00140 b->setFixedSize(buttonSizeHint(b));
00141
else
00142 b->setFixedSize(bs);
00143 }
00144 }
00145
00146 setMinimumSize(
sizeHint());
00147 }
00148
00149
void KButtonBox::placeButtons() {
00150
unsigned int i;
00151
00152
if(data->orientation == Horizontal) {
00153
00154
int fs = width() - 2 * data->border;
00155
int stretch = 0;
00156
for(i = 0; i < data->buttons.count(); i++) {
00157 Item *item = data->buttons.at(i);
00158
if(item->button != 0) {
00159 fs -= item->button->width();
00160
00161
00162
if(i != data->buttons.count() - 1)
00163 fs -= data->autoborder;
00164 }
else
00165 stretch +=item->stretch;
00166 }
00167
00168
00169
int x_pos = data->border;
00170
for(i = 0; i < data->buttons.count(); i++) {
00171 Item *item = data->buttons.at(i);
00172
if(item->button != 0) {
00173
QPushButton *b = item->button;
00174 b->move(x_pos, (height() - b->height()) / 2);
00175
00176 x_pos += b->width() + data->autoborder;
00177 }
else
00178 x_pos += (
int)((((
double)fs) * item->stretch) / stretch);
00179 }
00180 }
else {
00181
00182
int fs = height() - 2 * data->border;
00183
int stretch = 0;
00184
for(i = 0; i < data->buttons.count(); i++) {
00185 Item *item = data->buttons.at(i);
00186
if(item->button != 0)
00187 fs -= item->button->height() + data->autoborder;
00188
else
00189 stretch +=item->stretch;
00190 }
00191
00192
00193
int y_pos = data->border;
00194
for(i = 0; i < data->buttons.count(); i++) {
00195 Item *item = data->buttons.at(i);
00196
if(item->button != 0) {
00197
QPushButton *b = item->button;
00198 b->move((width() - b->width()) / 2, y_pos);
00199
00200 y_pos += b->height() + data->autoborder;
00201 }
else
00202 y_pos += (
int)((((
double)fs) * item->stretch) / stretch);
00203 }
00204 }
00205 }
00206
00207
void KButtonBox::resizeEvent(
QResizeEvent *) {
00208 placeButtons();
00209 }
00210
00211 QSize KButtonBox::bestButtonSize()
const {
00212
QSize s(0, 0);
00213
unsigned int i;
00214
00215
00216
for(i = 0; i < data->buttons.count(); i++) {
00217
KButtonBox *that = (
KButtonBox*)
this;
00218 Item *item = that->
data->buttons.at(i);
00219
QPushButton *b = item->button;
00220
00221
if(b != 0 && !item->noexpand) {
00222
QSize bs = buttonSizeHint(b);
00223
00224
if(bs.width() > s.width())
00225 s.setWidth(bs.width());
00226
if(bs.height() > s.height())
00227 s.setHeight(bs.height());
00228 }
00229 }
00230
00231
return s;
00232 }
00233
00234 QSize KButtonBox::sizeHint()
const {
00235
unsigned int i, dw;
00236
00237
if(data->buttons.count() == 0)
00238
return QSize(0, 0);
00239
else {
00240 dw = 2 * data->border;
00241
00242
QSize bs =
bestButtonSize();
00243
for(i = 0; i < data->buttons.count(); i++) {
00244
KButtonBox *that = (
KButtonBox*)
this;
00245 Item *item = that->
data->buttons.at(i);
00246
QPushButton *b = item->button;
00247
if(b != 0) {
00248
QSize s;
00249
if(item->noexpand)
00250 s = that->
buttonSizeHint(b);
00251
else
00252 s = bs;
00253
00254
if(data->orientation == Horizontal)
00255 dw += s.width();
00256
else
00257 dw += s.height();
00258
00259
if( i != data->buttons.count() - 1 )
00260 dw += data->autoborder;
00261 }
00262 }
00263
00264
if(data->orientation == Horizontal)
00265
return QSize(dw, bs.height() + 2 * data->border);
00266
else
00267
return QSize(bs.width() + 2 * data->border, dw);
00268 }
00269 }
00270
00271
QSizePolicy KButtonBox::sizePolicy()
const
00272
{
00273
return data->orientation == Horizontal?
00274
QSizePolicy( QSizePolicy::Minimum, QSizePolicy::Fixed ) :
00275 QSizePolicy( QSizePolicy::Fixed, QSizePolicy::Minimum );
00276 }
00277
00278
00279
00280
00281
00282
00283
QSize KButtonBox::buttonSizeHint(
QPushButton *b)
const {
00284
QSize s = b->sizeHint();
00285
QSize ms = b->minimumSize();
00286
if(s.width() < minButtonWidth)
00287 s.setWidth(minButtonWidth);
00288
00289
00290
if(ms.width() > s.width())
00291 s.setWidth(ms.width());
00292
if(ms.height() > s.height())
00293 s.setHeight(ms.height());
00294
00295
return s;
00296 }
00297
00298
void KButtonBox::virtual_hook(
int,
void* )
00299 { }
00300