Files
blender-portable-repo/scripts/addons/poliigon-addon-blender/dialogs/dlg_area_notifications.py
T
2026-03-17 14:58:51 -06:00

273 lines
8.8 KiB
Python

# #### BEGIN GPL LICENSE BLOCK #####
#
# 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 2
# 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, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
#
# ##### END GPL LICENSE BLOCK #####
import bpy
from ..modules.poliigon_core.multilingual import _t
from ..modules.poliigon_core.notifications import ActionType
from ..constants import URLS_BLENDER
from .utils_dlg import (
get_ui_scale,
wrapped_label)
# from .. import reporting
def build_mode(url, action, id_notice):
return "notify@{}@{}@{}".format(url, action, id_notice)
def _draw_notification_open_url_two_rows(
cTB, notice, first_row, main_col, icon) -> None:
# Two rows (or more, if text wrapping).
col = first_row.column(align=True)
col.alert = True
# Empirically found squaring worked best for 1 & 2x displays,
# which accounts for the box+panel padding and the 'x' button.
if notice.allow_dismiss:
padding_width = 32 * get_ui_scale(cTB)
else:
padding_width = 17 * get_ui_scale(cTB)
wrapped_label(
cTB, cTB.width_draw_ui - padding_width, notice.title, col)
col.alert = False
second_row = main_col.row(align=True)
second_row.scale_y = 1.0
op = second_row.operator(
"poliigon.poliigon_link",
icon=icon,
text=notice.label,
)
if notice.tooltip != "":
op.tooltip = notice.tooltip
op.mode = build_mode(
notice.url,
notice.label,
notice.id_notice)
def _draw_notification_open_url(
cTB, notice, first_row, main_col, panel_width, icon) -> None:
_draw_notification_open_url_two_rows(cTB, notice, first_row, main_col, icon)
def _draw_notification_update_ready_single_row(cTB, notice, first_row, icon) -> None:
# Single row with text + button.
first_row.alert = True
first_row.label(text=notice.title)
first_row.alert = False
splitrow = first_row.split(factor=0.7, align=True)
splitcol = splitrow.split(align=True)
label = notice.label
if label == "":
label = notice.title
op = splitcol.operator(
"poliigon.poliigon_link",
icon=icon,
text=label,
)
if notice.tooltip != "":
op.tooltip = notice.tooltip
op.mode = build_mode(
notice.download_url, notice.label, notice.id_notice)
splitcol = splitrow.split(align=True)
op = splitcol.operator(
"poliigon.poliigon_link",
text="Logs",
)
# if notice.tooltip is not None:
op.tooltip = _t("See changes in this version")
op.mode = build_mode(
URLS_BLENDER["changelog"], "Logs", notice.id_notice)
def _draw_notification_update_ready_two_rows(
cTB, notice, first_row, main_col, icon) -> None:
# Two rows (or more, if text wrapping).
col = first_row.column(align=True)
col.alert = True
if notice.allow_dismiss:
padding_width = 32 * get_ui_scale(cTB)
else:
padding_width = 17 * get_ui_scale(cTB)
wrapped_label(
cTB, cTB.width_draw_ui - padding_width, notice.title, col)
col.alert = False
label = notice.label
if label == "":
label = notice.title
second_row = main_col.row(align=True)
splitrow = second_row.split(factor=0.7, align=True)
splitcol = splitrow.split(align=True)
op = splitcol.operator(
"poliigon.poliigon_link",
icon=icon,
text=label,
)
if notice.tooltip != "":
op.tooltip = notice.tooltip
op.mode = build_mode(
notice.download_url, notice.label, notice.id_notice)
splitcol = splitrow.split(align=True)
op = splitcol.operator(
"poliigon.poliigon_link",
text="Logs",
)
op.tooltip = _t("See changes in this version")
op.mode = build_mode(
URLS_BLENDER["changelog"], "Logs", notice.id_notice)
def _draw_notification_update_ready(
cTB, notice, first_row, main_col, panel_width, icon) -> None:
# Empirical for width for "Update ready: Download | logs".
single_row_width = 300
if panel_width > single_row_width:
_draw_notification_update_ready_single_row(
cTB, notice, first_row, icon)
else:
_draw_notification_update_ready_two_rows(
cTB, notice, first_row, main_col, icon)
def _draw_notification_popup_message_two_rows(
cTB, notice, first_row, main_col, icon) -> bpy.types.Operator:
# Two rows (or more, if text wrapping).
col = first_row.column(align=True)
col.alert = notice.alert
# Empirically found squaring worked best for 1 & 2x displays,
# which accounts for the box+panel padding and the 'x' button.
if notice.allow_dismiss:
padding_width = 32 * get_ui_scale(cTB)
else:
padding_width = 17 * get_ui_scale(cTB)
wrapped_label(
cTB, cTB.width_draw_ui - padding_width, notice.title, col)
col.alert = False
second_row = main_col.row(align=True)
second_row.scale_y = 1.0
op = second_row.operator(
"poliigon.popup_message",
icon=icon,
text="View",
)
return op
def _draw_notification_popup_message(
cTB, notice, first_row, main_col, panel_width, icon) -> None:
op = _draw_notification_popup_message_two_rows(
cTB, notice, first_row, main_col, icon)
op.message_body = notice.body
op.notice_id = notice.id_notice
if notice.tooltip != "":
op.tooltip = notice.tooltip
if notice.url != "":
op.message_url = notice.url
def _draw_notification_run_operator(cTB, notice, first_row, icon) -> None:
# Single row with only a button.
op = first_row.operator(
"poliigon.notice_operator",
text=notice.title,
icon=icon,
)
op.notice_id = notice.id_notice
op.ops_name = notice.ops_name
op.tooltip = notice.tooltip
def _draw_notification_none_action(cTB, notice, first_row, icon) -> None:
"""Draws a notification with no clickable action - just text with dismiss button."""
# Create a row with icon on the left and text in center (X button handled by main function)
row = first_row.row(align=True)
# Icon column on the left - single row for compact height
icon_col = row.column(align=True)
icon_col.alignment = "CENTER"
icon_col.label(text="", icon=icon)
# Text column in center - fills remaining space
text_col = row.column()
text_col.alignment = "CENTER"
# Using full available width for text
wrapped_label(
cTB, cTB.width_draw_ui, notice.title, text_col)
text_col.alert = False
# TODO(Andreas): deactivated reporting here, as I needed a third parameter and
# was not able to quickly make handle_draw() work
# @reporting.handle_draw()
def notification_banner(cTB, layout):
"""General purpose notification banner UI draw element."""
notice = cTB.notify.get_top_notice()
if notice is None:
return
box = layout.box()
row = box.row(align=True)
main_col = row.column(align=True)
scale = max(get_ui_scale(cTB), 1)
panel_width = cTB.width_draw_ui / scale
first_row = main_col.row(align=False)
x_row = first_row # x_row is the row to add the x button to, if there.
# Only purpose is to trigger view signal (only once)
cTB.notify.notification_popup(notice, do_signal_view=True)
icon = notice.icon
if icon is None:
icon = "NONE"
if notice.action == ActionType.OPEN_URL:
_draw_notification_open_url(
cTB, notice, first_row, main_col, panel_width, icon)
elif notice.action == ActionType.UPDATE_READY:
_draw_notification_update_ready(
cTB, notice, first_row, main_col, panel_width, icon)
elif notice.action == ActionType.POPUP_MESSAGE:
_draw_notification_popup_message(
cTB, notice, first_row, main_col, panel_width, icon)
elif notice.action == ActionType.RUN_OPERATOR:
_draw_notification_run_operator(cTB, notice, first_row, icon)
elif notice.action == ActionType.NONE:
_draw_notification_none_action(cTB, notice, first_row, icon)
else:
main_col.label(text=notice.title)
cTB.logger_ui.error("Invalid notifcation type")
if notice.allow_dismiss:
right_col = x_row.column(align=True)
right_col.operator(
"poliigon.close_notification", icon="X", text="", emboss=False)
layout.separator()