talkatu/talkatu

e57fd097f3aa
Parents 1736f120213a
Children 0dce9b22058a
Finish implementing the attach-file action
--- a/talkatu/talkatuactiongroup.c Thu May 07 21:58:00 2020 -0500
+++ b/talkatu/talkatuactiongroup.c Thu May 07 23:13:36 2020 -0500
@@ -22,6 +22,8 @@
#include "talkatu/talkatuattachmentdialog.h"
#include "talkatu/talkatubuffer.h"
#include "talkatu/talkatulinkdialog.h"
+#include "talkatu/talkatumarkup.h"
+#include "talkatu/talkatumessage.h"
#include "talkatu/talkatutag.h"
/**
@@ -112,11 +114,13 @@
typedef struct {
GtkTextBuffer *buffer;
+ TalkatuInput *input;
} TalkatuActionGroupPrivate;
enum {
PROP_0,
PROP_BUFFER,
+ PROP_INPUT,
N_PROPERTIES
};
static GParamSpec *properties[N_PROPERTIES] = {NULL,};
@@ -358,7 +362,25 @@
*/
gtk_widget_destroy(GTK_WIDGET(dialog));
} else if(response == GTK_RESPONSE_ACCEPT) {
- /* implement me */
+ TalkatuActionGroup *ag = TALKATU_ACTION_GROUP(data);
+ TalkatuActionGroupPrivate *priv = NULL;
+ TalkatuAttachment *attachment = NULL;
+ TalkatuAttachmentDialog *adialog = TALKATU_ATTACHMENT_DIALOG(dialog);
+ const gchar *comment = NULL;
+
+ priv = talkatu_action_group_get_instance_private(ag);
+
+ /* Set the message to the comment from the dialog. */
+ comment = talkatu_attachment_dialog_get_comment(adialog);
+ talkatu_markup_set_html(TALKATU_BUFFER(priv->buffer), comment, -1);
+
+ /* Add the attachment to the message */
+ attachment = talkatu_attachment_dialog_get_attachment(adialog);
+ talkatu_message_add_attachment(TALKATU_MESSAGE(priv->input), attachment);
+ g_object_unref(G_OBJECT(attachment));
+
+ /* Send the message! */
+ talkatu_input_send_message(priv->input);
gtk_widget_destroy(GTK_WIDGET(dialog));
}
@@ -374,9 +396,13 @@
*/
gtk_widget_destroy(GTK_WIDGET(dialog));
} else if(response == GTK_RESPONSE_ACCEPT) {
+ TalkatuActionGroup *ag = TALKATU_ACTION_GROUP(data);
+ TalkatuActionGroupPrivate *priv = NULL;
TalkatuAttachment *attachment = NULL;
GtkWidget *attach_dialog = NULL;
- gchar *filename = NULL, *content_type = NULL;
+ gchar *filename = NULL, *content_type = NULL, *comment = NULL;
+
+ priv = talkatu_action_group_get_instance_private(ag);
filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
content_type = g_content_type_guess(filename, NULL, 0, NULL);
@@ -389,7 +415,10 @@
gtk_widget_destroy(GTK_WIDGET(dialog));
- attach_dialog = talkatu_attachment_dialog_new(attachment, "");
+ comment = talkatu_markup_get_html(priv->buffer, NULL);
+ attach_dialog = talkatu_attachment_dialog_new(attachment, comment);
+ g_free(comment);
+
g_signal_connect(G_OBJECT(attach_dialog), "response",
G_CALLBACK(talkatu_action_attach_file_attach_response_cb),
data);
@@ -401,8 +430,13 @@
talkatu_action_attach_file(GSimpleAction *action, GVariant *parameter,
gpointer data)
{
+ TalkatuActionGroup *ag = TALKATU_ACTION_GROUP(data);
+ TalkatuActionGroupPrivate *priv = NULL;
GtkWidget *dialog = NULL;
+ priv = talkatu_action_group_get_instance_private(ag);
+ g_return_if_fail(TALKATU_IS_INPUT(priv->input));
+
dialog = gtk_file_chooser_dialog_new(_("Attach file..."),
NULL,
GTK_FILE_CHOOSER_ACTION_OPEN,
@@ -411,7 +445,7 @@
NULL);
g_signal_connect(G_OBJECT(dialog), "response",
G_CALLBACK(talkatu_action_attach_file_response_cb),
- data);
+ ag);
gtk_widget_show_all(dialog);
}
@@ -487,6 +521,9 @@
case PROP_BUFFER:
g_value_set_object(value, talkatu_action_group_get_buffer(ag));
break;
+ case PROP_INPUT:
+ g_value_set_object(value, talkatu_action_group_get_input(ag));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, prop_id, pspec);
break;
@@ -505,6 +542,9 @@
case PROP_BUFFER:
talkatu_action_group_set_buffer(ag, g_value_get_object(value));
break;
+ case PROP_INPUT:
+ talkatu_action_group_set_input(ag, g_value_get_object(value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, prop_id, pspec);
break;
@@ -515,7 +555,8 @@
talkatu_action_group_finalize(GObject *obj) {
TalkatuActionGroupPrivate *priv = talkatu_action_group_get_instance_private(TALKATU_ACTION_GROUP(obj));
- g_clear_object(&priv->buffer);;
+ g_clear_object(&priv->buffer);
+ g_clear_object(&priv->input);
G_OBJECT_CLASS(talkatu_action_group_parent_class)->finalize(obj);
}
@@ -605,10 +646,27 @@
obj_class->finalize = talkatu_action_group_finalize;
/* setup our properties */
+
+ /**
+ * TalkatuActionGroup::buffer:
+ *
+ * The #TalkatuBuffer that this action group is tied to.
+ */
properties[PROP_BUFFER] = g_param_spec_object(
"buffer", "buffer", "The buffer to work on",
- GTK_TYPE_TEXT_BUFFER,
- G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY
+ TALKATU_TYPE_BUFFER,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS
+ );
+
+ /**
+ * TalkatuActionGroup::input:
+ *
+ * The #TalkatuInput that this action group is tied to.
+ */
+ properties[PROP_INPUT] = g_param_spec_object(
+ "input", "input", "The input to work on",
+ TALKATU_TYPE_INPUT,
+ G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS
);
g_object_class_install_properties(obj_class, N_PROPERTIES, properties);
@@ -682,6 +740,44 @@
}
/**
+ * talkatu_action_group_set_input:
+ * @ag: The #TalkatuActionGroup instance.
+ * @input: A #TalkatuInput instance or %NULL.
+ *
+ * Binds @ag to @input for actions that need to work against the input widget.
+ */
+void
+talkatu_action_group_set_input(TalkatuActionGroup *ag, TalkatuInput *input) {
+ TalkatuActionGroupPrivate *priv = NULL;
+
+ g_return_if_fail(TALKATU_IS_ACTION_GROUP(ag));
+
+ priv = talkatu_action_group_get_instance_private(ag);
+ if(g_set_object(&priv->input, input)) {
+ g_object_notify_by_pspec(G_OBJECT(ag), properties[PROP_INPUT]);
+ }
+}
+
+/**
+ * talkatu_action_group_get_input:
+ * @ag: The #TalkatuActionGroup instance.
+ *
+ * Gets the #TalkatuInput bound to @ag.
+ *
+ * Returns: (transfer full): The #TalkatuInput that @ag is bound to.
+ */
+TalkatuInput *
+talkatu_action_group_get_input(TalkatuActionGroup *ag) {
+ TalkatuActionGroupPrivate *priv = NULL;
+
+ g_return_val_if_fail(TALKATU_IS_ACTION_GROUP(ag), NULL);
+
+ priv = talkatu_action_group_get_instance_private(ag);;
+
+ return priv->input;
+}
+
+/**
* talkatu_action_group_enable_action:
* @ag: The #TalkatuActionGroup instance.
* @name: The name of the action to enable.
--- a/talkatu/talkatuactiongroup.h Thu May 07 21:58:00 2020 -0500
+++ b/talkatu/talkatuactiongroup.h Thu May 07 23:13:36 2020 -0500
@@ -26,6 +26,8 @@
#include <gio/gio.h>
#include <gtk/gtk.h>
+#include <talkatu/talkatuinput.h>
+
#define TALKATU_ACTION_FORMAT_BOLD ("format-bold")
#define TALKATU_ACTION_FORMAT_ITALIC ("format-italic")
#define TALKATU_ACTION_FORMAT_UNDERLINE ("format-underline")
@@ -59,6 +61,9 @@
GtkTextBuffer *talkatu_action_group_get_buffer(TalkatuActionGroup *ag);
+void talkatu_action_group_set_input(TalkatuActionGroup *ag, TalkatuInput *input);
+TalkatuInput *talkatu_action_group_get_input(TalkatuActionGroup *ag);
+
void talkatu_action_group_enable_action(TalkatuActionGroup *ag, const gchar *name);
const gchar *talkatu_action_name_for_tag_name(const gchar *tag_name);
--- a/talkatu/talkatuinput.c Thu May 07 21:58:00 2020 -0500
+++ b/talkatu/talkatuinput.c Thu May 07 23:13:36 2020 -0500
@@ -23,6 +23,7 @@
#include "talkatu/talkatuinput.h"
+#include "talkatu/talkatuactiongroup.h"
#include "talkatu/talkatuattachment.h"
#include "talkatu/talkatuattachmentdialog.h"
#include "talkatu/talkatuenums.h"
@@ -380,6 +381,16 @@
gtk_text_buffer_get_start_iter(buffer, &start);
priv->context_mark = gtk_text_buffer_create_mark(buffer, NULL, &start, TRUE);
+ if(TALKATU_IS_BUFFER(buffer)) {
+ TalkatuActionGroup *ag = NULL;
+
+ ag = talkatu_buffer_get_action_group(TALKATU_BUFFER(buffer));
+
+ if(TALKATU_IS_ACTION_GROUP(ag)) {
+ /* Tell the action group of the buffer that we exist. */
+ talkatu_action_group_set_input(ag, input);
+ }
+ }
}
static void