diff --git a/modules/gui/qt4/Modules.am b/modules/gui/qt4/Modules.am index 3d500fefab..fc7ba1e519 100644 --- a/modules/gui/qt4/Modules.am +++ b/modules/gui/qt4/Modules.am @@ -66,6 +66,7 @@ nodist_SOURCES_qt4 = \ components/sout/sout_widgets.moc.cpp \ util/input_slider.moc.cpp \ util/customwidgets.moc.cpp \ + util/searchlineedit.moc.cpp \ util/qvlcapp.moc.cpp \ util/pictureflow.moc.cpp \ resources.cpp \ @@ -274,6 +275,7 @@ SOURCES_qt4 = qt4.cpp \ components/sout/sout_widgets.cpp \ util/input_slider.cpp \ util/customwidgets.cpp \ + util/searchlineedit.cpp \ util/registry.cpp \ util/qt_dirs.cpp \ util/pictureflow.cpp @@ -336,6 +338,7 @@ noinst_HEADERS = \ components/sout/profiles.hpp \ util/input_slider.hpp \ util/customwidgets.hpp \ + util/searchlineedit.hpp \ util/qvlcframe.hpp \ util/qvlcapp.hpp \ util/qt_dirs.hpp \ diff --git a/modules/gui/qt4/components/playlist/playlist.cpp b/modules/gui/qt4/components/playlist/playlist.cpp index 9ec11a6ad9..e722226e23 100644 --- a/modules/gui/qt4/components/playlist/playlist.cpp +++ b/modules/gui/qt4/components/playlist/playlist.cpp @@ -32,6 +32,8 @@ #include "components/playlist/playlist_model.hpp" /* PLModel */ #include "components/interface_widgets.hpp" /* CoverArtLabel */ +#include "util/searchlineedit.hpp" + #include "input_manager.hpp" /* art signal */ #include "main_interface.hpp" /* DropEvent TODO remove this*/ diff --git a/modules/gui/qt4/components/preferences_widgets.cpp b/modules/gui/qt4/components/preferences_widgets.cpp index 8a3a3d76c4..fee069c18d 100644 --- a/modules/gui/qt4/components/preferences_widgets.cpp +++ b/modules/gui/qt4/components/preferences_widgets.cpp @@ -36,6 +36,7 @@ #include "components/preferences_widgets.hpp" #include "util/customwidgets.hpp" +#include "util/searchlineedit.hpp" #include "util/qt_dirs.hpp" #include #include diff --git a/modules/gui/qt4/dialogs/openurl.cpp b/modules/gui/qt4/dialogs/openurl.cpp index e9a549cb80..3060026477 100644 --- a/modules/gui/qt4/dialogs/openurl.cpp +++ b/modules/gui/qt4/dialogs/openurl.cpp @@ -26,7 +26,7 @@ #endif #include "dialogs/openurl.hpp" -#include "util/customwidgets.hpp" +#include "util/searchlineedit.hpp" #include #include diff --git a/modules/gui/qt4/dialogs/plugins.cpp b/modules/gui/qt4/dialogs/plugins.cpp index 07f08eac89..96c9447732 100644 --- a/modules/gui/qt4/dialogs/plugins.cpp +++ b/modules/gui/qt4/dialogs/plugins.cpp @@ -28,7 +28,7 @@ #include "plugins.hpp" -#include "util/customwidgets.hpp" +#include "util/searchlineedit.hpp" #include "extensions_manager.hpp" #include diff --git a/modules/gui/qt4/util/customwidgets.cpp b/modules/gui/qt4/util/customwidgets.cpp index 1a0abbb3fe..58c1df2d8e 100644 --- a/modules/gui/qt4/util/customwidgets.cpp +++ b/modules/gui/qt4/util/customwidgets.cpp @@ -43,66 +43,6 @@ #include #include /* twolower() */ -ClickLineEdit::ClickLineEdit( const QString &msg, QWidget *parent) : QLineEdit( parent ) -{ - mDrawClickMsg = true; - setClickMessage( msg ); -} - -void ClickLineEdit::setClickMessage( const QString &msg ) -{ - mClickMessage = msg; - repaint(); -} - - -void ClickLineEdit::setText( const QString &txt ) -{ - mDrawClickMsg = txt.isEmpty(); - repaint(); - QLineEdit::setText( txt ); -} - -void ClickLineEdit::paintEvent( QPaintEvent *pe ) -{ - QLineEdit::paintEvent( pe ); - if ( mDrawClickMsg == true && !hasFocus() ) { - QPainter p( this ); - QPen tmp = p.pen(); - p.setPen( palette().color( QPalette::Disabled, QPalette::Text ) ); - QRect cr = contentsRect(); - // Add two pixel margin on the left side - cr.setLeft( cr.left() + 3 ); - p.drawText( cr, Qt::AlignLeft | Qt::AlignVCenter, mClickMessage ); - p.setPen( tmp ); - p.end(); - } -} - -void ClickLineEdit::dropEvent( QDropEvent *ev ) -{ - mDrawClickMsg = false; - QLineEdit::dropEvent( ev ); -} - -void ClickLineEdit::focusInEvent( QFocusEvent *ev ) -{ - if ( mDrawClickMsg == true ) { - mDrawClickMsg = false; - repaint(); - } - QLineEdit::focusInEvent( ev ); -} - -void ClickLineEdit::focusOutEvent( QFocusEvent *ev ) -{ - if ( text().isEmpty() ) { - mDrawClickMsg = true; - repaint(); - } - QLineEdit::focusOutEvent( ev ); -} - QVLCFramelessButton::QVLCFramelessButton( QWidget *parent ) : QPushButton( parent ) { @@ -122,102 +62,6 @@ QSize QVLCFramelessButton::sizeHint() const return iconSize(); } -SearchLineEdit::SearchLineEdit( QWidget *parent ) : QLineEdit( parent ) -{ - clearButton = new QVLCFramelessButton( this ); - clearButton->setIcon( QIcon( ":/toolbar/clear" ) ); - clearButton->setIconSize( QSize( 16, 16 ) ); - clearButton->setCursor( Qt::ArrowCursor ); - clearButton->setToolTip( qfu(vlc_pgettext("Tooltip|Clear", "Clear")) ); - clearButton->hide(); - - CONNECT( clearButton, clicked(), this, clear() ); - - int frameWidth = style()->pixelMetric( QStyle::PM_DefaultFrameWidth, 0, this ); - - QFontMetrics metrics( font() ); - QString styleSheet = QString( "min-height: %1px; " - "padding-top: 1px; " - "padding-bottom: 1px; " - "padding-right: %2px;" ) - .arg( metrics.height() + ( 2 * frameWidth ) ) - .arg( clearButton->sizeHint().width() + 1 ); - setStyleSheet( styleSheet ); - - setMessageVisible( true ); - - CONNECT( this, textEdited( const QString& ), - this, updateText( const QString& ) ); - - CONNECT( this, editingFinished(), - this, searchEditingFinished() ); - -} - -void SearchLineEdit::clear() -{ - setText( QString() ); - clearButton->hide(); - setMessageVisible( true ); -} - -void SearchLineEdit::setMessageVisible( bool on ) -{ - message = on; - repaint(); - return; -} - -void SearchLineEdit::updateText( const QString& text ) -{ - clearButton->setVisible( !text.isEmpty() ); -} - -void SearchLineEdit::resizeEvent ( QResizeEvent * event ) -{ - QLineEdit::resizeEvent( event ); - int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth,0,this); - clearButton->resize( clearButton->sizeHint().width(), height() ); - clearButton->move( width() - clearButton->width() - frameWidth, 0 ); -} - -void SearchLineEdit::focusInEvent( QFocusEvent *event ) -{ - if( message ) - { - setMessageVisible( false ); - } - QLineEdit::focusInEvent( event ); -} - -void SearchLineEdit::focusOutEvent( QFocusEvent *event ) -{ - if( text().isEmpty() ) - { - setMessageVisible( true ); - } - QLineEdit::focusOutEvent( event ); -} - -void SearchLineEdit::paintEvent( QPaintEvent *event ) -{ - QLineEdit::paintEvent( event ); - if( !message ) return; - QStyleOption option; - option.initFrom( this ); - QRect rect = style()->subElementRect( QStyle::SE_LineEditContents, &option, this ) - .adjusted( 3, 0, clearButton->width() + 1, 0 ); - QPainter painter( this ); - painter.setPen( palette().color( QPalette::Disabled, QPalette::Text ) ); - painter.drawText( rect, Qt::AlignLeft | Qt::AlignVCenter, qtr( I_PL_FILTER ) ); -} - -void SearchLineEdit::searchEditingFinished() -{ - emit searchDelayedChanged( text() ); -} - - QVLCElidingLabel::QVLCElidingLabel( const QString &s, Qt::TextElideMode mode, QWidget * parent ) : elideMode( mode ), QLabel( s, parent ) { } diff --git a/modules/gui/qt4/util/customwidgets.hpp b/modules/gui/qt4/util/customwidgets.hpp index ddd3711e71..79d8ec44f8 100644 --- a/modules/gui/qt4/util/customwidgets.hpp +++ b/modules/gui/qt4/util/customwidgets.hpp @@ -33,32 +33,6 @@ #include #include -/** - This class provides a QLineEdit which contains a greyed-out hinting - text as long as the user didn't enter any text - - @short LineEdit with customizable "Click here" text - @author Daniel Molkentin -*/ -class ClickLineEdit : public QLineEdit -{ - Q_OBJECT - Q_PROPERTY( QString clickMessage READ clickMessage WRITE setClickMessage ) -public: - ClickLineEdit( const QString &msg, QWidget *parent ); - void setClickMessage( const QString &msg ); - const QString& clickMessage() const { return mClickMessage; } - virtual void setText( const QString& txt ); -protected: - virtual void paintEvent( QPaintEvent *e ); - virtual void dropEvent( QDropEvent *ev ); - virtual void focusInEvent( QFocusEvent *ev ); - virtual void focusOutEvent( QFocusEvent *ev ); -private: - QString mClickMessage; - bool mDrawClickMsg; -}; - class QVLCFramelessButton : public QPushButton { Q_OBJECT @@ -69,31 +43,6 @@ protected: virtual void paintEvent( QPaintEvent * event ); }; -class SearchLineEdit : public QLineEdit -{ - Q_OBJECT -public: - SearchLineEdit( QWidget *parent = NULL ); - -private: - void resizeEvent ( QResizeEvent * event ); - void focusInEvent( QFocusEvent *event ); - void focusOutEvent( QFocusEvent *event ); - void paintEvent( QPaintEvent *event ); - void setMessageVisible( bool on ); - QVLCFramelessButton *clearButton; - bool message; - -public slots: - void clear(); - -private slots: - void updateText( const QString& ); - void searchEditingFinished(); - -signals: - void searchDelayedChanged( const QString& ); -}; class QVLCElidingLabel : public QLabel { diff --git a/modules/gui/qt4/util/searchlineedit.cpp b/modules/gui/qt4/util/searchlineedit.cpp new file mode 100644 index 0000000000..e46383b2de --- /dev/null +++ b/modules/gui/qt4/util/searchlineedit.cpp @@ -0,0 +1,202 @@ +/***************************************************************************** + * customwidgets.cpp: Custom widgets + **************************************************************************** + * Copyright (C) 2006 the VideoLAN team + * Copyright (C) 2004 Daniel Molkentin + * $Id$ + * + * Authors: Clément Stenac + * The "ClickLineEdit" control is based on code by Daniel Molkentin + * for libkdepim + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include "searchlineedit.hpp" +#include "customwidgets.hpp" + +#include "qt4.hpp" /*needed for qtr and CONNECT, but not necessary */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include /* twolower() */ + +ClickLineEdit::ClickLineEdit( const QString &msg, QWidget *parent) : QLineEdit( parent ) +{ + mDrawClickMsg = true; + setClickMessage( msg ); +} + +void ClickLineEdit::setClickMessage( const QString &msg ) +{ + mClickMessage = msg; + repaint(); +} + + +void ClickLineEdit::setText( const QString &txt ) +{ + mDrawClickMsg = txt.isEmpty(); + repaint(); + QLineEdit::setText( txt ); +} + +void ClickLineEdit::paintEvent( QPaintEvent *pe ) +{ + QLineEdit::paintEvent( pe ); + if ( mDrawClickMsg == true && !hasFocus() ) { + QPainter p( this ); + QPen tmp = p.pen(); + p.setPen( palette().color( QPalette::Disabled, QPalette::Text ) ); + QRect cr = contentsRect(); + // Add two pixel margin on the left side + cr.setLeft( cr.left() + 3 ); + p.drawText( cr, Qt::AlignLeft | Qt::AlignVCenter, mClickMessage ); + p.setPen( tmp ); + p.end(); + } +} + +void ClickLineEdit::dropEvent( QDropEvent *ev ) +{ + mDrawClickMsg = false; + QLineEdit::dropEvent( ev ); +} + +void ClickLineEdit::focusInEvent( QFocusEvent *ev ) +{ + if ( mDrawClickMsg == true ) { + mDrawClickMsg = false; + repaint(); + } + QLineEdit::focusInEvent( ev ); +} + +void ClickLineEdit::focusOutEvent( QFocusEvent *ev ) +{ + if ( text().isEmpty() ) { + mDrawClickMsg = true; + repaint(); + } + QLineEdit::focusOutEvent( ev ); +} + +SearchLineEdit::SearchLineEdit( QWidget *parent ) : QLineEdit( parent ) +{ + clearButton = new QVLCFramelessButton( this ); + clearButton->setIcon( QIcon( ":/toolbar/clear" ) ); + clearButton->setIconSize( QSize( 16, 16 ) ); + clearButton->setCursor( Qt::ArrowCursor ); + clearButton->setToolTip( qfu(vlc_pgettext("Tooltip|Clear", "Clear")) ); + clearButton->hide(); + + CONNECT( clearButton, clicked(), this, clear() ); + + int frameWidth = style()->pixelMetric( QStyle::PM_DefaultFrameWidth, 0, this ); + + QFontMetrics metrics( font() ); + QString styleSheet = QString( "min-height: %1px; " + "padding-top: 1px; " + "padding-bottom: 1px; " + "padding-right: %2px;" ) + .arg( metrics.height() + ( 2 * frameWidth ) ) + .arg( clearButton->sizeHint().width() + 1 ); + setStyleSheet( styleSheet ); + + setMessageVisible( true ); + + CONNECT( this, textEdited( const QString& ), + this, updateText( const QString& ) ); + + CONNECT( this, editingFinished(), + this, searchEditingFinished() ); + +} + +void SearchLineEdit::clear() +{ + setText( QString() ); + clearButton->hide(); + setMessageVisible( true ); +} + +void SearchLineEdit::setMessageVisible( bool on ) +{ + message = on; + repaint(); + return; +} + +void SearchLineEdit::updateText( const QString& text ) +{ + clearButton->setVisible( !text.isEmpty() ); +} + +void SearchLineEdit::resizeEvent ( QResizeEvent * event ) +{ + QLineEdit::resizeEvent( event ); + int frameWidth = style()->pixelMetric(QStyle::PM_DefaultFrameWidth,0,this); + clearButton->resize( clearButton->sizeHint().width(), height() ); + clearButton->move( width() - clearButton->width() - frameWidth, 0 ); +} + +void SearchLineEdit::focusInEvent( QFocusEvent *event ) +{ + if( message ) + { + setMessageVisible( false ); + } + QLineEdit::focusInEvent( event ); +} + +void SearchLineEdit::focusOutEvent( QFocusEvent *event ) +{ + if( text().isEmpty() ) + { + setMessageVisible( true ); + } + QLineEdit::focusOutEvent( event ); +} + +void SearchLineEdit::paintEvent( QPaintEvent *event ) +{ + QLineEdit::paintEvent( event ); + if( !message ) return; + QStyleOption option; + option.initFrom( this ); + QRect rect = style()->subElementRect( QStyle::SE_LineEditContents, &option, this ) + .adjusted( 3, 0, clearButton->width() + 1, 0 ); + QPainter painter( this ); + painter.setPen( palette().color( QPalette::Disabled, QPalette::Text ) ); + painter.drawText( rect, Qt::AlignLeft | Qt::AlignVCenter, qtr( I_PL_FILTER ) ); +} + +void SearchLineEdit::searchEditingFinished() +{ + emit searchDelayedChanged( text() ); +} + diff --git a/modules/gui/qt4/util/searchlineedit.hpp b/modules/gui/qt4/util/searchlineedit.hpp new file mode 100644 index 0000000000..a824950a92 --- /dev/null +++ b/modules/gui/qt4/util/searchlineedit.hpp @@ -0,0 +1,90 @@ +/***************************************************************************** + * customwidgets.h: Custom widgets + **************************************************************************** + * Copyright (C) 2006 the VideoLAN team + * Copyright (C) 2004 Daniel Molkentin + * $Id$ + * + * Authors: Clément Stenac + * The "ClickLineEdit" control is based on code by Daniel Molkentin + * for libkdepim + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef _SEARCHLINEEDIT_H_ +#define _SEARCHLINEEDIT_H_ + +#include +#include +#include +#include +#include + +class QVLCFramelessButton; +/** + This class provides a QLineEdit which contains a greyed-out hinting + text as long as the user didn't enter any text + + @short LineEdit with customizable "Click here" text + @author Daniel Molkentin +*/ +class ClickLineEdit : public QLineEdit +{ + Q_OBJECT + Q_PROPERTY( QString clickMessage READ clickMessage WRITE setClickMessage ) +public: + ClickLineEdit( const QString &msg, QWidget *parent ); + void setClickMessage( const QString &msg ); + const QString& clickMessage() const { return mClickMessage; } + virtual void setText( const QString& txt ); +protected: + virtual void paintEvent( QPaintEvent *e ); + virtual void dropEvent( QDropEvent *ev ); + virtual void focusInEvent( QFocusEvent *ev ); + virtual void focusOutEvent( QFocusEvent *ev ); +private: + QString mClickMessage; + bool mDrawClickMsg; +}; + +class SearchLineEdit : public QLineEdit +{ + Q_OBJECT +public: + SearchLineEdit( QWidget *parent = NULL ); + +private: + void resizeEvent ( QResizeEvent * event ); + void focusInEvent( QFocusEvent *event ); + void focusOutEvent( QFocusEvent *event ); + void paintEvent( QPaintEvent *event ); + void setMessageVisible( bool on ); + QVLCFramelessButton *clearButton; + bool message; + +public slots: + void clear(); + +private slots: + void updateText( const QString& ); + void searchEditingFinished(); + +signals: + void searchDelayedChanged( const QString& ); +}; + +#endif +