diff --git a/po/POTFILES b/po/POTFILES index 73c89a69..fef308f2 100644 --- a/po/POTFILES +++ b/po/POTFILES @@ -2,7 +2,6 @@ src/Monitor.vala src/MainWindow.vala src/Utils.vala src/Indicator/Widgets/PopoverWidget.vala -src/Views/ProcessView/ProcessInfoView/Preventor.vala src/Views/ProcessView/ProcessInfoView/ProcessInfoHeader.vala src/Views/ProcessView/ProcessInfoView/ProcessInfoIOStats.vala src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala diff --git a/src/Views/ProcessView/ProcessInfoView/Preventor.vala b/src/Views/ProcessView/ProcessInfoView/Preventor.vala deleted file mode 100644 index 36f6f47e..00000000 --- a/src/Views/ProcessView/ProcessInfoView/Preventor.vala +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright 2025 elementary, Inc. (https://elementary.io) - * SPDX-License-Identifier: GPL-3.0-or-later - */ - -public class Monitor.Preventor : Gtk.Stack { - private Gtk.Box preventive_action_bar; - private Gtk.Label confirmation_label; - private Gtk.Button confirm_button; - private Gtk.Button deny_button; - - private Gtk.Widget child_widget; - - public signal void confirmed (bool is_confirmed); - - construct { - valign = Gtk.Align.END; - - preventive_action_bar = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0); - preventive_action_bar.valign = Gtk.Align.START; - preventive_action_bar.halign = Gtk.Align.END; - preventive_action_bar.margin_top = 10; - - - confirmation_label = new Gtk.Label (_("Are you sure you want to do this?")); - confirmation_label.margin_end = 10; - - confirm_button = new Gtk.Button.with_label (_("Yes")); - confirm_button.margin_end = 10; - confirm_button.get_style_context ().add_class (Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION); - - deny_button = new Gtk.Button.with_label (_("No")); - - preventive_action_bar.add (confirmation_label); - preventive_action_bar.add (confirm_button); - preventive_action_bar.add (deny_button); - } - - public Preventor (Gtk.Widget _child, string name) { - child_widget = _child; - add_named (child_widget, name); - add_named (preventive_action_bar, "preventive_action_bar"); - - deny_button.clicked.connect (() => { - set_transition_type (Gtk.StackTransitionType.SLIDE_UP); - set_visible_child (child_widget); - confirmed (false); - }); - - confirm_button.clicked.connect (() => { - set_transition_type (Gtk.StackTransitionType.SLIDE_UP); - set_visible_child (child_widget); - confirmed (true); - }); - } - - public void set_prevention (string confirmation_text) { - set_transition_type (Gtk.StackTransitionType.SLIDE_DOWN); - confirmation_label.set_text (_(confirmation_text)); - set_visible_child (preventive_action_bar); - } - -} diff --git a/src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala b/src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala index 7fa5d92b..8fa6f81f 100644 --- a/src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala +++ b/src/Views/ProcessView/ProcessInfoView/ProcessInfoView.vala @@ -4,7 +4,7 @@ */ public class Monitor.ProcessInfoView : Gtk.Box { - private Preventor preventor; + private Gtk.Box process_action_bar; private ProcessInfoIOStats process_info_io_stats = new ProcessInfoIOStats (); private Process _process; @@ -25,7 +25,7 @@ public class Monitor.ProcessInfoView : Gtk.Box { if (_process.uid != Posix.getuid ()) { process_info_cpu_ram.hide (); process_info_io_stats.hide (); - preventor.hide (); + process_action_bar.hide (); } else { _process.fd_permission_error.connect (show_permission_error_infobar); @@ -86,48 +86,84 @@ public class Monitor.ProcessInfoView : Gtk.Box { grid.attach (process_info_io_stats, 0, 4, 1, 1); + end_process_button = new Gtk.Button.with_label (_("Shut Down…")) { + tooltip_markup = Granite.markup_accel_tooltip ({ "E" }) + }; - var process_action_bar = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0); - process_action_bar.margin_top = 12; - process_action_bar.valign = Gtk.Align.END; - process_action_bar.halign = Gtk.Align.END; - - end_process_button = new Gtk.Button.with_label (_("End Process")); - end_process_button.margin_end = 10; - end_process_button.tooltip_markup = Granite.markup_accel_tooltip ({ "E" }, _("End selected process")); - var end_process_button_context = end_process_button.get_style_context (); - end_process_button_context.add_class (Gtk.STYLE_CLASS_SUGGESTED_ACTION); - - kill_process_button = new Gtk.Button.with_label (_("Kill Process")); - kill_process_button.tooltip_markup = Granite.markup_accel_tooltip ({ "K" }, _("Kill selected process")); - var kill_process_button_context = kill_process_button.get_style_context (); - kill_process_button_context.add_class (Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION); + kill_process_button = new Gtk.Button.with_label (_("Force Quit…")) { + tooltip_markup = Granite.markup_accel_tooltip ({ "K" }) + }; + kill_process_button.get_style_context ().add_class (Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION); + process_action_bar = new Gtk.Box (HORIZONTAL, 12) { + halign = END, + valign = END, + homogeneous = true, + margin_top = 12 + }; process_action_bar.add (end_process_button); process_action_bar.add (kill_process_button); - preventor = new Preventor (process_action_bar, "process_action_bar"); - kill_process_button.clicked.connect (() => { - preventor.set_prevention (_("Confirm kill of the process?")); - preventor.confirmed.connect ((is_confirmed) => { - if (is_confirmed) process.kill (); // maybe add a toast that process killed + var confirmation_dialog = new Granite.MessageDialog ( + _("Force “%s” to quit without initiating shutdown tasks?").printf (process_info_header.application_name.label), + _("This may lead to data loss. Only Force Quit if Shut Down has failed."), + new ThemedIcon ("computer-fail"), + Gtk.ButtonsType.CANCEL + ) { + badge_icon = new ThemedIcon ("process-stop"), + modal = true, + transient_for = (Gtk.Window) get_toplevel () + }; + + var accept_button = confirmation_dialog.add_button (_("Force Quit"), Gtk.ResponseType.ACCEPT); + accept_button.get_style_context ().add_class (Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION); + + confirmation_dialog.response.connect ((response) => { + if (response == Gtk.ResponseType.ACCEPT) { + // TODO: maybe add a toast that process killed + process.kill (); + } + + confirmation_dialog.close (); }); + + confirmation_dialog.present (); }); end_process_button.clicked.connect (() => { - preventor.set_prevention (_("Confirm end of the process?")); - preventor.confirmed.connect ((is_confirmed) => { - if (is_confirmed) process.end (); // maybe add a toast that process ended + var confirmation_dialog = new Granite.MessageDialog ( + _("Ask “%s” to shut down?").printf (process_info_header.application_name.label), + _("The process will be asked to initiate shutdown tasks and close. In some cases the process may not quit."), + new ThemedIcon ("system-shutdown"), + Gtk.ButtonsType.CANCEL + ) { + badge_icon = new ThemedIcon ("dialog-question"), + modal = true, + transient_for = (Gtk.Window) get_toplevel () + }; + + var accept_button = confirmation_dialog.add_button (_("Shut Down"), Gtk.ResponseType.ACCEPT); + accept_button.get_style_context ().add_class (Gtk.STYLE_CLASS_SUGGESTED_ACTION); + + confirmation_dialog.response.connect ((response) => { + if (response == Gtk.ResponseType.ACCEPT) { + // TODO: maybe add a toast that process killed + process.end (); + } + + confirmation_dialog.close (); }); + + confirmation_dialog.present (); }); - grid.attach (preventor, 0, 5, 1, 1); + grid.attach (process_action_bar, 0, 5); show_all (); process_info_cpu_ram.hide (); process_info_io_stats.hide (); - preventor.hide (); + process_action_bar.hide (); } private void show_permission_error_infobar (string error) { diff --git a/src/meson.build b/src/meson.build index 8e67fa6e..2c2ea3f6 100644 --- a/src/meson.build +++ b/src/meson.build @@ -20,7 +20,6 @@ source_app_files = [ 'Views/SystemView/SystemGPUView.vala', # Widgets related only to ProcessInfoView - 'Views/ProcessView/ProcessInfoView/Preventor.vala', 'Views/ProcessView/ProcessInfoView/ProcessInfoHeader.vala', 'Views/ProcessView/ProcessInfoView/ProcessInfoCPURAM.vala', 'Views/ProcessView/ProcessInfoView/ProcessInfoIOStats.vala',