class LabelConfigurator(QDialog):
    def __init__(self, boxManager, spawnPos):
        super().__init__()
        # Variables
        self.spawnPos = spawnPos

        # Objects
        self.boxManager = boxManager
        self.layout = QVBoxLayout(self)
        self.contentLayout = QHBoxLayout()
        self.settingsLayout = QVBoxLayout()
        self.isOccludedButton = Check('Occluded',
                                      boxManager.getRecentIsOccluded())
        self.isTruncatedButton = Check('Truncated',
                                       boxManager.getRecentIsTruncated())
        self.isGroupOfButton = Check('Group Of',
                                     boxManager.getRecentIsGroupOf())
        self.isDepictionButton = Check('Depiction',
                                       boxManager.getRecentIsDepiction())
        self.isInsideButton = Check('Inside', boxManager.getRecentIsInside())
        self.acceptButton = QPushButton('Accept')
        self.cancelButton = QPushButton('Cancel')
        self.labelsModel = QStringListModel()
        self.labelsView = QListView()

        # Layout
        self.setWindowFlags(Qt.Popup)
        self.settingsLayout.setAlignment(Qt.AlignTop | Qt.AlignCenter)
        self.settingsLayout.setMargin(0)
        self.settingsLayout.addWidget(self.isOccludedButton)
        self.settingsLayout.addWidget(self.isTruncatedButton)
        self.settingsLayout.addWidget(self.isGroupOfButton)
        self.settingsLayout.addWidget(self.isDepictionButton)
        self.settingsLayout.addWidget(self.isInsideButton)
        self.settingsLayout.addStretch(1)
        self.settingsLayout.addWidget(self.acceptButton)
        self.settingsLayout.addWidget(self.cancelButton)
        self.contentLayout.addWidget(self.labelsView)
        self.contentLayout.addLayout(self.settingsLayout)
        self.layout.addLayout(self.contentLayout)

        # Styling
        self.setStyleSheet('LabelConfigurator { '
                           'background-color: ' + ThemeManager.BG_L1 + ';'
                           'border-top-left-radius:     ' +
                           str(ThemeManager.CURVE) + 'px;'
                           'border-bottom-left-radius:  ' +
                           str(ThemeManager.CURVE) + 'px;'
                           'border-top-right-radius:    ' +
                           str(ThemeManager.CURVE) + 'px;'
                           'border-bottom-right-radius: ' +
                           str(ThemeManager.CURVE) + 'px;'
                           'border-width: 0px;'
                           'border-style: solid;'
                           '}'
                           'QPushButton {'
                           'background-color: ' + ThemeManager.BG_L2 + ';'
                           'border-radius: 10px;'
                           'color: ' + ThemeManager.LABEL + ';'
                           'font-size: 14px;'
                           '}'
                           'QPushButton:hover {'
                           'background-color: ' + ThemeManager.BG_L3 + ';'
                           '}'
                           'QListView { '
                           'background-color: ' + ThemeManager.BG_L2 + ';'
                           '}')
        self.layout.setMargin(20)
        self.layout.setSpacing(10)
        self.contentLayout.setMargin(0)
        self.labelsModel.setStringList(boxManager.loadLabels())
        self.labelsView.setFixedWidth(80)
        self.labelsView.setFrameStyle(QFrame.NoFrame)
        self.labelsView.setModel(self.labelsModel)
        self.labelsView.setItemDelegate(ListDelegate.ListDelegate())

        index = None
        try:
            row = self.labelsModel.stringList().index(
                boxManager.getRecentLabelName())
            index = self.labelsModel.index(row)
        except ValueError:
            index = self.labelsModel.index(0)
        if index is not None:
            self.labelsView.setCurrentIndex(index)

        # Connections
        self.acceptButton.clicked.connect(self.close)
        self.cancelButton.clicked.connect(self.reject)

    def showEvent(self, event):
        super().showEvent(event)
        self.move(self.spawnPos)

    def closeEvent(self, event):
        labelConfig = (self.labelsView.selectedIndexes()[0].data(
            role=Qt.DisplayRole), self.isOccludedButton.getEnabled(),
                       self.isTruncatedButton.getEnabled(),
                       self.isGroupOfButton.getEnabled(),
                       self.isDepictionButton.getEnabled(),
                       self.isInsideButton.getEnabled())
        self.labelAccepted.emit(labelConfig)
        super().closeEvent(event)

    def getLabelConfig(self):
        return

    labelAccepted = Signal(object)
Beispiel #2
0
        pyautogui.click()
        pyautogui.typewrite(list("Murad4023") + ['enter'], interval=interval)

        pyautogui.moveTo(imgxy[0], imgxy[1] + 220, duration=duration)
        pyautogui.click()
        pyautogui.typewrite(list("3244dmk") + ['enter'], interval=interval)

        pyautogui.moveTo(imgxy[0], imgxy[1] + 265, duration=duration)
        pyautogui.click()

    @staticmethod
    def handle_proxy_auth_req(url, auth, proxyhost):
        auth.setUser("80LgxYnqOE")
        auth.setPassword("gEkKsvssAK")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    browser = Browser()

    list_view = QListView()
    list_view.setFixedWidth(300)
    grid = QGridLayout()
    grid.addWidget(list_view, 0, 1)
    grid.addWidget(browser, 0, 2)
    main_frame = QWidget()
    main_frame.setMinimumSize(800, 600)
    main_frame.setLayout(grid)
    main_frame.show()
    sys.exit(app.exec_())
Beispiel #3
0
class Ui_FE14CharacterEditor(QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.search_bar = QLineEdit()
        self.search_bar.setPlaceholderText("Search...")
        self.search_bar.setFixedWidth(225)
        self.characters_list_view = QListView()
        self.characters_list_view.setContextMenuPolicy(
            QtCore.Qt.CustomContextMenu)
        self.characters_list_view.setFixedWidth(225)
        self.characters_list_layout = QVBoxLayout()
        self.characters_list_layout.addWidget(self.search_bar)
        self.characters_list_layout.addWidget(self.characters_list_view)

        self.character_details_box = QGroupBox(title="Character Details")
        self.portrait_display = QGraphicsView()
        self.portrait_display.setFixedSize(140, 140)
        self.character_details_form_contents_1 = QWidget()
        self.character_details_form_contents_2 = QWidget()
        self.character_details_layout = QHBoxLayout()
        self.character_details_layout.addWidget(self.portrait_display)
        self.character_details_layout.addWidget(
            self.character_details_form_contents_1)
        self.character_details_layout.addWidget(
            self.character_details_form_contents_2)
        self.character_details_box.setLayout(self.character_details_layout)
        self.character_details_box.setFixedHeight(200)

        self.tab_widget = QTabWidget()
        self.ids_tab = QWidget()
        self.classes_tab = QWidget()
        self.stats_tab = QScrollArea()
        self.skills_tab = QScrollArea()
        self.misc_tab = QScrollArea()
        self.portraits_tab = PortraitViewer()

        self.stats_contents = QWidget()
        self.stats_tab.setWidget(self.stats_contents)
        self.stats_tab.setWidgetResizable(True)
        self.stats_layout = QVBoxLayout()
        self.stats_layout.setAlignment(QtCore.Qt.AlignTop)
        self.stats_contents.setLayout(self.stats_layout)

        self.skills_contents = QWidget()
        self.skills_tab.setWidget(self.skills_contents)
        self.skills_tab.setWidgetResizable(True)

        self.misc_contents = QWidget()
        self.misc_tab.setWidget(self.misc_contents)
        self.misc_tab.setWidgetResizable(True)
        self.misc_layout = QVBoxLayout()
        self.misc_layout.setAlignment(QtCore.Qt.AlignTop)
        self.misc_contents.setLayout(self.misc_layout)

        self.tab_widget.addTab(self.ids_tab, "IDs")
        self.tab_widget.addTab(self.classes_tab, "Classes")
        self.tab_widget.addTab(self.stats_tab, "Stats")
        self.tab_widget.addTab(self.skills_tab, "Skills")
        self.tab_widget.addTab(self.misc_tab, "Misc.")
        self.tab_widget.addTab(self.portraits_tab, "Portraits")

        self.editor_layout = QVBoxLayout()
        self.editor_layout.addWidget(self.character_details_box)
        self.editor_layout.addWidget(self.tab_widget)

        self.main_layout = QHBoxLayout()
        self.main_layout.addLayout(self.characters_list_layout)
        self.visual_splitter = QFrame()
        self.visual_splitter.setFrameShape(QFrame.VLine)
        self.visual_splitter.setFrameShadow(QFrame.Sunken)
        self.main_layout.addWidget(self.visual_splitter)
        self.main_layout.addLayout(self.editor_layout)

        self.tool_bar = QToolBar()
        self.action_add = QAction(text="Add")
        self.action_remove = QAction(text="Remove")
        self.action_copy_to = QAction(text="Copy To")
        self.tool_bar.addActions(
            [self.action_add, self.action_remove, self.action_copy_to])

        self.addToolBar(self.tool_bar)

        self.resize(1000, 600)
        central_widget = QWidget()
        central_widget.setLayout(self.main_layout)
        self.setWindowTitle("Character Editor")
        self.setWindowIcon(QIcon("paragon.ico"))
        self.setCentralWidget(central_widget)
Beispiel #4
0
from PySide2.QtGui import QStandardItemModel, QStandardItem
from PySide2.QtWebEngineWidgets import QWebEngineView, QWebEnginePage, QWebEngineProfile
from PySide2.QtWidgets import QGridLayout, QLineEdit, QWidget, QHeaderView, QListView
from PySide2.QtWebEngineCore import QWebEngineUrlRequestInterceptor
from PySide2 import QtNetwork

if __name__ == "__main__":
    app = QApplication(sys.argv)
    main_frame = QWidget()
    listView = QListView()
    browser = QWebEngineView()
    grid = QGridLayout()
    ledit = QLineEdit()

    ledit.resize(50, 20)
    listView.setFixedWidth(250)
    listView.setWindowTitle('Example List')
    model = QStandardItemModel(listView)

    foods = [
        'Cookie dough',  # Must be store-bought
        'Hummus',  # Must be homemade
        'Spaghetti',  # Must be saucy
        'Dal makhani',  # Must be spicy
        'Chocolate whipped cream'  # Must be plentiful
    ]

    for food in foods:
        # Create an item with a caption
        item = QStandardItem(food)
Beispiel #5
0
class FormMidContextWidget(QtWidgets.QWidget):
    #定义成员变量

    #定义信号

    def __init__(self):
        super().__init__()

        self.__initForm()
        self.__loadMusicLibraryListWidgetData()
        self.__loadSongsNameListWidgetData()
        self.__loadCollectionMusicListWidgetData()

    def __initForm(self):
        self.mainLayout = QHBoxLayout()
        self.mainLayout.setContentsMargins(1, 1, 1, 1)
        self.contextFrame = QtWidgets.QFrame()
        self.contextFrame.setObjectName("contextFrame")
        self.midContextLayout = QHBoxLayout()
        self.midContextLayout.setSpacing(1)
        self.midContextLayout.setContentsMargins(0, 1, 0, 1)
        self.midLeftFrame = QtWidgets.QFrame()
        self.midLeftFrame.setObjectName("midLeftFrame")
        self.midLeftLayout = QVBoxLayout()
        self.midLeftFrame.setLayout(self.midLeftLayout)
        self.midLeftLayout.setSpacing(0)
        self.midLeftLayout.setContentsMargins(2, 2, 2, 2)

        self.musicLibraryTitleLabel = QLabel("音乐库")
        self.textFont = QFont("微软雅黑", 11)
        self.textFont.setBold(True)
        self.musicLibraryTitleLabel.setFont(self.textFont)
        self.musicLibraryListView = QListView()
        self.musicLibraryListView.setFixedHeight(140)
        self.musicLibraryListView.setObjectName('musicLibraryListView')
        self.musicLibraryListView.setFixedWidth(190)

        self.localCollectionTitleLabel = QLabel("本地收藏")
        self.localCollectionTitleLabel.setFont(self.textFont)
        self.localCollectionListView = QListView()
        self.localCollectionListView.setObjectName('localCollectionListView')
        self.localCollectionListView.setFixedWidth(190)

        self.songsNameListTitleLabel = QLabel("歌单列表")
        self.songsNameListTitleLabel.setFont(self.textFont)
        self.songsNameListView = QListView()
        self.songsNameListView.setObjectName('songsNameListView')
        self.songsNameListView.setFixedWidth(190)
        self.songsNameListView.setFixedHeight(300)

        self.midLeftLayout.addWidget(self.musicLibraryTitleLabel)
        self.midLeftLayout.addWidget(self.musicLibraryListView)
        self.midLeftLayout.addWidget(self.songsNameListTitleLabel)
        self.midLeftLayout.addWidget(self.songsNameListView)
        self.midLeftLayout.addWidget(self.localCollectionTitleLabel)
        self.midLeftLayout.addWidget(self.localCollectionListView)
        self.rightContextStackWidget = QStackedWidget()
        self.testLabel = QLabel()
        self.testLabel.setScaledContents(True)
        self.testLabel.setPixmap(
            QPixmap(":/icon/Resources/icon/icon-meinv.jpg").scaled(
                self.testLabel.width(), self.testLabel.height(),
                Qt.KeepAspectRatio, Qt.SmoothTransformation))
        self.rightContextStackWidget.addWidget(self.testLabel)
        self.midContextLayout.addWidget(self.midLeftFrame)
        self.midContextLayout.addWidget(self.rightContextStackWidget)
        self.midContextLayout.setStretch(0, 0)
        self.midContextLayout.setStretch(1, 1)
        self.contextFrame.setLayout(self.midContextLayout)
        self.mainLayout.addWidget(self.contextFrame)
        self.setLayout(self.mainLayout)

    def __loadMusicLibraryListWidgetData(self):
        self.textFont = QFont("微软雅黑", 11)

        self.localMusicItemData = QStandardItem("本地音乐")
        self.localMusicItemData.setFont(self.textFont)
        self.localMusicItemData.setEditable(False)
        self.localMusicItemData.setData(
            QIcon(":/icon/Resources/icon/icon-localmusic.svg"),
            Qt.DecorationRole)

        self.wangyiYunItemData = QStandardItem("网易云音乐")
        self.wangyiYunItemData.setFont(self.textFont)
        self.wangyiYunItemData.setEditable(False)
        self.wangyiYunItemData.setData(
            QIcon(":/icon/Resources/icon/icon-wangyiyunmusic.svg"),
            Qt.DecorationRole)

        self.qqMusicItemData = QStandardItem("QQ音乐")
        self.qqMusicItemData.setFont(self.textFont)
        self.qqMusicItemData.setEditable(False)
        self.qqMusicItemData.setData(
            QIcon(":/icon/Resources/icon/icon-qqmusic.svg"), Qt.DecorationRole)

        self.xiaMiItemData = QStandardItem("虾米音乐")
        self.xiaMiItemData.setFont(self.textFont)
        self.xiaMiItemData.setEditable(False)
        self.xiaMiItemData.setData(
            QIcon(":/icon/Resources/icon/icon-xiamimusic.svg"),
            Qt.DecorationRole)

        self.musicLibraryModel = QStandardItemModel()
        self.musicLibraryModel.appendRow(self.localMusicItemData)
        self.musicLibraryModel.appendRow(self.wangyiYunItemData)
        self.musicLibraryModel.appendRow(self.qqMusicItemData)
        self.musicLibraryModel.appendRow(self.xiaMiItemData)

        self.musicLibraryListView.setSpacing(2)
        self.musicLibraryListView.setModel(self.musicLibraryModel)

    def __loadSongsNameListWidgetData(self):
        self.wubaiItemData = QStandardItem("伍佰&China blue")
        self.textFont = QFont("微软雅黑", 11)
        self.wubaiItemData.setFont(self.textFont)
        self.wubaiItemData.setEditable(False)
        self.wubaiItemData.setData(
            QIcon(":/icon/Resources/icon/icon-gedanlist.svg"),
            Qt.DecorationRole)

        self.zongguanxianItemData = QStandardItem("纵贯线")
        self.zongguanxianItemData.setFont(self.textFont)
        self.zongguanxianItemData.setEditable(False)
        self.zongguanxianItemData.setData(
            QIcon(":/icon/Resources/icon/icon-gedanlist.svg"),
            Qt.DecorationRole)

        self.zhaoleiItemData = QStandardItem("赵雷专辑")
        self.zhaoleiItemData.setFont(self.textFont)
        self.zhaoleiItemData.setEditable(False)
        self.zhaoleiItemData.setData(
            QIcon(":/icon/Resources/icon/icon-gedanlist.svg"),
            Qt.DecorationRole)

        self.xuweiItemData = QStandardItem("许巍专辑")
        self.xuweiItemData.setFont(self.textFont)
        self.xuweiItemData.setEditable(False)
        self.xuweiItemData.setData(
            QIcon(":/icon/Resources/icon/icon-gedanlist.svg"),
            Qt.DecorationRole)

        self.zhouhuajianItemData = QStandardItem("周华健专辑")
        self.zhouhuajianItemData.setFont(self.textFont)
        self.zhouhuajianItemData.setEditable(False)
        self.zhouhuajianItemData.setData(
            QIcon(":/icon/Resources/icon/icon-gedanlist.svg"),
            Qt.DecorationRole)

        self.banderuiItemData = QStandardItem("班得瑞专辑")
        self.banderuiItemData.setFont(self.textFont)
        self.banderuiItemData.setEditable(False)
        self.banderuiItemData.setData(
            QIcon(":/icon/Resources/icon/icon-gedanlist.svg"),
            Qt.DecorationRole)

        self.yaogunItemData = QStandardItem("摇滚专辑")
        self.yaogunItemData.setFont(self.textFont)
        self.yaogunItemData.setEditable(False)
        self.yaogunItemData.setData(
            QIcon(":/icon/Resources/icon/icon-gedanlist.svg"),
            Qt.DecorationRole)

        self.yinshiyuanshenItemData = QStandardItem("影视原声")
        self.yinshiyuanshenItemData.setFont(self.textFont)
        self.yinshiyuanshenItemData.setEditable(False)
        self.yinshiyuanshenItemData.setData(
            QIcon(":/icon/Resources/icon/icon-gedanlist.svg"),
            Qt.DecorationRole)

        self.minyaoItemData = QStandardItem("民谣专辑")
        self.minyaoItemData.setFont(self.textFont)
        self.minyaoItemData.setEditable(False)
        self.minyaoItemData.setData(
            QIcon(":/icon/Resources/icon/icon-gedanlist.svg"),
            Qt.DecorationRole)

        self.tianlaizhiyinItemData = QStandardItem("天籁之音")
        self.tianlaizhiyinItemData.setFont(self.textFont)
        self.tianlaizhiyinItemData.setEditable(False)
        self.tianlaizhiyinItemData.setData(
            QIcon(":/icon/Resources/icon/icon-gedanlist.svg"),
            Qt.DecorationRole)

        self.songsNameListModel = QStandardItemModel()
        self.songsNameListModel.appendRow(self.wubaiItemData)
        self.songsNameListModel.appendRow(self.zongguanxianItemData)
        self.songsNameListModel.appendRow(self.zhaoleiItemData)
        self.songsNameListModel.appendRow(self.xuweiItemData)
        self.songsNameListModel.appendRow(self.zhouhuajianItemData)
        self.songsNameListModel.appendRow(self.banderuiItemData)
        self.songsNameListModel.appendRow(self.yaogunItemData)
        self.songsNameListModel.appendRow(self.yinshiyuanshenItemData)
        self.songsNameListModel.appendRow(self.minyaoItemData)
        self.songsNameListModel.appendRow(self.tianlaizhiyinItemData)

        self.songsNameListView.setSpacing(2)
        self.songsNameListView.setModel(self.songsNameListModel)

    def __loadCollectionMusicListWidgetData(self):
        self.jingdianItemData = QStandardItem("经典老歌")
        self.textFont = QFont("微软雅黑", 11)
        self.jingdianItemData.setFont(self.textFont)
        self.jingdianItemData.setEditable(False)
        self.jingdianItemData.setData(
            QIcon(":/icon/Resources/icon/icon-collectionmusic.svg"),
            Qt.DecorationRole)

        self.qinyinyueItemData = QStandardItem("轻音乐系")
        self.qinyinyueItemData.setFont(self.textFont)
        self.qinyinyueItemData.setEditable(False)
        self.qinyinyueItemData.setData(
            QIcon(":/icon/Resources/icon/icon-collectionmusic.svg"),
            Qt.DecorationRole)

        self.jitaxilieItemData = QStandardItem("吉他系列")
        self.jitaxilieItemData.setFont(self.textFont)
        self.jitaxilieItemData.setEditable(False)
        self.jitaxilieItemData.setData(
            QIcon(":/icon/Resources/icon/icon-collectionmusic.svg"),
            Qt.DecorationRole)

        self.remengequItemData = QStandardItem("热门歌曲")
        self.remengequItemData.setFont(self.textFont)
        self.remengequItemData.setEditable(False)
        self.remengequItemData.setData(
            QIcon(":/icon/Resources/icon/icon-collectionmusic.svg"),
            Qt.DecorationRole)

        self.songsNameModel = QStandardItemModel()
        self.songsNameModel.appendRow(self.jingdianItemData)
        self.songsNameModel.appendRow(self.qinyinyueItemData)
        self.songsNameModel.appendRow(self.jitaxilieItemData)
        self.songsNameModel.appendRow(self.remengequItemData)
        self.localCollectionListView.setSpacing(2)
        self.localCollectionListView.setModel(self.songsNameModel)
Beispiel #6
0
class MainWindow(QFrame):
    def __init__(self):
        super().__init__()
        self._linkHistoryModel = ImageModel()
        self._linkHistoryView = QListView()
        self._autoTimer = QTimer()
        self._viewer = QLabel()
        self._play = QPushButton('START')
        self._stop = QPushButton('STOP')

        self._linkHistoryView.setFixedWidth(200)
        self._linkHistoryView.setModel(self._linkHistoryModel)

        self._autoTimer.setInterval(100)
        self._autoTimer.timeout.connect(
            lambda: AsyncRequestManager.downloadRequest(random=True))

        self.setLayout(QHBoxLayout())
        self._innerLayout = QVBoxLayout()
        self._buttonLayout = QHBoxLayout()
        self.layout().addWidget(self._linkHistoryView)
        self.layout().addLayout(self._innerLayout)
        self._innerLayout.addWidget(self._viewer, alignment=Qt.AlignCenter)
        self._innerLayout.addLayout(self._buttonLayout,
                                    alignment=Qt.AlignBottom)
        self._buttonLayout.addWidget(self._play)
        self._buttonLayout.addWidget(self._stop)
        self._linkHistoryView.selectionModel().selectionChanged.connect(
            self._updateViewer)

        AsyncRequestManager.responseReceived.connect(self._newImage)
        AsyncRequestManager.downloadRequest(random=True)
        self._play.clicked.connect(self._autoTimer.start)
        self._stop.clicked.connect(self._autoTimer.stop)

    def _updateViewer(self, selected, deselected):
        # Updates viewer
        index = selected.indexes()[0]
        response = index.data(role=ImageElement.response)
        if not index.data(role=ImageElement.image):
            pixmap = self._makeImage(response)
            self._linkHistoryModel.setData(index,
                                           pixmap,
                                           role=ImageElement.image)

        # if response.headers['Content-Type'] == 'image/gif': #TODO: Find out why QMovie crashes with start()
        #     movie = index.data(role=ImageElement.image)
        #     self._viewer.setMovie(movie)
        #     movie.start()
        # else:
        self._viewer.setPixmap(index.data(role=ImageElement.image))

    def _saveImage(self, response=None):
        # Saves the given response if any, else uses the image stored in the currently selected index
        if response:
            name, data = response.url.rsplit('/', 1)[-1], response.content
        else:
            item = self._linkHistoryView.selectionModel().selectedIndexes()[0]
            name = item.data(role=ImageElement.url).rsplit('/', 1)[-1]
            data = item.data(role=ImageElement.response).content
        saveDirectory = './images'
        if not os.path.exists(saveDirectory):
            os.makedirs(saveDirectory)
        saveDirectory += '/' + name
        with open(saveDirectory, 'wb') as f:
            f.write(data)

    def _makeImage(self, response, maxWidth=700, maxHeight=700):
        # Makes an image for the given response
        # if response.headers['Content-Type'] == 'image/gif':
        #     byteArray = QByteArray(response.content)
        #     buffer = QBuffer(byteArray)
        #     buffer.open(QIODevice.ReadOnly)
        #     mov = QMovie(buffer, b'GIF')
        #     mov.setCacheMode(QMovie.CacheAll)
        #     mov.setSpeed(100)
        #     return mov

        pixmap = QPixmap()
        pixmap.loadFromData(response.content)
        width, height = pixmap.width(), pixmap.height()
        if width > height and width > maxWidth:
            dx = maxWidth / width
            width = min(width, maxWidth)
            height *= dx
        elif height > width and height > maxHeight:
            dy = maxHeight / height
            height = min(height, maxHeight)
            width *= dy
        elif height == width:
            width = height = maxWidth
        scaled = pixmap.scaled(width,
                               height,
                               transformMode=Qt.SmoothTransformation)

        return scaled

    def _makeItem(self, response):
        # Creates an image item from the given response
        item = QStandardItem()
        item.setData(response.url, role=ImageElement.url)
        item.setData(response, role=ImageElement.response)
        item.setData(self._makeImage(response), role=ImageElement.image)

        return item

    def _newImage(self, response):
        # Creates a new image item, adds it to the model, then updates the view
        item = self._makeItem(response)
        self._linkHistoryModel.appendRow(item)
        self._linkHistoryView.selectionModel().select(
            self._linkHistoryModel.indexFromItem(item),
            QItemSelectionModel.ClearAndSelect)

        return item

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            AsyncRequestManager.downloadRequest(random=True)
        elif event.button() == Qt.RightButton:
            self._saveImage()

    def keyReleaseEvent(self, event):
        if event.key() == Qt.Key_R:
            for response in randomImgurResponses(10000):
                # newImageItem = self._newImage(response)
                # QApplication.processEvents()
                self._saveImage(response)