]> git.sesse.net Git - vlc/commitdiff
Qt: neat and crispy location bar, new location buttons
authorJakob Leben <jleben@videolan.org>
Thu, 4 Feb 2010 08:19:00 +0000 (09:19 +0100)
committerJakob Leben <jleben@videolan.org>
Thu, 4 Feb 2010 08:19:00 +0000 (09:19 +0100)
modules/gui/qt4/components/playlist/standardpanel.cpp
modules/gui/qt4/components/playlist/standardpanel.hpp

index 46f5d34bb07c123878730c589d0db39884a585ea..80b0bfdf0a292915c191d5e7b8343e3b6948715d 100644 (file)
@@ -45,6 +45,7 @@
 #include <QWheelEvent>
 #include <QToolButton>
 #include <QFontMetrics>
+#include <QPainter>
 
 #include <assert.h>
 
@@ -456,33 +457,33 @@ LocationBar::LocationBar( PLModel *m )
     model = m;
     mapper = new QSignalMapper( this );
     CONNECT( mapper, mapped( int ), this, invoke( int ) );
+
+    box = new QHBoxLayout;
+    box->setSpacing( 0 );
+    setLayout( box );
 }
 
 void LocationBar::setIndex( const QModelIndex &index )
 {
-    clear();
-    QAction *prev = NULL;
+    qDeleteAll( buttons );
+    buttons.clear();
     QModelIndex i = index;
-    QFont font;
-    QFontMetrics metrics( font );
-    font.setBold( true );
+    bool bold = true;
     while( true )
     {
         PLItem *item = model->getItem( i );
 
-        QToolButton *btn = new QToolButton;
         char *fb_name = input_item_GetTitleFbName( item->inputItem() );
         QString text = qfu(fb_name);
         free(fb_name);
-        text = QString("> ") + metrics.elidedText( text, Qt::ElideRight, 150 );
-        btn->setText( text );
-        btn->setFont( font );
-        prev = insertWidget( prev, btn );
+        QToolButton *btn = new LocationButton( text, bold );
+        box->insertWidget( 0, btn );
+        buttons.append( btn );
 
         mapper->setMapping( btn, item->id() );
         CONNECT( btn, clicked( ), mapper, map( ) );
 
-        font = QFont();
+        bold = false;
 
         if( i.isValid() ) i = i.parent();
         else break;
@@ -495,3 +496,38 @@ void LocationBar::invoke( int i_id )
     setIndex( index );
     emit invoked ( index );
 }
+
+LocationButton::LocationButton( const QString &text, bool bold )
+{
+    QFont font;
+    font.setBold( bold );
+    setFont( font );
+    metrics = new QFontMetrics( font );
+    setText( metrics->elidedText( text, Qt::ElideRight, 150 ) );
+}
+
+void LocationButton::paintEvent ( QPaintEvent * event )
+{
+    QStyleOptionButton option;
+    option.initFrom( this );
+    option.rect = rect();
+    option.text = text();
+    option.features = QStyleOptionButton::Flat;
+    option.state |= QStyle::State_Enabled;
+    option.state |= isChecked() ? QStyle::State_On : QStyle::State_Off;
+    if( isDown() ) option.state |= QStyle::State_Sunken;
+    QPainter p( this );
+    style()->drawControl( QStyle::CE_PushButtonBevel, &option, &p );
+    option.rect.setLeft( 18 );
+    p.drawText( option.rect, Qt::AlignVCenter,
+                metrics->elidedText( text(), Qt::ElideRight, option.rect.width() - 5 ) );
+    option.rect = QRect( 0, 0, 18, height() );
+    style()->drawPrimitive( QStyle::PE_IndicatorArrowRight, &option, &p );
+}
+
+QSize LocationButton::sizeHint() const
+{
+    QSize s( metrics->boundingRect( text() ).size() );
+    s += QSize( 25, 10 );
+    return s;
+}
index 7df1cae018d447a06db6f7db620ca1d84459b631..0aedccf6b098e70d33de275fc0046c68ddb0a696 100644 (file)
@@ -110,7 +110,7 @@ private slots:
     void browseInto( input_item_t * );
 };
 
-class LocationBar : public QToolBar
+class LocationBar : public QWidget
 {
     Q_OBJECT;
 public:
@@ -123,6 +123,18 @@ private slots:
 private:
     PLModel *model;
     QSignalMapper *mapper;
+    QHBoxLayout *box;
+    QList<QWidget*> buttons;
+};
+
+class LocationButton : public QToolButton
+{
+  public:
+      LocationButton( const QString &, bool bold );
+  private:
+      void paintEvent ( QPaintEvent * event );
+      QSize sizeHint() const;
+      QFontMetrics *metrics;
 };
 
 #endif