From 7ddf60165c2c3de7ae45f51add39944522de94a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 20 May 2023 22:09:06 +0200 Subject: [PATCH 1/6] add the base welcomewizard code, and finish the introduction page --- wingetui/__init__.py | 22 +- wingetui/external/FramelessWindow.py | 101 ++ wingetui/resources/agreement.png | Bin 0 -> 5086 bytes wingetui/resources/empty.png | Bin 0 -> 102 bytes wingetui/resources/next_black.png | Bin 0 -> 1114 bytes wingetui/resources/next_white.png | Bin 0 -> 1114 bytes wingetui/resources/previous_black.png | Bin 0 -> 285 bytes wingetui/resources/previous_white.png | Bin 0 -> 285 bytes wingetui/resources/rocket.png | Bin 0 -> 6126 bytes wingetui/welcome.py | 1272 +++++++++++++++++++++++++ 10 files changed, 1381 insertions(+), 14 deletions(-) create mode 100644 wingetui/external/FramelessWindow.py create mode 100644 wingetui/resources/agreement.png create mode 100644 wingetui/resources/empty.png create mode 100644 wingetui/resources/next_black.png create mode 100644 wingetui/resources/next_white.png create mode 100644 wingetui/resources/previous_black.png create mode 100644 wingetui/resources/previous_white.png create mode 100644 wingetui/resources/rocket.png create mode 100644 wingetui/welcome.py diff --git a/wingetui/__init__.py b/wingetui/__init__.py index 862de7381..b0043c688 100644 --- a/wingetui/__init__.py +++ b/wingetui/__init__.py @@ -209,7 +209,7 @@ def forceContinue(): def increaseStep(): self.loadStatus += 1 self.finishedPreloadingStep.connect(increaseStep) - if getSettings("AskedAbout3PackageManagers") == False or "--welcomewizard" in sys.argv: + if getSettings("ShownWelcomeWizard") == False or "--welcomewizard" in sys.argv or "--welcome" in sys.argv or True: # AskedAbout3PackageManagers self.askAboutPackageManagers(onclose=lambda: Thread(target=self.loadPreUIComponents, daemon=True).start()) else: Thread(target=self.loadPreUIComponents, daemon=True).start() @@ -218,6 +218,13 @@ def increaseStep(): raise e def askAboutPackageManagers(self, onclose: object): + import welcome + setSettings("ShownWelcomeWizard", True) + self.ww = welcome.WelcomeWindow(callback=lambda: (self.popup.show(), onclose())) + self.popup.hide() + self.ww.show() + + return self.w = NotClosableWidget() self.w.setObjectName("micawin") self.w.setWindowFlag(Qt.WindowType.Window) @@ -264,19 +271,6 @@ def askAboutPackageManagers(self, onclose: object): mainLayout.addLayout(blayout) blayout.addStretch() - def performSelectionAndContinue(): - self.w.close() - setSettings("AskedAbout3PackageManagers", True) - setSettings("DisableWinget", not winget.isChecked()) - setSettings("DisableScoop", not scoop.isChecked()) - setSettings("ScoopEnabledByAssistant", scoop.isChecked()) - setSettings("DisableChocolatey", not choco.isChecked()) - if choco.isChecked() and shutil.which("choco") != None: - setSettings("UseSystemChocolatey", True) - if scoop.isChecked() and shutil.which("scoop") == None: - os.startfile(os.path.join(realpath, "resources/install_scoop.cmd")) - else: - onclose() okbutton = QPushButton(_("Apply and start WingetUI")) okbutton.setFixedSize(190, 30) diff --git a/wingetui/external/FramelessWindow.py b/wingetui/external/FramelessWindow.py new file mode 100644 index 000000000..fdfdabf5d --- /dev/null +++ b/wingetui/external/FramelessWindow.py @@ -0,0 +1,101 @@ +from ctypes import c_int, windll +windll.shcore.SetProcessDpiAwareness(c_int(2)) + +# +# +# This file comes from https://github.com/mustafaahci/FramelessWindow +# +# + +import winreg +from win32mica import ApplyMica, MICAMODE + +from ctypes.wintypes import DWORD, LONG, LPCVOID + +from win32con import PAN_SERIF_SQUARE, WM_NCCALCSIZE, GWL_STYLE, WM_NCHITTEST, WS_MAXIMIZEBOX, WS_THICKFRAME, \ + WS_CAPTION, HTTOPLEFT, HTBOTTOMRIGHT, HTTOPRIGHT, HTBOTTOMLEFT, \ + HTTOP, HTBOTTOM, HTLEFT, HTRIGHT, HTCAPTION, WS_POPUP, WS_SYSMENU, WS_MINIMIZEBOX + + +from PySide6.QtCore import * +from PySide6.QtGui import * +from PySide6.QtWidgets import * +from external.blurwindow import ExtendFrameIntoClientArea + +def readRegedit(aKey, sKey, default, storage=winreg.HKEY_CURRENT_USER): + registry = winreg.ConnectRegistry(None, storage) + reg_keypath = aKey + try: + reg_key = winreg.OpenKey(registry, reg_keypath) + except FileNotFoundError as e: + return default + except Exception as e: + print(e) + return default + + for i in range(1024): + try: + value_name, value, _ = winreg.EnumValue(reg_key, i) + if value_name == sKey: + return value + except OSError as e: + return default + except Exception as e: + print(e) + return default + +def isWindowDark() -> bool: + return readRegedit(r"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", "AppsUseLightTheme", 1)==0 + + +class QFramelessWindow(QMainWindow): + BORDER_WIDTH = 10 + + def __init__(self, parent=None): + self.updateSize = True + self.settingsWidget = QWidget() + super().__init__(parent=parent) + self.hwnd = self.winId().__int__() + self.setObjectName("QFramelessWindow") + self.setWindowFlags(Qt.WindowType.Window | Qt.WindowType.CustomizeWindowHint) + #window_style = win32gui.GetWindowLong(self.hwnd, GWL_STYLE) + #win32gui.SetWindowLong(self.hwnd, GWL_STYLE, window_style | WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX) + + ExtendFrameIntoClientArea(self.winId().__int__()) + + self.setAutoFillBackground(True) + + # Window Widgets + self.resize(800, 600) + self._layout = QVBoxLayout() + self._layout.setContentsMargins(0, 0, 0, 0) + self._layout.setSpacing(0) + + + # main widget is here + self.mainWidget = QWidget() + self.mainWidgetLayout = QVBoxLayout() + self.mainWidgetLayout.setContentsMargins(0, 0, 0, 0) + self.mainWidget.setLayout(self.mainWidgetLayout) + self.mainWidget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) + + # set background color + p = self.palette() + p.setColor(self.backgroundRole(), QColor("#272727")) + self.setPalette(p) + + self._layout.addWidget(self.mainWidget) + self.setLayout(self._layout) + + def showEvent(self, event) -> None: + ApplyMica(self.winId(), MICAMODE.DARK if isWindowDark() else MICAMODE.LIGHT) + return super().showEvent(event) + + def moveEvent(self, event) -> None: + self.repaint() + return super().moveEvent(event) + +if __name__ == "__main__": + from ctypes import c_int, windll + windll.shcore.SetProcessDpiAwareness(c_int(2)) + import __init__ \ No newline at end of file diff --git a/wingetui/resources/agreement.png b/wingetui/resources/agreement.png new file mode 100644 index 0000000000000000000000000000000000000000..b910632ada5453819adf6606ad42c062acd9edb8 GIT binary patch literal 5086 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 AH2?qr literal 0 HcmV?d00001 diff --git a/wingetui/resources/empty.png b/wingetui/resources/empty.png new file mode 100644 index 0000000000000000000000000000000000000000..cc1fdac9960034450cd5c360270c9ee528c83d9c GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeK3?y%aJ*@^(%mF?ju0VQumF+Dc#aI&L7tG-B u>_!@pBk1Yk7*Y|JEU_#>q^Bv+fQy0U0R!XPwxcXSNd`|>KbLh*2~7Z3zZkXv literal 0 HcmV?d00001 diff --git a/wingetui/resources/next_black.png b/wingetui/resources/next_black.png new file mode 100644 index 0000000000000000000000000000000000000000..58f5a6d138fc6b469235f5b22a1bc3e621f97f00 GIT binary patch literal 1114 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wF4y>rv~_hxB|JOV6cV2j4$mgfo^Im z3GxeOU}R!uVP#|I;N;@v7Z4N@6%&_`k(HBIP*zb@)6mw@GcYnSHM6j?v9)(}c5(CY z_74aO4vmOSNK8sj%goBoFDfl7udZ+G=GPMb-n@PH{=>&lpTB(l_WkFt-+%u8E5B`M0!%XRJY5_^ zD&pSWd>RxT$l&^rh10QXN|J8Cnkh_2ms%WMt8!t{(Yva51Qd4MdA@GWU#{%7Gk5+n zyq>-DXK_*A>#gT!8mFJL`4@2FIb&ns@AqLs76&%{&ovcfZu<6rt!m-?6FJJPOnbV8 zwgo9FR(TzIXYKVv^`QZ~&>cHY_xGBKF^4kkRR2s6&?s<}o>CC!#91rkv~ol4E(mRHfrdrAVGDkGfC zRcm%m`Y>0ht9jc^233(rp*D?$AAAmRs6LtN@nN^3;`fL{DIzK<@*Xq#8e7iPavD#W zuunNrPfX}up7)Qptu0SVIlVtln6OJVQISt5$V`=I_kz8V#tp5^Kh(R<$Xh1+|6Q4} zWPb6AfBwt+bITwbp09p*%x{w&VHV#QswuSU+R?}_E|xHAIB__H(vYCQS9>k(0Y5}m&ebp z-aonT%Urv~_hxB|KVN5LQqfd}qga=?gb zD+%%oW?*DuW?^Mx=iubxS5Q__RnySc(K9eIF*UQWvaz*ybarv` z@b(V~3J#5kO-M{iPRq>7&Mzu0E3d9^?C9+3?(Lg6b=ve<^A{{$x_rgzO z!DFXRpSf`9%FSE1?>>0+`04YPuim_U_x{7jPoKYh{r3Imuitt=` zLn`9l-h3Jq9mwGNkcHE+Yf6%Cz?vycN0(Y0U8{0o(b2oAcLWr6+^Jj5U-|MaCXBwxUv-uZr;yGhu;P3ZgLKX)${m(TOWN!NQf30fa{1Z9KtW0~l zg|-DLDpq+NdS~tRL-nBnyU-mwPWShki7|&V?Nt9v5YQ-al%7%$=fqhnzzu?;+9v@%6m!zohl=o z%vEc4PWmucsH=I~O$JqwNTD{3g&%wlai~6->+xZ?qT=_6Ln$IEDe@jO`Wjo#)N&e6 znXpeeQBO?hUY_@lx2-KtN;$nhPMEMuHBpgID9B8eXZM1=k;V$BhW?{2AO_m}S9wEe2j{^-92mY3ge zKdX0o#=nMN2a}fBFWDD*B+h=Gs8Z$kmS5_X9`;#5e;>yzkvCrZ&r$61{Lp%P;g`qH zuHHYn@5^59SNY2o|Ncn*dVTWC(;qqZ-rN3yy-VTGkwf-Em46x==IvCfIyc9%_!~Q4 Xyu}42;jPDkX_3Lx)z4*}Q$iB}7>?XF literal 0 HcmV?d00001 diff --git a/wingetui/resources/previous_black.png b/wingetui/resources/previous_black.png new file mode 100644 index 0000000000000000000000000000000000000000..5ffc7f15660028bd4ab4e8dafcf4eedfd4ec7f14 GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy$g0(?STfixLlds#*iP@7;$kY6wZ zGaG03)M-nXZQQhT*UL9=->a!^E&)omdb&7Y?A~qy2RxnR&JtOb^(CH!nwS>fddY_)WyTkp% WTIY=0)@R>Ap7eC}b6Mw<&;$U>gk5|9 literal 0 HcmV?d00001 diff --git a/wingetui/resources/previous_white.png b/wingetui/resources/previous_white.png new file mode 100644 index 0000000000000000000000000000000000000000..30103c12c400d3ef6aba6dedf779b91cf294809e GIT binary patch literal 285 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD3?#3*wSy$g0(?STf%JdU!N=rde}Fm#OM?7@ z8JO8PyQfZDx@_a7ox5JXdHY^Xb#n<&venbYF{C2y?akA?4GJQx7u6rd2mZ@w^Uw`*bxzW$` zyKpn(KjDw|mTg-_`z|)M%5P3M*u=^$rW3Itfw6*lV(S@s?}ttg`L87;?$i79mdKI;Vst0CDS)SO5S3 literal 0 HcmV?d00001 diff --git a/wingetui/resources/rocket.png b/wingetui/resources/rocket.png new file mode 100644 index 0000000000000000000000000000000000000000..a911edc868ca07606843fdf911d9cffb1d94e6d1 GIT binary patch literal 6126 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 Ap#T5? literal 0 HcmV?d00001 diff --git a/wingetui/welcome.py b/wingetui/welcome.py new file mode 100644 index 000000000..887dbc20f --- /dev/null +++ b/wingetui/welcome.py @@ -0,0 +1,1272 @@ +from ctypes import c_int, windll +from threading import Thread +windll.shcore.SetProcessDpiAwareness(c_int(2)) + +import platform +import subprocess +import os +import sys +import locale +import time +import ctypes +from PySide6 import QtGui +from PySide6.QtGui import * +from PySide6.QtCore import * +from PySide6.QtWidgets import * +#from PySide6.QtCore import pyqtSignal as Signal +import external.FramelessWindow as FramelessWindow + +import globals + +from languages import * +from tools import * +from tools import _ + +from win32mica import * + + +dwm = ctypes.windll.dwmapi + +class WelcomeWindow(QMainWindow): + callback: object = None + def __init__(self, callback: object) -> None: + super().__init__() + self.callback = callback + + self.switched = False + + self.widgetOrder = ( + FirstRunSlide(), + SelectModeSlide(), + SelectFullScreenSlide(), + DateTimeFormat(), + ClockAppearance(), + LastSlide(), + ) + + for w in self.widgetOrder: + w.hide() + + for w in self.widgetOrder: + w.next.connect(self.nextWidget) + w.previous.connect(self.previousWidget) + w.skipped.connect(self.lastWidget) + w.finished.connect(self.close) + + + self.currentIndex = -1 + + self.setFixedSize((800), (600)) + self.bgWidget = QStackedWidget(self) + self.bgWidget.setObjectName("BackgroundWidget") + self.setWindowFlag(Qt.WindowMinimizeButtonHint, False) + self.setWindowFlag(Qt.WindowCloseButtonHint, False) + self.setAutoFillBackground(True) + self.setAttribute(Qt.WA_TranslucentBackground) + self.setWindowTitle(_("Welcome to WingetUI")) + self.setWindowTitle(" ") + self.setWindowIcon(QIcon(getPath("empty.png"))) + self.setCentralWidget(self.bgWidget) + + ApplyMica(self.winId().__int__(), isDark()) + + colors = getColors() + + if isDark(): + self.bgWidget.setStyleSheet(f""" + * {{ + color: #eeeeee; + background-color: transparent; + border-radius: 4px; + font-family: "Segoe UI Variable Text" + }} + #BackgroundWidget {{ + border: 0 solid rgba(80, 80, 80, 25%); + padding: 20px; + background-color: transparent; + border-radius: 0; + padding-left: 30px; + padding-right: 30px; + }} + QLabel {{ + background-color: transparent; + }} + #SampleItem {{ + font-family: "Segoe UI Variable Text"; + width: 100px; + background-color: rgba(80, 80, 80, 15%); + padding: 20px; + border-radius: 8px; + border: 1px solid rgba(100, 100, 100, 25%); + border-top: 1px solid rgba(100, 100, 100, 25%); + height: 25px; + }} + #FramelessSampleItem {{ + font-family: "Segoe UI Variable Text"; + width: 100px; + background-color: transparent; + padding: 20px; + border-radius: 8px; + border: none; + height: 25px; + }} + QPushButton {{ + font-family: "Segoe UI Variable Text"; + font-size: 9pt; + width: 100px; + background-color: rgba(60, 60, 60, 25%); + border: 1px solid rgba(100, 100, 100, 25%); + border-top: 1px solid rgba(100, 100, 100, 25%); + border-radius: 4px; + height: 25px; + }} + QPushButton:hover {{ + background-color: rgba(77, 77, 77, 50%); + border: 1px solid rgba(89, 89, 89, 50%); + height: 25px; + border-top: 1px solid rgba(95, 95, 95, 50%); + }} + QPushButton:pressed {{ + background-color: rgba(89, 89, 89, 50%); + border: 1px solid rgba(95, 95, 95, 50%); + height: 25px; + border-top: 1px solid rgba(99, 99, 99 , 50%); + }} + #AccentButton{{ + color: black; + background-color: rgb({colors[1]}); + border-color: rgb({colors[1]}); + border-bottom-color: rgb({colors[2]}); + }} + #AccentButton:hover{{ + background-color: rgba({colors[1]}, 80%); + border-color: rgb({colors[1]}); + border-bottom-color: rgb({colors[2]}); + }} + #AccentButton:disabled{{ + background-color: #212121; + border-color: #303030; + border-bottom-color: #363636; + }} + #FocusSelector {{ + border: 5px solid rgb({colors[1]}); + border-radius: 5px; + background-color: rgb({colors[1]}); + }} + QLabel {{ + border: none; + border-radius: 6px; + }} + #TitleLabel {{ + font-size: 26pt; + }} + """) + else: + self.bgWidget.setStyleSheet(f""" + * {{ + color: black; + background-color: transparent; + border-radius: 4px; + font-family: "Segoe UI Variable Text" + }} + #BackgroundWidget {{ + border: 0 solid #eeeeee; + padding: 20px; + background-color: transparent; + border-radius: 0; + padding-left: 30px; + padding-right: 30px; + }} + QLabel {{ + background-color: none; + }} + #SampleItem {{ + font-family: "Segoe UI Variable Text"; + width: 100px; + background-color: #ffffff; + padding: 20px; + border-radius: 8px; + border: 1px solid rgba(230, 230, 230, 80%); + height: 25px; + border-bottom: 1px solid rgba(220, 220, 220, 100%); + }} + #FramelessSampleItem {{ + font-family: "Segoe UI Variable Text"; + width: 100px; + background-color: transparent; + padding: 20px; + border-radius: 8px; + border: none; + height: 25px; + }} + QPushButton {{ + font-family: "Segoe UI Variable Text"; + font-size: 9pt; + width: 100px; + background-color: #ffffff; + border-radius: 4px; + border: 1px solid rgba(230, 230, 230, 80%); + height: 25px; + border-bottom: 1px solid rgba(220, 220, 220, 100%); + }} + QPushButton:hover {{ + background-color: rgba(240, 240, 240, 50%); + border: 1px solid rgba(220, 220, 220, 80%); + height: 25px; + border-bottom: 1px solid rgba(200, 200, 200, 100%); + }} + QPushButton:pressed {{ + background-color: rgba(89, 89, 89, 50%); + border: 1px solid rgba(95, 95, 95, 50%); + height: 25px; + border-top: 1px solid rgba(99, 99, 99 , 50%); + }} + #AccentButton{{ + color: white; + background-color: rgb({colors[3]}); + border-color: rgb({colors[2]}); + border-bottom-color: rgb({colors[4]}); + }} + #AccentButton:hover{{ + background-color: rgba({colors[2]}, 80%); + border-color: rgb({colors[1]}); + border-bottom-color: rgb({colors[3]}); + }} + #AccentButton:disabled{{ + background-color: #212121; + border-color: #303030; + border-bottom-color: #363636; + }} + #FocusSelector {{ + border: 5px solid rgb({colors[1]}); + border-radius: 5px; + background-color: rgb({colors[1]}); + }} + QLabel {{ + border: none; + border-radius: 6px; + }} + #TitleLabel {{ + font-size: 26pt; + }} + """) + + + self.nextWidget(anim=False) + + self.show() + + def get6px(self, i: int) -> int: + return round(i*self.screen().devicePixelRatio()) + + def setWidget(self, w: QWidget, back=False, anim=True) -> None: + self.bgWidget.setCurrentIndex(self.bgWidget.addWidget(w)) + if anim: + if back: + w.invertedinAnim() + else: + w.inAnim() + + def nextWidget(self, anim=True) -> None: + if self.currentIndex == len(self.widgetOrder)-1: + self.close() + else: + self.currentIndex += 1 + w: BasicNavWidget = self.widgetOrder[self.currentIndex] + self.setWidget(w, anim=anim) + + def previousWidget(self) -> None: + if self.currentIndex == 0: + try: + raise ValueError("The specified index is not present in the list of wizard widgets") + except Exception as e: + report(e) + else: + self.currentIndex -= 1 + w: BasicNavWidget = self.widgetOrder[self.currentIndex] + self.setWidget(w, back=True) + + def lastWidget(self) -> None: + self.currentIndex = len(self.widgetOrder)-1 + w: BasicNavWidget = self.widgetOrder[-1] + self.setWidget(w) + + def close(self) -> bool: + if self.callback: + self.callback() + return super().close() + +class BasicNavWidget(QWidget): + next = Signal() + previous = Signal() + finished = Signal() + skipped = Signal() + + def __init__(self, parent=None, startEnabled=False, closeEnabled=False, finishEnabled=False, nextGreyed=False) -> None: + super().__init__(parent=parent) + self.l = QVBoxLayout() + self.setLayout(self.l) + + if(readRegedit(r"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", "AppsUseLightTheme", 1)==0): + self.iconMode = "white" + self.negIconMode = "black" + else: + self.iconMode = "black" + self.negIconMode = "white" + + self.navLayout = QHBoxLayout() + if closeEnabled: + closeButton = QPushButton(_("Skip")) + closeButton.setIconSize(QSize(12, 12)) + closeButton.setFixedSize((96), (36)) + closeButton.setIcon(QIcon(getPath(f"close_{self.iconMode}.png"))) + closeButton.clicked.connect(lambda: self.outAnim(self.skipped.emit)) + self.navLayout.addWidget(closeButton) + self.navLayout.addStretch() + if startEnabled: + startButton = QPushButton(_("Start")) + startButton.setLayoutDirection(Qt.RightToLeft) + startButton.setIconSize(QSize(12, 12)) + startButton.setFixedSize((96), (36)) + startButton.setIcon(QIcon(getPath(f"next_{self.negIconMode}.png"))) + startButton.clicked.connect(lambda: self.outAnim(self.next.emit)) + startButton.setObjectName("AccentButton") + self.navLayout.addWidget(startButton) + else: + backButton = QPushButton("") + backButton.setFixedSize((36), (36)) + backButton.clicked.connect(lambda: self.invertedOutAnim(self.previous.emit)) + backButton.setIcon(QIcon(getPath(f"previous_{self.iconMode}.png"))) + backButton.setIconSize(QSize(12, 12)) + self.navLayout.addWidget(backButton) + if finishEnabled: + finishButton = QPushButton(_("Finish")) + finishButton.setObjectName("AccentButton") + finishButton.setFixedSize((96), (36)) + finishButton.setIconSize(QSize(12, 12)) + finishButton.setLayoutDirection(Qt.RightToLeft) + finishButton.clicked.connect(lambda: self.outAnim(self.finished.emit)) + self.navLayout.addWidget(finishButton) + else: + self.nextButton = QPushButton("") + self.nextButton.setEnabled(not nextGreyed) + self.nextButton.setIconSize(QSize(12, 12)) + self.nextButton.setFixedSize((36), (36)) + self.nextButton.clicked.connect(lambda:self.outAnim(self.next.emit)) + self.nextButton.setIcon(QIcon(getPath(f"next_{self.negIconMode}.png"))) + self.nextButton.setObjectName("AccentButton") + self.navLayout.addWidget(self.nextButton) + + def enableNextButton(self) -> None: + self.nextButton.setEnabled(True) + + def nextWidget(self): + self.outAnim(self.next.emit) + + def setCentralWidget(self, w: QWidget) -> QWidget: + self.l.addWidget(w, stretch=1) + self.l.addLayout(self.navLayout, stretch=0) + + def inAnim(self) -> None: + bgAnim = QPropertyAnimation(self, b"pos", self) + pos = self.pos() + pos.setX(pos.x()+self.width()) + bgAnim.setStartValue(pos) + bgAnim.setEndValue(self.pos()) + bgAnim.setEasingCurve(QEasingCurve.OutQuart) + bgAnim.setDuration(200) + bgAnim.start() + + def invertedinAnim(self) -> None: + bgAnim = QPropertyAnimation(self, b"pos", self) + pos = self.pos() + pos.setX(pos.x()-self.width()) + bgAnim.setStartValue(pos) + bgAnim.setEndValue(self.pos()) + bgAnim.setEasingCurve(QEasingCurve.OutQuart) + bgAnim.setDuration(200) + bgAnim.start() + + def outAnim(self, f) -> None: + bgAnim = QPropertyAnimation(self, b"pos", self) + bgAnim.setStartValue(self.pos()) + pos = self.pos() + pos.setX(pos.x()-self.width()) + bgAnim.setEndValue(pos) + bgAnim.setEasingCurve(QEasingCurve.InQuart) + bgAnim.setDuration(200) + bgAnim.start() + bgAnim.finished.connect(f) + + def invertedOutAnim(self, f) -> None: + bgAnim = QPropertyAnimation(self, b"pos", self) + bgAnim.setStartValue(self.pos()) + pos = self.pos() + pos.setX(pos.x()+self.width()) + bgAnim.setEndValue(pos) + bgAnim.setEasingCurve(QEasingCurve.InQuart) + bgAnim.setDuration(200) + bgAnim.start() + bgAnim.finished.connect(f) + + def get6px(self, i: int) -> int: + return round(i*self.screen().devicePixelRatio()) + + def window(self) -> WelcomeWindow: + return super().window() + +class IconLabel(QWidget): + def __init__(self, size=96, frame=True) -> None: + super().__init__() + self.setAttribute(Qt.WA_StyledBackground) + if frame: + self.setObjectName("SampleItem") + else: + self.setObjectName("FramelessSampleItem") + self.iconSize = size + self.setLayout(QHBoxLayout()) + self.layout().setContentsMargins(0, 0, 0, 0) + self.iconLabel = QLabel() + self.iconLabel.setMinimumHeight((self.iconSize+40)) + self.iconLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) + self.setMinimumHeight((self.iconSize)) + self.textLabel = QLabel() + self.textLabel.setTextInteractionFlags(Qt.LinksAccessibleByMouse) + self.textLabel.setWordWrap(True) + self.textLabel.setStyleSheet("font-size: 10pt;") + self.textLabel.setOpenExternalLinks(True) + if frame: self.layout().addSpacing((40/96*self.iconSize)) + self.layout().addWidget(self.iconLabel, stretch=0) + self.layout().addSpacing((30/96*self.iconSize)) + self.layout().addWidget(self.textLabel, stretch=1) + if frame: self.layout().addSpacing((30/96*self.iconSize)) + + def setText(self, text: str) -> None: + self.textLabel.setText(text) + + def setIcon(self, path: str) -> None: + self.iconLabel.setPixmap(QIcon(getPath(path)).pixmap((self.iconSize), (self.iconSize))) + + def get6px(self, i: int) -> int: + return round(i*self.screen().devicePixelRatio()) + +class ButtonLabel(QWidget): + clicked = Signal() + def __init__(self, size=96) -> None: + super().__init__() + self.setAttribute(Qt.WA_StyledBackground) + self.setObjectName("SampleItem") + self.iconSize = size + self.setLayout(QHBoxLayout()) + self.layout().setContentsMargins(0, 0, 0, 0) + self.iconLabel = QLabel() + self.iconLabel.setMinimumHeight((self.iconSize+40)) + self.iconLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) + self.setMinimumHeight((self.iconSize)) + self.textLabel = QLabel() + self.textLabel.setTextInteractionFlags(Qt.LinksAccessibleByMouse) + self.textLabel.setWordWrap(True) + self.textLabel.setStyleSheet("font-size: 10pt;") + self.textLabel.setOpenExternalLinks(True) + self.button = QPushButton() + self.button.clicked.connect(self.clicked.emit) + self.layout().addSpacing((40/96*self.iconSize)) + self.layout().addWidget(self.iconLabel, stretch=0) + self.layout().addSpacing((20/96*self.iconSize)) + self.layout().addWidget(self.textLabel, stretch=1) + self.layout().addSpacing((20/96*self.iconSize)) + self.layout().addWidget(self.button, stretch=0) + self.layout().addSpacing((40/96*self.iconSize)) + + def setText(self, text: str) -> None: + self.textLabel.setText(text) + + def setButtonText(self, t: str) -> None: + self.button.setText(t) + + def setIcon(self, path: str) -> None: + self.iconLabel.setPixmap(QIcon(getPath(path)).pixmap((self.iconSize), (self.iconSize))) + + def get6px(self, i: int) -> int: + return round(i*self.screen().devicePixelRatio()) + +class ClickableLabel(QLabel): + clicked = Signal() + def __init__(self) -> None: + super().__init__() + self.setMouseTracking(True) + + def mousePressEvent(self, ev) -> None: + self.clicked.emit() + return super().mousePressEvent(ev) + +class ClickableButtonLabel(QPushButton): + clicked = Signal() + def __init__(self, size=96) -> None: + super().__init__() + self.setAttribute(Qt.WA_StyledBackground) + self.setObjectName("ButtonItem") + self.iconSize = size + self.setLayout(QHBoxLayout()) + self.layout().setContentsMargins(0, 0, 0, 0) + self.iconLabel = QLabel() + self.iconLabel.setMinimumHeight((self.iconSize)) + self.iconLabel.setMinimumWidth(size) + self.iconLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) + self.setMinimumHeight((self.iconSize)) + self.textLabel = QLabel() + self.textLabel.setTextInteractionFlags(Qt.LinksAccessibleByMouse) + self.textLabel.setWordWrap(True) + self.textLabel.setStyleSheet("font-size: 10pt;") + self.textLabel.setOpenExternalLinks(True) + self.layout().addSpacing((40/96*self.iconSize)) + self.layout().addWidget(self.iconLabel, stretch=0) + self.layout().addSpacing((20/96*self.iconSize)) + self.layout().addWidget(self.textLabel, stretch=1) + self.layout().addSpacing((40/96*self.iconSize)) + + def setText(self, text: str) -> None: + self.textLabel.setText(text) + + def setButtonText(self, t: str) -> None: + self.button.setText(t) + + def setIcon(self, path: str) -> None: + self.iconLabel.setPixmap(QIcon(getPath(path)).pixmap((self.iconSize), (self.iconSize), Mode=Qt.KeepAspectRatio)) + + def get6px(self, i: int) -> int: + return round(i*self.screen().devicePixelRatio()) + +class MovableFocusSelector(QLabel): + def __init__(self, parent: QWidget = None) -> None: + super().__init__(parent=parent) + self.setObjectName("FocusSelector") + + def move(self, x: int, y: int) -> None: + return super().move(x, y) + + def resize(self, w: int, h: int) -> None: + return super().resize(w+17, h+17) + +class ClickableButtonLabelWithBiggerIcon(QPushButton): + def __init__(self, size=96) -> None: + super().__init__() + self.setAttribute(Qt.WA_StyledBackground) + self.setObjectName("ButtonItem") + self.iconSize = size + self.setCheckable(True) + self.setLayout(QHBoxLayout()) + self.layout().setContentsMargins(0, 0, 0, 0) + self.iconLabel = ClickableLabel() + self.iconLabel.setMinimumHeight((self.iconSize)) + self.iconLabel.setMinimumWidth(size) + self.iconLabel.clicked.connect(self.animateClick) + self.iconLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) + self.setMinimumHeight((self.iconSize*1.5)) + self.textLabel = ClickableLabel() + self.textLabel.clicked.connect(self.animateClick) + self.textLabel.setTextInteractionFlags(Qt.LinksAccessibleByMouse) + self.textLabel.setWordWrap(True) + self.textLabel.setStyleSheet("font-size: 10pt;") + self.textLabel.setOpenExternalLinks(True) + self.layout().addSpacing((20/96*self.iconSize)) + self.layout().addWidget(self.iconLabel, stretch=0) + self.layout().addSpacing((20/96*self.iconSize)) + self.layout().addWidget(self.textLabel, stretch=1) + self.layout().addSpacing((40/96*self.iconSize)) + + def setText(self, text: str) -> None: + self.textLabel.setText(text) + + def setButtonText(self, t: str) -> None: + self.button.setText(t) + + def setIcon(self, path: str) -> None: + self.iconLabel.setPixmap(QIcon(getPath(path)).pixmap(QSize((self.iconSize+20), (self.iconSize+20)), mode=QIcon.Normal)) + + def get6px(self, i: int) -> int: + return round(i*self.screen().devicePixelRatio()) + +class ClickableImageWithText(QPushButton): + def __init__(self, size=96) -> None: + super().__init__() + self.setAttribute(Qt.WA_StyledBackground) + self.setObjectName("ButtonItem") + self.iconSize = size + self.setCheckable(True) + self.setLayout(QVBoxLayout()) + self.layout().setContentsMargins(0, 0, 0, 0) + self.iconLabel = ClickableLabel() + self.iconLabel.setMinimumHeight(size) + self.setMinimumWidth((size) * 2) + self.iconLabel.clicked.connect(self.animateClick) + self.iconLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) + self.setMinimumHeight((self.iconSize + 50)) + self.textLabel = ClickableLabel() + self.textLabel.clicked.connect(self.animateClick) + self.textLabel.setTextInteractionFlags(Qt.LinksAccessibleByMouse) + self.textLabel.setWordWrap(True) + self.textLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) + self.textLabel.setStyleSheet("font-size: 10pt;") + self.textLabel.setOpenExternalLinks(True) + self.layout().addStretch() + self.layout().addWidget(self.iconLabel, stretch=0) + self.layout().addWidget(self.textLabel, stretch=1) + self.layout().addStretch() + + def setText(self, text: str) -> None: + self.textLabel.setText(text) + + def setButtonText(self, t: str) -> None: + self.button.setText(t) + + def setIcon(self, path: str) -> None: + self.iconLabel.setPixmap(QIcon(getPath(path)).pixmap(QSize((self.iconSize+20), (self.iconSize+20)), mode=QIcon.Normal)) + + def get6px(self, i: int) -> int: + return round(i*self.screen().devicePixelRatio()) + +class FirstRunSlide(BasicNavWidget): + def __init__(self, parent=None) -> None: + super().__init__(parent=parent, startEnabled=True, closeEnabled=True) + widget = QWidget() + l = QHBoxLayout() + l.setContentsMargins(0, 10, 0, 10) + widget.setLayout(l) + vl = QVBoxLayout() + vl.setContentsMargins(0, 0, 0, 0) + l.addSpacing(10) + l.addLayout(vl) + vl.addSpacing(0) + + label1 = IconLabel(size=96, frame=False) + label1.setIcon("icon.png") + label1.setText(f""" +

{_("Welcome to WingetUI") + ((" "+_('version 2.0')) if getSettings('AskedAbout3PackageManagers') else "")}

+ {_("If you already know how does this work, or you want to skip the welcome wizard, please click on the bottom-left Skip button.")}
+ {_("WingetUI version {version} brings lots of new features, so I thought you'd like to see the new features, despite already using WingetUI.").format(version=version) if getSettings('AskedAbout3PackageManagers') else ""} + """) + + + label3 = IconLabel(size=64) + label3.setIcon("agreement.png") + label3.setText(f""" +

{_("Wait a minute!")}

+ {_("Please make sure to install WingetUI from official sources only. Also, using WingetUI implies accepting of the LGPLv2.1 license")} + {_("You may also want to know that we do not collect your usage data. However, package managers might.")}""") + + label2 = IconLabel(size=64) + label2.setIcon("rocket.png") + label2.setText(f""" +

{_("This wizard will help you configure and customize WingetUI. Click Start to get started!")}

+ {_("Remember that this wizard can be run at any time from the Settings Window")}""") # TODO: Actually implement this + + vl.addWidget(label1) + vl.addStretch() + vl.addWidget(label2) + vl.addStretch() + vl.addWidget(label3) + vl.addStretch() + self.setCentralWidget(widget) + + def get6px(self, i: int) -> int: + return round(i*self.screen().devicePixelRatio()) + +class LastSlide(BasicNavWidget): + def __init__(self, parent=None) -> None: + super().__init__(parent=parent, finishEnabled=True) + widget = QWidget() + l = QHBoxLayout() + l.setContentsMargins(0, 10, 0, 10) + widget.setLayout(l) + vl = QVBoxLayout() + vl.setContentsMargins(0, 0, 0, 0) + l.addSpacing(10) + l.addLayout(vl) + + label1 = IconLabel(size=96, frame=False) + label1.setIcon("finish_color.png") + label1.setText(f"""

{_("You are now ready to go!")}

+

{_("But here are other things you can do:")}

""") + + settings = ButtonLabel(size=64) + settings.setIcon("further_custom_color.png") + settings.setText(f""" +

{_("Customize WingetUI even more")}

+ {_("Open the settings window and customize WingetUI even further.")}""") + settings.setButtonText(_("Open")) + settings.clicked.connect(lambda: closeAndOpenSettings()) + + def closeAndOpenSettings(): + globals.sw.show() + self.finished.emit() + + donate = ButtonLabel(size=64) + donate.setIcon("cafe_color.png") + donate.setText(f""" +

{_("Suport the developer")}

+ {_("Developing is hard, and this aplication is free. But if you liked the application, you can always buy me a coffee :)")}""") + donate.setButtonText(_("Donate")) + donate.clicked.connect(lambda: os.startfile("https://ko-fi.com/martinet101")) + + report = ButtonLabel(size=64) + report.setIcon("github_color.png") + report.setText(f""" +

{_("View WingetUI on GitHub")}

+ {_("View WingetUI's source code. From there, you can report bugs or suggest features, or even contribute direcly to The WingetUI Project")}""") + report.setButtonText(_("Open GitHub")) + report.clicked.connect(lambda: os.startfile("https://github.com/marticliment/WingetUI")) + + vl.addWidget(label1) + vl.addStretch() + vl.addWidget(settings) + vl.addStretch() + vl.addWidget(donate) + vl.addStretch() + vl.addWidget(report) + vl.addStretch() + self.setCentralWidget(widget) + + def get6px(self, i: int) -> int: + return round(i*self.screen().devicePixelRatio()) + + def showEvent(self, event: QShowEvent) -> None: + setSettings("AlreadyDoneWelcomeWizard", True) + return super().showEvent(event) + +class SelectModeSlide(BasicNavWidget): + def __init__(self, parent=None) -> None: + super().__init__(parent=parent, nextGreyed=True) + self.defaultSelected = False + widget = QWidget() + l = QHBoxLayout() + l.setContentsMargins(0, 10, 0, 10) + widget.setLayout(l) + self.selector = MovableFocusSelector(self) + self.selector.hide() + vl = QVBoxLayout() + vl.setContentsMargins(0, 0, 0, 0) + l.addSpacing(10) + l.addLayout(vl) + + label1 = IconLabel(size=(96), frame=False) + label1.setIcon(getPath("timespan_color.png")) + label1.setText(f"""

{_("What time do you want to see?")}

+ {_("Please select one of the following and click next.")} + {_("If you don't know which one is the best, choose {0}").format(_("Local time"))}""") + + self.localTime = ClickableButtonLabelWithBiggerIcon(size=64) + self.localTime.setIcon(getPath(f"desktop_cactus.png")) + self.localTime.clicked.connect(lambda: self.toggleClockMode("secondary", shouldChangePrefs=True)) + self.localTime.setText(f""" +

{_("Local time")}

+ {_("Show the local computer time. The time will not be synced with the internet and might be inaccurate")}""") + + self.internetTime = ClickableButtonLabelWithBiggerIcon(size=64) + self.internetTime.setIcon(getPath(f"globe.png")) + self.internetTime.clicked.connect(lambda: self.toggleClockMode("format", shouldChangePrefs=True)) + self.internetTime.setText(f""" +

{_("Internet time")}

+ {_("Precise internet time. Ideal if you are not using any kind of VPN or proxy")}""") + + + vl.addWidget(label1) + vl.addStretch() + vl.addWidget(self.internetTime) + vl.addStretch() + vl.addWidget(self.localTime) + vl.addStretch() + self.setCentralWidget(widget) + + self.clockMode = "" + + def toggleClockMode(self, mode: str, shouldChangePrefs: bool = False) -> None: + self.enableNextButton() + if shouldChangePrefs: + self.defaultSelected = True + if mode == "secondary": + self.clockMode = "secondary" + self.moveSelector(self.localTime) + if shouldChangePrefs: + setSettings("EnableInternetTime", False, r=True) + elif mode == "format": + self.clockMode = "format" + self.moveSelector(self.internetTime) + if shouldChangePrefs: + setSettings("EnableInternetTime", True, r=True) + else: + raise ValueError("Function toggleCheckMode() called with invalid arguments. Accepted values are: custom, format, secondary") + + def showEvent(self, event) -> None: + if not self.defaultSelected: + self.toggleClockMode("secondary") + return super().showEvent(event) + + def moveSelector(self, w: QWidget) -> None: + if not self.selector.isVisible(): + self.selector.show() + self.selector.move(w.pos().x(), w.pos().y()) + self.selector.resize(w.size().width(), w.size().height()) + else: + posAnim = QPropertyAnimation(self.selector, b"pos", self) + posAnim.setStartValue(self.selector.pos()) + posAnim.setEndValue(w.pos()) + posAnim.setEasingCurve(QEasingCurve.InOutCirc) + posAnim.setDuration(200) + + sizeAnim = QPropertyAnimation(self.selector, b"size", self) + sizeAnim.setStartValue(self.selector.size()) + s = w.size() + s.setWidth(s.width()+18) + s.setHeight(s.height()+18) + sizeAnim.setEndValue(s) + sizeAnim.setEasingCurve(QEasingCurve.InOutCirc) + sizeAnim.setDuration(200) + + posAnim.start() + sizeAnim.start() + + def get6px(self, i: int) -> int: + return round(i*self.screen().devicePixelRatio()) + +class SelectFullScreenSlide(BasicNavWidget): + def __init__(self, parent=None) -> None: + super().__init__(parent=parent, nextGreyed=True) + self.defaultSelected = False + widget = QWidget() + l = QHBoxLayout() + l.setContentsMargins(0, 10, 0, 10) + widget.setLayout(l) + self.selector = MovableFocusSelector(self) + self.selector.hide() + vl = QVBoxLayout() + vl.setContentsMargins(0, 0, 0, 0) + l.addSpacing(10) + l.addLayout(vl) + + label1 = IconLabel(size=(96), frame=False) + label1.setIcon(getPath("video_color.png")) + label1.setText(f"""

{_("Fullscreen behaviour")}

+ {_("WingetUI can hide when there's a fullscreen window present (when you are watching a video, you are playing, etc.), but it can also show over those windows (It might be useful if you use fullscreened terminals, etc.).

Please select one of the following and click next to continue")}""") + + self.secondaryClock = ClickableButtonLabelWithBiggerIcon(size=64) + self.secondaryClock.setIcon(getPath(f"hide_color.png")) + self.secondaryClock.clicked.connect(lambda: self.toggleClockMode("hide", shouldChangePrefs=True)) + self.secondaryClock.setText(f""" +

{_("Hide the clock (Recommended)")}

+ {_("Hide the clock, as the default windows clock would do.")}""") + + self.formattedClock = ClickableButtonLabelWithBiggerIcon(size=64) + self.formattedClock.setIcon(getPath(f"show_color.png")) + self.formattedClock.clicked.connect(lambda: self.toggleClockMode("show", shouldChangePrefs=True)) + self.formattedClock.setText(f""" +

{_("Show the clock over the fullscreen window")}

+ {_("Show the clock over fullscreen windows. This might cover some in-app controls, like youtube's exit fullscreen button, but it might be useful to see the time when playing")}""") + + + vl.addWidget(label1) + vl.addStretch() + vl.addWidget(self.secondaryClock) + vl.addStretch() + vl.addWidget(self.formattedClock) + vl.addStretch() + self.setCentralWidget(widget) + + self.clockMode = "" + + def toggleClockMode(self, mode: str, shouldChangePrefs: bool = False) -> None: + self.enableNextButton() + if shouldChangePrefs: + self.defaultSelected = True + if mode == "hide": + self.clockMode = "hide" + self.moveSelector(self.secondaryClock) + if shouldChangePrefs: + setSettings("DisableHideOnFullScreen", False, r=shouldChangePrefs) + elif mode == "show": + self.clockMode = "show" + self.moveSelector(self.formattedClock) + if shouldChangePrefs: + setSettings("DisableHideOnFullScreen", True, r=shouldChangePrefs) + else: + raise ValueError("Function toggleCheckMode() called with invalid arguments. Accepted values are: hide, show") + + def showEvent(self, event) -> None: + if not self.defaultSelected: + self.toggleClockMode("hide") + return super().showEvent(event) + + def moveSelector(self, w: QWidget) -> None: + if not self.selector.isVisible(): + self.selector.show() + self.selector.move(w.pos().x(), w.pos().y()) + self.selector.resize(w.size().width(), w.size().height()) + else: + posAnim = QPropertyAnimation(self.selector, b"pos", self) + posAnim.setStartValue(self.selector.pos()) + posAnim.setEndValue(w.pos()) + posAnim.setEasingCurve(QEasingCurve.InOutCirc) + posAnim.setDuration(200) + + sizeAnim = QPropertyAnimation(self.selector, b"size", self) + sizeAnim.setStartValue(self.selector.size()) + s = w.size() + s.setWidth(s.width()+18) + s.setHeight(s.height()+18) + sizeAnim.setEndValue(s) + sizeAnim.setEasingCurve(QEasingCurve.InOutCirc) + sizeAnim.setDuration(200) + + posAnim.start() + sizeAnim.start() + + def get6px(self, i: int) -> int: + return round(i*self.screen().devicePixelRatio()) + +class DateTimeFormat(BasicNavWidget): + def __init__(self, parent=None) -> None: + super().__init__(parent=parent, nextGreyed=True) + self.defaultSelected = False + widget = QWidget() + l = QHBoxLayout() + l.setContentsMargins(0, 10, 0, 10) + widget.setLayout(l) + self.selector = MovableFocusSelector(self) + self.selector.hide() + vl = QVBoxLayout() + vl.setContentsMargins(0, 0, 0, 0) + l.addSpacing(10) + l.addLayout(vl) + + label1 = IconLabel(size=(96), frame=False) + label1.setIcon(getPath("formatting.png")) + label1.setText(f"""

{_("Let's talk: Format")}

+ {_("Please select the date and time format you like the most. You will be able to change this after in the settings window")}""") + + self.noChanges = ClickableImageWithText(size=96) + self.noChanges.setIcon(getPath(f"default_format.png")) + self.noChanges.clicked.connect(lambda: self.toggleClockMode("default", shouldChangePrefs=True)) + self.noChanges.setText(f"""

{_("Default")}

""") + + self.weekday = ClickableImageWithText(size=96) + self.weekday.setIcon(getPath(f"weekday.png")) + self.weekday.clicked.connect(lambda: self.toggleClockMode("weekday", shouldChangePrefs=True)) + self.weekday.setText(f"""

{_("Weekday")}

""") + + self.OnlyTime = ClickableImageWithText(size=96) + self.OnlyTime.setIcon(getPath(f"onlytime.png")) + self.OnlyTime.clicked.connect(lambda: self.toggleClockMode("OnlyTime", shouldChangePrefs=True)) + self.OnlyTime.setText(f"""

{_("Only Time")}

""") + + self.OnlyDate = ClickableImageWithText(size=96) + self.OnlyDate.setIcon(getPath(f"onlydate.png")) + self.OnlyDate.clicked.connect(lambda: self.toggleClockMode("OnlyDate", shouldChangePrefs=True)) + self.OnlyDate.setText(f"""

{_("Only Date")}

""") + + self.WeekNumber = ClickableImageWithText(size=96) + self.WeekNumber.setIcon(getPath(f"weeknumber.png")) + self.WeekNumber.clicked.connect(lambda: self.toggleClockMode("WeekNumber", shouldChangePrefs=True)) + self.WeekNumber.setText(f"""

{_("Week Number")}

""") + + self.Seconds = ClickableImageWithText(size=96) + self.Seconds.setIcon(getPath(f"seconds.png")) + self.Seconds.clicked.connect(lambda: self.toggleClockMode("Seconds", shouldChangePrefs=True)) + self.Seconds.setText(f"""

{_("Ft. Seconds")}

""") + + hl1 = QHBoxLayout() + hl1.addStretch() + hl1.addWidget(self.weekday) + hl1.addStretch() + hl1.addWidget(self.noChanges) + hl1.addStretch() + hl1.addWidget(self.Seconds) + hl1.addStretch() + + hl2 = QHBoxLayout() + hl2.addStretch() + hl2.addWidget(self.OnlyTime) + hl2.addStretch() + hl2.addWidget(self.WeekNumber) + hl2.addStretch() + hl2.addWidget(self.OnlyDate) + hl2.addStretch() + + vl.addWidget(label1) + vl.addStretch() + vl.addLayout(hl1) + vl.addStretch() + vl.addLayout(hl2) + vl.addStretch() + self.setCentralWidget(widget) + + self.clockMode = "" + + def toggleClockMode(self, mode: str, shouldChangePrefs: bool = False) -> None: + self.enableNextButton() + if shouldChangePrefs: + self.defaultSelected = True + if mode == "Seconds": + self.clockMode = "Seconds" + self.moveSelector(self.Seconds) + if shouldChangePrefs: + setSettings("EnableSeconds", True, r=False) + setSettings("DisableTime", False, r=False) + setSettings("DisableDate", False, r=False) + setSettings("EnableWeekNumber", False, r=False) + setSettings("EnableWeekDay", False, r=True) + elif mode == "default": + self.clockMode = "default" + self.moveSelector(self.noChanges) + if shouldChangePrefs: + setSettings("EnableSeconds", False, r=False) + setSettings("DisableTime", False, r=False) + setSettings("DisableDate", False, r=False) + setSettings("EnableWeekNumber", False, r=False) + setSettings("EnableWeekDay", False, r=True) + elif mode == "weekday": + self.clockMode = "weekday" + self.moveSelector(self.weekday) + if shouldChangePrefs: + setSettings("EnableSeconds", False, r=False) + setSettings("DisableTime", False, r=False) + setSettings("DisableDate", False, r=False) + setSettings("EnableWeekNumber", False, r=False) + setSettings("EnableWeekDay", True, r=True) + elif mode == "OnlyDate": + self.clockMode = "OnlyDate" + self.moveSelector(self.OnlyDate) + if shouldChangePrefs: + setSettings("EnableSeconds", False, r=False) + setSettings("DisableTime", True, r=False) + setSettings("DisableDate", False, r=False) + setSettings("EnableWeekNumber", False, r=False) + setSettings("EnableWeekDay", False, r=True) + elif mode == "OnlyTime": + self.clockMode = "OnlyTime" + self.moveSelector(self.OnlyTime) + if shouldChangePrefs: + setSettings("EnableSeconds", False, r=False) + setSettings("DisableTime", False, r=False) + setSettings("DisableDate", True, r=False) + setSettings("EnableWeekNumber", False, r=False) + setSettings("EnableWeekDay", False, r=True) + elif mode == "WeekNumber": + self.clockMode = "WeekNumber" + self.moveSelector(self.WeekNumber) + if shouldChangePrefs: + setSettings("EnableSeconds", False, r=False) + setSettings("DisableTime", False, r=False) + setSettings("DisableDate", False, r=False) + setSettings("EnableWeekNumber", True, r=False) + setSettings("EnableWeekDay", False, r=True) + else: + raise ValueError("Function toggleCheckMode() called with invalid arguments ("+mode+"). Accepted values are: default, weekday, OnlyTime, OnlyDate, WeekNumber, Seconds") + + def showEvent(self, event) -> None: + if not self.defaultSelected: + self.toggleClockMode("default") + return super().showEvent(event) + + def moveSelector(self, w: QWidget) -> None: + if not self.selector.isVisible(): + self.selector.show() + self.selector.move(w.pos().x(), w.pos().y()) + self.selector.resize(w.size().width(), w.size().height()) + else: + posAnim = QPropertyAnimation(self.selector, b"pos", self) + posAnim.setStartValue(self.selector.pos()) + posAnim.setEndValue(w.pos()) + posAnim.setEasingCurve(QEasingCurve.InOutCirc) + posAnim.setDuration(200) + + sizeAnim = QPropertyAnimation(self.selector, b"size", self) + sizeAnim.setStartValue(self.selector.size()) + s = w.size() + s.setWidth(s.width()+18) + s.setHeight(s.height()+18) + sizeAnim.setEndValue(s) + sizeAnim.setEasingCurve(QEasingCurve.InOutCirc) + sizeAnim.setDuration(200) + + posAnim.start() + sizeAnim.start() + + def get6px(self, i: int) -> int: + return round(i*self.screen().devicePixelRatio()) + +class ClockAppearance(BasicNavWidget): + def __init__(self, parent=None) -> None: + super().__init__(parent=parent, nextGreyed=True) + self.defaultSelected = False + widget = QWidget() + l = QHBoxLayout() + l.setContentsMargins(0, 10, 0, 10) + widget.setLayout(l) + self.selector = MovableFocusSelector(self) + self.selector.hide() + vl = QVBoxLayout() + vl.setContentsMargins(0, 0, 0, 0) + l.addSpacing(10) + l.addLayout(vl) + + label1 = IconLabel(size=(96), frame=False) + label1.setIcon(getPath("appearance.png")) + label1.setText(f"""

{_("One last thing: Appearance")}

+ {_("Please select the clock style you like the most. You will be able to change this after in the settings window")}""") + + self.default = ClickableImageWithText(size=96) + self.default.setIcon(getPath(f"default_style.png")) + self.default.clicked.connect(lambda: self.toggleClockMode("default", shouldChangePrefs=True)) + self.default.setText(f"""

{_("Default")}

""") + + self.msdos = ClickableImageWithText(size=96) + self.msdos.setIcon(getPath(f"msdos.png")) + self.msdos.clicked.connect(lambda: self.toggleClockMode("msdos", shouldChangePrefs=True)) + self.msdos.setText(f"""

MS-DOS

""") + + self.win95 = ClickableImageWithText(size=96) + self.win95.setIcon(getPath(f"win95.png")) + self.win95.clicked.connect(lambda: self.toggleClockMode("win95", shouldChangePrefs=True)) + self.win95.setText(f"""

Windows 95

""") + + self.bw = ClickableImageWithText(size=96) + self.bw.setIcon(getPath(f"bw.png")) + self.bw.clicked.connect(lambda: self.toggleClockMode("bw", shouldChangePrefs=True)) + self.bw.setText(f"""

{_("Black&White")}

""") + + self.wb = ClickableImageWithText(size=96) + self.wb.setIcon(getPath(f"wb.png")) + self.wb.clicked.connect(lambda: self.toggleClockMode("wb", shouldChangePrefs=True)) + self.wb.setText(f"""

{_("White&Black")}

""") + + self.accent = ClickableImageWithText(size=96) + self.accent.setIcon(getPath(f"accent.png")) + self.accent.clicked.connect(lambda: self.toggleClockMode("accent", shouldChangePrefs=True)) + self.accent.setText(f"""

{_("Accent")}

""") + + hl1 = QHBoxLayout() + hl1.addStretch() + hl1.addWidget(self.msdos) + hl1.addStretch() + hl1.addWidget(self.default) + hl1.addStretch() + hl1.addWidget(self.win95) + hl1.addStretch() + + hl2 = QHBoxLayout() + hl2.addStretch() + hl2.addWidget(self.bw) + hl2.addStretch() + hl2.addWidget(self.accent) + hl2.addStretch() + hl2.addWidget(self.wb) + hl2.addStretch() + + vl.addWidget(label1) + vl.addStretch() + vl.addLayout(hl1) + vl.addStretch() + vl.addLayout(hl2) + vl.addStretch() + self.setCentralWidget(widget) + + self.clockMode = "" + + def toggleClockMode(self, mode: str, shouldChangePrefs: bool = False) -> None: + self.enableNextButton() + if shouldChangePrefs: + self.defaultSelected = True + if mode == "msdos": + self.clockMode = "msdos" + self.moveSelector(self.msdos) + if shouldChangePrefs: + setSettingsValue("UseCustomFont", "Consolas,10,-1,5,50,0,0,0,0,0,Regular", r=False) + setSettingsValue("UseCustomFontColor", "0,255,0", r=False) + setSettings("DisableTaskbarBackgroundColor", False, r=False) + setSettingsValue("UseCustomBgColor", "0,0,0,100", r=False) + setSettings("AccentBackgroundcolor", False, r=True) + elif mode == "default": + self.clockMode = "default" + self.moveSelector(self.default) + if shouldChangePrefs: + setSettings("UseCustomFont", False, r=False) + setSettings("UseCustomFontColor", False, r=False) + setSettings("DisableTaskbarBackgroundColor", False, r=False) + setSettings("UseCustomBgColor", False, r=False) + setSettings("AccentBackgroundcolor", False, r=True) + elif mode == "bw": + self.clockMode = "bw" + self.moveSelector(self.bw) + if shouldChangePrefs: + setSettings("UseCustomFont", False, r=False) + setSettingsValue("UseCustomFontColor", "0,0,0", r=False) + setSettings("DisableTaskbarBackgroundColor", False, r=False) + setSettingsValue("UseCustomBgColor", "255,255,255,100", r=False) + setSettings("AccentBackgroundcolor", False, r=True) + elif mode == "wb": + self.clockMode = "wb" + self.moveSelector(self.wb) + if shouldChangePrefs: + setSettings("UseCustomFont", False, r=False) + setSettingsValue("UseCustomFontColor", "255,255,255", r=False) + setSettings("DisableTaskbarBackgroundColor", False, r=False) + setSettingsValue("UseCustomBgColor", "0,0,0,100", r=False) + setSettings("AccentBackgroundcolor", False, r=True) + elif mode == "accent": + self.clockMode = "accent" + self.moveSelector(self.accent) + if shouldChangePrefs: + setSettings("UseCustomFont", False, r=False) + setSettings("UseCustomFontColor", False, r=False) + setSettings("DisableTaskbarBackgroundColor", False, r=False) + setSettings("UseCustomBgColor", False, r=False) + setSettings("AccentBackgroundcolor", True, r=True) + elif mode == "win95": + self.clockMode = "win95" + self.moveSelector(self.win95) + if shouldChangePrefs: + setSettingsValue("UseCustomFont", "Segoe UI,11,-1,5,50,0,0,0,0,0,Normal", r=False) + setSettingsValue("UseCustomFontColor", "205,205,205", r=False) + setSettings("DisableTaskbarBackgroundColor", False, r=False) + setSettingsValue("UseCustomBgColor", "1,127,128,100.0", r=False) + setSettings("AccentBackgroundcolor", False, r=True) + else: + raise ValueError("Function toggleCheckMode() called with invalid arguments ("+mode+"). Accepted values are: default, weekday, OnlyTime, OnlyDate, WeekNumber, Seconds") + + def showEvent(self, event) -> None: + if not self.defaultSelected: + self.toggleClockMode("default") + return super().showEvent(event) + + def moveSelector(self, w: QWidget) -> None: + if not self.selector.isVisible(): + self.selector.show() + self.selector.move(w.pos().x(), w.pos().y()) + self.selector.resize(w.size().width(), w.size().height()) + else: + posAnim = QPropertyAnimation(self.selector, b"pos", self) + posAnim.setStartValue(self.selector.pos()) + posAnim.setEndValue(w.pos()) + posAnim.setEasingCurve(QEasingCurve.InOutCirc) + posAnim.setDuration(200) + + sizeAnim = QPropertyAnimation(self.selector, b"size", self) + sizeAnim.setStartValue(self.selector.size()) + s = w.size() + s.setWidth(s.width()+18) + s.setHeight(s.height()+18) + sizeAnim.setEndValue(s) + sizeAnim.setEasingCurve(QEasingCurve.InOutCirc) + sizeAnim.setDuration(200) + + posAnim.start() + sizeAnim.start() + + def get6px(self, i: int) -> int: + return round(i*self.screen().devicePixelRatio()) + + +if __name__ == "__main__": + from ctypes import c_int, windll + windll.shcore.SetProcessDpiAwareness(c_int(2)) + import __init__ From a451e9ef98feb900845f77a4d7e17d6f0310a49c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 20 May 2023 22:49:10 +0200 Subject: [PATCH 2/6] add end slide and reimplement navigation animations --- wingetui/__init__.py | 1 - wingetui/resources/coffee.png | Bin 0 -> 2523 bytes wingetui/resources/finish.png | Bin 0 -> 3881 bytes wingetui/resources/github.png | Bin 0 -> 7514 bytes wingetui/resources/kofi.png | Bin 0 -> 10535 bytes wingetui/resources/youtube.png | Bin 0 -> 1792 bytes wingetui/welcome.py | 120 ++++++++++++++++++++------------- 7 files changed, 74 insertions(+), 47 deletions(-) create mode 100644 wingetui/resources/coffee.png create mode 100644 wingetui/resources/finish.png create mode 100644 wingetui/resources/github.png create mode 100644 wingetui/resources/kofi.png create mode 100644 wingetui/resources/youtube.png diff --git a/wingetui/__init__.py b/wingetui/__init__.py index b0043c688..0e9385e8c 100644 --- a/wingetui/__init__.py +++ b/wingetui/__init__.py @@ -219,7 +219,6 @@ def increaseStep(): def askAboutPackageManagers(self, onclose: object): import welcome - setSettings("ShownWelcomeWizard", True) self.ww = welcome.WelcomeWindow(callback=lambda: (self.popup.show(), onclose())) self.popup.hide() self.ww.show() diff --git a/wingetui/resources/coffee.png b/wingetui/resources/coffee.png new file mode 100644 index 0000000000000000000000000000000000000000..e3594349635e30f64507accdcb4b5747a9e841b7 GIT binary patch literal 2523 zcmV<12_*K3P)42nwunzqzowk?VA7^TBECq%mzqfyKQNNjuS*^7eoB?7}(A-p=06+1c}-`3*CC z+u!r-Ip;m^yBrQX?6AWQJM6H-4m<3y!wx&_u)_{J?6^3qu1#%8y{aDv^r`ZxQTTff z{=U8Hnto?W-?uRt3bcT=qw*jv`*D>iDThejbR4Cp=>pc{Q(Sj4(j4?R@^v7JDtN{w)f6o9>9E2Y6 z+Ypj^H3vK_-2e#3xr7rfRpK-$(TXPJIB+$(QCYpBal9a+VRD_{1Q6Zx)#D)j4khXB zZjp}Ds67PP^ZOAK5$vi$f|sh1;N{aOc+XiB{Aw)sMfr;~Q^VgI=#kOvIG{cn3a1{NllEp9moM<KnuWxJARCG5gZfuYZj$>522DlXm7r9qJR5?*ngMT}BRI z=z$g4I_7-0O?;@lAg>E>9bp;_%`WGY?~_G;dRa1LyIARhlBuTo-DetlraIo!P`R~ zk>2Hkbb@&E0|CaZ(!YzOUpV|!#4Ef$L_1oflUr>wRR8# zfcpS_`^@5A^**PhcY0QOtb@`?2YaQ;zdCZX9ResM1yC~DPK$hzLbV7)t9)9z@pz2s zh)iUoGRN*tU%@~EF#zB`C-=r<-fw@G=C|II9_JzH#Is4jmyZ0HkXtl(mkJ7X1fs)}?Y$3)i9&P58j=bO%`Pf$zV{> zc5DOVUN^&Uc5_^o-ppL-W;8M`0FXXFP5M2?N*CHc>i#gS;SO_tt)I}L6#0R4Gw!~_ zm;mBiRAo$;ZuJsV=QOt%69CBmr^lr?+Lj*a9qA;5brUOTmtR_1ocrnXamW?wc4EXD zsLjSXpB;nFXW@MET(p667&|alptG4cA7eZlW#A0P_9%3Edn7u&4X0*X1ghB@fj+`` z21AHWVQdkiY6Ib@dUH5BiLogh{drRuPDU82%215%xMBzl~J8;etrJD&qg9+bm5*}#~PLysEe#%_9K{`>mnRJ5iigZkR zsDTq{IKO*gvyS!vK;~_)wtTx2E#FLRd6;7@PsdwM6n-LYDLVdRoMRg?mVAGF!}2F+ zlV6uD3TH;kh1OfX$#ToBT~-V&Pn(l&5>Akgj&3j!f{v~eq|q0^&e+{{Tb|`?%Ofeb z{G^4JS6OIzg{_ub5Kff-!TOL{j;sULh7{8oz)_nmf6lz+E9|#?8@c5lS!lWao2M%+ zUox-d^Q5nPYL@rc3O=SS01)0y6n@^`WyL6+(#_Le%QGBld8lhGCkZDaK;>%$3fclV zpB4S3spaP^w4BaIM5`^|=uFG!0O2Iwds^@{Z2_FijMmI=d6Ww+r}BvCM9ZBJZfv=^ zbRgJ>Kto#qAp8MyTE5hF%h$Wqa+35vttRn+wg5o*f9PBYd8_4S!ckdj5Rva_3jl=w zi{^!p)tjfebh2>DEhkAoyo$ta+5!OKqjWEXoNYN3;biH72L6~b%P?&LRBsg?qkSRd zm6nr)8~8&q1|Jb8=<0J-dr7eJ(?9eAcxQ6D1kc~$~ z=Y`|a`Ie<8@sLDpKt=1zIBY=nL7Epro^Lr>`W#98-_!m&x-xx<09vl2Zz1IImRmz3 z5d{P?VoUOPdgyK%7eY3rTf2EW+;S@%5_5AnOd4qUMVb~ulv?hra5L%|cP>aG5-mKk zK1A;Qg^=f3ZW+EzBH}FMFmWm~qaS~NZAg>19}zv&^7$lk8yG8p_M4EwSx~+NocW5=kJ*eJ^>KRPH&yQ(4Zv@B97lyZ0^8vRECh zqjj{7*3mkej&@h_;hWXG52LGj18yPetB%>7t>W2**9h$FUUWA#`2*~$cmpC3=dhb* zM^U$V_HP(v0J&(O6&8*kN+HZM}%fYUO5{~iVn@=)OPHWFNc z0G;sdU0<{Ss*l;Z>Gg8V?%IRAzMbd~!m~pO+k-x;c=i!5UI6xyByJD~X$?>%u%C`* zHV`4O&w1ej;M?Vr`l;d%^rbPtz@HI7$n_U5fPt07egp%r(ip%&iU2~M;{D=9k^e~I z&>7cE>_^~GO?eP0-{CZc0C379RF`Ia$Fb;pMTopd`3^SbD*8{Jy=^sbU_P!z%CrBt z#ri*zk{iB5IrTF@;IOk=;0UBhg${ER!3hVBL0{LZzR!2$o9!|qbQHCyu~sT@7~M2E z2mPCh8^jLkHyC_}1yU@K6ux7!jPE!Y{kclxXXnf{0CemZHEOAn@di1eAW|r~5jxJN zKDf|nj8rfPC{Tg8tNHzE!Jr_s4L~?3xQ#mRHrGn-hVM9v`ucam?i~~Y7=&n00RZbI zv%T9z$1W8PE-}!Y188C38ls9;Q(PXe#FG&I|MoR)X$pr!IYlw%48U#rE z5q@kCV`d^|ut78(;mZc$H1uB|_CIMq>k&BFDQcnVp<3uvN&i8Ua7YfC0YHx-n~Wu2 zGSlYu!T^iISaw061_4c|LTDKPLWo1~vFu~eQY0FjK-+_0@DT&nK<7v#5@_(pgS?@g z3>9BI+mcfd#F;kX-g zNh)#MUrn3<|h&4}2=RVo_VhyVf}%LKz5>5g@P%X(Sj zXCc5MTS{*gz$~%=@CMBHQU-wFvhNFBIhJ&fPbP91gli;p(NHCJo?xUK5|`0Zk;@Ie zg9?YH7&4A%CVL(hs0u)1(^akgBufyQ{d_$8)dPV1N$fVpS!LNzd@V`C1;m$rAs7$d&{aC63$ZrY&odujZv>c$< zkf_E7x*W*FE>gyBK2iFY5TFZLA-z37=xcEpFB{4bu+ZC?z2VPX+g3b0Y76(XY!ssZ z*xef*9I|Qi_b|8*!Boz(045_lZHyKG?hEe)iU2$i?ra&o`adcss6U3er-PE=b5RJOhekSY z$IuOv3~!#8Q%kxTO}>)S1>F?O4-O#Loh_vR?FF}oH_Ct;vXFAo(PgK(bg1TjlzyFXQAA41H zd@Sgrrg)qKm41(LJ9XiEaq30WICaLBuS7h}^4<@w?7BnlohiK_sVx{glB8zD8OGld z$xn>SLV!MMPkge1O25}LZEOl=Tiz<1#c5csw>o4;n+_NKJ=9Um7(QnS2h zTn6I-$cjG+mlu5s`uXG}m40vR?^Ad-#tKd@wnVb}Fv6*Cy1|(UE2unRE1@*$iatG0 zQgdz5r^}c>1B%Cc$%{V&0-n^Ax>`~Q;J0h3)^IkoJ5=TMV}x^Sdce=Ay`XYmAL7@9 z@{%vCP%Tf1YAzY?!FT{QC7;{LizfgHwM7$V5C?Fe53gc(FSwrG8>)|e$OzZdZ2*r^ zx!*RQ_>3?5Jdm{Bx}x#@ng65!x)Q1_nb?Q`ebkjqJV4rS<^FfqVL7+5`T~W|q*4O+ ztq6I4pIG9jz$Fv2NNPpYfn@aG+vVdLwI|)KA%Fm>tjLwb8p2vHvD&NEm3m~=mU;jYCq2sG^hDyUt+ZkM`KlYgNy1NBe=Cw$%^I=fGK`QT%vQd@nQ z*Zp?efK>-t?zOtU+#4v;P+R6TmZblNGd@oBr>Fgi00Vj0Q07DQSOgy%K1RxQm3gmX zwRe+V@a5E>o+?EE6>gvMxo4Z~exTD9*NV5dxW=(kf?v@Z@|nO78qWv+jsTk6s=pZg zzSbhp*yuPi5l=Wt6Mrl#^nOIO9_#?la@nls(Hc(s&ZaUOj~94D|Lq>|c9NTl&WY}u zbuLF27xj7k(}Ge2P~y^p61cKZ=cf}oC%GlGJeIECxj|gc6iR1UL;18>tmoP4&rHuj zfG+9~ak*a5H3i8}ZcV3T_i4H>34>p`E0_R{mzKcOt06jR{An@V;eQSw3DvnK<1yPh z7L3HWNI*_k_;dChJ1lb(_Zry2iPjW((K$ z^oKhFbk}))9zaE?8u)v6gkQi_^gH->b@heE!ei<>CZ`N8oG+dZ+UmkJ!&yHz%M@Du zc|XsFbN-;oPbX)>(7m3}Wha+}%UyPQS+~`{MVedytZvrMTqoDbZG0414{8DPEJ6S}5TLfR$6 zGr4Pq=T}`armRL^A4S~7KhqSfkLLdFc1@ddM9~-SGu<-p z0hugQYjAF6XLQwZv+8Ux%+8$-7JIyn%GtEO#PUz0-!=C5qq3$#MOhHOvbu?DWtn2j zKM@%G@nK(J@0)6LvNP<612~vr&&Vo_q~7sCYY7^FX8}#GRFZ^ z$APG_O!s}mm z|3J4Re!vt14*4L#_FCm1K|jO4!{jk^KjL@TWS1a|BmQr7&k4BNJvRWD!aCO#TF9J@zuz%Mq3OmqWQwx0Qc_C4~0p1U;=3nV6nh)j-t^wC#HsWKy zOLLA+OshlyqijiqD4pzrsLi_|QY$-~NN6IWO?EV~Nx}7q%{vC0d;rmj=@*S5IErz> zYI0SCtFgU_jVjKWK>%s;b`zXnbipdZ6l{A&yaJgy1aK=lF;&0d%}fj4PDijBYvQ-6 zvtjE^lMevNJ*}L*&r5I^9l;ygB1J){lJzO&CLaKjn@d-4I3>Z`m=LT%vKp(`C!791 zP#dvn*LI@|j&F;tObCY6aV_~ylWis+01_HObAw}4@M$1E z8Aq^&Tw@7dr(Lj$wMnp2L83abiE~XpfUpf)r)ar?FkEmP!-CaiD_9Y`MaA;9o4F<* zKVcqy4+_|KZQSl2{Y+$ysPAS5bb7O`NRa@$d`lF)VVbt~4w zlF+s0^Qnk$A~v}hXZ>vt!E4o7{fs3lVqtM;toi)k0z<+!4t*|yL&*g%(GaZ0s%I=# z5Ce-sW1Y<=fF%)ez16QE2n4So6Z|!0!LdYwTd}ew(Xb#irkB|S5E>f#I@#=P55X}+ zf){DBq9svJ=gmua&8$9{h2%bZZh}`*7OY}nOO`jWXnEvAmbo<~_X;h+tEdW&CKkL< zi{ORJBh^^Yl4Y2P%VrkoT>$v1Vd0ACG$dB8YlEXJc)l?OYe$CIg|6ye rWp%WU*3mjzN9$-Et)q1`BewqoMw|k=SUlJH00000NkvXXu0mjfc(Ym} literal 0 HcmV?d00001 diff --git a/wingetui/resources/github.png b/wingetui/resources/github.png new file mode 100644 index 0000000000000000000000000000000000000000..5a3de8f816f663887df18379dcd3be8cfeb8404e GIT binary patch literal 7514 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 literal 0 HcmV?d00001 diff --git a/wingetui/resources/kofi.png b/wingetui/resources/kofi.png new file mode 100644 index 0000000000000000000000000000000000000000..fdcb58c30c6e94b4c54f358fa1cf7167f92a01b3 GIT binary patch literal 10535 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 literal 0 HcmV?d00001 diff --git a/wingetui/resources/youtube.png b/wingetui/resources/youtube.png new file mode 100644 index 0000000000000000000000000000000000000000..f568b59d8ead9b484e03931a5fa4be286beb2048 GIT binary patch literal 1792 zcma)7X*8P&8+~6PA;l+XEgcmak*H;mYAhur)@rKuwkTR#=_rQS8&U01TamFewJT!m zwHB4qN)>H7I>r=3C{>|$jctti{(t9u&vTyVo_l}XfA`#EJF=x1TpkVpfS9!v$^HmE z|2<*o(Vxkq;Ew?6eZi6h9R9n--Idu#LW?!Y)X`OBIp00#xVbd@Fl^i`utcM{qS;AP z1fhcNFV(iEqpAI{*wsYUw6&yHvdI>Twz!x6sb~vHWyvUx?2HSiN*j%OLwtGQo!w%n0Fl3x%uKQy#5v_z(WJ0hSGQt%#CLPEfd zAT0d9Ny30F;do4Fv`}@3+!m)Qv3F~!=e|yg4n0HDVe77%ACu;76X&??a6ikJd)?;T z9`D^}YOWuztEu%L@$*Coc+8#e0^X$jk%`duZf2i)u^oPn7KJ}QEqG@9%9-126XkNn>2(Z}kv}-*5>xS6J zA~nN5>W<%RCW9=U2_lby&6*HKHA+)D^PUS4ZX~DZHp-b62fT7BJk|!3N9_*G5~?>O zUFj~f4(&n&uaf#SX?I~vn>p_UU$bzWs zfQ{3;Zh|&Hnz*#|ygLOXLGLD(=1%e9RTsU@{+7;a*k1x=Q}MvyDIsG+c+Di>=zOI@ zN;ez>0*lH;&H-|(V^^m~PP6&~srTY0NyhU_K+R#-C%>$NpuBLIt*Jj-SQi)x!+X^6 zT+(^@n8Sehh9=hzLDnv+Z4>b#n(IA%;LbX84bZ}Hzf0s;^1fli)PJtxqOKNv=>oMDk>S;5b;#A!wy3 zUz@fVoephx+Monafkyjt!KaAB?q{eOe6Hpx_Nb2fd@c!s&IN3Bn=>la$m~(LtRgvE z7a$Jy8Y-E`1vz09<;isuDu7RiJh|#QCZkrxAqvKKv36vSf+AECQ9@%ztXDw(EXH;*^&9+9UJ>>2(vzPXVf;G^tIKHQS-aGb?~e`g4M3|frTA_H zpC3NGuP>E-CmidB)Bjn7a5*PA;E@ndd>N{@8or%*Ak+z8^0eTBt3R10?4_9}_FP)6 z{hC5J)>9pz@cI$1we0=J#zFDCNKm$2GCtH=qAjNALJ8^}zDav2R<5l=y5{e?EnZyS_;hqOMZv%MJ zhtYxd#gw}>qB;c<0>GXgT&I*1RA%4|Ww5R=I^tl|HY6k0n^$IZqy!2Z5@y|k3c(MG zXA-$EvoTQQ2?=HCKjk(XR(e6?0A(6MO8YkDnOzmZ??|=oh+$47U&{xMiX#r%}}m zrRq&%7w({QO}+`@(%WS_p{#-Y3lALnEt2Gb=><9{GfFxePYIc8g+SNJj-s-Lu=7vo zyQDw1Dwitwt*@xLz%uiuD(AklI&z|U_+tR<<_`fiZTeCNP6F^1-#qtjoKLeZ^FjD- z2z?s2-B^*Sj8z1a&W|OdX)Sf}?~_KvS4Dr%mHiyDDU$R4GHMRZNx~I|CarYb5vTgq zM9iEsmdJTFVUdZ;VrhG5x^&VCWFbOS1**b+FXQrQN*~&z660__N>tC=;KZ-aKZwE; zJ5~I%y<#R)ua-AFe(5^!$>Ob>jj8dU#^0>Ns0DNgeYu@hdrPZ-zZ&i6x~o)|cr1@i z49xo8i-KeeatO>$wXLCFF(Kq!e7h8VL|V(_byr&3UlBGZt2uS8Tpga7bqSQ^L)rx$ z*EPH#iH?IJlW&kty7e>RPH2}m9+0z}E*GsEUSvg#xN259+I9W0pqsxpBIHqyiKE9q zblF~X{Y<%?wz2tvc-^D$7aXr?s;iS}_ None: self.widgetOrder = ( FirstRunSlide(), - SelectModeSlide(), - SelectFullScreenSlide(), - DateTimeFormat(), - ClockAppearance(), + #SelectModeSlide(), + #SelectFullScreenSlide(), + #DateTimeFormat(), + #ClockAppearance(), LastSlide(), ) @@ -301,6 +301,7 @@ class BasicNavWidget(QWidget): previous = Signal() finished = Signal() skipped = Signal() + centralWidget: QWidget = None def __init__(self, parent=None, startEnabled=False, closeEnabled=False, finishEnabled=False, nextGreyed=False) -> None: super().__init__(parent=parent) @@ -364,50 +365,78 @@ def nextWidget(self): self.outAnim(self.next.emit) def setCentralWidget(self, w: QWidget) -> QWidget: + self.centralWidget = w self.l.addWidget(w, stretch=1) self.l.addLayout(self.navLayout, stretch=0) + self.opacityEffect = QGraphicsOpacityEffect(self.centralWidget) + self.centralWidget.setGraphicsEffect(self.opacityEffect) + self.opacityEffect.setOpacity(0) def inAnim(self) -> None: - bgAnim = QPropertyAnimation(self, b"pos", self) - pos = self.pos() - pos.setX(pos.x()+self.width()) + anim = QVariantAnimation(self.centralWidget) + anim.setStartValue(0) + anim.setEndValue(100) + anim.valueChanged.connect(lambda v: self.opacityEffect.setOpacity(v/100)) + anim.setEasingCurve(QEasingCurve.OutQuad) + anim.setDuration(200) + anim.start() + + bgAnim = QPropertyAnimation(self.centralWidget, b"pos", self.centralWidget) + pos = self.centralWidget.pos() + pos.setX(pos.x()+(self.centralWidget.width()/20)) bgAnim.setStartValue(pos) - bgAnim.setEndValue(self.pos()) - bgAnim.setEasingCurve(QEasingCurve.OutQuart) + bgAnim.setEasingCurve(QEasingCurve.OutQuad) + bgAnim.setEndValue(self.centralWidget.pos()) bgAnim.setDuration(200) bgAnim.start() def invertedinAnim(self) -> None: - bgAnim = QPropertyAnimation(self, b"pos", self) - pos = self.pos() - pos.setX(pos.x()-self.width()) + anim = QVariantAnimation(self) + anim.setStartValue(0) + anim.setEndValue(100) + anim.valueChanged.connect(lambda v: self.opacityEffect.setOpacity(v/100)) + anim.setEasingCurve(QEasingCurve.OutQuad) + anim.setDuration(20) + anim.start() + + bgAnim = QPropertyAnimation(self.centralWidget, b"pos", self.centralWidget) + pos = self.centralWidget.pos() + pos.setX(self.centralWidget.x()-(self.centralWidget.width()/20)) bgAnim.setStartValue(pos) - bgAnim.setEndValue(self.pos()) - bgAnim.setEasingCurve(QEasingCurve.OutQuart) + bgAnim.setEndValue(self.centralWidget.pos()) + bgAnim.setEasingCurve(QEasingCurve.OutQuad) bgAnim.setDuration(200) bgAnim.start() def outAnim(self, f) -> None: + anim = QVariantAnimation(self) + anim.setStartValue(100) + anim.setEndValue(0) + anim.valueChanged.connect(lambda v: self.opacityEffect.setOpacity(v/100)) + anim.setEasingCurve(QEasingCurve.InQuad) + anim.setDuration(100) + anim.start() + anim.finished.connect(f) + return bgAnim = QPropertyAnimation(self, b"pos", self) bgAnim.setStartValue(self.pos()) pos = self.pos() - pos.setX(pos.x()-self.width()) + pos.setX(pos.x()-(self.width()/2)) bgAnim.setEndValue(pos) bgAnim.setEasingCurve(QEasingCurve.InQuart) - bgAnim.setDuration(200) + bgAnim.setDuration(100) bgAnim.start() - bgAnim.finished.connect(f) def invertedOutAnim(self, f) -> None: - bgAnim = QPropertyAnimation(self, b"pos", self) - bgAnim.setStartValue(self.pos()) - pos = self.pos() - pos.setX(pos.x()+self.width()) - bgAnim.setEndValue(pos) - bgAnim.setEasingCurve(QEasingCurve.InQuart) - bgAnim.setDuration(200) - bgAnim.start() - bgAnim.finished.connect(f) + anim = QVariantAnimation(self) + anim.setStartValue(100) + anim.setEndValue(0) + anim.valueChanged.connect(lambda v: self.opacityEffect.setOpacity(v/100)) + anim.setEasingCurve(QEasingCurve.InQuad) + anim.setDuration(100) + anim.start() + anim.finished.connect(f) + return def get6px(self, i: int) -> int: return round(i*self.screen().devicePixelRatio()) @@ -668,6 +697,7 @@ def __init__(self, parent=None) -> None: vl.addWidget(label3) vl.addStretch() self.setCentralWidget(widget) + self.opacityEffect.setOpacity(1) def get6px(self, i: int) -> int: return round(i*self.screen().devicePixelRatio()) @@ -677,7 +707,7 @@ def __init__(self, parent=None) -> None: super().__init__(parent=parent, finishEnabled=True) widget = QWidget() l = QHBoxLayout() - l.setContentsMargins(0, 10, 0, 10) + l.setContentsMargins(0, 0, 0, 10) widget.setLayout(l) vl = QVBoxLayout() vl.setContentsMargins(0, 0, 0, 0) @@ -685,24 +715,20 @@ def __init__(self, parent=None) -> None: l.addLayout(vl) label1 = IconLabel(size=96, frame=False) - label1.setIcon("finish_color.png") - label1.setText(f"""

{_("You are now ready to go!")}

-

{_("But here are other things you can do:")}

""") - - settings = ButtonLabel(size=64) - settings.setIcon("further_custom_color.png") - settings.setText(f""" -

{_("Customize WingetUI even more")}

- {_("Open the settings window and customize WingetUI even further.")}""") - settings.setButtonText(_("Open")) - settings.clicked.connect(lambda: closeAndOpenSettings()) - - def closeAndOpenSettings(): - globals.sw.show() - self.finished.emit() + label1.setIcon("finish.png") + label1.setText(f"""

{_("Systems are now ready to go!")}

+

{_("But here are other things you can do to learn about WingetUI even more:")}

""") + + youtube = ButtonLabel(size=64) + youtube.setIcon("youtube.png") + youtube.setText(f""" +

{_("Check out some WingetUI overviews")}

+ {_("There are some great videos on YouTube that showcase WingetUI and its capabilities. You could learn useful tricks and tips!")}""") + youtube.setButtonText(_("Open")) + youtube.clicked.connect(lambda: os.startfile("https://www.youtube.com/results?search_query=WingetUI&sp=CAI%253D")) donate = ButtonLabel(size=64) - donate.setIcon("cafe_color.png") + donate.setIcon("kofi.png") donate.setText(f"""

{_("Suport the developer")}

{_("Developing is hard, and this aplication is free. But if you liked the application, you can always buy me a coffee :)")}""") @@ -710,7 +736,7 @@ def closeAndOpenSettings(): donate.clicked.connect(lambda: os.startfile("https://ko-fi.com/martinet101")) report = ButtonLabel(size=64) - report.setIcon("github_color.png") + report.setIcon("github.png") report.setText(f"""

{_("View WingetUI on GitHub")}

{_("View WingetUI's source code. From there, you can report bugs or suggest features, or even contribute direcly to The WingetUI Project")}""") @@ -719,19 +745,21 @@ def closeAndOpenSettings(): vl.addWidget(label1) vl.addStretch() - vl.addWidget(settings) + vl.addStretch() + vl.addWidget(youtube) vl.addStretch() vl.addWidget(donate) vl.addStretch() vl.addWidget(report) vl.addStretch() + vl.addStretch() self.setCentralWidget(widget) def get6px(self, i: int) -> int: return round(i*self.screen().devicePixelRatio()) def showEvent(self, event: QShowEvent) -> None: - setSettings("AlreadyDoneWelcomeWizard", True) + setSettings("ShownWelcomeWizard", True) return super().showEvent(event) class SelectModeSlide(BasicNavWidget): From c899c03c5916b73f442cc030a8a750445c3c950e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sat, 20 May 2023 22:59:05 +0200 Subject: [PATCH 3/6] make buttons better more radius px = better buttons --- wingetui/welcome.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/wingetui/welcome.py b/wingetui/welcome.py index 3f7edbf73..df097bae8 100644 --- a/wingetui/welcome.py +++ b/wingetui/welcome.py @@ -117,19 +117,17 @@ def __init__(self, callback: object) -> None: background-color: rgba(60, 60, 60, 25%); border: 1px solid rgba(100, 100, 100, 25%); border-top: 1px solid rgba(100, 100, 100, 25%); - border-radius: 4px; - height: 25px; + border-radius: 8px; + height: 30px; }} QPushButton:hover {{ background-color: rgba(77, 77, 77, 50%); border: 1px solid rgba(89, 89, 89, 50%); - height: 25px; border-top: 1px solid rgba(95, 95, 95, 50%); }} QPushButton:pressed {{ background-color: rgba(89, 89, 89, 50%); border: 1px solid rgba(95, 95, 95, 50%); - height: 25px; border-top: 1px solid rgba(99, 99, 99 , 50%); }} #AccentButton{{ @@ -204,21 +202,19 @@ def __init__(self, callback: object) -> None: font-size: 9pt; width: 100px; background-color: #ffffff; - border-radius: 4px; + border-radius: 8px; border: 1px solid rgba(230, 230, 230, 80%); - height: 25px; + height: 30px; border-bottom: 1px solid rgba(220, 220, 220, 100%); }} QPushButton:hover {{ background-color: rgba(240, 240, 240, 50%); border: 1px solid rgba(220, 220, 220, 80%); - height: 25px; border-bottom: 1px solid rgba(200, 200, 200, 100%); }} QPushButton:pressed {{ background-color: rgba(89, 89, 89, 50%); border: 1px solid rgba(95, 95, 95, 50%); - height: 25px; border-top: 1px solid rgba(99, 99, 99 , 50%); }} #AccentButton{{ From 71cb63504e4da5d3d72a7f74496d664df46841a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sun, 21 May 2023 00:08:10 +0200 Subject: [PATCH 4/6] redesigned into page --- wingetui/resources/hacker.png | Bin 0 -> 83820 bytes wingetui/resources/simple_user.png | Bin 0 -> 4981 bytes wingetui/welcome.py | 169 ++++++++++++++++------------- 3 files changed, 91 insertions(+), 78 deletions(-) create mode 100644 wingetui/resources/hacker.png create mode 100644 wingetui/resources/simple_user.png diff --git a/wingetui/resources/hacker.png b/wingetui/resources/hacker.png new file mode 100644 index 0000000000000000000000000000000000000000..88311335d589ba7b45ae28a86cdb3fa4e2ca38b8 GIT binary patch literal 83820 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 literal 0 HcmV?d00001 diff --git a/wingetui/resources/simple_user.png b/wingetui/resources/simple_user.png new file mode 100644 index 0000000000000000000000000000000000000000..75b77b118eeb3e65effe90de126f03fac74ccc5e GIT binary patch literal 4981 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 literal 0 HcmV?d00001 diff --git a/wingetui/welcome.py b/wingetui/welcome.py index df097bae8..e67f7c560 100644 --- a/wingetui/welcome.py +++ b/wingetui/welcome.py @@ -1,6 +1,4 @@ -from ctypes import c_int, windll from threading import Thread -windll.shcore.SetProcessDpiAwareness(c_int(2)) import platform import subprocess @@ -12,6 +10,7 @@ from PySide6 import QtGui from PySide6.QtGui import * from PySide6.QtCore import * +import PySide6.QtGui from PySide6.QtWidgets import * #from PySide6.QtCore import pyqtSignal as Signal import external.FramelessWindow as FramelessWindow @@ -37,7 +36,7 @@ def __init__(self, callback: object) -> None: self.widgetOrder = ( FirstRunSlide(), - #SelectModeSlide(), + SelectModeSlide(), #SelectFullScreenSlide(), #DateTimeFormat(), #ClockAppearance(), @@ -263,7 +262,7 @@ def setWidget(self, w: QWidget, back=False, anim=True) -> None: else: w.inAnim() - def nextWidget(self, anim=True) -> None: + def nextWidget(self, anim: bool = True) -> None: if self.currentIndex == len(self.widgetOrder)-1: self.close() else: @@ -299,7 +298,7 @@ class BasicNavWidget(QWidget): skipped = Signal() centralWidget: QWidget = None - def __init__(self, parent=None, startEnabled=False, closeEnabled=False, finishEnabled=False, nextGreyed=False) -> None: + def __init__(self, parent: bool = None, startEnabled: bool = False, closeEnabled: bool = False, finishEnabled: bool = False, nextGreyed: bool = False, noNavBar: bool = False) -> None: super().__init__(parent=parent) self.l = QVBoxLayout() self.setLayout(self.l) @@ -312,53 +311,57 @@ def __init__(self, parent=None, startEnabled=False, closeEnabled=False, finishEn self.negIconMode = "white" self.navLayout = QHBoxLayout() - if closeEnabled: - closeButton = QPushButton(_("Skip")) - closeButton.setIconSize(QSize(12, 12)) - closeButton.setFixedSize((96), (36)) - closeButton.setIcon(QIcon(getPath(f"close_{self.iconMode}.png"))) - closeButton.clicked.connect(lambda: self.outAnim(self.skipped.emit)) - self.navLayout.addWidget(closeButton) - self.navLayout.addStretch() - if startEnabled: - startButton = QPushButton(_("Start")) - startButton.setLayoutDirection(Qt.RightToLeft) - startButton.setIconSize(QSize(12, 12)) - startButton.setFixedSize((96), (36)) - startButton.setIcon(QIcon(getPath(f"next_{self.negIconMode}.png"))) - startButton.clicked.connect(lambda: self.outAnim(self.next.emit)) - startButton.setObjectName("AccentButton") - self.navLayout.addWidget(startButton) - else: - backButton = QPushButton("") - backButton.setFixedSize((36), (36)) - backButton.clicked.connect(lambda: self.invertedOutAnim(self.previous.emit)) - backButton.setIcon(QIcon(getPath(f"previous_{self.iconMode}.png"))) - backButton.setIconSize(QSize(12, 12)) - self.navLayout.addWidget(backButton) - if finishEnabled: - finishButton = QPushButton(_("Finish")) - finishButton.setObjectName("AccentButton") - finishButton.setFixedSize((96), (36)) - finishButton.setIconSize(QSize(12, 12)) - finishButton.setLayoutDirection(Qt.RightToLeft) - finishButton.clicked.connect(lambda: self.outAnim(self.finished.emit)) - self.navLayout.addWidget(finishButton) + if not noNavBar: + if closeEnabled: + closeButton = QPushButton(_("Skip")) + closeButton.setIconSize(QSize(12, 12)) + closeButton.setFixedSize((96), (36)) + closeButton.setIcon(QIcon(getPath(f"close_{self.iconMode}.png"))) + closeButton.clicked.connect(lambda: self.outAnim(self.skipped.emit)) + self.navLayout.addWidget(closeButton) + self.navLayout.addStretch() + if startEnabled: + startButton = QPushButton(_("Start")) + startButton.setLayoutDirection(Qt.RightToLeft) + startButton.setIconSize(QSize(12, 12)) + startButton.setFixedSize((96), (36)) + startButton.setIcon(QIcon(getPath(f"next_{self.negIconMode}.png"))) + startButton.clicked.connect(lambda: self.outAnim(self.next.emit)) + startButton.setObjectName("AccentButton") + self.navLayout.addWidget(startButton) else: - self.nextButton = QPushButton("") - self.nextButton.setEnabled(not nextGreyed) - self.nextButton.setIconSize(QSize(12, 12)) - self.nextButton.setFixedSize((36), (36)) - self.nextButton.clicked.connect(lambda:self.outAnim(self.next.emit)) - self.nextButton.setIcon(QIcon(getPath(f"next_{self.negIconMode}.png"))) - self.nextButton.setObjectName("AccentButton") - self.navLayout.addWidget(self.nextButton) + backButton = QPushButton("") + backButton.setFixedSize((36), (36)) + backButton.clicked.connect(lambda: self.invertedOutAnim(self.previous.emit)) + backButton.setIcon(QIcon(getPath(f"previous_{self.iconMode}.png"))) + backButton.setIconSize(QSize(12, 12)) + self.navLayout.addWidget(backButton) + if finishEnabled: + finishButton = QPushButton(_("Finish")) + finishButton.setObjectName("AccentButton") + finishButton.setFixedSize((96), (36)) + finishButton.setIconSize(QSize(12, 12)) + finishButton.setLayoutDirection(Qt.RightToLeft) + finishButton.clicked.connect(lambda: self.outAnim(self.finished.emit)) + self.navLayout.addWidget(finishButton) + else: + self.nextButton = QPushButton("") + self.nextButton.setEnabled(not nextGreyed) + self.nextButton.setIconSize(QSize(12, 12)) + self.nextButton.setFixedSize((36), (36)) + self.nextButton.clicked.connect(lambda:self.outAnim(self.next.emit)) + self.nextButton.setIcon(QIcon(getPath(f"next_{self.negIconMode}.png"))) + self.nextButton.setObjectName("AccentButton") + self.navLayout.addWidget(self.nextButton) def enableNextButton(self) -> None: self.nextButton.setEnabled(True) def nextWidget(self): self.outAnim(self.next.emit) + + def lastWidget(self): + self.outAnim(self.skipped.emit) def setCentralWidget(self, w: QWidget) -> QWidget: self.centralWidget = w @@ -413,16 +416,7 @@ def outAnim(self, f) -> None: anim.setDuration(100) anim.start() anim.finished.connect(f) - return - bgAnim = QPropertyAnimation(self, b"pos", self) - bgAnim.setStartValue(self.pos()) - pos = self.pos() - pos.setX(pos.x()-(self.width()/2)) - bgAnim.setEndValue(pos) - bgAnim.setEasingCurve(QEasingCurve.InQuart) - bgAnim.setDuration(100) - bgAnim.start() - + def invertedOutAnim(self, f) -> None: anim = QVariantAnimation(self) anim.setStartValue(100) @@ -432,7 +426,7 @@ def invertedOutAnim(self, f) -> None: anim.setDuration(100) anim.start() anim.finished.connect(f) - return + def get6px(self, i: int) -> int: return round(i*self.screen().devicePixelRatio()) @@ -574,6 +568,8 @@ def resize(self, w: int, h: int) -> None: return super().resize(w+17, h+17) class ClickableButtonLabelWithBiggerIcon(QPushButton): + buttonClicked = Signal() + lastClick = 0 def __init__(self, size=96) -> None: super().__init__() self.setAttribute(Qt.WA_StyledBackground) @@ -587,7 +583,7 @@ def __init__(self, size=96) -> None: self.iconLabel.setMinimumWidth(size) self.iconLabel.clicked.connect(self.animateClick) self.iconLabel.setAlignment(Qt.AlignHCenter | Qt.AlignVCenter) - self.setMinimumHeight((self.iconSize*1.5)) + self.setMinimumHeight(int(self.iconSize*1.5)) self.textLabel = ClickableLabel() self.textLabel.clicked.connect(self.animateClick) self.textLabel.setTextInteractionFlags(Qt.LinksAccessibleByMouse) @@ -599,13 +595,20 @@ def __init__(self, size=96) -> None: self.layout().addSpacing((20/96*self.iconSize)) self.layout().addWidget(self.textLabel, stretch=1) self.layout().addSpacing((40/96*self.iconSize)) - + self.clicked.connect(self.mightClick) + + def mightClick(self): + if time.time() - self.lastClick > 1: + self.lastClick = time.time() + self.buttonClicked.emit() + + def animateClick(self) -> None: + self.mightClick() + return super().animateClick() + def setText(self, text: str) -> None: self.textLabel.setText(text) - def setButtonText(self, t: str) -> None: - self.button.setText(t) - def setIcon(self, path: str) -> None: self.iconLabel.setPixmap(QIcon(getPath(path)).pixmap(QSize((self.iconSize+20), (self.iconSize+20)), mode=QIcon.Normal)) @@ -653,7 +656,7 @@ def get6px(self, i: int) -> int: class FirstRunSlide(BasicNavWidget): def __init__(self, parent=None) -> None: - super().__init__(parent=parent, startEnabled=True, closeEnabled=True) + super().__init__(parent=parent, noNavBar = True) widget = QWidget() l = QHBoxLayout() l.setContentsMargins(0, 10, 0, 10) @@ -667,31 +670,41 @@ def __init__(self, parent=None) -> None: label1 = IconLabel(size=96, frame=False) label1.setIcon("icon.png") label1.setText(f""" -

{_("Welcome to WingetUI") + ((" "+_('version 2.0')) if getSettings('AskedAbout3PackageManagers') else "")}

+

{_("Welcome to WingetUI")}

{_("If you already know how does this work, or you want to skip the welcome wizard, please click on the bottom-left Skip button.")}
- {_("WingetUI version {version} brings lots of new features, so I thought you'd like to see the new features, despite already using WingetUI.").format(version=version) if getSettings('AskedAbout3PackageManagers') else ""} """) - - label3 = IconLabel(size=64) - label3.setIcon("agreement.png") - label3.setText(f""" -

{_("Wait a minute!")}

- {_("Please make sure to install WingetUI from official sources only. Also, using WingetUI implies accepting of the LGPLv2.1 license")} - {_("You may also want to know that we do not collect your usage data. However, package managers might.")}""") - - label2 = IconLabel(size=64) + label2 = IconLabel(size=64, frame=True) label2.setIcon("rocket.png") label2.setText(f""" -

{_("This wizard will help you configure and customize WingetUI. Click Start to get started!")}

- {_("Remember that this wizard can be run at any time from the Settings Window")}""") # TODO: Actually implement this - +

{_("This wizard will help you configure and customize WingetUI!")}

+ {_("Please select how you want to configure WingetUI")}""") # TODO: Actually implement this + + self.defaultPrefs = ClickableButtonLabelWithBiggerIcon(64) + self.defaultPrefs.setText(f""" +

{_("Default preferences - suitable for regular users

")} + {_("Search for desktop software, warn me when updates are available and do not do nerdy things. I don't want WingetUI to overcomplicate, I just want a simple software store")}""") + self.defaultPrefs.setIcon("simple_user.png") + self.defaultPrefs.buttonClicked.connect(lambda: self.outAnim(self.skipped.emit)) + + + self.hacker = ClickableButtonLabelWithBiggerIcon(64) + self.hacker.setText(f""" +

{_("Customize WingetUI - for hackers and advanced users only")}

+ {_("Select which package managers to use ({0}), configure how packages are installed, manage how administrator rights are handled, etc.").format("Winget, Chocolatey, Scoop, Npm, Pip, etc.")}""") + self.hacker.setIcon("hacker.png") + self.hacker.buttonClicked.connect(lambda: (self.outAnim(self.next.emit))) + vl.addWidget(label1) - vl.addStretch() + #vl.addStretch() vl.addWidget(label2) vl.addStretch() - vl.addWidget(label3) vl.addStretch() + vl.addStretch() + vl.addWidget(self.defaultPrefs) + vl.addWidget(self.hacker) + vl.addStretch() + #vl.addStretch() self.setCentralWidget(widget) self.opacityEffect.setOpacity(1) From 30a6798d1f9a0430f2efb2991a27a4a3d323b95e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sun, 21 May 2023 01:02:34 +0200 Subject: [PATCH 5/6] add the "Select package managers" tab --- wingetui/customWidgets.py | 43 ++++ wingetui/external/FramelessWindow.py | 101 --------- wingetui/genericCustomWidgets.py | 16 +- wingetui/resources/choco_color.png | Bin 0 -> 17188 bytes wingetui/resources/console_color.png | Bin 0 -> 3380 bytes wingetui/resources/node_color.png | Bin 0 -> 4544 bytes wingetui/resources/pip_color.png | Bin 0 -> 2418 bytes wingetui/resources/scoop_color.png | Bin 0 -> 3017 bytes wingetui/resources/winget_color.png | Bin 0 -> 766 bytes wingetui/welcome.py | 294 +++++++++++++++++++-------- 10 files changed, 264 insertions(+), 190 deletions(-) delete mode 100644 wingetui/external/FramelessWindow.py create mode 100644 wingetui/resources/choco_color.png create mode 100644 wingetui/resources/console_color.png create mode 100644 wingetui/resources/node_color.png create mode 100644 wingetui/resources/pip_color.png create mode 100644 wingetui/resources/scoop_color.png create mode 100644 wingetui/resources/winget_color.png diff --git a/wingetui/customWidgets.py b/wingetui/customWidgets.py index f5d28bc0b..6e6b6ac97 100644 --- a/wingetui/customWidgets.py +++ b/wingetui/customWidgets.py @@ -570,6 +570,49 @@ def setChecked(self, v: bool) -> None: def isChecked(self) -> bool: return self.checkbox.isChecked() +class NewWelcomeWizardPackageManager(QWidget): + def __init__(self, text, description, image) -> None: + super().__init__() + mainw = QWidget(self) + mainw.setContentsMargins(0, 0, 0, 0) + mainw.setObjectName("bgwidget") + mainw.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, True) + self.checkbox = QCheckBox(text, mainw) + self.checkbox.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, False) + self.checkbox.stateChanged.connect(lambda v: (self.description.setEnabled(v), self.image.setEnabled(v))) + self.checkbox.setSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Maximum) + self.description = QLabel(description) + self.description.setWordWrap(True) + self.description.setEnabled(False) + self.image = QLabel() + self.image.setPixmap(QPixmap(image).scaledToHeight(48, Qt.TransformationMode.SmoothTransformation)) + h = QHBoxLayout() + v = QVBoxLayout() + v.addWidget(self.checkbox) + v.addWidget(self.description, stretch=1) + h.addLayout(v, stretch=1) + h.addWidget(self.image) + h.setContentsMargins(12, 8, 16, 8) + h2 = QHBoxLayout() + h.addStretch() + mainw.setLayout(h) + h2.addStretch() + h2.addWidget(mainw) + h2.setContentsMargins(0, 0, 0, 0) + h2.addStretch() + mainw.setFixedWidth(600) + self.setLayout(h2) + if isDark(): + self.setStyleSheet("""#bgwidget{background-color: rgba(255, 255, 255, 5%); border: 1px solid #101010; padding: 8px; border-radius: 8px;}""") + else: + self.setStyleSheet("""#bgwidget{background-color: rgba(255, 255, 255, 50%); border: 1px solid #eeeeee; padding: 8px; border-radius: 8px;}""") + + def setChecked(self, v: bool) -> None: + self.checkbox.setChecked(v) + + def isChecked(self) -> bool: + return self.checkbox.isChecked() + class IgnoredUpdatesManager(MovableFramelessWindow): def __init__(self, parent: QWidget | None = ...) -> None: super().__init__(parent) diff --git a/wingetui/external/FramelessWindow.py b/wingetui/external/FramelessWindow.py deleted file mode 100644 index fdfdabf5d..000000000 --- a/wingetui/external/FramelessWindow.py +++ /dev/null @@ -1,101 +0,0 @@ -from ctypes import c_int, windll -windll.shcore.SetProcessDpiAwareness(c_int(2)) - -# -# -# This file comes from https://github.com/mustafaahci/FramelessWindow -# -# - -import winreg -from win32mica import ApplyMica, MICAMODE - -from ctypes.wintypes import DWORD, LONG, LPCVOID - -from win32con import PAN_SERIF_SQUARE, WM_NCCALCSIZE, GWL_STYLE, WM_NCHITTEST, WS_MAXIMIZEBOX, WS_THICKFRAME, \ - WS_CAPTION, HTTOPLEFT, HTBOTTOMRIGHT, HTTOPRIGHT, HTBOTTOMLEFT, \ - HTTOP, HTBOTTOM, HTLEFT, HTRIGHT, HTCAPTION, WS_POPUP, WS_SYSMENU, WS_MINIMIZEBOX - - -from PySide6.QtCore import * -from PySide6.QtGui import * -from PySide6.QtWidgets import * -from external.blurwindow import ExtendFrameIntoClientArea - -def readRegedit(aKey, sKey, default, storage=winreg.HKEY_CURRENT_USER): - registry = winreg.ConnectRegistry(None, storage) - reg_keypath = aKey - try: - reg_key = winreg.OpenKey(registry, reg_keypath) - except FileNotFoundError as e: - return default - except Exception as e: - print(e) - return default - - for i in range(1024): - try: - value_name, value, _ = winreg.EnumValue(reg_key, i) - if value_name == sKey: - return value - except OSError as e: - return default - except Exception as e: - print(e) - return default - -def isWindowDark() -> bool: - return readRegedit(r"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", "AppsUseLightTheme", 1)==0 - - -class QFramelessWindow(QMainWindow): - BORDER_WIDTH = 10 - - def __init__(self, parent=None): - self.updateSize = True - self.settingsWidget = QWidget() - super().__init__(parent=parent) - self.hwnd = self.winId().__int__() - self.setObjectName("QFramelessWindow") - self.setWindowFlags(Qt.WindowType.Window | Qt.WindowType.CustomizeWindowHint) - #window_style = win32gui.GetWindowLong(self.hwnd, GWL_STYLE) - #win32gui.SetWindowLong(self.hwnd, GWL_STYLE, window_style | WS_POPUP | WS_THICKFRAME | WS_CAPTION | WS_SYSMENU | WS_MAXIMIZEBOX | WS_MINIMIZEBOX) - - ExtendFrameIntoClientArea(self.winId().__int__()) - - self.setAutoFillBackground(True) - - # Window Widgets - self.resize(800, 600) - self._layout = QVBoxLayout() - self._layout.setContentsMargins(0, 0, 0, 0) - self._layout.setSpacing(0) - - - # main widget is here - self.mainWidget = QWidget() - self.mainWidgetLayout = QVBoxLayout() - self.mainWidgetLayout.setContentsMargins(0, 0, 0, 0) - self.mainWidget.setLayout(self.mainWidgetLayout) - self.mainWidget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) - - # set background color - p = self.palette() - p.setColor(self.backgroundRole(), QColor("#272727")) - self.setPalette(p) - - self._layout.addWidget(self.mainWidget) - self.setLayout(self._layout) - - def showEvent(self, event) -> None: - ApplyMica(self.winId(), MICAMODE.DARK if isWindowDark() else MICAMODE.LIGHT) - return super().showEvent(event) - - def moveEvent(self, event) -> None: - self.repaint() - return super().moveEvent(event) - -if __name__ == "__main__": - from ctypes import c_int, windll - windll.shcore.SetProcessDpiAwareness(c_int(2)) - import __init__ \ No newline at end of file diff --git a/wingetui/genericCustomWidgets.py b/wingetui/genericCustomWidgets.py index 80bbaa443..26cc6a32d 100644 --- a/wingetui/genericCustomWidgets.py +++ b/wingetui/genericCustomWidgets.py @@ -310,10 +310,11 @@ def calculateSize(self) -> None: """ Recalculates minimum height """ - if self.getFullHeight() >= self.maxHeight: - self.setFixedHeight(self.maxHeight) - else: - self.setFixedHeight(self.getFullHeight() if self.getFullHeight() > 20 else 4) + if self.resizeBar: + if self.getFullHeight() >= self.maxHeight: + self.setFixedHeight(self.maxHeight) + else: + self.setFixedHeight(self.getFullHeight() if self.getFullHeight() > 20 else 4) def getFullHeight(self) -> int: """ @@ -325,15 +326,16 @@ def removeItem(self, item: QWidget): self.vlayout.removeWidget(item) self.rss() self.itemCount = self.vlayout.count() - if self.itemCount <= 0: + if self.itemCount <= 0 and self.resizeBar: globals.trayIcon.setIcon(QIcon(getMedia("greyicon"))) self.resizeBar.hide() def addItem(self, item: QWidget): self.vlayout.addWidget(item) self.itemCount = self.vlayout.count() - self.resizeBar.show() - globals.trayIcon.setIcon(QIcon(getMedia("icon"))) + if self.resizeBar: + self.resizeBar.show() + globals.trayIcon.setIcon(QIcon(getMedia("icon"))) class TreeWidgetItemWithQAction(QTreeWidgetItem): itemAction: QAction = QAction diff --git a/wingetui/resources/choco_color.png b/wingetui/resources/choco_color.png new file mode 100644 index 0000000000000000000000000000000000000000..1d7dba16fbe07e5bdf83b3fb57eb02667b029eb8 GIT binary patch literal 17188 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 literal 0 HcmV?d00001 diff --git a/wingetui/resources/scoop_color.png b/wingetui/resources/scoop_color.png new file mode 100644 index 0000000000000000000000000000000000000000..83e900a2fa804d84a005343fed4809d9ff10e25b GIT binary patch literal 3017 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 LNkvXXu0mjf7|Yke literal 0 HcmV?d00001 diff --git a/wingetui/resources/winget_color.png b/wingetui/resources/winget_color.png new file mode 100644 index 0000000000000000000000000000000000000000..77cda9d59943db8f65d68b2faa8b53bec391a90e GIT binary patch literal 766 zcmeAS@N?(olHy`uVBq!ia0vp^2_VeD1|%QND7OGoY)RhkE)4%caKYZ?lNlJ8Hha1_ zhD30_oo1LN?I_~#zo)j{;efZ2uWek`+?ar5NB z5N$YNSN)4u|CEaMb!v3y zeJgD^UiCjTX8!%&V{7Ybx@7LZj+1{?x$6DO_}kxaZFIf&aZl}>OSyk1c7HpVqMjbu zw(D^G_oqLCzW<8w53ZGew6%7Hn^)e_fx{2nUMYee;^3|LeciJM8vL_s)JDw^;SI{@?nxWhK=PKVQceh^4NuUSprP z=lQPd$GUFYy#of&Hr`oZ)*Q(!j-T~1?(Cw+&HosZ@8w@;U|itPCEXy^vS%O|e?URA zXYym!dAAgc@2FVdQ&MBb@04Z%!uK)l5 literal 0 HcmV?d00001 diff --git a/wingetui/welcome.py b/wingetui/welcome.py index e67f7c560..d0a5b3b23 100644 --- a/wingetui/welcome.py +++ b/wingetui/welcome.py @@ -1,19 +1,12 @@ from threading import Thread -import platform -import subprocess import os -import sys -import locale import time import ctypes -from PySide6 import QtGui from PySide6.QtGui import * from PySide6.QtCore import * -import PySide6.QtGui from PySide6.QtWidgets import * -#from PySide6.QtCore import pyqtSignal as Signal -import external.FramelessWindow as FramelessWindow +from customWidgets import * import globals @@ -36,7 +29,7 @@ def __init__(self, callback: object) -> None: self.widgetOrder = ( FirstRunSlide(), - SelectModeSlide(), + PackageManagersSlide(), #SelectFullScreenSlide(), #DateTimeFormat(), #ClockAppearance(), @@ -157,6 +150,92 @@ def __init__(self, callback: object) -> None: #TitleLabel {{ font-size: 26pt; }} + QCheckBox {{ + font-family: Segoe UI Variable Display; + font-weight: bold; + font-size: 15pt; + }} + QCheckBox::indicator{{ + height: 20px; + width: 20px; + }} + QTreeView::indicator:unchecked,QCheckBox::indicator:unchecked {{ + background-color: rgba(30, 30, 30, 25%); + border: 1px solid #444444; + border-radius: 6px; + }} + QTreeView::indicator:disabled,QCheckBox::indicator:disabled {{ + background-color: rgba(30, 30, 30, 5%); + color: #dddddd; + border: 1px solid rgba(255, 255, 255, 5%); + border-radius: 6px; + }} + QTreeView::indicator:unchecked:hover,QCheckBox::indicator:unchecked:hover {{ + background-color: #2a2a2a; + border: 1px solid #444444; + border-radius: 6px; + }} + QTreeView::indicator:checked,QCheckBox::indicator:checked {{ + border: 1px solid #444444; + background-color: rgba({colors[1]}, 80%); + border-radius: 6px; + image: url("{getMedia("tick")}"); + }} + QTreeView::indicator:disabled,QCheckBox::indicator:checked:disabled {{ + border: 1px solid #444444; + background-color: #303030; + color: #dddddd; + border-radius:6px; + }} + QTreeView::indicator:checked:hover,QCheckBox::indicator:checked:hover {{ + border: 1px solid #444444; + background-color: rgb({colors[2]}); + border-radius: 6px; + }} + QScrollBar {{ + background: transparent; + margin: 4px; + margin-left: 0; + width: 16px; + height: 20px; + border: none; + border-radius: 5px; + }} + QScrollBar:horizontal {{ + margin-bottom: 0; + padding-bottom: 0; + height: 12px; + }} + QScrollBar::handle {{ + margin: 3px; + min-height: 20px; + min-width: 20px; + border-radius: 3px; + background: rgba(80, 80, 80, 40%); + }} + QScrollBar::handle:hover {{ + margin: 3px; + border-radius: 3px; + background: rgba(112, 112, 112, 35%); + }} + QScrollBar::add-line {{ + height: 0; + width: 0; + subcontrol-position: bottom; + subcontrol-origin: margin; + }} + QScrollBar::sub-line {{ + height: 0; + width: 0; + subcontrol-position: top; + subcontrol-origin: margin; + }} + QScrollBar::up-arrow, QScrollBar::down-arrow {{ + background: none; + }} + QScrollBar::add-page, QScrollBar::sub-page {{ + background: none; + }} """) else: self.bgWidget.setStyleSheet(f""" @@ -244,6 +323,95 @@ def __init__(self, callback: object) -> None: #TitleLabel {{ font-size: 26pt; }} + QCheckBox {{ + font-weight: bold; + font-dize: 15pt; + }} + QCheckBox::indicator{{ + height: 20px; + width: 20px; + }} + QTreeView::indicator:unchecked,QCheckBox::indicator:unchecked {{ + background-color: rgba(255, 255, 255, 25%); + border: 1px solid rgba(0, 0, 0, 10%); + border-radius: 6px; + }} + QTreeView::indicator:disabled,QCheckBox::indicator:disabled {{ + background-color: rgba(240, 240, 240, 0%); + color: #444444; + border: 1px solid rgba(0, 0, 0, 5%); + border-radius: 6px; + }} + QTreeView::indicator:unchecked:hover,QCheckBox::indicator:unchecked:hover {{ + background-color: rgba(0, 0, 0, 5%); + border: 1px solid rgba(0, 0, 0, 20%); + border-radius: 6px; + }} + QTreeView::indicator:checked,QCheckBox::indicator:checked {{ + border: 1px solid rgb({colors[3]}); + background-color: rgb({colors[2]}); + border-radius: 6px; + image: url("{getMedia("tick")}"); + }} + QTreeView::indicator:checked:disabled,QCheckBox::indicator:checked:disabled {{ + border: 1px solid #444444; + background-color: #303030; + color: #444444; + border-radius: 6px; + }} + QTreeView::indicator:checked:hover,QCheckBox::indicator:checked:hover {{ + border: 1px solid rgb({colors[3]}); + background-color: rgb({colors[3]}); + border-radius: 6px; + }} + QScrollBar {{ + background: transparent; + margin: 4px; + margin-left: 0; + width: 16px; + height: 20px; + border: none; + border-radius: 5px; + }} + QScrollBar:horizontal {{ + margin-bottom: 0; + padding-bottom: 0; + height: 12px; + }} + QScrollBar:vertical {{ + background: rgba(255, 255, 255, 0%); + margin: 4px; + width: 16px; + border: none; + border-radius: 5px; + }} + QScrollBar::handle:vertical {{ + margin: 3px; + border-radius: 3px; + min-height: 20px; + background: rgba(90, 90, 90, 25%); + }} + QScrollBar::handle:vertical:hover {{ + margin: 3px; + border-radius: 3px; + background: rgba(90, 90, 90, 35%); + }} + QScrollBar::add-line:vertical {{ + height: 0; + subcontrol-position: bottom; + subcontrol-origin: margin; + }} + QScrollBar::sub-line:vertical {{ + height: 0; + subcontrol-position: top; + subcontrol-origin: margin; + }} + QScrollBar::up-arrow:vertical, QScrollBar::down-arrow:vertical {{ + background: none; + }} + QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical {{ + background: none; + }} """) @@ -771,98 +939,60 @@ def showEvent(self, event: QShowEvent) -> None: setSettings("ShownWelcomeWizard", True) return super().showEvent(event) -class SelectModeSlide(BasicNavWidget): +class PackageManagersSlide(BasicNavWidget): def __init__(self, parent=None) -> None: - super().__init__(parent=parent, nextGreyed=True) + super().__init__(parent=parent) self.defaultSelected = False widget = QWidget() l = QHBoxLayout() - l.setContentsMargins(0, 10, 0, 10) + l.setContentsMargins(0, 0, 0, 0) widget.setLayout(l) - self.selector = MovableFocusSelector(self) - self.selector.hide() vl = QVBoxLayout() vl.setContentsMargins(0, 0, 0, 0) - l.addSpacing(10) l.addLayout(vl) - label1 = IconLabel(size=(96), frame=False) - label1.setIcon(getPath("timespan_color.png")) - label1.setText(f"""

{_("What time do you want to see?")}

- {_("Please select one of the following and click next.")} - {_("If you don't know which one is the best, choose {0}").format(_("Local time"))}""") - - self.localTime = ClickableButtonLabelWithBiggerIcon(size=64) - self.localTime.setIcon(getPath(f"desktop_cactus.png")) - self.localTime.clicked.connect(lambda: self.toggleClockMode("secondary", shouldChangePrefs=True)) - self.localTime.setText(f""" -

{_("Local time")}

- {_("Show the local computer time. The time will not be synced with the internet and might be inaccurate")}""") - - self.internetTime = ClickableButtonLabelWithBiggerIcon(size=64) - self.internetTime.setIcon(getPath(f"globe.png")) - self.internetTime.clicked.connect(lambda: self.toggleClockMode("format", shouldChangePrefs=True)) - self.internetTime.setText(f""" -

{_("Internet time")}

- {_("Precise internet time. Ideal if you are not using any kind of VPN or proxy")}""") + label1 = IconLabel(size=(48), frame=False) + label1.setIcon(getPath("console_color.png")) + label1.setText(f"""

{_("Which package managers do you want to use?")}

+ {_("They are the programs in charge of installing, updating and removing packages.")}""") + self.managers = DynamicScrollArea() + winget = NewWelcomeWizardPackageManager("Winget", "Microsoft's official package manager. Full of well-known and verified packages
Contains: General Software, Microsoft Store apps

", getMedia("winget_color")) + scoop = NewWelcomeWizardPackageManager("Scoop", "Great repository of unknown but useful utilities and other interesting packages.
Contains: Utilities, command-line packages, General Software (extras bucket required)", getMedia("scoop_color")) + choco = NewWelcomeWizardPackageManager("Chocolatey", "The package manager for windows You'll find everything there.
Contains: General Software", getMedia("choco_color")) + pip = NewWelcomeWizardPackageManager("Pip", "Python's library manager. Full of python libraries and other python-related utilities
Contains: Python libraries and related utilities", getMedia("pip_color")) + npm = NewWelcomeWizardPackageManager("Npm", "Node JS's package manager. Full of libraries and other utilities that orbit the javascript world
Contains: Node javascript libraries and other related utilities", getMedia("node_color")) + + managers = [winget, scoop, choco, pip, npm] + + for manager in managers: + self.managers.addItem(manager) + + def enablePackageManagers(): + setSettings("DisableWinget", not winget.isChecked()) + setSettings("DisableChocolatey", not choco.isChecked()) + setSettings("DisableScoop", not scoop.isChecked()) + setSettings("DisablePip", not pip.isChecked()) + setSettings("DisableNpm", not npm.isChecked()) + + self.nextButton.clicked.connect(lambda: enablePackageManagers()) + + winget.setChecked(True) + choco.setChecked(True) + scoop.setChecked(shutil.which("scoop") != None) + npm.setChecked(shutil.which("npm") != None) + pip.setChecked(shutil.which("pip") != None) + vl.addWidget(label1) - vl.addStretch() - vl.addWidget(self.internetTime) - vl.addStretch() - vl.addWidget(self.localTime) - vl.addStretch() + vl.addWidget(self.managers, stretch=1) self.setCentralWidget(widget) self.clockMode = "" - def toggleClockMode(self, mode: str, shouldChangePrefs: bool = False) -> None: - self.enableNextButton() - if shouldChangePrefs: - self.defaultSelected = True - if mode == "secondary": - self.clockMode = "secondary" - self.moveSelector(self.localTime) - if shouldChangePrefs: - setSettings("EnableInternetTime", False, r=True) - elif mode == "format": - self.clockMode = "format" - self.moveSelector(self.internetTime) - if shouldChangePrefs: - setSettings("EnableInternetTime", True, r=True) - else: - raise ValueError("Function toggleCheckMode() called with invalid arguments. Accepted values are: custom, format, secondary") - def showEvent(self, event) -> None: - if not self.defaultSelected: - self.toggleClockMode("secondary") return super().showEvent(event) - def moveSelector(self, w: QWidget) -> None: - if not self.selector.isVisible(): - self.selector.show() - self.selector.move(w.pos().x(), w.pos().y()) - self.selector.resize(w.size().width(), w.size().height()) - else: - posAnim = QPropertyAnimation(self.selector, b"pos", self) - posAnim.setStartValue(self.selector.pos()) - posAnim.setEndValue(w.pos()) - posAnim.setEasingCurve(QEasingCurve.InOutCirc) - posAnim.setDuration(200) - - sizeAnim = QPropertyAnimation(self.selector, b"size", self) - sizeAnim.setStartValue(self.selector.size()) - s = w.size() - s.setWidth(s.width()+18) - s.setHeight(s.height()+18) - sizeAnim.setEndValue(s) - sizeAnim.setEasingCurve(QEasingCurve.InOutCirc) - sizeAnim.setDuration(200) - - posAnim.start() - sizeAnim.start() - def get6px(self, i: int) -> int: return round(i*self.screen().devicePixelRatio()) From eccea5bbfb9e3a06253ab15c807d330a31655d9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=AD=20Climent?= Date: Sun, 21 May 2023 16:07:17 +0200 Subject: [PATCH 6/6] Finish implementing the Welcome Wizard --- wingetui/__init__.py | 75 +--- wingetui/customWidgets.py | 51 +-- wingetui/genericCustomWidgets.py | 10 + wingetui/resources/admin_color.png | Bin 0 -> 5788 bytes wingetui/resources/console_color.png | Bin 3380 -> 2671 bytes wingetui/resources/shield_green.png | Bin 0 -> 3492 bytes wingetui/resources/shield_question.png | Bin 0 -> 6642 bytes wingetui/resources/shield_red.png | Bin 0 -> 7322 bytes wingetui/resources/shield_reload.png | Bin 0 -> 6487 bytes wingetui/resources/shield_yellow.png | Bin 0 -> 5138 bytes wingetui/resources/update_pc_color.png | Bin 0 -> 6431 bytes wingetui/tools.py | 1 - wingetui/welcome.py | 491 ++++++++----------------- 13 files changed, 171 insertions(+), 457 deletions(-) create mode 100644 wingetui/resources/admin_color.png create mode 100644 wingetui/resources/shield_green.png create mode 100644 wingetui/resources/shield_question.png create mode 100644 wingetui/resources/shield_red.png create mode 100644 wingetui/resources/shield_reload.png create mode 100644 wingetui/resources/shield_yellow.png create mode 100644 wingetui/resources/update_pc_color.png diff --git a/wingetui/__init__.py b/wingetui/__init__.py index 0e9385e8c..1842b6e9a 100644 --- a/wingetui/__init__.py +++ b/wingetui/__init__.py @@ -126,7 +126,7 @@ def forceContinue(): self.loadStatus = 1000 # Override loading status skipButton.clicked.connect(forceContinue) - Thread(target=lambda: (time.sleep(15), self.callInMain.emit(skipButton.show)), daemon=True).start() + self.textEnterAnim = QVariantAnimation(self) self.textEnterAnim.setStartValue(0) @@ -209,10 +209,11 @@ def forceContinue(): def increaseStep(): self.loadStatus += 1 self.finishedPreloadingStep.connect(increaseStep) - if getSettings("ShownWelcomeWizard") == False or "--welcomewizard" in sys.argv or "--welcome" in sys.argv or True: # AskedAbout3PackageManagers - self.askAboutPackageManagers(onclose=lambda: Thread(target=self.loadPreUIComponents, daemon=True).start()) + if getSettings("ShownWelcomeWizard") == False or "--welcomewizard" in sys.argv or "--welcome" in sys.argv: + self.askAboutPackageManagers(onclose=lambda: (Thread(target=self.loadPreUIComponents, daemon=True).start(), Thread(target=lambda: (time.sleep(15), self.callInMain.emit(skipButton.show)), daemon=True).start())) else: Thread(target=self.loadPreUIComponents, daemon=True).start() + Thread(target=lambda: (time.sleep(15), self.callInMain.emit(skipButton.show)), daemon=True).start() self.loadingText.setText(_("Checking for other running instances...")) except Exception as e: raise e @@ -222,74 +223,6 @@ def askAboutPackageManagers(self, onclose: object): self.ww = welcome.WelcomeWindow(callback=lambda: (self.popup.show(), onclose())) self.popup.hide() self.ww.show() - - return - self.w = NotClosableWidget() - self.w.setObjectName("micawin") - self.w.setWindowFlag(Qt.WindowType.Window) - self.w.setWindowTitle("\x20") - pixmap = QPixmap(4, 4) - pixmap.fill(Qt.GlobalColor.transparent) - self.w.setWindowIcon(pixmap) - self.w.setAutoFillBackground(True) - self.w.setWindowFlag(Qt.WindowType.WindowMaximizeButtonHint, False) - self.w.setWindowFlag(Qt.WindowType.WindowMinimizeButtonHint, False) - self.w.setWindowFlag(Qt.WindowType.WindowCloseButtonHint, False) - self.w.setWindowModality(Qt.WindowModality.WindowModal) - - self.w.setMinimumWidth(750) - self.w.setContentsMargins(20, 0, 20, 10) - mainLayout = QVBoxLayout() - label = (QLabel("

"+_("Welcome to WingetUI")+"

"+_("You may now choose your weapons")+"

")) - label.setAlignment(Qt.AlignmentFlag.AlignCenter) - label.setWordWrap(True) - mainLayout.addWidget(label) - label = (QLabel(_("WingetUI is based on package managers. They are the engines used to load, install update and remove software from your computer. Please select the desired package managers and hit \"Apply\" to continue. The default ones are Winget and Chocolatey"))) - label.setAlignment(Qt.AlignmentFlag.AlignCenter) - label.setWordWrap(True) - mainLayout.addWidget(label) - - winget = WelcomeWizardPackageManager(_("Enable {pm}").format(pm="Winget"), _("Microsoft's official package manager. It contains well known software such as browsers, PDF readers, windows add-ons and other utilities, as well as other less-known but useful software, such as Microsoft Visual C++ Redistributables. Packages from Winget have been carefully validated"), getMedia("winget")) - winget.setChecked(True) - scoop = WelcomeWizardPackageManager(_("Enable {pm}").format(pm="Scoop"), _("From scoop you will be able to download utilities that might not be suitable for everybody. Install CLI utilities such as nano, sudo or nmap for Windows. And with the ability to add custom buckets, you will be able to download unlimited amounts of different utilities, apps, fonts, games, and any other thing you can dream of."), getMedia("scoop")) - scoop.setChecked(False) - if (getSettings("ScoopAlreadySetup") or getSettings("ScoopEnabledByAssistant")) and not getSettings("DisableScoop"): - scoop.setChecked(True) - choco = WelcomeWizardPackageManager(_("Enable {pm}").format(pm="Chocolatey"), _("The package manager for Windows by default. With more than {0} packages on their repositories, you will find anything you want to install. From Firefox to Sysinternals, almost every package is available to download from Chocolatey servers").format("9500"), getMedia("choco")) - choco.setChecked(True) - - mainLayout.addSpacing(20) - mainLayout.addWidget(winget) - mainLayout.addWidget(scoop) - mainLayout.addWidget(choco) - mainLayout.addSpacing(20) - - mainLayout.addStretch() - - blayout = QHBoxLayout() - mainLayout.addLayout(blayout) - blayout.addStretch() - - - okbutton = QPushButton(_("Apply and start WingetUI")) - okbutton.setFixedSize(190, 30) - okbutton.setObjectName("AccentButton") - okbutton.clicked.connect(performSelectionAndContinue) - blayout.addWidget(okbutton) - - w = QWidget(self.w) - w.setObjectName("mainbg") - w.setLayout(mainLayout) - l = QHBoxLayout() - l.addWidget(w) - self.w.setLayout(l) - - r = ApplyMica(self.w.winId(), MICAMODE.DARK if isDark() else MICAMODE.LIGHT) - if r != 0: - self.w.setAttribute(Qt.WidgetAttribute.WA_TranslucentBackground, False) - self.w.setAttribute(Qt.WidgetAttribute.WA_NoSystemBackground, False) - self.w.setStyleSheet(darkCSS.replace("mainbg", "transparent" if r == 0x0 else "#202020") if isDark() else lightCSS.replace("mainbg", "transparent" if r == 0x0 else "#f5f5f5")) - self.w.show() def loadPreUIComponents(self): try: diff --git a/wingetui/customWidgets.py b/wingetui/customWidgets.py index 6e6b6ac97..8788bfbb1 100644 --- a/wingetui/customWidgets.py +++ b/wingetui/customWidgets.py @@ -534,56 +534,13 @@ def __init__(self, text, description, image) -> None: mainw.setContentsMargins(0, 0, 0, 0) mainw.setObjectName("bgwidget") mainw.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, True) - self.checkbox = SectionCheckBox(text, mainw, margin=0, bigfont=True) + self.checkbox = QCheckBox(text) self.checkbox.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, False) - self.checkbox.stateChanged.connect(lambda v: (self.description.setEnabled(v), self.image.setEnabled(v))) - self.checkbox.setFixedHeight(30) - self.description = QLabel(description) - self.description.setWordWrap(True) - self.description.setEnabled(False) - self.image = QLabel() - self.image.setPixmap(QPixmap(image).scaledToHeight(64, Qt.TransformationMode.SmoothTransformation)) - h = QHBoxLayout() - v = QVBoxLayout() - v.addWidget(self.checkbox) - v.addWidget(self.description, stretch=1) - h.addLayout(v, stretch=1) - h.addWidget(self.image) - h.setContentsMargins(16, 16, 16, 16) - h2 = QHBoxLayout() - h.addStretch() - mainw.setLayout(h) - h2.addStretch() - h2.addWidget(mainw) - h2.setContentsMargins(0, 0, 0, 0) - h2.addStretch() - mainw.setFixedWidth(600) - self.setLayout(h2) - if isDark(): - self.setStyleSheet("""#bgwidget{background-color: rgba(255, 255, 255, 5%); border: 1px solid #101010; padding: 16px; border-radius: 16px;}""") - else: - self.setStyleSheet("""#bgwidget{background-color: rgba(255, 255, 255, 50%); border: 1px solid #eeeeee; padding: 16px; border-radius: 16px;}""") - - def setChecked(self, v: bool) -> None: - self.checkbox.setChecked(v) - - def isChecked(self) -> bool: - return self.checkbox.isChecked() - -class NewWelcomeWizardPackageManager(QWidget): - def __init__(self, text, description, image) -> None: - super().__init__() - mainw = QWidget(self) - mainw.setContentsMargins(0, 0, 0, 0) - mainw.setObjectName("bgwidget") - mainw.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, True) - self.checkbox = QCheckBox(text, mainw) - self.checkbox.setAttribute(Qt.WidgetAttribute.WA_StyledBackground, False) - self.checkbox.stateChanged.connect(lambda v: (self.description.setEnabled(v), self.image.setEnabled(v))) + self.checkbox.stateChanged.connect(lambda v: (self.image.setEnabled(v))) self.checkbox.setSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Maximum) - self.description = QLabel(description) + self.description = ClickableLabel(description) + self.description.clicked.connect(self.checkbox.click) self.description.setWordWrap(True) - self.description.setEnabled(False) self.image = QLabel() self.image.setPixmap(QPixmap(image).scaledToHeight(48, Qt.TransformationMode.SmoothTransformation)) h = QHBoxLayout() diff --git a/wingetui/genericCustomWidgets.py b/wingetui/genericCustomWidgets.py index 26cc6a32d..11d2d4915 100644 --- a/wingetui/genericCustomWidgets.py +++ b/wingetui/genericCustomWidgets.py @@ -1193,6 +1193,16 @@ def closeEvent(self, event: QCloseEvent) -> None: globals.app.restoreOverrideCursor() return super().closeEvent(event) +class ClickableLabel(QLabel): + clicked = Signal() + + def __init__(self, text: str = "", parent: QWidget = None): + super().__init__(text, parent) + self.setMouseTracking(True) + + def mousePressEvent(self, ev: QMouseEvent) -> None: + self.clicked.emit() + return super().mousePressEvent(ev) if __name__ == "__main__": import __init__ \ No newline at end of file diff --git a/wingetui/resources/admin_color.png b/wingetui/resources/admin_color.png new file mode 100644 index 0000000000000000000000000000000000000000..cb50115a830b4c5cf43562a014f1f54a800715c9 GIT binary patch literal 5788 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 literal 0 HcmV?d00001 diff --git a/wingetui/resources/console_color.png b/wingetui/resources/console_color.png index 2444ed01996194fee95e143595b3b12cd6897023..119386fac1c113f1e1830d55c60abedc5f2b88f1 100644 GIT binary patch literal 2671 zcma);cT`i^7KfA2%K!?J(4|NjAOU$&0)oQ`5v3?1ofv}x5{4om2_OV%QiFgJq@#i( z2vQ6kgL#P~W+;wy2w;GKD53ZA?yNWOt@(4-S@-U>?%n77);{Okd!Llc_NX6(WraZ? z&<{2j&N~7Y^XDVT54^vSBa8vVkG+IC4?6mDly+3+fIz}(Hs^nGauxdSb_w^$Me1zI zO5$T!ii){#CNJuM$5{#)JbWl9uwpatsmws(MVCO&KHsNwsS>L)6-U)DHL$7n3%_)- zVY#}0?{2oj)`S};dXF_u{;asOd6rY%Fo@)g?L~P8S!y0#=+K}0hF_lQDkK=NdtbAHnPWkcl9Co)&B4w|K-fWQ?iOu!CD>E;nq-61^{(|&L^v>k-^L#;Y zo)%Aa5sAF*AFWMBbK;hA?P@?;c3orSI7gzPdc%n-N1}86ptYUWIk}vX)N5MjwB2w| zE3{|B*XR3B9(_3ydS*I7k;GL(4gC(jkwbjq2?upa8I%by%TBL&LQ2k{2ejgq?x6iE`shk9^gbU4&w!Sj0SW7GYp-+u!CtC9q9D;`#Ov;G&6D}q#pEm-YaXR8v1t?tapVsd7xDUlNi91 zUdJ+fv1r8qB?x*h;L#SLS}2=f|6rkgIC{HH7-KYdR{1Xv<}M)|jjlR$)?mXIp1D)> zKfWmxS29o7;!e6W_Vn}+snk_RSg-BIB-xhIp%4 z9D0Sd3R2a`P+CF>F25&jHu_c%5Zafn(ExBYF&}4pd~#sm#OC)g=wrln#hxNlD1*U( z;58FAK6?kR!|oyY1HJGau-YEEHQV=k!KbphL}VH4g7$~&^*3#dgQw07w-Z8Ln*zOz z!{#r~FD=z5+Dr+)bvr7|BGnP*)h_4|fA;|Mm+c#Y)G6Qr)_06fmr(%UxIy z+S}raS2@3W0=MkJxx-A;q0^)BKp?LOYJeu9TTUzjEbA0*Hu&%65lLLl_tXCW>oKTS#~+%Vi2qO#YGWq=W24N zBvJLwAsMBY361ZBx1-ZtI7J1ux*(6sdbd~XDw~>&n(WUs-TglL_2BiL+3p3E2PiA@ zE@t?%6XgaH@%T*fll4e_RxUlgf&y|b``r|Ygg_#w3x8D7=I38L?}a@TOcqxP#B2Cv zZ$ih@ge-<4fdDw#p}?k1`-)^qrh+@&Rg#jEX(J83URKn!ovE&Pux@HHw0WE0PC+0j z68js9*?h~z5_nBe`H0HY;!8NBeSNOa7q;ArK_Z+v83X{8pAZjqh!S^R8KS@vy(Jdn zzCDE@lR}yhbl*4ozQcNPgnIPt4kW@M`uQ){IB<~1Iq5uUgtrtp!qUKsYN~vVcg6bS z<`liORs>jVfKWN-#fK3&Et*yedf<~vtgX<5blQ9<%36Id+X9F_UVCH$_@yKVdhzu^ z*7I8!mqEOWsO`J!Uk9{*tB+He@)eN+BW@)~`^9$2sE4*Z1`e;sWsaQ39HCG^zmso= z66DJS@$zS`CY-?yI$5x$1N(|wdpBq4jSerl8`$<-4I04f99lGO8csz#)qJO}m}Ef2A14|;WG24{4#CSQkmD$RUjUU>Xx1Zg6EpNCPsjs-!Kz8B$NE{M1vpHmB$kBi#teRo_TbF_a zwID1Zy!>=Gm&>hXiBBni6ROi6Y-olyApbkl+x7coLcR$t3(s4;bKx*k!Sp4k*-MH~ zLX`9*4T?zW>gxK6(>PAT9EwVoczz5+>i|eLY`oMZ>g3`c;uF-AT+Gqs^(Jc97M}}l zPp%&9ZB=OnOAJt>ACQtd$b+Ta0Rmz9bAL7514NQB&fd2xFyy;8%RZG#2+r% zs)9*H0Qt@~3^PlO)3eV_<_#2=6JY_hqB$LHEU=}|E5kfqHYYJIE-p2*9Q1zRI@m78 zFZSVS+c{}>kEWrUU~<-t&4h;mHpn>uon0i*9vXehwme2+>p`10^9jN~A8RaLSvT8F zXVXhdxPIZaBN68sG-fAw*&}aYC~uPD+4}5Wb46L%i#5M)JyD|z4JlBWFzEwXF~$n^ z2WuZ9YIKGDzACRR-(P!fM0@Ejqhar222O;^>~QtJk`dLBkSrL`g9KkFP zMO`F-eXn?c)azk}{XhDI2UH(~Y_Lz&>i0LMzIjP&wH5J1W#-%y&{L+ZV}CUV`pW-k zbG!%iV=afN7RWx&eKGER0KmUK0Xi^;y=S|&Mu`~}{{sF$IX=7mE1#Suy80(60d!Fw zR98-{w&x>GkHqu5U|(4WyZPIRDb9uB{adG@I~21PHx_iq{K0nUC(QEN#i0KojkNKgB&HPiNApAs)yad+4IJO-L`Dmsk%lGJY8 zz1xMp-*RKmD7qagNP~p4p9h0H^gx$7)S33GB6hXIFM;%pqlEEs2}UyU5AIIzJbeDH z`^0CXzN8KBV_fDk^+k1-cV>thwtY}GFy~SB#y;pxL1JVT!~ZWkVIWn@<0w&6g7?kl3kj%|d@qk~)Qnq?Klr!RaBGLL@*ZA`pwvvqc7G$}xhnORw3M3}ZRg|Kfbh_g^> zhua0$BaUlZxPn53?Zz7;MdY|O#dKhr5gVJEnl%A;J&8KvNJ@-&Wp6@hJu}n1yf)4C z+9;X4Rc_a~l)>MjsG!g=*ZTM|TjJr3_0#2v;^+=_Mx7GW=|d3mw8mqE{Gr4&;)-ik z$c!W}%*pcA)1zrzRE)2;_apnJNB;KB!9huvhf%4yvl(kX4=AvO+RI$jrOSp`$jYQD z0Z8()@r(|IPE1VP-Ozh@D~IMe81!0kE$cV<|PMn0%eorLv0$f)=7!b7sd#I;_~ugU^gOFprbmQ6dNe31jCsl zy(q<@d2NQw6-=QP2OIy0>sXi_9Uq6C@yT9AgY_x((GA72Ihxc#@CsIfhXhk*z9oJ;m z2g@|Pu)QSgmMJABAjTRmWmd30QmFO>Q_j_BkScKc5;H>3_<=^!DuHz{3Sd?Hj#C1b zN^w(mA_A1Xr)89VJ}ShX4dhCnt$)7iAmqRv%N45!9R>Mk*f@mU%LxF>{H`P$<`t5l zEpz#5A$R8*NhK$7j=zu`~4icj5l+32eKF>TmzN}s6jRJlDC z)&Uh1uCkfHv#ra+((Lu_S!H;Jq=a9rbRWViCqyoHv(&o{a7RuAa$&YV{$tt+$4R;# zew`&eC;Gw16f$LHcTs6)?SGvA+Pw2VkbXgf?Rpz|=ng@Cs7vY0wRRPdK$~BeR<`3m zlaPsLKaSJoUbU=j3|w!*{y2WQNY@kyQ}%s?*_k`2Plc~?F^P?`moswZYVq~)rxSBX zyj@KbN%W&#+^F(f)ajv3>xQ@tw555Fbx!0j*|Vqq#~*BF-pJ#GXSBZL3@wQPV$jvD z@pnR~)b+yVwY9Z(M}*s_Vr=?Qq*N%t*rqkC7N+Q#b+Q;MNTz!LZCfI_BenUZ*Hn2U zLif)GHci@S)wchubjV}57-=av$k6P)>oCEMHD2P14v&z@9i=ZBOX*AREWho{&jY;| zmPm%r73RgiHpcoFbcu2hi4tK0sqVFwg6OL7cbL@HdRn9KK+Mm<#(5~TJ4 z?f>V=hW;6Tp)xRbRdJ?jq+s_bKqh!=S|(X7;`m+UZK65#PlS0Kltb}Hny6(IP-Vq5 zlbGv>{W5ZqJbk(aJ+F_)T#(^%xM1FkR=9FU_Hv?0nV}Yxh|p0gcAG zbxPX4>*d!7n|P?-MRa?1R7dGTH&(VDFcXc0(uG*XOgLB#bE5|sK^)SKFHpiwI9AlS zn9QA`BQDGLNqdXAd;h$(V%mqgNcEGM{j@^ls3knE#jgY(A+BaVLH(?KV}FhCa8lBG zf3MgxWOYzr&rVD1oXYASzqnwCH`o(XcL`reXD|jFyD^VQyC?!80n$Z~rL?8A&kRjM ztbg^iL);lD3?xK0AYSTM2l8C~lks$y?xa1mVTcDu_rf3lZl_NO4B!smBSBN z^4B8~9_x3RuWL047tn2?1Fgs^Y6cLMrT5D!&MpKAq5JgYz-&GDnt?PtP16O)S`=7U zd1#@I0_F>uWPoXVJ%T9^MflV+UU~PUO#pS_+^SZBZgDJ*5z)hAqIG_}X53p#>4N=* z%(%=f<0j#jl&+J*os*tEzlGMrxxj%O$^DV7T1g_L|H%t$iuQRwoUCjwyPpEUPxi+7 zLhSMHVaiztJ**!)IB%ugl!0lnGo5>+4Zj2Du-AfiAr?^|54UDIWk{6Of!P9;z;O{X z*Azc3|8)4l;xagDZ+VYV+PU&sCuERm^mnZ}QXYBm2^-Pz=Ts764D?fz-M!#pj&V_A z{5K4gW@D5qi zTz2o0k?%~kItcgaeMGa@g9m;sOjiVUiAic)0;Zqu52c^9pBFq@SD9_bV7#w%S=`22 zKAdZr(bO&G-JGhxK&9*qAqj$^z)%2mnT|$P!WDm6Ur$fU6odECDq@iHqohFLO{J}( zCGKcOp>&*7TxK{dmESQ%;k^V#cyqFBpKYv?Y1$x(XORxY)pke2kTyjNLeL!PS=H=qXZOO%e|Z82O)VXS+n<^LROfYtcJbA0wIr$AQgI-?v#{ zN)2V``li73VX6=4u|Pw}zLU?{>5sYFvhjO22Q=$MLWtoyi7FcMtZZ5+KBx5k zJG$PNifKRkfC|AM4Jpr~>WY{+MH=Kih8r?PO^=n`r*)&fuBP-%wD>RcDPUiN)hufc~+8C}%E1}x^EwZfMo8ei~EXIr^A}N;DUlOmZiW*52 z$>3z2Zdav$KH{v9~Iu?c@X=v-F&eBB-Eq$Je5`?rZqsp7mq zp!NK-!N$JqUolu6H`!d>>qLHdsA&#d19Wy8lQ!@k%d{v)IRBKg1Z&(Bwb4k0_Wg-S((mtdMCQ&UOI zZ=4!GiXdWtF?S(26@L`PrXf~%5)FzWzXAw4X{F+H6TA$JSYEq*&014iTvrRH% zi^ng$^wIsT*~YQx`H`z}OugFuk4)Z+Czl=_0s7R?5D`F`~BqpFjfJip%?%aNN zvP(9P*`3GE?xxJ1`|r%$*Z<$|yZ?XhoguP+HUc&RHUc&RHUc&RHUc&RHUc&RXBq;m zyA1fE_e#Gf%hD8Ld^Btx3CV)ck=i8IqT=|ucjfN?0KQ#wsR#}ZC^h_R=6pk<}^))l^v#i{a~k_248W{qQCzdg4x#!HE) zA4D~&642J-OSs3J+I{_=r_xfnEju;tQjUO8RdX){@Xr9Av5=Ta0|B8vSd}cZd-qRY z`cWt&B`zsLz&RThrDgRv@;ii$5+I}5F6{)MS0Wi}#j_diqYr*Mb?qr7C&_=B2Wq9A z$^y$-8FUPT=t?>X2>1O7m-x-zo0jhkXC&*IR01Y!F7=#nu?I2uMEe*PprlZ z-YYGVxHJ=6%gf`T*(?EJ8vw*c;`GGl)BdzAoR^3z^jfcGc-8z~ZsxxMpx;77--pC4 z#fyN`1~K{op=m`>lGYx$Y01&k`4-(+M!-c?r9*JJ zVtKNVfR45wM#jG|&X1VP>+s5>j?3(ji}S-lx7?KBbbtHl)IT<%j;^GcfKgSYQy60} zq4yj}%A^DmplQsU(-Dc-&7V(Own0k+NlPVB2jG|Eno{7yo|H?BQ4V%@FKabSGXdzZ zC&W(L5XjP2jYtmxTKlx?=|I3HKnGY>RJ94P0#zM-+63qT%ZjQt0al=@qfeUv9bj2e z)h56SRCV-e6QBbuE2=uJ=(M}_$pbPzRzif~5+mloyu^`KJX$ShHUS(j$o&D5{Xyao zd=DVz#G4$KgCsYg0U0&{Rv{1uza>Cz}KuA zVG8#f0sf%$Tv|7E4oy1uV!9~*JbLl!2k5$?V@dY;Nd`G2qq2oV0mT;fo{C)qPcFg^ zz!l)HzIG<%_sBhMse?)M`ybsw60U1Lt0H{cAW3+FMQg&D6c_OmnuB5yO_0S-2h5vk13f8l*wG zPl^D4kS7;2zx{%%HjscEq`NmhOB=l(5=(O_B&gL@$@i(`cgoh|0Y^KvHj;sODq}Xb zZu9&~j5X3t%r;^05q8XguN=s*D96;-zJg|~^msrcbo7N7PF$9W1CSv0*gO~{5o4Ll zNm3A!22=D8v};?!;DhL{wwhfxBI-Ev74VIPAAyycns)gZb-U+i51KpesuKl#Ux0$m zEi^WFDBb>@iS)JaI4#(Wu`GwMbhbePh9c+OzDZR>M%u=%+1Y-Zr%T~7Fr zH8?}W{8`lRtQ@7^Xn&n%zDaMChz>;47g;7nK19D~JENDYlp^LUVFxpR>fkXn_rf;t zMT@@a+4Se4yJ&!`CyxH1<3Gn75`}sMO%(7Ec1(dUUc#9Tg^WJdYPx0u7;(*=Mk<&6 z2s?=R6Z3}AjFH#iWZydTBkKqfmR|Y`>ccXOkq`lXzB?Ny+($Ld{7zvH|1ZG2U=P_01BDh%-9zdb`@;A+*v z`31T8^hU{I>fZyi7+BI3RG5`7Hs@U))&%(2xKlyze0u$f7inN0)Q!=z(0%(;4_P$x zTa|O-x-im3z!Ar|YHUU8TUBZN$Bu%DP~vvb`rTXTXD^j%BB6hFA9%u|RucR;z==Ln-?lkzX=Ls4XMb9ju5| zC8E5tl6#5@3Ss%h5xKE%8N5J*B3wVKucbZpUb=Eb5jmvj{P*x=(p4jiXv3~;)OhkZ zDL*XgB*4!Wp=uH3Blau#QT{rE552G@N)tmxjMIvy-E|xFG=?R5suRgh{s**>A^H*q zY{V1t!=3=Z1@J-&asNgMz(-juBRYeRIR{%}wKGs2x>Va$P@uW zv9EaaR*&3#74G{&j3;AQ9PRxjU)*0#e1bUE8j`TKEK15 zW;Cp-Uf&_l(4(nEI8x&=r~DM2t03l+AR)@a90p&!+*4j}I2?!w=GAKJfp2MO8T7Qa zy0L4)^4OI$)u{B!?&6^pOqQ=h{Tzt7BuMD6Fpnu5MkjpVQpqa|lsBskZ&+PT2*GeY zbILTg-s_g#6OXNa^Q7h$F)GI0^j!bsoN+8VsJcH+JWVp+1D05+$gy!uJ224EQh!eEfF86;%m zehkEtWGw-FA-0<{EHOOPY23D?%}(@pGN5RTsRj4y!4vGK8MYp)Ui5X2rq z*qN=}0&_JJMu0HWx7Aze88?Jui#mbgbass+0pi3l3%i})!nTB^gc2Y|g)Qoqv~dNW z;81fVo?Q@ADNY2OWSrmFP+qg#lraVxBP1ATWwOb!d7EG5L{rdBBP7}BD4cO}eR<7m z$uJ}-1c-qidwkO-i91K&{-2O!r4OZmJhEZc_DV|9FKGmb@gAA?_7{y#S$s_^6VC~j zl^$pMxG!JX@kN65wo~V5_mqr>N^ihdJiWpbJRoCnE`kZVCWV1DAjmkIjnnP@jXS*o z=u2u!)Hy)YAbZX%z8L7Q1`!3M@u%|~P)l6Cp`m=o4vpPgUJc{5T!&@_$LDRTadQ6; zi1@pj8)>b`=`A@(m!uN-!t|8#0AWyAvSt=vkC&iJ@tgxuO&UDl8)E#(2%FOJdYTaq?4l z@PKwG^_ua+$(*r8*eMMW1#KR{_Ys#$8p^kC6#3mn9Nopxu${gt?|;u8-FLa)?H&kM z7~pC=)l8hN@whT3A1vFpCtT0I+6dSP*a+AN*a+AN*a+AN*a+AN*a)O50{;V+#S`{0 SWhH|E0000kvV3?ksUf#X= z{m=RCefPcB-Sc{wrK$AH`Of+O&pF?AzWeUG@3z_8zqty`RbZ|Ha}}7Yz+469Dlk`p zxeClx;Qw0%vS-SM|Ks?rFKAhDA`5=8S$33JzOU9^RLY(tc5`mo&l`F6gV$WXc!NT- zy|L!myTt2GDHd!Q+4>GE?ESRo#7e#7P*^~KO~!v!WZAikMiyUq+%?&DPnv~lRvy45 zrxeY7w{3kF^;%yPwg!ttwOzZyg*bEtN#fKMpB1wQ^CCa{=g02*)%EMMJf+MUGwTlE z@)L$%#O>ug3jYUDrKqH9S9LGA+t?^1&{fG3Nk(3Wh3OOUg^{I8KDhSMY)t;W-Pq{fUV@pvVDqfF zh{7L{?&d(&3seR#kSnohPF+pT`!78G+v98l{^Q`_l20H1!)%nuUXi_a06#i$>)WkW z{G(-dfC{MHbNi908U-pt?sG0w0}fp&P)qOjb#r~j!uLRt6@T~oE0L~-)MREPRjC9n(3d{#+6v|*0{V*U5P0Nf&>#!Xc}J?s(r-T zzUW`^+e%jKJOg%@$? z3X;UBt8nlgQG&2&54(aO6-*!*rmYZ5AyJZC$&e#wwB#El`RXFezuzdb%ieI!vU_Yd z{M)GmxcZchi*0z};=GtxG|_0RvWBh9itNC`vV)4EIGRCU$XfSrUvRM{*RF^n6|6w2 zLkCYJ8M;vybT`Kpfi#Bmc2b2BNJd#zhsx)mI`T4SBd^Q{BYCsA zG0z6J4z#unuf1mFR^l@fYSmx<+AMR0mOFnzck&5P`O zW;(d^_*AY+4^ct)xr)sORK%N8S5A9!s_jpk6Mds|;7CU!@+6ZMB~J~eU@|FC&D@b( z<;V*`grX(V(X+5;aRE{*JJkC4*Y^Q1R=fCVVtg)6+bZhf+{3P%x^g;6PTEFyj?$Aa znN%2aB2p~x! zX~p5hhXj`HAaYFK`aS?YR@F#8hby@PxOOF9+I%-xsKWHr7g&{YR<&y=d~ z14tJf1I6gBUEx9;x`HHe>M9(*kq#byZ7Ly$Eebu}8ncOF%tmwmmNL+?)kiP1l}GMl ztBzP`3-%kZp~X!bT-b?wgjkGp9sc8dJtP0zW!_i_g_o5$@*lcKfQ0ct9Dx_M~bY z*viLkv^8QQ`8Hc}Xw!~ZyW9?arONn+t6yo6o0W$Pc(0 zB&{cza6=Gq=(0m%_z?&KXiN76`ljpl>#Mf?e*!dDZPp4_Al0*jCz4DxL^rPjX5$>d zNNd<$a{3DUy+7N}xT`2Sce5mzg7uwGrP+-lApsFxZlKg}Us{5g7UlcJ9b6jH&I!`yN}%CJ_a%KFfF`M}Ghj85wm}nDV`>>SPXr(iU5QjV z5DhMqe3)G>$NbeQD|p4J1JGkFt7R!ns+llp31VJ&f|B6U9XSx99esLo^>(mQ@SDc)q^=GSUWWeSmz0QVqk}^YMc#7!c!YE<;kd(@ou~Mx1;tX zkDJ?{nDEd6FI;3x4jgj4BX#i07TevIZ{<6tWsL@3#`O+NinKitB=LkWNb+GI2%s%G zh&J0X>iYo7qV-*P&7D@44ArhsIUGJERwh6@&4b$>o3Puy{g~Z##gjJt-~>Ok8hoKP ze2kVoWCtI+$d3EyK{kKirsq$kRz80L_w<|}bNrGnlb8!Bna|(m31N_S4ydQlBp^g) zCVd}(7hYr6W^w3B0bhFus6w^XwtXF`Rp*S-8g1LA37-8McGCrq+AZIF%o-DeJjc(o z#m&WpbpY`sqbH_^uG?nUeEfcU&8H8EL8s7*Rt<9d(W{KY=R+P^?d+-xus!zd{^P9U;@do$qKc*Cs#5Z1IVZMID^?d`}W&^O`pPAPd05{ zb02=y4)F{>V2XPuB?FqxK~qWZ`RS9UPm1pKxF?n75Qj#Ub6V;ic@P8~nu#Uww$PhOCahF0BuaU|J7|ez&Z!EOd*7%|vqQLTX z7oJp&z-L7-;F^{dO?&FWF`MoH#)ft4X@7cD<#HTfAO!JoOSQWSUyk4R0rhoCR(n3d@}6LBLQzTTYj zVri%K;#g*fj|&Il0?ew%Z|53 z{TJ?$Coi|g0QdNmI+?lq>Mi~~(#SHNhPpBs8|iTN6cxvga!An_yuy{)ajRWsJ4h~U zvof>*ZQOSNK_)G<{2l-x4%I*U`3T`l!DKwe12~W_u72Uw$A7f7-L~f=yftmui{G^} za;MNw+&gOb@tS(T2KnBoU3UzpqG76@&g%{qr1|Qu?wl^}wWl>7a0_R+t@2-v>b9t3j*z5=h23 zRZiLI>nNe;RdIDlBpG>9PR)~`7oWcujB@4g^Q^*7`rPl>!WGkRW5d5}vj6?@uq|jV z@xPFD7m+$kVqVv*H_hi1)zhcT=jkaaE3&>n0n=YLOj1c<_i7R~Uo8M}=s6+)88r{E zAhzO=P!yFQ;?x5W#GyMObb|xrkf9;|ygx?qxAXUcMTb!QFC4bR;y?I{Vf)$VAF+8n z+79rD%O3_bYBUBd)PkW|Ee-^nL~&YTZWLD&QOK|QrmLOMPmN?!qhIHP3e4y=n@bqs#@4RfY zU3K;YHkdD@@H&8b`cN`pTe^#=NWGAgbFD^^X!U%LxH22a8^4T<9qYbtK_^|c;sGl0 z8_l8SL;DJ9B~*Zhkm?zJ3QCjDJpwfKQY(Fv=XjL2mlM3lAGa0HpJ%`O>V3mGh2HSZ zO?JguD*hrb{s8ZlGt=K2i;0Yunk6-aDLK0k>1h#??P;ww577e1!V0w7L>xR6Tumg`?6tPM4)5U`Lb6axI)c5{dE_uxI;Q^lW z=Wzhai+*%voDgBPU_O->vy*Gi@CeN?|NeL1wCeik-JhP(0jyu2B5TGGm zUw1+x2Ox(G4VffI3DKgDaLUAludu99*x>xBm-{e}oXu>IN6jWhRq-`WYH6Ir+-Tf# zF@(JjDq`r~xSTX(s(c<2zss*|g~{qqrryyM{c~%4mJq)+&`gDt`|wLj3upTs!O3$- zDTM^}3o61;VZz1Ro1&H3_y}Kd$^L!|0}7>BTr6A+dTw1dZiDJZw{89>xcFDJ{Lj7641TtLsyE&KkdH?O(JX83Q$ z2cYqbB0EpkXJ!#>1qwjRr^O}atL@-DIb@Q6sH>vU!tK6>HLZ~~?e>3roF6#^BBRo+ z(ZaUy*DxKFk5fzO<*ZiD)Z1aom+9qr-RWD24+}1Jm+=sQH{4MZ1!mBue}O*5Kx`rV z_A8#)fIYHGVG&40y>hT_Uz-Q=4Uks}Zlt0DEgnNh^I_Z0+fV*VOeL6Efm&C%YD5dpf`hFErA59Z|tFigL zS#DRU&^@!_K-yg(NaBHN`wKsAByiGYj;?+^*Xxsz^XJDDc2mzOU$)i9*{y}w3YehL zvURG7=uF#AeFDl!E_wN5-{JY>9AJv~+(`cS)d44>F zpC8Lf5eU*ILO2kis&yBEaU@lodreh%IrT>vy%8NRMoov{ah{O$$r$97!$4z**AMfJ z_wh>i=5xAo8spb_Z4vHvHASx6o%!3wi-`}&y|ax2+}W8Z0&8? zSff$AnZ<4Q?ErQZt*qm(>?$Vvi92j zZpW@?t-eNZ2&mxLWDZlaC%n4?bpb>6+B)WnIf!yuQx8N=njP zn#0n7!HEbYr+B?q8YtR7nS8SJ$*-#qIt7aJ~C zFP{@Bh!;jUHC(>;L>oNR$)Jk-GVnDt^5D z`73Aq%7G~-m0flK$8j&@UF7R2>fKs!IUDC@>`_=t*=X#}_9T7!yta^6R28{|##|&02(ZiR`ii&}!EH zY~RPTqM_df!`hFU{Lyrerv-7XxSA7`uo}?C4+=*!8{qMBp51iuCfj(&h{w9s*w&U^ zd)|ZoDq26>C{`T20Ld~86~(MLUU!DuAuhsx2Cm?U;FdgVz3#MImTp#jS2Zq`T{TpD zoNv7B@wZUCi^D_FwSyq8eWQ*-_43XRijU``HkOZAYjB&r;4Lfch&SwKOZnUI@S_uU z?~PB{b>}~9!}lA13FCD{wlD@p`$(=Jh(iqsmIN1yR_Bi8W;2|?n@_!C^*2R#W!o(W zpaouZ%%;<^pQlw)+xMhC-*7D{c$LZljM@Z0!p8IM{zHtfTWfH8YVZlsYY6@QS3k%y zei?gTbxj}{F7-g6Nl3trD}0E86jdhmUaeNaU&- z{x%k>Ib!p2Myqo@VvZN%++HRalNTY}^^JlzEnY=~*)VS#P`P z-)=nst@*;2JbEs_8Q&+YR;#lpg{(?ML2r{A&a zdqnoA?3Dx14!`!oO@GAY&tKGRDON6TUJzH*OrC@*xRaldYM2C)VUlcfZu!Y){A$fL zwio{GwFA&zzjnl92irjFdxhDHXcR-<%2dE(3KfAu<47QxN%N~1>G~*j@t-sQ$?I-C z@IHn2M%(R=q0?>ZFK*rMzHI66%enbpq~a*o3nWED!mYy7+MG-XlH%Q*NXjST2Lp{< zISA)PapA)4Bd^$-#n)2y>L)-8P+MC;ooL?@y2!kv*t#!W`*q4TTpie-o0VP4aInNEdDFKU{W+Bik(0*6c)tg zjGiLSNCXjq%O?i1-=9szXHmQ)ke-F@D@SfTgS=#cbF7<}EP;}WSEGU6ws>H+} zW1LgZxO2^=WX?L7Rkxt->U{C=jjIQ&_)2c}I*-k)@Ek<`ui3!BU$47u<-^{87OGi& z0IHYXBYo-chfm|rlAnYxqET4aIlv#fO<;wMG$nw^w zc!Tj)ZY{BHfa1w;5dIOlI2&kwXf|KE0Szw3aXh(1%=GwuLX*mDlLZ^6*wLH&{EeH0zZ&Rsk<^4UMX=dkUH&$YP<%vE5n w0&^9ZtH4|Z<|;5(fw>CIRbZ|Hv$+EQ2eoMa9+kct0000007*qoM6N<$f~GhX3IG5A literal 0 HcmV?d00001 diff --git a/wingetui/resources/shield_red.png b/wingetui/resources/shield_red.png new file mode 100644 index 0000000000000000000000000000000000000000..ac865327091879df861ebfcd10159a44cac0a203 GIT binary patch literal 7322 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 AtpET3 literal 0 HcmV?d00001 diff --git a/wingetui/resources/shield_reload.png b/wingetui/resources/shield_reload.png new file mode 100644 index 0000000000000000000000000000000000000000..42a7087074540082794d0319bbdeea0a6ade1e20 GIT binary patch literal 6487 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 literal 0 HcmV?d00001 diff --git a/wingetui/tools.py b/wingetui/tools.py index 3c780ef54..a889376c6 100644 --- a/wingetui/tools.py +++ b/wingetui/tools.py @@ -181,7 +181,6 @@ def isDark() -> bool: return False return SYSTEM_THEME_ON_LAUNCH == 0 - def queueProgram(id: str): globals.pending_programs.append(id) diff --git a/wingetui/welcome.py b/wingetui/welcome.py index d0a5b3b23..ce94f97b8 100644 --- a/wingetui/welcome.py +++ b/wingetui/welcome.py @@ -30,9 +30,8 @@ def __init__(self, callback: object) -> None: self.widgetOrder = ( FirstRunSlide(), PackageManagersSlide(), - #SelectFullScreenSlide(), - #DateTimeFormat(), - #ClockAppearance(), + AdministratorPreferences(), + UpdatesPreferences(), LastSlide(), ) @@ -86,11 +85,11 @@ def __init__(self, callback: object) -> None: #SampleItem {{ font-family: "Segoe UI Variable Text"; width: 100px; - background-color: rgba(80, 80, 80, 15%); + background-color: rgba(80, 80, 80, 7%); padding: 20px; border-radius: 8px; - border: 1px solid rgba(100, 100, 100, 25%); - border-top: 1px solid rgba(100, 100, 100, 25%); + border: 1px solid rgba(100, 100, 100, 15%); + border-top: 1px solid rgba(100, 100, 100, 15%); height: 25px; }} #FramelessSampleItem {{ @@ -139,9 +138,9 @@ def __init__(self, callback: object) -> None: border-bottom-color: #363636; }} #FocusSelector {{ - border: 5px solid rgb({colors[1]}); - border-radius: 5px; - background-color: rgb({colors[1]}); + border: 4px solid rgb({colors[1]}); + border-radius: 16px; + background-color: transparent;/*rgb({colors[1]})*/; }} QLabel {{ border: none; @@ -259,12 +258,11 @@ def __init__(self, callback: object) -> None: #SampleItem {{ font-family: "Segoe UI Variable Text"; width: 100px; - background-color: #ffffff; + background-color: rgba(255, 255, 255, 70%); padding: 20px; border-radius: 8px; - border: 1px solid rgba(230, 230, 230, 80%); + border: 1px solid rgba(255, 255, 255, 70%); height: 25px; - border-bottom: 1px solid rgba(220, 220, 220, 100%); }} #FramelessSampleItem {{ font-family: "Segoe UI Variable Text"; @@ -296,25 +294,26 @@ def __init__(self, callback: object) -> None: border-top: 1px solid rgba(99, 99, 99 , 50%); }} #AccentButton{{ - color: white; - background-color: rgb({colors[3]}); - border-color: rgb({colors[2]}); - border-bottom-color: rgb({colors[4]}); + color: black; + background-color: rgb({colors[1]}); + border: 1px solid rgba(230, 230, 230, 80%); + height: 30px; + border-bottom: 1px solid rgba(220, 220, 220, 100%); }} #AccentButton:hover{{ background-color: rgba({colors[2]}, 80%); - border-color: rgb({colors[1]}); - border-bottom-color: rgb({colors[3]}); + border: 1px solid rgba(95, 95, 95, 50%); + border-top: 1px solid rgba(99, 99, 99 , 50%); }} #AccentButton:disabled{{ - background-color: #212121; - border-color: #303030; - border-bottom-color: #363636; + background-color: transparent; + border-color: #eeeeee; + border-bottom-color: #eeeeee; }} #FocusSelector {{ - border: 5px solid rgb({colors[1]}); - border-radius: 5px; - background-color: rgb({colors[1]}); + border: 4px solid rgb({colors[1]}); + border-radius: 16px; + background-color: transparent; }} QLabel {{ border: none; @@ -471,7 +470,7 @@ def __init__(self, parent: bool = None, startEnabled: bool = False, closeEnabled self.l = QVBoxLayout() self.setLayout(self.l) - if(readRegedit(r"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize", "AppsUseLightTheme", 1)==0): + if(isDark()): self.iconMode = "white" self.negIconMode = "black" else: @@ -493,7 +492,7 @@ def __init__(self, parent: bool = None, startEnabled: bool = False, closeEnabled startButton.setLayoutDirection(Qt.RightToLeft) startButton.setIconSize(QSize(12, 12)) startButton.setFixedSize((96), (36)) - startButton.setIcon(QIcon(getPath(f"next_{self.negIconMode}.png"))) + startButton.setIcon(QIcon(getPath(f"next_black.png"))) startButton.clicked.connect(lambda: self.outAnim(self.next.emit)) startButton.setObjectName("AccentButton") self.navLayout.addWidget(startButton) @@ -518,7 +517,7 @@ def __init__(self, parent: bool = None, startEnabled: bool = False, closeEnabled self.nextButton.setIconSize(QSize(12, 12)) self.nextButton.setFixedSize((36), (36)) self.nextButton.clicked.connect(lambda:self.outAnim(self.next.emit)) - self.nextButton.setIcon(QIcon(getPath(f"next_{self.negIconMode}.png"))) + self.nextButton.setIcon(QIcon(getPath(f"next_black.png"))) self.nextButton.setObjectName("AccentButton") self.navLayout.addWidget(self.nextButton) @@ -853,7 +852,25 @@ def __init__(self, parent=None) -> None:

{_("Default preferences - suitable for regular users

")} {_("Search for desktop software, warn me when updates are available and do not do nerdy things. I don't want WingetUI to overcomplicate, I just want a simple software store")}""") self.defaultPrefs.setIcon("simple_user.png") - self.defaultPrefs.buttonClicked.connect(lambda: self.outAnim(self.skipped.emit)) + + def loadDefaultsAndSkip(): + setSettings("DisableUpdatesNotifications", False) + setSettings("DisableAutoCheckforUpdates", False) + setSettings("AutomaticallyUpdatePackages", False) + + for manager in PackageManagersList: + setSettings(f"AlwaysElevate{manager.NAME}", False) + setSettings("DoCacheAdminRights", False) + + setSettings("DisableWinget", False) + setSettings("DisableChocolatey", False) + setSettings("DisableScoop", True) + setSettings("DisablePip", True) + setSettings("DisableNpm", True) + + self.outAnim(self.skipped.emit) + + self.defaultPrefs.buttonClicked.connect(lambda: loadDefaultsAndSkip()) self.hacker = ClickableButtonLabelWithBiggerIcon(64) @@ -951,18 +968,18 @@ def __init__(self, parent=None) -> None: vl.setContentsMargins(0, 0, 0, 0) l.addLayout(vl) - label1 = IconLabel(size=(48), frame=False) - label1.setIcon(getPath("console_color.png")) + label1 = IconLabel(size=(64), frame=False) + label1.setIcon("console_color.png") label1.setText(f"""

{_("Which package managers do you want to use?")}

{_("They are the programs in charge of installing, updating and removing packages.")}""") self.managers = DynamicScrollArea() - winget = NewWelcomeWizardPackageManager("Winget", "Microsoft's official package manager. Full of well-known and verified packages
Contains: General Software, Microsoft Store apps

", getMedia("winget_color")) - scoop = NewWelcomeWizardPackageManager("Scoop", "Great repository of unknown but useful utilities and other interesting packages.
Contains: Utilities, command-line packages, General Software (extras bucket required)", getMedia("scoop_color")) - choco = NewWelcomeWizardPackageManager("Chocolatey", "The package manager for windows You'll find everything there.
Contains: General Software", getMedia("choco_color")) - pip = NewWelcomeWizardPackageManager("Pip", "Python's library manager. Full of python libraries and other python-related utilities
Contains: Python libraries and related utilities", getMedia("pip_color")) - npm = NewWelcomeWizardPackageManager("Npm", "Node JS's package manager. Full of libraries and other utilities that orbit the javascript world
Contains: Node javascript libraries and other related utilities", getMedia("node_color")) + winget = WelcomeWizardPackageManager("Winget", "Microsoft's official package manager. Full of well-known and verified packages
Contains: General Software, Microsoft Store apps

", getMedia("winget_color")) + scoop = WelcomeWizardPackageManager("Scoop", "Great repository of unknown but useful utilities and other interesting packages.
Contains: Utilities, Command-line programs, General Software (extras bucket required)", getMedia("scoop_color")) + choco = WelcomeWizardPackageManager("Chocolatey", "The classical package manager for windows. You'll find everything there.
Contains: General Software", getMedia("choco_color")) + pip = WelcomeWizardPackageManager("Pip", "Python's library manager. Full of python libraries and other python-related utilities
Contains: Python libraries and related utilities", getMedia("pip_color")) + npm = WelcomeWizardPackageManager("Npm", "Node JS's package manager. Full of libraries and other utilities that orbit the javascript world
Contains: Node javascript libraries and other related utilities", getMedia("node_color")) managers = [winget, scoop, choco, pip, npm] @@ -996,7 +1013,7 @@ def showEvent(self, event) -> None: def get6px(self, i: int) -> int: return round(i*self.screen().devicePixelRatio()) -class SelectFullScreenSlide(BasicNavWidget): +class AdministratorPreferences(BasicNavWidget): def __init__(self, parent=None) -> None: super().__init__(parent=parent, nextGreyed=True) self.defaultSelected = False @@ -1012,55 +1029,78 @@ def __init__(self, parent=None) -> None: l.addLayout(vl) label1 = IconLabel(size=(96), frame=False) - label1.setIcon(getPath("video_color.png")) - label1.setText(f"""

{_("Fullscreen behaviour")}

- {_("WingetUI can hide when there's a fullscreen window present (when you are watching a video, you are playing, etc.), but it can also show over those windows (It might be useful if you use fullscreened terminals, etc.).

Please select one of the following and click next to continue")}""") - - self.secondaryClock = ClickableButtonLabelWithBiggerIcon(size=64) - self.secondaryClock.setIcon(getPath(f"hide_color.png")) - self.secondaryClock.clicked.connect(lambda: self.toggleClockMode("hide", shouldChangePrefs=True)) - self.secondaryClock.setText(f""" -

{_("Hide the clock (Recommended)")}

- {_("Hide the clock, as the default windows clock would do.")}""") + label1.setIcon("admin_color.png") + label1.setText(f"""

{_("Administrator rights")}

+ {_("How should installations that require administrator privileges be treated?")}""") + + self.default = ClickableButtonLabelWithBiggerIcon(64) + self.default.setText(f""" +

{_("Ask for administrator rights when required")}

+ {_("WingetUI will show a UAC prompt every time a package requires elevation to be installed.")+" "+_("This is the default choice.")}""") + self.default.setIcon("shield_green.png") + self.default.clicked.connect(lambda: self.toggleClockMode("hide", shouldChangePrefs=True)) + + + self.askOnce = ClickableButtonLabelWithBiggerIcon(64) + self.askOnce.setText(f""" +

{_("Cache administrator rights, but elevate installers only when required")}

+ {_("You will be prompted only once, and administrator rights will be granted to packages that request them.")+" "+_("This could represent a security risk.")}""") + self.askOnce.setIcon("shield_yellow.png") + self.askOnce.clicked.connect(lambda: self.toggleClockMode("show", shouldChangePrefs=True)) - self.formattedClock = ClickableButtonLabelWithBiggerIcon(size=64) - self.formattedClock.setIcon(getPath(f"show_color.png")) - self.formattedClock.clicked.connect(lambda: self.toggleClockMode("show", shouldChangePrefs=True)) - self.formattedClock.setText(f""" -

{_("Show the clock over the fullscreen window")}

- {_("Show the clock over fullscreen windows. This might cover some in-app controls, like youtube's exit fullscreen button, but it might be useful to see the time when playing")}""") + self.askNever = ClickableButtonLabelWithBiggerIcon(64) + self.askNever.setText(f""" +

{_("Cache administrator rights and elevate installers by default")}

+ {_("You will be prompted only once, and every future installation will be elevated automatically. ")+" "+_("Select only if you know what you are doing.")}""") + self.askNever.setIcon("shield_red.png") + self.askNever.clicked.connect(lambda: self.toggleClockMode("elevate", shouldChangePrefs=True)) vl.addWidget(label1) vl.addStretch() - vl.addWidget(self.secondaryClock) + vl.addWidget(self.default) + vl.addStretch() + vl.addWidget(self.askOnce) vl.addStretch() - vl.addWidget(self.formattedClock) + vl.addWidget(self.askNever) vl.addStretch() self.setCentralWidget(widget) self.clockMode = "" def toggleClockMode(self, mode: str, shouldChangePrefs: bool = False) -> None: - self.enableNextButton() + if mode != "hidedef": + self.enableNextButton() if shouldChangePrefs: self.defaultSelected = True - if mode == "hide": + if mode == "hide" or mode=="hidedef": self.clockMode = "hide" - self.moveSelector(self.secondaryClock) + self.moveSelector(self.default) if shouldChangePrefs: - setSettings("DisableHideOnFullScreen", False, r=shouldChangePrefs) + for manager in PackageManagersList: + setSettings(f"AlwaysElevate{manager.NAME}", False) + setSettings("DoCacheAdminRights", False) elif mode == "show": self.clockMode = "show" - self.moveSelector(self.formattedClock) + self.moveSelector(self.askOnce) + if shouldChangePrefs: + for manager in PackageManagersList: + setSettings(f"AlwaysElevate{manager.NAME}", False) + setSettings("DoCacheAdminRights", True) + elif mode == "elevate": + self.clockMode = "elevate" + self.moveSelector(self.askNever) if shouldChangePrefs: - setSettings("DisableHideOnFullScreen", True, r=shouldChangePrefs) + for manager in PackageManagersList: + setSettings(f"AlwaysElevate{manager.NAME}", True) + setSettings("DoCacheAdminRights", True) else: raise ValueError("Function toggleCheckMode() called with invalid arguments. Accepted values are: hide, show") def showEvent(self, event) -> None: if not self.defaultSelected: - self.toggleClockMode("hide") + pass + #self.toggleClockMode("hidedef") return super().showEvent(event) def moveSelector(self, w: QWidget) -> None: @@ -1090,7 +1130,8 @@ def moveSelector(self, w: QWidget) -> None: def get6px(self, i: int) -> int: return round(i*self.screen().devicePixelRatio()) -class DateTimeFormat(BasicNavWidget): + +class UpdatesPreferences(BasicNavWidget): def __init__(self, parent=None) -> None: super().__init__(parent=parent, nextGreyed=True) self.defaultSelected = False @@ -1106,303 +1147,78 @@ def __init__(self, parent=None) -> None: l.addLayout(vl) label1 = IconLabel(size=(96), frame=False) - label1.setIcon(getPath("formatting.png")) - label1.setText(f"""

{_("Let's talk: Format")}

- {_("Please select the date and time format you like the most. You will be able to change this after in the settings window")}""") - - self.noChanges = ClickableImageWithText(size=96) - self.noChanges.setIcon(getPath(f"default_format.png")) - self.noChanges.clicked.connect(lambda: self.toggleClockMode("default", shouldChangePrefs=True)) - self.noChanges.setText(f"""

{_("Default")}

""") - - self.weekday = ClickableImageWithText(size=96) - self.weekday.setIcon(getPath(f"weekday.png")) - self.weekday.clicked.connect(lambda: self.toggleClockMode("weekday", shouldChangePrefs=True)) - self.weekday.setText(f"""

{_("Weekday")}

""") - - self.OnlyTime = ClickableImageWithText(size=96) - self.OnlyTime.setIcon(getPath(f"onlytime.png")) - self.OnlyTime.clicked.connect(lambda: self.toggleClockMode("OnlyTime", shouldChangePrefs=True)) - self.OnlyTime.setText(f"""

{_("Only Time")}

""") - - self.OnlyDate = ClickableImageWithText(size=96) - self.OnlyDate.setIcon(getPath(f"onlydate.png")) - self.OnlyDate.clicked.connect(lambda: self.toggleClockMode("OnlyDate", shouldChangePrefs=True)) - self.OnlyDate.setText(f"""

{_("Only Date")}

""") - - self.WeekNumber = ClickableImageWithText(size=96) - self.WeekNumber.setIcon(getPath(f"weeknumber.png")) - self.WeekNumber.clicked.connect(lambda: self.toggleClockMode("WeekNumber", shouldChangePrefs=True)) - self.WeekNumber.setText(f"""

{_("Week Number")}

""") - - self.Seconds = ClickableImageWithText(size=96) - self.Seconds.setIcon(getPath(f"seconds.png")) - self.Seconds.clicked.connect(lambda: self.toggleClockMode("Seconds", shouldChangePrefs=True)) - self.Seconds.setText(f"""

{_("Ft. Seconds")}

""") - - hl1 = QHBoxLayout() - hl1.addStretch() - hl1.addWidget(self.weekday) - hl1.addStretch() - hl1.addWidget(self.noChanges) - hl1.addStretch() - hl1.addWidget(self.Seconds) - hl1.addStretch() - - hl2 = QHBoxLayout() - hl2.addStretch() - hl2.addWidget(self.OnlyTime) - hl2.addStretch() - hl2.addWidget(self.WeekNumber) - hl2.addStretch() - hl2.addWidget(self.OnlyDate) - hl2.addStretch() - - vl.addWidget(label1) - vl.addStretch() - vl.addLayout(hl1) - vl.addStretch() - vl.addLayout(hl2) - vl.addStretch() - self.setCentralWidget(widget) - - self.clockMode = "" - - def toggleClockMode(self, mode: str, shouldChangePrefs: bool = False) -> None: - self.enableNextButton() - if shouldChangePrefs: - self.defaultSelected = True - if mode == "Seconds": - self.clockMode = "Seconds" - self.moveSelector(self.Seconds) - if shouldChangePrefs: - setSettings("EnableSeconds", True, r=False) - setSettings("DisableTime", False, r=False) - setSettings("DisableDate", False, r=False) - setSettings("EnableWeekNumber", False, r=False) - setSettings("EnableWeekDay", False, r=True) - elif mode == "default": - self.clockMode = "default" - self.moveSelector(self.noChanges) - if shouldChangePrefs: - setSettings("EnableSeconds", False, r=False) - setSettings("DisableTime", False, r=False) - setSettings("DisableDate", False, r=False) - setSettings("EnableWeekNumber", False, r=False) - setSettings("EnableWeekDay", False, r=True) - elif mode == "weekday": - self.clockMode = "weekday" - self.moveSelector(self.weekday) - if shouldChangePrefs: - setSettings("EnableSeconds", False, r=False) - setSettings("DisableTime", False, r=False) - setSettings("DisableDate", False, r=False) - setSettings("EnableWeekNumber", False, r=False) - setSettings("EnableWeekDay", True, r=True) - elif mode == "OnlyDate": - self.clockMode = "OnlyDate" - self.moveSelector(self.OnlyDate) - if shouldChangePrefs: - setSettings("EnableSeconds", False, r=False) - setSettings("DisableTime", True, r=False) - setSettings("DisableDate", False, r=False) - setSettings("EnableWeekNumber", False, r=False) - setSettings("EnableWeekDay", False, r=True) - elif mode == "OnlyTime": - self.clockMode = "OnlyTime" - self.moveSelector(self.OnlyTime) - if shouldChangePrefs: - setSettings("EnableSeconds", False, r=False) - setSettings("DisableTime", False, r=False) - setSettings("DisableDate", True, r=False) - setSettings("EnableWeekNumber", False, r=False) - setSettings("EnableWeekDay", False, r=True) - elif mode == "WeekNumber": - self.clockMode = "WeekNumber" - self.moveSelector(self.WeekNumber) - if shouldChangePrefs: - setSettings("EnableSeconds", False, r=False) - setSettings("DisableTime", False, r=False) - setSettings("DisableDate", False, r=False) - setSettings("EnableWeekNumber", True, r=False) - setSettings("EnableWeekDay", False, r=True) - else: - raise ValueError("Function toggleCheckMode() called with invalid arguments ("+mode+"). Accepted values are: default, weekday, OnlyTime, OnlyDate, WeekNumber, Seconds") - - def showEvent(self, event) -> None: - if not self.defaultSelected: - self.toggleClockMode("default") - return super().showEvent(event) - - def moveSelector(self, w: QWidget) -> None: - if not self.selector.isVisible(): - self.selector.show() - self.selector.move(w.pos().x(), w.pos().y()) - self.selector.resize(w.size().width(), w.size().height()) - else: - posAnim = QPropertyAnimation(self.selector, b"pos", self) - posAnim.setStartValue(self.selector.pos()) - posAnim.setEndValue(w.pos()) - posAnim.setEasingCurve(QEasingCurve.InOutCirc) - posAnim.setDuration(200) - - sizeAnim = QPropertyAnimation(self.selector, b"size", self) - sizeAnim.setStartValue(self.selector.size()) - s = w.size() - s.setWidth(s.width()+18) - s.setHeight(s.height()+18) - sizeAnim.setEndValue(s) - sizeAnim.setEasingCurve(QEasingCurve.InOutCirc) - sizeAnim.setDuration(200) - - posAnim.start() - sizeAnim.start() - - def get6px(self, i: int) -> int: - return round(i*self.screen().devicePixelRatio()) + label1.setIcon("update_pc_color.png") + label1.setText(f"""

{_("Updates")}

+ {_("WingetUI can check for updates and install them automatically")}""") + + self.default = ClickableButtonLabelWithBiggerIcon(64) + self.default.setText(f""" +

{_("Do NOT check for updates")}

+ {_("WingetUI will not check for updates periodically. They will still be checked at launch, but you won't be warned about them.")}""") + self.default.setIcon("shield_yellow.png") + self.default.clicked.connect(lambda: self.toggleClockMode("noupdates", shouldChangePrefs=True)) + + + self.askOnce = ClickableButtonLabelWithBiggerIcon(64) + self.askOnce.setText(f""" +

{_("Check for updates periodically")}

+ {_("Check for updates regularly, and ask me what to do when updates are found.")+" "+_("This is the default choice.")}""") + self.askOnce.setIcon("shield_question.png") + self.askOnce.clicked.connect(lambda: self.toggleClockMode("checkupdates", shouldChangePrefs=True)) -class ClockAppearance(BasicNavWidget): - def __init__(self, parent=None) -> None: - super().__init__(parent=parent, nextGreyed=True) - self.defaultSelected = False - widget = QWidget() - l = QHBoxLayout() - l.setContentsMargins(0, 10, 0, 10) - widget.setLayout(l) - self.selector = MovableFocusSelector(self) - self.selector.hide() - vl = QVBoxLayout() - vl.setContentsMargins(0, 0, 0, 0) - l.addSpacing(10) - l.addLayout(vl) + self.askNever = ClickableButtonLabelWithBiggerIcon(64) + self.askNever.setText(f""" +

{_("Install updates automatically")}

+ {_("Check for updates regulary, and automatically install available ones.")}""") + self.askNever.setIcon("shield_reload.png") + self.askNever.clicked.connect(lambda: self.toggleClockMode("installupdates", shouldChangePrefs=True)) - label1 = IconLabel(size=(96), frame=False) - label1.setIcon(getPath("appearance.png")) - label1.setText(f"""

{_("One last thing: Appearance")}

- {_("Please select the clock style you like the most. You will be able to change this after in the settings window")}""") - - self.default = ClickableImageWithText(size=96) - self.default.setIcon(getPath(f"default_style.png")) - self.default.clicked.connect(lambda: self.toggleClockMode("default", shouldChangePrefs=True)) - self.default.setText(f"""

{_("Default")}

""") - - self.msdos = ClickableImageWithText(size=96) - self.msdos.setIcon(getPath(f"msdos.png")) - self.msdos.clicked.connect(lambda: self.toggleClockMode("msdos", shouldChangePrefs=True)) - self.msdos.setText(f"""

MS-DOS

""") - - self.win95 = ClickableImageWithText(size=96) - self.win95.setIcon(getPath(f"win95.png")) - self.win95.clicked.connect(lambda: self.toggleClockMode("win95", shouldChangePrefs=True)) - self.win95.setText(f"""

Windows 95

""") - - self.bw = ClickableImageWithText(size=96) - self.bw.setIcon(getPath(f"bw.png")) - self.bw.clicked.connect(lambda: self.toggleClockMode("bw", shouldChangePrefs=True)) - self.bw.setText(f"""

{_("Black&White")}

""") - - self.wb = ClickableImageWithText(size=96) - self.wb.setIcon(getPath(f"wb.png")) - self.wb.clicked.connect(lambda: self.toggleClockMode("wb", shouldChangePrefs=True)) - self.wb.setText(f"""

{_("White&Black")}

""") - - self.accent = ClickableImageWithText(size=96) - self.accent.setIcon(getPath(f"accent.png")) - self.accent.clicked.connect(lambda: self.toggleClockMode("accent", shouldChangePrefs=True)) - self.accent.setText(f"""

{_("Accent")}

""") - - hl1 = QHBoxLayout() - hl1.addStretch() - hl1.addWidget(self.msdos) - hl1.addStretch() - hl1.addWidget(self.default) - hl1.addStretch() - hl1.addWidget(self.win95) - hl1.addStretch() - - hl2 = QHBoxLayout() - hl2.addStretch() - hl2.addWidget(self.bw) - hl2.addStretch() - hl2.addWidget(self.accent) - hl2.addStretch() - hl2.addWidget(self.wb) - hl2.addStretch() vl.addWidget(label1) vl.addStretch() - vl.addLayout(hl1) + vl.addWidget(self.default) vl.addStretch() - vl.addLayout(hl2) + vl.addWidget(self.askOnce) + vl.addStretch() + vl.addWidget(self.askNever) vl.addStretch() self.setCentralWidget(widget) self.clockMode = "" def toggleClockMode(self, mode: str, shouldChangePrefs: bool = False) -> None: - self.enableNextButton() + if mode != "hidedef": + self.enableNextButton() if shouldChangePrefs: self.defaultSelected = True - if mode == "msdos": - self.clockMode = "msdos" - self.moveSelector(self.msdos) - if shouldChangePrefs: - setSettingsValue("UseCustomFont", "Consolas,10,-1,5,50,0,0,0,0,0,Regular", r=False) - setSettingsValue("UseCustomFontColor", "0,255,0", r=False) - setSettings("DisableTaskbarBackgroundColor", False, r=False) - setSettingsValue("UseCustomBgColor", "0,0,0,100", r=False) - setSettings("AccentBackgroundcolor", False, r=True) - elif mode == "default": - self.clockMode = "default" + if mode == "noupdates" or mode=="hidedef": + self.clockMode = "noupdates" self.moveSelector(self.default) if shouldChangePrefs: - setSettings("UseCustomFont", False, r=False) - setSettings("UseCustomFontColor", False, r=False) - setSettings("DisableTaskbarBackgroundColor", False, r=False) - setSettings("UseCustomBgColor", False, r=False) - setSettings("AccentBackgroundcolor", False, r=True) - elif mode == "bw": - self.clockMode = "bw" - self.moveSelector(self.bw) - if shouldChangePrefs: - setSettings("UseCustomFont", False, r=False) - setSettingsValue("UseCustomFontColor", "0,0,0", r=False) - setSettings("DisableTaskbarBackgroundColor", False, r=False) - setSettingsValue("UseCustomBgColor", "255,255,255,100", r=False) - setSettings("AccentBackgroundcolor", False, r=True) - elif mode == "wb": - self.clockMode = "wb" - self.moveSelector(self.wb) + setSettings("DisableUpdatesNotifications", True) + setSettings("DisableAutoCheckforUpdates", True) + setSettings("AutomaticallyUpdatePackages", False) + elif mode == "checkupdates": + self.clockMode = "checkupdates" + self.moveSelector(self.askOnce) if shouldChangePrefs: - setSettings("UseCustomFont", False, r=False) - setSettingsValue("UseCustomFontColor", "255,255,255", r=False) - setSettings("DisableTaskbarBackgroundColor", False, r=False) - setSettingsValue("UseCustomBgColor", "0,0,0,100", r=False) - setSettings("AccentBackgroundcolor", False, r=True) - elif mode == "accent": - self.clockMode = "accent" - self.moveSelector(self.accent) + setSettings("DisableUpdatesNotifications", False) + setSettings("DisableAutoCheckforUpdates", False) + setSettings("AutomaticallyUpdatePackages", False) + elif mode == "installupdates": + self.clockMode = "installupdates" + self.moveSelector(self.askNever) if shouldChangePrefs: - setSettings("UseCustomFont", False, r=False) - setSettings("UseCustomFontColor", False, r=False) - setSettings("DisableTaskbarBackgroundColor", False, r=False) - setSettings("UseCustomBgColor", False, r=False) - setSettings("AccentBackgroundcolor", True, r=True) - elif mode == "win95": - self.clockMode = "win95" - self.moveSelector(self.win95) - if shouldChangePrefs: - setSettingsValue("UseCustomFont", "Segoe UI,11,-1,5,50,0,0,0,0,0,Normal", r=False) - setSettingsValue("UseCustomFontColor", "205,205,205", r=False) - setSettings("DisableTaskbarBackgroundColor", False, r=False) - setSettingsValue("UseCustomBgColor", "1,127,128,100.0", r=False) - setSettings("AccentBackgroundcolor", False, r=True) + setSettings("DisableUpdatesNotifications", False) + setSettings("DisableAutoCheckforUpdates", False) + setSettings("AutomaticallyUpdatePackages", True) else: - raise ValueError("Function toggleCheckMode() called with invalid arguments ("+mode+"). Accepted values are: default, weekday, OnlyTime, OnlyDate, WeekNumber, Seconds") + raise ValueError("Function toggleCheckMode() called with invalid arguments. Accepted values are: hide, show") def showEvent(self, event) -> None: if not self.defaultSelected: - self.toggleClockMode("default") + pass + #self.toggleClockMode("hidedef") return super().showEvent(event) def moveSelector(self, w: QWidget) -> None: @@ -1432,7 +1248,6 @@ def moveSelector(self, w: QWidget) -> None: def get6px(self, i: int) -> int: return round(i*self.screen().devicePixelRatio()) - if __name__ == "__main__": from ctypes import c_int, windll windll.shcore.SetProcessDpiAwareness(c_int(2))