qulogic/talkatu

612a91248474
Parents 6c7a9fe0aa8f
Children 628a0d98b199
Implement whole buffer formatting support. Fixed #37
--- a/demo/data/demo.ui Mon Sep 03 16:10:29 2018 -0500
+++ b/demo/data/demo.ui Mon Sep 03 16:39:46 2018 -0500
@@ -75,6 +75,21 @@
</packing>
</child>
<child>
+ <object class="GtkRadioToolButton" id="toggle_whole">
+ <property name="visible">True</property>
+ <property name="can_focus">False</property>
+ <property name="label" translatable="yes">Whole</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_buffer_changed_cb" object="TalkatuDemo" swapped="no"/>
+ </object>
+ <packing>
+ <property name="expand">False</property>
+ <property name="homogeneous">True</property>
+ </packing>
+ </child>
+ <child>
<object class="GtkRadioToolButton" id="toggle_html">
<property name="visible">True</property>
<property name="can_focus">False</property>
@@ -183,4 +198,8 @@
</object>
</child>
</template>
+ <object class="TalkatuHtmlBuffer" id="buffer_whole">
+ <property name="tag_table">table_plain</property>
+ <property name="style">whole</property>
+ </object>
</interface>
--- a/demo/talkatudemo.c Mon Sep 03 16:10:29 2018 -0500
+++ b/demo/talkatudemo.c Mon Sep 03 16:39:46 2018 -0500
@@ -39,10 +39,12 @@
GtkWidget *editor;
GtkRadioToolButton *toggle_plain;
+ GtkRadioToolButton *toggle_whole;
GtkRadioToolButton *toggle_html;
GtkRadioToolButton *toggle_markdown;
GtkTextBuffer *buffer_plain;
+ GtkTextBuffer *buffer_whole;
GtkTextBuffer *buffer_html;
GtkTextBuffer *buffer_markdown;
GtkTextBuffer *buffer_history;
@@ -150,6 +152,9 @@
if(gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(demo->toggle_plain))) {
g_message("switching to plain buffer");
gtk_text_view_set_buffer(GTK_TEXT_VIEW(view), demo->buffer_plain);
+ } else if(gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(demo->toggle_whole))) {
+ g_message("switching to whole buffer");
+ gtk_text_view_set_buffer(GTK_TEXT_VIEW(view), demo->buffer_whole);
} else if(gtk_toggle_tool_button_get_active(GTK_TOGGLE_TOOL_BUTTON(demo->toggle_html))) {
g_message("switching to html buffer");
gtk_text_view_set_buffer(GTK_TEXT_VIEW(view), demo->buffer_html);
@@ -248,11 +253,13 @@
gtk_widget_class_bind_template_child(widget_class, TalkatuDemo, editor);
gtk_widget_class_bind_template_child(widget_class, TalkatuDemo, buffer_plain);
+ gtk_widget_class_bind_template_child(widget_class, TalkatuDemo, buffer_whole);
gtk_widget_class_bind_template_child(widget_class, TalkatuDemo, buffer_html);
gtk_widget_class_bind_template_child(widget_class, TalkatuDemo, buffer_markdown);
gtk_widget_class_bind_template_child(widget_class, TalkatuDemo, buffer_history);
gtk_widget_class_bind_template_child(widget_class, TalkatuDemo, toggle_plain);
+ gtk_widget_class_bind_template_child(widget_class, TalkatuDemo, toggle_whole);
gtk_widget_class_bind_template_child(widget_class, TalkatuDemo, toggle_html);
gtk_widget_class_bind_template_child(widget_class, TalkatuDemo, toggle_markdown);
--- a/talkatu/meson.build Mon Sep 03 16:10:29 2018 -0500
+++ b/talkatu/meson.build Mon Sep 03 16:39:46 2018 -0500
@@ -72,6 +72,7 @@
TALKATU_ENUM_HEADERS = [
'talkatumessage.h',
'talkatuview.h',
+ 'talkatubuffer.h',
]
###############################################################################
--- a/talkatu/talkatuaction.c Mon Sep 03 16:10:29 2018 -0500
+++ b/talkatu/talkatuaction.c Mon Sep 03 16:39:46 2018 -0500
@@ -117,8 +117,19 @@
{
GtkTextBuffer *buffer = GTK_TEXT_BUFFER(data);
GtkTextIter start, end;
+ TalkatuBufferStyle style = talkatu_buffer_get_style(TALKATU_BUFFER(buffer));
+ gboolean apply = FALSE;
- if(gtk_text_buffer_get_selection_bounds(buffer, &start, &end)) {
+ if(style == TALKATU_BUFFER_STYLE_WHOLE) {
+ gtk_text_buffer_get_bounds(buffer, &start, &end);
+ apply = TRUE;
+ } else {
+ if(gtk_text_buffer_get_selection_bounds(buffer, &start, &end)) {
+ apply = TRUE;
+ }
+ }
+
+ if(apply) {
const gchar *tag_name = NULL, *name = NULL;
name = g_action_get_name(G_ACTION(action));
@@ -131,10 +142,8 @@
gtk_text_buffer_begin_user_action(buffer);
if(g_variant_get_boolean(state)) {
- g_warning(_("applying %s"), tag_name);
gtk_text_buffer_apply_tag_by_name(buffer, tag_name, &start, &end);
} else {
- g_warning(_("removing %s"), tag_name);
gtk_text_buffer_remove_tag_by_name(buffer, tag_name, &start, &end);
}
--- a/talkatu/talkatubuffer.c Mon Sep 03 16:10:29 2018 -0500
+++ b/talkatu/talkatubuffer.c Mon Sep 03 16:39:46 2018 -0500
@@ -18,9 +18,10 @@
#include <gtk/gtk.h>
#include <glib/gi18n-lib.h>
-#include "talkatu/talkatuaction.h"
-#include "talkatu/talkatubuffer.h"
-#include "talkatu/talkatutag.h"
+#include <talkatu/talkatuaction.h>
+#include <talkatu/talkatubuffer.h>
+#include <talkatu/talkatuenums.h>
+#include <talkatu/talkatutag.h>
/**
* SECTION:talkatubuffer
@@ -39,7 +40,16 @@
* links.
*/
+/**
+ * TalkatuBufferStyle:
+ * @TALKATU_BUFFER_STYLE_RICH: Format the buffer character by character.
+ * @TALKATU_BUFFER_STYLE_WHOLE: Format the buffer as a whole.
+ *
+ * The format style of a #TalkatuBuffer.
+ */
+
typedef struct _TalkatuBufferPrivate {
+ TalkatuBufferStyle style;
GSimpleActionGroup *action_group;
GSList *tags;
@@ -47,6 +57,7 @@
enum {
PROP_0,
+ PROP_STYLE,
PROP_ACTION_GROUP,
N_PROPERTIES,
};
@@ -237,6 +248,15 @@
* Helpers
*****************************************************************************/
static void
+talkatu_buffer_set_style(TalkatuBuffer *buffer, TalkatuBufferStyle style) {
+ TalkatuBufferPrivate *priv = talkatu_buffer_get_instance_private(buffer);
+
+ priv->style = style;
+
+ g_object_notify(G_OBJECT(buffer), "style");
+}
+
+static void
talkatu_buffer_set_action_group(TalkatuBuffer *buffer,
GSimpleActionGroup *action_group)
{
@@ -282,6 +302,9 @@
TalkatuBuffer *buffer = TALKATU_BUFFER(obj);
switch(prop_id) {
+ case PROP_STYLE:
+ g_value_set_enum(value, talkatu_buffer_get_style(buffer));
+ break;
case PROP_ACTION_GROUP:
g_value_set_object(value, talkatu_buffer_get_action_group(buffer));
break;
@@ -300,6 +323,9 @@
TalkatuBuffer *buffer = TALKATU_BUFFER(obj);
switch(prop_id) {
+ case PROP_STYLE:
+ talkatu_buffer_set_style(buffer, g_value_get_enum(value));
+ break;
case PROP_ACTION_GROUP:
talkatu_buffer_set_action_group(buffer, g_value_get_object(value));
break;
@@ -339,6 +365,13 @@
klass->insert_markup = talkatu_buffer_real_insert_markup;
klass->create_action_group = talkatu_buffer_default_creation_action_group;
+ properties[PROP_STYLE] = g_param_spec_enum(
+ "style", "style", "The format style of the buffer",
+ TALKATU_TYPE_BUFFER_STYLE,
+ TALKATU_BUFFER_STYLE_RICH,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY
+ );
+
properties[PROP_ACTION_GROUP] = g_param_spec_object(
"action-group", "action-group", "The action group for this buffer",
G_TYPE_ACTION_GROUP,
@@ -371,6 +404,25 @@
}
/**
+ * talkatu_buffer_get_style:
+ * @buffer: A #TalkatuBuffer instance.
+ *
+ * Get's format style of @buffer.
+ *
+ * Returns: The format style of @buffer.
+ */
+TalkatuBufferStyle
+talkatu_buffer_get_style(TalkatuBuffer *buffer) {
+ TalkatuBufferPrivate *priv = NULL;
+
+ g_return_val_if_fail(TALKATU_IS_BUFFER(buffer), TALKATU_BUFFER_STYLE_RICH);
+
+ priv = talkatu_buffer_get_instance_private(buffer);
+
+ return priv->style;
+}
+
+/**
* talkatu_buffer_get_action_group:
* @buffer: A #TalkatuBuffer instance.
*
--- a/talkatu/talkatubuffer.h Mon Sep 03 16:10:29 2018 -0500
+++ b/talkatu/talkatubuffer.h Mon Sep 03 16:39:46 2018 -0500
@@ -39,6 +39,12 @@
typedef struct _TalkatuBuffer TalkatuBuffer;
typedef struct _TalkatuBufferClass TalkatuBufferClass;
+typedef enum /*< prefix=TALKATU_BUFFER_STYLE,underscore_name=TALKATU_BUFFER_STYLE >*/
+{
+ TALKATU_BUFFER_STYLE_RICH,
+ TALKATU_BUFFER_STYLE_WHOLE,
+} TalkatuBufferStyle;
+
struct _TalkatuBuffer {
GtkTextBuffer parent;
@@ -67,6 +73,7 @@
GtkTextBuffer *talkatu_buffer_new(GSimpleActionGroup *action_group);
+TalkatuBufferStyle talkatu_buffer_get_style(TalkatuBuffer *buffer);
GSimpleActionGroup *talkatu_buffer_get_action_group(TalkatuBuffer *buffer);
void talkatu_buffer_insert_markup(TalkatuBuffer *buffer, GtkTextIter *pos, const gchar *new_text, gint new_text_length);