#include "topdesktopitemabs.h" #include "topwin8desktopitem.h" #include <QVariant> #include <QMouseEvent> #include <QLabel> #include <QGridLayout> #include <QDrag> #include <tbaseutil/tresource.h> #include <tbaseutil/ttheme.h> #include <tbaseutil/tfileio.h> #include <tbaseutil/tdataparse.h> #include <tbaseutil/tdataresponse.h> #include <twidget/tuiloaderdialog.h> #include <twidget/ttableviewdialog.h> #include <twidget/tmessagebox.h> #include <twidget/tcombobox.h> #include <tdatabaseutil/tsqlconnectionpoolv2.h> #include <tdatabaseutil/tsqlqueryv2.h> #include <tdatabaseutil/tsqlselectorv2.h> #include <topcore/topcore.h> /***************Private*******************/ class TopDesktopItemAbsPrivate { Q_DECLARE_PUBLIC(TopDesktopItemAbs) public: TopDesktopItemAbsPrivate(TopDesktopItemAbs *qptr); QVariantMap configData; QString fixedStyleSheet; TopDesktopItemAbs::State state; TopDesktopItemAbs::ClickType clickType; bool pressed; bool hasOpenRight; bool startDragBol; int marginInt; QPoint pressPositon; QMenu *popupMenu; QActionGroup *mLayoutActionsGroup; protected: TopDesktopItemAbs * const q_ptr; }; TopDesktopItemAbsPrivate::TopDesktopItemAbsPrivate(TopDesktopItemAbs *qptr) : fixedStyleSheet(""), state(TopDesktopItemAbs::State_None), pressed(false), hasOpenRight(false), startDragBol(false), marginInt(0), popupMenu(NULL), q_ptr(qptr) { } /*****************************************/ /*! * \class TopDesktopItemAbstractClass * \brief 桌面图标基类 */ TopDesktopItemAbs::TopDesktopItemAbs(QWidget *parent) : QFrame(parent), d_ptr(new TopDesktopItemAbsPrivate(this)) { this->setProperty("SS",QVariant("DESKTOPITEM")); this->setStyleSheet(QString("QFrame[SS=\"DESKTOPITEM\"]{border-style:solid;border-width:1px;}")); } TopDesktopItemAbs::~TopDesktopItemAbs() { } void TopDesktopItemAbs::enterEvent(QEvent *iEvent) { Q_D(TopDesktopItemAbs); this->setStyleSheet(QString( "QFrame[SS=\"DESKTOPITEM\"]" "{border-style:solid;border-width:%1px;border-color:rgba(255,255,255,0.5);%2;}") .arg(1).arg(d->fixedStyleSheet)); QFrame::enterEvent(iEvent); } void TopDesktopItemAbs::leaveEvent(QEvent *iEvent) { Q_D(TopDesktopItemAbs); this->setStyleSheet(QString("QFrame[SS=\"DESKTOPITEM\"]" \ "{border-style:solid;border-width:%1px;border-color:transparent;%2;}") .arg(1).arg(d->fixedStyleSheet)); QFrame::leaveEvent(iEvent); } void TopDesktopItemAbs::mousePressEvent(QMouseEvent *iEvent) { Q_D(TopDesktopItemAbs); if (iEvent->button() == Qt::LeftButton) { if (state() == TopDesktopItemAbs::State_Editing) { d->startDragBol = true; d->pressPositon = iEvent->pos(); } else { d->startDragBol = false; d->pressed = true; } } } void TopDesktopItemAbs::mouseMoveEvent(QMouseEvent *iEvent) { Q_D(TopDesktopItemAbs); if (d->startDragBol && ((qAbs(iEvent->pos().x() - d->pressPositon.x()) >= 5) || qAbs(iEvent->pos().y() - d->pressPositon.y()) >= 5)) { QByteArray itemData; QDataStream dataStream(&itemData, QIODevice::WriteOnly); dataStream << QPoint(iEvent->pos()) << this->size() << this->hasOpenRight() << TDataParse::variant2JsonStr(this->configData()); QMimeData *mimeData = new QMimeData; mimeData->setData("application/desktop-itemdata", itemData); QPixmap pixmap(this->size()); this->render(&pixmap); QDrag *drag = new QDrag(this); drag->setMimeData(mimeData); drag->setPixmap(pixmap); QPoint point(iEvent->pos()); drag->setHotSpot(point); this->setAttribute(Qt::WA_DeleteOnClose); emit itemTryDeleted(this); this->setVisible(false); Qt::DropAction dropAction = drag->exec(Qt::MoveAction | Qt::CopyAction, Qt::CopyAction); if (dropAction == Qt::MoveAction) { emit itemDeleted(this); } else { this->setVisible(true); } } } void TopDesktopItemAbs::mouseReleaseEvent(QMouseEvent *iEvent) { Q_D(TopDesktopItemAbs); if (iEvent->button() == Qt::RightButton && d->state == TopDesktopItemAbs::State_Editing) { if (d->popupMenu == NULL) { d->popupMenu = createContextMenu(); } foreach (QAction *act, d->mLayoutActionsGroup->actions()) { if (act->data().toString().toUpper() == this->layoutStyle()) { act->setChecked(true); break; } } d->popupMenu->popup(QCursor::pos()); } else { if (iEvent->button() == Qt::LeftButton && d->pressed && this->rect().contains(iEvent->pos()) && clickType() == ClickType_Click) { emit clicked(urlAddress(), configData()); } } d->startDragBol = false; d->pressed = false; } void TopDesktopItemAbs::dragEnterEvent(QDragEnterEvent *event) { event->ignore(); } void TopDesktopItemAbs::dragLeaveEvent(QDragLeaveEvent *event) { event->ignore(); } void TopDesktopItemAbs::mouseDoubleClickEvent(QMouseEvent *iEvent) { if (iEvent->button() == Qt::LeftButton){ if (state() == TopDesktopItemAbs::State_Editing) { showConfigDialog(); } else if (clickType() == ClickType_DoubleClick) { emit doubleClicked(urlAddress(), configData()); } } QFrame::mouseDoubleClickEvent(iEvent); } QMenu *TopDesktopItemAbs::createContextMenu() { Q_D(TopDesktopItemAbs); if (!d->popupMenu) { QAction *smallAct = new QAction(tr("1X1"), this); smallAct->setData(QString("1x1")); smallAct->setCheckable(true); QAction *Act2x1 = new QAction(tr("2X1"), this); Act2x1->setData(QString("2x1")); Act2x1->setCheckable(true); QAction *midiumAct = new QAction(tr("2X2"), this); midiumAct->setData(QString("2x2")); midiumAct->setCheckable(true); QAction *wideAct = new QAction(tr("2X4"), this); wideAct->setData(QString("2x4")); wideAct->setCheckable(true); QAction *Act4X1 = new QAction(tr("4X1"), this); Act4X1->setData(QString("4x1")); Act4X1->setCheckable(true); QAction *highAct = new QAction(tr("4X2"), this); highAct->setData(QString("4x2")); highAct->setCheckable(true); QAction *bigAct = new QAction(tr("4x4"), this); bigAct->setData(QString("4x4")); bigAct->setCheckable(true); d->mLayoutActionsGroup = new QActionGroup(this); d->mLayoutActionsGroup->addAction(smallAct); d->mLayoutActionsGroup->addAction(Act2x1); d->mLayoutActionsGroup->addAction(midiumAct); d->mLayoutActionsGroup->addAction(wideAct); d->mLayoutActionsGroup->addAction(Act4X1); d->mLayoutActionsGroup->addAction(highAct); d->mLayoutActionsGroup->addAction(bigAct); connect(d->mLayoutActionsGroup, SIGNAL(triggered(QAction*)), this, SLOT(setItemLayoutStyle(QAction*))); QMenu *adjustMenu = new QMenu(tr("Adjust size"), this); adjustMenu->addActions(d->mLayoutActionsGroup->actions()); d->popupMenu = new QMenu(this); d->popupMenu->addAction(TRES->icon(""), tr("Setting Module"), this, SLOT(showConfigDialog())); d->popupMenu->addAction(TRES->icon(""), tr("Delete Module"), this, SLOT(deleteItem())); d->popupMenu->addMenu(adjustMenu); } return d->popupMenu; } QVariantMap TopDesktopItemAbs::configData() const { Q_D(const TopDesktopItemAbs); return d->configData; } void TopDesktopItemAbs::setConfigData(const QVariantMap &iCfgDataVar) { Q_D(TopDesktopItemAbs); d->configData = iCfgDataVar; emit configChanged(); } QString TopDesktopItemAbs::urlAddress() const { return config("urlAddress").toString(); } void TopDesktopItemAbs::setUrlAddress(const QString &iAdrStr) { setConfig("urlAddress", iAdrStr); } TopDesktopItemAbs::State TopDesktopItemAbs::state() const { Q_D(const TopDesktopItemAbs); return d->state; } void TopDesktopItemAbs::setState(TopDesktopItemAbs::State iState) { Q_D(TopDesktopItemAbs); d->state = iState; } TopDesktopItemAbs::ClickType TopDesktopItemAbs::clickType() const { Q_D(const TopDesktopItemAbs); return d->clickType; } void TopDesktopItemAbs::setClickType(TopDesktopItemAbs::ClickType iClickType) { Q_D(TopDesktopItemAbs); d->clickType = iClickType; } QVariant TopDesktopItemAbs::config(const QString &iKeyVar) const { Q_D(const TopDesktopItemAbs); return d->configData.value(iKeyVar); } void TopDesktopItemAbs::setConfig(const QString &iKeyVar, const QVariant &iValueVar) { Q_D(TopDesktopItemAbs); d->configData.insert(iKeyVar, iValueVar); emit configChanged(); } int TopDesktopItemAbs::rowSpan() const { QString vStyleStr = layoutStyle().toUpper(); QStringList vStyleStrLst = vStyleStr.split('X'); int rowInt = vStyleStrLst.value(1).toInt(); if (rowInt < 1) rowInt = 2; return rowInt; } int TopDesktopItemAbs::colSpan() const { QString vStyleStr = layoutStyle().toUpper(); QStringList vStyleStrLst = vStyleStr.split('X'); int colInt = vStyleStrLst.value(0).toInt(); if (colInt < 1) colInt = 2; return colInt; } bool TopDesktopItemAbs::hasOpenRight() const { Q_D(const TopDesktopItemAbs); return d->hasOpenRight; } void TopDesktopItemAbs::setHasOpenRight(bool iHasOpenRightBol) { Q_D(TopDesktopItemAbs); d->hasOpenRight = iHasOpenRightBol; } QString TopDesktopItemAbs::layoutStyle() const { return config("layoutStyle").toString().toUpper(); } void TopDesktopItemAbs::setLayoutStyle(const QString &iLayoutStyleStr) { setConfig("layoutStyle", iLayoutStyleStr); } QString TopDesktopItemAbs::fixedStyleSheet() const { Q_D(const TopDesktopItemAbs); return d->fixedStyleSheet; } void TopDesktopItemAbs::setFixedStyleSheet(const QString &iStyleSheetStr) { Q_D(TopDesktopItemAbs); d->fixedStyleSheet = iStyleSheetStr; } void TopDesktopItemAbs::setStartRow(int iStartRowInt) { setConfig("startRow", iStartRowInt); } int TopDesktopItemAbs::startRow() const { return config("startRow").toInt(); } void TopDesktopItemAbs::setStartCol(int iStartColInt) { setConfig("startCol", iStartColInt); } int TopDesktopItemAbs::startCol() const { return config("startCol").toInt(); } void TopDesktopItemAbs::setMargin(int iMarginInt) { Q_D(TopDesktopItemAbs); d->marginInt = iMarginInt; } int TopDesktopItemAbs::margin() const { Q_D(const TopDesktopItemAbs); return d->marginInt; } bool TopDesktopItemAbs::showConfigDialog() { return false; } void TopDesktopItemAbs::deleteItem() { emit itemDeleted(this); } void TopDesktopItemAbs::setItemLayoutStyle(QAction *iAction) { Q_D(TopDesktopItemAbs); if (!d->mLayoutActionsGroup->actions().contains(iAction)) return; QString layoutDataStr = iAction->data().toString(); setLayoutStyle(layoutDataStr); doLayout(); emit layoutDone(); } void TopDesktopItemAbs::setColorList(TComboBox *iBackgroundCombox) { QString colorsStr = "[" "\"transparent\"," "\"rgba(0, 0, 0, 0.9)\"," "\"rgba(255, 255, 255, 0.9)\"," "\"rgba(42, 105, 238, 0.9)\"," "\"rgba(239, 59, 5, 0.9)\"," "\"rgba(255, 153, 0, 0.9)\"," "\"rgba(27, 117, 27, 0.9)\"," "\"rgba(110, 9, 189, 0.9)\"," "\"rgba(0, 204, 204, 0.9)\"," "\"rgba(51, 153, 51, 0.9)\"," "\"rgba(250, 123, 56, 0.9)\"," "\"rgba(86, 97, 153, 0.9)\"," "\"rgba(173, 86, 94, 0.9)\"," "\"rgba(128,128,255,0.9)\"," "\"rgba(164,99,255,0.9)\"," "\"rgba(0,128,128,0.9)\"," "\"rgba(204,51,51,0.9)\"," "\"rgba(255, 191, 24, 0.9)\"," "\"rgba(39, 183, 255, 0.9)\"," "\"rgba(255, 118, 100, 0.9)\"," "\"rgba(249, 176, 13, 0.9)\"," "\"rgba(46,207,199,0.9)\"," "\"rgba(104,193,27,0.9)\"," "\"rgba(155,123,255,0.9)\"," "\"rgba(170, 80, 75, 0.9)\"," "\"rgba(0, 95, 178, 0.9)\"," "\"rgba(30, 117, 48, 0.9)\"" "]"; QVariantList btnBkgColorVarLst = TDataParse::jsonStr2Variant(colorsStr).toList(); //1. 下拉框添加颜色字符 QVariantList colorVarLst; foreach(QVariant itemVar, btnBkgColorVarLst) { QString colorStr = itemVar.toString(); QVariantMap comboVarMap; comboVarMap.insert("name", colorStr); comboVarMap.insert("text", colorStr); colorVarLst << comboVarMap; } iBackgroundCombox->setItemList(colorVarLst); //2. 设置颜色图标 for(int n = 0; n < colorVarLst.count(); n++) { QVariantMap itemVarMap = colorVarLst.at(n).toMap(); QString colorStr = itemVarMap.value("text").toString(); int rInt = 0, gInt = 0, bInt = 0; QRegExp rx("(\\d+)\\s*\\,\\s*(\\d+)\\s*\\,\\s*(\\d+)"); if (rx.indexIn(colorStr) != -1) { rInt = rx.cap(1).toInt(); gInt = rx.cap(2).toInt(); bInt = rx.cap(3).toInt(); } //创建pixmap const int widthInt = 80; const int heightInt = 20; QPixmap pixColor(widthInt, heightInt); pixColor.fill(QColor(rInt, gInt, bInt, 210)); iBackgroundCombox->setItemIcon(n, QIcon(pixColor)); iBackgroundCombox->setIconSize(QSize(widthInt, heightInt)); } } void TopDesktopItemAbs::doLayout() { QVariantMap vConfigData = configData(); QString title = vConfigData.value("title_" + APP->language()).toString(); if (title.isEmpty()) title = vConfigData.value("title").toString(); QString remark = vConfigData.value("remark_" + APP->language()).toString(); if (remark.isEmpty()) remark = vConfigData.value("remark").toString(); QString background = vConfigData.value("background").toString(); setFixedStyleSheet(QString("background:%1;margin:%2px;").arg(background).arg(margin())); setToolTip(remark.isEmpty() ? title : remark); QStringList layoutStyleList = layoutStyle().toUpper().split("X"); if (layoutStyleList.count() == 2) { setLayoutStyle(QString("%1X%2").arg(layoutStyleList[0].toInt()).arg(layoutStyleList[1].toInt())); } else { setLayoutStyle(QString("%1X%2").arg(2).arg(2)); } } void TopDesktopItemAbs::doTimeout() { } /***************Private*******************/ class TopWin8DesktopItemPrivate { Q_DECLARE_PUBLIC(TopWin8DesktopItem) public: TopWin8DesktopItemPrivate(TopWin8DesktopItem *qptr) : titleLabel(NULL), iconLabel(NULL), gridLayout(NULL), q_ptr(qptr){} QLabel *titleLabel; QLabel *iconLabel; QGridLayout *gridLayout; static QMap<QString, QString> i18NMap; protected: TopWin8DesktopItem * const q_ptr; }; QMap<QString, QString> TopWin8DesktopItemPrivate::i18NMap = { {"Title", QObject::tr("Title")}, {"Title(English)", QObject::tr("Title(English)")}, {"Title(Chinese Simplified)", QObject::tr("Title(Chinese Simplified)")}, {"Title(Chinese Tranditional)", QObject::tr("Title(Chinese Tranditional)")}, {"Icon Name", QObject::tr("Icon Name")}, {"Search Code", QObject::tr("Search Code")}, {"Layout Size", QObject::tr("Layout Size")}, {"Background Color", QObject::tr("Background Color")}, {"Url Address", QObject::tr("Url Address")} }; TopWin8DesktopItem::TopWin8DesktopItem(QWidget *parent) : TopDesktopItemAbs(parent), d_ptr(new TopWin8DesktopItemPrivate(this)) { Q_D(TopWin8DesktopItem); d->iconLabel = new QLabel(this); d->titleLabel = new QLabel(this); d->gridLayout = new QGridLayout(this); this->setLayout(d->gridLayout); } TopWin8DesktopItem::~TopWin8DesktopItem() { } static QColor getForegroundColor(const QColor &iBackgroundColor) { QString name = iBackgroundColor.name(); name = name.replace("#", ""); bool ok = false; int value = name.toInt(&ok, 16); if (!ok) { return Qt::black; } int r = value >> 16; int g = (value & 65280) >> 8; int b = value & 255; double brightness = r * 0.299 + g * 0.587 + b * 0.114; return (brightness > 160) ? Qt::black : Qt::white; } /*! * \brief convert "rgba(0, 0, 0, 0.9)" to QColor */ static QColor fromRgbaStr(const QString &iStr) { QRegularExpression re("rgba\\((\\d+),\\s*(\\d+),\\s*(\\d+),\\s*(.*)\\s*\\)"); QRegularExpressionMatch match = re.match(iStr); QColor color; if (match.hasMatch()) { color.setRgb(match.captured(1).toInt(), match.captured(2).toInt(), match.captured(3).toInt()); color.setAlphaF(match.captured(4).toDouble()); } return color; } void TopWin8DesktopItem::doLayout() { Q_D(TopWin8DesktopItem); while (d->gridLayout->count() > 0){ d->gridLayout->removeItem(d->gridLayout->itemAt(0)); } QString vStyle = layoutStyle().toUpper(); QVariantMap vConfigData = configData(); d->gridLayout->setMargin(2); d->gridLayout->setSpacing(0); int iconwidth = 64; int iconheight = 64; QString icon = vConfigData.value("icon").toString(); QString title = vConfigData.value("title_" + APP->language()).toString(); if (title.isEmpty()) title = vConfigData.value("title").toString(); QString background = vConfigData.value("background").toString(); QString searchCodeStr = vConfigData.value("searchCode").toString(); QString fgColor = getForegroundColor(fromRgbaStr(background)).name(); d->titleLabel->setStyleSheet(QString("color:%1;font:14px;padding:0 0 0 5px;").arg(fgColor)); d->titleLabel->setText(title); if (vStyle == "1X1"){ iconwidth = 28; iconheight = 28; d->titleLabel->setVisible(false); d->gridLayout->addWidget(d->iconLabel, 0, 0, 1, 1, Qt::AlignCenter); d->gridLayout->setRowStretch(0, 1); } else if (vStyle == "2X1"){ iconwidth = 28; iconheight = 28; d->titleLabel->setVisible(true); d->titleLabel->setWordWrap(true); d->gridLayout->addWidget(d->iconLabel,0,0,1,1,Qt::AlignCenter); d->gridLayout->addWidget(d->titleLabel,0,1,1,1,Qt::AlignCenter|Qt::AlignLeft); d->gridLayout->setMargin(10); d->gridLayout->setRowStretch(0,1); d->gridLayout->setColumnStretch(1, 1); } else if (vStyle == "4X1"){ iconwidth = 28; iconheight = 28; d->titleLabel->setVisible(true); d->titleLabel->setWordWrap(true); d->gridLayout->setMargin(10); d->gridLayout->addWidget(d->iconLabel,0,0,3,1,Qt::AlignCenter); d->gridLayout->addWidget(d->titleLabel,0,1,3,3,Qt::AlignCenter |Qt::AlignLeft); d->gridLayout->setRowStretch(0,1); d->gridLayout->setColumnStretch(1, 1); } else if (vStyle == "4X2"){ iconwidth = 48; iconheight = 48; d->titleLabel->setVisible(true); d->titleLabel->setWordWrap(true); d->gridLayout->addWidget(d->iconLabel,0,0,1,1,Qt::AlignCenter); d->gridLayout->addWidget(d->titleLabel, 1, 0, 1, 1, Qt::AlignCenter); d->gridLayout->setContentsMargins(2,2,2,7); d->gridLayout->setRowStretch(0,1); } else if (vStyle == "2X4"){ iconwidth = 48; iconheight = 48; d->titleLabel->setVisible(true); d->titleLabel->setWordWrap(true); d->gridLayout->addWidget(d->iconLabel,0,0,1,1,Qt::AlignCenter); d->gridLayout->addWidget(d->titleLabel,1,0,1,1,Qt::AlignCenter); d->gridLayout->setContentsMargins(2,2,2,7); d->gridLayout->setRowStretch(0,1); } else if (vStyle == "4X4"){ iconwidth = 64; iconheight = 64; d->titleLabel->setVisible(true); d->titleLabel->setWordWrap(true); d->gridLayout->addWidget(d->iconLabel, 0, 0, 1, 1, Qt::AlignCenter); d->gridLayout->addWidget(d->titleLabel, 1, 0, 1, 1, Qt::AlignCenter); d->gridLayout->setContentsMargins(2,2,2,7); d->gridLayout->setRowStretch(0, 1); } else{ iconwidth = 64; iconheight = 64; d->titleLabel->setVisible(true); d->titleLabel->setWordWrap(true); d->gridLayout->addWidget(d->iconLabel, 0, 0, 2, 2, Qt::AlignCenter); d->gridLayout->addWidget(d->titleLabel, 2, 0, 1, 2, Qt::AlignCenter); d->gridLayout->setContentsMargins(2,2,2,7); d->gridLayout->setRowStretch(0, 1); } d->iconLabel->setMinimumSize(iconwidth, iconheight); d->iconLabel->setPixmap(TResource::instance()->icon(icon).pixmap(iconwidth, iconheight)); setFixedStyleSheet(QString("background:%1;margin:%2px;").arg(background).arg(margin())); setStyleSheet(QString("QFrame[SS=\"DESKTOPITEM\"]{border-style:solid;border-width:1px;border-color:transparent;%1;}").arg(fixedStyleSheet())); QString tipStr = d->titleLabel->text(); if (!searchCodeStr.isEmpty()) tipStr += QString("\n<%1>").arg(searchCodeStr); setToolTip(tipStr); blockSignals(false); } bool TopWin8DesktopItem::showConfigDialog() { TUiloaderDialog dialog; QString uiStr = TFileIo::readFileString(":/topclass/topdesktop/ItemInfo.ui.js"); QString itemTextStr = config("title_" + APP->language()).toString(); if (itemTextStr.isEmpty()) { itemTextStr = config("title").toString(); } if (!itemTextStr.isEmpty()) { dialog.setTitle(tr("Edit - %1").arg(itemTextStr)); dialog.setIcon("setting2.white"); } else { dialog.setTitle(tr("New Module")); dialog.setIcon("add.white"); } dialog.setSelf(this); dialog.setScriptEngine(APP->scriptEngine()); dialog.resize(450, 500); dialog.setUiStr(uiStr); dialog.loadValues(configData()); QVariantMap retVarMap = dialog.run(true); dialog.close(); if (retVarMap.isEmpty()) return false; setConfigData(retVarMap); doLayout(); return true; } QString TopWin8DesktopItem::ttr(const QString &iStr) { return TopWin8DesktopItemPrivate::i18NMap.value(iStr, iStr); }