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:
parent
518d57f669
commit
ee21693f2c
5 changed files with 160 additions and 65 deletions
|
@ -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
17
include/bannerwidget.h
Normal 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;
|
||||
};
|
|
@ -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
17
src/bannerwidget.cpp
Normal 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;
|
||||
}
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue