talkatu/talkatu

2b3666447ef8
Parents 7dabf1ebead0
Children 17d112a00a96
Add support for setting author name colors

Testing Done:
Ran the demo

Reviewed at https://reviews.imfreedom.org/r/652/
--- a/demo/data/demo.ui Sun Mar 14 07:09:11 2021 -0500
+++ b/demo/data/demo.ui Tue May 18 03:35:43 2021 -0500
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.22.2
+<!-- Generated with glade 3.38.2
Talkatu - GTK widgets for chat applications
Copyright (C) 2017-2020 Gary Kramlich <grim@reaperworld.com>
@@ -26,31 +26,28 @@
<!-- interface-description GTK widgets for chat applications -->
<!-- interface-copyright Gary Kramlich <grim@reaperworld.com> -->
<template class="TalkatuDemoWindow" parent="GtkWindow">
- <property name="can_focus">False</property>
- <property name="border_width">12</property>
+ <property name="can-focus">False</property>
+ <property name="border-width">12</property>
<signal name="delete-event" handler="talkatu_demo_window_closed_cb" swapped="no"/>
- <child type="titlebar">
- <placeholder/>
- </child>
<child>
<object class="GtkPaned">
<property name="visible">True</property>
- <property name="can_focus">True</property>
+ <property name="can-focus">True</property>
<property name="orientation">vertical</property>
- <property name="wide_handle">True</property>
+ <property name="wide-handle">True</property>
<child>
<object class="TalkatuScrolledWindow">
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="shadow_type">in</property>
+ <property name="can-focus">True</property>
+ <property name="shadow-type">in</property>
<child>
<object class="TalkatuHistory" id="history">
<property name="name">history</property>
<property name="visible">True</property>
- <property name="can_focus">True</property>
+ <property name="can-focus">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="hexpand_set">True</property>
- <property name="vexpand_set">True</property>
+ <property name="hexpand-set">True</property>
+ <property name="vexpand-set">True</property>
</object>
</child>
</object>
@@ -62,20 +59,20 @@
<child>
<object class="GtkBox">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkToolbar">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<child>
<object class="GtkRadioToolButton" id="toggle_plain">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes">Use a TalkatuBuffer</property>
+ <property name="can-focus">False</property>
+ <property name="tooltip-text" translatable="yes">Use a TalkatuBuffer</property>
<property name="label" translatable="yes">Plain</property>
- <property name="use_underline">True</property>
- <property name="icon_name">text-x-generic</property>
+ <property name="use-underline">True</property>
+ <property name="icon-name">text-x-generic</property>
<property name="active">True</property>
<signal name="toggled" handler="talkatu_demo_window_buffer_changed_cb" object="TalkatuDemoWindow" swapped="no"/>
</object>
@@ -87,11 +84,11 @@
<child>
<object class="GtkRadioToolButton" id="toggle_whole">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes">Use a TalkatuWholeBuffer</property>
+ <property name="can-focus">False</property>
+ <property name="tooltip-text" translatable="yes">Use a TalkatuWholeBuffer</property>
<property name="label" translatable="yes">Whole</property>
- <property name="use_underline">True</property>
- <property name="icon_name">ascii</property>
+ <property name="use-underline">True</property>
+ <property name="icon-name">ascii</property>
<property name="group">toggle_plain</property>
<signal name="toggled" handler="talkatu_demo_window_buffer_changed_cb" object="TalkatuDemoWindow" swapped="no"/>
</object>
@@ -103,11 +100,11 @@
<child>
<object class="GtkRadioToolButton" id="toggle_html">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes">Use a TalkatuHTMLBuffer</property>
+ <property name="can-focus">False</property>
+ <property name="tooltip-text" translatable="yes">Use a TalkatuHTMLBuffer</property>
<property name="label" translatable="yes">HTML</property>
- <property name="use_underline">True</property>
- <property name="icon_name">text-html</property>
+ <property name="use-underline">True</property>
+ <property name="icon-name">text-html</property>
<property name="group">toggle_plain</property>
<signal name="toggled" handler="talkatu_demo_window_buffer_changed_cb" object="TalkatuDemoWindow" swapped="no"/>
</object>
@@ -119,11 +116,11 @@
<child>
<object class="GtkRadioToolButton" id="toggle_markdown">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes">Use a TalkatuMarkdownBuffer</property>
+ <property name="can-focus">False</property>
+ <property name="tooltip-text" translatable="yes">Use a TalkatuMarkdownBuffer</property>
<property name="label" translatable="yes">Markdown</property>
- <property name="use_underline">True</property>
- <property name="icon_name">text-x-generic-template</property>
+ <property name="use-underline">True</property>
+ <property name="icon-name">text-x-generic-template</property>
<property name="group">toggle_plain</property>
<signal name="toggled" handler="talkatu_demo_window_buffer_changed_cb" object="TalkatuDemoWindow" swapped="no"/>
</object>
@@ -135,7 +132,7 @@
<child>
<object class="GtkSeparatorToolItem">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
</object>
<packing>
<property name="expand">False</property>
@@ -145,11 +142,11 @@
<child>
<object class="GtkToolButton">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes">Insert HTML from a file</property>
+ <property name="can-focus">False</property>
+ <property name="tooltip-text" translatable="yes">Insert HTML from a file</property>
<property name="label" translatable="yes">Insert HTML</property>
- <property name="use_underline">True</property>
- <property name="icon_name">text-html</property>
+ <property name="use-underline">True</property>
+ <property name="icon-name">text-html</property>
<signal name="clicked" handler="talkatu_demo_window_insert_html_cb" object="TalkatuDemoWindow" swapped="no"/>
</object>
<packing>
@@ -160,11 +157,11 @@
<child>
<object class="GtkToolButton">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes">Insert Markdown from a file</property>
+ <property name="can-focus">False</property>
+ <property name="tooltip-text" translatable="yes">Insert Markdown from a file</property>
<property name="label" translatable="yes">Insert Markdown</property>
- <property name="use_underline">True</property>
- <property name="icon_name">text-x-generic</property>
+ <property name="use-underline">True</property>
+ <property name="icon-name">text-x-generic</property>
<signal name="clicked" handler="talkatu_demo_window_insert_markdown_cb" object="TalkatuDemoWindow" swapped="no"/>
</object>
<packing>
@@ -175,7 +172,7 @@
<child>
<object class="GtkSeparatorToolItem">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
</object>
<packing>
<property name="expand">False</property>
@@ -185,10 +182,10 @@
<child>
<object class="GtkToggleToolButton" id="author_button">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<property name="label" translatable="yes">Author</property>
- <property name="use_underline">True</property>
- <property name="icon_name">system-users</property>
+ <property name="use-underline">True</property>
+ <property name="icon-name">system-users</property>
<signal name="toggled" handler="talkatu_demo_window_author_toggled_cb" object="author_popover" swapped="no"/>
</object>
<packing>
@@ -197,9 +194,23 @@
</packing>
</child>
<child>
+ <object class="GtkToggleToolButton" id="author_name_color_button">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes">Color</property>
+ <property name="use-underline">True</property>
+ <property name="icon-name">color-select-symbolic</property>
+ <signal name="toggled" handler="talkatu_demo_window_author_name_color_toggled_cb" object="author_name_color_popover" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
<object class="GtkSeparatorToolItem">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
</object>
<packing>
<property name="expand">False</property>
@@ -209,10 +220,10 @@
<child>
<object class="GtkToggleToolButton" id="toggle_toolbar">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes">Toggle toolbar visibility</property>
+ <property name="can-focus">False</property>
+ <property name="tooltip-text" translatable="yes">Toggle toolbar visibility</property>
<property name="label" translatable="yes">Toolbar</property>
- <property name="use_underline">True</property>
+ <property name="use-underline">True</property>
</object>
<packing>
<property name="expand">False</property>
@@ -222,10 +233,10 @@
<child>
<object class="GtkToggleToolButton" id="toggle_send_button">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes">Toggle send button visibility</property>
+ <property name="can-focus">False</property>
+ <property name="tooltip-text" translatable="yes">Toggle send button visibility</property>
<property name="label" translatable="yes">Send Button</property>
- <property name="use_underline">True</property>
+ <property name="use-underline">True</property>
</object>
<packing>
<property name="expand">False</property>
@@ -235,10 +246,10 @@
<child>
<object class="GtkToggleToolButton" id="toggle_edited">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="tooltip_text" translatable="yes">Toggle whether the message is edited</property>
+ <property name="can-focus">False</property>
+ <property name="tooltip-text" translatable="yes">Toggle whether the message is edited</property>
<property name="label" translatable="yes">Edited</property>
- <property name="use_underline">True</property>
+ <property name="use-underline">True</property>
</object>
<packing>
<property name="expand">False</property>
@@ -257,13 +268,13 @@
<property name="orientation">vertical</property>
<property name="visible">True</property>
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="hexpand_set">True</property>
- <property name="vexpand_set">True</property>
+ <property name="hexpand-set">True</property>
+ <property name="vexpand-set">True</property>
<child internal-child="toolbar">
<object class="TalkatuToolbar">
<property name="events">GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property>
- <property name="hexpand_set">True</property>
- <property name="vexpand_set">True</property>
+ <property name="hexpand-set">True</property>
+ <property name="vexpand-set">True</property>
</object>
<packing>
<property name="fill">False</property>
@@ -271,8 +282,8 @@
</child>
<child internal-child="input">
<object class="TalkatuInput">
- <property name="hexpand_set">True</property>
- <property name="vexpand_set">True</property>
+ <property name="hexpand-set">True</property>
+ <property name="vexpand-set">True</property>
<property name="buffer">buffer_plain</property>
<signal name="open-url" handler="talkatu_demo_window_view_open_url_cb" object="TalkatuDemoWindow" swapped="no"/>
<signal name="send-message" handler="talkatu_demo_window_view_send_message_cb" object="TalkatuDemoWindow" swapped="no"/>
@@ -283,8 +294,8 @@
</child>
<child internal-child="send_button">
<object class="GtkButton">
- <property name="can_focus">False</property>
- <property name="receives_default">False</property>
+ <property name="can-focus">False</property>
+ <property name="receives-default">False</property>
</object>
<packing>
<property name="fill">False</property>
@@ -317,24 +328,133 @@
</object>
</child>
</template>
+ <object class="GtkPopover" id="author_name_color_popover">
+ <property name="can-focus">False</property>
+ <property name="relative-to">author_button</property>
+ <signal name="closed" handler="talkatu_demo_window_author_name_color_popover_closed_cb" object="author_name_color_button" swapped="no"/>
+ <child>
+ <object class="GtkBox">
+ <property name="visible">True</property>
+ <property name="can-focus">False</property>
+ <property name="border-width">6</property>
+ <property name="orientation">vertical</property>
+ <child>
+ <object class="GtkRadioButton" id="author_name_color_item">
+ <property name="label" translatable="yes">Not set</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="active">True</property>
+ <property name="draw-indicator">True</property>
+ <signal name="toggled" handler="talkatu_demo_window_author_name_color_changed" object="TalkatuDemoWindow" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">0</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton">
+ <property name="label" translatable="yes">Red</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">author_name_color_item</property>
+ <signal name="toggled" handler="talkatu_demo_window_author_name_color_changed" object="TalkatuDemoWindow" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">1</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton">
+ <property name="label" translatable="yes">Green</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">author_name_color_item</property>
+ <signal name="toggled" handler="talkatu_demo_window_author_name_color_changed" object="TalkatuDemoWindow" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">2</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton">
+ <property name="label" translatable="yes">Blue</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">author_name_color_item</property>
+ <signal name="toggled" handler="talkatu_demo_window_author_name_color_changed" object="TalkatuDemoWindow" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">3</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton">
+ <property name="label" translatable="yes">Yellow</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">author_name_color_item</property>
+ <signal name="toggled" handler="talkatu_demo_window_author_name_color_changed" object="TalkatuDemoWindow" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">4</property>
+ </packing>
+ </child>
+ <child>
+ <object class="GtkRadioButton">
+ <property name="label" translatable="yes">Purple</property>
+ <property name="visible">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="draw-indicator">True</property>
+ <property name="group">author_name_color_item</property>
+ <signal name="toggled" handler="talkatu_demo_window_author_name_color_changed" object="TalkatuDemoWindow" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="fill">True</property>
+ <property name="position">5</property>
+ </packing>
+ </child>
+ </object>
+ </child>
+ </object>
<object class="GtkPopover" id="author_popover">
- <property name="can_focus">False</property>
- <property name="relative_to">author_button</property>
+ <property name="can-focus">False</property>
+ <property name="relative-to">author_button</property>
<signal name="closed" handler="talkatu_demo_window_author_popover_closed_cb" object="author_button" swapped="no"/>
<child>
<object class="GtkBox">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="border_width">6</property>
+ <property name="can-focus">False</property>
+ <property name="border-width">6</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkRadioButton" id="author_item">
<property name="label" translatable="yes">Alice</property>
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
<property name="active">True</property>
- <property name="draw_indicator">True</property>
+ <property name="draw-indicator">True</property>
<signal name="toggled" handler="talkatu_demo_window_author_changed" object="TalkatuDemoWindow" swapped="no"/>
</object>
<packing>
@@ -347,9 +467,9 @@
<object class="GtkRadioButton">
<property name="label" translatable="yes">Bob</property>
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="draw-indicator">True</property>
<property name="group">author_item</property>
<signal name="toggled" handler="talkatu_demo_window_author_changed" object="TalkatuDemoWindow" swapped="no"/>
</object>
@@ -363,9 +483,9 @@
<object class="GtkRadioButton">
<property name="label" translatable="yes">Carol</property>
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="draw-indicator">True</property>
<property name="group">author_item</property>
<signal name="toggled" handler="talkatu_demo_window_author_changed" object="TalkatuDemoWindow" swapped="no"/>
</object>
@@ -379,9 +499,9 @@
<object class="GtkRadioButton">
<property name="label" translatable="yes">David</property>
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="draw-indicator">True</property>
<property name="group">author_item</property>
<signal name="toggled" handler="talkatu_demo_window_author_changed" object="TalkatuDemoWindow" swapped="no"/>
</object>
@@ -395,9 +515,9 @@
<object class="GtkRadioButton">
<property name="label" translatable="yes">Eve</property>
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="draw-indicator">True</property>
<property name="group">author_item</property>
<signal name="toggled" handler="talkatu_demo_window_author_changed" object="TalkatuDemoWindow" swapped="no"/>
</object>
@@ -411,9 +531,9 @@
<object class="GtkRadioButton">
<property name="label" translatable="yes">Mallory</property>
<property name="visible">True</property>
- <property name="can_focus">True</property>
- <property name="receives_default">False</property>
- <property name="draw_indicator">True</property>
+ <property name="can-focus">True</property>
+ <property name="receives-default">False</property>
+ <property name="draw-indicator">True</property>
<property name="group">author_item</property>
<signal name="toggled" handler="talkatu_demo_window_author_changed" object="TalkatuDemoWindow" swapped="no"/>
</object>
@@ -429,21 +549,21 @@
<object class="TalkatuTagTable" id="table_history"/>
<object class="TalkatuTagTable" id="table_html"/>
<object class="TalkatuHtmlBuffer" id="buffer_html">
- <property name="tag_table">table_html</property>
+ <property name="tag-table">table_html</property>
<signal name="changed" handler="talkatu_demo_window_buffer_modified_cb" object="TalkatuDemoWindow" swapped="no"/>
</object>
<object class="TalkatuTagTable" id="table_markdown"/>
<object class="TalkatuMarkdownBuffer" id="buffer_markdown">
- <property name="tag_table">table_markdown</property>
+ <property name="tag-table">table_markdown</property>
<signal name="changed" handler="talkatu_demo_window_buffer_modified_cb" object="TalkatuDemoWindow" swapped="no"/>
</object>
<object class="TalkatuTagTable" id="table_plain"/>
<object class="TalkatuBuffer" id="buffer_plain">
- <property name="tag_table">table_plain</property>
+ <property name="tag-table">table_plain</property>
<signal name="changed" handler="talkatu_demo_window_buffer_modified_cb" object="TalkatuDemoWindow" swapped="no"/>
</object>
<object class="TalkatuWholeBuffer" id="buffer_whole">
- <property name="tag_table">table_plain</property>
+ <property name="tag-table">table_plain</property>
<property name="style">whole</property>
<signal name="changed" handler="talkatu_demo_window_buffer_modified_cb" object="TalkatuDemoWindow" swapped="no"/>
</object>
--- a/demo/talkatudemowindow.c Sun Mar 14 07:09:11 2021 -0500
+++ b/demo/talkatudemowindow.c Tue May 18 03:35:43 2021 -0500
@@ -262,6 +262,49 @@
}
}
+static void
+talkatu_demo_window_author_name_color_toggled_cb(GtkToolButton *button,
+ gpointer data)
+{
+ GtkPopover *popover = GTK_POPOVER(data);
+
+#if GTK_CHECK_VERSION(3,22,0)
+ gtk_popover_popup(popover);
+#else
+ gtk_widget_show(popover);
+#endif
+}
+
+static void
+talkatu_demo_window_author_name_color_popover_closed_cb(GtkPopover *popover,
+ gpointer data)
+{
+ GtkToggleToolButton *button = GTK_TOGGLE_TOOL_BUTTON(data);
+
+ gtk_toggle_tool_button_set_active(button, FALSE);
+}
+
+static void
+talkatu_demo_window_author_name_color_changed(GtkRadioButton *item,
+ gpointer data)
+{
+ TalkatuDemoWindow *window = TALKATU_DEMO_WINDOW(data);
+
+ if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(item))) {
+ TalkatuEditor *editor = TALKATU_EDITOR(window->editor);
+ GtkWidget *input = talkatu_editor_get_input(editor);
+ GdkRGBA color;
+ const gchar *label = gtk_button_get_label(GTK_BUTTON(item));
+
+ if(gdk_rgba_parse(&color, label)) {
+ talkatu_message_set_author_name_color(TALKATU_MESSAGE(input),
+ &color);
+ } else {
+ talkatu_message_set_author_name_color(TALKATU_MESSAGE(input), NULL);
+ }
+ }
+}
+
/******************************************************************************
* GObject Implementation
*****************************************************************************/
@@ -336,6 +379,10 @@
gtk_widget_class_bind_template_callback(widget_class, talkatu_demo_window_author_toggled_cb);
gtk_widget_class_bind_template_callback(widget_class, talkatu_demo_window_author_popover_closed_cb);
gtk_widget_class_bind_template_callback(widget_class, talkatu_demo_window_author_changed);
+
+ gtk_widget_class_bind_template_callback(widget_class, talkatu_demo_window_author_name_color_toggled_cb);
+ gtk_widget_class_bind_template_callback(widget_class, talkatu_demo_window_author_name_color_popover_closed_cb);
+ gtk_widget_class_bind_template_callback(widget_class, talkatu_demo_window_author_name_color_changed);
}
/******************************************************************************
--- a/talkatu/data/historyrow.ui Sun Mar 14 07:09:11 2021 -0500
+++ b/talkatu/data/historyrow.ui Tue May 18 03:35:43 2021 -0500
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
-<!-- Generated with glade 3.22.2
+<!-- Generated with glade 3.38.2
Talkatu - GTK widgets for chat applications
Copyright (C) 2017-2020 Gary Kramlich <grim@reaperworld.com>
@@ -26,19 +26,19 @@
<!-- interface-copyright Gary Kramlich <grim@reaperworld.com> -->
<template class="TalkatuHistoryRow" parent="GtkListBoxRow">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<child>
<object class="GtkEventBox" id="avatar_event">
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<child>
<object class="GtkImage" id="avatar_image">
<property name="visible">True</property>
- <property name="can_focus">False</property>
- <property name="stock">gtk-missing-image</property>
+ <property name="can-focus">False</property>
+ <property name="icon-name">image-missing</property>
</object>
</child>
</object>
@@ -51,17 +51,19 @@
<child>
<object class="GtkBox">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<property name="spacing">8</property>
<child>
<object class="GtkLabel" id="author">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes">Author</property>
+ <property name="use-markup">True</property>
</object>
<packing>
<property name="expand">False</property>
@@ -72,7 +74,9 @@
<child>
<object class="GtkLabel" id="timestamp">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
+ <property name="label" translatable="yes">12:34PM</property>
+ <property name="use-markup">True</property>
</object>
<packing>
<property name="expand">False</property>
@@ -82,7 +86,7 @@
</child>
<child>
<object class="GtkLabel" id="edited">
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<property name="label" translatable="yes">(edited)</property>
</object>
<packing>
@@ -101,9 +105,9 @@
<child>
<object class="GtkLabel" id="content">
<property name="visible">True</property>
- <property name="can_focus">False</property>
+ <property name="can-focus">False</property>
<property name="wrap">True</property>
- <property name="wrap_mode">word-char</property>
+ <property name="wrap-mode">word-char</property>
<property name="xalign">0</property>
<property name="yalign">0</property>
</object>
--- a/talkatu/talkatuhistoryrow.c Sun Mar 14 07:09:11 2021 -0500
+++ b/talkatu/talkatuhistoryrow.c Tue May 18 03:35:43 2021 -0500
@@ -76,12 +76,16 @@
} else {
GDateTime *timestamp = NULL;
TalkatuContentType content_type;
+ GdkRGBA *author_name_color = NULL;
+ PangoAttrList *author_attrs = NULL;
+ PangoAttribute *attr = NULL;
gchar *author = NULL, *contents = NULL, *datetime = NULL;
gboolean edited = FALSE;
g_object_get(
G_OBJECT(row->message),
"author", &author,
+ "author-name-color", &author_name_color,
"content-type", &content_type,
"contents", &contents,
"edited", &edited,
@@ -89,9 +93,18 @@
NULL
);
- datetime = g_date_time_format(timestamp, "%I:%M %P");
+ author_attrs = pango_attr_list_new();
+ if(author_name_color != NULL) {
+ attr = pango_attr_foreground_new(0xFFFF * author_name_color->red,
+ 0xFFFF * author_name_color->green,
+ 0xFFFF * author_name_color->blue);
+ pango_attr_list_insert(author_attrs, attr);
+ }
+ gtk_label_set_attributes(GTK_LABEL(row->author), author_attrs);
+ pango_attr_list_unref(author_attrs);
+ gtk_label_set_text(GTK_LABEL(row->author), author);
- gtk_label_set_text(GTK_LABEL(row->author), author);
+ datetime = g_date_time_format(timestamp, "%I:%M %P");
gtk_label_set_text(GTK_LABEL(row->timestamp), datetime);
if(edited) {
@@ -123,6 +136,7 @@
g_free(datetime);
g_free(contents);
g_clear_pointer(&timestamp, g_date_time_unref);
+ g_clear_pointer(&author_name_color, gdk_rgba_free);
}
}
--- a/talkatu/talkatuinput.c Sun Mar 14 07:09:11 2021 -0500
+++ b/talkatu/talkatuinput.c Tue May 18 03:35:43 2021 -0500
@@ -100,7 +100,10 @@
guint64 id;
GDateTime *timestamp;
TalkatuContentType content_type;
+
gchar *author;
+ GdkRGBA *author_name_color;
+
gboolean edited;
} TalkatuInputPrivate;
@@ -118,6 +121,7 @@
PROP_TIMESTAMP,
PROP_CONTENT_TYPE,
PROP_AUTHOR,
+ PROP_AUTHOR_NAME_COLOR,
PROP_CONTENTS,
PROP_EDITED,
};
@@ -222,6 +226,30 @@
g_object_notify(G_OBJECT(input), "author");
}
+static GdkRGBA *
+talkatu_input_get_author_name_color(TalkatuInput *input) {
+ TalkatuInputPrivate *priv = talkatu_input_get_instance_private(input);
+
+ if(priv->author_name_color != NULL) {
+ return gdk_rgba_copy(priv->author_name_color);
+ }
+
+ return NULL;
+}
+
+static void
+talkatu_input_set_author_name_color(TalkatuInput *input, GdkRGBA *color) {
+ TalkatuInputPrivate *priv = talkatu_input_get_instance_private(input);
+
+ g_clear_pointer(&priv->author_name_color, gdk_rgba_free);
+
+ if(color != NULL) {
+ priv->author_name_color = gdk_rgba_copy(color);
+ }
+
+ g_object_notify(G_OBJECT(input), "author-name-color");
+}
+
static gchar *
talkatu_input_get_contents(TalkatuInput *input) {
GtkTextBuffer *buffer = NULL;
@@ -625,6 +653,9 @@
case PROP_AUTHOR:
g_value_set_string(value, talkatu_input_get_author(input));
break;
+ case PROP_AUTHOR_NAME_COLOR:
+ g_value_set_boxed(value, talkatu_input_get_author_name_color(input));
+ break;
case PROP_CONTENTS:
g_value_set_string(value, talkatu_input_get_contents(input));
break;
@@ -657,6 +688,9 @@
case PROP_AUTHOR:
talkatu_input_set_author(input, g_value_get_string(value));
break;
+ case PROP_AUTHOR_NAME_COLOR:
+ talkatu_input_set_author_name_color(input, g_value_get_boxed(value));
+ break;
case PROP_CONTENTS:
talkatu_input_set_contents(input, g_value_get_string(value));
break;
@@ -707,6 +741,11 @@
g_hash_table_destroy(priv->attachments);
+ g_clear_pointer(&priv->timestamp, g_date_time_unref);
+
+ g_clear_pointer(&priv->author, g_free);
+ g_clear_pointer(&priv->author_name_color, gdk_rgba_free);
+
G_OBJECT_CLASS(talkatu_input_parent_class)->finalize(obj);
}
@@ -741,6 +780,7 @@
g_object_class_override_property(obj_class, PROP_TIMESTAMP, "timestamp");
g_object_class_override_property(obj_class, PROP_CONTENT_TYPE, "content-type");
g_object_class_override_property(obj_class, PROP_AUTHOR, "author");
+ g_object_class_override_property(obj_class, PROP_AUTHOR_NAME_COLOR, "author-name-color");
g_object_class_override_property(obj_class, PROP_CONTENTS, "contents");
g_object_class_override_property(obj_class, PROP_EDITED, "edited");
--- a/talkatu/talkatumessage.c Sun Mar 14 07:09:11 2021 -0500
+++ b/talkatu/talkatumessage.c Tue May 18 03:35:43 2021 -0500
@@ -134,6 +134,20 @@
g_object_interface_install_property(iface, pspec);
/**
+ * TalkatuMessage::author-name-color:
+ *
+ * The color for the author's name.
+ */
+ pspec = g_param_spec_boxed(
+ "author-name-color", "author-name-color",
+ "The color to use when rendering the author's name",
+ GDK_TYPE_RGBA,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS
+ );
+ g_object_interface_install_property(iface, pspec);
+
+
+ /**
* TalkatuMessage::contents:
*
* The contents of the message.
@@ -302,6 +316,42 @@
}
/**
+ * talkatu_message_get_author_name_color:
+ * @message: The #TalkatuMessage instance.
+ *
+ * Gets a #GdkRGBA that the author's name will be rendered with or %NULL if no
+ * color is set.
+ *
+ * Returns: (transfer full): The #GdkRGBA to renderer the author's name with if
+ * set, otherwise %NULL.
+ */
+GdkRGBA *
+talkatu_message_get_author_name_color(TalkatuMessage *message) {
+ GdkRGBA *color = NULL;
+
+ g_return_val_if_fail(TALKATU_IS_MESSAGE(message), NULL);
+
+ g_object_get(G_OBJECT(message), "author-name-color", &color, NULL);
+
+ return color;
+}
+
+/**
+ * talkatu_message_set_author_name_color:
+ * @message: The #TalkatuMessage instance.
+ * @color: The new color for the author's name.
+ *
+ * Sets the color for the name of the author of @message to @color. Calling
+ * this with @color set to %NULL will unset a previously set color.
+ */
+void
+talkatu_message_set_author_name_color(TalkatuMessage *message, GdkRGBA *color) {
+ g_return_if_fail(TALKATU_IS_MESSAGE(message));
+
+ g_object_set(G_OBJECT(message), "author-name-color", color, NULL);
+}
+
+/**
* talkatu_message_get_contents:
* @message: The #TalkatuMessage instance.
*
--- a/talkatu/talkatumessage.h Sun Mar 14 07:09:11 2021 -0500
+++ b/talkatu/talkatumessage.h Tue May 18 03:35:43 2021 -0500
@@ -70,6 +70,9 @@
gchar *talkatu_message_get_author(TalkatuMessage *message);
void talkatu_message_set_author(TalkatuMessage *message, const gchar *author);
+GdkRGBA *talkatu_message_get_author_name_color(TalkatuMessage *message);
+void talkatu_message_set_author_name_color(TalkatuMessage *message, GdkRGBA *color);
+
gchar *talkatu_message_get_contents(TalkatuMessage *message);
void talkatu_message_set_contents(TalkatuMessage *message, const gchar *contents);