diff --git a/app/common/html.cpp b/app/common/html.cpp
index b8c08fb26..d9ad84a28 100644
--- a/app/common/html.cpp
+++ b/app/common/html.cpp
@@ -142,7 +142,7 @@ void Html::WriteBlock(QXmlStreamWriter *writer, const QTextBlock &block)
if (!(fmt.alignment() & Qt::AlignLeft)) {
if (fmt.alignment() & Qt::AlignRight) {
writer->writeAttribute(QStringLiteral("align"), QStringLiteral("right"));
- } else if (fmt.alignment() & Qt::AlignCenter) {
+ } else if (fmt.alignment() & Qt::AlignHCenter) {
writer->writeAttribute(QStringLiteral("align"), QStringLiteral("center"));
} else if (fmt.alignment() & Qt::AlignJustify) {
writer->writeAttribute(QStringLiteral("align"), QStringLiteral("justify"));
@@ -369,7 +369,7 @@ QTextBlockFormat Html::ReadBlockFormat(const QXmlStreamAttributes &attributes)
if (StrEquals(attr.value(), QStringLiteral("right"))) {
block_fmt.setAlignment(Qt::AlignRight);
} else if (StrEquals(attr.value(), QStringLiteral("center"))) {
- block_fmt.setAlignment(Qt::AlignCenter);
+ block_fmt.setAlignment(Qt::AlignHCenter);
} else if (StrEquals(attr.value(), QStringLiteral("justify"))) {
block_fmt.setAlignment(Qt::AlignJustify);
}
diff --git a/app/common/qtutils.cpp b/app/common/qtutils.cpp
index 613f8a5e9..0a750810c 100644
--- a/app/common/qtutils.cpp
+++ b/app/common/qtutils.cpp
@@ -43,7 +43,7 @@ QFrame *QtUtils::CreateHorizontalLine()
QFrame *QtUtils::CreateVerticalLine()
{
QFrame *l = CreateHorizontalLine();
- l->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding);
+ l->setFrameShape(QFrame::VLine);
return l;
}
diff --git a/app/ui/icons/icons.cpp b/app/ui/icons/icons.cpp
index 85288cb6b..3f4fdaa95 100644
--- a/app/ui/icons/icons.cpp
+++ b/app/ui/icons/icons.cpp
@@ -75,6 +75,9 @@ QIcon icon::TextAlignLeft;
QIcon icon::TextAlignRight;
QIcon icon::TextAlignCenter;
QIcon icon::TextAlignJustify;
+QIcon icon::TextAlignTop;
+QIcon icon::TextAlignBottom;
+QIcon icon::TextAlignMiddle;
QIcon icon::Snapping;
QIcon icon::ZoomIn;
QIcon icon::ZoomOut;
@@ -145,6 +148,9 @@ void icon::LoadAll(const QString& theme)
TextAlignRight = Create(theme, "align-right");
TextAlignCenter = Create(theme, "align-center");
TextAlignJustify = Create(theme, "align-justify-all");
+ TextAlignTop = Create(theme, "align-left");
+ TextAlignBottom = Create(theme, "align-right");
+ TextAlignMiddle = Create(theme, "align-center");
Snapping = Create(theme, "magnet");
ZoomIn = Create(theme, "zoomin");
diff --git a/app/ui/icons/icons.h b/app/ui/icons/icons.h
index 83a9f18dc..a93ed9483 100644
--- a/app/ui/icons/icons.h
+++ b/app/ui/icons/icons.h
@@ -85,6 +85,9 @@ extern QIcon TextAlignLeft;
extern QIcon TextAlignRight;
extern QIcon TextAlignCenter;
extern QIcon TextAlignJustify;
+extern QIcon TextAlignTop;
+extern QIcon TextAlignBottom;
+extern QIcon TextAlignMiddle;
// Miscellaneous Icons
extern QIcon Snapping;
diff --git a/app/widget/viewer/viewertexteditor.cpp b/app/widget/viewer/viewertexteditor.cpp
index 87b254c3c..0fd51ef8c 100644
--- a/app/widget/viewer/viewertexteditor.cpp
+++ b/app/widget/viewer/viewertexteditor.cpp
@@ -313,129 +313,156 @@ ViewerTextEditorToolBar::ViewerTextEditorToolBar(QWidget *parent) :
drag_enabled_(false)
{
QVBoxLayout *outer_layout = new QVBoxLayout(this);
- outer_layout->setSpacing(0);
- QHBoxLayout *basic_layout = new QHBoxLayout();
- outer_layout->addLayout(basic_layout);
+ const int advanced_slider_width = QtUtils::QFontMetricsWidth(fontMetrics(), QStringLiteral("9999.9%"));
- int advanced_slider_width = QtUtils::QFontMetricsWidth(fontMetrics(), QStringLiteral("9999.9%"));
+ {
+ QHBoxLayout *row_layout = new QHBoxLayout();
+ row_layout->setSpacing(0);
+ outer_layout->addLayout(row_layout);
- font_combo_ = new QFontComboBox();
- connect(font_combo_, &QFontComboBox::currentTextChanged, this, &ViewerTextEditorToolBar::UpdateFontStyleListAndEmitFamilyChanged);
- basic_layout->addWidget(font_combo_);
+ font_combo_ = new QFontComboBox();
+ connect(font_combo_, &QFontComboBox::currentTextChanged, this, &ViewerTextEditorToolBar::UpdateFontStyleListAndEmitFamilyChanged);
+ row_layout->addWidget(font_combo_);
- font_sz_slider_ = new FloatSlider();
- font_sz_slider_->SetMinimum(0.1);
- font_sz_slider_->SetMaximum(9999.9);
- font_sz_slider_->SetDecimalPlaces(1);
- font_sz_slider_->SetAlignment(Qt::AlignCenter);
- font_sz_slider_->setFixedWidth(advanced_slider_width);
- connect(font_sz_slider_, &FloatSlider::ValueChanged, this, &ViewerTextEditorToolBar::SizeChanged);
- font_sz_slider_->SetLadderElementCount(2);
- basic_layout->addWidget(font_sz_slider_);
+ font_sz_slider_ = new FloatSlider();
+ font_sz_slider_->SetMinimum(0.1);
+ font_sz_slider_->SetMaximum(9999.9);
+ font_sz_slider_->SetDecimalPlaces(1);
+ font_sz_slider_->SetAlignment(Qt::AlignCenter);
+ font_sz_slider_->setFixedWidth(advanced_slider_width);
+ connect(font_sz_slider_, &FloatSlider::ValueChanged, this, &ViewerTextEditorToolBar::SizeChanged);
+ font_sz_slider_->SetLadderElementCount(2);
+ row_layout->addWidget(font_sz_slider_);
- style_combo_ = new QComboBox();
- connect(style_combo_, &QComboBox::currentTextChanged, this, &ViewerTextEditorToolBar::StyleChanged);
- basic_layout->addWidget(style_combo_);
+ style_combo_ = new QComboBox();
+ connect(style_combo_, &QComboBox::currentTextChanged, this, &ViewerTextEditorToolBar::StyleChanged);
+ row_layout->addWidget(style_combo_);
- underline_btn_ = new QPushButton();
- connect(underline_btn_, &QPushButton::clicked, this, &ViewerTextEditorToolBar::UnderlineChanged);
- underline_btn_->setCheckable(true);
- underline_btn_->setIcon(icon::TextUnderline);
- basic_layout->addWidget(underline_btn_);
+ underline_btn_ = new QPushButton();
+ connect(underline_btn_, &QPushButton::clicked, this, &ViewerTextEditorToolBar::UnderlineChanged);
+ underline_btn_->setCheckable(true);
+ underline_btn_->setIcon(icon::TextUnderline);
+ row_layout->addWidget(underline_btn_);
- strikethrough_btn_ = new QPushButton();
- connect(strikethrough_btn_, &QPushButton::clicked, this, &ViewerTextEditorToolBar::StrikethroughChanged);
- strikethrough_btn_->setCheckable(true);
- strikethrough_btn_->setIcon(icon::TextStrikethrough);
- basic_layout->addWidget(strikethrough_btn_);
+ strikethrough_btn_ = new QPushButton();
+ connect(strikethrough_btn_, &QPushButton::clicked, this, &ViewerTextEditorToolBar::StrikethroughChanged);
+ strikethrough_btn_->setCheckable(true);
+ strikethrough_btn_->setIcon(icon::TextStrikethrough);
+ row_layout->addWidget(strikethrough_btn_);
- basic_layout->addWidget(QtUtils::CreateVerticalLine());
+ AddSpacer(row_layout);
- align_left_btn_ = new QPushButton();
- align_left_btn_->setCheckable(true);
- align_left_btn_->setIcon(icon::TextAlignLeft);
- connect(align_left_btn_, &QPushButton::clicked, this, [this]{emit AlignmentChanged(Qt::AlignLeft);});
- basic_layout->addWidget(align_left_btn_);
+ color_btn_ = new QPushButton();
+ color_btn_->setAutoFillBackground(true);
+ connect(color_btn_, &QPushButton::clicked, this, [this]{
+ QColor c = color_btn_->property("color").value();
- align_center_btn_ = new QPushButton();
- align_center_btn_->setCheckable(true);
- align_center_btn_->setIcon(icon::TextAlignCenter);
- connect(align_center_btn_, &QPushButton::clicked, this, [this]{emit AlignmentChanged(Qt::AlignCenter);});
- basic_layout->addWidget(align_center_btn_);
+ QColorDialog cd(c, this);
+ if (cd.exec() == QDialog::Accepted) {
+ c = cd.selectedColor();
+ SetColor(c);
+ emit ColorChanged(c);
+ }
+ });
+ row_layout->addWidget(color_btn_);
- align_right_btn_ = new QPushButton();
- align_right_btn_->setCheckable(true);
- align_right_btn_->setIcon(icon::TextAlignRight);
- connect(align_right_btn_, &QPushButton::clicked, this, [this]{emit AlignmentChanged(Qt::AlignRight);});
- basic_layout->addWidget(align_right_btn_);
+ row_layout->addStretch();
+ }
- align_justify_btn_ = new QPushButton();
- align_justify_btn_->setCheckable(true);
- align_justify_btn_->setIcon(icon::TextAlignJustify);
- connect(align_justify_btn_, &QPushButton::clicked, this, [this]{emit AlignmentChanged(Qt::AlignJustify);});
- basic_layout->addWidget(align_justify_btn_);
+ {
+ QHBoxLayout *row_layout = new QHBoxLayout();
+ row_layout->setSpacing(0);
+ outer_layout->addLayout(row_layout);
- basic_layout->addWidget(QtUtils::CreateVerticalLine());
+ align_left_btn_ = new QPushButton();
+ align_left_btn_->setCheckable(true);
+ align_left_btn_->setIcon(icon::TextAlignLeft);
+ connect(align_left_btn_, &QPushButton::clicked, this, [this]{emit AlignmentChanged(Qt::AlignLeft);});
+ row_layout->addWidget(align_left_btn_);
- color_btn_ = new QPushButton();
- color_btn_->setAutoFillBackground(true);
- connect(color_btn_, &QPushButton::clicked, this, [this]{
- QColor c = color_btn_->property("color").value();
+ align_center_btn_ = new QPushButton();
+ align_center_btn_->setCheckable(true);
+ align_center_btn_->setIcon(icon::TextAlignCenter);
+ connect(align_center_btn_, &QPushButton::clicked, this, [this]{emit AlignmentChanged(Qt::AlignHCenter);});
+ row_layout->addWidget(align_center_btn_);
- QColorDialog cd(c, this);
- if (cd.exec() == QDialog::Accepted) {
- c = cd.selectedColor();
- SetColor(c);
- emit ColorChanged(c);
- }
- });
- basic_layout->addWidget(color_btn_);
+ align_right_btn_ = new QPushButton();
+ align_right_btn_->setCheckable(true);
+ align_right_btn_->setIcon(icon::TextAlignRight);
+ connect(align_right_btn_, &QPushButton::clicked, this, [this]{emit AlignmentChanged(Qt::AlignRight);});
+ row_layout->addWidget(align_right_btn_);
- basic_layout->addStretch();
+ align_justify_btn_ = new QPushButton();
+ align_justify_btn_->setCheckable(true);
+ align_justify_btn_->setIcon(icon::TextAlignJustify);
+ connect(align_justify_btn_, &QPushButton::clicked, this, [this]{emit AlignmentChanged(Qt::AlignJustify);});
+ row_layout->addWidget(align_justify_btn_);
- QHBoxLayout *advanced_layout = new QHBoxLayout();
- outer_layout->addLayout(advanced_layout);
+ AddSpacer(row_layout);
- advanced_layout->addWidget(new QLabel(tr("Stretch: "))); // FIXME: Procure icon
+ align_top_btn_ = new QPushButton();
+ align_top_btn_->setCheckable(true);
+ align_top_btn_->setIcon(icon::TextAlignTop);
+ connect(align_top_btn_, &QPushButton::clicked, this, [this]{emit VerticalAlignmentChanged(Qt::AlignTop);});
+ row_layout->addWidget(align_top_btn_);
- stretch_slider_ = new IntegerSlider();
- stretch_slider_->SetMinimum(0);
- stretch_slider_->SetDefaultValue(100);
- stretch_slider_->setFixedWidth(advanced_slider_width);
- stretch_slider_->SetFormat(tr("%1%"));
- connect(stretch_slider_, &IntegerSlider::ValueChanged, this, &ViewerTextEditorToolBar::StretchChanged);
- advanced_layout->addWidget(stretch_slider_);
+ align_middle_btn_ = new QPushButton();
+ align_middle_btn_->setCheckable(true);
+ align_middle_btn_->setIcon(icon::TextAlignMiddle);
+ connect(align_middle_btn_, &QPushButton::clicked, this, [this]{emit VerticalAlignmentChanged(Qt::AlignVCenter);});
+ row_layout->addWidget(align_middle_btn_);
- advanced_layout->addWidget(new QLabel(tr("Kerning: "))); // FIXME: Procure icon
+ align_bottom_btn_ = new QPushButton();
+ align_bottom_btn_->setCheckable(true);
+ align_bottom_btn_->setIcon(icon::TextAlignBottom);
+ connect(align_bottom_btn_, &QPushButton::clicked, this, [this]{emit VerticalAlignmentChanged(Qt::AlignBottom);});
+ row_layout->addWidget(align_bottom_btn_);
- kerning_slider_ = new FloatSlider();
- kerning_slider_->SetMinimum(0);
- kerning_slider_->SetDefaultValue(100);
- kerning_slider_->SetDecimalPlaces(1);
- kerning_slider_->setFixedWidth(advanced_slider_width);
- kerning_slider_->SetFormat(tr("%1%"));
- connect(kerning_slider_, &FloatSlider::ValueChanged, this, &ViewerTextEditorToolBar::KerningChanged);
- advanced_layout->addWidget(kerning_slider_);
+ AddSpacer(row_layout);
- advanced_layout->addWidget(new QLabel(tr("Line Height: "))); // FIXME: Procure icon
+ small_caps_btn_ = new QPushButton();
+ small_caps_btn_->setIcon(icon::TextSmallCaps);
+ small_caps_btn_->setCheckable(true);
+ connect(small_caps_btn_, &QPushButton::clicked, this, &ViewerTextEditorToolBar::SmallCapsChanged);
+ row_layout->addWidget(small_caps_btn_);
- line_height_slider_ = new FloatSlider();
- line_height_slider_->SetMinimum(0);
- line_height_slider_->SetDefaultValue(100);
- line_height_slider_->SetDecimalPlaces(1);
- line_height_slider_->setFixedWidth(advanced_slider_width);
- line_height_slider_->SetFormat(tr("%1%"));
- connect(line_height_slider_, &FloatSlider::ValueChanged, this, &ViewerTextEditorToolBar::LineHeightChanged);
- advanced_layout->addWidget(line_height_slider_);
+ AddSpacer(row_layout);
- small_caps_btn_ = new QPushButton();
- small_caps_btn_->setIcon(icon::TextSmallCaps);
- small_caps_btn_->setCheckable(true);
- connect(small_caps_btn_, &QPushButton::clicked, this, &ViewerTextEditorToolBar::SmallCapsChanged);
- advanced_layout->addWidget(small_caps_btn_);
+ row_layout->addWidget(new QLabel(tr("Stretch: "))); // FIXME: Procure icon
- advanced_layout->addStretch();
+ stretch_slider_ = new IntegerSlider();
+ stretch_slider_->SetMinimum(0);
+ stretch_slider_->SetDefaultValue(100);
+ stretch_slider_->setFixedWidth(advanced_slider_width);
+ stretch_slider_->SetFormat(tr("%1%"));
+ connect(stretch_slider_, &IntegerSlider::ValueChanged, this, &ViewerTextEditorToolBar::StretchChanged);
+ row_layout->addWidget(stretch_slider_);
+
+ row_layout->addWidget(new QLabel(tr("Kerning: "))); // FIXME: Procure icon
+
+ kerning_slider_ = new FloatSlider();
+ kerning_slider_->SetMinimum(0);
+ kerning_slider_->SetDefaultValue(100);
+ kerning_slider_->SetDecimalPlaces(1);
+ kerning_slider_->setFixedWidth(advanced_slider_width);
+ kerning_slider_->SetFormat(tr("%1%"));
+ connect(kerning_slider_, &FloatSlider::ValueChanged, this, &ViewerTextEditorToolBar::KerningChanged);
+ row_layout->addWidget(kerning_slider_);
+
+ row_layout->addWidget(new QLabel(tr("Line Height: "))); // FIXME: Procure icon
+
+ line_height_slider_ = new FloatSlider();
+ line_height_slider_->SetMinimum(0);
+ line_height_slider_->SetDefaultValue(100);
+ line_height_slider_->SetDecimalPlaces(1);
+ line_height_slider_->setFixedWidth(advanced_slider_width);
+ line_height_slider_->SetFormat(tr("%1%"));
+ connect(line_height_slider_, &FloatSlider::ValueChanged, this, &ViewerTextEditorToolBar::LineHeightChanged);
+ row_layout->addWidget(line_height_slider_);
+
+ row_layout->addStretch();
+ }
setAutoFillBackground(true);
@@ -445,7 +472,7 @@ ViewerTextEditorToolBar::ViewerTextEditorToolBar(QWidget *parent) :
void ViewerTextEditorToolBar::SetAlignment(Qt::Alignment a)
{
align_left_btn_->setChecked(a == Qt::AlignLeft);
- align_center_btn_->setChecked(a == Qt::AlignCenter);
+ align_center_btn_->setChecked(a == Qt::AlignHCenter);
align_right_btn_->setChecked(a == Qt::AlignRight);
align_justify_btn_->setChecked(a == Qt::AlignJustify);
}
@@ -470,6 +497,20 @@ void ViewerTextEditorToolBar::paintEvent(QPaintEvent *event)
QWidget::paintEvent(event);
}
+void ViewerTextEditorToolBar::AddSpacer(QLayout *l)
+{
+ const int spacing = this->fontMetrics().height()/4;
+ QWidget *a = new QWidget();
+ a->setFixedSize(spacing, 1);
+ l->addWidget(a);
+
+ l->addWidget(QtUtils::CreateVerticalLine());
+
+ QWidget *b = new QWidget();
+ b->setFixedSize(spacing, 1);
+ l->addWidget(b);
+}
+
void ViewerTextEditorToolBar::UpdateFontStyleList(const QString &family)
{
QString temp = style_combo_->currentText();
diff --git a/app/widget/viewer/viewertexteditor.h b/app/widget/viewer/viewertexteditor.h
index 3f352b122..4abd300b4 100644
--- a/app/widget/viewer/viewertexteditor.h
+++ b/app/widget/viewer/viewertexteditor.h
@@ -81,6 +81,7 @@ signals:
void UnderlineChanged(bool e);
void StrikethroughChanged(bool e);
void AlignmentChanged(Qt::Alignment alignment);
+ void VerticalAlignmentChanged(Qt::Alignment alignment);
void ColorChanged(const QColor &c);
void SmallCapsChanged(bool e);
void StretchChanged(int i);
@@ -101,6 +102,8 @@ protected:
virtual void paintEvent(QPaintEvent *event) override;
private:
+ void AddSpacer(QLayout *l);
+
QPoint drag_anchor_;
QFontComboBox *font_combo_;
@@ -117,6 +120,10 @@ private:
QPushButton *align_right_btn_;
QPushButton *align_justify_btn_;
+ QPushButton *align_top_btn_;
+ QPushButton *align_middle_btn_;
+ QPushButton *align_bottom_btn_;
+
IntegerSlider *stretch_slider_;
FloatSlider *kerning_slider_;
FloatSlider *line_height_slider_;