From 4d88940434d9c676e7c8f0b1756eae9628746a2f Mon Sep 17 00:00:00 2001 From: Loren Eteval Date: Tue, 11 Aug 2026 23:06:12 +0800 Subject: [PATCH] Clean up obsolete source code Signed-off-by: Loren Eteval --- Furious/Actions/Language.py | 86 --------- Furious/Actions/__init__.py | 2 - Furious/Backends/Hysteria2/TUN.py | 6 - Furious/Backends/Xray/TransportEditor.py | 64 ------- Furious/Controllers/SettingsController.py | 8 + Furious/Controllers/__init__.py | 8 + Furious/Externals/GenTranslation.py | 41 +---- Furious/Qt/DynamicTranslate.py | 8 + Furious/Qt/QtWidgets.py | 63 ------- Furious/Qt/__init__.py | 2 - Furious/Service/PluginUIManager.py | 8 + Furious/Window/SubscriptionPage.py | 8 + Furious/Window/SubscriptionWindow.py | 207 ---------------------- Furious/Window/__init__.py | 2 - 14 files changed, 45 insertions(+), 468 deletions(-) delete mode 100644 Furious/Actions/Language.py delete mode 100644 Furious/Window/SubscriptionWindow.py diff --git a/Furious/Actions/Language.py b/Furious/Actions/Language.py deleted file mode 100644 index 5138ecf..0000000 --- a/Furious/Actions/Language.py +++ /dev/null @@ -1,86 +0,0 @@ -# Copyright (C) 2024–present Loren Eteval & contributors -# -# This file is part of Furious. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -"""Implement tray actions for language.""" - -from __future__ import annotations - -from Furious.Frozenlib import * -from Furious.Qt import * -from Furious.Qt import gettext as _ - -import logging - -__all__ = ['LanguageAction'] - -logger = logging.getLogger(__name__) - -# Handy stuff -SMART_CHOSEN_LANGUAGE = ( - SYSTEM_LANGUAGE if SYSTEM_LANGUAGE in SUPPORTED_LANGUAGE else 'EN' -) - -registerAppSettings( - 'Language', validRange=SUPPORTED_LANGUAGE, default=SMART_CHOSEN_LANGUAGE -) - - -class LanguageChildAction(AppQAction): - """Handle the language child action.""" - - def __init__(self, *args, **kwargs): - """Initialize the LanguageChildAction.""" - super().__init__(*args, **kwargs) - - def triggeredCallback(self, checked): - """Handle activation of the action.""" - abbr = LANGUAGE_TO_ABBR[self.text()] - - if AppSettings.get('Language') != abbr: - logger.info(f'set language to \'{self.text()}\'') - - AppSettings.set('Language', abbr) - - Mixins.QTranslatable.retranslateAll() - - def retranslate(self): - # Nothing to do - """Refresh translated text for the language child action.""" - pass - - -class LanguageAction(AppQAction): - """Handle the language action.""" - - def __init__(self, **kwargs): - """Initialize the LanguageAction.""" - super().__init__( - _('Language'), - icon=bootstrapIcon('globe2.svg'), - menu=AppQMenu( - *list( - LanguageChildAction( - # Language representation - text, - checkable=True, - checked=text == ABBR_TO_LANGUAGE[AppSettings.get('Language')], - ) - for text in list(LANGUAGE_TO_ABBR.keys()) - ), - ), - **kwargs, - ) diff --git a/Furious/Actions/__init__.py b/Furious/Actions/__init__.py index 7cd1bc9..0fe86b6 100644 --- a/Furious/Actions/__init__.py +++ b/Furious/Actions/__init__.py @@ -29,7 +29,6 @@ from .Import import ( ImportQRCodeOnTheScreenAction, ImportURIFromClipboardAction, ) -from .Language import LanguageAction from .Routing import RoutingAction __all__ = [ @@ -41,7 +40,6 @@ __all__ = [ 'ImportJSONFromClipboardAction', 'ImportQRCodeOnTheScreenAction', 'ImportURIFromClipboardAction', - 'LanguageAction', 'RoutingAction', 'ShowHomePageAction', ] diff --git a/Furious/Backends/Hysteria2/TUN.py b/Furious/Backends/Hysteria2/TUN.py index de16b5f..dc083c4 100644 --- a/Furious/Backends/Hysteria2/TUN.py +++ b/Furious/Backends/Hysteria2/TUN.py @@ -31,7 +31,6 @@ __all__ = [ 'DEFAULT_HYSTERIA2_TUN_SETTINGS', 'buildHysteria2TUNConfig', 'getHysteria2TUNSettings', - 'hasHysteria2TUNConfig', 'isHysteria2TUNEnabled', 'resolveHysteria2ServerAddresses', 'saveHysteria2TUNSettings', @@ -258,8 +257,3 @@ def buildHysteria2TUNConfig(settings=None, serverAddresses=()) -> dict: result['route'] = route return result - - -def hasHysteria2TUNConfig(config) -> bool: - """Return whether a Hysteria 2 configuration contains native TUN mode.""" - return isinstance(config.get('tun'), dict) diff --git a/Furious/Backends/Xray/TransportEditor.py b/Furious/Backends/Xray/TransportEditor.py index afd487c..6734385 100644 --- a/Furious/Backends/Xray/TransportEditor.py +++ b/Furious/Backends/Xray/TransportEditor.py @@ -1593,69 +1593,6 @@ class GuiVTransportItemAuthHysteria(GuiEditorItemTextInput): self.setText('') -class GuiVTransportItemPasswordHysteria(GuiEditorItemTextInput): - """Represent GUI v transport item password hysteria.""" - - def __init__(self, *args, **kwargs): - """Initialize the GuiVTransportItemPasswordHysteria.""" - super().__init__(*args, **kwargs) - - def inputToFactory(self, config: ConfigFactory) -> bool: - """Apply the current editor value to the configuration.""" - streamSettings = ConfigXray.getProxyOutboundStream(config) - - if not isinstance(streamSettings.get('finalmask'), dict): - streamSettings['finalmask'] = {} - - finalmaskObject = streamSettings['finalmask'] - - if not isinstance(finalmaskObject.get('salamander'), dict): - finalmaskObject['salamander'] = {} - - salamander = finalmaskObject['salamander'] - - try: - oldPassword = salamander.get('password', '') - except Exception: - # Any non-exit exceptions - - oldPassword = '' - - newPassword = self.text() - - def setNewPassword(): - """Set new password.""" - if newPassword == '': - finalmaskObject.pop('salamander', None) - else: - salamander['password'] = newPassword - - if isinstance(oldPassword, str): - if newPassword != oldPassword: - setNewPassword() - - return True - else: - return False - else: - setNewPassword() - - return True - - def factoryToInput(self, config: ConfigFactory): - """Load the configuration value into the editor.""" - try: - salamander = ConfigXray.getProxyOutboundStream(config)['finalmask'][ - 'salamander' - ] - - self.setText(salamander.get('password', '')) - except Exception: - # Any non-exit exceptions - - self.setText('') - - class GuiVTransportPageXXX(GuiEditorWidgetQWidget): """Represent GUI v transport page xxx.""" @@ -1882,7 +1819,6 @@ class GuiVTransportPageHysteria(GuiVTransportPageXXX): GuiVTransportItemFinalMask(title='Finalmask', translatable=False), GuiVTransportItemVersionHysteria(title='Version', translatable=False), GuiVTransportItemAuthHysteria(title='Auth', translatable=False), - # GuiVTransportItemPasswordHysteria(title='Password', translatable=False), ] diff --git a/Furious/Controllers/SettingsController.py b/Furious/Controllers/SettingsController.py index f9b5e4c..34d8ee2 100644 --- a/Furious/Controllers/SettingsController.py +++ b/Furious/Controllers/SettingsController.py @@ -6,6 +6,14 @@ # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . """Apply persistent application preferences independently from their UI.""" diff --git a/Furious/Controllers/__init__.py b/Furious/Controllers/__init__.py index 9e05402..38163c6 100644 --- a/Furious/Controllers/__init__.py +++ b/Furious/Controllers/__init__.py @@ -6,6 +6,14 @@ # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . """Expose presentation-independent application controllers.""" diff --git a/Furious/Externals/GenTranslation.py b/Furious/Externals/GenTranslation.py index c965c74..0f16e28 100644 --- a/Furious/Externals/GenTranslation.py +++ b/Furious/Externals/GenTranslation.py @@ -6,8 +6,7 @@ TRANSLATION = { "Furious.Qt.QtWidgets", "Furious.Widget.ServerTableView", "Furious.Widget.SubscriptionTableView", - "Furious.Window.SubscriptionPage", - "Furious.Window.SubscriptionWindow" + "Furious.Window.SubscriptionPage" ], "RU": "Удалить", "ZH": "删除", @@ -228,7 +227,6 @@ TRANSLATION = { "Furious.Window.NetworkTestDialog", "Furious.Window.ProxyBypassDialog", "Furious.Window.SubscriptionPage", - "Furious.Window.SubscriptionWindow", "Furious.Window.TextEditorWindow" ], "RU": "Отмена", @@ -664,51 +662,24 @@ TRANSLATION = { }, "Add Subscription": { "source": [ - "Furious.Window.SubscriptionPage", - "Furious.Window.SubscriptionWindow" + "Furious.Window.SubscriptionPage" ], "RU": "Добавить подписку", "ZH": "添加订阅", "isReviewed": "True" }, - "Enter subscription remark:": { - "source": [ - "Furious.Window.SubscriptionWindow" - ], - "RU": "Введите примечание о подписке:", - "ZH": "输入订阅名称:", - "isReviewed": "True" - }, - "Enter subscription URL:": { - "source": [ - "Furious.Window.SubscriptionWindow" - ], - "RU": "Введите URL-адрес подписки:", - "ZH": "输入订阅URL:", - "isReviewed": "True" - }, "Edit Subscription": { "source": [ - "Furious.Window.SubscriptionPage", - "Furious.Window.SubscriptionWindow" + "Furious.Window.SubscriptionPage" ], "RU": "Редактировать подписку", "ZH": "编辑订阅", "isReviewed": "True" }, - "Subscription List": { - "source": [ - "Furious.Window.SubscriptionWindow" - ], - "RU": "Список подписок", - "ZH": "订阅列表", - "isReviewed": "True" - }, "Add": { "source": [ "Furious.Backends.Xray.RoutingWindow", - "Furious.Window.SubscriptionPage", - "Furious.Window.SubscriptionWindow" + "Furious.Window.SubscriptionPage" ], "RU": "Добавить", "ZH": "添加", @@ -953,7 +924,6 @@ TRANSLATION = { }, "Language": { "source": [ - "Furious.Actions.Language", "Furious.Window.SettingsPage" ], "RU": "Язык", @@ -1307,8 +1277,7 @@ TRANSLATION = { "Furious.Window.IndentDialog", "Furious.Window.NetworkTestDialog", "Furious.Window.ProxyBypassDialog", - "Furious.Window.SubscriptionPage", - "Furious.Window.SubscriptionWindow" + "Furious.Window.SubscriptionPage" ], "RU": "OK", "ZH": "OK", diff --git a/Furious/Qt/DynamicTranslate.py b/Furious/Qt/DynamicTranslate.py index 21fcf73..fafac5b 100644 --- a/Furious/Qt/DynamicTranslate.py +++ b/Furious/Qt/DynamicTranslate.py @@ -100,4 +100,12 @@ ABBR_TO_LANGUAGE = {value: key for key, value in LANGUAGE_TO_ABBR.items()} SUPPORTED_LANGUAGE = list(LANGUAGE_TO_ABBR.values()) +_SMART_CHOSEN_LANGUAGE = ( + SYSTEM_LANGUAGE if SYSTEM_LANGUAGE in SUPPORTED_LANGUAGE else 'EN' +) + +registerAppSettings( + 'Language', validRange=SUPPORTED_LANGUAGE, default=_SMART_CHOSEN_LANGUAGE +) + installTranslation(TRANSLATION) diff --git a/Furious/Qt/QtWidgets.py b/Furious/Qt/QtWidgets.py index 2c0c37b..c0f01c1 100644 --- a/Furious/Qt/QtWidgets.py +++ b/Furious/Qt/QtWidgets.py @@ -53,7 +53,6 @@ __all__ = [ 'AppQPushButton', 'AppQSpinBox', 'AppQTableView', - 'AppQTableWidget', 'AppQTabWidget', 'AppQToolBar', 'IconTextPushButton', @@ -870,68 +869,6 @@ class AppQTableView(QTableView): self.verticalHeader().setDefaultSectionSize(height) -class AppQTableWidget(QTableWidget): - """Provide the app Qt table widget.""" - - def __init__(self, *args, **kwargs): - """Initialize the AppQTableWidget.""" - super().__init__(*args, **kwargs) - - self.setWordWrap(False) - self.setAlternatingRowColors(True) - - @property - def selectedIndex(self): - """Return the selected index value.""" - return sorted(list(set(index.row() for index in self.selectedIndexes()))) - - def activateItemByIndex(self, index, activate): - """Activate item by index.""" - if activate: - for column in range(self.columnCount()): - item = self.item(int(index), column) - - if item is None: - # Do nothing - continue - - font = item.font() - font.setBold(True) - - item.setFont(font) - item.setForeground(QColor(AppHue.currentColor())) - else: - for column in range(self.columnCount()): - item = self.item(int(index), column) - - if item is None: - # Do nothing - continue - - font = item.font() - font.setBold(False) - - item.setFont(font) - item.setForeground(QBrush()) - - def selectMultipleRows(self, indexes: list[int], clearCurrentSelection: bool): - """Select multiple rows.""" - if clearCurrentSelection: - self.selectionModel().clearSelection() - - selection = self.selectionModel().selection() - - for index in indexes: - selection.select( - self.model().index(index, 0), - self.model().index(index, self.columnCount() - 1), - ) - - self.selectionModel().select( - selection, QtCore.QItemSelectionModel.SelectionFlag.Select - ) - - class AppQTabWidget(Mixins.QTranslatable, QTabWidget): """Provide the app q tab widget.""" diff --git a/Furious/Qt/__init__.py b/Furious/Qt/__init__.py index 15dc7c5..441bbb7 100644 --- a/Furious/Qt/__init__.py +++ b/Furious/Qt/__init__.py @@ -68,7 +68,6 @@ from .QtWidgets import ( AppQPushButton, AppQSpinBox, AppQTableView, - AppQTableWidget, AppQTabWidget, AppQToolBar, IconTextPushButton, @@ -123,7 +122,6 @@ __all__ = [ 'AppQSpinBox', 'AppQTabWidget', 'AppQTableView', - 'AppQTableWidget', 'AppQTextBrowser', 'AppQToolBar', 'AppStyleSheet', diff --git a/Furious/Service/PluginUIManager.py b/Furious/Service/PluginUIManager.py index b0a10b0..a4f1599 100644 --- a/Furious/Service/PluginUIManager.py +++ b/Furious/Service/PluginUIManager.py @@ -6,6 +6,14 @@ # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . """Bridge plugin UI capabilities into the host's page-based interface.""" diff --git a/Furious/Window/SubscriptionPage.py b/Furious/Window/SubscriptionPage.py index 0c1d134..ffce612 100644 --- a/Furious/Window/SubscriptionPage.py +++ b/Furious/Window/SubscriptionPage.py @@ -6,6 +6,14 @@ # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . """Present subscription definitions and synchronization as a dedicated page.""" diff --git a/Furious/Window/SubscriptionWindow.py b/Furious/Window/SubscriptionWindow.py deleted file mode 100644 index 4e66e6b..0000000 --- a/Furious/Window/SubscriptionWindow.py +++ /dev/null @@ -1,207 +0,0 @@ -# Copyright (C) 2024–present Loren Eteval & contributors -# -# This file is part of Furious. -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -"""Provide the application window for user subs window.""" - -from __future__ import annotations - -from Furious.Frozenlib import * -from Furious.Qt import * -from Furious.Qt import gettext as _ -from Furious.Widget.SubscriptionTableView import * - -from PySide6 import QtCore -from PySide6.QtWidgets import * - -import uuid -import functools - -__all__ = ['SubscriptionWindow'] - -# Migrate legacy settings -registerAppSettings('SubscriptionWidgetWindowSize') -registerAppSettings('UserSubsWindowGeometry') -registerAppSettings('UserSubsWindowState') - - -class AddSubsDialog(AppQDialog): - """Present the add subs dialog.""" - - def __init__(self, *args, **kwargs): - """Initialize the AddSubsDialog.""" - super().__init__(*args, **kwargs) - - self.setWindowTitle(_('Add Subscription')) - - self.remarkText = AppQLabel(_('Enter subscription remark:')) - self.remarkEdit = QLineEdit() - - self.webURLText = AppQLabel(_('Enter subscription URL:')) - self.webURLEdit = QLineEdit() - - self.dialogBtns = AppQDialogButtonBox(QtCore.Qt.Orientation.Horizontal) - self.dialogBtns.addButton(_('OK'), AppQDialogButtonBox.ButtonRole.AcceptRole) - self.dialogBtns.addButton( - _('Cancel'), AppQDialogButtonBox.ButtonRole.RejectRole - ) - self.dialogBtns.accepted.connect(self.accept) - self.dialogBtns.rejected.connect(self.reject) - - layout = QFormLayout() - layout.addRow(self.remarkText) - layout.addRow(self.remarkEdit) - layout.addRow(self.webURLText) - layout.addRow(self.webURLEdit) - layout.addRow(self.dialogBtns) - layout.setFormAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) - - self.setLayout(layout) - - def setWidthAndHeight(self): - """Apply the default size for the add subs dialog.""" - self.resize(456, 150) - - def subsRemark(self): - """Return the subs remark value used by the add subs dialog.""" - return self.remarkEdit.text() - - def subsWebURL(self): - """Return the subs web URL value used by the add subs dialog.""" - return self.webURLEdit.text() - - -class SubscriptionWindow(AppQMainWindow): - """Present the user subs window.""" - - DEFAULT_WINDOW_SIZE = QtCore.QSize(1120, 600) - - def __init__(self, *args, **kwargs): - """Initialize the subscription window.""" - callback = kwargs.pop('deleteUniqueCallback', None) - - super().__init__(*args, **kwargs) - - self.setWindowTitle(_('Edit Subscription')) - - self.userSubsQTableWidget = SubscriptionTableView( - deleteUniqueCallback=callback, parent=self - ) - - self.userSubsTab = AppQTabWidget(self) - self.userSubsTab.addTab(self.userSubsQTableWidget, _('Subscription List')) - - self.toolbar = AppQToolBar( - AppQAction( - _('Add'), - icon=bootstrapIcon('plus-lg.svg'), - callback=lambda: self.addSubs(), - ), - AppQAction( - _('Delete'), - icon=bootstrapIcon('dash-lg.svg'), - callback=lambda: self.deleteSelectedItem(), - ), - parent=self, - ) - self.toolbar.setObjectName('UserSubsWindow_AppQToolBar') - self.addToolBar(self.toolbar) - - self.fakeCentralWidget = QWidget() - self.fakeCentralWidgetLayout = QVBoxLayout(self.fakeCentralWidget) - self.fakeCentralWidgetLayout.addWidget(self.userSubsTab) - - self.setCentralWidget(self.fakeCentralWidget) - - def addSubs(self): - """Add subs.""" - - def handleResultCode(_addSubsDialog, code): - """Handle result code.""" - if code == PySide6Legacy.enumValueWrapper(AppQDialog.DialogCode.Accepted): - remark = _addSubsDialog.subsRemark() - webURL = _addSubsDialog.subsWebURL() - - if remark: - # Unique id. Used by display and deletion - unique = str(uuid.uuid4()) - - self.userSubsQTableWidget.appendNewItem( - unique=unique, remark=remark, webURL=webURL - ) - else: - # Do nothing - pass - - addSubsDialog = AddSubsDialog(parent=self) - addSubsDialog.setWindowModality(QtCore.Qt.WindowModality.WindowModal) - addSubsDialog.finished.connect( - functools.partial(handleResultCode, addSubsDialog) - ) - - # Show the MessageBox asynchronously - addSubsDialog.open() - - def deleteSelectedItem(self): - """Delete selected item.""" - self.userSubsQTableWidget.deleteSelectedItem() - - def keyPressEvent(self, event): - """Handle a key press for the user subs window.""" - if event.key() == QtCore.Qt.Key.Key_Delete: - self.deleteSelectedItem() - else: - super().keyPressEvent(event) - - def setWidthAndHeight(self): - """Apply the default size for the user subs window.""" - if AppSettings.get('UserSubsWindowGeometry') is None: - # Migrate legacy settings - try: - windowSize = AppSettings.get('SubscriptionWidgetWindowSize').split(',') - - width, height = tuple(int(size) for size in windowSize) - - if (width, height) == (640, 480): - self.resize(SubscriptionWindow.DEFAULT_WINDOW_SIZE) - else: - self.resize(width, height) - except Exception: - # Any non-exit exceptions - - self.resize(SubscriptionWindow.DEFAULT_WINDOW_SIZE) - else: - if PLATFORM == 'Darwin': - self.resize(SubscriptionWindow.DEFAULT_WINDOW_SIZE) - else: - try: - self.restoreGeometry(AppSettings.get('UserSubsWindowGeometry')) - except Exception: - # Any non-exit exceptions - - self.resize(SubscriptionWindow.DEFAULT_WINDOW_SIZE) - - try: - self.restoreState(AppSettings.get('UserSubsWindowState')) - except Exception: - # Any non-exit exceptions - - pass - - def cleanup(self): - """Release resources owned by the user subs window.""" - AppSettings.set('UserSubsWindowGeometry', self.saveGeometry()) - AppSettings.set('UserSubsWindowState', self.saveState()) diff --git a/Furious/Window/__init__.py b/Furious/Window/__init__.py index 8189c2d..00548bb 100644 --- a/Furious/Window/__init__.py +++ b/Furious/Window/__init__.py @@ -29,7 +29,6 @@ from .SubscriptionPage import SubscriptionPage from .NetworkTestDialog import NetworkTestDialog from .ProxyBypassDialog import ProxyBypassDialog from .QRCodeWindow import QRCodeWindow -from .SubscriptionWindow import SubscriptionWindow from .TextEditorWindow import TextEditorWindow from .TunSettingsDialog import TunSettingsDialog @@ -44,7 +43,6 @@ __all__ = [ 'NetworkTestDialog', 'ProxyBypassDialog', 'QRCodeWindow', - 'SubscriptionWindow', 'TextEditorWindow', 'TunSettingsDialog', ]