diff --git a/modules/about.py b/modules/about.py index 8029fa4..ad78bda 100644 --- a/modules/about.py +++ b/modules/about.py @@ -1,7 +1,6 @@ import subprocess -import time -import gi # type: ignore import re +import gi # type: ignore from fabric.widgets.label import Label from fabric.widgets.button import Button @@ -36,41 +35,35 @@ def get_gpu_name(): desc = line.split(":", 2)[-1] return desc.replace("Corporation", "").strip() - # Prefer dGPU for line in output: if any(vendor in line.lower() for vendor in ["nvidia", "amd", "radeon"]): return clean(line) - # Fallback to iGPU if output: return clean(output[0]) return "Unknown GPU" - except Exception: return "Unknown GPU" class About(Gtk.Window): - """About app for envshell""" - def __init__(self): super().__init__(title="About Menu") - self.set_default_size(250, 335) - self.set_size_request(250, 355) + self.set_default_size(300, 550) + self.set_size_request(300, 500) self.set_resizable(False) self.set_wmclass("modus-about-menu", "modus-about-menu") self.set_name("about-menu") self.set_visible(False) - # Main vertical box main_box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=10) - main_box.set_margin_top(20) + main_box.set_margin_top(10) main_box.set_margin_bottom(20) main_box.set_margin_start(20) main_box.set_margin_end(20) - # About logo + # Logo logo_box = Gtk.Box(halign=Gtk.Align.CENTER, valign=Gtk.Align.CENTER) pixbuf = GdkPixbuf.Pixbuf.new_from_file_at_scale( get_relative_path("../config/assets/icons/imac.svg"), @@ -80,102 +73,102 @@ class About(Gtk.Window): ) logo = Gtk.Image.new_from_pixbuf(pixbuf) logo_box.pack_start(logo, False, False, 0) + logo_box.set_margin_top(60) - # Labels - name_label = Gtk.Label(label=read_dmi("product_name")) - date_label = Gtk.Label(label=read_dmi("sys_vendor")) - - # Info Section - info_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=10) - info_title_box = Gtk.Box( - orientation=Gtk.Orientation.VERTICAL, valign=Gtk.Align.CENTER - ) - info_box_labels = Gtk.Box( - orientation=Gtk.Orientation.VERTICAL, valign=Gtk.Align.CENTER + # Product Name & Vendor + name_label = Gtk.Label() + name_label.set_margin_top(30) + name_label.set_markup( + f"{read_dmi('product_name')}" ) - # Titles - info_title_box.pack_start( - Gtk.Label(label="Kernel", halign=Gtk.Align.END), False, False, 0 - ) - info_title_box.pack_start( - Gtk.Label(label="CPU", halign=Gtk.Align.END), False, False, 0 - ) - info_title_box.pack_start( - Gtk.Label(label="Memory", halign=Gtk.Align.END), False, False, 0 - ) - info_title_box.pack_start( - Gtk.Label(label="GPU", halign=Gtk.Align.END), False, False, 0 - ) - info_title_box.pack_start( - Gtk.Label(label="Uptime", halign=Gtk.Align.END), False, False, 0 - ) + vendor_label = Gtk.Label(label=read_dmi("sys_vendor")) + vendor_label.set_name("vendor-label") + vendor_label.set_halign(Gtk.Align.CENTER) - # Values + # Info Grid + info_grid = Gtk.Grid() + info_grid.set_row_spacing(6) + info_grid.set_column_spacing(10) + info_grid.set_valign(Gtk.Align.CENTER) + info_grid.set_halign(Gtk.Align.FILL) - kernel_label = Gtk.Label( - label=subprocess.run( - "uname -r", shell=True, capture_output=True, text=True - ).stdout.strip(), - halign=Gtk.Align.START, - ) - chip_label = Gtk.Label( - label=subprocess.run( - "lscpu | grep 'Model name:' | cut -d ':' -f2-", - shell=True, - capture_output=True, - text=True, - ).stdout.strip(), - halign=Gtk.Align.START, - ) - mem_label = Gtk.Label( - label=subprocess.run( - "free -h --giga | grep Mem | tr -s ' ' | cut -d ' ' -f 2", - shell=True, - capture_output=True, - text=True, - ).stdout.strip(), - halign=Gtk.Align.START, - ) - uptime_label = Gtk.Label( - label=subprocess.run( - "uptime -p", - shell=True, - capture_output=True, - text=True, - ).stdout.strip(), - halign=Gtk.Align.START, - ) - gpu_label = Gtk.Label(label=get_gpu_name(), halign=Gtk.Align.START) + def make_label(text, align_end=False, name=None): + label = Gtk.Label(label=text) + label.set_halign(Gtk.Align.END if align_end else Gtk.Align.START) + if name: + label.set_name(name) + return label - info_box_labels.pack_start(kernel_label, False, False, 0) - info_box_labels.pack_start(chip_label, False, False, 0) - info_box_labels.pack_start(mem_label, False, False, 0) - info_box_labels.pack_start(gpu_label, False, False, 0) - info_box_labels.pack_start(uptime_label, False, False, 0) + # Info values + labels = [ + ( + "Kernel", + subprocess.run( + "uname -r", shell=True, capture_output=True, text=True + ).stdout.strip(), + ), + ( + "CPU", + subprocess.run( + "lscpu | grep 'Model name:' | cut -d ':' -f2-", + shell=True, + capture_output=True, + text=True, + ).stdout.strip(), + ), + ( + "Memory", + subprocess.run( + "free -h --giga | grep Mem | tr -s ' ' | cut -d ' ' -f 2", + shell=True, + capture_output=True, + text=True, + ).stdout.strip(), + ), + ("GPU", get_gpu_name()), + ( + "Uptime", + subprocess.run( + "uptime -p", shell=True, capture_output=True, text=True + ).stdout.strip(), + ), + ] - info_box.pack_start(info_title_box, False, False, 10) - info_box.pack_start(info_box_labels, False, False, 10) + for i, (title, value) in enumerate(labels): + title_label = make_label(title, align_end=True) + value_label = make_label(value, align_end=False, name="info-label") + info_grid.attach(title_label, 0, i, 1, 1) + info_grid.attach(value_label, 1, i, 1, 1) - # More Info Button + # Button button_box = Gtk.Box(halign=Gtk.Align.CENTER) - button_box.set_margin_top(20) # Add 20 pixels of vertical spacing + button_box.set_margin_top(20) more_info_button = Gtk.Button(label="More Info...", name="more-info-button") more_info_button.connect("clicked", self.open_more_info) button_box.pack_start(more_info_button, False, False, 0) - # Add everything to the main box + # Info Footer + info = Gtk.Label( + label="™ and © 2025 Linux Inc.\nAll rights reserved.\n\n", + justify=Gtk.Justification.CENTER, + halign=Gtk.Align.CENTER, + ) + info.set_name("info-label") + info.set_margin_top(10) + + # Layout Order main_box.pack_start(logo_box, False, False, 0) main_box.pack_start(name_label, False, False, 0) - main_box.pack_start(date_label, False, False, 0) - main_box.pack_start(info_box, False, False, 0) + main_box.pack_start(vendor_label, False, False, 0) + main_box.pack_start(info_grid, False, False, 0) main_box.pack_start(button_box, False, False, 0) + main_box.pack_start(info, False, False, 0) - # Add main box to the window self.add(main_box) def open_more_info(self, button): - # TODO: Implement the logic to open more info + # TODO: Implement the logic to open more information pass def toggle(self, b): diff --git a/styles/about.css b/styles/about.css index 1a77374..b2582c9 100644 --- a/styles/about.css +++ b/styles/about.css @@ -1,5 +1,5 @@ #about-menu { - background-color: alpha(#111, 0.1); + background-color: alpha(#111, 0.6); box-shadow: inset 0 -0.5px 0 .5px alpha(#555, 0.7), inset 0 0.5px 0 .5px alpha(#777, 0.7); border: 1px solid alpha(#111, 0.3); border-top: none; @@ -21,7 +21,14 @@ #about-button-box { padding: 1rem; } +#vendor-label{ + color: #888888; + margin-top : -1rem; +} +#info-label{ + color: #888888; +} #about-info-title-box { padding-left: 4rem; }