Add a splitter and a list view to jump to the card list displays.

This commit is contained in:
Lukas Brübach 2025-01-22 14:12:38 +01:00
parent 9089eeecf2
commit cb71b33a2b
7 changed files with 91 additions and 27 deletions

View file

@ -13,7 +13,7 @@ EdhrecCommanderApiResponseCardListDisplayWidget::EdhrecCommanderApiResponseCardL
layout = new QVBoxLayout(this); layout = new QVBoxLayout(this);
setLayout(layout); 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); flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAlwaysOff);
header->setBuddy(flowWidget); header->setBuddy(flowWidget);

View file

@ -1,6 +1,7 @@
#ifndef EDHREC_COMMANDER_API_RESPONSE_CARD_LIST_DISPLAY_WIDGET_H #ifndef EDHREC_COMMANDER_API_RESPONSE_CARD_LIST_DISPLAY_WIDGET_H
#define 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 "../../../ui/widgets/general/layout_containers/flow_widget.h"
#include "api_response/edhrec_commander_api_response_card_list.h" #include "api_response/edhrec_commander_api_response_card_list.h"
@ -15,9 +16,14 @@ public:
explicit EdhrecCommanderApiResponseCardListDisplayWidget(QWidget *parent, explicit EdhrecCommanderApiResponseCardListDisplayWidget(QWidget *parent,
EdhrecCommanderApiResponseCardList toDisplay); EdhrecCommanderApiResponseCardList toDisplay);
void resizeEvent(QResizeEvent *event) override; void resizeEvent(QResizeEvent *event) override;
[[nodiscard]] QString getBannerText() const
{
return header->getText();
};
private: private:
QVBoxLayout *layout; QVBoxLayout *layout;
BannerWidget *header;
FlowWidget *flowWidget; FlowWidget *flowWidget;
}; };

View file

@ -6,25 +6,86 @@
#include "edhrec_commander_api_response_card_list_display_widget.h" #include "edhrec_commander_api_response_card_list_display_widget.h"
#include "edhrec_commander_api_response_commander_details_display_widget.h" #include "edhrec_commander_api_response_commander_details_display_widget.h"
#include <QListView>
#include <QResizeEvent> #include <QResizeEvent>
#include <QScrollArea>
#include <QSplitter>
#include <QStringListModel>
EdhrecCommanderApiResponseDisplayWidget::EdhrecCommanderApiResponseDisplayWidget(QWidget *parent, EdhrecCommanderApiResponseDisplayWidget::EdhrecCommanderApiResponseDisplayWidget(QWidget *parent,
EdhrecCommanderApiResponse response) EdhrecCommanderApiResponse response)
: QWidget(parent) : QWidget(parent)
{ {
layout = new QVBoxLayout(this); layout = new QHBoxLayout(this);
setLayout(layout); 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()); 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(); auto edhrec_commander_api_response_card_lists = response.container.getCardlists();
foreach (EdhrecCommanderApiResponseCardList card_list, edhrec_commander_api_response_card_lists) { foreach (EdhrecCommanderApiResponseCardList card_list, edhrec_commander_api_response_card_lists) {
auto cardListDisplayWidget = new EdhrecCommanderApiResponseCardListDisplayWidget(this, card_list); 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<QScrollArea *>(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) void EdhrecCommanderApiResponseDisplayWidget::resizeEvent(QResizeEvent *event)
@ -34,4 +95,9 @@ void EdhrecCommanderApiResponseDisplayWidget::resizeEvent(QResizeEvent *event)
layout->invalidate(); layout->invalidate();
layout->activate(); layout->activate();
layout->update(); layout->update();
} if (scrollArea) {
if (scrollArea->widget()) {
scrollArea->widget()->resize(event->size());
}
}
}

View file

@ -3,6 +3,7 @@
#include "api_response/edhrec_commander_api_response.h" #include "api_response/edhrec_commander_api_response.h"
#include <QScrollArea>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QWidget> #include <QWidget>
@ -14,8 +15,13 @@ public:
explicit EdhrecCommanderApiResponseDisplayWidget(QWidget *parent, EdhrecCommanderApiResponse response); explicit EdhrecCommanderApiResponseDisplayWidget(QWidget *parent, EdhrecCommanderApiResponse response);
void resizeEvent(QResizeEvent *event) override; void resizeEvent(QResizeEvent *event) override;
public slots:
void onSplitterChange();
private: private:
QVBoxLayout *layout; QHBoxLayout *layout;
QVBoxLayout *cardDisplayLayout;
QScrollArea *scrollArea;
}; };
#endif // EDHREC_COMMANDER_API_RESPONSE_DISPLAY_WIDGET_H #endif // EDHREC_COMMANDER_API_RESPONSE_DISPLAY_WIDGET_H

View file

@ -14,13 +14,7 @@
TabEdhRec::TabEdhRec(TabSupervisor *_tabSupervisor) : Tab(_tabSupervisor) 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); networkManager = new QNetworkAccessManager(this);
setCentralWidget(scrollArea);
#if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0))
networkManager->setTransferTimeout(); // Use Qt's default timeout networkManager->setTransferTimeout(); // Use Qt's default timeout
#endif #endif
@ -29,16 +23,6 @@ TabEdhRec::TabEdhRec(TabSupervisor *_tabSupervisor) : Tab(_tabSupervisor)
connect(networkManager, SIGNAL(finished(QNetworkReply *)), this, SLOT(processApiJson(QNetworkReply *))); 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() void TabEdhRec::retranslateUi()
{ {
} }
@ -91,9 +75,9 @@ void TabEdhRec::processApiJson(QNetworkReply *reply)
EdhrecCommanderApiResponse deckData; EdhrecCommanderApiResponse deckData;
deckData.fromJson(jsonObj); deckData.fromJson(jsonObj);
displayWidget = new EdhrecCommanderApiResponseDisplayWidget(scrollArea, deckData); displayWidget = new EdhrecCommanderApiResponseDisplayWidget(this, deckData);
// flowWidget->addWidget(displayWidget); // flowWidget->addWidget(displayWidget);
scrollArea->setWidget(displayWidget); setCentralWidget(displayWidget);
reply->deleteLater(); reply->deleteLater();
update(); update();

View file

@ -14,7 +14,6 @@ class TabEdhRec : public Tab
Q_OBJECT Q_OBJECT
public: public:
explicit TabEdhRec(TabSupervisor *_tabSupervisor); explicit TabEdhRec(TabSupervisor *_tabSupervisor);
void resizeEvent(QResizeEvent *event);
void retranslateUi() override; void retranslateUi() override;
QString getTabText() const override QString getTabText() const override
@ -31,7 +30,6 @@ public slots:
void setCard(CardInfoPtr _cardToQuery, bool isCommander = false); void setCard(CardInfoPtr _cardToQuery, bool isCommander = false);
private: private:
QScrollArea *scrollArea;
CardInfoPtr cardToQuery; CardInfoPtr cardToQuery;
EdhrecCommanderApiResponseDisplayWidget *displayWidget; EdhrecCommanderApiResponseDisplayWidget *displayWidget;
}; };

View file

@ -18,6 +18,10 @@ public:
{ {
buddy = _buddy; buddy = _buddy;
} }
QString getText() const
{
return bannerLabel->text();
}
protected: protected:
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;