tootle-linux-client/src/Views/Profile.vala

180 lines
5.4 KiB
Vala
Raw Normal View History

2018-04-25 15:16:57 +02:00
using Gtk;
2019-03-11 15:14:37 +01:00
public class Tootle.Views.Profile : Views.Timeline {
2019-03-07 17:16:52 +01:00
2020-05-29 14:19:35 +02:00
public API.Account profile { get; construct set; }
2020-06-29 23:43:45 +02:00
ListBox profile_list;
Label relationship;
Box actions;
Button follow_button;
MenuButton options_button;
Widgets.TimelineFilter filter;
public bool exclude_replies { get; set; default = true; }
public bool only_media { get; set; default = false; }
2019-03-07 17:16:52 +01:00
2018-10-24 11:29:36 +02:00
construct {
2020-05-29 14:19:35 +02:00
profile.notify["rs"].connect (on_rs_updated);
2020-06-29 23:43:45 +02:00
filter = new Widgets.TimelineFilter.with_profile (this);
2020-05-29 14:19:35 +02:00
var builder = new Builder.from_resource (@"$(Build.RESOURCES)ui/views/profile_header.ui");
2020-06-29 23:43:45 +02:00
profile_list = builder.get_object ("profile_list") as ListBox;
2020-06-02 11:35:29 +02:00
var hdr = builder.get_object ("grid") as Grid;
column_view.pack_start (hdr, false, false, 0);
column_view.reorder_child (hdr, 0);
2020-05-29 14:19:35 +02:00
var avatar = builder.get_object ("avatar") as Widgets.Avatar;
avatar.url = profile.avatar;
2020-06-29 23:43:45 +02:00
profile.bind_property ("display-name", filter.title, "label", BindingFlags.SYNC_CREATE);
2020-05-29 14:19:35 +02:00
var handle = builder.get_object ("handle") as Widgets.RichLabel;
2020-06-29 23:43:45 +02:00
profile.bind_property ("acct", handle, "text", BindingFlags.SYNC_CREATE, (b, src, ref target) => {
var text = "@" + (string) src;
target.set_string (@"<span size=\"x-large\" weight=\"bold\">$text</span>");
2020-05-29 14:19:35 +02:00
return true;
});
var note = builder.get_object ("note") as Widgets.RichLabel;
2020-06-29 23:43:45 +02:00
profile.bind_property ("note", note, "text", BindingFlags.SYNC_CREATE, (b, src, ref target) => {
2020-05-29 14:19:35 +02:00
target.set_string (Html.simplify ((string) src));
return true;
});
actions = builder.get_object ("actions") as Box;
follow_button = builder.get_object ("follow_button") as Button;
follow_button.clicked.connect (on_follow_button_clicked);
options_button = builder.get_object ("options_button") as MenuButton;
relationship = builder.get_object ("relationship") as Label;
2020-06-29 23:43:45 +02:00
// posts_label = builder.get_object ("posts_label") as Label;
// profile.bind_property ("statuses_count", posts_label, "label", BindingFlags.SYNC_CREATE, (b, src, ref target) => {
// var val = (int64) src;
// target.set_string (_("%s Posts").printf (@"<b>$val</b>"));
// return true;
// });
// following_label = builder.get_object ("following_label") as Label;
// profile.bind_property ("following_count", following_label, "label", BindingFlags.SYNC_CREATE, (b, src, ref target) => {
// var val = (int64) src;
// target.set_string (_("%s Follows").printf (@"<b>$val</b>"));
// return true;
// });
// followers_label = builder.get_object ("followers_label") as Label;
// profile.bind_property ("followers_count", followers_label, "label", BindingFlags.SYNC_CREATE, (b, src, ref target) => {
// var val = (int64) src;
// target.set_string (_("%s Followers").printf (@"<b>$val</b>"));
// return true;
// });
rebuild_fields ();
2018-04-25 15:16:57 +02:00
}
2019-03-07 17:16:52 +01:00
2019-03-11 15:14:37 +01:00
public Profile (API.Account acc) {
2020-06-29 23:43:45 +02:00
Object (
profile: acc,
url: @"/api/v1/accounts/$(acc.id)/statuses"
);
2020-05-29 14:19:35 +02:00
profile.get_relationship ();
2018-04-30 19:56:02 +02:00
}
2019-03-07 17:16:52 +01:00
2020-06-29 23:43:45 +02:00
public override void on_shown () {
window.header.custom_title = filter;
}
public override void on_hidden () {
window.header.custom_title = null;
}
void on_follow_button_clicked () {
2020-05-29 14:19:35 +02:00
actions.sensitive = false;
profile.set_following (!profile.rs.following);
}
2020-06-29 23:43:45 +02:00
void on_rs_updated () {
2020-05-29 14:19:35 +02:00
var rs = profile.rs;
var label = "";
if (actions.sensitive = rs != null) {
if (rs.requested)
label = _("Sent follow request");
else if (rs.followed_by && rs.following)
label = _("Mutually follows you");
else if (rs.followed_by)
label = _("Follows you");
foreach (Widget w in new Widget[] { follow_button, options_button }) {
var ctx = w.get_style_context ();
ctx.remove_class (STYLE_CLASS_SUGGESTED_ACTION);
ctx.remove_class (STYLE_CLASS_DESTRUCTIVE_ACTION);
ctx.add_class (rs.following ? STYLE_CLASS_DESTRUCTIVE_ACTION : STYLE_CLASS_SUGGESTED_ACTION);
}
var label2 = "";
if (rs.followed_by && !rs.following)
label2 = _("Follow back");
else if (rs.following)
label2 = _("Unfollow");
else
label2 = _("Follow");
follow_button.label = label2;
}
relationship.label = label;
2020-06-29 23:43:45 +02:00
relationship.visible = label != "";
2020-05-29 14:19:35 +02:00
}
2019-03-07 17:16:52 +01:00
2020-05-29 14:19:35 +02:00
public override Request append_params (Request req) {
2020-06-20 12:04:58 +02:00
if (page_next == null) {
2020-06-29 23:43:45 +02:00
if (exclude_replies)
req.with_param ("exclude_replies", "true");
if (only_media)
req.with_param ("only_media", "true");
2020-06-20 12:04:58 +02:00
return base.append_params (req);
}
else
return req;
2020-05-29 14:19:35 +02:00
}
2020-06-20 12:04:58 +02:00
public static void open_from_id (string id){
var url = @"$(accounts.active.instance)/api/v1/accounts/$id";
2018-10-27 10:29:25 +02:00
var msg = new Soup.Message ("GET", url);
msg.priority = Soup.MessagePriority.HIGH;
2018-06-02 10:37:28 +02:00
network.queue (msg, (sess, mess) => {
2020-06-20 12:04:58 +02:00
var node = network.parse_node (mess);
var acc = API.Account.from (node);
2019-03-17 11:26:55 +01:00
window.open_view (new Views.Profile (acc));
}, (status, reason) => {
network.on_error (status, reason);
2018-04-28 18:41:35 +02:00
});
}
2019-03-07 17:16:52 +01:00
2020-06-29 23:43:45 +02:00
[GtkTemplate (ui = "/com/github/bleakgrey/tootle/ui/widgets/profile_field_row.ui")]
protected class Field : ListBoxRow {
[GtkChild]
Widgets.RichLabel name_label;
[GtkChild]
Widgets.RichLabel value_label;
public Field (API.AccountField field) {
name_label.text = field.name;
value_label.text = field.val;
}
}
void rebuild_fields () {
if (profile.fields != null) {
foreach (Entity e in profile.fields) {
var w = new Field (e as API.AccountField);
profile_list.insert (w, 2);
}
}
}
2018-04-25 15:16:57 +02:00
}