From f0423b49698ebc94bf027a5d9e3a2cb74e8ff24e Mon Sep 17 00:00:00 2001 From: S4NKALP Date: Wed, 4 Dec 2024 14:25:04 +0545 Subject: [PATCH] border-radius for image on notification --- config/fabric/modules/notifications.py | 28 ++++++++++++------ config/fabric/snippets/__init__.py | 2 ++ config/fabric/snippets/custom_image.py | 39 ++++++++++++++++++++++++++ config/fabric/styles/notification.css | 4 +++ 4 files changed, 64 insertions(+), 9 deletions(-) create mode 100644 config/fabric/snippets/custom_image.py diff --git a/config/fabric/modules/notifications.py b/config/fabric/modules/notifications.py index 948b68e6..24143c3c 100644 --- a/config/fabric/modules/notifications.py +++ b/config/fabric/modules/notifications.py @@ -2,6 +2,8 @@ import gi gi.require_version("GdkPixbuf", "2.0") +from gi.repository import GdkPixbuf, GLib + from fabric.notifications import ( Notification, NotificationAction, @@ -15,7 +17,7 @@ from fabric.widgets.image import Image from fabric.widgets.label import Label from fabric.widgets.revealer import Revealer from fabric.widgets.wayland import WaylandWindow as Window -from gi.repository import GdkPixbuf, GLib +from snippets import CustomImage class ActionButton(Button): @@ -95,11 +97,16 @@ class NotificationWidget(Box): # Use provided image if available, otherwise use "notification-symbolic" icon if image_pixbuf := self._notification.image_pixbuf: body_container.add( - Image( - pixbuf=image_pixbuf.scale_simple( - 64, 64, GdkPixbuf.InterpType.BILINEAR - ) - ), + Box( + v_expand=True, + v_align="center", + children=CustomImage( + pixbuf=image_pixbuf.scale_simple( + 64, 64, GdkPixbuf.InterpType.BILINEAR + ), + style_classes="image", + ), + ) ) body_container.add( @@ -143,7 +150,12 @@ class NotificationWidget(Box): ) def get_icon(self, app_icon, app_name, size) -> Image: - + # Normalize app_name + app_name = ( + app_name.lower().replace(" ", "-") + if isinstance(app_name, str) + else app_name + ) # Attempt to load file-based icons if isinstance(app_icon, str) and app_icon.strip(): if app_icon.startswith("file://") or app_icon.startswith("/"): @@ -164,8 +176,6 @@ class NotificationWidget(Box): else: icon_name = "dialog-information-symbolic" - print(f"DEBUG: icon_name={icon_name}") - # Return a symbolic icon as fallback return Image(name="notification-icon", icon_name=icon_name, icon_size=size) diff --git a/config/fabric/snippets/__init__.py b/config/fabric/snippets/__init__.py index d6986d37..86892477 100644 --- a/config/fabric/snippets/__init__.py +++ b/config/fabric/snippets/__init__.py @@ -1,4 +1,5 @@ from .animator import Animator +from .custom_image import CustomImage from .functions import ( get_current_uptime, get_profile_picture_path, @@ -16,4 +17,5 @@ __all__ = [ "username", "IconResolver", "get_current_uptime", + "CustomImage", ] diff --git a/config/fabric/snippets/custom_image.py b/config/fabric/snippets/custom_image.py new file mode 100644 index 00000000..1aae7f6a --- /dev/null +++ b/config/fabric/snippets/custom_image.py @@ -0,0 +1,39 @@ +import math +from typing import cast + +import cairo +from gi.repository import Gtk + +from fabric.widgets.image import Image + + +class CustomImage(Image): + def do_render_rectangle( + self, cr: cairo.Context, width: int, height: int, radius: int = 0 + ): + cr.move_to(radius, 0) + cr.line_to(width - radius, 0) + cr.arc(width - radius, radius, radius, -(math.pi / 2), 0) + cr.line_to(width, height - radius) + cr.arc(width - radius, height - radius, radius, 0, (math.pi / 2)) + cr.line_to(radius, height) + cr.arc(radius, height - radius, radius, (math.pi / 2), math.pi) + cr.line_to(0, radius) + cr.arc(radius, radius, radius, math.pi, (3 * (math.pi / 2))) + cr.close_path() + + def do_draw(self, cr: cairo.Context): + context = self.get_style_context() + width, height = self.get_allocated_width(), self.get_allocated_height() + cr.save() + + self.do_render_rectangle( + cr, + width, + height, + cast(int, context.get_property("border-radius", Gtk.StateFlags.NORMAL)), + ) + cr.clip() + Image.do_draw(self, cr) + + cr.restore() diff --git a/config/fabric/styles/notification.css b/config/fabric/styles/notification.css index 88d79b72..ff185f70 100644 --- a/config/fabric/styles/notification.css +++ b/config/fabric/styles/notification.css @@ -45,3 +45,7 @@ #notification-icon { margin-right: 5px; } + +.image { + border-radius: 30px; +}