OfficeAssistant_Win10/OfficeAssistant_msvc/navbar.cpp

201 lines
5.9 KiB
C++
Raw Normal View History

2023-08-03 16:16:02 +08:00
//
// 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"
#include "sqlitehelper.h"
2023-08-03 16:16:02 +08:00
#ifdef _DEBUG
#pragma comment(lib, "Qt5Svgd.lib")
#pragma comment(lib, "Qt5Sqld.lib")
2023-08-03 16:16:02 +08:00
#else
#pragma comment(lib, "Qt5Svg.lib")
#pragma comment(lib, "Qt5Sql.lib")
2023-08-03 16:16:02 +08:00
#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);
ConfigResponse config_response;
ConfigRequest config_request;
config_request.sendRequest(&config_response);
SQLiteHelper sqlite_helper;
sqlite_helper.get_software(&buttonStructs, &config_response);
if(config_response.succeed==true)
{
getLogoFromInternet(&config_response);
}else
{
2023-08-03 16:16:02 +08:00
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();
}else
{
getLogoFromLocal();
2023-08-03 16:16:02 +08:00
}
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;
}
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;
2023-07-30 01:06:42 +08:00
}