1
Fork 0
mirror of https://github.com/redstrate/Astra.git synced 2025-04-24 13:27:45 +00:00

Improve news banner

Now it properly "slideshows" just like the real client, instead of being
a static image like it was before. The banners are now clickable, but
there's still a bug causing the controls to be reloaded twice on startup
- delaying the first animation.
This commit is contained in:
Joshua Goins 2022-04-17 21:17:58 -04:00
parent 518d57f669
commit ee21693f2c
5 changed files with 160 additions and 65 deletions

View file

@ -37,7 +37,9 @@ set(SRC
src/gameinstaller.cpp src/gameinstaller.cpp
src/encryptedarg.cpp src/encryptedarg.cpp
src/aboutwindow.cpp src/aboutwindow.cpp
include/aboutwindow.h) include/aboutwindow.h
src/bannerwidget.cpp
include/bannerwidget.h)
include(FetchContent) include(FetchContent)

17
include/bannerwidget.h Normal file
View file

@ -0,0 +1,17 @@
#pragma once
#include <QLabel>
#include <QUrl>
class BannerWidget : public QLabel {
public:
BannerWidget();
void setUrl(QUrl url);
protected:
void mousePressEvent(QMouseEvent *event) override;
private:
QUrl url;
};

View file

@ -7,6 +7,7 @@
#include <QTreeWidget> #include <QTreeWidget>
#include <QGridLayout> #include <QGridLayout>
#include <QFormLayout> #include <QFormLayout>
#include <QScrollArea>
#include "launchercore.h" #include "launchercore.h"
#include "headline.h" #include "headline.h"
@ -25,6 +26,8 @@ public slots:
void reloadControls(); void reloadControls();
private: private:
void reloadNews();
LauncherCore& core; LauncherCore& core;
Headline headline; Headline headline;
@ -34,8 +37,14 @@ private:
QGridLayout* layout; QGridLayout* layout;
QFormLayout* loginLayout; QFormLayout* loginLayout;
QLabel* bannerImageView; QScrollArea* bannerScrollArea;
QWidget* bannerParentWidget;
QHBoxLayout* bannerLayout;
QTreeWidget* newsListView; QTreeWidget* newsListView;
QTimer* bannerTimer = nullptr;
int currentBanner = 0;
std::vector<QLabel*> bannerWidgets;
QAction* launchOfficial; QAction* launchOfficial;
QAction* launchSysInfo; QAction* launchSysInfo;

17
src/bannerwidget.cpp Normal file
View file

@ -0,0 +1,17 @@
#include "bannerwidget.h"
#include <QDebug>
#include <QDesktopServices>
BannerWidget::BannerWidget() : QLabel() {
setCursor(Qt::CursorShape::PointingHandCursor);
}
void BannerWidget::mousePressEvent(QMouseEvent* event) {
qDebug() << "Clicked!";
QDesktopServices::openUrl(url);
}
void BannerWidget::setUrl(QUrl url) {
this->url = url;
}

View file

@ -9,6 +9,8 @@
#include <QTreeWidgetItem> #include <QTreeWidgetItem>
#include <QHeaderView> #include <QHeaderView>
#include <QDirIterator> #include <QDirIterator>
#include <QTimer>
#include <QScrollBar>
#include "settingswindow.h" #include "settingswindow.h"
#include "squareboot.h" #include "squareboot.h"
@ -19,6 +21,7 @@
#include "config.h" #include "config.h"
#include "aboutwindow.h" #include "aboutwindow.h"
#include "gameinstaller.h" #include "gameinstaller.h"
#include "bannerwidget.h"
#include "encryptedarg.h" #include "encryptedarg.h"
LauncherWindow::LauncherWindow(LauncherCore& core, QWidget* parent) : QMainWindow(parent), core(core) { LauncherWindow::LauncherWindow(LauncherCore& core, QWidget* parent) : QMainWindow(parent), core(core) {
@ -181,13 +184,24 @@ LauncherWindow::LauncherWindow(LauncherCore& core, QWidget* parent) : QMainWindo
layout = new QGridLayout(); layout = new QGridLayout();
bannerImageView = new QLabel(); bannerScrollArea = new QScrollArea();
bannerLayout = new QHBoxLayout();
bannerLayout->setContentsMargins(0, 0, 0, 0);
bannerLayout->setSpacing(0);
bannerLayout->setSizeConstraint(QLayout::SizeConstraint::SetMinAndMaxSize);
bannerParentWidget = new QWidget();
bannerParentWidget->setFixedHeight(250);
bannerScrollArea->setFixedWidth(640);
bannerScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
bannerScrollArea->verticalScrollBar()->setEnabled(false);
bannerScrollArea->horizontalScrollBar()->setEnabled(false);
bannerScrollArea->setWidget(bannerParentWidget);
bannerParentWidget->setLayout(bannerLayout);
newsListView = new QTreeWidget(); newsListView = new QTreeWidget();
newsListView->setColumnCount(2); newsListView->setColumnCount(2);
newsListView->setHeaderLabels({"Title", "Date"}); newsListView->setHeaderLabels({"Title", "Date"});
//newsListView->header()->setStretchLastSection(true);
//newsListView->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
connect(newsListView, &QTreeWidget::itemClicked, [](QTreeWidgetItem* item, int column) { connect(newsListView, &QTreeWidget::itemClicked, [](QTreeWidgetItem* item, int column) {
auto url = item->data(0, Qt::UserRole).toUrl(); auto url = item->data(0, Qt::UserRole).toUrl();
qInfo() << "clicked" << url; qInfo() << "clicked" << url;
@ -282,6 +296,11 @@ LauncherWindow::LauncherWindow(LauncherCore& core, QWidget* parent) : QMainWindo
QCoreApplication::quit(); QCoreApplication::quit();
}); });
getHeadline(core,[&](Headline headline) {
this->headline = headline;
reloadNews();
});
reloadControls(); reloadControls();
} }
@ -375,8 +394,8 @@ void LauncherWindow::reloadControls() {
wineCfg->setEnabled(currentProfile().isWineInstalled()); wineCfg->setEnabled(currentProfile().isWineInstalled());
#endif #endif
layout->removeWidget(bannerImageView); layout->removeWidget(bannerScrollArea);
bannerImageView->hide(); bannerScrollArea->hide();
layout->removeWidget(newsListView); layout->removeWidget(newsListView);
newsListView->hide(); newsListView->hide();
@ -405,11 +424,23 @@ void LauncherWindow::reloadControls() {
registerButton->show(); registerButton->show();
} }
reloadNews();
currentlyReloadingControls = false;
}
void LauncherWindow::reloadNews() {
if(core.appSettings.showBanners || core.appSettings.showNewsList) { if(core.appSettings.showBanners || core.appSettings.showNewsList) {
for(auto widget : bannerWidgets) {
bannerLayout->removeWidget(widget);
}
bannerWidgets.clear();
int totalRow = 0; int totalRow = 0;
if(core.appSettings.showBanners) { if(core.appSettings.showBanners) {
bannerImageView->show(); bannerScrollArea->show();
layout->addWidget(bannerImageView, totalRow++, 0); layout->addWidget(bannerScrollArea, totalRow++, 0);
} }
if(core.appSettings.showNewsList) { if(core.appSettings.showNewsList) {
@ -419,77 +450,96 @@ void LauncherWindow::reloadControls() {
newsListView->clear(); newsListView->clear();
getHeadline(core, [&](Headline headline) { if (!headline.banner.empty()) {
this->headline = headline; if(core.appSettings.showBanners) {
for(auto banner : headline.banner) {
if (!headline.banner.empty()) { auto request = QNetworkRequest(banner.bannerImage);
if(core.appSettings.showBanners) {
auto request =
QNetworkRequest(headline.banner[0].bannerImage);
core.buildRequest(currentProfile(), request); core.buildRequest(currentProfile(), request);
auto reply = core.mgr->get(request); auto reply = core.mgr->get(request);
connect(reply, &QNetworkReply::finished, [=] { connect(reply, &QNetworkReply::finished, [=] {
auto bannerImageView = new BannerWidget();
bannerImageView->setUrl(banner.link);
QPixmap pixmap; QPixmap pixmap;
pixmap.loadFromData(reply->readAll()); pixmap.loadFromData(reply->readAll());
bannerImageView->setPixmap(pixmap); bannerImageView->setPixmap(pixmap);
bannerLayout->addWidget(bannerImageView);
bannerWidgets.push_back(bannerImageView);
}); });
} }
if(core.appSettings.showNewsList) { if(bannerTimer == nullptr) {
QTreeWidgetItem* newsItem = new QTreeWidgetItem( bannerTimer = new QTimer();
(QTreeWidgetItem*)nullptr, QStringList("News")); connect(bannerTimer, &QTimer::timeout, this, [=] {
for (auto news : headline.news) { if (currentBanner >= headline.banner.size())
QTreeWidgetItem* item = new QTreeWidgetItem(); currentBanner = 0;
item->setText(0, news.title);
item->setText(1, QLocale().toString(
news.date, QLocale::ShortFormat));
item->setData(0, Qt::UserRole, news.url);
newsItem->addChild(item); bannerScrollArea->ensureVisible(
} 640 * (currentBanner + 1), 0, 0, 0);
QTreeWidgetItem* pinnedItem = new QTreeWidgetItem( currentBanner++;
(QTreeWidgetItem*)nullptr, QStringList("Pinned")); });
for (auto pinned : headline.pinned) { bannerTimer->start(5000);
QTreeWidgetItem* item = new QTreeWidgetItem(); }
item->setText(0, pinned.title); } else {
item->setText(1, if(bannerTimer != nullptr) {
QLocale().toString(pinned.date, bannerTimer->stop();
QLocale::ShortFormat)); bannerTimer->deleteLater();
item->setData(0, Qt::UserRole, pinned.url); bannerTimer = nullptr;
pinnedItem->addChild(item);
}
QTreeWidgetItem* topicsItem = new QTreeWidgetItem(
(QTreeWidgetItem*)nullptr, QStringList("Topics"));
for (auto news : headline.topics) {
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setText(0, news.title);
item->setText(1, QLocale().toString(
news.date, QLocale::ShortFormat));
item->setData(0, Qt::UserRole, news.url);
qInfo() << news.url;
topicsItem->addChild(item);
}
newsListView->insertTopLevelItems(
0, QList<QTreeWidgetItem*>(
{newsItem, pinnedItem, topicsItem}));
for (int i = 0; i < 3; i++) {
newsListView->expandItem(newsListView->topLevelItem(i));
newsListView->resizeColumnToContents(i);
}
} }
} }
});
}
currentlyReloadingControls = false; if(core.appSettings.showNewsList) {
QTreeWidgetItem* newsItem = new QTreeWidgetItem(
(QTreeWidgetItem*)nullptr, QStringList("News"));
for (auto news : headline.news) {
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setText(0, news.title);
item->setText(1, QLocale().toString(
news.date, QLocale::ShortFormat));
item->setData(0, Qt::UserRole, news.url);
newsItem->addChild(item);
}
QTreeWidgetItem* pinnedItem = new QTreeWidgetItem(
(QTreeWidgetItem*)nullptr, QStringList("Pinned"));
for (auto pinned : headline.pinned) {
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setText(0, pinned.title);
item->setText(1,
QLocale().toString(pinned.date,
QLocale::ShortFormat));
item->setData(0, Qt::UserRole, pinned.url);
pinnedItem->addChild(item);
}
QTreeWidgetItem* topicsItem = new QTreeWidgetItem(
(QTreeWidgetItem*)nullptr, QStringList("Topics"));
for (auto news : headline.topics) {
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setText(0, news.title);
item->setText(1, QLocale().toString(
news.date, QLocale::ShortFormat));
item->setData(0, Qt::UserRole, news.url);
topicsItem->addChild(item);
}
newsListView->insertTopLevelItems(
0, QList<QTreeWidgetItem*>(
{newsItem, pinnedItem, topicsItem}));
for (int i = 0; i < 3; i++) {
newsListView->expandItem(newsListView->topLevelItem(i));
newsListView->resizeColumnToContents(i);
}
}
}
}
} }
void LauncherWindow::openPath(const QString path) { void LauncherWindow::openPath(const QString path) {