From 3747c71c6695dc6a0d8aaa75dc38eea5dbe9ef9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Luis=20=C3=81ngel=20San=20Mart=C3=ADn?= Date: Mon, 9 Oct 2023 19:27:47 +0200 Subject: [PATCH] Add context menu to pick what columns are visible in the classic comics view --- YACReaderLibrary/classic_comics_view.cpp | 88 ++++++++++++++++-------- YACReaderLibrary/classic_comics_view.h | 1 + 2 files changed, 59 insertions(+), 30 deletions(-) diff --git a/YACReaderLibrary/classic_comics_view.cpp b/YACReaderLibrary/classic_comics_view.cpp index d3b7ea9e..00b513c9 100644 --- a/YACReaderLibrary/classic_comics_view.cpp +++ b/YACReaderLibrary/classic_comics_view.cpp @@ -60,10 +60,7 @@ ClassicComicsView::ClassicComicsView(QWidget *parent) sVertical->addWidget(comics); tableView->setContextMenuPolicy(Qt::CustomContextMenu); - - // config-------------------------------------------------- - if (settings->contains(COMICS_VIEW_HEADERS)) - tableView->horizontalHeader()->restoreState(settings->value(COMICS_VIEW_HEADERS).toByteArray()); + tableView->horizontalHeader()->setContextMenuPolicy(Qt::CustomContextMenu); // connections--------------------------------------------- connect(tableView, &QAbstractItemView::clicked, this, &ClassicComicsView::centerComicFlow); @@ -75,6 +72,7 @@ ClassicComicsView::ClassicComicsView(QWidget *parent) connect(tableView->horizontalHeader(), &QHeaderView::sectionResized, this, &ClassicComicsView::saveTableHeadersStatus); connect(comicFlow, &QWidget::customContextMenuRequested, this, &ClassicComicsView::requestedViewContextMenu); connect(tableView, &QWidget::customContextMenuRequested, this, &ClassicComicsView::requestedItemContextMenu); + connect(tableView->horizontalHeader(), &QWidget::customContextMenuRequested, this, &ClassicComicsView::requestedHeaderContextMenu); layout->addWidget(sVertical); setLayout(layout); @@ -84,8 +82,13 @@ ClassicComicsView::ClassicComicsView(QWidget *parent) sVertical->setCollapsible(1, false); #endif - if (settings->contains(COMICS_VIEW_FLOW_SPLITTER_STATUS)) - sVertical->restoreState(settings->value(COMICS_VIEW_FLOW_SPLITTER_STATUS).toByteArray()); + if (settings->contains(COMICS_VIEW_FLOW_SPLITTER_STATUS)) { + try { + sVertical->restoreState(settings->value(COMICS_VIEW_FLOW_SPLITTER_STATUS).toByteArray()); + } catch (...) { + // do nothing + } + } // hide flow widgets hideFlowViewAction = new QAction(this); @@ -150,34 +153,38 @@ void ClassicComicsView::setModel(ComicModel *model) #else tableView->horizontalHeader()->setMovable(true); #endif - // TODO parametrizar la configuración de las columnas - /*if(!settings->contains(COMICS_VIEW_HEADERS)) - {*/ - for (int i = 0; i < tableView->horizontalHeader()->count(); i++) - tableView->horizontalHeader()->hideSection(i); - - tableView->horizontalHeader()->showSection(ComicModel::Number); - tableView->horizontalHeader()->showSection(ComicModel::Title); - tableView->horizontalHeader()->showSection(ComicModel::FileName); - tableView->horizontalHeader()->showSection(ComicModel::NumPages); - tableView->horizontalHeader()->showSection(ComicModel::Hash); // Size is part of the Hash...TODO add Columns::Size to Columns - tableView->horizontalHeader()->showSection(ComicModel::ReadColumn); - tableView->horizontalHeader()->showSection(ComicModel::CurrentPage); - tableView->horizontalHeader()->showSection(ComicModel::PublicationDate); - tableView->horizontalHeader()->showSection(ComicModel::Rating); - //} - - // debido a un bug, qt4 no es capaz de ajustar el ancho teniendo en cuenta todas la filas (no sólo las visibles) - // así que se ecala la primera vez y después se deja el control al usuario. - // if(!settings->contains(COMICS_VIEW_HEADERS)) - QStringList paths = model->getPaths(model->getCurrentPath()); // TODO ComicsView: get currentpath from somewhere currentPath()); comicFlow->setImagePaths(paths); comicFlow->setMarks(model->getReadList()); - // comicFlow->setFocus(Qt::OtherFocusReason); - if (settings->contains(COMICS_VIEW_HEADERS)) - tableView->horizontalHeader()->restoreState(settings->value(COMICS_VIEW_HEADERS).toByteArray()); + bool loadDefaults = false; + if (settings->contains(COMICS_VIEW_HEADERS)) { + try { + loadDefaults = !tableView->horizontalHeader()->restoreState(settings->value(COMICS_VIEW_HEADERS).toByteArray()); + } catch (...) { + loadDefaults = true; + } + } + + if (loadDefaults) { + // default columns and order + for (int i = 0; i < tableView->horizontalHeader()->count(); i++) + tableView->horizontalHeader()->hideSection(i); + + tableView->horizontalHeader()->showSection(ComicModel::Number); + tableView->horizontalHeader()->showSection(ComicModel::Title); + tableView->horizontalHeader()->showSection(ComicModel::FileName); + tableView->horizontalHeader()->showSection(ComicModel::NumPages); + tableView->horizontalHeader()->showSection(ComicModel::Size); + tableView->horizontalHeader()->showSection(ComicModel::ReadColumn); + tableView->horizontalHeader()->showSection(ComicModel::CurrentPage); + tableView->horizontalHeader()->showSection(ComicModel::PublicationDate); + tableView->horizontalHeader()->showSection(ComicModel::Rating); + + tableView->horizontalHeader()->moveSection(ComicModel::CurrentPage, 3); + tableView->horizontalHeader()->moveSection(ComicModel::Rating, 12); + tableView->horizontalHeader()->moveSection(ComicModel::Size, 5); + } tableView->resizeColumnsToContents(); @@ -290,6 +297,27 @@ void ClassicComicsView::requestedItemContextMenu(const QPoint &point) emit customContextMenuItemRequested(tableView->mapTo(this, point)); } +void ClassicComicsView::requestedHeaderContextMenu(const QPoint &point) +{ + QMenu menu; + + for (int i = 0; i < tableView->model()->columnCount(); ++i) { + auto title = tableView->model()->headerData(i, Qt::Horizontal).toString(); + + if (!title.isEmpty()) { + auto action = menu.addAction(tableView->model()->headerData(i, Qt::Horizontal).toString()); + action->setCheckable(true); + action->setChecked(!tableView->isColumnHidden(i)); + connect(action, &QAction::toggled, tableView, [this, i](bool checked) { + tableView->horizontalHeader()->setSectionHidden(i, !checked); + }); + connect(action, &QAction::toggled, this, &ClassicComicsView::saveTableHeadersStatus); + } + } + + menu.exec(this->tableView->horizontalHeader()->mapToGlobal(point)); +} + void ClassicComicsView::setShowMarks(bool show) { comicFlow->setShowMarks(show); diff --git a/YACReaderLibrary/classic_comics_view.h b/YACReaderLibrary/classic_comics_view.h index 2f0a8c1a..c492a033 100644 --- a/YACReaderLibrary/classic_comics_view.h +++ b/YACReaderLibrary/classic_comics_view.h @@ -52,6 +52,7 @@ protected slots: void hideComicFlow(bool hide); void requestedViewContextMenu(const QPoint &point); void requestedItemContextMenu(const QPoint &point); + void requestedHeaderContextMenu(const QPoint &point); private: YACReaderTableView *tableView;