Skip to content
11 changes: 6 additions & 5 deletions src/one_dragon/utils/log_utils.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import logging
import os
from contextlib import suppress
from dataclasses import dataclass
from logging.handlers import TimedRotatingFileHandler
from pathlib import Path

from one_dragon.utils import os_utils

Expand Down Expand Up @@ -139,12 +139,13 @@ def get_log_file_path(log_file_path: str | None = None, default_name: str = 'log
configured = (log_file_path or '').strip()
if not configured:
configured = default_name
if os.path.isabs(configured):
return configured
return os.path.join(os_utils.get_path_under_work_dir('.log'), configured)
path = Path(configured)
if path.is_absolute():
return str(path)
return str(Path(os_utils.get_path_under_work_dir('.log')) / path)


def get_logger():
def get_logger() -> logging.Logger:
"""获取框架默认 logger。

若尚未初始化,则按默认配置初始化一次;若已经存在框架默认 handler,则直接复用。
Expand Down
18 changes: 10 additions & 8 deletions src/one_dragon_qt/view/setting/setting_push_interface.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import json

from PySide6.QtWidgets import QWidget
from qfluentwidgets import FluentIcon, InfoBar, InfoBarPosition, PushButton, SettingCard
from qfluentwidgets import FluentIcon, InfoBar, InfoBarPosition, PushButton

from one_dragon.base.config.config_item import ConfigItem
from one_dragon.base.controller.pc_clipboard import PcClipboard
Expand Down Expand Up @@ -35,7 +35,6 @@
)
from one_dragon_qt.widgets.setting_card.switch_setting_card import SwitchSettingCard
from one_dragon_qt.widgets.setting_card.text_setting_card import TextSettingCard
from one_dragon_qt.widgets.setting_card.yaml_config_adapter import YamlConfigAdapter
from one_dragon_qt.widgets.vertical_scroll_interface import VerticalScrollInterface


Expand Down Expand Up @@ -103,9 +102,12 @@ def get_content_widget(self) -> QWidget:
)
self.notification_method_opt.value_changed.connect(self._update_notification_ui)

channel_group = ExpandSettingCardGroup(icon=FluentIcon.MESSAGE, title='通知方式')
channel_group = ExpandSettingCardGroup(
icon=FluentIcon.MESSAGE,
title='通知方式',
initial_expand=True,
)
channel_group.addHeaderWidget(self.notification_method_opt.combo_box)
channel_group.setExpand(True)
content_widget.add_widget(channel_group)

# 预创建特殊卡片(稍后按渠道分配)
Expand Down Expand Up @@ -273,17 +275,17 @@ def _on_email_service_selected(self, text):
smtp_port = config.get("port", 465)
smtp_ssl = str(config.get("secure", True)).lower() if "secure" in config else "true"
# 找到对应的TextSettingCard并赋值
server_card: SettingCard = getattr(self, "smtp_server_push_card", None)
server_card = getattr(self, "smtp_server_push_card", None)
if server_card is not None:
host = f"{smtp_server}:{smtp_port}"
server_card.setValue(host)
adapter: YamlConfigAdapter = getattr(server_card, "adapter", None)
adapter = getattr(server_card, "adapter", None)
if adapter is not None:
adapter.set_value(host)
ssl_card: SettingCard = getattr(self, "smtp_ssl_push_card", None)
ssl_card = getattr(self, "smtp_ssl_push_card", None)
if ssl_card is not None:
ssl_card.setValue(smtp_ssl)
adapter: YamlConfigAdapter = getattr(ssl_card, "adapter", None)
adapter = getattr(ssl_card, "adapter", None)
if adapter is not None:
adapter.set_value(smtp_ssl)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from PySide6.QtCore import QEvent, QObject
from typing import Any

from PySide6.QtCore import QAbstractAnimation, QEvent, QObject, QTimer
from PySide6.QtGui import QIcon
from PySide6.QtWidgets import QWidget
from qfluentwidgets import ExpandSettingCard, FluentIconBase
from qfluentwidgets import ExpandSettingCard, FluentIcon
from qfluentwidgets.components.settings.expand_setting_card import GroupSeparator

from one_dragon.utils.i18_utils import gt
Expand All @@ -15,9 +17,10 @@ class ExpandSettingCardGroup(ExpandSettingCard):

def __init__(
self,
icon: FluentIconBase | QIcon | str,
icon: str | QIcon | FluentIcon,
title: str,
content: str | None = None,
initial_expand: bool = False,
parent: QWidget | None = None,
):
super().__init__(icon, gt(title), parent=parent)
Expand All @@ -26,6 +29,10 @@ def __init__(
self.viewLayout.setContentsMargins(0, 0, 0, 0)
self.viewLayout.setSpacing(0)
self._card_sep_pairs: list[tuple[QWidget, GroupSeparator | None]] = []
if initial_expand:
self.setExpand(True)
self.expandAni.valueChanged.connect(self._sync_parent_layout)
self.expandAni.finished.connect(self._refresh_view_size)

def addHeaderWidget(self, widget: QWidget) -> None:
"""在头部 expandButton 左侧添加操作组件"""
Expand All @@ -38,7 +45,11 @@ def addSettingCard(self, card: QWidget) -> None:
sep = GroupSeparator(self.view)
self.viewLayout.addWidget(sep)

card.paintEvent = lambda _e: None
def paint_event_override(_e) -> None:
return None

paint_event_override_any: Any = paint_event_override
card.paintEvent = paint_event_override_any
card.setParent(self.view)
self.viewLayout.addWidget(card)
self._card_sep_pairs.append((card, sep))
Expand All @@ -50,10 +61,14 @@ def addSettingCards(self, cards: list[QWidget]) -> None:
for card in cards:
self.addSettingCard(card)

def eventFilter(self, obj: QObject, event: QEvent) -> bool:
if event.type() in (QEvent.Type.Show, QEvent.Type.Hide):
self._update_separators()
return super().eventFilter(obj, event)
def eventFilter(self, arg__1: QObject, arg__2: QEvent) -> bool:
if arg__2.type() in (QEvent.Type.Show, QEvent.Type.Hide):
QTimer.singleShot(0, self._update_separators)
elif arg__2.type() in (QEvent.Type.Resize, QEvent.Type.LayoutRequest):
if self.expandAni.state() == QAbstractAnimation.State.Running:
return super().eventFilter(arg__1, arg__2)
QTimer.singleShot(0, self._refresh_view_size)
return super().eventFilter(arg__1, arg__2)

def _update_separators(self) -> None:
"""根据卡片可见性更新分隔线:仅当当前卡片可见且前面存在可见卡片时才显示分隔线"""
Expand All @@ -63,4 +78,21 @@ def _update_separators(self) -> None:
sep.setVisible(card.isVisible() and has_visible_before)
if card.isVisible():
has_visible_before = True
self._refresh_view_size()

def _refresh_view_size(self) -> None:
"""同步重算展开区域尺寸,确保子卡高度变化能传递到手风琴容器。"""
self._adjustViewSize()
self._sync_parent_layout()

def _sync_parent_layout(self, *_args) -> None:
"""在动画帧内同步父布局,避免手风琴底部与后续卡片之间出现瞬时 gap/重叠。"""
self.updateGeometry()

parent = self.parentWidget()
while parent is not None:
parent.updateGeometry()
layout = parent.layout()
if layout is not None:
layout.activate()
parent = parent.parentWidget()
Loading