#include "sysmainwindowv2.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "syswin8desktop.h" #include "topquicktoolbarv2.h" #include "topquickbuttonv2.h" /*! * \class SysMainWindowV2 * \brief Windows 8桌面样式的主桌面 * \remark 从TopIKM3中迁移而来 */ enum { SysMainWindow_CloseBtnHeight = 18, SysMainWindow_WndHeight = 600, SysMainWindow_WndWidth = 800, SysMainWindow_LittleWndWidth = 400, SysMainWindow_LittleWndHeight = 500, SysMainWindow_TitleHeight = 65, }; SysMainWindowV2::SysMainWindowV2(const QString &iModuleNameStr, const QVariantMap iUrlPars, QWidget *iParent) : TopClassAbs(iParent), mMainToolBar(NULL) { this->initModule(iModuleNameStr, iUrlPars); setBackgroundRole(QPalette::Background); QStringList rccLst = config("resource.rcc").toStringList(); for (QString rcc : rccLst) { TRES->loadRcc(rcc); } mStackedWidget = new QStackedWidget(this); mStackedWidget->setProperty("SS_BG", "BODY"); mStackedWidget->setMouseTracking(true); setCentralWidget(mStackedWidget); TFramelessWindowBar *winTitleBar = this->windowTitleBar(); winTitleBar->setAutoHideFlags(TFramelessWindowBar::AutoHideHint_SysButton); winTitleBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); winTitleBar->setProperty("SS", "TITLE"); // 窗体图标 QLabel *winTitleLabel = winTitleBar->windowTitleLabel(); winTitleLabel->setProperty("SS", "TITLE_LIGHT"); QWidget *msgparent = new QWidget(this); msgparent->setFixedWidth(TTHEME_DP(200)); mMessageLabel = new QLabel(msgparent); mMessageLabel->setFixedWidth(TTHEME_DP(200)); mMessageLabel->setAlignment(Qt::AlignRight|Qt::AlignVCenter); mMessageLabel->setProperty("SS_FONT", "12"); mMessageAnimation = new QPropertyAnimation(mMessageLabel, "pos", this); // 菜单按钮 mMenuButton = new QToolButton(this); mMenuButton->setObjectName("Title_MenuButton"); mMenuButton->setIcon(TRES->icon("angle-double-down.white")); mMenuButton->setMouseTracking(true); mMenuButton->setArrowType(Qt::NoArrow); mMenuButton->setPopupMode(QToolButton::InstantPopup); mMenuButton->setStyleSheet(QString("QToolButton#Title_MenuButton{border-width:0px;padding:4px;icon-size:24px;background-color:transparent;color:#FFFFFFDF;}" "QToolButton#Title_MenuButton:hover{background-color:#6666668C;}" "QToolButton#Title_MenuButton::menu-indicator{image:None;}")); // 桌面按钮 mDesktopButton = new QToolButton(this); mDesktopButton->setIcon(TRES->icon("home.white")); mDesktopButton->setObjectName("Title_DesdktopButton"); mDesktopButton->setStyleSheet(QString("QToolButton#Title_DesdktopButton{border-width:0px;padding:4px;icon-size:24px;background-color:transparent;color:#FFFFFFDF;}" "QToolButton#Title_DesdktopButton:hover{background-color:#6666668C;}")); mDesktopButton->setToolTip(ttr("Desktop")); mDesktopButton->setMouseTracking(true); // 用户按钮 QString fullName = APP->userFullname(); if (fullName.isEmpty()) { fullName = APP->userName(); } mUserLabel = new QLabel(fullName, this); mUserLabel->setStyleSheet("color:#FFFFFFDF;"); // 工具栏 mMainToolBar = new TopQuickToolBarV2(this); mMainToolBar->setStyleSheet(QString(".TopQuickToolBarV2{border-width:0px; padding:0px; background-color:%1;spacing: 0px}" ".TopQuickToolBarV2 QLabel{color:rgba(255, 255, 255, 1);}").arg(TTHEME->value("COLOR_PRIMARY_7").toString())); // 产品标题 QHBoxLayout *titleLayout = new QHBoxLayout; titleLayout->setSpacing(TTHEME_DP(0)); titleLayout->setMargin(0); titleLayout->addSpacing(TTHEME_DP(20)); titleLayout->addWidget(winTitleLabel, 0); titleLayout->addStretch(1); titleLayout->addWidget(msgparent, 0); titleLayout->addWidget(winTitleBar->windowMinButton(), 0, Qt::AlignTop); titleLayout->addWidget(winTitleBar->windowMaxButton(), 0, Qt::AlignTop); titleLayout->addWidget(winTitleBar->windowNormalButton(), 0, Qt::AlignTop); titleLayout->addWidget(winTitleBar->windowCloseButton(), 0, Qt::AlignTop); // ToolBar 行 QHBoxLayout *toolBarLayout = new QHBoxLayout; toolBarLayout->setMargin(0); toolBarLayout->setSpacing(0); toolBarLayout->addWidget(mMainToolBar, 1); mToolFrame = new QWidget(); mToolFrame->setObjectName("HOME"); mToolFrame->setStyleSheet(QString(".QWidget#HOME{background:transparent;background-color:%1;}").arg(TTHEME->value("COLOR_PRIMARY_7").toString())); QHBoxLayout *rightLayout = new QHBoxLayout(mToolFrame); rightLayout->setMargin(0); rightLayout->setSpacing(TTHEME_DP(10)); rightLayout->addWidget(mDesktopButton); rightLayout->addWidget(mUserLabel); rightLayout->addWidget(mMenuButton); rightLayout->addSpacing(TTHEME_DP(20)); toolBarLayout->addWidget(mToolFrame); // 标题布局 QVBoxLayout *winTitleLayout = new QVBoxLayout(winTitleBar); winTitleLayout->setMargin(0); winTitleLayout->setSpacing(TTHEME_DP(0)); winTitleLayout->addLayout(titleLayout); winTitleLayout->addLayout(toolBarLayout, 1); QString titleStyleSheetStr = this->config("titleStyleSheet").toString(); if (titleStyleSheetStr.toUpper() == "HIDE") { winTitleLabel->hide(); } else if (!titleStyleSheetStr.isEmpty()) { winTitleLabel->setStyleSheet(QString(".QLabel{%1}").arg(titleStyleSheetStr)); } if (!this->config("titleBarStyleSheet").toString().isEmpty()) { winTitleBar->setStyleSheet(QString(".TWindowTitleBar{%1}").arg(this->config("titleBarStyleSheet").toString())); } if (uim()) { if (QMenu *menu = qobject_cast(uim()->getWidget("TITLE_TOOLBAR_POPUP"))) { mMenuButton->setMenu(menu); } } mDesktopClass = new SysWin8Desktop("SysWin8Desktop", QVariantMap(), NULL); if (SysWin8Desktop *dsk = qobject_cast(mDesktopClass)) { mDesktopClass->setMouseTracking(true); mStackedWidget->addWidget(dsk); dsk->show(); connect(dsk, SIGNAL(openedUrl(QString, QVariant)), this, SLOT(openModule(QString, QVariant))); } connect(mStackedWidget, SIGNAL(currentChanged(int)), this, SLOT(onStackedCurrentChanged(int))); connect(mStackedWidget, SIGNAL(widgetRemoved(int)), this, SLOT(onStackedWidgetRemoved(int))); connect(mDesktopButton, SIGNAL(clicked()), this, SLOT(onDesktopButtonClicked())); connect(APP, SIGNAL(currentUserChanged()), this, SLOT(onUserChanged())); connect(mMainToolBar, SIGNAL(toolBarButtonReloaded(Qt::ToolButtonStyle, QSize, QSize)), this, SLOT(changeToolButtonStyle(Qt::ToolButtonStyle, QSize, QSize))); connect(mMainToolBar, SIGNAL(sizeChanged(QSize)), this, SLOT(toolBarSizeChanged(QSize))); mMainToolBar->initToolButtonStyleSize(5); mMessageController = new TopMessageController(this); mMessageController->setParentWidget(this); connect(APP, SIGNAL(notification(QString,QVariant,QString)), this, SLOT(onNotification(QString,QVariant,QString))); setMinimumSize(TTHEME_DP(800), TTHEME_DP(600)); QVariantMap defalutSize = config("default_size").toMap(); if (!defalutSize.isEmpty() && defalutSize["width"].toInt() > 0 && defalutSize["height"].toInt() > 0) { resize(TTHEME_DP(defalutSize["width"].toInt()), TTHEME_DP(defalutSize["height"].toInt())); } else { showMaximized(); } refreshActionState(); openDefaultOpenedModules(); QTimer::singleShot(0, this, SLOT(refreshToolBarFormDb())); } SysMainWindowV2::~SysMainWindowV2() { delete mDesktopClass; } void SysMainWindowV2::openModule(const QString &iUrl, const QVariant &iConfigVar) { TopClassAbs *module = APP->openModule(iUrl); if (module == nullptr) { return; } QVariantMap urlMap = TDataParse::commandStr2Map(iUrl); //以独立窗体显示时 if (urlMap.contains("show") && urlMap.value("show").toString().toUpper() == "WINDOW") { mStackedWidget->removeWidget(module); module->setParent(NULL); module->show(); module->activateWindow(); } //隐藏显示时(一般作为后台运行时需要) else if (urlMap.contains("show") && urlMap.value("show").toString().toUpper() == "HIDE") { mStackedWidget->removeWidget(module); module->setParent(NULL); module->hide(); } else { //先查找已存在的Button是否有关联的模块,如果有则直接设置为当前显示即可; TopQuickButtonV2 *quickBtn = NULL; foreach (TopQuickButtonV2 *btn, mQuickButtonMap.keys()) { if (mQuickButtonMap.value(btn) == module) { quickBtn = btn; mStackedWidget->setCurrentWidget(module); return ; } } //如果不存在关联的Button,则查找固定在工具栏上的按键,看BUTTON关唯一值是否与模块一致; //如果一致则将模块关联到此Button上; if (quickBtn == NULL) { QString moduleKey = module->moduleName().toUpper() + "/" + module->uid(); foreach (TopQuickButtonV2 *btn, mQuickButtonMap.keys()) { if (btn->uid() == moduleKey) { quickBtn = btn; mQuickButtonMap.insert(quickBtn, module); quickBtn->setClosable(true); quickBtn->setModified(module->isDataModified()); quickBtn->setOpened(true); connect(module, SIGNAL(windowModifyChanged(bool)), quickBtn, SLOT(setModified(bool))); mStackedWidget->addWidget(module); mStackedWidget->setCurrentWidget(module); return; } } } //如果按钮不存在,则创建一个按钮,并将其与模块关联; if (quickBtn == NULL) { QVariantMap moduleParameterVarMap; moduleParameterVarMap.insert("urlAddress", module->moduleName().toUpper()); moduleParameterVarMap.insert("type", "shortcut"); QVariantMap configMap = iConfigVar.toMap(); foreach (QString keyStr, QStringList() << "icon" << "title" << "title_en" << "title_zhcn" << "title_zhtw" << "title_ot" << "type" << "urlAddress") { if (!configMap.value(keyStr).toString().trimmed().isEmpty()) { moduleParameterVarMap.insert(keyStr, configMap.value(keyStr)); } } quickBtn = mMainToolBar->addQuickButton(moduleParameterVarMap); quickBtn->setFixed(false); quickBtn->setClosable(true); quickBtn->setOpened(true); quickBtn->setModified(module->isDataModified()); connect(module, SIGNAL(windowModifyChanged(bool)), quickBtn, SLOT(setModified(bool))); connectQuickButton(quickBtn); mQuickButtonMap.insert(quickBtn, module); mStackedWidget->addWidget(module); mStackedWidget->setCurrentWidget(module); // QToolBar没有Action时候,作为第一个加入的ToolButton,需要resize,以避免空间过小导致的显示不全 if (mQuickButtonMap.keys().size() == 1) { excuteResize(); } } } } void SysMainWindowV2::refreshToolBarFormDb() { TSqlSelectorV2 selector; selector.setTable("sys_user_conf"); selector.setField("text_data"); selector.setWhere("user_id", APP->userId()); selector.addWhere("path", QString("%1/%2").arg(APP->currentProduct().toUpper()).arg("Win8DesktopToolBar")); TError err; QString toolBarDataStr = runSqlQueryOnThreadSync(TOPSQLTHREAD_SELECT_VALUE, QVariant::fromValue(selector), &err).toString(); if (err.isValid()) { TLOG_ERROR(QString("Load toolbar config from sys_user_conf failed. ERROR: %1").arg(err.text())); return; } loadToolBarItems(TDataParse::jsonStr2Variant(toolBarDataStr).toList()); } void SysMainWindowV2::openDefaultOpenedModules() { QStringList deaultOpenedModules = config("default_open_modules").toStringList(); foreach (QString defaultModuleStr, deaultOpenedModules) { openModule(defaultModuleStr); } } void SysMainWindowV2::changeToolButtonStyle(Qt::ToolButtonStyle iBtnStyle, QSize iBtnSize, QSize iIconSize) { if (!mMainToolBar) return; // 清除当前toolBarButton foreach (QToolButton *btn, mQuickButtonMap.keys()) { btn->setToolButtonStyle(iBtnStyle); btn->setFixedSize(iBtnSize); btn->setIconSize(iIconSize); } mMainToolBar->resize(QSize(mMainToolBar->sizeHint().width() + TTHEME_DP(20), mMainToolBar->sizeHint().height())); excuteResize(); } void SysMainWindowV2::saveToolBarUserCfg() { QVariantList toolBarDataLst; foreach (TopQuickButtonV2 *toolBtn, mQuickButtonMap.keys()){ if (toolBtn->isFixed()) { toolBarDataLst.push_back(toolBtn->data().toMap()); } } if (toolBarDataLst.isEmpty()) { return; } TSqlInserterV2 inserter; inserter.setTable("sys_user_conf"); inserter.setUniqueField(QStringList() << "user_id" << "path"); QVariantMap data; data.insert("user_id", APP->userId()); data.insert("path", QString("%1/%2").arg(APP->currentProduct().toUpper()).arg("Win8DesktopToolBar")); data.insert("text_data", TDataParse::variant2JsonStr(toolBarDataLst)); inserter.setData(data); runSqlQueryOnThreadSync(TOPSQLTHREAD_REPLACE_ROW, QVariant::fromValue(inserter)); } void SysMainWindowV2::toolBarSizeChanged(QSize iSize) { mToolFrame->setMinimumSize(iSize); mToolFrame->resize(iSize); } void SysMainWindowV2::onNotification(const QString &iKeyStr, const QVariant &iDataVar, const QString &iUuid) { Q_UNUSED(iUuid); if (qobject_cast(sender()) != nullptr) { if (iKeyStr == A_MESSAGECONTROLLER_SHOWOK || iKeyStr == A_MESSAGECONTROLLER_SHOWWARN || iKeyStr == A_MESSAGECONTROLLER_SHOWINFO) { QString msgText = iDataVar.toMap().value("text").toString(); msgText = fontMetrics().elidedText(msgText, Qt::ElideMiddle, mMessageLabel->width()); mMessageLabel->setText(msgText); QString color; if (iKeyStr == A_MESSAGECONTROLLER_SHOWOK) { color = "OK"; } else if (iKeyStr == A_MESSAGECONTROLLER_SHOWWARN) { color = "WARN"; } else if (iKeyStr == A_MESSAGECONTROLLER_SHOWINFO) { color = "INFO"; } mMessageLabel->setProperty("SS_COLOR", color); mMessageLabel->setStyleSheet(".Q{}"); mMessageAnimation->setDuration(2000); mMessageAnimation->setStartValue(QPoint(0, TTHEME_DP(20))); mMessageAnimation->setEndValue(QPoint(0, -mMessageLabel->height())); mMessageAnimation->start(); } else if (iKeyStr == A_MESSAGECONTROLLER_SHOWERROR || iKeyStr == A_MESSAGECONTROLLER_LOADING || iKeyStr == A_MESSAGECONTROLLER_UNLOADING) { if (mMessageController != nullptr) { mMessageController->onNotifaction(iKeyStr, iDataVar); } } else if (iKeyStr == A_CORE_PUSH_MODULE_TO_DESKTOP) { // @todo } else if (iKeyStr == A_CORE_OPEN_MODULE_TO_DESKTOP) { // @todo } } } void SysMainWindowV2::onQuickButtonClicked() { //点击按钮时, 如果按钮有关联的模块,则激活模块;否则打开模块 if (TopQuickButtonV2 *btn = qobject_cast(sender())) { if (btn->type() == TopQuickButtonV2::Type_Shortcut) { QWidget *wgt = mQuickButtonMap.value(btn); if (wgt != NULL) { mStackedWidget->setCurrentWidget(wgt); } else { QVariantMap data = btn->data().toMap(); openModule(data.value("urlAddress").toString(), data); } } } } void SysMainWindowV2::onQuickButtonCloseTrigged() { if (TopQuickButtonV2 *btn = qobject_cast(sender())) { TopClassAbs *obj = qobject_cast(mQuickButtonMap.value(btn)); if (obj != NULL) { obj->close(); } } } void SysMainWindowV2::onQuickButtonFixTrigged(bool iFixedBol) { if (TopQuickButtonV2 *btn = qobject_cast(sender())) { if (iFixedBol == false && mQuickButtonMap.value(btn) == NULL) { mQuickButtonMap.remove(btn); btn->deleteLater(); } } } void SysMainWindowV2::onStackedWidgetRemoved(int /*iIndex*/) { //当有模块关闭时触发此函数 QSet stackedWidgets; for (int i = 0; i < mStackedWidget->count(); ++i) { stackedWidgets.insert(mStackedWidget->widget(i)); } //查看每个按扭所绑定的模块在stackedWidget中是否还存在; //如果不存在, 将其按纽所对应的模块设置为NULL,如果按钮没有设置 //为固定在工具栏上,则将其移除; foreach (TopQuickButtonV2 *btn, mQuickButtonMap.keys()) { QWidget *wgt = mQuickButtonMap.value(btn); if (!stackedWidgets.contains(wgt)) { if (btn->isFixed()) { mQuickButtonMap.insert(btn, NULL); btn->setOpened(false); } else { mQuickButtonMap.remove(btn); delete btn; } } } } void SysMainWindowV2::onStackedCurrentChanged(int iIndex) { //当当前模块更换时,将对应的按纽设置为Actived,以至达按饭风格更改的效果 QWidget *wgt = mStackedWidget->widget(iIndex); foreach (TopQuickButtonV2 *btn, mQuickButtonMap.keys()) { if (mQuickButtonMap.value(btn) == wgt) { btn->setActived(true); } else { btn->setActived(false); } } } void SysMainWindowV2::onDesktopButtonClicked() { mStackedWidget->setCurrentWidget(mDesktopClass); } void SysMainWindowV2::onUserChanged() { mUserLabel->setText(APP->userFullname()); } void SysMainWindowV2::excuteResize() { if (this->isMaximized()) { this->resize(this->size() + QSize(-1,-1)); this->resize(this->size() + QSize(1, 1)); showMaximized(); } else { this->resize(this->size() + QSize(-1,-1)); this->resize(this->size() + QSize(1, 1)); } } void SysMainWindowV2::openUrlByAction() { QAction *action = qobject_cast(this->sender()); if (action) { QString urlStr = action->data().toMap().value("urlAddress").toString(); if (!urlStr.isEmpty()) { openModule(urlStr, action->data()); } } } void SysMainWindowV2::closeEvent(QCloseEvent *iEvent) { if (TMessageBox::msgbox(this, ttr("Are you sure to quit?"), "", "Question", ttr("Ask"), QStringList() << ttr("Quit") + ":Yes:Accept:Warn" << ttr("Cancel") + ":Cancel:Reject:Normal", "Cancel") == "Yes") { saveToolBarUserCfg(); iEvent->accept(); } else { iEvent->ignore(); } } void SysMainWindowV2::connectQuickButton(TopQuickButtonV2 *iButton) { connect(iButton, SIGNAL(clicked()), this, SLOT(onQuickButtonClicked())); connect(iButton, SIGNAL(closeTrigged()), this, SLOT(onQuickButtonCloseTrigged())); connect(iButton, SIGNAL(fixTrigged(bool)), this, SLOT(onQuickButtonFixTrigged(bool))); } void SysMainWindowV2::loadToolBarItems(const QVariantList &iDataVarLst) { if (!mMainToolBar) return; QList openedWgt = openedModule(); mQuickButtonMap.clear(); //清除当前ToolBar的ToolButton mMainToolBar->clearAllButtons(); // 加载数据 mToolBarDataVarLst = iDataVarLst; foreach (QVariant var, iDataVarLst) { TopQuickButtonV2 *btn = mMainToolBar->addQuickButton(var.toMap()); if (btn != nullptr) { QString moduleKey; bool hasOpened = false; foreach (TopClassAbs *module, openedWgt) { moduleKey = module->moduleName().toUpper() + "/" + module->uid(); if (btn->uid() == moduleKey) { btn->setClosable(true); btn->setModified(module->isDataModified()); btn->setOpened(true); btn->setFixed(true); connect(module, SIGNAL(windowModifyChanged(bool)), btn, SLOT(setModified(bool))); mQuickButtonMap.insert(btn, module); openedWgt.removeAll(module); hasOpened = true; break; } } if (!hasOpened) mQuickButtonMap.insert(btn, NULL); connectQuickButton(btn); } } // 不存在的ToolButton创建,fixed:false,opened:true, foreach (TopClassAbs *module, openedWgt) { QVariantMap cfgVarMap = getDataFromModule(module); TopQuickButtonV2 *btn = mMainToolBar->addQuickButton(cfgVarMap); if (btn != nullptr) { btn->setFixed(false); // 不固定 btn->setClosable(true); btn->setModified(module->isDataModified()); btn->setOpened(true); connect(module, SIGNAL(windowModifyChanged(bool)), btn, SLOT(setModified(bool))); mQuickButtonMap.insert(btn, module); connectQuickButton(btn); } } // 设置Actived if (mQuickButtonMap.values().contains(mStackedWidget->currentWidget())) { mQuickButtonMap.key(mStackedWidget->currentWidget())->setActived(true); } // 适应toolBar的大小 mMainToolBar->setToolButtonStyleSize(mMainToolBar->toolBarBtnIconStyle()); } void SysMainWindowV2::openModuleUpgrade() { if (!APP->hasRight("sys-module-upgrade-edit")) { TMessageBox::warning(this, ttr("No permission to open module upgrade exe!")); return; } #ifdef Q_OS_WIN const QString exeFileStr = APP->appBinPath() + "/TopModuleUpgrade.exe"; const QString exeFileStrNew = APP->appBinPath() + "/PackageUploaderPlus.exe"; #else const QString exeFileStr = APP->appBinPath() + "/TopModuleUpgrade"; const QString exeFileStrNew = APP->appBinPath() + "/PackageUploaderPlus"; #endif QFileInfo finfo(exeFileStrNew); if (finfo.exists()) { QProcess::startDetached(exeFileStrNew, QStringList()<<"-l"<language(), APP->appBinPath()); } else { QDesktopServices::openUrl(QUrl::fromLocalFile(exeFileStr)); } } void SysMainWindowV2::showAboutDialog() { TopAboutUsDialog dialog; const QString lang = APP->language(); QVariantMap aboutCfg = config("about_us").toMap(); QString title = aboutCfg.value("title_"+lang).toString(); if (title.isEmpty()) title = aboutCfg.value("title").toString(); if (title.isEmpty()) { title = this->windowTitle(); if (!config("product_version").toString().isEmpty()) { title += config("product_version").toString(); } } dialog.setWindowTitle(title); QString copyright = aboutCfg.value("copyright_" + lang).toString(); if (copyright.isEmpty()) { copyright = aboutCfg.value("copyright").toString(); } QString lawdesc = aboutCfg.value("lawdesc_" + lang).toString(); if (lawdesc.isEmpty()) { lawdesc = aboutCfg.value("lawdesc").toString(); } dialog.exec(); } void SysMainWindowV2::showPasswordModificationDialog(bool iPwdStrengthCheck) { TopLoginPwdRestDialog dialog; dialog.setStrengthCheck(iPwdStrengthCheck); dialog.exec(); } QVariantList SysMainWindowV2::addFlagForDbData(const QVariantList &iSysModuleDataVarLst, const QString &iDbCfgStr) { QVariantList dataVarLst; QVariantMap dataVarMap; foreach (QVariant dataVar, iSysModuleDataVarLst) { dataVarMap = dataVar.toMap(); dataVarMap.insert("fromDb", iDbCfgStr); dataVarLst.push_back(dataVarMap); } return dataVarLst; } QSize SysMainWindowV2::sizeStr2QSize(const QString &iSizeStr) { QString rowStr; QString colStr; QString sizeStr = iSizeStr.toUpper(); if (sizeStr.contains('X')) { QStringList sizeStrLst = sizeStr.split('X'); rowStr = sizeStrLst.at(1); colStr = sizeStrLst.at(0); } if (rowStr.isEmpty()) rowStr = "0"; if (colStr.isEmpty()) colStr = "0"; QSize size(colStr.toInt(), rowStr.toInt()); return size; } QList SysMainWindowV2::openedModule() { QList openedWgts; foreach (QWidget *wgt, mQuickButtonMap.values()) { if (TopClassAbs *tWgt = qobject_cast(wgt)) { openedWgts.push_back(tWgt); } } return openedWgts; } QVariantMap SysMainWindowV2::getDataFromModule(TopClassAbs *module) { QVariantMap dataVarMap; if (module != nullptr) { dataVarMap = getDataFromDb(module->moduleName()); if (dataVarMap.isEmpty()) { QStringList keys; keys << "urlAddress" << "icon" << "name"; foreach (QString def, APP->languageList()) { keys << QString("title_%1").arg(def); } foreach (QString key, keys) { dataVarMap.insert(key, ""); } dataVarMap.insert(QString("title_") + APP->language(), module->title()); dataVarMap.insert("title", module->title()); dataVarMap.insert("icon", module->iconName()); dataVarMap.insert("name", module->moduleName()); } dataVarMap.insert("urlAddress", dataVarMap.value("name")); dataVarMap.insert("type", "shortcut"); dataVarMap.remove("name"); } return dataVarMap; } QVariantMap SysMainWindowV2::getDataFromDb(const QString &iModuleNameStr) { QVariantMap moduleCfg; QString vertypeStr = APP->currentProduct(); if (vertypeStr.isEmpty()) vertypeStr = "Default"; TSqlSelectorV2 sqlSelector; sqlSelector.setTable("sys_module"); sqlSelector.fieldRef() << "name" << "title" << "title_en" << "title_zhcn" << "title_zhtw" << "title_jp" << "title_ot" << "rmk" << "rmk_en" << "rmk_zhcn" << "rmk_zhtw" << "rmk_jp" << "rmk_ot" << "icon"; sqlSelector.setWhere("ver_type", APP->currentProduct()); sqlSelector.setWhere("name", iModuleNameStr); TSqlQueryV2 sqlQuery(T_SQLCNT_POOL->getSqlDatabase()); TDataResponse dataRes; try { moduleCfg = sqlQuery.selectMap(sqlSelector); if (sqlQuery.lastError().isValid()) throw sqlQuery.lastError(); return moduleCfg; } catch (const TError &err){ dataRes.setError(err); } catch(...){ dataRes.setErrText(ttr("Unknow Error!")); } TMessageBox::error(this, ttr("Get module list failed!"), dataRes.errText()); return QVariantMap(); }