diff --git a/src/qml/filters/richtext/vui.qml b/src/qml/filters/richtext/vui.qml index 9b88a4a935..68e2bb87f6 100644 --- a/src/qml/filters/richtext/vui.qml +++ b/src/qml/filters/richtext/vui.qml @@ -331,6 +331,7 @@ Shotcut.VuiBase { icon.source: 'qrc:///icons/oxygen/32x32/actions/font.png' onTriggered: { fontDialog.selectedFont.family = document.fontFamily; + fontDialog.selectedFont.styleName = document.fontStyleName; fontDialog.selectedFont.pointSize = document.fontSize; fontDialog.selectedFont.underline = document.underline; fontDialog.selectedFont.strikeout = document.strikeout; @@ -672,7 +673,8 @@ Shotcut.VuiBase { icon.source: 'qrc:///icons/oxygen/32x32/actions/font.png' onTriggered: { fontDialog.selectedFont.family = document.fontFamily; - fontDialog.seelctedFont.pointSize = document.fontSize; + fontDialog.selectedFont.styleName = document.fontStyleName; + fontDialog.selectedFont.pointSize = document.fontSize; fontDialog.selectedFont.underline = document.underline; fontDialog.selectedFont.strikeout = document.strikeout; fontDialog.open(); @@ -714,6 +716,7 @@ Shotcut.VuiBase { onAccepted: { document.fontFamily = selectedFont.family; + document.fontStyleName = selectedFont.styleName; document.fontSize = selectedFont.pointSize; document.underline = selectedFont.underline; document.strikeout = selectedFont.strikeout; diff --git a/src/qml/modules/Shotcut/Controls/TextFilterUi.qml b/src/qml/modules/Shotcut/Controls/TextFilterUi.qml index 0f72badbf7..69a633a846 100644 --- a/src/qml/modules/Shotcut/Controls/TextFilterUi.qml +++ b/src/qml/modules/Shotcut/Controls/TextFilterUi.qml @@ -74,17 +74,25 @@ GridLayout { function refreshFontButton() { var s = filter.get('family'); - if (filter.getDouble('weight') > Font.Medium) - s += ' ' + qsTr('Bold'); - if (filter.get('style') === 'italic') - s += ' ' + qsTr('Italic'); + const style = filter.get('style'); + if (style && style !== 'italic' && style !== 'normal') { + s += ' ' + style; + } else { + if (filter.getDouble('weight') > Font.Medium) + s += ' ' + qsTr('Bold'); + if (style === 'italic') + s += ' ' + qsTr('Italic'); + } if (parseInt(filter.get(useFontSizeProperty))) s += ' ' + getPointSize(); fontButton.text = s; } function setControls() { - fontButton.text = filter.get('family'); + const mltFamily = filter.get('family') || ""; + const mltStyle = filter.get('style') || ""; + const fontStyleName = (mltStyle && mltStyle !== 'italic' && mltStyle !== 'normal') ? mltStyle : ""; + fontButton.text = mltFamily; outlineSpinner.value = filter.getDouble('outline'); padSpinner.value = filter.getDouble('pad'); var align = filter.get(halignProperty); @@ -102,9 +110,10 @@ GridLayout { else if (align === 'bottom') bottomRadioButton.checked = true; fontDialog.selectedFont = Qt.font({ - "family": filter.get('family'), + "family": mltFamily, + "styleName": fontStyleName, "pointSize": getPointSize(), - "italic": filter.get('style') === 'italic', + "italic": mltStyle === 'italic', "weight": filter.getDouble('weight'), "underline": filter.getDouble('underline'), "strikeout": filter.getDouble('strikethrough') @@ -244,11 +253,18 @@ GridLayout { id: fontDialog property string fontFamily: '' + property string fontStyle: '' + readonly property var stdStyles: ['', 'regular', 'bold', 'italic', 'bold italic', 'oblique', 'bold oblique'] onSelectedFontChanged: { + const styleName = selectedFont.styleName; + if (styleName && !stdStyles.includes(styleName.toLowerCase())) { + filter.set('style', styleName); + } else { + filter.set('style', selectedFont.italic ? 'italic' : 'normal'); + } filter.set('family', selectedFont.family); filter.set('weight', selectedFont.weight); - filter.set('style', selectedFont.italic ? 'italic' : 'normal'); filter.set('underline', selectedFont.underline); filter.set('strikethrough', selectedFont.strikeout); if (parseInt(filter.get(useFontSizeProperty))) { @@ -257,9 +273,13 @@ GridLayout { } refreshFontButton(); } - onAccepted: fontFamily = selectedFont.family + onAccepted: { + fontFamily = selectedFont.family; + fontStyle = filter.get('style'); + } onRejected: { filter.set('family', fontFamily); + filter.set('style', fontStyle); refreshFontButton(); } } diff --git a/src/qmltypes/qmlrichtext.cpp b/src/qmltypes/qmlrichtext.cpp index d3414b90d8..eb58a4a937 100644 --- a/src/qmltypes/qmlrichtext.cpp +++ b/src/qmltypes/qmlrichtext.cpp @@ -236,6 +236,7 @@ void QmlRichText::setCursorPosition(int position) void QmlRichText::reset() { emit fontFamilyChanged(); + emit fontStyleNameChanged(); emit alignmentChanged(); emit boldChanged(); emit italicChanged(); @@ -423,3 +424,25 @@ void QmlRichText::setFontFamily(const QString &arg) mergeFormatOnWordOrSelection(format); emit fontFamilyChanged(); } + +QString QmlRichText::fontStyleName() const +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return QString(); + QTextCharFormat format = cursor.charFormat(); + return format.font().styleName(); +} + +void QmlRichText::setFontStyleName(const QString &arg) +{ + QTextCursor cursor = textCursor(); + if (cursor.isNull()) + return; + QTextCharFormat format; + QFont font; + font.setStyleName(arg); + format.setFont(font, QTextCharFormat::FontPropertiesSpecifiedOnly); + mergeFormatOnWordOrSelection(format); + emit fontStyleNameChanged(); +} diff --git a/src/qmltypes/qmlrichtext.h b/src/qmltypes/qmlrichtext.h index b14f6a9899..f8d45697e6 100644 --- a/src/qmltypes/qmlrichtext.h +++ b/src/qmltypes/qmlrichtext.h @@ -56,6 +56,8 @@ class QmlRichText : public QObject Q_PROPERTY(int selectionEnd READ selectionEnd WRITE setSelectionEnd NOTIFY selectionEndChanged) Q_PROPERTY(QColor textColor READ textColor WRITE setTextColor NOTIFY textColorChanged) Q_PROPERTY(QString fontFamily READ fontFamily WRITE setFontFamily NOTIFY fontFamilyChanged) + Q_PROPERTY( + QString fontStyleName READ fontStyleName WRITE setFontStyleName NOTIFY fontStyleNameChanged) Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment NOTIFY alignmentChanged) Q_PROPERTY(bool bold READ bold WRITE setBold NOTIFY boldChanged) Q_PROPERTY(bool italic READ italic WRITE setItalic NOTIFY italicChanged) @@ -78,6 +80,7 @@ class QmlRichText : public QObject int selectionStart() const { return m_selectionStart; } int selectionEnd() const { return m_selectionEnd; } QString fontFamily() const; + QString fontStyleName() const; QColor textColor() const; Qt::Alignment alignment() const; void setAlignment(Qt::Alignment a); @@ -98,6 +101,7 @@ public slots: void setFontSize(int arg); void setTextColor(const QColor &arg); void setFontFamily(const QString &arg); + void setFontStyleName(const QString &arg); void setFileUrl(const QUrl &arg); void setText(const QString &arg); void saveAs(const QUrl &arg, QString fileType = QString()); @@ -113,6 +117,7 @@ public slots: void selectionStartChanged(); void selectionEndChanged(); void fontFamilyChanged(); + void fontStyleNameChanged(); void textColorChanged(); void alignmentChanged(); void boldChanged();