class QtTestCase(unittest.TestCase): CLOSE_TIMEOUT = 10 WAIT_TIMEOUT_BEFORE_NEW = 10 SHOW = os.path.exists(os.path.join(os.path.dirname(os.path.realpath(__file__)), "show_gui")) @classmethod def setUpClass(cls): write_settings() cls.app = QApplication(sys.argv) @classmethod def tearDownClass(cls): cls.app.quit() sip.delete(cls.app) cls.app = None def setUp(self): self.form = MainController() if self.SHOW: self.form.show() def add_signal_to_form(self, filename: str): QApplication.instance().processEvents() QTest.qWait(self.WAIT_TIMEOUT_BEFORE_NEW) self.form.add_signalfile(get_path_for_data_file(filename)) def tearDown(self): if hasattr(self, "dialog"): self.dialog.close() if hasattr(self, "form"): self.form.close_all() if self.SHOW: self.form.close() QApplication.instance().processEvents() QTest.qWait(self.CLOSE_TIMEOUT)
class QtTestCase(unittest.TestCase): CLOSE_TIMEOUT = 10 WAIT_TIMEOUT_BEFORE_NEW = 10 SHOW = os.path.exists( os.path.join(os.path.dirname(os.path.realpath(__file__)), "show_gui")) @classmethod def setUpClass(cls): write_settings() cls.app = QApplication(sys.argv) @classmethod def tearDownClass(cls): cls.app.quit() sip.delete(cls.app) cls.app = None def setUp(self): self.form = MainController() if self.SHOW: self.form.show() def wait_before_new_file(self): QApplication.instance().processEvents() QTest.qWait(self.WAIT_TIMEOUT_BEFORE_NEW) def add_signal_to_form(self, filename: str): self.wait_before_new_file() self.form.add_signalfile(get_path_for_data_file(filename)) def get_path_for_filename(self, filename) -> str: return get_path_for_data_file(filename) def add_signal_to_generator(self, signal_index: int): gframe = self.form.generator_tab_controller item = gframe.tree_model.rootItem.children[0].children[signal_index] index = gframe.tree_model.createIndex(signal_index, 0, item) rect = gframe.ui.treeProtocols.visualRect(index) QTest.mousePress(gframe.ui.treeProtocols.viewport(), Qt.LeftButton, pos=rect.center()) self.assertEqual(gframe.ui.treeProtocols.selectedIndexes()[0], index) mimedata = gframe.tree_model.mimeData( gframe.ui.treeProtocols.selectedIndexes()) gframe.table_model.dropMimeData(mimedata, 1, -1, -1, gframe.table_model.createIndex(0, 0)) def tearDown(self): if hasattr(self, "dialog"): self.dialog.close() if hasattr(self, "form"): self.form.close_all() if self.SHOW: self.form.close() QApplication.instance().processEvents() QTest.qWait(self.CLOSE_TIMEOUT)
class QtTestCase(unittest.TestCase): CLOSE_TIMEOUT = 10 WAIT_TIMEOUT_BEFORE_NEW = 10 SHOW = os.path.exists(os.path.join(os.path.dirname(os.path.realpath(__file__)), "show_gui")) @classmethod def setUpClass(cls): write_settings() cls.app = QApplication(sys.argv) @classmethod def tearDownClass(cls): cls.app.quit() sip.delete(cls.app) cls.app = None def setUp(self): self.form = MainController() if self.SHOW: self.form.show() def wait_before_new_file(self): QApplication.instance().processEvents() QTest.qWait(self.WAIT_TIMEOUT_BEFORE_NEW) def add_signal_to_form(self, filename: str): self.wait_before_new_file() self.form.add_signalfile(get_path_for_data_file(filename)) def add_signal_to_generator(self, signal_index: int): gframe = self.form.generator_tab_controller item = gframe.tree_model.rootItem.children[0].children[signal_index] index = gframe.tree_model.createIndex(signal_index, 0, item) rect = gframe.ui.treeProtocols.visualRect(index) QTest.mousePress(gframe.ui.treeProtocols.viewport(), Qt.LeftButton, pos=rect.center()) self.assertEqual(gframe.ui.treeProtocols.selectedIndexes()[0], index) mimedata = gframe.tree_model.mimeData(gframe.ui.treeProtocols.selectedIndexes()) gframe.table_model.dropMimeData(mimedata, 1, -1, -1, gframe.table_model.createIndex(0, 0)) def tearDown(self): if hasattr(self, "dialog"): self.dialog.close() if hasattr(self, "form"): self.form.close_all() if self.SHOW: self.form.close() QApplication.instance().processEvents() QTest.qWait(self.CLOSE_TIMEOUT)
class QtTestCase(unittest.TestCase): CLOSE_TIMEOUT = 10 WAIT_TIMEOUT_BEFORE_NEW = 10 SHOW = os.path.exists( os.path.join(os.path.dirname(os.path.realpath(__file__)), "show_gui")) @classmethod def setUpClass(cls): import multiprocessing as mp try: mp.set_start_method("spawn") except RuntimeError: pass assert mp.get_start_method() == "spawn" write_settings() cls.app = QApplication([cls.__name__]) @classmethod def tearDownClass(cls): cls.app.quit() cls.app = None QTest.qWait(10) time.sleep(0.1) def setUp(self): ProtocolSniffer.BUFFER_SIZE_MB = 0.5 self.form = MainController() self.form.ui.actionAuto_detect_new_signals.setChecked(False) if self.SHOW: self.form.show() def tearDown(self): if hasattr(self, "dialog"): self.dialog.close() try: sip.delete(self.dialog) except TypeError: pass self.dialog = None if hasattr(self, "form"): self.form.close_all_files() self.form.close() try: sip.delete(self.form) except TypeError: pass self.form = None gc.collect() def wait_before_new_file(self): QApplication.instance().processEvents() QTest.qWait(self.WAIT_TIMEOUT_BEFORE_NEW) def add_signal_to_form(self, filename: str): self.wait_before_new_file() self.form.add_signalfile(get_path_for_data_file(filename)) def get_path_for_filename(self, filename) -> str: return get_path_for_data_file(filename) def add_signal_to_generator(self, signal_index: int): gframe = self.form.generator_tab_controller item = gframe.tree_model.rootItem.children[0].children[signal_index] index = gframe.tree_model.createIndex(signal_index, 0, item) rect = gframe.ui.treeProtocols.visualRect(index) QTest.mousePress(gframe.ui.treeProtocols.viewport(), Qt.LeftButton, pos=rect.center()) self.assertEqual(gframe.ui.treeProtocols.selectedIndexes()[0], index) mimedata = gframe.tree_model.mimeData( gframe.ui.treeProtocols.selectedIndexes()) gframe.table_model.dropMimeData(mimedata, 1, -1, -1, gframe.table_model.createIndex(0, 0)) def add_all_signals_to_simulator(self): assert isinstance(self.form, MainController) sim_frame = self.form.simulator_tab_controller sim_frame.ui.treeProtocols.selectAll() self.assertGreater(len(sim_frame.ui.treeProtocols.selectedIndexes()), 0) mimedata = sim_frame.tree_model.mimeData( sim_frame.ui.treeProtocols.selectedIndexes()) drop_event = QDropEvent(sim_frame.ui.gvSimulator.rect().center(), Qt.CopyAction | Qt.MoveAction, mimedata, Qt.LeftButton, Qt.NoModifier) drop_event.acceptProposedAction() sim_frame.ui.gvSimulator.dropEvent(drop_event)
class QtTestCase(unittest.TestCase): CLOSE_TIMEOUT = 10 WAIT_TIMEOUT_BEFORE_NEW = 10 SHOW = os.path.exists(os.path.join(os.path.dirname(os.path.realpath(__file__)), "show_gui")) @classmethod def setUpClass(cls): import multiprocessing as mp try: mp.set_start_method("spawn") except RuntimeError: pass assert mp.get_start_method() == "spawn" write_settings() cls.app = QApplication([cls.__name__]) @classmethod def tearDownClass(cls): cls.app.quit() cls.app = None QTest.qWait(10) time.sleep(0.1) def setUp(self): ProtocolSniffer.BUFFER_SIZE_MB = 0.5 self.form = MainController() if self.SHOW: self.form.show() def tearDown(self): if hasattr(self, "dialog"): self.dialog.close() sip.delete(self.dialog) self.dialog = None if hasattr(self, "form"): self.form.close_all_files() self.form.close() sip.delete(self.form) self.form = None gc.collect() def wait_before_new_file(self): QApplication.instance().processEvents() QTest.qWait(self.WAIT_TIMEOUT_BEFORE_NEW) def add_signal_to_form(self, filename: str): self.wait_before_new_file() self.form.add_signalfile(get_path_for_data_file(filename)) def get_path_for_filename(self, filename) -> str: return get_path_for_data_file(filename) def add_signal_to_generator(self, signal_index: int): gframe = self.form.generator_tab_controller item = gframe.tree_model.rootItem.children[0].children[signal_index] index = gframe.tree_model.createIndex(signal_index, 0, item) rect = gframe.ui.treeProtocols.visualRect(index) QTest.mousePress(gframe.ui.treeProtocols.viewport(), Qt.LeftButton, pos=rect.center()) self.assertEqual(gframe.ui.treeProtocols.selectedIndexes()[0], index) mimedata = gframe.tree_model.mimeData(gframe.ui.treeProtocols.selectedIndexes()) gframe.table_model.dropMimeData(mimedata, 1, -1, -1, gframe.table_model.createIndex(0, 0)) def add_all_signals_to_simulator(self): assert isinstance(self.form, MainController) sim_frame = self.form.simulator_tab_controller sim_frame.ui.treeProtocols.selectAll() self.assertGreater(len(sim_frame.ui.treeProtocols.selectedIndexes()), 0) mimedata = sim_frame.tree_model.mimeData(sim_frame.ui.treeProtocols.selectedIndexes()) drop_event = QDropEvent(sim_frame.ui.gvSimulator.rect().center(), Qt.CopyAction | Qt.MoveAction, mimedata, Qt.LeftButton, Qt.NoModifier) drop_event.acceptProposedAction() sim_frame.ui.gvSimulator.dropEvent(drop_event) def get_free_port(self): import socket s = socket.socket() s.bind(("", 0)) port = s.getsockname()[1] s.close() return port
def main(): fix_windows_stdout_stderr() if sys.version_info < (3, 4): print("You need at least Python 3.4 for this application!") sys.exit(1) urh_exe = sys.executable if hasattr(sys, 'frozen') else sys.argv[0] urh_exe = os.readlink(urh_exe) if os.path.islink(urh_exe) else urh_exe urh_dir = os.path.join(os.path.dirname(os.path.realpath(urh_exe)), "..", "..") prefix = os.path.abspath(os.path.normpath(urh_dir)) src_dir = os.path.join(prefix, "src") if os.path.exists(src_dir) and not prefix.startswith( "/usr") and not re.match(r"(?i)c:\\program", prefix): # Started locally, not installed -> add directory to path sys.path.insert(0, src_dir) if len(sys.argv) > 1 and sys.argv[1] == "--version": import urh.version print(urh.version.VERSION) sys.exit(0) if GENERATE_UI and not hasattr(sys, 'frozen'): try: sys.path.insert(0, prefix) from data import generate_ui generate_ui.gen() except (ImportError, FileNotFoundError): # The generate UI script cannot be found so we are most likely in release mode, no problem here. pass from urh.util import util util.set_shared_library_path() try: import urh.cythonext.signal_functions import urh.cythonext.path_creator import urh.cythonext.util except ImportError: if hasattr(sys, "frozen"): print("C++ Extensions not found. Exiting...") sys.exit(1) print("Could not find C++ extensions, trying to build them.") old_dir = os.path.realpath(os.curdir) os.chdir(os.path.join(src_dir, "urh", "cythonext")) from urh.cythonext import build build.main() os.chdir(old_dir) from urh.controller.MainController import MainController from urh import settings if settings.read("theme_index", 0, int) > 0: os.environ['QT_QPA_PLATFORMTHEME'] = 'fusion' app = QApplication(["URH"] + sys.argv[1:]) app.setWindowIcon(QIcon(":/icons/icons/appicon.png")) try: app.styleHints().setShowShortcutsInContextMenus(True) except AttributeError: pass util.set_icon_theme() font_size = settings.read("font_size", 0, int) if font_size > 0: font = app.font() font.setPointSize(font_size) app.setFont(font) settings.write("default_theme", app.style().objectName()) if settings.read("theme_index", 0, int) > 0: app.setStyle(QStyleFactory.create("Fusion")) if settings.read("theme_index", 0, int) == 2: palette = QPalette() background_color = QColor(56, 60, 74) text_color = QColor(211, 218, 227).lighter() palette.setColor(QPalette.Window, background_color) palette.setColor(QPalette.WindowText, text_color) palette.setColor(QPalette.Base, background_color) palette.setColor(QPalette.AlternateBase, background_color) palette.setColor(QPalette.ToolTipBase, background_color) palette.setColor(QPalette.ToolTipText, text_color) palette.setColor(QPalette.Text, text_color) palette.setColor(QPalette.Button, background_color) palette.setColor(QPalette.ButtonText, text_color) palette.setColor(QPalette.BrightText, Qt.red) palette.setColor(QPalette.Disabled, QPalette.Text, Qt.darkGray) palette.setColor(QPalette.Disabled, QPalette.ButtonText, Qt.darkGray) palette.setColor(QPalette.Highlight, QColor(200, 50, 0)) palette.setColor(QPalette.HighlightedText, text_color) app.setPalette(palette) # use system colors for painting widget = QWidget() bg_color = widget.palette().color(QPalette.Background) fg_color = widget.palette().color(QPalette.Foreground) selection_color = widget.palette().color(QPalette.Highlight) settings.BGCOLOR = bg_color settings.LINECOLOR = fg_color settings.SELECTION_COLOR = selection_color settings.SEND_INDICATOR_COLOR = selection_color main_window = MainController() # allow usage of prange (OpenMP) in Processes multiprocessing.set_start_method("spawn") if sys.platform == "win32": # Ensure we get the app icon in windows taskbar import ctypes ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID( "jopohl.urh") if settings.read("MainController/geometry", type=bytes): main_window.show() else: main_window.showMaximized() if "autoclose" in sys.argv[1:]: # Autoclose after 1 second, this is useful for automated testing timer = QTimer() timer.timeout.connect(app.quit) timer.start(1000) return_code = app.exec_() app.closeAllWindows() os._exit( return_code ) # sys.exit() is not enough on Windows and will result in crash on exit