1
Fork 0
mirror of https://github.com/redstrate/Astra.git synced 2025-04-24 05:17:46 +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/encryptedarg.cpp
src/aboutwindow.cpp
include/aboutwindow.h)
include/aboutwindow.h
src/bannerwidget.cpp
include/bannerwidget.h)
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 <QGridLayout>
#include <QFormLayout>
#include <QScrollArea>
#include "launchercore.h"
#include "headline.h"
@ -25,6 +26,8 @@ public slots:
void reloadControls();
private:
void reloadNews();
LauncherCore& core;
Headline headline;
@ -34,8 +37,14 @@ private:
QGridLayout* layout;
QFormLayout* loginLayout;
QLabel* bannerImageView;
QScrollArea* bannerScrollArea;
QWidget* bannerParentWidget;
QHBoxLayout* bannerLayout;
QTreeWidget* newsListView;
QTimer* bannerTimer = nullptr;
int currentBanner = 0;
std::vector<QLabel*> bannerWidgets;
QAction* launchOfficial;
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 <QHeaderView>
#include <QDirIterator>
#include <QTimer>
#include <QScrollBar>
#include "settingswindow.h"
#include "squareboot.h"
@ -19,6 +21,7 @@
#include "config.h"
#include "aboutwindow.h"
#include "gameinstaller.h"
#include "bannerwidget.h"
#include "encryptedarg.h"
LauncherWindow::LauncherWindow(LauncherCore& core, QWidget* parent) : QMainWindow(parent), core(core) {
@ -181,13 +184,24 @@ LauncherWindow::LauncherWindow(LauncherCore& core, QWidget* parent) : QMainWindo
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->setColumnCount(2);
newsListView->setHeaderLabels({"Title", "Date"});
//newsListView->header()->setStretchLastSection(true);
//newsListView->header()->setSectionResizeMode(QHeaderView::ResizeToContents);
connect(newsListView, &QTreeWidget::itemClicked, [](QTreeWidgetItem* item, int column) {
auto url = item->data(0, Qt::UserRole).toUrl();
qInfo() << "clicked" << url;
@ -282,6 +296,11 @@ LauncherWindow::LauncherWindow(LauncherCore& core, QWidget* parent) : QMainWindo
QCoreApplication::quit();
});
getHeadline(core,[&](Headline headline) {
this->headline = headline;
reloadNews();
});
reloadControls();
}
@ -375,8 +394,8 @@ void LauncherWindow::reloadControls() {
wineCfg->setEnabled(currentProfile().isWineInstalled());
#endif
layout->removeWidget(bannerImageView);
bannerImageView->hide();
layout->removeWidget(bannerScrollArea);
bannerScrollArea->hide();
layout->removeWidget(newsListView);
newsListView->hide();
@ -405,11 +424,23 @@ void LauncherWindow::reloadControls() {
registerButton->show();
}
reloadNews();
currentlyReloadingControls = false;
}
void LauncherWindow::reloadNews() {
if(core.appSettings.showBanners || core.appSettings.showNewsList) {
for(auto widget : bannerWidgets) {
bannerLayout->removeWidget(widget);
}
bannerWidgets.clear();
int totalRow = 0;
if(core.appSettings.showBanners) {
bannerImageView->show();
layout->addWidget(bannerImageView, totalRow++, 0);
bannerScrollArea->show();
layout->addWidget(bannerScrollArea, totalRow++, 0);
}
if(core.appSettings.showNewsList) {
@ -419,77 +450,96 @@ void LauncherWindow::reloadControls() {
newsListView->clear();
getHeadline(core, [&](Headline headline) {
this->headline = headline;
if (!headline.banner.empty()) {
if(core.appSettings.showBanners) {
auto request =
QNetworkRequest(headline.banner[0].bannerImage);
if (!headline.banner.empty()) {
if(core.appSettings.showBanners) {
for(auto banner : headline.banner) {
auto request = QNetworkRequest(banner.bannerImage);
core.buildRequest(currentProfile(), request);
auto reply = core.mgr->get(request);
connect(reply, &QNetworkReply::finished, [=] {
auto bannerImageView = new BannerWidget();
bannerImageView->setUrl(banner.link);
QPixmap pixmap;
pixmap.loadFromData(reply->readAll());
bannerImageView->setPixmap(pixmap);
bannerLayout->addWidget(bannerImageView);
bannerWidgets.push_back(bannerImageView);
});
}
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);
if(bannerTimer == nullptr) {
bannerTimer = new QTimer();
connect(bannerTimer, &QTimer::timeout, this, [=] {
if (currentBanner >= headline.banner.size())
currentBanner = 0;
newsItem->addChild(item);
}
bannerScrollArea->ensureVisible(
640 * (currentBanner + 1), 0, 0, 0);
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);
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);
}
currentBanner++;
});
bannerTimer->start(5000);
}
} else {
if(bannerTimer != nullptr) {
bannerTimer->stop();
bannerTimer->deleteLater();
bannerTimer = nullptr;
}
}
});
}
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) {