зеркало из https://github.com/mozilla/pjs.git
202 строки
4.2 KiB
C++
202 строки
4.2 KiB
C++
|
/****************************************************************************
|
||
|
** $Id: qtlabelled.cpp,v 1.1 1998-09-25 18:01:40 ramiro%netscape.com Exp $
|
||
|
**
|
||
|
** Copyright (C) 1992-1998 Troll Tech AS. All rights reserved.
|
||
|
**
|
||
|
** This file is part of an example program for Qt. This example
|
||
|
** program may be used, distributed and modified without limitation.
|
||
|
**
|
||
|
*****************************************************************************/
|
||
|
|
||
|
#include "qtlabelled.h"
|
||
|
#include "qlayout.h"
|
||
|
#include "qlabel.h"
|
||
|
|
||
|
class QtLabelledPrivate {
|
||
|
public:
|
||
|
QtLabelledPrivate(QtLabelled* parent)
|
||
|
{
|
||
|
QLabel *l = new QLabel(parent, "label");
|
||
|
l->setMargin(2);
|
||
|
|
||
|
label = l;
|
||
|
child = 0;
|
||
|
align = AlignTop;
|
||
|
grid = 0;
|
||
|
}
|
||
|
|
||
|
QWidget* label;
|
||
|
QWidget* child;
|
||
|
int align;
|
||
|
QGridLayout* grid;
|
||
|
};
|
||
|
|
||
|
QtLabelled::QtLabelled( QWidget *parent, const char *name ) :
|
||
|
QFrame(parent, name)
|
||
|
{
|
||
|
init();
|
||
|
}
|
||
|
|
||
|
QtLabelled::QtLabelled( const char *label, QWidget *parent, const char *name ) :
|
||
|
QFrame(parent, name)
|
||
|
{
|
||
|
init();
|
||
|
setLabel(label);
|
||
|
}
|
||
|
|
||
|
void QtLabelled::init()
|
||
|
{
|
||
|
setFrameStyle( QFrame::Box | QFrame::Sunken );
|
||
|
setMargin(9);
|
||
|
d = new QtLabelledPrivate(this);
|
||
|
layout();
|
||
|
resetFrameRect();
|
||
|
}
|
||
|
|
||
|
QtLabelled::~QtLabelled()
|
||
|
{
|
||
|
delete d;
|
||
|
}
|
||
|
|
||
|
const char* QtLabelled::labelText() const
|
||
|
{
|
||
|
if (d->label->inherits("QLabel"))
|
||
|
return ((QLabel*)d->label)->text();
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
QWidget* QtLabelled::label() const
|
||
|
{
|
||
|
return d->label;
|
||
|
}
|
||
|
|
||
|
void QtLabelled::setLabel( const char *text )
|
||
|
{
|
||
|
if (d->label->inherits("QLabel"))
|
||
|
((QLabel*)d->label)->setText(text);
|
||
|
resetFrameRect();
|
||
|
}
|
||
|
|
||
|
void QtLabelled::setLabel( QWidget* label )
|
||
|
{
|
||
|
bool v = d->label->isVisible();
|
||
|
delete d->label;
|
||
|
d->label = label;
|
||
|
recreate( this, 0, QPoint(0,0), v );
|
||
|
layout();
|
||
|
}
|
||
|
|
||
|
int QtLabelled::alignment() const
|
||
|
{
|
||
|
return d->align;
|
||
|
}
|
||
|
|
||
|
void QtLabelled::setAlignment( int align )
|
||
|
{
|
||
|
if ( d->align != align ) {
|
||
|
ASSERT( align == AlignTop || align == AlignLeft );
|
||
|
d->align = align;
|
||
|
layout();
|
||
|
resetFrameRect();
|
||
|
update();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int QtLabelled::labelMargin() const
|
||
|
{
|
||
|
if (d->label->inherits("QLabel"))
|
||
|
return ((QLabel*)d->label)->margin();
|
||
|
else
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void QtLabelled::layout()
|
||
|
{
|
||
|
delete d->grid;
|
||
|
|
||
|
QSize sh = d->label->sizeHint();
|
||
|
if (sh.isValid() && !sh.isEmpty())
|
||
|
d->label->setFixedSize(sh);
|
||
|
|
||
|
if ( d->align == AlignTop ) {
|
||
|
d->grid = new QGridLayout(this,4,4);
|
||
|
d->grid->addMultiCellWidget( d->label, 0, 0, 1, 2, AlignLeft );
|
||
|
if (d->child) {
|
||
|
d->grid->addWidget( d->child, 2, 2, AlignLeft );
|
||
|
d->grid->setRowStretch( 2, 1 );
|
||
|
d->grid->setColStretch( 2, 1 );
|
||
|
}
|
||
|
d->grid->addRowSpacing( 1, margin()/2 );
|
||
|
d->grid->addColSpacing( 0, frameWidth()-labelMargin() );
|
||
|
d->grid->addColSpacing( 1, labelMargin() );
|
||
|
d->grid->addRowSpacing( 3, frameWidth() );
|
||
|
d->grid->addColSpacing( 3, frameWidth() );
|
||
|
} else {
|
||
|
d->grid = new QGridLayout(this,4,4);
|
||
|
d->grid->addMultiCellWidget( d->label, 1, 2, 0, 0, AlignTop );
|
||
|
if (d->child) {
|
||
|
d->grid->addWidget( d->child, 2, 2, AlignTop );
|
||
|
d->grid->setRowStretch( 2, 1 );
|
||
|
d->grid->setColStretch( 2, 1 );
|
||
|
}
|
||
|
d->grid->addColSpacing( 1, margin()/2 );
|
||
|
d->grid->addRowSpacing( 0, frameWidth()-labelMargin() );
|
||
|
d->grid->addRowSpacing( 1, labelMargin() );
|
||
|
d->grid->addRowSpacing( 3, frameWidth() );
|
||
|
d->grid->addColSpacing( 3, frameWidth() );
|
||
|
}
|
||
|
|
||
|
resetFrameRect();
|
||
|
|
||
|
d->grid->activate();
|
||
|
}
|
||
|
|
||
|
void QtLabelled::resetFrameRect()
|
||
|
{
|
||
|
QRect f = rect();
|
||
|
|
||
|
if ( d->align == AlignTop ) {
|
||
|
f.setTop( d->label->height()/2 );
|
||
|
setFrameRect(f);
|
||
|
} else {
|
||
|
f.setLeft( d->label->width()/2 );
|
||
|
setFrameRect(f);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void QtLabelled::resizeEvent( QResizeEvent * )
|
||
|
{
|
||
|
resetFrameRect();
|
||
|
}
|
||
|
|
||
|
void QtLabelled::childEvent( QChildEvent *e )
|
||
|
{
|
||
|
if (d->label == e->child())
|
||
|
return; // Yes, we know all about it.
|
||
|
|
||
|
if (d->child && e->inserted())
|
||
|
warning("QtLabelled should only have one child inserted.");
|
||
|
|
||
|
if (e->inserted())
|
||
|
d->child = e->child();
|
||
|
else
|
||
|
d->child = 0;
|
||
|
|
||
|
layout();
|
||
|
}
|
||
|
|
||
|
/*!
|
||
|
Provides childEvent() while waiting for Qt 2.0.
|
||
|
*/
|
||
|
bool QtLabelled::event( QEvent *e ) {
|
||
|
switch ( e->type() ) {
|
||
|
case Event_ChildInserted:
|
||
|
case Event_ChildRemoved:
|
||
|
childEvent( (QChildEvent*)e );
|
||
|
return TRUE;
|
||
|
default:
|
||
|
return QWidget::event( e );
|
||
|
}
|
||
|
}
|