Get activities from server and refresh on session log

This commit is contained in:
Camden Dixie O'Brien 2025-03-02 10:26:23 +00:00
parent bf876336f2
commit 0f0bd37cc8
2 changed files with 27 additions and 22 deletions

View File

@ -1,6 +1,7 @@
namespace StudySystemClient { namespace StudySystemClient {
public class ActivitiesView : Gtk.Box { public class ActivitiesView : Gtk.Box {
private Client client; private Client client;
private Gtk.FlowBox card_container;
public ActivitiesView(Client client) { public ActivitiesView(Client client) {
margin_top = margin_bottom = margin_start = margin_end = 0; margin_top = margin_bottom = margin_start = margin_end = 0;
@ -9,38 +10,43 @@ namespace StudySystemClient {
var scrolled_window = new Gtk.ScrolledWindow(); var scrolled_window = new Gtk.ScrolledWindow();
scrolled_window.hscrollbar_policy = Gtk.PolicyType.NEVER; scrolled_window.hscrollbar_policy = Gtk.PolicyType.NEVER;
scrolled_window.vexpand = true; scrolled_window.vexpand = true;
scrolled_window.add_css_class("card-container");
var card_container = new Gtk.FlowBox(); card_container = new Gtk.FlowBox();
card_container.homogeneous = true; card_container.homogeneous = true;
card_container.min_children_per_line = 1; card_container.min_children_per_line = 1;
card_container.max_children_per_line = 1; card_container.max_children_per_line = 1;
card_container.selection_mode = Gtk.SelectionMode.NONE; card_container.selection_mode = Gtk.SelectionMode.NONE;
card_container.valign = Gtk.Align.START; card_container.valign = Gtk.Align.START;
scrolled_window.add_css_class("card-container"); scrolled_window.set_child(card_container);
var activities = new Activity[] { this.append(scrolled_window);
{ "Linguistics", ActivityType.EXERCISES },
{ "Cybernetics", ActivityType.EXERCISES }, refresh.begin((obj, res) => {
{ "Linguistics", ActivityType.READING }, refresh.end(res);
{ "Physics", ActivityType.READING }, });
{ "Cybernetics", ActivityType.READING }, }
{ "Physics", ActivityType.EXERCISES },
}; private async void refresh() {
try {
var activities = yield client.list_activities();
card_container.remove_all();
foreach (var activity in activities) { foreach (var activity in activities) {
var card = new ActivityCard(activity); var card = new ActivityCard(activity);
card.session_logged.connect(log_session); card.session_logged.connect(log_session);
card_container.append(card); card_container.append(card);
} }
} catch (ClientError e) {
scrolled_window.set_child(card_container); stderr.printf("Error refreshing activities: %s\n",
this.append(scrolled_window); e.message);
}
} }
private async void log_session(string subject, ActivityType type, private async void log_session(string subject, ActivityType type,
int minutes) { int minutes) {
try { try {
yield client.log_session(subject, type, minutes); yield client.log_session(subject, type, minutes);
stderr.printf("Successfully logged session\n"); yield refresh();
} catch (ClientError e) { } catch (ClientError e) {
stderr.printf("Error logging session: %s\n", e.message); stderr.printf("Error logging session: %s\n", e.message);
} }

View File

@ -40,7 +40,7 @@ namespace StudySystemClient.Response {
protected enum Tag { protected enum Tag {
ERROR = 0, ERROR = 0,
ACK = 1, ACK = 1,
PRIORITIZED_ACTIVITIES = 2, ACTIVITIES = 2,
} }
internal static Body from_datum(Der.Datum datum) throws DecodeError { internal static Body from_datum(Der.Datum datum) throws DecodeError {
@ -54,9 +54,8 @@ namespace StudySystemClient.Response {
return new Error.from_datum(choice.value); return new Error.from_datum(choice.value);
case Tag.ACK: case Tag.ACK:
return new Ack.from_datum(choice.value); return new Ack.from_datum(choice.value);
case Tag.PRIORITIZED_ACTIVITIES: case Tag.ACTIVITIES:
throw new DecodeError.NOT_IMPLEMENTED( return new Activities.from_datum(choice.value);
"PrioritizedActivities not yet implemented");
default: default:
throw new DecodeError.INVALID_BODY( throw new DecodeError.INVALID_BODY(
"Invalid ResponseBody tag"); "Invalid ResponseBody tag");