def outputContextMenu(self, listview: QListView, pos: QPoint): current_model = listview.model() menu = QMenu() edit_action = QAction( "Edit clicked" if len(listview.selectedIndexes()) > 1 else "Edit", menu) edit_action.triggered.connect(self.editCurrentTarget) menu.addAction(edit_action) delete_action = QAction("Remove", menu) delete_action.triggered.connect(lambda: current_model.__delitem__( [i.row() for i in listview.selectedIndexes()])) menu.addAction(delete_action) selected_istemp = current_model[ listview.currentIndex().row()].temporary mark_temp_action = QAction("Mark temp", menu) mark_temp_action.setCheckable(True) mark_temp_action.setChecked(selected_istemp) mark_temp_action.triggered.connect(lambda: [ current_model[i.row()].switch_temporary(not selected_istemp) for i in listview.selectedIndexes() ]) menu.addAction(mark_temp_action) self.addTargetActions(menu) menu.exec_(listview.mapToGlobal(pos))
def refreshMenusButtonsStatusBar(self, reset: bool = False) -> None: if not self._database: self.statusLabel.setText('No database opened') else: protein = f'{self._database.proteins_count} protein{"s" if self._database.proteins_count > 1 else ""}' sequence = f'{self._database.sequences_count} sequence{"s" if self._database.sequences_count > 1 else ""}' self.statusLabel.setText(', '.join( (str(self._database.path), protein, sequence))) if reset: self.proteinsSearchLineEdit.setText('') self.proteinsTableWidget.setRowCount(0) database_opened = bool(self._database) digestions_available = database_opened and bool( self._database.available_digestions) database_is_coherent = database_opened and bool( self._database.is_coherent_with_enzymes_collection) self.mainSplitter.setEnabled(database_opened) self.mainSplitterBottomWidget.setVisible(digestions_available) self.databaseMenu.setEnabled(database_opened and database_is_coherent) self.workingDigestionMenu.setEnabled(digestions_available) if digestions_available: if self._working_digestion_action_group.actions(): current_digestion_settings = self._working_digestion_action_group.checkedAction( ).data() else: current_digestion_settings = None new_digestion_settings = None for action in self._working_digestion_action_group.actions(): self._working_digestion_action_group.removeAction(action) action.deleteLater() for i, digestion in enumerate(self.database.available_digestions): action_title = ( f'{digestion.enzyme} - {digestion.missed_cleavages} missed cleavage' f'{"s" if digestion.missed_cleavages > 1 else ""}') # Adding action to working digestion menu action = QAction(action_title, self._working_digestion_action_group) action.setCheckable(True) action.setData(digestion) self.workingDigestionMenu.addAction(action) if digestion == current_digestion_settings or not i: new_digestion_settings = digestion action.setChecked(True) # Refreshing if needed if current_digestion_settings != new_digestion_settings: self.refreshPeptidesTableWidget()
def createLanguageMenu(self): langPath = get_app_path() + Setup.LANG_PATH + os.sep langDirectory = QDir(langPath) for language_file in langDirectory.entryList(['*.qm']): language_code = language_file.split('.')[0] language = QLocale.languageToString(QLocale(language_code).language()) language_icon = QIcon(langPath + language_code + '.png') action = QAction(language_icon, language, self) action.setCheckable(True) action.setData(language_code) self.menuLanguage.addAction(action) self.langGroup.addAction(action)
def __init__(self): super(MainWindow, self).__init__() self.setWindowTitle("My App") label = QLabel("Hello!") label.setAlignment(Qt.AlignCenter) self.setCentralWidget(label) toolbar = QToolBar("My main toolbar") self.addToolBar(toolbar) button_action = QAction("Your button", self) button_action.setStatusTip("This is your button") button_action.triggered.connect(self.onMyToolBarButtonClick) button_action.setCheckable(True) toolbar.addAction(button_action) self.setStatusBar(QStatusBar(self))
class UIBuilder(object): """Constructs the UI for a main application window""" def setup(self, main_window: QMainWindow) -> None: """ Initialize the UI. :param main_window: An instance of the `QMainWindow` class. :type main_window: :class:`QMainWindow` """ main_window.setObjectName("main_window") main_window.setWindowTitle("TeaseAI") main_window.resize(1137, 751) main_window.setSizePolicy(*EXP_EXP) main_window.setTabShape(QTabWidget.Rounded) self.menubar = QMenuBar(main_window) self.menubar.setObjectName("menubar") self.menubar.setGeometry(0, 0, 1137, 23) self.file_menu = QMenu("File", self.menubar) self.file_menu.setObjectName("file_men") self.server_menu = QMenu("Server", self.menubar) self.server_menu.setObjectName("server_men") self.options_menu = QMenu("Options", self.menubar) self.options_menu.setObjectName("options_men") self.media_menu = QMenu("Media", self.menubar) self.media_menu.setObjectName("media_men") main_window.setMenuBar(self.menubar) self.exit = QAction("Exit", main_window) self.exit.setObjectName("exit") self.start_server = QAction("Start Server", main_window) self.start_server.setObjectName("start_server") self.connect_server = QAction("Connect to Server", main_window) self.connect_server.setObjectName("connect_server") self.kill_server = QAction("Kill Server", main_window) self.kill_server.setObjectName("kill_server") self.options = QAction("Options", main_window) self.options.setObjectName("options") self.start_webcam = QAction("Start Webcam", main_window) self.start_webcam.setObjectName("start_webcam") self.start_webcam.setCheckable(False) self.centralwidget = QWidget(main_window) self.centralwidget.setObjectName("centralwidget") self.centralwidget.setContentsMargins(QMargins(0, 0, 0, 0)) self.centralwidget.setSizePolicy(*EXP_EXP) self.grid_layout = QGridLayout(self.centralwidget) self.media = QFrame(self.centralwidget) self.media.setObjectName("media") self.media.setSizePolicy(*EXP_EXP) self.media.setMinimumSize(200, 200) self.media.setStyleSheet("background: #000;") self.grid_layout.addWidget(self.media, 0, 0, 5, 1) self.users_label = QLabel(" Online users:", self.centralwidget) self.users_label.setObjectName("users_label") self.users_label.setMinimumSize(300, 15) self.users_label.setMaximumSize(300, 15) self.grid_layout.addWidget(self.users_label, 0, 1, 1, 2) self.online = QPlainTextEdit("", self.centralwidget) self.online.setObjectName("online") self.online.setSizePolicy(*FIX_FIX) self.online.setMinimumSize(300, 50) self.online.setMaximumSize(300, 50) self.online.setStyleSheet("margin-left: 3px;" + SUNKEN) self.online.setLineWidth(2) self.online.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.online.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.online.setSizeAdjustPolicy(QAbstractScrollArea.AdjustIgnored) self.online.setReadOnly(True) self.grid_layout.addWidget(self.online, 1, 1, 1, 2) self.chat = QPlainTextEdit("", self.centralwidget) self.chat.setObjectName("chat") self.chat.setSizePolicy(*FIX_EXP) self.chat.setMinimumSize(300, 0) self.chat.setMaximumSize(300, INFINITE) self.chat.setStyleSheet("margin-bottom: 3px; margin-top: 8px;" + SUNKEN) self.chat.setLineWidth(2) self.chat.setReadOnly(True) self.chat.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.grid_layout.addWidget(self.chat, 2, 1, 1, 2) self.input = QLineEdit(self.centralwidget) self.input.setObjectName("input") self.input.setSizePolicy(*FIX_FIX) self.input.setMinimumSize(224, 30) self.input.setMaximumSize(224, 30) self.input.setStyleSheet(SUNKEN) self.input.setEchoMode(QLineEdit.Normal) self.input.setClearButtonEnabled(True) self.grid_layout.addWidget(self.input, 3, 1, 1, 1) self.submit = QPushButton("Submit", self.centralwidget) self.submit.setObjectName("submit") self.submit.setSizePolicy(*FIX_FIX) self.submit.setMinimumSize(70, 30) self.submit.setMaximumSize(70, 30) self.grid_layout.addWidget(self.submit, 3, 2, 1, 1) self.tabs = QTabWidget(self.centralwidget) self.tabs.setObjectName("tabs") self.tabs.setSizePolicy(*FIX_FIX) self.tabs.setMinimumSize(300, 150) self.tabs.setMaximumSize(300, 150) self.tab = QWidget() self.tab.setObjectName("tab") self.tabs.addTab(self.tab, "Actions") self.tab2 = QWidget() self.tab2.setObjectName("tab2") self.tabs.addTab(self.tab2, "My Media") self.tab3 = QWidget() self.tab3.setObjectName("tab3") self.tab3.setSizePolicy(*FIX_FIX) self.grid_layout2 = QGridLayout(self.tab3) self.grid_layout2.setHorizontalSpacing(0) self.grid_layout2.setVerticalSpacing(3) self.grid_layout2.setContentsMargins(3, -1, 3, -1) self.server_folder = QLineEdit(self.tab3) self.server_folder.setObjectName("server_folder") self.grid_layout2.addWidget(self.server_folder, 0, 0, 1, 3) self.srv_browse = QPushButton("BROWSE", self.tab3) self.srv_browse.setObjectName("srv_browse") self.srv_browse.setStyleSheet("background: transparent;\n" " color: #4d4940;\n" " font-size: 8pt;\n" " font-weight: 450;\n" " padding: 6px;\n") self.grid_layout2.addWidget(self.srv_browse, 0, 3, 1, 1) self.back_button = QPushButton("", self.tab3) self.back_button.setObjectName("back_button") self.back_button.setSizePolicy(*FIX_FIX) self.back_button.setMaximumSize(SEVENTY_FIVE) self.back_button.setCursor(QCursor(Qt.PointingHandCursor)) self.back_button.setStyleSheet("border: 0;\n" "background: transparent;") icon = QIcon() icon.addFile(":/newPrefix/back_button.png", SIXTY_FOUR, QIcon.Normal, QIcon.Off) self.back_button.setIcon(icon) self.back_button.setIconSize(SIXTY_FOUR) self.grid_layout2.addWidget(self.back_button, 1, 0, 1, 1) self.play_button = QPushButton("", self.tab3) self.play_button.setObjectName("play_button") self.play_button.setSizePolicy(*FIX_FIX) self.play_button.setMaximumSize(SEVENTY_FIVE) self.play_button.setCursor(QCursor(Qt.PointingHandCursor)) self.play_button.setStyleSheet("border: 0;\n" "background: transparent;") icon1 = QIcon() icon1.addFile(":/newPrefix/play_button.png", SIXTY_FOUR, QIcon.Normal, QIcon.Off) self.play_button.setIcon(icon1) self.play_button.setIconSize(SIXTY_FOUR) self.grid_layout2.addWidget(self.play_button, 1, 1, 1, 1) self.stop_button = QPushButton("", self.tab3) self.stop_button.setObjectName("stop_button") self.stop_button.setSizePolicy(*FIX_FIX) self.stop_button.setMaximumSize(SEVENTY_FIVE) self.stop_button.setCursor(QCursor(Qt.PointingHandCursor)) self.stop_button.setStyleSheet("border: 0;\n" "background: transparent;") icon2 = QIcon() icon2.addFile(":/newPrefix/stop_button.png", SIXTY_FOUR, QIcon.Normal, QIcon.Off) self.stop_button.setIcon(icon2) self.stop_button.setIconSize(SIXTY_FOUR) self.grid_layout2.addWidget(self.stop_button, 1, 2, 1, 1) self.fast_forward = QPushButton("", self.tab3) self.fast_forward.setObjectName("fast_forward") self.fast_forward.setSizePolicy(*FIX_FIX) self.fast_forward.setMaximumSize(SEVENTY_FIVE) self.fast_forward.setCursor(QCursor(Qt.PointingHandCursor)) self.fast_forward.setStyleSheet("border: 0;\n" "background: transparent;") icon3 = QIcon() icon3.addFile(":/newPrefix/fast_forward.png", SIXTY_FOUR, QIcon.Normal, QIcon.Off) self.fast_forward.setIcon(icon3) self.fast_forward.setIconSize(SIXTY_FOUR) self.grid_layout2.addWidget(self.fast_forward, 1, 3, 1, 1) self.tabs.addTab(self.tab3, "Server Media") self.grid_layout.addWidget(self.tabs, 4, 1, 1, 2) main_window.setCentralWidget(self.centralwidget) self.statusbar = QStatusBar(main_window) self.statusbar.setObjectName("statusbar") self.statusbar.setEnabled(True) self.statusbar.setStyleSheet("margin-bottom: 5px;") self.statusbar.setSizePolicy(*EXP_FIX) self.statusbar.setMinimumSize(INFINITE, 30) self.statusbar.setMaximumSize(INFINITE, 30) self.statusbar.setSizeGripEnabled(False) main_window.setStatusBar(self.statusbar) self.menubar.addAction(self.file_menu.menuAction()) self.menubar.addAction(self.server_menu.menuAction()) self.menubar.addAction(self.options_menu.menuAction()) self.menubar.addAction(self.media_menu.menuAction()) self.file_menu.addAction(self.exit) self.server_menu.addAction(self.start_server) self.server_menu.addAction(self.connect_server) self.server_menu.addAction(self.kill_server) self.options_menu.addAction(self.options) self.media_menu.addAction(self.start_webcam) self.exit.triggered.connect(main_window.close) self.tabs.setCurrentIndex(0) QMetaObject.connectSlotsByName(main_window) self.exit.setStatusTip("Exit the program.") self.start_server.setStatusTip("Initialize a local server instance.") self.connect_server.setStatusTip("Connect to a remote server.") self.kill_server.setStatusTip("Shut down a running local server.") self.options.setStatusTip("Open the options menu.") self.start_webcam.setStatusTip("Start webcam feed.") self.tooltip = QLabel("", self.statusbar) tooltip_policy = QSizePolicy(*EXP_FIX) tooltip_policy.setHorizontalStretch(100) self.tooltip.setSizePolicy(tooltip_policy) self.tooltip.setMinimumSize(INFINITE, 26) self.tooltip.setMaximumSize(INFINITE, 26) self.server_status = QLabel("Server status:", self.statusbar) self.server_status.setSizePolicy(*FIX_FIX) self.server_status.setMinimumSize(300, 26) self.server_status.setMaximumSize(300, 26) self.client_status = QLabel("Client status:", self.statusbar) self.client_status.setSizePolicy(*FIX_FIX) self.client_status.setMinimumSize(302, 26) self.client_status.setMaximumSize(302, 26) self.statusbar.addPermanentWidget(self.tooltip) self.statusbar.addPermanentWidget(self.server_status) self.statusbar.addPermanentWidget(self.client_status) self.tooltip.setStyleSheet(SUNKEN + "margin-left: 4px;\ margin-right: 0px;") self.client_status.setStyleSheet(SUNKEN + "margin-right: 7px;") self.server_status.setStyleSheet(SUNKEN + "margin-right: 2px;\ margin-left: 2px;") self.statusbar.messageChanged.connect(main_window.status_tip)
class MainWindow_Ui(QMainWindow): def __init__(self, persepolis_setting): super().__init__() # MainWindow self.persepolis_setting = persepolis_setting # add support for other languages locale = str(self.persepolis_setting.value('settings/locale')) QLocale.setDefault(QLocale(locale)) self.translator = QTranslator() if self.translator.load(':/translations/locales/ui_' + locale, 'ts'): QCoreApplication.installTranslator(self.translator) # set ui direction ui_direction = self.persepolis_setting.value('ui_direction') if ui_direction == 'rtl': self.setLayoutDirection(Qt.RightToLeft) elif ui_direction in 'ltr': self.setLayoutDirection(Qt.LeftToRight) icons = ':/' + \ str(self.persepolis_setting.value('settings/icons')) + '/' self.setWindowTitle( QCoreApplication.translate("mainwindow_ui_tr", "Persepolis Download Manager")) self.setWindowIcon( QIcon.fromTheme('persepolis', QIcon(':/persepolis.svg'))) self.centralwidget = QWidget(self) self.verticalLayout = QVBoxLayout(self.centralwidget) # enable drag and drop self.setAcceptDrops(True) # frame self.frame = QFrame(self.centralwidget) # download_table_horizontalLayout download_table_horizontalLayout = QHBoxLayout() horizontal_splitter = QSplitter(Qt.Horizontal) vertical_splitter = QSplitter(Qt.Vertical) # category_tree self.category_tree_qwidget = QWidget(self) category_tree_verticalLayout = QVBoxLayout() self.category_tree = CategoryTreeView(self) category_tree_verticalLayout.addWidget(self.category_tree) self.category_tree_model = QStandardItemModel() self.category_tree.setModel(self.category_tree_model) category_table_header = [ QCoreApplication.translate("mainwindow_ui_tr", 'Category') ] self.category_tree_model.setHorizontalHeaderLabels( category_table_header) self.category_tree.header().setStretchLastSection(True) self.category_tree.header().setDefaultAlignment(Qt.AlignCenter) # queue_panel self.queue_panel_widget = QWidget(self) queue_panel_verticalLayout_main = QVBoxLayout(self.queue_panel_widget) # queue_panel_show_button self.queue_panel_show_button = QPushButton(self) queue_panel_verticalLayout_main.addWidget(self.queue_panel_show_button) # queue_panel_widget_frame self.queue_panel_widget_frame = QFrame(self) self.queue_panel_widget_frame.setFrameShape(QFrame.StyledPanel) self.queue_panel_widget_frame.setFrameShadow(QFrame.Raised) queue_panel_verticalLayout_main.addWidget( self.queue_panel_widget_frame) queue_panel_verticalLayout = QVBoxLayout(self.queue_panel_widget_frame) queue_panel_verticalLayout_main.setContentsMargins(50, -1, 50, -1) # start_end_frame self.start_end_frame = QFrame(self) # start time start_verticalLayout = QVBoxLayout(self.start_end_frame) self.start_checkBox = QCheckBox(self) start_verticalLayout.addWidget(self.start_checkBox) self.start_frame = QFrame(self) self.start_frame.setFrameShape(QFrame.StyledPanel) self.start_frame.setFrameShadow(QFrame.Raised) start_frame_verticalLayout = QVBoxLayout(self.start_frame) self.start_time_qDataTimeEdit = MyQDateTimeEdit(self.start_frame) self.start_time_qDataTimeEdit.setDisplayFormat('H:mm') start_frame_verticalLayout.addWidget(self.start_time_qDataTimeEdit) start_verticalLayout.addWidget(self.start_frame) # end time self.end_checkBox = QCheckBox(self) start_verticalLayout.addWidget(self.end_checkBox) self.end_frame = QFrame(self) self.end_frame.setFrameShape(QFrame.StyledPanel) self.end_frame.setFrameShadow(QFrame.Raised) end_frame_verticalLayout = QVBoxLayout(self.end_frame) self.end_time_qDateTimeEdit = MyQDateTimeEdit(self.end_frame) self.end_time_qDateTimeEdit.setDisplayFormat('H:mm') end_frame_verticalLayout.addWidget(self.end_time_qDateTimeEdit) start_verticalLayout.addWidget(self.end_frame) self.reverse_checkBox = QCheckBox(self) start_verticalLayout.addWidget(self.reverse_checkBox) queue_panel_verticalLayout.addWidget(self.start_end_frame) # limit_after_frame self.limit_after_frame = QFrame(self) # limit_checkBox limit_verticalLayout = QVBoxLayout(self.limit_after_frame) self.limit_checkBox = QCheckBox(self) limit_verticalLayout.addWidget(self.limit_checkBox) # limit_frame self.limit_frame = QFrame(self) self.limit_frame.setFrameShape(QFrame.StyledPanel) self.limit_frame.setFrameShadow(QFrame.Raised) limit_verticalLayout.addWidget(self.limit_frame) limit_frame_verticalLayout = QVBoxLayout(self.limit_frame) # limit_spinBox limit_frame_horizontalLayout = QHBoxLayout() self.limit_spinBox = QDoubleSpinBox(self) self.limit_spinBox.setMinimum(1) self.limit_spinBox.setMaximum(1023) limit_frame_horizontalLayout.addWidget(self.limit_spinBox) # limit_comboBox self.limit_comboBox = QComboBox(self) self.limit_comboBox.addItem("") self.limit_comboBox.addItem("") limit_frame_horizontalLayout.addWidget(self.limit_comboBox) limit_frame_verticalLayout.addLayout(limit_frame_horizontalLayout) # limit_pushButton self.limit_pushButton = QPushButton(self) limit_frame_verticalLayout.addWidget(self.limit_pushButton) # after_checkBox self.after_checkBox = QCheckBox(self) limit_verticalLayout.addWidget(self.after_checkBox) # after_frame self.after_frame = QFrame(self) self.after_frame.setFrameShape(QFrame.StyledPanel) self.after_frame.setFrameShadow(QFrame.Raised) limit_verticalLayout.addWidget(self.after_frame) after_frame_verticalLayout = QVBoxLayout(self.after_frame) # after_comboBox self.after_comboBox = QComboBox(self) self.after_comboBox.addItem("") after_frame_verticalLayout.addWidget(self.after_comboBox) # after_pushButton self.after_pushButton = QPushButton(self) after_frame_verticalLayout.addWidget(self.after_pushButton) queue_panel_verticalLayout.addWidget(self.limit_after_frame) category_tree_verticalLayout.addWidget(self.queue_panel_widget) # keep_awake_checkBox self.keep_awake_checkBox = QCheckBox(self) queue_panel_verticalLayout.addWidget(self.keep_awake_checkBox) self.category_tree_qwidget.setLayout(category_tree_verticalLayout) horizontal_splitter.addWidget(self.category_tree_qwidget) # download table widget self.download_table_content_widget = QWidget(self) download_table_content_widget_verticalLayout = QVBoxLayout( self.download_table_content_widget) # download_table self.download_table = DownloadTableWidget(self) vertical_splitter.addWidget(self.download_table) horizontal_splitter.addWidget(self.download_table_content_widget) self.download_table.setColumnCount(13) self.download_table.setSelectionBehavior(QAbstractItemView.SelectRows) self.download_table.setEditTriggers(QAbstractItemView.NoEditTriggers) self.download_table.verticalHeader().hide() # hide column of GID and column of link. self.download_table.setColumnHidden(8, True) self.download_table.setColumnHidden(9, True) download_table_header = [ QCoreApplication.translate("mainwindow_ui_tr", 'File Name'), QCoreApplication.translate("mainwindow_ui_tr", 'Status'), QCoreApplication.translate("mainwindow_ui_tr", 'Size'), QCoreApplication.translate("mainwindow_ui_tr", 'Downloaded'), QCoreApplication.translate("mainwindow_ui_tr", 'Percentage'), QCoreApplication.translate("mainwindow_ui_tr", 'Connections'), QCoreApplication.translate("mainwindow_ui_tr", 'Transfer Rate'), QCoreApplication.translate("mainwindow_ui_tr", 'Estimated Time Left'), 'Gid', QCoreApplication.translate("mainwindow_ui_tr", 'Link'), QCoreApplication.translate("mainwindow_ui_tr", 'First Try Date'), QCoreApplication.translate("mainwindow_ui_tr", 'Last Try Date'), QCoreApplication.translate("mainwindow_ui_tr", 'Category') ] self.download_table.setHorizontalHeaderLabels(download_table_header) # fixing the size of download_table when window is Maximized! self.download_table.horizontalHeader().setSectionResizeMode( QHeaderView.ResizeMode.Interactive) self.download_table.horizontalHeader().setStretchLastSection(True) horizontal_splitter.setStretchFactor(0, 3) # category_tree width horizontal_splitter.setStretchFactor(1, 10) # ratio of tables's width # video_finder_widget self.video_finder_widget = QWidget(self) video_finder_horizontalLayout = QHBoxLayout(self.video_finder_widget) self.muxing_pushButton = QPushButton(self) self.muxing_pushButton.setIcon(QIcon(icons + 'video_finder')) video_finder_horizontalLayout.addWidget(self.muxing_pushButton) video_finder_horizontalLayout.addSpacing(20) video_audio_verticalLayout = QVBoxLayout() self.video_label = QLabel(self) video_audio_verticalLayout.addWidget(self.video_label) self.audio_label = QLabel(self) video_audio_verticalLayout.addWidget(self.audio_label) video_finder_horizontalLayout.addLayout(video_audio_verticalLayout) status_muxing_verticalLayout = QVBoxLayout() self.video_finder_status_label = QLabel(self) status_muxing_verticalLayout.addWidget(self.video_finder_status_label) self.muxing_status_label = QLabel(self) status_muxing_verticalLayout.addWidget(self.muxing_status_label) video_finder_horizontalLayout.addLayout(status_muxing_verticalLayout) vertical_splitter.addWidget(self.video_finder_widget) download_table_content_widget_verticalLayout.addWidget( vertical_splitter) download_table_horizontalLayout.addWidget(horizontal_splitter) self.frame.setLayout(download_table_horizontalLayout) self.verticalLayout.addWidget(self.frame) self.setCentralWidget(self.centralwidget) # menubar self.menubar = QMenuBar(self) self.menubar.setGeometry(QRect(0, 0, 600, 24)) self.setMenuBar(self.menubar) fileMenu = self.menubar.addMenu( QCoreApplication.translate("mainwindow_ui_tr", '&File')) editMenu = self.menubar.addMenu( QCoreApplication.translate("mainwindow_ui_tr", '&Edit')) viewMenu = self.menubar.addMenu( QCoreApplication.translate("mainwindow_ui_tr", '&View')) downloadMenu = self.menubar.addMenu( QCoreApplication.translate("mainwindow_ui_tr", '&Download')) queueMenu = self.menubar.addMenu( QCoreApplication.translate("mainwindow_ui_tr", '&Queue')) videoFinderMenu = self.menubar.addMenu( QCoreApplication.translate("mainwindow_ui_tr", 'V&ideo Finder')) helpMenu = self.menubar.addMenu( QCoreApplication.translate("mainwindow_ui_tr", '&Help')) # viewMenu submenus sortMenu = viewMenu.addMenu( QCoreApplication.translate("mainwindow_ui_tr", 'Sort by')) # statusbar self.statusbar = QStatusBar(self) self.setStatusBar(self.statusbar) self.statusbar.showMessage( QCoreApplication.translate("mainwindow_ui_tr", "Persepolis Download Manager")) # toolBar self.toolBar2 = QToolBar(self) self.addToolBar(Qt.TopToolBarArea, self.toolBar2) self.toolBar2.setWindowTitle( QCoreApplication.translate("mainwindow_ui_tr", 'Menu')) self.toolBar2.setFloatable(False) self.toolBar2.setMovable(False) self.toolBar = QToolBar(self) self.addToolBar(Qt.TopToolBarArea, self.toolBar) self.toolBar.setWindowTitle( QCoreApplication.translate("mainwindow_ui_tr", 'Toolbar')) self.toolBar.setFloatable(False) self.toolBar.setMovable(False) #toolBar and menubar and actions self.persepolis_setting.beginGroup('settings/shortcuts') # videoFinderAddLinkAction self.videoFinderAddLinkAction = QAction( QIcon(icons + 'video_finder'), QCoreApplication.translate("mainwindow_ui_tr", 'Find Video Links...'), self, statusTip=QCoreApplication.translate( "mainwindow_ui_tr", 'Download video or audio from Youtube, Vimeo, etc.'), triggered=self.showVideoFinderAddLinkWindow) self.videoFinderAddLinkAction_shortcut = QShortcut( self.persepolis_setting.value('video_finder_shortcut'), self, self.showVideoFinderAddLinkWindow) videoFinderMenu.addAction(self.videoFinderAddLinkAction) # stopAllAction self.stopAllAction = QAction(QIcon(icons + 'stop_all'), QCoreApplication.translate( "mainwindow_ui_tr", 'Stop All Active Downloads'), self, statusTip='Stop All Active Downloads', triggered=self.stopAllDownloads) downloadMenu.addAction(self.stopAllAction) # sort_file_name_Action self.sort_file_name_Action = QAction(QCoreApplication.translate( "mainwindow_ui_tr", 'File Name'), self, triggered=self.sortByName) sortMenu.addAction(self.sort_file_name_Action) # sort_file_size_Action self.sort_file_size_Action = QAction(QCoreApplication.translate( "mainwindow_ui_tr", 'File Size'), self, triggered=self.sortBySize) sortMenu.addAction(self.sort_file_size_Action) # sort_first_try_date_Action self.sort_first_try_date_Action = QAction( QCoreApplication.translate("mainwindow_ui_tr", 'First Try Date'), self, triggered=self.sortByFirstTry) sortMenu.addAction(self.sort_first_try_date_Action) # sort_last_try_date_Action self.sort_last_try_date_Action = QAction(QCoreApplication.translate( "mainwindow_ui_tr", 'Last Try Date'), self, triggered=self.sortByLastTry) sortMenu.addAction(self.sort_last_try_date_Action) # sort_download_status_Action self.sort_download_status_Action = QAction(QCoreApplication.translate( "mainwindow_ui_tr", 'Download Status'), self, triggered=self.sortByStatus) sortMenu.addAction(self.sort_download_status_Action) # trayAction self.trayAction = QAction( QCoreApplication.translate("mainwindow_ui_tr", 'Show System Tray Icon'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Show/Hide system tray icon"), triggered=self.showTray) self.trayAction.setCheckable(True) viewMenu.addAction(self.trayAction) # showMenuBarAction self.showMenuBarAction = QAction( QCoreApplication.translate("mainwindow_ui_tr", 'Show Menubar'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Show Menubar'), triggered=self.showMenuBar) self.showMenuBarAction.setCheckable(True) viewMenu.addAction(self.showMenuBarAction) # showSidePanelAction self.showSidePanelAction = QAction( QCoreApplication.translate("mainwindow_ui_tr", 'Show Side Panel'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Show Side Panel'), triggered=self.showSidePanel) self.showSidePanelAction.setCheckable(True) viewMenu.addAction(self.showSidePanelAction) # minimizeAction self.minimizeAction = QAction( QIcon(icons + 'minimize'), QCoreApplication.translate("mainwindow_ui_tr", 'Minimize to System Tray'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Minimize to System Tray"), triggered=self.minMaxTray) self.minimizeAction_shortcut = QShortcut( self.persepolis_setting.value('hide_window_shortcut'), self, self.minMaxTray) viewMenu.addAction(self.minimizeAction) # addlinkAction self.addlinkAction = QAction( QIcon(icons + 'add'), QCoreApplication.translate("mainwindow_ui_tr", 'Add New Download Link...'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Add New Download Link"), triggered=self.addLinkButtonPressed) self.addlinkAction_shortcut = QShortcut( self.persepolis_setting.value('add_new_download_shortcut'), self, self.addLinkButtonPressed) fileMenu.addAction(self.addlinkAction) # importText self.addtextfileAction = QAction( QIcon(icons + 'file'), QCoreApplication.translate("mainwindow_ui_tr", 'Import Links from Text File...'), self, statusTip=QCoreApplication.translate( "mainwindow_ui_tr", 'Create a text file and put links in it, line by line!'), triggered=self.importText) self.addtextfileAction_shortcut = QShortcut( self.persepolis_setting.value('import_text_shortcut'), self, self.importText) fileMenu.addAction(self.addtextfileAction) # resumeAction self.resumeAction = QAction( QIcon(icons + 'play'), QCoreApplication.translate("mainwindow_ui_tr", 'Resume Download'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Resume Download"), triggered=self.resumeButtonPressed) downloadMenu.addAction(self.resumeAction) # pauseAction self.pauseAction = QAction( QIcon(icons + 'pause'), QCoreApplication.translate("mainwindow_ui_tr", 'Pause Download'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Pause Download"), triggered=self.pauseButtonPressed) downloadMenu.addAction(self.pauseAction) # stopAction self.stopAction = QAction( QIcon(icons + 'stop'), QCoreApplication.translate("mainwindow_ui_tr", 'Stop Download'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Stop/Cancel Download"), triggered=self.stopButtonPressed) downloadMenu.addAction(self.stopAction) # propertiesAction self.propertiesAction = QAction( QIcon(icons + 'setting'), QCoreApplication.translate("mainwindow_ui_tr", 'Properties'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Properties"), triggered=self.propertiesButtonPressed) downloadMenu.addAction(self.propertiesAction) # progressAction self.progressAction = QAction( QIcon(icons + 'window'), QCoreApplication.translate("mainwindow_ui_tr", 'Progress'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Progress"), triggered=self.progressButtonPressed) downloadMenu.addAction(self.progressAction) # openFileAction self.openFileAction = QAction( QIcon(icons + 'file'), QCoreApplication.translate("mainwindow_ui_tr", 'Open File...'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Open File...'), triggered=self.openFile) fileMenu.addAction(self.openFileAction) # openDownloadFolderAction self.openDownloadFolderAction = QAction( QIcon(icons + 'folder'), QCoreApplication.translate("mainwindow_ui_tr", 'Open Download Folder'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Open Download Folder'), triggered=self.openDownloadFolder) fileMenu.addAction(self.openDownloadFolderAction) # openDefaultDownloadFolderAction self.openDefaultDownloadFolderAction = QAction( QIcon(icons + 'folder'), QCoreApplication.translate("mainwindow_ui_tr", 'Open Default Download Folder'), self, statusTip=QCoreApplication.translate( "mainwindow_ui_tr", 'Open Default Download Folder'), triggered=self.openDefaultDownloadFolder) fileMenu.addAction(self.openDefaultDownloadFolderAction) # exitAction self.exitAction = QAction( QIcon(icons + 'exit'), QCoreApplication.translate("mainwindow_ui_tr", 'Exit'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", "Exit"), triggered=self.closeAction) self.exitAction_shortcut = QShortcut( self.persepolis_setting.value('quit_shortcut'), self, self.closeAction) fileMenu.addAction(self.exitAction) # clearAction self.clearAction = QAction(QIcon(icons + 'multi_remove'), QCoreApplication.translate( "mainwindow_ui_tr", 'Clear Download List'), self, statusTip=QCoreApplication.translate( "mainwindow_ui_tr", 'Clear all items in download list'), triggered=self.clearDownloadList) editMenu.addAction(self.clearAction) # removeSelectedAction self.removeSelectedAction = QAction( QIcon(icons + 'remove'), QCoreApplication.translate("mainwindow_ui_tr", 'Remove Selected Downloads from List'), self, statusTip=QCoreApplication.translate( "mainwindow_ui_tr", 'Remove Selected Downloads from List'), triggered=self.removeSelected) self.removeSelectedAction_shortcut = QShortcut( self.persepolis_setting.value('remove_shortcut'), self, self.removeSelected) editMenu.addAction(self.removeSelectedAction) self.removeSelectedAction.setEnabled(False) # deleteSelectedAction self.deleteSelectedAction = QAction( QIcon(icons + 'trash'), QCoreApplication.translate("mainwindow_ui_tr", 'Delete Selected Download Files'), self, statusTip=QCoreApplication.translate( "mainwindow_ui_tr", 'Delete Selected Download Files'), triggered=self.deleteSelected) self.deleteSelectedAction_shortcut = QShortcut( self.persepolis_setting.value('delete_shortcut'), self, self.deleteSelected) editMenu.addAction(self.deleteSelectedAction) self.deleteSelectedAction.setEnabled(False) # moveSelectedDownloadsAction self.moveSelectedDownloadsAction = QAction( QIcon(icons + 'folder'), QCoreApplication.translate( "mainwindow_ui_tr", 'Move Selected Download Files to Another Folder...'), self, statusTip=QCoreApplication.translate( "mainwindow_ui_tr", 'Move Selected Download Files to Another Folder'), triggered=self.moveSelectedDownloads) editMenu.addAction(self.moveSelectedDownloadsAction) self.moveSelectedDownloadsAction.setEnabled(False) # createQueueAction self.createQueueAction = QAction( QIcon(icons + 'add_queue'), QCoreApplication.translate("mainwindow_ui_tr", 'Create New Queue...'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Create new download queue'), triggered=self.createQueue) queueMenu.addAction(self.createQueueAction) # removeQueueAction self.removeQueueAction = QAction( QIcon(icons + 'remove_queue'), QCoreApplication.translate("mainwindow_ui_tr", 'Remove Queue'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Remove this queue'), triggered=self.removeQueue) queueMenu.addAction(self.removeQueueAction) # startQueueAction self.startQueueAction = QAction( QIcon(icons + 'start_queue'), QCoreApplication.translate("mainwindow_ui_tr", 'Start this queue'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Start Queue'), triggered=self.startQueue) queueMenu.addAction(self.startQueueAction) # stopQueueAction self.stopQueueAction = QAction( QIcon(icons + 'stop_queue'), QCoreApplication.translate("mainwindow_ui_tr", 'Stop this queue'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Stop Queue'), triggered=self.stopQueue) queueMenu.addAction(self.stopQueueAction) # moveUpSelectedAction self.moveUpSelectedAction = QAction( QIcon(icons + 'multi_up'), QCoreApplication.translate("mainwindow_ui_tr", 'Move Selected Items Up'), self, statusTip=QCoreApplication.translate( "mainwindow_ui_tr", 'Move currently selected items up by one row'), triggered=self.moveUpSelected) self.moveUpSelectedAction_shortcut = QShortcut( self.persepolis_setting.value('move_up_selection_shortcut'), self, self.moveUpSelected) queueMenu.addAction(self.moveUpSelectedAction) # moveDownSelectedAction self.moveDownSelectedAction = QAction( QIcon(icons + 'multi_down'), QCoreApplication.translate("mainwindow_ui_tr", 'Move Selected Items Down'), self, statusTip=QCoreApplication.translate( "mainwindow_ui_tr", 'Move currently selected items down by one row'), triggered=self.moveDownSelected) self.moveDownSelectedAction_shortcut = QShortcut( self.persepolis_setting.value('move_down_selection_shortcut'), self, self.moveDownSelected) queueMenu.addAction(self.moveDownSelectedAction) # preferencesAction self.preferencesAction = QAction( QIcon(icons + 'preferences'), QCoreApplication.translate("mainwindow_ui_tr", 'Preferences'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Preferences'), triggered=self.openPreferences, menuRole=QAction.MenuRole.PreferencesRole) editMenu.addAction(self.preferencesAction) # aboutAction self.aboutAction = QAction( QIcon(icons + 'about'), QCoreApplication.translate("mainwindow_ui_tr", 'About'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'About'), triggered=self.openAbout, menuRole=QAction.MenuRole.AboutRole) helpMenu.addAction(self.aboutAction) # issueAction self.issueAction = QAction( QIcon(icons + 'about'), QCoreApplication.translate("mainwindow_ui_tr", 'Report an Issue'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Report an issue'), triggered=self.reportIssue) helpMenu.addAction(self.issueAction) # updateAction self.updateAction = QAction( QIcon(icons + 'about'), QCoreApplication.translate("mainwindow_ui_tr", 'Check for Newer Version'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Check for newer release'), triggered=self.newUpdate) helpMenu.addAction(self.updateAction) # logAction self.logAction = QAction( QIcon(icons + 'about'), QCoreApplication.translate("mainwindow_ui_tr", 'Show Log File'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Help'), triggered=self.showLog) helpMenu.addAction(self.logAction) # helpAction self.helpAction = QAction( QIcon(icons + 'about'), QCoreApplication.translate("mainwindow_ui_tr", 'Help'), self, statusTip=QCoreApplication.translate("mainwindow_ui_tr", 'Help'), triggered=self.persepolisHelp) helpMenu.addAction(self.helpAction) self.persepolis_setting.endGroup() self.qmenu = MenuWidget(self) self.toolBar2.addWidget(self.qmenu) # labels self.queue_panel_show_button.setText( QCoreApplication.translate("mainwindow_ui_tr", "Hide Options")) self.start_checkBox.setText( QCoreApplication.translate("mainwindow_ui_tr", "Start Time")) self.end_checkBox.setText( QCoreApplication.translate("mainwindow_ui_tr", "End Time")) self.reverse_checkBox.setText( QCoreApplication.translate("mainwindow_ui_tr", "Download bottom of\n the list first")) self.limit_checkBox.setText( QCoreApplication.translate("mainwindow_ui_tr", "Limit Speed")) self.limit_comboBox.setItemText(0, "KiB/s") self.limit_comboBox.setItemText(1, "MiB/s") self.limit_pushButton.setText( QCoreApplication.translate("mainwindow_ui_tr", "Apply")) self.after_checkBox.setText( QCoreApplication.translate("mainwindow_ui_tr", "After download")) self.after_comboBox.setItemText( 0, QCoreApplication.translate("mainwindow_ui_tr", "Shut Down")) self.keep_awake_checkBox.setText( QCoreApplication.translate("mainwindow_ui_tr", "Keep System Awake!")) self.keep_awake_checkBox.setToolTip( QCoreApplication.translate( "mainwindow_ui_tr", "<html><head/><body><p>This option will prevent the system from going to sleep.\ It is necessary if your power manager is suspending the system automatically. </p></body></html>" )) self.after_pushButton.setText( QCoreApplication.translate("mainwindow_ui_tr", "Apply")) self.muxing_pushButton.setText( QCoreApplication.translate("mainwindow_ui_tr", "Start Mixing")) self.video_label.setText( QCoreApplication.translate("mainwindow_ui_tr", "<b>Video File Status: </b>")) self.audio_label.setText( QCoreApplication.translate("mainwindow_ui_tr", "<b>Audio File Status: </b>")) self.video_finder_status_label.setText( QCoreApplication.translate("mainwindow_ui_tr", "<b>Status: </b>")) self.muxing_status_label.setText( QCoreApplication.translate("mainwindow_ui_tr", "<b>Mixing status: </b>"))
class Ui_MainWindow(object): def setupUi(self, MainWindow): if not MainWindow.objectName(): MainWindow.setObjectName(u"MainWindow") MainWindow.resize(1024, 768) self.actionOpen_ObjectBlueprints_xml = QAction(MainWindow) self.actionOpen_ObjectBlueprints_xml.setObjectName( u"actionOpen_ObjectBlueprints_xml") self.actionExit = QAction(MainWindow) self.actionExit.setObjectName(u"actionExit") self.actionWiki_template = QAction(MainWindow) self.actionWiki_template.setObjectName(u"actionWiki_template") self.actionWiki_template.setCheckable(True) self.actionWiki_template.setChecked(True) self.actionAttributes = QAction(MainWindow) self.actionAttributes.setObjectName(u"actionAttributes") self.actionAttributes.setCheckable(True) self.actionAll_attributes = QAction(MainWindow) self.actionAll_attributes.setObjectName(u"actionAll_attributes") self.actionAll_attributes.setCheckable(True) self.actionScan_wiki = QAction(MainWindow) self.actionScan_wiki.setObjectName(u"actionScan_wiki") self.actionUpload_templates = QAction(MainWindow) self.actionUpload_templates.setObjectName(u"actionUpload_templates") self.actionUpload_tiles = QAction(MainWindow) self.actionUpload_tiles.setObjectName(u"actionUpload_tiles") self.actionXML_source = QAction(MainWindow) self.actionXML_source.setObjectName(u"actionXML_source") self.actionXML_source.setCheckable(True) self.actionShow_help = QAction(MainWindow) self.actionShow_help.setObjectName(u"actionShow_help") self.actionUpload_extra_image_s_for_selected_objects = QAction( MainWindow) self.actionUpload_extra_image_s_for_selected_objects.setObjectName( u"actionUpload_extra_image_s_for_selected_objects") self.actionDiff_template_against_wiki = QAction(MainWindow) self.actionDiff_template_against_wiki.setObjectName( u"actionDiff_template_against_wiki") self.actionDark_mode = QAction(MainWindow) self.actionDark_mode.setObjectName(u"actionDark_mode") self.actionSuppress_image_comparison_popups = QAction(MainWindow) self.actionSuppress_image_comparison_popups.setObjectName( u"actionSuppress_image_comparison_popups") self.actionSuppress_image_comparison_popups.setCheckable(True) self.actionSuppress_image_comparison_popups.setChecked(False) self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName(u"centralwidget") self.gridLayout = QGridLayout(self.centralwidget) self.gridLayout.setObjectName(u"gridLayout") self.verticalLayout = QVBoxLayout() self.verticalLayout.setObjectName(u"verticalLayout") self.horizontalLayout = QHBoxLayout() self.horizontalLayout.setObjectName(u"horizontalLayout") self.plainTextEdit = QPlainTextEdit(self.centralwidget) self.plainTextEdit.setObjectName(u"plainTextEdit") font = QFont() font.setFamilies([u"Consolas"]) font.setPointSize(10) self.plainTextEdit.setFont(font) self.plainTextEdit.setUndoRedoEnabled(False) self.plainTextEdit.setReadOnly(True) self.horizontalLayout.addWidget(self.plainTextEdit) self.verticalLayout_4 = QVBoxLayout() self.verticalLayout_4.setObjectName(u"verticalLayout_4") self.tile_label = QLabel(self.centralwidget) self.tile_label.setObjectName(u"tile_label") self.tile_label.setMinimumSize(QSize(160, 240)) font1 = QFont() font1.setFamilies([u"Segoe UI"]) self.tile_label.setFont(font1) self.tile_label.setStyleSheet(u"background-color: rgb(15, 59, 58);") self.verticalLayout_4.addWidget(self.tile_label) self.save_tile_button = QPushButton(self.centralwidget) self.save_tile_button.setObjectName(u"save_tile_button") font2 = QFont() font2.setFamilies([u"Segoe UI"]) font2.setPointSize(10) self.save_tile_button.setFont(font2) self.verticalLayout_4.addWidget(self.save_tile_button) self.swap_tile_button = QPushButton(self.centralwidget) self.swap_tile_button.setObjectName(u"swap_tile_button") self.swap_tile_button.setEnabled(True) self.swap_tile_button.setFont(font2) self.verticalLayout_4.addWidget(self.swap_tile_button) self.horizontalLayout.addLayout(self.verticalLayout_4) self.verticalLayout.addLayout(self.horizontalLayout) self.verticalLayout_3 = QVBoxLayout() self.verticalLayout_3.setObjectName(u"verticalLayout_3") self.horizontalLayout_2 = QHBoxLayout() self.horizontalLayout_2.setObjectName(u"horizontalLayout_2") self.search_label = QLabel(self.centralwidget) self.search_label.setObjectName(u"search_label") self.search_label.setMinimumSize(QSize(0, 0)) self.search_label.setFont(font2) self.horizontalLayout_2.addWidget(self.search_label) self.search_line_edit = QLineEdit(self.centralwidget) self.search_line_edit.setObjectName(u"search_line_edit") self.search_line_edit.setFont(font2) self.horizontalLayout_2.addWidget(self.search_line_edit) self.expand_all_button = QPushButton(self.centralwidget) self.expand_all_button.setObjectName(u"expand_all_button") self.expand_all_button.setMinimumSize(QSize(90, 0)) self.expand_all_button.setFont(font2) self.horizontalLayout_2.addWidget(self.expand_all_button) self.collapse_all_button = QPushButton(self.centralwidget) self.collapse_all_button.setObjectName(u"collapse_all_button") self.collapse_all_button.setMinimumSize(QSize(90, 0)) self.collapse_all_button.setFont(font2) self.horizontalLayout_2.addWidget(self.collapse_all_button) self.restore_all_button = QPushButton(self.centralwidget) self.restore_all_button.setObjectName(u"restore_all_button") self.restore_all_button.setMinimumSize(QSize(130, 0)) self.restore_all_button.setFont(font2) self.horizontalLayout_2.addWidget(self.restore_all_button) self.verticalLayout_3.addLayout(self.horizontalLayout_2) self.tree_target_widget = QWidget(self.centralwidget) self.tree_target_widget.setObjectName(u"tree_target_widget") self.tree_target_widget.setFont(font1) self.verticalLayout_3.addWidget(self.tree_target_widget, 0, Qt.AlignBottom) self.verticalLayout.addLayout(self.verticalLayout_3) self.gridLayout.addLayout(self.verticalLayout, 0, 0, 1, 1) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setObjectName(u"menubar") self.menubar.setGeometry(QRect(0, 0, 1024, 21)) self.menuFile = QMenu(self.menubar) self.menuFile.setObjectName(u"menuFile") self.menuView = QMenu(self.menubar) self.menuView.setObjectName(u"menuView") self.menuWiki = QMenu(self.menubar) self.menuWiki.setObjectName(u"menuWiki") self.menuHelp = QMenu(self.menubar) self.menuHelp.setObjectName(u"menuHelp") MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName(u"statusbar") MainWindow.setStatusBar(self.statusbar) self.menubar.addAction(self.menuFile.menuAction()) self.menubar.addAction(self.menuView.menuAction()) self.menubar.addAction(self.menuWiki.menuAction()) self.menubar.addAction(self.menuHelp.menuAction()) self.menuFile.addAction(self.actionOpen_ObjectBlueprints_xml) self.menuFile.addAction(self.actionExit) self.menuView.addAction(self.actionWiki_template) self.menuView.addAction(self.actionAttributes) self.menuView.addAction(self.actionAll_attributes) self.menuView.addAction(self.actionXML_source) self.menuView.addSeparator() self.menuView.addAction(self.actionDark_mode) self.menuWiki.addAction(self.actionScan_wiki) self.menuWiki.addAction(self.actionDiff_template_against_wiki) self.menuWiki.addAction(self.actionUpload_templates) self.menuWiki.addAction(self.actionUpload_tiles) self.menuWiki.addAction( self.actionUpload_extra_image_s_for_selected_objects) self.menuWiki.addAction(self.actionSuppress_image_comparison_popups) self.menuHelp.addAction(self.actionShow_help) self.retranslateUi(MainWindow) QMetaObject.connectSlotsByName(MainWindow) # setupUi def retranslateUi(self, MainWindow): MainWindow.setWindowTitle( QCoreApplication.translate("MainWindow", u"Qud Blueprint Explorer", None)) self.actionOpen_ObjectBlueprints_xml.setText( QCoreApplication.translate("MainWindow", u"Open ObjectBlueprints.xml...", None)) self.actionExit.setText( QCoreApplication.translate("MainWindow", u"Exit", None)) self.actionWiki_template.setText( QCoreApplication.translate("MainWindow", u"Wiki template", None)) self.actionAttributes.setText( QCoreApplication.translate("MainWindow", u"Attributes", None)) self.actionAll_attributes.setText( QCoreApplication.translate("MainWindow", u"All attributes", None)) self.actionScan_wiki.setText( QCoreApplication.translate("MainWindow", u"Scan wiki for selected objects", None)) self.actionUpload_templates.setText( QCoreApplication.translate( "MainWindow", u"Upload templates for selected objects", None)) self.actionUpload_tiles.setText( QCoreApplication.translate("MainWindow", u"Upload tiles for selected objects", None)) self.actionXML_source.setText( QCoreApplication.translate("MainWindow", u"XML source", None)) self.actionShow_help.setText( QCoreApplication.translate("MainWindow", u"Show help", None)) self.actionUpload_extra_image_s_for_selected_objects.setText( QCoreApplication.translate( "MainWindow", u"Upload extra image(s) for selected objects", None)) self.actionDiff_template_against_wiki.setText( QCoreApplication.translate("MainWindow", u"Diff template against wiki", None)) self.actionDark_mode.setText( QCoreApplication.translate("MainWindow", u"Toggle dark mode", None)) self.actionSuppress_image_comparison_popups.setText( QCoreApplication.translate("MainWindow", u"Suppress image comparison pop-ups", None)) self.tile_label.setText("") self.save_tile_button.setText( QCoreApplication.translate("MainWindow", u"Save tile...", None)) self.swap_tile_button.setText( QCoreApplication.translate("MainWindow", u"Toggle .png/.gif", None)) self.search_label.setText( QCoreApplication.translate("MainWindow", u"Search:", None)) self.expand_all_button.setText( QCoreApplication.translate("MainWindow", u"Expand all", None)) self.collapse_all_button.setText( QCoreApplication.translate("MainWindow", u"Collapse all", None)) self.restore_all_button.setText( QCoreApplication.translate("MainWindow", u"Default expansion", None)) self.menuFile.setTitle( QCoreApplication.translate("MainWindow", u"File", None)) self.menuView.setTitle( QCoreApplication.translate("MainWindow", u"View type", None)) self.menuWiki.setTitle( QCoreApplication.translate("MainWindow", u"Wiki", None)) self.menuHelp.setTitle( QCoreApplication.translate("MainWindow", u"Help", None))
class Ui_tfm(object): def setupUi(self, tfm): if not tfm.objectName(): tfm.setObjectName(u"tfm") tfm.resize(800, 600) tfm.setContextMenuPolicy(Qt.NoContextMenu) tfm.setLocale(QLocale(QLocale.English, QLocale.UnitedStates)) self.action_menu = QAction(tfm) self.action_menu.setObjectName(u"action_menu") self.action_new_dir = QAction(tfm) self.action_new_dir.setObjectName(u"action_new_dir") self.action_new_file = QAction(tfm) self.action_new_file.setObjectName(u"action_new_file") self.action_back = QAction(tfm) self.action_back.setObjectName(u"action_back") self.action_up = QAction(tfm) self.action_up.setObjectName(u"action_up") self.action_home = QAction(tfm) self.action_home.setObjectName(u"action_home") self.action_go = QAction(tfm) self.action_go.setObjectName(u"action_go") self.action_forward = QAction(tfm) self.action_forward.setObjectName(u"action_forward") self.action_copy = QAction(tfm) self.action_copy.setObjectName(u"action_copy") self.action_paste = QAction(tfm) self.action_paste.setObjectName(u"action_paste") self.action_cut = QAction(tfm) self.action_cut.setObjectName(u"action_cut") self.action_show_hidden = QAction(tfm) self.action_show_hidden.setObjectName(u"action_show_hidden") self.action_show_hidden.setCheckable(True) self.action_delete = QAction(tfm) self.action_delete.setObjectName(u"action_delete") self.action_rename = QAction(tfm) self.action_rename.setObjectName(u"action_rename") self.action_add_to_bookmarks = QAction(tfm) self.action_add_to_bookmarks.setObjectName(u"action_add_to_bookmarks") self.action_remove_bookmark = QAction(tfm) self.action_remove_bookmark.setObjectName(u"action_remove_bookmark") self.action_copy_path = QAction(tfm) self.action_copy_path.setObjectName(u"action_copy_path") self.action_extract_here = QAction(tfm) self.action_extract_here.setObjectName(u"action_extract_here") self.action_mount_iso = QAction(tfm) self.action_mount_iso.setObjectName(u"action_mount_iso") self.centralwidget = QWidget(tfm) self.centralwidget.setObjectName(u"centralwidget") self.horizontalLayout = QHBoxLayout(self.centralwidget) self.horizontalLayout.setObjectName(u"horizontalLayout") self.vsplit = QSplitter(self.centralwidget) self.vsplit.setObjectName(u"vsplit") self.vsplit.setOrientation(Qt.Horizontal) self.hsplit = QSplitter(self.vsplit) self.hsplit.setObjectName(u"hsplit") self.hsplit.setOrientation(Qt.Vertical) self.fs_tree = QTreeView(self.hsplit) self.fs_tree.setObjectName(u"fs_tree") sizePolicy = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(1) sizePolicy.setHeightForWidth( self.fs_tree.sizePolicy().hasHeightForWidth()) self.fs_tree.setSizePolicy(sizePolicy) self.fs_tree.setTabKeyNavigation(True) self.fs_tree.setProperty("showDropIndicator", True) self.fs_tree.setDragEnabled(False) self.fs_tree.setDragDropMode(QAbstractItemView.DropOnly) self.fs_tree.setDefaultDropAction(Qt.MoveAction) self.fs_tree.setRootIsDecorated(False) self.hsplit.addWidget(self.fs_tree) self.fs_tree.header().setVisible(False) self.bookmark_view = QListView(self.hsplit) self.bookmark_view.setObjectName(u"bookmark_view") self.bookmark_view.setContextMenuPolicy(Qt.ActionsContextMenu) self.bookmark_view.setEditTriggers(QAbstractItemView.DoubleClicked | QAbstractItemView.EditKeyPressed | QAbstractItemView.SelectedClicked) self.bookmark_view.setTabKeyNavigation(True) self.bookmark_view.setDragDropOverwriteMode(True) self.bookmark_view.setDragDropMode(QAbstractItemView.DropOnly) self.bookmark_view.setDefaultDropAction(Qt.CopyAction) self.bookmark_view.setAlternatingRowColors(True) self.hsplit.addWidget(self.bookmark_view) self.mounts_view = QListView(self.hsplit) self.mounts_view.setObjectName(u"mounts_view") self.mounts_view.setTabKeyNavigation(True) self.mounts_view.setAlternatingRowColors(True) self.hsplit.addWidget(self.mounts_view) self.vsplit.addWidget(self.hsplit) self.table_view = QTableView(self.vsplit) self.table_view.setObjectName(u"table_view") sizePolicy1 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) sizePolicy1.setHorizontalStretch(1) sizePolicy1.setVerticalStretch(0) sizePolicy1.setHeightForWidth( self.table_view.sizePolicy().hasHeightForWidth()) self.table_view.setSizePolicy(sizePolicy1) self.table_view.viewport().setProperty("cursor", QCursor(Qt.ArrowCursor)) self.table_view.setContextMenuPolicy(Qt.ActionsContextMenu) self.table_view.setAcceptDrops(True) self.table_view.setToolTipDuration(-3) self.table_view.setEditTriggers(QAbstractItemView.AnyKeyPressed | QAbstractItemView.EditKeyPressed | QAbstractItemView.SelectedClicked) self.table_view.setDragEnabled(True) self.table_view.setDragDropMode(QAbstractItemView.DragDrop) self.table_view.setDefaultDropAction(Qt.MoveAction) self.table_view.setAlternatingRowColors(True) self.table_view.setSelectionMode(QAbstractItemView.ExtendedSelection) self.table_view.setSelectionBehavior(QAbstractItemView.SelectRows) self.table_view.setTextElideMode(Qt.ElideMiddle) self.table_view.setShowGrid(False) self.table_view.setSortingEnabled(True) self.table_view.setWordWrap(False) self.vsplit.addWidget(self.table_view) self.table_view.horizontalHeader().setDefaultSectionSize(150) self.table_view.horizontalHeader().setHighlightSections(False) self.table_view.horizontalHeader().setStretchLastSection(True) self.table_view.verticalHeader().setVisible(False) self.horizontalLayout.addWidget(self.vsplit) tfm.setCentralWidget(self.centralwidget) self.statusbar = QStatusBar(tfm) self.statusbar.setObjectName(u"statusbar") self.statusbar.setContextMenuPolicy(Qt.NoContextMenu) self.statusbar.setSizeGripEnabled(False) tfm.setStatusBar(self.statusbar) self.toolbar = QToolBar(tfm) self.toolbar.setObjectName(u"toolbar") self.toolbar.setContextMenuPolicy(Qt.PreventContextMenu) self.toolbar.setMovable(False) tfm.addToolBar(Qt.TopToolBarArea, self.toolbar) self.toolbar.addAction(self.action_back) self.toolbar.addAction(self.action_forward) self.toolbar.addAction(self.action_up) self.toolbar.addAction(self.action_home) self.toolbar.addAction(self.action_go) self.retranslateUi(tfm) QMetaObject.connectSlotsByName(tfm) # setupUi def retranslateUi(self, tfm): tfm.setWindowTitle(QCoreApplication.translate("tfm", u"tfm", None)) self.action_menu.setText( QCoreApplication.translate("tfm", u"Menu", None)) self.action_new_dir.setText( QCoreApplication.translate("tfm", u"New Directory", None)) self.action_new_file.setText( QCoreApplication.translate("tfm", u"New File", None)) self.action_back.setText( QCoreApplication.translate("tfm", u"Back", None)) self.action_up.setText(QCoreApplication.translate("tfm", u"Up", None)) self.action_home.setText( QCoreApplication.translate("tfm", u"Home", None)) self.action_go.setText(QCoreApplication.translate("tfm", u"Go", None)) #if QT_CONFIG(tooltip) self.action_go.setToolTip( QCoreApplication.translate("tfm", u"Go or Reload", None)) #endif // QT_CONFIG(tooltip) self.action_forward.setText( QCoreApplication.translate("tfm", u"Forward", None)) self.action_copy.setText( QCoreApplication.translate("tfm", u"Copy", None)) self.action_paste.setText( QCoreApplication.translate("tfm", u"Paste", None)) self.action_cut.setText(QCoreApplication.translate( "tfm", u"Cut", None)) self.action_show_hidden.setText( QCoreApplication.translate("tfm", u"Show hidden files", None)) #if QT_CONFIG(shortcut) self.action_show_hidden.setShortcut( QCoreApplication.translate("tfm", u"Ctrl+H", None)) #endif // QT_CONFIG(shortcut) self.action_delete.setText( QCoreApplication.translate("tfm", u"Delete", None)) self.action_rename.setText( QCoreApplication.translate("tfm", u"Rename", None)) self.action_add_to_bookmarks.setText( QCoreApplication.translate("tfm", u"Add to bookmarks", None)) self.action_remove_bookmark.setText( QCoreApplication.translate("tfm", u"Remove bookmark", None)) #if QT_CONFIG(tooltip) self.action_remove_bookmark.setToolTip( QCoreApplication.translate("tfm", u"Remove bookmark", None)) #endif // QT_CONFIG(tooltip) self.action_copy_path.setText( QCoreApplication.translate("tfm", u"Copy path", None)) self.action_extract_here.setText( QCoreApplication.translate("tfm", u"Extract here", None)) #if QT_CONFIG(tooltip) self.action_extract_here.setToolTip( QCoreApplication.translate("tfm", u"Extract here", None)) #endif // QT_CONFIG(tooltip) self.action_mount_iso.setText( QCoreApplication.translate("tfm", u"Mount ISO", None)) #if QT_CONFIG(tooltip) self.action_mount_iso.setToolTip( QCoreApplication.translate("tfm", u"Mount ISO", None))
class MainWindow(QMainWindow): """Main application window""" def __init__(self) -> None: QMainWindow.__init__(self) self.setSizePolicy( QSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum)) self.setMaximumSize(QSize(1920, 1080)) self.setStyleSheet("padding: 0px; margin: 0px;") self.setIconSize(QSize(32, 32)) self.setWindowTitle("BossyBot 2000 - Image Tagger") self.setWindowIcon(self.load_icon(icon)) self.menubar = QMenuBar(self) self.menubar.setSizePolicy(EXP_MAX) self.menubar.setMaximumSize(QSize(INFINITE, 30)) self.menu_file = QMenu('File', self.menubar) self.menu_options = QMenu('Options', self.menubar) self.menu_help = QMenu('Help', self.menubar) self.menubar.addAction(self.menu_file.menuAction()) self.menubar.addAction(self.menu_options.menuAction()) self.menubar.addAction(self.menu_help.menuAction()) self.open = QAction('Open', self) self.menu_file.addAction(self.open) self.open.triggered.connect(self.open_file) self.exit_button = QAction('Exit', self) self.exit_button.triggered.connect(lambda: sys.exit(0), Qt.QueuedConnection) self.menu_file.addAction(self.exit_button) self.setMenuBar(self.menubar) self.previous_button = QAction(self.load_icon(previous), '<<', self) self.next_button = QAction(self.load_icon(next_icon), '>>', self) self.rotate_left_button = QAction(self.load_icon(left), '', self) self.rotate_right_button = QAction(self.load_icon(right), '', self) self.play_button = QAction(self.load_icon(play), '', self) self.play_button.setCheckable(True) self.delete_button = QAction(self.load_icon(delete), '', self) self.reload_button = QAction(self.load_icon(reload), '', self) self.mirror_button = QAction('Mirror', self) self.actual_size_button = QAction('Actual Size', self) self.browser_button = QAction('Browser', self) self.browser_button.setCheckable(True) self.browser_button.setChecked(True) self.crop_button = QAction('Crop', self) self.crop_button.setCheckable(True) self.toolbuttons = { self.rotate_left_button: { 'shortcut': ',', 'connect': lambda: self.pixmap.setRotation(self.pixmap.rotation() - 90) }, self.rotate_right_button: { 'shortcut': '.', 'connect': lambda: self.pixmap.setRotation(self.pixmap.rotation() + 90) }, self.delete_button: { 'shortcut': 'Del', 'connect': self.delete }, self.previous_button: { 'shortcut': 'Left', 'connect': self.previous }, self.play_button: { 'shortcut': 'Space', 'connect': self.play }, self.next_button: { 'shortcut': 'Right', 'connect': self.next }, self.reload_button: { 'shortcut': 'F5', 'connect': self.reload } } self.toolbar = QToolBar(self) self.toolbar.setSizePolicy(EXP_MAX) self.toolbar.setMaximumSize(QSize(INFINITE, 27)) for _ in (self.browser_button, self.crop_button, self.mirror_button, self.actual_size_button): self.toolbar.addAction(_) self.addToolBar(Qt.TopToolBarArea, self.toolbar) for button in self.toolbuttons: button.setShortcut(self.toolbuttons[button]['shortcut']) button.triggered.connect(self.toolbuttons[button]['connect']) self.toolbar.addAction(button) self.centralwidget = QWidget(self) self.centralwidget.setSizePolicy(EXP_EXP) self.setCentralWidget(self.centralwidget) self.grid = QGridLayout(self.centralwidget) self.media = QGraphicsScene(self) self.media.setItemIndexMethod(QGraphicsScene.NoIndex) self.media.setBackgroundBrush(QBrush(Qt.black)) self.view = MyView(self.media, self) self.view.setSizePolicy(EXP_EXP) self.media.setSceneRect(0, 0, self.view.width(), self.view.height()) self.grid.addWidget(self.view, 0, 0, 1, 1) self.frame = QFrame(self.centralwidget) self.frame.setSizePolicy( QSizePolicy(QSizePolicy.Fixed, QSizePolicy.MinimumExpanding)) self.frame.setMinimumSize(QSize(325, 500)) self.frame.setStyleSheet( "QFrame { border: 4px inset #222; border-radius: 10; }") self.layout_widget = QWidget(self.frame) self.layout_widget.setGeometry(QRect(0, 400, 321, 91)) self.layout_widget.setContentsMargins(15, 15, 15, 15) self.grid2 = QGridLayout(self.layout_widget) self.grid2.setContentsMargins(0, 0, 0, 0) self.save_button = QPushButton('Yes (Save)', self.layout_widget) self.save_button.setSizePolicy(FIX_FIX) self.save_button.setMaximumSize(QSize(120, 26)) self.save_button.setVisible(False) self.grid2.addWidget(self.save_button, 1, 0, 1, 1) self.no_save_button = QPushButton('No (Reload)', self.layout_widget) self.no_save_button.setSizePolicy(FIX_FIX) self.no_save_button.setMaximumSize(QSize(120, 26)) self.no_save_button.setVisible(False) self.grid2.addWidget(self.no_save_button, 1, 1, 1, 1) self.label = QLabel("Current image modified, save it?", self.layout_widget) self.label.setSizePolicy(FIX_FIX) self.label.setMaximumSize(QSize(325, 60)) self.label.setVisible(False) self.label.setAlignment(Qt.AlignCenter) self.grid2.addWidget(self.label, 0, 0, 1, 2) self.layout_widget = QWidget(self.frame) self.layout_widget.setGeometry(QRect(0, 0, 321, 213)) self.ass = QRadioButton('Ass', self.layout_widget) self.ass_exposed = QRadioButton('Ass (exposed)', self.layout_widget) self.ass_reset = QRadioButton(self.frame) self.ass_group = QButtonGroup(self) self.breasts = QRadioButton('Breasts', self.layout_widget) self.breasts_exposed = QRadioButton('Breasts (exposed)', self.layout_widget) self.breasts_reset = QRadioButton(self.frame) self.breasts_group = QButtonGroup(self) self.pussy = QRadioButton('Pussy', self.layout_widget) self.pussy_exposed = QRadioButton('Pussy (exposed)', self.layout_widget) self.pussy_reset = QRadioButton(self.frame) self.pussy_group = QButtonGroup(self) self.fully_clothed = QRadioButton('Fully Clothed', self.layout_widget) self.fully_nude = QRadioButton('Fully Nude', self.layout_widget) self.nudity_reset = QRadioButton(self.frame) self.nudity = QButtonGroup(self) self.smiling = QRadioButton('Smiling', self.layout_widget) self.glaring = QRadioButton('Glaring', self.layout_widget) self.expression_reset = QRadioButton(self.frame) self.expression = QButtonGroup(self) self.grid3 = QGridLayout(self.layout_widget) self.grid3.setVerticalSpacing(15) self.grid3.setContentsMargins(0, 15, 0, 0) self.radios = { self.ass: { 'this': 'ass', 'that': 'ass_exposed', 'group': self.ass_group, 'reset': self.ass_reset, 'grid': (0, 0, 1, 1) }, self.ass_exposed: { 'this': 'ass_exposed', 'that': 'ass', 'group': self.ass_group, 'reset': self.ass_reset, 'grid': (0, 1, 1, 1) }, self.breasts: { 'this': 'breasts', 'that': 'breasts_exposed', 'group': self.breasts_group, 'reset': self.breasts_reset, 'grid': (1, 0, 1, 1) }, self.breasts_exposed: { 'this': 'breasts_exposed', 'that': 'breasts', 'group': self.breasts_group, 'reset': self.breasts_reset, 'grid': (1, 1, 1, 1) }, self.pussy: { 'this': 'pussy', 'that': 'pussy_exposed', 'group': self.pussy_group, 'reset': self.pussy_reset, 'grid': (2, 0, 1, 1) }, self.pussy_exposed: { 'this': 'pussy_exposed', 'that': 'pussy', 'group': self.pussy_group, 'reset': self.pussy_reset, 'grid': (2, 1, 1, 1) }, self.fully_clothed: { 'this': 'fully_clothed', 'that': 'fully_nude', 'group': self.nudity, 'reset': self.nudity_reset, 'grid': (3, 0, 1, 1) }, self.fully_nude: { 'this': 'fully_nude', 'that': 'fully_clothed', 'group': self.nudity, 'reset': self.nudity_reset, 'grid': (3, 1, 1, 1) }, self.smiling: { 'this': 'smiling', 'that': 'glaring', 'group': self.expression, 'reset': self.expression_reset, 'grid': (4, 0, 1, 1) }, self.glaring: { 'this': 'glaring', 'that': 'smiling', 'group': self.expression, 'reset': self.expression_reset, 'grid': (4, 1, 1, 1) }, } for radio in self.radios: radio.setSizePolicy(FIX_FIX) radio.setMaximumSize(QSize(150, 22)) self.radios[radio]['reset'].setGeometry(QRect(0, 0, 0, 0)) self.grid3.addWidget(radio, *self.radios[radio]['grid']) if self.radios[radio]['group'] != self.nudity: radio.toggled.connect( lambda x=_, y=radio: self.annotate(self.radios[y]['this'])) self.radios[radio]['group'].addButton(radio) self.radios[radio]['group'].addButton(self.radios[radio]['reset']) self.save_tags_button = QPushButton('Save Tags', self.layout_widget) self.save_tags_button.setSizePolicy(FIX_FIX) self.save_tags_button.setMaximumSize(QSize(120, 26)) self.grid3.addWidget(self.save_tags_button, 5, 1, 1, 1) self.grid.addWidget(self.frame, 0, 1, 1, 1) self.browse_bar = QLabel(self.centralwidget) self.browse_bar.setSizePolicy(EXP_FIX) self.browse_bar.setMinimumSize(QSize(0, 100)) self.browse_bar.setMaximumSize(QSize(INFINITE, 100)) self.browse_bar.setStyleSheet("background: #000;") self.browse_bar.setAlignment(Qt.AlignCenter) self.h_box2 = QHBoxLayout(self.browse_bar) self.h_box2.setContentsMargins(4, 0, 0, 0) self.grid.addWidget(self.browse_bar, 1, 0, 1, 2) hiders = [ self.no_save_button.clicked, self.save_button.clicked, self.reload_button.triggered ] for hider in hiders: hider.connect(self.save_button.hide) hider.connect(self.no_save_button.hide) hider.connect(self.label.hide) showers = [ self.mirror_button.triggered, self.rotate_right_button.triggered, self.rotate_left_button.triggered ] for shower in showers: shower.connect(self.save_button.show) shower.connect(self.no_save_button.show) shower.connect(self.label.show) self.no_save_button.clicked.connect(self.reload) self.browser_button.toggled.connect(self.browse_bar.setVisible) self.play_button.toggled.connect(lambda: self.frame.setVisible( (True, False)[self.frame.isVisible()])) self.reload_button.triggered.connect(self.reload) self.mirror_button.triggered.connect(lambda: self.pixmap.setScale(-1)) self.save_button.clicked.connect(self.save_image) self.play_button.toggled.connect( lambda: self.browser_button.setChecked( (True, False)[self.browse_bar.isVisible()])) self.crop_button.toggled.connect(self.view.reset) self.actual_size_button.triggered.connect(self.actual_size) self.browser_button.triggered.connect(self.browser) self.save_tags_button.clicked.connect(self.save_tags) self.view.got_rect.connect(self.set_rect) self.crop_rect = QRect(QPoint(0, 0), QSize(0, 0)) self.dir_now = os.getcwd() self.files = [] self.index = 0 self.refresh_files() self.pixmap_is_scaled = False self.pixmap = QGraphicsPixmapItem() self.active_tag = '' self.reset_browser = False self.txt = PngInfo() def set_rect(self, rect: tuple[QPointF, QPointF]): """Converts the crop rectangle to a QRect after a crop action""" self.crop_rect = QRect(rect[0].toPoint(), rect[1].toPoint()) def keyPressEvent(self, event: QKeyEvent): # pylint: disable=invalid-name; """Keyboard event handler.""" if event.key() == Qt.Key_Escape and self.play_button.isChecked(): self.play_button.toggle() self.browser_button.setChecked((True, False)[self.reset_browser]) elif (event.key() in [16777220, 16777221] and self.view.g_rect.rect().width() > 0): self.view.got_rect.emit((self.view.g_rect.rect().topLeft(), self.view.g_rect.rect().bottomRight())) if self.view.g_rect.pen().color() == Qt.red: new_pix = self.pixmap.pixmap().copy(self.crop_rect) if self.pixmap_is_scaled: new_pix = new_pix.transformed( self.view.transform().inverted()[0], Qt.SmoothTransformation) self.update_pixmap(new_pix) elif self.view.g_rect.pen().color() == Qt.magenta: self.annotate_rect() self.view.annotation = False for _ in (self.label, self.save_button, self.no_save_button): _.show() self.view.reset() def play(self): """Starts a slideshow.""" if self.play_button.isChecked(): if self.browser_button.isChecked(): self.reset_browser = True else: self.reset_browser = False QTimer.singleShot(3000, self.play) self.next() def _yield_radio(self): """Saves code connecting signals from all the radio buttons.""" yield from self.radios.keys().__str__() def load_icon(self, icon_file): """Loads an icon from Base64 encoded strings in icons.py.""" pix = QPixmap() pix.loadFromData(icon_file) return QIcon(pix) def open_file(self, file: str) -> None: """ Open an image file and display it. :param file: The filename of the image to open """ if not os.path.isfile(file): file = QFileDialog(self, self.dir_now, self.dir_now).getOpenFileName()[0] self.dir_now = os.path.dirname(file) self.refresh_files() for i, index_file in enumerate(self.files): if file.split('/')[-1] == index_file: self.index = i self.view.setTransform(QTransform()) self.update_pixmap(QPixmap(file)) self.browser() self.load_tags() def refresh_files(self) -> list[str]: """Updates the file list when the directory is changed. Returns a list of image files available in the current directory.""" files = os.listdir(self.dir_now) self.files = [ file for file in sorted(files, key=lambda x: x.lower()) if file.endswith((".png", ".jpg", ".gif", ".bmp", ".jpeg")) ] def next(self) -> None: """Opens the next image in the file list.""" self.index = (self.index + 1) % len(self.files) self.reload() def previous(self) -> None: """Opens the previous image in the file list.""" self.index = (self.index + (len(self.files) - 1)) % len(self.files) self.reload() def save_image(self) -> None: """ Save the modified image file. If the current pixmap has been scaled, we need to load a non-scaled pixmap from the original file and re-apply the transformations that have been performed to prevent it from being saved as the scaled-down image. """ if self.pixmap_is_scaled: rotation = self.pixmap.rotation() mirror = self.pixmap.scale() < 0 pix = QPixmap(self.files[self.index]) pix = pix.transformed(QTransform().rotate(rotation)) if mirror: pix = pix.transformed(QTransform().scale(-1, 1)) pix.save(self.files[self.index], quality=-1) else: self.pixmap.pixmap().save(self.files[self.index], quality=-1) self.save_tags() def delete(self) -> None: """Deletes the current image from the file system.""" with suppress(OSError): os.remove(f"{self.dir_now}/{self.files.pop(self.index)}") self.refresh_files() def reload(self) -> None: """Reloads the current pixmap; used to update the screen when the current file is changed.""" self.open_file(f"{self.dir_now}/{self.files[self.index]}") def annotate(self, tag): """Starts an annotate action""" self.txt = PngInfo() self.view.annotation = True self.active_tag = tag self.view.reset() def wheelEvent(self, event: QWheelEvent) -> None: # pylint: disable=invalid-name """With Ctrl depressed, zoom the current image, otherwise fire the next/previous functions.""" modifiers = QApplication.keyboardModifiers() if event.angleDelta().y() == 120 and modifiers == Qt.ControlModifier: self.view.scale(0.75, 0.75) elif event.angleDelta().y() == 120: self.previous() elif event.angleDelta().y( ) == -120 and modifiers == Qt.ControlModifier: self.view.scale(1.25, 1.25) elif event.angleDelta().y() == -120: self.next() def actual_size(self) -> None: """Display the current image at its actual size, rather than scaled to fit the viewport.""" self.update_pixmap(QPixmap(self.files[self.index]), False) self.view.setDragMode(QGraphicsView.ScrollHandDrag) def mousePressEvent(self, event: QMouseEvent) -> None: # pylint: disable=invalid-name """Event handler for mouse button presses.""" if event.button() == Qt.MouseButton.ForwardButton: self.next() elif event.button() == Qt.MouseButton.BackButton: self.previous() def update_pixmap(self, new: QPixmap, scaled: bool = True) -> None: """ Updates the currently displayed image. :param new: The new `QPixmap` to be displayed. :param scaled: If False, don't scale the image to fit the viewport. """ self.pixmap_is_scaled = scaled self.media.clear() self.pixmap = self.media.addPixmap(new) self.pixmap.setTransformOriginPoint( self.pixmap.boundingRect().width() / 2, self.pixmap.boundingRect().height() / 2) if scaled and (new.size().width() > self.view.width() or new.size().height() > self.view.height()): self.view.fitInView(self.pixmap, Qt.KeepAspectRatio) self.media.setSceneRect(self.pixmap.boundingRect()) def annotate_rect(self): """Creates image coordinate annotation data.""" self.txt.add_itxt( f'{str(self.active_tag)}-rect', f'{str(self.crop_rect.x())}, {str(self.crop_rect.y())}, {str(self.crop_rect.width())}, {str(self.crop_rect.height())}' ) def browser(self): """Slot function to initialize image thumbnails for the 'browse mode.'""" while self.h_box2.itemAt(0): self.h_box2.takeAt(0).widget().deleteLater() index = (self.index + (len(self.files) - 2)) % len(self.files) for i, file in enumerate(self.files): file = self.dir_now + '/' + self.files[index] label = ClickableLabel(self, file) self.h_box2.addWidget(label) pix = QPixmap(file) if (pix.size().width() > self.browse_bar.width() / 5 or pix.size().height() > 100): pix = pix.scaled(self.browse_bar.width() / 5, 100, Qt.KeepAspectRatio) label.setPixmap(pix) index = (index + 1) % len(self.files) if i == 4: break def save_tags(self): """Save tags for currently loaded image into its iTxt data.""" file = self.files[self.index] img = Image.open(file) img.load() for key, value, in img.text.items(): self.txt.add_itxt(key, value) for key in self.radios: if key.isChecked(): self.txt.add_itxt(self.radios[key]['this'], 'True') self.txt.add_itxt(self.radios[key]['that'], 'False') img.save(file, pnginfo=self.txt) def load_tags(self): """Load tags from iTxt data.""" for radio in self.radios: if radio.isChecked(): self.radios[radio]['reset'].setChecked(True) filename = self.files[self.index] fqp = filename img = Image.open(fqp) img.load() with suppress(AttributeError): for key, value in img.text.items(): if value == 'True': for radio in self.radios: if key == self.radios[radio]['this']: radio.setChecked(True) self.view.annotation = False self.active_tag = '' self.view.reset() for key, value in img.text.items(): if key.endswith('-rect'): btn = [ radio for radio in self.radios if self.radios[radio]['this'] == key.split('-')[0] ] print(key, value) if btn[0].isChecked(): coords = [int(coord) for coord in value.split(', ')] rect = QGraphicsRectItem(*coords) rect.setPen(QPen(Qt.magenta, 1, Qt.SolidLine)) rect.setBrush(QBrush(Qt.magenta, Qt.Dense4Pattern)) self.view.scene().addItem(rect) text = self.view.scene().addText( key.split('-')[0], QFont('monospace', 20, 400, False)) text.font().setPointSize(text.font().pointSize() * 2) text.update() text.setX(rect.rect().x() + 10) text.setY(rect.rect().y() + 10) print(f'set {key}')
class Ui_MainWindow(object): def setupUi(self, MainWindow): if not MainWindow.objectName(): MainWindow.setObjectName(u"MainWindow") MainWindow.resize(911, 607) self.action_open = QAction(MainWindow) self.action_open.setObjectName(u"action_open") self.action_open.setVisible(False) self.action_comparison = QAction(MainWindow) self.action_comparison.setObjectName(u"action_comparison") self.action_comparison.setVisible(False) self.action_plot = QAction(MainWindow) self.action_plot.setObjectName(u"action_plot") self.action_training_session = QAction(MainWindow) self.action_training_session.setObjectName(u"action_training_session") self.action_training_session.setVisible(False) self.action_game = QAction(MainWindow) self.action_game.setObjectName(u"action_game") self.action_save = QAction(MainWindow) self.action_save.setObjectName(u"action_save") self.action_save.setVisible(False) self.action_save_log = QAction(MainWindow) self.action_save_log.setObjectName(u"action_save_log") self.action_save_log.setVisible(False) self.action_coordinates = QAction(MainWindow) self.action_coordinates.setObjectName(u"action_coordinates") self.action_coordinates.setCheckable(True) self.action_about = QAction(MainWindow) self.action_about.setObjectName(u"action_about") self.action_new_db = QAction(MainWindow) self.action_new_db.setObjectName(u"action_new_db") self.action_open_db = QAction(MainWindow) self.action_open_db.setObjectName(u"action_open_db") self.centralwidget = QWidget(MainWindow) self.centralwidget.setObjectName(u"centralwidget") self.verticalLayout_2 = QVBoxLayout(self.centralwidget) self.verticalLayout_2.setObjectName(u"verticalLayout_2") self.stacked_widget = QStackedWidget(self.centralwidget) self.stacked_widget.setObjectName(u"stacked_widget") self.game_page = QWidget() self.game_page.setObjectName(u"game_page") self.gridLayout_3 = QGridLayout(self.game_page) self.gridLayout_3.setObjectName(u"gridLayout_3") self.connect4 = QPushButton(self.game_page) self.connect4.setObjectName(u"connect4") sizePolicy = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.MinimumExpanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth( self.connect4.sizePolicy().hasHeightForWidth()) self.connect4.setSizePolicy(sizePolicy) self.gridLayout_3.addWidget(self.connect4, 0, 1, 1, 1) self.tic_tac_toe = QPushButton(self.game_page) self.tic_tac_toe.setObjectName(u"tic_tac_toe") sizePolicy1 = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Minimum) sizePolicy1.setHorizontalStretch(0) sizePolicy1.setVerticalStretch(0) sizePolicy1.setHeightForWidth( self.tic_tac_toe.sizePolicy().hasHeightForWidth()) self.tic_tac_toe.setSizePolicy(sizePolicy1) self.gridLayout_3.addWidget(self.tic_tac_toe, 0, 0, 1, 1) self.othello = QPushButton(self.game_page) self.othello.setObjectName(u"othello") sizePolicy.setHeightForWidth( self.othello.sizePolicy().hasHeightForWidth()) self.othello.setSizePolicy(sizePolicy) self.gridLayout_3.addWidget(self.othello, 1, 0, 1, 1) self.stacked_widget.addWidget(self.game_page) self.players_page = QWidget() self.players_page.setObjectName(u"players_page") self.verticalLayout = QVBoxLayout(self.players_page) self.verticalLayout.setObjectName(u"verticalLayout") self.player_layout = QGridLayout() self.player_layout.setObjectName(u"player_layout") self.searches_lock2 = QCheckBox(self.players_page) self.searches_lock2.setObjectName(u"searches_lock2") self.player_layout.addWidget(self.searches_lock2, 2, 4, 1, 1) self.player1 = QComboBox(self.players_page) self.player1.setObjectName(u"player1") sizePolicy2 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) sizePolicy2.setHorizontalStretch(0) sizePolicy2.setVerticalStretch(0) sizePolicy2.setHeightForWidth( self.player1.sizePolicy().hasHeightForWidth()) self.player1.setSizePolicy(sizePolicy2) self.player_layout.addWidget(self.player1, 1, 1, 1, 1) self.cancel = QPushButton(self.players_page) self.cancel.setObjectName(u"cancel") self.player_layout.addWidget(self.cancel, 4, 0, 1, 1) self.searches_label1 = QLabel(self.players_page) self.searches_label1.setObjectName(u"searches_label1") sizePolicy3 = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Preferred) sizePolicy3.setHorizontalStretch(0) sizePolicy3.setVerticalStretch(0) sizePolicy3.setHeightForWidth( self.searches_label1.sizePolicy().hasHeightForWidth()) self.searches_label1.setSizePolicy(sizePolicy3) self.player_layout.addWidget(self.searches_label1, 1, 3, 1, 1) self.player2 = QComboBox(self.players_page) self.player2.setObjectName(u"player2") sizePolicy2.setHeightForWidth( self.player2.sizePolicy().hasHeightForWidth()) self.player2.setSizePolicy(sizePolicy2) self.player_layout.addWidget(self.player2, 2, 1, 1, 1) self.searches_lock1 = QCheckBox(self.players_page) self.searches_lock1.setObjectName(u"searches_lock1") self.player_layout.addWidget(self.searches_lock1, 1, 4, 1, 1) self.game_label = QLabel(self.players_page) self.game_label.setObjectName(u"game_label") sizePolicy4 = QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) sizePolicy4.setHorizontalStretch(0) sizePolicy4.setVerticalStretch(0) sizePolicy4.setHeightForWidth( self.game_label.sizePolicy().hasHeightForWidth()) self.game_label.setSizePolicy(sizePolicy4) self.player_layout.addWidget(self.game_label, 0, 0, 1, 1) self.game_name = QLabel(self.players_page) self.game_name.setObjectName(u"game_name") self.player_layout.addWidget(self.game_name, 0, 1, 1, 4) self.searches_label2 = QLabel(self.players_page) self.searches_label2.setObjectName(u"searches_label2") self.player_layout.addWidget(self.searches_label2, 2, 3, 1, 1) self.player_label1 = QLabel(self.players_page) self.player_label1.setObjectName(u"player_label1") sizePolicy4.setHeightForWidth( self.player_label1.sizePolicy().hasHeightForWidth()) self.player_label1.setSizePolicy(sizePolicy4) self.player_layout.addWidget(self.player_label1, 1, 0, 1, 1) self.searches1 = QSpinBox(self.players_page) self.searches1.setObjectName(u"searches1") sizePolicy5 = QSizePolicy(QSizePolicy.Minimum, QSizePolicy.Fixed) sizePolicy5.setHorizontalStretch(0) sizePolicy5.setVerticalStretch(0) sizePolicy5.setHeightForWidth( self.searches1.sizePolicy().hasHeightForWidth()) self.searches1.setSizePolicy(sizePolicy5) self.searches1.setMaximum(1000000) self.player_layout.addWidget(self.searches1, 1, 2, 1, 1) self.player_label2 = QLabel(self.players_page) self.player_label2.setObjectName(u"player_label2") self.player_layout.addWidget(self.player_label2, 2, 0, 1, 1) self.shuffle_players = QCheckBox(self.players_page) self.shuffle_players.setObjectName(u"shuffle_players") self.player_layout.addWidget(self.shuffle_players, 3, 1, 1, 4) self.searches2 = QSpinBox(self.players_page) self.searches2.setObjectName(u"searches2") sizePolicy5.setHeightForWidth( self.searches2.sizePolicy().hasHeightForWidth()) self.searches2.setSizePolicy(sizePolicy5) self.searches2.setMaximum(1000000) self.player_layout.addWidget(self.searches2, 2, 2, 1, 1) self.start = QPushButton(self.players_page) self.start.setObjectName(u"start") self.player_layout.addWidget(self.start, 4, 1, 1, 4) self.player_layout.setColumnStretch(1, 10) self.player_layout.setColumnStretch(2, 1) self.verticalLayout.addLayout(self.player_layout) self.stacked_widget.addWidget(self.players_page) self.humans_page = QWidget() self.humans_page.setObjectName(u"humans_page") self.gridLayout = QGridLayout(self.humans_page) self.gridLayout.setObjectName(u"gridLayout") self.close_humans = QPushButton(self.humans_page) self.close_humans.setObjectName(u"close_humans") sizePolicy4.setHeightForWidth( self.close_humans.sizePolicy().hasHeightForWidth()) self.close_humans.setSizePolicy(sizePolicy4) self.gridLayout.addWidget(self.close_humans, 1, 1, 1, 1) self.players_label = QLabel(self.humans_page) self.players_label.setObjectName(u"players_label") self.gridLayout.addWidget(self.players_label, 0, 0, 1, 1) self.new_human = QPushButton(self.humans_page) self.new_human.setObjectName(u"new_human") sizePolicy4.setHeightForWidth( self.new_human.sizePolicy().hasHeightForWidth()) self.new_human.setSizePolicy(sizePolicy4) self.gridLayout.addWidget(self.new_human, 1, 3, 1, 1) self.players_table = QTableWidget(self.humans_page) self.players_table.setObjectName(u"players_table") self.gridLayout.addWidget(self.players_table, 0, 1, 1, 3) self.spacer = QSpacerItem(40, 20, QSizePolicy.Expanding, QSizePolicy.Minimum) self.gridLayout.addItem(self.spacer, 1, 2, 1, 1) self.stacked_widget.addWidget(self.humans_page) self.rules_page = QWidget() self.rules_page.setObjectName(u"rules_page") self.gridLayout_4 = QGridLayout(self.rules_page) self.gridLayout_4.setObjectName(u"gridLayout_4") self.rules_text = QTextBrowser(self.rules_page) self.rules_text.setObjectName(u"rules_text") self.gridLayout_4.addWidget(self.rules_text, 0, 0, 1, 1) self.rules_close = QPushButton(self.rules_page) self.rules_close.setObjectName(u"rules_close") sizePolicy4.setHeightForWidth( self.rules_close.sizePolicy().hasHeightForWidth()) self.rules_close.setSizePolicy(sizePolicy4) self.gridLayout_4.addWidget(self.rules_close, 1, 0, 1, 1) self.stacked_widget.addWidget(self.rules_page) self.display_page = QWidget() self.display_page.setObjectName(u"display_page") self.gridLayout_2 = QGridLayout(self.display_page) self.gridLayout_2.setObjectName(u"gridLayout_2") self.toggle_review = QPushButton(self.display_page) self.toggle_review.setObjectName(u"toggle_review") sizePolicy4.setHeightForWidth( self.toggle_review.sizePolicy().hasHeightForWidth()) self.toggle_review.setSizePolicy(sizePolicy4) self.gridLayout_2.addWidget(self.toggle_review, 3, 2, 1, 1) self.move_history = QComboBox(self.display_page) self.move_history.setObjectName(u"move_history") sizePolicy6 = QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Fixed) sizePolicy6.setHorizontalStretch(1) sizePolicy6.setVerticalStretch(0) sizePolicy6.setHeightForWidth( self.move_history.sizePolicy().hasHeightForWidth()) self.move_history.setSizePolicy(sizePolicy6) self.gridLayout_2.addWidget(self.move_history, 3, 1, 1, 1) self.choices = QTableWidget(self.display_page) self.choices.setObjectName(u"choices") sizePolicy7 = QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred) sizePolicy7.setHorizontalStretch(0) sizePolicy7.setVerticalStretch(0) sizePolicy7.setHeightForWidth( self.choices.sizePolicy().hasHeightForWidth()) self.choices.setSizePolicy(sizePolicy7) self.gridLayout_2.addWidget(self.choices, 1, 0, 1, 3) self.resume_here = QPushButton(self.display_page) self.resume_here.setObjectName(u"resume_here") sizePolicy5.setHeightForWidth( self.resume_here.sizePolicy().hasHeightForWidth()) self.resume_here.setSizePolicy(sizePolicy5) self.gridLayout_2.addWidget(self.resume_here, 3, 0, 1, 1) self.game_display = QLabel(self.display_page) self.game_display.setObjectName(u"game_display") self.gridLayout_2.addWidget(self.game_display, 0, 0, 1, 3) self.stacked_widget.addWidget(self.display_page) self.plot_strength_page = QWidget() self.plot_strength_page.setObjectName(u"plot_strength_page") self.gridLayout_5 = QGridLayout(self.plot_strength_page) self.gridLayout_5.setObjectName(u"gridLayout_5") self.label = QLabel(self.plot_strength_page) self.label.setObjectName(u"label") self.gridLayout_5.addWidget(self.label, 0, 0, 1, 1) self.plot_game = QComboBox(self.plot_strength_page) self.plot_game.setObjectName(u"plot_game") self.gridLayout_5.addWidget(self.plot_game, 0, 1, 1, 2) self.lineEdit = QLineEdit(self.plot_strength_page) self.lineEdit.setObjectName(u"lineEdit") self.gridLayout_5.addWidget(self.lineEdit, 2, 1, 1, 2) self.label_2 = QLabel(self.plot_strength_page) self.label_2.setObjectName(u"label_2") self.gridLayout_5.addWidget(self.label_2, 3, 0, 1, 1) self.lineEdit_2 = QLineEdit(self.plot_strength_page) self.lineEdit_2.setObjectName(u"lineEdit_2") self.gridLayout_5.addWidget(self.lineEdit_2, 3, 1, 1, 2) self.reset_plot = QPushButton(self.plot_strength_page) self.reset_plot.setObjectName(u"reset_plot") self.gridLayout_5.addWidget(self.reset_plot, 6, 2, 1, 1) self.start_stop_plot = QPushButton(self.plot_strength_page) self.start_stop_plot.setObjectName(u"start_stop_plot") self.gridLayout_5.addWidget(self.start_stop_plot, 6, 1, 1, 1) self.strengths_label = QLabel(self.plot_strength_page) self.strengths_label.setObjectName(u"strengths_label") self.gridLayout_5.addWidget(self.strengths_label, 2, 0, 1, 1) self.label_3 = QLabel(self.plot_strength_page) self.label_3.setObjectName(u"label_3") self.gridLayout_5.addWidget(self.label_3, 4, 0, 1, 1) self.lineEdit_3 = QLineEdit(self.plot_strength_page) self.lineEdit_3.setObjectName(u"lineEdit_3") self.gridLayout_5.addWidget(self.lineEdit_3, 4, 1, 1, 2) self.stacked_widget.addWidget(self.plot_strength_page) self.plot_history_page = QWidget() self.plot_history_page.setObjectName(u"plot_history_page") self.gridLayout_6 = QGridLayout(self.plot_history_page) self.gridLayout_6.setObjectName(u"gridLayout_6") self.label_4 = QLabel(self.plot_history_page) self.label_4.setObjectName(u"label_4") self.gridLayout_6.addWidget(self.label_4, 0, 0, 1, 1) self.history_game = QComboBox(self.plot_history_page) self.history_game.setObjectName(u"history_game") self.gridLayout_6.addWidget(self.history_game, 0, 1, 1, 1) self.gridLayout_6.setColumnStretch(0, 1) self.gridLayout_6.setColumnStretch(1, 8) self.stacked_widget.addWidget(self.plot_history_page) self.verticalLayout_2.addWidget(self.stacked_widget) MainWindow.setCentralWidget(self.centralwidget) self.menubar = QMenuBar(MainWindow) self.menubar.setObjectName(u"menubar") self.menubar.setGeometry(QRect(0, 0, 911, 22)) self.menu_file = QMenu(self.menubar) self.menu_file.setObjectName(u"menu_file") self.menu_new = QMenu(self.menu_file) self.menu_new.setObjectName(u"menu_new") self.menu_view = QMenu(self.menubar) self.menu_view.setObjectName(u"menu_view") self.menu_help = QMenu(self.menubar) self.menu_help.setObjectName(u"menu_help") self.menu_rules = QMenu(self.menu_help) self.menu_rules.setObjectName(u"menu_rules") MainWindow.setMenuBar(self.menubar) self.statusbar = QStatusBar(MainWindow) self.statusbar.setObjectName(u"statusbar") MainWindow.setStatusBar(self.statusbar) self.menubar.addAction(self.menu_file.menuAction()) self.menubar.addAction(self.menu_view.menuAction()) self.menubar.addAction(self.menu_help.menuAction()) self.menu_file.addAction(self.menu_new.menuAction()) self.menu_file.addAction(self.action_open) self.menu_file.addAction(self.action_save) self.menu_file.addAction(self.action_save_log) self.menu_file.addAction(self.action_new_db) self.menu_file.addAction(self.action_open_db) self.menu_new.addAction(self.action_game) self.menu_new.addAction(self.action_comparison) self.menu_new.addAction(self.action_plot) self.menu_new.addAction(self.action_training_session) self.menu_view.addAction(self.action_coordinates) self.menu_help.addAction(self.action_about) self.menu_help.addAction(self.menu_rules.menuAction()) self.retranslateUi(MainWindow) self.stacked_widget.setCurrentIndex(2) QMetaObject.connectSlotsByName(MainWindow) # setupUi def retranslateUi(self, MainWindow): MainWindow.setWindowTitle( QCoreApplication.translate("MainWindow", u"MainWindow", None)) self.action_open.setText( QCoreApplication.translate("MainWindow", u"&Open...", None)) self.action_comparison.setText( QCoreApplication.translate("MainWindow", u"&Comparison", None)) self.action_plot.setText( QCoreApplication.translate("MainWindow", u"&Plot", None)) self.action_training_session.setText( QCoreApplication.translate("MainWindow", u"&Training Session", None)) self.action_game.setText( QCoreApplication.translate("MainWindow", u"&Game", None)) self.action_save.setText( QCoreApplication.translate("MainWindow", u"&Save...", None)) self.action_save_log.setText( QCoreApplication.translate("MainWindow", u"Save &Log...", None)) self.action_coordinates.setText( QCoreApplication.translate("MainWindow", u"Coordinates", None)) self.action_about.setText( QCoreApplication.translate("MainWindow", u"&About...", None)) self.action_new_db.setText( QCoreApplication.translate("MainWindow", u"New Player &Database...", None)) self.action_open_db.setText( QCoreApplication.translate("MainWindow", u"&Open Player Database...", None)) self.connect4.setText( QCoreApplication.translate("MainWindow", u"Connect 4", None)) self.tic_tac_toe.setText( QCoreApplication.translate("MainWindow", u"Tic Tac Toe", None)) self.othello.setText( QCoreApplication.translate("MainWindow", u"Othello", None)) self.searches_lock2.setText( QCoreApplication.translate("MainWindow", u"Lock", None)) self.cancel.setText( QCoreApplication.translate("MainWindow", u"Cancel", None)) self.searches_label1.setText( QCoreApplication.translate("MainWindow", u"searches", None)) self.searches_lock1.setText( QCoreApplication.translate("MainWindow", u"Lock", None)) self.game_label.setText( QCoreApplication.translate("MainWindow", u"Game:", None)) self.game_name.setText( QCoreApplication.translate("MainWindow", u"Chosen Game's Name", None)) self.searches_label2.setText( QCoreApplication.translate("MainWindow", u"searches", None)) self.player_label1.setText( QCoreApplication.translate("MainWindow", u"Player 1:", None)) self.player_label2.setText( QCoreApplication.translate("MainWindow", u"Player 2:", None)) self.shuffle_players.setText( QCoreApplication.translate("MainWindow", u"Shuffle Player Order", None)) self.start.setText( QCoreApplication.translate("MainWindow", u"Start", None)) self.close_humans.setText( QCoreApplication.translate("MainWindow", u"OK", None)) self.players_label.setText( QCoreApplication.translate("MainWindow", u"Players", None)) self.new_human.setText( QCoreApplication.translate("MainWindow", u"New", None)) self.rules_close.setText( QCoreApplication.translate("MainWindow", u"Close", None)) self.toggle_review.setText( QCoreApplication.translate("MainWindow", u"Review / Resume", None)) self.resume_here.setText( QCoreApplication.translate("MainWindow", u"Resume Here", None)) self.game_display.setText( QCoreApplication.translate("MainWindow", u"Game Display", None)) self.label.setText( QCoreApplication.translate("MainWindow", u"Game:", None)) #if QT_CONFIG(whatsthis) self.lineEdit.setWhatsThis("") #endif // QT_CONFIG(whatsthis) self.label_2.setText( QCoreApplication.translate("MainWindow", u"Opponent min:", None)) self.reset_plot.setText( QCoreApplication.translate("MainWindow", u"Reset", None)) self.start_stop_plot.setText( QCoreApplication.translate("MainWindow", u"Start / Stop", None)) self.strengths_label.setText( QCoreApplication.translate("MainWindow", u"Player Strengths:", None)) self.label_3.setText( QCoreApplication.translate("MainWindow", u"Opponent max:", None)) self.label_4.setText( QCoreApplication.translate("MainWindow", u"Game:", None)) self.menu_file.setTitle( QCoreApplication.translate("MainWindow", u"&File", None)) self.menu_new.setTitle( QCoreApplication.translate("MainWindow", u"&New", None)) self.menu_view.setTitle( QCoreApplication.translate("MainWindow", u"&View", None)) self.menu_help.setTitle( QCoreApplication.translate("MainWindow", u"&Help", None)) self.menu_rules.setTitle( QCoreApplication.translate("MainWindow", u"&Rules", None))
class Window(QMainWindow): def __init__(self): QMainWindow.__init__(self) self.images = [] self.index = -1 self.ratio = 1 # ratio for QLabel image self.mouse_position = None self.settings = None # Extensions self.extensions = [] for format in QImageReader.supportedImageFormats(): self.extensions.append(format.data().decode('utf-8')) # Filters self.filters = [] for extension in self.extensions: self.filters.append('*.{0}'.format(str(extension))) # UI self.set_up_ui() # settings self.load_settings() def on_message_received(self, msg): """ on message received from single application Args: msg (string): file path """ self.create_images(msg) self.display_image() def set_up_ui(self): # Status Bar self.status_bar = self.statusBar() self.label_name = QLabel() self.label_numero = QLabel() self.status_bar.addPermanentWidget(self.label_name, 1) self.status_bar.addPermanentWidget(self.label_numero, 0) # Main Window self.setWindowTitle('BaloViewer') self.setWindowIcon(QIcon('baloviewer.ico')) # Label image self.image = QLabel() self.image.setScaledContents(True) # Scroll area self.scroll_area = QScrollArea() self.scroll_area.setWidget(self.image) self.scroll_area.showMaximized() self.scroll_area.setFocusPolicy(Qt.FocusPolicy.NoFocus) self.scroll_area.setAlignment(Qt.AlignmentFlag.AlignCenter) self.scroll_area.viewport().installEventFilter(self) # image list self.image_gallery = ImageGallery() self.image_gallery.itemClicked.connect(self.image_gallery_clicked) self.image_gallery.viewport().installEventFilter(self) self.dock_widget = QDockWidget('Image Gallery', self) self.dock_widget.setWidget(self.image_gallery) self.dock_widget.setFloating(False) self.addDockWidget(Qt.LeftDockWidgetArea, self.dock_widget) # central widget self.setCentralWidget(self.scroll_area) # Action bar self.create_actions() self.create_menubar() self.create_toolbar() # option parser parser = OptionParser() parser.add_option("-f", "--file", dest="filename", help="open a file") (options, args) = parser.parse_args() parser_file = options.filename if parser_file is not None and os.path.isfile(parser_file): self.create_images(parser_file) self.display_image() def create_actions(self): # Action Open self.action_open = QAction(QIcon.fromTheme('document-open'), 'Open', self) self.action_open.setShortcut('Ctrl+O') self.action_open.setStatusTip('Open file') self.action_open.triggered.connect(self.open) # Action Save self.action_save = QAction(QIcon.fromTheme('document-save'), 'Save', self) self.action_save.setShortcut('Ctrl+S') self.action_save.setStatusTip('Save file') self.action_save.triggered.connect(self.save) # Action Copy self.action_copy = QAction(QIcon.fromTheme('edit-copy'), 'Copy', self) self.action_copy.setStatusTip('Copy') self.action_copy.triggered.connect(self.copy) # Action move self.action_move = QAction(QIcon.fromTheme('edit-cut'), 'Move', self) self.action_move.setStatusTip('Move') self.action_move.triggered.connect(self.move) # Action Delete self.action_delete = QAction(QIcon.fromTheme('edit-delete'), 'Delete', self) self.action_delete.setStatusTip('Delete') self.action_delete.triggered.connect(self.delete) # Action Quit self.action_quit = QAction(QIcon.fromTheme('application-exit'), 'Quit', self) self.action_quit.setShortcut('Ctrl+Q') self.action_quit.setStatusTip('Quit') self.action_quit.triggered.connect(self.close) # Action Rotate left self.action_rotate_left = QAction( QIcon.fromTheme('object-rotate-left'), 'Rotate left', self) self.action_rotate_left.setStatusTip('Rotate left') self.action_rotate_left.triggered.connect(self.rotate_left) # Action Rotate right self.action_rotate_right = QAction( QIcon.fromTheme('object-rotate-right'), 'Rotate right', self) self.action_rotate_right.setStatusTip('Rotate right') self.action_rotate_right.triggered.connect(self.rotate_right) # Action Mirror self.action_flip_horizontal = QAction( QIcon.fromTheme('object-flip-horizontal'), 'Flip horizontally', self) self.action_flip_horizontal.setStatusTip('Flip horizontally') self.action_flip_horizontal.triggered.connect(self.flip_horizontal) # Action Flip vertical self.action_flip_vertical = QAction( QIcon.fromTheme('object-flip-vertical'), 'Flip vertically', self) self.action_flip_vertical.setStatusTip('Flip vertically') self.action_flip_vertical.triggered.connect(self.flip_vertical) # Action Previous image self.action_previous_image = QAction(QIcon.fromTheme('go-previous'), 'Previous image', self) self.action_previous_image.setStatusTip('Previous image') self.action_previous_image.triggered.connect(self.previous_image) # Action Full screen self.action_fullscreen = QAction(QIcon.fromTheme('view-fullscreen'), 'Full screen', self) self.action_fullscreen.setStatusTip('Full screen') self.action_fullscreen.triggered.connect(self.fullscreen) # Action Normal size self.action_normal_size = QAction(QIcon.fromTheme('zoom-original'), 'Normal size', self) self.action_normal_size.setStatusTip('Normal Size') self.action_normal_size.triggered.connect(self.normal_size) # Action Fit Screen self.action_fit_screen = QAction(QIcon.fromTheme('zoom-fit-best'), 'Fit to screen', self) self.action_fit_screen.setStatusTip('Fit to screen') self.action_fit_screen.setCheckable(True) self.action_fit_screen.triggered.connect(self.fit_screen) # Action Zoom in self.action_zoom_in = QAction(QIcon.fromTheme('zoom-in'), 'Zoom in', self) self.action_zoom_in.setStatusTip('Zoom in') self.action_zoom_in.triggered.connect(self.zoom_in) # Action Zoom out self.action_zoom_out = QAction(QIcon.fromTheme('zoom-out'), 'Zoom out', self) self.action_zoom_out.setStatusTip('Zoom out') self.action_zoom_out.triggered.connect(self.zoom_out) # Action Fit height self.action_fit_vertical = QAction('Fit vertically', self) self.action_fit_vertical.setStatusTip('Fit vertically') self.action_fit_vertical.setCheckable(True) self.action_fit_vertical.triggered.connect(self.fit_height) # Action Fit width self.action_fit_horizontal = QAction('Fit horizontally', self) self.action_fit_horizontal.setStatusTip('Fit horizontally') self.action_fit_horizontal.setCheckable(True) self.action_fit_horizontal.triggered.connect(self.fit_width) # Action Fit width self.action_fit_horizontal = QAction('Fit horizontally', self) self.action_fit_horizontal.setStatusTip('Fit horizontally') self.action_fit_horizontal.setCheckable(True) self.action_fit_horizontal.triggered.connect(self.fit_width) # Action Image list self.action_image_gallery = QAction('Image gallery', self) self.action_image_gallery.setStatusTip('Image gallery') self.action_image_gallery.setCheckable(True) self.action_image_gallery.triggered.connect( self.image_gallery_triggered) # Action Next_image self.action_next_image = QAction(QIcon.fromTheme('go-next'), 'Next image', self) self.action_next_image.setStatusTip('Next image') self.action_next_image.triggered.connect(self.next_image) # Action First image self.action_first_image = QAction(QIcon.fromTheme('go-first'), 'First image', self) self.action_first_image.setStatusTip('First image') self.action_first_image.triggered.connect(self.first_image) # Action Last image self.action_last_image = QAction(QIcon.fromTheme('go-last'), 'Last image', self) self.action_last_image.setStatusTip('Last image') self.action_last_image.triggered.connect(self.last_image) # Action About self.action_about = QAction(QIcon.fromTheme('help-about'), 'About', self) self.action_about.setStatusTip('About') self.action_about.triggered.connect(self.about) def create_menubar(self): self.menubar = self.menuBar() # File self.menu_file = self.menubar.addMenu('File') self.menu_file.addAction(self.action_open) self.menu_file.addAction(self.action_save) self.menu_file.addSeparator() self.menu_file.addAction(self.action_copy) self.menu_file.addAction(self.action_move) self.menu_file.addAction(self.action_delete) self.menu_file.addSeparator() self.menu_file.addAction(self.action_quit) # Edit self.menu_edit = self.menubar.addMenu('Edit') self.menu_edit.addAction(self.action_rotate_left) self.menu_edit.addAction(self.action_rotate_right) self.menu_edit.addSeparator() self.menu_edit.addAction(self.action_flip_horizontal) self.menu_edit.addAction(self.action_flip_vertical) # View self.menu_view = self.menubar.addMenu('View') self.menu_view.addAction(self.action_fullscreen) self.menu_view.addAction(self.action_normal_size) self.menu_view.addAction(self.action_fit_screen) self.menu_view.addSeparator() self.menu_view.addAction(self.action_zoom_in) self.menu_view.addAction(self.action_zoom_out) self.menu_view.addSeparator() self.menu_view.addAction(self.action_fit_vertical) self.menu_view.addAction(self.action_fit_horizontal) self.menu_view.addSeparator() self.menu_view.addAction(self.action_image_gallery) # Go self.menu_go = self.menubar.addMenu('Go') self.menu_go.addAction(self.action_previous_image) self.menu_go.addAction(self.action_next_image) self.menu_go.addSeparator() self.menu_go.addAction(self.action_first_image) self.menu_go.addAction(self.action_last_image) # About self.menu_about = self.menubar.addMenu('About') self.menu_about.addAction(self.action_about) def create_toolbar(self): self.toolbar = self.addToolBar('Tool bar') self.toolbar.addAction(self.action_open) self.toolbar.addAction(self.action_save) self.toolbar.addSeparator() self.toolbar.addAction(self.action_fullscreen) self.toolbar.addAction(self.action_normal_size) self.toolbar.addAction(self.action_fit_screen) self.toolbar.addSeparator() self.toolbar.addAction(self.action_zoom_in) self.toolbar.addAction(self.action_zoom_out) self.toolbar.addSeparator() self.toolbar.addAction(self.action_rotate_left) self.toolbar.addAction(self.action_rotate_right) self.toolbar.addSeparator() self.toolbar.addAction(self.action_first_image) self.toolbar.addAction(self.action_previous_image) self.toolbar.addAction(self.action_next_image) self.toolbar.addAction(self.action_last_image) self.toolbar.addSeparator() self.toolbar.addAction(self.action_copy) self.toolbar.addAction(self.action_move) def load_settings(self): self.settings = QSettings() check_state = self.settings.value('view/image_gallery', True, type=bool) self.action_image_gallery.setChecked(check_state) self.image_gallery_triggered() def contextMenuEvent(self, QContextMenuEvent): menu = QMenu() menu.addAction(self.action_fullscreen) menu.addSeparator() menu.addAction(self.action_image_gallery) menu.addSeparator() menu.addAction(self.action_previous_image) menu.addAction(self.action_next_image) menu.addSeparator() menu.addAction(self.action_normal_size) menu.addAction(self.action_fit_screen) menu.addAction(self.action_fit_vertical) menu.addAction(self.action_fit_horizontal) menu.addSeparator() menu.addAction(self.action_zoom_in) menu.addAction(self.action_zoom_out) menu.addSeparator() menu.addAction(self.action_copy) menu.addAction(self.action_move) menu.addSeparator() menu.addAction(self.action_delete) menu.exec_(QContextMenuEvent.globalPos()) def eventFilter(self, obj, event): """ filter events for wheel events Args: obj (QWidget): scroll_area event (QEvent): event """ # try: if event.type() == QEvent.Wheel: if event.angleDelta().y() < 0: self.next_image() else: self.previous_image() return True elif event.type() == QEvent.MouseButtonPress and event.button( ) == Qt.RightButton: index = self.image_gallery.select_row_pos() if index > -1: self.index = index self.display_image() return True # pass the event on to the parent class return super(QMainWindow, self).eventFilter(obj, event) def keyPressEvent(self, event): key = event.key() if key == Qt.Key_Delete: self.delete() elif key == Qt.Key_Left: self.previous_image() elif key == Qt.Key_Right: self.next_image() elif key == Qt.Key_PageUp: self.first_image() elif key == Qt.Key_PageDown: self.last_image() elif key == Qt.Key_Escape and self.isFullScreen(): self.fullscreen() else: QWidget.keyPressEvent(self, event) def mouseDoubleClickEvent(self, QMouseEvent): self.fullscreen() def mousePressEvent(self, QMouseEvent): self.mouse_position = QMouseEvent.pos() def mouseMoveEvent(self, QMouseEvent): diff = QPoint(QMouseEvent.pos() - self.mouse_position) self.mouse_position = QMouseEvent.pos() self.scroll_area.verticalScrollBar().setValue( self.scroll_area.verticalScrollBar().value() - diff.y()) self.scroll_area.horizontalScrollBar().setValue( self.scroll_area.horizontalScrollBar().value() - diff.x()) def resizeEvent(self, event): if not self.index == -1: self.display_image() def create_images(self, filename): """Create image list Args: filename (string): file from which to retrieve the list of images in the folder """ self.images.clear() # get images only with an allowed extension for ext in self.extensions: self.images += glob.glob( os.path.join( glob.escape(os.path.dirname(filename)), '*.' + ''.join('[%s%s]' % (e.lower(), e.upper()) for e in ext))) self.images.sort() if filename in self.images: self.index = self.images.index(filename) else: self.index = -1 # iamge list self.image_gallery.add_images(self.images) def remove_index(self): """ remove file from list images and display next or previous image """ del self.images[self.index] self.image_gallery.remove_row(self.index) if len(self.images) == 0: self.images.clear() self.index = -1 self.image.clear() self.image.resize(self.image.minimumSizeHint()) elif self.index < len(self.images) - 1: self.display_image() else: self.index = len(self.images) - 1 self.display_image() def display_image(self): if not self.index == -1: self.image.clear() self.image.resize(self.image.minimumSizeHint()) file = self.images[self.index] if os.path.isfile(file): self.label_name.setText(file) self.label_numero.setText( str(self.index + 1) + ' / ' + str(len(self.images))) # image list self.image_gallery.select_row(self.index) image_reader = QImageReader(file) if image_reader.imageCount() > 1: # Animated image movie = QMovie(file) movie.setCacheMode(QMovie.CacheAll) movie.jumpToFrame(0) movie_size = movie.currentPixmap().size() self.image.setMovie(movie) self.image.resize(movie_size) movie.start() else: self.image.setPixmap(QPixmap(file)) self.image.resize(self.image.pixmap().size()) # fit image if self.action_fit_screen.isChecked(): self.fit_screen() elif self.action_fit_horizontal.isChecked(): self.fit_width() elif self.action_fit_vertical.isChecked(): self.fit_height() else: self.ratio = 1.0 self.action_zoom_in.setEnabled(True) self.action_zoom_out.setEnabled(True) # scrollbar position self.scroll_area.verticalScrollBar().setSliderPosition(0) self.scroll_area.horizontalScrollBar().setSliderPosition(0) def resize_image(self): if self.action_fit_screen.isChecked(): self.fit_screen() elif self.action_fit_horizontal.isChecked(): self.fit_width() elif self.action_fit_vertical.isChecked(): self.fit_height() elif self.image.pixmap(): self.image.resize(self.ratio * self.image.pixmap().size()) elif movie := self.image.movie(): movie.jumpToFrame(0) movie_size = movie.currentPixmap().size() self.image.resize(self.ratio * movie_size)
class EvelynDesktop(QStackedWidget): INTERVAL_SECS = 30 ALERT_SECS = 5 signal_get_ping = Signal() signal_post_history = Signal(int, QDateTime) def __init__( self, config_file: str ) -> None: super().__init__() # load config try: self.config = Config(config_file) except Exception as e: QMessageBox.critical(self, 'Config error', str(e)) QTimer.singleShot(0, self.close) return # load settings self.settings = Settings() # state self.state_key: Optional[int] = None # label widget self.label_ping = ClickableLabel('Loading ...', self.post_history) self.label_ping.setTextFormat(Qt.RichText) self.label_ping.setSizePolicy(QSizePolicy.Maximum, QSizePolicy.Maximum) layout_ping = QGridLayout() layout_ping.setContentsMargins(0, 0, 0, 0) layout_ping.addWidget(self.label_ping) self.widget_ping = QWidget() self.widget_ping.setLayout(layout_ping) self.addWidget(self.widget_ping) # alert widget self.label_alert = QLabel() self.label_alert.setWordWrap(True) self.label_alert.setAlignment(Qt.AlignCenter) self.label_alert.setStyleSheet(f'background: #dddddd;') self.addWidget(self.label_alert) # context menu self.action_report_done = QAction('Report done ...') self.action_report_done.triggered.connect(self.report_done) self.action_exit = QAction('Exit') self.action_exit.triggered.connect(self.close) self.action_frameless = QAction('Frameless window') self.action_frameless.setCheckable(True) self.action_frameless.triggered.connect(self.set_frameless_window) self.action_homepage = QAction('Open homepage') self.action_homepage.triggered.connect(self.open_homepage) self.context_menu = QMenu() self.context_menu.addAction(self.action_report_done) self.context_menu.addAction(self.action_exit) self.context_menu.addAction(self.action_frameless) self.context_menu.addAction(self.action_homepage) # threads self.thread_communication = QThread() self.thread_communication.start() # workers self.worker_communication = CommunicationWorker( netloc=self.config.netloc, base_path=self.config.base_path, api_key=self.config.api_key, guild=self.config.guild, member=self.config.member) self.worker_communication.moveToThread(self.thread_communication) # signals self.worker_communication.signal_get_ping_done.connect(self.get_ping_done) self.worker_communication.signal_post_history_done.connect(self.post_history_done) self.signal_get_ping.connect(self.worker_communication.get_ping) self.signal_post_history.connect(self.worker_communication.post_history) # get ping timer QTimer.singleShot(0, self.get_ping) self.timer_ping = QTimer() self.timer_ping.timeout.connect(self.get_ping) self.timer_ping.setTimerType(Qt.VeryCoarseTimer) self.timer_ping.start(self.INTERVAL_SECS * 1000) # switch label timer self.timer_label = QTimer() self.timer_label.timeout.connect(lambda: self.setCurrentWidget(self.widget_ping)) self.timer_label.setSingleShot(True) self.timer_label.setTimerType(Qt.CoarseTimer) # window attributes size = self.settings.get('window', 'size', type_=QSize) if size is not None: self.resize(size) pos = self.settings.get('window', 'pos', type_=QPoint) if pos is not None: self.move(pos) frameless = self.settings.get('window', 'frameless', type_=bool) if frameless is not None and frameless: QTimer.singleShot(100, self.action_frameless.trigger) self.setWindowFlag(Qt.WindowStaysOnTopHint, self.config.window_stays_on_top) self.setAttribute(Qt.WA_TranslucentBackground) self.setWindowTitle('Evelyn Reminder') def closeEvent( self, event: QCloseEvent ) -> None: # save settings with suppress_and_log_exception(): self.settings.set('window', 'size', self.size()) self.settings.set('window', 'pos', self.pos()) self.settings.set('window', 'frameless', bool(self.windowFlags() & Qt.FramelessWindowHint)) # stop communication thread with suppress_and_log_exception(): self.thread_communication.quit() self.thread_communication.wait() # done super().closeEvent(event) def contextMenuEvent( self, event: QContextMenuEvent ) -> None: self.context_menu.exec_(event.globalPos()) @Slot() def get_ping(self) -> None: logging.info('Get ping ...') self.signal_get_ping.emit() @Slot(int, str, str) def get_ping_done( self, key: int, text: str, color: str ) -> None: logging.info('Get ping done') if key == -1: self.state_key = None self.label_ping.setWordWrap(True) else: self.state_key = key self.label_ping.setWordWrap(False) self.label_ping.setText(text) self.widget_ping.setStyleSheet(f'background : {color}; ') @Slot() def post_history( self, date_time: QDateTime = QDateTime() ) -> None: # this method is called as Slot by ClickableLabel.mouseReleaseEvent() without arguments # this method is called directly by EvelynDesktop.report_done() with a date_time if self.state_key is None: return logging.info('Post history ...') self.label_alert.setText('Sending ...') self.label_alert.setStyleSheet(f'background: #dddddd;') self.setCurrentWidget(self.label_alert) self.signal_post_history.emit(self.state_key, date_time) @Slot(str, bool) def post_history_done( self, text: str, error: bool ) -> None: logging.info('Post history done') self.label_alert.setText(text) if error: self.label_alert.setStyleSheet(f'background: #dd4b4b;') self.timer_label.start(self.ALERT_SECS * 1000) # trigger instant ping update to avoid outdated info self.timer_ping.stop() self.timer_ping.start(self.INTERVAL_SECS * 1000) self.get_ping() @Slot() def report_done(self) -> None: self.timer_ping.stop() # stop ping update while dialog is open report_done_dialog = ReportDoneDialog(self) response = report_done_dialog.exec() if response != QDialog.Accepted: self.timer_ping.start(self.INTERVAL_SECS * 1000) self.get_ping() return date_time = report_done_dialog.get_date_time() self.post_history(date_time) @Slot(bool) def set_frameless_window( self, value: bool ) -> None: pos = self.pos() self.setWindowFlag(Qt.FramelessWindowHint, value) # workaround: window goes invisible otherwise self.setVisible(True) # workaround: window would move up otherwise if value: QTimer.singleShot(100, lambda: self.move(pos)) @Slot() def open_homepage(self) -> None: webbrowser.open('https://github.com/stefs/evelyn-reminder')
class Ui_IscApp(object): def setupUi(self, IscApp): if not IscApp.objectName(): IscApp.setObjectName(u"IscApp") IscApp.resize(1440, 923) IscApp.setCursor(QCursor(Qt.ArrowCursor)) IscApp.setMouseTracking(True) self.actionUndo = QAction(IscApp) self.actionUndo.setObjectName(u"actionUndo") self.actionRedo = QAction(IscApp) self.actionRedo.setObjectName(u"actionRedo") self.actionView_statusbar = QAction(IscApp) self.actionView_statusbar.setObjectName(u"actionView_statusbar") self.actionView_statusbar.setCheckable(True) self.actionView_statusbar.setChecked(True) self.actionView_step_preview = QAction(IscApp) self.actionView_step_preview.setObjectName(u"actionView_step_preview") self.actionView_step_preview.setCheckable(True) self.actionView_step_preview.setChecked(True) self.actionInsert = QAction(IscApp) self.actionInsert.setObjectName(u"actionInsert") self.actionShell_Image = QAction(IscApp) self.actionShell_Image.setObjectName(u"actionShell_Image") self.actionSection_steps = QAction(IscApp) self.actionSection_steps.setObjectName(u"actionSection_steps") self.actionAttach_audio = QAction(IscApp) self.actionAttach_audio.setObjectName(u"actionAttach_audio") self.actionBulk_crop = QAction(IscApp) self.actionBulk_crop.setObjectName(u"actionBulk_crop") self.actionView_demo_in_folder = QAction(IscApp) self.actionView_demo_in_folder.setObjectName(u"actionView_demo_in_folder") self.actionLoad_tool_state = QAction(IscApp) self.actionLoad_tool_state.setObjectName(u"actionLoad_tool_state") self.actionSave_tool_state = QAction(IscApp) self.actionSave_tool_state.setObjectName(u"actionSave_tool_state") self.actionOpen_DemoMate = QAction(IscApp) self.actionOpen_DemoMate.setObjectName(u"actionOpen_DemoMate") self.actionOpen_Cloudguides_Packaging = QAction(IscApp) self.actionOpen_Cloudguides_Packaging.setObjectName(u"actionOpen_Cloudguides_Packaging") self.actionAbout = QAction(IscApp) self.actionAbout.setObjectName(u"actionAbout") self.actionHelp_2 = QAction(IscApp) self.actionHelp_2.setObjectName(u"actionHelp_2") self.actionImage_Insert = QAction(IscApp) self.actionImage_Insert.setObjectName(u"actionImage_Insert") self.actionImage_Shelling = QAction(IscApp) self.actionImage_Shelling.setObjectName(u"actionImage_Shelling") self.actionHelp_3 = QAction(IscApp) self.actionHelp_3.setObjectName(u"actionHelp_3") self.actionBulk_insert_image = QAction(IscApp) self.actionBulk_insert_image.setObjectName(u"actionBulk_insert_image") self.actionBulk_shell_steps = QAction(IscApp) self.actionBulk_shell_steps.setObjectName(u"actionBulk_shell_steps") self.actionBulk_crop_step_assets = QAction(IscApp) self.actionBulk_crop_step_assets.setObjectName(u"actionBulk_crop_step_assets") self.actionAttach_audio_to_demo = QAction(IscApp) self.actionAttach_audio_to_demo.setObjectName(u"actionAttach_audio_to_demo") self.actionClose = QAction(IscApp) self.actionClose.setObjectName(u"actionClose") self.actionClose_2 = QAction(IscApp) self.actionClose_2.setObjectName(u"actionClose_2") self.actionFrom_demo_file = QAction(IscApp) self.actionFrom_demo_file.setObjectName(u"actionFrom_demo_file") self.actionFrom_exe_installer = QAction(IscApp) self.actionFrom_exe_installer.setObjectName(u"actionFrom_exe_installer") self.actionFrom_docx_file = QAction(IscApp) self.actionFrom_docx_file.setObjectName(u"actionFrom_docx_file") self.actionFrom_scripts_folder = QAction(IscApp) self.actionFrom_scripts_folder.setObjectName(u"actionFrom_scripts_folder") self.actionOverwrite = QAction(IscApp) self.actionOverwrite.setObjectName(u"actionOverwrite") self.actionMerge_demos = QAction(IscApp) self.actionMerge_demos.setObjectName(u"actionMerge_demos") self.actionLoad_audio_directory = QAction(IscApp) self.actionLoad_audio_directory.setObjectName(u"actionLoad_audio_directory") self.actionLoad_soundbite = QAction(IscApp) self.actionLoad_soundbite.setObjectName(u"actionLoad_soundbite") self.actionEdit_audio = QAction(IscApp) self.actionEdit_audio.setObjectName(u"actionEdit_audio") self.actionAttach_audio_to_demo_2 = QAction(IscApp) self.actionAttach_audio_to_demo_2.setObjectName(u"actionAttach_audio_to_demo_2") self.actionBulk_edit_demo_audio = QAction(IscApp) self.actionBulk_edit_demo_audio.setObjectName(u"actionBulk_edit_demo_audio") self.actionEdit_step_audio = QAction(IscApp) self.actionEdit_step_audio.setObjectName(u"actionEdit_step_audio") self.actionBulk_paste_image = QAction(IscApp) self.actionBulk_paste_image.setObjectName(u"actionBulk_paste_image") self.actionBulk_image_paste_wizard = QAction(IscApp) self.actionBulk_image_paste_wizard.setObjectName(u"actionBulk_image_paste_wizard") self.actionBulk_shell_demo_assets = QAction(IscApp) self.actionBulk_shell_demo_assets.setObjectName(u"actionBulk_shell_demo_assets") self.actionSection_demo = QAction(IscApp) self.actionSection_demo.setObjectName(u"actionSection_demo") self.actionBulk_resize_demo_assets = QAction(IscApp) self.actionBulk_resize_demo_assets.setObjectName(u"actionBulk_resize_demo_assets") self.actionBulk_crop_demo_assets = QAction(IscApp) self.actionBulk_crop_demo_assets.setObjectName(u"actionBulk_crop_demo_assets") self.actionPacing_wizard = QAction(IscApp) self.actionPacing_wizard.setObjectName(u"actionPacing_wizard") self.actionCompose_demos = QAction(IscApp) self.actionCompose_demos.setObjectName(u"actionCompose_demos") self.actionBulk_edit_demo_metadata = QAction(IscApp) self.actionBulk_edit_demo_metadata.setObjectName(u"actionBulk_edit_demo_metadata") self.actionLoad_script = QAction(IscApp) self.actionLoad_script.setObjectName(u"actionLoad_script") self.actionConvert_script = QAction(IscApp) self.actionConvert_script.setObjectName(u"actionConvert_script") self.actionSpelling_errors = QAction(IscApp) self.actionSpelling_errors.setObjectName(u"actionSpelling_errors") self.actionGrammar_errors = QAction(IscApp) self.actionGrammar_errors.setObjectName(u"actionGrammar_errors") self.actionProduction_notes = QAction(IscApp) self.actionProduction_notes.setObjectName(u"actionProduction_notes") self.actionTalking_points = QAction(IscApp) self.actionTalking_points.setObjectName(u"actionTalking_points") self.actionClick_instructions = QAction(IscApp) self.actionClick_instructions.setObjectName(u"actionClick_instructions") self.actionPackage_demo = QAction(IscApp) self.actionPackage_demo.setObjectName(u"actionPackage_demo") self.actionSingle_image = QAction(IscApp) self.actionSingle_image.setObjectName(u"actionSingle_image") self.actionMultiple_images = QAction(IscApp) self.actionMultiple_images.setObjectName(u"actionMultiple_images") self.actionImage_insert_wizar = QAction(IscApp) self.actionImage_insert_wizar.setObjectName(u"actionImage_insert_wizar") self.actionAdd_background_image = QAction(IscApp) self.actionAdd_background_image.setObjectName(u"actionAdd_background_image") self.actionAdd_background_and_wrapper = QAction(IscApp) self.actionAdd_background_and_wrapper.setObjectName(u"actionAdd_background_and_wrapper") self.actionShell_wizard = QAction(IscApp) self.actionShell_wizard.setObjectName(u"actionShell_wizard") self.actionCrop = QAction(IscApp) self.actionCrop.setObjectName(u"actionCrop") self.actionResize = QAction(IscApp) self.actionResize.setObjectName(u"actionResize") self.actionLoad_operation = QAction(IscApp) self.actionLoad_operation.setObjectName(u"actionLoad_operation") self.actionSave_operation = QAction(IscApp) self.actionSave_operation.setObjectName(u"actionSave_operation") self.actionClose_3 = QAction(IscApp) self.actionClose_3.setObjectName(u"actionClose_3") self.actionZoom_in = QAction(IscApp) self.actionZoom_in.setObjectName(u"actionZoom_in") self.actionAdd_scroll_section = QAction(IscApp) self.actionAdd_scroll_section.setObjectName(u"actionAdd_scroll_section") self.actionOpen_assets_folder = QAction(IscApp) self.actionOpen_assets_folder.setObjectName(u"actionOpen_assets_folder") self.actionUpload_to_CloudGuides = QAction(IscApp) self.actionUpload_to_CloudGuides.setObjectName(u"actionUpload_to_CloudGuides") self.actionSections = QAction(IscApp) self.actionSections.setObjectName(u"actionSections") self.actionsteps = QAction(IscApp) self.actionsteps.setObjectName(u"actionsteps") self.actionSection = QAction(IscApp) self.actionSection.setObjectName(u"actionSection") self.actionSteps_in_section = QAction(IscApp) self.actionSteps_in_section.setObjectName(u"actionSteps_in_section") self.actionFirst_step_in_section = QAction(IscApp) self.actionFirst_step_in_section.setObjectName(u"actionFirst_step_in_section") self.actionSet_section_as_animated = QAction(IscApp) self.actionSet_section_as_animated.setObjectName(u"actionSet_section_as_animated") self.actionSet_section_as_guided = QAction(IscApp) self.actionSet_section_as_guided.setObjectName(u"actionSet_section_as_guided") self.actionDelete = QAction(IscApp) self.actionDelete.setObjectName(u"actionDelete") self.actionDuplicate = QAction(IscApp) self.actionDuplicate.setObjectName(u"actionDuplicate") self.actionDuplicate_as_pacing = QAction(IscApp) self.actionDuplicate_as_pacing.setObjectName(u"actionDuplicate_as_pacing") self.actionMove = QAction(IscApp) self.actionMove.setObjectName(u"actionMove") self.actionMove_2 = QAction(IscApp) self.actionMove_2.setObjectName(u"actionMove_2") self.actionSet_as_animated = QAction(IscApp) self.actionSet_as_animated.setObjectName(u"actionSet_as_animated") self.actionSet_as_guided = QAction(IscApp) self.actionSet_as_guided.setObjectName(u"actionSet_as_guided") self.actionSet_as_scroll = QAction(IscApp) self.actionSet_as_scroll.setObjectName(u"actionSet_as_scroll") self.actionDecrement_step_delay = QAction(IscApp) self.actionDecrement_step_delay.setObjectName(u"actionDecrement_step_delay") self.actionIncrement_step_delay = QAction(IscApp) self.actionIncrement_step_delay.setObjectName(u"actionIncrement_step_delay") self.actionAdd_audio_2 = QAction(IscApp) self.actionAdd_audio_2.setObjectName(u"actionAdd_audio_2") self.actionDelete_audio = QAction(IscApp) self.actionDelete_audio.setObjectName(u"actionDelete_audio") self.actionEdit_audio_2 = QAction(IscApp) self.actionEdit_audio_2.setObjectName(u"actionEdit_audio_2") self.actionReplace_audio = QAction(IscApp) self.actionReplace_audio.setObjectName(u"actionReplace_audio") self.actionView_metadata = QAction(IscApp) self.actionView_metadata.setObjectName(u"actionView_metadata") self.actionAdd_audio_3 = QAction(IscApp) self.actionAdd_audio_3.setObjectName(u"actionAdd_audio_3") self.actionDelete_audio_2 = QAction(IscApp) self.actionDelete_audio_2.setObjectName(u"actionDelete_audio_2") self.actionReplace_audio_2 = QAction(IscApp) self.actionReplace_audio_2.setObjectName(u"actionReplace_audio_2") self.actionEdit_audio_3 = QAction(IscApp) self.actionEdit_audio_3.setObjectName(u"actionEdit_audio_3") self.actionIncrement_step_delay_2 = QAction(IscApp) self.actionIncrement_step_delay_2.setObjectName(u"actionIncrement_step_delay_2") self.actionDecrement_step_delay_2 = QAction(IscApp) self.actionDecrement_step_delay_2.setObjectName(u"actionDecrement_step_delay_2") self.actionPreview = QAction(IscApp) self.actionPreview.setObjectName(u"actionPreview") self.actionView_in_folder = QAction(IscApp) self.actionView_in_folder.setObjectName(u"actionView_in_folder") self.actionEdit = QAction(IscApp) self.actionEdit.setObjectName(u"actionEdit") self.actionReplace_image = QAction(IscApp) self.actionReplace_image.setObjectName(u"actionReplace_image") self.actionView_metadata_2 = QAction(IscApp) self.actionView_metadata_2.setObjectName(u"actionView_metadata_2") self.actionLoad_SoundBite = QAction(IscApp) self.actionLoad_SoundBite.setObjectName(u"actionLoad_SoundBite") self.actionFrom_recording = QAction(IscApp) self.actionFrom_recording.setObjectName(u"actionFrom_recording") self.actionAs_new_version = QAction(IscApp) self.actionAs_new_version.setObjectName(u"actionAs_new_version") self.actionAs_new_round = QAction(IscApp) self.actionAs_new_round.setObjectName(u"actionAs_new_round") self.actionExport_to_installer = QAction(IscApp) self.actionExport_to_installer.setObjectName(u"actionExport_to_installer") self.actionExport_to_Cloudguide = QAction(IscApp) self.actionExport_to_Cloudguide.setObjectName(u"actionExport_to_Cloudguide") self.actionTo_installer = QAction(IscApp) self.actionTo_installer.setObjectName(u"actionTo_installer") self.actionTo_Cloudguide = QAction(IscApp) self.actionTo_Cloudguide.setObjectName(u"actionTo_Cloudguide") self.actionOverwrite_2 = QAction(IscApp) self.actionOverwrite_2.setObjectName(u"actionOverwrite_2") self.actionAs_new_version_2 = QAction(IscApp) self.actionAs_new_version_2.setObjectName(u"actionAs_new_version_2") self.actionAs_new_round_2 = QAction(IscApp) self.actionAs_new_round_2.setObjectName(u"actionAs_new_round_2") self.actionAs_txt = QAction(IscApp) self.actionAs_txt.setObjectName(u"actionAs_txt") self.actionTo_new_directory = QAction(IscApp) self.actionTo_new_directory.setObjectName(u"actionTo_new_directory") self.actionOverwrite_3 = QAction(IscApp) self.actionOverwrite_3.setObjectName(u"actionOverwrite_3") self.actionClose_window = QAction(IscApp) self.actionClose_window.setObjectName(u"actionClose_window") self.actionReset_demo = QAction(IscApp) self.actionReset_demo.setObjectName(u"actionReset_demo") self.actionNew = QAction(IscApp) self.actionNew.setObjectName(u"actionNew") self.actionNew_operation = QAction(IscApp) self.actionNew_operation.setObjectName(u"actionNew_operation") self.actionAdd_step = QAction(IscApp) self.actionAdd_step.setObjectName(u"actionAdd_step") self.actionPreferences = QAction(IscApp) self.actionPreferences.setObjectName(u"actionPreferences") self.actionAdd_text_box = QAction(IscApp) self.actionAdd_text_box.setObjectName(u"actionAdd_text_box") self.actionAdd_highlight = QAction(IscApp) self.actionAdd_highlight.setObjectName(u"actionAdd_highlight") self.actionAdd_jump_box = QAction(IscApp) self.actionAdd_jump_box.setObjectName(u"actionAdd_jump_box") self.actionSet_animated = QAction(IscApp) self.actionSet_animated.setObjectName(u"actionSet_animated") self.actionSet_guided = QAction(IscApp) self.actionSet_guided.setObjectName(u"actionSet_guided") self.actionEdit_XML = QAction(IscApp) self.actionEdit_XML.setObjectName(u"actionEdit_XML") self.actionFrom_capture = QAction(IscApp) self.actionFrom_capture.setObjectName(u"actionFrom_capture") self.actionCapture_image_edt_macro = QAction(IscApp) self.actionCapture_image_edt_macro.setObjectName(u"actionCapture_image_edt_macro") self.actionNew_tab = QAction(IscApp) self.actionNew_tab.setObjectName(u"actionNew_tab") self.actionNew_2 = QAction(IscApp) self.actionNew_2.setObjectName(u"actionNew_2") self.actionTo_new_version = QAction(IscApp) self.actionTo_new_version.setObjectName(u"actionTo_new_version") self.actionTo_new_round = QAction(IscApp) self.actionTo_new_round.setObjectName(u"actionTo_new_round") self.actionSteps = QAction(IscApp) self.actionSteps.setObjectName(u"actionSteps") self.actionOverwrite_existing = QAction(IscApp) self.actionOverwrite_existing.setObjectName(u"actionOverwrite_existing") self.actionSave = QAction(IscApp) self.actionSave.setObjectName(u"actionSave") self.actionDemo = QAction(IscApp) self.actionDemo.setObjectName(u"actionDemo") self.actionAudio = QAction(IscApp) self.actionAudio.setObjectName(u"actionAudio") self.actionScript = QAction(IscApp) self.actionScript.setObjectName(u"actionScript") self.actionView_menubar = QAction(IscApp) self.actionView_menubar.setObjectName(u"actionView_menubar") self.actionView_menubar.setCheckable(True) self.actionView_in_file_explorer = QAction(IscApp) self.actionView_in_file_explorer.setObjectName(u"actionView_in_file_explorer") self.actionView_menubar_2 = QAction(IscApp) self.actionView_menubar_2.setObjectName(u"actionView_menubar_2") self.actionView_menubar_2.setCheckable(True) self.actionZoom_out = QAction(IscApp) self.actionZoom_out.setObjectName(u"actionZoom_out") self.actionReset_zoom = QAction(IscApp) self.actionReset_zoom.setObjectName(u"actionReset_zoom") self.actionNewStep = QAction(IscApp) self.actionNewStep.setObjectName(u"actionNewStep") self.actionOpenDemo = QAction(IscApp) self.actionOpenDemo.setObjectName(u"actionOpenDemo") self.menubar = QMenuBar(IscApp) self.menubar.setObjectName(u"menubar") self.menubar.setGeometry(QRect(0, 0, 1440, 22)) self.menubar.setDefaultUp(False) self.menuFile = QMenu(self.menubar) self.menuFile.setObjectName(u"menuFile") self.menuExport_2 = QMenu(self.menuFile) self.menuExport_2.setObjectName(u"menuExport_2") self.menuNew = QMenu(self.menuFile) self.menuNew.setObjectName(u"menuNew") self.menuOpen = QMenu(self.menuFile) self.menuOpen.setObjectName(u"menuOpen") self.menuEdit = QMenu(self.menubar) self.menuEdit.setObjectName(u"menuEdit") self.menuSelect_all = QMenu(self.menuEdit) self.menuSelect_all.setObjectName(u"menuSelect_all") self.menuSelect_associated = QMenu(self.menuEdit) self.menuSelect_associated.setObjectName(u"menuSelect_associated") self.menuView = QMenu(self.menubar) self.menuView.setObjectName(u"menuView") self.menuView.setTearOffEnabled(False) self.menuView.setToolTipsVisible(True) self.menuZoom = QMenu(self.menuView) self.menuZoom.setObjectName(u"menuZoom") self.menuTools = QMenu(self.menubar) self.menuTools.setObjectName(u"menuTools") self.menuAudio = QMenu(self.menuTools) self.menuAudio.setObjectName(u"menuAudio") self.menuImage = QMenu(self.menuTools) self.menuImage.setObjectName(u"menuImage") self.menuInsert = QMenu(self.menuImage) self.menuInsert.setObjectName(u"menuInsert") self.menuShell = QMenu(self.menuImage) self.menuShell.setObjectName(u"menuShell") self.menuDemo = QMenu(self.menuTools) self.menuDemo.setObjectName(u"menuDemo") self.menuScript = QMenu(self.menuTools) self.menuScript.setObjectName(u"menuScript") self.menuCheck_script_for = QMenu(self.menuScript) self.menuCheck_script_for.setObjectName(u"menuCheck_script_for") self.menuClear = QMenu(self.menuScript) self.menuClear.setObjectName(u"menuClear") self.menuWeb = QMenu(self.menuTools) self.menuWeb.setObjectName(u"menuWeb") self.menuSection = QMenu(self.menuTools) self.menuSection.setObjectName(u"menuSection") self.menuPacing = QMenu(self.menuSection) self.menuPacing.setObjectName(u"menuPacing") self.menuAudio_2 = QMenu(self.menuSection) self.menuAudio_2.setObjectName(u"menuAudio_2") self.menuStep = QMenu(self.menuTools) self.menuStep.setObjectName(u"menuStep") self.menuAudio_3 = QMenu(self.menuStep) self.menuAudio_3.setObjectName(u"menuAudio_3") self.menuPacing_2 = QMenu(self.menuStep) self.menuPacing_2.setObjectName(u"menuPacing_2") self.menuImage_2 = QMenu(self.menuStep) self.menuImage_2.setObjectName(u"menuImage_2") self.menuWindow = QMenu(self.menubar) self.menuWindow.setObjectName(u"menuWindow") self.menuHelp = QMenu(self.menubar) self.menuHelp.setObjectName(u"menuHelp") self.menuHow_do_I = QMenu(self.menuHelp) self.menuHow_do_I.setObjectName(u"menuHow_do_I") IscApp.setMenuBar(self.menubar) self.statusbar = QStatusBar(IscApp) self.statusbar.setObjectName(u"statusbar") self.statusbar.setMinimumSize(QSize(0, 30)) self.statusbar.setSizeGripEnabled(False) IscApp.setStatusBar(self.statusbar) self.menubar.addAction(self.menuFile.menuAction()) self.menubar.addAction(self.menuEdit.menuAction()) self.menubar.addAction(self.menuView.menuAction()) self.menubar.addAction(self.menuTools.menuAction()) self.menubar.addAction(self.menuWindow.menuAction()) self.menubar.addAction(self.menuHelp.menuAction()) self.menuFile.addSeparator() self.menuFile.addSeparator() self.menuFile.addAction(self.menuNew.menuAction()) self.menuFile.addAction(self.menuOpen.menuAction()) self.menuFile.addAction(self.actionSave) self.menuFile.addAction(self.menuExport_2.menuAction()) self.menuExport_2.addAction(self.actionDemo) self.menuExport_2.addAction(self.actionAudio) self.menuExport_2.addAction(self.actionScript) self.menuNew.addAction(self.actionNewStep) self.menuOpen.addAction(self.actionOpenDemo) self.menuEdit.addAction(self.actionUndo) self.menuEdit.addAction(self.actionRedo) self.menuEdit.addSeparator() self.menuEdit.addAction(self.menuSelect_all.menuAction()) self.menuEdit.addSeparator() self.menuEdit.addAction(self.menuSelect_associated.menuAction()) self.menuSelect_all.addAction(self.actionSections) self.menuSelect_all.addAction(self.actionsteps) self.menuSelect_associated.addAction(self.actionSection) self.menuSelect_associated.addAction(self.actionSteps_in_section) self.menuSelect_associated.addAction(self.actionFirst_step_in_section) self.menuView.addAction(self.actionView_statusbar) self.menuView.addAction(self.actionView_step_preview) self.menuView.addAction(self.actionView_demo_in_folder) self.menuView.addSeparator() self.menuView.addAction(self.menuZoom.menuAction()) self.menuView.addAction(self.actionView_menubar) self.menuView.addAction(self.actionView_in_file_explorer) self.menuView.addSeparator() self.menuView.addAction(self.actionView_menubar_2) self.menuZoom.addAction(self.actionZoom_in) self.menuZoom.addAction(self.actionZoom_out) self.menuZoom.addAction(self.actionReset_zoom) self.menuTools.addAction(self.menuAudio.menuAction()) self.menuTools.addAction(self.menuImage.menuAction()) self.menuTools.addAction(self.menuDemo.menuAction()) self.menuTools.addAction(self.menuScript.menuAction()) self.menuTools.addAction(self.menuWeb.menuAction()) self.menuTools.addSeparator() self.menuTools.addAction(self.menuSection.menuAction()) self.menuTools.addAction(self.menuStep.menuAction()) self.menuTools.addSeparator() self.menuTools.addAction(self.actionPreferences) self.menuAudio.addAction(self.actionAttach_audio_to_demo_2) self.menuAudio.addAction(self.actionBulk_edit_demo_audio) self.menuAudio.addAction(self.actionEdit_step_audio) self.menuImage.addAction(self.actionBulk_paste_image) self.menuImage.addAction(self.actionBulk_image_paste_wizard) self.menuImage.addAction(self.actionBulk_shell_demo_assets) self.menuImage.addAction(self.menuInsert.menuAction()) self.menuImage.addAction(self.menuShell.menuAction()) self.menuImage.addAction(self.actionCrop) self.menuImage.addAction(self.actionResize) self.menuImage.addAction(self.actionCapture_image_edt_macro) self.menuInsert.addAction(self.actionSingle_image) self.menuInsert.addAction(self.actionMultiple_images) self.menuInsert.addAction(self.actionImage_insert_wizar) self.menuShell.addAction(self.actionAdd_background_image) self.menuShell.addAction(self.actionAdd_background_and_wrapper) self.menuShell.addAction(self.actionShell_wizard) self.menuDemo.addAction(self.actionSection_demo) self.menuDemo.addAction(self.actionPacing_wizard) self.menuDemo.addAction(self.actionCompose_demos) self.menuDemo.addAction(self.actionBulk_edit_demo_metadata) self.menuDemo.addAction(self.actionPackage_demo) self.menuDemo.addAction(self.actionAdd_scroll_section) self.menuDemo.addAction(self.actionAdd_step) self.menuDemo.addAction(self.actionEdit_XML) self.menuScript.addAction(self.actionLoad_script) self.menuScript.addAction(self.actionConvert_script) self.menuScript.addAction(self.menuCheck_script_for.menuAction()) self.menuScript.addAction(self.menuClear.menuAction()) self.menuCheck_script_for.addAction(self.actionSpelling_errors) self.menuCheck_script_for.addAction(self.actionGrammar_errors) self.menuCheck_script_for.addAction(self.actionProduction_notes) self.menuClear.addAction(self.actionTalking_points) self.menuClear.addAction(self.actionClick_instructions) self.menuWeb.addAction(self.actionUpload_to_CloudGuides) self.menuSection.addAction(self.actionSet_section_as_animated) self.menuSection.addAction(self.actionSet_section_as_guided) self.menuSection.addAction(self.actionMove_2) self.menuSection.addSeparator() self.menuSection.addAction(self.actionSet_as_animated) self.menuSection.addAction(self.actionSet_as_guided) self.menuSection.addAction(self.actionSet_as_scroll) self.menuSection.addSeparator() self.menuSection.addAction(self.menuAudio_2.menuAction()) self.menuSection.addAction(self.menuPacing.menuAction()) self.menuSection.addSeparator() self.menuSection.addAction(self.actionView_metadata) self.menuPacing.addAction(self.actionDecrement_step_delay) self.menuPacing.addAction(self.actionIncrement_step_delay) self.menuAudio_2.addAction(self.actionAdd_audio_2) self.menuAudio_2.addAction(self.actionDelete_audio) self.menuAudio_2.addAction(self.actionEdit_audio_2) self.menuAudio_2.addAction(self.actionReplace_audio) self.menuStep.addAction(self.actionDelete) self.menuStep.addAction(self.actionDuplicate) self.menuStep.addAction(self.actionDuplicate_as_pacing) self.menuStep.addAction(self.actionMove) self.menuStep.addSeparator() self.menuStep.addAction(self.menuAudio_3.menuAction()) self.menuStep.addAction(self.menuPacing_2.menuAction()) self.menuStep.addAction(self.menuImage_2.menuAction()) self.menuStep.addSeparator() self.menuStep.addAction(self.actionAdd_text_box) self.menuStep.addAction(self.actionAdd_highlight) self.menuStep.addAction(self.actionAdd_jump_box) self.menuStep.addSeparator() self.menuStep.addAction(self.actionSet_animated) self.menuStep.addAction(self.actionSet_guided) self.menuStep.addAction(self.actionFrom_capture) self.menuAudio_3.addAction(self.actionAdd_audio_3) self.menuAudio_3.addAction(self.actionDelete_audio_2) self.menuAudio_3.addAction(self.actionReplace_audio_2) self.menuAudio_3.addAction(self.actionEdit_audio_3) self.menuPacing_2.addAction(self.actionIncrement_step_delay_2) self.menuPacing_2.addAction(self.actionDecrement_step_delay_2) self.menuImage_2.addAction(self.actionPreview) self.menuImage_2.addAction(self.actionView_in_folder) self.menuImage_2.addAction(self.actionEdit) self.menuImage_2.addAction(self.actionReplace_image) self.menuWindow.addAction(self.actionOpen_DemoMate) self.menuWindow.addAction(self.actionOpen_Cloudguides_Packaging) self.menuWindow.addAction(self.actionClose) self.menuWindow.addAction(self.actionOpen_assets_folder) self.menuHelp.addAction(self.actionAbout) self.menuHelp.addSeparator() self.menuHelp.addAction(self.menuHow_do_I.menuAction()) self.menuHelp.addSeparator() self.menuHow_do_I.addAction(self.actionBulk_insert_image) self.menuHow_do_I.addAction(self.actionBulk_shell_steps) self.menuHow_do_I.addAction(self.actionBulk_crop_step_assets) self.menuHow_do_I.addAction(self.actionAttach_audio_to_demo) self.retranslateUi(IscApp) QMetaObject.connectSlotsByName(IscApp) # setupUi def retranslateUi(self, IscApp): IscApp.setWindowTitle(QCoreApplication.translate("IscApp", u"IscApp", None)) self.actionUndo.setText(QCoreApplication.translate("IscApp", u"Undo", None)) self.actionRedo.setText(QCoreApplication.translate("IscApp", u"Redo", None)) self.actionView_statusbar.setText(QCoreApplication.translate("IscApp", u"View statusbar", None)) self.actionView_step_preview.setText(QCoreApplication.translate("IscApp", u"View step preview", None)) self.actionInsert.setText(QCoreApplication.translate("IscApp", u"Insert Image", None)) self.actionShell_Image.setText(QCoreApplication.translate("IscApp", u"Shell Image", None)) self.actionSection_steps.setText(QCoreApplication.translate("IscApp", u"Section steps", None)) self.actionAttach_audio.setText(QCoreApplication.translate("IscApp", u"Attach audio", None)) self.actionBulk_crop.setText(QCoreApplication.translate("IscApp", u"Bulk crop", None)) self.actionView_demo_in_folder.setText(QCoreApplication.translate("IscApp", u"View demo in folder", None)) self.actionLoad_tool_state.setText(QCoreApplication.translate("IscApp", u"Load tool state", None)) self.actionSave_tool_state.setText(QCoreApplication.translate("IscApp", u"Save tool state", None)) self.actionOpen_DemoMate.setText(QCoreApplication.translate("IscApp", u"Open Demo in DemoMate", None)) self.actionOpen_Cloudguides_Packaging.setText(QCoreApplication.translate("IscApp", u"Open Cloudguides Packaging tool", None)) self.actionAbout.setText(QCoreApplication.translate("IscApp", u"About", None)) self.actionHelp_2.setText(QCoreApplication.translate("IscApp", u"Help", None)) self.actionImage_Insert.setText(QCoreApplication.translate("IscApp", u"Insert image", None)) self.actionImage_Shelling.setText(QCoreApplication.translate("IscApp", u"Shell image", None)) self.actionHelp_3.setText(QCoreApplication.translate("IscApp", u"Help", None)) self.actionBulk_insert_image.setText(QCoreApplication.translate("IscApp", u"Bulk insert image into step assets", None)) self.actionBulk_shell_steps.setText(QCoreApplication.translate("IscApp", u"Bulk shell step assets", None)) self.actionBulk_crop_step_assets.setText(QCoreApplication.translate("IscApp", u"Bulk crop step assets", None)) self.actionAttach_audio_to_demo.setText(QCoreApplication.translate("IscApp", u"Attach audio to demo", None)) self.actionClose.setText(QCoreApplication.translate("IscApp", u"Open folder containing demo", None)) self.actionClose_2.setText(QCoreApplication.translate("IscApp", u"Close", None)) self.actionFrom_demo_file.setText(QCoreApplication.translate("IscApp", u"From .demo file", None)) self.actionFrom_exe_installer.setText(QCoreApplication.translate("IscApp", u"From .exe installer", None)) self.actionFrom_docx_file.setText(QCoreApplication.translate("IscApp", u"From .docx file", None)) self.actionFrom_scripts_folder.setText(QCoreApplication.translate("IscApp", u"From scripts folder", None)) self.actionOverwrite.setText(QCoreApplication.translate("IscApp", u"Overwrite", None)) self.actionMerge_demos.setText(QCoreApplication.translate("IscApp", u"Merge demos", None)) self.actionLoad_audio_directory.setText(QCoreApplication.translate("IscApp", u"Load Audio", None)) self.actionLoad_soundbite.setText(QCoreApplication.translate("IscApp", u"Load from .zip", None)) self.actionEdit_audio.setText(QCoreApplication.translate("IscApp", u"Edit audio", None)) self.actionAttach_audio_to_demo_2.setText(QCoreApplication.translate("IscApp", u"Attach audio to demo", None)) self.actionBulk_edit_demo_audio.setText(QCoreApplication.translate("IscApp", u"Bulk edit demo audio", None)) self.actionEdit_step_audio.setText(QCoreApplication.translate("IscApp", u"Edit step audio", None)) self.actionBulk_paste_image.setText(QCoreApplication.translate("IscApp", u"Bulk paste image", None)) self.actionBulk_image_paste_wizard.setText(QCoreApplication.translate("IscApp", u"Bulk image paste wizard", None)) self.actionBulk_shell_demo_assets.setText(QCoreApplication.translate("IscApp", u"Bulk shell demo assets", None)) self.actionSection_demo.setText(QCoreApplication.translate("IscApp", u"Section demo", None)) self.actionBulk_resize_demo_assets.setText(QCoreApplication.translate("IscApp", u"Bulk resize demo assets", None)) self.actionBulk_crop_demo_assets.setText(QCoreApplication.translate("IscApp", u"Bulk crop demo assets", None)) self.actionPacing_wizard.setText(QCoreApplication.translate("IscApp", u"Open pacing wizard", None)) self.actionCompose_demos.setText(QCoreApplication.translate("IscApp", u"Compose demos", None)) self.actionBulk_edit_demo_metadata.setText(QCoreApplication.translate("IscApp", u"View/edit metadata", None)) self.actionLoad_script.setText(QCoreApplication.translate("IscApp", u"Load Script", None)) #if QT_CONFIG(shortcut) self.actionLoad_script.setShortcut(QCoreApplication.translate("IscApp", u"Alt+Shift+S", None)) #endif // QT_CONFIG(shortcut) self.actionConvert_script.setText(QCoreApplication.translate("IscApp", u"Convert script", None)) self.actionSpelling_errors.setText(QCoreApplication.translate("IscApp", u"Spelling errors", None)) self.actionGrammar_errors.setText(QCoreApplication.translate("IscApp", u"Grammar errors", None)) self.actionProduction_notes.setText(QCoreApplication.translate("IscApp", u"Production notes", None)) self.actionTalking_points.setText(QCoreApplication.translate("IscApp", u"Talking points", None)) self.actionClick_instructions.setText(QCoreApplication.translate("IscApp", u"Click instructions", None)) self.actionPackage_demo.setText(QCoreApplication.translate("IscApp", u"Package demo", None)) self.actionSingle_image.setText(QCoreApplication.translate("IscApp", u"Single image", None)) self.actionMultiple_images.setText(QCoreApplication.translate("IscApp", u"Multiple images", None)) self.actionImage_insert_wizar.setText(QCoreApplication.translate("IscApp", u"From asset region", None)) self.actionAdd_background_image.setText(QCoreApplication.translate("IscApp", u"Add background image", None)) self.actionAdd_background_and_wrapper.setText(QCoreApplication.translate("IscApp", u"Add background and wrapper", None)) self.actionShell_wizard.setText(QCoreApplication.translate("IscApp", u"Shell wizard", None)) self.actionCrop.setText(QCoreApplication.translate("IscApp", u"Crop", None)) self.actionResize.setText(QCoreApplication.translate("IscApp", u"Resize", None)) self.actionLoad_operation.setText(QCoreApplication.translate("IscApp", u"Add operation...", None)) self.actionSave_operation.setText(QCoreApplication.translate("IscApp", u"Load operation...", None)) self.actionClose_3.setText(QCoreApplication.translate("IscApp", u"Save operation...", None)) self.actionZoom_in.setText(QCoreApplication.translate("IscApp", u"Zoom in", None)) self.actionAdd_scroll_section.setText(QCoreApplication.translate("IscApp", u"Add scroll section", None)) self.actionOpen_assets_folder.setText(QCoreApplication.translate("IscApp", u"Open assets folder", None)) self.actionUpload_to_CloudGuides.setText(QCoreApplication.translate("IscApp", u"Upload to CloudGuides", None)) self.actionSections.setText(QCoreApplication.translate("IscApp", u"Sections", None)) self.actionsteps.setText(QCoreApplication.translate("IscApp", u"Steps", None)) self.actionSection.setText(QCoreApplication.translate("IscApp", u"Section", None)) self.actionSteps_in_section.setText(QCoreApplication.translate("IscApp", u"Steps in section", None)) self.actionFirst_step_in_section.setText(QCoreApplication.translate("IscApp", u"First step in section", None)) self.actionSet_section_as_animated.setText(QCoreApplication.translate("IscApp", u"Delete", None)) self.actionSet_section_as_guided.setText(QCoreApplication.translate("IscApp", u"Duplicate", None)) self.actionDelete.setText(QCoreApplication.translate("IscApp", u"Delete", None)) self.actionDuplicate.setText(QCoreApplication.translate("IscApp", u"Duplicate", None)) self.actionDuplicate_as_pacing.setText(QCoreApplication.translate("IscApp", u"Duplicate as pacing", None)) self.actionMove.setText(QCoreApplication.translate("IscApp", u"Move", None)) self.actionMove_2.setText(QCoreApplication.translate("IscApp", u"Move", None)) self.actionSet_as_animated.setText(QCoreApplication.translate("IscApp", u"Set as animated", None)) self.actionSet_as_guided.setText(QCoreApplication.translate("IscApp", u"Set as guided", None)) self.actionSet_as_scroll.setText(QCoreApplication.translate("IscApp", u"Set as scroll", None)) self.actionDecrement_step_delay.setText(QCoreApplication.translate("IscApp", u"Decrement step delay", None)) self.actionIncrement_step_delay.setText(QCoreApplication.translate("IscApp", u"Increment step delay", None)) self.actionAdd_audio_2.setText(QCoreApplication.translate("IscApp", u"Add audio", None)) self.actionDelete_audio.setText(QCoreApplication.translate("IscApp", u"Delete audio", None)) self.actionEdit_audio_2.setText(QCoreApplication.translate("IscApp", u"Edit audio", None)) self.actionReplace_audio.setText(QCoreApplication.translate("IscApp", u"Replace audio", None)) self.actionView_metadata.setText(QCoreApplication.translate("IscApp", u"View metadata", None)) self.actionAdd_audio_3.setText(QCoreApplication.translate("IscApp", u"Add audio", None)) self.actionDelete_audio_2.setText(QCoreApplication.translate("IscApp", u"Delete audio", None)) self.actionReplace_audio_2.setText(QCoreApplication.translate("IscApp", u"Replace audio", None)) self.actionEdit_audio_3.setText(QCoreApplication.translate("IscApp", u"Edit audio", None)) self.actionIncrement_step_delay_2.setText(QCoreApplication.translate("IscApp", u"Increment step delay", None)) self.actionDecrement_step_delay_2.setText(QCoreApplication.translate("IscApp", u"Decrement step delay", None)) self.actionPreview.setText(QCoreApplication.translate("IscApp", u"Preview image", None)) self.actionView_in_folder.setText(QCoreApplication.translate("IscApp", u"View in folder", None)) self.actionEdit.setText(QCoreApplication.translate("IscApp", u"Edit image", None)) self.actionReplace_image.setText(QCoreApplication.translate("IscApp", u"Replace image", None)) self.actionView_metadata_2.setText(QCoreApplication.translate("IscApp", u"View metadata", None)) self.actionLoad_SoundBite.setText(QCoreApplication.translate("IscApp", u"Load soundbite", None)) self.actionFrom_recording.setText(QCoreApplication.translate("IscApp", u"From recording", None)) self.actionAs_new_version.setText(QCoreApplication.translate("IscApp", u"As new version", None)) self.actionAs_new_round.setText(QCoreApplication.translate("IscApp", u"As new round", None)) self.actionExport_to_installer.setText(QCoreApplication.translate("IscApp", u"Export to installer", None)) self.actionExport_to_Cloudguide.setText(QCoreApplication.translate("IscApp", u"Export to Cloudguide", None)) self.actionTo_installer.setText(QCoreApplication.translate("IscApp", u"To installer", None)) self.actionTo_Cloudguide.setText(QCoreApplication.translate("IscApp", u"To Cloudguide", None)) self.actionOverwrite_2.setText(QCoreApplication.translate("IscApp", u"Overwrite", None)) self.actionAs_new_version_2.setText(QCoreApplication.translate("IscApp", u"As new version", None)) self.actionAs_new_round_2.setText(QCoreApplication.translate("IscApp", u"As new round", None)) self.actionAs_txt.setText(QCoreApplication.translate("IscApp", u"As .txt", None)) self.actionTo_new_directory.setText(QCoreApplication.translate("IscApp", u"To new directory", None)) self.actionOverwrite_3.setText(QCoreApplication.translate("IscApp", u"Overwrite", None)) self.actionClose_window.setText(QCoreApplication.translate("IscApp", u"Close window", None)) self.actionReset_demo.setText(QCoreApplication.translate("IscApp", u"Reset demo", None)) self.actionNew.setText(QCoreApplication.translate("IscApp", u"New...", None)) self.actionNew_operation.setText(QCoreApplication.translate("IscApp", u"New operation...", None)) self.actionAdd_step.setText(QCoreApplication.translate("IscApp", u"Add step", None)) self.actionPreferences.setText(QCoreApplication.translate("IscApp", u"Preferences", None)) self.actionAdd_text_box.setText(QCoreApplication.translate("IscApp", u"Add text box", None)) self.actionAdd_highlight.setText(QCoreApplication.translate("IscApp", u"Add highlight", None)) self.actionAdd_jump_box.setText(QCoreApplication.translate("IscApp", u"Add jump box", None)) self.actionSet_animated.setText(QCoreApplication.translate("IscApp", u"Set animated", None)) self.actionSet_guided.setText(QCoreApplication.translate("IscApp", u"Set guided", None)) self.actionEdit_XML.setText(QCoreApplication.translate("IscApp", u"Edit XML", None)) self.actionFrom_capture.setText(QCoreApplication.translate("IscApp", u"From capture", None)) self.actionCapture_image_edt_macro.setText(QCoreApplication.translate("IscApp", u"Capture image edt macro", None)) self.actionNew_tab.setText(QCoreApplication.translate("IscApp", u"New tab", None)) self.actionNew_2.setText(QCoreApplication.translate("IscApp", u"New...", None)) self.actionTo_new_version.setText(QCoreApplication.translate("IscApp", u"To new version", None)) self.actionTo_new_round.setText(QCoreApplication.translate("IscApp", u"To new round", None)) self.actionSteps.setText(QCoreApplication.translate("IscApp", u"Steps...", None)) self.actionOverwrite_existing.setText(QCoreApplication.translate("IscApp", u"Overwrite existing", None)) self.actionSave.setText(QCoreApplication.translate("IscApp", u"Save...", None)) self.actionDemo.setText(QCoreApplication.translate("IscApp", u"Demo...", None)) self.actionAudio.setText(QCoreApplication.translate("IscApp", u"Audio...", None)) self.actionScript.setText(QCoreApplication.translate("IscApp", u"Script..", None)) self.actionView_menubar.setText(QCoreApplication.translate("IscApp", u"View console", None)) self.actionView_in_file_explorer.setText(QCoreApplication.translate("IscApp", u"View in file explorer", None)) #if QT_CONFIG(shortcut) self.actionView_in_file_explorer.setShortcut(QCoreApplication.translate("IscApp", u"Ctrl+Shift+F", None)) #endif // QT_CONFIG(shortcut) self.actionView_menubar_2.setText(QCoreApplication.translate("IscApp", u"View menubar", None)) #if QT_CONFIG(shortcut) self.actionView_menubar_2.setShortcut(QCoreApplication.translate("IscApp", u"Alt+M", None)) #endif // QT_CONFIG(shortcut) self.actionZoom_out.setText(QCoreApplication.translate("IscApp", u"Zoom out", None)) self.actionReset_zoom.setText(QCoreApplication.translate("IscApp", u"Reset zoom", None)) self.actionNewStep.setText(QCoreApplication.translate("IscApp", u"Step", None)) self.actionOpenDemo.setText(QCoreApplication.translate("IscApp", u"Demo", None)) self.menuFile.setTitle(QCoreApplication.translate("IscApp", u"File", None)) self.menuExport_2.setTitle(QCoreApplication.translate("IscApp", u"Export...", None)) self.menuNew.setTitle(QCoreApplication.translate("IscApp", u"New...", None)) self.menuOpen.setTitle(QCoreApplication.translate("IscApp", u"Open...", None)) self.menuEdit.setTitle(QCoreApplication.translate("IscApp", u"Edit", None)) self.menuSelect_all.setTitle(QCoreApplication.translate("IscApp", u"Select all...", None)) self.menuSelect_associated.setTitle(QCoreApplication.translate("IscApp", u"Select associated...", None)) self.menuView.setTitle(QCoreApplication.translate("IscApp", u"View", None)) self.menuZoom.setTitle(QCoreApplication.translate("IscApp", u"Zoom...", None)) self.menuTools.setTitle(QCoreApplication.translate("IscApp", u"Tools", None)) self.menuAudio.setTitle(QCoreApplication.translate("IscApp", u"Audio", None)) self.menuImage.setTitle(QCoreApplication.translate("IscApp", u"Image", None)) self.menuInsert.setTitle(QCoreApplication.translate("IscApp", u"Paste...", None)) self.menuShell.setTitle(QCoreApplication.translate("IscApp", u"Shell...", None)) self.menuDemo.setTitle(QCoreApplication.translate("IscApp", u"Demo", None)) self.menuScript.setTitle(QCoreApplication.translate("IscApp", u"Script", None)) self.menuCheck_script_for.setTitle(QCoreApplication.translate("IscApp", u"Check script for...", None)) self.menuClear.setTitle(QCoreApplication.translate("IscApp", u"Clear...", None)) self.menuWeb.setTitle(QCoreApplication.translate("IscApp", u"Web", None)) self.menuSection.setTitle(QCoreApplication.translate("IscApp", u"Section...", None)) self.menuPacing.setTitle(QCoreApplication.translate("IscApp", u"Pacing...", None)) self.menuAudio_2.setTitle(QCoreApplication.translate("IscApp", u"Audio...", None)) self.menuStep.setTitle(QCoreApplication.translate("IscApp", u"Step...", None)) self.menuAudio_3.setTitle(QCoreApplication.translate("IscApp", u"Audio...", None)) self.menuPacing_2.setTitle(QCoreApplication.translate("IscApp", u"Pacing...", None)) self.menuImage_2.setTitle(QCoreApplication.translate("IscApp", u"Image...", None)) self.menuWindow.setTitle(QCoreApplication.translate("IscApp", u"Window", None)) self.menuHelp.setTitle(QCoreApplication.translate("IscApp", u"Help", None)) self.menuHow_do_I.setTitle(QCoreApplication.translate("IscApp", u"How do I...", None))