Esempio n. 1
0
class RecordWall(QWidget):
    def __init__(self, parent=None, session=None, token=None):
        QWidget.__init__(self, parent)
        self.pixmap = QtGui.QPixmap()
        self.sizeMonitor = QApplication.desktop().availableGeometry()
        self.setGeometry(0, 0, (2 * self.sizeMonitor.width()) / 3,
                         self.sizeMonitor.height())
        self.session = session
        self.token = token
        self.post_id = 0

        self.ui()

        self.delButton.clicked.connect(self.deletePost)

    def ui(self):
        self.nameLayout = QHBoxLayout()
        self.icon = QLabel()
        self.textName = QLabel()
        self.postSource = QLabel()
        self.delButton = QPushButton('Del')
        self.nameLayout.addWidget(self.icon, 0, Qt.AlignLeft)
        self.nameLayout.addWidget(self.textName, 1, Qt.AlignLeft)
        self.nameLayout.addWidget(self.postSource, 2, Qt.AlignLeft)
        self.nameLayout.addWidget(self.delButton, 3, Qt.AlignRight)

        self.dateLayout = QHBoxLayout()
        self.date = QLabel()
        self.dateLayout.addWidget(self.date)

        self.textLayout = QHBoxLayout()
        self.text = QLabel()
        self.textLayout.addWidget(self.text)

        self.attachmentsLayout = QHBoxLayout()

        self.repostLayout = QVBoxLayout()

        self.line = QFrame()
        self.line.setFrameShape(QFrame.HLine)
        self.line.setFrameShadow(QFrame.Sunken)

        self.infoWidget = QWidget()
        self.infoLayout = QHBoxLayout()
        self.like = QLabel()
        self.pixmap.load(MyData.CWD + '/src/like.png')
        myPixmap = self.pixmap.scaled(20, 20, Qt.KeepAspectRatio,
                                      Qt.FastTransformation)
        self.like.setPixmap(myPixmap)
        self.countLike = QLabel()
        self.repost = QLabel()
        self.pixmap.load(MyData.CWD + '/src/repost.png')
        myPixmap = self.pixmap.scaled(16, 16, Qt.KeepAspectRatio,
                                      Qt.FastTransformation)
        self.repost.setPixmap(myPixmap)
        self.countRepost = QLabel()
        self.views = QLabel()
        self.pixmap.load(MyData.CWD + '/src/eye.png')
        myPixmap = self.pixmap.scaled(20, 20, Qt.KeepAspectRatio,
                                      Qt.FastTransformation)
        self.views.setPixmap(myPixmap)
        self.countViews = QLabel()
        self.infoLayout.addWidget(self.like, alignment=Qt.AlignLeft)
        self.infoLayout.addWidget(self.countLike, alignment=Qt.AlignRight)
        self.infoLayout.addWidget(self.repost, alignment=Qt.AlignLeft)
        self.infoLayout.addWidget(self.countRepost, alignment=Qt.AlignLeft)
        self.infoLayout.addWidget(self.views, alignment=Qt.AlignRight)
        self.infoLayout.addWidget(self.countViews, alignment=Qt.AlignRight)
        self.infoWidget.setLayout(self.infoLayout)
        self.infoWidget.setMaximumWidth(
            self.infoLayout.totalSizeHint().width() + 50)

        self.allQVBoxLayout = QVBoxLayout()
        self.allQVBoxLayout.addLayout(self.nameLayout)
        self.allQVBoxLayout.addLayout(self.dateLayout)
        self.allQVBoxLayout.addLayout(self.textLayout)
        self.allQVBoxLayout.addLayout(self.attachmentsLayout)
        self.allQVBoxLayout.addLayout(self.repostLayout)
        self.allQVBoxLayout.addWidget(self.line)
        self.allQVBoxLayout.addWidget(self.infoWidget)

        self.frame = QFrame()
        self.frame.setFrameShape(QFrame.Panel)
        self.frame.setFrameShadow(QFrame.Raised)
        self.frame.setLayout(self.allQVBoxLayout)

        self.mainLayout = QVBoxLayout()
        self.mainLayout.addWidget(self.frame)

        self.setLayout(self.mainLayout)

        self.textName.setStyleSheet('''color: rgb(60,  50,  130);''')
        self.postSource.setStyleSheet('''color: rgb(170, 170, 170);''')
        self.date.setStyleSheet('''color: rgb(130, 130, 130);''')
        self.frame.setStyleSheet('''background-color:rgb(255, 255, 255);''')

    def setNameLayout(self, name, lastName, image):
        self.textName.setText(name + ' ' + lastName)

        if type(image) == str:
            self.pixmap.load(image)
            myPixmap = self.pixmap.scaled(32, 32, Qt.KeepAspectRatio,
                                          Qt.FastTransformation)
            self.icon.setPixmap(myPixmap)
        elif type(image) == bytes:
            self.pixmap.loadFromData(image)
            myPixmap = self.pixmap.scaled(32, 32, Qt.KeepAspectRatio,
                                          Qt.FastTransformation)
            self.icon.setPixmap(myPixmap)

    def setPostSource(self, postSource):
        if postSource == 'profile_photo':
            self.postSource.setText('Обновил фотографию на странице')
        elif postSource == 'profile_activity':
            self.postSource.setText('Изменен статус')
        elif postSource == 'pinned':
            self.postSource.setText('Запись закреплена')

    def setDateLayout(self, date):
        value = datetime.datetime.fromtimestamp(date)
        if value.month == 1:
            self.date.setText(value.strftime('%d янв %Y'))
        if value.month == 2:
            self.date.setText(value.strftime('%d фев %Y'))
        if value.month == 3:
            self.date.setText(value.strftime('%d март %Y'))
        if value.month == 4:
            self.date.setText(value.strftime('%d апр %Y'))
        if value.month == 5:
            self.date.setText(value.strftime('%d май %Y'))
        if value.month == 6:
            self.date.setText(value.strftime('%d июнь %Y'))
        if value.month == 7:
            self.date.setText(value.strftime('%d июль %Y'))
        if value.month == 8:
            self.date.setText(value.strftime('%d авг %Y'))
        if value.month == 9:
            self.date.setText(value.strftime('%d сен %Y'))
        if value.month == 10:
            self.date.setText(value.strftime('%d окт %Y'))
        if value.month == 11:
            self.date.setText(value.strftime('%d ноя %Y'))
        if value.month == 12:
            self.date.setText(value.strftime('%d дек %Y'))

    def setText(self, text):
        split = re.split('\n', text)
        retext = ''

        for mas in split:
            sp = re.findall('.', mas)

            if len(sp) > 30:
                retext += ''.join(sp[0:len(sp) // 2])
                retext += '\n'
                retext += ''.join(sp[len(sp) // 2:len(sp)])
                retext += ('\n')
            else:
                retext += mas + '\n'

        self.text.setText(retext)

    def setAttachments(self, imgata):
        attachment = QLabel()
        self.attachmentsLayout.addWidget(attachment, Qt.AlignLeft)
        self.pixmap.loadFromData(imgata)
        myPixmap = self.pixmap.scaled(300, 300, Qt.KeepAspectRatio,
                                      Qt.FastTransformation)
        attachment.setPixmap(myPixmap)

    def setInfo(self, likes, reposts, views=None):
        self.countLike.setText(str(likes))
        self.countRepost.setText(str(reposts))

        if views != None:
            self.countViews.setText(str(views))

    def deleteInformation(self):
        self.line.deleteLater()
        self.infoLayout.deleteLater()
        self.like.deleteLater()
        self.countLike.deleteLater()
        self.repost.deleteLater()
        self.countRepost.deleteLater()
        self.views.deleteLater()
        self.countViews.deleteLater()

    def deletePost(self):
        api = API(self.session, self.token)
        response = api.wall.delete(post_id=self.post_id)
        if response['response'] == 1:
            self.deleteLater()
        print('Response by delete post', response)

    def mouseDoubleClickEvent(self, QMouseEvent):
        api = API(self.session, self.token)
        response = api.wall.delete(post_id=self.post_id)

        if response['response'] == 1:
            self.deleteLater()
        print('Response by delete post', response)
class UserInterface(QMainWindow):
    
    def __init__(self, parent):
        super().__init__(parent) 
        self._gameBoard = GameBoard()
        self._parent = parent
        
        self._gameover = False
        
        self._isTowerSelected = False
        self._isTowerHovered = False
        self._towerBeingHovered = None
        self._selectedTower = None
        
        self._waveFinishTime = 0
        
        self._gameSpeed = self._parent.speed
        self._timePassed = 0
        self.timer = QBasicTimer()
        
        self._gameBoard.readMapData(os.path.join('./Maps/', self._parent.map))
        self.timer.start(self._gameSpeed, self)
        self.initUI()
              

    def initUI(self):
        
        centralWidget = QWidget()
        self.setCentralWidget(centralWidget)
        self.setWindowTitle(self._gameBoard.name)
        self.setWindowIcon(QIcon(os.path.join('./Pictures/', 'berserker_icon.png'))) #Apparently this doens't work the same way on a mac.
        self.statusBar().showMessage('Ready!')
        vbox = QVBoxLayout()
        centralWidget.setLayout(vbox)
        self.gameStats = GameStats(self)
        self.mapView = MapView(self)
        self.bottomButtons = BottomButtons(self)
        vbox.addWidget(self.gameStats)
        vbox.addWidget(self.mapView)
        vbox.addWidget(self.bottomButtons)
        
        screen = QDesktopWidget().screenGeometry()
        self.setGeometry((screen.width() - (self.gameboard.width - 1) * 20) / 2, (screen.height() - self.gameboard.height * 20 - 200) / 2, 500, 400)
        
        self.show()
        
        
    def getGameboard(self):
        return self._gameBoard
    
    
    def getIsTowerSelected(self):
        return self._isTowerSelected
    
    
    def setIsTowerSelected(self, boolean):
        self._isTowerSelected = boolean
        
    
    def getSelectedTower(self):
        return self._selectedTower
    
    
    def setSelectedTower(self, towerType):
        self._selectedTower = towerType
    
    
    def getIsTowerBeingHovered(self):
        return self._isTowerHovered
    
    
    def setIsTowerBeingHovered(self, boolean, tower):
        self._isTowerHovered = boolean
        self._towerBeingHovered = tower
    
    
    def getTowerBeingHovered(self):
        return self._towerBeingHovered
    

    def getGameStats(self):
        return self.gameStats


    def getTimePassed(self):
        return self._timePassed
    
    
    def setWaveFinishTime(self, value):
        self._waveFinishTime = value
    
    
    def getGameOver(self):
        return self._gameover
    
    
    def timerEvent(self, event):
        # The time passed attribute helps with setting the enemy appearance interval and tower firerate.
        self._timePassed += 1
        self.mapView.summonEnemy()
        self.mapView.moveEnemies()
        self.mapView.checkShooting()
        self.mapView.moveProjectiles()
        self.mapView.update()
       
    
    def loseGame(self):
        self.bottomButtons.clockTimer.stop()
        self.timer.stop()
        self.statusBar().showMessage('Game has ended. You lost.')
        self._gameover = True
        
        self.popUp = QFrame()
        self.popUp.setGeometry(500, 500, 100, 100)
        
        vbox = QVBoxLayout()
        
        youLost = QLabel()
        youLost.setPixmap(QPixmap(os.path.join('./Pictures/', "game_over.png")))
        vbox.addWidget(youLost)
        
        done = QPushButton("Done")
        vbox.addWidget(done)

        self.popUp.setLayout(vbox)
        self.popUp.move(self.mapToGlobal(QPoint(0,0)).x() + self.gameboard.width*blockSize / 2 - 130, self.mapToGlobal(QPoint(0,0)).y() + self.gameboard.height*blockSize / 2)
        self.popUp.show()
        done.clicked.connect(self.backToMainMenu)
    
    
    def winGame(self):
        self.bottomButtons.clockTimer.stop()
        self.timer.stop()
        self.statusBar().showMessage('Game has ended. You won.')
        self._gameover = True
        
        self.popUp = QFrame()
        self.popUp.setGeometry(500, 500, 100, 100)
        
        vbox = QVBoxLayout()
        
        youLost = QLabel()
        youLost.setPixmap(QPixmap(os.path.join('./Pictures/', "victory.png")))
        vbox.addWidget(youLost)
        
        done = QPushButton("Done")
        vbox.addWidget(done)

        self.popUp.setLayout(vbox)
        self.popUp.move(self.mapToGlobal(QPoint(0,0)).x() + self.gameboard.width*blockSize / 2 - 130, self.mapToGlobal(QPoint(0,0)).y() + self.gameboard.height*blockSize / 2)
        self.popUp.show()
        done.clicked.connect(self.backToMainMenu)
        
        
    def backToMainMenu(self):
        self._parent.show()
        self.popUp.deleteLater()
        self.deleteLater()
    

    def getGameSpeed(self):
        return self._gameSpeed


    def setGameSpeed(self, value):
        self._gameSpeed = value
    

    def getWaveFinishTime(self):
        return self._waveFinishTime
    
    
    def getTimer(self):
        return self.timer
    

    isTowerSelected = property(getIsTowerSelected, setIsTowerSelected)
    selectedTower = property(getSelectedTower, setSelectedTower)
    isTowerHovered = property(getIsTowerBeingHovered)
    towerBeingHovered = property(getTowerBeingHovered)
    gamestats = property(getGameStats)
    gameboard = property(getGameboard)
    timePassed = property(getTimePassed)
    gameover = property(getGameOver)
    gameSpeed = property(getGameSpeed, setGameSpeed)
    waveFinishTime = property(getWaveFinishTime, setWaveFinishTime)
Esempio n. 3
0
class ConnectDatabaseDialog(QDialog):
    # Define the directory of ui's files
    UI_DIR = join(dirname(__file__), 'resources', 'ui')
    # Define the filename to ui file of that widget
    FILENAME_UI = join(UI_DIR, 'connect_dialog.ui')
    # Define the config directory:
    CONFIG_DIRECTORY = join(dirname(dirname(__file__)), ".config")
    # Define the config file:
    CONFIG_FILE = join(CONFIG_DIRECTORY, "config.json")

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

        # Load .ui file and initialize it
        try:
            uic.loadUi(self.FILENAME_UI, self)
        except FileNotFoundError as e:
            print(e)
            exit(-1)

        # Flag specifies that Windows credential will be used
        self.trusted_connection = 'yes'
        # Define error label to print error message it the dialog
        self.error_label = None
        self.error_line = None
        # Initialize config directory
        self.__init_config_directory()
        # Disable resizing a window
        self.setWindowFlags(Qt.Dialog | Qt.MSWindowsFixedSizeDialogHint)
        # Set echo mode to hide inputting a password
        self.password_ledit.setEchoMode(QLineEdit.Password)

        self.database = None

        self.__load_config()

    def __init_config_directory(self):
        """
        This method creates directory to save all configs in here
        """
        if not isdir(self.CONFIG_DIRECTORY):
            mkdir(self.CONFIG_DIRECTORY)

    def __load_config(self):
        """
        This method loads all configurations from the config file. If that file exists, then
        this method setups all configurations into the dialog.
        """
        if isfile(self.CONFIG_FILE):
            with open(self.CONFIG_FILE, "r") as config_file:
                json_obj = json.load(config_file)
                server_names = json_obj["server_names"]
                database_names = json_obj["database_names"]
                name = json_obj["name"]
                self.remember_pswd_chebox.setChecked(json_obj["remember_pswd"])

            self.__setup_credentials(server_names, database_names, name,
                                     self.remember_pswd_chebox.isChecked())

        else:
            self.__setup_credentials()

    def __setup_credentials(self,
                            server: list = None,
                            database: list = None,
                            name: str = "",
                            remember_pswd: bool = False):
        """
        This method setups configurations into the dialog. It fills edit lines, combo and check boxes.
        """

        # Add all servers and databases into server's names combobox and database's names combobox
        if server:
            self.name_server_combox.addItems(server)
        if database:
            self.database_combox.addItems(database)

        # Set username into the user's name line edit
        self.name_user_ledit.setText(name)
        # Turn on the remembering password checkbox
        self.remember_pswd_chebox.setChecked(remember_pswd)

        # If remembering password checkbox turned on, set a password by default
        if remember_pswd:
            self.password_ledit.setText(self.__load_password_bydefault(name))

    def __save_password_bydefault(self, name: str, password: str):
        """
        This method saves the default password using the "keyring" library
        """
        keyring.set_password(environ["USERNAME"], name, password)

    def __load_password_bydefault(self, name: str):
        """
        This method loads the default password using the "keyring" library
        """
        return keyring.get_password(environ["USERNAME"], name)

    def __save_config(self):
        config = dict()

        # Get all names of servers and serialize it
        config["server_names"] = [
            self.name_server_combox.itemText(i)
            for i in range(self.name_server_combox.count())
        ]
        current_server = self.name_server_combox.currentText()
        if current_server not in config["server_names"]:
            config["server_names"].append(current_server)

        # Get all names of databases and serialize it
        config["database_names"] = [
            self.database_combox.itemText(i)
            for i in range(self.database_combox.count())
        ]
        current_database = self.database_combox.currentText()
        if current_database not in config["database_names"]:
            config["database_names"].append(current_database)

        config["name"] = self.name_user_ledit.text()
        config["remember_pswd"] = self.remember_pswd_chebox.isChecked()

        # If it's true, save the password using keyring
        if config["remember_pswd"]:
            self.__save_password_bydefault(name=self.name_user_ledit.text(),
                                           password=self.password_ledit.text())

        with open(self.CONFIG_FILE, "w") as config_file:
            json.dump(config, config_file)

    def enable_connect_button(self):
        """
        This method enables or disables the connect button for this dialog window depending on whether
        there is text in the server's name combo box.
        """
        if self.name_server_combox.currentText(
        ) and self.database_combox.currentText():
            self.connect_button.setEnabled(True)
        else:
            self.connect_button.setEnabled(False)

    def connect(self):
        """
        This methods gets all values from window's fields and passes them into connecting to database method
        """

        server = self.name_server_combox.currentText()
        database = self.database_combox.currentText()
        name = self.name_user_ledit.text()
        password = self.password_ledit.text()

        try:
            # Take connection to a database
            self.database = Database.connect_db(
                server,
                database,
                name,
                password,
                autocommit=True,
                trusted_connection=self.trusted_connection)
        except (pyodbc.InterfaceError, pyodbc.OperationalError) as e:
            self.set_error_connection(e.args[1])
            return

        # Close dialog window
        self.reject()

        # If the connection was established, then save all configurations into the configuration file
        self.__save_config()
        # Pass established connection into main window class
        self.parent().set_connection(self.database)

    def set_error_connection(self, error):
        """
        This method sets error label if error has been occurred
        """
        if not self.error_line:
            self.error_line = QFrame(self)
            self.error_line.setFrameShadow(QFrame.Sunken)
            self.error_line.setFrameShape(QFrame.HLine)
            self.error_line.setLineWidth(1)
            self.fields_layout.insertWidget(1, self.error_line)

        if not self.error_label:
            error_msg = process_error_sql(error)

            self.error_label = QLabel(error_msg, self)
            self.error_label.setWordWrap(True)
            self.error_label.setStyleSheet('QLabel { color : red; }')
            self.fields_layout.insertWidget(2, self.error_label)

            self.resize(self.sizeHint())

    def remove_error_connection(self):
        """
        This method is slot which called when any field was edited. If error label and line are set,
        then this method remove these widgets
        """
        if self.error_line:
            self.fields_layout.removeWidget(self.error_line)
            self.error_line.deleteLater()
            self.error_line = None

        if self.error_label:
            self.fields_layout.removeWidget(self.error_label)
            self.error_label.deleteLater()
            self.error_label = None

            self.resize(self.sizeHint())

    def enable_login_pswd(self):
        flag = False
        self.trusted_connection = 'yes'

        if self.autentification_combox.currentText() == 'Логин и пароль':
            flag = True
            self.trusted_connection = 'no'

        for i in range(self.credentials_formlayout.count()):
            obj = self.credentials_formlayout.itemAt(i).widget()
            obj.setEnabled(flag)
class UserInterface(QMainWindow):
    def __init__(self, parent):
        super().__init__(parent)
        self._gameBoard = GameBoard()
        self._parent = parent

        self._gameover = False

        self._isTowerSelected = False
        self._isTowerHovered = False
        self._towerBeingHovered = None
        self._selectedTower = None

        self._waveFinishTime = 0

        self._gameSpeed = self._parent.speed
        self._timePassed = 0
        self.timer = QBasicTimer()

        self._gameBoard.readMapData(os.path.join('./Maps/', self._parent.map))
        self.timer.start(self._gameSpeed, self)
        self.initUI()

    def initUI(self):

        centralWidget = QWidget()
        self.setCentralWidget(centralWidget)
        self.setWindowTitle(self._gameBoard.name)
        self.setWindowIcon(
            QIcon(os.path.join('./Pictures/', 'berserker_icon.png'))
        )  #Apparently this doens't work the same way on a mac.
        self.statusBar().showMessage('Ready!')
        vbox = QVBoxLayout()
        centralWidget.setLayout(vbox)
        self.gameStats = GameStats(self)
        self.mapView = MapView(self)
        self.bottomButtons = BottomButtons(self)
        vbox.addWidget(self.gameStats)
        vbox.addWidget(self.mapView)
        vbox.addWidget(self.bottomButtons)

        screen = QDesktopWidget().screenGeometry()
        self.setGeometry(
            (screen.width() - (self.gameboard.width - 1) * 20) / 2,
            (screen.height() - self.gameboard.height * 20 - 200) / 2, 500, 400)

        self.show()

    def getGameboard(self):
        return self._gameBoard

    def getIsTowerSelected(self):
        return self._isTowerSelected

    def setIsTowerSelected(self, boolean):
        self._isTowerSelected = boolean

    def getSelectedTower(self):
        return self._selectedTower

    def setSelectedTower(self, towerType):
        self._selectedTower = towerType

    def getIsTowerBeingHovered(self):
        return self._isTowerHovered

    def setIsTowerBeingHovered(self, boolean, tower):
        self._isTowerHovered = boolean
        self._towerBeingHovered = tower

    def getTowerBeingHovered(self):
        return self._towerBeingHovered

    def getGameStats(self):
        return self.gameStats

    def getTimePassed(self):
        return self._timePassed

    def setWaveFinishTime(self, value):
        self._waveFinishTime = value

    def getGameOver(self):
        return self._gameover

    def timerEvent(self, event):
        # The time passed attribute helps with setting the enemy appearance interval and tower firerate.
        self._timePassed += 1
        self.mapView.summonEnemy()
        self.mapView.moveEnemies()
        self.mapView.checkShooting()
        self.mapView.moveProjectiles()
        self.mapView.update()

    def loseGame(self):
        self.bottomButtons.clockTimer.stop()
        self.timer.stop()
        self.statusBar().showMessage('Game has ended. You lost.')
        self._gameover = True

        self.popUp = QFrame()
        self.popUp.setGeometry(500, 500, 100, 100)

        vbox = QVBoxLayout()

        youLost = QLabel()
        youLost.setPixmap(QPixmap(os.path.join('./Pictures/',
                                               "game_over.png")))
        vbox.addWidget(youLost)

        done = QPushButton("Done")
        vbox.addWidget(done)

        self.popUp.setLayout(vbox)
        self.popUp.move(
            self.mapToGlobal(QPoint(0, 0)).x() +
            self.gameboard.width * blockSize / 2 - 130,
            self.mapToGlobal(QPoint(0, 0)).y() +
            self.gameboard.height * blockSize / 2)
        self.popUp.show()
        done.clicked.connect(self.backToMainMenu)

    def winGame(self):
        self.bottomButtons.clockTimer.stop()
        self.timer.stop()
        self.statusBar().showMessage('Game has ended. You won.')
        self._gameover = True

        self.popUp = QFrame()
        self.popUp.setGeometry(500, 500, 100, 100)

        vbox = QVBoxLayout()

        youLost = QLabel()
        youLost.setPixmap(QPixmap(os.path.join('./Pictures/', "victory.png")))
        vbox.addWidget(youLost)

        done = QPushButton("Done")
        vbox.addWidget(done)

        self.popUp.setLayout(vbox)
        self.popUp.move(
            self.mapToGlobal(QPoint(0, 0)).x() +
            self.gameboard.width * blockSize / 2 - 130,
            self.mapToGlobal(QPoint(0, 0)).y() +
            self.gameboard.height * blockSize / 2)
        self.popUp.show()
        done.clicked.connect(self.backToMainMenu)

    def backToMainMenu(self):
        self._parent.show()
        self.popUp.deleteLater()
        self.deleteLater()

    def getGameSpeed(self):
        return self._gameSpeed

    def setGameSpeed(self, value):
        self._gameSpeed = value

    def getWaveFinishTime(self):
        return self._waveFinishTime

    def getTimer(self):
        return self.timer

    isTowerSelected = property(getIsTowerSelected, setIsTowerSelected)
    selectedTower = property(getSelectedTower, setSelectedTower)
    isTowerHovered = property(getIsTowerBeingHovered)
    towerBeingHovered = property(getTowerBeingHovered)
    gamestats = property(getGameStats)
    gameboard = property(getGameboard)
    timePassed = property(getTimePassed)
    gameover = property(getGameOver)
    gameSpeed = property(getGameSpeed, setGameSpeed)
    waveFinishTime = property(getWaveFinishTime, setWaveFinishTime)
Esempio n. 5
0
class notifyTab(QWidget):

	def __init__(self,parent_):
		super(notifyTab,self).__init__(parent_)
		self.parent_=parent_
		self.obj=parent_.obj
		self.initUI()

	def initUI(self):
		self.btn = []
		self.notif_lbl = []
		self.tag_lbl = []
		self.nFrames =[]
		self.d_ = False

		for i in range(0,len(self.obj.notif)):
			pixmap=QPixmap(self.obj.tagDict[self.obj.notif[i].tag])
			pixmap = pixmap.scaled(45, 45)
			self.tag_lbl.append(QLabel(self))
			self.tag_lbl[i].setPixmap(pixmap)

		for i1 in range(0,len(self.obj.notif)):
			self.notif_lbl.append(QLabel(self))
			self.notif_lbl[i1].setScaledContents(False)
			self.notif_lbl[i1].setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
			self.notif_lbl[i1].setText(self.obj.notif[i1].notif_text)
			self.notif_lbl[i1].setObjectName("nlbl")
			self.btn.append(QPushButton('Get Link'))
			self.btn[i1].setObjectName("btn")

		for i2 in range(0,len(self.obj.notif)):
			self.nFrames.append(notifyFrames(self.notif_lbl[i2],self.tag_lbl[i2],self.btn[i2]))
			tag = self.obj.notif[i2].tag
			if tag ==2 or tag==3 or tag==4:
				self.nFrames[i2].setObjectName('nFrameOdd')
			else:
				self.nFrames[i2].setObjectName('nFrameEven')

		self.widget = QWidget(self)
		self.vbox = QVBoxLayout()

		for index, frame in enumerate(self.nFrames):
			self.vbox.addWidget(frame)

		if len(self.nFrames)<4:
			self.dframe = QFrame()
			self.dframe.setObjectName('nFrameDummy')
			self.vbox.addWidget(self.dframe)
			self.d_ = True

		self.vbox.setContentsMargins(0,0,0,0)
		self.vbox.setSpacing(3)

		self.widget.setLayout(self.vbox)
		self.scroll = QScrollArea(self)
		self.scroll.setWidget(self.widget)
		self.scroll.setWidgetResizable(True)
		self.scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
		self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)

		vbox1 = QVBoxLayout()
		vbox1.setContentsMargins(0,0,0,0)
		vbox1.setSpacing(0)

		vbox1.addWidget(self.scroll)
		self.setLayout(vbox1)


	def updater(self):
		marker=len(self.nFrames)
		marker1 = len(self.nFrames)

		for i in range(0,len(self.obj.notif)):
			pixmap=QPixmap(self.obj.tagDict[self.obj.notif[i].tag])
			pixmap = pixmap.scaled(45, 45)
			self.tag_lbl.append(QLabel(self))
			self.tag_lbl[marker].setPixmap(pixmap)
			marker=marker+1

		marker=marker1
		for i1 in range(0,len(self.obj.notif)):
			self.notif_lbl.append(QLabel(self))
			self.notif_lbl[marker].setScaledContents(False)
			self.notif_lbl[marker].setAlignment(QtCore.Qt.AlignLeading|QtCore.Qt.AlignLeft|QtCore.Qt.AlignVCenter)
			self.notif_lbl[marker].setText(self.obj.notif[i1].notif_text)
			self.notif_lbl[marker].setObjectName("nlbl")
			self.btn.append(QPushButton('Get Link'))
			self.btn[marker].setObjectName("btn")
			marker+=1

		marker=marker1

		for i2 in range(0,len(self.obj.notif)):
			self.nFrames.append(notifyFrames(self.notif_lbl[marker],self.tag_lbl[marker],self.btn[marker]))
			marker+=1

		marker=marker1

		for i3 in range(len(self.nFrames)-1,marker-1,-1):
			self.vbox.insertWidget(0,self.nFrames[i3])
			tag = self.obj.notif[i3-marker].tag
			if tag ==2 or tag==3 or tag==4:
				self.nFrames[i3].setObjectName('nFrameOdd')
				self.nFrames[i3].setStyleSheet(' #nFrameOdd{background-color:#F5F5DC;min-height:110px;max-height:110px;min-width:805px;}')
			else:
				self.nFrames[i3].setObjectName('nFrameEven')
				self.nFrames[i3].setStyleSheet(' #nFrameEven{background-color: rgb(255, 250, 175);min-height:110px;max-height:110px;min-width:805px;}')

		if len(self.nFrames)>=4 and self.d_==True:
			child = self.vbox.takeAt(len(self.nFrames))
			if child.widget() is not None:
				child.widget().deleteLater()
			elif child.layout() is not None:
				clearLayout(child.layout())
			self.dframe.deleteLater()
			self.d_=False
Esempio n. 6
0
class courseTab(QWidget):
	def __init__(self,parent_):
		super(courseTab,self).__init__(parent_)
		self.parent_=parent_
		self.obj=parent_.obj
		self.initUI()

	def initUI(self):
		self.btn = []
		self.lbl = []
		self.cFrames =[]
		self.marker=0
		self.d_=False

		if len(self.obj.courses) is 0:
			self.lbl.append(QLabel(self))
			self.lbl[self.marker].setText('Your credentials have been verified but we couldn\'t configure you up. Wait for auto-update')
			self.lbl[self.marker].setObjectName("slbl")
			self.cFrames.append(errorFrame(self.lbl[self.marker]))

		for i1 in range(self.marker,len(self.obj.courses)):
			self.lbl.append(QLabel(self))
			self.lbl[i1].setText(self.obj.courses[i1].c_name.upper())
			self.lbl[i1].setObjectName("lbl")
			self.btn.append(QPushButton('FILES'))
			self.btn[i1].setObjectName("btn")
			self.btn[i1].id=i1
			self.btn[i1].clicked.connect(partial(self.createItemTab,self.btn[i1].id))


		for i2 in range(self.marker,len(self.obj.courses)):
			self.cFrames.append(courseFrames(self.lbl[i2],self.btn[i2]))

		self.marker=len(self.obj.courses)

		self.widget = QWidget(self)

		self.vbox = QVBoxLayout()
		self.vbox.setContentsMargins(0,0,0,0)
		self.vbox.setSpacing(3)

		for index, frame in enumerate(self.cFrames):
			if index%2==0:
				frame.setObjectName('cFrameEven')
			else:
				frame.setObjectName('cFrameOdd')
			self.vbox.addWidget(frame)

		if len(self.cFrames)<4:
			self.dframe = QFrame()
			self.dframe.setObjectName('nFrameDummy')
			self.vbox.addWidget(self.dframe)
			self.d_=True

		self.widget.setLayout(self.vbox)

		self.scroll = QScrollArea(self)


		self.scroll.setWidget(self.widget)
		self.scroll.setWidgetResizable(True)
		self.scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
		self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)

		vbox1 = QVBoxLayout()
		vbox1.setContentsMargins(0,0,0,0)
		vbox1.setSpacing(0)

		vbox1.addWidget(self.scroll)
		self.setLayout(vbox1)

	def createItemTab(self,id_):
		self.parent_.callItemTab(id_)

	def updater(self):
		if self.obj.dummy_courses is '':
			return
		else:
			if  self.d_==True:
				child = self.vbox.takeAt(len(self.cFrames))
				if child.widget() is not None:
					child.widget().deleteLater()
				elif child.layout() is not None:
					clearLayout(child.layout())
				self.dframe.deleteLater()

				self.d_=False

			if self.marker==0:
				self.cFrames[0].deleteLater()
				self.lbl[0].deleteLater()
				child = self.vbox.takeAt(0)
				if child.widget() is not None:
					child.widget().deleteLater()
				elif child.layout() is not None:
					clearLayout(child.layout())
				self.lbl.pop(0)
				self.cFrames.pop(0)

			for i1 in range(self.marker,len(self.obj.courses)):
				self.lbl.append(QLabel(self))
				self.lbl[i1].setText(self.obj.courses[i1].c_name.upper())
				self.lbl[i1].setObjectName("lbl")
				self.btn.append(QPushButton('FILES'))
				self.btn[i1].setObjectName("btn")
				self.btn[i1].id=i1
				self.btn[i1].clicked.connect(partial(self.createItemTab,self.btn[i1].id))


			for i2 in range(self.marker,len(self.obj.courses)):
				self.cFrames.append(courseFrames(self.lbl[i2],self.btn[i2]))

			for i3 in range (self.marker,len(self.cFrames)):
				if i3%2==0:
					self.cFrames[i3].setObjectName('cFrameEven')
				else:
					self.cFrames[i3].setObjectName('cFrameEven')

				self.vbox.addWidget(self.cFrames[i3])

			if len(self.cFrames)<4:
				self.dframe = QFrame()
				self.dframe.setObjectName('nFrameDummy')
				self.vbox.addWidget(self.dframe)
				self.d_=True

			self.marker=self.marker+len(self.obj.dummy_courses)
Esempio n. 7
0
class itemTab(QWidget):

	def __init__(self,parent_,id_):
		super(itemTab,self).__init__(parent_)
		self.parent_=parent_
		self.obj = parent_.obj
		self.id_=id_
		self.initUI()

	def initUI(self):
		self.obtn = {}
		self.sbtn = {}
		self.lbl = []
		self.gbtn = []
		self.iFrames =[]
		self.tag_lbl=[]
		self.d_ =False

		self.x = 0
		self.y=0

		self.backBtn = QPushButton(QIcon(':/Assets/close2.png'),'Close')
		self.backBtn.setObjectName('backBtn')
		self.backBtn.clicked.connect(partial(self.parent_.closeItemTab,self.id_))
		self.clbl = QLabel(self)
		self.clbl.setText(self.obj.courses[self.id_].c_name.upper())
		self.clbl.setObjectName('hlbl')

		a = ["assignment","exam","quiz"]

		for iz in range(0,len(self.obj.courses[self.id_].items)):
			if self.obj.courses[self.id_].items[iz].saved==2:
				pixmap=QPixmap(self.obj.tagDict[3])
			else:
				 str_= self.obj.courses[self.id_].items[iz].i_name.lower()
				 if any(x in str_ for x in a):
					 pixmap=QPixmap(self.obj.tagDict[4])
				 else:
					 pixmap=QPixmap(self.obj.tagDict[self.obj.courses[self.id_].items[iz].type+2])

			pixmap = pixmap.scaled(45, 45)
			self.tag_lbl.append(QLabel(self))
			self.tag_lbl[iz].setPixmap(pixmap)

		for i1 in range(0,len(self.obj.courses[self.id_].items)):
			self.lbl.append(ExtendedQLabel(self,i1))
			cname = self.shortenTabName(self.obj.courses[self.id_].items[i1].i_name)
			self.lbl[i1].setText(cname)
			self.lbl[i1].setObjectName("ilbl")

			self.sbtn[i1] = QPushButton('Save')
			self.sbtn[i1].setObjectName("sbtn")

			self.gbtn.append(QPushButton(QIcon(':/Assets/link.png'),''))
			self.gbtn[i1].setObjectName("linkBtn")
			self.gbtn[i1].id_ = i1
			self.gbtn[i1].clicked.connect(partial(self.copyLink,self.gbtn[i1].id_))
			self.sbtn[i1].clicked.connect(partial(self.saveItem,self.gbtn[i1].id_))

			if self.obj.courses[self.id_].items[i1].saved==1:
				self.obtn[i1] = QPushButton('Open')
				if self.obj.courses[self.id_].items[i1].dwnld == 1:
					self.obtn[i1].setObjectName("obtn")
				else:
					self.obtn[i1].setObjectName("rbtn")
				self.obtn[i1].clicked.connect(partial(self.openItem,self.gbtn[i1].id_))

		self.iFrames.append(topFrame(self.backBtn,self.clbl))

		for i2 in range(0,len(self.obj.courses[self.id_].items)):
			if self.obj.courses[self.id_].items[i2].saved==1:
				self.iFrames.append(itemFrames(self.lbl[i2],self.gbtn[i2],self.sbtn[i2],self.obtn[i2],self.tag_lbl[i2]))
			elif self.obj.courses[self.id_].items[i2].saved==0:
				self.iFrames.append(itemFramesNew(self.lbl[i2],self.gbtn[i2],self.sbtn[i2],self.tag_lbl[i2]))
			else:
				self.iFrames.append(itemFramesForum(self.lbl[i2],self.gbtn[i2],self.tag_lbl[i2]))

		self.widget = QWidget(self)

		self.vbox = QVBoxLayout()
		self.vbox.setSpacing(3)

		for index, frame in enumerate(self.iFrames):
			if index%2==0:
				frame.setObjectName('nFrameEven')
			else:
				frame.setObjectName('nFrameEven')
			self.vbox.addWidget(frame)

		self.vbox.setContentsMargins(0,0,0,0)

		if len(self.iFrames)<4:
			self.dframe = QFrame()
			self.dframe.setObjectName('nFrameDummy')
			self.vbox.addWidget(self.dframe)
			self.d_=True

		self.widget.setLayout(self.vbox)
		self.scroll = QScrollArea(self)
		self.scroll.setWidget(self.widget)
		self.scroll.setWidgetResizable(True)
		self.scroll.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
		self.scroll.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOn)

		vbox1 = QVBoxLayout()
		vbox1.setContentsMargins(0,0,0,0)
		vbox1.setSpacing(0)

		vbox1.addWidget(self.scroll)
		self.setLayout(vbox1)


	def shortenTabName(self,cname):
		list1 =[]
		for i, ch in enumerate(cname):
				list1.append(ch)
				if len(list1)==40:
					if list1[i]== ' ':
						list1.pop(i)
					list1.append('...')
					break
		return ''.join(list1)

	def updater(self):
		self.x=+1
		if self.obj.courses[self.id_].dummy_items is '':
			return
		else:
			if  self.d_==True:
				child = self.vbox.takeAt(len(self.iFrames))
				if child.widget() is not None:
					child.widget().deleteLater()
				elif child.layout() is not None:
					clearLayout(child.layout())
				self.dframe.deleteLater()
				self.d_=False

			marker = len(self.iFrames)-1

			a = ["assignment","exam","quiz"]
			for iz in range(marker,len(self.obj.courses[self.id_].items)):
				if self.obj.courses[self.id_].items[iz].saved==2:
					pixmap=QPixmap(self.obj.tagDict[3])
				else:
					 str_= self.obj.courses[self.id_].items[iz].i_name.lower()
					 if any(x in str_ for x in a):
						 pixmap=QPixmap(self.obj.tagDict[4])
					 else:
						 pixmap=QPixmap(self.obj.tagDict[self.obj.courses[self.id_].items[iz].type+2])
				pixmap = pixmap.scaled(45, 45)
				self.tag_lbl.append(QLabel(self))
				self.tag_lbl[iz].setPixmap(pixmap)

			for i1 in range(marker,len(self.obj.courses[self.id_].items)):
				self.lbl.append(ExtendedQLabel(self,i1))
				cname = self.shortenTabName(self.obj.courses[self.id_].items[i1].i_name)
				self.lbl[i1].setText(cname)
				self.lbl[i1].setObjectName("ilbl")
				self.sbtn[i1] = QPushButton('Save')
				self.sbtn[i1].setObjectName("sbtn")
				self.gbtn.append(QPushButton(QIcon(':/Assets/link.png'),''))
				self.gbtn[i1].setObjectName("linkBtn")
				self.gbtn[i1].id_ = i1
				self.gbtn[i1].clicked.connect(partial(self.copyLink,self.gbtn[i1].id_))
				self.sbtn[i1].clicked.connect(partial(self.saveItem,self.gbtn[i1].id_))

				if self.obj.courses[self.id_].items[i1].saved==1:
					self.obtn[i1] = QPushButton('Open')
					if self.obj.courses[self.id_].items[i1].dwnld == 1:
						self.obtn[i1].setObjectName("obtn")
					else:
						self.obtn[i1].setObjectName("rbtn")
					self.obtn[i1].clicked.connect(partial(self.openItem,self.gbtn[i1].id_))

			for i2 in range(marker,len(self.obj.courses[self.id_].items)):
				if self.obj.courses[self.id_].items[i2].saved==1:
					self.iFrames.append(itemFrames(self.lbl[i2],self.gbtn[i2],self.sbtn[i2],self.obtn[i2],self.tag_lbl[i2]))
				elif self.obj.courses[self.id_].items[i2].saved==0:
					self.iFrames.append(itemFramesNew(self.lbl[i2],self.gbtn[i2],self.sbtn[i2],self.tag_lbl[i2]))
				else:
					self.iFrames.append(itemFramesForum(self.lbl[i2],self.gbtn[i2],self.tag_lbl[i2]))

			for i3 in range (marker+1,len(self.iFrames)):
				if i3%2==0:
					self.iFrames[i3].setObjectName('nFrameEven')
				else:
					self.iFrames[i3].setObjectName('nFrameEven')

				self.vbox.addWidget(self.iFrames[i3])
				y=0

			if len(self.iFrames)<4:
				self.dframe = QFrame()
				self.dframe.setObjectName('nFrameDummy')
				self.vbox.addWidget(self.dframe)
				self.d_=True


	def saveItem(self,id_):
		fileName = QFileDialog.getOpenFileName(self, 'Select Your File')
		if fileName[0] is '':
			return
		else:
			self.obtn[id_] = QPushButton('Open')
			self.obtn[id_].setObjectName("rbtn")
			self.obtn[id_].clicked.connect(partial(self.openItem,self.gbtn[id_].id_))
			self.obj.courses[self.id_].items[id_].olink = fileName[0]
			self.obj.courses[self.id_].items[id_].saved=1
			self.iFrames[id_+1].grid.addWidget(self.obtn[id_],1,3)
			self.parent_.parent_.itemsWriter(fileName[0],self.id_,id_)

	def openItem(self,id_):
		fileName = self.obj.courses[self.id_].items[id_].olink
		if sys.platform == "win32":
			if os.path.exists(fileName):
				if self.obj.courses[self.id_].items[id_].type==1 and self.obj.courses[self.id_].items[id_].dwnld==1 :
					self.parent_.openTextBrowser(fileName,self.obj.courses[self.id_].c_name,self.obj.courses[self.id_].items[id_].i_name)
				else:
					os.startfile(fileName)
			else:
				reply = QMessageBox.information(self,'Moodly',"This file no longer exists. Kindly save a new link.", QMessageBox.Ok)
				if reply == QMessageBox.Ok:
					pass
		else:
			if os.path.exists(fileName):
				opener ="open" if sys.platform == "darwin" else "xdg-open"
				subprocess.call([opener, fileName])
			else:
				reply = QMessageBox.information(self,'Moodly',"This file no longer exists. Kindly save a new link.", QMessageBox.Ok)
				if reply == QMessageBox.Ok:
					pass

	def copyLink(self,id_):
		cb = QApplication.clipboard()
		cb.clear(mode=cb.Clipboard)
		cb.setText(self.obj.courses[self.id_].items[id_].glink, mode=cb.Clipboard)
		reply = QMessageBox.information(self,'Moodly',"The link has been copied", QMessageBox.Ok)
		if reply == QMessageBox.Ok:
			pass
Esempio n. 8
0
class explore(QWidget):
    files = None
    icon_size = 120
    hidden = False

    maxWidth = 1200

    scroll_pos_old = 0
    scroll_pos = 0

    btns = []
    #targetType = None

    mouse = [0, 0]
    collized = []

    #Print with hotkey
    keyPrint = None
    selectBtn = None

    anitimer = None
    newSelect = 0

    select_old = [0]

    def __init__(self, parent=None):
        super(explore, self).__init__(parent)
        self.parent = parent
        self.setAcceptDrops(True)

        self.init()

    def init(self):
        sys.modules['explore'] = self
        self.core = core()
        self.keyPrint = lambda: (print(
            self.btns), print(len(self.btns), print('f:', self.files)))

        self.history = self.parent.parent().history
        self.scroll = QScrollArea(self)

        self.window = QWidget(self)
        self.window.setAcceptDrops(True)

        self.scroll.setWidget(self.window)

        self.scroll.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

        #self.scroll.verticalScrollBar().valueChanged.connect(self.wh_change)
        #self.scroll.verticalScrollBar().sliderMoved.connect(self.scrollMoved)
        #self.scroll.mousePressEvent = lambda e: print(e, 'de')

        self.scrBar = QScrollBar()
        self.scroll.setVerticalScrollBar(self.scrBar)

        self.scrBar.valueChanged.connect(self.wh_change)
        self.scrBar.sliderMoved.connect(self.scrollMoved)
        self.scrBar.wheelEvent = self.wh
        self.scrBar.mousePressEvent = self.scrollBarPress
        self.scrBar.mouseMoveEvent = self.scrollBarMove

        self.scroll.wheelEvent = self.wh

        self.anitimer = QTimer()
        self.anitimer.setInterval(1000 / 60)
        self.anitimer.timeout.connect(self.ani_func)
        self.anitimer.start()

        self.qrun = qrun(self)

        self.app = QApplication([])

        hk = sys.modules['scr.hotkey'].hotkey

        def setkey(name, func):
            key = initKey()
            hk.setInitName(hk, name)
            key.func = func
            hk.add(hk, key)

        setkey('redo', lambda: self.redo())
        setkey('undo', lambda: self.undo())
        setkey('selectall', lambda: self.selectAll())
        setkey('deselectall', lambda: self.deselect())

        setkey('keyright', lambda: self.keyArrow('right'))
        setkey('keyleft', lambda: self.keyArrow('left'))
        setkey('keyup', lambda: self.keyArrow('up'))
        setkey('keydown', lambda: self.keyArrow('down'))

        setkey('ctrlkeyright', lambda: self.keyArrow('right', 1))
        setkey('ctrlkeyleft', lambda: self.keyArrow('left', 1))
        setkey('ctrlkeyup', lambda: self.keyArrow('up', 1))
        setkey('ctrlkeydown', lambda: self.keyArrow('down', 1))

        setkey('keyenter', lambda: self.keyEnter())
        setkey('keyreturn', lambda: self.keyEnter())

        setkey('copy', lambda: self.copyCB())
        setkey('paste', lambda: self.pasteCB())

        setkey('toggleqrun', lambda: self.qrun.toggle())

        setkey('escape', lambda: print('esc explore'))

        sys.modules['m'].callbackResize.append(self.res)
        self.res()

    def copyCB(self):  #CLIPBOARD
        self.collized = [x for x in self.btns if x.select == True]

        self.sourceDir = os.getcwd()

        if self.collized:

            if self.current_dir[-1] == "/":
                self.current_dir = self.current_dir[:-1]
            self.mimeData = QMimeData()

            self.urls = []

            for e in self.collized:
                self.urls.append(
                    QUrl.fromLocalFile(self.current_dir + '/' + e.value))

            self.mimeData.setUrls(self.urls)

            #--------------------------------
            cb = self.app.clipboard()
            cb.clear(mode=cb.Clipboard)
            self.app.clipboard().setMimeData(self.mimeData, mode=cb.Clipboard)

    def pasteCB(self):  #CLIPBOARD
        print("paste")
        print(self.app.clipboard().mimeData().urls())

        links = []
        mimeurls = self.app.clipboard().mimeData().urls()
        for url in mimeurls:
            url = QUrl(url)
            links.append(url.toLocalFile())

        cp = sys.modules['scr.core'].core.copy
        cp(sys.modules['scr.core'].core, self.sourceDir, links, os.getcwd())
        self.refresh()

        pass

    def keyEnter(self):
        try:
            self.selectBtn = self.btns[self.newSelect]
        except:
            self.selectBtn = self.btns[0]

        self.selectFile = os.path.normpath(self.current_dir + '/' +
                                           self.selectBtn.value)

        if os.path.isdir(self.selectFile):
            self.setDir(self.current_dir + '/' + self.selectBtn.value)
            self.history.set(self.current_dir, self.scroll_pos)

        else:
            self.setDir(self.current_dir + '/' + self.selectBtn.value)
            self.lm_menu()

    def selectFiles(self):
        self.collized = [x.value for x in self.btns if x.select == True]
        return self.collized

    def keyArrow(self, e, mod=0):
        if self.btns:

            iconPerRow = int(self.scroll.width() / self.icon_size)
            iconPerCol = int(self.scroll.height() / self.icon_size)
            selectOn = [x for x in self.btns if x.select == True]

            frameTop = self.scroll_pos
            frameBottom = self.scroll_pos + iconPerCol * 120

            if selectOn:
                #select = selectOn[:1][0].value
                slo = self.select_old[-1]

                #select = self.btns[self.select_old[-1]][0].value
                select = self.btns[slo].value
            else:
                select = self.btns[0].value

            for i in range(len(self.btns)):

                if select == self.btns[i].value:

                    if e == 'left':
                        if i - 1 >= -1:
                            self.deselect()
                            if i - 1 == -1:
                                self.newSelect = 0
                            else:
                                self.newSelect = i - 1
                            b = self.btns[self.newSelect]

                            b.select = True
                            b.leaveEvent(QMouseEvent)
                    elif e == 'right':
                        if i + 1 < len(self.btns):
                            self.deselect()
                            self.newSelect = i + 1
                            b = self.btns[self.newSelect]

                            b.select = True
                            b.leaveEvent(QMouseEvent)
                    elif e == 'up':
                        if i - iconPerRow >= 0:
                            self.deselect()
                            self.newSelect = i - iconPerRow
                            b = self.btns[self.newSelect]
                            b.select = True
                            b.leaveEvent(QMouseEvent)
                    elif e == 'down':
                        if i + iconPerRow < len(self.btns):
                            self.deselect()
                            self.newSelect = i + iconPerRow
                            b = self.btns[self.newSelect]
                            b.select = True
                            b.leaveEvent(QMouseEvent)

                    if mod == 1:
                        for e in self.select_old:

                            b = self.btns[e]
                            b.select = True
                            b.leaveEvent(QMouseEvent)

                        self.select_old += [self.newSelect]
                    else:
                        self.select_old = [self.newSelect]
                    print(self.select_old)
                    ######################################################

                    selectOnLine = int(self.newSelect / iconPerRow)
                    PosOnSelect = selectOnLine * self.icon_size

                    if PosOnSelect < frameTop:
                        self.scroll_pos = PosOnSelect

                    elif PosOnSelect > frameBottom - 120:
                        self.scroll_pos = PosOnSelect - 120 * 3

            if e == 'enter':
                pass

    def scrollMoved(self):
        #self.targetType = None
        pass

    def mousePressed(self, e):  #НЕ РАБОТАЕТ
        self.globalPos = e.globalPos()

    def scrollBarPress(self, e):
        self.vbar = self.scroll.verticalScrollBar()
        frameHeight = self.scroll.height()
        current = self.vbar.value()
        currentClick = int(self.window.height() * (e.y() / frameHeight))

        min = current
        max = min + (self.window.height() - self.vbar.maximum())
        if not (currentClick > min and currentClick < max):

            if currentClick > max:
                self.scroll_pos += self.scroll.height()
            elif currentClick < min:
                self.scroll_pos -= self.scroll.height()

        else:  #Scroll Btn
            self.dragStartScroll = currentClick - min  # нужно, чтобы убрать дерганье
        super(explore, self).mousePressEvent(e)

    def scrollBarMove(self, e):
        scrH = self.scroll.height()
        wH = self.window.height()  #self.vbar.maximum()
        pos = e.y() / scrH
        try:
            self.hardScroll((wH * pos) - self.dragStartScroll)
        except:
            pass

    def wh_change(self, e):

        #print(e, self.scroll_pos, self.targetType)
        #if self.targetType == None:

        #EEEE
        #self.scroll_pos = self.scroll_pos_old = e

        pass

    def wh(self, e):
        max = self.scroll.verticalScrollBar().maximum()
        #self.targetType = 'wheel'

        self.scroll_pos = self.scroll_pos - e.angleDelta().y()

        if self.scroll_pos > max:
            self.hardScroll(max - 1)
        elif self.scroll_pos < 0:
            self.hardScroll(0)

    def hardScroll(self, e):
        self.scroll_pos = self.scroll_pos_old = e

    def ani_func(self):

        self.scroll_pos_old = self.scroll_pos_old - (
            (self.scroll_pos_old - self.scroll_pos) / 4)
        self.scroll.verticalScrollBar().setValue(self.scroll_pos_old)

    def setSize(self, *size):
        h, v = size
        print(self.size())
        self.window.setFixedWidth(h)

        self.setFixedSize(*size)
        self.scroll.setFixedSize(h, v - 20)

        self.maxWidth = int(self.width() / self.icon_size) * self.icon_size
        self.reposition()

    def run_c(self, command):
        """Executes a system command."""

    def lm_cmd(self):
        cmd = self.lb.text() + ' ' + "'" + self.selectFile + "'"
        self.cmd_run(cmd)

    def rm_cmd(self):
        cmd = self.lb.text()
        self.cmd_run(cmd)

    def cmd_run(self, command):
        print(command)

        #subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
        pros = QProcess(self)
        pros.finished.connect(self.proc_finish)

        str = "/bin/sh -c \"" + command + "\""

        pros.start(str)
        try:
            self.mousemenu.close()
        except:
            pass
        #self.scroll.verticalScrollBar().setValue = self.scroll_pos
        #update

        pass

    def proc_finish(self):

        self.refresh()

    def lm_menu(self):
        print(self.selectFile)
        self.cmd_run("xdg-open " + self.selectFile)

        return
        #НУЖНО ЛИ МЕНЮ НА ЛЕВЫЙ КЛИК?
        #НАВЕРНОЕ ЛУЧШЕ ОРГАНИЗОВАТЬ ЧЕРЕЗ ПРОБЕЛ
        self.mousemenu = QMenu(self)
        act = QWidgetAction(self)

        self.menuMain = QWidget(self)
        self.menuMain.setStyleSheet('background: #111')

        #XDG-OPEN
        self.btn_open = QPushButton(self.menuMain)

        self.btn_open.setStyleSheet(
            "background: gray; text-align: left; padding-left: 3px")
        self.btn_open.setText("Open")
        self.btn_open.setFixedSize(194, 20)
        self.btn_open.pressed.connect(
            lambda: self.cmd_run("xdg-open " + self.selectFile))
        self.btn_open.move(3, 3)

        #INPUT CMD
        self.lb = QLineEdit(self.menuMain)
        self.lb.move(3, 23)
        self.lb.setFixedSize(194, 20)
        self.lb.setPlaceholderText('cmd')
        self.lb.setStyleSheet('background: white')

        self.lb.returnPressed.connect(self.lm_cmd)

        self.menuMain.setFixedSize(200, 100)
        act.setDefaultWidget(self.menuMain)
        self.mousemenu.addAction(act)
        try:
            self.mousemenu.exec_(self.globalPos)
        except:
            self.mousemenu.exec_([0, 0])

    def contextMenuEvent(self, event):
        self.mousemenu = QMenu(self)
        act = QWidgetAction(self)

        self.menuSecond = QWidget(self)
        self.menuSecond.setStyleSheet('background: #511')

        self.lb = QLineEdit(self.menuSecond)
        self.lb.move(3, 3)
        self.lb.setFixedSize(194, 20)
        self.lb.setPlaceholderText('cmd')
        self.lb.setStyleSheet('background: white')

        self.lb.returnPressed.connect(self.rm_cmd)

        self.menuSecond.setFixedSize(200, 100)
        act.setDefaultWidget(self.menuSecond)
        self.mousemenu.addAction(act)
        self.mousemenu.exec_(self.globalPos)

    def btnsClear(self):
        if len(self.btns):
            for i in self.btns:
                i.deleteLater()
                del i
            del self.btns[:]  # че за хрень

    def setDir(self, dir):
        dir = dir.replace("//", "/")

        #dir_enc = self.dFilter.enc(dir)
        #dir_dec = self.dFilter.dec(dir_enc)

        if os.path.isdir(dir) != True:

            if self.selectBtn.select != True:
                self.selectBtn.select = True
            return

        self.btnsClear()

        self.current_dir = dir.replace("//", "/")

        self.core.sort = 'abs123'

        self.files = self.core.read_dir(self.current_dir)

        #FILTER DIR
        self.parent.parent().address.setText(dir)

        os.chdir(dir)

        #self.history.set(self.current_dir)

        self.cycle = self.tmpL = 0
        self.asyncRender()

        self.refreshtime = QTimer()
        self.refreshtime.timeout.connect(self.refresh)
        self.refreshtime.start(1000)
        """
        self.ftime = QTimer()
        self.ftime.timeout.connect(self.dir_final)
        self.ftime.start(1000/60)
        """
        sys.modules['m'].setProgramName(sys.modules['appName'] + ' - ' +
                                        os.path.basename(os.getcwd()))

        #def dir_final(self):
        #    self.ftime.deleteLater()
        """
        try:
            self.btns[0].select = True
            self.btns[0].leaveEvent(QMouseEvent)
        except:
            print("first select btns error")
        """

    def redo(self):
        link = self.history.get(1)
        if link != None:
            #self.hardScroll()
            self.hardScroll(link[2])
            self.setDir(link[1])

    def undo(self):
        link = self.history.get(-1)
        if link != None:

            self.hardScroll(link[2])
            self.setDir(link[1])

    def selectAll(self):
        #selectOn = next((x for x in self.btns if x.select == True), None)
        selectOn = [x for x in self.btns if x.select == True]

        if not len(selectOn) == len(self.btns):
            for b in self.btns:
                b.selected()
                b.leaveEvent(QMouseEvent)
        else:
            for b in self.btns:
                b.unselected()
                b.leaveEvent(QMouseEvent)

    def deselect(self):
        for b in self.btns:
            b.unselected()
            b.leaveEvent(QMouseEvent)

    def asyncRender(self):

        self.renderTime = QTimer()
        self.renderTime.timeout.connect(self.render)
        self.renderTime.start(1000 / 60)

    def getTextSplit(self, text):
        def width(t):
            return label.fontMetrics().boundingRect(t).width()

        label = QLabel()
        mw = self.icon_size - 15
        spl = text.split(' ')

        group = ''
        for item in spl:
            if width(item) > mw:
                i = 0
                w = 0
                letter = ''
                while True:
                    w = w + width(item[i])
                    if w > mw:
                        w = 0
                        letter += ' ' + item[i]
                    elif item[i] == '-':
                        w = 0
                        letter += item[i] + ' '
                    else:
                        letter += item[i]

                    i = i + 1
                    if i == len(item):
                        break

                group += letter + ' '
            else:
                group += item + ' '
        return group

    def rebuild(self):
        btns_rebuild = []
        for f in self.btns:
            try:
                f.move(1, 1)
                btns_rebuild.append(f)
            except:
                pass
        self.btns = btns_rebuild

    def res(self):
        print('a', self.window.size(), self.size())

    def reposition(self):
        if self.btns == None:
            self.btns = []
        self.rebuild()
        #if f.value not in self.files:
        #    print(f.value)
        #self.create_button(f.value)
        #123
        i = 0
        l = 0

        for f in self.btns:

            count_hoz = int(self.maxWidth / self.icon_size)
            x = (self.icon_size * i) % self.maxWidth
            y = self.icon_size * l
            try:
                f.move(x, y)
            except:
                print('ERROR BTN', f)

            if i % count_hoz == count_hoz - 1:
                l = l + 1
            i = i + 1

        #WINDOW SCROLL
        m = sys.modules['m']

        if self.window.height() <= self.height() - m.addrborder.height():
            self.window.setFixedHeight(self.height() - m.addrborder.height())
        else:
            self.window.setFixedHeight((l + 1) * self.icon_size)

    def dir_mod(self):
        self.refresh()

    def create_button(self, f):
        btn = object_file(self.window)
        realfile = self.current_dir + '/' + f

        #btn.realfile = realfile
        if core.type_file(self, realfile) == 'folder':
            btn.setIconFromTheme('folder')
        else:
            ic = iconProvider()
            ic = ic.icon(QFileInfo(realfile))

            btn.setIcon(ic)

        btn.setFileSize(120, 120)
        btn.setText(f)
        btn.init()

        btn.value = f
        btn.clicked.connect(self.btn_press)

        btn.setTrigger('123')
        self.btns.append(btn)

    def refresh(self):

        dir = self.current_dir

        #dir_dec = d.dec(dir)

        self.core.sort = 'abs123'

        #GET NEW LS`
        self.newfiles = self.core.read_dir(dir)

        l1 = set(self.files)
        l2 = set(self.newfiles)

        toDel = l1 - l2

        if len(toDel) > 0:

            for d in toDel:
                for btn in self.btns:
                    if d == btn.value:
                        btn.deleteLater()

        toAdd = l2 - l1

        unique = list(dict.fromkeys(toAdd))
        for f in unique:

            self.create_button(f)

        def btn_text(elem):
            return core.nat_keys(self, elem.value)[0]

        if self.btns != None:
            self.btns.sort(key=btn_text)

        self.btns = self.splitFolders(self.btns)
        self.files = self.newfiles

        self.reposition()

    def splitFolders(self, source_files):
        if source_files == None:
            return
        if len(source_files) == 0:
            return

        folders = []
        files = []

        if type(source_files[0]) is object_file:
            for file in source_files:
                realfile = self.current_dir + '/' + file.value

                if file.value[0] != '.' or self.hidden != True:
                    if core.type_file(self, realfile) == 'folder':
                        folders.append(file)
                    else:
                        files.append(file)

        else:
            for file in source_files:
                realfile = self.current_dir + '/' + file

                if file[0] != '.' or self.hidden != True:
                    if core.type_file(self, realfile) == 'folder':
                        folders.append(file)
                    else:
                        files.append(file)
        return folders + files

    def render(self):
        if len(self.files) == 0:
            return

        i = self.cycle
        l = self.tmpL

        combine = self.splitFolders(self.files)
        cycleAll = int(len(combine) / 50) * 50
        try:
            float_perc = self.cycle / cycleAll
        except ZeroDivisionError:
            float_perc = 0

        self.parent.parent().setLoadPercent(float_perc * 100)
        if int(float_perc) == 1:
            self.parent.parent().hideLoader()

        for file in range(len(combine)):
            file = file + self.cycle
            btn = object_file(self.window)

            try:
                realfile = self.current_dir + '/' + combine[file]
            except:
                print('733 explore', 'no found file error')
                return

            btn.realfile = realfile

            if core.type_file(self, realfile) == 'folder':
                btn.setIconFromTheme('folder')
            else:
                ic = iconProvider()
                ic = ic.icon(QFileInfo(realfile))

                btn.setIcon(ic)

            btn.setFileSize(120, 120)
            btn.setText(combine[file])
            btn.init()

            x = (self.icon_size * i) % self.maxWidth
            y = self.icon_size * l

            btn.move(x, y)

            count_hoz = int(self.maxWidth / self.icon_size)

            if file % count_hoz == count_hoz - 1:
                l = l + 1
            i = i + 1

            btn.value = combine[file]
            try:
                btn.date = os.path.getctime(realfile)
            except:
                btn.date = 0

            btn.clicked.connect(self.btn_press)
            btn.setTrigger(lambda: self.button_trigger)
            self.btns.append(btn)

            if i % 50 == 0:
                self.cycle = i
                self.tmpL = l
                break
            elif file == len(combine) - 1:
                self.renderTime = None
                self.cycle = -1
                break
        self.window.setFixedHeight((l + 1) * self.icon_size)

        if self.cycle == -1:
            return
        self.asyncRender()

    def collision(self):
        iscoll = []

        for b in self.btns:
            e = {
                'x': b.pos().x() + 120,
                'y': b.pos().y() + 120,
                'w': (b.pos().x() + b.size.width()) - b.size.width(),
                'h': (b.pos().y() + b.size.height()) - b.size.height()
            }

            if (e['x'] > self.select_rect_coll[0]  and e['w'] < self.select_rect_coll[2]) \
                and (e['y'] > self.select_rect_coll[1] and e['h'] < self.select_rect_coll[3]):
                iscoll.append(b)
        return iscoll

    def mousePressEvent(self, QMouseEvent):
        #self.unSelectAll() #Здесь сбивает работу мыши
        hover = self.isHoverButton()
        if not hover:
            self.deselect()

        self.press = True
        self.globalPos = QMouseEvent.globalPos()
        self.windowMouseCoord = self.window.mapFromGlobal(
            QMouseEvent.globalPos())

        self.selection = QFrame(self.window)

        self.selection.setStyleSheet("""
            background: rgba(140,200,255,.0);
            border-radius: 10px;
            border-width: 1px;
            border-style: solid;
            border-color: rgba(0,0,0,.2);

        """)
        self.startCoord = QPoint(self.windowMouseCoord)

        #if abs(self.startCoord.x()) > 1 and abs(self.startCoord.y()) > 1:
        self.selection.setFixedSize(0, 0)
        self.selection.move(5, 5)
        self.selection.move(self.windowMouseCoord)
        self.selection.show()

        if self.collized:
            self.itemsSelection = True
        else:
            self.itemsSelection = None

    def isHoverButton(self):
        for e in self.btns:
            try:
                if e.hover:
                    return True
            except:
                pass

    def isHoverButtonSelection(self):
        for e in self.collized:
            try:
                if e.hover:
                    return True
            except:
                pass

    def mouseMoveEvent(self, QMouseEvent):
        hover = self.isHoverButtonSelection()

        if self.itemsSelection:
            if hover:
                self.mimeData = QMimeData()

                urls = []
                for e in self.collized:
                    urls.append(
                        QUrl('file://' + self.current_dir + '/' + e.value))

                self.mimeData.setUrls(urls)
                self.drag = QDrag(self)
                self.drag.setMimeData(self.mimeData)

                ####################
                # ВОТ ЭТО ВАЖНО
                #self.drag.exec(Qt.LinkAction)
                self.drag.exec(Qt.CopyAction)

                if self.press:
                    pass
            else:
                for b in self.btns:
                    b.unselected()
                self.select_rect_coll = []
                self.collized = []

        else:  #if self.itemsSelection
            if self.btns == None:
                return

            self.select_rect_coll = [
                self.selection.x(),
                self.selection.y(),
                self.selection.x() + self.selection.width(),
                self.selection.y() + self.selection.height()
            ]
            for b in self.btns:
                b.unselected()
                b.leaveEvent(QMouseEvent)

            self.collized = self.collision()

            for b in self.collized:
                b.selected()
                b.leaveEvent(QMouseEvent)
                # b.clicked.emit()

            self.windowMouseCoord = self.window.mapFromGlobal(
                QMouseEvent.globalPos())
            self.mouse = [self.windowMouseCoord.x(), self.windowMouseCoord.y()]
            self.windowMouseCoord = self.window.mapFromGlobal(
                QMouseEvent.globalPos())
            movePoint = self.startCoord - self.windowMouseCoord

            invertmove = self.startCoord - movePoint

            #Drawing selection
            if movePoint.x() > 0 and movePoint.y() > 0:
                self.selection.setFixedSize(abs(movePoint.x()),
                                            abs(movePoint.y()))
                self.selection.move(invertmove)
            elif movePoint.x() > 0:
                self.selection.setFixedSize(abs(movePoint.x()),
                                            abs(movePoint.y()))
                self.selection.move(invertmove.x(), self.startCoord.y())
            elif movePoint.y() > 0:
                self.selection.setFixedSize(abs(movePoint.x()),
                                            abs(movePoint.y()))
                self.selection.move(self.startCoord.x(), invertmove.y())
            else:
                self.selection.setFixedSize(abs(movePoint.x()),
                                            abs(movePoint.y()))
            #############################################################################

    def mouseReleaseEvent(self, QMouseEvent):
        self.press = False
        self.globalPos = QMouseEvent.globalPos()
        self.windowMouseCoord = self.window.mapFromGlobal(
            QMouseEvent.globalPos())
        if self.startCoord == QPoint(self.windowMouseCoord):

            self.select_rect_coll = []
        self.selection.deleteLater()
        pass

    def mimeTypes(self):
        mimetypes = super().mimeTypes()
        mimetypes.append('text/plain')
        return mimetypes

    def dropEvent(self, event):

        #print(event.dropAction() == Qt.CopyAction)

        #url = QUrl()

        links = []
        for url in event.mimeData().urls():
            url = QUrl(url)
            links.append(url.toLocalFile())
        sys.modules['scr.core'].core.copy(sys.modules['scr.core'].core, links,
                                          os.getcwd())
        self.refresh()
        #path = url.toLocalFile().toLocal8Bit().data()
        #if os.path.isfile(path):
        #    print(path)
        #self.refresh()
    def dragEnterEvent(self, event):

        if event.mimeData().hasUrls():
            event.accept()
        else:
            event.ignore()

    def dragMoveEvent(self, Event):
        print('drag', Event.pos())

    def button_trigger(self, e):
        print('WIN', e.value)

    def btn_press(self):

        self.globalPos = self.sender().globalPos

        if self.sender().target == 'None':
            try:
                self.selectBtn.select = None
            except:
                print('none target')
                pass

        if not self.sender().select and self.sender().target == 'icon':
            try:
                self.selectBtn.select = None
                self.selectBtn.btn_update = True
                self.selectBtn.update()
            except:
                pass

            self.sender().select = True
            self.selectBtn = self.sender()
            return

        if self.sender() == self.selectBtn and self.sender().target == 'icon':

            try:
                self.selectBtn.select = None
                self.selectBtn.btn_update = True
                self.selectBtn.update()
            except:
                pass

            self.selectBtn = self.sender()
            self.selectFile = os.path.normpath(self.current_dir + '/' +
                                               self.sender().value)

            if os.path.isdir(self.selectFile):
                self.setDir(self.current_dir + '/' + self.sender().value)
                self.history.set(self.current_dir, self.scroll_pos)

            else:
                self.setDir(self.current_dir + '/' + self.sender().value)
                self.lm_menu()