Source Code (Use browser search to find items of interest.)
Class Index
kuser'KHeader (./kdeadmin/kuser/kheader.h:16)
class KHeader : public QFrame {
Q_OBJECT
public:
enum { Buttons = 1, Vertical = 2, Resizable = 4 };
/**
* The constructor for a KHeader widget. All parameters have a default of 0.
* @Doc:
* \begin{itemize}
* \item { \tt The parent widget. }
* \item { \tt The name of the widget. }
* \item { \tt The number of headers (columns or rows). }
* \item { \tt Flags: this parameter specifies whether the header widget
* displays row (Vertical) or column headers, if the headers are resizable
* (Resizable) and if they are selectable (Buttons). These flags are the
* defaults used for creating headers when using setNumHeaders().
* \end{itemize}
*/
KHeader( QWidget *parent = 0, const char *name = 0,
int numHeaders = 0, int aflags = 0 );
virtual ~KHeader();
/**
* Set the number of headers.
* To change the number of headers displayed in the widget,
* you must call this method. It can be used to set the initial number
* or dynamically change the number of headers displayed. The headers
* are created using the default flags set by the construction of the
* widget.
*/
void setNumHeaders( int numHeaders );
/**
* Return the number of headers set in the widget.
*/
int numHeaders();
/**
* Change/Set the width of a header.
*/
void setHeaderSize( int header, int width );
/**
* Set the text to display in the header, and the text alignment.
* The default alignment is AlignCenter.
*/
void setHeaderLabel( int header, const char *text, int align = AlignCenter );
/**
* Set the flags for an individual header. This can be used to override
* the defaults supplied in the construction of the widget.
*/
void setHeaderFlags( int header, int flags );
/**
* Set the size and position (viewable area) of the widget.
* The height of the widget is automatically calculated as the height
* of the widget's font, plus a 4 pixel suround, for horizontal
* instantiations (i.e. column headers).
*/
void setGeometry( int x, int y, int w, int h );
/**
* Set the size (viewable area) of the widget.
* The height of the widget is automatically calculated as the height
* of the widget's font, plus a 4 pixel suround, for horizontal
* instantiations (i.e. column headers).
*/
virtual void resize( int w, int h );
signals:
/**
* The size of the given header has changed to size.
*/
void sizeChanged( int header, int size );
/**
* The size of the given header is changing, and is currently size.
*/
void sizeChanging( int header, int size );
/**
* The given header has been selected (clicked).
*/
void selected( int header );
public slots:
/**
* This slot changes the offset of the headers within the widget.
* It is usually connected to a slider/scrollbar so if a table view
* is scrolled, the scrolling action will also scroll the attached
* headers.
*/
void setOrigin( int pos );
protected:
virtual void paintEvent( QPaintEvent *pev );
virtual void mousePressEvent( QMouseEvent *mev );
virtual void mouseReleaseEvent( QMouseEvent *mev );
virtual void enterEvent( QEvent *ev );
virtual void leaveEvent( QEvent *ev );
virtual void fontChange( const QFont &oldFont );
private:
bool eventFilter( QObject *, QEvent * );
void adjustHeaderSize( int start, int delta );
QArray<class KHeaderItem*> labels;
int divider;
int divstart;
int m_offset;
int m_selected;
int m_temp_sel;
int m_flags;
int m_resizing;
QCursor m_defCursor;
};
kuser'KHeader::KHeader() (./kdeadmin/kuser/kheader.cpp:100)
KHeader::KHeader( QWidget *parent, const char *name, int numHeaders, int aflags )
: QFrame( parent, name )
{
labels.resize( 0 );
m_offset = 0;
m_selected = -1;
m_temp_sel = -1;
m_flags = aflags;
divider = -1;
m_resizing = FALSE;
if( numHeaders != 0 )
setNumHeaders( numHeaders );
if( aflags & Resizable )
{
installEventFilter(this);
setMouseTracking(TRUE);
m_defCursor=cursor();
}
}
kuser'KHeader::~KHeader() (./kdeadmin/kuser/kheader.cpp:121)
KHeader::~KHeader()
{
for( uint i=0 ; i<labels.size() ; i++ )
delete labels[ i ];
}
kuser'KHeader::setGeometry() (./kdeadmin/kuser/kheader.cpp:128)
void KHeader::setGeometry( int x, int y, int w, int h )
{
if( m_flags & Vertical )
QFrame::setGeometry( x, y, w, h );
else
QFrame::setGeometry( x, y, w, fontMetrics().height() + 4 );
}
kuser'KHeader::resize() (./kdeadmin/kuser/kheader.cpp:137)
void KHeader::resize( int w, int h )
{
if( m_flags & Vertical )
QFrame::resize( w, h );
else
QFrame::resize( w, fontMetrics().height() + 4 );
}
kuser'KHeader::fontChange() (./kdeadmin/kuser/kheader.cpp:146)
void KHeader::fontChange( const QFont & )
{
if( !(m_flags & Vertical) )
resize( width(), fontMetrics().height() + 4 );
}
kuser'KHeader::eventFilter() (./kdeadmin/kuser/kheader.cpp:152)
bool KHeader::eventFilter( QObject *obj, QEvent *ev )
{
if( ev->type()==QEvent::MouseButtonPress && divider!=-1 ) {
m_resizing=TRUE;
return TRUE;
}
if( ev->type()==QEvent::MouseMove ) {
QMouseEvent *mev = (QMouseEvent*)ev;
if(m_resizing) {
if( m_flags & Vertical ) {
adjustHeaderSize( divider, mev->pos().y()-divstart );
divstart = mev->pos().y();
}
else {
adjustHeaderSize( divider, mev->pos().x()-divstart );
divstart = mev->pos().x();
}
return TRUE;
}
else if( mev->button()==NoButton ) {
// search labels to see if we are in range of a divider
int pos = m_offset;
int cur = m_flags&Vertical ? mev->y()+3 : mev->x()+3;
divider = -1;
for( uint i=0 ; i<labels.size() ; i++ ) {
pos += labels[i]->size();
if( cur>=pos && cur<pos+6 ) {
setCursor(m_flags&Vertical ? sizeVerCursor : sizeHorCursor);
divider = i;
divstart = pos;
}
}
if(divider==-1) setCursor(m_defCursor);
return TRUE;
}
}
if( ev->type()==QEvent::MouseButtonRelease && m_resizing ) {
emit sizeChanged( divider, labels[divider]->size() );
m_resizing = FALSE;
return TRUE;
}
return FALSE;
}
kuser'KHeader::numHeaders() (./kdeadmin/kuser/kheader.cpp:198)
int KHeader::numHeaders()
{
return labels.size();
}
kuser'KHeader::setNumHeaders() (./kdeadmin/kuser/kheader.cpp:204)
void KHeader::setNumHeaders( int numHeaders )
{
ASSERT( numHeaders >= 0 );
if( numHeaders < (int)labels.size() )
{
for( uint i=numHeaders ; i<labels.size() ; i++ )
{
delete labels[i];
}
labels.resize( numHeaders );
}
else if( numHeaders > (int)labels.size() )
{
int oldCount = labels.size();
labels.resize( numHeaders );
for( int i=oldCount ; i < numHeaders ; i++ )
{
labels[i] = new KHeaderItem( this, m_flags );
}
}
}
kuser'KHeader::setHeaderFlags() (./kdeadmin/kuser/kheader.cpp:228)
void KHeader::setHeaderFlags( int header, int aflags )
{
ASSERT( header >= 0 );
ASSERT( header < (int)labels.size() );
labels[header]->setFlags( aflags );
}
kuser'KHeader::setHeaderSize() (./kdeadmin/kuser/kheader.cpp:237)
void KHeader::setHeaderSize( int header, int size )
{
ASSERT( header >= 0 );
ASSERT( header < (int)labels.size() );
labels[header]->setSize( size );
repaint();
emit sizeChanged( header, size );
}
kuser'KHeader::adjustHeaderSize() (./kdeadmin/kuser/kheader.cpp:248)
void KHeader::adjustHeaderSize( int start, int delta )
{
int pos = labels[start]->size()+delta;
if( pos < 0 ) pos = 0;
labels[start]->setSize( pos );
// There must be a better way!
// calculate the rectangle?
repaint();
emit sizeChanging( start, pos );
}
kuser'KHeader::setOrigin() (./kdeadmin/kuser/kheader.cpp:260)
void KHeader::setOrigin( int pos )
{
m_offset = -pos;
repaint();
}
kuser'KHeader::setHeaderLabel() (./kdeadmin/kuser/kheader.cpp:267)
void KHeader::setHeaderLabel( int header, const char *text, int align )
{
labels[header]->setText( text, align );
}
kuser'KHeader::paintEvent() (./kdeadmin/kuser/kheader.cpp:273)
void KHeader::paintEvent( QPaintEvent * )
{
QColorGroup g = colorGroup();
QPainter paint;
paint.begin( this );
int pos = m_offset;
for( int i=0 ; i<(int)labels.size(); i++ )
{
labels[i]->paint( &paint, &g, style(), pos, width(), height(), i==m_selected);
pos += labels[i]->size();
}
paint.end();
}
kuser'KHeader::mousePressEvent() (./kdeadmin/kuser/kheader.cpp:290)
void KHeader::mousePressEvent( QMouseEvent *mev )
{
int cur;
if( m_flags & Vertical )
cur = mev->y();
else
cur = mev->x();
int pos = m_offset;
for( uint i=0 ; i<labels.size() ; i++ )
{
pos += labels[i]->size();
if( pos >= cur )
{
if( !(labels[i]->flags() & Buttons) )
return;
m_selected = i;
break;
}
}
repaint();
}
kuser'KHeader::mouseReleaseEvent() (./kdeadmin/kuser/kheader.cpp:312)
void KHeader::mouseReleaseEvent( QMouseEvent *mev )
{
if( m_selected == -1 )
{
m_temp_sel = -1;
return;
}
emit selected(m_selected);
m_selected = -1;
m_temp_sel = -1;
repaint();
}
kuser'KHeader::enterEvent() (./kdeadmin/kuser/kheader.cpp:325)
void KHeader::enterEvent( QEvent * )
{
m_selected = m_temp_sel;
if( m_selected != -1 )
repaint();
}
kuser'KHeader::leaveEvent() (./kdeadmin/kuser/kheader.cpp:332)
void KHeader::leaveEvent( QEvent * )
{
m_temp_sel = m_selected;
m_selected = -1;
if( m_temp_sel != -1 )
repaint();
}