""" # ============================================================ # Unloader - plugin for Falkon # Copyright (C) 2019 Juraj Oravec # # 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 . # ============================================================ """ import Falkon import os from PySide2 import QtCore from unloader.Config import Config from unloader.settingsDialog import SettingsDialog class UnloaderManager(QtCore.QObject): tabs = None timer = None config = None configChanged = QtCore.Signal() def __init__(self, settingsPath, parent=None): super().__init__(parent) self.config = Config( settingsFile=os.path.join(settingsPath, "unloader", "settings.ini"), threshold=600, closeThreshold=0, updateInterval=5 ) self.config.load() self.tabs = {} self.timer = QtCore.QTimer(self) self.timer.setTimerType(QtCore.Qt.VeryCoarseTimer) self.timer.setInterval(self.config.updateInterval * 1000) self.timer.timeout.connect(self.onTimeout) self.timer.start() self.configChanged.connect(self.onConfigChanged) def onMainWindowCreated(self, window): tabs = window.tabWidget().allTabs() for tab in tabs: self.tabs[tab] = 0 tab.restoredChanged.connect( lambda r: self.onTabRestoredChanged(tab, r) ) window.tabWidget().currentChanged.connect( lambda index: self.onCurrentTabChanged(window, index) ) window.tabWidget().tabInserted.connect( lambda index: self.onCurrentTabChanged(window, index, True) ) window.tabWidget().tabRemoved.connect(self.onTabRemoved) def onMainWindowDeleted(self, window): tabs = window.tabWidget().allTabs() for tab in tabs: if tab in self.tabs: del self.tabs[tab] def onCurrentTabChanged(self, window, index, new=False): tab = window.tabWidget().webTab(index) self.tabs[tab] = 0 if new: tab.restoredChanged.connect( lambda r: self.onTabRestoredChanged(tab, r) ) def onTabRemoved(self, index): self.refreshTabList() def onTimeout(self): if not self.tabs: return for tab, time in list(self.tabs.items()): if tab.isCurrentTab(): continue self.tabs[tab] = time + int(self.timer.interval() / 1000) if not tab.isRestored() and self.config.closeThreshold: if self.tabs[tab] > self.config.closeThreshold: del self.tabs[tab] tab.closeTab() continue if self.config.threshold: if self.tabs[tab] > self.config.threshold and tab.isRestored(): self.tabs[tab] = 0 tab.unload() def refreshTabList(self): oldTabs = self.tabs.copy() self.tabs.clear() for window in Falkon.MainApplication.instance().windows(): winTabs = window.tabWidget().allTabs() for tab in winTabs: self.tabs[tab] = oldTabs.get(tab, 0) if tab not in oldTabs: tab.restoredChanged.connect( lambda r: self.onTabRestoredChanged(tab, r) ) def showSettings(self, parent=None): settings = SettingsDialog(self.config, parent) settings.accepted.connect(self.config.save) settings.accepted.connect(self.configChanged) settings.exec_() def onConfigChanged(self): self.timer.setInterval(self.config.updateInterval * 1000) def onTabRestoredChanged(self, tab, restored): self.tabs[tab] = 0