def getLabel(self, font): """ Get a Level Label witht he apropriate Font """ label = QLabel(self.level.name, self) label.setFont(self.smallFont) label.setAlignment(Qt.AlignCenter) label.resize(self.WIDTH, self.HEIGHT) return label
def getLabel(self, font): """ Get a Level Label witht he apropriate Font """ label = QLabel(self.level.name, self) label.setFont(self.smallFont) label.setAlignment(Qt.AlignCenter) label.resize(self.WIDTH, self.HEIGHT) return label
class AdjacencyClueView(QFrame): # Prolly could use a better name """ Represents the Adjacency Clue View """ TRANSPARENCY = 100 def __init__(self, adjacencyClue, fragilityClue, parent=None): """ Initialize the Adjacency Clue View """ QFrame.__init__(self, parent) self.adjacencyClue = adjacencyClue self.fragilityClue = fragilityClue self.resize(34, 32) self.setupClueLabel() def setupFont(self): """ Setup the Font """ self.font = QFont() self.font.setPointSize(15) def setupClueLabel(self): """ Setup the Clue Label """ self.setupFont() self.clueLabel = QLabel('', self) self.clueLabel.setFont(self.font) self.clueLabel.move(0, 0) def updateView(self): """ Update the View """ self.clueLabel.setText(self.getLabelText()) self.setColorBasedOnFragility() self.clueLabel.resize(34, self.clueLabel.contentsRect().height()) def getLabelText(self): """ Get the CLue Reading Text """ adjacentMines = self.adjacencyClue.getAdjacentMinesClue() if adjacentMines == 0: return '' else: return str(adjacentMines) def setColorBasedOnFragility(self): """ Set color of the clue based on adjacency to Fragile Mines """ color = "rgba({0}, {1}%)".format(self.getColor(), self.TRANSPARENCY) self.clueLabel.setStyleSheet("QLabel { color : %s }" % color) def getColor(self): """ Return color """ if self.fragilityClue.distance is None: return "0, 0, 0" elif self.fragilityClue.distance <= 1: if self.fragilityClue.count == 1: return "227, 68, 20" else: return "196, 0, 0" elif self.fragilityClue.distance > 1 and self.fragilityClue.distance < 4: return "244, 244, 0" elif self.fragilityClue.distance >= 4: return "0, 154, 0"
class AdjacencyClueView(QFrame): # Prolly could use a better name """ Represents the Adjacency Clue View """ TRANSPARENCY = 100 def __init__(self, adjacencyClue, fragilityClue, parent=None): """ Initialize the Adjacency Clue View """ QFrame.__init__(self, parent) self.adjacencyClue = adjacencyClue self.fragilityClue = fragilityClue self.resize(34, 32) self.setupClueLabel() def setupFont(self): """ Setup the Font """ self.font = QFont() self.font.setPointSize(15) def setupClueLabel(self): """ Setup the Clue Label """ self.setupFont() self.clueLabel = QLabel('', self) self.clueLabel.setFont(self.font) self.clueLabel.move(0, 0) def updateView(self): """ Update the View """ self.clueLabel.setText(self.getLabelText()) self.setColorBasedOnFragility() self.clueLabel.resize(34, self.clueLabel.contentsRect().height()) def getLabelText(self): """ Get the CLue Reading Text """ adjacentMines = self.adjacencyClue.getAdjacentMinesClue() if adjacentMines == 0: return '' else: return str(adjacentMines) def setColorBasedOnFragility(self): """ Set color of the clue based on adjacency to Fragile Mines """ color = "rgba({0}, {1}%)".format(self.getColor(), self.TRANSPARENCY) self.clueLabel.setStyleSheet("QLabel { color : %s }" % color) def getColor(self): """ Return color """ if self.fragilityClue.distance is None: return "0, 0, 0" elif self.fragilityClue.distance <= 1: if self.fragilityClue.count == 1: return "227, 68, 20" else: return "196, 0, 0" elif self.fragilityClue.distance > 1 and self.fragilityClue.distance < 4: return "244, 244, 0" elif self.fragilityClue.distance >= 4: return "0, 154, 0"
class GameStatusView(QFrame): """ It's the game status view """ def __init__(self, level, width, height, parent=None): """ """ QFrame.__init__(self, parent) self.level = level self.setup() self.updateView() self.color = QColor(200, 200, 200) self.setStyleSheet("QFrame { background-color: %s }" % self.color.name()) self.resize(width, height) def setup(self): """ Setup the View """ self.setupFont() self.setupPowerLabel() self.setupMovesLabel() self.setupRemainingDefensesLabels() def setupFont(self): """ Setup the Font """ self.font = QFont() self.font.setPointSize(14) def setupPowerLabel(self): """ Setup the Power Label """ self.powerLabel = QLabel("", self) self.powerLabel.move(32, 16) self.powerLabel.setFont(self.font) def setupMovesLabel(self): """ Setup the Moves Label """ self.movesLabel = QLabel("", self) self.movesLabel.move(32, 16 + 48) self.movesLabel.setFont(self.font) def setupRemainingDefensesLabels(self): """ Setup the Remaining Defenses Labels """ self.remainingDefensesLabels = {} labelNumber = 1 remainingDefenses = self.level.getRemainingDefenses() for defenseClass in remainingDefenses: label = QLabel("", self) label.move(32, 16 + 48 * (labelNumber + 1)) label.setFont(self.font) self.remainingDefensesLabels[defenseClass] = label labelNumber += 1 def updateView(self): """ Update the View """ self.updatePowerLabel() self.updateMovesLabel() self.updateRemainingDefensesLabels() def updatePowerLabel(self): """ Update the Power Label """ self.powerLabel.setText("Power: {0}".format( self.level.drone.powerRating.power)) def updateMovesLabel(self): """ Update the Moves Label """ self.movesLabel.setText("Moves: {0}".format( self.level.moveRating.moveCount)) self.movesLabel.resize(self.movesLabel.contentsRect().width(), self.movesLabel.contentsRect().height()) def updateRemainingDefensesLabels(self): """ Update the Remaining Mines Label """ remainingDefenses = self.level.getRemainingDefenses() for defenseClass in remainingDefenses: label = self.remainingDefensesLabels[defenseClass] label.setText("{0} Left: {1}".format( defenseClass.friendlyName, remainingDefenses[defenseClass]))
class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) #widnow setup resolution = QDesktopWidget().screenGeometry() self.screen_w = resolution.width() self.screen_h = resolution.height() self.setGeometry(0, 0, 650, 200) self.setWindowTitle('bento dumper' + mof.get_version_suffix()) self.setWindowIcon(QIcon('icons/run.png')) #center window qr = self.frameGeometry() cp = QtGui.QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) #adjust size self.resize(self.screen_w / 2, self.screen_h / 16) self.Menu() self.Layout() central_widget = QtGui.QWidget() central_widget.setLayout(self.main_layout) self.setCentralWidget(central_widget) def Menu(self): #this creates an action exit, a shortcut and status tip exitAction = QAction(QIcon('icons/exit.png'), '&Exit', self) exitAction.setShortcut('Ctrl+Q') exitAction.setStatusTip('Exit application') exitAction.triggered.connect(self.close) openFile = QAction(QIcon('icons/open.png'), '&Open', self) openFile.setShortcut('Ctrl+O') openFile.setStatusTip('Open new File') openFile.triggered.connect(self.browse) runAction = QAction(QIcon('icons/run.png'), '&Run', self) runAction.setShortcut('Ctrl+R') runAction.setStatusTip('Run Mars') runAction.triggered.connect(self.run_event) def Layout(self): #LAYOUT self.directory_prompt = QLabel(self) self.directory_prompt.setText("Directory Selected:") self.directory_prompt.move(25, 50) self.directory_prompt.resize(150, 30) self.browse_btn = QPushButton("Browse", self) self.browse_btn.move(130, 50) self.browse_btn.setStatusTip(" Browse Folder") # self.browse_btn.setStyleSheet("background-color: rgb(186, 186, 186); border-radius: 15px;border-style: solid;border-width: 2px;border-color: black;"); self.browse_btn.clicked.connect(self.browse) self.dir_shower = QLabel(self) self.dir_shower.setText("Directory") self.run_mars = QPushButton("Dump BENTO", self) self.run_mars.setVisible(True) self.run_mars.move(25, 160) self.run_mars.resize(self.screen_w / 2 - 150, 50) self.run_mars.setStatusTip('') self.run_mars.setStyleSheet( "background-color: rgb(142, 229, 171); border-radius: 15px;") self.run_mars.clicked.connect(self.run_event) self.menu_layout = QtGui.QHBoxLayout() self.menu_layout.addWidget(self.browse_btn) self.menu_layout.addWidget(self.directory_prompt) self.menu_layout.addWidget(self.dir_shower) self.menu_layout.addStretch() self.run_layout = QtGui.QHBoxLayout() self.run_layout.addWidget(self.run_mars) self.main_layout = QtGui.QVBoxLayout() self.main_layout.addLayout(self.menu_layout) self.main_layout.addLayout(self.run_layout) self.main_layout.addStretch() def browse(self): # sender = self.sender() dialog = QtGui.QFileDialog() dialog.setFileMode(QtGui.QFileDialog.Directory) dialog.setOption(QtGui.QFileDialog.ShowDirsOnly) self.dirname = dialog.getExistingDirectory(self, 'Choose Directory', os.path.curdir) if os.path.exists(self.dirname) and os.path.isdir(self.dirname): self.dir_shower.setText(self.dirname) return else: QMessageBox.information(self, " Wrong file selected", "Select a folder containing .seq files!") def run_event(self): self.genericThread = GenericThread(self.dirname) self.genericThread.start()
class ImageViewer(QWidget): """A custom widget to display an image in Gui.""" # Inspired by : # https://doc.qt.io/qt-6/qtwidgets-widgets-imageviewer-example.html # https://code.qt.io/cgit/pyside/pyside-setup.git/tree/examples/widgets/imageviewer def __init__(self, parent=None): """Initialize Widget.""" super().__init__(parent) self.setLayout(QVBoxLayout()) self.imglabel = QLabel() self.imglabel.setBackgroundRole(QPalette.Base) self.imglabel.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed) self.imglabel.setScaledContents(True) # Resize pixmap along with label self.imglabel.setAlignment(Qt.AlignCenter) self.imglabel.setText("(No image yet)") self.namelabel = QLabel() self.scrollarea = QScrollArea() self.scrollarea.setWidget(self.imglabel) self.scrollarea.setWidgetResizable(False) self.scrollarea.setAlignment(Qt.AlignCenter) self.layout().addWidget(self.scrollarea) self.layout().addWidget(self.namelabel) self.scale_factor = 1.0 self._initial_size = QSize(0, 0) self._img_path = "" self.setContextMenuPolicy(Qt.CustomContextMenu) # pylint: disable=no-member self.customContextMenuRequested.connect(self.show_context_menu) self.menu = QMenu() self.add_actions_to_menu(self.menu) def add_actions_to_menu(self, menu): """Add widget actions to a given menu. Args: menu -- the menu to add the actions (QMenu) """ zoom_in_act = menu.addAction("Zoom In (25%)") zoom_in_act.triggered.connect(self.zoom_in) zoom_out_act = menu.addAction("Zoom Out (25%)") zoom_out_act.triggered.connect(self.zoom_out) zoom_normal_act = menu.addAction("Normal Size") zoom_normal_act.triggered.connect(self.normal_size) menu.addSeparator() copy_filename_act = menu.addAction("Copy Image to Clipboard") copy_filename_act.triggered.connect(self.copy_image) copy_filename_act = menu.addAction("Copy Filename to Clipboard") copy_filename_act.triggered.connect(self.copy_filename) def load_image(self, img_path): """Load an image in widget from a file. Args: img_path -- Path of image file to load (str) """ img_path = str(img_path) pixmap = QPixmap(img_path) self.imglabel.setPixmap(pixmap) self.imglabel.resize(pixmap.size()) self.namelabel.setText(f"File: {img_path}") self._img_path = img_path self._initial_size = pixmap.size() def resize_image(self, new_size=None): """Resize embedded image to target size. Args: new_size -- target size to resize image to (QSize) """ if not new_size: new_size = self._initial_size self.scale_factor = 1.0 new_size = QSize(new_size) self.imglabel.setMinimumSize(new_size) self.imglabel.setMaximumSize(new_size) def scale_image(self, factor): """Rescale embedded image applying a factor. Factor is applied relatively to current scale. Args: factor -- Factor to apply (float) """ self.scale_factor *= float(factor) new_size = self.scale_factor * self._initial_size self.resize_image(new_size) @Slot() def zoom_in(self): """Zoom embedded image in (slot).""" self.scale_image(1.25) @Slot() def zoom_out(self): """Zoom embedded image out (slot).""" self.scale_image(0.8) @Slot() def normal_size(self): """Set embedded image scale to 1:1 (slot).""" self.resize_image() @Slot() def copy_filename(self): """Copy file name to clipboard (slot).""" QGuiApplication.clipboard().setText(self._img_path) @Slot() def copy_image(self): """Copy embedded image to clipboard (slot).""" QGuiApplication.clipboard().setImage(self.imglabel.pixmap().toImage()) @Slot(QPoint) def show_context_menu(self, pos): """Show context menu.""" self.menu.exec_(self.mapToGlobal(pos))
class GameStatusView(QFrame): """ It's the game status view """ def __init__(self, level, width, height, parent=None): """ """ QFrame.__init__(self, parent) self.level = level self.setup() self.updateView() self.color = QColor(200, 200, 200) self.setStyleSheet("QFrame { background-color: %s }" % self.color.name()) self.resize(width, height) def setup(self): """ Setup the View """ self.setupFont() self.setupPowerLabel() self.setupMovesLabel() self.setupRemainingDefensesLabels() def setupFont(self): """ Setup the Font """ self.font = QFont() self.font.setPointSize(14) def setupPowerLabel(self): """ Setup the Power Label """ self.powerLabel = QLabel("", self) self.powerLabel.move(32, 16) self.powerLabel.setFont(self.font) def setupMovesLabel(self): """ Setup the Moves Label """ self.movesLabel = QLabel("", self) self.movesLabel.move(32, 16+48) self.movesLabel.setFont(self.font) def setupRemainingDefensesLabels(self): """ Setup the Remaining Defenses Labels """ self.remainingDefensesLabels = {} labelNumber = 1 remainingDefenses = self.level.getRemainingDefenses() for defenseClass in remainingDefenses: label = QLabel("", self) label.move(32, 16+48*(labelNumber+1)) label.setFont(self.font) self.remainingDefensesLabels[defenseClass] = label labelNumber += 1 def updateView(self): """ Update the View """ self.updatePowerLabel() self.updateMovesLabel() self.updateRemainingDefensesLabels() def updatePowerLabel(self): """ Update the Power Label """ self.powerLabel.setText("Power: {0}".format(self.level.drone.powerRating.power)) def updateMovesLabel(self): """ Update the Moves Label """ self.movesLabel.setText("Moves: {0}".format(self.level.moveRating.moveCount)) self.movesLabel.resize(self.movesLabel.contentsRect().width(), self.movesLabel.contentsRect().height()) def updateRemainingDefensesLabels(self): """ Update the Remaining Mines Label """ remainingDefenses = self.level.getRemainingDefenses() for defenseClass in remainingDefenses: label = self.remainingDefensesLabels[defenseClass] label.setText("{0} Left: {1}".format(defenseClass.friendlyName, remainingDefenses[defenseClass]))