feat: AI套图分层方案 + Gemini集成 - 4种图案类型处理 + 正片叠底 + 宽高比 + 模型选择

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-02-07 16:59:56 +08:00
parent 12395d8eca
commit dae906aba7
277 changed files with 15009 additions and 19922 deletions

159
psmark/myskin_windows.py Normal file
View File

@@ -0,0 +1,159 @@
from os.path import join, dirname, abspath
from qtpy.QtCore import Qt, QMetaObject, Signal, Slot, QEvent
from qtpy.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QToolButton, QLabel, QSizePolicy
from PyQt5.QtGui import QIcon, QPixmap
import qtpy, platform
QT_VERSION = tuple((int(v) for v in qtpy.QT_VERSION.split('.')))
PLATFORM = platform.system()
_FL_STYLESHEET = 'frameless.qss'
class WindowDragger(QWidget):
'''Window dragger.
Args:
window (QWidget): Associated window.
parent (QWidget, optional): Parent widget.
'''
doubleClicked = Signal()
def __init__(self, window, parent=None):
QWidget.__init__(self, parent)
self._window = window
self._mousePressed = False
def mousePressEvent(self, event):
self._mousePressed = True
self._mousePos = event.globalPos()
self._windowPos = self._window.pos()
def mouseMoveEvent(self, event):
if self._mousePressed:
self._window.move(self._windowPos + (event.globalPos() - self._mousePos))
def mouseReleaseEvent(self, event):
self._mousePressed = False
def mouseDoubleClickEvent(self, event):
self.doubleClicked.emit()
class ModernWindow(QWidget):
'''
Modern window.
Args:
w (QWidget): Main widget.
parent (QWidget, optional): Parent widget.
'''
def __init__(self, w, parent=None):
QWidget.__init__(self, parent)
self._w = w
self.setupUi()
contentLayout = QHBoxLayout()
contentLayout.setContentsMargins(0, 0, 0, 0)
contentLayout.addWidget(w)
self.windowContent.setLayout(contentLayout)
self.setWindowTitle(w.windowTitle())
self.setGeometry(w.geometry())
self._w.setAttribute(Qt.WA_DeleteOnClose, True)
self._w.destroyed.connect(self._ModernWindow__child_was_closed)
def setupUi(self):
self.vboxWindow = QVBoxLayout(self)
self.vboxWindow.setContentsMargins(0, 0, 0, 0)
self.windowFrame = QWidget(self)
self.windowFrame.setObjectName('windowFrame')
self.vboxFrame = QVBoxLayout(self.windowFrame)
self.vboxFrame.setContentsMargins(0, 0, 0, 0)
self.titleBar = WindowDragger(self, self.windowFrame)
self.titleBar.setObjectName('titleBar')
self.titleBar.setSizePolicy(QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed))
self.hboxTitle = QHBoxLayout(self.titleBar)
self.hboxTitle.setContentsMargins(0, 0, 0, 0)
self.hboxTitle.setSpacing(0)
titleIcon = QPixmap('./ui/icon.png')
Icon = QLabel()
Icon.setPixmap(titleIcon.scaled(30, 30))
self.icon = Icon
self.icon.setAlignment(Qt.AlignLeft)
self.lblTitle = QLabel('Title')
self.lblTitle.setObjectName('lblTitle')
self.lblTitle.setAlignment(Qt.AlignVCenter)
spButtons = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
self.btnMinimize = QToolButton(self.titleBar)
self.btnMinimize.setObjectName('btnMinimize')
self.btnMinimize.setSizePolicy(spButtons)
self.btnRestore = QToolButton(self.titleBar)
self.btnRestore.setObjectName('btnRestore')
self.btnRestore.setSizePolicy(spButtons)
self.btnRestore.setVisible(False)
self.btnMaximize = QToolButton(self.titleBar)
self.btnMaximize.setObjectName('btnMaximize')
self.btnMaximize.setSizePolicy(spButtons)
self.btnClose = QToolButton(self.titleBar)
self.btnClose.setObjectName('btnClose')
self.btnClose.setSizePolicy(spButtons)
self.vboxFrame.addWidget(self.titleBar)
self.windowContent = QWidget(self.windowFrame)
self.vboxFrame.addWidget(self.windowContent)
self.vboxWindow.addWidget(self.windowFrame)
PLATFORM = '1Darwin'
if PLATFORM == 'Darwin':
self.hboxTitle.addWidget(self.btnClose)
self.hboxTitle.addWidget(self.btnMinimize)
self.hboxTitle.addWidget(self.btnRestore)
self.hboxTitle.addWidget(self.btnMaximize)
self.hboxTitle.addWidget(self.lblTitle)
else:
self.hboxTitle.addWidget(self.icon)
self.hboxTitle.addWidget(self.lblTitle)
self.hboxTitle.addWidget(self.btnMinimize)
self.hboxTitle.addWidget(self.btnRestore)
self.hboxTitle.addWidget(self.btnMaximize)
self.hboxTitle.addWidget(self.btnClose)
self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint | Qt.WindowSystemMenuHint)
with open(_FL_STYLESHEET) as (stylesheet):
self.setStyleSheet(stylesheet.read())
QMetaObject.connectSlotsByName(self)
def __child_was_closed(self):
self._w = None
self.close()
def closeEvent(self, event):
if not self._w:
event.accept()
else:
self._w.close()
event.setAccepted(self._w.isHidden())
def setWindowTitle(self, title):
super(ModernWindow, self).setWindowTitle(title)
self.lblTitle.setText(title)
@Slot()
def on_btnMinimize_clicked(self):
self.setWindowState(Qt.WindowMinimized)
@Slot()
def on_btnRestore_clicked(self):
self.btnRestore.setVisible(False)
self.btnMaximize.setVisible(True)
self.setWindowState(Qt.WindowNoState)
@Slot()
def on_btnMaximize_clicked(self):
self.btnRestore.setVisible(True)
self.btnMaximize.setVisible(False)
self.setWindowState(Qt.WindowMaximized)
@Slot()
def on_btnClose_clicked(self):
self.close()
@Slot()
def on_titleBar_doubleClicked(self):
if self.btnMaximize.isVisible():
self.on_btnMaximize_clicked()
else:
self.on_btnRestore_clicked()