async def test_signals_slots_mgr(app_mock, signal): signals_slots_mgr = SignalsSlotsManager() Signal.setup_aio_support() func = mock.MagicMock() app_mock.test_signal = signal # test if add method works signals_slots_mgr.add('app.test_signal', func) signals_slots_mgr.initialize(app_mock) signal.emit() await asyncio.sleep(0.1) # schedule signal callbacks with aioqueue enabled assert func.called is True # test if add method works after initialized func_lator = mock.MagicMock() signals_slots_mgr.add('app.test_signal', func_lator) signal.emit() await asyncio.sleep(0.1) assert func_lator.called is True # test if remove method works signals_slots_mgr.remove('app.test_signal', func_lator) signal.emit() await asyncio.sleep(0.1) assert func_lator.call_count == 1 assert func.call_count == 3 Signal.teardown_aio_support()
def create_app(config): mode = config.MODE if mode & App.GuiMode: from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon, QPixmap from PyQt5.QtWidgets import QApplication, QWidget from feeluown.compat import QEventLoop q_app = QApplication(sys.argv) q_app.setQuitOnLastWindowClosed(not config.ENABLE_TRAY) q_app.setApplicationName('FeelUOwn') app_event_loop = QEventLoop(q_app) asyncio.set_event_loop(app_event_loop) class GuiApp(QWidget): mode = App.GuiMode def __init__(self): super().__init__() self.setObjectName('app') QApplication.setWindowIcon(QIcon(QPixmap(APP_ICON))) def closeEvent(self, _): if not self.config.ENABLE_TRAY: self.exit() def exit(self): self.ui.mpv_widget.close() event_loop = asyncio.get_event_loop() event_loop.stop() def mouseReleaseEvent(self, e): if not self.rect().contains(e.pos()): return if e.button() == Qt.BackButton: self.browser.back() elif e.button() == Qt.ForwardButton: self.browser.forward() class FApp(App, GuiApp): def __init__(self, config): App.__init__(self, config) GuiApp.__init__(self) else: FApp = App Signal.setup_aio_support() Resolver.setup_aio_support() app = FApp(config) attach_attrs(app) Resolver.library = app.library return app
def setup_app(args, config): if config.DEBUG: verbose = 3 else: verbose = args.verbose or 0 logger_config(verbose=verbose, to_file=config.LOG_TO_FILE) Signal.setup_aio_support() app = create_app(config) return app
def main(): # 让程序能正确的找到图标等资源 os.chdir(os.path.join(os.path.dirname(__file__), '..')) sys.excepthook = excepthook parser = setup_argparse() args = parser.parse_args() if args.version: print('feeluown {}, fuocore {}'.format(feeluown_version, fuocore_version)) return check_ports() ensure_dirs() config = create_config() load_rcfile(config) map_args_to_config(args, config) logger_config(config.DEBUG, to_file=args.log_to_file) if config.MODE & App.GuiMode: try: import PyQt5 # noqa except ImportError: logger.warning('PyQt5 is not installed,can only use CLI mode.') config.MODE = App.CliMode if config.MODE & App.GuiMode: from PyQt5.QtWidgets import QApplication from quamash import QEventLoop q_app = QApplication(sys.argv) q_app.setQuitOnLastWindowClosed(True) q_app.setApplicationName('FeelUOwn') app_event_loop = QEventLoop(q_app) asyncio.set_event_loop(app_event_loop) event_loop = asyncio.get_event_loop() Signal.setup_aio_support(loop=event_loop) app = create_app(config) bind_signals(app) if sys.platform.lower() == 'darwin': enable_mac_hotkey(force=config.FORCE_MAC_HOTKEY) try: event_loop.run_forever() except KeyboardInterrupt: # NOTE: gracefully shutdown? pass finally: event_loop.stop() app.shutdown() event_loop.close()
def create_app(config): mode = config.MODE if mode & App.GuiMode: from quamash import QEventLoop from PyQt5.QtCore import QSize from PyQt5.QtGui import QIcon, QPixmap from PyQt5.QtWidgets import QApplication, QWidget q_app = QApplication(sys.argv) q_app.setQuitOnLastWindowClosed(True) q_app.setApplicationName('FeelUOwn') app_event_loop = QEventLoop(q_app) asyncio.set_event_loop(app_event_loop) class GuiApp(QWidget): mode = App.GuiMode def __init__(self): super().__init__() self.setObjectName('app') QApplication.setWindowIcon(QIcon(QPixmap(APP_ICON))) def closeEvent(self, e): self.ui.mpv_widget.close() event_loop = asyncio.get_event_loop() event_loop.stop() def sizeHint(self): # pylint: disable=no-self-use return QSize(1000, 618) class FApp(App, GuiApp): def __init__(self, config): App.__init__(self, config) GuiApp.__init__(self) else: FApp = App Signal.setup_aio_support() Resolver.setup_aio_support() app = FApp(config) attach_attrs(app) Resolver.library = app.library return app
async def test_signals_slots_mgr_add_slot_symbol(app_mock, signal, mocker): """ test add slot symbol """ signals_slots_mgr = SignalsSlotsManager() signals_slots_mgr.initialize(app_mock) Signal.setup_aio_support() app_mock.test_signal = signal func = mock.MagicMock() func.__name__ = 'fake_func' mock_F = mocker.patch('feeluown.fuoexec.fuoexec_F', return_value=func) signals_slots_mgr.add('app.test_signal', 'fake_func') signal.emit() await asyncio.sleep(0.1) mock_F.assert_called_once_with('fake_func') assert func.called is True Signal.teardown_aio_support()
def setup_app(args, config): logger_config(config.DEBUG, to_file=config.LOG_TO_FILE) Signal.setup_aio_support() app = create_app(config) bind_signals(app) return app