diff options
author | Caolán McNamara <caolanm@redhat.com> | 2020-09-03 16:24:33 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2020-09-10 20:51:10 +0200 |
commit | 265f95d9a316b1ecfee21a01d46d04cc6eadee7b (patch) | |
tree | d9db6bf969be3c688731ff4bf865ea66b0de0fe5 /vcl | |
parent | 7c38fa04c70401d84352e8ae7ca650dfcc74b3e0 (diff) |
support attempting to set a foreground color for labels and textviews
but try to discourage use of random colors
Change-Id: I1a67956846b8bd056180b37547ca7d206970c0e5
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/102014
Tested-by: Jenkins
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/salvtables.hxx | 4 | ||||
-rw-r--r-- | vcl/source/app/salvtables.cxx | 16 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 43 |
3 files changed, 59 insertions, 4 deletions
diff --git a/vcl/inc/salvtables.hxx b/vcl/inc/salvtables.hxx index d82e1e5087f6..ac856598768e 100644 --- a/vcl/inc/salvtables.hxx +++ b/vcl/inc/salvtables.hxx @@ -407,6 +407,8 @@ public: virtual void set_label_type(weld::LabelType eType) override; virtual void set_font(const vcl::Font& rFont) override; + + virtual void set_font_color(const Color& rColor) override; }; class SalInstanceContainer : public SalInstanceWidget, public virtual weld::Container @@ -1276,6 +1278,8 @@ public: virtual void set_monospace(bool bMonospace) override; + virtual void set_font_color(const Color& rColor) override; + virtual void connect_cursor_position(const Link<TextView&, void>& rLink) override; virtual bool can_move_cursor_with_up() const override; diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index 16436ad0a666..0343347cde96 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -5547,6 +5547,14 @@ void SalInstanceLabel::set_label_type(weld::LabelType eType) } } +void SalInstanceLabel::set_font_color(const Color& rColor) +{ + if (rColor != COL_AUTO) + m_xLabel->SetControlForeground(rColor); + else + m_xLabel->SetControlForeground(); +} + void SalInstanceLabel::set_font(const vcl::Font& rFont) { m_xLabel->SetPointFont(*m_xLabel, rFont); @@ -5623,6 +5631,14 @@ void SalInstanceTextView::set_monospace(bool bMonospace) m_xTextView->SetControlFont(aFont); } +void SalInstanceTextView::set_font_color(const Color& rColor) +{ + if (rColor != COL_AUTO) + m_xTextView->SetControlForeground(rColor); + else + m_xTextView->SetControlForeground(); +} + void SalInstanceTextView::connect_cursor_position(const Link<TextView&, void>& rLink) { assert(!m_aCursorPositionHdl.IsSet()); diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index 5e7f09c22a76..693200c6349a 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -12556,7 +12556,7 @@ private: pango_attr_list_unref(pAttrs); } - void set_bold_text_foreground_color(const Color& rColor) + void set_text_foreground_color(const Color& rColor, bool bSetBold) { guint16 nRed = rColor.GetRed() << 8; guint16 nGreen = rColor.GetRed() << 8; @@ -12564,14 +12564,19 @@ private: PangoAttrType aFilterAttrs[] = {PANGO_ATTR_FOREGROUND, PANGO_ATTR_WEIGHT, PANGO_ATTR_INVALID}; + if (!bSetBold) + aFilterAttrs[1] = PANGO_ATTR_INVALID; + PangoAttrList* pOrigList = gtk_label_get_attributes(m_pLabel); PangoAttrList* pAttrs = pOrigList ? pango_attr_list_filter(pOrigList, filter_pango_attrs, &aFilterAttrs) : nullptr; if (!pAttrs) pAttrs = pango_attr_list_new(); - pango_attr_list_insert(pAttrs, pango_attr_foreground_new(nRed, nGreen, nBlue)); - pango_attr_list_insert(pAttrs, pango_attr_weight_new(PANGO_WEIGHT_BOLD)); + if (rColor != COL_AUTO) + pango_attr_list_insert(pAttrs, pango_attr_foreground_new(nRed, nGreen, nBlue)); + if (bSetBold) + pango_attr_list_insert(pAttrs, pango_attr_weight_new(PANGO_WEIGHT_BOLD)); gtk_label_set_attributes(m_pLabel, pAttrs); pango_attr_list_unref(pAttrs); } @@ -12614,17 +12619,23 @@ public: set_text_background_color(Application::GetSettings().GetStyleSettings().GetHighlightColor()); break; case weld::LabelType::Title: - set_bold_text_foreground_color(Application::GetSettings().GetStyleSettings().GetLightColor()); + set_text_foreground_color(Application::GetSettings().GetStyleSettings().GetLightColor(), true); break; } } virtual void set_font(const vcl::Font& rFont) override { + // TODO, clear old props like set_text_foreground_color does PangoAttrList* pAttrList = create_attr_list(rFont); gtk_label_set_attributes(m_pLabel, pAttrList); pango_attr_list_unref(pAttrList); } + + virtual void set_font_color(const Color& rColor) override + { + set_text_foreground_color(rColor, false); + } }; } @@ -12645,6 +12656,7 @@ private: GtkTextView* m_pTextView; GtkTextBuffer* m_pTextBuffer; GtkAdjustment* m_pVAdjustment; + GtkCssProvider* m_pFgCssProvider; int m_nMaxTextLength; gulong m_nChangedSignalId; // we don't disable/enable this one, it's to implement max-length gulong m_nInsertTextSignalId; @@ -12733,6 +12745,7 @@ public: , m_pTextView(pTextView) , m_pTextBuffer(gtk_text_view_get_buffer(pTextView)) , m_pVAdjustment(gtk_scrollable_get_vadjustment(GTK_SCROLLABLE(pTextView))) + , m_pFgCssProvider(nullptr) , m_nMaxTextLength(0) , m_nChangedSignalId(g_signal_connect(m_pTextBuffer, "changed", G_CALLBACK(signalChanged), this)) , m_nInsertTextSignalId(g_signal_connect_after(m_pTextBuffer, "insert-text", G_CALLBACK(signalInserText), this)) @@ -12823,6 +12836,28 @@ public: gtk_text_view_set_monospace(m_pTextView, bMonospace); } + virtual void set_font_color(const Color& rColor) override + { + const bool bRemoveColor = rColor == COL_AUTO; + if (bRemoveColor && !m_pFgCssProvider) + return; + GtkStyleContext *pWidgetContext = gtk_widget_get_style_context(GTK_WIDGET(m_pTextView)); + if (m_pFgCssProvider) + { + gtk_style_context_remove_provider(pWidgetContext, GTK_STYLE_PROVIDER(m_pFgCssProvider)); + m_pFgCssProvider = nullptr; + } + if (bRemoveColor) + return; + OUString sColor = rColor.AsRGBHexString(); + m_pFgCssProvider = gtk_css_provider_new(); + OUString aBuffer = "textview text { color: #" + sColor + "; }"; + OString aResult = OUStringToOString(aBuffer, RTL_TEXTENCODING_UTF8); + gtk_css_provider_load_from_data(m_pFgCssProvider, aResult.getStr(), aResult.getLength(), nullptr); + gtk_style_context_add_provider(pWidgetContext, GTK_STYLE_PROVIDER(m_pFgCssProvider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); + } + virtual void disable_notify_events() override { g_signal_handler_block(m_pVAdjustment, m_nVAdjustChangedSignalId); |