Пример #1
0
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)
Пример #2
0
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()
Пример #3
0
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
Пример #5
0
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
Пример #6
0
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)