gui/mozregui/utils.py (65 lines of code) (raw):
from PySide6.QtCore import QDir
from PySide6.QtGui import QGuiApplication, QPalette
from PySide6.QtWidgets import (
QCompleter,
QFileDialog,
QFileSystemModel,
QHBoxLayout,
QLineEdit,
QPushButton,
QWidget,
)
from mozregression.dates import parse_date
from mozregression.errors import DateFormatError
from mozregression.releases import date_of_release, releases
from mozregui.ui.build_selection_helper import Ui_BuildSelectionHelper
class FSLineEdit(QLineEdit):
"""
A line edit with auto completion for file system folders.
"""
def __init__(self, parent=None):
QLineEdit.__init__(self, parent)
self.fsmodel = QFileSystemModel()
self.fsmodel.setRootPath("")
self.completer = QCompleter()
self.completer.setModel(self.fsmodel)
self.setCompleter(self.completer)
self.fsmodel.setFilter(QDir.Drives | QDir.AllDirs | QDir.Hidden | QDir.NoDotAndDotDot)
def setPath(self, path):
self.setText(path)
self.fsmodel.setRootPath(path)
class DirectorySelectWidget(QWidget):
"""
A FSLineEdit with a "browse" button on the right. Allow to select a
directory.
"""
def __init__(self, parent=None):
QWidget.__init__(self, parent)
layout = QHBoxLayout(self)
layout.setContentsMargins(0, 0, 0, 0)
self.line_edit = FSLineEdit()
self.button = QPushButton("browse")
layout.addWidget(self.line_edit)
layout.addWidget(self.button)
self.setLayout(layout)
self.button.clicked.connect(self.browse_dialog)
def browse_dialog(self):
path = QFileDialog.getExistingDirectory(self, "Find file")
if path:
self.line_edit.setPath(path)
class BuildSelection(QWidget):
"""
Allow to select a date, a build id, a release number or an arbitrary
changeset.
"""
def __init__(self, parent=None):
QWidget.__init__(self, parent)
self.ui = Ui_BuildSelectionHelper()
self.ui.setupUi(self)
self.ui.release.addItems([str(k) for k in sorted(releases())])
self.ui.combo_helper.currentIndexChanged.connect(self.ui.stackedWidget.setCurrentIndex)
def get_value(self):
currentw = self.ui.stackedWidget.currentWidget()
if currentw == self.ui.s_date:
return self.ui.date.date().toPython()
elif currentw == self.ui.s_release:
return parse_date(date_of_release(str(self.ui.release.currentText())))
elif currentw == self.ui.s_buildid:
buildid = self.ui.buildid.text().strip()
try:
return parse_date(buildid)
except DateFormatError:
raise DateFormatError(buildid, "Not a valid build id: `%s`")
elif currentw == self.ui.s_changeset:
return self.ui.changeset.text().strip()
def is_dark_mode_enabled():
"""
Return True if dark mode is being used.
"""
return QGuiApplication.palette().color(QPalette.Window).lightness() < 128