diff --git a/data/disk-bar-fallback.css b/data/disk-bar-fallback.css index 7660f0834..e7ca9cadd 100644 --- a/data/disk-bar-fallback.css +++ b/data/disk-bar-fallback.css @@ -18,7 +18,7 @@ */ levelbar block { - border-radius: 0.333em; + border-radius: 3px; } levelbar block:not(:first-child) { @@ -84,7 +84,6 @@ levelbar block.unused { } levelbar block image { - padding: 0.5em; -gtk-icon-palette: error #fff, success #fff, warning #fff; -gtk-icon-shadow: 0 1px 1px alpha(#000, 0.2), diff --git a/src/Widgets/DiskBar.vala b/src/Widgets/DiskBar.vala index ef43a29ba..592653d9f 100644 --- a/src/Widgets/DiskBar.vala +++ b/src/Widgets/DiskBar.vala @@ -89,7 +89,7 @@ public class Installer.DiskBar: Gtk.Grid { legend.add (legend_container); foreach (PartitionBar p in partitions) { - add_legend (p.partition.device_path, p.get_size () * 512, Distinst.strfilesys (p.partition.filesystem), p.volume_group, p.menu); + add_legend (p.path, p.get_size () * 512, Distinst.strfilesys (p.filesystem), p.vg, p.menu); } uint64 used = 0; diff --git a/src/Widgets/PartitionBar.vala b/src/Widgets/PartitionBar.vala index 0c99d944b..df44cc955 100644 --- a/src/Widgets/PartitionBar.vala +++ b/src/Widgets/PartitionBar.vala @@ -1,48 +1,80 @@ -/* - * SPDX-License-Identifier: GPL-3.0-or-later - * SPDX-FileCopyrightText: 2018-2024 elementary, Inc. (https://elementary.io) +// -*- Mode: vala; indent-tabs-mode: nil; tab-width: 4 -*- +/*- + * Copyright (c) 2018 elementary LLC. (https://elementary.io) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . * * Authored by: Michael Aaron Murphy */ -public class Installer.PartitionBar : Gtk.Box { +public class Installer.PartitionBar : Gtk.EventBox { + public Gtk.Box container; + + public uint64 start; + public uint64 end; + public uint64 used; + public new string path; + public string? vg; + + public Gtk.Label label; + public Gtk.Popover menu; + public Distinst.FileSystem filesystem; + public signal void decrypted (InstallerDaemon.LuksCredentials credential); - public Icon? icon { get; set; default = null; } - - public bool lvm { get; construct; } - public InstallerDaemon.Partition partition { get; construct; } - public string parent_path { get; construct; } - - public string? volume_group { get; private set; } - public Gtk.Popover menu { get; private set; } - - private Gtk.GestureMultiPress click_gesture; - - public PartitionBar ( - InstallerDaemon.Partition partition, - string parent_path, - uint64 sector_size, - bool lvm, - SetMount set_mount, - UnsetMount unset_mount, - MountSetFn mount_set - ) { - Object ( - lvm: lvm, - parent_path: parent_path, - partition: partition - ); - - if (partition.filesystem == LUKS) { - menu = new DecryptMenu (partition.device_path); + public PartitionBar (InstallerDaemon.Partition part, string parent_path, + uint64 sector_size, bool lvm, SetMount set_mount, + UnsetMount unset_mount, MountSetFn mount_set) { + start = part.start_sector; + end = part.end_sector; + + var usage = part.sectors_used; + if (usage.tag == 1) { + used = usage.value; + } else { + used = end - start; + } + + path = part.device_path; + filesystem = part.filesystem; + vg = (Distinst.FileSystem.LVM == filesystem) + ? part.current_lvm_volume_group + : null; + tooltip_text = path; + + var style_context = get_style_context (); + style_context.add_class (Distinst.strfilesys (filesystem)); + + container = new Gtk.Box (Gtk.Orientation.VERTICAL, 0); + + if (filesystem == Distinst.FileSystem.LUKS) { + menu = new DecryptMenu (path); ((DecryptMenu)menu).decrypted.connect ((creds) => decrypted (creds)); } else { - menu = new PartitionMenu (partition.device_path, parent_path, partition.filesystem, lvm, set_mount, unset_mount, mount_set, this); + menu = new PartitionMenu (path, parent_path, filesystem, lvm, + set_mount, unset_mount, mount_set, this); } - menu.relative_to = this; - menu.position = BOTTOM; + menu.relative_to = container; + menu.position = Gtk.PositionType.BOTTOM; + + add (container); + add_events (Gdk.EventMask.BUTTON_PRESS_MASK); + button_press_event.connect (() => { + show_popover (); + return true; + }); } class construct { @@ -50,34 +82,24 @@ public class Installer.PartitionBar : Gtk.Box { } construct { - volume_group = (partition.filesystem == LVM) ? partition.current_lvm_volume_group : null; - - var image = new Gtk.Image () { - hexpand = true, - halign = END, - valign = END - }; - - add (image); hexpand = true; - tooltip_text = partition.device_path; - - get_style_context ().add_class (Distinst.strfilesys (partition.filesystem)); - - click_gesture = new Gtk.GestureMultiPress (this); - click_gesture.released.connect (menu.popup); - - bind_property ("icon", image, "gicon", SYNC_CREATE); } public uint64 get_size () { - return partition.end_sector - partition.start_sector; + return end - start; + } + + public double get_percent (uint64 disk_sectors) { + return (((double) this.get_size () / (double) disk_sectors)); } public int calculate_length (int alloc_width, uint64 disk_sectors) { - var percent = ((double) get_size () / (double) disk_sectors); - var request = alloc_width * percent; + var request = alloc_width * get_percent (disk_sectors); if (request < 20) request = 20; return (int) request; } + + public void show_popover () { + menu.popup (); + } } diff --git a/src/Widgets/PartitionMenu.vala b/src/Widgets/PartitionMenu.vala index 18654f18d..1c04fab85 100644 --- a/src/Widgets/PartitionMenu.vala +++ b/src/Widgets/PartitionMenu.vala @@ -225,7 +225,7 @@ public class Installer.PartitionMenu : Gtk.Popover { update_values (set_mount); } else { unset_mount (partition_path); - partition_bar.icon = null; + partition_bar.container.get_children ().foreach ((c) => c.destroy ()); } bottom_revealer.reveal_child = use_partition.active; @@ -241,7 +241,7 @@ public class Installer.PartitionMenu : Gtk.Popover { type.visible = true; custom.visible = false; disable_signals = false; - partition_bar.icon = null; + partition_bar.container.get_children ().foreach ((c) => c.destroy ()); } private void set_format_sensitivity () { @@ -268,7 +268,7 @@ public class Installer.PartitionMenu : Gtk.Popover { partition_path, parent_disk, mount, - partition_bar.get_size (), + partition_bar.end - partition_bar.start, (format_partition.active ? InstallerDaemon.MountFlags.FORMAT : 0) + (is_lvm ? InstallerDaemon.MountFlags.LVM : 0), filesystem, @@ -278,13 +278,25 @@ public class Installer.PartitionMenu : Gtk.Popover { error = why.message; } - partition_bar.icon = new ThemedIcon ( - error == null ? "process-completed-symbolic" : "dialog-warning-symbolic" - ); + var mount_icon = new Gtk.Image.from_icon_name ( + error == null ? "process-completed-symbolic" : "dialog-warning-symbolic", + Gtk.IconSize.SMALL_TOOLBAR + ) { + halign = Gtk.Align.END, + valign = Gtk.Align.END, + margin_top = 6, + margin_end = 6, + margin_bottom = 6, + margin_start = 6 + }; if (error != null) { partition_bar.tooltip_text = error; } + + partition_bar.container.get_children ().foreach ((c) => c.destroy ()); + partition_bar.container.pack_start (mount_icon, true, true, 0); + partition_bar.container.show_all (); } private bool has_same_filesystem () {