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)
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)
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
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)
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
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()