class QLoadingDialog(QDialog):
    def __init__(self, parent=None):
        super(QLoadingDialog, self).__init__()
        self.setFixedSize(100, 100)
        # self.setWindowOpacity(0.8)
        self.setWindowFlags(QtCore.Qt.FramelessWindowHint)
        self.setAttribute(QtCore.Qt.WA_TranslucentBackground)
        app = QApplication.instance()
        curr_theme = "light"
        if app:
            curr_theme = app.property("theme")
        gif_file = os.path.abspath(
            "./assets/icons/{}/loading.gif".format(curr_theme))
        self.movie = QMovie(gif_file)
        self.label = QLabel()
        self.label.setMovie(self.movie)
        self.layout = QVBoxLayout(self)
        self.layout.addWidget(self.label)

    def center(self, host: QWidget = None):
        if host:
            hostGeometry: QRect = host.geometry()
            # dialogGeometry : QRect = self.geometry()
            centerPoint: QPoint = hostGeometry.center()
            centerPoint = host.mapToGlobal(centerPoint)
            offset = 30
            targetPoint = QPoint(centerPoint.x() - offset,
                                 centerPoint.y() - offset)
            self.move(targetPoint)
        else:
            screen = QApplication.desktop().screenNumber(
                QApplication.desktop().cursor().pos())
            centerPoint = QApplication.desktop().screenGeometry(
                screen).center()
            self.move(centerPoint)
        return self

    def showEvent(self, e: QShowEvent):
        if self.movie.state() == QMovie.NotRunning:
            self.movie.start()

    def closeEvent(self, e: QCloseEvent):
        if self.movie.state() == QMovie.Running:
            self.movie.stop()

    def exec_(self):
        self.center()
        return QDialog.exec_(self)
Exemple #2
0
class LoadingWidget(QWidget, QObject):
    complete = pyqtSignal()

    def __init__(self, parent):
        QWidget.__init__(self, parent)
        QObject.__init__(self)
        self.setStyleSheet("background-color: #31353a;")
        self.setAutoFillBackground(True)
        self.gifPath = "img/loading.gif"
        self.initUI()

    def initUI(self):
        layout = QBoxLayout(QBoxLayout.TopToBottom, self)
        self.setLayout(layout)

        self.loadingMovie = QMovie(self.gifPath)
        self.loadingImg = QLabel(self)
        self.loadingImg.setMovie(self.loadingMovie)
        self.loadingImg.setSizePolicy(QSizePolicy.Expanding,
                                      QSizePolicy.Expanding)
        self.loadingImg.setAlignment(Qt.AlignCenter)

        self.logLabel = QLabelLogger(self)
        self.logLabel.setFormatter(logging.Formatter('%(message)s'))
        logging.getLogger().addHandler(self.logLabel)
        logging.getLogger().setLevel(logging.INFO)

        self.loadingBar = QProgressBar(self)
        self.loadingBar.setStyleSheet(qdarkstyle.load_stylesheet_pyqt5())
        self.loadingBar.setFixedHeight(10)
        self.loadingBar.setTextVisible(False)

        self.barThread = LoadingBarThread(self)
        self.barThread.change_value.connect(self.loadingBar.setValue)
        self.barThread.complete.connect(self.clear)

        layout.addWidget(self.loadingImg)
        layout.addWidget(self.logLabel.widget)
        layout.addWidget(self.loadingBar)
        self.layout().setContentsMargins(0, 0, 0, 0)

    def start(self):
        self.loadingMovie.start()
        self.barThread.start()
        self.show()

    def resume(self):
        if self.barThread.cnt <= 50:
            self.barThread.cnt = 100
            return
        self.barThread.toggle_status()
        if self.loadingMovie.state() != QMovie.Running:
            self.loadingMovie.start()

    def clear(self):
        self.loadingMovie.stop()
        self.complete.emit()
Exemple #3
0
def show_splash_screen_movie(app):
    movie = QMovie(str(':/anim/Splash_Screen.gif'))
    splash = MovieSplashScreen(movie, app)
    splash.show()

    start = time.time()

    while movie.state() == QMovie.Running and time.time() < start + 1.1:
        app.processEvents()

    return splash
Exemple #4
0
def startSplash(meinGif, meineApp):
    pixmap = QMovie(meinGif)
    splash = MovieSplashScreen.MovieSplashScreen(pixmap)
    splash.setMask(splash.mask())
    splash.sizeHint()
    splash.setWindowFlags(Qt.SplashScreen | Qt.WindowStaysOnTopHint)
    splash.show()
    splash.acceptDrops()
    splash.paintEvent(meineApp)
    splash.showEvent(meineApp)
    while pixmap.state() == QMovie.Running and not os.path.exists(
            os.path.dirname(sys.argv[0]) + "/setup.exe"):
        meineApp.processEvents()
Exemple #5
0
class IconManagement(object):

    def __init__(self, tray, interval = 100):
        self.tray = tray
        self.movie = QMovie(":/images/tray_animations/tray.gif")
        self.movie.setSpeed(interval)
        self.movie.frameChanged.connect(self.next_icon)
        self.icons = Enum(
            ok = QIcon(":/images/demerio.png"),
            problem = QIcon(":/images/demerio-problem.png"),
            conductor_problem = QIcon(":/images/demerio-conductor-problem.png")
        )
        self.icon = self.icons.ok
        self.update_icon()

    def internet_is_ok(self, internet_is_ok):
        self.icon = self.icons.ok if internet_is_ok else self.icons.problem
        self.update_icon()

    @pyqtSlot(int)
    def next_icon(self, i):
        self.tray.setIcon(QIcon(self.movie.currentPixmap()))

    def start(self):
        self.movie.start()

    def stop(self):
        self.update_icon()
        self.movie.stop()

    def update_icon(self):
        self.tray.setIcon(self.icon)

    def conductor_problem(self):
        if self.movie.state() == QMovie.Running:
            self.movie.stop()
        self.icon = self.icons.conductor_problem
        self.update_icon()
Exemple #6
0
class IconManagement(object):
    def __init__(self, tray, interval=100):
        self.tray = tray
        self.movie = QMovie(":/images/tray_animations/tray.gif")
        self.movie.setSpeed(interval)
        self.movie.frameChanged.connect(self.next_icon)
        self.icons = Enum(
            ok=QIcon(":/images/demerio.png"),
            problem=QIcon(":/images/demerio-problem.png"),
            conductor_problem=QIcon(":/images/demerio-conductor-problem.png"))
        self.icon = self.icons.ok
        self.update_icon()

    def internet_is_ok(self, internet_is_ok):
        self.icon = self.icons.ok if internet_is_ok else self.icons.problem
        self.update_icon()

    @pyqtSlot(int)
    def next_icon(self, i):
        self.tray.setIcon(QIcon(self.movie.currentPixmap()))

    def start(self):
        self.movie.start()

    def stop(self):
        self.update_icon()
        self.movie.stop()

    def update_icon(self):
        self.tray.setIcon(self.icon)

    def conductor_problem(self):
        if self.movie.state() == QMovie.Running:
            self.movie.stop()
        self.icon = self.icons.conductor_problem
        self.update_icon()
class MoviePlayer(QWidget):
    def __init__(self, parent=None):
        super(MoviePlayer, self).__init__(parent)

        self.movie = QMovie(self)
        self.movie.setCacheMode(QMovie.CacheAll)

        self.movieLabel = QLabel("No movie loaded")
        self.movieLabel.setAlignment(Qt.AlignCenter)
        self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.movieLabel.setBackgroundRole(QPalette.Dark)
        self.movieLabel.setAutoFillBackground(True)

        self.currentMovieDirectory = ''

        self.createControls()
        self.createButtons()

        self.movie.frameChanged.connect(self.updateFrameSlider)
        self.movie.stateChanged.connect(self.updateButtons)
        self.fitCheckBox.clicked.connect(self.fitToWindow)
        self.frameSlider.valueChanged.connect(self.goToFrame)
        self.speedSpinBox.valueChanged.connect(self.movie.setSpeed)

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.movieLabel)
        mainLayout.addLayout(self.controlsLayout)
        mainLayout.addLayout(self.buttonsLayout)
        self.setLayout(mainLayout)

        self.updateFrameSlider()
        self.updateButtons()

        self.setWindowTitle("Movie Player")
        self.resize(400, 400)

    def open(self):
        fileName, _ = QFileDialog.getOpenFileName(self, "Open a Movie",
                                                  self.currentMovieDirectory)

        if fileName:
            self.openFile(fileName)

    def openFile(self, fileName):
        self.currentMovieDirectory = QFileInfo(fileName).path()

        self.movie.stop()
        self.movieLabel.setMovie(self.movie)
        self.movie.setFileName(fileName)
        self.movie.start()

        self.updateFrameSlider()
        self.updateButtons()

    def goToFrame(self, frame):
        self.movie.jumpToFrame(frame)

    def fitToWindow(self):
        self.movieLabel.setScaledContents(self.fitCheckBox.isChecked())

    def updateFrameSlider(self):
        hasFrames = (self.movie.currentFrameNumber() >= 0)

        if hasFrames:
            if self.movie.frameCount() > 0:
                self.frameSlider.setMaximum(self.movie.frameCount() - 1)
            elif self.movie.currentFrameNumber() > self.frameSlider.maximum():
                self.frameSlider.setMaximum(self.movie.currentFrameNumber())

            self.frameSlider.setValue(self.movie.currentFrameNumber())
        else:
            self.frameSlider.setMaximum(0)

        self.frameLabel.setEnabled(hasFrames)
        self.frameSlider.setEnabled(hasFrames)

    def updateButtons(self):
        state = self.movie.state()

        self.playButton.setEnabled(self.movie.isValid()
                                   and self.movie.frameCount() != 1
                                   and state == QMovie.NotRunning)
        self.pauseButton.setEnabled(state != QMovie.NotRunning)
        self.pauseButton.setChecked(state == QMovie.Paused)
        self.stopButton.setEnabled(state != QMovie.NotRunning)

    def createControls(self):
        self.fitCheckBox = QCheckBox("Fit to Window")

        self.frameLabel = QLabel("Current frame:")

        self.frameSlider = QSlider(Qt.Horizontal)
        self.frameSlider.setTickPosition(QSlider.TicksBelow)
        self.frameSlider.setTickInterval(10)

        speedLabel = QLabel("Speed:")

        self.speedSpinBox = QSpinBox()
        self.speedSpinBox.setRange(1, 9999)
        self.speedSpinBox.setValue(100)
        self.speedSpinBox.setSuffix("%")

        self.controlsLayout = QGridLayout()
        self.controlsLayout.addWidget(self.fitCheckBox, 0, 0, 1, 2)
        self.controlsLayout.addWidget(self.frameLabel, 1, 0)
        self.controlsLayout.addWidget(self.frameSlider, 1, 1, 1, 2)
        self.controlsLayout.addWidget(speedLabel, 2, 0)
        self.controlsLayout.addWidget(self.speedSpinBox, 2, 1)

    def createButtons(self):
        iconSize = QSize(36, 36)

        openButton = QToolButton()
        openButton.setIcon(self.style().standardIcon(
            QStyle.SP_DialogOpenButton))
        openButton.setIconSize(iconSize)
        openButton.setToolTip("Open File")
        openButton.clicked.connect(self.open)

        self.playButton = QToolButton()
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.setIconSize(iconSize)
        self.playButton.setToolTip("Play")
        self.playButton.clicked.connect(self.movie.start)

        self.pauseButton = QToolButton()
        self.pauseButton.setCheckable(True)
        self.pauseButton.setIcon(self.style().standardIcon(
            QStyle.SP_MediaPause))
        self.pauseButton.setIconSize(iconSize)
        self.pauseButton.setToolTip("Pause")
        self.pauseButton.clicked.connect(self.movie.setPaused)

        self.stopButton = QToolButton()
        self.stopButton.setIcon(self.style().standardIcon(QStyle.SP_MediaStop))
        self.stopButton.setIconSize(iconSize)
        self.stopButton.setToolTip("Stop")
        self.stopButton.clicked.connect(self.movie.stop)

        quitButton = QToolButton()
        quitButton.setIcon(self.style().standardIcon(
            QStyle.SP_DialogCloseButton))
        quitButton.setIconSize(iconSize)
        quitButton.setToolTip("Quit")
        quitButton.clicked.connect(self.close)

        self.buttonsLayout = QHBoxLayout()
        self.buttonsLayout.addStretch()
        self.buttonsLayout.addWidget(openButton)
        self.buttonsLayout.addWidget(self.playButton)
        self.buttonsLayout.addWidget(self.pauseButton)
        self.buttonsLayout.addWidget(self.stopButton)
        self.buttonsLayout.addWidget(quitButton)
        self.buttonsLayout.addStretch()
Exemple #8
0
class main_window(QMainWindow, ui_main.Ui_Dialog):
    def __init__(self, parent=None):
        super(main_window, self).__init__(parent)
        self.setupUi(self)
        self.pushButton.clicked.connect(self.test)
        self.pushButton_2.clicked.connect(
            lambda: self.send_command('pause\n'))  #pauseButton
        self.pushButton_3.clicked.connect(
            lambda: self.rate_button(True))  #loveButton
        self.pushButton_4.clicked.connect(
            lambda: self.send_command('quit\n'))  #skipButton
        self.pushButton_5.clicked.connect(
            lambda: self.rate_button(False))  #banButton
        self.volumeSlider.valueChanged.connect(self.volume_change)
        self.global_volume = 100  #default volume level
        self.stations = None

        #show load.gif
        self.movie = QMovie('ui/load.gif')
        self.albumImg.setMovie(self.movie)
        self.movie.start()

        #init pandora
        self.p = Pandora()

        #run thread
        self.queue = Queue()
        self.pandora_thread = connectThread(self.queue, self.p)
        self.pandora_thread.start()
        self.pandora_thread.labelSignal.connect(self.update_labels)
        self.pandora_thread.stationsSignal.connect(self.show_stations)
        self.pandora_thread.changeVolumeSignal.connect(
            lambda: self.volume_change(self.global_volume))
        self.comboBox.currentIndexChanged.connect(self.change_station)

    def test(self):
        self.send_command('get_time_pos\n')
        logging.debug('test button')

    def change_station(self, index):
        logging.debug('chose id: %s' % index)
        #print('stations: %s' % self.stations) # in json
        try:
            json_stations = json.loads(json.dumps(
                self.stations))  #obj to str -> str to json
            logging.debug(json_stations[index])
        except:
            logging.debug('station list is empty')

    def volume_change(self, volume):
        self.global_volume = volume
        try:
            with self.queue.mutex:
                self.queue.queue.clear()
            self.queue.put(self.global_volume)
            self.send_command('volume %s 1\n' % self.global_volume)
        except:
            logging.debug('couldn\'t change the volume')
        #TODO: somehow kill queue and start another

    # overriding standard close event
    def closeEvent(self, event):
        # do stuff
        if QCloseEvent:
            try:
                global mplayer_process
                mplayer_process.kill()
            except:
                print('Unexpected error')
            event.accept()  # let the window close
        else:
            event.ignore()

    def send_command(self, com):
        global mplayer_process
        #print('command: %s' % com) #debug
        mplayer_process.stdin.write(com.encode('utf-8', 'ignore'))
        mplayer_process.stdin.flush()

    def update_labels(self, name, artist, album, url, fav, track, station):
        #stop load.gif if it's running (first iteration)
        if self.movie.state() == 2:
            self.movie.stop()

        #set labels and album img
        self.songTitle.setText(name)
        self.songTitle.adjustSize()
        self.songInfo.setText('by "%s" from "%s"' % (artist, album))
        self.songInfo.adjustSize()
        self.favOrNot.setText('Yes' if fav == 1 else 'No')
        self.favOrNot.adjustSize()
        self.current_track = track
        self.current_station = station

        #TODO: spawn new transparent window like Google Music does?
        data = request.return_data(url, None, None, hdr, enable_proxy=False)
        img = QPixmap()
        img.loadFromData(data)
        resized_img = img.scaledToWidth(130)
        self.albumImg.setPixmap(resized_img)
        self.albumImg.adjustSize()

    # Open pop-up and log the info
    def show_stations(self, stations):
        print('\r\n(i) Found stations:')
        for i in range(0, len(stations)):
            print(i, stations[i]['stationId'], stations[i]['stationName'])
        window = stations_window(stations, self.queue, self)
        window.show()

    def rate_button(self, rating):
        print('\r\n(i) Loving song...' if rating ==
              True else '\r\n(i) Banning song...')
        self.p.rate_song(self.current_station, self.current_track, rating)
        if (rating == False):
            self.send_command('q\n')
        else:
            self.favOrNot.setText('Yes')
            self.favOrNot.adjustSize()
class Ui_Dialog(QtWidgets.QMainWindow):
    sig = QtCore.pyqtSignal()

    def add_item(self, widget, info):
        form = AlertWidget(info)
        a = QtWidgets.QListWidgetItem()
        a.setSizeHint(form.sizeHint())
        widget.insertItem(0, a)
        widget.setItemWidget(a, form)

    def __init__(self):
        super().__init__()
        uic.loadUi("UI/MainWindow.ui", self)
        self.searchButton.clicked.connect(self.crawler_search)
        self.movie = QMovie("loading.gif", QByteArray(), self.lblLogo)
        self.movie.setCacheMode(QMovie.CacheAll)
        self.movie.setSpeed(100)
        self.lblLogo.setMovie(self.movie)
        self.dw = None

        alerts = open("alerts.txt", "r").readlines()
        for line in alerts:
            print(line[:-1])
            self.add_item(self.newListWidget, line)

        with open('history\history.txt', 'r') as fl:
            dict = json.load(fl)
            for key in dict.keys():
                s = ""
                for c in dict[key]:
                    s += c + "\n"
                self.add_item(self.webListWidget, key)

        self.show()

    def resultScreen(self):
        self.matchResult = crawlerResult.MatchGui((self.res[0], "alias"),
                                                  self.res[1])
        self.matchResult.show()
        self.movie.stop()

    def setresult(self, res):
        self.res = res

    def crawler_search(self):
        if self.dataButton.isChecked():
            # data search = daniel hoch
            print("Hello")
            self.close()
            import os
            os.system('python main_ds.py %s' % str(self.searchEdit.text()))
        elif self.webButton.isChecked():
            # web search = dor salomon
            # replace
            self.movie.start()
            print(self.movie.state())
            self.sig.connect(self.resultScreen)
            self.t = Thread(self)
            self.t.start()
            self.show()
            '''if self.searchEdit.text() == "~test":
Exemple #10
0
class Ui_MainWindow(QtCore.QObject):
    sig = QtCore.pyqtSignal()

    def setupresUi(self):
        print(threading.enumerate())
        print(self.res)
        output = self.res[1]

        with open('history\history.txt', 'r') as fl:
            log = json.load(fl)
        log[self.res[0]] = output
        with open('history\history.txt', 'w') as fl:
            json.dump(log, fl)

        self.t.exit()
        # with open('history\history.txt', 'w') as json_file:
        #    json.dump(log, json_file)
        MainWindow = self.MainWindow
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(861, 690)
        MainWindow.setStyleSheet("background-color: rgb(255,255,255);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.backButton = QtWidgets.QCommandLinkButton(self.centralwidget)
        self.backButton.setMinimumSize(QtCore.QSize(40, 40))
        self.backButton.setMaximumSize(QtCore.QSize(40, 40))
        self.backButton.setBaseSize(QtCore.QSize(40, 40))
        self.backButton.setText("")
        self.backButton.setIconSize(QtCore.QSize(40, 40))
        self.backButton.setCheckable(False)
        self.backButton.setObjectName("backButton")
        self.MainWindow = MainWindow
        self.backButton.clicked.connect(self.setupUi)
        self.horizontalLayout.addWidget(self.backButton)
        spacerItem = QtWidgets.QSpacerItem(40, 20,
                                           QtWidgets.QSizePolicy.Expanding,
                                           QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.line = QtWidgets.QFrame(self.centralwidget)
        self.line.setStyleSheet("color: rgb(0, 0, 0);\n"
                                "background-color: rgb(255, 255, 255);")
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.verticalLayout.addWidget(self.line)
        self.resultWidget = QtWidgets.QListWidget(self.centralwidget)
        self.resultWidget.setVerticalScrollBarPolicy(
            QtCore.Qt.ScrollBarAlwaysOn)
        self.resultWidget.setObjectName("resultWidget")
        self.verticalLayout.addWidget(self.resultWidget)
        self.pieBox = QtWidgets.QFrame(self.centralwidget)
        self.pieBox.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.pieBox.setFrameShadow(QtWidgets.QFrame.Raised)
        self.pieBox.setObjectName("pieBox")
        self.verticalLayout.addWidget(self.pieBox)
        '''plot area'''
        plt.rcParams.update({'font.size': 14})
        # a figure instance to plot on
        self.figure = plt.figure(figsize=(2, 2), facecolor='#FFFFFF')
        # this is the Canvas Widget that displays the `figure`
        # it takes the `figure` instance as a parameter to __init__
        self.canvas = FigureCanvas(self.figure)
        self.canvas.setParent(self.pieBox)
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.canvas)
        self.pieBox.setLayout(layout)
        dict = {}
        mask = {}
        for url in output:
            b = url
            url = url.split('://')[-1].split("?")[0].split('/')[0].split(
                ':')[0].lower()
            mask[url] = b
            if url in dict.keys():
                dict[url] += 1
            else:
                dict[url] = 1
        sorted(dict)
        i = 1
        for item in list(dict.keys())[0:LEN]:
            form = QtWidgets.QWidget()
            a = QtWidgets.QListWidgetItem()
            ui = entry.Ui_Entry()
            ui.setupUi(form, "#" + str(i) + " - " + item, mask[item])
            a.setSizeHint(form.sizeHint())
            self.resultWidget.insertItem(-1, a)
            self.resultWidget.setItemWidget(a, form)
            i += 1

        def enum_list(lst):
            i = 1
            ans = []
            for it in lst:
                ans.append("No. " + str(i))
                i += 1
            return ans

        labels = enum_list(dict.keys())[0:LEN]
        print(type(dict.values()))
        sizes = list(dict.values())[0:LEN]
        self.figure.clear()
        ax = self.figure.add_subplot(111)
        plt.tight_layout()
        y_pos = [0] * len(labels)
        for i in range(0, len(labels)):
            y_pos[i] = i
        # plot data
        ax.bar(y_pos, sizes, align='center', alpha=0.5)
        ax.set_title('Hits by website')
        plt.xticks(y_pos, labels)
        plt.ylabel('Amount of matches')
        # refresh canvas
        self.canvas.draw()

        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(
            _translate("MainWindow", "Search result - " + self.res[0]))
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def setMain(self, Main):
        self.MainWindow = Main

    def setupUi(self):
        try:
            os.remove('cache.ch')
        except:
            pass
        MainWindow = self.MainWindow
        MainWindow.setObjectName("MainWindow")
        MainWindow.setWindowModality(QtCore.Qt.WindowModal)
        MainWindow.resize(871, 697)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("SEO_sign-512.png"), QtGui.QIcon.Normal,
                       QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        MainWindow.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setStyleSheet(
            "background-color: rgb(255, 255, 255);")
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setSpacing(0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setSpacing(0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setMinimumSize(QtCore.QSize(25, 0))
        self.frame.setStyleSheet("background-color: rgb(255, 255, 255);\n"
                                 "border-color: rgb(0, 0, 0);")
        self.frame.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.frame.setFrameShadow(QtWidgets.QFrame.Plain)
        self.frame.setLineWidth(0)
        self.frame.setObjectName("frame")
        self.horizontalLayout_2.addWidget(self.frame)
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setObjectName("verticalLayout")
        spacerItem = QtWidgets.QSpacerItem(20, 40,
                                           QtWidgets.QSizePolicy.Minimum,
                                           QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem)
        self.titleLbl = QtWidgets.QLabel(self.centralwidget)
        self.titleLbl.setStyleSheet("font: 26pt \"Tahoma\";\n"
                                    "color: rgb(0, 0, 0);")
        self.titleLbl.setObjectName("titleLbl")
        self.verticalLayout.addWidget(self.titleLbl)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setSpacing(0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.searchBarEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.searchBarEdit.setMinimumSize(QtCore.QSize(0, 40))
        self.searchBarEdit.setStyleSheet("font: 16pt \"Tahoma\";\n"
                                         "color: rgb(0, 0, 0);")
        self.searchBarEdit.setObjectName("searchBarEdit")
        self.horizontalLayout.addWidget(self.searchBarEdit)
        self.searchButton = QtWidgets.QPushButton(self.centralwidget)
        self.searchButton.setStyleSheet(
            "font: 16pt \"Tahoma\";\n"
            "background-color: rgb(255, 255, 255);\n"
            "color: rgb(0, 0, 0);")
        self.searchButton.setText("")
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("images.png"), QtGui.QIcon.Normal,
                        QtGui.QIcon.Off)
        self.searchButton.setIcon(icon1)
        self.searchButton.setIconSize(QtCore.QSize(40, 40))
        self.searchButton.setObjectName("searchButton")
        self.MainWindow = MainWindow
        self.searchButton.clicked.connect(self.search)
        self.horizontalLayout.addWidget(self.searchButton)
        self.verticalLayout.addLayout(self.horizontalLayout)

        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        spacerItem1 = QtWidgets.QSpacerItem(40, 20,
                                            QtWidgets.QSizePolicy.Expanding,
                                            QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem1)

        self.radioButton_3 = QtWidgets.QRadioButton(self.centralwidget)
        self.radioButton_3.setStyleSheet("font: 14pt \"Tahoma\";\n"
                                         "color: rgb(0, 0, 0);")
        self.radioButton_3.setObjectName("radioButton_3")
        self.horizontalLayout_3.addWidget(self.radioButton_3)

        self.radioButton_2 = QtWidgets.QRadioButton(self.centralwidget)
        self.radioButton_2.setStyleSheet("font: 14pt \"Tahoma\";\n"
                                         "color: rgb(0, 0, 0);")
        self.radioButton_2.setObjectName("radioButton_2")
        self.horizontalLayout_3.addWidget(self.radioButton_2)
        self.radioButton = QtWidgets.QRadioButton(self.centralwidget)
        self.radioButton.setStyleSheet("font: 14pt \"Tahoma\";\n"
                                       "color: rgb(0, 0, 0);")
        self.radioButton.setObjectName("radioButton")
        self.horizontalLayout_3.addWidget(self.radioButton)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20,
                                            QtWidgets.QSizePolicy.Expanding,
                                            QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem2)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        spacerItem3 = QtWidgets.QSpacerItem(20, 40,
                                            QtWidgets.QSizePolicy.Minimum,
                                            QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem3)
        self.horizontalLayout_2.addLayout(self.verticalLayout)
        self.verticalLayout_2.addLayout(self.horizontalLayout_2)

        spacerItem1 = QtWidgets.QSpacerItem(20, 40,
                                            QtWidgets.QSizePolicy.Minimum,
                                            QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem1)
        self.horizontalLayout_2.addLayout(self.verticalLayout)
        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.loading = QtWidgets.QLabel(self.centralwidget)
        self.loading.setText("")
        self.loading.setObjectName("loading")
        self.verticalLayout.addWidget(
            self.loading, 0, QtCore.Qt.AlignCenter | QtCore.Qt.AlignBottom)
        self.movie = QMovie("loading.gif", QByteArray(), self.loading)
        self.movie.setCacheMode(QMovie.CacheAll)
        self.movie.setSpeed(100)
        self.loading.setMovie(self.movie)
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Web Crawler"))
        self.titleLbl.setText(_translate("MainWindow", "Web Crawler"))
        self.radioButton_2.setText(_translate("MainWindow", "Web search"))
        self.radioButton.setText(_translate("MainWindow", "Site search"))

        self.srchBtn = QtWidgets.QPushButton(self.centralwidget)
        self.srchBtn.setMaximumSize(QtCore.QSize(250, 16777215))
        self.srchBtn.setStyleSheet("font: 16pt \"Tahoma\";")
        self.srchBtn.setObjectName("pushButton")
        self.srchBtn.clicked.connect(self.history)
        self.verticalLayout.addWidget(self.srchBtn, 0, QtCore.Qt.AlignHCenter)
        self.srchBtn.setText(_translate("MainWindow", "Search History"))
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def history(self):
        self.w = history.Ui_History()
        self.w.show()

    def search(self):
        self.movie.start()
        print(self.movie.state())
        self.sig.connect(self.setupresUi)
        self.t = Thread(self)
        self.t.start()
        self.MainWindow.show()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Web Crawler"))
        self.titleLbl.setText(_translate("MainWindow", "Web Crawler"))
        self.radioButton_3.setText(_translate("MainWindow", "DarkNet search"))
        self.radioButton_2.setText(_translate("MainWindow", "Web search"))
        self.radioButton.setText(_translate("MainWindow", "Site search"))

    def setresult(self, res):
        self.res = res
Exemple #11
0
class MoviePlayer(QWidget):
    def __init__(self, parent=None):
        super(MoviePlayer, self).__init__(parent)

        self.movie = QMovie(self)
        self.movie.setCacheMode(QMovie.CacheAll)

        self.movieLabel = QLabel("No movie loaded")
        self.movieLabel.setAlignment(Qt.AlignCenter)
        self.movieLabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.movieLabel.setBackgroundRole(QPalette.Dark)
        self.movieLabel.setAutoFillBackground(True)

        self.currentMovieDirectory = ''

        self.createControls()
        self.createButtons()

        self.movie.frameChanged.connect(self.updateFrameSlider)
        self.movie.stateChanged.connect(self.updateButtons)
        self.fitCheckBox.clicked.connect(self.fitToWindow)
        self.frameSlider.valueChanged.connect(self.goToFrame)
        self.speedSpinBox.valueChanged.connect(self.movie.setSpeed)

        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.movieLabel)
        mainLayout.addLayout(self.controlsLayout)
        mainLayout.addLayout(self.buttonsLayout)
        self.setLayout(mainLayout)

        self.updateFrameSlider()
        self.updateButtons()

        self.setWindowTitle("Movie Player")
        self.resize(400, 400)

    def open(self):
        fileName, _ = QFileDialog.getOpenFileName(self, "Open a Movie",
                self.currentMovieDirectory)

        if fileName:
            self.openFile(fileName)

    def openFile(self, fileName):
        self.currentMovieDirectory = QFileInfo(fileName).path()

        self.movie.stop()
        self.movieLabel.setMovie(self.movie)
        self.movie.setFileName(fileName)
        self.movie.start()

        self.updateFrameSlider();
        self.updateButtons();

    def goToFrame(self, frame):
        self.movie.jumpToFrame(frame)

    def fitToWindow(self):
        self.movieLabel.setScaledContents(self.fitCheckBox.isChecked())

    def updateFrameSlider(self):
        hasFrames = (self.movie.currentFrameNumber() >= 0)

        if hasFrames:
            if self.movie.frameCount() > 0:
                self.frameSlider.setMaximum(self.movie.frameCount() - 1)
            elif self.movie.currentFrameNumber() > self.frameSlider.maximum():
                self.frameSlider.setMaximum(self.movie.currentFrameNumber())

            self.frameSlider.setValue(self.movie.currentFrameNumber())
        else:
            self.frameSlider.setMaximum(0)

        self.frameLabel.setEnabled(hasFrames)
        self.frameSlider.setEnabled(hasFrames)

    def updateButtons(self):
        state = self.movie.state()

        self.playButton.setEnabled(self.movie.isValid() and
                self.movie.frameCount() != 1 and state == QMovie.NotRunning)
        self.pauseButton.setEnabled(state != QMovie.NotRunning)
        self.pauseButton.setChecked(state == QMovie.Paused)
        self.stopButton.setEnabled(state != QMovie.NotRunning)

    def createControls(self):
        self.fitCheckBox = QCheckBox("Fit to Window")

        self.frameLabel = QLabel("Current frame:")

        self.frameSlider = QSlider(Qt.Horizontal)
        self.frameSlider.setTickPosition(QSlider.TicksBelow)
        self.frameSlider.setTickInterval(10)

        speedLabel = QLabel("Speed:")

        self.speedSpinBox = QSpinBox()
        self.speedSpinBox.setRange(1, 9999)
        self.speedSpinBox.setValue(100)
        self.speedSpinBox.setSuffix("%")

        self.controlsLayout = QGridLayout()
        self.controlsLayout.addWidget(self.fitCheckBox, 0, 0, 1, 2)
        self.controlsLayout.addWidget(self.frameLabel, 1, 0)
        self.controlsLayout.addWidget(self.frameSlider, 1, 1, 1, 2)
        self.controlsLayout.addWidget(speedLabel, 2, 0)
        self.controlsLayout.addWidget(self.speedSpinBox, 2, 1)

    def createButtons(self):
        iconSize = QSize(36, 36)

        openButton = QToolButton()
        openButton.setIcon(self.style().standardIcon(QStyle.SP_DialogOpenButton))
        openButton.setIconSize(iconSize)
        openButton.setToolTip("Open File")
        openButton.clicked.connect(self.open)

        self.playButton = QToolButton()
        self.playButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPlay))
        self.playButton.setIconSize(iconSize)
        self.playButton.setToolTip("Play")
        self.playButton.clicked.connect(self.movie.start)

        self.pauseButton = QToolButton()
        self.pauseButton.setCheckable(True)
        self.pauseButton.setIcon(self.style().standardIcon(QStyle.SP_MediaPause))
        self.pauseButton.setIconSize(iconSize)
        self.pauseButton.setToolTip("Pause")
        self.pauseButton.clicked.connect(self.movie.setPaused)

        self.stopButton = QToolButton()
        self.stopButton.setIcon(self.style().standardIcon(QStyle.SP_MediaStop))
        self.stopButton.setIconSize(iconSize)
        self.stopButton.setToolTip("Stop")
        self.stopButton.clicked.connect(self.movie.stop)

        quitButton = QToolButton()
        quitButton.setIcon(self.style().standardIcon(QStyle.SP_DialogCloseButton))
        quitButton.setIconSize(iconSize)
        quitButton.setToolTip("Quit")
        quitButton.clicked.connect(self.close)

        self.buttonsLayout = QHBoxLayout()
        self.buttonsLayout.addStretch()
        self.buttonsLayout.addWidget(openButton)
        self.buttonsLayout.addWidget(self.playButton)
        self.buttonsLayout.addWidget(self.pauseButton)
        self.buttonsLayout.addWidget(self.stopButton)
        self.buttonsLayout.addWidget(quitButton)
        self.buttonsLayout.addStretch()
            "CREATE TABLE saveddata (username CHAR NOT NULL,acntname CHAR NOT NULL,usrname CHAR NOT NULL,passwd CHAR NOT NULL);"
        )
        dbcursor.execute(
            "CREATE TABLE user (username CHAR NOT NULL PRIMARY KEY,passwd CHAR NOT NULL,gender CHAR NOT NULL);"
        )
        dbroot.commit()
        dbroot.close()

    app = QtWidgets.QApplication(sys.argv)
    main_window = QtWidgets.QMainWindow()
    ui = Ui_main_window()
    movie = QMovie("resources/lock.gif")
    splash = MovieSplashScreen(movie)
    splash.show()
    start = time.time()
    while movie.state() == QMovie.Running and time.time() < start + 2:
        app.processEvents()

    #Function
    def setui():

        dbroot = sqlite3.connect(
            'file:C:/Users/Public/Passwordprotector/main.db?mode=rw', uri=True)
        dbcursor = dbroot.cursor()
        dbcursor.execute("SELECT username FROM user ;")
        result = dbcursor.fetchall()
        userselect_screen.userpassword_lineedit.clear()
        userselect_screen.userselect_combobox.clear()
        userselect_screen.userselect_combobox.addItem("")
        userselect_screen.userselect_combobox.setItemText(0, "SELECT USER")
Exemple #13
0
class Ui_MainWindow(QtCore.QObject):
    sig = QtCore.pyqtSignal()

    def setupresUi(self):
        print(threading.enumerate())
        output = self.res
        self.t.exit()
        MainWindow = self.MainWindow
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(861, 690)
        MainWindow.setStyleSheet("background-color: rgb(255,255,255);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.backButton = QtWidgets.QCommandLinkButton(self.centralwidget)
        self.backButton.setMinimumSize(QtCore.QSize(40, 40))
        self.backButton.setMaximumSize(QtCore.QSize(40, 40))
        self.backButton.setBaseSize(QtCore.QSize(40, 40))
        self.backButton.setText("")
        self.backButton.setIconSize(QtCore.QSize(40, 40))
        self.backButton.setCheckable(False)
        self.backButton.setObjectName("backButton")
        self.MainWindow = MainWindow
        self.backButton.clicked.connect(self.setupUi)
        self.horizontalLayout.addWidget(self.backButton)
        spacerItem = QtWidgets.QSpacerItem(40, 20,
                                           QtWidgets.QSizePolicy.Expanding,
                                           QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.line = QtWidgets.QFrame(self.centralwidget)
        self.line.setStyleSheet("color: rgb(0, 0, 0);\n"
                                "background-color: rgb(255, 255, 255);")
        self.line.setFrameShape(QtWidgets.QFrame.HLine)
        self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
        self.line.setObjectName("line")
        self.verticalLayout.addWidget(self.line)
        self.resultWidget = QtWidgets.QListWidget(self.centralwidget)
        self.resultWidget.setVerticalScrollBarPolicy(
            QtCore.Qt.ScrollBarAlwaysOn)
        self.resultWidget.setObjectName("resultWidget")
        for item in output:
            form = QtWidgets.QWidget()
            a = QtWidgets.QListWidgetItem()
            ui = entry.Ui_Entry()
            ui.setupUi(form, item)
            a.setSizeHint(form.sizeHint())
            self.resultWidget.insertItem(0, a)
            self.resultWidget.setItemWidget(a, form)
        self.verticalLayout.addWidget(self.resultWidget)
        self.pieBox = QtWidgets.QFrame(self.centralwidget)
        self.pieBox.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.pieBox.setFrameShadow(QtWidgets.QFrame.Raised)
        self.pieBox.setObjectName("pieBox")
        self.verticalLayout.addWidget(self.pieBox)
        '''plot area'''
        plt.rcParams.update({'font.size': 14})
        # a figure instance to plot on
        self.figure = plt.figure(figsize=(2, 2), facecolor='#696969')
        # this is the Canvas Widget that displays the `figure`
        # it takes the `figure` instance as a parameter to __init__
        self.canvas = FigureCanvas(self.figure)
        self.canvas.setParent(self.pieBox)
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.canvas)
        self.pieBox.setLayout(layout)
        dict = {}
        for url in output:
            url = url.split('://')[-1].split("?")[0].split('/')[0].split(
                ':')[0].lower()
            if url in dict.keys():
                dict[url] += 1
            else:
                dict[url] = 1
        print(dict)
        labels = dict.keys()
        sizes = dict.values()
        colors = ['#006FF6']
        explode = [0.05] * len(sizes)  # explode slices
        self.figure.clear()
        ax = self.figure.add_subplot(111)

        # plot data
        ax.pie(sizes,
               explode=explode,
               labels=labels,
               colors=colors,
               autopct='%1.1f%%',
               shadow=True,
               startangle=90)
        ax.set_title('precentage by website')

        # refresh canvas
        self.canvas.draw()

        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Web Crawler"))
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def setMain(self, Main):
        self.MainWindow = Main

    def setupUi(self):
        try:
            os.remove('cache.ch')
        except:
            pass
        MainWindow = self.MainWindow
        MainWindow.setObjectName("MainWindow")
        MainWindow.setWindowModality(QtCore.Qt.WindowModal)
        MainWindow.resize(871, 697)
        icon = QtGui.QIcon()
        icon.addPixmap(QtGui.QPixmap("SEO_sign-512.png"), QtGui.QIcon.Normal,
                       QtGui.QIcon.Off)
        MainWindow.setWindowIcon(icon)
        MainWindow.setStyleSheet("background-color: rgb(255, 255, 255);")
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setStyleSheet(
            "background-color: rgb(255, 255, 255);")
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout_2.setSpacing(0)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setSpacing(0)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.frame = QtWidgets.QFrame(self.centralwidget)
        self.frame.setMinimumSize(QtCore.QSize(25, 0))
        self.frame.setStyleSheet("background-color: rgb(255, 255, 255);\n"
                                 "border-color: rgb(0, 0, 0);")
        self.frame.setFrameShape(QtWidgets.QFrame.NoFrame)
        self.frame.setFrameShadow(QtWidgets.QFrame.Plain)
        self.frame.setLineWidth(0)
        self.frame.setObjectName("frame")
        self.horizontalLayout_2.addWidget(self.frame)
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setObjectName("verticalLayout")
        spacerItem = QtWidgets.QSpacerItem(20, 40,
                                           QtWidgets.QSizePolicy.Minimum,
                                           QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem)
        self.titleLbl = QtWidgets.QLabel(self.centralwidget)
        self.titleLbl.setStyleSheet("font: 26pt \"Tahoma\";\n"
                                    "color: rgb(0, 0, 0);")
        self.titleLbl.setObjectName("titleLbl")
        self.verticalLayout.addWidget(self.titleLbl)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setSpacing(0)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.searchBarEdit = QtWidgets.QLineEdit(self.centralwidget)
        self.searchBarEdit.setMinimumSize(QtCore.QSize(0, 40))
        self.searchBarEdit.setStyleSheet("font: 16pt \"Tahoma\";\n"
                                         "color: rgb(0, 0, 0);")
        self.searchBarEdit.setObjectName("searchBarEdit")
        self.horizontalLayout.addWidget(self.searchBarEdit)
        self.searchButton = QtWidgets.QPushButton(self.centralwidget)
        self.searchButton.setStyleSheet(
            "font: 16pt \"Tahoma\";\n"
            "background-color: rgb(255, 255, 255);\n"
            "color: rgb(0, 0, 0);")
        self.searchButton.setText("")
        icon1 = QtGui.QIcon()
        icon1.addPixmap(QtGui.QPixmap("images.png"), QtGui.QIcon.Normal,
                        QtGui.QIcon.Off)
        self.searchButton.setIcon(icon1)
        self.searchButton.setIconSize(QtCore.QSize(40, 40))
        self.searchButton.setObjectName("searchButton")
        self.MainWindow = MainWindow
        self.searchButton.clicked.connect(self.search)
        self.horizontalLayout.addWidget(self.searchButton)
        self.verticalLayout.addLayout(self.horizontalLayout)

        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        spacerItem1 = QtWidgets.QSpacerItem(40, 20,
                                            QtWidgets.QSizePolicy.Expanding,
                                            QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem1)
        self.radioButton_2 = QtWidgets.QRadioButton(self.centralwidget)
        self.radioButton_2.setStyleSheet("font: 14pt \"Tahoma\";\n"
                                         "color: rgb(0, 0, 0);")
        self.radioButton_2.setObjectName("radioButton_2")
        self.horizontalLayout_3.addWidget(self.radioButton_2)
        self.radioButton = QtWidgets.QRadioButton(self.centralwidget)
        self.radioButton.setStyleSheet("font: 14pt \"Tahoma\";\n"
                                       "color: rgb(0, 0, 0);")
        self.radioButton.setObjectName("radioButton")
        self.horizontalLayout_3.addWidget(self.radioButton)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20,
                                            QtWidgets.QSizePolicy.Expanding,
                                            QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem2)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        spacerItem3 = QtWidgets.QSpacerItem(20, 40,
                                            QtWidgets.QSizePolicy.Minimum,
                                            QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem3)
        self.horizontalLayout_2.addLayout(self.verticalLayout)
        self.verticalLayout_2.addLayout(self.horizontalLayout_2)

        spacerItem1 = QtWidgets.QSpacerItem(20, 40,
                                            QtWidgets.QSizePolicy.Minimum,
                                            QtWidgets.QSizePolicy.Expanding)
        self.verticalLayout.addItem(spacerItem1)
        self.horizontalLayout_2.addLayout(self.verticalLayout)
        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
        MainWindow.setCentralWidget(self.centralwidget)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)

        self.loading = QtWidgets.QLabel(self.centralwidget)
        self.loading.setText("")
        self.loading.setObjectName("loading")
        self.verticalLayout.addWidget(
            self.loading, 0, QtCore.Qt.AlignCenter | QtCore.Qt.AlignBottom)
        self.movie = QMovie("loading.gif", QByteArray(), self.loading)
        self.movie.setCacheMode(QMovie.CacheAll)
        self.movie.setSpeed(100)
        self.loading.setMovie(self.movie)
        self.retranslateUi(MainWindow)

        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def search(self):
        self.movie.start()
        print(self.movie.state())
        self.sig.connect(self.setupresUi)
        self.t = Thread(self)
        self.t.start()
        self.MainWindow.show()

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Web Crawler"))
        self.titleLbl.setText(_translate("MainWindow", "Web Crawler"))
        self.radioButton_2.setText(_translate("MainWindow", "Web search"))
        self.radioButton.setText(_translate("MainWindow", "Site search"))

    def setresult(self, res):
        self.res = res
Exemple #14
0
class Game(QMainWindow, Ui_MainWindow):
    # set window on screen center
    def center(self):
        frameGm = self.frameGeometry()
        screen = QtWidgets.QApplication.desktop().screenNumber(
            QtWidgets.QApplication.desktop().cursor().pos())
        centerPoint = QtWidgets.QApplication.desktop().screenGeometry(
            screen).center()
        frameGm.moveCenter(centerPoint)
        self.move(frameGm.topLeft())

    # move window by holding right mouse button
    def mousePressEvent(self, event):
        if event.buttons() == Qt.RightButton:
            self.oldPos = event.globalPos()

    def mouseMoveEvent(self, event):
        # print(delta)
        if event.buttons() == Qt.RightButton:
            delta = QPoint(event.globalPos() - self.oldPos)
            self.move(self.x() + delta.x(), self.y() + delta.y())
            self.oldPos = event.globalPos()

    def animateBackground(self):
        # Load the file into a QMovie
        self.movie = QMovie(APP_FOLDER + "/resources/images/clouds.gif",
                            QByteArray(), self)
        self.movie.setScaledSize(QSize(1020, 900))
        self.movie.setSpeed(70)
        proxy_style = RoundPixmapStyle(radius=20,
                                       style=self.lbBackground.style())
        self.lbBackground.setStyle(proxy_style)
        self.lbBackground.setMovie(self.movie)
        self.movie.start()

    def settings(self):
        settings = QSettings()
        return settings

    def __init__(self, parent=None):
        # Αρχικοποίηση του γραφικού περιβάλλοντος
        super(Game, self).__init__(parent)
        print(APP_FOLDER)
        self.setupUi(self)
        c.SCORE = self.settings().value("score", 0, type=int)
        # Μεταβλητές
        self.points = []
        self.speed = 30
        self.movie = None
        self.commands = {
            c.KEY_UP: logic.up,
            c.KEY_DOWN: logic.down,
            c.KEY_LEFT: logic.left,
            c.KEY_RIGHT: logic.right,
            c.KEY_UP_ALT: logic.up,
            c.KEY_DOWN_ALT: logic.down,
            c.KEY_LEFT_ALT: logic.left,
            c.KEY_RIGHT_ALT: logic.right,
            c.KEY_J: logic.left,
            c.KEY_L: logic.right,
            c.KEY_I: logic.up,
            c.KEY_K: logic.down
        }

        self.setWindowFlags(QtCore.Qt.CustomizeWindowHint
                            | QtCore.Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground, True)
        self.center()

        self.settings()
        self.restoreStates()

        self.fontDatabase = QFontDatabase()
        self.fontDatabase.addApplicationFont(
            APP_FOLDER + "/resources/fonts/JackportCollegeNcv-1MZe.ttf")
        self.fontDatabase.addApplicationFont(
            APP_FOLDER + "/resources/fonts/Rosemary-Bold.ttf")
        self.lScore.setFont(QFont("JACKPORT COLLEGE NCV", 40))
        self.lHiScore.setFont(QFont("JACKPORT COLLEGE NCV", 40))
        self.bExit.setFont(QFont("JACKPORT COLLEGE NCV", 32))
        self.lMediaSet.setFont(QFont("Rosemary", 38))
        swipeCurImg = QPixmap(APP_FOLDER + "/resources/images/swipeCursor.png")
        handCurImg = QPixmap(APP_FOLDER + "/resources/images/handCursor.png")
        self.cursors = [handCurImg, swipeCurImg]
        self.centralwidget.setCursor(QCursor(self.cursors[0], 15, 2))
        self.frame.setCursor(QCursor(self.cursors[1], 35, 35))
        self.frame.setAttribute(Qt.WA_StyledBackground, (True))
        self.animateBackground()
        self.musIcon()
        self.sndIcon()
        self.playMusic()

        self.init_grid()
        self.matrix = logic.new_game(c.GRID_LEN)
        self.history_matrixs = []
        self.update_grid_cells()
        self.restoreGame()

        # Αντιστοίχιση ενεργειών κίνησης ποντικιού και κλικ
        self.bHelp.clicked.connect(self.bHelpClicked)
        self.bAnim.clicked.connect(self.animStartStop)
        self.sndslider.valueChanged.connect(self.sndslvalchanged)
        self.musslider.valueChanged.connect(self.musslvalchanged)
        self.frame.installEventFilter(self)

    # Μέθοδος ενεργοποίησης/απενεργοποίησης του κινούμενου bakcground
    def animStartStop(self):
        if self.movie != None and self.movie.state() == QMovie.Running:
            self.movie.stop()
            self.bAnim.setStyleSheet(
                "QPushButton{\n"
                "border-image: url(:/resources/images/anim_off.png)\n"
                "}")
        else:
            self.animateBackground()
            self.bAnim.setStyleSheet(
                "QPushButton{\n"
                "border-image: url(:/resources/images/anim_on.png)\n"
                "}")

    # Σχεδίαση του βασικού πλαισίου
    def init_grid(self):
        for i in range(c.GRID_LEN):
            for j in range(c.GRID_LEN):
                self.gridBoard.addWidget(self.setTile("empty"), i, j)

    def generate_next(self):
        index = (gen(), gen())
        while self.matrix[index[0]][index[1]] != 0:
            index = (gen(), gen())
        self.matrix[index[0]][index[1]] = 2

    def update_grid_cells(self):
        for i in range(c.GRID_LEN):
            for j in range(c.GRID_LEN):
                new_number = self.matrix[i][j]
                if new_number == 0:
                    self.replaceTile("empty", i, j)
                else:
                    self.replaceTile(new_number, i, j)

    # Δημιουργία των αριθμητικών πλακιδίων
    def setTile(self, item):
        tile = QLabel('')
        tile.setFocusPolicy(Qt.NoFocus)
        tile.setFixedWidth(135)
        tile.setFixedHeight(140)
        path = c.CELL_IMAGE_DICT.get(item)
        tile.setStyleSheet("QLabel{\n"
                           "border-image: url(:" + str(path) + ")\n"
                           "}")
        tile.setObjectName(str(item))
        return tile

    # Μέθοδος αντικατάστασης πλακιδίου
    def replaceTile(self, newTile, pX, pY):
        item = self.gridBoard.itemAtPosition(pX, pY)
        self.gridBoard.removeWidget(item.widget())
        self.gridBoard.addWidget(self.setTile(newTile), pX, pY)

    # Ενεργοποίηση των πλήκτρων χειρισμού
    def keyPressEvent(self, event):
        key = event.key()
        modifiers = QtWidgets.QApplication.keyboardModifiers()
        if modifiers == QtCore.Qt.ControlModifier:
            if key == QtCore.Qt.Key_Home:
                # print("is up!")
                if self.frameGeometry().y() > 0:
                    self.move(self.frameGeometry().x(),
                              self.frameGeometry().y() - self.speed)
            elif key == QtCore.Qt.Key_End:
                # print("is down!")
                if self.frameGeometry().y() > 0:
                    self.move(self.frameGeometry().x(),
                              self.frameGeometry().y() + self.speed)
            elif key == QtCore.Qt.Key_Delete:
                # print("is left!")
                if self.frameGeometry().x() > 0:
                    self.move(self.frameGeometry().x() - self.speed,
                              self.frameGeometry().y())
            elif key == QtCore.Qt.Key_PageDown:
                # print("is right!")
                if self.frameGeometry().x() > 0:
                    self.move(self.frameGeometry().x() + self.speed,
                              self.frameGeometry().y())
        if key == c.KEY_BACK or key == c.KEY_BACK_ALT:
            if len(self.history_matrixs) > 1:
                self.matrix = self.history_matrixs.pop()
                self.update_grid_cells()
                #print('back on step total step:', len(self.history_matrixs))
        # Έλεγχος Αν το παιχνίδι τελείωσε και αν έχει κερδηθεί ή χαθεί
        elif key in self.commands:
            self.frame.setCursor(Qt.BlankCursor)
            self.matrix, done = self.commands[key](self.matrix)
            if done:
                self.stateOfGame()

    def stateOfGame(self):
        self.playSound(APP_FOLDER + c.SOUNDS_DICT["move"])
        self.matrix = logic.add_two(self.matrix)
        # record last move
        self.history_matrixs.append(self.matrix)
        #print(self.history_matrixs[-1])
        self.update_grid_cells()
        if logic.game_state(self.matrix) == 'win':
            if logic.winNum != 65535:
                print("num: " + str(logic.winNum))
                for key, value in c.SOUNDS_DICT.items():
                    if key == str(logic.winNum):
                        self.playSound(APP_FOLDER + value)
                winLooseDlg.WinLooseDialog(self).dialogTypes("WIN")
                print("Κερδίσες")
            else:
                winLooseDlg.WinLooseDialog(self).dialogTypes("ENDGAME")
        if logic.game_state(self.matrix) == 'lose':
            self.playSound(APP_FOLDER + c.SOUNDS_DICT["lose"])
            winLooseDlg.WinLooseDialog(self).dialogTypes("LOOSE")
            print("Έχασες")
        self.lScore.setText(str(c.SCORE))
        if int(self.lHiScore.text()) < int(self.lScore.text()):
            self.lHiScore.setText(self.lScore.text())

    # Μέθοδος για χειρσμό με κλικ και σύρσιμο του ποντικιού
    def eventFilter(self, source, event):
        if event.type() == QtCore.QEvent.MouseMove:
            self.frame.setCursor(QCursor(self.cursors[1], 35, 35))
            if event.buttons() == QtCore.Qt.LeftButton:

                if len(self.points) > 2:
                    startx, starty = self.points[0][0], self.points[0][1]
                    for i in range(len(self.points)):
                        self.points[i] = (self.points[i][0] - startx,
                                          self.points[i][1] - starty)
                self.points.append(
                    (event.localPos().x(), event.localPos().y()))
                # print(self.points)
        if event.type() == QtCore.QEvent.MouseButtonRelease and event.button(
        ) == QtCore.Qt.LeftButton:
            # print("Released!")
            self.mouseDown = False
            strokes = moosegesture.getGesture(self.points)
            if len(strokes) > 0:
                strokeText = str(strokes[-1])
                # print(strokeText)
                if strokeText == "R":
                    self.matrix, done = logic.right(self.matrix)
                    if done:
                        self.stateOfGame()
                elif strokeText == "L":
                    self.matrix, done = logic.left(self.matrix)
                    if done:
                        self.stateOfGame()
                elif strokeText == "U":
                    self.matrix, done = logic.up(self.matrix)
                    if done:
                        self.stateOfGame()
                elif strokeText == "D":
                    self.matrix, done = logic.down(self.matrix)
                    if done:
                        self.stateOfGame()
            strokes.clear()
        else:
            return True

        return self.frame.eventFilter(source, event)

    # Μέθοδος για την αναπαραγωγή των ήχων
    def playSound(self, sound):
        pygame.mixer.pre_init(frequency=44100,
                              size=-16,
                              channels=3,
                              buffer=512)
        pygame.mixer.init()
        effect = pygame.mixer.Sound(sound)
        self.sndslider.setMinimum(0)
        self.sndslider.setMaximum(100)
        vol = self.sndslider.value()
        effect.set_volume(vol / 100)
        pygame.mixer.find_channel().play(effect)

    # Έλεγχος για αλλαγές στο εικονίδιο ήχου
    def sndslvalchanged(self):
        self.sndIcon()

    # Αλλαγή του εικονιδίου ήχου
    def sndIcon(self):
        if self.sndslider.value() == 0:
            self.lSound.setStyleSheet(
                "QLabel{\n"
                "border-image: url(:/resources/images/sound_off.png)\n"
                "}")
        else:
            self.lSound.setStyleSheet(
                "QLabel{\n"
                "border-image: url(:/resources/images/sound_on.png)\n"
                "}")

    # Μέθοδος για την αnaπαραγωγή μουσικής
    def playMusic(self):
        pygame.mixer.init(frequency=44100, size=-16, channels=1, buffer=512)
        pygame.mixer.music.load(
            os.path.join(APP_FOLDER, "resources/sounds/backmusic.ogg"))
        self.musslider.setMinimum(0)
        self.musslider.setMaximum(100)
        musvol = self.musslider.value()
        pygame.mixer.music.set_volume(musvol / 100)
        pygame.mixer.music.play(loops=-1)
        self.musslider.valueChanged.connect(self.musslvalchanged)

    def musslvalchanged(self):
        pygame.mixer.music.pause()
        pygame.mixer.music.set_volume(self.musslider.value() / 100)
        pygame.mixer.music.unpause()
        self.musIcon()

    def musIcon(self):
        if self.musslider.value() == 0:
            self.lMusic.setStyleSheet(
                "QLabel{\n"
                "border-image: url(:/resources/images/music_off.png)\n"
                "}")
        else:
            self.lMusic.setStyleSheet(
                "QLabel{\n"
                "border-image: url(:/resources/images/music_on.png)\n"
                "}")

    def chkGrid(self):
        if len(self.history_matrixs) != 0:
            lst = self.history_matrixs[-1]
        else:
            lst = self.settings().value("gameState")
        nums = []
        for i in range(len(lst)):
            for j in range(len(lst[0])):
                if lst[i][j] != 0:
                    nums.append(lst[i][j])
        print(nums)
        return nums

    def bHelpClicked(self):
        helpDlg.HelpDialog(self).exec()

    pyqtSlot()

    def on_bPlay_clicked(self):
        self.gridBoard.blockSignals(False)
        self.init_grid()
        c.SCORE = 0
        self.lScore.setText(str(c.SCORE))
        self.matrix = logic.new_game(c.GRID_LEN)
        self.history_matrixs = []
        self.update_grid_cells()

    pyqtSlot()

    def on_bExit_clicked(self):
        self.saveStates()
        self.movie.jumpToFrame(100)
        if len(self.chkGrid()) > 2:
            winLooseDlg.WinLooseDialog(self).dialogTypes("SAVEGAME")
        sys.exit()

    # αποθήκευση τιμών της εφαρμογής
    def saveStates(self):
        self.settings().setValue("slidervalue", self.sndslider.value())
        self.settings().setValue("sliderMvalue", self.musslider.value())
        self.settings().setValue("HighScore", self.lHiScore.text())
        self.settings().setValue("geometry", self.saveGeometry())
        self.settings().setValue("windowState", self.saveState())
        self.settings().sync()

    # Επαναφορά αποθηκευμένων τιμών από το preferencies.ini
    def restoreStates(self):
        self.sndslider.setValue(self.settings().value("slidervalue",
                                                      40,
                                                      type=int))
        self.musslider.setValue(self.settings().value("sliderMvalue",
                                                      50,
                                                      type=int))
        self.lHiScore.setText(self.settings().value("HighScore", "0"))
        if not self.settings().value("geometry") == None:
            self.restoreGeometry(self.settings().value("geometry"))
        if not self.settings().value("windowState") == None:
            self.restoreState(self.settings().value("windowState"))

    def saveGame(self):
        if len(self.history_matrixs) != 0:
            self.settings().setValue("gameState", self.history_matrixs[-1])
        self.settings().setValue("score", self.lScore.text())

    def restoreGame(self):
        self.matrix = self.settings().value("gameState",
                                            logic.new_game(c.GRID_LEN))
        maxNum = np.max(self.matrix)
        if logic.winNum < (maxNum):
            logic.winNum = maxNum * 2
        print(logic.winNum)
        self.update_grid_cells()
        self.lScore.setText(self.settings().value("score", "0"))

    def closeEvent(self, e):
        self.saveStates()
Exemple #15
0
class ClipboardItemButton(PopupToolButton):
    """
    Represents a ClipboardItem in the clipboard stack
    """

    def __init__(self, rscOpener, clipItem=None, parent=None):
        super().__init__(mode=QToolButton.InstantPopup, parent=parent)

        self._item = None
        self._animatedOnce = False
        self.app = QApplication.instance()
        self.setObjectName('currentClipItem')
        self.setIcon(getMimeIcon('unknown'))
        self.setIconSize(QSize(32, 32))
        self.setToolTip(iClipboardNoValidAddress())
        self.setEnabled(False)
        self.rscOpener = rscOpener
        self.loadingClip = QMovie(':/share/clips/loading.gif')
        self.loadingClip.finished.connect(
            functools.partial(self.loadingClip.start))
        self.menu.setToolTipsVisible(True)

        if isinstance(clipItem, ClipboardItem):
            self.setClipboardItem(clipItem)

        self.clicked.connect(self.onOpen)

        self.setAsHomeAction = QAction(getIcon('go-home.png'),
                                       iClipItemSetAsHome(), self,
                                       triggered=self.onSetAsHome)

        self.hashmarkAction = QAction(getIcon('hashmarks.png'),
                                      iHashmark(), self,
                                      triggered=self.onHashmark)

        self.openAction = QAction(getIcon('terminal.png'),
                                  iClipItemOpen(), self,
                                  shortcut=QKeySequence('Ctrl+o'),
                                  triggered=self.onOpen)

        self.openWithAppAction = QAction(getIcon('terminal.png'),
                                         iClipItemOpenWithApp(), self,
                                         triggered=self.onOpenWithProgram)

        self.openWithDefaultAction = QAction(
            getIcon('terminal.png'),
            iClipItemOpenWithDefaultApp(),
            self,
            triggered=self.onOpenWithDefaultApp)

        self.exploreHashAction = QAction(
            getIcon('folder-open.png'),
            iClipboardEmpty(), self,
            shortcut=QKeySequence('Ctrl+e'),
            triggered=self.onExplore)

        self.downloadAction = QAction(
            getIcon('download.png'),
            iClipboardEmpty(), self,
            triggered=self.onDownload)

        self.dagViewAction = QAction(
            getIcon('ipld-logo.png'),
            iClipboardEmpty(), self,
            shortcut=QKeySequence('Ctrl+g'),
            triggered=self.onDagView)

        self.ipldExplorerAction = QAction(
            getIcon('ipld-logo.png'),
            iClipboardEmpty(), self,
            shortcut=QKeySequence('Ctrl+i'),
            triggered=partialEnsure(self.onIpldExplore))

        self.editObjectAction = QAction(
            getMimeIcon('text/plain'),
            iClipboardEmpty(), self,
            triggered=self.onTextEdit)

        self.followFeedAction = QAction(
            getIcon('atom-feed.png'),
            iClipItemSubscribeToFeed(), self,
            triggered=self.onFollowFeed)

        self.pinAction = QAction(
            getIcon('pin.png'),
            iClipboardEmpty(), self,
            shortcut=QKeySequence('Ctrl+p'),
            triggered=self.onPin)

        self.copyPathToCbAction = QAction(
            getIcon('clipboard.png'),
            iClipboardEmpty(), self,
            triggered=self.onCopyPathToClipboard
        )

        self.copyGwPathToCbAction = QAction(
            getIcon('clipboard.png'),
            iClipboardEmpty(), self,
            triggered=self.onCopyGwPathToClipboard
        )

        self.geoAnimation = QPropertyAnimation(self, b'geometry')

    @property
    def item(self):
        return self._item

    def setClipboardItem(self, item):
        self.setEnabled(True)
        self._item = item

        self.setToolTip(item.path)

        if item.mimeIcon:
            # Already set icon from mimetype
            self.setIcon(item.mimeIcon)
            ensure(self.updateButton())
        else:
            # MIME type undetected yet (fresh item)
            disconnectSig(self.loadingClip.frameChanged, self.onLoadingFrame)
            self.loadingClip.frameChanged.connect(self.onLoadingFrame)
            self.loadingClip.start()
            item.mimeTypeDetected.connect(self.mimeDetected)

    def onLoadingFrame(self, num):
        if self.isVisible():
            self.setIcon(QIcon(self.loadingClip.currentPixmap()))

    def onHashmark(self):
        if self.item:
            ensure(addHashmarkAsync(self.item.fullPath, self.item.basename))

    def onSetAsHome(self):
        self.app.settingsMgr.setSetting(CFG_SECTION_BROWSER, CFG_KEY_HOMEURL,
                                        self.item.ipfsPath.ipfsUrl)

    def onCopyPathToClipboard(self):
        self.app.setClipboardText(str(self.item.ipfsPath))

    def onCopyGwPathToClipboard(self):
        self.app.setClipboardText(self.item.ipfsPath.publicGwUrl)

    def onOpenWithProgram(self):
        self.openWithProgram()

    def openWithProgram(self, command=None):
        def onAccept(dlg):
            prgValue = dlg.textValue()
            if len(prgValue) in range(1, 512):
                ensure(self.rscOpener.openWithExternal(
                    self.item.cid, prgValue))

        runDialog(ChooseProgramDialog, cmd=command, accepted=onAccept)

    def onOpenWithDefaultApp(self):
        if self.item.cid:
            ensure(self.rscOpener.openWithSystemDefault(self.item.cid))

    def mimeDetected(self, mType):
        if self.loadingClip.state() == QMovie.Running:
            self.loadingClip.stop()
        ensure(self.updateButton())

    def tooltipMessage(self):
        statInfo = StatInfo(self.item.stat)
        message = '{path} (type: {mimetype})'.format(
            path=self.item.fullPath,
            mimetype=str(self.item.mimeType) if self.item.mimeType else
            iUnknown()
        )
        if statInfo.valid:
            if self.item.mimeType and self.item.mimeType.isDir:
                message += '\n\nTotal size: {total}, links: {links}'.format(
                    total=sizeFormat(statInfo.totalSize),
                    links=statInfo.numLinks
                )
            else:
                message += '\n\nTotal size: {total}'.format(
                    total=sizeFormat(statInfo.totalSize)
                )
        else:
            message += '\n\nNo information on object'
        return message

    @ipfsOp
    async def updateButton(self, ipfsop):
        if not isinstance(self.item, ClipboardItem):
            return

        if self.item.path is None:
            log.debug('Empty path')
            return

        shortened = shortPathRepr(self.item.path)

        self.menu.clear()

        action = self.menu.addSection(shortened)
        action.setToolTip(self.item.fullPath)
        self.menu.addSeparator()

        self.menu.addAction(self.openAction)
        self.menu.addAction(self.openWithAppAction)
        self.menu.addAction(self.openWithDefaultAction)
        self.menu.addSeparator()
        self.menu.addAction(self.setAsHomeAction)
        self.menu.addAction(self.hashmarkAction)
        self.menu.addAction(self.downloadAction)
        self.menu.addSeparator()
        self.menu.addAction(self.dagViewAction)
        self.menu.addAction(self.ipldExplorerAction)
        self.menu.addSeparator()
        self.menu.addAction(self.pinAction)

        self.exploreHashAction.setText(iClipItemExplore())
        self.openAction.setText(iClipItemOpen())
        self.dagViewAction.setText(iClipItemDagView())
        self.hashmarkAction.setText(iClipItemHashmark())
        self.downloadAction.setText(iClipItemDownload())
        self.ipldExplorerAction.setText(iClipItemIpldExplorer())
        self.editObjectAction.setText(iEditObject())
        self.pinAction.setText(iClipItemPin())
        self.copyPathToCbAction.setText(iCopyPathToClipboard())
        self.copyGwPathToCbAction.setText(iCopyPubGwUrlToClipboard())

        self.setToolTip(self.tooltipMessage())

        if not self.item.mimeType:
            return self.updateIcon(getMimeIcon('unknown'))

        icon = None

        if self.item.mimeType.isDir:
            # It's a directory. Add the explore action and disable
            # the actions that don't apply to a folder
            self.menu.addAction(self.exploreHashAction)
            self.openWithAppAction.setEnabled(False)
            self.openWithDefaultAction.setEnabled(False)

            # Look for a favicon
            icon = await getFavIconFromDir(ipfsop, self.item.ipfsPath)
            if icon:
                return self.updateIcon(icon)

            self.menu.addSeparator()
            self.menu.addAction(self.editObjectAction)

        elif self.item.mimeType.isText:
            self.menu.addSeparator()
            self.menu.addAction(self.editObjectAction)

        elif self.item.mimeType.isImage:
            self.updateIcon(getMimeIcon('image/x-generic'), animate=False)
            ensure(self.analyzeImage())

        elif self.item.mimeType.isAtomFeed:
            # We have an atom!
            self.menu.addSeparator()
            self.menu.addAction(self.followFeedAction)

        mIcon = getIconFromMimeType(self.item.mimeType)

        if mIcon:
            self.updateIcon(mIcon)

        self.menu.addSeparator()
        self.menu.addAction(self.copyPathToCbAction)
        self.menu.addAction(self.copyGwPathToCbAction)
        self.menu.addSeparator()

        self.mfsMenu = ipfsop.ctx.currentProfile.createMfsMenu(
            title=iLinkToMfsFolder(), parent=self)
        self.mfsMenu.triggered.connect(self.onCopyToMfs)
        self.menu.addSeparator()
        self.menu.addMenu(self.mfsMenu)

        if self.item.mimeType in [mimeTypeDagUnknown, mimeTypeDagPb]:
            self.updateIcon(getIcon('ipld.png'))
            self.downloadAction.setEnabled(False)
            self.mfsMenu.setEnabled(False)

    def onCopyToMfs(self, action):
        ensure(self.copyToMfs(action.data()))

    @ipfsOp
    async def copyToMfs(self, ipfsop, mfsItem):
        dest = os.path.join(mfsItem.path, self.item.ipfsPath.basename)

        try:
            await ipfsop.client.files.cp(
                self.item.path,
                dest
            )
        except aioipfs.APIError:
            # TODO
            pass

    def updateIcon(self, icon, animate=True):
        self.item.mimeIcon = icon
        self.setIcon(icon)

        if animate and not self._animatedOnce:
            self.animate()
            self._animatedOnce = True

    def animate(self):
        # Geometry animation

        self.geoAnimation.stop()
        size = self.size()
        self.geoAnimation.setDuration(1700)
        self.geoAnimation.setKeyValueAt(
            0, QRect(0, 0, size.width() / 4, size.height() / 4))
        self.geoAnimation.setKeyValueAt(
            0.4, QRect(0, 0, size.width() / 3, size.height() / 3))
        self.geoAnimation.setKeyValueAt(
            0.8, QRect(0, 0, size.width() / 2, size.height() / 2))
        self.geoAnimation.setKeyValueAt(
            1, QRect(0, 0, size.width(), size.height()))
        self.geoAnimation.setEasingCurve(QEasingCurve.OutElastic)
        self.geoAnimation.start()

    @ipfsOp
    async def analyzeFeed(self, ipfsop):
        statInfo = StatInfo(self.item.stat)

        if statInfo.valid and not statInfo.dataLargerThan(megabytes(4)):
            pass

    @ipfsOp
    async def analyzeImage(self, ipfsop):
        statInfo = StatInfo(self.item.stat)

        if statInfo.valid:
            size = statInfo.dataSize

            if isinstance(size, int):
                # don't scan anything larger than 4Mb
                if statInfo.dataLargerThan(megabytes(4)):
                    log.debug('{path}: Image too large, not scanning')
                    return
        else:
            # Don't trust this one
            log.debug('No object info for image, bailing out')
            return

        try:
            data = await ipfsop.catObject(self.item.path)

            if data is None:
                return

            icon = getIconFromImageData(data)
            if icon:
                self.updateIcon(icon)

            # Decode the QR codes in the image if there's any
            qrDecoder = IPFSQrDecoder()
            if not qrDecoder:
                return

            urls = qrDecoder.decode(data)
            if isinstance(urls, list):
                # Display the QR codes in a separate menu
                menu = qrCodesMenuBuilder(urls, self.app.resourceOpener,
                                          parent=self)
                self.menu.addSeparator()
                self.menu.addMenu(menu)

        except aioipfs.APIError:
            pass

    def onOpen(self):
        if self.item:
            if self.item.mimeType.isWasm and shutil.which('wasmer') and \
                    self.app.system == 'Linux':
                # Run with wasmer
                log.debug('Opening WASM binary from object: {}'.format(
                    self.item.ipfsPath))
                return self.openWithProgram(
                    'xterm -e "wasmer run %f --; '
                    'echo WASM program exited with code $?; read e"')

            ensure(self.rscOpener.open(
                self.item.ipfsPath,
                mimeType=self.item.mimeType,
                openingFrom='clipboardmgr'
            ))

    def onExplore(self):
        if self.item and self.item.cid:
            self.app.mainWindow.explore(self.item.cid)

    def onDagView(self):
        if self.item:
            view = dag.DAGViewer(self.item.path, self.app.mainWindow)
            self.app.mainWindow.registerTab(
                view, iDagViewer(),
                current=True,
                icon=getIcon('ipld.png'),
                tooltip=self.item.path
            )
        else:
            messageBox(iClipboardEmpty())

    def onFollowFeed(self):
        ensure(self.app.mainWindow.atomButton.atomFeedSubscribe(
            self.item.path))

    async def onIpldExplore(self, *args):
        """
        Open the IPLD explorer application for the current clipboard item
        """
        if not self.item:
            return

        mark = await database.hashmarksByObjTagLatest('#dapp-ipldexplorer')
        if mark:
            link = os.path.join(
                mark.path, '#', 'explore', stripIpfs(self.item.path))
            self.app.mainWindow.addBrowserTab().browseFsPath(link)
        else:
            messageBox('IPLD explorer hashmark not found')

    def onTextEdit(self):
        if self.item:
            ensure(self.rscOpener.open(
                self.item.ipfsPath,
                mimeType=self.item.mimeType,
                editObject=True,
                openingFrom='clipboardmgr'
            ))

    def onPin(self):
        if self.item:
            ensure(self.app.ipfsCtx.pin(self.item.path, True, None,
                                        qname='clipboard'))

    def onDownload(self):
        if self.item:
            ensure(self.downloadItem(self.item))

    @ipfsOp
    async def downloadItem(self, ipfsop, item):
        toolbarMain = self.app.mainWindow.toolbarMain
        button = DownloadProgressButton(item.path, item.stat,
                                        parent=self)
        button.show()

        action = toolbarMain.insertWidget(
            toolbarMain.actionStatuses, button)

        button.task = self.app.ipfsTaskOp(self.downloadItemTask,
                                          item, button, action)
        button.cancelled.connect(lambda: toolbarMain.removeAction(action))
        button.downloadFinished.connect(
            lambda: toolbarMain.removeAction(action))

    async def downloadItemTask(self, ipfsop, item, progButton, action):
        downloadsDir = self.app.settingsMgr.downloadsDir

        async def progress(path, read, progButton):
            if divmod(read, 64)[1] == 0:
                progButton.downloadProgress.emit(read)

        try:
            await ipfsop.client.get(
                item.path, dstdir=downloadsDir,
                chunk_size=262144,
                progress_callback=progress,
                progress_callback_arg=progButton)
        except aioipfs.APIError:
            pass
        else:
            progButton.downloadFinished.emit()