From cb71b33a2b1daf477d0eaa8b231743d980b11601 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20Br=C3=BCbach?= Date: Wed, 22 Jan 2025 14:12:38 +0100 Subject: [PATCH] Add a splitter and a list view to jump to the card list displays. --- ..._api_response_card_list_display_widget.cpp | 2 +- ...er_api_response_card_list_display_widget.h | 6 ++ ..._commander_api_response_display_widget.cpp | 76 +++++++++++++++++-- ...ec_commander_api_response_display_widget.h | 8 +- .../src/client/tabs/api/edhrec/tab_edhrec.cpp | 20 +---- .../src/client/tabs/api/edhrec/tab_edhrec.h | 2 - .../widgets/general/display/banner_widget.h | 4 + 7 files changed, 91 insertions(+), 27 deletions(-) diff --git a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_list_display_widget.cpp b/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_list_display_widget.cpp index 9117ca520..0d1f1e8f3 100644 --- a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_list_display_widget.cpp +++ b/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_list_display_widget.cpp @@ -13,7 +13,7 @@ EdhrecCommanderApiResponseCardListDisplayWidget::EdhrecCommanderApiResponseCardL layout = new QVBoxLayout(this); setLayout(layout); - auto header = new BannerWidget(this, toDisplay.header); + header = new BannerWidget(this, toDisplay.header); flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAlwaysOff); header->setBuddy(flowWidget); diff --git a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_list_display_widget.h b/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_list_display_widget.h index 41b846f1f..9df667929 100644 --- a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_list_display_widget.h +++ b/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_card_list_display_widget.h @@ -1,6 +1,7 @@ #ifndef EDHREC_COMMANDER_API_RESPONSE_CARD_LIST_DISPLAY_WIDGET_H #define EDHREC_COMMANDER_API_RESPONSE_CARD_LIST_DISPLAY_WIDGET_H +#include "../../../ui/widgets/general/display/banner_widget.h" #include "../../../ui/widgets/general/layout_containers/flow_widget.h" #include "api_response/edhrec_commander_api_response_card_list.h" @@ -15,9 +16,14 @@ public: explicit EdhrecCommanderApiResponseCardListDisplayWidget(QWidget *parent, EdhrecCommanderApiResponseCardList toDisplay); void resizeEvent(QResizeEvent *event) override; + [[nodiscard]] QString getBannerText() const + { + return header->getText(); + }; private: QVBoxLayout *layout; + BannerWidget *header; FlowWidget *flowWidget; }; diff --git a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_display_widget.cpp b/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_display_widget.cpp index 5a479c599..2710fecf1 100644 --- a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_display_widget.cpp +++ b/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_display_widget.cpp @@ -6,25 +6,86 @@ #include "edhrec_commander_api_response_card_list_display_widget.h" #include "edhrec_commander_api_response_commander_details_display_widget.h" +#include #include +#include +#include +#include EdhrecCommanderApiResponseDisplayWidget::EdhrecCommanderApiResponseDisplayWidget(QWidget *parent, EdhrecCommanderApiResponse response) : QWidget(parent) { - layout = new QVBoxLayout(this); + layout = new QHBoxLayout(this); setLayout(layout); - layout->setAlignment(Qt::AlignHCenter); + cardDisplayLayout = new QVBoxLayout(this); + // Create a QSplitter to hold the ListView and ScrollArea side by side + auto splitter = new QSplitter(this); + splitter->setOrientation(Qt::Horizontal); // Horizontal splitter to divide ListView and ScrollArea + + // Create the list view + auto listView = new QListView(splitter); // Set list view as part of the splitter + auto listModel = new QStringListModel(this); + QStringList widgetNames; + + // Add commander details auto commanderPicture = new EdhrecCommanderResponseCommanderDetailsDisplayWidget(this, response.container.getCommanderDetails()); - layout->addWidget(commanderPicture); + cardDisplayLayout->addWidget(commanderPicture); + widgetNames.append("Commander Details"); + // Add card list widgets auto edhrec_commander_api_response_card_lists = response.container.getCardlists(); foreach (EdhrecCommanderApiResponseCardList card_list, edhrec_commander_api_response_card_lists) { auto cardListDisplayWidget = new EdhrecCommanderApiResponseCardListDisplayWidget(this, card_list); - layout->addWidget(cardListDisplayWidget); + cardDisplayLayout->addWidget(cardListDisplayWidget); + widgetNames.append(cardListDisplayWidget->getBannerText()); } + + // Create a QScrollArea to hold the card display widgets + scrollArea = new QScrollArea(splitter); // Set scroll area as part of the splitter + scrollArea->setWidgetResizable(true); + scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); + scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + + // Set the cardDisplayLayout inside the scroll area + auto scrollWidget = new QWidget(scrollArea); // Create a QWidget to contain the layout + scrollWidget->setLayout(cardDisplayLayout); // Set the layout for the widget + connect(splitter, &QSplitter::splitterMoved, this, &EdhrecCommanderApiResponseDisplayWidget::onSplitterChange); + scrollArea->setWidget(scrollWidget); // Set the widget inside the scroll area + + // Configure the list view + listModel->setStringList(widgetNames); + listView->setModel(listModel); + listView->setEditTriggers(QAbstractItemView::NoEditTriggers); + + // Connect the list view to ensure the corresponding widget is visible + connect(listView, &QListView::clicked, this, [this](const QModelIndex &index) { + int widgetIndex = index.row(); + qDebug() << "clicked: " << widgetIndex; + auto targetWidget = cardDisplayLayout->itemAt(widgetIndex)->widget(); + if (targetWidget) { + qDebug() << "Found targetWidget" << targetWidget; + // Attempt to cast the parent to QScrollArea + auto scrollArea = qobject_cast(this->scrollArea); // Use the scroll area instance + if (scrollArea) { + qDebug() << "ScrollArea" << scrollArea; + scrollArea->ensureWidgetVisible(targetWidget); + } + } + }); + + // Add splitter to the main layout + splitter->addWidget(listView); // Add listView to the splitter + splitter->addWidget(scrollArea); // Add scrollArea to the splitter + + layout->addWidget(splitter); // Add the splitter to the main layout +} + +void EdhrecCommanderApiResponseDisplayWidget::onSplitterChange() +{ + scrollArea->widget()->resize(scrollArea->size()); } void EdhrecCommanderApiResponseDisplayWidget::resizeEvent(QResizeEvent *event) @@ -34,4 +95,9 @@ void EdhrecCommanderApiResponseDisplayWidget::resizeEvent(QResizeEvent *event) layout->invalidate(); layout->activate(); layout->update(); -} \ No newline at end of file + if (scrollArea) { + if (scrollArea->widget()) { + scrollArea->widget()->resize(event->size()); + } + } +} diff --git a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_display_widget.h b/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_display_widget.h index a5f9612a6..d1e95e3d6 100644 --- a/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_display_widget.h +++ b/cockatrice/src/client/tabs/api/edhrec/edhrec_commander_api_response_display_widget.h @@ -3,6 +3,7 @@ #include "api_response/edhrec_commander_api_response.h" +#include #include #include @@ -14,8 +15,13 @@ public: explicit EdhrecCommanderApiResponseDisplayWidget(QWidget *parent, EdhrecCommanderApiResponse response); void resizeEvent(QResizeEvent *event) override; +public slots: + void onSplitterChange(); + private: - QVBoxLayout *layout; + QHBoxLayout *layout; + QVBoxLayout *cardDisplayLayout; + QScrollArea *scrollArea; }; #endif // EDHREC_COMMANDER_API_RESPONSE_DISPLAY_WIDGET_H diff --git a/cockatrice/src/client/tabs/api/edhrec/tab_edhrec.cpp b/cockatrice/src/client/tabs/api/edhrec/tab_edhrec.cpp index fcbd52af5..892237650 100644 --- a/cockatrice/src/client/tabs/api/edhrec/tab_edhrec.cpp +++ b/cockatrice/src/client/tabs/api/edhrec/tab_edhrec.cpp @@ -14,13 +14,7 @@ TabEdhRec::TabEdhRec(TabSupervisor *_tabSupervisor) : Tab(_tabSupervisor) { - scrollArea = new QScrollArea(this); - scrollArea->setWidgetResizable(true); - scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - networkManager = new QNetworkAccessManager(this); - setCentralWidget(scrollArea); #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) networkManager->setTransferTimeout(); // Use Qt's default timeout #endif @@ -29,16 +23,6 @@ TabEdhRec::TabEdhRec(TabSupervisor *_tabSupervisor) : Tab(_tabSupervisor) connect(networkManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(processApiJson(QNetworkReply *))); } -void TabEdhRec::resizeEvent(QResizeEvent *event) -{ - QWidget::resizeEvent(event); - if (scrollArea) { - if (scrollArea->widget()) { - scrollArea->widget()->resize(event->size()); - } - } -} - void TabEdhRec::retranslateUi() { } @@ -91,9 +75,9 @@ void TabEdhRec::processApiJson(QNetworkReply *reply) EdhrecCommanderApiResponse deckData; deckData.fromJson(jsonObj); - displayWidget = new EdhrecCommanderApiResponseDisplayWidget(scrollArea, deckData); + displayWidget = new EdhrecCommanderApiResponseDisplayWidget(this, deckData); // flowWidget->addWidget(displayWidget); - scrollArea->setWidget(displayWidget); + setCentralWidget(displayWidget); reply->deleteLater(); update(); diff --git a/cockatrice/src/client/tabs/api/edhrec/tab_edhrec.h b/cockatrice/src/client/tabs/api/edhrec/tab_edhrec.h index fea96baa8..c15f22b26 100644 --- a/cockatrice/src/client/tabs/api/edhrec/tab_edhrec.h +++ b/cockatrice/src/client/tabs/api/edhrec/tab_edhrec.h @@ -14,7 +14,6 @@ class TabEdhRec : public Tab Q_OBJECT public: explicit TabEdhRec(TabSupervisor *_tabSupervisor); - void resizeEvent(QResizeEvent *event); void retranslateUi() override; QString getTabText() const override @@ -31,7 +30,6 @@ public slots: void setCard(CardInfoPtr _cardToQuery, bool isCommander = false); private: - QScrollArea *scrollArea; CardInfoPtr cardToQuery; EdhrecCommanderApiResponseDisplayWidget *displayWidget; }; diff --git a/cockatrice/src/client/ui/widgets/general/display/banner_widget.h b/cockatrice/src/client/ui/widgets/general/display/banner_widget.h index 9d9b4be77..60bf9b072 100644 --- a/cockatrice/src/client/ui/widgets/general/display/banner_widget.h +++ b/cockatrice/src/client/ui/widgets/general/display/banner_widget.h @@ -18,6 +18,10 @@ public: { buddy = _buddy; } + QString getText() const + { + return bannerLabel->text(); + } protected: void paintEvent(QPaintEvent *event) override;