#include "etext.h" #include "base/locolorselector.h" #include "cfg.h" #include "globaldefine.h" #include "tools.h" #include #include #include #include #include #include #include #include #include #include #include #include #include EText::EText(EBase *multiWin) : EBase(multiWin) { mType = EBase::Text; m_attr.text = tr("Enter your text"); m_attr.cBackground = Qt::transparent; m_attr.opt.setAlignment(Qt::AlignCenter); m_attr.opt.setWrapMode(QTextOption::WrapAnywhere); //Play m_attr.playStyle = Flip; m_attr.rolling.headTailConnected = true; m_attr.rolling.headTailSpacing = 10; m_attr.rolling.rollingSpeed = 50; m_attr.rolling.rollingStyle = Left2Right; m_attr.rolling.playDuration = 30; connect(this, SIGNAL(sizeChanged()), this, SLOT(RefreshBigPixmap())); RefreshBigPixmap(); } EText::EText(const QJsonObject &json, EBase *multiWin) : EBase(multiWin) { mType = EBase::Text; setBaseAttr(json); setElement(json, m_attr); connect(this, SIGNAL(sizeChanged()), this, SLOT(RefreshBigPixmap())); RefreshBigPixmap(); } void EText::setElement(const QJsonObject &json, Data &attr) { auto widget = json["widget"]; attr.text = widget["text"].toString(); attr.lineSpacing = widget["lineSpacing"].toInt(); attr.letterSpacing = widget["wordSpacing"].toInt(); attr.opt.setAlignment(static_cast(widget["align"].toInt())); attr.cBackground = Tools::int2Color(widget["cBackground"].toInt()); attr.iPageCount = widget["iPageCount"].toInt(); auto play = json["play"]; attr.playStyle = play["style"].toInt(); auto turning = play["turning"]; attr.turning.effect = turning["strEffect"].toString(); attr.turning.pageDuration = turning["iEffectTime"].toInt(); attr.turning.effectDuration = turning["iEffectSpeed"].toInt(); attr.turning.playDuration = turning["playDuration"].toInt(); auto rolling = play["rolling"]; attr.rolling.rollingStyle = rolling["rollingStyle"].toInt(); attr.rolling.rollingSpeed = rolling["rollingSpeed"].toInt(); attr.rolling.headTailConnected = rolling["headTailConnected"].toBool(); attr.rolling.headTailSpacing = rolling["headTailSpacing"].toInt(); attr.rolling.playDuration = rolling["playDuration"].toInt(); attr.playDuration = play["static"]["playDuration"].toInt(); } class TTextEdit : public QTextEdit { public: explicit TTextEdit(const QString &text) : QTextEdit(text){} QSize minimumSizeHint() const override { return sizeHint(); }; QSize sizeHint() const override { auto size = QTextEdit::sizeHint(); auto minH = minimumHeight(); if(minH > 0) size.setHeight(minH+0xfff); return size; }; }; QWidget* EText::attrWgt() { auto wgtAttr = new QWidget; auto vBox = new QVBoxLayout(wgtAttr); vBox->setContentsMargins(4, 0, 4, 0); vBox->setSpacing(3); addBaseAttrWgt(vBox); auto hBox = new QHBoxLayout; hBox->addWidget(new QLabel(tr("Basic Properties"))); auto line = new QFrame; line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); hBox->addWidget(line, 1); vBox->addLayout(hBox); hBox = new QHBoxLayout; auto fdText = new TTextEdit(m_attr.text); auto fdFontFamily = new QFontComboBox; fdFontFamily->setEditable(false); connect(fdFontFamily, &QFontComboBox::currentFontChanged, fdText, [fdText](const QFont &f) { QTextCharFormat fmt; fmt.setFontFamily(f.family()); Tools::mergeFormat(fdText, fmt); }); hBox->addWidget(fdFontFamily); hBox->addStretch(); auto fdFontSize = new QSpinBox; fdFontSize->setRange(4, 9999); fdFontSize->setValue(16); connect(fdFontSize, (void(QSpinBox::*)(int))&QSpinBox::valueChanged, fdText, [fdText](int value) { if(value <= 0) return; QTextCharFormat fmt; fmt.setProperty(QTextFormat::FontPixelSize, value); Tools::mergeFormat(fdText, fmt); }); hBox->addWidget(fdFontSize); vBox->addLayout(hBox); hBox = new QHBoxLayout; hBox->setSpacing(3); auto wTextAlignHL = new QPushButton(); wTextAlignHL->setFixedSize(QSize(24, 24)); wTextAlignHL->setIconSize(QSize(24, 24)); QIcon icon3(":/res/ProgramManager/EditProgram/DocAlignHL_u.png"); icon3.addFile(":/res/ProgramManager/EditProgram/DocAlignHL_s.png", QSize(), QIcon::Normal, QIcon::On); wTextAlignHL->setIcon(icon3); wTextAlignHL->setFlat(true); wTextAlignHL->setCheckable(true); wTextAlignHL->setChecked(true); hBox->addWidget(wTextAlignHL); auto wTextAlignHC = new QPushButton(); wTextAlignHC->setFixedSize(QSize(24, 24)); wTextAlignHC->setIconSize(QSize(24, 24)); QIcon icon4(":/res/ProgramManager/EditProgram/DocAlignHC_u.png"); icon4.addFile(":/res/ProgramManager/EditProgram/DocAlignHC_s.png", QSize(), QIcon::Normal, QIcon::On); wTextAlignHC->setIcon(icon4); wTextAlignHC->setFlat(true); wTextAlignHC->setCheckable(true); hBox->addWidget(wTextAlignHC); auto wTextAlignHR = new QPushButton(); wTextAlignHR->setFixedSize(QSize(24, 24)); wTextAlignHR->setIconSize(QSize(24, 24)); QIcon icon5(":/res/ProgramManager/EditProgram/DocAlignHR_u.png"); icon5.addFile(":/res/ProgramManager/EditProgram/DocAlignHR_s.png", QSize(), QIcon::Normal, QIcon::On); wTextAlignHR->setIcon(icon5); wTextAlignHR->setFlat(true); wTextAlignHR->setCheckable(true); hBox->addWidget(wTextAlignHR); hBox->addStretch(); auto wFontBold = new QPushButton; wFontBold->setFixedSize(QSize(24, 24)); wFontBold->setIconSize(QSize(24, 24)); QIcon icon(":/res/ProgramManager/EditProgram/FontBold_u.png"); icon.addFile(":/res/ProgramManager/EditProgram/FontBold_s.png", QSize(), QIcon::Normal, QIcon::On); wFontBold->setIcon(icon); wFontBold->setFlat(true); wFontBold->setCheckable(true); connect(wFontBold, &QPushButton::toggled, fdText, [fdText](bool checked) { QTextCharFormat fmt; fmt.setFontWeight(checked ? QFont::Bold : QFont::Normal); Tools::mergeFormat(fdText, fmt); }); hBox->addWidget(wFontBold); auto fdFontItalic = new QPushButton; fdFontItalic->setFixedSize(24, 24); fdFontItalic->setIconSize(QSize(24, 24)); icon = QIcon(":/res/ProgramManager/EditProgram/FontItalics_u.png"); icon.addFile(":/res/ProgramManager/EditProgram/FontItalics_s.png", QSize(), QIcon::Normal, QIcon::On); fdFontItalic->setIcon(icon); fdFontItalic->setFlat(true); fdFontItalic->setCheckable(true); connect(fdFontItalic, &QPushButton::toggled, fdText, [fdText](bool checked) { QTextCharFormat fmt; fmt.setFontItalic(checked); Tools::mergeFormat(fdText, fmt); }); hBox->addWidget(fdFontItalic); auto wFontUnderline = new QPushButton; wFontUnderline->setFixedSize(24, 24); wFontUnderline->setIconSize(QSize(24, 24)); icon = QIcon(":/res/ProgramManager/EditProgram/FontUnderline_u.png"); icon.addFile(":/res/ProgramManager/EditProgram/FontUnderline_s.png", QSize(), QIcon::Normal, QIcon::On); wFontUnderline->setIcon(icon); wFontUnderline->setFlat(true); wFontUnderline->setCheckable(true); connect(wFontUnderline, &QPushButton::toggled, fdText, [fdText](bool checked) { QTextCharFormat fmt; fmt.setFontUnderline(checked); Tools::mergeFormat(fdText, fmt); }); hBox->addWidget(wFontUnderline); hBox->addStretch(); auto fdTextColor = new LoColorSelector(tr("Font Color"), Qt::white); fdTextColor->setFixedHeight(24); connect(fdTextColor, &LoColorSelector::sColorChanged, fdText, [fdText](const QColor &color) { if(! color.isValid()) return; QTextCharFormat fmt; fmt.setForeground(color); Tools::mergeFormat(fdText, fmt); }); hBox->addWidget(fdTextColor); auto fdBackColor = new LoColorSelector(tr("Back Color"), m_attr.cBackground); fdBackColor->setFixedHeight(24); connect(fdBackColor, &LoColorSelector::sColorChanged, this, [this](const QColor &color) { if(! color.isValid()) return; m_attr.cBackground = color; update(); RefreshBigPixmap(); }); hBox->addWidget(fdBackColor); vBox->addLayout(hBox); hBox = new QHBoxLayout; hBox->setSpacing(3); auto wTextAlignVT = new QPushButton; wTextAlignVT->setFixedSize(QSize(24, 24)); wTextAlignVT->setIconSize(QSize(24, 24)); QIcon icon6(":/res/ProgramManager/EditProgram/DocAlignVT_u.png"); icon6.addFile(":/res/ProgramManager/EditProgram/DocAlignVT_s.png", QSize(), QIcon::Normal, QIcon::On); wTextAlignVT->setIcon(icon6); wTextAlignVT->setFlat(true); wTextAlignVT->setCheckable(true); wTextAlignVT->setChecked(true); hBox->addWidget(wTextAlignVT); auto wTextAlignVC = new QPushButton(); wTextAlignVC->setFixedSize(QSize(24, 24)); wTextAlignVC->setIconSize(QSize(24, 24)); QIcon icon7(":/res/ProgramManager/EditProgram/DocAlignVC_u.png"); icon7.addFile(":/res/ProgramManager/EditProgram/DocAlignVC_s.png", QSize(), QIcon::Normal, QIcon::On); wTextAlignVC->setIcon(icon7); wTextAlignVC->setFlat(true); wTextAlignVC->setCheckable(true); hBox->addWidget(wTextAlignVC); auto wTextAlignVB = new QPushButton(); wTextAlignVB->setFixedSize(QSize(24, 24)); wTextAlignVB->setIconSize(QSize(24, 24)); QIcon icon8(":/res/ProgramManager/EditProgram/DocAlignVB_u.png"); icon8.addFile(":/res/ProgramManager/EditProgram/DocAlignVB_s.png", QSize(), QIcon::Normal, QIcon::On); wTextAlignVB->setIcon(icon8); wTextAlignVB->setFlat(true); wTextAlignVB->setCheckable(true); hBox->addWidget(wTextAlignVB); hBox->addStretch(); hBox->addWidget(new QLabel(tr("Kerning"))); auto fdLetterSpacing = new QSpinBox(); fdLetterSpacing->setMaximum(999); fdLetterSpacing->setValue(m_attr.letterSpacing); connect(fdLetterSpacing, (void(QSpinBox::*)(int))&QSpinBox::valueChanged, this, [this](int value) { m_attr.letterSpacing = value; update(); RefreshBigPixmap(); }); hBox->addWidget(fdLetterSpacing); hBox->addWidget(new QLabel(tr("Line Spacing"))); auto fdLineSpacing = new QSpinBox(); fdLineSpacing->setMaximum(999); fdLineSpacing->setValue(m_attr.lineSpacing); connect(fdLineSpacing, (void(QSpinBox::*)(int))&QSpinBox::valueChanged, this, [this](int value) { m_attr.lineSpacing = value; update(); RefreshBigPixmap(); }); hBox->addWidget(fdLineSpacing); vBox->addLayout(hBox); auto wTextAlignH = new QButtonGroup(wgtAttr); wTextAlignH->addButton(wTextAlignHL, Qt::AlignLeft); wTextAlignH->addButton(wTextAlignHC, Qt::AlignHCenter); wTextAlignH->addButton(wTextAlignHR, Qt::AlignRight); connect(wTextAlignH, &QButtonGroup::idClicked, this, [this](int value) { int res = m_attr.opt.alignment(); res &= ~Qt::AlignHorizontal_Mask; res |= value; m_attr.opt.setAlignment(static_cast(res)); update(); RefreshBigPixmap(); }); auto wTextAlignV = new QButtonGroup(wgtAttr); wTextAlignV->addButton(wTextAlignVT, Qt::AlignTop); wTextAlignV->addButton(wTextAlignVC, Qt::AlignVCenter); wTextAlignV->addButton(wTextAlignVB, Qt::AlignBottom); connect(wTextAlignV, &QButtonGroup::idClicked, this, [this](int value) { int res = m_attr.opt.alignment(); res &= ~Qt::AlignVertical_Mask; res |= value; m_attr.opt.setAlignment(static_cast(res)); update(); RefreshBigPixmap(); }); auto align = m_attr.opt.alignment(); auto h_align = align & Qt::AlignHorizontal_Mask; if(h_align==Qt::AlignLeft) wTextAlignHL->setChecked(true); if(h_align==Qt::AlignHCenter) wTextAlignHC->setChecked(true); if(h_align==Qt::AlignRight) wTextAlignHR->setChecked(true); auto v_align = align & Qt::AlignVertical_Mask; if(v_align==Qt::AlignTop) wTextAlignVT->setChecked(true); if(v_align==Qt::AlignVCenter) wTextAlignVC->setChecked(true); if(v_align==Qt::AlignBottom) wTextAlignVB->setChecked(true); fdText->setMinimumHeight(160); auto font = fdText->font(); font.setPixelSize(16); fdText->setFont(font); auto pal = fdText->palette(); pal.setColor(QPalette::Base, Qt::black); pal.setColor(QPalette::Text, Qt::white); fdText->setPalette(pal); fdText->setFrameShape(QFrame::NoFrame); fdText->setAcceptRichText(false); connect(fdText, &QTextEdit::textChanged, this, [this, fdText] { QString plain = fdText->toPlainText(); if(plain.isEmpty()) { fdText->selectAll(); QTextCharFormat fmt; fmt.setForeground(Qt::white); Tools::mergeFormat(fdText, fmt); } m_attr.text = fdText->toHtml(); update(); RefreshBigPixmap(); }); vBox->addWidget(fdText); hBox = new QHBoxLayout; hBox->addStretch(); hBox->addWidget(new QLabel(tr("PageCount:"))); auto fdPageCnt = new QLabel(QString::number(m_attr.iPageCount)); hBox->addWidget(fdPageCnt); hBox->addSpacing(20); hBox->addWidget(new QLabel(tr("page"))); auto fdPageIdx = new QSpinBox(); fdPageIdx->setRange(1, m_attr.iPageCount); connect(fdPageIdx, (void(QSpinBox::*)(int))&QSpinBox::valueChanged, this, &EText::OnPageIndexPreview); hBox->addWidget(fdPageIdx); hBox->addStretch(); auto btnImport = new QPushButton(tr("Import txt File")); btnImport->setProperty("ssType", "progManageTool"); connect(btnImport, &QPushButton::clicked, fdText, [fdText] { auto filePath = QFileDialog::getOpenFileName(gMainWin, tr("Select File"), gFileHome, "Txt(*.txt)"); if(filePath.isEmpty()) return; QFile file(filePath); if(! file.open(QFile::ReadOnly)) { QMessageBox::critical(gMainWin, tr("Fail"), tr("File Open Fail")); return; } auto data = file.readAll(); file.close(); QTextCodec::ConverterState state; QString text = QTextCodec::codecForName("UTF-8")->toUnicode(data.constData(), data.size(), &state); if(state.invalidChars > 0) text = QString::fromLocal8Bit(data); fdText->setText(text); }); hBox->addWidget(btnImport); vBox->addLayout(hBox); hBox = new QHBoxLayout; hBox->addWidget(new QLabel(tr("Play Properties"))); line = new QFrame(); line->setFrameShape(QFrame::HLine); line->setFrameShadow(QFrame::Sunken); hBox->addWidget(line, 1); vBox->addLayout(hBox); hBox = new QHBoxLayout; hBox->addStretch(); auto fdFlip = new QRadioButton(tr("Flip")); hBox->addWidget(fdFlip); hBox->addStretch(); auto fdScroll = new QRadioButton(tr("Scroll")); fdScroll->setChecked(true); hBox->addWidget(fdScroll); hBox->addStretch(); auto fdStatic = new QRadioButton(tr("Static")); hBox->addWidget(fdStatic); hBox->addStretch(); vBox->addLayout(hBox); auto wPlayStyle = new QButtonGroup(wgtAttr); wPlayStyle->addButton(fdFlip, EText::Flip); wPlayStyle->addButton(fdScroll, EText::Scroll); wPlayStyle->addButton(fdStatic, EText::Static); if(m_attr.playStyle==EText::Flip) fdFlip->setChecked(true); else if(m_attr.playStyle==EText::Scroll) fdScroll->setChecked(true); else if(m_attr.playStyle==EText::Static) fdStatic->setChecked(true); auto wgtAttrFlip = new QWidget(); { auto vBox = new QVBoxLayout(wgtAttrFlip); vBox->setContentsMargins(2, 0, 2, 0); vBox->setSpacing(3); hBox = new QHBoxLayout; auto label = new QLabel(tr("Play Duration")); label->setMinimumWidth(100); hBox->addWidget(label); auto fdDur = new QTimeEdit(QTime::fromMSecsSinceStartOfDay(m_attr.turning.playDuration*1000)); fdDur->setReadOnly(true); fdDur->setButtonSymbols(QAbstractSpinBox::NoButtons); fdDur->setDisplayFormat("H:mm:ss"); fdDur->setStyleSheet("QTimeEdit{background-color:#ddd;}"); connect(fdDur, &QTimeEdit::timeChanged, this, [this](const QTime &time) { m_attr.turning.playDuration = time.msecsSinceStartOfDay()/1000; }); hBox->addWidget(fdDur); hBox->addStretch(); vBox->addLayout(hBox); hBox = new QHBoxLayout(); label = new QLabel(tr("Duration/Page")); label->setMinimumWidth(100); hBox->addWidget(label); auto fdPageDur = new QTimeEdit(QTime::fromMSecsSinceStartOfDay(m_attr.turning.pageDuration*1000)); fdPageDur->setDisplayFormat("H:mm:ss"); fdPageDur->setCurrentSection(QTimeEdit::SecondSection); hBox->addWidget(fdPageDur); hBox->addStretch(); vBox->addLayout(hBox); hBox = new QHBoxLayout(); label = new QLabel(tr("Entrance Effect")); label->setMinimumWidth(100); hBox->addWidget(label); auto fdEff = new QComboBox(); fdEff->addItem(tr("no"), "no"); fdEff->addItem(tr("random"), "random"); fdEff->addItem(tr("right to left"), "right to left"); fdEff->addItem(tr("bottom to top"), "bottom to top"); fdEff->addItem(tr("left to right"), "left to right"); fdEff->addItem(tr("top to bottom"), "top to bottom"); int idx = fdEff->findData(m_attr.turning.effect); if(idx!=-1) fdEff->setCurrentIndex(idx); connect(fdEff, (void(QComboBox::*)(int))&QComboBox::currentIndexChanged, this, [this, fdEff] { m_attr.turning.effect = fdEff->currentData().toString(); update(); }); hBox->addWidget(fdEff); hBox->addStretch(); vBox->addLayout(hBox); hBox = new QHBoxLayout(); label = new QLabel(tr("Effect time")); label->setMinimumWidth(100); hBox->addWidget(label); auto wEffectSpeed = new QSpinBox(); wEffectSpeed->setValue(m_attr.turning.effectDuration); hBox->addWidget(wEffectSpeed); hBox->addWidget(new QLabel(tr("s"))); hBox->addStretch(); vBox->addLayout(hBox); vBox->addStretch(); connect(fdPageDur, &QTimeEdit::timeChanged, this, [this, wEffectSpeed, fdPageDur, fdDur](const QTime &time) { int effDur = wEffectSpeed->value(); int pageDur = time.msecsSinceStartOfDay()/1000; if(pageDur < effDur) { QMessageBox::warning(gMainWin, tr("Tip Info"), tr("Effect time cannot be longer than duration time")); pageDur = effDur; fdPageDur->setTime(QTime::fromMSecsSinceStartOfDay(pageDur*1000)); fdPageDur->setFocus(); } m_attr.turning.pageDuration = pageDur; m_attr.turning.playDuration = pageDur * m_attr.iPageCount; fdDur->setTime(QTime::fromMSecsSinceStartOfDay(m_attr.turning.playDuration*1000)); }); connect(wEffectSpeed, (void(QSpinBox::*)(int))&QSpinBox::valueChanged, this, [this, wEffectSpeed, fdPageDur](int value) { int pageDur = fdPageDur->time().msecsSinceStartOfDay()/1000; if(value > pageDur) { QMessageBox::warning(gMainWin, tr("Tip Info"), tr("Effect time cannot be longer than duration time")); if(pageDur>1) value = pageDur-1; else value = 0; wEffectSpeed->setValue(value); wEffectSpeed->setFocus(); } m_attr.turning.effectDuration = value; }); connect(this, &EText::sPageCountChanged, wgtAttr, [this, fdPageCnt, fdPageIdx, fdPageDur, fdDur] { fdPageCnt->setText(QString::number(m_attr.iPageCount)); fdPageIdx->setRange(1, m_attr.iPageCount); fdPageIdx->setValue(1); fdDur->setTime(QTime::fromMSecsSinceStartOfDay(fdPageDur->time().msecsSinceStartOfDay()*m_attr.iPageCount)); }); } auto wgtAttrScroll = new QWidget(); { auto vBox = new QVBoxLayout(wgtAttrScroll); vBox->setContentsMargins(2, 0, 2, 0); vBox->setSpacing(3); auto hBox = new QHBoxLayout(); auto label = new QLabel(tr("Play Duration")); label->setMinimumWidth(100); hBox->addWidget(label); auto timeEdit = new QTimeEdit(QTime::fromMSecsSinceStartOfDay(m_attr.rolling.playDuration*1000)); timeEdit->setDisplayFormat("H:mm:ss"); timeEdit->setCurrentSectionIndex(2); connect(timeEdit, &QTimeEdit::timeChanged, this, [this](const QTime &time) { m_attr.rolling.playDuration = time.msecsSinceStartOfDay()/1000; }); hBox->addWidget(timeEdit); hBox->addStretch(); vBox->addLayout(hBox); hBox = new QHBoxLayout(); label = new QLabel(tr("Head-Tail Connected")); label->setMinimumWidth(100); hBox->addWidget(label); auto wHeadTailConnected = new QCheckBox(); wHeadTailConnected->setLayoutDirection(Qt::LeftToRight); wHeadTailConnected->setStyleSheet("QCheckBox::indicator{width: 16px; height: 16px;}"); hBox->addWidget(wHeadTailConnected); auto lHeadTailSpacing = new QLabel(tr("Head-Tail Spacing")); hBox->addWidget(lHeadTailSpacing); auto wHeadTailSpacing = new QSpinBox(); wHeadTailSpacing->setMaximum(9999); wHeadTailSpacing->setValue(m_attr.rolling.headTailSpacing); connect(wHeadTailSpacing, (void(QSpinBox::*)(int))&QSpinBox::valueChanged, this, [this](int value) { m_attr.rolling.headTailSpacing = value; }); hBox->addWidget(wHeadTailSpacing); hBox->addStretch(); vBox->addLayout(hBox); if(m_attr.rolling.headTailConnected) wHeadTailConnected->setChecked(true); else { lHeadTailSpacing->setVisible(false); wHeadTailSpacing->setVisible(false); } connect(wHeadTailConnected, &QCheckBox::toggled, this, [this, lHeadTailSpacing, wHeadTailSpacing](bool checked) { m_attr.rolling.headTailConnected = checked; lHeadTailSpacing->setVisible(checked); wHeadTailSpacing->setVisible(checked); }); hBox = new QHBoxLayout(); label = new QLabel(tr("Scroll Style")); label->setMinimumWidth(100); hBox->addWidget(label); auto wRollingStyle = new QComboBox(); wRollingStyle->addItem(tr("Right -> Left")); wRollingStyle->addItem(tr("Bottom -> Top")); wRollingStyle->addItem(tr("Left -> Right")); wRollingStyle->addItem(tr("Top -> Bottom")); wRollingStyle->setCurrentIndex(m_attr.rolling.rollingStyle); connect(wRollingStyle, (void(QComboBox::*)(int))&QComboBox::currentIndexChanged, this, [this](int index) { m_attr.rolling.rollingStyle = index; update(); RefreshBigPixmap(); }); hBox->addWidget(wRollingStyle); hBox->addStretch(); vBox->addLayout(hBox); hBox = new QHBoxLayout(); label = new QLabel(tr("Scroll Speed")); label->setMinimumWidth(100); hBox->addWidget(label); auto wRollingSpeed = new QSpinBox(); wRollingSpeed->setMaximum(9999); wRollingSpeed->setValue(m_attr.rolling.rollingSpeed); connect(wRollingSpeed, (void(QSpinBox::*)(int))&QSpinBox::valueChanged, this, [this](int value) { m_attr.rolling.rollingSpeed = value; }); hBox->addWidget(wRollingSpeed); hBox->addStretch(); vBox->addLayout(hBox); vBox->addStretch(); } auto wgtAttrStatic = new QWidget(); { auto vBox = new QVBoxLayout(wgtAttrStatic); vBox->setContentsMargins(2, 0, 2, 0); vBox->setSpacing(3); hBox = new QHBoxLayout(); auto label = new QLabel(tr("Play Duration")); label->setMinimumWidth(100); hBox->addWidget(label); auto timeEdit = new QTimeEdit(QTime::fromMSecsSinceStartOfDay(m_attr.playDuration*1000)); timeEdit->setDisplayFormat("H:mm:ss"); timeEdit->setCurrentSectionIndex(2); connect(timeEdit, &QTimeEdit::timeChanged, this, [this](const QTime &time) { m_attr.playDuration = time.msecsSinceStartOfDay() / 1000; }); hBox->addWidget(timeEdit); hBox->addStretch(); vBox->addLayout(hBox); vBox->addStretch(); } auto stackBox = new QStackedLayout; vBox->addLayout(stackBox); stackBox->addWidget(wgtAttrFlip); stackBox->addWidget(wgtAttrScroll); stackBox->addWidget(wgtAttrStatic); stackBox->setCurrentIndex(m_attr.playStyle); connect(wPlayStyle, &QButtonGroup::idClicked, this, [this, stackBox](int value) { m_attr.playStyle = value; update(); RefreshBigPixmap(); stackBox->setCurrentIndex(value); }); return wgtAttr; } bool EText::save(const QString &pRoot) { m_pRootPath=pRoot; QString strDir = QString("%1%2%3%4%5").arg(zValue()).arg((int)x()).arg((int)y()).arg((int)mWidth).arg((int)mHeight); //保存图片元素到相应目录 QDir dirTemp(m_pRootPath+MACRO_FENGEFU+strDir); if(dirTemp.exists()) { if(dirTemp.removeRecursively()) { int iReTryCount=0; QDir dRoot(m_pRootPath); while(!dRoot.mkdir(strDir)) { QThread::sleep(1); iReTryCount++; if(iReTryCount>10) break; } } } else { int iReTryCount=0; QDir dRoot(m_pRootPath); while(!dRoot.mkdir(strDir)) { QThread::sleep(1); iReTryCount++; if(iReTryCount>10) break; } } // QDir dRoot(m_pRootPath); // if(dRoot.exists(strDir)) { // QDir dirTemp(m_pRootPath+MACRO_FENGEFU+strDir); // if(dirTemp.exists()) // { // } // dRoot.removeRecursively() // if(dRoot.remove(strDir)) // { // removeRecursively // } // } // int iReTryCount=0; // while(!dRoot.mkdir(strDir)) // { // QThread::sleep(1); // iReTryCount++; // if(iReTryCount>10) // break; // } QString strPath=m_pRootPath+ MACRO_FENGEFU +strDir; if(m_attr.playStyle==EText::Flip)//生成多张图 { for (int i=0;i(m_attr.opt.alignment()); oColor["background"] = Tools::color2Int(m_attr.cBackground); oWidget["lineSpacing"] = m_attr.lineSpacing; oWidget["wordSpacing"] = m_attr.letterSpacing; oWidget["cBackground"] = Tools::color2Int(m_attr.cBackground); QJsonObject QJOPngObject; QJsonArray QJArrayPngItems; QString strDir=QString("%1%2%3%4%5").arg(zValue()).arg((int)x()).arg((int)y()).arg((int)mWidth).arg((int)mHeight); if(m_attr.playStyle==EText::Flip)//生成多张图 { for (int i=0;isave(); painter->drawPixmap(innerRect(), mRenderImg, QRectF()); painter->restore(); EBase::paint(painter, option, widget); } void EText::CreateBigOnePixBmp(){ QPainter painter; QTextDocument doc; doc.setDefaultTextOption(m_attr.opt); doc.setDocumentMargin(0); doc.setTextWidth(rect().width()); QFont font; if(gTextAntialiasing) font.setHintingPreference(QFont::PreferNoHinting); else { font.setLetterSpacing(QFont::AbsoluteSpacing, m_attr.letterSpacing); font.setStyleStrategy(QFont::NoAntialias); } font.setPixelSize(16); doc.setDefaultFont(font); m_lineH = m_attr.lineSpacing + QFontMetrics(doc.defaultFont()).lineSpacing(); doc.setHtml("
"+m_attr.text+"
"); int iwidth=this->rect().toRect().width(); QRectF OutPutBmpRect = QRectF(0, 0, iwidth, doc.size().height());//实际绘制文本的矩形大小 int iheight=OutPutBmpRect.toRect().height(); QPixmap map(iwidth, iheight); map.fill(m_attr.cBackground); painter.begin(&map); doc.drawContents(&painter, OutPutBmpRect); painter.end(); m_bigOnePixBmp=map.copy(OutPutBmpRect.toRect()); } void EText::RefreshBigPixmap(){ if(m_attr.playStyle==EText::Flip){//生成多张图 CreateBigOnePixBmp(); if(m_bigOnePixBmp.height()>6) { QImage tempQImage=m_bigOnePixBmp.toImage(); m_ImageBkColor=tempQImage.pixelColor(0,0); m_list.clear(); GetPagesPosList(); } if(m_list.count()>0) OnPageIndexPreview(1); m_attr.iPageCount=m_list.count(); emit sPageCountChanged(m_list.count()); } else if(m_attr.playStyle==EText::Scroll)//生成一张大图 { if(m_attr.rolling.rollingStyle==0||m_attr.rolling.rollingStyle==2)//上下滚动,生成一张纵向长图 { MakeBigMoveLeftOrRightOnePngToDir(); } else if(m_attr.rolling.rollingStyle==1||m_attr.rolling.rollingStyle==3)//上下滚动,生成一张纵向长图 { MakeBigMoveUpOrDownOnePngToDir(); } m_attr.iPageCount=1; emit sPageCountChanged(1); } else if(m_attr.playStyle==EText::Static)//生成一张图 { CreateBigOnePixBmp(); if(m_bigOnePixBmp.height()>6){ QImage tempQImage=m_bigOnePixBmp.toImage(); m_ImageBkColor=tempQImage.pixelColor(0,0); m_list.clear(); GetPagesPosList(); } m_attr.iPageCount=1; OnPageIndexPreview(1); emit sPageCountChanged(1); } } int EText::GetPagesPosList(){ int iIndex=0; for (;;) { if(ClearPixmapTopAndBottomBlack()<=0) return m_list.count(); txtBmpPage temp=GetFirstPagePixmap(); if(temp.index==-1) {//表示到最后,bigpixmap已经没有内容了 temp.index=iIndex; iIndex++; m_list.append(temp); return m_list.count(); } else { temp.index=iIndex; m_list.append(temp); iIndex++; if(iIndex > 100) break; } } return m_list.count(); } //去除上下的黑边,返回去掉黑边图像的高度 int EText::ClearPixmapTopAndBottomBlack() { QImage tempQImage=m_bigOnePixBmp.toImage(); int iFirst=0; int iEnd=m_bigOnePixBmp.height(); bool bFirst=false; bool bEnd=false; for(int y=0;y=0;m--) { for (int n=0;n1) { int iCopyHeight=iEnd-iFirst+1; m_bigOnePixBmp=m_bigOnePixBmp.copy(0,iFirst,m_bigOnePixBmp.width(),iCopyHeight+1); return iCopyHeight; } else { //空的没有文字的部分 return -1; } } txtBmpPage EText::GetFirstPagePixmap() { QImage tempQImage=m_bigOnePixBmp.toImage(); // tempQImage.save("f://a.png","PNG"); txtBmpPage tempPageClass; int iWidth=m_bigOnePixBmp.width(); int iHeight=m_bigOnePixBmp.height(); int iRectHeight=rect().height(); if(iRectHeight>iHeight) iRectHeight=iHeight; int iType=0; //判断底边是不是黑 for (int x=0;x=0;y--) { bool bFinished=false; for (int x=0;x=0;y--) { bool bFinished=false; for (int x=0;xiRectHeight) m_bigOnePixBmp=m_bigOnePixBmp.copy(0,iRectHeight,iWidth,iHeight-iRectHeight); else { tempPageClass.index=-1; return tempPageClass; } } else if(iSubType==1) { for (int y=iSubEnd;y>=0;y--) { bool bFinished=false; for (int x=0;x=0) { if(m_list.count()>0 && iPageIndexdiv{color:#fff; line-height:"+QString::number(m_attr.lineSpacing + lineSpacing)+"px; white-space:pre-wrap;}
"+m_attr.text+"
"); int iwidth=this->rect().toRect().width(); QRectF OutPutBmpRect = QRectF(0, 0, iwidth, doc.size().height());//实际绘制文本的矩形大小 int iheight=OutPutBmpRect.toRect().height(); QPixmap map(iwidth,iheight); map.fill(m_attr.cBackground); painter.begin(&map); doc.drawContents(&painter, OutPutBmpRect); painter.end(); mRenderImg = QPixmap(rect().size().toSize()); mRenderImg.fill(m_attr.cBackground); painter.begin(&mRenderImg); if(rect().height()>map.height()) { QBrush bshBackground = Tools::getBrush(m_attr.cBackground); if(bshBackground != Qt::NoBrush) painter.fillRect(0,map.height(),rect().width(),rect().height()-map.height(), bshBackground); painter.drawPixmap(map.rect(), map,map.rect()); } else { QRectF rectSource(0,0,rect().width(),rect().height()); painter.drawPixmap(rect(),map,rectSource); } painter.end(); update(); } void EText::MakeBigMoveLeftOrRightOnePngToDir() { QPainter painter; QTextDocument doc; //m_attr.opt.setAlignment(Qt::AlignJustify); m_attr.opt.setAlignment(Qt::AlignLeft); doc.setDefaultTextOption(m_attr.opt); doc.setDocumentMargin(0); // doc.setTextWidth(rect().width()); doc.setTextWidth(3800); QFont font; if(gTextAntialiasing) font.setHintingPreference(QFont::PreferNoHinting); else { font.setLetterSpacing(QFont::AbsoluteSpacing, m_attr.letterSpacing); font.setStyleStrategy(QFont::NoAntialias); } font.setPixelSize(16); doc.setDefaultFont(font); const int lineSpacing = QFontMetrics(doc.defaultFont()).lineSpacing(); int lineH = m_attr.lineSpacing + lineSpacing; doc.setHtml("
"+m_attr.text+"
"); //int iwidth=this->rect().toRect().width(); int iwidth=3800; QRectF OutPutBmpRect = QRectF(0, 0, iwidth, doc.size().height());//实际绘制文本的矩形大小 int iheight=OutPutBmpRect.toRect().height(); QPixmap map(iwidth,iheight); map.fill(m_attr.cBackground); painter.begin(&map); doc.drawContents(&painter, OutPutBmpRect); painter.end(); QPixmap bigOnePixmap=map.copy(OutPutBmpRect.toRect()); //获取 m_linelist.clear(); //获取到长图的每页添加到list,并返回最大高度 GetLinePng(bigOnePixmap); //把list中的图片拼接起来 if(m_linelist.count()>0) { QBrush bshBackground = Tools::getBrush(m_attr.cBackground); //把长图的开头拷贝到输出pixmap预览 mRenderImg = QPixmap(rect().size().toSize()); mRenderImg.fill(m_attr.cBackground); painter.begin(&mRenderImg); txtBmpLine tmpLine=m_linelist.at(0); int itempHeight=tmpLine.bitmap.height();//tmpLine.iEnd-tmpLine.iStart; int iTopOffset=(rect().height()-itempHeight)/2; painter.fillRect(0,0,rect().width(),iTopOffset, bshBackground); painter.fillRect(0,iTopOffset+itempHeight,rect().width(),rect().height()-iTopOffset-itempHeight, bshBackground); QRectF rectDest(0,iTopOffset,rect().width(),itempHeight); QRectF rectSource(0,0,rect().width(),itempHeight); painter.drawPixmap(rectDest,tmpLine.bitmap,rectSource); painter.end(); } update(); } int EText::GetLinePng(QPixmap bigOnePixmap) { QImage tempQImage=bigOnePixmap.toImage(); m_ImageBkColor=tempQImage.pixelColor(0,0); // int iFirst=0; // int iEnd=bigOnePixmap.height(); bool bLineFlag=false; // bool bEnd=false; int iIndex=0; txtBmpLine tmp; int iMaxHeight=0; for(int y=0;y2) { if(ipicHeight>iMaxHeight) iMaxHeight=ipicHeight; tmp.bitmap=bigOnePixmap.copy(0,tmp.iStart,bigOnePixmap.width(),tmp.iEnd-tmp.iStart); m_linelist.append(tmp); bLineFlag=false; } } } else //文字行向下判断到了一个背景色的行,扫描了一行也没有发现文字颜色,都是背景色 { tmp.iEnd=y; int ipicHeight=tmp.iEnd-tmp.iStart; if(ipicHeight>2) { if(ipicHeight>iMaxHeight) iMaxHeight=ipicHeight; tmp.bitmap=bigOnePixmap.copy(0,tmp.iStart,bigOnePixmap.width(),tmp.iEnd-tmp.iStart); m_linelist.append(tmp); bLineFlag=false; } } } } } return iMaxHeight; } //生成左右滚动图片素材 void EText::MakeBigMoveLeftOrRightOnePngToDir(QString strPngPathAndName) { QPainter painter; GetPagesPosList(); QTextDocument doc; m_attr.opt.setAlignment(Qt::AlignLeft); doc.setDefaultTextOption(m_attr.opt); doc.setDocumentMargin(0); doc.setTextWidth(3800); QFont font; if(gTextAntialiasing) font.setHintingPreference(QFont::PreferNoHinting); else { font.setLetterSpacing(QFont::AbsoluteSpacing, m_attr.letterSpacing); font.setStyleStrategy(QFont::NoAntialias); } font.setPixelSize(16); doc.setDefaultFont(font); const int lineSpacing = QFontMetrics(doc.defaultFont()).lineSpacing(); int lineH = m_attr.lineSpacing + lineSpacing; doc.setHtml("
"+m_attr.text+"
"); //int iwidth=this->rect().toRect().width()*iAllPagesTemp; int iwidth=3800; QRectF OutPutBmpRect = QRectF(0, 0, iwidth, doc.size().height());//实际绘制文本的矩形大小 int iheight=OutPutBmpRect.toRect().height(); QPixmap map(iwidth,iheight); map.fill(m_attr.cBackground); painter.begin(&map); doc.drawContents(&painter,OutPutBmpRect); painter.end(); QPixmap bigOnePixmap=map.copy(OutPutBmpRect.toRect()); //获取 bigOnePixmap.save("f:/a.png","PNG"); m_linelist.clear(); //获取到长图的每页添加到list,并返回最大高度 GetLinePng(bigOnePixmap); //把list中的图片拼接起来 int iMaxHeight=rect().height(); if(m_linelist.count()>0) { QBrush bshBackground(m_attr.cBackground);// = LoAppTools::getInstance()->getBrush(m_attr.cBackground); QList listPageWidth; int iPicLongSize=0; for (int j=0;j4096-rect().width()) { listPageWidth.append(iPicLongSize); // iPicLongSize=0; } } // if(iPicLongSize!=0) // { // listPageWidth.append(iPicLongSize); // } int iIOffset=0; for (int m=0;mbegin(&bigOneLongPixmap); iPicLongSize=0; for (int i=iIOffset;ifillRect((i-iIOffset)*iwidth,0,rect().width(),iTopOffset, bshBackground); pPainterTemp->fillRect((i-iIOffset)*iwidth,iTopOffset+itempHeight,rect().width(),iMaxHeight-iTopOffset-itempHeight, bshBackground); } QRectF rectDest((i-iIOffset)*iwidth,(iMaxHeight-itempHeight)/2,iwidth,itempHeight); pPainterTemp->drawPixmap(rectDest,tmpLine.bitmap,tmpLine.bitmap.rect()); if(iPicLongSize==itempWidth) { pPainterTemp->end(); delete pPainterTemp; if(m==listPageWidth.count()-1) { //如果启用了首位相接,根据间隔值处理吧文字后边的黑边流出来。 if(m_attr.rolling.headTailConnected) { int itempSpace=GetWordSpaceRealInBmp(bigOneLongPixmap); ProcessLastStartEndLianJie(bigOneLongPixmap,strPngPathAndName+QString::number(m)+".png",itempSpace+m_attr.rolling.headTailSpacing); } else { int itempSpace=GetWordSpaceRealInBmp(bigOneLongPixmap); ProcessLastStartEndLianJie(bigOneLongPixmap,strPngPathAndName+QString::number(m)+".png",itempSpace); //bigOneLongPixmap.save(strPngPathAndName+QString::number(m)+".png","PNG"); } } else { int itempSpace=GetWordSpaceRealInBmp(bigOneLongPixmap); ProcessLastStartEndLianJie(bigOneLongPixmap,strPngPathAndName+QString::number(m)+".png",itempSpace); //bigOneLongPixmap.save(strPngPathAndName+QString::number(m)+".png","PNG"); } iIOffset=i+1; break; } else { pPainterTemp->end(); delete pPainterTemp; } } } } } void EText::ProcessLastStartEndLianJie(QPixmap bmp,QString strPngFilePathName,int iLastRightNoWordWidth) { QImage tempQImage=bmp.toImage(); int iWidth = bmp.width(); for (int x=iWidth-1;x>0;x--) { for(int y=0;ybegin(&returnBmp); pPainterTemp->drawPixmap(bmp.rect(),bmp,bmp.rect()); pPainterTemp->end(); if(m_attr.rolling.headTailConnected) { if(returnBmp.width()>=rect().width())//如果图片的宽大于区域的宽 { returnBmp.save(strPngFilePathName,"PNG"); } else { int iBeiShu=rect().width()/returnBmp.width(); int iTempWidth=returnBmp.width(); QPixmap returnNewBmp(iTempWidth*(iBeiShu+1),bmp.height()); returnNewBmp.fill(m_ImageBkColor); QPainter painter; painter.begin(&returnNewBmp); for (int ii=0;ii=rect().width())//如果图片的宽大于区域的宽 { returnBmp.save(strPngFilePathName,"PNG"); } else { int iTempWidth=returnBmp.width(); QPixmap returnNewBmp(rect().width(),bmp.height()); returnNewBmp.fill(m_ImageBkColor); QPainter painter; painter.begin(&returnNewBmp); QBrush bshBackground = Tools::getBrush(m_attr.cBackground); painter.fillRect(returnNewBmp.rect(),bshBackground); QRect tempRc(0,0,iTempWidth,returnBmp.height()); painter.drawPixmap(tempRc,returnBmp,returnBmp.rect()); returnNewBmp.save(strPngFilePathName,"PNG"); } } delete pPainterTemp; return; } } } } int EText::GetWordSpaceRealInBmp(QPixmap bmp) { QImage tempQImage=bmp.toImage(); // m_ImageBkColor=tempQImage.pixelColor(0,0); int iWidth= bmp.width(); int iLastX = iWidth; int iCount=0; for (int x=iWidth-1;x>0;x--) { int iAllSameFlag=0; for(int y=0;ydiv{color:#fff; line-height:"+QString::number(lineH)+"px; white-space:pre-wrap;}
"+m_attr.text+"
"); int iwidth = innerRect().width(); QRectF OutPutBmpRect(0, 0, iwidth, doc.size().height());//实际绘制文本的矩形大小 int iheight = OutPutBmpRect.toRect().height(); QPixmap map(iwidth,iheight); map.fill(m_attr.cBackground); QPainter painter; painter.begin(&map); doc.drawContents(&painter, OutPutBmpRect); painter.end(); QPixmap pRenderPixmap = QPixmap(rect().size().toSize()); pRenderPixmap.fill(m_attr.cBackground); painter.begin(&pRenderPixmap); if(rect().height()>map.height()) { QBrush bshBackground = Tools::getBrush(m_attr.cBackground); if(bshBackground != Qt::NoBrush) painter.fillRect(0,map.height(),rect().width(),rect().height()-map.height(), bshBackground); painter.drawPixmap(map.rect(),map,map.rect()); pRenderPixmap.save(strPngPathAndName); } else { QRectF rectSource(0,0,rect().width(),rect().height()); painter.drawPixmap(rect(),map,rectSource); map.copy(OutPutBmpRect.toRect()).save(strPngPathAndName); } painter.end(); } //生成翻页和静态图片素材 void EText::MakeMuliPngToDir(int iPageIndex,QString strPngPathAndName){ iPageIndex=iPageIndex-1; if(iPageIndex<0) iPageIndex=0; if(iPageIndex>=0){ if(m_list.count()>0&&iPageIndex