#!/usr/bin/python # -*- coding: utf-8 -*- """ _____ _____ ______ _____ ______ / ____| __ \| ____| /\ / ____| ____|_ | | | |__) | |__ / \ | (___ | |__ _| |_ | | | _ /| __| / /\ \ \___ \| __|_ _| | |____| | \ \| |____ / ____ \ ____) | |____|_| \_____|_| \_\______/_/ \_\_____/|______| """ from functools import partial import math import os crease_plus_dir = os.path.dirname(os.path.abspath(__file__)).replace('\\', '/') print(crease_plus_dir) try: from PySide2.QtGui import * from PySide2.QtCore import * from PySide2.QtWidgets import * def whatpyside(): return 2 except ImportError: try: from PySide.QtGui import * from PySide.QtCore import * def whatpyside(): return 1 except ImportError: raise Exception("Couldn't import the PySide module.") import importlib # from shiboken2 import wrapInstance # import maya.OpenMayaUI as omui import maya.api.OpenMaya as om import maya.cmds as cmds from . import CreasePlusCore crepcore = CreasePlusCore # TODO remove reloads # crepcore = importlib.reload(crepcore) maya_useNewAPI = True def cPgetScreenSz(): rec = QApplication.desktop().screenGeometry() w = rec.width() h = rec.height() return (w, h) global_cPscreensize = cPgetScreenSz() def cPscreenSize(): global global_cPscreensize return global_cPscreensize def cPsizeRatio(w=None,h=None): rw = None rh = None if w != None : rw = float(w) / 1600 if h != None : rh=float(h) / 900 if rw != None and rh != None: return (rw,rh) elif rw != None: return (rw) elif rh != None: return (rh) def cPmayaMainWindow(): # mayaPtr = omui.MQtUtil.mainWindow() # mayaWindow = wrapInstance(int(mayaPtr), QWidget) # return mayaWindow try: mainWindow = QApplication.activeWindow() while True: lastWin = mainWindow.parent() if lastWin: mainWindow = lastWin else: break return mainWindow except: pass # def cPmayaScriptDir(): # return crease_plus_dir def cPiconDir(): icon_dir = crease_plus_dir + '/Icons/' return icon_dir # global_maya_script_dir = cmds.internalVar(usd=True) # global_icons_dir = global_maya_script_dir + 'Icons/' def icoStr(iconame): # global global_icons_dir # return global_icons_dir + 'crep_' + iconame + '_ico.png' return cPiconDir() + 'crep_' + iconame + '_ico.png' global_creasePlusMainUi = 'creasePlusMainUi' global_cPsideshapestyle1 = ''' QWidget { border: 0px solid #2e3234; background: #db9456; font-size: 0px; border-radius: 0px; color: #ffffff; } ''' global_cPsideshapestyle2 = ''' QWidget { border: 0px solid #2e3234; background: #d5703f; font-size: 0px; border-radius: 0px; color: #ffffff; } ''' global_cPsideshapestyle3 = ''' QWidget { border: 0px solid #2e3234; background: #5ebae9; font-size: 0px; border-radius: 0px; color: #ffffff; } ''' global_defInfodic = { 'toolName': 'SomeTool', 'toolDesc': 'tool description', 'toolHelp': 'tool help' } class CreasePlusMainPage(QWidget): def __init__(self): super(CreasePlusMainPage, self).__init__() self.mainLay = QVBoxLayout() self.setLayout(self.mainLay) self.layout().setContentsMargins(2, 2, 2, 2) class CreasePlusInfopop(QDialog): def __init__(self, parent=None): super(CreasePlusInfopop, self).__init__(parent) self.setStyleSheet(''' QWidget { border: 2px solid #66696c; background: #202122; border-radius: 4px; color: #ffffff; } ''') self.setWindowFlags(Qt.FramelessWindowHint | Qt.Popup | Qt.WA_TranslucentBackground) self.setAttribute(Qt.WA_DeleteOnClose) self.setWindowOpacity(1) self.mainLay = QVBoxLayout() self.setLayout(self.mainLay) self.mainLay.setSpacing(1) self.mainLay.setContentsMargins(8, 8, 8, 8) self.titleico = QLabel() self.titleico.setStyleSheet(''' QWidget { border: 0px solid #2e3234; background: transparent; font-size: 14px; border-radius: 0px; color: #ffffff; }''') self.mainLay.addWidget(self.titleico) self.description = QLabel() self.description.setAlignment(Qt.AlignLeft) self.description.setStyleSheet(''' QWidget { border: 0px solid #2e3234; background: #454545; font-size: 12px; border-radius: 4px; color: #ffffff; } ''') self.mainLay.addWidget(self.description) def resizeEvent(self, event): super(CreasePlusInfopop, self).resizeEvent(event) radius = 5.0 painterpath = QPainterPath() painterpath.addRoundedRect(QRectF(self.rect()), radius, radius) maskedRegion = QRegion(painterpath.toFillPolygon().toPolygon()) self.setMask(maskedRegion) class CreasePlusBtn(QWidget): pressed = Signal() global global_defInfodic def __init__( self, pmap=QPixmap(), lbl='', infobubble=None, infodic=global_defInfodic, parent=None, ): super(CreasePlusBtn, self).__init__(parent) self.setStyleSheet(''' QWidget {border: 0px solid #ffffff;background: #444444;border-radius: 0px;color: #ffffff; }\nQWidget :hover {border: 0px solid #ffffff;background: #5e7876;border-radius: 3px;color: #ffffff; }''') self.infoBubble = infobubble self.infodic = infodic self.mainLay = QVBoxLayout() self.setLayout(self.mainLay) self.mainLay.setSpacing(0) self.mainLay.setContentsMargins(2, 2, 2, 2) self.btn = QPushButton() self.btn.setStyleSheet(''' QWidget {border: 0px solid #ffffff;background: transparent;border-radius: 0px;color: #ffffff; }''') self.btn.setIcon(pmap) self.btn.setSizePolicy(QSizePolicy.Ignored,QSizePolicy.MinimumExpanding) self.mainLay.addWidget(self.btn) def setPixmap(self, pmap): self.btn.setIcon(pmap) def setPixmapSize(self, sz): self.btn.setIconSize(sz) def setInfoDic(self, infodic): self.infodic = infodic # self.btnLabel.setText(self.infodic["toolName"]) def mousePressEvent(self, event): super(CreasePlusBtn, self).mousePressEvent(event) self.pressed.emit() def pressedConnect(self, func): self.btn.pressed.connect(func) # self.pressed.connect(func) def enterEvent(self, event): super(CreasePlusBtn, self).enterEvent(event) if self.infoBubble: self.infoBubble.setWindowOpacity(1) self.infoBubble.titleico.setText(self.infodic['toolName']) self.infoBubble.description.setText(self.infodic['toolDesc']) def leaveEvent(self, event): super(CreasePlusBtn, self).leaveEvent(event) if self.infoBubble: self.infoBubble.setWindowOpacity(0) def paintEvent(self, event): if not isinstance(event, QCloseEvent): super(CreasePlusBtn, self).paintEvent(event) painter = QPainter(self) option = QStyleOption() if whatpyside() == 1: option.initFrom(self) else: option.init(self) style = self.style() style.drawPrimitive(QStyle.PE_Widget, option, painter, self) class CreasePlusSideShape(QWidget): pressed = Signal() def __init__(self, parent=None): super(CreasePlusSideShape, self).__init__(parent) self.maskShape = QPixmap() self.setWindowFlags(Qt.FramelessWindowHint | Qt.Popup | Qt.WA_TranslucentBackground) self.setAttribute(Qt.WA_DeleteOnClose) self.setWindowOpacity(1) global global_cPsideshapestyle1 self.setStyleSheet(global_cPsideshapestyle1) self.mainLay = QVBoxLayout() self.setLayout(self.mainLay) self.resize(32, 32) def setMaskShape(self, maskshape): self.maskShape = maskshape def resizeEvent(self, event): super(CreasePlusSideShape, self).resizeEvent(event) self.resize(self.maskShape.size()) self.setMask(self.maskShape.mask()) def mousePressEvent(self, event): super(CreasePlusSideShape, self).mousePressEvent(event) self.pressed.emit() def creaseplusclosethefucknwinbefoh(clientobj = None): global global_creasePlusMainUi if cmds.window(global_creasePlusMainUi,ex=True): # print("hey here!") cmds.deleteUI(global_creasePlusMainUi, wnd=True) class CreasePlusMain(QWidget): gripsz = cPsizeRatio(w=10) * cPscreenSize()[0] gripszMarg = (2, 2) numPages = 3 def __init__(self, parent=None): super(CreasePlusMain, self).__init__(parent) self.noOpacity = False self.origw = 35 self.origh = 370 self.hostApp = parent self.countDown = 50 global global_creasePlusMainUi self.setObjectName(global_creasePlusMainUi) self.setStyleSheet(''' QWidget {border: 0px solid #ffffff;background: #444444;border-radius: 0px;color: #ffffff; }''') self.pageIndex = 0 self.pages = [ CreasePlusMainPage() for i in range(CreasePlusMain.numPages) ] self.pageBtns = {} self.oldPos = QPoint() self.resizing = False self.setWindowFlags(Qt.Window | Qt.FramelessWindowHint) self.setAttribute(Qt.WA_DeleteOnClose) # register callbacks self.mayaCallbacks = [] cbid = om.MSceneMessage.addCallback(om.MSceneMessage.kBeforeNew, creaseplusclosethefucknwinbefoh) self.mayaCallbacks.append(cbid) cbid = om.MSceneMessage.addCallback(om.MSceneMessage.kBeforeOpen, creaseplusclosethefucknwinbefoh) self.mayaCallbacks.append(cbid) cbid = om.MSceneMessage.addCallback(om.MSceneMessage.kMayaExiting, creaseplusclosethefucknwinbefoh) self.mayaCallbacks.append(cbid) # closeAction = QAction( 'Close', self, shortcut='Alt+F4', triggered=self.close) self.addAction(closeAction) self.setWindowTitle('CreasePlus') self.mainLay = QGridLayout() self.setLayout(self.mainLay) self.mainLay.setContentsMargins(2, 16, 2, 16) self.mainLay.setVerticalSpacing(4) self.menuBar = QMenuBar() self.menuBar.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.mainLay.addWidget(self.menuBar, 0, 0) self.spaceitm1 = QSpacerItem(0, cPsizeRatio(h=20) * cPscreenSize()[1], QSizePolicy.Ignored, QSizePolicy.MinimumExpanding) self.mainLay.addItem(self.spaceitm1, 1, 0) self.doMenus() self.hoverDelay = 0 self.infoBubble = CreasePlusInfopop(parent=self) self.nextWid = CreasePlusSideShape(parent=self) self.nextWid.pressed.connect(self.onClick_next) nextWidSize = cPsizeRatio(w=10) * cPscreenSize()[0] self.nextWid.setMaskShape( QPixmap(icoStr('next')).scaled(nextWidSize, nextWidSize, Qt.IgnoreAspectRatio, Qt.SmoothTransformation)) self.timer = QTimer() self.timer.timeout.connect(self.opacityModifier) self.timer.start(self.countDown) self.doFirstPage() self.doSecondPage() self.doThirdPage() self.stackedWidget = QStackedWidget() for page in self.pages: self.stackedWidget.addWidget(page) self.mainLay.addWidget(self.stackedWidget, 2, 0) self.infoBubble.show() self.infoBubble.setWindowOpacity(0) self.nextWid.show() self.mainRecRatio = (cPsizeRatio(w=self.origw), cPsizeRatio(h=self.origh)) w = self.mainRecRatio[0] * cPscreenSize()[0] h = self.mainRecRatio[1] * cPscreenSize()[1] self.setMaximumWidth(w) self.setMinimumWidth(w) # print((self.maximumWidth() ) self.resize(w, h) def doMenus(self): deleteCpAttrsAc = QAction( 'Clean Attributes', self, triggered=crepcore.cPcleanAttrs) cleanHBevelLiveAc = QAction( 'Clean HBevel Live', self, triggered=crepcore.creasePlusBakeHBL) toggleLastAc = QAction( 'Toggle Last', self, triggered=crepcore.creasePlusLastCtx) transferHBevelAc = QAction( 'Transfer HBevel', self, triggered=crepcore.creasePlusTransferHBevel) invkCreaseSetAc = QAction( 'Crease Set Editor', self, triggered=crepcore.cPshowCreaseEd) self.miscMenu = QMenu('Miscs', self) self.miscMenu.setIcon(QPixmap(icoStr('menu'))) self.miscMenu.addAction(cleanHBevelLiveAc) self.miscMenu.addAction(toggleLastAc) self.miscMenu.addAction(transferHBevelAc) self.miscMenu.addAction(deleteCpAttrsAc) self.miscMenu.addAction(invkCreaseSetAc) self.menuBar.addMenu(self.miscMenu) def opacityOverride(self, o): if self.noOpacity == False: self.setWindowOpacity(o) else: self.setWindowOpacity(1) def opacityModifier(self): # curpage = self.pages[self.stackedWidget.currentIndex()] try: if self.underMouse(): self.timer.stop() else: if not self.timer.isActive(): self.timer.start() if self.hoverDelay >= self.countDown: self.hoverDelay = 0 self.opacityOverride(0.1) self.timer.stop() else: self.hoverDelay += 1 opacity = 1.0 - float(self.hoverDelay) / float( self.countDown) self.opacityOverride(max(0.1, opacity)) except: try: self.timer.stop() except: pass def reposNextWid(self): # pass spaceitmLeft = self.spaceitm1.geometry().topLeft() spaceitmHeight = abs( self.spaceitm1.geometry().bottomLeft().y() - spaceitmLeft.y()) self.nextWid.move( self.mapToGlobal(self.rect().topRight()).x(), self.mapToGlobal(spaceitmLeft + QPoint( 0, spaceitmHeight / 2 - self.nextWid.height() * 0.25)).y()) def doFirstPage(self): pageLay = self.pages[0].layout() pageLay.setSpacing(0) numbtns = 12 listBtns = [] icosz = cPsizeRatio(w=20) * cPscreenSize()[0] for i in range(numbtns): listBtns.append(CreasePlusBtn(infobubble=self.infoBubble)) listBtns[i].setPixmapSize(QSize(icosz, icosz)) i = 0 listBtns[i].setPixmap(QPixmap(icoStr('bool'))) listBtns[i].setInfoDic({ 'toolName': 'Bool Op', 'toolDesc': 'Performs non destructive boolean.' }) listBtns[i].pressedConnect(partial(crepcore.creasePlusBool, False)) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('panelbool'))) listBtns[i].setInfoDic({ 'toolName': 'Panel Bool', 'toolDesc': 'Performs panel bool operation.' }) listBtns[i].pressedConnect(crepcore.creasePlusPanelBool) i += 1 # listBtns[i].setPixmap(QPixmap(icoStr('smoothangle'))) listBtns[i].setInfoDic({ 'toolName': 'Smooth 30', 'toolDesc': 'Fixes and Smooths normals by a 30 degree angle.' }) listBtns[i].pressedConnect(crepcore.creasePlusSmooth30) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('displayhe'))) listBtns[i].setInfoDic({ 'toolName': 'Display HardEdges', 'toolDesc': 'Toggles display of hard edges.' }) listBtns[i].pressedConnect( partial(crepcore.creasePlusDisplayHardEdges, 0)) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('bevel'))) listBtns[i].setInfoDic({ 'toolName': 'HBevel', 'toolDesc': 'Bevels hard edges , based on selection.' }) listBtns[i].pressedConnect(crepcore.creasePlusHBevel) i += 1 # listBtns[i].setPixmap(QPixmap(icoStr('bevellive'))) listBtns[i].setInfoDic({ 'toolName': 'HBevel Live', 'toolDesc': 'HBevel as a node, with a cage mesh (interactive).' }) listBtns[i].pressedConnect(crepcore.creasePlusHBevelLive) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('shapeshifter'))) listBtns[i].setInfoDic({ 'toolName': 'Shape Shifter', 'toolDesc': 'Calls ShapeShifter script (3rd party).' }) listBtns[i].pressedConnect(crepcore.creasePlusShapeShifter) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('meshslicer'))) listBtns[i].setInfoDic({ 'toolName': 'Mesh Slicer', 'toolDesc': 'Slices the mesh in x,y,z direction based on camera , with a curve.' }) listBtns[i].pressedConnect(crepcore.creasePlusCurveSlice) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('hardedge'))) listBtns[i].setInfoDic({ 'toolName': 'Sel HardEdges', 'toolDesc': 'Selects hard edges.' }) listBtns[i].pressedConnect(crepcore.creasePlusSelHardEdges) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('mirror'))) listBtns[i].setInfoDic({ 'toolName': 'Mirror', 'toolDesc': 'Mirrors selected meshes.' }) listBtns[i].pressedConnect(crepcore.creasePlusMirror) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('uv'))) listBtns[i].setInfoDic({ 'toolName': 'Make UV', 'toolDesc': "Makes UV's based on hard edges." }) listBtns[i].pressedConnect(crepcore.creasePlusMakeUv) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('zbrush'))) listBtns[i].setInfoDic({ 'toolName': 'Goz', 'toolDesc': 'Exports selection in Zbrush without ngons.' }) listBtns[i].pressedConnect(crepcore.creasePlusGoz) i += 1 for btn in listBtns: pageLay.addWidget(btn) self.pageBtns['page1'] = listBtns def doSecondPage(self): pageLay = self.pages[1].layout() pageLay.setSpacing(0) numbtns = 8 listBtns = [] icosz = cPsizeRatio(w=20) * cPscreenSize()[0] for i in range(numbtns): listBtns.append(CreasePlusBtn(infobubble=self.infoBubble)) listBtns[i].setPixmapSize(QSize(icosz, icosz)) i = 0 listBtns[i].setPixmap(QPixmap(icoStr('crease'))) listBtns[i].setInfoDic({ 'toolName': 'Crease1', 'toolDesc': 'Applies first creasing preset.' }) listBtns[i].pressedConnect(partial(crepcore.creasePlusCreasePreset, 1)) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('crease'))) listBtns[i].setInfoDic({ 'toolName': 'Crease2', 'toolDesc': 'Applies second creasing preset.' }) listBtns[i].pressedConnect(partial(crepcore.creasePlusCreasePreset, 2)) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('crease'))) listBtns[i].setInfoDic({ 'toolName': 'Crease3', 'toolDesc': 'Applies third creasing preset.' }) listBtns[i].pressedConnect(partial(crepcore.creasePlusCreasePreset, 3)) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('weighttool'))) listBtns[i].setInfoDic({ 'toolName': 'Creasing Tool', 'toolDesc': 'Invokes the interactive creasing tool.' }) listBtns[i].pressedConnect(crepcore.creasePlusWeigthTool) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('displayhe'))) listBtns[i].setInfoDic({ 'toolName': 'NoCrease', 'toolDesc': 'Remove creasing on selection.' }) listBtns[i].pressedConnect(crepcore.creasePlusNocrease) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('hardedge'))) listBtns[i].setInfoDic({ 'toolName': 'Smooth SG', 'toolDesc': 'Subdivides based on smoothing groups (retains hard edges shape).' }) listBtns[i].pressedConnect(crepcore.creasePlusSmoothGroupsSubD) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('physcrease'))) listBtns[i].setInfoDic({ 'toolName': 'Physical Crease', 'toolDesc': 'Adds edge loops around selection or hard edges.' }) listBtns[i].pressedConnect(crepcore.creasePlusPhysicalCrease) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('subd'))) listBtns[i].setInfoDic({ 'toolName': 'Smooth', 'toolDesc': 'Invokes subdivision smooth preset.' }) listBtns[i].pressedConnect(crepcore.creasePlusSubDpreset) i += 1 for btn in listBtns: pageLay.addWidget(btn) self.pageBtns['page2'] = listBtns def doThirdPage(self): pageLay = self.pages[2].layout() pageLay.setSpacing(0) numbtns = 7 listBtns = [] icosz = cPsizeRatio(w=20) * cPscreenSize()[0] for i in range(numbtns): listBtns.append(CreasePlusBtn(infobubble=self.infoBubble)) listBtns[i].setPixmapSize(QSize(icosz, icosz)) i = 0 listBtns[i].setPixmap(QPixmap(icoStr('curvedraw'))) listBtns[i].setInfoDic({ 'toolName': 'Draw Curve', 'toolDesc': 'Enter linear curve drawing context.' }) listBtns[i].pressedConnect(crepcore.creasePlusDrawCurve) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('curvepoly'))) listBtns[i].setInfoDic({ 'toolName': 'Curve To Polygon', 'toolDesc': 'Makes polygon out of curve.' }) listBtns[i].pressedConnect(crepcore.creasePlusCurveToPolyCmd) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('curveclose'))) listBtns[i].setInfoDic({ 'toolName': 'Close Curve', 'toolDesc': 'Closes Curve(s).' }) listBtns[i].pressedConnect(crepcore.creasePlusCloseCurve) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('curvebevel'))) listBtns[i].setInfoDic({ 'toolName': 'Bevel Curve', 'toolDesc': 'Bevels Curve Cv.' }) listBtns[i].pressedConnect(crepcore.creasePlusCurveBevelCmd) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('curveint'))) listBtns[i].setInfoDic({ 'toolName': 'Curve Cuts', 'toolDesc': 'Cuts curve with selected curves.' }) listBtns[i].pressedConnect(crepcore.creasePlusCurveIntersect) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('curveattach'))) listBtns[i].setInfoDic({ 'toolName': 'Curve Attach', 'toolDesc': "Attaches two curves at joining/close CV's." }) listBtns[i].pressedConnect(crepcore.creasePlusAttachCurve) i += 1 listBtns[i].setPixmap(QPixmap(icoStr('curvemult'))) listBtns[i].setInfoDic({ 'toolName': 'Curve Multiply', 'toolDesc': "Rebuilds to double the number of CV's" }) listBtns[i].pressedConnect(crepcore.creasePlusCurveDoubleCvs) i += 1 for btn in listBtns: pageLay.addWidget(btn) self.pageBtns['page3'] = listBtns def onClick_leftSqr(self): self.setWindowOpacity(1) self.noOpacity = not self.noOpacity def onClick_eye(self): # print("eye clicked") # cmds.select("pCube*", r=True) crepcore.creasePlusToggleBoolGhost() def onClick_next(self): # print("next clicked") self.pageIndex = (self.pageIndex + 1) % CreasePlusMain.numPages global global_cPsideshapestyle1 global global_cPsideshapestyle2 global global_cPsideshapestyle3 if self.pageIndex == 0 : self.nextWid.setStyleSheet(global_cPsideshapestyle1) elif self.pageIndex == 1 : self.nextWid.setStyleSheet(global_cPsideshapestyle2) elif self.pageIndex == 2 : self.nextWid.setStyleSheet(global_cPsideshapestyle3) self.stackedWidget.setCurrentIndex(self.pageIndex) def mouseInEye(self, mousePos): icosz = cPsizeRatio(w=17) * cPscreenSize()[0] spaceitmLeft = self.spaceitm1.geometry().topLeft() spaceitmHeight = abs( self.spaceitm1.geometry().bottomLeft().y() - spaceitmLeft.y()) minx = self.width() / 2 - icosz / 2 miny = spaceitmLeft.y() + spaceitmHeight / 2 - icosz / 2 return mousePos.x() > minx and mousePos.x( ) < minx + icosz and mousePos.y() > miny and mousePos.y( ) < miny + icosz * 0.75 def mouseInLeftSqr(self, mousePos): return mousePos.x() < CreasePlusMain.gripsz + CreasePlusMain.gripszMarg[0] and mousePos.y( ) > self.height() - CreasePlusMain.gripsz - CreasePlusMain.gripszMarg[1] def mouseInGrip(self, mousePos): return mousePos.x() > self.width() - CreasePlusMain.gripsz - CreasePlusMain.gripszMarg[0] and mousePos.y( ) > self.height() - CreasePlusMain.gripsz - CreasePlusMain.gripszMarg[1] def mouseInCloseSqr(self, mousePos): return mousePos.x() > self.width() - CreasePlusMain.gripsz - CreasePlusMain.gripszMarg[0] and mousePos.y( ) < CreasePlusMain.gripsz + CreasePlusMain.gripszMarg[1] def mousePressEvent(self, event): super(CreasePlusMain, self).mousePressEvent(event) if event.button() == Qt.LeftButton: self.resizing = False self.dragPosition = event.globalPos() - self.frameGeometry().topLeft() if self.mouseInEye(event.pos()): self.onClick_eye() elif self.mouseInGrip(event.pos()): self.oldPos = event.pos() self.resizing = True elif self.mouseInLeftSqr(event.pos()): self.onClick_leftSqr() elif self.mouseInCloseSqr(event.pos()): event.accept() self.close() event.accept() def enterEvent(self, event): super(CreasePlusMain, self).enterEvent(event) self.hoverDelay = 0 # curpage = self.pages[self.stackedWidget.currentIndex()] self.setWindowOpacity(1) # if self.mouseInCloseSqr(QCursor.pos()): # self.infoBubble.titleico.setText('dummy') # self.infoBubble.description.setText('dummydesc') # self.infoBubble.setWindowOpacity(1) # print("enter") def leaveEvent(self, event): super(CreasePlusMain, self).leaveEvent(event) self.infoBubble.setWindowOpacity(0) if self.timer: if not self.timer.isActive(): # print("leave, restart timer...") self.timer.start(self.countDown) def mouseMoveEvent(self, event): super(CreasePlusMain, self).mouseMoveEvent(event) if event.buttons() == Qt.LeftButton: if self.resizing: delta = event.pos() - self.oldPos self.oldPos = event.pos() self.setMaximumWidth(16777215) self.resize(self.width() + delta.x(), self.height() + delta.y()) event.accept() self.updateGeometry() else: self.move(event.globalPos() - self.dragPosition) self.reposNextWid() event.accept() def resizeEvent(self, event): super(CreasePlusMain, self).resizeEvent(event) radius = 2.0 painterpath = QPainterPath() painterpath.addRoundedRect(QRectF(self.rect()), radius, radius) maskedRegion = QRegion(painterpath.toFillPolygon().toPolygon()) self.setMask(maskedRegion) def paintEvent(self, event): super(CreasePlusMain, self).paintEvent(event) painter = QPainter(self) painter.setRenderHint(QPainter.Antialiasing) painter.setOpacity(0.3) painter.drawRoundedRect( self.width() - CreasePlusMain.gripsz - CreasePlusMain.gripszMarg[0], self.height() - CreasePlusMain.gripsz - CreasePlusMain.gripszMarg[1], CreasePlusMain.gripsz, CreasePlusMain.gripsz, 1, 1) painter.setPen(Qt.NoPen) painter.setOpacity(1) painter.setBrush(QColor(32+7,32+7,32+7)) painter.drawRoundedRect( CreasePlusMain.gripszMarg[0], self.height() - CreasePlusMain.gripsz - CreasePlusMain.gripszMarg[1], CreasePlusMain.gripsz, CreasePlusMain.gripsz, 3,3) painter.setOpacity(1) painter.setPen(Qt.NoPen) # nextico = QPixmap(icoStr("next")) # icosz = CreasePlusMain.gripsz # painter.drawPixmap(CreasePlusMain.gripszMarg[0], self.height()-icosz-CreasePlusMain.gripszMarg[1], # nextico.scaled(icosz, icosz, Qt.IgnoreAspectRatio, Qt.SmoothTransformation)) closeico = QPixmap(icoStr('close')) icosz = CreasePlusMain.gripsz painter.drawPixmap(self.width() - icosz - CreasePlusMain.gripszMarg[0], CreasePlusMain.gripszMarg[1], closeico.scaled(icosz, icosz, Qt.IgnoreAspectRatio, Qt.SmoothTransformation)) eyeico = QPixmap(icoStr('eye')) icosz = cPsizeRatio(w=17) * cPscreenSize()[0] try: self.spaceitm1 except: start() return None spaceitmLeft = self.spaceitm1.geometry().topLeft() spaceitmHeight = abs( self.spaceitm1.geometry().bottomLeft().y() - spaceitmLeft.y()) painter.drawPixmap(self.width() / 2 - icosz / 2, spaceitmLeft.y() + spaceitmHeight / 2 - icosz / 2, eyeico.scaled(icosz, icosz, Qt.IgnoreAspectRatio, Qt.SmoothTransformation)) infbubx = self.mapToGlobal(self.rect().topRight()).x() + 4 self.infoBubble.resize(0, 0) self.infoBubble.move(infbubx, QCursor.pos().y()) self.reposNextWid() def closeEvent(self, event): super(CreasePlusMain, self).closeEvent(event) # print("CLOSEEVENT") try: self.mayaCallbacks except: pass else: for cb in self.mayaCallbacks: om.MMessage.removeCallback(cb) try: self.timer except: pass else: self.timer.stop() self.timer = None # self.infoBubble.close() # self.nextWid.close() def dummy(self): print(('dummy')) def start(): # self = CreasePlusMain(parent=cPmayaMainWindow()) # self.show() creaseplusclosethefucknwinbefoh() mywin = CreasePlusMain(parent=cPmayaMainWindow()) mywin.show()