diff --git a/src/API/Status.vala b/src/API/Status.vala index 508fe30..f40ced4 100644 --- a/src/API/Status.vala +++ b/src/API/Status.vala @@ -1,5 +1,7 @@ public class Tootle.Status{ + public abstract signal void updated (); + public Account account; public int64 id; public string uri; @@ -70,5 +72,35 @@ public class Tootle.Status{ return status; } + + public void set_reblogged (bool rebl = true){ + var action = rebl ? "reblog" : "unreblog"; + var msg = new Soup.Message("POST", "%s/api/v1/statuses/%lld/%s".printf (Tootle.settings.instance_url, id, action)); + msg.priority = Soup.MessagePriority.HIGH; + msg.finished.connect (() => { + reblogged = rebl; + updated (); + if(rebl) + Tootle.app.toast (_("Boosted!")); + else + Tootle.app.toast (_("Removed boost")); + }); + Tootle.network.queue (msg); + } + + public void set_favorited (bool fav = true){ + var action = fav ? "favourite" : "unfavourite"; + var msg = new Soup.Message("POST", "%s/api/v1/statuses/%lld/%s".printf (Tootle.settings.instance_url, id, action)); + msg.priority = Soup.MessagePriority.HIGH; + msg.finished.connect (() => { + favorited = fav; + updated (); + if(fav) + Tootle.app.toast (_("Favorited!")); + else + Tootle.app.toast (_("Removed from favorites")); + }); + Tootle.network.queue (msg); + } } diff --git a/src/NetManager.vala b/src/NetManager.vala index 544de95..560996b 100644 --- a/src/NetManager.vala +++ b/src/NetManager.vala @@ -27,7 +27,7 @@ public class Tootle.NetManager : GLib.Object{ GLib.Object(); } - public Soup.Message queue(Soup.Message msg, Soup.SessionCallback cb){ + public Soup.Message queue(Soup.Message msg, Soup.SessionCallback? cb = null){ requests_processing++; started (); @@ -51,7 +51,8 @@ public class Tootle.NetManager : GLib.Object{ default: break; } - cb (sess, mess); + if (cb != null) + cb (sess, mess); }); return msg; } diff --git a/src/Views/HomeView.vala b/src/Views/HomeView.vala index 3618f7d..bd7e030 100644 --- a/src/Views/HomeView.vala +++ b/src/Views/HomeView.vala @@ -35,7 +35,6 @@ public class Tootle.HomeView : Tootle.AbstractView { var widget = new StatusWidget(status); widget.separator = separator; - widget.rebind (status); widget.button_press_event.connect(widget.open); if (!is_status_owned (status)) widget.avatar.button_press_event.connect(widget.on_avatar_clicked); diff --git a/src/Views/StatusView.vala b/src/Views/StatusView.vala index 9cbc5ce..025610a 100644 --- a/src/Views/StatusView.vala +++ b/src/Views/StatusView.vala @@ -18,7 +18,6 @@ public class Tootle.StatusView : Tootle.AbstractView { else widget.margin_start = 24; - widget.rebind (status); widget.content.selectable = true; if (widget.spoiler_content != null) widget.spoiler_content.selectable = true; diff --git a/src/Widgets/NotificationWidget.vala b/src/Widgets/NotificationWidget.vala index 32a3d35..d986cec 100644 --- a/src/Widgets/NotificationWidget.vala +++ b/src/Widgets/NotificationWidget.vala @@ -42,8 +42,7 @@ public class Tootle.NotificationWidget : Gtk.Grid { get_style_context ().add_class ("notification"); if (notification.status != null){ - status_widget = new StatusWidget (this.notification.status); - status_widget.rebind (this.notification.status); + status_widget = new StatusWidget (notification.status); status_widget.button_press_event.connect(status_widget.open); status_widget.avatar.button_press_event.connect(status_widget.on_avatar_clicked); attach(status_widget, 1, 3, 3, 1); diff --git a/src/Widgets/StatusWidget.vala b/src/Widgets/StatusWidget.vala index a944ab8..1545355 100644 --- a/src/Widgets/StatusWidget.vala +++ b/src/Widgets/StatusWidget.vala @@ -53,13 +53,13 @@ public class Tootle.StatusWidget : Gtk.EventBox { reblog.tooltip_text = _("Boost"); reblog.toggled.connect (() => { if (reblog.sensitive) - toggle_reblog (); + status.set_reblogged (reblog.get_active ()); }); favorite = get_action_button ("help-about-symbolic"); favorite.tooltip_text = _("Favorite"); favorite.toggled.connect (() => { if (favorite.sensitive) - toggle_fav (); + status.set_favorited (favorite.get_active ()); }); reply = get_action_button ("edit-undo-symbolic"); reply.tooltip_text = _("Reply"); @@ -87,6 +87,7 @@ public class Tootle.StatusWidget : Gtk.EventBox { public StatusWidget (Status status) { this.status = status; + status.updated.connect (rebind); get_style_context ().add_class ("status"); if (status.reblog != null){ @@ -123,6 +124,7 @@ public class Tootle.StatusWidget : Gtk.EventBox { if(separator != null) separator.destroy (); }); + rebind (); } public void highlight (){ @@ -133,7 +135,7 @@ public class Tootle.StatusWidget : Gtk.EventBox { avatar.show_default (avatar_size); } - public void rebind (Status status = this.status){ + public void rebind (){ user.label = "%s".printf (status.get_formal ().account.display_name); content.label = status.content; content.mentions = status.mentions; @@ -172,45 +174,5 @@ public class Tootle.StatusWidget : Gtk.EventBox { button.add (icon); return button; } - - public void toggle_reblog (){ - var state = reblog.get_active (); - var action = state ? "reblog" : "unreblog"; - var msg = new Soup.Message("POST", Tootle.settings.instance_url + "/api/v1/statuses/" + status.id.to_string () + "/" + action); - msg.finished.connect (() => { - status.reblogged = state; - if (state) - status.reblogs_count += 1; - else - status.reblogs_count -= 1; - rebind (); - }); - Tootle.network.queue (msg, (sess, mess) => { - if(state) - Tootle.app.toast (_("Boosted!")); - else - Tootle.app.toast (_("Removed boost")); - }); - } - - public void toggle_fav (){ - var state = favorite.get_active (); - var action = state ? "favourite" : "unfavourite"; - var msg = new Soup.Message ("POST", Tootle.settings.instance_url + "/api/v1/statuses/" + status.id.to_string () + "/" + action); - msg.finished.connect (() => { - status.favorited = state; - if (state) - status.favourites_count += 1; - else - status.favourites_count -= 1; - rebind (); - }); - Tootle.network.queue (msg, (sess, mess) => { - if(state) - Tootle.app.toast (_("Favorited!")); - else - Tootle.app.toast (_("Removed favorite")); - }); - } }