OfficeAssistant_Win10/OfficeAssistant_msvc/navbar.cpp

201 lines
6.0 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

//
// 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 "MyButton.h"
#include "sqlitehelper.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(MainScreen *mainScreen,QWidget *parent) :
QWidget(parent), ui(new Ui::NavBar) {
ui->setupUi(this);
this->parent = parent;
//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)
{
qColor.setNamedColor(background_color);
}else
{
qColor.setNamedColor(background_color);
}
layout2 = new QHBoxLayout;
layout_right = new QHBoxLayout;
layout_left = new QHBoxLayout;
getLogoFromInternet(&config_response);
logo_label = new QLabel(this);
logo_label->setAttribute(Qt::WA_TranslucentBackground);
//*logo = logo->scaled(this->width() / (5 / scale), this->height());
logo_label->setScaledContents(true);
QPixmap pixmap(QApplication::applicationDirPath() + DEFAULT_LOGO);
pixmap.setMask(pixmap.createMaskFromColor(QColor(Qt::transparent)));
logo_label->setAutoFillBackground(true);
QPalette palette = logo_label->palette();
palette.setColor(QPalette::Window, Qt::transparent);
logo_label->setPalette(palette);
logo_label->setPixmap(pixmap);
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 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) {
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;
if (downloadSuccess == true&& reply->error() == QNetworkReply::NoError) {
*buffer = reply->readAll();
QFile logo(QApplication::applicationDirPath() + DEFAULT_LOGO);
if (logo.open(QIODevice::WriteOnly)) {
logo.write(*buffer);
logo.close();
}
buffer->clear();
reply->close();
}
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::refresh(int state)
{
SQLiteHelper sqlite_helper;
buttonStructs.clear();
sqlite_helper.get_software(&buttonStructs, background_color,text_color,text_cover_color);
for(auto button:buttons)
{
layout_right->removeWidget(button);
delete button;
buttons.removeOne(button);
}
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;
}
emit application_manager->refresh();//在这里refresh避免因为refresh导致信号和槽断开
}