Skip to content

Commit 253873f

Browse files
committed
Improve Reminder Picker
1 parent 4c45dbf commit 253873f

File tree

13 files changed

+148
-494
lines changed

13 files changed

+148
-494
lines changed

core/Objects/Item.vala

+6
Original file line numberDiff line numberDiff line change
@@ -1272,18 +1272,24 @@ public class Objects.Item : Objects.BaseObject {
12721272
if (project.backend_type == BackendType.LOCAL) {
12731273
Services.Database.get_default ().delete_item (this);
12741274
} else if (project.backend_type == BackendType.TODOIST) {
1275+
loading = true;
12751276
Services.Todoist.get_default ().delete.begin (this, (obj, res) => {
12761277
if (Services.Todoist.get_default ().delete.end (res).status) {
12771278
Services.Database.get_default ().delete_item (this);
12781279
}
1280+
1281+
loading = false;
12791282
});
12801283
} else if (project.backend_type == BackendType.CALDAV) {
1284+
loading = true;
12811285
Services.CalDAV.Core.get_default ().delete_task.begin (this, (obj, res) => {
12821286
if (Services.CalDAV.Core.get_default ().delete_task.end (res).status) {
12831287
Services.Database.get_default ().delete_item (this);
12841288
foreach (Objects.Item subitem in this.items) {
12851289
subitem.delete_item ();
12861290
}
1291+
1292+
loading = false;
12871293
}
12881294
});
12891295
}

core/Widgets/DateTimePicker/TimePicker.vala

+5-1
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ public class Widgets.DateTimePicker.TimePicker : Adw.Bin {
6767

6868
public signal void time_changed ();
6969
public signal void time_added ();
70+
public signal void activate ();
7071

7172
construct {
7273
if (format_12 == null) {
@@ -165,7 +166,10 @@ public class Widgets.DateTimePicker.TimePicker : Adw.Bin {
165166
return false;
166167
});
167168

168-
time_entry.activate.connect (is_unfocused);
169+
time_entry.activate.connect (() => {
170+
is_unfocused ();
171+
activate ();
172+
});
169173

170174
no_time_button.clicked.connect (() => {
171175
reset ();

core/Widgets/ReminderPicker/ReminderButton.vala

+35-42
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,12 @@ public class Widgets.ReminderPicker.ReminderButton : Adw.Bin {
2828

2929
public signal void reminder_added (Objects.Reminder reminder);
3030

31+
3132
public ReminderButton () {
3233
Object (
3334
is_board: false,
35+
valign: Gtk.Align.CENTER,
36+
halign: Gtk.Align.CENTER,
3437
tooltip_text: _("Add Reminders")
3538
);
3639
}
@@ -43,6 +46,8 @@ public class Widgets.ReminderPicker.ReminderButton : Adw.Bin {
4346
}
4447

4548
construct {
49+
picker = new Widgets.ReminderPicker._ReminderPicker ();
50+
4651
if (is_board) {
4752
var title_label = new Gtk.Label (_("Reminders")) {
4853
halign = START,
@@ -70,7 +75,6 @@ public class Widgets.ReminderPicker.ReminderButton : Adw.Bin {
7075
card_grid.attach (title_label, 1, 0, 1, 1);
7176
card_grid.attach (value_label, 1, 1, 1, 1);
7277

73-
picker = new Widgets.ReminderPicker._ReminderPicker ();
7478
picker.set_parent (card_grid);
7579

7680
css_classes = { "card" };
@@ -83,49 +87,38 @@ public class Widgets.ReminderPicker.ReminderButton : Adw.Bin {
8387
click_gesture.pressed.connect ((n_press, x, y) => {
8488
picker.show ();
8589
});
86-
87-
picker.reminder_added.connect ((reminder) => {
88-
reminder_added (reminder);
89-
});
9090
} else {
91-
// var reminder_picker = new Widgets.ReminderPicker.ReminderPicker (item);
92-
93-
// var indicator_grid = new Gtk.Grid () {
94-
// width_request = 9,
95-
// height_request = 9,
96-
// margin_top = 3,
97-
// margin_end = 3,
98-
// css_classes = { "indicator" }
99-
// };
100-
101-
// indicator_revealer = new Gtk.Revealer () {
102-
// transition_type = Gtk.RevealerTransitionType.CROSSFADE,
103-
// child = indicator_grid,
104-
// halign = END,
105-
// valign = START,
106-
// };
107-
108-
// var button = new Gtk.MenuButton () {
109-
// icon_name = "alarm-symbolic",
110-
// popover = reminder_picker,
111-
// css_classes = { "flat" }
112-
// };
113-
114-
// var overlay = new Gtk.Overlay ();
115-
// overlay.child = button;
116-
// overlay.add_overlay (indicator_revealer);
117-
118-
// child = overlay;
119-
// update_request ();
120-
121-
// item.reminder_added.connect (() => {
122-
// update_request ();
123-
// });
124-
125-
// item.reminder_deleted.connect (() => {
126-
// update_request ();
127-
// });
91+
var indicator_grid = new Gtk.Grid () {
92+
width_request = 9,
93+
height_request = 9,
94+
margin_top = 3,
95+
margin_end = 3,
96+
css_classes = { "indicator" }
97+
};
98+
99+
indicator_revealer = new Gtk.Revealer () {
100+
transition_type = Gtk.RevealerTransitionType.CROSSFADE,
101+
child = indicator_grid,
102+
halign = END,
103+
valign = START,
104+
};
105+
106+
var button = new Gtk.MenuButton () {
107+
icon_name = "alarm-symbolic",
108+
popover = picker,
109+
css_classes = { "flat" }
110+
};
111+
112+
var overlay = new Gtk.Overlay ();
113+
overlay.child = button;
114+
overlay.add_overlay (indicator_revealer);
115+
116+
child = overlay;
128117
}
118+
119+
picker.reminder_added.connect ((reminder) => {
120+
reminder_added (reminder);
121+
});
129122
}
130123

131124
public void set_reminders (Gee.ArrayList<Objects.Reminder> reminders) {

core/Widgets/ReminderPicker/ReminderPicker.vala

+14-1
Original file line numberDiff line numberDiff line change
@@ -76,19 +76,32 @@ public class Widgets.ReminderPicker._ReminderPicker : Gtk.Popover {
7676
child = main_stack;
7777

7878
add_button.clicked.connect (() => {
79+
calendar.date = new GLib.DateTime.now_local ();
80+
7981
time_picker.has_time = true;
8082
time_picker.no_time_visible = false;
8183
time_picker.time = new GLib.DateTime.now_local ().add_hours (1);
84+
8285
main_stack.visible_child_name = "picker";
8386
});
8487

88+
time_picker.activate.connect (insert_reminder);
89+
8590
closed.connect (() => {
8691
main_stack.visible_child_name = "listbox";
8792
submit_button.is_loading = false;
8893
});
8994
}
9095

9196
private void insert_reminder () {
97+
if (calendar.date == null) {
98+
return;
99+
}
100+
101+
if (time_picker.time == null) {
102+
return;
103+
}
104+
92105
var reminder = new Objects.Reminder ();
93106
reminder.due.date = Util.get_default ().get_todoist_datetime_format (get_datetime_picker ());
94107

@@ -104,7 +117,7 @@ public class Widgets.ReminderPicker._ReminderPicker : Gtk.Popover {
104117
calendar.date.get_day_of_month (),
105118
time_picker.time.get_hour (),
106119
time_picker.time.get_minute (),
107-
0
120+
time_picker.time.get_seconds ()
108121
);
109122
}
110123

src/App.vala

+13
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ public class Planify : Adw.Application {
113113
if (Services.Settings.get_default ().settings.get_string ("version") != Build.VERSION) {
114114
Services.Settings.get_default ().settings.set_boolean ("show-support-banner", true);
115115
}
116+
117+
// Actions
118+
build_shortcuts ();
116119
}
117120

118121
public async bool ask_for_background (Xdp.BackgroundFlags flags = Xdp.BackgroundFlags.AUTOSTART) {
@@ -146,6 +149,16 @@ public class Planify : Adw.Application {
146149
}
147150
}
148151

152+
private void build_shortcuts () {
153+
var show_item = new SimpleAction ("show-item", VariantType.STRING);
154+
show_item.activate.connect ((parameter) => {
155+
Planify.instance.main_window.view_item (parameter.get_string ());
156+
activate ();
157+
});
158+
159+
add_action (show_item);
160+
}
161+
149162
public static int main (string[] args) {
150163
// NOTE: Workaround for https://github.com/alainm23/planify/issues/1069
151164
GLib.Environment.set_variable ("WEBKIT_DISABLE_COMPOSITING_MODE", "1", true);

src/Layouts/ItemRow.vala

+35-20
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@ public class Layouts.ItemRow : Layouts.ItemBase {
2828
private Gtk.Revealer motion_top_revealer;
2929

3030
private Gtk.CheckButton checked_button;
31-
private Gtk.Button checked_repeat_button;
3231
private Gtk.Stack checked_stack;
3332
private Gtk.Revealer checked_button_revealer;
3433
private Widgets.TextView content_textview;
@@ -63,7 +62,7 @@ public class Layouts.ItemRow : Layouts.ItemBase {
6362
private Widgets.PriorityButton priority_button;
6463
private Widgets.LabelPicker.LabelButton label_button;
6564
private Widgets.PinButton pin_button;
66-
private Widgets.ReminderButton reminder_button;
65+
private Widgets.ReminderPicker.ReminderButton reminder_button;
6766
private Gtk.Button add_button;
6867
private Gtk.Box action_box;
6968

@@ -227,19 +226,10 @@ public class Layouts.ItemRow : Layouts.ItemBase {
227226
tooltip_text = item.content
228227
};
229228

230-
checked_repeat_button = new Gtk.Button.from_icon_name ("view-refresh-symbolic") {
231-
valign = Gtk.Align.CENTER,
232-
css_classes = { "flat", "no-padding" }
233-
};
234-
235-
checked_stack = new Gtk.Stack () {
236-
transition_type = Gtk.StackTransitionType.CROSSFADE
237-
};
238-
239229
checked_button_revealer = new Gtk.Revealer () {
240230
transition_type = Gtk.RevealerTransitionType.SWING_RIGHT,
241231
child = checked_button,
242-
valign = Gtk.Align.START,
232+
valign = Gtk.Align.CENTER,
243233
reveal_child = true
244234
};
245235

@@ -426,7 +416,7 @@ public class Layouts.ItemRow : Layouts.ItemBase {
426416
sensitive = !item.completed
427417
};
428418

429-
reminder_button = new Widgets.ReminderButton (item) {
419+
reminder_button = new Widgets.ReminderPicker.ReminderButton () {
430420
sensitive = !item.completed
431421
};
432422

@@ -618,13 +608,6 @@ public class Layouts.ItemRow : Layouts.ItemBase {
618608
checked_toggled (checked_button.active);
619609
});
620610

621-
var repeat_button_gesture = new Gtk.GestureClick ();
622-
checked_repeat_button.add_controller (repeat_button_gesture);
623-
repeat_button_gesture.pressed.connect (() => {
624-
repeat_button_gesture.set_state (Gtk.EventSequenceState.CLAIMED);
625-
update_next_recurrency ();
626-
});
627-
628611
var hide_loading_gesture = new Gtk.GestureClick ();
629612
hide_loading_button.add_controller (hide_loading_gesture);
630613
hide_loading_gesture.pressed.connect (() => {
@@ -733,6 +716,37 @@ public class Layouts.ItemRow : Layouts.ItemBase {
733716
item.show_item_changed.connect (() => {
734717
main_revealer.reveal_child = item.show_item;
735718
});
719+
720+
reminder_button.reminder_added.connect ((reminder) => {
721+
reminder.item_id = item.id;
722+
723+
if (item.project.backend_type == BackendType.TODOIST) {
724+
item.loading = true;
725+
Services.Todoist.get_default ().add.begin (reminder, (obj, res) => {
726+
HttpResponse response = Services.Todoist.get_default ().add.end (res);
727+
item.loading = false;
728+
729+
if (response.status) {
730+
reminder.id = response.data;
731+
} else {
732+
reminder.id = Util.get_default ().generate_id (reminder);
733+
}
734+
735+
item.add_reminder_if_not_exists (reminder);
736+
});
737+
} else {
738+
reminder.id = Util.get_default ().generate_id (reminder);
739+
item.add_reminder_if_not_exists (reminder);
740+
}
741+
});
742+
743+
item.reminder_added.connect ((reminder) => {
744+
reminder_button.add_reminder (reminder, item.reminders);
745+
});
746+
747+
item.reminder_deleted.connect ((reminder) => {
748+
reminder_button.delete_reminder (reminder, item.reminders);
749+
});
736750
}
737751

738752
public void check_hide_subtask_button () {
@@ -788,6 +802,7 @@ public class Layouts.ItemRow : Layouts.ItemBase {
788802
schedule_button.update_from_item (item);
789803
priority_button.update_from_item (item);
790804
pin_button.update_from_item (item);
805+
reminder_button.set_reminders (item.reminders);
791806

792807
check_due ();
793808
check_description ();

src/MainWindow.vala

+5
Original file line numberDiff line numberDiff line change
@@ -423,6 +423,11 @@ public class MainWindow : Adw.ApplicationWindow {
423423
);
424424
}
425425

426+
public void view_item (string id) {
427+
var item = Services.Database.get_default ().get_item_by_id (id);
428+
Services.EventBus.get_default ().pane_selected (PaneType.PROJECT, item.project_id);
429+
}
430+
426431
public void valid_view_removed (Objects.Project project) {
427432
Views.Project? project_view;
428433
project_view = (Views.Project) views_stack.get_child_by_name (project.view_id);

0 commit comments

Comments
 (0)