Source Code (Use browser search to find items of interest.)

Class Index

klipper'KEditableListView (./kdeutils/klipper/keditablelistview.h:42)

class KEditableListView : public QListView
{
    Q_OBJECT

public:
    /**
     * The usual constructor, nothing special here.
     */
    KEditableListView( QWidget *parent = 0L, const char *name = 0L );

    /**
     * The usual destructor, nothing special here.
     */
    ~KEditableListView();

    /**
     * Makes the item in column col editable / not editable
     * By default, all items/all columns are editable (otherwise you wouldn't
     * use this class, would you? :o)
     */
    void setEditable( QListViewItem *item, int col, bool enable );

protected:
    virtual void keyPressEvent( QKeyEvent * );

protected slots:
    void slotItemClicked( int button, QListViewItem *, const QPoint&, int );
    void slotDestroyEdit();
    void slotReturnPressed();


private:
    // a list of columns per item that are NOT editable
    typedef QValueList<int> ColumnList;
    QPtrDict<ColumnList> myUnEditableDict;

    RectLineEdit 	*myEdit;
    QListViewItem 	*myCurrentItem;
    int 	  	myCurrentCol;
    bool 		myCurrentItemIsOpen;


signals:
    /**
     * Emitted, when an item was edited and changed. Parameters are the
     * modified item and the respective column.
     */
    void itemChanged( QListViewItem *, int );

};


// a lineEdit that paints a rectangle instead of the standard frame
// used for in-place editing


klipper'KEditableListView::KEditableListView() (./kdeutils/klipper/keditablelistview.cpp:20)

KEditableListView::KEditableListView( QWidget *parent, const char *name )
    : QListView( parent, name )
{
    myEdit = 0L;
    myCurrentItem = 0L;
    myUnEditableDict.setAutoDelete( true );

    connect( this, SIGNAL( selectionChanged() ), SLOT( slotDestroyEdit() ));
    connect( this, SIGNAL( mouseButtonClicked( int, QListViewItem *, 
					       const QPoint&, int ) ),
	     SLOT( slotItemClicked(int, QListViewItem *, const QPoint&, int)));
}


klipper'KEditableListView::~KEditableListView() (./kdeutils/klipper/keditablelistview.cpp:33)

KEditableListView::~KEditableListView()
{
    delete myEdit;
    myUnEditableDict.clear();
}



klipper'KEditableListView::setEditable() (./kdeutils/klipper/keditablelistview.cpp:40)

void KEditableListView::setEditable( QListViewItem *item, int col, bool enable)
{
    ASSERT( item != 0L );

    ColumnList *list = myUnEditableDict.find( item );
    if ( list && enable )
	list->remove( col );
    else if ( list && !enable && list->find( col ) == list->end() )
	list->append( col );
    else if ( !list && !enable ) {
	list = new ColumnList;
	list->append( col );
	myUnEditableDict.insert( item, list );
    }
}



klipper'KEditableListView::slotItemClicked() (./kdeutils/klipper/keditablelistview.cpp:57)

void KEditableListView::slotItemClicked( int button, QListViewItem *item, 
					 const QPoint&, int col )
{
    QRect r = itemRect( item );
    if ( !r.isValid() ) {
	slotDestroyEdit();
	return;
    }

    bool wasEditing = false;
    if ( myEdit ) {
	slotDestroyEdit();
	wasEditing = true;
    }

    else { // clicked at the plus-sign? -> don't offer an edit-field
	if ( myCurrentItemIsOpen != item->isOpen() ) {
	    myCurrentItemIsOpen = !myCurrentItemIsOpen;
	    return;
	}
    }

    if ( myCurrentItem != item ) {
	myCurrentItem = item;
	myCurrentCol = col;
	return;
    }

    if ( myCurrentCol != col && wasEditing ) {
	myCurrentCol = col;
	setSelected( item, true );
	return;
    }

    myCurrentItem = item;
    myCurrentCol = col;

    // setSelected( item, false );

    if ( button != LeftButton )
	return;
    
    // is the item editable?
    ColumnList *eList = myUnEditableDict.find( item );
    if ( eList && eList->find( col ) != eList->end() )
	return;
	

    myEdit = new RectLineEdit( viewport() );
    connect( myEdit, SIGNAL( returnPressed() ), SLOT( slotReturnPressed() ));
    myEdit->setText( item->text( col ) );
    myEdit->adjustSize();
    int tw = myEdit->fontMetrics().boundingRect( myEdit->text() ).width() + 15;
    if ( item->pixmap( col ) ) // add width of pixmap
    	tw += item->pixmap( col )->width();

    if ( myEdit->width() < tw )
	myEdit->resize( tw, myEdit->height() );

    int x = r.x() + itemMargin() -1;
    for ( int i = 0; i < col; i++ ) {
	x += columnWidth( i );
    }
    if ( col == 0 ) {
	int d = item->depth() + (rootIsDecorated() ? 1 : 0);
	x += (d * treeStepSize());
    }

    int y = r.y() -1;
    if ( y < 0 )
	y = 0;
    myEdit->move( x, y );

    myEdit->show();
    myEdit->setFocus();
}



klipper'KEditableListView::slotReturnPressed() (./kdeutils/klipper/keditablelistview.cpp:135)

void KEditableListView::slotReturnPressed()
{
    myCurrentItem->setText( myCurrentCol, myEdit->text() );
    slotDestroyEdit();
    emit itemChanged( myCurrentItem, myCurrentCol );
}



klipper'KEditableListView::slotDestroyEdit() (./kdeutils/klipper/keditablelistview.cpp:143)

void KEditableListView::slotDestroyEdit()
{
    delete myEdit;
    myEdit = 0L;

    myCurrentItemIsOpen = currentItem()->isOpen();
}



klipper'KEditableListView::keyPressEvent() (./kdeutils/klipper/keditablelistview.cpp:152)

void KEditableListView::keyPressEvent( QKeyEvent *e )
{
    if ( myEdit && myEdit->hasFocus() && e->key() == Key_Escape ) {
	slotDestroyEdit();
	e->accept();
    }
}