class BottomLeft(QWidget): def __init__(self, parent): super().__init__(parent) self.initBottomLeft() def initBottomLeft(self): self.texto3 = QLabel(self) self.texto3.setText( 'Selecione o Tempo de Duração da Leitura \n em Segundos (s)') self.texto3.adjustSize() self.time_selection = QSpinBox(self) # self.time_selection.setMinimum(10) # self.time_selection.setMaximum(900) self.time_selection.setRange(10, 900) self.time_selection.setSingleStep(10) self.init_bttn = QPushButton('Iniciar Leitura', self) self.stop_bttn = QPushButton('Parar Leitura', self) self.stop_bttn.setDisabled(True) self.file_list = QListWidget() self.file_list.setMaximumWidth(219) self.file_list.horizontalScrollBar().setValue(10) self.add_file = QPushButton('Adicionar Arquivo', self) self.clr = QPushButton('Limpar Janela', self) self.show_graph = QPushButton('Mostrar Gráfico do Arquivo Selecionado', self) self.progress = QProgressBar() self.progress.setMinimumWidth(219) self.timer = QTimer(self) hbox2 = QHBoxLayout() hbox2.addWidget(self.init_bttn) hbox2.addWidget(self.stop_bttn) hbox5 = QHBoxLayout() hbox5.addWidget(self.add_file) hbox5.addWidget(self.clr) vbox2 = QVBoxLayout() vbox2.addWidget(self.texto3) vbox2.addWidget(self.time_selection) vbox2.addLayout(hbox2) vbox2.addWidget(self.file_list) vbox2.addLayout(hbox5) vbox2.addWidget(self.show_graph) vbox2.addWidget(self.progress) hbox4 = QHBoxLayout() hbox4.addLayout(vbox2) hbox4.addStretch(1) self.setLayout(hbox4)
class JSONNavigation(PWidget): currentChange = pyqtSignal() alert = pyqtSignal(str) def __init__(self): super().__init__() self.searchBar = QLineEdit() self.searchBar.setPlaceholderText("Search..") self.searchBar.textChanged.connect(self.searchFile) self.searchBar.setFixedHeight(36) self.addButton = QToolButton() self.addButton.setIcon(PResource.defaultIcon(Parapluie.Icon_Plus_Svg)) self.addButton.setFixedSize(36, 36) self.addButton.pressed.connect(self.newFile) self.openButton = QToolButton() self.openButton.setIcon( PResource.defaultIcon(Parapluie.Icon_Folder_Svg)) self.openButton.setFixedSize(36, 36) self.openButton.pressed.connect(self.openFile) topBar = QHBoxLayout() topBar.addWidget(self.searchBar) topBar.addWidget(self.openButton) topBar.addWidget(self.addButton) self.listDataWidget = QListWidget() self.listDataWidget.setObjectName(Parapluie.Object_Raised_Off) self.listDataWidget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.listDataWidget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.listDataWidget.horizontalScrollBar().setEnabled(False) self.listDataWidget.setSpacing(3) layout = QVBoxLayout() layout.setContentsMargins(8, 8, 0, 8) layout.addLayout(topBar) layout.addSpacing(8) layout.addWidget(self.listDataWidget) self.setObjectName(Parapluie.Object_Raised_Off) self.setLayout(layout) self.dataList = [] self.dataSource = [] self.dataTemp = [] self.currentFile = None self.newCount = -1 self.listAdapter = JsonAdapter(self, self.listDataWidget, self.dataList, self.onItemSelected, self.onItemClosed) self.loadFile() def loadFile(self): if os.path.isfile(Config.getViewerRecentFile()): file = open(Config.getViewerRecentFile(), 'r', encoding='utf-8') data = file.read().splitlines() for d in data: if d not in self.dataSource: self.dataSource.insert(0, XFile(d)) self.updateDataList(self.dataTemp, self.dataSource) file.close() else: file = open(Config.getViewerRecentFile(), 'w', encoding='utf-8') file.close() def addRecentFile(self, f: XFile): if os.path.isfile(Config.getViewerRecentFile()): file = open(Config.getViewerRecentFile(), 'r', encoding='utf-8') data = file.read().splitlines() file.close() if f.getPath() not in data: data.append(f.getPath()) else: data.remove(f.getPath()) data.append(f.getPath()) file = open(Config.getViewerRecentFile(), 'w', encoding='utf-8') file.write("\n".join(data)) file.close() else: file = open(Config.getViewerRecentFile(), 'a+', encoding='utf-8') file.write(f.getPath() + "\n") file.close() def removeFile(self, f: XFile): if os.path.isfile(Config.getViewerRecentFile()): file = open(Config.getViewerRecentFile(), 'r', encoding='utf-8') data = file.read().splitlines() file.close() if f.getPath() in data: data.remove(f.getPath()) file = open(Config.getViewerRecentFile(), 'w', encoding='utf-8') file.write("\n".join(data)) file.close() else: file = open(Config.getViewerRecentFile(), 'a+', encoding='utf-8') file.close() def updateDataList(self, lstNew, lstSrc): self.dataList.clear() # unsaved item for data in lstNew: item = ItemModel() item.file = data if data == self.currentFile: item.selected = 1 else: item.selected = 0 self.dataList.append(item) if len(lstSrc) > 0: # header item item = ItemModel() item.file = "Recent File" item.selected = -1 self.dataList.append(item) # recent item for data in lstSrc: item = ItemModel() item.file = data if data == self.currentFile: item.selected = 1 else: item.selected = 0 self.dataList.append(item) def searchFile(self, a0: str): if a0 == "": self.updateDataList(self.dataTemp, self.dataSource) else: lst = [] for i in self.dataSource: if a0.lower() in i.name()[0].lower(): lst.append(i) self.updateDataList([], lst) self.listAdapter.refresh() def newFile(self): self.newCount += 1 json = XFile("Unsaved\\Untitled-" + str(self.newCount)) self.currentFile = json self.dataTemp.insert(0, json) self.updateDataList(self.dataTemp, self.dataSource) self.listAdapter.refresh() self.currentChange.emit() def onItemSelected(self, data): if os.path.isfile( data.getPath()) or data.getPath().startswith("Unsaved\\"): if self.currentFile != data: self.currentFile = data self.currentChange.emit() if isinstance(data, XFile): for item in self.dataList: if item.file == data: item.selected = 1 else: item.selected = 0 self.listAdapter.refresh() else: self.alert.emit("File not found") self.onItemClosed(data) def onItemClosed(self, data): if self.currentFile == data: self.currentFile = None self.currentChange.emit() for i in self.dataList: if i.file == data: self.dataList.remove(i) break if data in self.dataSource: self.dataSource.remove(data) if data in self.dataTemp: self.dataTemp.remove(data) self.removeFile(data) self.searchFile(self.searchBar.text()) def openFile(self): init_dir = Config.getViewerConfig_LastOpen() file_ext = """All files (*);; JSON files (*.json);; XML files (*.xml);; HTML files (*.html);; Javascript files (*.js)""" name = QFileDialog.getOpenFileName(self, 'Open file', init_dir, file_ext) if name[0] != "": config = Config.getConfig() config["viewer"]["last_open"] = os.path.dirname(name[0]) Config.updateConfig(config) self.fileChanged(name[0]) def fileChanged(self, path: str): file = XFile(path) self.currentFile = file if path in self.dataTemp: self.dataTemp.remove(path) if path in self.dataSource: self.dataSource.remove(file) self.addRecentFile(file) self.loadFile() self.updateDataList(self.dataTemp, self.dataSource) self.listAdapter.refresh() self.currentChange.emit()
class ImageSlider(QWidget): def __init__(self): super().__init__() # setting title self.setWindowTitle("Python ") self.setGeometry(600, 600, 900, 300) self.hbox = QHBoxLayout() self.list_widget = QListWidget() # self.list_widget.setGeometry(50, 70, 300, 150) # item1.setIcon(QIcon("key_icon.ico")) self.items = [] # for i in range(20): # self.items.append(QListWidgetItem(str(i))) # self.list_widget.addItem(self.items[i]) # if(i%2 == 0): # self.items[i].setIcon(QIcon("thumbnail.jpg")) # else: # self.items[i].setIcon(QIcon("1.jpg")) # setting flow self.list_widget.setFlow(QListView.LeftToRight) self.list_widget.setIconSize(QtCore.QSize(190, 190)) self.list_widget.hasAutoScroll() self.list_widget.setAutoFillBackground(False) self.pic = QPushButton() self.pic.clicked.connect(lambda: self.goleftSmooth()) self.pic.setGeometry(10, 10, 50, 50) #use full ABSOLUTE path to the image, not relative self.pic.setIcon(QIcon("left.png")) self.hbox.addWidget(self.pic) self.hbox.addWidget(self.list_widget) self.pic2 = QPushButton() self.pic2.clicked.connect(lambda: self.gorightSmooth()) self.pic2.setGeometry(10, 10, 50, 50) #use full ABSOLUTE path to the image, not relative self.pic2.setIcon(QIcon("right.png")) self.hbox.addWidget(self.pic2) self.list_widget.horizontalScrollBar().setDisabled(True) self.list_widget.horizontalScrollBar().hide() self.list_widget.verticalScrollBar().setDisabled(True) self.list_widget.verticalScrollBar().hide() self.list_widget.setHorizontalScrollMode( QAbstractItemView.ScrollPerPixel) self.setLayout(self.hbox) self.atCurrentRight = 16 self.atCurrentLeft = 0 self.timerBaseInterval = 25 self.floorInterval = 5 self.timer = QTimer(self) self.timer.setInterval(self.timerBaseInterval) self.timer.timeout.connect(self.goRight) self.timer2 = QTimer(self) self.timer2.setInterval(self.timerBaseInterval) self.timer2.timeout.connect(self.goLeft) self.rightCounter = 0 self.leftCounter = 0 self.incrementalStep = 2 self.counterSize = 410 self.lingertime = 1 self.lingertimeCounter = 0 # self.list_widget.itemPressed.connect(lambda: self.test()) self.show() # def test(self): # print(self.list_widget.selectedItems()[0].url) #Takes list of images and adds them to the image container of this class def setImages(self, images, urls, movieIDs, titles): self.list_widget.clear() self.items = [] for i in range(len(images)): self.items.append(ClickableThumbnail(urls[i], movieIDs[i])) self.items[i].setText(titles[i]) self.list_widget.addItem(self.items[i]) pm = QPixmap() pm.loadFromData(base64.b64decode(images[i])) ic = QIcon() ic.addPixmap(pm) if (ic.isNull() == False): self.items[i].setIcon(ic) #movies images to the right to slide left by initiating a timer that moves the images smoothly by pixels def goleftSmooth(self): self.timer2.start() self.pic.setDisabled(True) self.pic2.setDisabled(True) #movies images to the left to slide right by initiating a timer that moves the images smoothly by pixels def gorightSmooth(self): self.timer.start() self.pic.setDisabled(True) self.pic2.setDisabled(True) #Function that timer2 uses to movie images right #It works by modifying the timer interval (time needed until this function is called again) #starts by high time interval to low then to high (slow fast slow) def goLeft(self): if (self.leftCounter != self.counterSize): if (self.leftCounter < math.ceil(self.counterSize * 0.4)): if (self.lingertime > self.lingertimeCounter): self.lingertimeCounter += 1 else: if (self.timer2.interval() > self.floorInterval): self.timer2.setInterval(self.timer2.interval() - 1) self.lingertime = self.timerBaseInterval - self.timer2.interval( ) self.lingertimeCounter = 5 elif (self.leftCounter > self.counterSize - math.ceil(self.counterSize * 0.4)): if (self.lingertime > self.lingertimeCounter): self.lingertimeCounter += 1 else: if (self.timer2.interval() < self.timerBaseInterval): self.timer2.setInterval(self.timer2.interval() + 1) self.lingertime = self.timerBaseInterval - self.timer2.interval( ) self.lingertimeCounter = 5 self.list_widget.horizontalScrollBar().setValue( self.list_widget.horizontalScrollBar().value() - self.incrementalStep) self.leftCounter += 1 self.repaint() if (self.leftCounter == math.ceil(self.counterSize / 2)): self.lingertimeCounter = 5 self.lingertime = self.timerBaseInterval else: self.timer2.setInterval(self.timerBaseInterval) self.leftCounter = 0 self.timer2.stop() self.pic.setEnabled(True) self.pic2.setEnabled(True) if (self.list_widget.horizontalScrollBar().value() == 0): self.timer2.setInterval(self.timerBaseInterval) self.leftCounter = 0 self.timer2.stop() self.pic.setEnabled(True) self.pic2.setEnabled(True) #functions similarly to goLeft but adds scrolls to the right by adding pixels to the scrollbar value rather than subtracting #TODO: integrate goleft and goright into 1 function, no need for 2 def goRight(self): # print(self.timer.interval()) if (self.rightCounter != self.counterSize): if (self.rightCounter < math.ceil(self.counterSize * 0.4)): if (self.lingertime > self.lingertimeCounter): self.lingertimeCounter += 1 else: if (self.timer.interval() > self.floorInterval): self.timer.setInterval(self.timer.interval() - 1) self.lingertime = self.timerBaseInterval - self.timer.interval( ) self.lingertimeCounter = 5 elif (self.rightCounter > self.counterSize - math.ceil(self.counterSize * 0.4)): if (self.lingertime > self.lingertimeCounter): self.lingertimeCounter += 1 else: if (self.timer.interval() < self.timerBaseInterval): self.timer.setInterval(self.timer.interval() + 1) self.lingertime = self.timerBaseInterval - self.timer.interval( ) self.lingertimeCounter = 5 self.list_widget.horizontalScrollBar().setValue( self.list_widget.horizontalScrollBar().value() + self.incrementalStep) self.rightCounter += 1 self.repaint() if (self.rightCounter == math.ceil(self.counterSize / 2)): self.lingertimeCounter = 5 self.lingertime = self.timerBaseInterval else: self.timer.setInterval(self.timerBaseInterval) self.rightCounter = 0 self.timer.stop() self.pic.setEnabled(True) self.pic2.setEnabled(True) if (self.list_widget.horizontalScrollBar().value() == self.list_widget.horizontalScrollBar().maximum()): self.timer.setInterval(self.timerBaseInterval) self.rightCounter = 0 self.timer.stop() self.pic.setEnabled(True) self.pic2.setEnabled(True)
class RequestNavigation(PWidget): alert = pyqtSignal(str, str, object, object) currentChange = pyqtSignal() def __init__(self): super().__init__() # self.setMaximumWidth(600) self.setObjectName(Parapluie.Object_Raised_Off) self.backButton = QToolButton() self.backButton.setIcon( PResource.defaultIcon(Parapluie.Icon_Left_Arrow_Svg)) self.backButton.setFixedSize(36, 36) self.backButton.pressed.connect(self.onBackPressed) self.searchBar = QLineEdit() self.searchBar.setPlaceholderText("Search..") self.searchBar.textChanged.connect(self.searchFile) self.searchBar.setFixedHeight(36) self.addButton = QToolButton() self.addButton.setIcon(PResource.defaultIcon(Parapluie.Icon_Plus_Svg)) self.addButton.setFixedSize(36, 36) self.addButton.pressed.connect(self.newFile) self.openButton = QToolButton() self.openButton.setIcon( PResource.defaultIcon(Parapluie.Icon_Folder_Svg)) self.openButton.setFixedSize(36, 36) self.openButton.pressed.connect(self.openFile) topBar = QHBoxLayout() topBar.addWidget(self.backButton) topBar.addWidget(self.searchBar) topBar.addWidget(self.openButton) topBar.addWidget(self.addButton) self.listDataWidget = QListWidget() self.listDataWidget.setContentsMargins(0, 0, 0, 0) # self.listDataWidget.setObjectName(Parapluie.Object_Raised) self.listDataWidget.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) self.listDataWidget.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding) self.listDataWidget.horizontalScrollBar().setEnabled(False) self.listDataWidget.setSpacing(3) self.gridData = PGridWidget(2) # self.gridData.setObjectName(Parapluie.Object_Raised) self.gridData.setContentsMargins(0, 0, 0, 0) self.gridData.setHorizontalSpacing(5) self.gridData.setVerticalSpacing(5) self.gridData.setFixColumn(True) self.gridData.setRowHeight(100) self.gridData.setAlignment(Qt.AlignTop | Qt.AlignLeft) self.stacked = QStackedWidget() self.stacked.addWidget(self.gridData) self.stacked.addWidget(self.listDataWidget) self.stacked.currentChanged.connect(self.tabChange) layout = QVBoxLayout() layout.addLayout(topBar) layout.addWidget(self.stacked) layout.setContentsMargins(8, 8, 0, 8) self.setLayout(layout) self.categoriesChange = None self.dataList = [] # combine self.categories = [] # string self.dataSource = XashList() self.dataTemp = [] # xfile self.listFile = [] # xfile self.currentFile = None self.newCount = -1 self.lastSearch = {1: "", 0: ""} self.listAdapter = ItemAdapter(self, self.listDataWidget, self.dataList, self.dataSource, self.onItemSelected, self.onItemClosed) gridAdapter = GridAdapter(data=self.categories) gridAdapter.setOnItemClick(self.onCategoriesClicked) self.gridData.setAdapter(gridAdapter) self.stacked.setCurrentIndex(1) self.tabChange(1) self.loadFile() def loadFile(self): self.dataSource.clear() self.dataSource.load(Config.getRequestFolder()[0]) self.updateCategories(self.dataSource.list) self.updateDataList(self.dataTemp, self.dataSource.list) self.listAdapter.refresh() self.gridData.refresh() def updateCategories(self, lstSrc): self.categories.clear() self.categories.append("all") self.categories.append('recent') for data in lstSrc: c = data.categories.category if data.categories is not None else "" if c != "" and c not in self.categories: self.categories.append(c) if self.categoriesChange is not None: self.categoriesChange(self.categories) def searchFile(self, a0: str): if self.stacked.currentIndex() == 1: self.lastSearch[1] = a0 if a0 == "" or a0 == "categories:all": self.updateDataList(self.dataTemp, self.dataSource.list) elif a0 == 'categories:recent': self.updateDataList(self.dataTemp, []) else: if a0.startswith("categories:"): self.updateDataList([], self.dataSource.findWithCategory( a0.replace("categories:", ""))) elif a0.startswith("name:"): self.updateDataList([], self.dataSource.findWithName( a0.replace("name:", ""))) else: self.updateDataList([], self.dataSource.findEveryWhere( "", a0, "description#" + a0)) self.listAdapter.refresh() else: self.lastSearch[0] = a0 self.categories.clear() if a0 == "": self.categories.append("all") self.categories.append('recent') for data in self.dataSource.list: d: Xash = data c = d.categories.category if d.categories is not None else "" if c != "" and c not in self.categories: self.categories.append(c) else: for data in self.dataSource.list: d: Xash = data c = d.categories.category if d.categories is not None else "" if c != "" and c not in self.categories and a0 in c: self.categories.append(c) self.gridData.refresh() def tabChange(self, index): if index == 1: self.backButton.setVisible(True) self.searchBar.setText(self.lastSearch[1]) self.searchBar.blockSignals(False) else: self.backButton.setVisible(False) self.searchBar.setText(self.lastSearch[0]) def onCategoriesClicked(self, txt): self.stacked.setCurrentIndex(1) self.searchBar.setText("categories:" + txt) def onBackPressed(self): self.stacked.setCurrentIndex(0) def resizeEvent(self, a0: QtGui.QResizeEvent): super(RequestNavigation, self).resizeEvent(a0) col = int(self.width() / 150) + 1 self.gridData.setNumberColumn(col) def refresh(self): self.listAdapter.refresh() self.gridData.refresh() def newFile(self): self.newCount += 1 file = XFile("Unsaved/Untitled-" + str(self.newCount)) self.dataTemp.insert(0, file) self.onItemSelected(file) self.updateDataList(self.dataTemp, self.dataSource.list) self.refresh() def pushAlert(self, text, tpe=Parapluie.Alert_Error): self.alert.emit(text, tpe, None, None) def openFile(self): init_dir = Config.getRequestConfig_LastOpen() name = QFileDialog.getOpenFileName( self, 'Open file', init_dir, "XuCompa Request (*.xreq);; JSON files (*.json);; All files (*)") if name[0] != "": config = Config.getConfig() config["viewer"]["last_open"] = os.path.dirname(name[0]) Config.updateConfig(config) file = XFile(name[0]) self.dataTemp.insert(0, file) self.onItemSelected(file) self.updateDataList(self.dataTemp, self.dataSource.list) self.refresh() def updateDataList(self, lstNew, lstSrc): self.dataList.clear() if len(lstNew): # header item item = ItemModel() item.file = "Recent File" item.selected = -1 self.dataList.append(item) for data in lstNew: # XFile item = ItemModel() item.file = data item.selected = 1 if self.currentFile == data else 0 self.dataList.append(item) if len(lstSrc) > 0: # header item item = ItemModel() item.file = "Request Folder" item.selected = -1 self.dataList.append(item) for data in lstSrc: # Xash item = ItemModel() if data.getPath() in self.listFile: inx = self.listFile.index(data.getPath()) file = self.listFile[inx] else: file = XFile(data.getPath()) self.listFile.append(file) item.file = file item.selected = 1 if self.currentFile == file else 0 self.dataList.append(item) def onItemSelected(self, data): if isinstance(data, XFile): self.currentFile = data self.currentChange.emit() for item in self.dataList: if item.file == data: item.selected = 1 else: item.selected = 0 self.refresh() def onItemClosed(self, data): if self.currentFile == data: self.currentFile = None self.currentChange.emit() if isinstance(data, XFile): if inRequestFolder(data.getPath()): message = PMessage( self, QRect(QPoint(0, 0), QApplication.focusWindow().screen().size())) Utilities.Style.applyWindowIcon(message) message.initWarning("Are you want delete this item!", negative="Delete") code = message.exec_() if code == 1: # remove description xash = XashHelp.path2Xash(data.getPath()) xashId = xash.getId() self.saveDescription("", xashId, True) # remove file os.remove(data.getPath()) if data in self.dataList: self.dataList.remove(data) if data in self.dataTemp: self.dataTemp.remove(data) self.loadFile() def saveData(self, file: XFile, newData): if file.unsavedData is not None: # has data unsaved if inRequestFolder(file.getPath()): self.saveExistedInRequest(file, newData) else: self.saveNewFile(file, newData) def getSavePath(self, name, category, description) -> str: # create new xashID xashId = XashHelp.newXashId(category, self.dataSource) # write description descId = self.saveDescription(description, xashId) # gotta new xash string x = XashHelp.createXash(name, xashId, {'description': descId}, '.xreq') # join with folder path = os.path.join(Config.getRequestFolder()[0], x) return path def saveDescription(self, desc, descId=None, isRemove=False): # read descriptions xDef = Config.getRequestFolder()[1] if os.path.isfile(xDef): file = open(xDef, "r", encoding='utf-8') data = file.read() file.close() else: data = '' # edit listDesc = data.split("\n") if descId is None and not isRemove: newId = '[desc#%s]' % str(len(listDesc)) lines = newId + 'xreq_description--description#' + desc listDesc.append(lines) else: newId = descId exist = False for d in listDesc: if d.startswith(newId): inx = listDesc.index(d) if not isRemove: listDesc[ inx] = newId + 'xreq_description--description#' + desc exist = True else: listDesc.remove(d) break if not exist: lines = newId + 'xreq_description--description#' + desc listDesc.append(lines) # save file = open(xDef, "w", encoding='utf-8') data = "\n".join(listDesc) file.write(data) file.close() return newId def saveNewFile(self, file: XFile, newData): temp = self.dataSource.findMatchAll(newData[1], newData[0], "", sensitive=False) if len(temp) > 0: self.pushAlert("File was existed!!!") else: # data text = Formatter.dumps(file.unsavedData.data, EditorType.JSON, self.pushAlert) path = self.getSavePath(newData[0], newData[1], newData[2]) if self.save(file, path, text): if file in self.dataTemp: self.dataTemp.remove(file) self.loadFile() def saveExistedInRequest(self, file: XFile, newData: tuple): # data text = Formatter.dumps(file.unsavedData.data, EditorType.JSON, self.pushAlert) xash = XashHelp.path2Xash(file.getPath()) if xash.getCategory() == newData[1] and xash.getName() == newData[0]: # replace existed description xashId = xash.getId() self.saveDescription(newData[2], xashId) if self.save(file, file.getPath(), text): self.loadFile() else: temp = self.dataSource.findMatchAll(newData[1], newData[0], "", sensitive=False) if len(temp) > 0: self.pushAlert("File was existed!!!") else: message = PMessage( self, QRect(QPoint(0, 0), QApplication.focusWindow().screen().size())) message.initQuestion( "File is saved, do you want to rename or create new file?", [{ "text": "Rename", 'type': Parapluie.Button_Negative }, { "text": "New File", 'type': Parapluie.Button_Positive }, { "text": "Close", 'type': Parapluie.Button_Neutral }], 'Save request') code = message.exec_() if code == 0: # remove old description xashId = xash.getId() self.saveDescription(newData[2], xashId, True) path = self.getSavePath(newData[0], newData[1], newData[2]) os.rename(file.getPath(), path) if self.save(file, path, text): self.loadFile() elif code == 1: path = self.getSavePath(newData[0], newData[1], newData[2]) if self.save(file, path, text): self.loadFile() def save(self, file: XFile, path, text) -> bool: try: f = open(path, 'w', encoding='utf-8') f.write(text) f.close() file.unsavedData = None file.setPath(path) file.data = XashHelp.path2Xash(path) self.pushAlert("Saved!!!", Parapluie.Alert_Success) return True except Exception as ex: logging.exception(ex) self.pushAlert(str(ex)) return False
class MainWindow(QWidget): def __init__(self, VKAPI): super(MainWindow, self).__init__() self.setMinimumSize(900, 580) self.setWindowTitle("VK Standalone") self.setWindowIcon(QIcon("pics/TitleIcon.png")) self.setStyleSheet("background-color: rgb(210,210,255);") self.__vkapi = VKAPI self.__old_dlg = None self.__dialogs_label = QLabel() self.__dialogs_label.setFont(QFont('Calibri', 14)) self.__dialogs_label.setText('Dialogs') self.__dialogs_label.setStyleSheet('color: white') self.__messages_label = QLabel() self.__messages_label.setFont(QFont('Calibri', 14)) self.__messages_label.setText('Messages') self.__messages_label.setStyleSheet('color: white') self.__btn_refresh = Button("Refresh") self.__btn_refresh.mouseClick.connect(self.getDialogs) self.__dialog_list_widget = QListWidget() self.__dialog_list_widget.setStyleSheet( "* { background-color: white; }") self.__dialog_list_widget.verticalScrollBar().setStyleSheet( "QScrollBar::handle:vertical {" + "background: rgb(210,210,255); }" + "QScrollBar:vertical { background: white; }") self.__dialog_list_widget.setFixedWidth(300) self.__dialog_list_widget.itemPressed.connect(self.dialogPressed) self.__messages_list_widget = QListWidget() self.__messages_list_widget.setStyleSheet("background-color: white;") self.__messages_list_widget.verticalScrollBar().setStyleSheet( "QScrollBar::handle:vertical {" + "background: rgb(210,210,255); }" + "QScrollBar:vertical { background: white; }") self.__messages_list_widget.horizontalScrollBar().setStyleSheet( "QScrollBar::handle:horizontal {" + "background: rgb(210,210,255); }" + "QScrollBar:horizontal { background: white; }") self.__send_message_btn = Button("Send") self.__send_message_btn.setFixedSize(80, 50) self.__send_message_btn.mouseClick.connect(self.sendMessage) self.__edit_new_message = EditMessage() self.__edit_new_message.enterPressed.connect(self.sendMessage) self.__hbox1 = QHBoxLayout() self.__hbox1.addWidget(self.__edit_new_message) self.__hbox1.addWidget(self.__send_message_btn) self.__vbox1 = QVBoxLayout() self.__vbox1.setSpacing(5) self.__vbox1.addWidget(self.__dialogs_label) self.__vbox1.addWidget(self.__dialog_list_widget) self.__vbox1.addWidget(self.__btn_refresh) self.__vbox2 = QVBoxLayout() self.__vbox2.setAlignment(Qt.AlignBottom) self.__vbox2.setSpacing(5) self.__vbox2.addWidget(self.__messages_label) self.__vbox2.addWidget(self.__messages_list_widget) self.__vbox2.addItem(self.__hbox1) self.__hbox = QHBoxLayout() self.__hbox.addItem(self.__vbox1) self.__hbox.addItem(self.__vbox2) self.setLayout(self.__hbox) self.hide() def loginSuccess(self): self.getDialogs() self.show() def dialogPressed(self): if self.__old_dlg is not None: self.__old_dlg.setStyleFree() self.__dialog_list_widget.itemWidget( self.__dialog_list_widget.currentItem()).setStylePressed() self.__old_dlg = self.__dialog_list_widget.itemWidget( self.__dialog_list_widget.currentItem()) self.__messages_list_widget.clear() try: self.getMessagesFromDialog() except: sleep(1.5) self.getMessagesFromDialog() self.__messages_list_widget.scrollToBottom() def getDialogs(self): self.__dialog_list_widget.clear() self.__messages_list_widget.clear() self.__old_dlg = None for i in self.__vkapi.getDialogsList(): shortLabel = MessageLabel(i.getShortText(), False, i.getPeerId()) item = QListWidgetItem() item.setSizeHint(QSize(20, 60)) self.__dialog_list_widget.addItem(item) self.__dialog_list_widget.setItemWidget(item, shortLabel) def getMessagesFromDialog(self): idx = self.__dialog_list_widget.itemWidget( self.__dialog_list_widget.currentItem()).peer_id for i in self.__vkapi.getMessagesList(idx): fullLabel = MessageLabel(i.getFullText(), True, i.peer_id) item = QListWidgetItem() self.__messages_list_widget.addItem(item) item.setSizeHint(fullLabel.sizeHint()) self.__messages_list_widget.setItemWidget(item, fullLabel) def sendMessage(self): try: self.__vkapi.sendMessage( self.__dialog_list_widget.itemWidget( self.__dialog_list_widget.currentItem()).peer_id, self.__edit_new_message.toPlainText()) self.__edit_new_message.clear() self.getMessagesFromDialog() self.__messages_list_widget.scrollToBottom() finally: pass
class ImageSlider(QWidget): def __init__(self): super().__init__() # setting title self.setWindowTitle("Python ") self.setGeometry(1000, 1000, 2000, 100) stylesheett = """ QPushbutton{ height: 50px; width: 50px; background-color: rgb(54,57,63); background-image: url("./Images/left.png"); } QPushbutton#pic:hover{ background-color: rgb(54,57,63); background-image: url("./Images/left_hover.png"); } QPushbutton#pic2{ height: 50px; width: 50px; background-color: rgb(54,57,63); background-image: url("./Images/right.png"); } QPushbutton#pic2:hover{ background-color: rgb(54,57,63); background-image: url("./Images/right_hover.png"); } """ self.setStyleSheet(stylesheett) self.hbox = QHBoxLayout() self.list_widget = QListWidget() self.items = [] # setting flow self.list_widget.setFlow(QListView.LeftToRight) self.list_widget.setIconSize(QtCore.QSize(190, 190)) self.list_widget.hasAutoScroll() self.list_widget.setAutoFillBackground(False) self.pic = QPushButton() self.pic.setObjectName("pic") self.pic.clicked.connect(lambda: self.goleftSmooth()) #use full ABSOLUTE path to the image, not relative self.hbox.addWidget(self.pic) self.hbox.addWidget(self.list_widget) self.pic2 = QPushButton() self.pic2.setObjectName("pic2") self.pic2.clicked.connect(lambda: self.gorightSmooth()) self.hbox.addWidget(self.pic2) self.list_widget.horizontalScrollBar().setDisabled(True) self.list_widget.horizontalScrollBar().hide() self.list_widget.verticalScrollBar().setDisabled(True) self.list_widget.verticalScrollBar().hide() self.list_widget.setHorizontalScrollMode( QAbstractItemView.ScrollPerPixel) self.setLayout(self.hbox) self.atCurrentRight = 16 self.atCurrentLeft = 0 self.timerBaseInterval = 25 self.floorInterval = 5 self.timer = QTimer(self) self.timer.setInterval(self.timerBaseInterval) self.timer.timeout.connect(self.goRight) self.timer2 = QTimer(self) self.timer2.setInterval(self.timerBaseInterval) self.timer2.timeout.connect(self.goLeft) self.rightCounter = 0 self.leftCounter = 0 self.incrementalStep = 1 self.counterSize = 410 self.lingertime = 1 self.lingertimeCounter = 0 self.show() #Takes list of images and adds them to the image container of this class def setImages(self, images, urls, movieIDs, titles): self.list_widget.clear() self.items = [] self.list_widget.setViewMode(QListWidget.IconMode) # self.list_widget.setResizeMode(QListWidget.Adjust); # self.list_widget.setIconSize(QSize(150,150)); # self.list_widget.setAcceptDrops(True); # self.list_widget.setDragEnabled(False); for i in range(len(images)): self.items.append(ClickableThumbnail(urls[i], movieIDs[i])) self.items[i].setText(titles[i]) self.list_widget.addItem(self.items[i]) pm = QPixmap() pm.loadFromData(base64.b64decode(images[i])) ic = QIcon() pm = pm.scaled(QSize(220, 150), Qt.IgnoreAspectRatio) ic.addPixmap(pm) if (ic.isNull() == False): self.items[i].setIcon(ic) #movies images to the right to slide left by initiating a timer that moves the images smoothly by pixels def goleftSmooth(self): self.timer2.start() self.pic.setDisabled(True) self.pic2.setDisabled(True) #movies images to the left to slide right by initiating a timer that moves the images smoothly by pixels def gorightSmooth(self): self.timer.start() self.pic.setDisabled(True) self.pic2.setDisabled(True) #Function that timer2 uses to movie images right #It works by modifying the timer interval (time needed until this function is called again) #starts by high time interval to low then to high (slow fast slow) def goLeft(self): if (self.leftCounter != self.counterSize): if (self.leftCounter < math.ceil(self.counterSize * 0.4)): if (self.lingertime > self.lingertimeCounter): self.lingertimeCounter += 1 else: if (self.timer2.interval() > self.floorInterval): self.timer2.setInterval(self.timer2.interval() - 1) self.lingertime = self.timerBaseInterval - self.timer2.interval( ) self.lingertimeCounter = 5 elif (self.leftCounter > self.counterSize - math.ceil(self.counterSize * 0.4)): if (self.lingertime > self.lingertimeCounter): self.lingertimeCounter += 1 else: if (self.timer2.interval() < self.timerBaseInterval): self.timer2.setInterval(self.timer2.interval() + 1) self.lingertime = self.timerBaseInterval - self.timer2.interval( ) self.lingertimeCounter = 5 self.list_widget.horizontalScrollBar().setValue( self.list_widget.horizontalScrollBar().value() - self.incrementalStep) self.leftCounter += 1 self.repaint() if (self.leftCounter == math.ceil(self.counterSize / 2)): self.lingertimeCounter = 5 self.lingertime = self.timerBaseInterval else: self.timer2.setInterval(self.timerBaseInterval) self.leftCounter = 0 self.timer2.stop() self.pic.setEnabled(True) self.pic2.setEnabled(True) if (self.list_widget.horizontalScrollBar().value() == 0): self.timer2.setInterval(self.timerBaseInterval) self.leftCounter = 0 self.timer2.stop() self.pic.setEnabled(True) self.pic2.setEnabled(True) #functions similarly to goLeft but adds scrolls to the right by adding pixels to the scrollbar value rather than subtracting #TODO: integrate goleft and goright into 1 function, no need for 2 def goRight(self): # print(self.timer.interval()) if (self.rightCounter != self.counterSize): if (self.rightCounter < math.ceil(self.counterSize * 0.4)): if (self.lingertime > self.lingertimeCounter): self.lingertimeCounter += 1 else: if (self.timer.interval() > self.floorInterval): self.timer.setInterval(self.timer.interval() - 1) self.lingertime = self.timerBaseInterval - self.timer.interval( ) self.lingertimeCounter = 5 elif (self.rightCounter > self.counterSize - math.ceil(self.counterSize * 0.4)): if (self.lingertime > self.lingertimeCounter): self.lingertimeCounter += 1 else: if (self.timer.interval() < self.timerBaseInterval): self.timer.setInterval(self.timer.interval() + 1) self.lingertime = self.timerBaseInterval - self.timer.interval( ) self.lingertimeCounter = 5 self.list_widget.horizontalScrollBar().setValue( self.list_widget.horizontalScrollBar().value() + self.incrementalStep) self.rightCounter += 1 self.repaint() if (self.rightCounter == math.ceil(self.counterSize / 2)): self.lingertimeCounter = 5 self.lingertime = self.timerBaseInterval else: self.timer.setInterval(self.timerBaseInterval) self.rightCounter = 0 self.timer.stop() self.pic.setEnabled(True) self.pic2.setEnabled(True) if (self.list_widget.horizontalScrollBar().value() == self.list_widget.horizontalScrollBar().maximum()): self.timer.setInterval(self.timerBaseInterval) self.rightCounter = 0 self.timer.stop() self.pic.setEnabled(True) self.pic2.setEnabled(True)