263 lines
8.6 KiB
C++
263 lines
8.6 KiB
C++
//
|
||
// Created by HW on 2023/07/26.
|
||
//
|
||
|
||
// You may need to build the project (run Qt uic code generator) to get "ui_NavBar.h" resolved
|
||
|
||
#include "navbar.h"
|
||
#include "ui_NavBar.h"
|
||
#include "config.h"
|
||
#include <QTimer>
|
||
#include <QtSvg/QtSvg>
|
||
#include <QPixmap>
|
||
#include "mainwindowlayout.h"
|
||
#include "globalvariables.h"
|
||
#ifdef _DEBUG
|
||
#pragma comment(lib, "Qt5Svgd.lib")
|
||
#pragma comment(lib, "Qt5Sqld.lib")
|
||
#else
|
||
#pragma comment(lib, "Qt5Svg.lib")
|
||
#pragma comment(lib, "Qt5Sql.lib")
|
||
#endif
|
||
QString url_param;
|
||
void ConvertImageToTransparent(QImage &img)
|
||
{
|
||
img = img.convertToFormat(QImage::Format_ARGB32);
|
||
union myrgb
|
||
{
|
||
uint rgba;
|
||
uchar rgba_bits[4];
|
||
};
|
||
myrgb* mybits = (myrgb*)img.bits();
|
||
int len = img.width()*img.height();
|
||
while (len--> 0)
|
||
{
|
||
mybits->rgba_bits[3] = (mybits->rgba == 0xFFFFFFFF) ? 0 : 255;
|
||
mybits++;
|
||
}
|
||
}
|
||
|
||
NavBar::NavBar(ConfigResponse *configResponse, MainScreen *mainScreen,QWidget *parent) :
|
||
QWidget(parent), ui(new Ui::NavBar) {
|
||
ui->setupUi(this);
|
||
//this->setAttribute(Qt::WA_DeleteOnClose);
|
||
buffer = new QByteArray;
|
||
/*QString style = "background-color:";
|
||
style += configResponse->basic.backgroud_color.toUpper();
|
||
style += ";";
|
||
setStyleSheet(style);*/
|
||
//setStyleSheet("margin:0");
|
||
setContentsMargins(0, 0, 0, 0);
|
||
if (configResponse->succeed&&configResponse->buttons.empty()!=true) {
|
||
getLogoFromInternet(configResponse);
|
||
}
|
||
else {
|
||
getLogoFromLocal();
|
||
}
|
||
layout2 = new QHBoxLayout;
|
||
layout_right = new QHBoxLayout;
|
||
layout_left = new QHBoxLayout;
|
||
logo_label = new QLabel(this);
|
||
//*logo = logo->scaled(this->width() / (5 / scale), this->height());
|
||
logo_label->setScaledContents(true);
|
||
logo_label->setPixmap(QPixmap::fromImage(*logo));
|
||
logo_label->setMaximumHeight(parent->height() / 8);
|
||
layout_left->addWidget(logo_label);
|
||
layout_left->setAlignment(Qt::AlignCenter);
|
||
for (auto buttonStruct : buttonStructs) {
|
||
MyButton *myButton = new MyButton(buttonStruct, height(), height(), &buttons,this);
|
||
myButton->setMaximumHeight(parent->height() / 8);
|
||
layout_right->addWidget(myButton);
|
||
//myButton->show();
|
||
connect(myButton, &MyButton::clicked1, mainWindowLayout, &MainWindowLayout::clickButton);
|
||
buttons << myButton;
|
||
}
|
||
layout_right->setAlignment(Qt::AlignLeft);
|
||
if (!buttonStructs.empty()) {
|
||
connect(this, &NavBar::firstUrl, mainScreen, &MainScreen::firstUrl);
|
||
emit firstUrl(buttonStructs[0].url);
|
||
}
|
||
layout2->addLayout(layout_left, 1);
|
||
layout2->addLayout(layout_right, 4);
|
||
layout_right->setMargin(0);
|
||
layout2->setMargin(0);
|
||
//layout2->setAlignment(Qt::AlignJustify);
|
||
this->setLayout(layout2);
|
||
logo_label->show();
|
||
}
|
||
|
||
NavBar::~NavBar() {
|
||
for (auto buttonStruct : buttonStructs) {
|
||
delete buttonStruct.image;
|
||
delete buttonStruct.image_cover;
|
||
}
|
||
for(auto button : buttons){
|
||
layout_right->removeWidget(button);
|
||
delete button;
|
||
}
|
||
layout2->removeWidget(logo_label);
|
||
delete logo_label;
|
||
delete logo;
|
||
//delete layout_left;
|
||
delete layout_right;
|
||
delete layout2;
|
||
delete ui;
|
||
}
|
||
|
||
void NavBar::paintEvent(QPaintEvent *event) {
|
||
QWidget::paintEvent(event);
|
||
|
||
QPainter painter(this);
|
||
painter.setRenderHint(QPainter::Antialiasing);
|
||
|
||
QRectF rect(0, 0, this->width(), this->height());
|
||
painter.fillRect(rect, qColor);
|
||
|
||
}
|
||
void NavBar::resizeEvent(QResizeEvent *event) {
|
||
QWidget::resizeEvent(event);
|
||
for(auto button:buttons){
|
||
button->setMaximumSize(event->size().height(), event->size().height());
|
||
button->update();
|
||
}
|
||
logo_label->setMaximumSize(event->size().width() / 5, event->size().height());
|
||
}
|
||
void NavBar::getLogoFromInternet(ConfigResponse *configResponse) {
|
||
qColor.setNamedColor(configResponse->basic.backgroud_color);
|
||
|
||
QUrl url_logo(configResponse->basic.logo_url);
|
||
QNetworkRequest *request_logo = new QNetworkRequest(url_logo);
|
||
manager = new QNetworkAccessManager;
|
||
reply = manager->get(*request_logo);
|
||
QTimer timer;
|
||
timer.setInterval(5000);
|
||
connect(reply, &QNetworkReply::finished, &eventLoop,&QEventLoop::quit);
|
||
connect(&timer, &QTimer::timeout,this, &NavBar::cancelDownload);
|
||
eventLoop.exec();
|
||
timer.stop();
|
||
buffer = new QByteArray;
|
||
delete request_logo;
|
||
reply->close();
|
||
if (downloadSuccess == true) {
|
||
*buffer = reply->readAll();
|
||
logo = new QImage();
|
||
logo->loadFromData(*buffer);
|
||
buffer->clear();
|
||
for (auto button : configResponse->buttons) {
|
||
QUrl url_image(button.img);
|
||
QNetworkRequest *request_image = new QNetworkRequest(url_image);
|
||
reply = manager->get(*request_image);
|
||
QTimer timer;
|
||
timer.setInterval(5000);
|
||
connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
|
||
connect(&timer, &QTimer::timeout, this, &NavBar::cancelDownload);
|
||
eventLoop.exec();
|
||
timer.stop();
|
||
if (!downloadSuccess) {
|
||
break;
|
||
}
|
||
*buffer = reply->readAll();
|
||
|
||
QSvgRenderer *render_image = new QSvgRenderer(*buffer);
|
||
|
||
QImage *image = new QImage(200, 200, QImage::Format_ARGB32);
|
||
QPainter painter_image(image);
|
||
painter_image.setCompositionMode(QPainter::CompositionMode_Clear); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
painter_image.fillRect(rect(), Qt::transparent); // <20><><EFBFBD><EFBFBD><EFBFBD><CDB8>ɫ
|
||
painter_image.setCompositionMode(QPainter::CompositionMode_SourceOver); // <20>ָ<EFBFBD>Ĭ<EFBFBD><C4AC>ֵ
|
||
render_image->render(&painter_image);
|
||
buffer->clear();
|
||
reply->close();
|
||
|
||
QUrl url_image_cover(button.img_cover);
|
||
QNetworkRequest *request_image_cover = new QNetworkRequest(url_image_cover);
|
||
reply = manager->get(*request_image_cover);
|
||
timer.setInterval(5000);
|
||
connect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
|
||
connect(&timer, &QTimer::timeout, this, &NavBar::cancelDownload);
|
||
if (!downloadSuccess) {
|
||
break;
|
||
}
|
||
eventLoop.exec();
|
||
*buffer = reply->readAll();
|
||
qDebug() << *buffer;
|
||
QSvgRenderer *render_image_cover = new QSvgRenderer(*buffer);
|
||
QImage *image_cover = new QImage(200, 200, QImage::Format_ARGB32);
|
||
QPainter painter_image_cover(image_cover);
|
||
painter_image_cover.setCompositionMode(QPainter::CompositionMode_Clear); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||
painter_image_cover.fillRect(rect(), Qt::transparent); // <20><><EFBFBD><EFBFBD><EFBFBD><CDB8>ɫ
|
||
painter_image_cover.setCompositionMode(QPainter::CompositionMode_SourceOver); // <20>ָ<EFBFBD>Ĭ<EFBFBD><C4AC>ֵ
|
||
render_image_cover->render(&painter_image_cover);
|
||
buffer->clear();
|
||
reply->close();
|
||
|
||
ButtonStruct buttonStruct;
|
||
buttonStruct.image = image;
|
||
buttonStruct.image_cover = image_cover;
|
||
buttonStruct.text = button.title;
|
||
buttonStruct.url = button.url;
|
||
buttonStruct.background_color = configResponse->basic.backgroud_color;
|
||
buttonStruct.text_color.setNamedColor(configResponse->basic.title_color);
|
||
buttonStruct.text_cover_color.setNamedColor(configResponse->basic.title_cover_color);
|
||
buttonStructs << buttonStruct;
|
||
delete request_image;
|
||
delete render_image;
|
||
delete request_image_cover;
|
||
delete render_image_cover;
|
||
}
|
||
}
|
||
delete manager;
|
||
manager = nullptr;
|
||
|
||
}
|
||
void NavBar::storeToBuffer() {
|
||
buffer = new QByteArray;
|
||
|
||
}
|
||
void NavBar::cancelDownload() {
|
||
disconnect(reply, &QNetworkReply::finished, &eventLoop, &QEventLoop::quit);
|
||
eventLoop.quit();
|
||
reply->abort();
|
||
downloadSuccess = false;
|
||
}
|
||
|
||
void NavBar::getLogoFromLocal() {
|
||
QString dir = QApplication::applicationDirPath();
|
||
QFile file(dir + DEFAULT_FILE);
|
||
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
|
||
QMessageBox::warning(nullptr, QString::fromLocal8Bit("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), QString::fromLocal8Bit("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>"));
|
||
exit(1);
|
||
}
|
||
buffer->clear();
|
||
*buffer = file.readAll();
|
||
file.close();
|
||
QJsonDocument *qJsonDocument = new QJsonDocument;
|
||
*qJsonDocument = QJsonDocument::fromJson(*buffer);
|
||
QJsonObject *obj_root = new QJsonObject;
|
||
if (qJsonDocument->isObject()) {
|
||
*obj_root = qJsonDocument->object();
|
||
delete qJsonDocument;
|
||
QString logo_path = obj_root->value("basic").toObject().value("logo").toString();
|
||
logo = new QImage(logo_path);
|
||
QString color= obj_root->value("basic").toObject().value("backgroud_color").toString();
|
||
qColor.setNamedColor(color);
|
||
QJsonArray *array = new QJsonArray;
|
||
*array = obj_root->value("menu").toArray();
|
||
for (auto obj : *array) {
|
||
ButtonStruct buttonStruct;
|
||
buttonStruct.text = obj.toObject().value("title").toString();
|
||
buttonStruct.url = QString(BASE_URL)+obj.toObject().value("url").toString();
|
||
buttonStruct.image = new QImage(obj.toObject().value("img").toString());
|
||
buttonStruct.image_cover = new QImage(obj.toObject().value("img_cover").toString());
|
||
buttonStructs << buttonStruct;
|
||
}
|
||
delete array;
|
||
}
|
||
else {
|
||
QMessageBox::warning(nullptr, QString::fromLocal8Bit("<EFBFBD><EFBFBD><EFBFBD><EFBFBD>"), QString::fromLocal8Bit("<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"));
|
||
delete obj_root;
|
||
exit(1);
|
||
}
|
||
delete obj_root;
|
||
|
||
} |