10 #include <QActionGroup>
11 #include <QColorDialog>
16 #include <QResizeEvent>
18 #include <QToolButton>
21 #include "ui_ecvFontPropertyWidget.h"
27 if (
family ==
"Arial")
return 0;
28 if (
family ==
"Courier")
return 1;
29 if (
family ==
"Times")
return 2;
56 m_fontColor(255, 255, 255) {
62 QIcon boldIcon(
":/Resources/images/font/pqBold24.png");
63 if (!boldIcon.isNull()) {
64 ui->boldButton->setIcon(boldIcon);
67 if (ui->italicButton) {
68 QIcon italicIcon(
":/Resources/images/font/pqItalics24.png");
69 if (!italicIcon.isNull()) {
70 ui->italicButton->setIcon(italicIcon);
73 if (ui->shadowButton) {
74 QIcon shadowIcon(
":/Resources/images/font/pqShadow24.png");
75 if (!shadowIcon.isNull()) {
76 ui->shadowButton->setIcon(shadowIcon);
84 QTimer::singleShot(0,
this, [
this]() { updateColorButtonAppearance(); });
87 const QString toggleButtonStyle =
89 " border: 1px solid #999;"
90 " border-radius: 3px;"
92 " background-color: #f0f0f0;"
95 " background-color: #e0e0e0;"
96 " border-color: #666;"
98 "QToolButton:checked {"
99 " background-color: #c0d0e8;"
100 " border-color: #4080c0;"
102 "QToolButton:checked:hover {"
103 " background-color: #a0c0e0;"
106 if (ui->boldButton) ui->boldButton->setStyleSheet(toggleButtonStyle);
107 if (ui->italicButton) ui->italicButton->setStyleSheet(toggleButtonStyle);
108 if (ui->shadowButton) ui->shadowButton->setStyleSheet(toggleButtonStyle);
111 setupHorizontalJustificationButton();
112 setupVerticalJustificationButton();
117 void ecvFontPropertyWidget::setupConnections() {
118 connect(ui->fontFamilyComboBox,
119 QOverload<int>::of(&QComboBox::currentIndexChanged),
this,
120 &ecvFontPropertyWidget::onFontFamilyChanged);
121 connect(ui->fontSizeSpinBox, QOverload<int>::of(&QSpinBox::valueChanged),
122 this, &ecvFontPropertyWidget::onFontSizeChanged);
123 connect(ui->fontColorButton, &QToolButton::clicked,
this,
124 &ecvFontPropertyWidget::onFontColorClicked);
125 connect(ui->fontOpacitySpinBox,
126 QOverload<double>::of(&QDoubleSpinBox::valueChanged),
this,
127 &ecvFontPropertyWidget::onFontOpacityChanged);
128 connect(ui->boldButton, &QToolButton::toggled,
this,
129 &ecvFontPropertyWidget::onBoldToggled);
130 connect(ui->italicButton, &QToolButton::toggled,
this,
131 &ecvFontPropertyWidget::onItalicToggled);
132 connect(ui->shadowButton, &QToolButton::toggled,
this,
133 &ecvFontPropertyWidget::onShadowToggled);
152 m_blockSignals =
true;
162 m_blockSignals =
false;
169 return ui->fontFamilyComboBox ? ui->fontFamilyComboBox->currentText()
174 return ui->fontFamilyComboBox ? ui->fontFamilyComboBox->currentIndex() : 0;
178 return ui->fontSizeSpinBox ? ui->fontSizeSpinBox->value() : 6;
184 return ui->fontOpacitySpinBox ? ui->fontOpacitySpinBox->value() : 1.0;
188 return ui->boldButton ? ui->boldButton->isChecked() :
false;
192 return ui->italicButton ? ui->italicButton->isChecked() :
false;
196 return ui->shadowButton ? ui->shadowButton->isChecked() :
true;
200 return m_horizontalJustification;
204 return m_verticalJustification;
209 if (!ui->fontFamilyComboBox)
return;
211 int index = ui->fontFamilyComboBox->findText(family);
214 ui->fontFamilyComboBox->blockSignals(
true);
216 ui->fontFamilyComboBox->setCurrentIndex(index);
218 ui->fontFamilyComboBox->blockSignals(
false);
224 if (!ui->fontFamilyComboBox)
return;
226 if (index >= 0 && index < ui->fontFamilyComboBox->count()) {
228 ui->fontFamilyComboBox->blockSignals(
true);
230 ui->fontFamilyComboBox->setCurrentIndex(index);
232 ui->fontFamilyComboBox->blockSignals(
false);
238 if (!ui->fontSizeSpinBox)
return;
241 ui->fontSizeSpinBox->blockSignals(
true);
243 ui->fontSizeSpinBox->setValue(
size);
245 ui->fontSizeSpinBox->blockSignals(
false);
251 if (m_fontColor !=
color) {
256 QTimer::singleShot(0,
this,
257 [
this]() { updateColorButtonAppearance(); });
258 if (!blockSignal && !m_blockSignals) {
266 if (!ui->fontOpacitySpinBox)
return;
269 ui->fontOpacitySpinBox->blockSignals(
true);
271 ui->fontOpacitySpinBox->setValue(opacity);
273 ui->fontOpacitySpinBox->blockSignals(
false);
278 if (!ui->boldButton)
return;
281 ui->boldButton->blockSignals(
true);
283 ui->boldButton->setChecked(bold);
285 ui->boldButton->blockSignals(
false);
290 if (!ui->italicButton)
return;
293 ui->italicButton->blockSignals(
true);
295 ui->italicButton->setChecked(italic);
297 ui->italicButton->blockSignals(
false);
302 if (!ui->shadowButton)
return;
305 ui->shadowButton->blockSignals(
true);
307 ui->shadowButton->setChecked(shadow);
309 ui->shadowButton->blockSignals(
false);
314 const QString& justification,
bool blockSignal) {
315 if (m_horizontalJustification != justification) {
316 m_horizontalJustification = justification;
317 updateJustificationButtonIcon(justification,
318 ui->horizontalJustificationButton);
319 if (!blockSignal && !m_blockSignals) {
327 const QString& justification,
bool blockSignal) {
328 if (m_verticalJustification != justification) {
329 m_verticalJustification = justification;
330 updateJustificationButtonIcon(justification,
331 ui->verticalJustificationButton);
332 if (!blockSignal && !m_blockSignals) {
340 if (ui->fontColorButton) {
341 ui->fontColorButton->setVisible(visible);
346 if (ui->fontFamilyComboBox) ui->fontFamilyComboBox->setEnabled(enabled);
347 if (ui->fontSizeSpinBox) ui->fontSizeSpinBox->setEnabled(enabled);
348 if (ui->fontColorButton) ui->fontColorButton->setEnabled(enabled);
349 if (ui->fontOpacitySpinBox) ui->fontOpacitySpinBox->setEnabled(enabled);
350 if (ui->boldButton) ui->boldButton->setEnabled(enabled);
351 if (ui->italicButton) ui->italicButton->setEnabled(enabled);
352 if (ui->shadowButton) ui->shadowButton->setEnabled(enabled);
355 void ecvFontPropertyWidget::onFontFamilyChanged(
int index) {
356 if (!m_blockSignals) {
363 void ecvFontPropertyWidget::onFontSizeChanged(
int size) {
364 if (!m_blockSignals) {
370 void ecvFontPropertyWidget::onFontColorClicked() {
372 QColorDialog::getColor(m_fontColor,
this, tr(
"Select Font Color"));
373 if (newColor.isValid() && newColor != m_fontColor) {
378 void ecvFontPropertyWidget::onFontOpacityChanged(
double opacity) {
379 if (!m_blockSignals) {
385 void ecvFontPropertyWidget::onBoldToggled(
bool checked) {
386 if (!m_blockSignals) {
392 void ecvFontPropertyWidget::onItalicToggled(
bool checked) {
393 if (!m_blockSignals) {
399 void ecvFontPropertyWidget::onShadowToggled(
bool checked) {
400 if (!m_blockSignals) {
408 QWidget::resizeEvent(
event);
411 updateColorButtonAppearance();
414 void ecvFontPropertyWidget::updateColorButtonAppearance() {
415 if (!ui->fontColorButton)
return;
418 ui->fontColorButton->updateGeometry();
422 int buttonHeight = ui->fontColorButton->height();
423 if (buttonHeight <= 0) {
425 ui->fontColorButton->adjustSize();
426 buttonHeight = ui->fontColorButton->height();
428 if (buttonHeight <= 0) {
429 buttonHeight = ui->fontColorButton->sizeHint().height();
431 if (buttonHeight <= 0) {
438 int radius = qRound(buttonHeight * 0.75);
439 radius = std::max(radius, 10);
443 QPixmap pix(radius, radius);
444 pix.fill(QColor(0, 0, 0, 0));
446 QPainter painter(&pix);
447 painter.setRenderHint(QPainter::Antialiasing,
true);
448 painter.setBrush(QBrush(m_fontColor));
449 painter.drawEllipse(1, 1, radius - 2, radius - 2);
455 QPixmap pix2x(radius * 2, radius * 2);
456 pix2x.setDevicePixelRatio(2.0);
457 pix2x.fill(QColor(0, 0, 0, 0));
459 QPainter painter2x(&pix2x);
460 painter2x.setRenderHint(QPainter::Antialiasing,
true);
461 painter2x.setBrush(QBrush(m_fontColor));
463 painter2x.drawEllipse(2, 2, radius - 4, radius - 4);
466 icon.addPixmap(pix2x);
468 ui->fontColorButton->setIcon(icon);
472 ui->fontColorButton->setIconSize(QSize(radius, radius));
477 int minWidth = radius * 2 + 6;
478 if (ui->fontColorButton->minimumWidth() < minWidth) {
479 ui->fontColorButton->setMinimumWidth(minWidth);
483 void ecvFontPropertyWidget::setupHorizontalJustificationButton() {
484 if (!ui->horizontalJustificationButton)
return;
486 QActionGroup* actionGroup =
new QActionGroup(
this);
487 actionGroup->setExclusive(
true);
491 new QAction(QIcon(
":/Resources/images/font/pqTextAlignLeft.svg"),
492 tr(
"Left"), actionGroup);
493 leftAlign->setIconVisibleInMenu(
true);
495 QAction* centerAlign =
496 new QAction(QIcon(
":/Resources/images/font/pqTextAlignCenter.svg"),
497 tr(
"Center"), actionGroup);
498 centerAlign->setIconVisibleInMenu(
true);
500 QAction* rightAlign =
501 new QAction(QIcon(
":/Resources/images/font/pqTextAlignRight.svg"),
502 tr(
"Right"), actionGroup);
503 rightAlign->setIconVisibleInMenu(
true);
505 QMenu* popup =
new QMenu(
this);
506 popup->addAction(leftAlign);
507 popup->addAction(centerAlign);
508 popup->addAction(rightAlign);
509 ui->horizontalJustificationButton->setMenu(popup);
511 connect(actionGroup, &QActionGroup::triggered,
this,
512 &ecvFontPropertyWidget::onHorizontalJustificationTriggered);
515 updateJustificationButtonIcon(
"Left", ui->horizontalJustificationButton);
518 void ecvFontPropertyWidget::setupVerticalJustificationButton() {
519 if (!ui->verticalJustificationButton)
return;
521 QActionGroup* actionGroup =
new QActionGroup(
this);
522 actionGroup->setExclusive(
true);
525 QAction* topAlign =
new QAction(
526 QIcon(
":/Resources/images/font/pqTextVerticalAlignTop.svg"),
527 tr(
"Top"), actionGroup);
528 topAlign->setIconVisibleInMenu(
true);
530 QAction* centerAlign =
new QAction(
531 QIcon(
":/Resources/images/font/pqTextVerticalAlignCenter.svg"),
532 tr(
"Center"), actionGroup);
533 centerAlign->setIconVisibleInMenu(
true);
535 QAction* bottomAlign =
new QAction(
536 QIcon(
":/Resources/images/font/pqTextVerticalAlignBottom.svg"),
537 tr(
"Bottom"), actionGroup);
538 bottomAlign->setIconVisibleInMenu(
true);
540 QMenu* popup =
new QMenu(
this);
541 popup->addAction(topAlign);
542 popup->addAction(centerAlign);
543 popup->addAction(bottomAlign);
544 ui->verticalJustificationButton->setMenu(popup);
546 connect(actionGroup, &QActionGroup::triggered,
this,
547 &ecvFontPropertyWidget::onVerticalJustificationTriggered);
550 updateJustificationButtonIcon(
"Bottom", ui->verticalJustificationButton);
553 void ecvFontPropertyWidget::updateJustificationButtonIcon(
554 const QString& justification, QToolButton* button) {
555 if (!button || !button->menu())
return;
557 QList<QAction*> actions = button->menu()->actions();
558 for (QAction* action : actions) {
559 if (action->text() == justification) {
560 QIcon icon = action->icon();
561 if (!icon.isNull()) {
562 button->setIcon(icon);
565 button->setText(justification.left(1));
572 void ecvFontPropertyWidget::onHorizontalJustificationTriggered(
574 QString justification = action->text();
578 void ecvFontPropertyWidget::onVerticalJustificationTriggered(QAction* action) {
579 QString justification = action->text();