Skip to content
This repository was archived by the owner on Jun 28, 2025. It is now read-only.

Commit 1efffee

Browse files
committed
feat(MyCard): method started.
1 parent f9659a8 commit 1efffee

File tree

8 files changed

+136
-24
lines changed

8 files changed

+136
-24
lines changed
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
from PyQt5.QtWidgets import QWidget, QLabel
2+
from PyQt5.QtCore import Qt, QRect, QPropertyAnimation, QEasingCurve
3+
from PyQt5.QtGui import QPixmap, QColor
4+
from Modules.Base.ModQtFont import ModQtFont
5+
from Controls.MyRoundButton import MyRoundButton
6+
7+
class MyCard(QWidget):
8+
"""卡片控件
9+
定义一个白色背景的卡片控件,四端圆角,可以设置标题和大小,可折叠、展开。"""
10+
def __init__(self, parent: QWidget = None, title_text: str = None, objectName: str = None,
11+
size: tuple = (200, 300), margin: tuple = (8, 8, 8, 8), can_fold: bool = True) -> None:
12+
super().__init__(parent)
13+
self.font_manager = ModQtFont()
14+
15+
# 状态:normal 或 folded
16+
self.status = "normal"
17+
18+
self.fold_enabled = can_fold
19+
self.parent = parent
20+
21+
# 保存原始尺寸和折叠后的尺寸
22+
self._original_size = size
23+
self._folded_size = (size[0], 30) # 折叠后高度为30,宽度不变
24+
25+
# 设置初始尺寸
26+
self.setFixedSize(*size)
27+
self.objectName = objectName if objectName else title_text
28+
self.setObjectName(self.objectName)
29+
30+
31+
# 设置样式
32+
self.setStyleSheet(f"QWidget #{self.objectName} {{background-color: #FFFFFF; border-radius: 8px;}}")
33+
34+
# 标题相关
35+
self._title_text = title_text
36+
self.title_label = QLabel(self, text=title_text)
37+
self.title_label.setStyleSheet("QLabel {font-size: 16px;font-weight: bold;color: #000000;background-color: transparent;}")
38+
self.title_label.setFont(self.font_manager.get_font_object(title_text))
39+
self.title_label.move(margin[0], margin[1])
40+
41+
# 创建折叠/展开按钮
42+
if self.fold_enabled:
43+
self.btn_fold_toggle = MyRoundButton(self, svg_path="Images/BtnCardToggleNormal.svg", size=(32, 32))
44+
# 将按钮放在右上角
45+
self.btn_fold_toggle.move(size[0] - margin[2] - 20, margin[1])
46+
# 连接按钮点击事件
47+
self.btn_fold_toggle.clicked.connect(self.toggle_fold)
48+
49+
# 创建动画对象
50+
self.animation = QPropertyAnimation(self, b"size")
51+
self.animation.setDuration(300) # 动画持续时间300毫秒
52+
self.animation.setEasingCurve(QEasingCurve.OutCubic) # 设置缓动曲线
53+
54+
def toggle_fold(self):
55+
"""切换折叠/展开状态"""
56+
if not self.fold_enabled:
57+
return
58+
59+
if self.status == "normal":
60+
# 当前是展开状态,需要折叠
61+
self.fold()
62+
else:
63+
# 当前是折叠状态,需要展开
64+
self.unfold()
65+
66+
def fold(self):
67+
"""折叠卡片"""
68+
if self.status == "folded" or not self.fold_enabled:
69+
return
70+
71+
# 设置动画
72+
self.animation.setStartValue(self.size())
73+
self.animation.setEndValue(QRect(0, 0, *self._folded_size).size())
74+
75+
# 更新按钮文本
76+
self.btn_fold_toggle.setSvgPath("Images/BtnCardToggleCollapsed.svg")
77+
78+
# 开始动画
79+
self.animation.start()
80+
81+
# 更新状态
82+
self.status = "folded"
83+
84+
# 隐藏子控件(除了标题和折叠按钮)
85+
for child in self.children():
86+
if child != self.title_label and child != self.btn_fold_toggle:
87+
child.hide()
88+
89+
def unfold(self):
90+
"""展开卡片"""
91+
if self.status == "normal" or not self.fold_enabled:
92+
return
93+
94+
# 设置动画
95+
self.animation.setStartValue(self.size())
96+
self.animation.setEndValue(QRect(0, 0, *self._original_size).size())
97+
98+
# 更新按钮文本
99+
self.btn_fold_toggle.setText("↑")
100+
101+
# 开始动画
102+
self.animation.start()
103+
104+
# 更新状态
105+
self.status = "normal"
106+
107+
# 显示之前隐藏的子控件
108+
for child in self.children():
109+
child.show()
110+
111+
def resizeEvent(self, event):
112+
"""重写大小调整事件,确保按钮始终在右上角"""
113+
super().resizeEvent(event)
114+
115+
if hasattr(self, 'btn_fold_toggle'):
116+
# 更新按钮位置到右上角
117+
self.btn_fold_toggle.move(self.width() - self.btn_fold_toggle.width() - 8, 8)
118+

Plain_Craft_Launcher_2/Controls/MyRoundButton.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -255,12 +255,12 @@ def paintEvent(self, event):
255255
# 根据状态设置背景颜色
256256
if self.is_pressed:
257257
# 按下状态 - 50% 透明度
258-
bg_color = QColor(255, 255, 255, 127)
258+
bg_color = QColor(255, 255, 255, 44)
259259
border_color = QColor(self.border_color)
260260
border_color.setAlpha(127)
261261
elif self.is_hovered:
262262
# 悬停状态 - 50% 透明度
263-
bg_color = QColor(255, 255, 255, 127)
263+
bg_color = QColor(255, 255, 255, 44)
264264
border_color = QColor(self.border_color)
265265
# border_color.setAlpha(127) 这里边框做成全透明更好看
266266
border_color.setAlpha(0)

Plain_Craft_Launcher_2/FormMain.py

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -46,9 +46,7 @@ def __init__(self):
4646
# 连接按钮事件
4747
self.ui.BtnExit.clicked.connect(self.close_window)
4848
self.ui.BtnMin.clicked.connect(self.minimize_window)
49-
50-
# 记录窗口是否最大化
51-
self.is_maximized = False
49+
5250
# 记录窗口正常状态下的位置和大小
5351
self.normal_geometry = self.geometry()
5452

@@ -118,22 +116,5 @@ def minimize_window(self):
118116
self.logger.write("按下按钮:BtnMin,正在尝试最小化窗口", LT.INFO)
119117
self.showMinimized()
120118

121-
def toggle_maximize_window(self):
122-
"""切换窗口最大化/还原状态"""
123-
if self.isMaximized():
124-
self.restore_window()
125-
else:
126-
self.maximize_window()
127-
128-
def maximize_window(self):
129-
"""跨平台最大化窗口"""
130-
self.logger.write("按下按钮:BtnMax,正在尝试最大化窗口", LT.INFO)
131-
# 保存当前窗口位置和大小(如果需要)
132-
self.showMaximized()
133-
134-
def restore_window(self):
135-
"""跨平台还原窗口"""
136-
self.logger.write("按下按钮:BtnMax,正在尝试还原窗口", LT.INFO)
137-
self.showNormal()
138119

139120

Plain_Craft_Launcher_2/FormMain_ui.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77

88
from PyQt5 import QtCore, QtGui, QtWidgets
99
from PyQt5.QtSvg import QSvgWidget
10-
from PyQt5.QtCore import Qt
1110

1211
from Controls.MyRoundButton import MyRoundButton
1312
from Controls.MyIconTextButton import MyIconTextButton
Lines changed: 5 additions & 0 deletions
Loading
Lines changed: 5 additions & 0 deletions
Loading

Plain_Craft_Launcher_2/Modules/Base/ModLanguage.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def language(self) -> str:
1414
else:
1515
return "en-US"
1616

17-
def get_text(self, key: str, lang: str = "zh-CN") -> str:
17+
def get_text(self, key: str) -> str:
1818
temp = deepcopy(self._lang)
1919
for key_item in key.split("."):
2020
temp = temp[key_item]

Plain_Craft_Launcher_2/Pages/PageDownload/PageDownload.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from Modules.Base.ModSetup import ModSetup as Setup
55
from Modules.Base.ModLogging import ModLogging, LoggingType as LT
6+
from Controls.MyCard import MyCard
67

78
setup = Setup()
89

@@ -33,3 +34,6 @@ def __init__(self, parent=None):
3334
# self.PanLeft = PageLaunchLeft(self)
3435
# self.PanLeft.setGeometry(
3536
# QtCore.QRect(0, 0, 300, (setup.get_settings("size")[1] - setup.get_settings("title_height"))))
37+
self.card = MyCard(self, title_text="下载", size=(200, 300), margin=(8, 8, 8, 8), can_fold=True, objectName="CardDownload")
38+
39+

0 commit comments

Comments
 (0)