From 18b7cc28702aa4bca1b6566eb93f65d8b5d273f2 Mon Sep 17 00:00:00 2001 From: David Sansome Date: Fri, 25 Dec 2009 16:12:07 +0000 Subject: [PATCH] Right click on playlist column headers to hide and show them --- src/playlistheader.cpp | 62 ++++++++++++++++++++++++++++++++++++++++++ src/playlistheader.h | 34 +++++++++++++++++++++++ src/playlistview.cpp | 3 ++ src/src.pro | 6 ++-- 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 src/playlistheader.cpp create mode 100644 src/playlistheader.h diff --git a/src/playlistheader.cpp b/src/playlistheader.cpp new file mode 100644 index 000000000..64d18c407 --- /dev/null +++ b/src/playlistheader.cpp @@ -0,0 +1,62 @@ +#include "playlistheader.h" + +#include +#include +#include +#include + +PlaylistHeader::PlaylistHeader(Qt::Orientation orientation, QWidget* parent) + : QHeaderView(orientation, parent), + menu_(new QMenu(this)), + show_menu_(new QMenu(this)), + show_mapper_(new QSignalMapper(this)) +{ + hide_action_ = menu_->addAction("Hide...", this, SLOT(HideCurrent())); + QAction* show_action = menu_->addAction("Show section"); + show_action->setMenu(show_menu_); + + connect(show_mapper_, SIGNAL(mapped(int)), SLOT(ToggleVisible(int))); +} + +void PlaylistHeader::contextMenuEvent(QContextMenuEvent* e) { + menu_section_ = logicalIndexAt(e->pos()); + + if (menu_section_ == -1) + hide_action_->setVisible(false); + else { + hide_action_->setVisible(true); + + QString title(model()->headerData(menu_section_, Qt::Horizontal).toString()); + hide_action_->setText("Hide " + title); + } + + show_menu_->clear(); + for (int i=0 ; icolumnCount() ; ++i) { + AddColumnAction(i); + } + + menu_->popup(e->globalPos()); +} + +void PlaylistHeader::AddColumnAction(int index) { + QString title(model()->headerData(index, Qt::Horizontal).toString()); + + QAction* action = show_menu_->addAction(title, show_mapper_, SLOT(map())); + action->setCheckable(true); + action->setChecked(!isSectionHidden(index)); + + show_mapper_->setMapping(action, index); +} + +void PlaylistHeader::HideCurrent() { + if (menu_section_ == -1) + return; + + setSectionHidden(menu_section_, true); +} + +void PlaylistHeader::ToggleVisible(int section) { + setSectionHidden(section, !isSectionHidden(section)); +} + + diff --git a/src/playlistheader.h b/src/playlistheader.h new file mode 100644 index 000000000..955923e8f --- /dev/null +++ b/src/playlistheader.h @@ -0,0 +1,34 @@ +#ifndef PLAYLISTHEADER_H +#define PLAYLISTHEADER_H + +#include + +class QMenu; +class QSignalMapper; + +class PlaylistHeader : public QHeaderView { + Q_OBJECT + + public: + PlaylistHeader(Qt::Orientation orientation, QWidget* parent = 0); + + // QWidget + void contextMenuEvent(QContextMenuEvent* e); + + private slots: + void HideCurrent(); + void ToggleVisible(int section); + + private: + void AddColumnAction(int index); + + private: + int menu_section_; + QMenu* menu_; + QAction* hide_action_; + QMenu* show_menu_; + + QSignalMapper* show_mapper_; +}; + +#endif // PLAYLISTHEADER_H diff --git a/src/playlistview.cpp b/src/playlistview.cpp index 07fcda107..688b20039 100644 --- a/src/playlistview.cpp +++ b/src/playlistview.cpp @@ -1,5 +1,6 @@ #include "playlistview.h" #include "playlist.h" +#include "playlistheader.h" #include #include @@ -101,6 +102,8 @@ PlaylistView::PlaylistView(QWidget *parent) { setItemDelegate(new PlaylistDelegateBase(this)); setItemDelegateForColumn(Playlist::Column_Length, new LengthItemDelegate(this)); + + setHeader(new PlaylistHeader(Qt::Horizontal, this)); header()->setMovable(true); connect(header(), SIGNAL(sectionResized(int,int,int)), SLOT(SaveGeometry())); diff --git a/src/src.pro b/src/src.pro index 41fba5f0a..66ce74cd8 100644 --- a/src/src.pro +++ b/src/src.pro @@ -32,7 +32,8 @@ SOURCES += main.cpp \ systemtrayicon.cpp \ libraryquery.cpp \ fileview.cpp \ - fileviewlist.cpp + fileviewlist.cpp \ + playlistheader.cpp HEADERS += mainwindow.h \ player.h \ library.h \ @@ -61,7 +62,8 @@ HEADERS += mainwindow.h \ systemtrayicon.h \ libraryquery.h \ fileview.h \ - fileviewlist.h + fileviewlist.h \ + playlistheader.h FORMS += mainwindow.ui \ libraryconfig.ui \ fileview.ui