class PipelineEditor(QGroupBox): def __init__(self, file_picker): super().__init__("Pipeline Editor") self.setLayout(QVBoxLayout()) self.file_picker = file_picker self.pipeline = Pipeline() self.pipelineView = QListView() self.pipelineView.setEditTriggers(QAbstractItemView.NoEditTriggers) self.pipelineView.setModel(QStandardItemModel()) self.layout().addWidget(self.pipelineView) # === BUTTON CONTAINER === button_rows = QWidget() self.layout().addWidget(button_rows) button_rows_layout = QVBoxLayout(button_rows) button_rows_layout.setContentsMargins(0, 0, 0, 0) # === ROW 1 === row_1 = QWidget() button_rows_layout.addWidget(row_1) row_1_layout = QHBoxLayout(row_1) row_1_layout.setContentsMargins(0, 0, 0, 0) self.moveUpButton = QPushButton("Move Up") row_1_layout.addWidget(self.moveUpButton) self.moveUpButton.clicked.connect(self._move_up_listener) self.moveDownButton = QPushButton("Move Down") row_1_layout.addWidget(self.moveDownButton) self.moveDownButton.clicked.connect(self._move_down_listener) self.deleteButton = QPushButton("Delete") row_1_layout.addWidget(self.deleteButton) self.deleteButton.clicked.connect(self._delete_listener) # === ROW 2 === row_2 = QWidget() button_rows_layout.addWidget(row_2) row_2_layout = QHBoxLayout(row_2) row_2_layout.setContentsMargins(0, 0, 0, 0) self.applyButton = QPushButton("Apply Pipeline") row_2_layout.addWidget(self.applyButton) self.applyButton.clicked.connect(self._apply_pipeline_listener) self.update_pipeline_view() def update_pipeline_view(self): logging.debug(self.pipeline) model = self.pipelineView.model() model.clear() for t in range(self.pipeline.rowCount()): item = QStandardItem() item.setText(repr(self.pipeline.data(t))) model.appendRow(item) def _modify_transformation_listener(self): # TODO raise NotImplementedError def _move_up_listener(self): try: to_move = self.pipelineView.selectionModel().selectedIndexes( )[0].row() if to_move < 1: return self.pipeline.move_transformation_up(to_move) self.update_pipeline_view() self.pipelineView.setCurrentIndex(self.pipelineView.model().index( to_move - 1, 0)) except IndexError: return def _move_down_listener(self): try: to_move = self.pipelineView.selectionModel().selectedIndexes( )[0].row() if to_move > self.pipelineView.model().rowCount() - 2: return self.pipeline.move_transformation_down(to_move) self.update_pipeline_view() self.pipelineView.setCurrentIndex(self.pipelineView.model().index( to_move + 1, 0)) except IndexError: return def _delete_listener(self): try: to_delete = self.pipelineView.selectionModel().selectedIndexes( )[0].row() self.pipeline.remove_transformation(to_delete) self.update_pipeline_view() if to_delete > self.pipelineView.model().rowCount() - 1: self.pipelineView.setCurrentIndex( self.pipelineView.model().index(to_delete - 1, 0)) else: self.pipelineView.setCurrentIndex( self.pipelineView.model().index(to_delete, 0)) except IndexError: return def _apply_pipeline_listener(self): # Check that at least one transformation has been added to the pipeline if self.pipeline.rowCount() == 0: no_transformations_messagebox = QMessageBox(self) no_transformations_messagebox.setText( "ERROR: No transformations selected") no_transformations_messagebox.exec_() return file_sequence = self.file_picker.file_sequence.files # Check that at least one file has been added to the file sequence if len(file_sequence) == 0: no_files_messagebox = QMessageBox(self) no_files_messagebox.setText("ERROR: No files selected") no_files_messagebox.exec_() return transformed_sequence = self.pipeline.resolve(file_sequence) before_after = list(zip(file_sequence, transformed_sequence)) preview_text_lines = [] for rename in before_after: preview_text_lines.append(f"{rename[0].name} -> {rename[1].name}") preview_text = "\n".join(preview_text_lines) confirmation = QMessageBox(self) confirmation.setText("Are you sure you want to apply the pipeline?") confirmation.setDetailedText(preview_text) confirmation.setStandardButtons(QMessageBox.Yes | QMessageBox.No) confirmation.setDefaultButton(QMessageBox.No) ret = confirmation.exec_() if ret == int(QMessageBox.Yes): for rename in before_after: from_path = rename[0] to_path = rename[1] shutil.move(str(from_path), str(to_path)) self.file_picker.clear_file_list()
class LayersList(QWidget): ''' LayerList class which acts as collapsable list. ''' def __init__(self, name, layers, filter, expand=True): super().__init__() self.setWindowModality(QtCore.Qt.WindowModal) self.currently_expanded = True self.main_layout = QVBoxLayout() self.main_layout.setMargin(0) self.main_layout.setSpacing(0) self.main_layout.setContentsMargins(0, 0, 0, 0) self.expand_button = QPushButton(name) self.expand_button.setToolTip(f"List of {name} Layers") self.expand_button.setIcon( QIcon(os.path.join(PATH, 'LayersList_Down.png'))) self.layer_list = QListView() self.layer_list.setDragEnabled(True) self.layer_list.setEditTriggers(QAbstractItemView.NoEditTriggers) self.layer_list.setWrapping(False) self.layer_list.setViewMode(self.layer_list.ListMode) self.container_model = QStandardItemModel() self.model = QSortFilterProxyModel() self.model.setSourceModel(self.container_model) self.model.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive) #self.model.cas filter.textChanged.connect(self.filter_model) for l in layers: self.container_model.appendRow( QStandardItem( QIcon(os.path.join(PATH, 'LayersList_Layer_Icon.png')), l)) self.layer_list.setModel(self.model) self.main_layout.addWidget(self.expand_button, 0, Qt.AlignTop) self.main_layout.addWidget(self.layer_list, 0, Qt.AlignTop) self.expand_button.clicked.connect(self.expand) self.setLayout(self.main_layout) self.resized_size = len(layers) * (self.layer_list.sizeHintForRow(0) + self.layer_list.frameWidth()) self.layer_list.setMaximumHeight(self.resized_size) self.layer_list.setMinimumHeight(self.resized_size) self.setMinimumWidth(self.layer_list.frameWidth()) self.set_styling() if not expand: self.expand() @QtCore.Slot() def expand(self): if self.currently_expanded: self.layer_list.setMinimumHeight(0) self.currently_expanded = False self.expand_button.setIcon( QIcon(os.path.join(PATH, 'LayersList_Up2.png'))) self.layer_list.setMaximumHeight(0) else: self.layer_list.setMinimumHeight(self.resized_size) self.currently_expanded = True self.expand_button.setIcon( QIcon(os.path.join(PATH, 'LayersList_Down.png'))) self.layer_list.setMaximumHeight(self.resized_size) def set_styling(self): self.setStyleSheet(''' background-color:white; ''') self.expand_button.setStyleSheet(''' background-color:#d6d2d2; text-align:left; ''') @QtCore.Slot() def filter_model(self, text): self.show() self.model.setFilterRegExp(QRegExp(text, QtCore.Qt.CaseInsensitive)) if not self.currently_expanded: self.expand() if self.model.rowCount() == 0: self.hide()
class ListerView(QDialog): def __init__(self, title, message, items, parent=None): """ Constructor of ListerView which creates a new dialog with scrolled items which the user can mark Args: title (str): The dialog title that should appear message (str): The message that the user will see at the top of the dialog items ([str]): A list of strings that will be showns as options """ super(ListerView, self).__init__(parent=parent) form = QFormLayout(self) form.addRow(QLabel(message)) self.listView = QListView(self) self.listView.clicked.connect(self.mouse_click_event) form.addRow(self.listView) model = QStandardItemModel(self.listView) self.setWindowTitle(title) for item in items: standardItem = QStandardItem(item) standardItem.setCheckable(True) standardItem.setEditable(False) model.appendRow(standardItem) self.listView.setModel(model) def mouse_click_event(self): """ Callback method that will trigger then the user presses a mouse button while hovering over an item """ row = [qmi.row() for qmi in self.listView.selectedIndexes()][0] item = self.listView.model().item(row) checkState = item.checkState() if checkState == Qt.Checked: checkState = Qt.Unchecked else: checkState = Qt.Checked item.setCheckState(checkState) def enable_button_box(self): """ Method for enabling the buttons the bottom that correspond to OK and Cancel """ form = self.layout() buttonBox = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, Qt.Horizontal, self) form.addRow(buttonBox) buttonBox.accepted.connect(self.accept) buttonBox.rejected.connect(self.reject) def get_results(self): """ Method for quering the results of the user markings The result is a list of strings """ selected = [] model = self.listView.model() i = 0 while model.item(i): if model.item(i).checkState(): selected.append(model.item(i).text()) i += 1 return selected
# <div>Icons made by <a href="https://www.freepik.com/" title="Freepik">Freepik</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div> # <div>Icons made by <a href="https://www.flaticon.com/authors/egor-rumyantsev" title="Egor Rumyantsev">Egor Rumyantsev</a> from <a href="https://www.flaticon.com/" title="Flaticon">www.flaticon.com</a> is licensed by <a href="http://creativecommons.org/licenses/by/3.0/" title="Creative Commons BY 3.0" target="_blank">CC 3.0 BY</a></div> def supported_image_extensions(): ''' Get the image file extensions that can be read. ''' formats = QImageReader().supportedImageFormats() # Convert the QByteArrays to strings return [str(fmt) for fmt in formats] if __name__ == "__main__": import sys app = QApplication(sys.argv) lst = QListView() lst.setMinimumSize(600, 400) model = QStandardItemModel(lst) item = QStandardItem() item.setText('Item text') item.setIcon(QIcon('icons/table-grid.svg')) item.setEditable(False) model.appendRow(item) lst.setModel(model) lst.show() sys.exit(app.exec_())
def __init__(self, parent=None): super().__init__(parent) # setup settings for the class self.settings = QSettings() self.settings.beginGroup("plot_control") self.base_vector_data = vpype.VectorData() self.vector_data: vpype.VectorData = None # settings self.page_format: str = self.settings.value("page_format", "A4") self.landscape: bool = self.settings.value("landscape", False) self.rotated: bool = self.settings.value("rotate", False) self.rotated: bool = self.settings.value("rotated", False) self.center: bool = self.settings.value("center", True) self.fit_page: bool = self.settings.value("fit_page", False) self.margin_value: float = self.settings.value("margin_value", 2.0) self.margin_unit: str = self.settings.value("margin_unit", "cm") # setup plot area self.plot = VectorDataPlotWidget() self.plot.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) # page layout controls page_box = QGroupBox("Page layout") page_layout = QFormLayout() page_format_combo = QComboBox() for k in PAGE_FORMATS: page_format_combo.addItem(k) page_format_combo.setCurrentText(self.page_format) page_format_combo.currentTextChanged.connect( lambda text: self.set_page_format(text)) landscape_check = QCheckBox("Landscape") landscape_check.setChecked(self.landscape) landscape_check.stateChanged.connect( lambda: self.set_landscape(landscape_check.isChecked())) rotated_check = QCheckBox("Rotated") rotated_check.setChecked(self.landscape) rotated_check.stateChanged.connect( lambda: self.set_rotated(rotated_check.isChecked())) center_check = QCheckBox("Center on page") center_check.setChecked(self.center) center_check.stateChanged.connect( lambda: self.set_center(center_check.isChecked())) fit_page_check = QCheckBox("Fit to page") fit_page_check.setChecked(self.fit_page) fit_page_check.stateChanged.connect( lambda: self.set_fit_page(fit_page_check.isChecked())) margin_layout = QHBoxLayout() margin_spin = QDoubleSpinBox() margin_spin.setValue(self.margin_value) margin_spin.valueChanged.connect(lambda: self.set_margin( margin_spin.value(), margin_unit.currentText())) margin_unit = UnitComboBox() margin_unit.setCurrentText(self.margin_unit) margin_unit.currentTextChanged.connect(lambda: self.set_margin( margin_spin.value(), margin_unit.currentText())) margin_layout.addWidget(margin_spin) margin_layout.addWidget(margin_unit) page_layout.addRow("Page format:", page_format_combo) page_layout.addRow("", landscape_check) page_layout.addRow("", rotated_check) page_layout.addRow("", center_check) page_layout.addRow("", fit_page_check) page_layout.addRow("Margin:", margin_layout) page_box.setLayout(page_layout) # Action buttons pen_up_btn = QPushButton("UP") pen_down_btn = QPushButton("DOWN") pen_up_btn.clicked.connect(lambda: axy.pen_up()) pen_down_btn.clicked.connect(lambda: axy.pen_down()) pen_up_spin = AxySettingsSpinBox(self.settings, "pen_pos_up", 60.0) pen_down_spin = AxySettingsSpinBox(self.settings, "pen_pos_down", 40.0) pen_up_layout = QHBoxLayout() pen_up_layout.addWidget(pen_up_spin) pen_up_layout.addWidget(pen_up_btn) pen_down_layout = QHBoxLayout() pen_down_layout.addWidget(pen_down_spin) pen_down_layout.addWidget(pen_down_btn) shutdown_btn = QPushButton("OFF") shutdown_btn.clicked.connect(lambda: axy.shutdown()) plot_btn = QPushButton("PLOT") plot_btn.clicked.connect(lambda: self.plot_svg()) action_box = QGroupBox("Actions") action_layout = QFormLayout() action_layout.addRow("Pen up: ", pen_up_layout) action_layout.addRow("Pen down: ", pen_down_layout) action_layout.addRow("Motor off:", shutdown_btn) action_layout.addRow("Plot:", plot_btn) action_box.setLayout(action_layout) self.list = QListView() self.list.setFixedHeight(120) self.list.setSizePolicy( QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)) # controls layout controls_layout = QVBoxLayout() controls_layout.addWidget(self.list) controls_layout.addWidget(page_box) controls_layout.addWidget(action_box) controls_layout.addItem( QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)) # setup layout root_layout = QHBoxLayout() root_layout.addWidget(self.plot) root_layout.addLayout(controls_layout) self.setLayout(root_layout) self.update_view() # FIXME: stub vector data # vd = vpype.VectorData() # vd.add(vpype.LineCollection([(0, 100), (200, 1001 + 201j)]), 1) # vd.add(vpype.LineCollection([(0, 100 + 100j), (300j, 400j + 100)]), 2) self.load_svg( "/Users/hhip/Drive/axidraw/wheel_cards/wheel_card_triple_5_40.svg")
def __init__(self, parent=None): QListView.__init__(self, parent)
def initUi(self): self.layout = QGridLayout() self.categoryList = QListView() self.right_layout = QStackedLayout() self.categoryList.setMaximumWidth(175) self.categoryModel = QStandardItemModel(self.categoryList) self.categoryList.setIconSize(QSize(32, 32)) self.initDifficultyLayout() difficulty = QStandardItem("Difficulty") difficulty.setIcon(CONST.ICONS["Missile"]) difficulty.setEditable(False) difficulty.setSelectable(True) self.categoryModel.appendRow(difficulty) self.right_layout.addWidget(self.difficultyPage) self.init_campaign_management_layout() campaign_management = QStandardItem("Campaign Management") campaign_management.setIcon(CONST.ICONS["Money"]) campaign_management.setEditable(False) campaign_management.setSelectable(True) self.categoryModel.appendRow(campaign_management) self.right_layout.addWidget(self.campaign_management_page) self.initGeneratorLayout() generator = QStandardItem("Mission Generator") generator.setIcon(CONST.ICONS["Generator"]) generator.setEditable(False) generator.setSelectable(True) self.categoryModel.appendRow(generator) self.right_layout.addWidget(self.generatorPage) self.initCheatLayout() cheat = QStandardItem("Cheat Menu") cheat.setIcon(CONST.ICONS["Cheat"]) cheat.setEditable(False) cheat.setSelectable(True) self.categoryModel.appendRow(cheat) self.right_layout.addWidget(self.cheatPage) self.pluginsPage = PluginsPage() plugins = QStandardItem("LUA Plugins") plugins.setIcon(CONST.ICONS["Plugins"]) plugins.setEditable(False) plugins.setSelectable(True) self.categoryModel.appendRow(plugins) self.right_layout.addWidget(self.pluginsPage) self.pluginsOptionsPage = PluginOptionsPage() pluginsOptions = QStandardItem("LUA Plugins Options") pluginsOptions.setIcon(CONST.ICONS["PluginsOptions"]) pluginsOptions.setEditable(False) pluginsOptions.setSelectable(True) self.categoryModel.appendRow(pluginsOptions) self.right_layout.addWidget(self.pluginsOptionsPage) self.categoryList.setSelectionBehavior(QAbstractItemView.SelectRows) self.categoryList.setModel(self.categoryModel) self.categoryList.selectionModel().setCurrentIndex( self.categoryList.indexAt(QPoint(1, 1)), QItemSelectionModel.Select) self.categoryList.selectionModel().selectionChanged.connect( self.onSelectionChanged) self.layout.addWidget(self.categoryList, 0, 0, 1, 1) self.layout.addLayout(self.right_layout, 0, 1, 5, 1) self.setLayout(self.layout)
def __init__(self, parent=None): super().__init__(parent) self.toolbar = QToolBar() self.toggle_coordinate_type_action = QAction("Toggle Coordinate Type") self.refresh_action = QAction("Refresh") self.refresh_action.setShortcut(QKeySequence("Ctrl+R")) self.copy_spawn_action = QAction("Copy Spawn") self.copy_spawn_action.setShortcut(QKeySequence("Ctrl+C")) self.paste_spawn_action = QAction("Paste Spawn") self.paste_spawn_action.setShortcut(QKeySequence("Ctrl+V")) self.add_spawn_action = QAction("Add Spawn") self.delete_spawn_action = QAction("Delete Spawn") self.add_group_action = QAction("Add Group") self.delete_group_action = QAction("Delete Group") self.add_tile_action = QAction("Add Tile") self.toggle_mode_action = QAction("Toggle Mode") self.undo_action = QAction("Undo") self.undo_action.setShortcut(QKeySequence("Ctrl+Z")) self.redo_action = QAction("Redo") self.redo_action.setShortcut(QKeySequence("Ctrl+Shift+Z")) self.toolbar.addActions( [self.toggle_coordinate_type_action, self.refresh_action]) self.toolbar.addSeparator() self.toolbar.addActions([ self.copy_spawn_action, self.paste_spawn_action, self.add_spawn_action, self.delete_spawn_action, self.add_group_action, self.delete_group_action ]) self.toolbar.addSeparator() self.toolbar.addAction(self.add_tile_action) self.toolbar.addSeparator() self.toolbar.addAction(self.toggle_mode_action) self.toolbar.addSeparator() self.toolbar.addActions([self.undo_action, self.redo_action]) self.addToolBar(self.toolbar) self.model_view = QTreeView() self.model_view.setHeaderHidden(True) self.grid = FE14MapGrid() self.grid_scroll = QScrollArea() self.grid_scroll.setWidgetResizable(True) self.grid_scroll.setWidget(self.grid) self.tile_list = QListView() self.terrain_pane = FE14TerrainEditorPane() self.spawn_pane = FE14SpawnEditorPane() self.model_view.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.model_view_context_menu = QMenu() self.model_view_context_menu.addActions( [self.toggle_coordinate_type_action, self.refresh_action]) self.model_view_context_menu.addSeparator() self.model_view_context_menu.addActions([ self.copy_spawn_action, self.paste_spawn_action, self.add_spawn_action, self.delete_spawn_action, self.add_group_action, self.delete_group_action ]) self.model_view_context_menu.addSeparator() self.model_view_context_menu.addAction(self.add_tile_action) self.model_view_context_menu.addSeparator() self.model_view_context_menu.addAction(self.toggle_mode_action) self.model_view_context_menu.addSeparator() self.model_view_context_menu.addActions( [self.undo_action, self.redo_action]) self.status_bar = QStatusBar() self.coordinate_type_label = QLabel() self.status_bar.addPermanentWidget(self.coordinate_type_label) self.setStatusBar(self.status_bar) self.main_widget = QSplitter() self.main_widget.setOrientation(QtCore.Qt.Horizontal) self.main_widget.addWidget(self.model_view) self.main_widget.addWidget(self.grid_scroll) self.main_widget.addWidget(self.spawn_pane) self.main_widget.addWidget(self.terrain_pane) self.setCentralWidget(self.main_widget)
class WordListDialog(QDialog): """Window to handle the edition of words in a word set""" def __init__(self, parent=None): super().__init__(parent) self.setWindowTitle(self.tr("Edit Word set")) self.setWindowIcon(QIcon(cm.DIR_ICONS + "app.png")) box = QVBoxLayout() self.add_button = QPushButton(self.tr("Add")) self.add_file_button = QPushButton(self.tr("Add from file...")) self.del_button = QPushButton(self.tr("Remove")) self.del_button.setDisabled(True) self.save_button = QPushButton(self.tr("Save")) self.save_button.setDisabled(True) self.cancel_button = QPushButton(self.tr("Cancel")) box.addWidget(self.add_button) box.addWidget(self.del_button) box.addWidget(self.add_file_button) box.addStretch() box.addWidget(self.save_button) box.addWidget(self.cancel_button) self.view = QListView() self.model = QStringListModel() self.view.setModel(self.model) self.view.setSelectionMode(QAbstractItemView.ExtendedSelection) hlayout = QHBoxLayout() hlayout.addWidget(self.view) hlayout.addLayout(box) self.setLayout(hlayout) self.add_button.pressed.connect(self.on_add) self.del_button.pressed.connect(self.on_remove) self.add_file_button.pressed.connect(self.on_load_file) self.cancel_button.pressed.connect(self.reject) self.save_button.pressed.connect(self.accept) # Item selected in view self.view.selectionModel().selectionChanged.connect( self.on_item_selected) # Data changed in model self.model.dataChanged.connect(self.on_data_changed) self.model.rowsInserted.connect(self.on_data_changed) self.model.rowsRemoved.connect(self.on_data_changed) def on_item_selected(self, *args): """Enable the remove button when an item is selected""" self.del_button.setEnabled(True) def on_data_changed(self, *args): """Enable the save button when data in model is changed""" self.save_button.setEnabled(True) def on_add(self): """Allow to manually add a word to the list Notes: A user must click on save for the changes to take effect. """ data = self.model.stringList() data.append(self.tr("<double click to edit>")) self.model.setStringList(data) def on_remove(self): """Remove the selected rows of the list Notes: A user must click on save for the changes to take effect. """ indexes = self.view.selectionModel().selectedRows() while indexes: self.model.removeRows(indexes[0].row(), 1) indexes = self.view.selectionModel().selectedRows() self.del_button.setDisabled(True) def on_load_file(self): """Allow to automatically add words from a file See Also: :meth:`load_file` """ # Reload last directory used last_directory = QSettings().value("last_directory", QDir.homePath()) filepath, _ = QFileDialog.getOpenFileName(self, self.tr("Open Word set"), last_directory, self.tr("Text file (*.txt)")) if filepath: self.load_file(filepath) def load_file(self, filename: str): """Load file into the view Args: filename(str): A simple file with a list of words (1 per line) Current data filtering: - Strip trailing spaces and EOL characters - Skip empty lines - Skip lines with whitespaces characters (`[ \t\n\r\f\v]`) Examples: - The following line will be skipped: `"abc def\tghi\t \r\n"` - The following line will be cleaned: `"abc\r\n"` """ if not os.path.exists(filename): return # Sanitize words with open(filename, "r") as f_h: data = sanitize_words(f_h) data.update(self.model.stringList()) self.model.setStringList(list(data)) # Simulate signal... TODO: check the syntax... self.model.rowsInserted.emit(0, 0, 0)
class FileSystemWidget(QWidget): def __init__(self, parent, *args, **kwargs): super().__init__(*args, **kwargs) self.currentRootPath = '/' self.currentPath = QDir.currentPath() self.mainWindow = parent self.chooseDirAction = QAction(IconFactory.getIcon('folder'), 'Root directory', self, statusTip="Change root directory", triggered=self.chooseRootDir) self.showOFAction = QAction(IconFactory.getIcon('filter_alt'), 'Show only FITS files', self, statusTip="Show only FITS/all files", triggered=self.showOFFiles) self.showOFAction.setCheckable(True) self.showOFAction.toggled.connect(self.showOFFiles) self.chooseDirBtn = QToolButton() self.chooseDirBtn.setDefaultAction(self.chooseDirAction) self.showOFBtn = QToolButton() self.showOFBtn.setDefaultAction(self.showOFAction) iconlayout = QHBoxLayout() iconlayout.setAlignment(Qt.AlignLeft) iconlayout.addWidget(self.chooseDirBtn) iconlayout.addWidget(self.showOFBtn) self.viewsSplitter = QSplitter(Qt.Horizontal) self.viewsSplitter.splitterMoved.connect(self.splitterMoved) self.dirsModel = QFileSystemModel(self) self.dirsModel.setOption(QFileSystemModel.DontWatchForChanges, True) self.dirsModel.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs) self.dirsModel.setNameFilterDisables(False) self.dirs = QTreeView() self.dirs.setModel(self.dirsModel) self.dirs.hideColumn(1) self.dirs.hideColumn(2) self.dirs.hideColumn(3) self.dirs.clicked.connect(self.onDirsClick) self.dirs.doubleClicked.connect(self.onDirsDoubleClick) self.filesModel = QFileSystemModel(self) self.filesModel.setOption(QFileSystemModel.DontWatchForChanges, True) self.filesModel.setFilter(QDir.NoDotAndDotDot | QDir.Files) self.filesModel.setNameFilterDisables(False) self.files = QListView() self.files.setModel(self.filesModel) self.files.doubleClicked.connect(self.onFilesDoubleClick) self.viewsSplitter.addWidget(self.dirs) self.viewsSplitter.addWidget(self.files) viewslayout = QHBoxLayout() viewslayout.addWidget(self.viewsSplitter) layout = QVBoxLayout() layout.addLayout(iconlayout) layout.addLayout(viewslayout) self.setLayout(layout) self.dirsModel.setRootPath(self.currentRootPath) self.dirs.setRootIndex(self.dirsModel.index(self.currentRootPath)) index = self.dirsModel.index(self.currentPath) self.dirs.setCurrentIndex(index) self.dirs.setExpanded(index, True) self.filesModel.setRootPath(self.currentPath) self.files.setRootIndex(self.filesModel.index(self.currentPath)) def splitterMoved(self, pos, index): if pos == 0: self.filesModel.setFilter(QDir.NoDot | QDir.AllEntries | QDir.DirsFirst | QDir.Type) elif pos == self.viewsSplitter.width( ) - self.viewsSplitter.handleWidth(): self.dirsModel.setFilter(QDir.NoDotAndDotDot | QDir.AllEntries) else: self.dirsModel.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs) self.filesModel.setFilter(QDir.NoDotAndDotDot | QDir.Files) def onDirsClick(self, item): index = self.dirs.selectedIndexes()[0] info = self.dirsModel.fileInfo(index) if info.isDir(): self.currentPath = info.filePath() self.files.setRootIndex( self.filesModel.setRootPath(info.filePath())) def onDirsDoubleClick(self, item): index = self.dirs.selectedIndexes()[0] info = self.dirsModel.fileInfo(index) if info.isDir(): self.currentPath = info.filePath() self.files.setRootIndex( self.filesModel.setRootPath(info.filePath())) else: self.mainWindow.open_fits(info.filePath()) def onFilesDoubleClick(self, item): index = self.files.selectedIndexes()[0] info = self.filesModel.fileInfo(index) if info.isDir(): self.setPath(info.filePath()) else: try: self.mainWindow.open_fits(info.filePath()) except FileNotFoundError: self.setPath(self.currentPath) # refesh maybe? def setPath(self, path): self.currentPath = path index = self.dirsModel.index(self.currentPath) self.dirs.setCurrentIndex(index) self.dirs.setExpanded(index, True) self.files.setRootIndex(self.filesModel.setRootPath(self.currentPath)) def chooseRootDir(self): dir = QFileDialog.getExistingDirectory(self, 'Select directory') if dir: self.setRootPath(dir) def setRootPath(self, dir): self.currentRootPath = dir self.dirsModel.setRootPath(self.currentRootPath) self.dirs.setRootIndex(self.dirsModel.index(self.currentRootPath)) self.setPath(self.currentRootPath) def showOFFiles(self): if self.showOFAction.isChecked(): self.dirsModel.setNameFilters(["*.FITS", "*.fits"]) self.filesModel.setNameFilters(["*.FITS", "*.fits"]) else: self.dirsModel.setNameFilters(["*"]) self.filesModel.setNameFilters(["*"]) def writeSettings(self, settings): settings.beginGroup("fileWidget") settings.setValue('splitterGeometry', self.viewsSplitter.saveGeometry()) settings.setValue('splitterState', self.viewsSplitter.saveState()) settings.setValue('rootPath', self.currentRootPath) settings.setValue('path', self.currentPath) settings.endGroup() def readSettings(self, settings): settings.beginGroup("fileWidget") self.viewsSplitter.restoreGeometry(settings.value("splitterGeometry")) self.viewsSplitter.restoreState(settings.value("splitterState")) rootPath = settings.value("rootPath") path = settings.value("path") settings.endGroup() if rootPath is None: rootPath = '/' self.setRootPath(rootPath) if path is None: path = QDir.currentPath() self.setPath(path) self.splitterMoved(self.viewsSplitter.handle(1).pos().x(), 0)
def __init__(self, parent, *args, **kwargs): super().__init__(*args, **kwargs) self.currentRootPath = '/' self.currentPath = QDir.currentPath() self.mainWindow = parent self.chooseDirAction = QAction(IconFactory.getIcon('folder'), 'Root directory', self, statusTip="Change root directory", triggered=self.chooseRootDir) self.showOFAction = QAction(IconFactory.getIcon('filter_alt'), 'Show only FITS files', self, statusTip="Show only FITS/all files", triggered=self.showOFFiles) self.showOFAction.setCheckable(True) self.showOFAction.toggled.connect(self.showOFFiles) self.chooseDirBtn = QToolButton() self.chooseDirBtn.setDefaultAction(self.chooseDirAction) self.showOFBtn = QToolButton() self.showOFBtn.setDefaultAction(self.showOFAction) iconlayout = QHBoxLayout() iconlayout.setAlignment(Qt.AlignLeft) iconlayout.addWidget(self.chooseDirBtn) iconlayout.addWidget(self.showOFBtn) self.viewsSplitter = QSplitter(Qt.Horizontal) self.viewsSplitter.splitterMoved.connect(self.splitterMoved) self.dirsModel = QFileSystemModel(self) self.dirsModel.setOption(QFileSystemModel.DontWatchForChanges, True) self.dirsModel.setFilter(QDir.NoDotAndDotDot | QDir.AllDirs) self.dirsModel.setNameFilterDisables(False) self.dirs = QTreeView() self.dirs.setModel(self.dirsModel) self.dirs.hideColumn(1) self.dirs.hideColumn(2) self.dirs.hideColumn(3) self.dirs.clicked.connect(self.onDirsClick) self.dirs.doubleClicked.connect(self.onDirsDoubleClick) self.filesModel = QFileSystemModel(self) self.filesModel.setOption(QFileSystemModel.DontWatchForChanges, True) self.filesModel.setFilter(QDir.NoDotAndDotDot | QDir.Files) self.filesModel.setNameFilterDisables(False) self.files = QListView() self.files.setModel(self.filesModel) self.files.doubleClicked.connect(self.onFilesDoubleClick) self.viewsSplitter.addWidget(self.dirs) self.viewsSplitter.addWidget(self.files) viewslayout = QHBoxLayout() viewslayout.addWidget(self.viewsSplitter) layout = QVBoxLayout() layout.addLayout(iconlayout) layout.addLayout(viewslayout) self.setLayout(layout) self.dirsModel.setRootPath(self.currentRootPath) self.dirs.setRootIndex(self.dirsModel.index(self.currentRootPath)) index = self.dirsModel.index(self.currentPath) self.dirs.setCurrentIndex(index) self.dirs.setExpanded(index, True) self.filesModel.setRootPath(self.currentPath) self.files.setRootIndex(self.filesModel.index(self.currentPath))
def __init__(self): super(WidgetConfig, self).__init__() HEIGHT = 30 grid = QGridLayout() # 使用默认摄像头复选框 self.check_camera = QCheckBox('Use default camera') self.check_camera.setChecked(True) self.check_camera.stateChanged.connect(self.slot_check_camera) grid.addWidget(self.check_camera, 0, 0, 1, 3) # 一行三列 # 选择视频文件 label_video = QLabel('Source') self.line_video = QLineEdit() self.line_video.setFixedHeight(HEIGHT) self.line_video.setEnabled(False) self.line_video.setText(GLOBAL.config.get('video', '')) self.line_video.editingFinished.connect( lambda: GLOBAL.record_config({'video': self.line_video.text()})) self.btn_video = QPushButton('...') self.btn_video.setFixedWidth(40) self.btn_video.setFixedHeight(HEIGHT) self.btn_video.setEnabled(False) self.btn_video.clicked.connect(self.choose_video_file) self.slot_check_camera() grid.addWidget(label_video, 1, 0) grid.addWidget(self.line_video, 1, 1) grid.addWidget(self.btn_video, 1, 2) # 选择权重文件 label_weights = QLabel('Weights') self.line_weights = QLineEdit() self.line_weights.setFixedHeight(HEIGHT) self.line_weights.setText(GLOBAL.config.get('weights', '')) self.line_weights.editingFinished.connect(lambda: GLOBAL.record_config( {'weights': self.line_weights.text()} )) self.btn_weights = QPushButton('...') self.btn_weights.setFixedWidth(40) self.btn_weights.setFixedHeight(HEIGHT) self.btn_weights.clicked.connect(self.choose_weights_file) grid.addWidget(label_weights, 2, 0) grid.addWidget(self.line_weights, 2, 1) grid.addWidget(self.btn_weights, 2, 2) # 是否使用GPU label_device = QLabel('CUDA device') self.line_device = QLineEdit('cpu') self.line_device.setText(GLOBAL.config.get('device', 'cpu')) self.line_device.setPlaceholderText('cpu or 0 or 0,1,2,3') self.line_device.setFixedHeight(HEIGHT) self.line_device.editingFinished.connect(lambda: GLOBAL.record_config( {'device': self.line_device.text()} )) grid.addWidget(label_device, 3, 0) grid.addWidget(self.line_device, 3, 1, 1, 2) # 设置图像大小 label_size = QLabel('Img Size') self.combo_size = QComboBox() self.combo_size.setFixedHeight(HEIGHT) self.combo_size.setStyleSheet( 'QAbstractItemView::item {height: 40px;}') self.combo_size.setView(QListView()) self.combo_size.addItem('320', 320) self.combo_size.addItem('416', 416) self.combo_size.addItem('480', 480) self.combo_size.addItem('544', 544) self.combo_size.addItem('640', 640) self.combo_size.setCurrentIndex( self.combo_size.findData(GLOBAL.config.get('img_size', 480))) self.combo_size.currentIndexChanged.connect(lambda: GLOBAL.record_config( {'img_size': self.combo_size.currentData()})) grid.addWidget(label_size, 4, 0) grid.addWidget(self.combo_size, 4, 1, 1, 2) # 设置置信度阈值 label_conf = QLabel('Confidence') self.spin_conf = QDoubleSpinBox() self.spin_conf.setFixedHeight(HEIGHT) self.spin_conf.setDecimals(1) self.spin_conf.setRange(0.1, 0.9) self.spin_conf.setSingleStep(0.1) self.spin_conf.setValue(GLOBAL.config.get('conf_thresh', 0.5)) self.spin_conf.valueChanged.connect(lambda: GLOBAL.record_config( {'conf_thresh': round(self.spin_conf.value(), 1)} )) grid.addWidget(label_conf, 5, 0) grid.addWidget(self.spin_conf, 5, 1, 1, 2) # 设置IOU阈值 label_iou = QLabel('IOU') self.spin_iou = QDoubleSpinBox() self.spin_iou.setFixedHeight(HEIGHT) self.spin_iou.setDecimals(1) self.spin_iou.setRange(0.1, 0.9) self.spin_iou.setSingleStep(0.1) self.spin_iou.setValue(GLOBAL.config.get('iou_thresh', 0.5)) self.spin_iou.valueChanged.connect(lambda: GLOBAL.record_config( {'iou_thresh': round(self.spin_iou.value(), 1)} )) grid.addWidget(label_iou, 6, 0) grid.addWidget(self.spin_iou, 6, 1, 1, 2) # class-agnostic NMS self.check_agnostic = QCheckBox('Agnostic') self.check_agnostic.setChecked(GLOBAL.config.get('agnostic', True)) self.check_agnostic.stateChanged.connect(lambda: GLOBAL.record_config( {'agnostic': self.check_agnostic.isChecked()} )) grid.addWidget(self.check_agnostic, 7, 0, 1, 3) # 一行三列 # augmented inference self.check_augment = QCheckBox('Augment') self.check_augment.setChecked(GLOBAL.config.get('augment', True)) self.check_augment.stateChanged.connect(lambda: GLOBAL.record_config( {'augment': self.check_augment.isChecked()} )) grid.addWidget(self.check_augment, 8, 0, 1, 3) # 一行三列 # 视频录制 self.check_record = QCheckBox('Record video') grid.addWidget(self.check_record, 9, 0, 1, 3) # 一行三列 self.setLayout(grid) # 设置布局
def __init__(self): super(SettingsDialog, self).__init__() self.setWindowTitle('Settings') self.setWindowIcon(QIcon('img/yologo.png')) self.setWindowFlags(Qt.WindowCloseButtonHint) self.setMinimumWidth(600) HEIGHT = 30 grid = QGridLayout() # 选择权重文件 label_weights = QLabel('Weights') self.line_weights = QLineEdit() self.line_weights.setFixedHeight(HEIGHT) self.btn_weights = QPushButton('...') self.btn_weights.setFixedWidth(40) self.btn_weights.setFixedHeight(HEIGHT) self.btn_weights.clicked.connect(self.choose_weights_file) grid.addWidget(label_weights, 2, 0) grid.addWidget(self.line_weights, 2, 1, 1, 2) grid.addWidget(self.btn_weights, 2, 3) # 是否使用GPU label_device = QLabel('CUDA device') self.line_device = QLineEdit('cpu') self.line_device.setToolTip('cuda device, i.e. 0 or 0,1,2,3 or cpu') self.line_device.setPlaceholderText('cpu or 0 or 0,1,2,3') self.line_device.setFixedHeight(HEIGHT) grid.addWidget(label_device, 3, 0) grid.addWidget(self.line_device, 3, 1, 1, 3) # 设置图像大小 label_size = QLabel('Img Size') self.combo_size = QComboBox() self.combo_size.setToolTip('inference size (pixels)') self.combo_size.setFixedHeight(HEIGHT) self.combo_size.setStyleSheet( 'QAbstractItemView::item {height: 40px;}') self.combo_size.setView(QListView()) self.combo_size.addItem('320', 320) self.combo_size.addItem('384', 384) self.combo_size.addItem('448', 448) self.combo_size.addItem('512', 512) self.combo_size.addItem('576', 576) self.combo_size.addItem('640', 640) grid.addWidget(label_size, 4, 0) grid.addWidget(self.combo_size, 4, 1, 1, 3) # 设置置信度阈值 label_conf = QLabel('Confidence') self.spin_conf = QDoubleSpinBox() self.spin_conf.setToolTip('confidence threshold') self.spin_conf.setFixedHeight(HEIGHT) self.spin_conf.setDecimals(1) self.spin_conf.setRange(0.1, 0.9) self.spin_conf.setSingleStep(0.1) grid.addWidget(label_conf, 5, 0) grid.addWidget(self.spin_conf, 5, 1, 1, 3) # 设置IOU阈值 label_iou = QLabel('IOU') self.spin_iou = QDoubleSpinBox() self.spin_iou.setToolTip('NMS IoU threshold') self.spin_iou.setFixedHeight(HEIGHT) self.spin_iou.setDecimals(1) self.spin_iou.setRange(0.1, 0.9) self.spin_iou.setSingleStep(0.1) grid.addWidget(label_iou, 6, 0) grid.addWidget(self.spin_iou, 6, 1, 1, 3) # maximum detections per image label_max_det = QLabel('maximum detections') self.spin_max_det = QDoubleSpinBox() self.spin_max_det.setToolTip('Maximum detections per image') self.spin_max_det.setFixedHeight(HEIGHT) self.spin_max_det.setDecimals(0) self.spin_max_det.setRange(10, 1000) self.spin_max_det.setSingleStep(10) grid.addWidget(label_max_det, 7, 0) grid.addWidget(self.spin_max_det, 7, 1, 1, 3) # class-agnostic NMS self.check_agnostic = QCheckBox('Agnostic') self.check_agnostic.setToolTip('class-agnostic NMS') # augmented inference self.check_augment = QCheckBox('Augment') self.check_augment.setToolTip('augmented inference') # half self.check_half = QCheckBox('Half') self.check_half.setToolTip('use FP16 half-precision inference') grid.addWidget(self.check_agnostic, 8, 0) grid.addWidget(self.check_augment, 8, 1) grid.addWidget(self.check_half, 8, 2) # use OpenCV DNN for ONNX inference self.check_dnn = QCheckBox('DNN') self.check_dnn.setToolTip('Use OpenCV DNN for ONNX inference') grid.addWidget(self.check_dnn, 9, 0) box = QGroupBox() box.setLayout(grid) hbox = QHBoxLayout() self.btn_cancel = QPushButton('Cancel') self.btn_cancel.clicked.connect(self.restore) self.btn_ok = QPushButton('Ok') self.btn_ok.clicked.connect(self.save_settings) hbox.addStretch() hbox.addWidget(self.btn_cancel) hbox.addWidget(self.btn_ok) vbox = QVBoxLayout() vbox.addWidget(box) vbox.addLayout(hbox) self.setLayout(vbox) self.load_settings()
class SymbolViewFrame(QWidget): # --- Init methods --- def __init__(self, config): """ Symbols and Labels view frame :param config: application configuration file """ QWidget.__init__(self) self.setFixedSize(QSize(320, 330)) self.setWindowTitle("DigiQt - Symbols") self.config = config self.lab_label = QLabel("Labels") self.lab_label.setAlignment(Qt.AlignCenter) self.lab_symbols = QLabel("Symbols") self.lab_symbols.setAlignment(Qt.AlignCenter) self.sig_symbol_goto = None # pushed by the controler # Initialization of the lists self.labels_view = QListView() self.labels_view.setFixedSize(QSize(150, 300)) self.labels_view.setEditTriggers(QAbstractItemView.NoEditTriggers) self.labels_view.setSelectionMode(QAbstractItemView.SingleSelection) self.dm_labels = QStandardItemModel(self.labels_view) self.symbols_view = QListView() self.symbols_view.setFixedSize(QSize(150, 300)) self.symbols_view.setEditTriggers(QAbstractItemView.NoEditTriggers) self.symbols_view.setSelectionMode(QAbstractItemView.SingleSelection) self.dm_symbols = QStandardItemModel(self.symbols_view) self.init_labels([]) self.init_symbols([]) self.labels_view.clicked.connect(self.on_label_changed) self.symbols_view.clicked.connect(self.on_symbol_changed) self.__set_layout() self.setStyleSheet(style.get_stylesheet("listviews_frame")) def init_labels(self, list_labels): """ Initiates the data model for the labels :param list_labels: list of labels """ self.__init_view(self.labels_view, self.dm_labels, list_labels) def init_symbols(self, list_symbols): """ Initiates the data model for the symbols :param list_symbols: list of symbols """ self.__init_view(self.symbols_view, self.dm_symbols, list_symbols) def __init_view(self, list_view, data_model, objects_list): """ Initiates the view given the data_model and the objects to add in it. :type list_view: QListView :type data_model: QStandardItemModel :type objects_list: list """ data_model.clear() for l in objects_list: data_model.appendRow(QStandardItem(l)) list_view.setModel(data_model) def __set_layout(self): """ Creates this Widget's Layout """ box = QGridLayout() box.setContentsMargins(0, 0, 0, 0) box.addWidget(self.lab_label, 0, 0) box.addWidget(self.labels_view, 1, 0) box.addWidget(self.lab_symbols, 0, 1) box.addWidget(self.symbols_view, 1, 1) self.setLayout(box) def on_label_changed(self, item): """ Callback method for the label change signal :param item: new item selected :type item: QItemSelection """ text = item.data() if text: self.sig_symbol_goto.emit(text) self.place_search_text(text) def on_symbol_changed(self, item): """ Callback method for the symbol change signal :param item: new item selected :type item: QItemSelection """ text = item.data() if text: self.sig_symbol_goto.emit(text) self.place_search_text(text) def place_search_text(self, text): """ Updates the searched value in the editor search field. :param text: label or symbol to place as search text """ pass def __retrieve_text(self, data_model, item): """ Gets the text with the specified data model from a QItemSelection :type item: QItemSelection :type data_model: QStandardItemModel :rtype: str """ selection = item.indexes() if selection: return data_model.item(QModelIndex(selection[0]).row()).text() # --- Close handler --- def closeEvent(self, event): """ Event called upon a red-cross click. """ self.on_close() def on_close(self): """ Reroot this method in the Main Frame in order to Updates the execution frame's open editor icon and tooltip :return: """ pass
class QSettingsWindow(QDialog): def __init__(self, game: Game): super(QSettingsWindow, self).__init__() self.game = game self.setModal(True) self.setWindowTitle("Settings") self.setWindowIcon(CONST.ICONS["Settings"]) self.setMinimumSize(600, 250) self.initUi() def initUi(self): self.layout = QGridLayout() self.categoryList = QListView() self.right_layout = QStackedLayout() self.categoryList.setMaximumWidth(175) self.categoryModel = QStandardItemModel(self.categoryList) difficulty = QStandardItem("Difficulty") difficulty.setIcon(CONST.ICONS["Missile"]) difficulty.setEditable(False) difficulty.setSelectable(True) generator = QStandardItem("Mission Generator") generator.setIcon(CONST.ICONS["Generator"]) generator.setEditable(False) generator.setSelectable(True) cheat = QStandardItem("Cheat Menu") cheat.setIcon(CONST.ICONS["Cheat"]) cheat.setEditable(False) cheat.setSelectable(True) self.categoryList.setIconSize(QSize(32, 32)) self.categoryModel.appendRow(difficulty) self.categoryModel.appendRow(generator) self.categoryModel.appendRow(cheat) self.categoryList.setSelectionBehavior(QAbstractItemView.SelectRows) self.categoryList.setModel(self.categoryModel) self.categoryList.selectionModel().setCurrentIndex( self.categoryList.indexAt(QPoint(1, 1)), QItemSelectionModel.Select) self.categoryList.selectionModel().selectionChanged.connect( self.onSelectionChanged) self.initDifficultyLayout() self.initGeneratorLayout() self.initCheatLayout() self.right_layout.addWidget(self.difficultyPage) self.right_layout.addWidget(self.generatorPage) self.right_layout.addWidget(self.cheatPage) self.layout.addWidget(self.categoryList, 0, 0, 1, 1) self.layout.addLayout(self.right_layout, 0, 1, 5, 1) self.setLayout(self.layout) def init(self): pass def initDifficultyLayout(self): self.difficultyPage = QWidget() self.difficultyLayout = QGridLayout() self.difficultyLayout.setAlignment(Qt.AlignTop) self.difficultyPage.setLayout(self.difficultyLayout) self.playerCoalitionSkill = QComboBox() self.enemyCoalitionSkill = QComboBox() self.enemyAASkill = QComboBox() for skill in CONST.SKILL_OPTIONS: self.playerCoalitionSkill.addItem(skill) self.enemyCoalitionSkill.addItem(skill) self.enemyAASkill.addItem(skill) self.playerCoalitionSkill.setCurrentIndex( CONST.SKILL_OPTIONS.index(self.game.settings.player_skill)) self.enemyCoalitionSkill.setCurrentIndex( CONST.SKILL_OPTIONS.index(self.game.settings.enemy_skill)) self.enemyAASkill.setCurrentIndex( CONST.SKILL_OPTIONS.index(self.game.settings.enemy_vehicle_skill)) self.playerCoalitionSkill.currentIndexChanged.connect( self.applySettings) self.enemyCoalitionSkill.currentIndexChanged.connect( self.applySettings) self.enemyAASkill.currentIndexChanged.connect(self.applySettings) self.difficultyLayout.addWidget(QLabel("Player coalition skill"), 0, 0) self.difficultyLayout.addWidget(self.playerCoalitionSkill, 0, 1, Qt.AlignRight) self.difficultyLayout.addWidget(QLabel("Enemy skill"), 1, 0) self.difficultyLayout.addWidget(self.enemyCoalitionSkill, 1, 1, Qt.AlignRight) self.difficultyLayout.addWidget(QLabel("Enemy AA and vehicles skill"), 2, 0) self.difficultyLayout.addWidget(self.enemyAASkill, 2, 1, Qt.AlignRight) self.difficultyLabel = QComboBox() [self.difficultyLabel.addItem(t) for t in CONST.LABELS_OPTIONS] self.difficultyLabel.setCurrentIndex( CONST.LABELS_OPTIONS.index(self.game.settings.labels)) self.difficultyLabel.currentIndexChanged.connect(self.applySettings) self.difficultyLayout.addWidget(QLabel("In Game Labels"), 3, 0) self.difficultyLayout.addWidget(self.difficultyLabel, 3, 1, Qt.AlignRight) self.noNightMission = QCheckBox() self.noNightMission.setChecked(self.game.settings.night_disabled) self.noNightMission.toggled.connect(self.applySettings) self.difficultyLayout.addWidget(QLabel("No night missions"), 4, 0) self.difficultyLayout.addWidget(self.noNightMission, 4, 1, Qt.AlignRight) self.mapVisibiitySelection = QComboBox() self.mapVisibiitySelection.addItem("All", ForcedOptions.Views.All) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.All: self.mapVisibiitySelection.setCurrentIndex(0) self.mapVisibiitySelection.addItem("Fog of War", ForcedOptions.Views.Allies) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.Allies: self.mapVisibiitySelection.setCurrentIndex(1) self.mapVisibiitySelection.addItem("Allies Only", ForcedOptions.Views.OnlyAllies) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.OnlyAllies: self.mapVisibiitySelection.setCurrentIndex(2) self.mapVisibiitySelection.addItem("Own Aircraft Only", ForcedOptions.Views.MyAircraft) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.MyAircraft: self.mapVisibiitySelection.setCurrentIndex(3) self.mapVisibiitySelection.addItem("Map Only", ForcedOptions.Views.OnlyMap) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.OnlyMap: self.mapVisibiitySelection.setCurrentIndex(4) self.mapVisibiitySelection.currentIndexChanged.connect( self.applySettings) self.difficultyLayout.addWidget(QLabel("Map visibility options"), 5, 0) self.difficultyLayout.addWidget(self.mapVisibiitySelection, 5, 1, Qt.AlignRight) self.ext_views = QCheckBox() self.ext_views.setChecked(self.game.settings.external_views_allowed) self.ext_views.toggled.connect(self.applySettings) self.difficultyLayout.addWidget(QLabel("Allow external views"), 6, 0) self.difficultyLayout.addWidget(self.ext_views, 6, 1, Qt.AlignRight) def initGeneratorLayout(self): self.generatorPage = QWidget() self.generatorLayout = QVBoxLayout() self.generatorLayout.setAlignment(Qt.AlignTop) self.generatorPage.setLayout(self.generatorLayout) self.gameplay = QGroupBox("Gameplay") self.gameplayLayout = QGridLayout() self.gameplayLayout.setAlignment(Qt.AlignTop) self.gameplay.setLayout(self.gameplayLayout) self.supercarrier = QCheckBox() self.supercarrier.setChecked(self.game.settings.supercarrier) self.supercarrier.toggled.connect(self.applySettings) self.generate_marks = QCheckBox() self.generate_marks.setChecked(self.game.settings.generate_marks) self.generate_marks.toggled.connect(self.applySettings) if not hasattr(self.game.settings, "include_jtac_if_available"): self.game.settings.include_jtac_if_available = True if not hasattr(self.game.settings, "jtac_smoke_on"): self.game.settings.jtac_smoke_on = True self.include_jtac_if_available = QCheckBox() self.include_jtac_if_available.setChecked( self.game.settings.include_jtac_if_available) self.include_jtac_if_available.toggled.connect(self.applySettings) self.jtac_smoke_on = QCheckBox() self.jtac_smoke_on.setChecked(self.game.settings.jtac_smoke_on) self.jtac_smoke_on.toggled.connect(self.applySettings) self.gameplayLayout.addWidget(QLabel("Use Supercarrier Module"), 0, 0) self.gameplayLayout.addWidget(self.supercarrier, 0, 1, Qt.AlignRight) self.gameplayLayout.addWidget(QLabel("Put Objective Markers on Map"), 1, 0) self.gameplayLayout.addWidget(self.generate_marks, 1, 1, Qt.AlignRight) self.gameplayLayout.addWidget(QLabel("Include JTAC (If available)"), 2, 0) self.gameplayLayout.addWidget(self.include_jtac_if_available, 2, 1, Qt.AlignRight) self.gameplayLayout.addWidget(QLabel("Enable JTAC smoke markers"), 3, 0) self.gameplayLayout.addWidget(self.jtac_smoke_on, 3, 1, Qt.AlignRight) self.performance = QGroupBox("Performance") self.performanceLayout = QGridLayout() self.performanceLayout.setAlignment(Qt.AlignTop) self.performance.setLayout(self.performanceLayout) self.smoke = QCheckBox() self.smoke.setChecked(self.game.settings.perf_smoke_gen) self.smoke.toggled.connect(self.applySettings) self.red_alert = QCheckBox() self.red_alert.setChecked(self.game.settings.perf_red_alert_state) self.red_alert.toggled.connect(self.applySettings) self.arti = QCheckBox() self.arti.setChecked(self.game.settings.perf_artillery) self.arti.toggled.connect(self.applySettings) self.moving_units = QCheckBox() self.moving_units.setChecked(self.game.settings.perf_moving_units) self.moving_units.toggled.connect(self.applySettings) self.infantry = QCheckBox() self.infantry.setChecked(self.game.settings.perf_infantry) self.infantry.toggled.connect(self.applySettings) self.ai_parking_start = QCheckBox() self.ai_parking_start.setChecked( self.game.settings.perf_ai_parking_start) self.ai_parking_start.toggled.connect(self.applySettings) self.destroyed_units = QCheckBox() self.destroyed_units.setChecked( self.game.settings.perf_destroyed_units) self.destroyed_units.toggled.connect(self.applySettings) self.culling = QCheckBox() self.culling.setChecked(self.game.settings.perf_culling) self.culling.toggled.connect(self.applySettings) self.culling_distance = QSpinBox() self.culling_distance.setMinimum(50) self.culling_distance.setMaximum(10000) self.culling_distance.setValue( self.game.settings.perf_culling_distance) self.culling_distance.valueChanged.connect(self.applySettings) self.performanceLayout.addWidget( QLabel("Smoke visual effect on frontline"), 0, 0) self.performanceLayout.addWidget(self.smoke, 0, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget( QLabel("SAM starts in RED alert mode"), 1, 0) self.performanceLayout.addWidget(self.red_alert, 1, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QLabel("Artillery strikes"), 2, 0) self.performanceLayout.addWidget(self.arti, 2, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QLabel("Moving ground units"), 3, 0) self.performanceLayout.addWidget(self.moving_units, 3, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget( QLabel("Generate infantry squads along vehicles"), 4, 0) self.performanceLayout.addWidget(self.infantry, 4, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget( QLabel( "AI planes parking start (AI starts in flight if disabled)"), 5, 0) self.performanceLayout.addWidget(self.ai_parking_start, 5, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget( QLabel("Include destroyed units carcass"), 6, 0) self.performanceLayout.addWidget(self.destroyed_units, 6, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QHorizontalSeparationLine(), 7, 0, 1, 2) self.performanceLayout.addWidget( QLabel("Culling of distant units enabled"), 8, 0) self.performanceLayout.addWidget(self.culling, 8, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QLabel("Culling distance (km)"), 9, 0) self.performanceLayout.addWidget(self.culling_distance, 9, 1, alignment=Qt.AlignRight) self.generatorLayout.addWidget(self.gameplay) self.generatorLayout.addWidget( QLabel( "Disabling settings below may improve performance, but will impact the overall quality of the experience." )) self.generatorLayout.addWidget(self.performance) def initCheatLayout(self): self.cheatPage = QWidget() self.cheatLayout = QGridLayout() self.cheatPage.setLayout(self.cheatLayout) self.moneyCheatBox = QGroupBox("Money Cheat") self.moneyCheatBox.setAlignment(Qt.AlignTop) self.moneyCheatBoxLayout = QGridLayout() self.moneyCheatBox.setLayout(self.moneyCheatBoxLayout) self.cheat25M = QPushButton("Cheat +25M") self.cheat50M = QPushButton("Cheat +50M") self.cheat100M = QPushButton("Cheat +100M") self.cheat200M = QPushButton("Cheat +200M") self.cheat500M = QPushButton("Cheat +500M") self.cheat1000M = QPushButton("Cheat +1000M") self.cheat25M.clicked.connect(lambda: self.cheatMoney(25)) self.cheat50M.clicked.connect(lambda: self.cheatMoney(50)) self.cheat100M.clicked.connect(lambda: self.cheatMoney(100)) self.cheat200M.clicked.connect(lambda: self.cheatMoney(200)) self.cheat500M.clicked.connect(lambda: self.cheatMoney(500)) self.cheat1000M.clicked.connect(lambda: self.cheatMoney(1000)) self.moneyCheatBoxLayout.addWidget(self.cheat25M, 0, 0) self.moneyCheatBoxLayout.addWidget(self.cheat50M, 0, 1) self.moneyCheatBoxLayout.addWidget(self.cheat100M, 1, 0) self.moneyCheatBoxLayout.addWidget(self.cheat200M, 1, 1) self.moneyCheatBoxLayout.addWidget(self.cheat500M, 2, 0) self.moneyCheatBoxLayout.addWidget(self.cheat1000M, 2, 1) self.cheatLayout.addWidget(self.moneyCheatBox, 0, 0) def cheatMoney(self, amount): self.game.budget += amount self.game.informations.append( Information("CHEATER", "You are a cheater and you should feel bad", self.game.turn)) GameUpdateSignal.get_instance().updateGame(self.game) def applySettings(self): self.game.settings.player_skill = CONST.SKILL_OPTIONS[ self.playerCoalitionSkill.currentIndex()] self.game.settings.enemy_skill = CONST.SKILL_OPTIONS[ self.enemyCoalitionSkill.currentIndex()] self.game.settings.enemy_vehicle_skill = CONST.SKILL_OPTIONS[ self.enemyAASkill.currentIndex()] self.game.settings.labels = CONST.LABELS_OPTIONS[ self.difficultyLabel.currentIndex()] self.game.settings.night_disabled = self.noNightMission.isChecked() self.game.settings.map_coalition_visibility = self.mapVisibiitySelection.currentData( ) self.game.settings.external_views_allowed = self.ext_views.isChecked() self.game.settings.generate_marks = self.generate_marks.isChecked() self.game.settings.include_jtac_if_available = self.include_jtac_if_available.isChecked( ) self.game.settings.jtac_smoke_on = self.jtac_smoke_on.isChecked() print(self.game.settings.map_coalition_visibility) self.game.settings.supercarrier = self.supercarrier.isChecked() self.game.settings.perf_red_alert_state = self.red_alert.isChecked() self.game.settings.perf_smoke_gen = self.smoke.isChecked() self.game.settings.perf_artillery = self.arti.isChecked() self.game.settings.perf_moving_units = self.moving_units.isChecked() self.game.settings.perf_infantry = self.infantry.isChecked() self.game.settings.perf_ai_parking_start = self.ai_parking_start.isChecked( ) self.game.settings.perf_destroyed_units = self.destroyed_units.isChecked( ) self.game.settings.perf_culling = self.culling.isChecked() self.game.settings.perf_culling_distance = int( self.culling_distance.value()) GameUpdateSignal.get_instance().updateGame(self.game) def onSelectionChanged(self): index = self.categoryList.selectionModel().currentIndex().row() self.right_layout.setCurrentIndex(index)
class QSettingsWindow(QDialog): def __init__(self, game: Game): super(QSettingsWindow, self).__init__() self.game = game self.pluginsPage = None self.pluginsOptionsPage = None self.setModal(True) self.setWindowTitle("Settings") self.setWindowIcon(CONST.ICONS["Settings"]) self.setMinimumSize(600, 250) self.initUi() def initUi(self): self.layout = QGridLayout() self.categoryList = QListView() self.right_layout = QStackedLayout() self.categoryList.setMaximumWidth(175) self.categoryModel = QStandardItemModel(self.categoryList) self.categoryList.setIconSize(QSize(32, 32)) self.initDifficultyLayout() difficulty = QStandardItem("Difficulty") difficulty.setIcon(CONST.ICONS["Missile"]) difficulty.setEditable(False) difficulty.setSelectable(True) self.categoryModel.appendRow(difficulty) self.right_layout.addWidget(self.difficultyPage) self.initGeneratorLayout() generator = QStandardItem("Mission Generator") generator.setIcon(CONST.ICONS["Generator"]) generator.setEditable(False) generator.setSelectable(True) self.categoryModel.appendRow(generator) self.right_layout.addWidget(self.generatorPage) self.initCheatLayout() cheat = QStandardItem("Cheat Menu") cheat.setIcon(CONST.ICONS["Cheat"]) cheat.setEditable(False) cheat.setSelectable(True) self.categoryModel.appendRow(cheat) self.right_layout.addWidget(self.cheatPage) self.pluginsPage = PluginsPage() plugins = QStandardItem("LUA Plugins") plugins.setIcon(CONST.ICONS["Plugins"]) plugins.setEditable(False) plugins.setSelectable(True) self.categoryModel.appendRow(plugins) self.right_layout.addWidget(self.pluginsPage) self.pluginsOptionsPage = PluginOptionsPage() pluginsOptions = QStandardItem("LUA Plugins Options") pluginsOptions.setIcon(CONST.ICONS["PluginsOptions"]) pluginsOptions.setEditable(False) pluginsOptions.setSelectable(True) self.categoryModel.appendRow(pluginsOptions) self.right_layout.addWidget(self.pluginsOptionsPage) self.categoryList.setSelectionBehavior(QAbstractItemView.SelectRows) self.categoryList.setModel(self.categoryModel) self.categoryList.selectionModel().setCurrentIndex( self.categoryList.indexAt(QPoint(1, 1)), QItemSelectionModel.Select) self.categoryList.selectionModel().selectionChanged.connect( self.onSelectionChanged) self.layout.addWidget(self.categoryList, 0, 0, 1, 1) self.layout.addLayout(self.right_layout, 0, 1, 5, 1) self.setLayout(self.layout) def init(self): pass def initDifficultyLayout(self): self.difficultyPage = QWidget() self.difficultyLayout = QGridLayout() self.difficultyLayout.setAlignment(Qt.AlignTop) self.difficultyPage.setLayout(self.difficultyLayout) self.playerCoalitionSkill = QComboBox() self.enemyCoalitionSkill = QComboBox() self.enemyAASkill = QComboBox() for skill in CONST.SKILL_OPTIONS: self.playerCoalitionSkill.addItem(skill) self.enemyCoalitionSkill.addItem(skill) self.enemyAASkill.addItem(skill) self.playerCoalitionSkill.setCurrentIndex( CONST.SKILL_OPTIONS.index(self.game.settings.player_skill)) self.enemyCoalitionSkill.setCurrentIndex( CONST.SKILL_OPTIONS.index(self.game.settings.enemy_skill)) self.enemyAASkill.setCurrentIndex( CONST.SKILL_OPTIONS.index(self.game.settings.enemy_vehicle_skill)) self.playerCoalitionSkill.currentIndexChanged.connect( self.applySettings) self.enemyCoalitionSkill.currentIndexChanged.connect( self.applySettings) self.enemyAASkill.currentIndexChanged.connect(self.applySettings) self.difficultyLayout.addWidget(QLabel("Player coalition skill"), 0, 0) self.difficultyLayout.addWidget(self.playerCoalitionSkill, 0, 1, Qt.AlignRight) self.difficultyLayout.addWidget(QLabel("Enemy skill"), 1, 0) self.difficultyLayout.addWidget(self.enemyCoalitionSkill, 1, 1, Qt.AlignRight) self.difficultyLayout.addWidget(QLabel("Enemy AA and vehicles skill"), 2, 0) self.difficultyLayout.addWidget(self.enemyAASkill, 2, 1, Qt.AlignRight) self.difficultyLabel = QComboBox() [self.difficultyLabel.addItem(t) for t in CONST.LABELS_OPTIONS] self.difficultyLabel.setCurrentIndex( CONST.LABELS_OPTIONS.index(self.game.settings.labels)) self.difficultyLabel.currentIndexChanged.connect(self.applySettings) self.difficultyLayout.addWidget(QLabel("In Game Labels"), 3, 0) self.difficultyLayout.addWidget(self.difficultyLabel, 3, 1, Qt.AlignRight) self.noNightMission = QCheckBox() self.noNightMission.setChecked(self.game.settings.night_disabled) self.noNightMission.toggled.connect(self.applySettings) self.difficultyLayout.addWidget(QLabel("No night missions"), 4, 0) self.difficultyLayout.addWidget(self.noNightMission, 4, 1, Qt.AlignRight) self.mapVisibiitySelection = QComboBox() self.mapVisibiitySelection.addItem("All", ForcedOptions.Views.All) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.All: self.mapVisibiitySelection.setCurrentIndex(0) self.mapVisibiitySelection.addItem("Fog of War", ForcedOptions.Views.Allies) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.Allies: self.mapVisibiitySelection.setCurrentIndex(1) self.mapVisibiitySelection.addItem("Allies Only", ForcedOptions.Views.OnlyAllies) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.OnlyAllies: self.mapVisibiitySelection.setCurrentIndex(2) self.mapVisibiitySelection.addItem("Own Aircraft Only", ForcedOptions.Views.MyAircraft) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.MyAircraft: self.mapVisibiitySelection.setCurrentIndex(3) self.mapVisibiitySelection.addItem("Map Only", ForcedOptions.Views.OnlyMap) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.OnlyMap: self.mapVisibiitySelection.setCurrentIndex(4) self.mapVisibiitySelection.currentIndexChanged.connect( self.applySettings) self.difficultyLayout.addWidget(QLabel("Map visibility options"), 5, 0) self.difficultyLayout.addWidget(self.mapVisibiitySelection, 5, 1, Qt.AlignRight) self.ext_views = QCheckBox() self.ext_views.setChecked(self.game.settings.external_views_allowed) self.ext_views.toggled.connect(self.applySettings) self.difficultyLayout.addWidget(QLabel("Allow external views"), 6, 0) self.difficultyLayout.addWidget(self.ext_views, 6, 1, Qt.AlignRight) def initGeneratorLayout(self): self.generatorPage = QWidget() self.generatorLayout = QVBoxLayout() self.generatorLayout.setAlignment(Qt.AlignTop) self.generatorPage.setLayout(self.generatorLayout) self.gameplay = QGroupBox("Gameplay") self.gameplayLayout = QGridLayout() self.gameplayLayout.setAlignment(Qt.AlignTop) self.gameplay.setLayout(self.gameplayLayout) self.supercarrier = QCheckBox() self.supercarrier.setChecked(self.game.settings.supercarrier) self.supercarrier.toggled.connect(self.applySettings) self.generate_marks = QCheckBox() self.generate_marks.setChecked(self.game.settings.generate_marks) self.generate_marks.toggled.connect(self.applySettings) self.never_delay_players = QCheckBox() self.never_delay_players.setChecked( self.game.settings.never_delay_player_flights) self.never_delay_players.toggled.connect(self.applySettings) self.never_delay_players.setToolTip( "When checked, player flights with a delayed start time will be " "spawned immediately. AI wingmen may begin startup immediately.") self.gameplayLayout.addWidget(QLabel("Use Supercarrier Module"), 0, 0) self.gameplayLayout.addWidget(self.supercarrier, 0, 1, Qt.AlignRight) self.gameplayLayout.addWidget(QLabel("Put Objective Markers on Map"), 1, 0) self.gameplayLayout.addWidget(self.generate_marks, 1, 1, Qt.AlignRight) self.gameplayLayout.addWidget(QLabel("Never delay player flights"), 2, 0) self.gameplayLayout.addWidget(self.never_delay_players, 2, 1, Qt.AlignRight) self.performance = QGroupBox("Performance") self.performanceLayout = QGridLayout() self.performanceLayout.setAlignment(Qt.AlignTop) self.performance.setLayout(self.performanceLayout) self.smoke = QCheckBox() self.smoke.setChecked(self.game.settings.perf_smoke_gen) self.smoke.toggled.connect(self.applySettings) self.red_alert = QCheckBox() self.red_alert.setChecked(self.game.settings.perf_red_alert_state) self.red_alert.toggled.connect(self.applySettings) self.arti = QCheckBox() self.arti.setChecked(self.game.settings.perf_artillery) self.arti.toggled.connect(self.applySettings) self.moving_units = QCheckBox() self.moving_units.setChecked(self.game.settings.perf_moving_units) self.moving_units.toggled.connect(self.applySettings) self.infantry = QCheckBox() self.infantry.setChecked(self.game.settings.perf_infantry) self.infantry.toggled.connect(self.applySettings) self.ai_parking_start = QCheckBox() self.ai_parking_start.setChecked( self.game.settings.perf_ai_parking_start) self.ai_parking_start.toggled.connect(self.applySettings) self.destroyed_units = QCheckBox() self.destroyed_units.setChecked( self.game.settings.perf_destroyed_units) self.destroyed_units.toggled.connect(self.applySettings) self.culling = QCheckBox() self.culling.setChecked(self.game.settings.perf_culling) self.culling.toggled.connect(self.applySettings) self.culling_distance = QSpinBox() self.culling_distance.setMinimum(50) self.culling_distance.setMaximum(10000) self.culling_distance.setValue( self.game.settings.perf_culling_distance) self.culling_distance.valueChanged.connect(self.applySettings) self.performanceLayout.addWidget( QLabel("Smoke visual effect on frontline"), 0, 0) self.performanceLayout.addWidget(self.smoke, 0, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget( QLabel("SAM starts in RED alert mode"), 1, 0) self.performanceLayout.addWidget(self.red_alert, 1, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QLabel("Artillery strikes"), 2, 0) self.performanceLayout.addWidget(self.arti, 2, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QLabel("Moving ground units"), 3, 0) self.performanceLayout.addWidget(self.moving_units, 3, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget( QLabel("Generate infantry squads along vehicles"), 4, 0) self.performanceLayout.addWidget(self.infantry, 4, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget( QLabel( "AI planes parking start (AI starts in flight if disabled)"), 5, 0) self.performanceLayout.addWidget(self.ai_parking_start, 5, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget( QLabel("Include destroyed units carcass"), 6, 0) self.performanceLayout.addWidget(self.destroyed_units, 6, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QHorizontalSeparationLine(), 7, 0, 1, 2) self.performanceLayout.addWidget( QLabel("Culling of distant units enabled"), 8, 0) self.performanceLayout.addWidget(self.culling, 8, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QLabel("Culling distance (km)"), 9, 0) self.performanceLayout.addWidget(self.culling_distance, 9, 1, alignment=Qt.AlignRight) self.generatorLayout.addWidget(self.gameplay) self.generatorLayout.addWidget( QLabel( "Disabling settings below may improve performance, but will impact the overall quality of the experience." )) self.generatorLayout.addWidget(self.performance) def initCheatLayout(self): self.cheatPage = QWidget() self.cheatLayout = QVBoxLayout() self.cheatPage.setLayout(self.cheatLayout) self.cheat_options = CheatSettingsBox(self.game, self.applySettings) self.cheatLayout.addWidget(self.cheat_options) self.moneyCheatBox = QGroupBox("Money Cheat") self.moneyCheatBox.setAlignment(Qt.AlignTop) self.moneyCheatBoxLayout = QGridLayout() self.moneyCheatBox.setLayout(self.moneyCheatBoxLayout) cheats_amounts = [25, 50, 100, 200, 500, 1000, -25, -50, -100, -200] for i, amount in enumerate(cheats_amounts): if amount > 0: btn = QPushButton("Cheat +" + str(amount) + "M") btn.setProperty("style", "btn-success") else: btn = QPushButton("Cheat " + str(amount) + "M") btn.setProperty("style", "btn-danger") btn.clicked.connect(self.cheatLambda(amount)) self.moneyCheatBoxLayout.addWidget(btn, i / 2, i % 2) self.cheatLayout.addWidget(self.moneyCheatBox, stretch=1) def cheatLambda(self, amount): return lambda: self.cheatMoney(amount) def cheatMoney(self, amount): logging.info("CHEATING FOR AMOUNT : " + str(amount) + "M") self.game.budget += amount if amount > 0: self.game.informations.append( Information("CHEATER", "You are a cheater and you should feel bad", self.game.turn)) else: self.game.informations.append( Information("CHEATER", "You are still a cheater !", self.game.turn)) GameUpdateSignal.get_instance().updateGame(self.game) def applySettings(self): self.game.settings.player_skill = CONST.SKILL_OPTIONS[ self.playerCoalitionSkill.currentIndex()] self.game.settings.enemy_skill = CONST.SKILL_OPTIONS[ self.enemyCoalitionSkill.currentIndex()] self.game.settings.enemy_vehicle_skill = CONST.SKILL_OPTIONS[ self.enemyAASkill.currentIndex()] self.game.settings.labels = CONST.LABELS_OPTIONS[ self.difficultyLabel.currentIndex()] self.game.settings.night_disabled = self.noNightMission.isChecked() self.game.settings.map_coalition_visibility = self.mapVisibiitySelection.currentData( ) self.game.settings.external_views_allowed = self.ext_views.isChecked() self.game.settings.generate_marks = self.generate_marks.isChecked() self.game.settings.never_delay_player_flights = self.never_delay_players.isChecked( ) self.game.settings.supercarrier = self.supercarrier.isChecked() self.game.settings.perf_red_alert_state = self.red_alert.isChecked() self.game.settings.perf_smoke_gen = self.smoke.isChecked() self.game.settings.perf_artillery = self.arti.isChecked() self.game.settings.perf_moving_units = self.moving_units.isChecked() self.game.settings.perf_infantry = self.infantry.isChecked() self.game.settings.perf_ai_parking_start = self.ai_parking_start.isChecked( ) self.game.settings.perf_destroyed_units = self.destroyed_units.isChecked( ) self.game.settings.perf_culling = self.culling.isChecked() self.game.settings.perf_culling_distance = int( self.culling_distance.value()) self.game.settings.show_red_ato = self.cheat_options.show_red_ato GameUpdateSignal.get_instance().updateGame(self.game) def onSelectionChanged(self): index = self.categoryList.selectionModel().currentIndex().row() self.right_layout.setCurrentIndex(index)
class Shell(QMainWindow): def __init__(self): # constructor super().__init__() # call the parent's constructor # Test data in a model self.users = ['User 1', 'User 2', 'User 3'] self.lv_model = QStringListModel() self.lv_model.setStringList(self.users) # Create the main window content widget w = QWidget() # Setup the rest of the main window appearance self.setGeometry(300, 300, 640, 480) self.setWindowTitle('PySide2 Listview Experiments') self.setWindowIcon(QIcon('assets/icons/moon_64x64.png')) # Create and set the main layout layout = QVBoxLayout() w.setLayout(layout) # Set the layout of the main window content widget self.setCentralWidget(w) # Create and add components to the layout self.lv_label = QLabel('QListView with QStringListModel') layout.addWidget(self.lv_label) self.lv = QListView() self.lv.setSelectionMode( QListView.MultiSelection) # single selection is the default self.lv.setModel(self.lv_model) self.lv.selectionModel().selectionChanged.connect(self.item_selected) layout.addWidget(self.lv) self.button = QPushButton('Update model') self.button.clicked.connect(self.change_model) layout.addWidget(self.button) self.selected_label = QLabel('Selected item: none') layout.addWidget(self.selected_label) layout.addStretch(1) self.show() # display the UI def change_model(self): the_list = self.lv_model.stringList() the_list.append('Another User') self.lv_model.setStringList(the_list) def item_selected(self): # Get the current index (a QModelIndex object) from the QListView # From the index, get the data (a QVariant) that you can convert to a QString index = self.lv.currentIndex() # returns the primary QModelIndex indices = self.lv.selectedIndexes() # returns a list of QModelIndex selected_text = '' for i in indices: selected_text += i.data( ) + '\n' # use .data() to get the value from QModelIndex self.selected_label.setText(selected_text)
def setData(self, index, value='', role=Qt.EditRole): row = index.row() if role == Qt.EditRole: self.status[row] = value self.dataChanged.emit(index, index) # inform the other view to request new data return True else: return False if __name__ == '__main__': import sys app = QApplication(sys.argv) myModel_on_mywindow = MyModel([1, 2, 3]) mywindow = Window(myModel_on_mywindow) mywindow.setWindowTitle('myModel_on_mywindow') mywindow.show() myModel_on_mywindow.status[0] = 2 myModel_on_qlistview = MyModel([1, 2, 3]) qlistview = QListView() qlistview.show() qlistview.setModel(myModel_on_qlistview) qlistview.setWindowTitle('myModel_on_qlistview') myModel_on_qlistview.status[0] = 2 sys.exit(app.exec_())
userAgent = ua.random except FakeUserAgentError: print("2") userAgent = "Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, как Gecko) Chrome / " \ "72.0.3626.121 Safari / 537.36" app = QApplication(sys.argv) proxy = QNetworkProxy() proxy.setType(QNetworkProxy.HttpProxy) proxy.setHostName("109.173.124.250") proxy.setPort(7793) QNetworkProxy.setApplicationProxy(proxy) grid = QGridLayout() # browser = QWebEngineView() browser = Browser() # url_input = UrlInput(browser) list_view = QListView() list_view.setFixedWidth(300) # interceptor = WebEngineUrlRequestInterceptor() profile = QWebEngineProfile() profile.setHttpUserAgent(userAgent) page = MyWebEnginePage(profile, browser) page.setUrl(QUrl("https://www.instagram.com/")) # page.setUrl(QUrl("https://2ip.ru")) browser.setPage(page) page_proxy = browser.page() page_proxy.proxyAuthenticationRequired.connect(handleProxyAuthReq) grid.addWidget(list_view, 0, 1) grid.addWidget(browser, 0, 2) main_frame = QWidget() main_frame.setMinimumSize(800, 600) main_frame.setLayout(grid)
class ClipboardManager: def __init__(self): self.clips = [] self.clipboard_save_dir = _dir / "clip" self.app_settings_file = Path( QStandardPaths.writableLocation( QStandardPaths.GenericConfigLocation) ) / "network_clipboard_settings.json" if self.app_settings_file.exists(): self.clipboard_save_dir = Path( json.loads( self.app_settings_file.read_text())["clipboard_save_dir"]) self.hostname = socket.gethostname() self.clipboard_save_file = self.clipboard_save_dir / f"{self.hostname}.clips.json" def read_clips_from_files(self, initialize=False): print('running read_clips_from_files') update_clips = [] for json_filepath in self.clipboard_save_dir.glob("*.clips.json"): if json_filepath == self.clipboard_save_file and not initialize: continue with json_filepath.open() as f: update_clips += json.load(f) for clip in update_clips: if clip not in self.clips: self.clips.append(clip) self.clips_model.setStringList(self.clips) def on_clip(self, mode): print(f'on_clip mode:{mode}') if mode == QClipboard.Mode.Clipboard: self.save_clipboard_contents_and_update_gui() def update_save_folder(self, new_save_folder): new_save_folder_path = Path(new_save_folder) if new_save_folder_path.exists(): self.app_settings_file.write_text( json.dumps(dict(clipboard_save_dir=new_save_folder))) self.clipboard_save_dir = new_save_folder_path self.clipboard_save_file = self.clipboard_save_dir / f"{self.hostname}.clips.json" self.clipboard_save_dir_line_widget.setText(new_save_folder) def pick_save_folder(self): self.update_save_folder( QFileDialog.getExistingDirectory( self.window, "Pick shared network folder to sync clipboards", os.fspath(Path.home()), 0)) def save_clipboard_contents_and_update_gui(self): last_clipboard_contents = self.clipboard.text( QClipboard.Mode.Clipboard) self.clips.insert(0, last_clipboard_contents) self.clips_model.setStringList(self.clips) print(f'new clipboard contents: {last_clipboard_contents}') self.clipboard_save_dir.mkdir(parents=True, exist_ok=True) with open(self.clipboard_save_file, 'w') as f: json.dump(self.clips, f) def copy_entry(self): results = [] for index in self.clips_view.selectedIndexes(): results.append(self.clips[index.row()]) self.clipboard.setText('\n'.join(results)) def delete_entry(self): for index in self.clips_view.selectedIndexes(): self.clips.pop(index.row()) self.clips_model.setStringList(self.clips) self.clipboard_save_dir.mkdir(parents=True, exist_ok=True) with open(self.clipboard_save_file, 'w') as f: json.dump(self.clips, f) def run(self): app = QApplication(sys.argv) self.clipboard = app.clipboard() self.window = QWidget() self.layout = QVBoxLayout() self.clipboard_save_dir_line_widget = QLineEdit() self.clipboard_save_dir_line_widget.setText( os.fspath(self.clipboard_save_dir)) self.clipboard_save_dir_line_widget.textChanged.connect( self.update_save_folder) self.launch_file_dialog_button = QPushButton() self.launch_file_dialog_button.setIcon( self.window.style().standardIcon( QtWidgets.QStyle.SP_DialogOpenButton)) self.launch_file_dialog_button.clicked.connect(self.pick_save_folder) self.clips_view = QListView() self.clips_model = QStringListModel() self.clips_view.setModel(self.clips_model) self.read_clips_from_files(initialize=True) self.save_folders_label = QLabel("clipboard network saves folder") self.layout.addWidget(self.save_folders_label) line = QWidget() line.setLayout(QHBoxLayout()) line.layout().addWidget(self.clipboard_save_dir_line_widget) line.layout().addWidget(self.launch_file_dialog_button) self.layout.addWidget(line) self.copy_button = QPushButton() self.copy_button.setText("Copy") self.copy_button.clicked.connect(self.copy_entry) self.delete_button = QPushButton() self.delete_button.setText("Delete") self.delete_button.clicked.connect(self.delete_entry) buttons = QWidget() buttons.setLayout(QHBoxLayout()) buttons.layout().addWidget(self.copy_button) buttons.layout().addWidget(self.delete_button) self.layout.addWidget(buttons) self.layout.addWidget(self.clips_view) self.window.setLayout(self.layout) self.clipboard.changed.connect(self.on_clip) self.timer = QTimer() self.timer.timeout.connect(self.read_clips_from_files) self.timer.start(5 * 1000) self.window.resize( QDesktopWidget().availableGeometry(self.window).size() * 0.5) self.window.show() sys.exit(app.exec_())
class QSettingsWindow(QDialog): def __init__(self, game: Game): super(QSettingsWindow, self).__init__() self.game = game self.pluginsPage = None self.pluginsOptionsPage = None self.campaign_management_page = QWidget() self.setModal(True) self.setWindowTitle("Settings") self.setWindowIcon(CONST.ICONS["Settings"]) self.setMinimumSize(600, 250) self.initUi() def initUi(self): self.layout = QGridLayout() self.categoryList = QListView() self.right_layout = QStackedLayout() self.categoryList.setMaximumWidth(175) self.categoryModel = QStandardItemModel(self.categoryList) self.categoryList.setIconSize(QSize(32, 32)) self.initDifficultyLayout() difficulty = QStandardItem("Difficulty") difficulty.setIcon(CONST.ICONS["Missile"]) difficulty.setEditable(False) difficulty.setSelectable(True) self.categoryModel.appendRow(difficulty) self.right_layout.addWidget(self.difficultyPage) self.init_campaign_management_layout() campaign_management = QStandardItem("Campaign Management") campaign_management.setIcon(CONST.ICONS["Money"]) campaign_management.setEditable(False) campaign_management.setSelectable(True) self.categoryModel.appendRow(campaign_management) self.right_layout.addWidget(self.campaign_management_page) self.initGeneratorLayout() generator = QStandardItem("Mission Generator") generator.setIcon(CONST.ICONS["Generator"]) generator.setEditable(False) generator.setSelectable(True) self.categoryModel.appendRow(generator) self.right_layout.addWidget(self.generatorPage) self.initCheatLayout() cheat = QStandardItem("Cheat Menu") cheat.setIcon(CONST.ICONS["Cheat"]) cheat.setEditable(False) cheat.setSelectable(True) self.categoryModel.appendRow(cheat) self.right_layout.addWidget(self.cheatPage) self.pluginsPage = PluginsPage() plugins = QStandardItem("LUA Plugins") plugins.setIcon(CONST.ICONS["Plugins"]) plugins.setEditable(False) plugins.setSelectable(True) self.categoryModel.appendRow(plugins) self.right_layout.addWidget(self.pluginsPage) self.pluginsOptionsPage = PluginOptionsPage() pluginsOptions = QStandardItem("LUA Plugins Options") pluginsOptions.setIcon(CONST.ICONS["PluginsOptions"]) pluginsOptions.setEditable(False) pluginsOptions.setSelectable(True) self.categoryModel.appendRow(pluginsOptions) self.right_layout.addWidget(self.pluginsOptionsPage) self.categoryList.setSelectionBehavior(QAbstractItemView.SelectRows) self.categoryList.setModel(self.categoryModel) self.categoryList.selectionModel().setCurrentIndex( self.categoryList.indexAt(QPoint(1, 1)), QItemSelectionModel.Select) self.categoryList.selectionModel().selectionChanged.connect( self.onSelectionChanged) self.layout.addWidget(self.categoryList, 0, 0, 1, 1) self.layout.addLayout(self.right_layout, 0, 1, 5, 1) self.setLayout(self.layout) def init(self): pass def initDifficultyLayout(self): self.difficultyPage = QWidget() self.difficultyLayout = QVBoxLayout() self.difficultyLayout.setAlignment(Qt.AlignTop) self.difficultyPage.setLayout(self.difficultyLayout) # DCS AI difficulty settings self.aiDifficultySettings = QGroupBox("AI Difficulty") self.aiDifficultyLayout = QGridLayout() self.playerCoalitionSkill = QComboBox() self.enemyCoalitionSkill = QComboBox() self.enemyAASkill = QComboBox() for skill in CONST.SKILL_OPTIONS: self.playerCoalitionSkill.addItem(skill) self.enemyCoalitionSkill.addItem(skill) self.enemyAASkill.addItem(skill) self.playerCoalitionSkill.setCurrentIndex( CONST.SKILL_OPTIONS.index(self.game.settings.player_skill)) self.enemyCoalitionSkill.setCurrentIndex( CONST.SKILL_OPTIONS.index(self.game.settings.enemy_skill)) self.enemyAASkill.setCurrentIndex( CONST.SKILL_OPTIONS.index(self.game.settings.enemy_vehicle_skill)) self.player_income = TenthsSpinSlider( "Player income multiplier", 1, 50, int(self.game.settings.player_income_multiplier * 10), ) self.player_income.spinner.valueChanged.connect(self.applySettings) self.enemy_income = TenthsSpinSlider( "Enemy income multiplier", 1, 50, int(self.game.settings.enemy_income_multiplier * 10), ) self.enemy_income.spinner.valueChanged.connect(self.applySettings) self.playerCoalitionSkill.currentIndexChanged.connect( self.applySettings) self.enemyCoalitionSkill.currentIndexChanged.connect( self.applySettings) self.enemyAASkill.currentIndexChanged.connect(self.applySettings) # Mission generation settings related to difficulty self.missionSettings = QGroupBox("Mission Difficulty") self.missionLayout = QGridLayout() self.manpads = QCheckBox() self.manpads.setChecked(self.game.settings.manpads) self.manpads.toggled.connect(self.applySettings) self.noNightMission = QCheckBox() self.noNightMission.setChecked(self.game.settings.night_disabled) self.noNightMission.toggled.connect(self.applySettings) # DCS Mission options self.missionRestrictionsSettings = QGroupBox("Mission Restrictions") self.missionRestrictionsLayout = QGridLayout() self.difficultyLabel = QComboBox() [self.difficultyLabel.addItem(t) for t in CONST.LABELS_OPTIONS] self.difficultyLabel.setCurrentIndex( CONST.LABELS_OPTIONS.index(self.game.settings.labels)) self.difficultyLabel.currentIndexChanged.connect(self.applySettings) self.mapVisibiitySelection = QComboBox() self.mapVisibiitySelection.addItem("All", ForcedOptions.Views.All) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.All: self.mapVisibiitySelection.setCurrentIndex(0) self.mapVisibiitySelection.addItem("Fog of War", ForcedOptions.Views.Allies) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.Allies: self.mapVisibiitySelection.setCurrentIndex(1) self.mapVisibiitySelection.addItem("Allies Only", ForcedOptions.Views.OnlyAllies) if (self.game.settings.map_coalition_visibility == ForcedOptions.Views.OnlyAllies): self.mapVisibiitySelection.setCurrentIndex(2) self.mapVisibiitySelection.addItem("Own Aircraft Only", ForcedOptions.Views.MyAircraft) if (self.game.settings.map_coalition_visibility == ForcedOptions.Views.MyAircraft): self.mapVisibiitySelection.setCurrentIndex(3) self.mapVisibiitySelection.addItem("Map Only", ForcedOptions.Views.OnlyMap) if self.game.settings.map_coalition_visibility == ForcedOptions.Views.OnlyMap: self.mapVisibiitySelection.setCurrentIndex(4) self.mapVisibiitySelection.currentIndexChanged.connect( self.applySettings) self.ext_views = QCheckBox() self.ext_views.setChecked(self.game.settings.external_views_allowed) self.ext_views.toggled.connect(self.applySettings) self.aiDifficultyLayout.addWidget(QLabel("Player coalition skill"), 0, 0) self.aiDifficultyLayout.addWidget(self.playerCoalitionSkill, 0, 1, Qt.AlignRight) self.aiDifficultyLayout.addWidget(QLabel("Enemy coalition skill"), 1, 0) self.aiDifficultyLayout.addWidget(self.enemyCoalitionSkill, 1, 1, Qt.AlignRight) self.aiDifficultyLayout.addWidget( QLabel("Enemy AA and vehicles skill"), 2, 0) self.aiDifficultyLayout.addWidget(self.enemyAASkill, 2, 1, Qt.AlignRight) self.aiDifficultyLayout.addLayout(self.player_income, 3, 0) self.aiDifficultyLayout.addLayout(self.enemy_income, 4, 0) self.aiDifficultySettings.setLayout(self.aiDifficultyLayout) self.difficultyLayout.addWidget(self.aiDifficultySettings) self.missionLayout.addWidget(QLabel("Manpads on frontlines"), 0, 0) self.missionLayout.addWidget(self.manpads, 0, 1, Qt.AlignRight) self.missionLayout.addWidget(QLabel("No night missions"), 1, 0) self.missionLayout.addWidget(self.noNightMission, 1, 1, Qt.AlignRight) self.missionSettings.setLayout(self.missionLayout) self.difficultyLayout.addWidget(self.missionSettings) self.missionRestrictionsLayout.addWidget(QLabel("In Game Labels"), 0, 0) self.missionRestrictionsLayout.addWidget(self.difficultyLabel, 0, 1, Qt.AlignRight) self.missionRestrictionsLayout.addWidget( QLabel("Map visibility options"), 1, 0) self.missionRestrictionsLayout.addWidget(self.mapVisibiitySelection, 1, 1, Qt.AlignRight) self.missionRestrictionsLayout.addWidget( QLabel("Allow external views"), 2, 0) self.missionRestrictionsLayout.addWidget(self.ext_views, 2, 1, Qt.AlignRight) self.missionRestrictionsSettings.setLayout( self.missionRestrictionsLayout) self.difficultyLayout.addWidget(self.missionRestrictionsSettings) def init_campaign_management_layout(self) -> None: campaign_layout = QVBoxLayout() campaign_layout.setAlignment(Qt.AlignTop) self.campaign_management_page.setLayout(campaign_layout) general = QGroupBox("General") campaign_layout.addWidget(general) general_layout = QGridLayout() general.setLayout(general_layout) def set_restict_weapons_by_date(value: bool) -> None: self.game.settings.restrict_weapons_by_date = value restrict_weapons = QCheckBox() restrict_weapons.setChecked( self.game.settings.restrict_weapons_by_date) restrict_weapons.toggled.connect(set_restict_weapons_by_date) tooltip_text = ( "Restricts weapon availability based on the campaign date. Data is " "extremely incomplete so does not affect all weapons.") restrict_weapons.setToolTip(tooltip_text) restrict_weapons_label = QLabel("Restrict weapons by date (WIP)") restrict_weapons_label.setToolTip(tooltip_text) general_layout.addWidget(restrict_weapons_label, 0, 0) general_layout.addWidget(restrict_weapons, 0, 1, Qt.AlignRight) automation = QGroupBox("HQ Automation") campaign_layout.addWidget(automation) automation_layout = QGridLayout() automation.setLayout(automation_layout) def set_runway_automation(value: bool) -> None: self.game.settings.automate_runway_repair = value def set_front_line_automation(value: bool) -> None: self.game.settings.automate_front_line_reinforcements = value def set_aircraft_automation(value: bool) -> None: self.game.settings.automate_aircraft_reinforcements = value runway_repair = QCheckBox() runway_repair.setChecked(self.game.settings.automate_runway_repair) runway_repair.toggled.connect(set_runway_automation) automation_layout.addWidget(QLabel("Automate runway repairs"), 0, 0) automation_layout.addWidget(runway_repair, 0, 1, Qt.AlignRight) front_line = QCheckBox() front_line.setChecked( self.game.settings.automate_front_line_reinforcements) front_line.toggled.connect(set_front_line_automation) automation_layout.addWidget(QLabel("Automate front-line purchases"), 1, 0) automation_layout.addWidget(front_line, 1, 1, Qt.AlignRight) aircraft = QCheckBox() aircraft.setChecked( self.game.settings.automate_aircraft_reinforcements) aircraft.toggled.connect(set_aircraft_automation) automation_layout.addWidget(QLabel("Automate aircraft purchases"), 2, 0) automation_layout.addWidget(aircraft, 2, 1, Qt.AlignRight) def initGeneratorLayout(self): self.generatorPage = QWidget() self.generatorLayout = QVBoxLayout() self.generatorLayout.setAlignment(Qt.AlignTop) self.generatorPage.setLayout(self.generatorLayout) self.gameplay = QGroupBox("Gameplay") self.gameplayLayout = QGridLayout() self.gameplayLayout.setAlignment(Qt.AlignTop) self.gameplay.setLayout(self.gameplayLayout) self.supercarrier = QCheckBox() self.supercarrier.setChecked(self.game.settings.supercarrier) self.supercarrier.toggled.connect(self.applySettings) self.generate_marks = QCheckBox() self.generate_marks.setChecked(self.game.settings.generate_marks) self.generate_marks.toggled.connect(self.applySettings) self.never_delay_players = QCheckBox() self.never_delay_players.setChecked( self.game.settings.never_delay_player_flights) self.never_delay_players.toggled.connect(self.applySettings) self.never_delay_players.setToolTip( "When checked, player flights with a delayed start time will be " "spawned immediately. AI wingmen may begin startup immediately.") self.gameplayLayout.addWidget(QLabel("Use Supercarrier Module"), 0, 0) self.gameplayLayout.addWidget(self.supercarrier, 0, 1, Qt.AlignRight) self.gameplayLayout.addWidget(QLabel("Put Objective Markers on Map"), 1, 0) self.gameplayLayout.addWidget(self.generate_marks, 1, 1, Qt.AlignRight) self.gameplayLayout.addWidget(QLabel("Never delay player flights"), 2, 0) self.gameplayLayout.addWidget(self.never_delay_players, 2, 1, Qt.AlignRight) start_type_label = QLabel( "Default start type for AI aircraft:<br /><strong>Warning: " + "Any option other than Cold breaks OCA/Aircraft missions.</strong>" ) start_type_label.setToolTip(START_TYPE_TOOLTIP) start_type = StartTypeComboBox(self.game.settings) start_type.setCurrentText(self.game.settings.default_start_type) self.gameplayLayout.addWidget(start_type_label, 3, 0) self.gameplayLayout.addWidget(start_type, 3, 1) self.performance = QGroupBox("Performance") self.performanceLayout = QGridLayout() self.performanceLayout.setAlignment(Qt.AlignTop) self.performance.setLayout(self.performanceLayout) self.smoke = QCheckBox() self.smoke.setChecked(self.game.settings.perf_smoke_gen) self.smoke.toggled.connect(self.applySettings) self.red_alert = QCheckBox() self.red_alert.setChecked(self.game.settings.perf_red_alert_state) self.red_alert.toggled.connect(self.applySettings) self.arti = QCheckBox() self.arti.setChecked(self.game.settings.perf_artillery) self.arti.toggled.connect(self.applySettings) self.moving_units = QCheckBox() self.moving_units.setChecked(self.game.settings.perf_moving_units) self.moving_units.toggled.connect(self.applySettings) self.infantry = QCheckBox() self.infantry.setChecked(self.game.settings.perf_infantry) self.infantry.toggled.connect(self.applySettings) self.destroyed_units = QCheckBox() self.destroyed_units.setChecked( self.game.settings.perf_destroyed_units) self.destroyed_units.toggled.connect(self.applySettings) self.culling = QCheckBox() self.culling.setChecked(self.game.settings.perf_culling) self.culling.toggled.connect(self.applySettings) self.culling_distance = QSpinBox() self.culling_distance.setMinimum(10) self.culling_distance.setMaximum(10000) self.culling_distance.setValue( self.game.settings.perf_culling_distance) self.culling_distance.valueChanged.connect(self.applySettings) self.culling_do_not_cull_carrier = QCheckBox() self.culling_do_not_cull_carrier.setChecked( self.game.settings.perf_do_not_cull_carrier) self.culling_do_not_cull_carrier.toggled.connect(self.applySettings) self.performanceLayout.addWidget( QLabel("Smoke visual effect on frontline"), 0, 0) self.performanceLayout.addWidget(self.smoke, 0, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget( QLabel("SAM starts in RED alert mode"), 1, 0) self.performanceLayout.addWidget(self.red_alert, 1, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QLabel("Artillery strikes"), 2, 0) self.performanceLayout.addWidget(self.arti, 2, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QLabel("Moving ground units"), 3, 0) self.performanceLayout.addWidget(self.moving_units, 3, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget( QLabel("Generate infantry squads along vehicles"), 4, 0) self.performanceLayout.addWidget(self.infantry, 4, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget( QLabel("Include destroyed units carcass"), 6, 0) self.performanceLayout.addWidget(self.destroyed_units, 6, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QHorizontalSeparationLine(), 7, 0, 1, 2) self.performanceLayout.addWidget( QLabel("Culling of distant units enabled"), 8, 0) self.performanceLayout.addWidget(self.culling, 8, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget(QLabel("Culling distance (km)"), 9, 0) self.performanceLayout.addWidget(self.culling_distance, 9, 1, alignment=Qt.AlignRight) self.performanceLayout.addWidget( QLabel("Do not cull carrier's surroundings"), 10, 0) self.performanceLayout.addWidget(self.culling_do_not_cull_carrier, 10, 1, alignment=Qt.AlignRight) self.generatorLayout.addWidget(self.gameplay) self.generatorLayout.addWidget( QLabel( "Disabling settings below may improve performance, but will impact the overall quality of the experience." )) self.generatorLayout.addWidget(self.performance) def initCheatLayout(self): self.cheatPage = QWidget() self.cheatLayout = QVBoxLayout() self.cheatPage.setLayout(self.cheatLayout) self.cheat_options = CheatSettingsBox(self.game, self.applySettings) self.cheatLayout.addWidget(self.cheat_options) self.moneyCheatBox = QGroupBox("Money Cheat") self.moneyCheatBox.setAlignment(Qt.AlignTop) self.moneyCheatBoxLayout = QGridLayout() self.moneyCheatBox.setLayout(self.moneyCheatBoxLayout) cheats_amounts = [25, 50, 100, 200, 500, 1000, -25, -50, -100, -200] for i, amount in enumerate(cheats_amounts): if amount > 0: btn = QPushButton("Cheat +" + str(amount) + "M") btn.setProperty("style", "btn-success") else: btn = QPushButton("Cheat " + str(amount) + "M") btn.setProperty("style", "btn-danger") btn.clicked.connect(self.cheatLambda(amount)) self.moneyCheatBoxLayout.addWidget(btn, i / 2, i % 2) self.cheatLayout.addWidget(self.moneyCheatBox, stretch=1) def cheatLambda(self, amount): return lambda: self.cheatMoney(amount) def cheatMoney(self, amount): logging.info("CHEATING FOR AMOUNT : " + str(amount) + "M") self.game.budget += amount if amount > 0: self.game.informations.append( Information( "CHEATER", "You are a cheater and you should feel bad", self.game.turn, )) else: self.game.informations.append( Information("CHEATER", "You are still a cheater !", self.game.turn)) GameUpdateSignal.get_instance().updateGame(self.game) def applySettings(self): self.game.settings.player_skill = CONST.SKILL_OPTIONS[ self.playerCoalitionSkill.currentIndex()] self.game.settings.enemy_skill = CONST.SKILL_OPTIONS[ self.enemyCoalitionSkill.currentIndex()] self.game.settings.enemy_vehicle_skill = CONST.SKILL_OPTIONS[ self.enemyAASkill.currentIndex()] self.game.settings.player_income_multiplier = self.player_income.value self.game.settings.enemy_income_multiplier = self.enemy_income.value self.game.settings.manpads = self.manpads.isChecked() self.game.settings.labels = CONST.LABELS_OPTIONS[ self.difficultyLabel.currentIndex()] self.game.settings.night_disabled = self.noNightMission.isChecked() self.game.settings.map_coalition_visibility = ( self.mapVisibiitySelection.currentData()) self.game.settings.external_views_allowed = self.ext_views.isChecked() self.game.settings.generate_marks = self.generate_marks.isChecked() self.game.settings.never_delay_player_flights = ( self.never_delay_players.isChecked()) self.game.settings.supercarrier = self.supercarrier.isChecked() self.game.settings.perf_red_alert_state = self.red_alert.isChecked() self.game.settings.perf_smoke_gen = self.smoke.isChecked() self.game.settings.perf_artillery = self.arti.isChecked() self.game.settings.perf_moving_units = self.moving_units.isChecked() self.game.settings.perf_infantry = self.infantry.isChecked() self.game.settings.perf_destroyed_units = self.destroyed_units.isChecked( ) self.game.settings.perf_culling = self.culling.isChecked() self.game.settings.perf_culling_distance = int( self.culling_distance.value()) self.game.settings.perf_do_not_cull_carrier = ( self.culling_do_not_cull_carrier.isChecked()) self.game.settings.show_red_ato = self.cheat_options.show_red_ato self.game.settings.enable_frontline_cheats = ( self.cheat_options.show_frontline_cheat) self.game.settings.enable_base_capture_cheat = ( self.cheat_options.show_base_capture_cheat) self.game.compute_conflicts_position() GameUpdateSignal.get_instance().updateGame(self.game) def onSelectionChanged(self): index = self.categoryList.selectionModel().currentIndex().row() self.right_layout.setCurrentIndex(index)
def __init__(self, parent=None): super().__init__(parent) self.player = FE14ConversationPlayer() self.visual_splitter_1 = QFrame() self.visual_splitter_1.setFrameShape(QFrame.HLine) self.visual_splitter_1.setFrameShadow(QFrame.Sunken) self.buttons_layout = QHBoxLayout() self.buttons_layout.setAlignment(QtGui.Qt.AlignCenter) self.save_button = QPushButton(text="Save") self.preview_button = QPushButton("Preview") self.buttons_layout.addWidget(self.save_button) self.buttons_layout.addWidget(self.preview_button) self.visual_splitter_2 = QFrame() self.visual_splitter_2.setFrameShape(QFrame.HLine) self.visual_splitter_2.setFrameShadow(QFrame.Sunken) self.avatar_form = QFormLayout() self.avatar_name_editor = QLineEdit() self.avatar_is_female_check = QCheckBox() self.avatar_form.addRow("Avatar Name", self.avatar_name_editor) self.avatar_form.addRow("Avatar Is Female", self.avatar_is_female_check) self.visual_splitter_3 = QFrame() self.visual_splitter_3.setFrameShape(QFrame.HLine) self.visual_splitter_3.setFrameShadow(QFrame.Sunken) self.conversation_list = QListView() self.left_layout = QVBoxLayout() self.left_layout.addWidget(self.player) self.left_layout.addWidget(self.visual_splitter_1) self.left_layout.addLayout(self.buttons_layout) self.left_layout.addWidget(self.visual_splitter_2) self.left_layout.addLayout(self.avatar_form) self.left_layout.addWidget(self.visual_splitter_3) self.left_layout.addWidget(self.conversation_list) self.left_layout.setStretch(0, 0) self.left_layout.setStretch(1, 0) self.left_layout.setStretch(2, 0) self.left_layout.setStretch(3, 0) self.left_layout.setStretch(4, 0) self.left_layout.setStretch(5, 0) self.left_layout.setStretch(6, 1) self.text_area = ConversationTextEdit() self.main_layout = QHBoxLayout() self.main_layout.addLayout(self.left_layout) self.main_layout.addWidget(self.text_area) self.main_layout.setStretch(0, 0) self.main_layout.setStretch(1, 1) self.central_widget = QWidget() self.central_widget.setLayout(self.main_layout) self.tool_bar = QToolBar() self.addToolBar(self.tool_bar) self.setCentralWidget(self.central_widget) self.status = QStatusBar() self.setStatusBar(self.status) self.resize(900, 500)
class PlotControlWidget(QWidget): # noinspection PyTypeChecker def __init__(self, parent=None): super().__init__(parent) # setup settings for the class self.settings = QSettings() self.settings.beginGroup("plot_control") self.base_vector_data = vpype.VectorData() self.vector_data: vpype.VectorData = None # settings self.page_format: str = self.settings.value("page_format", "A4") self.landscape: bool = self.settings.value("landscape", False) self.rotated: bool = self.settings.value("rotate", False) self.rotated: bool = self.settings.value("rotated", False) self.center: bool = self.settings.value("center", True) self.fit_page: bool = self.settings.value("fit_page", False) self.margin_value: float = self.settings.value("margin_value", 2.0) self.margin_unit: str = self.settings.value("margin_unit", "cm") # setup plot area self.plot = VectorDataPlotWidget() self.plot.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) # page layout controls page_box = QGroupBox("Page layout") page_layout = QFormLayout() page_format_combo = QComboBox() for k in PAGE_FORMATS: page_format_combo.addItem(k) page_format_combo.setCurrentText(self.page_format) page_format_combo.currentTextChanged.connect( lambda text: self.set_page_format(text)) landscape_check = QCheckBox("Landscape") landscape_check.setChecked(self.landscape) landscape_check.stateChanged.connect( lambda: self.set_landscape(landscape_check.isChecked())) rotated_check = QCheckBox("Rotated") rotated_check.setChecked(self.landscape) rotated_check.stateChanged.connect( lambda: self.set_rotated(rotated_check.isChecked())) center_check = QCheckBox("Center on page") center_check.setChecked(self.center) center_check.stateChanged.connect( lambda: self.set_center(center_check.isChecked())) fit_page_check = QCheckBox("Fit to page") fit_page_check.setChecked(self.fit_page) fit_page_check.stateChanged.connect( lambda: self.set_fit_page(fit_page_check.isChecked())) margin_layout = QHBoxLayout() margin_spin = QDoubleSpinBox() margin_spin.setValue(self.margin_value) margin_spin.valueChanged.connect(lambda: self.set_margin( margin_spin.value(), margin_unit.currentText())) margin_unit = UnitComboBox() margin_unit.setCurrentText(self.margin_unit) margin_unit.currentTextChanged.connect(lambda: self.set_margin( margin_spin.value(), margin_unit.currentText())) margin_layout.addWidget(margin_spin) margin_layout.addWidget(margin_unit) page_layout.addRow("Page format:", page_format_combo) page_layout.addRow("", landscape_check) page_layout.addRow("", rotated_check) page_layout.addRow("", center_check) page_layout.addRow("", fit_page_check) page_layout.addRow("Margin:", margin_layout) page_box.setLayout(page_layout) # Action buttons pen_up_btn = QPushButton("UP") pen_down_btn = QPushButton("DOWN") pen_up_btn.clicked.connect(lambda: axy.pen_up()) pen_down_btn.clicked.connect(lambda: axy.pen_down()) pen_up_spin = AxySettingsSpinBox(self.settings, "pen_pos_up", 60.0) pen_down_spin = AxySettingsSpinBox(self.settings, "pen_pos_down", 40.0) pen_up_layout = QHBoxLayout() pen_up_layout.addWidget(pen_up_spin) pen_up_layout.addWidget(pen_up_btn) pen_down_layout = QHBoxLayout() pen_down_layout.addWidget(pen_down_spin) pen_down_layout.addWidget(pen_down_btn) shutdown_btn = QPushButton("OFF") shutdown_btn.clicked.connect(lambda: axy.shutdown()) plot_btn = QPushButton("PLOT") plot_btn.clicked.connect(lambda: self.plot_svg()) action_box = QGroupBox("Actions") action_layout = QFormLayout() action_layout.addRow("Pen up: ", pen_up_layout) action_layout.addRow("Pen down: ", pen_down_layout) action_layout.addRow("Motor off:", shutdown_btn) action_layout.addRow("Plot:", plot_btn) action_box.setLayout(action_layout) self.list = QListView() self.list.setFixedHeight(120) self.list.setSizePolicy( QSizePolicy(QSizePolicy.Preferred, QSizePolicy.Preferred)) # controls layout controls_layout = QVBoxLayout() controls_layout.addWidget(self.list) controls_layout.addWidget(page_box) controls_layout.addWidget(action_box) controls_layout.addItem( QSpacerItem(20, 40, QSizePolicy.Minimum, QSizePolicy.Expanding)) # setup layout root_layout = QHBoxLayout() root_layout.addWidget(self.plot) root_layout.addLayout(controls_layout) self.setLayout(root_layout) self.update_view() # FIXME: stub vector data # vd = vpype.VectorData() # vd.add(vpype.LineCollection([(0, 100), (200, 1001 + 201j)]), 1) # vd.add(vpype.LineCollection([(0, 100 + 100j), (300j, 400j + 100)]), 2) self.load_svg( "/Users/hhip/Drive/axidraw/wheel_cards/wheel_card_triple_5_40.svg") # self.load_svg("/Users/hhip/Downloads/spirograph-grids/spirograph-grid.svg") def add_actions(self, toolbar: QToolBar): colorful_act = toolbar.addAction(QIcon("images/icons_colorful.png"), "Colorful") colorful_act.setCheckable(True) colorful_act.setChecked(self.plot.colorful) colorful_act.triggered.connect( lambda checked: setattr(self.plot, "colorful", checked)) show_points_act = toolbar.addAction( QIcon("images/icons_show_points.png"), "Points") show_points_act.setCheckable(True) show_points_act.setChecked(self.plot.show_points) show_points_act.triggered.connect( lambda checked: setattr(self.plot, "show_points", checked)) show_pen_up_act = toolbar.addAction( QIcon("images/icons_show_pen_up.png"), "Pen-Up") show_pen_up_act.setCheckable(True) show_pen_up_act.setChecked(self.plot.show_pen_up) show_pen_up_act.triggered.connect( lambda checked: setattr(self.plot, "show_pen_up", checked)) show_axes_act = toolbar.addAction(QIcon("images/icons_show_axes.png"), "Axes") show_axes_act.setCheckable(True) show_axes_act.setChecked(self.plot.show_axes) show_axes_act.triggered.connect( lambda checked: setattr(self.plot, "show_axes", checked)) scale = UnitComboBox() scale.setCurrentText(self.plot.unit) scale.currentTextChanged.connect( lambda text: setattr(self.plot, "unit", text)) toolbar.addWidget(scale) def load_svg(self, path: str): # TODO: make quantization a parameters vd = vpype.read_multilayer_svg(path, 0.05) self.set_vector_data(vd) def plot_svg(self): vd = vpype.VectorData() for lid in self.vector_data.layers: if self.plot.layer_visible(lid): vd.add(self.vector_data.layers[lid], 1) svg = io.StringIO() vpype.write_svg(svg, vd, page_format=self.plot.page_format) axy.plot_svg(svg.getvalue()) def set_vector_data(self, vector_data: vpype.VectorData): self.base_vector_data = vector_data self.update_view() model = QStandardItemModel() for lid in vector_data.layers: item = QStandardItem() item.setCheckable(True) item.setCheckState( Qt.Checked if self.plot.layer_visible(lid) else Qt.Unchecked) pixmap = QPixmap(16, 12) pixmap.fill(QColor(*[c * 255 for c in self.plot.layer_color(lid)])) item.setIcon(QIcon(pixmap)) item.setText(f"Layer {lid}") item.setSelectable(False) item.setEditable(False) item.setData(lid, Qt.UserRole + 1) model.appendRow(item) model.itemChanged.connect(lambda it: self.plot.set_layer_visible( it.data(Qt.UserRole + 1), it.checkState() == Qt.Checked)) self.list.setModel(model) def set_page_format(self, page_format: str): self.page_format = page_format self.settings.setValue("page_format", page_format) self.update_view() def set_landscape(self, landscape: bool): self.landscape = landscape self.settings.setValue("landscape", landscape) self.update_view() def set_rotated(self, rotated: bool): self.rotated = rotated self.settings.setValue("rotated", rotated) self.update_view() def set_center(self, center: bool): self.center = center self.settings.setValue("center", center) self.update_view() def set_fit_page(self, fit_page: bool): self.fit_page = fit_page self.settings.setValue("fit_page", fit_page) self.update_view() def set_margin(self, value: float, unit: str): self.margin_value = value self.margin_unit = unit self.settings.setValue("margin_value", value) self.settings.setValue("margin_unit", unit) if self.fit_page: self.update_view() def update_view(self): self.vector_data = copy.deepcopy(self.base_vector_data) # scale/center according to settings width, height = PAGE_FORMATS[str(self.page_format)] if self.landscape: width, height = height, width if self.rotated: self.vector_data.rotate(-math.pi / 2) self.vector_data.translate(0, height) bounds = self.vector_data.bounds() if bounds is not None: min_x, min_y, max_x, max_y = bounds margin = self.margin_value * vpype.convert(self.margin_unit) if self.fit_page: factor_x = (width - 2 * margin) / (max_x - min_x) factor_y = (height - 2 * margin) / (max_y - min_y) scale = min(factor_x, factor_y) self.vector_data.translate(-min_x, -min_y) self.vector_data.scale(scale) if factor_x < factor_y: self.vector_data.translate( margin, margin + (height - 2 * margin - (max_y - min_y) * scale) / 2) else: self.vector_data.translate( margin + (width - 2 * margin - (max_x - min_x) * scale) / 2, margin) elif self.center: self.vector_data.translate( (width - (max_x - min_x)) / 2 - min_x, (height - (max_y - min_y)) / 2 - min_y, ) # configure plot widget self.plot.vector_data = self.vector_data self.plot.page_format = (width, height)
class QSettingsWindow(QDialog): def __init__(self, game: Game): super().__init__() self.game = game self.pluginsPage = None self.pluginsOptionsPage = None self.pages: dict[str, AutoSettingsPage] = {} for page in Settings.pages(): self.pages[page] = AutoSettingsPage(page, game.settings, self.applySettings) self.setModal(True) self.setWindowTitle("Settings") self.setWindowIcon(CONST.ICONS["Settings"]) self.setMinimumSize(600, 250) self.initUi() def initUi(self): self.layout = QGridLayout() self.categoryList = QListView() self.right_layout = QStackedLayout() self.categoryList.setMaximumWidth(175) self.categoryModel = QStandardItemModel(self.categoryList) self.categoryList.setIconSize(QSize(32, 32)) for name, page in self.pages.items(): page_item = QStandardItem(name) if name in CONST.ICONS: page_item.setIcon(CONST.ICONS[name]) else: page_item.setIcon(CONST.ICONS["Generator"]) page_item.setEditable(False) page_item.setSelectable(True) self.categoryModel.appendRow(page_item) self.right_layout.addWidget(page) self.initCheatLayout() cheat = QStandardItem("Cheat Menu") cheat.setIcon(CONST.ICONS["Cheat"]) cheat.setEditable(False) cheat.setSelectable(True) self.categoryModel.appendRow(cheat) self.right_layout.addWidget(self.cheatPage) self.pluginsPage = PluginsPage() plugins = QStandardItem("LUA Plugins") plugins.setIcon(CONST.ICONS["Plugins"]) plugins.setEditable(False) plugins.setSelectable(True) self.categoryModel.appendRow(plugins) self.right_layout.addWidget(self.pluginsPage) self.pluginsOptionsPage = PluginOptionsPage() pluginsOptions = QStandardItem("LUA Plugins Options") pluginsOptions.setIcon(CONST.ICONS["PluginsOptions"]) pluginsOptions.setEditable(False) pluginsOptions.setSelectable(True) self.categoryModel.appendRow(pluginsOptions) self.right_layout.addWidget(self.pluginsOptionsPage) self.categoryList.setSelectionBehavior(QAbstractItemView.SelectRows) self.categoryList.setModel(self.categoryModel) self.categoryList.selectionModel().setCurrentIndex( self.categoryList.indexAt(QPoint(1, 1)), QItemSelectionModel.Select ) self.categoryList.selectionModel().selectionChanged.connect( self.onSelectionChanged ) self.layout.addWidget(self.categoryList, 0, 0, 1, 1) self.layout.addLayout(self.right_layout, 0, 1, 5, 1) self.setLayout(self.layout) def initCheatLayout(self): self.cheatPage = QWidget() self.cheatLayout = QVBoxLayout() self.cheatPage.setLayout(self.cheatLayout) self.cheat_options = CheatSettingsBox(self.game, self.applySettings) self.cheatLayout.addWidget(self.cheat_options) self.moneyCheatBox = QGroupBox("Money Cheat") self.moneyCheatBox.setAlignment(Qt.AlignTop) self.moneyCheatBoxLayout = QGridLayout() self.moneyCheatBox.setLayout(self.moneyCheatBoxLayout) cheats_amounts = [25, 50, 100, 200, 500, 1000, -25, -50, -100, -200] for i, amount in enumerate(cheats_amounts): if amount > 0: btn = QPushButton("Cheat +" + str(amount) + "M") btn.setProperty("style", "btn-success") else: btn = QPushButton("Cheat " + str(amount) + "M") btn.setProperty("style", "btn-danger") btn.clicked.connect(self.cheatLambda(amount)) self.moneyCheatBoxLayout.addWidget(btn, i / 2, i % 2) self.cheatLayout.addWidget(self.moneyCheatBox, stretch=1) def cheatLambda(self, amount): return lambda: self.cheatMoney(amount) def cheatMoney(self, amount): logging.info("CHEATING FOR AMOUNT : " + str(amount) + "M") self.game.blue.budget += amount GameUpdateSignal.get_instance().updateGame(self.game) def applySettings(self): self.game.settings.show_red_ato = self.cheat_options.show_red_ato self.game.settings.enable_frontline_cheats = ( self.cheat_options.show_frontline_cheat ) self.game.settings.enable_base_capture_cheat = ( self.cheat_options.show_base_capture_cheat ) self.game.compute_unculled_zones() GameUpdateSignal.get_instance().updateGame(self.game) def onSelectionChanged(self): index = self.categoryList.selectionModel().currentIndex().row() self.right_layout.setCurrentIndex(index)
class MainWindow(QMainWindow): forum = Forum(id=-1, name="UNKNOWN") topics = [] forum_model = ForumModel() day_model = DayModel() def __init__(self): QMainWindow.__init__(self) self.date_view = QListView() self.forum_view = QListView() self.contentMax = 0 self.ioloop = asyncio.get_event_loop() icon = QIcon() icon.addPixmap(QPixmap(FAVICON_ICO), QIcon.Normal) self.setWindowIcon(icon) self.setWindowTitle(APP_TITLE) self.settings = QSettings('karoStudio', 'nnm-stats') self.resize(self.settings.value('main/size', QSize(640, 480))) self.move(self.settings.value('main/pos', QPoint(200, 200))) self.splitter = QSplitter() self.get_menu() self.content = QScrollArea() self.content.verticalScrollBar().valueChanged.connect( self.scrollBarChanged) self.content.verticalScrollBar().rangeChanged.connect( self.rangeChanged) self.torrents_list_view = QWidget() layout = QGridLayout() self.torrents_list_view.setLayout(layout) self.content.setWidget(self.torrents_list_view) self.splitter.addWidget(self.content) self.splitter.setSizes([160, 350]) self.setCentralWidget(self.splitter) self.timer = QTimer() self.timer.singleShot(1600, self.load_task) def get_menu(self): scroll = QScrollArea(self) self.forum_view.setStyleSheet("QListView{font: bold 12px;}") self.forum_view.clicked.connect(self.listViewClick) self.forum_view.setModel(self.forum_model) self.date_view.setStyleSheet("QListView{font: bold 12px;}") self.date_view.clicked.connect(self.listViewClick) self.date_view.setModel(self.day_model) menu_splitter = QSplitter(self) menu_splitter.setOrientation(Qt.Vertical) menu_splitter.addWidget(self.forum_view) menu_splitter.addWidget(self.date_view) scroll.setWidget(menu_splitter) scroll.setWidgetResizable(True) self.splitter.addWidget(scroll) def load_task(self): self.ioloop.run_until_complete(self.load_forums()) async def load_forums(self): tasks = [asyncio.ensure_future((get_forums("http://nnmclub.to/")))] done, pending = await asyncio.wait(tasks, return_when=FIRST_COMPLETED) forums = done.pop().result() for forum in forums: print(forum) self.forum_model.add(forum) def load_torrents_task(self, forum, start): self.ioloop.run_until_complete(self.load_torrents(forum, start)) async def load_torrents(self, forum, start=0): tasks = [asyncio.ensure_future((get_topics(forum, start)))] done, pending = await asyncio.wait(tasks, return_when=FIRST_COMPLETED) if start == 0: self.topics = done.pop().result() else: self.topics = self.topics + done.pop().result() layout = QGridLayout() self.topics.sort(key=lambda x: x.likes, reverse=True) days = {} for i, topic in enumerate(self.topics): d = topic.published.date() if d in days.keys(): days[d]['count'] += 1 days[d]['likes'] += topic.likes else: days[d] = {'count': 1, 'likes': topic.likes} # layout.addWidget(TopicView(topic), i, 0) for day in days.keys(): self.day_model.add(day, days[day]) self.torrents_list_view = QWidget() self.torrents_list_view.setLayout(layout) self.content.setWidget(self.torrents_list_view) def rangeChanged(self, vert_min, vert_max): self.contentMax = vert_max def scrollBarChanged(self, value): if value == self.contentMax: print("LOADING {}".format(self.torrents_list_view.children())) self.timer.singleShot( 1000, lambda: self.load_torrents_task(self.forum, len(self.topics))) def listViewClick(self, index): self.forum = self.forum_model.forums[index.row()] self.topics = [] self.setWindowTitle("{} / {}".format(APP_TITLE, self.forum.name)) self.day_model.clear() # self.timer.singleShot(1000, lambda: self.load_torrents_task(self.forum, 0)) self.timer.timeout.connect( lambda: self.load_torrents_task(self.forum, len(self.topics))) self.timer.start(8000) def closeEvent(self, event): self.settings.setValue('main/size', self.size()) self.settings.setValue('main/pos', self.pos()) self.ioloop.close()
if __name__ == "__main__": app = QApplication(sys.argv) # proxy = QtNetwork.QNetworkProxy() # proxy.setType(QtNetwork.QNetworkProxy.HttpProxy) # proxy.setHostName("172.19.96.51") # proxy.setPort(9090) # QtNetwork.QNetworkProxy.setApplicationProxy(proxy) grid = QGridLayout() # browser = QWebEngineView() browser = Browser() # url_input = UrlInput(browser) list_view = QListView() list_view.setFixedWidth(300) # interceptor = WebEngineUrlRequestInterceptor() # profile = QWebEngineProfile() # profile.setRequestInterceptor(interceptor) # page = MyWebEnginePage(profile, browser) # page.setUrl(QUrl("https://stackoverflow.com/questions/50786186/qwebengineurlrequestinterceptor-not-working")) # page.setUrl(QUrl("https://www.avito.ru/dagestan#login?s=h")) # browser.setPage(page) # action_box = ActionInputBox(page) browser.load(QUrl("https://m.avito.ru/dagestan")) grid.addWidget(list_view, 0, 1) grid.addWidget(browser, 0, 2) print('nuu4') model = Model()
def __init__(self): super(WidgetConfig, self).__init__() HEIGHT = 40 grid = QGridLayout() # 使用默认摄像头复选框 self.check_camera = QCheckBox('Use default camera') self.check_camera.setChecked(False) self.check_camera.stateChanged.connect(self.slot_check_camera) grid.addWidget(self.check_camera, 0, 0, 1, 3) # 一行三列 # 选择视频文件 label_video = QLabel('Detect File') self.line_video = QLineEdit() if 'video' in GLOBAL.config: self.line_video.setText(GLOBAL.config['video']) self.line_video.setFixedHeight(HEIGHT) self.line_video.setEnabled(False) self.line_video.editingFinished.connect(lambda: GLOBAL.record_config( {'video': self.line_video.text()} )) self.btn_video = QPushButton('Choose') self.btn_video.setFixedHeight(HEIGHT) self.btn_video.setEnabled(False) self.btn_video.clicked.connect(self.choose_video_file) self.slot_check_camera() grid.addWidget(label_video, 1, 0) grid.addWidget(self.line_video, 1, 1) grid.addWidget(self.btn_video, 1, 2) # 选择权重文件 label_weights = QLabel('Weights File') self.line_weights = QLineEdit() if 'weights' in GLOBAL.config: self.line_weights.setText(GLOBAL.config['weights']) self.line_weights.setFixedHeight(HEIGHT) self.line_weights.editingFinished.connect(lambda: GLOBAL.record_config( {'weights': self.line_weights.text()} )) self.btn_weights = QPushButton('Choose') self.btn_weights.setFixedHeight(HEIGHT) self.btn_weights.clicked.connect(self.choose_weights_file) grid.addWidget(label_weights, 2, 0) grid.addWidget(self.line_weights, 2, 1) grid.addWidget(self.btn_weights, 2, 2) # 是否使用GPU label_device = QLabel('CUDA device') self.line_device = QLineEdit('gpu') if 'device' in GLOBAL.config: self.line_device.setText(GLOBAL.config['device']) else: self.line_device.setText('cpu') self.line_device.setPlaceholderText('cpu or 0 or 0,1,2,3') self.line_device.setFixedHeight(HEIGHT) self.line_device.editingFinished.connect(lambda: GLOBAL.record_config( {'device': self.line_device.text()} )) grid.addWidget(label_device, 3, 0) grid.addWidget(self.line_device, 3, 1, 1, 2) # 设置图像大小 label_size = QLabel('Img Size') self.combo_size = QComboBox() self.combo_size.setFixedHeight(HEIGHT) self.combo_size.setStyleSheet( 'QAbstractItemView::item {height: 40px;}') self.combo_size.setView(QListView()) self.combo_size.addItem('320', 320) self.combo_size.addItem('416', 416) self.combo_size.addItem('480', 480) self.combo_size.addItem('544', 544) self.combo_size.addItem('640', 640) self.combo_size.setCurrentIndex(2) self.combo_size.currentIndexChanged.connect(lambda: GLOBAL.record_config( {'img_size': self.combo_size.currentData()} )) grid.addWidget(label_size, 4, 0) grid.addWidget(self.combo_size, 4, 1, 1, 2) #choose net camera label_stream = QLabel('NetVedioStream') self.combo_stream = QComboBox() self.combo_stream.setFixedHeight(HEIGHT) self.combo_stream.setStyleSheet( 'QAbstractItemView::item {height: 40px;}') self.combo_stream.setView(QListView()) self.combo_stream.addItem('rtsp://*****:*****@192.168.0.65/', 'rtsp://*****:*****@192.168.0.65/') self.combo_stream.addItem('rtsp://*****:*****@192.168.0.66/', 'rtsp://*****:*****@192.168.0.66/') self.combo_stream.addItem('rtsp://*****:*****@192.168.0.67/', 'rtsp://*****:*****@192.168.0.67/') self.combo_stream.addItem('rtsp://*****:*****@192.168.0.68/', 'rtsp://*****:*****@192.168.0.68/') self.combo_stream.addItem('rtsp://*****:*****@192.168.0.65/', 'rtsp://*****:*****@192.168.0.65/') self.combo_stream.setCurrentIndex(0) self.combo_stream.currentIndexChanged.connect(lambda: GLOBAL.record_config( {'netstreamvedio': self.combo_stream.currentData()} )) grid.addWidget(label_stream, 5, 0) grid.addWidget(self.combo_stream, 5, 1, 1, 2) # 设置置信度阈值 label_conf = QLabel('Confidence') self.spin_conf = QDoubleSpinBox() self.spin_conf.setFixedHeight(HEIGHT) self.spin_conf.setDecimals(1) self.spin_conf.setRange(0.1, 0.9) self.spin_conf.setSingleStep(0.1) if 'conf_thresh' in GLOBAL.config: self.spin_conf.setValue(GLOBAL.config['conf_thresh']) else: self.spin_conf.setValue(0.4) # 默认值 GLOBAL.record_config({'conf_thresh': 0.4}) self.spin_conf.valueChanged.connect(lambda: GLOBAL.record_config( {'conf_thresh': round(self.spin_conf.value(), 1)} )) grid.addWidget(label_conf, 6, 0) grid.addWidget(self.spin_conf, 6, 1, 1, 2) # 设置IOU阈值 label_iou = QLabel('IOU') self.spin_iou = QDoubleSpinBox() self.spin_iou.setFixedHeight(HEIGHT) self.spin_iou.setDecimals(1) self.spin_iou.setRange(0.1, 0.9) self.spin_iou.setSingleStep(0.1) if 'iou_thresh' in GLOBAL.config: self.spin_iou.setValue(GLOBAL.config['iou_thresh']) else: self.spin_iou.setValue(0.5) # 默认值 GLOBAL.record_config({'iou_thresh': 0.5}) self.spin_iou.valueChanged.connect(lambda: GLOBAL.record_config( {'iou_thresh': round(self.spin_iou.value(), 1)} )) grid.addWidget(label_iou, 7, 0) grid.addWidget(self.spin_iou, 7, 1, 1, 2) # class-agnostic NMS self.check_agnostic = QCheckBox('Agnostic') if 'agnostic' in GLOBAL.config: self.check_agnostic.setChecked(GLOBAL.config['agnostic']) else: self.check_agnostic.setChecked(True) self.check_agnostic.stateChanged.connect(lambda: GLOBAL.record_config( {'agnostic': self.check_agnostic.isChecked()} )) grid.addWidget(self.check_agnostic, 8, 0, 1, 3) # 一行三列 # augmented inference self.check_augment = QCheckBox('Augment') if 'augment' in GLOBAL.config: self.check_augment.setChecked(GLOBAL.config['augment']) else: self.check_augment.setChecked(True) self.check_augment.stateChanged.connect(lambda: GLOBAL.record_config( {'augment': self.check_augment.isChecked()} )) grid.addWidget(self.check_augment, 9, 0, 1, 3) # 一行三列 self.setLayout(grid) # 设置布局
import sys from PySide2.QtWidgets import QApplication, QSplitter, QFileSystemModel, QTreeView, QListView from PySide2.QtCore import QDir if __name__ == '__main__': app = QApplication(sys.argv) splitter = QSplitter() model = QFileSystemModel() model.setRootPath("/") tree = QTreeView(splitter) tree.setModel(model) tree.setRootIndex(model.index("/")) list = QListView(splitter) list.setModel(model) list.setRootIndex(model.index("/")) splitter.setWindowTitle( "A model with two views or two views with one model") splitter.show() app.exec_()
class IconColorEditor(QDialog): """An editor to let the user select an icon and a color for an object_class. """ def __init__(self, parent): """Init class.""" super().__init__(parent) # , Qt.Popup) icon_size = QSize(32, 32) self.icon_mngr = IconListManager(icon_size) self.setWindowTitle("Select icon and color") self.icon_widget = QWidget(self) self.icon_list = QListView(self.icon_widget) self.icon_list.setViewMode(QListView.IconMode) self.icon_list.setIconSize(icon_size) self.icon_list.setResizeMode(QListView.Adjust) self.icon_list.setItemDelegate(_IconPainterDelegate(self)) self.icon_list.setMovement(QListView.Static) self.icon_list.setMinimumHeight(400) icon_widget_layout = QVBoxLayout(self.icon_widget) icon_widget_layout.addWidget(QLabel("Font Awesome icons")) self.line_edit = QLineEdit() self.line_edit.setPlaceholderText("Search icons for...") icon_widget_layout.addWidget(self.line_edit) icon_widget_layout.addWidget(self.icon_list) self.color_dialog = QColorDialog(self) self.color_dialog.setWindowFlags(Qt.Widget) self.color_dialog.setOption(QColorDialog.NoButtons, True) self.color_dialog.setOption(QColorDialog.DontUseNativeDialog, True) self.button_box = QDialogButtonBox(self) self.button_box.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok) top_widget = QWidget(self) top_layout = QHBoxLayout(top_widget) top_layout.addWidget(self.icon_widget) top_layout.addWidget(self.color_dialog) layout = QVBoxLayout(self) layout.addWidget(top_widget) layout.addWidget(self.button_box) self.proxy_model = QSortFilterProxyModel(self) self.proxy_model.setSourceModel(self.icon_mngr.model) self.proxy_model.filterAcceptsRow = self._proxy_model_filter_accepts_row self.icon_list.setModel(self.proxy_model) self.setAttribute(Qt.WA_DeleteOnClose) self.connect_signals() def _proxy_model_filter_accepts_row(self, source_row, source_parent): """Overridden method to filter icons according to search terms. """ text = self.line_edit.text() if not text: return QSortFilterProxyModel.filterAcceptsRow( self.proxy_model, source_row, source_parent) searchterms = self.icon_mngr.model.index( source_row, 0, source_parent).data(Qt.UserRole + 1) return any([text in term for term in searchterms]) def connect_signals(self): """Connect signals to slots.""" self.line_edit.textEdited.connect(self.proxy_model.invalidateFilter) self.button_box.accepted.connect(self.accept) self.button_box.rejected.connect(self.reject) def set_data(self, data): icon_code, color_code = interpret_icon_id(data) self.icon_mngr.init_model() for i in range(self.proxy_model.rowCount()): index = self.proxy_model.index(i, 0) if index.data(Qt.UserRole) == icon_code: self.icon_list.setCurrentIndex(index) break self.color_dialog.setCurrentColor(QColor(color_code)) def data(self): icon_code = self.icon_list.currentIndex().data(Qt.UserRole) color_code = self.color_dialog.currentColor().rgb() return make_icon_id(icon_code, color_code)
def __init__(self): super().__init__() self.results = QStringListModel(["Worker Results:"]) self.listview = QListView() self.listview.setModel(self.results)