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:
parent
518d57f669
commit
ee21693f2c
5 changed files with 160 additions and 65 deletions
|
@ -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
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 <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
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 <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) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue