From 6196b0322f5f89b7c27c4b985faa662f98be777c Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Kempf Date: Fri, 7 Oct 2011 17:07:06 +0200 Subject: [PATCH] Qt: first attempt at a QMenuView --- modules/gui/qt4/Modules.am | 3 + modules/gui/qt4/util/qmenuview.cpp | 123 +++++++++++++++++++++++++++++ modules/gui/qt4/util/qmenuview.hpp | 57 +++++++++++++ 3 files changed, 183 insertions(+) create mode 100644 modules/gui/qt4/util/qmenuview.cpp create mode 100644 modules/gui/qt4/util/qmenuview.hpp diff --git a/modules/gui/qt4/Modules.am b/modules/gui/qt4/Modules.am index e3c93103c4..22c2277234 100644 --- a/modules/gui/qt4/Modules.am +++ b/modules/gui/qt4/Modules.am @@ -70,6 +70,7 @@ nodist_SOURCES_qt4 = \ util/timetooltip.moc.cpp \ util/customwidgets.moc.cpp \ util/searchlineedit.moc.cpp \ + util/qmenuview.moc.cpp \ util/qvlcapp.moc.cpp \ util/pictureflow.moc.cpp \ util/buttons/RoundButton.moc.cpp \ @@ -309,6 +310,7 @@ SOURCES_qt4 = qt4.cpp \ util/customwidgets.cpp \ util/searchlineedit.cpp \ util/registry.cpp \ + util/qmenuview.cpp \ util/qt_dirs.cpp \ util/pictureflow.cpp \ util/buttons/BrowseButton.cpp \ @@ -389,6 +391,7 @@ noinst_HEADERS = \ util/searchlineedit.hpp \ util/qvlcframe.hpp \ util/qvlcapp.hpp \ + util/qmenuview.hpp \ util/qt_dirs.hpp \ util/registry.hpp \ util/pictureflow.hpp \ diff --git a/modules/gui/qt4/util/qmenuview.cpp b/modules/gui/qt4/util/qmenuview.cpp new file mode 100644 index 0000000000..d409812199 --- /dev/null +++ b/modules/gui/qt4/util/qmenuview.cpp @@ -0,0 +1,123 @@ +/***************************************************************************** + * QMenuView + **************************************************************************** + * Copyright © 2011 VLC authors and VideoLAN + * $Id$ + * + * Authors: Jean-Baptiste Kempf + * + * 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. + *****************************************************************************/ + +#include "qt4.hpp" +#include "util/qmenuview.hpp" + +#include "components/playlist/vlc_model.hpp" /* data( IsCurrentRole ) */ + +#include +#include +#include + + +/*** + * This is a simple view, like a QListView, but displayed as a QMenu + * So far, this is quite limited. + * + * This is now linked to VLC's models. It should be splittable in the future. + * + * TODO: - limit the number of the menu, as a Q_PROPERTY + * - limit the width of the entries + * - deal with a root item + ***/ + +Q_DECLARE_METATYPE(QModelIndex); // So we can store it in a QVariant + +QMenuView::QMenuView( QWidget * parent ) + : QMenu( parent ) +{ + m_model = NULL; + + /* Rebuild the Menu just before showing it */ + CONNECT( this, aboutToShow(), this, rebuild() ); + + /* */ + CONNECT( this, triggered(QAction*), this, activate(QAction*) ); +} + +/* */ +void QMenuView::rebuild() +{ + if( !m_model ) + return; + + /* Clear all Items */ + clear(); + + /* Rebuild from root */ + build( QModelIndex() ); +} + +/* */ +void QMenuView::build( const QModelIndex &parent ) +{ + for( int i = 0; i < m_model->rowCount( parent ); i++ ) + { + QModelIndex idx = m_model->index(i, 0, parent); + if( m_model->hasChildren( idx ) ) + { + build( idx ); + } + else + { + addAction( createActionFromIndex( idx ) ); + } + } +} + +/* Create individual actions */ +QAction* QMenuView::createActionFromIndex( QModelIndex index ) +{ + QIcon icon = qvariant_cast( index.data( Qt::DecorationRole ) ); + QAction * action = new QAction( icon, index.data().toString(), this ); + + /* Display in bold the active element */ + if( index.data( VLCModel::IsCurrentRole ).toBool() ) + { + QFont font; font.setBold ( true ); + action->setFont( font ); + } + + /* Some items could be hypothetically disabled */ + action->setEnabled( index.flags().testFlag( Qt::ItemIsEnabled ) ); + + /* */ + QVariant variant; variant.setValue( index ); + action->setData( variant ); + + return action; +} + +/* QMenu action trigger */ +void QMenuView::activate( QAction* action ) +{ + assert( m_model ); + + QVariant variant = action->data(); + if( variant.canConvert() ) + { + emit activated( variant.value()); + } +} + diff --git a/modules/gui/qt4/util/qmenuview.hpp b/modules/gui/qt4/util/qmenuview.hpp new file mode 100644 index 0000000000..8564ec1e4c --- /dev/null +++ b/modules/gui/qt4/util/qmenuview.hpp @@ -0,0 +1,57 @@ +/***************************************************************************** + * QMenuView + **************************************************************************** + * Copyright © 2011 VLC authors and VideoLAN + * $Id$ + * + * Authors: Jean-Baptiste Kempf + * + * 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 _QMENU_VIEW_H_ +#define _QMENU_VIEW_H_ + +#include +#include + +class QMenuView : public QMenu +{ + Q_OBJECT; + +public: + QMenuView( QWidget * parent = 0 ); + virtual ~QMenuView(){} + + /* Model */ + void setModel( QAbstractItemModel * model ) { m_model = model; } + QAbstractItemModel * model() const { return m_model; } + +private: + QAbstractItemModel *m_model; + + QAction *createActionFromIndex( QModelIndex index ); + + void build( const QModelIndex &parent ); + +private slots: + void rebuild(); + void activate(QAction*); + +signals: + void activated( const QModelIndex & index ); +}; + +#endif -- 2.39.2