On Tue, Mar 11, 2003 at 02:01:44PM +0100, Oswald Buddenhagen wrote:
> On Tue, Mar 11, 2003 at 10:43:24AM +0100, Ralf Nolden wrote:
> > On Dienstag, 11. März 2003 07:57, Bernt Christandl wrote:
> > > yesterday i upgrade my woody with 5 new qt-packages and realized
> > > that kdm then displayed (fixed width?) the possible users in a
> > > strange way:
> > 
> yeah, i already heard about this problem.
> 
> > That may be due to qt-3.1.2 fixes. Ossi, any problems known like fixed
> > width in the listview  ?
> > 
> dunno. i'll check shortly after the build finishes.
> 
here we go ...
patch attached and commited to the 3.1 branch.

greetings

-- 
Hi! I'm a .signature virus! Copy me into your ~/.signature, please!
--
Chaos, panic, and disorder - my work here is done.
Index: kgreeter.h
===================================================================
RCS file: /home/kde/kdebase/kdm/kfrontend/kgreeter.h,v
retrieving revision 1.23
diff -u -r1.23 kgreeter.h
--- kgreeter.h  22 Oct 2002 03:46:21 -0000      1.23
+++ kgreeter.h  13 Mar 2003 18:51:20 -0000
@@ -81,6 +81,8 @@
 };
 
 
+class UserListView;
+
 class KGreeter : public FDialog {
     Q_OBJECT
     typedef FDialog inherited;
@@ -111,8 +113,8 @@
 
 private:
     void set_wm( const char * );
-    void insertUsers( KListView * );
-    void insertUser( KListView *, const QImage &, const QString &, struct 
passwd * );
+    void insertUsers( UserListView * );
+    void insertUser( UserListView *, const QImage &, const QString &, struct 
passwd * );
     void MsgBox( QMessageBox::Icon typ, QString msg ) { KFMsgBox::box( this, 
typ, msg ); }
     void Inserten( QPopupMenu *mnu, const QString& txt, const char *member );
     bool verifyUser( bool );
@@ -122,7 +124,7 @@
     WmStat             wmstat;
     QString            enam;
     KSimpleConfig      *stsfile;
-    KListView          *user_view;
+    UserListView       *user_view;
     KdmClock           *clock;
     QLabel             *pixLabel;
     QLabel             *loginLabel, *passwdLabel, *sessargLabel;
Index: kgreeter.cpp
===================================================================
RCS file: /home/kde/kdebase/kdm/kfrontend/kgreeter.cpp,v
retrieving revision 1.83.2.1
diff -u -r1.83.2.1 kgreeter.cpp
--- kgreeter.cpp        28 Dec 2002 02:01:34 -0000      1.83.2.1
+++ kgreeter.cpp        13 Mar 2003 18:51:20 -0000
@@ -36,6 +36,7 @@
 #include <qaccel.h>
 #include <qcursor.h>
 #include <qheader.h>
+#include <qstyle.h>
 
 #include <klocale.h>
 #include <kglobal.h>
@@ -69,13 +70,6 @@
 #include <strings.h>
 
 
-class GreeterListViewItem : public KListViewItem {
-public:
-    GreeterListViewItem( KListView* parent, const QString& text )
-       : KListViewItem( parent, text ) {};
-    QString login;
-};
-
 void
 KLoginLineEdit::focusOutEvent( QFocusEvent *e )
 {
@@ -84,6 +78,41 @@
 }
 
 
+class UserListView : public KListView {
+public:
+    UserListView( QWidget* parent = 0, const char *name = 0 )
+       : KListView( parent, name )
+       , cachedSizeHint( -1, 0 )
+    {
+       setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Ignored );
+       header()->hide();
+       addColumn( QString::null );
+       setColumnAlignment( 0, AlignVCenter );
+       setResizeMode( QListView::LastColumn );
+    }
+
+    mutable QSize cachedSizeHint;
+
+protected:
+    virtual QSize sizeHint() const
+    {
+       if (!cachedSizeHint.isValid()) {
+           constPolish();
+           uint maxw = 0;
+           for (QListViewItem *itm = firstChild(); itm; itm = 
itm->nextSibling()) {
+               uint thisw = itm->width( fontMetrics(), this, 0 );
+               if (thisw > maxw)
+                   maxw = thisw;
+           }
+           cachedSizeHint.setWidth(
+               style().pixelMetric( QStyle::PM_ScrollBarExtent ) +
+               frameWidth() * 2 + maxw );
+       }
+       return cachedSizeHint;
+    }
+};
+
+
 KGreeter::KGreeter()
   : inherited( 0, 0, true )
   , user_view( 0 )
@@ -105,11 +134,7 @@
        main_grid->addWidget( welcomeLabel, 0, 1 );
     }
     if (kdmcfg->_showUsers != SHOW_NONE) {
-       user_view = new KListView( winFrame );
-       user_view->setSizePolicy( QSizePolicy( QSizePolicy::Preferred, 
QSizePolicy::Ignored ) );
-       user_view->addColumn(QString::null);
-       user_view->setResizeMode(QListView::LastColumn);
-       user_view->header()->hide();
+       user_view = new UserListView( winFrame );
        insertUsers( user_view );
        main_grid->addMultiCellWidget(user_view, 0, 3, 0, 0);
        connect( user_view, SIGNAL(clicked( QListViewItem * )),
@@ -275,8 +300,24 @@
     delete stsfile;
 }
 
+class UserListViewItem : public KListViewItem {
+public:
+    UserListViewItem( UserListView *parent, const QString &text,
+                        const QPixmap &pixmap, const QString &username )
+       : KListViewItem( parent )
+       , login( username )
+    {
+       setPixmap( 0, pixmap );
+       setMultiLinesEnabled( true );
+       setText( 0, text );
+       parent->cachedSizeHint.setWidth( -1 );
+    }
+
+    QString login;
+};
+
 void
-KGreeter::insertUser( KListView *listview, const QImage &default_pix,
+KGreeter::insertUser( UserListView *listview, const QImage &default_pix,
                      const QString &username, struct passwd *ps )
 {
     QImage p;
@@ -296,17 +337,17 @@
     else
        p = p.smoothScale( 48, 48, QImage::ScaleMin );
     QString realname = QFile::decodeName( ps->pw_gecos );
-    realname = realname.left(realname.find(","));
-    QString userlabel = realname.isEmpty() ?
-                               username :
-                               realname + "\n" + username;
-    GreeterListViewItem *item = new GreeterListViewItem( listview, userlabel );
-    item->setPixmap( 0, QPixmap( p ) );
-    item->login = username;
+    realname.truncate( realname.find( ',' ) );
+    if (realname.isEmpty())
+       new UserListViewItem( listview, username, QPixmap( p ), username );
+    else {
+       realname.append( "\n" ).append( username );
+       new UserListViewItem( listview, realname, QPixmap( p ), username );
+    }
 }
 
 void
-KGreeter::insertUsers( KListView *listview )
+KGreeter::insertUsers( UserListView *listview )
 {
     QImage default_pix(
        locate( "user_pic", QString::fromLatin1("default.png") ) );
@@ -372,7 +413,7 @@
        QString login = loginEdit->text();
        QListViewItem *item;
        for (item = user_view->firstChild(); item; item = item->nextSibling())
-           if (((GreeterListViewItem *)item)->login == login) {
+           if (((UserListViewItem *)item)->login == login) {
                user_view->setCurrentItem( item );
                user_view->ensureItemVisible( item );
                break;
@@ -385,7 +426,7 @@
 KGreeter::slot_user_name( QListViewItem *item )
 {
     if (item) {
-       loginEdit->setText( ((GreeterListViewItem *)item)->login );
+       loginEdit->setText( ((UserListViewItem *)item)->login );
        passwdEdit->erase();
        passwdEdit->setFocus();
        load_wm();

Reply via email to