Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 5 additions & 8 deletions src/Grid/EventButton.vala
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,9 @@ public class Maya.View.EventButton : Gtk.Revealer {

add (event_box);

var context_menu = Maya.EventMenu.build (comp);
context_menu.attach_to_widget (this, null);

click_gesture = new Gtk.GestureMultiPress (this) {
button = 0
};
Expand All @@ -68,10 +71,7 @@ public class Maya.View.EventButton : Gtk.Revealer {
}

if (event.triggers_context_menu ()) {
var menu = new Maya.EventMenu (comp);
menu.attach_to_widget (this, null);

menu.popup_at_pointer (event);
context_menu.popup_at_pointer (event);

click_gesture.set_state (CLAIMED);
click_gesture.reset ();
Expand All @@ -85,10 +85,7 @@ public class Maya.View.EventButton : Gtk.Revealer {
var sequence = long_press_gesture.get_current_sequence ();
var event = long_press_gesture.get_last_event (sequence);

var menu = new Maya.EventMenu (comp);
menu.attach_to_widget (this, null);

menu.popup_at_pointer (event);
context_menu.popup_at_pointer (event);

long_press_gesture.set_state (CLAIMED);
long_press_gesture.reset ();
Expand Down
13 changes: 5 additions & 8 deletions src/Widgets/AgendaEventRow.vala
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,9 @@ public class Maya.View.AgendaEventRow : Gtk.ListBoxRow {

child = revealer;

var context_menu = Maya.EventMenu.build (calevent);
context_menu.attach_to_widget (this, null);

var cal = (E.SourceCalendar)source.get_extension (E.SOURCE_EXTENSION_CALENDAR);

reload_css (cal.dup_color ());
Expand Down Expand Up @@ -266,10 +269,7 @@ public class Maya.View.AgendaEventRow : Gtk.ListBoxRow {
var event = click_gesture.get_last_event (sequence);

if (event.triggers_context_menu ()) {
var menu = new Maya.EventMenu (calevent);
menu.attach_to_widget (this, null);

menu.popup_at_pointer (event);
context_menu.popup_at_pointer (event);

click_gesture.set_state (CLAIMED);
click_gesture.reset ();
Expand All @@ -283,10 +283,7 @@ public class Maya.View.AgendaEventRow : Gtk.ListBoxRow {
var sequence = long_press_gesture.get_current_sequence ();
var event = long_press_gesture.get_last_event (sequence);

var menu = new Maya.EventMenu (calevent);
menu.attach_to_widget (this, null);

menu.popup_at_pointer (event);
context_menu.popup_at_pointer (event);

long_press_gesture.set_state (CLAIMED);
long_press_gesture.reset ();
Expand Down
73 changes: 26 additions & 47 deletions src/Widgets/EventMenu.vala
Original file line number Diff line number Diff line change
@@ -1,84 +1,63 @@
/*
* SPDX-License-Identifier: GPL-3.0-or-later
* SPDX-FileCopyrightText: 2011-2025 elementary, Inc. (https://elementary.io)
* SPDX-FileCopyrightText: 2011-2026 elementary, Inc. (https://elementary.io)
*
* Authored by: Maxwell Barvian
* Corentin Noël <[email protected]>
*/

public class Maya.EventMenu : Gtk.Menu {
public ECal.Component comp { get; construct set; }

public EventMenu (ECal.Component comp) {
Object (comp: comp);
}

construct {
E.Source src = comp.get_data ("source");
bool sensitive = src.writable == true && Calendar.EventStore.get_default ().calclient_is_readonly (src) == false;

namespace Maya.EventMenu {
public static Gtk.Menu build (ECal.Component comp) {
var action_edit = new GLib.SimpleAction ("edit", null);
action_edit.set_enabled (sensitive);
action_edit.activate.connect (() => {
((Maya.Application) GLib.Application.get_default ()).window.on_modified (comp);
});

var action_duplicate = new GLib.SimpleAction ("duplicate", null);
action_duplicate.set_enabled (sensitive);
action_duplicate.activate.connect (() => {
((Maya.Application) GLib.Application.get_default ()).window.on_duplicated (comp);
});

var action_remove = new GLib.SimpleAction ("remove", null);
action_remove.set_enabled (sensitive);
action_remove.activate.connect (remove_event);
action_remove.activate.connect (() => remove_event (comp));

var action_add_exception = new GLib.SimpleAction ("add-exception", null);
action_add_exception.set_enabled (sensitive);
action_add_exception.activate.connect (add_exception);

action_add_exception.activate.connect (() => add_exception (comp));

var action_group = new SimpleActionGroup ();
action_group.add_action (action_edit);
action_group.add_action (action_duplicate);
action_group.add_action (action_remove);
action_group.add_action (action_add_exception);

insert_action_group ("event", action_group);

var edit_item = new Gtk.MenuItem.with_label (_("Edit…")) {
action_name = "event.edit"
};

var duplicate_item = new Gtk.MenuItem.with_label (_("Duplicate…")) {
action_name = "event.duplicate"
};
var menu_model = new GLib.Menu ();
menu_model.append (_("Edit…"), "event.edit");
menu_model.append (_("Duplicate…"), "event.duplicate");

Gtk.MenuItem remove_item;
if (comp.has_recurrences ()) {
remove_item = new Gtk.MenuItem.with_label (_("Remove Event")) {
action_name = "event.remove"
};

var exception_item = new Gtk.MenuItem.with_label (_("Remove Occurrence")) {
action_name = "event.add-exception"
};

append (exception_item);
menu_model.prepend (_("Remove Event"), "event.remove");
menu_model.insert (1, _("Remove Occurrence"), "event.add-exception");
} else {
remove_item = new Gtk.MenuItem.with_label (_("Remove")) {
action_name = "event.remove"
};
menu_model.prepend (_("Remove"), "event.remove");
}

append (remove_item);
append (edit_item);
append (duplicate_item);
var menu = new Gtk.Menu.from_model (menu_model);
menu.insert_action_group ("event", action_group);

E.Source src = comp.get_data ("source");
menu.popped_up.connect (() => {
var sensitive = src.writable && !Calendar.EventStore.get_default ().calclient_is_readonly (src);

action_edit.set_enabled (sensitive);
action_duplicate.set_enabled (sensitive);
action_remove.set_enabled (sensitive);
action_add_exception.set_enabled (sensitive);
});

show_all ();
return menu;
}

private void remove_event () {
private static void remove_event (ECal.Component comp) {
var application = (Gtk.Application) GLib.Application.get_default ();
var source = comp.get_data<E.Source> ("source");
var delete_dialog = new Calendar.DeleteEventDialog (source, comp, ECal.ObjModType.ALL) {
Expand All @@ -87,7 +66,7 @@ public class Maya.EventMenu : Gtk.Menu {
delete_dialog.run_dialog ();
}

private void add_exception () {
private static void add_exception (ECal.Component comp) {
var application = (Gtk.Application) GLib.Application.get_default ();
var source = comp.get_data<E.Source> ("source");
var delete_dialog = new Calendar.DeleteEventDialog (source, comp, ECal.ObjModType.THIS) {
Expand Down