summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2020-09-03 16:24:33 +0100
committerCaolán McNamara <caolanm@redhat.com>2020-09-10 20:51:10 +0200
commit265f95d9a316b1ecfee21a01d46d04cc6eadee7b (patch)
treed9db6bf969be3c688731ff4bf865ea66b0de0fe5 /vcl
parent7c38fa04c70401d84352e8ae7ca650dfcc74b3e0 (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.hxx4
-rw-r--r--vcl/source/app/salvtables.cxx16
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx43
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);