#include "mainwin.h"

#include <QApplication>
#include <QLocale>
#include <QTranslator>
#include <QIcon>
#include <QMessageBox>
#include <QStyleFactory>

#ifdef _MSC_VER //MSVC编译器
#define _WINSOCKAPI_
#include <windows.h>
#include <DbgHelp.h>
    #if _MSC_VER >= 1600
    #pragma execution_character_set("utf-8")
    #endif
LONG WINAPI handleException(_EXCEPTION_POINTERS *excep) {
    QString errCode = QString::number(excep->ExceptionRecord->ExceptionCode, 16);
    QString errAddr = QString::number((uint)excep->ExceptionRecord->ExceptionAddress, 16);
    HANDLE hDumpFile = CreateFile(L"c:/ledset-crash.dmp", GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if(hDumpFile == INVALID_HANDLE_VALUE) return EXCEPTION_CONTINUE_SEARCH;  //未处理异常, 让 windows 弹出错误框并结束 (Qt会卡死一段时间)
    MINIDUMP_EXCEPTION_INFORMATION dumpInfo{GetCurrentThreadId(), excep, TRUE};
    MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), hDumpFile, MiniDumpNormal, &dumpInfo, NULL, NULL);//写入Dump文件内容
    CloseHandle(hDumpFile);
    QMessageBox::critical(nullptr, "程序出错", "<b>程序出错!</b> (code: "+errCode+". addr: "+errAddr+")<br/>请将C盘下的 ledok-crash.dmp 文件发送到 gangphon@qq.com 邮箱, 研发人员会尽快处理.");
    return EXCEPTION_EXECUTE_HANDLER;  //已处理异常, 让 windows 正常结束
//  EXCEPTION_CONTINUE_EXECUTION 已修复错误, 让 windows 从异常发生处继续执行
}
#endif
void test();
int main(int argc, char *argv[]) {
    QApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication::setAttribute(Qt::AA_UseHighDpiPixmaps);
    QApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough);
    QApplication a(argc, argv);
    a.setStyle(QStyleFactory::create("Fusion"));
    a.setWindowIcon(QIcon(":/128.ico"));
    a.setStyleSheet(R"rrr(
QLineEdit {border: 1px solid #777; border-radius: 2px; padding: 2px;}
QAbstractScrollArea {border: 1px solid #777;}
QTableView {gridline-color:#777;}

QMessageBox {background: #333;}

QGroupBox {border: 1px solid #777; border-radius: 3px; margin-top: 0.5em; padding-top: 0.4em;}
QGroupBox::title {color: #fff; subcontrol-origin: margin; left: 0.5em;}

QRadioButton::indicator {border-image: url(:/imgs/radio-un.png); width: 1em; height: 1em;}
QRadioButton::indicator:checked {border-image: url(:/imgs/radio-check.png);}
QCheckBox::indicator {border-image: url(:/imgs/checkbox-un.png); width: 1em; height: 1em;}
QCheckBox::indicator:checked {border-image: url(:/imgs/checkbox-check.png);}

QPushButton[ss="min"]{padding: 0; width: 30px; height: 25px; }
QPushButton[ss="close"]{padding: 0; width: 30px; height: 25px; }

QPushButton[ss="blue"] {background: #069;}
)rrr");
/*
*/
    QFont font;
    font.setFamilies(QStringList{"Arial","Microsoft YaHei UI"});
    font.setPixelSize(14);
    a.setFont(font);
    QPalette plt = a.palette();
    plt.setBrush(QPalette::Window, QColor(0x333333));
    plt.setBrush(QPalette::WindowText, QColor(0xffffff));
    plt.setBrush(QPalette::Base, QColor(0x222222));
    plt.setBrush(QPalette::AlternateBase, QColor(0x333333));
    plt.setBrush(QPalette::Text, QColor(0xffffff));
    plt.setBrush(QPalette::PlaceholderText, QColor(0xaaaaaa));
    plt.setBrush(QPalette::Button, QColor(0x555555));
    plt.setBrush(QPalette::ButtonText, QColor(0xffffff));
    plt.setBrush(QPalette::ToolTipBase, QColor(0x444466));
    plt.setBrush(QPalette::ToolTipText, QColor(0xeeeeee));
    plt.setBrush(QPalette::Light, QColor(0x444444));
    plt.setBrush(QPalette::Midlight, QColor(0x666666));
    plt.setBrush(QPalette::Mid, QColor(0x888888));
    plt.setBrush(QPalette::Dark, QColor(0xaaaaaa));
    plt.setBrush(QPalette::BrightText, QColor(0,0,0));
    plt.setBrush(QPalette::Shadow, QColor(0xaaaaaa));
    a.setPalette(plt);

    QTranslator translator;
    if(translator.load(QLocale::system(), "app", "_", ":/i18n")) a.installTranslator(&translator);
    QTranslator qtTrans;
    if(qtTrans.load(QLocale::system(), "qt", "_", ":/i18n")) a.installTranslator(&qtTrans);

    MainWin w;
    w.show();

#ifdef _MSC_VER
    SetUnhandledExceptionFilter(handleException);
#endif
    //test();
    return a.exec();
}

void test() {

}
