import requests from pkg_resources import parse_version from PySide6 import QtCore, QtWidgets from PySide6.QtGui import QDesktopServices from PySide6.QtCore import QUrl from PySide6.QtWidgets import QFileDialog, QMessageBox DOCK_POSITIONS = { "right": QtCore.Qt.RightDockWidgetArea, "left": QtCore.Qt.LeftDockWidgetArea, "top": QtCore.Qt.TopDockWidgetArea, "bottom": QtCore.Qt.BottomDockWidgetArea, } def layout( parent, items, top_widget=None, layout_type=QtWidgets.QVBoxLayout, margin=2, spacing=0, ): if not top_widget: top_widget = QtWidgets.QWidget(parent) top_widget_was_none = True else: top_widget_was_none = False layout = layout_type(top_widget) top_widget.setLayout(layout) for item in items: layout.addWidget(item) layout.setSpacing(spacing) layout.setContentsMargins(margin, margin, margin, margin) if top_widget_was_none: return top_widget else: return layout def splitter(items, stretch_factors=None, orientation=QtCore.Qt.Horizontal): sp = QtWidgets.QSplitter(orientation) for item in items: sp.addWidget(item) if stretch_factors: for i, s in enumerate(stretch_factors): sp.setStretchFactor(i, s) return sp def dock( widget, title, parent, allowedAreas=QtCore.Qt.AllDockWidgetAreas, defaultArea="right", name=None, icon=None, ): dock = QtWidgets.QDockWidget(title, parent, objectName=title) if name: dock.setObjectName(name) if icon: dock.toggleViewAction().setIcon(icon) dock.setAllowedAreas(allowedAreas) dock.setWidget(widget) action = dock.toggleViewAction() action.setText(title) dock.setFeatures( QtWidgets.QDockWidget.DockWidgetFeatures( QtWidgets.QDockWidget.DockWidgetFloatable ) ) parent.addDockWidget(DOCK_POSITIONS[defaultArea], dock) return dock def add_actions(menu, actions): if len(actions) > 0: menu.addActions(actions) menu.addSeparator() def open_url(url): QDesktopServices.openUrl(QUrl(url)) def about_dialog(parent, title, text): QtWidgets.QMessageBox.about(parent, title, text) def get_save_filename(suffix): rv, _ = QFileDialog.getSaveFileName(filter="*.{}".format(suffix)) if rv != "" and not rv.endswith(suffix): rv += "." + suffix return rv def get_open_filename(suffix, curr_dir): rv, _ = QFileDialog.getOpenFileName( directory=curr_dir, filter="*.{}".format(suffix) ) if rv != "" and not rv.endswith(suffix): rv += "." + suffix return rv def check_gtihub_for_updates( parent, mod, github_org="cadquery", github_proj="cadquery" ): url = f"https://api.github.com/repos/{github_org}/{github_proj}/releases" resp = requests.get(url).json() newer = [ el["tag_name"] for el in resp if not el["draft"] and parse_version(el["tag_name"]) > parse_version(mod.__version__) ] if newer: title = "Updates available" text = ( f"There are newer versions of {github_proj} " f"available on github:\n" + "\n".join(newer) ) else: title = "No updates available" text = f"You are already using the latest version of {github_proj}" QtWidgets.QMessageBox.about(parent, title, text) def confirm(parent, title, msg): rv = QMessageBox.question(parent, title, msg, QMessageBox.Yes, QMessageBox.No) return True if rv == QMessageBox.Yes else False