def reset(self): self.open() mhv = MHVersion() self.write("VERSION: %s", os.environ['MH_VERSION']) self.write("SHORT VERSION: %s", os.environ['MH_SHORT_VERSION']) self.write("LONG VERSION: %s", mhv.getFullVersionStr()) self.write("BASEMESH VERSION: %s", os.environ['MH_MESH_VERSION']) self.write("IS BUILT (FROZEN): %s", os.environ['MH_FROZEN']) self.write("IS RELEASE VERSION: %s", os.environ['MH_RELEASE']) self.write("DEFAULT ENCODING: %s", sys.getdefaultencoding()) self.write("FILESYSTEM ENCODING: %s", sys.getfilesystemencoding()) self.write("STDOUT ENCODING: %s", sys.stdout.encoding) self.write("LOCALE PREFERRED ENCODING: %s", locale.getpreferredencoding(False)) self.write("WORKING DIRECTORY: %s", getpath.pathToUnicode(os.getcwd())) self.write("HOME LOCATION: %s", getpath.pathToUnicode(getpath.getHomePath())) syspath = os.path.pathsep.join( [getpath.pathToUnicode(p) for p in sys.path]) self.write("PYTHON PATH: %s", syspath) self.write("DLL PATH: %s", getpath.pathToUnicode(os.environ['PATH'])) version = re.sub(r"[\r\n]", " ", sys.version) self.write("SYS.VERSION: %s", version) self.write("SYS.PLATFORM: %s", sys.platform) self.write("SYS.EXECUTABLE: %s", sys.executable) self.write("PLATFORM.MACHINE: %s", platform.machine()) self.write("PLATFORM.PROCESSOR: %s", platform.processor()) self.write("PLATFORM.UNAME.RELEASE: %s", platform.uname()[2]) if sys.platform.startswith('linux'): try: self.write("PLATFORM.LINUX_DISTRIBUTION: %s", ' '.join(platform.linux_distribution())) except AttributeError: try: import distro self.write("PLATFORM.LINUX_DISTRIBUTION: %s", ' '.join(distro.linux_distribution())) except ImportError: self.write("PLATFORM.LINUX_DISTRIBUTION: %s", 'Unknown') if sys.platform.startswith('darwin'): self.write("PLATFORM.MAC_VER: %s", platform.mac_ver()[0]) if sys.platform.startswith('win'): self.write("PLATFORM.WIN32_VER: %s", " ".join(platform.win32_ver())) import numpy self.write("NUMPY.VERSION: %s", numpy.__version__) numpyVer = numpy.__version__.split('.') if int(numpyVer[0]) <= 1 and int(numpyVer[1]) < 6: raise DependencyError( 'MakeHuman requires at least numpy version 1.6') self.close()
def getVersionStr(verbose=True, full=False): """ Verbose version as string, for displaying and information """ if isRelease() and not full: return _versionStr() else: from mhversion import MHVersion mhv = MHVersion() return mhv.currentBranch + ":" + mhv.currentShortCommit
class Frame(QtWidgets.QMainWindow): mhv = MHVersion() title = mhv.fullTitle def __init__(self, app, size): self.app = app super(Frame, self).__init__() self.setWindowTitle(self.title) if supportsSVG(): # SVG icons allow better resolution when resized self.setWindowIcon( QtGui.QIcon(getpath.getSysPath("icons/makehuman_bg.svg"))) else: # Older Qt libraries do not support svg icons self.setWindowIcon( QtGui.QIcon(getpath.getSysPath("icons/makehuman.png"))) self.setAttribute(QtCore.Qt.WA_KeyCompression, False) self.setAcceptDrops(True) self.resize(*size) # work-around for mac QT toolbar bug described in: https://bugreports.qt-project.org/browse/QTBUG-18567 if sys.platform.startswith("darwin"): self.toolbar = self.addToolBar("Toolbar") self.toolbar.hide() self.statusBar = qtgui.StatusBar() self.setStatusBar(self.statusBar) self.central = QtWidgets.QWidget() self.setCentralWidget(self.central) self.create() def panel(self): widget = QtWidgets.QWidget() widget.setAttribute(QtCore.Qt.WA_OpaquePaintEvent, False) widget.setAutoFillBackground(True) widget.setContentsMargins(0, 0, 0, 0) return widget def create(self): self.v_layout = QtWidgets.QGridLayout(self.central) self.v_layout.setContentsMargins(0, 0, 0, 0) self.v_layout.setSpacing(0) self.tab_panel = self.panel() self.v_layout.addWidget(self.tab_panel, 0, 0) self.v_layout.setRowStretch(0, 0) self.tab_layout = QtWidgets.QGridLayout(self.tab_panel) self.tab_layout.setContentsMargins(0, 0, 0, 0) self.tabs = qtgui.Tabs() self.tab_layout.addWidget(self.tabs) self.h_layout = QtWidgets.QGridLayout() self.h_layout.setContentsMargins(0, 0, 0, 0) self.h_layout.setSpacing(0) self.v_layout.addLayout(self.h_layout, 1, 0) self.v_layout.setRowStretch(1, 1) self.b_panel = self.panel() self.bottom = QtWidgets.QBoxLayout(QtWidgets.QBoxLayout.BottomToTop, self.b_panel) self.v_layout.addWidget(self.b_panel, 2, 0) self.v_layout.setRowStretch(2, 0) self.l_panel = self.panel() self.left_top = QtWidgets.QStackedLayout(self.l_panel) self.h_layout.addWidget(self.l_panel, 0, 0) self.h_layout.setColumnStretch(0, 0) self.t_layout = QtWidgets.QBoxLayout(QtWidgets.QBoxLayout.TopToBottom) self.h_layout.addLayout(self.t_layout, 0, 1) self.h_layout.setColumnStretch(1, 1) self.t_panel = self.panel() self.top = VLayout(self.t_panel) self.top.setSizeConstraint(QtWidgets.QLayout.SetMinAndMaxSize) self.t_layout.addWidget(self.t_panel) self.t_panel.setSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Maximum) self.canvas = Canvas(self, app=self.app) self.t_layout.addWidget(self.canvas) self.r_panel = self.panel() self.right_top = QtWidgets.QStackedLayout(self.r_panel) self.h_layout.addWidget(self.r_panel, 0, 2) self.h_layout.setColumnStretch(2, 0) self.progressBar = qtgui.ProgressBar() self.bottom.addWidget(self.progressBar) def changeEvent(self, event): """QMainWindow method override that is called whenever a change happens on the widget.""" if event.type() == QtCore.QEvent.WindowStateChange: if 'normal geometry' in self.windowState: self.normalStateGeometry = self.storeGeometry() QtWidgets.QMainWindow.changeEvent(self, event) def resizeEvent(self, event): """QMainWindow method override that is called when the widget is resized.""" if 'normal geometry' in self.windowState: self.normalStateGeometry = self.storeGeometry() QtWidgets.QMainWindow.resizeEvent(self, event) def moveEvent(self, event): """QMainWindow method override that is called when the widget is moved.""" if 'normal geometry' in self.windowState: self.normalStateGeometry = self.storeGeometry() QtWidgets.QMainWindow.moveEvent(self, event) def addPanels(self): left = TaskPanel() right = TaskPanel() left.setObjectName("LeftTaskPanel") right.setObjectName("RightTaskPanel") self.left_top.addWidget(left) self.right_top.addWidget(right) return left, right def showPanels(self, left, right): self.left_top.setCurrentWidget(left) self.right_top.setCurrentWidget(right) def addTopWidget(self, widget, *args, **kwargs): self.top.addWidget(widget, *args, **kwargs) return widget def removeTopWidget(self, widget): self.top.removeWidget(widget) def closeEvent(self, ev): ev.ignore() self.app.callEvent('onQuit', None) def refreshLayout(self, widget=None): if widget is None: widget = self widget.updateGeometry() for child in QtWidgets.QWidget.children(widget): if child.isWidgetType(): self.refreshLayout(child) @staticmethod def _asWindowStateSet(stateflags): """Construct a set of window state strings from a QWindowStates flags object. Multiple window states may apply to the same window, for example a window might be shown minimized, but set to be maximized when restored.""" state = set() if stateflags & QtCore.Qt.WindowMaximized: state.add('maximized') if stateflags & QtCore.Qt.WindowMinimized: state.add('minimized') if stateflags & QtCore.Qt.WindowFullScreen: state.add('fullscreen') if stateflags & QtCore.Qt.WindowActive: state.add('active') if not (stateflags & (QtCore.Qt.WindowMaximized | QtCore.Qt.WindowFullScreen)): state.add('normal geometry') if not stateflags & QtCore.Qt.WindowMinimized: state.add('normal') return state def getWindowState(self): """Return a set of window state strings that apply to the frame.""" return self._asWindowStateSet(QtWidgets.QMainWindow.windowState(self)) def setWindowState(self, state): """Set the window state according to a window state set retrieved by getWindowState().""" # Order matters here. A window might be maximized when restored, # but currently minimized in taskbar. if 'maximized' in state: self.showMaximized() if 'fullscreen' in state: self.showFullscreen() if 'normal geometry' in state: self.showNormal() if 'minimized' in state: self.showMinimized() windowState = property(getWindowState, setWindowState) def storeGeometry(self): """Return a saveable dictionary describing the window's geometry. It can be used for saving the window's shape into a settings file.""" geometry = {'width': self.width(), 'height': self.height(), 'x': self.pos().x(), 'y': self.pos().y() } if 'normal geometry' in self.windowState \ else self.normalStateGeometry.copy() geometry['state'] = list(self.windowState) return geometry def restoreGeometry(self, geometry): """Set the window shape according to a dictionary saved with storeGeometry().""" self.normalStateGeometry = geometry self.resize(geometry['width'], geometry['height']) self.move(geometry['x'], geometry['y']) self.windowState = set(geometry['state']) def dragEnterEvent(self, event): """Decide whether to accept files dragged into the MakeHuman window.""" if event.mimeData().hasUrls(): url = event.mimeData().urls()[0] path = getpath.pathToUnicode(url.toLocalFile()) if os.path.splitext(path)[1].lower() == '.mhm': event.acceptProposedAction() def dropEvent(self, event): """Support drag and dropping .MHM files in the MakeHuman window to load them""" mime_data = event.mimeData() if not mime_data.hasUrls(): return url = mime_data.urls()[0] path = getpath.pathToUnicode(url.toLocalFile()) if os.path.splitext(path)[1].lower() != '.mhm': return if self.app.currentFile.modified: self.app.prompt( "Load", "You have unsaved changes. Are you sure you want to close the current file?", "Yes", "No", lambda: self.app.loadHumanMHM(path)) else: self.app.loadHumanMHM(path)
def onClicked(event): mhv = MHVersion() gui3d.app.clipboard().setText(mhv.getFullVersionStr())