class TreeViewToolbar(QWidget):

    # noinspection PyArgumentList
    def __init__(self, scene, parent=None):
        """
        The constructor for a tree view toolbar
        :param scene: The tree scene for this toolbar
        :param parent: The parent widget
        """
        super(TreeViewToolbar, self).__init__(parent, Qt.Widget)
        self.scene = scene
        self.layout = QVBoxLayout(self)

        self.zoom_in_button = view.elements.ToolbarButton(
            QIcon("view/icon/plus.svg"))
        self.zoom_in_button.setToolTip("Zoom In (Ctrl++)")
        self.zoom_in_action = QAction()
        self.zoom_in_action.setShortcuts(
            [QKeySequence.ZoomIn,
             QKeySequence(Qt.CTRL + Qt.Key_Equal)])
        self.zoom_in_action.triggered.connect(self.zoom_in_button.animateClick)
        self.zoom_in_button.addAction(self.zoom_in_action)
        self.zoom_in_button.clicked.connect(
            lambda: self.scene.zoom(1.25, 1.25))

        self.zoom_out_button = view.elements.ToolbarButton(
            QIcon("view/icon/minus.svg"))
        self.zoom_out_button.setToolTip("Zoom Out (Ctrl+-)")
        self.zoom_out_button.setShortcut(QKeySequence.ZoomOut)
        self.zoom_out_button.clicked.connect(
            lambda: self.scene.zoom(0.75, 0.75))

        self.reset_button = view.elements.ToolbarButton(
            QIcon("view/icon/refresh-cw.svg"))
        self.reset_button.setToolTip("Reset View (F5)")
        self.reset_action = QAction()
        self.reset_action.setShortcuts(
            [QKeySequence.Refresh,
             QKeySequence(Qt.CTRL + Qt.Key_R)])
        self.reset_action.triggered.connect(self.reset_button.animateClick)
        self.reset_button.addAction(self.reset_action)
        self.reset_button.clicked.connect(self.scene.align_tree)

        self.layout.addWidget(self.zoom_in_button)
        self.layout.addWidget(self.zoom_out_button)
        self.layout.addWidget(self.reset_button)
        self.setLayout(self.layout)
        self.setGeometry(10, 10,
                         self.layout.sizeHint().width(),
                         self.layout.sizeHint().height())
예제 #2
0
 def setupUi(self, MnStatusDlg):
     MnStatusDlg.setModal(True)
     layout = QVBoxLayout(MnStatusDlg)
     layout.setContentsMargins(10, 15, 10, 10)
     name = QLabel("<b><i>%s</i></b>" % self.mnAlias)
     name.setAlignment(Qt.AlignCenter)
     layout.addWidget(name)
     body = QFormLayout()
     body.setLabelAlignment(Qt.AlignRight)
     body.setVerticalSpacing(20)
     body.setContentsMargins(25, 10, 25, 30)
     body.addRow(QLabel("<b>Address</b>"), QLabel(self.statusData['addr']))
     body.addRow(QLabel("<b>Tx Hash: idx</b>"), QLabel(self.statusData['txhash']+": "+str(self.statusData['outidx'])))
     body.addRow(QLabel("<b>Network</b>"), QLabel(self.statusData['network']))
     body.addRow(QLabel("<b>Version</b>"), QLabel(str(self.statusData['version'])))
     body.addRow(QLabel("<b>Rank</b>"), QLabel(str(self.statusData['rank'])))
     body.addRow(QLabel("<b>Queue Position</b>"), QLabel(str(self.statusData['queue_pos'])))
     body.addRow(QLabel("<b>Active Time</b>"), QLabel(sec_to_time(self.statusData['activetime'])))
     body.addRow(QLabel("<b>Last Seen</b>"), QLabel(time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(self.statusData['lastseen']))))
     body.addRow(QLabel("<b>Last Paid</b>"), QLabel(time.strftime('%Y-%m-%d %H:%M:%S', time.gmtime(self.statusData['lastpaid']))))
     layout.addLayout(body)
     self.okButton = QPushButton('OK')
     self.okButton.clicked.connect(self.accept)
     layout.addWidget(self.okButton)
     sh = layout.sizeHint()
     self.setFixedSize(sh)
예제 #3
0
    def setupUi(self, PinMatrixDlg):
        PinMatrixDlg.setModal(True)
        layout = QVBoxLayout(PinMatrixDlg)
        layout.setContentsMargins(10, 8, 10, 10)

        # Header
        title = QLabel("<b>%s</b>" % PinMatrixDlg.text)
        title.setAlignment(Qt.AlignCenter)
        layout.addWidget(title)

        # Label
        lbl_style = """
                    QLabel {margin-top: 10px; color: purple; font-size: 15pt}
                    """
        self.lbl_pin = QLabel()
        self.lbl_pin.setAlignment(Qt.AlignCenter)
        self.lbl_pin.setStyleSheet(lbl_style)
        layout.addWidget(self.lbl_pin)

        # Buttons
        btn_style = """
                    QPushButton {padding: 1px 1px 1px; border: 1px solid purple; min-width: 90px; min-height:90px}
                    QPushButton:enabled {background-color: white}
                    QPushButton:pressed {background-color: purple; color:white; border: 1px solid purple}
                    """
        self.btn = []
        for i in range(9):
            btn_lab = '\u2022' if PinMatrixDlg.hideBtns else str(i + 1)
            btn = QPushButton(btn_lab)
            self.btn.append(btn)

        # Grid
        btnMatrix = QWidget(self)
        btnMatrix.setStyleSheet(btn_style)
        grid = QGridLayout()
        grid.addWidget(self.btn[0], 2, 0, Qt.AlignCenter)
        grid.addWidget(self.btn[1], 2, 1, Qt.AlignCenter)
        grid.addWidget(self.btn[2], 2, 2, Qt.AlignCenter)
        grid.addWidget(self.btn[3], 1, 0, Qt.AlignCenter)
        grid.addWidget(self.btn[4], 1, 1, Qt.AlignCenter)
        grid.addWidget(self.btn[5], 1, 2, Qt.AlignCenter)
        grid.addWidget(self.btn[6], 0, 0, Qt.AlignCenter)
        grid.addWidget(self.btn[7], 0, 1, Qt.AlignCenter)
        grid.addWidget(self.btn[8], 0, 2, Qt.AlignCenter)
        btnMatrix.setLayout(grid)
        layout.addWidget(btnMatrix)

        # Del/OK/Cancel button
        self.btn_del = QPushButton('\u232b')
        self.btn_del.setToolTip("Remove last entered key")
        layout.addWidget(self.btn_del)
        hBox = QHBoxLayout()
        self.btn_ok = QPushButton('OK')
        self.btn_cancel = QPushButton('Cancel')
        hBox.addWidget(self.btn_ok)
        hBox.addWidget(self.btn_cancel)
        layout.addLayout(hBox)

        sh = layout.sizeHint()
        self.setFixedSize(sh)
예제 #4
0
    def __init__(self,
                 label: str,
                 card: Card,
                 mw,
                 browser: Browser,
                 specific_info: str = None):
        super().__init__()
        self.mw = mw
        self.card = card
        hbox = QHBoxLayout()
        hbox.addWidget(QLabel(label))
        hbox.addStretch()
        more_info = QLabel(specific_info)
        hbox.addWidget(more_info)
        card_btn = QPushButton("Card")

        def show_card():
            browser.form.searchEdit.lineEdit().setText("cid:" + str(card.id))
            browser.onSearchActivated()

        card_btn.clicked.connect(show_card)
        forvo_btn = QPushButton("Forvo")
        forvo_btn.clicked.connect(lambda: QDesktopServices.openUrl(
            QUrl("https://forvo.com/search/" + label)))
        hbox.addWidget(card_btn)
        hbox.addWidget(forvo_btn)
        hbox.setContentsMargins(10, 0, 0, 0)
        vbox = QVBoxLayout()
        vbox.addLayout(hbox)
        vbox.setContentsMargins(0, 10, 10, 10)
        self.setLayout(vbox)
        self.setMinimumSize(vbox.sizeHint())
        self.adjustSize()
예제 #5
0
class GenericDialog(QDialog):

    def __init__(self, title: str, input_list: list[InputClass], entries_per_page: int=10, parent=None, message=None):
        QDialog.__init__(self, parent)
        self.setWindowTitle(title)
        self.verticalLayout = QVBoxLayout(self)
        self.tabWidget = QTabWidget(self)

        self.buttonBox = QDialogButtonBox(self)
        self.buttonBox.setOrientation(Qt.Horizontal)
        self.buttonBox.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok)

        self.buttonBox.accepted.connect(lambda: self.exit_dialog(True))
        self.buttonBox.rejected.connect(lambda: self.exit_dialog(False))

        self.input_list = input_list

        current_page_number = 1
        current_page = PageWidget(self)
        if len(input_list) <= entries_per_page:
            self.tabWidget.addTab(current_page, title)
        else:
            self.tabWidget.addTab(current_page, f'{title}: 1')

        current_entry_number = 0
        for input_obj in input_list:
            current_entry_number += 1
            if current_entry_number > entries_per_page:
                current_page = PageWidget(self)
                current_page_number += 1
                self.tabWidget.addTab(current_page, f'{title}: {current_page_number}')
                current_entry_number = 1
            current_page.add_object(input_obj.get_label(), input_obj.get_widget())

        if message:
            messageLabel = QLabel()
            messageLabel.setText(message)
            messageLabel.setWordWrap(True)
            self.verticalLayout.addWidget(messageLabel)


        self.verticalLayout.addWidget(self.tabWidget)
        self.verticalLayout.addWidget(self.buttonBox)

        self.resize(self.verticalLayout.sizeHint())

        self.output = None
        self.accepted = False
        self.setModal(True)

    def exit_dialog(self, accepted):
        self.accepted = accepted
        self.close()

    def closeEvent(self, event):
        self.output = MixedDict()
        for input_obj in self.input_list:
            self.output[input_obj.get_label()] = input_obj.get_value()
예제 #6
0
class ImportModule(QDialog):
    def __init__(self, parent=None):
        super(ImportModule, self).__init__(parent)
        self.layout = QVBoxLayout(self)

        self.first_line = QHBoxLayout()
        self.layout.addLayout(self.first_line)
        self.first_line.addWidget(QLabel("Import module:"))
        self.import_module_filename = QLineEdit()
        self.first_line.addWidget(self.import_module_filename)
        self.open_dialog_button = QPushButton(
            self.style().standardIcon(QStyle.SP_DialogOpenButton), "")
        self.first_line.addWidget(self.open_dialog_button)

        self.second_line = QHBoxLayout()
        self.layout.addLayout(self.second_line)
        self.second_line.addWidget(QLabel("Module name:"))
        self.module_name = QLineEdit()
        self.second_line.addWidget(self.module_name)

        self.buttons = QDialogButtonBox(QDialogButtonBox.Ok
                                        | QDialogButtonBox.Cancel)
        self.buttons.button(QDialogButtonBox.Ok).clicked.connect(self.accept)
        self.buttons.button(QDialogButtonBox.Cancel).clicked.connect(
            self.reject)
        self.layout.addWidget(self.buttons)
        self.setFixedHeight(self.layout.sizeHint().height())

        self.cfg = ConfigData()
        self.setWindowTitle("Import module")

        self.open_dialog_button.clicked.connect(self.open_dialog)

    def open_dialog(self):
        filename = QFileDialog.getOpenFileName(
            self, "Select Module", self.cfg.last_opened_directory)[0]
        if filename != "":
            self.import_module_filename.setText(filename)
            name, ext = os.path.splitext(os.path.basename(filename))
            self.module_name.setText(name)

    def filename(self):
        return self.import_module_filename.text()

    def name(self):
        return self.module_name.text()

    def done(self, code):
        print(self.Accepted)
        print(code)
        if code != self.Accepted or os.path.exists(
                self.import_module_filename.text()):
            super(ImportModule, self).done(code)
        else:
            msg = QMessageBox(self)
            msg.setText("Chosen file doesn't exist!")
            msg.exec()
예제 #7
0
class eventWindow(QWidget):
    def __init__(self,event):
        super().__init__()
        print(event)
        self.vbox = QVBoxLayout()

        self.eventData = QLabel()
        self.eventData.setText('Id: {} Required access: {}'.format(
            str(event['id']),event['required_access']
        ))
        self.eventName = QLabel()
        self.eventName.setText(event['name'])
        self.eventDescription = QLabel()
        self.eventDescription.setText(event['description'])
        self.eventRequirement = QLabel()
        self.eventRequirement.setText(event['requirement'])
        self.eventRewards = QLabel()
        self.eventRewards.setText('Rewards:')
        self.vbox.addWidget(self.eventData)
        self.vbox.addWidget(self.eventName)
        self.vbox.addWidget(self.eventDescription)
        self.vbox.addWidget(self.eventRequirement)
        self.vbox.addWidget(self.eventRewards)
        self.resize(self.vbox.sizeHint())
        self.setLayout(self.vbox)

        self.threads = []
        for i in event['rewards']:
            self.threads.append(loadThread(r'https://api.guildwars2.com/v2/items/' + str(i['id'])))
            self.threads[-1].metaEventSignal.connect(self.addReward, Qt.QueuedConnection)
            self.threads[-1].start()

    def addReward(self, signal):
        signal = json.loads(signal)
        setattr(self,str(signal['id']),label(signal))
        getattr(self, str(signal['id'])).setText(signal['name'])
        getattr(self, str(signal['id'])).signal.connect(self.setItemWindow)
        self.vbox.addWidget(getattr(self,str(signal['id'])))
        self.resize(self.vbox.sizeHint())

    def setItemWindow(self, signal):
        self.itemWindow = itemWindow(signal)
        self.itemWindow.show()
예제 #8
0
class MyApp(QMainWindow):
    def __init__(self):
        super().__init__()

        self.add_btn = QPushButton("Add")
        self.add_btn.clicked.connect(self.click_add_btn)

        self.remove_btn = QPushButton("Remove")
        self.remove_btn.clicked.connect(self.click_remove_btn)

        self.scroll_area = QScrollArea()
        self.scroll_area.setWidgetResizable(True)

        self.init_ui()

    def init_ui(self):
        self.main_layout = QVBoxLayout()
        self.main_layout.addWidget(self.add_btn)
        self.main_layout.addWidget(self.remove_btn)
        self.main_layout.addWidget(TestUI())
        self.centralWidget = QWidget()
        self.centralWidget.setLayout(self.main_layout)
        self.setCentralWidget(self.centralWidget)
        self.show()

    def click_add_btn(self):
        self.main_layout.addWidget(TestUI())
        self.setFixedSize(
            self.main_layout.sizeHint()
            + PyQt5.QtCore.QSize(0, TestUI().frameGeometry().height())
        )

    def click_remove_btn(self):
        if self.main_layout.count() > 3:
            child = self.main_layout.takeAt(self.main_layout.count() - 1)
            child.widget().deleteLater()
            print(self.main_layout.count())
            print(self.main_layout.sizeHint())
            self.setFixedSize(self.main_layout.sizeHint())
예제 #9
0
    def __init__(self, graphicslist, parent=None):
        super().__init__(parent)
        self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOn)
        self.setWidgetResizable(True)

        widget = QWidget(parent=self)
        layout = QVBoxLayout(widget)
        self.setWidget(widget)

        self.setGraphics(graphicslist)

        self.setMinimumWidth(layout.sizeHint().width() +
                             2 * self.frameWidth() +
                             self.verticalScrollBar().sizeHint().width())
예제 #10
0
class itemWindow(QWidget):
    def __init__(self,item):
        super().__init__()
        self.vbox = QVBoxLayout()

        self.itemId = QLabel()
        self.itemId.setText(str(item['id']))
        self.itemName = QLabel()
        self.itemName.setText(item['name'])

        self.vbox.addWidget(self.itemId)
        self.vbox.addWidget(self.itemName)

        self.resize(self.vbox.sizeHint())
        self.setLayout(self.vbox)
예제 #11
0
 def setupUi(self, PropDetailsDlg):
     PropDetailsDlg.setModal(True)
     layout = QVBoxLayout(PropDetailsDlg)
     layout.setContentsMargins(10, 15, 10, 10)
     name = QLabel("<b><i>%s</i></b>" % PropDetailsDlg.data.name)
     name.setAlignment(Qt.AlignCenter)
     layout.addWidget(name)
     body = QFormLayout()
     body.setLabelAlignment(Qt.AlignRight)
     body.setVerticalSpacing(20)
     body.setContentsMargins(25, 10, 25, 30)
     link = "<a href='%s'>%s</a>" % (PropDetailsDlg.data.URL, PropDetailsDlg.data.URL)
     link_label = QLabel(link)
     link_label.setOpenExternalLinks(True)
     body.addRow(QLabel("<b>URL: </b>"), link_label)
     body.addRow(QLabel("<b>TotalPayment: </b>"), QLabel(str(PropDetailsDlg.data.ToalPayment)))
     body.addRow(QLabel("<b>MonthlyPayment: </b>"), QLabel(str(PropDetailsDlg.data.MonthlyPayment)))
     hashLabel = self.selectable_line(PropDetailsDlg.data.Hash)
     body.addRow(QLabel("<b>Hash: </b>"), hashLabel)
     feeHashLabel = self.selectable_line(PropDetailsDlg.data.FeeHash)
     body.addRow(QLabel("<b>FeeHash: </b>"), feeHashLabel)
     body.addRow(QLabel("<b>BlockStart: </b>"), QLabel(str(PropDetailsDlg.data.BlockStart)))
     body.addRow(QLabel("<b>BlockEnd: </b>"), QLabel(str(PropDetailsDlg.data.BlockEnd)))
     body.addRow(QLabel("<b>TotalPayCount: </b>"), QLabel(str(PropDetailsDlg.data.TotalPayCount)))
     body.addRow(QLabel("<b>RemainingPayCount: </b>"), QLabel(str(PropDetailsDlg.data.RemainingPayCount)))
     addyLabel = self.selectable_line(PropDetailsDlg.data.PaymentAddress)
     body.addRow(QLabel("<b>PaymentAddress: </b>"), addyLabel)
     votes = "<span style='color: green'>%d YEAS</span> / " % PropDetailsDlg.data.Yeas
     votes += "<span style='color: orange'>%d ABSTAINS</span> / " % PropDetailsDlg.data.Abstains
     votes += "<span style='color: red'>%d NAYS</span>" % PropDetailsDlg.data.Nays
     body.addRow(QLabel("<b>Votes: </b>"), QLabel(votes))
     my_yeas = ["%s <em style='color: green'>(%s)</em>" % (x[0], strftime('%Y-%m-%d %H:%M:%S',
                                                     gmtime(x[1]))) for x in PropDetailsDlg.myYeas]
     body.addRow(QLabel("<b>My Yeas: </b>"), self.scroll(my_yeas))
     my_abstains = ["%s <em style='color: orange'>(%s)</em>" % (x[0], strftime('%Y-%m-%d %H:%M:%S',
                                                     gmtime(x[1]))) for x in PropDetailsDlg.myAbstains]
     body.addRow(QLabel("<b>My Abstains: </b>"), self.scroll(my_abstains))
     my_nays = ["%s <em style='color: red'>(%s)</em>" % (x[0], strftime('%Y-%m-%d %H:%M:%S',
                                                     gmtime(x[1]))) for x in PropDetailsDlg.myNays]
     body.addRow(QLabel("<b>My Nays: </b>"), self.scroll(my_nays))
     layout.addLayout(body)
     self.okButton = QPushButton('OK')
     self.okButton.clicked.connect(self.accept)
     layout.addWidget(self.okButton)
     sh = layout.sizeHint()
     self.setFixedSize(sh)
예제 #12
0
class Ui(QFrame):
    flags = Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint
    settings = None

    header = None
    body = None

    mouse_down = False
    old_position = None

    header_layout = None
    column_layout = None
    events_layout = None

    token_path = path.join(APPDATA, 'token.json')
    credentials = None
    service = None

    calendars = []
    events = []
    icons = {}

    def __init__(self):
        super(Ui, self).__init__(None, self.flags)

        self.authorize()

        self.settings = QSettings(NAME, NAME)

        geometry = self.settings.value('geometry')
        if geometry:
            self.restoreGeometry(geometry)

        self.setFrameShape(QFrame.StyledPanel)

        # TODO: QPushButton[iconOnly="True"] should be circle button
        css = """
        QFrame {
            background-color: white;
            border: 1px solid #3949AB;
        }
        QPushButton {
            background-color: #3949AB;
            color: white;
            border-radius: 5px;
            padding: 10px 20px;
            min-width: 50px;
        }
        QPushButton[iconOnly="True"] {
            padding: 10px;
            min-width: unset;
        }
        QPushButton:hover {
            background-color: #5C6BC0;
        }
        """
        self.setStyleSheet(css)
        self.setMouseTracking(True)

        self.header = Header(self)
        self.body = QWidget(self)

        css = """
        QWidget {
            border: 0;
        }
        QWidget[class~="event"] {
            background-color: #7986CB;
            border-radius: 5px;
        }
        QWidget[class~="event"] QLabel {
            background-color: #7986CB;
            color: white;
        }
        QWidget[class~="needsAction"] {
            border-top: 5px Solid #304FFE;
            border-top-left-radius: 0;
            border-top-right-radius: 0;
        }
        QWidget[class~="event"] QLabelClickable {
            color: #3949AB;
            font-weight: bold;
            text-decoration: underline;
        }
        QProgressBar {
            background-color: #7986CB;
        }
        """
        self.body.setStyleSheet(css)

        self.header_layout = QVBoxLayout(self)
        self.header_layout.setSizeConstraint(QLayout.SetFixedSize)
        self.header_layout.setContentsMargins(0, 0, 0, 0)
        self.header_layout.setSpacing(0)
        self.header_layout.addWidget(self.header)

        body_layout = QVBoxLayout()
        body_layout.addWidget(self.body)
        body_layout.setContentsMargins(5, 5, 5, 5)
        body_layout.setSpacing(0)

        self.header_layout.addLayout(body_layout)

        self.setup_ui()

    def closeEvent(self, event):
        self.settings.setValue('geometry', self.saveGeometry())

    def mousePressEvent(self, event):
        self.old_position = event.pos()
        self.mouse_down = event.button() == Qt.LeftButton

    def mouseReleaseEvent(self, event):
        self.mouse_down = False

    def authorize(self):
        if os.path.exists(self.token_path):
            self.credentials = Credentials.from_authorized_user_file(
                self.token_path, SCOPES)

        if not self.credentials or not self.credentials.valid:
            if self.credentials and self.credentials.expired and self.credentials.refresh_token:
                try:
                    self.credentials.refresh(Request())
                except RefreshError:
                    os.remove(self.token_path)
                    self.credentials = None
                    return self.authorize()
            else:
                flow = InstalledAppFlow.from_client_secrets_file(
                    'credentials.json', SCOPES)
                self.credentials = flow.run_local_server(port=0)

            with open(self.token_path, 'w') as token:
                token.write(self.credentials.to_json())

        self.service = build('calendar', 'v3', credentials=self.credentials)

    def logout(self):
        if os.path.exists(self.token_path):
            os.remove(self.token_path)
            self.credentials = None

            self.authorize()
            self.refresh()

    # TODO: Make events layout scrollable
    def setup_ui(self):
        self.column_layout = QVBoxLayout(self.body)
        self.column_layout.setSpacing(15)

        menu_layout = QHBoxLayout()
        self.column_layout.addLayout(menu_layout)

        self.events_layout = QVBoxLayout()
        self.events_layout.setSpacing(15)
        self.column_layout.addLayout(self.events_layout)

        logout_button = QPushButton('Logout')
        logout_button.clicked.connect(self.logout)
        menu_layout.addWidget(logout_button)

        refresh_button = QPushButton('Refresh')
        refresh_button.clicked.connect(self.refresh)
        menu_layout.addWidget(refresh_button)

        QMetaObject.connectSlotsByName(self)

        self.refresh()

    # TODO: Subscribe to changes or poll each 15m
    # TODO: Store when the last refresh happened to prevent unnecessary refresh when event end and send a refresh
    def refresh(self):
        self.calendars = []
        self.paged_query(self.refresh_calendars)

        self.events = []
        now = datetime.datetime.utcnow(
        )  # TODO: Do we need to use a specific timezone?
        time_min = now.isoformat() + 'Z'
        time_max = now.replace(
            hour=23, minute=59, second=59,
            microsecond=999999).isoformat() + 'Z'
        for calendar in self.calendars:
            self.paged_query(self.refresh_events, calendar, time_min, time_max)

        clear_layout(self.events_layout)

        for event in self.events:
            if 'dateTime' in event['start'] and 'dateTime' in event['end']:
                self.events_layout.addWidget(Event(self, event))

        self.refresh_size()

    def refresh_size(self):
        size = self.header_layout.sizeHint()
        available_size = self.screen().availableSize()
        size.setWidth(min(size.width(), available_size.width()))
        size.setHeight(min(size.height(), available_size.height()))

        self.setFixedSize(size)

    # TODO: If fail to fetch an uri for X times, find a way to limit future try or stop trying
    # TODO: Store & restore on drive
    def fetch_icon(self, uri):
        if uri in self.icons:
            return self.icons[uri]
        else:
            try:
                data = urlopen(uri).read(
                )  # TODO: Investigate on .read() raised exceptions
            except (URLError, HTTPError, ContentTooShortError) as exception:
                handle_error(exception)
                return None

            pixmap = QPixmap()
            pixmap.loadFromData(data)

            icon = QIcon(pixmap)
            self.icons[uri] = icon

            return icon

    @staticmethod
    def paged_query(func, *args, **kwargs):
        page_token = None
        while True:
            page_token = func(page_token, *args, **kwargs)

            if not page_token:
                break

    def refresh_events(self, page_token, calendar, time_min, time_max):
        events = self.service.events().list(calendarId=calendar['id'],
                                            singleEvents=True,
                                            timeMin=time_min,
                                            timeMax=time_max,
                                            orderBy='startTime',
                                            pageToken=page_token,
                                            maxAttendees=1,
                                            showDeleted=False).execute()

        def remove_declined_event(event):
            if 'attendees' in event and event['attendees'][0]:
                if event['attendees'][0]['responseStatus'] == 'declined':
                    return False

            return True

        self.events += filter(remove_declined_event, events['items'])

        return events.get('nextPageToken')

    # TODO: Let user choose which calendar the want to fetch events from
    def refresh_calendars(self, page_token):
        calendar_list = self.service.calendarList().list(
            pageToken=page_token, minAccessRole='owner').execute()

        self.calendars += calendar_list['items']

        return calendar_list.get('nextPageToken')
예제 #13
0
    def setUI(self):

        self.window = QWidget()
        self.window.setWindowIcon(QtGui.QIcon(dir_path + 'resources/bbp.png'))
        self.window.setWindowTitle('vocabBuilder')

        self.btn_exit = QPushButton('Exit')
        self.btn_exit.clicked.connect(self.exitClicked)

        self.btn_start = QPushButton('Start')
        self.btn_start.clicked.connect(self.startClicked)

        # The start button should be initially disabled if no file exists
        if self.fileName == '':
            self.btn_start.setEnabled(False)

        # Check the file still exists and is valid
        else:
            self.btn_start.setEnabled(self.checkFileContents(self.fileName))

        self.btn_words = QPushButton('Words')
        self.btn_words.clicked.connect(self.wordsClicked)

        self.spin_time = QSpinBox()
        self.spin_time.setMinimum(1)
        self.spin_time.setValue(self.time)

        self.spin_questions = QSpinBox()
        self.spin_questions.setMinimum(1)
        self.spin_questions.setValue(self.questions)

        wordsLabel = QLabel('Questions:')
        timeLabel = QLabel('Time:')

        picLabel = QLabel()
        pixmap = QPixmap(dir_path + 'resources/bbp.png')
        picLabel.setPixmap(pixmap)

        mainLayout = QVBoxLayout(self.window)

        leftLayout = QVBoxLayout()
        leftLayout.addWidget(picLabel)

        vSpacer = QSpacerItem(5, 10, QSizePolicy.Minimum,
                              QSizePolicy.Expanding)

        hSpacer = QSpacerItem(10, 5, QSizePolicy.Minimum,
                              QSizePolicy.Expanding)

        rightLayout = QVBoxLayout()
        rightLayout.setSpacing(0)
        rightLayout.setContentsMargins(0, 0, 0, 0)
        rightLayout.addWidget(timeLabel)
        rightLayout.addWidget(self.spin_time)
        rightLayout.addWidget(wordsLabel)
        rightLayout.addWidget(self.spin_questions)
        rightLayout.addItem(vSpacer)

        bottomLayout = QHBoxLayout()
        bottomLayout.addWidget(self.btn_words)
        bottomLayout.addWidget(self.btn_start)
        bottomLayout.addWidget(self.btn_exit)

        topLayout = QHBoxLayout()
        topLayout.addLayout(leftLayout)
        topLayout.addLayout(rightLayout)

        mainLayout.addLayout(topLayout)
        mainLayout.addLayout(bottomLayout)

        self.window.setFixedSize(mainLayout.sizeHint())
        return
예제 #14
0
파일: main.py 프로젝트: zentown/vidpipe
    def setupUi(self, dlg):
        Ui_Dialog.setupUi(self, dlg)

        self.btnShowHist.clicked.connect(self.showHistogram)

        self._filterListOrderMapper = FilterListOrderMapper()
        self._filterListOrderMapper.listChanged.connect(
            self.resetFilterListModel)

        self.filterList.installEventFilter(self._filterListOrderMapper)
        self.filterList.setDragDropMode(QAbstractItemView.InternalMove)

        self._optionMapper = QSignalMapper(dlg)
        self._optionMapper.mapped[QObject].connect(self.saveFilterValue)
        self._optionSave = [
        ]  # this is only for making sure the Mapper object doesn't get garbage collected

        #regx = QRegExp( "([0-9]{1,3}[\,][ ]*){2}[0-9]{1,3}" )
        regx = QRegExp("([0-9]{1,3}[\,][ ]*){1,2}[0-9]{1,3}")

        for fltr in self._filters:
            print("Filter added: %s" % fltr.name)

            fltr.loadConfig(None)

            self.label_Status.setText("Loading filters")
            getters, setters = self.getFilterProperties(fltr)
            print("\tAvailable GETable options: ", getters)
            print("\tAvailable SETable options: ", setters)

            group = QGroupBox()
            vbl = QVBoxLayout(group)

            # Row ------
            fm = QFrame()
            vb = QVBoxLayout(fm)

            vb.setSizeConstraint(QLayout.SetFixedSize)

            # add the enabled checkbox first always
            cb2 = QCheckBox(fltr.name)
            cb2.setCheckState(
                getattr(
                    fltr, FrameProcessor.propStartsWith + "Enabled" +
                    FrameProcessor.propEndsWithGetter)())
            cb2.setStyleSheet('background-color:#%02x%02x%02x' %
                              (fltr.color()[::-1]))
            vb.addWidget(cb2)
            # watch for values changing
            cb2.stateChanged.connect(self._optionMapper.map)
            self._optionSave.append(
                KnobTurner.Mapper(
                    cb2, fltr, FrameProcessor.propStartsWith + "Enabled" +
                    FrameProcessor.propEndsWithSetter))
            self._optionMapper.setMapping(cb2, self._optionSave[-1])

            for item in setters:
                prop_type = getattr(fltr,
                                    FrameProcessor.propTypeStartsWith + item)()
                if prop_type is int:
                    hz = QHBoxLayout()
                    lb1 = QLabel("%s:" % item)
                    sp1 = QSpinBox()
                    sp1.setRange(
                        0, 10000000)  # TODO: add this as a query to the filter
                    sp1.setValue(
                        getattr(
                            fltr, FrameProcessor.propStartsWith + item +
                            FrameProcessor.propEndsWithGetter)())
                    vb.addWidget(lb1)
                    vb.addWidget(sp1)

                    # watch for values changing
                    sp1.valueChanged.connect(self._optionMapper.map)
                    self._optionSave.append(
                        KnobTurner.Mapper(
                            sp1, fltr, FrameProcessor.propStartsWith + item +
                            FrameProcessor.propEndsWithSetter))
                    self._optionMapper.setMapping(sp1, self._optionSave[-1])

                elif prop_type is bool:
                    if item == "Enabled":
                        continue
                    else:
                        cb2 = QCheckBox(item)
                    cb2.setCheckState(
                        getattr(
                            fltr, FrameProcessor.propStartsWith + item +
                            FrameProcessor.propEndsWithGetter)())
                    vb.addWidget(cb2)

                    # watch for values changing
                    cb2.stateChanged.connect(self._optionMapper.map)
                    self._optionSave.append(
                        KnobTurner.Mapper(
                            cb2, fltr, FrameProcessor.propStartsWith + item +
                            FrameProcessor.propEndsWithSetter))
                    self._optionMapper.setMapping(cb2, self._optionSave[-1])
                elif prop_type is tuple:
                    hz = QHBoxLayout()
                    lb1 = QLabel("%s:" % item)

                    val = getattr(
                        fltr, FrameProcessor.propStartsWith + item +
                        FrameProcessor.propEndsWithGetter)()
                    le = QLineEdit("{0}".format(val).replace("(", "").replace(
                        ")", "").replace("[", "").replace("]", ""))

                    le.setValidator(QRegExpValidator(regx))
                    le.textChanged.connect(self._optionMapper.map)
                    le.textChanged.emit(le.text())

                    self._optionSave.append(
                        KnobTurner.Mapper(
                            le, fltr, FrameProcessor.propStartsWith + item +
                            FrameProcessor.propEndsWithSetter))
                    self._optionMapper.setMapping(le, self._optionSave[-1])

                    vb.addWidget(lb1)
                    vb.addWidget(le)
            # end Row 2 -----

            vbl.addWidget(fm)
            vbl.setSizeConstraint(QLayout.SetFixedSize)

            lwi = QListWidgetItem()
            lwi.setSizeHint(vbl.sizeHint())
            lwi.setData(
                Qt.UserRole,
                QVariant(fltr))  # attach the filter to this item in the list
            self.filterList.addItem(lwi)
            self.filterList.setItemWidget(lwi, group)

        self.label_Status.setText("Loading filters... Done")

        self.label_Status.setText("Starting cameras...")
        self.startCamera()
        self.label_Status.setText("Starting cameras... Done")

        self.showWindows()

        self.label_Status.setText("Ready")
예제 #15
0
class Window(QWidget):
    def __init__(self):
        super(Window, self).__init__()

        self.icon_path = 'resources\\warframe.ico'
        self.app_title = 'Warframe Prime Helper'
        self.company_name = 'Warframe Tools'

        self.settings = QSettings(self.company_name, self.app_title)
        self.setWindowTitle(self.app_title)

        self.market_api = None

        self.image_label = None
        self.image_label2 = None

        self.warframe_height = 1080
        self.warframe_width = 1920

        self.table = None
        self.mission_table = None

        self.slider_names = None
        self.sliders = None
        self.slider_labels = None
        self.slider_default_values = None
        self.slider_orig_values = None
        self.slider_values = None
        self.is_slider_max_set = False

        #self.plat_check_box = QCheckBox("Prefer platinum")
        #self.plat_check_box.setChecked(True)

        self.update_prices_button = None
        self.update_ducats_button = None
        self.update_prices_progress = None
        self.update_ducats_progress = None
        self.last_updated_prices_value = None
        self.last_updated_ducats_value = None
        self.num_parts_value = None
        self.latest_item_value = None

        self.move_to_top_check_box = None
        self.pause_button = None
        self.is_paused = False

        self.hide_crop_check_box = None
        self.hide_filter_check_box = None
        self.hide_fissure_check_box = None

        self.relics = None
        self.hide_relics = {}
        self.hidden_relics = set()

        self.hide_missions = {}
        self.hidden_missions = set()
        self.hide_missions_box = None
        self.mission_names = None

        self.crop_img = None
        self.filter_img = None

        self.dialog = None
        self.layout = None

        self.filled_rows = 0
        self.max = -1
        self.max_row = -1

        self.ocr = None
        self.old_screenshot_shape = 0
        self.old_filtered_shape = 0

        self.missions = []

        self.num_primes = 100
        self.api = None

        self.prices_progress_lock = Lock()
        self.ducats_progress_lock = Lock()

        self.ducats_thread = None
        self.prices_thread = None

        self.timer = None

        self.init_image_labels()
        self.init_tables()
        self.init_sliders()
        self.init_dialog()
        self.set_layout()
        self.init_timer()

        self.show()

        #measured correct values
        self.setFixedSize(978, 617)

    def init_timer(self):
        self.timer = QTimer()
        self.timer.timeout.connect(self.update_mission_table_time)
        self.timer.start(1000)

    def init_image_labels(self):
        self.image_label = QLabel()
        image = QPixmap('temp\\crop_27.bmp')
        self.image_label.setPixmap(image)

        self.image_label2 = QLabel()
        self.image_label2.setPixmap(image)

    def set_layout(self):
        settings_button_box = self.make_settings_button_box()
        self.init_imgs()
        bot_box = self.make_bot_box()

        self.layout = QVBoxLayout()
        self.layout.setAlignment(Qt.AlignTop)
        self.layout.addSpacing(-12)
        self.layout.addLayout(settings_button_box)
        self.layout.addWidget(self.crop_img)
        self.layout.addWidget(self.filter_img)
        self.layout.addWidget(bot_box)
        self.setLayout(self.layout)

    def make_settings_button_box(self):
        settings_button = QPushButton()
        # Gear icon is from: https://iconscout.com/icon/gear-222
        style_sheet = """
        QPushButton {
            qproperty-icon: url(" ");
            qproperty-iconSize: 15px 15px;
            border-image: url("resources/Gear.svg");
            background-color: rgba(255, 255, 255, 0);
        }
        
        QPushButton:hover {
            border-image: url("resources/SelectedGear.svg");
        }"""
        settings_button.setStyleSheet(style_sheet)
        #settings_button.setStyleSheet("background-color: rgba(0, 0, 0, 255); font-size: 23px;")
        settings_button.clicked.connect(self.show_preferences)
        settings_button.setFixedWidth(30)
        settings_button.setFixedHeight(30)

        settings_button_hb = QHBoxLayout()
        settings_button_hb.setAlignment(Qt.AlignRight)
        settings_button_hb.addWidget(settings_button)
        settings_button_hb.addSpacing(-11)
        return settings_button_hb

    def make_bot_box(self):
        bot_layout = QHBoxLayout()
        bot_layout.addWidget(self.table)
        bot_layout.addWidget(self.mission_table)

        bot_box = QGroupBox()
        bot_box.setLayout(bot_layout)
        bot_box.setFixedHeight(287)
        return bot_box

    def init_dialog(self):
        crop_box = self.make_crop_box()
        filter_box = self.make_filter_box()
        other_box = self.make_other_box()

        settings_layout_1 = QVBoxLayout()
        settings_layout_1.addWidget(crop_box)
        settings_layout_1.addWidget(filter_box)
        settings_layout_1.addWidget(other_box)

        update_box = self.make_update_box()
        rate_box = self.make_rate_box()

        settings_layout_2 = QVBoxLayout()
        settings_layout_2.addWidget(update_box)
        settings_layout_2.addWidget(rate_box)

        hide_box = self.make_hide_box()
        hide_relics_box = self.make_hide_relics_box()
        button_box = self.make_button_box()

        settings_layout_3 = QVBoxLayout()
        settings_layout_3.addWidget(hide_box)
        settings_layout_3.addWidget(hide_relics_box)

        hide_missions_box = self.make_hide_missions_box()
        settings_layout_4 = QVBoxLayout()
        settings_layout_4.addWidget(hide_missions_box)
        settings_layout_4.addWidget(button_box)

        settings_layout = QHBoxLayout()
        settings_layout.addLayout(settings_layout_1)
        settings_layout.addLayout(settings_layout_2)
        settings_layout.addLayout(settings_layout_3)
        settings_layout.addLayout(settings_layout_4)

        self.dialog = QDialog()
        self.dialog.setWindowTitle("Preferences")
        self.dialog.setWindowModality(Qt.ApplicationModal)
        self.dialog.setLayout(settings_layout)

    def make_button_box(self):
        button_box = QDialogButtonBox()
        button_box.setOrientation(Qt.Horizontal)
        button_box.setStandardButtons(QDialogButtonBox.Cancel | QDialogButtonBox.Ok)
        button_box.accepted.connect(self.save_settings)
        button_box.rejected.connect(self.load_settings)
        return button_box

    def load_settings(self):
        self.settings.sync()
        slider_orig_values = {'x': 521, 'y': 400, 'w': 908, 'h': 70, 'v1': 197, 'v2': 180, 'd': 4,
                              'Screencap (hz)': 1, 'Fissure (s)': 30, 'API Threads': 4}
        self.slider_default_values = {}
        slider_default_max = {'x': self.warframe_width/2,
                              'y': self.warframe_height/2,
                              'w': self.warframe_width,
                              'h': self.warframe_height,
                              'v1': 255,
                              'v2': 255,
                              'd': 40}

        for slider_name in self.slider_names:
            self.slider_default_values[slider_name] = self.settings.value(slider_name,defaultValue=slider_orig_values[slider_name])
            if len(slider_name) <= 2:
                max_val = self.settings.value("{}_max".format(slider_name), defaultValue=slider_default_max[slider_name], type=int)
                self.sliders[slider_name].setMaximum(max_val)
            self.sliders[slider_name].setValue(self.slider_default_values[slider_name])

        prices = self.settings.value("last_updated_prices_value", defaultValue="Never", type=str)
        ducats = self.settings.value("last_updated_ducats_value", defaultValue="Never", type=str)
        num_parts = self.settings.value("num_parts_value", defaultValue=350, type=int)
        latest_item = self.settings.value("latest_item_value", defaultValue="", type=str)

        self.last_updated_prices_value.setText(prices)
        self.last_updated_ducats_value.setText(ducats)
        self.num_parts_value.setNum(num_parts)
        self.latest_item_value.setText(latest_item)

        for relic in self.relics:
            checked = self.settings.value("hide_{}".format(relic), defaultValue=False,type=bool)
            self.hide_relics[relic].setChecked(checked)
            if checked:
                self.set_hidden_relic(relic)

        for mission in self.mission_names:
            checked = self.settings.value("hide_{}".format(mission), defaultValue=False, type=bool)
            self.hide_missions[mission].setChecked(checked)
            if checked:
                self.set_hidden_mission(mission)

        if self.settings.value("toggle_fissure_table", defaultValue=False, type=bool):
            self.hide_fissure_check_box.setChecked(True)
            self.toggle_fissure_table()

        if self.settings.value("toggle_move_to_top", defaultValue=False, type=bool):
            self.move_to_top_check_box.setChecked(True)
            self.toggle_move_to_top()

        if self.settings.value("toggle_cropped_img", defaultValue=False, type=bool):
            self.hide_crop_check_box.setChecked(True)
            self.toggle_cropped_img()

        if self.settings.value("toggle_filtered_img", defaultValue=False, type=bool):
            self.hide_filter_check_box.setChecked(True)
            self.toggle_filtered_img()
        self.dialog.close()

    def save_settings(self):
        for slider_name in self.slider_names:
            self.settings.setValue(slider_name, self.sliders[slider_name].value())

        for relic in self.relics:
            self.settings.setValue("hide_{}".format(relic), self.hide_relics[relic].isChecked())

        for mission in self.mission_names:
            self.settings.setValue("hide_{}".format(mission), self.hide_missions[mission].isChecked())

        self.settings.setValue("toggle_fissure_table", self.hide_fissure_check_box.isChecked())
        self.settings.setValue("toggle_move_to_top", self.move_to_top_check_box.isChecked())
        self.settings.setValue("toggle_cropped_img", self.hide_crop_check_box.isChecked())
        self.settings.setValue("toggle_filtered_img", self.hide_filter_check_box.isChecked())
        self.dialog.close()
        self.settings.sync()

    def init_imgs(self):
        self.crop_img = QGroupBox("Crop")
        crop_img_layout = QVBoxLayout()
        crop_img_layout.addWidget(self.image_label)
        self.crop_img.setLayout(crop_img_layout)

        self.filter_img = QGroupBox("Filtered")
        filter_img_layout = QVBoxLayout()
        filter_img_layout.addWidget(self.image_label2)
        self.filter_img.setLayout(filter_img_layout)

    def make_hide_missions_box(self, missions=None):
        if self.hide_missions_box is None:
            self.hide_missions_box = QGroupBox("Hide Missions")
        if missions is not None:
            hide_missions_layout = QGridLayout()
            hide_missions_layout.setColumnStretch(2, 2)
            hide_missions_layout.setAlignment(Qt.AlignTop)
            hide_missions_layout.setContentsMargins(0, 0, 0, 0)

            skip_missions = ["MT_SECTOR", "MT_PVP", "MT_LANDSCAPE", "MT_EVACUATION", "MT_ASSASSINATION", "MT_ARENA"]
            seen_missions = set()
            i = 0
            for mission in missions:
                mission_name = missions[mission]['value']
                if mission_name == "Extermination":
                    mission_name = "Exterminate"
                if mission not in skip_missions and mission_name not in seen_missions:
                    self.hide_missions[mission_name] = QCheckBox(mission_name)
                    self.hide_missions[mission_name].setChecked(False)
                    self.hide_missions[mission_name].stateChanged.connect(partial(self.set_hidden_mission, mission_name))
                    hide_missions_layout.addWidget(self.hide_missions[mission_name], int(i/2), i % 2)
                    i += 1
                    seen_missions.add(mission_name)
            self.hide_missions_box.setLayout(hide_missions_layout)
            self.mission_names = list(seen_missions)

            self.load_settings()
        return self.hide_missions_box

    def set_hidden_mission(self, mission):
        if self.hide_missions[mission].isChecked():
            self.hidden_missions.add(mission)
        else:
            self.hidden_missions.remove(mission)
        self.update_mission_table_hidden()

    def make_hide_relics_box(self):
        hide_relics_layout = QVBoxLayout()
        hide_relics_layout.setAlignment(Qt.AlignTop)
        hide_relics_layout.setContentsMargins(0, 0, 0, 0)
        self.relics = ["Axi", "Neo", "Meso", "Lith", "Requiem"]

        for relic in self.relics:
            self.hide_relics[relic] = QCheckBox(relic)
            self.hide_relics[relic].setChecked(False)
            self.hide_relics[relic].stateChanged.connect(partial(self.set_hidden_relic, relic))
            hide_relics_layout.addWidget(self.hide_relics[relic])

        hide_relics_box = QGroupBox("Hide Relics")
        hide_relics_box.setLayout(hide_relics_layout)
        return hide_relics_box

    def make_hide_box(self):
        hide_layout = QVBoxLayout()
        hide_layout.setAlignment(Qt.AlignTop)
        hide_layout.setContentsMargins(0, 0, 0, 0)

        self.hide_crop_check_box = QCheckBox("Hide Crop")
        self.hide_crop_check_box.setChecked(False)
        self.hide_crop_check_box.stateChanged.connect(self.toggle_cropped_img)
        hide_layout.addWidget(self.hide_crop_check_box)

        self.hide_filter_check_box = QCheckBox("Hide Filtered")
        self.hide_filter_check_box.setChecked(False)
        self.hide_filter_check_box.stateChanged.connect(self.toggle_filtered_img)
        hide_layout.addWidget(self.hide_filter_check_box)

        self.hide_fissure_check_box = QCheckBox("Hide Fissure Table")
        self.hide_fissure_check_box.setChecked(False)
        self.hide_fissure_check_box.stateChanged.connect(self.toggle_fissure_table)
        hide_layout.addWidget(self.hide_fissure_check_box)

        hide_box = QGroupBox("Hide UI")
        hide_box.setLayout(hide_layout)
        return hide_box

    def make_rate_box(self):
        rate_grid = QGridLayout()
        rate_grid.setColumnStretch(3, 3)
        rate_grid.setContentsMargins(0, 0, 0, 0)
        for i in range(3):
            slider_name = self.slider_names[i + 7]
            rate_grid.addWidget(self.slider_labels[slider_name], i, 0)
            rate_grid.addWidget(self.slider_values[slider_name], i, 1)
            rate_grid.addWidget(self.sliders[slider_name], i, 2)

        rate_box = QGroupBox("Rates")
        rate_box.setLayout(rate_grid)
        return rate_box

    def make_other_box(self):
        self.move_to_top_check_box = QCheckBox("Bring to front")
        self.move_to_top_check_box.setChecked(True)
        self.move_to_top_check_box.stateChanged.connect(self.toggle_move_to_top)
        self.pause_button = QPushButton("Pause")
        self.pause_button.clicked.connect(self.toggle_button)
        self.is_paused = False
        other_layout = QVBoxLayout()
        other_layout.setAlignment(Qt.AlignTop)
        other_layout.setContentsMargins(0, 0, 0, 0)
        other_layout.addWidget(self.move_to_top_check_box)
        other_layout.addWidget(self.pause_button)

        other_box = QGroupBox("Other")
        other_box.setLayout(other_layout)
        return other_box

    def make_filter_box(self):
        filter_grid = QGridLayout()
        filter_grid.setColumnStretch(3, 3)
        filter_grid.setAlignment(Qt.AlignTop)
        filter_grid.setContentsMargins(0, 0, 0, 0)
        for i in range(3):
            slider_name = self.slider_names[i + 4]
            filter_grid.addWidget(self.slider_labels[slider_name], i, 0)
            filter_grid.addWidget(self.slider_values[slider_name], i, 1)
            filter_grid.addWidget(self.sliders[slider_name], i, 2)

        filter_box = QGroupBox("Filter Parameters")
        filter_box.setLayout(filter_grid)
        return filter_box

    def make_crop_box(self):
        crop_grid = QGridLayout()
        crop_grid.setColumnStretch(3, 4)
        crop_grid.setAlignment(Qt.AlignTop)
        crop_grid.setContentsMargins(0, 0, 0, 0)
        for i in range(4):
            slider_name = self.slider_names[i]
            crop_grid.addWidget(self.slider_labels[slider_name], i, 0)
            crop_grid.addWidget(self.slider_values[slider_name], i, 1)
            crop_grid.addWidget(self.sliders[slider_name], i, 2)

        crop_box = QGroupBox("Crop Parameters")
        crop_box.setLayout(crop_grid)
        return crop_box

    def make_update_box(self):
        update_layout = QGridLayout()
        update_layout.setColumnStretch(4, 2)
        update_layout.setAlignment(Qt.AlignTop)
        update_layout.setContentsMargins(0, 0, 0, 0)
        self.update_prices_button = QPushButton("Update Prices")
        self.update_prices_button.clicked.connect(self.update_prices)
        self.update_prices_progress = QProgressBar()
        self.update_prices_progress.setFixedWidth(110)
        self.update_prices_progress.setRange(0, 100)
        update_layout.addWidget(self.update_prices_button, 0, 0)
        update_layout.addWidget(self.update_prices_progress, 0, 1)

        self.update_ducats_button = QPushButton("Update Ducats")
        self.update_ducats_button.clicked.connect(self.update_ducats)
        self.update_ducats_progress = QProgressBar()
        self.update_ducats_progress.setFixedWidth(110)
        self.update_ducats_progress.setRange(0, 100)
        update_layout.addWidget(self.update_ducats_button, 1, 0)
        update_layout.addWidget(self.update_ducats_progress, 1, 1)

        last_updated_prices_label = QLabel("Prices Updated")

        prices = self.settings.value("last_updated_prices_value", defaultValue="Never", type=str)
        ducats = self.settings.value("last_updated_ducats_value", defaultValue="Never", type=str)
        num_parts = self.settings.value("num_parts_value", defaultValue=350, type=str)
        latest_item = self.settings.value("latest_item_value", defaultValue="", type=str)

        self.last_updated_prices_value = QLabel(prices)
        self.last_updated_ducats_value = QLabel(ducats)
        self.num_parts_value = QLabel(num_parts)
        self.latest_item_value = QLabel(latest_item)

        update_layout.addWidget(last_updated_prices_label, 2, 0)
        update_layout.addWidget(self.last_updated_prices_value, 2, 1)

        last_updated_ducats_label = QLabel("Ducats Updated")
        update_layout.addWidget(last_updated_ducats_label, 3, 0)
        update_layout.addWidget(self.last_updated_ducats_value, 3, 1)

        num_parts_label = QLabel("Prime Parts")
        update_layout.addWidget(num_parts_label, 4, 0)
        update_layout.addWidget(self.num_parts_value, 4, 1)

        latest_item_label = QLabel("Latest Prime")
        update_layout.addWidget(latest_item_label, 5, 0)
        update_layout.addWidget(self.latest_item_value, 5, 1)

        update_box = QGroupBox("Updates")
        update_box.setLayout(update_layout)
        return update_box

    def init_sliders(self):
        self.slider_names = ['x', 'y', 'w', 'h', 'v1', 'v2', 'd', 'Screencap (hz)', 'Fissure (s)', 'API Threads']
        self.sliders = {x: QSlider(Qt.Horizontal) for x in self.slider_names}
        self.slider_labels = {x: QLabel(x) for x in self.slider_names}
        self.slider_default_values = {}
        self.slider_orig_values = {'x': 521, 'y': 400, 'w': 908, 'h': 70, 'v1': 197, 'v2': 180, 'd': 4,
                                   'Screencap (hz)': 1, 'Fissure (s)': 30, 'API Threads': 4}
        for slider_name in self.slider_names:
            self.slider_default_values[slider_name] = self.settings.value(slider_name, defaultValue=self.slider_orig_values[slider_name])
        self.slider_values = {x: QLabel(str(self.slider_default_values[x])) for x in self.slider_names}
        self.slider_values['Screencap (hz)'].setNum(self.slider_default_values['Screencap (hz)']/4)
        self.slider_values['d'].setNum(self.slider_default_values['d'] / 4)

        self.slider_labels['d'].setText('\u0394')

        self.sliders['x'].setMaximum(int(self.warframe_width / 2))
        self.sliders['y'].setMaximum(int(self.warframe_height / 2))
        self.sliders['w'].setMaximum(self.warframe_width)
        self.sliders['h'].setMaximum(self.warframe_height)
        self.sliders['v1'].setMaximum(255)
        self.sliders['v2'].setMaximum(255)
        self.sliders['d'].setMaximum(40)
        self.sliders['Screencap (hz)'].setMaximum(20)
        self.sliders['Screencap (hz)'].setMinimum(1)
        self.sliders['Fissure (s)'].setMaximum(60)
        self.sliders['Fissure (s)'].setMinimum(10)
        self.sliders['API Threads'].setMaximum(10)
        self.sliders['API Threads'].setMinimum(2)
        for slider_name in self.slider_names:
            if len(slider_name) <= 2:
                self.sliders[slider_name].setMinimum(0)
            self.sliders[slider_name].setSingleStep(1)
            self.slider_values[slider_name].setFixedWidth(35)
            self.sliders[slider_name].setValue(self.slider_default_values[slider_name])

    def init_tables(self):
        self.table = QTableWidget(7, 3)
        self.table.setHorizontalHeaderLabels(['Prime Part', 'Plat', 'Ducats'])
        self.table.setEditTriggers(QAbstractItemView.NoEditTriggers)
        header = self.table.horizontalHeader()
        header.setSectionResizeMode(0, QHeaderView.Stretch)
        header.setSectionResizeMode(1, QHeaderView.ResizeToContents)
        header.setSectionResizeMode(2, QHeaderView.ResizeToContents)

        self.mission_table = QTableWidget(30, 4)
        self.mission_table.setHorizontalHeaderLabels(['Relic', 'Mission', 'Type', 'Time Left'])
        self.mission_table.setEditTriggers(QAbstractItemView.NoEditTriggers)

        mission_header = self.mission_table.horizontalHeader()

        for i in range(4):
            mission_header.setSectionResizeMode(i, QHeaderView.Interactive)
        mission_header.resizeSection(0, 55)
        mission_header.resizeSection(1, 150)
        mission_header.resizeSection(2, 90)
        mission_header.resizeSection(3, 60)
        self.mission_table.setFixedWidth(405)

    def update_prices(self):
        self.prices_thread = threading.Thread(name="prices_thread", target=self.market_api.update_prices)
        self.prices_thread.start()

        self.update_prices_button.setEnabled(False)
        self.update_ducats_button.setEnabled(False)

    def update_ducats(self):
        self.ducats_thread = threading.Thread(name="ducats_thread", target=self.market_api.update_ducats)
        self.ducats_thread.start()

        self.update_prices_button.setEnabled(False)
        self.update_ducats_button.setEnabled(False)

    def update_primes_info(self, num, latest):
        self.num_parts_value.setNum(num)
        self.latest_item_value.setText(latest)
        self.update_prices_progress.setMaximum(num)
        self.update_ducats_progress.setMaximum(num)
        self.num_primes = num

    def get_datetime(self):
        return datetime.now().strftime("%b %d %Y %H:%M:%S")

    def update_ducats_time(self):
        self.last_updated_ducats_value.setText(self.get_datetime())
        self.ducats_progress_lock.acquire()
        self.update_ducats_progress.setValue(self.num_primes)
        self.ducats_progress_lock.release()

        self.settings.setValue("last_updated_ducats_value", self.last_updated_ducats_value.text())
        self.settings.setValue("num_parts_value", self.num_parts_value.text())
        self.settings.setValue("latest_item_value", self.latest_item_value.text())

    def update_prices_time(self):
        self.last_updated_prices_value.setText(self.get_datetime())
        self.prices_progress_lock.acquire()
        self.update_prices_progress.setValue(self.num_primes)
        self.prices_progress_lock.release()

        self.settings.setValue("last_updated_prices_value", self.last_updated_prices_value.text())
        self.settings.setValue("num_parts_value", self.num_parts_value.text())
        self.settings.setValue("latest_item_value", self.latest_item_value.text())

    def set_update_prices_progress(self, val):
        if self.prices_progress_lock.acquire():
            self.update_prices_progress.setValue(val)
            self.prices_progress_lock.release()

    def set_update_ducats_progress(self, val):
        if self.ducats_progress_lock.acquire():
            self.update_ducats_progress.setValue(val)
            self.ducats_progress_lock.release()

    def finished_update_progress(self):
        self.update_prices_button.setEnabled(True)
        self.update_ducats_button.setEnabled(True)

    def show_preferences(self):
        self.dialog.exec_()
        self.load_settings()

    def toggle_fissure_table(self):
        if self.hide_fissure_check_box.isChecked():
            self.mission_table.hide()
        else:
            self.mission_table.show()
        self.setFixedSize(self.layout.sizeHint())

    def toggle_move_to_top(self):
        self.ocr.set_move_to_top(self.move_to_top_check_box.isChecked())

    def toggle_cropped_img(self):
        if self.hide_crop_check_box.isChecked():
            self.crop_img.hide()
        else:
            self.crop_img.show()
        self.setFixedSize(self.layout.sizeHint())

    def toggle_filtered_img(self):
        if self.hide_filter_check_box.isChecked():
            self.filter_img.hide()
        else:
            self.filter_img.show()
        self.setFixedSize(self.layout.sizeHint())
        #print("{}h,{}w".format(self.frameGeometry().height(),self.frameGeometry().width()))

    def set_sliders_range(self, x, y):
        max_values = {'x': int(x/2), 'y': int(y/2), 'w':x, 'h':y}
        for slider_name in max_values:
            self.sliders[slider_name].setMaximum(max_values[slider_name])
            self.sliders[slider_name].setValue(self.slider_default_values[slider_name])
            self.settings.setValue("{}_max", max_values[slider_name])

    def toggle_button(self):
        self.is_paused = not self.is_paused
        if self.is_paused:
            self.pause_button.setText("Resume")
        else:
            self.pause_button.setText("Pause")
        if self.ocr is not None:
            if self.is_paused:
                self.ocr.save_screenshot()
                self.ocr.skip_screenshot = True
            else:
                self.ocr.skip_screenshot = False

    def clear_table(self):
        self.table.clearSelection()
        self.table.clearContents()
        self.filled_rows = 0
        #self.table.setRowCount(self.filled_rows)

    def is_plat_preferred(self):
        return self.plat_check_box.isChecked()

    def insert_table_row(self, row):
        for i in range(3):
            self.table.setItem(self.filled_rows, i, QTableWidgetItem(str(row[i])))

        self.filled_rows = self.filled_rows + 1
        #self.table.setRowCount(self.filled_rows)

    def update_mission_table(self, missions):
        self.missions = list(missions)
        cur_time = time.time()
        for i in range(len(missions)):
            for j in range(3):
                self.mission_table.setItem(i, j, QTableWidgetItem(str(self.missions[i][j])))

            self.mission_table.setItem(i, 3, QTableWidgetItem(self.get_duration_str(self.missions[i][3]-cur_time)))
            if self.missions[i][0] in self.hidden_relics:
                self.mission_table.setRowHidden(i, True)
            if self.missions[i][2] in self.hidden_missions:
                self.mission_table.setRowHidden(i, True)
            else:
                self.mission_table.setRowHidden(i, False)

        self.mission_table.setRowCount(len(self.missions)-1)

    def update_mission_table_time(self):
        cur_time = time.time()
        needs_update = False
        for i in range(len(self.missions)):
            self.mission_table.setItem(i, 3, QTableWidgetItem(self.get_duration_str(self.missions[i][3]-cur_time)))
            if self.missions[i][3]-cur_time < 0:
                needs_update = True
        if needs_update:
            self.api.filter_expired_missions()

    def update_mission_table_hidden(self):
        for i in range(len(self.missions)):
            if self.missions[i][0] in self.hidden_relics:
                self.mission_table.setRowHidden(i, True)
            elif self.missions[i][2] in self.hidden_missions:
                self.mission_table.setRowHidden(i, True)
            else:
                self.mission_table.setRowHidden(i, False)

    def get_duration_str(self, duration):
        m, s = divmod(int(duration), 60)
        h, m = divmod(m, 60)
        return '{:d}:{:02d}:{:02d}'.format(h, m, s)

    def set_ocr_connection(self, ocr):
        for slider_name in self.slider_names:
            self.sliders[slider_name].valueChanged.connect(partial(self.set_ocr_crop, ocr, slider_name))
        self.ocr = ocr
        self.market_api = MarketReader(ocr=self.ocr, gui=self)

    def set_api(self, wf_api):
        self.api = wf_api
        self.make_hide_missions_box(self.api.mission_types)

    def set_hidden_relic(self, relic):
        if self.hide_relics[relic].isChecked():
            self.hidden_relics.add(relic)
        else:
            self.hidden_relics.remove(relic)
        self.update_mission_table_hidden()

    def set_ocr_crop(self, ocr, dim, val):
        if dim == 'Screencap (hz)' or dim == 'd':
            val = val / 4
        self.slider_values[dim].setNum(val)
        if val < 0 or val > 100000 or val is None:
            return
        if dim == 'x':
            ocr.set_x_offset(val)
        if dim == 'y':
            ocr.set_y_offset(val)
        if dim == 'w':
            ocr.set_w(val)
        if dim == 'h':
            ocr.set_h(val)
        if dim == 'v1':
            ocr.set_v1(val)
        if dim == 'v2':
            ocr.set_v2(val)
        if dim == 'd':
            self.ocr.set_diff_threshold(val/4)
        if dim == 'Screencap (hz)':
            ocr.set_interval(1/val)
        if dim == 'Fissure (s)':
            self.api.set_rate(val)
        if dim == 'API Threads':
            self.market_api.set_num_threads(val)

    #def select_max(self):
    #    # TODO doesnt work
    #    self.table.clearSelection()
    #    self.table.selectRow(self.max_row)

    def update_filtered(self, filtered):
        filtered_shape = None
        if not self.hide_filter_check_box.isChecked():
            filtered_shape = filtered.shape
            h, w = filtered.shape
            bytes_per_line = w
            filtered_pix = QPixmap(QImage(filtered, w, h, bytes_per_line, QImage.Format_Grayscale8))
            filtered_pix = filtered_pix.scaled(908, 70, Qt.KeepAspectRatio)
            self.image_label2.setPixmap(filtered_pix)
        #self.update_window_size(None, filtered_shape)

    def update_screenshot(self, screenshot):
        screenshot_shape = None
        if not self.hide_crop_check_box.isChecked():
            screenshot_shape = screenshot.shape
            h, w, ch = screenshot.shape
            bytes_per_line = ch * w
            screenshot_pix = QPixmap(QImage(screenshot, w, h, bytes_per_line, QImage.Format_RGB888))
            screenshot_pix = screenshot_pix.scaled(908, 70, Qt.KeepAspectRatio)
            self.image_label.setPixmap(screenshot_pix)
        #self.update_window_size(screenshot_shape, None)

    def update_window_size(self, screenshot_shape, filtered_shape):
        should_update = False
        if screenshot_shape is not None and screenshot_shape == self.old_screenshot_shape:
            self.old_screenshot_shape = screenshot_shape
            should_update = True
        if filtered_shape is not None and filtered_shape == self.old_filtered_shape:
            self.old_filtered_shape = filtered_shape
            should_update = True
        if should_update:
            self.setFixedSize(self.layout.sizeHint())

    def __exit__(self):
        self.market_api.exit_now = True
        self.ocr.exit_now = True
예제 #16
0
class ledStrip(QWidget):
    """
	[description]

	**Arguments:**

		None

	**Keword Arguments:**

		None

	**Author:**

		Chris Bruce, [email protected], 12/3/2018
	"""

    TITLE = "LED Strip Simluation"
    VERSION = 1.0
    SIZE = [300, 400]

    PIXEL_MIN = 8
    PIXEL_MAX = 256
    PIXEL_NUM = 32

    PIXEL_SIZE_MIN = 8
    PIXEL_SIZE_MAX = 64

    STRIP_COLOR = const.grey  # default RGB value for the strip
    PIXEL_COLOR = Color(12, 12, 12)  # default RGB value for LED pixel

    #STYLE_SHEET			= "QWidget{ background-color: rgb{} };".format( str( STRIP_COLOR ) )
    STYLE_SHEET = "QWidget{ background-color:white};"

    def __init__(self, app):
        super(ledStrip, self).__init__()

        self.app = app

        self.pixels = []  # array of LED pixels
        self.pixel_size = 32  # size of each LED pixel
        self.pixel_space = 16  # size of space between each LED pixel

        self.paused = False
        self.testing = False

        self._init_gui()

    def _init_gui(self):
        """
		[description]

		**Arguments:**

			None

		**Keword Arguments:**

			None

		**Author:**

			Chris Bruce, [email protected], 12/3/2018
		"""

        self.setWindowTitle('{} - ver. {}'.format(self.TITLE, self.VERSION))
        self.main_layout = QVBoxLayout()
        self.main_layout.setSpacing(self.pixel_space)
        self.setLayout(self.main_layout)

        self.setAutoFillBackground(True)
        self._strip_color()

        # size_policy = QSizePolicy( )
        # size_policy.setHorizontalPolicy( QSizePolicy.Minimum )
        # self.setSizePolicy( size_policy )

        self.main_layout.addWidget(self._create_strip())
        self.main_layout.addWidget(self._create_controls())

        self._update_gui()

    def _create_controls(self):
        """
		[description]

		**Arguments:**

			None

		**Keword Arguments:**

			None

		**Returns:**

			:``[type]``: [description]

		**Author:**

			Chris Bruce, [email protected], 12/3/2018
		"""

        widget = QWidget()  #QGroupBox( 'Settings:' )
        layout = QHBoxLayout()
        widget.setLayout(layout)

        label_num = QLabel('LEDs:')
        spin_num = QSpinBox()
        spin_num.setRange(self.PIXEL_MIN, self.PIXEL_MAX)
        spin_num.setFixedWidth(64)
        spin_num.setValue(self.PIXEL_NUM)
        spin_num.valueChanged.connect(self._on_spin_num_changed)

        label_size = QLabel('Size:')
        spin_size = QSpinBox()
        spin_size.setRange(self.PIXEL_SIZE_MIN, self.PIXEL_SIZE_MAX)
        spin_size.setFixedWidth(64)
        spin_size.setValue(self.pixel_size)
        spin_size.valueChanged.connect(self._on_spin_size_changed)

        label_space = QLabel('Space:')
        spin_space = QSpinBox()
        spin_space.setRange(0, 256)
        spin_space.setFixedWidth(64)
        spin_space.setValue(self.pixel_space)
        spin_space.valueChanged.connect(self._on_spin_space_changed)

        self.tests = QComboBox()
        for test in sorted(tests.keys()):
            self.tests.addItem(test)
        # self.tests.setCurrentText( 'Soft Fade' )

        btn_start = QPushButton('Start')
        btn_start.pressed.connect(self._on_btn_start_pressed)

        btn_pause = QPushButton('Pause')
        btn_pause.pressed.connect(self._on_btn_pause_pressed)

        btn_stop = QPushButton('Stop')
        btn_stop.pressed.connect(self._on_btn_stop_pressed)

        layout.addStretch()
        layout.addWidget(label_num)
        layout.addWidget(spin_num)
        layout.addWidget(label_size)
        layout.addWidget(spin_size)
        layout.addWidget(label_space)
        layout.addWidget(spin_space)
        layout.addWidget(self.tests)
        layout.addWidget(btn_start)
        layout.addWidget(btn_pause)
        layout.addWidget(btn_stop)
        layout.addStretch()

        return widget

    def _create_pixel(self, color):
        """
		[description]

		**Arguments:**

			:``color``: `[type]` [description]

		**Keword Arguments:**

			None

		**Returns:**

			:``[type]``: [description]

		**Author:**

			Chris Bruce, [email protected], 12/3/2018
		"""

        pixel = QFrame()
        pixel.setFixedSize(QSize(self.pixel_size, self.pixel_size))
        pixel.setFrameShape(QFrame.Box)
        pixel.setFrameShadow(QFrame.Raised)
        pixel.setLineWidth(0)
        pixel.setMidLineWidth(self.pixel_size / 8)

        pixel.setStyleSheet("background-color: rgb{}".format(color))

        return pixel

    def _create_strip(self):
        """
		[description]

		**Arguments:**

			None

		**Keword Arguments:**

			None

		**Returns:**

			:``[type]``: [description]

		**Author:**

			Chris Bruce, [email protected], 12/3/2018
		"""

        self.strip_widget = QWidget()
        self.strip_layout = QHBoxLayout()
        self.strip_layout.setSpacing(self.pixel_space)
        self.strip_widget.setLayout(self.strip_layout)

        for i in range(self.PIXEL_NUM):
            pixel = self._create_pixel(self.PIXEL_COLOR)
            self.pixels.append(pixel)
            self.strip_layout.addWidget(pixel)

        return self.strip_widget

    def _strip_color(self, color=STRIP_COLOR):
        """
		Change the color of the strip

		**Arguments:**

			None

		**Keword Arguments:**

			None

		**Returns:**

			:``[type]``: [description]

		**Author:**

			Chris Bruce, [email protected], 12/3/2018
		"""

        p = self.palette()
        p.setColor(self.backgroundRole(), QColor(*color))
        self.setPalette(p)

        return color

    def _update_size(self):
        self.strip_widget.setFixedSize(self.strip_layout.sizeHint())
        self.setFixedSize(self.main_layout.sizeHint())

        self._center()

        return True

    def _center(self):
        qtRectangle = self.frameGeometry()
        centerPoint = QDesktopWidget().availableGeometry().center()
        qtRectangle.moveCenter(centerPoint)
        self.move(qtRectangle.topLeft())

        return qtRectangle.topLeft()

    def _update_gui(self):
        self._update_size()
        self._center()

        return True

    def _on_spin_num_changed(self, value):
        """
		Change the color of the strip

		**Arguments:**

			None

		**Keword Arguments:**

			None

		**Returns:**

			:``[type]``: [description]

		**Author:**

			Chris Bruce, [email protected], 12/3/2018
		"""

        num_pixels = self.numPixels()

        if value > num_pixels:
            for _ in range(value - num_pixels):
                pixel = self._create_pixel(self.PIXEL_COLOR)
                self.pixels.append(pixel)
                self.strip_layout.addWidget(pixel)
        elif value < len(self.pixels):
            for _ in range(num_pixels - value):
                pixel = self.pixels[-1]
                self.strip_layout.removeWidget(pixel)
                self.pixels.pop()
                pixel.deleteLater()

        self._update_gui()

    def _on_spin_size_changed(self, value):
        """
		Change the color of the strip

		**Arguments:**

			None

		**Keword Arguments:**

			None

		**Returns:**

			:``[type]``: [description]

		**Author:**

			Chris Bruce, [email protected], 12/3/2018
		"""

        for pixel in self.pixels:
            self.pixel_size = value
            pixel.setFixedSize(QSize(self.pixel_size, self.pixel_size))
            pixel.setMidLineWidth(self.pixel_size / 8)

        self._update_gui()

    def _on_spin_space_changed(self, value):
        """
		Change the color of the strip

		**Arguments:**

			None

		**Keword Arguments:**

			None

		**Returns:**

			:``[type]``: [description]

		**Author:**

			Chris Bruce, [email protected], 12/3/2018
		"""

        self.pixel_space = value
        self.strip_layout.setSpacing(self.pixel_space)

        self._update_gui()

    def _on_btn_start_pressed(self):
        self.testing = True
        sel_test = self.tests.currentText()
        test_func = tests[sel_test]

        return test_func(self)

    def _on_btn_pause_pressed(self):
        self.paused = not self.paused

        return True

    def _on_btn_stop_pressed(self):
        self.testing = False

        return True

    def numPixels(self):
        """
		[description]

		**Arguments:**

			None

		**Keword Arguments:**

			None

		**Returns:**

			:``[type]``: [description]

		**Author:**

			Chris Bruce, [email protected], 12/3/2018
		"""

        return len(self.pixels)

    def setPixelColor(self, i, color):
        """
		[description]

		**Arguments:**

			:``i``: `[type]` [description]
			:``color``: `[type]` [description]

		**Keword Arguments:**

			None

		**Returns:**

			:``[type]``: [description]

		**Author:**

			Chris Bruce, [email protected], 12/3/2018
		"""

        if color == 0:
            color = self.PIXEL_COLOR

        if i > (self.numPixels() - 1):
            i -= self.numPixels()

        pixel = self.pixels[i]
        pixel.setStyleSheet("background-color: rgb{}".format(color))

        return True

    def show(self):
        """
		Extends QWidget's .show( ) so it can function similuarly as NeoPixel calls

		**Author:**

			Chris Bruce, [email protected], 12/3/2018
		"""

        super(ledStrip, self).show()

        # extended functionality
        self.app.processEvents()

    def closeEvent(self, event):
        print("Closing")
        self._on_btn_stop_pressed()
        self.destroy()
        self.app.exit()
class myColorHistogram(QtWidgets.QWidget):
    def process(self):
        self.value = self.value_textbox.text()
        self.hue = self.hue_textbox.text()
        self.saturation = self.saturation_textbox.text()
        self.img_path = self.dir_label.text()
        print(self.value)
        print(self.hue)
        print(self.saturation)
        self.myThread = colorhist_thread(self.hue, self.saturation, self.value,
                                         self.img_path, self.output_string)
        self.myThread.started.connect(self.start)
        self.myThread.start()
        self.myThread.finished.connect(self.please_done)

    def selectfolderpartial(self, btn):
        pathfolder = QFileDialog.getExistingDirectory(self,
                                                      'Select a directory')
        if (btn == self.select_dir_button):
            pathfolder = pathfolder + "/"
            self.dir_label.setText(pathfolder)
            self.dir_string = pathfolder
            self.dir_label.setFixedWidth(500)

    def saveFileDialog(self):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getSaveFileName(
            self,
            "Save as *.csv and *.npy",
            "",
            "All Files (*);;Text Files (*.txt)",
            options=options)
        self.output_label.setText(fileName)
        self.output_string = fileName

    def fontInit(self):
        self.fonth1 = QFont()
        self.fonth1.setPointSize(12)
        self.fonth1.setBold(True)

    def initMainLayout(self):
        # Title
        self.title = QLabel('Color Histogram')
        self.title.setObjectName("label_file")
        self.title.setAlignment(QtCore.Qt.AlignHCenter)
        self.title.setFont(self.fonth1)
        ################################################
        self.mainlayout = QVBoxLayout()
        self.mainlayout.setAlignment(QtCore.Qt.AlignTop)
        self.setLayout(self.mainlayout)
        self.secondLayout = QGridLayout()
        self.mainlayout.addWidget(self.title)
        self.mainlayout.addLayout(self.secondLayout)

    def initLayout(self):
        # label hue Rule
        self.hue_label = QLabel('Nilai kuantisasi hue')
        ############################################
        # Input hue operator mblbp
        self.hue_textbox = QLineEdit(self)
        self.hue_textbox.setMaximumWidth(100)
        self.hue_textbox.setFixedWidth(100)
        reg_ex = QtCore.QRegExp("\d+")
        self.hue_textbox.setText("0")
        input_validator = QtGui.QRegExpValidator(reg_ex, self.hue_textbox)
        self.hue_textbox.setValidator(input_validator)
        ############################################
        # label saturation Rule
        self.saturation_label = QLabel('Nilai kuantisasi saturation')
        ############################################
        # Input saturation operator mblbp
        self.saturation_textbox = QLineEdit(self)
        self.saturation_textbox.setMaximumWidth(100)
        self.saturation_textbox.setFixedWidth(100)
        reg_ex = QtCore.QRegExp("\d+")
        self.saturation_textbox.setText("0")
        input_validator = QtGui.QRegExpValidator(reg_ex,
                                                 self.saturation_textbox)
        self.saturation_textbox.setValidator(input_validator)
        ############################################
        # label value Rule
        self.value_label = QLabel('Nilai kuantisasi value')
        ############################################
        # Input value operator mblbp
        self.value_textbox = QLineEdit(self)
        self.value_textbox.setMaximumWidth(100)
        self.value_textbox.setFixedWidth(100)
        reg_ex = QtCore.QRegExp("\d+")
        self.value_textbox.setText("0")
        input_validator = QtGui.QRegExpValidator(reg_ex, self.value_textbox)
        self.value_textbox.setValidator(input_validator)
        ############################################
        self.secondLayout.addWidget(self.hue_textbox, 1, 0)
        self.secondLayout.addWidget(self.hue_label, 1, 1)
        self.secondLayout.addWidget(self.saturation_textbox, 2, 0)
        self.secondLayout.addWidget(self.saturation_label, 2, 1)
        self.secondLayout.addWidget(self.value_textbox, 3, 0)
        self.secondLayout.addWidget(self.value_label, 3, 1)
        ############################################
        # button Select Directory Image
        self.select_dir_button = QPushButton('Select Folder')
        self.select_dir_button.setMinimumSize(QtCore.QSize(100, 30))
        self.select_dir_button.setMaximumSize(QtCore.QSize(100, 30))
        self.select_dir_button.setObjectName("pushButton")
        self.select_dir_button.clicked.connect(
            partial(self.selectfolderpartial, self.select_dir_button))
        ############################################
        # label dir
        self.dir_label = QLabel('Folder dataset PETA')
        ############################################
        # button Output
        self.output_button = QPushButton('Output')
        self.output_button.setMinimumSize(QtCore.QSize(100, 30))
        self.output_button.setMaximumSize(QtCore.QSize(100, 30))
        self.output_button.setObjectName("pushButton")
        self.output_button.clicked.connect(self.saveFileDialog)
        ############################################
        # label Output
        self.output_label = QLabel('')
        ############################################
        # button Process
        self.process_button = QPushButton('Process')
        self.process_button.setMinimumSize(QtCore.QSize(100, 30))
        self.process_button.setMaximumSize(QtCore.QSize(100, 30))
        self.process_button.setObjectName("pushButton")
        self.process_button.clicked.connect(self.process)
        ############################################
        # label Process
        self.process_label = QLabel('')
        ############################################
        self.secondLayout.addWidget(self.select_dir_button, 4, 0)
        self.secondLayout.addWidget(self.dir_label, 4, 1)
        self.secondLayout.addWidget(self.output_button, 5, 0)
        self.secondLayout.addWidget(self.output_label, 5, 1)
        self.secondLayout.addWidget(self.process_button, 6, 0)
        self.secondLayout.addWidget(self.process_label, 6, 1)

    def initGlobalVariable(self):
        self.hue = ''
        self.saturation = ''
        self.value = ''
        self.img_path = ''
        self.output_string = ''

    def setEnabledWidget(self, stat):
        self.hue_textbox.setEnabled(stat)
        self.saturation_textbox.setEnabled(stat)
        self.value_textbox.setEnabled(stat)
        self.select_dir_button.setEnabled(stat)
        self.output_button.setEnabled(stat)
        self.process_button.setEnabled(stat)

    def start(self):
        self.setEnabledWidget(False)
        self.process_label.setText("Silahkan Tunggu")

    def please_done(self):
        self.setEnabledWidget(True)
        self.process_label.setText("Berhasil")
        self.myThread.terminate()

    def __init__(self, parent=None):
        super(myColorHistogram, self).__init__(parent)
        self.fontInit()
        self.initMainLayout()
        self.initLayout()
        self.setMinimumSize(self.mainlayout.sizeHint())
예제 #18
0
class MainUsage(QMainWindow):
    """Main window of the application, kept simple and designed
        to be used by people who award certificates."""
    def __init__(self):
        super(MainUsage, self).__init__()
        if not ls.load_language():
            ls.select_language("en")

        # continuously check connection in background
        self.check_connection_in_thread()

        # checking if a register has previously been loaded
        self.registre = Registre()  # empty register
        self.school_name = ""  # also serves as indicator that a register has been loaded
        if os.path.exists("school_name.txt") and os.path.exists("p.rc"):
            with open("school_name.txt", "r") as f:
                self.school_name = f.read()
            with open("p.rc") as f:
                p = f.read()
            try:
                # if local files exist, download from cloud
                if self.school_name \
                and cloud_support.download_registre(self.school_name, p):
                    self.registre = Registre()
                    self.registre.charger()
            except KeyError:
                self.school_name = ""
                open("school_name.txt", "w").close()

        # if no register is loaded, settings_window serves as first screen to
        # guide user through creating/loading a new register
        if not self.school_name:
            self.show_settings()

        self.registre_updated_flag = False
        self.thread_running_flag = False

        self.lay_out()

    def lay_out(self):
        """lays out main window on initialization
            and connects button callbacks"""
        self.setWindowTitle(ls.strings.TITLE)
        self.layout = QVBoxLayout()
        self.title = QLabel(ls.strings.TITLE)
        self.title.setFont(QFont("unknown", 13))
        self.title.setAlignment(Qt.AlignCenter)
        self.param_imprim = QWidget()
        self.h_layout = QHBoxLayout()
        self.h_layout.setContentsMargins(0, 0, 0, 0)
        self.parametres = QPushButton(ls.strings.PARAMETERS_BUTTON)
        self.imprimer = QPushButton(ls.strings.PRINT_BUTTON)
        self.h_layout.addWidget(self.parametres)
        self.h_layout.addWidget(self.imprimer)
        self.param_imprim.setLayout(self.h_layout)
        self.membres = MyComboBox(placeholder=ls.strings.MEMBER_CB)
        self.membres.setFont(QFont("unknown", 13))
        self.membres.addItems([m.id for m in self.registre.membres])
        self.categories = MyComboBox(placeholder=ls.strings.CATEG_CB)
        self.categories.setFont(QFont("unknown", 13))
        self.categories.addItems([c for c in self.registre.categories])
        self.cert_box = MyComboBox(placeholder=ls.strings.CERT_CB)
        self.cert_box.setFont(QFont("unknown", 13))
        self.status = QLabel()
        self.status.setAlignment(Qt.AlignCenter)
        self.status.setWordWrap(True)
        self.status.setFont(QFont("unknown", 12))
        self.decerner = QPushButton(ls.strings.AWARD_CERTIFICATE)
        self.rendre_certificateur = QPushButton(
            ls.strings.MAKE_CERTIFICATOR_BUTTON)
        self.reinitialiser = QPushButton(ls.strings.REINITIALIZE_BUTTON)
        self.thread_progress = QLabel(ls.strings.SAVED)
        self.thread_progress.setAlignment(Qt.AlignRight)
        self.thread_progress.setStyleSheet("color:grey")
        self.layout.addWidget(self.title)
        self.layout.addWidget(self.param_imprim)
        self.layout.addWidget(self.membres)
        self.layout.addWidget(self.categories)
        self.layout.addWidget(self.cert_box)
        self.layout.addWidget(self.status)
        self.layout.addWidget(self.decerner)
        self.layout.addWidget(self.rendre_certificateur)
        self.layout.addWidget(self.reinitialiser)
        self.layout.addWidget(self.thread_progress)
        self.decerner.hide()
        self.rendre_certificateur.hide()
        self.reinitialiser.hide()
        widget = QWidget()
        widget.setLayout(self.layout)
        self.setCentralWidget(widget)
        self.resize(self.layout.sizeHint())

        # -----------  connecting slots  ---------------

        self.parametres.clicked.connect(self.show_settings)
        self.imprimer.clicked.connect(self.imprimer_callback)
        self.decerner.clicked.connect(self.decerner_callback)
        self.rendre_certificateur.clicked.connect(
            self.rendre_certificateur_callback)
        self.reinitialiser.clicked.connect(self.reinitialiser_callback)
        self.membres.currentTextChanged.connect(self.update)
        self.categories.currentTextChanged.connect(self.update)
        self.cert_box.currentTextChanged.connect(self.update)

    def update(self):
        """Frequently called function that updates both register data and UI"""

        # ----------  updating register data ----------
        if not self.school_name:
            # first prompt screen if no school name
            self.show_settings()
        else:
            if self.registre_updated_flag:
                self.upload_in_thread()
            else:
                self.download_in_thread()
        self.registre_updated_flag = False

        # ---------------  updating UI  ---------------
        self.update_comboboxes()

        membre = self.membres.currentText()
        certificat = self.cert_box.currentText()

        m = self.registre.find_membre_by_id(membre)
        c = self.registre.find_certificat_by_name(certificat)

        if not m or not c:
            self.rendre_certificateur.hide()
            self.decerner.hide()
            self.reinitialiser.hide()

        if not m and not c:
            msg = ""
        elif m and not c:
            _, msg = self.registre.get_certificats_for_member(m)
        elif not m and c:
            _, msg = self.registre.get_members_for_certificat(c)
        else:
            a, msg = self.registre.a_le_certificat(m, c)

            if a == Registre.Certifie:
                self.decerner.setText(ls.strings.REVOKE_CERTIFICATE)
                self.decerner.show()
                self.rendre_certificateur.show()
                self.reinitialiser.hide()
            elif a == Registre.Certificateur:
                self.decerner.setText(ls.strings.REVOKE_CERTIFICATE)
                self.decerner.show()
                self.rendre_certificateur.hide()
                self.reinitialiser.hide()
            elif a == Registre.NonCertifie:
                self.decerner.setText(ls.strings.AWARD_CERTIFICATE)
                self.decerner.show()
                self.rendre_certificateur.hide()
                self.reinitialiser.hide()
            elif a == Registre.CertificatPerdu:
                self.decerner.setText(ls.strings.AWARD_CERTIFICATE)
                self.decerner.show()
                self.reinitialiser.show()
                self.rendre_certificateur.hide()

        self.status.setText(msg)
        self.resize(
            QSize(max(self.layout.sizeHint().width(), self.width()),
                  max(self.layout.sizeHint().height(), self.height())))

    def update_comboboxes(self):
        """Loads data from self.registre into the members and category
        widgets"""
        saved_text_m = self.membres.currentText()
        saved_text_cat = self.categories.currentText()
        saved_text_cert = self.cert_box.currentText()

        # prevent signals from retriggering self.update
        self.membres.currentTextChanged.disconnect(self.update)
        self.categories.currentTextChanged.disconnect(self.update)
        self.cert_box.currentTextChanged.disconnect(self.update)

        # deleting possibly obsolete data
        self.membres.clear()
        self.categories.clear()
        self.cert_box.clear()

        # filling in updated data
        self.membres.addItems([m.id for m in self.registre.membres])
        self.categories.addItems(self.registre.categories)
        if saved_text_cat in self.registre.categories:
            self.cert_box.addItems(
                [c.nom for c in self.registre.get_certificats(saved_text_cat)])
        else:
            self.cert_box.addItems([c.nom for c in self.registre.certificats])

        # restoring saved text
        self.membres.setEditText(saved_text_m)
        self.categories.setEditText(saved_text_cat)
        self.cert_box.setEditText(saved_text_cert)

        # reconnecting slots
        self.membres.currentTextChanged.connect(self.update)
        self.categories.currentTextChanged.connect(self.update)
        self.cert_box.currentTextChanged.connect(self.update)

        self.resize(self.layout.sizeHint())

    def show_settings(self):
        self.setWindowOpacity(0.)
        settings_window = SettingsWindow(self)
        settings_window.show()

    def decerner_callback(self):
        """awards or removes a certificate to/from a member"""
        membre = self.membres.currentText()
        certificat = self.cert_box.currentText()

        m = self.registre.find_membre_by_id(membre)
        c = self.registre.find_certificat_by_name(certificat)
        if not m or not c:
            return
        else:
            if self.decerner.text() == ls.strings.REVOKE_CERTIFICATE:
                if not confirm(ls.strings.REMOVE_CERTIFICATE_FROM(m.id,
                                                                  c.nom)):
                    return
                self.registre.decerner_certificat(
                    m, c, self.registre.CertificatPerdu)
                self.rendre_certificateur.hide()
            elif self.decerner.text() == ls.strings.AWARD_CERTIFICATE:

                if not confirm(ls.strings.AWARD_CERTIFICATE_TO(m.id, c.nom)):
                    return
                self.registre.decerner_certificat(m, c, self.registre.Certifie)
                self.rendre_certificateur.show()

            self.registre_updated_flag = True
            self.update()

    def rendre_certificateur_callback(self):
        """ makes the person able to award the certificate
            to someone else """
        membre = self.membres.currentText()
        certificat = self.cert_box.currentText()

        m = self.registre.find_membre_by_id(membre)
        c = self.registre.find_certificat_by_name(certificat)
        if not (m and c):
            return
        else:
            if not confirm(ls.strings.MAKE_CERTIFICATOR(m.id, c.nom)):
                return
            self.rendre_certificateur.hide()
            self.registre.decerner_certificat(m, c,
                                              self.registre.Certificateur)
            self.registre_updated_flag = True
            self.update()

    def reinitialiser_callback(self):
        """ Erase the history of a person who has lost a certificate (as if
        they just never had the certificate) """
        membre = self.membres.currentText()
        certificat = self.cert_box.currentText()

        m = self.registre.find_membre_by_id(membre)
        c = self.registre.find_certificat_by_name(certificat)
        if not (m and c):
            return
        else:
            if not confirm(ls.strings.CLEAR_HISTORY(m.id, c.nom)):
                return
            self.rendre_certificateur.hide()
            self.registre.decerner_certificat(m, c, self.registre.NonCertifie)
            self.reinitialiser.hide()
            self.registre_updated_flag = True
            self.update()

    def imprimer_callback(self):
        """ generates a printable excel file """
        excel.generer_registre(self.registre)

    def upload_in_thread(self):
        """ uploads local register to cloud in separate thread """
        if self.thread_running_flag:
            return
        else:
            self.thread_running_flag = True
        self.thread = QThread()
        self.uploader = multithreading.Uploader()
        self.uploader.moveToThread(self.thread)
        self.thread.started.connect(self.uploader.run)
        self.uploader.finished.connect(self.thread.quit)
        self.uploader.finished.connect(self.uploader.deleteLater)
        self.thread.finished.connect(self.thread.deleteLater)

        def finished():
            self.thread_progress.setText(ls.strings.SAVED)
            self.thread_running_flag = False

        def started():
            self.thread_progress.setText(ls.strings.SAVING)

        self.uploader.finished.connect(finished)
        self.uploader.started.connect(started)

        self.registre.enregistrer()
        self.thread.start()

    def download_in_thread(self):
        """ downloads register from cloud to local
            file in separate thread """
        if self.thread_running_flag:
            return
        else:
            self.thread_running_flag = True
        self.thread = QThread()
        self.downloader = multithreading.Downloader()
        self.downloader.moveToThread(self.thread)
        self.thread.started.connect(self.downloader.run)
        self.downloader.finished.connect(self.thread.quit)
        self.downloader.finished.connect(self.downloader.deleteLater)
        self.thread.finished.connect(self.thread.deleteLater)

        def finished():
            self.registre.charger()
            self.update_comboboxes()
            self.update()
            self.thread_progress.setText(ls.strings.SAVED)
            self.thread_running_flag = False

        def started():
            self.thread_progress.setText(ls.strings.SYNCHRONIZING)

        self.downloader.finished.connect(finished)
        self.downloader.started.connect(started)

        self.thread.start()

    def check_connection_in_thread(self):
        """ continously checks if app is connected to internet """
        self.check_thr = QThread()
        self.checker = multithreading.ConnectionChecker()
        self.checker.moveToThread(self.check_thr)
        self.check_thr.started.connect(self.checker.run)
        self.checker.finished.connect(self.check_thr.quit)
        self.checker.finished.connect(self.checker.deleteLater)
        self.check_thr.finished.connect(self.check_thr.deleteLater)
        self.check_thr.start()
class myAdaboostTraining(QtWidgets.QWidget):
    def process(self):
        self.cf_string = self.cf_label.text()
        self.mf_string = self.mf_label.text()
        self.weak_class_string = self.weak_class_textbox.text()
        self.myThread = guiadaboost_thread(self.cf_string, self.mf_string,
                                           self.weak_class_string,
                                           self.cv_string,
                                           self.attr_label_string,
                                           self.save_string)
        self.myThread.started.connect(self.start)
        self.myThread.start()
        self.myThread.mySignal.connect(self.hello)
        self.myThread.finished.connect(self.please_done)

    def hello(self, result):
        QMessageBox.information(self, "Pelatihan Berhasil", result)
        print(result)

    def selectfilepartial(self, btn):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getOpenFileName(self,
                                                  "Open file *.npy",
                                                  "",
                                                  "Numpy Files (*.npy)",
                                                  options=options)
        if (btn == self.select_mf_button):
            self.mf_label.setText(fileName)
            self.mf_string = fileName
            self.mf_label.setFixedWidth(500)
        if (btn == self.select_cf_button):
            self.cf_label.setText(fileName)
            self.cf_string = fileName
            self.cf_label.setFixedWidth(500)

    def saveFileDialog(self):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getSaveFileName(self,
                                                  "Save as *.pkl",
                                                  "",
                                                  "Pickle Files (*.pkl)",
                                                  options=options)
        fileName = fileName + ".pkl"
        self.save_label.setText(fileName)
        self.save_string = fileName

    def fontInit(self):
        self.fonth1 = QFont()
        self.fonth1.setPointSize(12)
        self.fonth1.setBold(True)

    def initMainLayout(self):
        # Title
        self.title = QLabel('Adaboost Training')
        self.title.setObjectName("label_file")
        self.title.setAlignment(QtCore.Qt.AlignHCenter)
        self.title.setFont(self.fonth1)
        ################################################
        self.mainlayout = QVBoxLayout()
        self.mainlayout.setAlignment(QtCore.Qt.AlignTop)
        self.setLayout(self.mainlayout)
        self.secondLayout = QGridLayout()
        self.mainlayout.addWidget(self.title)
        self.mainlayout.addLayout(self.secondLayout)

    def initLayout(self):
        # label weak classifier Rule
        self.weak_class_label = QLabel('Jumlah Weak Classifier')
        ############################################
        # Input weak classifier mblbp
        self.weak_class_textbox = QLineEdit(self)
        self.weak_class_textbox.setMaximumWidth(100)
        self.weak_class_textbox.setFixedWidth(100)
        reg_ex = QtCore.QRegExp("\d+")
        self.weak_class_textbox.setText("0")
        input_validator = QtGui.QRegExpValidator(reg_ex,
                                                 self.weak_class_textbox)
        self.weak_class_textbox.setValidator(input_validator)
        ############################################
        # label Cross Validation Rule
        self.cv_label = QLabel('Cross Validation')
        ############################################
        # Input saturation operator mblbp
        self.cv = QComboBox()
        # self.cv.addItems(["0", "2", "5", "10", "15"])
        # self.cv.addItem("0", 0)
        self.cv.addItem("2", 2)
        self.cv.addItem("5", 5)
        self.cv.addItem("10", 10)
        self.cv.addItem("15", 15)
        self.cv.currentIndexChanged.connect(self.selectionchangecv)
        self.cv.setMaximumWidth(100)
        ############################################
        ############################################
        # Input Attribute
        self.attr_select = QComboBox()
        self.attr_select.addItem('Laki-laki', 77)
        self.attr_select.addItem('Celana Pendek', 88)
        self.attr_select.addItem('Rambut Panjang', 49)
        self.attr_select.addItem('Sandal', 85)
        self.attr_select.addItem('Membawa Sesuatu', 81)
        self.attr_select.addItem('Topi', 42)
        self.attr_select.addItem('Tas Punggung', 28)
        self.attr_select.currentIndexChanged.connect(self.selectionchangeattr)
        self.attr_select.setMaximumWidth(100)
        ############################################
        # label Cross Validation Rule
        self.attr_label = QLabel('Label Atribut')
        ############################################
        self.secondLayout.addWidget(self.weak_class_textbox, 1, 0)
        self.secondLayout.addWidget(self.weak_class_label, 1, 1)
        self.secondLayout.addWidget(self.cv, 2, 0)
        self.secondLayout.addWidget(self.cv_label, 2, 1)
        self.secondLayout.addWidget(self.attr_select, 3, 0)
        self.secondLayout.addWidget(self.attr_label, 3, 1)
        ############################################
        # button Select Color Feature
        self.select_cf_button = QPushButton('Fitur Warna')
        self.select_cf_button.setMinimumSize(QtCore.QSize(100, 30))
        self.select_cf_button.setMaximumSize(QtCore.QSize(100, 30))
        self.select_cf_button.setObjectName("pushButton")
        self.select_cf_button.clicked.connect(
            partial(self.selectfilepartial, self.select_cf_button))
        ############################################
        # label Select Color Feature
        self.cf_label = QLabel('')
        ############################################
        # button Select MBLBP  Feature
        self.select_mf_button = QPushButton('Fitur Tekstur')
        self.select_mf_button.setMinimumSize(QtCore.QSize(100, 30))
        self.select_mf_button.setMaximumSize(QtCore.QSize(100, 30))
        self.select_mf_button.setObjectName("pushButton")
        self.select_mf_button.clicked.connect(
            partial(self.selectfilepartial, self.select_mf_button))
        ############################################
        # label dir
        self.mf_label = QLabel('')
        ############################################
        # Save Process
        self.save_button = QPushButton('Output')
        self.save_button.setMinimumSize(QtCore.QSize(100, 30))
        self.save_button.setMaximumSize(QtCore.QSize(100, 30))
        self.save_button.setObjectName("pushButton")
        self.save_button.clicked.connect(self.saveFileDialog)
        ############################################
        # label Save
        self.save_label = QLabel('')
        ############################################
        # button Process
        self.process_button = QPushButton('Process')
        self.process_button.setMinimumSize(QtCore.QSize(100, 30))
        self.process_button.setMaximumSize(QtCore.QSize(100, 30))
        self.process_button.setObjectName("pushButton")
        self.process_button.clicked.connect(self.process)
        ############################################
        # label Process
        self.process_label = QLabel('')
        ############################################
        self.secondLayout.addWidget(self.select_cf_button, 4, 0)
        self.secondLayout.addWidget(self.cf_label, 4, 1)
        self.secondLayout.addWidget(self.select_mf_button, 5, 0)
        self.secondLayout.addWidget(self.mf_label, 5, 1)
        self.secondLayout.addWidget(self.save_button, 6, 0)
        self.secondLayout.addWidget(self.save_label, 6, 1)
        self.secondLayout.addWidget(self.process_button, 7, 0)
        self.secondLayout.addWidget(self.process_label, 7, 1)

    def selectionchangecv(self, i):
        print("Current index", self.cv.itemText(i))
        print("Current Data", self.cv.itemData(i))
        self.cv_string = self.cv.itemData(i)

    def selectionchangeattr(self, i):
        print("Current index", self.attr_select.itemText(i))
        print("Current Data", self.attr_select.itemData(i))
        self.attr_label_string = self.attr_select.itemData(i)
        print(self.attr_label_string)

    def initGlobalVariable(self):
        self.weak_class_string = ''
        self.cv_string = '2'
        self.cf_string = ''
        self.mf_string = ''
        self.attr_label_string = '77'
        self.save_string = ''

    def setEnabledWidget(self, stat):
        self.weak_class_textbox.setEnabled(stat)
        self.select_cf_button.setEnabled(stat)
        self.select_mf_button.setEnabled(stat)
        self.attr_select.setEnabled(stat)
        self.cv.setEnabled(stat)
        self.process_button.setEnabled(stat)

    def start(self):
        self.setEnabledWidget(False)
        self.process_label.setText("Silahkan Tunggu")

    def please_done(self):
        self.setEnabledWidget(True)
        self.process_label.setText("Berhasil")
        self.myThread.terminate()

    def __init__(self, parent=None):
        super(myAdaboostTraining, self).__init__(parent)
        self.initGlobalVariable()
        self.fontInit()
        self.initMainLayout()
        self.initLayout()
        self.setMinimumSize(self.mainlayout.sizeHint())
    def __init__(self, parent, active_data_types):
        super(NewValueExtractorWindow, self).__init__(parent)
        self.setAttribute(Qt.WA_DeleteOnClose)              # This is required to stop background timers!
        self.setWindowTitle('New Plot')
        self.setModal(True)

        self._active_data_types = active_data_types
        self.on_done = print

        # Message type selection box
        self._type_selector = CommitableComboBoxWithHistory(self)
        self._type_selector.setToolTip('Name of the message type to plot')
        self._type_selector.setInsertPolicy(QComboBox.NoInsert)
        type_completer = QCompleter(self._type_selector)
        type_completer.setCaseSensitivity(Qt.CaseSensitive)
        type_completer.setModel(self._type_selector.model())
        self._type_selector.setCompleter(type_completer)
        self._type_selector.setFont(get_monospace_font())
        self._type_selector.setSizeAdjustPolicy(QComboBox.AdjustToContents)
        self._type_selector.setFocus(Qt.OtherFocusReason)
        self._type_selector.currentTextChanged.connect(self._on_type_changed)

        self._show_all_types_button = make_icon_button('puzzle-piece',
                                                       'Show all known message types, not only those that are '
                                                       'currently being exchanged over the bus',
                                                       self, checkable=True, on_clicked=self._update_data_type_list)

        # Existence is torment.
        self._extraction_expression_box = QLineEdit(self)
        self._extraction_expression_box.setFont(get_monospace_font())
        self._extraction_expression_box.setToolTip('Example: msg.cmd[0] / 16384')

        # Node ID filter
        self._node_id_filter_checkbox = QCheckBox('Accept messages only from specific node', self)
        self._node_id_filter_checkbox.stateChanged.connect(
            lambda: self._node_id_filter_spinbox.setEnabled(self._node_id_filter_checkbox.isChecked()))

        self._node_id_filter_spinbox = QSpinBox(self)
        self._node_id_filter_spinbox.setMinimum(1)
        self._node_id_filter_spinbox.setMaximum(127)
        self._node_id_filter_spinbox.setValue(1)
        self._node_id_filter_spinbox.setEnabled(False)

        # Expression filter
        self._filter_expression_box = QLineEdit(self)
        self._filter_expression_box.setFont(get_monospace_font())
        self._filter_expression_box.setToolTip('Example: msg.esc_index == 3')

        # Visualization options
        self._selected_color = self.default_color_rotator.get()
        self._select_color_button = make_icon_button('paint-brush', 'Select line color', self,
                                                     on_clicked=self._select_color)
        self._select_color_button.setFlat(True)
        _set_color(self._select_color_button, QPalette.Button, self._selected_color)

        # Buttons
        self._ok_button = make_icon_button('check', 'Create new extractor with these settings', self,
                                           text='OK', on_clicked=self._on_ok)

        # Layout
        layout = QVBoxLayout(self)

        msg_type_box = QGroupBox('Message type', self)
        msg_type_box_layout = QHBoxLayout(self)
        msg_type_box_layout.addWidget(self._show_all_types_button)
        msg_type_box_layout.addWidget(self._type_selector, 1)
        msg_type_box.setLayout(msg_type_box_layout)
        layout.addWidget(msg_type_box)

        expr_box = QGroupBox('Expression to plot', self)
        expr_box_layout = QVBoxLayout(self)
        expr_box_layout.addWidget(QLabel('Message is stored in the variable "msg"', self))
        expr_box_layout.addWidget(self._extraction_expression_box)
        expr_box.setLayout(expr_box_layout)
        layout.addWidget(expr_box)

        nid_filter_box = QGroupBox('Node ID filter', self)
        nid_filter_box_layout = QHBoxLayout(self)
        nid_filter_box_layout.addWidget(self._node_id_filter_checkbox)
        nid_filter_box_layout.addWidget(self._node_id_filter_spinbox, 1)
        nid_filter_box.setLayout(nid_filter_box_layout)
        layout.addWidget(nid_filter_box)

        field_filter_box = QGroupBox('Field filter', self)
        field_filter_box_layout = QVBoxLayout(self)
        field_filter_box_layout.addWidget(QLabel('Message is stored in the variable "msg"', self))
        field_filter_box_layout.addWidget(self._filter_expression_box)
        field_filter_box.setLayout(field_filter_box_layout)
        layout.addWidget(field_filter_box)

        vis_box = QGroupBox('Visualization', self)
        vis_box_layout = QHBoxLayout(self)
        vis_box_layout.addWidget(QLabel('Plot line color', self))
        vis_box_layout.addWidget(self._select_color_button)
        vis_box.setLayout(vis_box_layout)
        layout.addWidget(vis_box)

        layout.addWidget(self._ok_button)

        self.setLayout(layout)
        self.setFixedHeight(layout.sizeHint().height())

        # Initialization
        self._update_data_type_list()
        self._on_type_changed()
예제 #21
0
class Multidialog(QDialog):
    def __init__(self, screen, title, form_set, buttons=None, button_pressed=lambda:None):
        if screen in window.screens:
            self.screen = screen
            super(Multidialog, self).__init__(window.screens[screen])
        else:
            self.screen = None

        self.form_set = form_set
        self.elements = {}
        self.title = title
        self.setWindowTitle(self.title)
        self.main_layout = QVBoxLayout()
        self.group_box = QGroupBox()
        self.first_launch = True
        layout = QFormLayout()
        for f in self.form_set:
            if not 'name' in f: continue
            else:
                self.elements[f['name']] = {k:f[k] for k in f}
                e, l = self.get_element(etype=f['type'],
                                        settings=f['settings'] if 'settings' in f else None,
                                        data=f['data'] if 'data' in f else None,
                                        label=f['label'] if 'label' in f else None)
                self.elements[f['name']]['object'], self.elements[f['name']]['label'] = e, l
                self.elements[f['name']]['callback'] = False
                if 'settings' in f: self.elements[f['name']]['settings'] = f['settings']

            layout.addRow(self.elements[f['name']]['label'], self.elements[f['name']]['object'])
        self.initialize_settings()
        if not buttons:
            self.button_box = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
            self.button_box.accepted.connect(self.accept)
            self.button_box.rejected.connect(self.reject)
        else:
            self.button_box = QDialogButtonBox(QDialogButtonBox.Reset | QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
            #this needs some work
            
        self.group_box.setLayout(layout)
        self.main_layout.addWidget(self.group_box)
        self.main_layout.addWidget(self.button_box)
        self.setLayout(self.main_layout)
        self.setFixedSize(self.main_layout.sizeHint())

    def get_element(self, etype, settings, data, label):
        widget = None
        label = QLabel(label)
        if etype.lower() == "input":
            le = QLineEdit()
            if data and isinstance(data, str): le.setText(data)
            if settings and 'mode' in settings:
                if settings["mode"] == "password": le.setEchoMode(QLineEdit.Password)
            widget = le
        elif etype.lower() == "dropdown":
            cb = QComboBox()
            cb.setFocusPolicy(Qt.StrongFocus)
            # bugged on enter activate; to-do
            # # QShortcut(QKeySequence(Qt.Key_Return), cb)
            # cb.enterPressed.activated.connect(lambda: cb.showPopup)
            if data:
                if isinstance(data, list): cb.addItems(data)
                elif isinstance(data, str): cb.addItem(data)
            widget = cb
        elif etype.lower() == "color":
            cb = ColorButton()
            if settings and 'pref' in settings:
                cb.pref = settings['pref']
                cb.color = prefs.get_pref(cb.pref)
            elif 'color' in settings:
                cb.color = settings['color']
            cb.updateColor(cb.color)
            widget = cb
        return widget, label

    def initialize_settings(self):
        for el in self.elements:
            e = self.elements[el]
            if 'settings' in e:
                settings = e['settings']
                if 'conditional_show' in settings:
                    if 'element' in settings['conditional_show']:
                        if settings['conditional_show']['element'] in self.elements:
                            ref_e = settings['conditional_show']['element']
                            if 'callback' in self.elements[ref_e] and not self.elements[ref_e]['callback']:
                                if 'object' in self.elements[ref_e] and isinstance(self.elements[ref_e]['object'], QComboBox):
                                    self.elements[ref_e]['object'].currentIndexChanged.connect(self.initialize_settings)
                                    self.elements[ref_e]['callback'] = True
                            if 'object' in self.elements[ref_e]:
                                if 'not_state' in settings['conditional_show']:
                                    sv = not (self.elements[ref_e]['object'].currentText() in settings['conditional_show']['not_state'])
                                    e['object'].setVisible(sv)
                                    e['label'].setVisible(sv)
                                elif 'state' in settings['conditional_show']:
                                    sv = (self.elements[ref_e]['object'].currentText() in settings['conditional_show']['state'])
                                    e['object'].setVisible(sv)
                                    e['label'].setVisible(sv)

    def refresh(self):
        for w in self.group_box.children():
            if isinstance(w, QLineEdit): w.setText("")
            elif isinstance(w, QComboBox):
                if w.count() > 0: w.setCurrentIndex(0)
예제 #22
0
    def __init__(self, tag_sources, profile=None, parent=None):
        super(TSProfileEdit, self).__init__(parent)
        self.setWindowTitle(translate('Profile Editor',
                                      'Edit Tag Source Config'))
        winsettings('ts_profile_edit', self)
        self.tag_sources = tag_sources

        layout = QVBoxLayout(self)
        self.setLayout(layout)

        self.fields = QLineEdit(self)
        layout.addLayout(
            create_buddy(translate('Defaults', 'Fields: '), self.fields))
        self.fields.setToolTip(translate('Profile Editor',
                                         '<p>Enter a comma-seperated list of fields to retrieve. '
                                         'Leave empty to retrieve all available fields/values. '

                                         '<br /><br />Eg. <b>artist, album, title</b> will '
                                         'only retrieve the artist, album and title fields of '
                                         'from the Tag Source. '

                                         '<br /><br />Start the list with '
                                         'the tilde (~) character to write all retrieved fields '
                                         ', but the ones listed. Eg the field list '
                                         '<b>~composer,__image</b> will write all fields but the '
                                         'composer and __image (aka cover art) fields.</p>'

                                         '<p>If a field has been retrieved in a previous '
                                         'Tag Source the values will be combined if they differ. '
                                         'Eg. If genre=<b>Rock</b> for the first tag source polled '
                                         'and genre=<b>Alternative</b> for the tag source '
                                         'polled second then the resulting field will have '
                                         'multiple-values ie. genre=<b>Rock\\\\Rap</b>'))

        self.replace_fields = QLineEdit(self)
        layout.addLayout(create_buddy(translate('Profile Editor',
                                                'Fields to replace: '), self.replace_fields))
        self.replace_fields.setToolTip(translate('Profile Editor',
                                                 'Enter a comma-separated lists of fields that\'ll replace any '
                                                 'retrieved from previously polled tag sources. '

                                                 '<br />Start the list with the tilde (~) character to replace all '
                                                 'but the fields you list. <br />'
                                                 '<b>NB: Fields listed here must also be listed in the '
                                                 'list of fields to retrieve.</b>'

                                                 '<br /><br />Eg. Assume you have two Tag Sources. '
                                                 'The first retrieves <b>artist=Freshlyground, '
                                                 'album=Nomvula, genre=Afro Pop</b>. The second source gets '
                                                 '<b>artist=Freshly Ground, album=Nomvula, '
                                                 'genre=Pop</b>. '
                                                 'For the second Tag Source, setting just <b>artist</b> as the '
                                                 'list of fields to replace will overwrite the artist '
                                                 'field retrieved from the first tag source. '
                                                 'The resulting retrieved fields/values as shown in puddletag will '
                                                 'then be <b>artist=Freshly Ground, album=Nomvula, '
                                                 'genre=Afro Pop\\\\Pop</b>.'))

        self.source = QComboBox()
        self.source.addItems([source.name for source in tag_sources])
        layout.addLayout(create_buddy(
            translate('Profile Editor', '&Source'), self.source))

        self.no_match = QComboBox()
        self.no_match.addItems(NO_MATCH_OPTIONS)
        layout.addLayout(create_buddy(translate('Profile Editor',
                                                '&If no results found: '), self.no_match))
        self.no_match.setToolTip(translate('Profile Editor',
                                           '<p><b>Continue</b>: The lookup for the current album will continue '
                                           'by checking the other tag sources if no matching results '
                                           'were found for this tag source.</p>'

                                           '<p><b>Stop:</b> The lookup for the current album will '
                                           'stop and any previously retrieved results will be used.</p>'))

        okcancel = OKCancel()
        okcancel.ok.connect(self._okClicked)
        okcancel.cancel.connect(self.close)
        layout.addLayout(okcancel)

        layout.addStretch()
        self.setMaximumHeight(layout.sizeHint().height())

        if profile:
            self.setProfile(profile)
예제 #23
0
class Window(QDialog):
    def setEnabledWidget(self, stat):
        self.process_button.setEnabled(stat)
        self.rule_button.setEnabled(stat)
        self.label_data_button.setEnabled(stat)
        self.select_dir_button.setEnabled(stat)
        self.delimiter_textbox.setEnabled(stat)
        self.extention_textbox.setEnabled(stat)
        self.output_button.setEnabled(stat)

    def start(self):
        self.setEnabledWidget(False)
        self.process_label.setText("Silahkan Tunggu")

    def please_done(self):
        self.setEnabledWidget(True)
        self.process_label.setText("Berhasil")
        self.myThread.terminate()

    def process(self):
        self.delimiter_string = self.delimiter_textbox.text()
        self.extention_string = self.extention_textbox.text()
        self.myThread = makeLabelThread(self.rule_string, self.label_string,
                                        self.dir_string, self.extention_string,
                                        self.delimiter_string,
                                        self.output_string)
        #self.connect(self.myThread, SIGNAL("started()"), self.start)
        #self.connect(self.myThread, SIGNAL("finished()"), self.done)
        self.myThread.started.connect(self.start)
        self.myThread.start()
        self.myThread.finished.connect(self.please_done)

    def openfilepartial(self, btn):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getOpenFileName(None,
                                                  "Open *.csv",
                                                  "",
                                                  "Image Files (*.csv)",
                                                  options=options)
        if btn == self.rule_button:
            self.rule_file.setText(fileName)
            self.rule_string = fileName
        elif btn == self.label_data_button:
            self.label_data_file.setText(fileName)
            self.label_string = fileName

    def selectfolderpartial(self, btn):
        pathfolder = QFileDialog.getExistingDirectory(self,
                                                      'Select a directory')
        if (btn == self.select_dir_button):
            self.select_file.setText(pathfolder)
            self.dir_string = pathfolder

    def saveFileDialog(self):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getSaveFileName(
            self,
            "Save as *.csv and *.npy",
            "",
            "All Files (*);;Text Files (*.txt)",
            options=options)
        self.output_file.setText(fileName)
        self.output_string = fileName

    def fontInit(self):
        self.fonth1 = QFont()
        self.fonth1.setPointSize(12)
        self.fonth1.setBold(True)

    def initMainLayout(self):
        # Title
        self.title = QLabel(
            'Converting Attribute Labels To Attribute Matrices')
        self.title.setObjectName("label_file")
        self.title.setAlignment(QtCore.Qt.AlignHCenter)
        self.title.setFont(self.fonth1)
        ################################################
        self.mainlayout = QVBoxLayout()
        self.setLayout(self.mainlayout)
        self.gridLayout = QGridLayout()
        self.mainlayout.addWidget(self.title)
        self.mainlayout.addLayout(self.gridLayout)

    def initLeftLayout(self):
        # button Search Rule
        self.rule_button = QPushButton('Search Rule')
        self.rule_button.setMinimumSize(QtCore.QSize(100, 30))
        self.rule_button.setMaximumSize(QtCore.QSize(100, 30))
        self.rule_button.setObjectName("pushButton")
        self.rule_button.clicked.connect(
            partial(self.openfilepartial, self.rule_button))
        ############################################
        # button Search label
        self.label_data_button = QPushButton('Search Label')
        self.label_data_button.setMinimumSize(QtCore.QSize(100, 30))
        self.label_data_button.setMaximumSize(QtCore.QSize(100, 30))
        self.label_data_button.setObjectName("pushButton")
        self.label_data_button.clicked.connect(
            partial(self.openfilepartial, self.label_data_button))
        ############################################
        # button Select Directory Image
        self.select_dir_button = QPushButton('Select Folder')
        self.select_dir_button.setMinimumSize(QtCore.QSize(100, 30))
        self.select_dir_button.setMaximumSize(QtCore.QSize(100, 30))
        self.select_dir_button.setObjectName("pushButton")
        self.select_dir_button.clicked.connect(
            partial(self.selectfolderpartial, self.select_dir_button))
        ############################################
        # Input delimiter
        self.delimiter_textbox = QLineEdit(self)
        self.delimiter_textbox.setMaximumWidth(100)
        self.delimiter_textbox.setFixedWidth(100)
        ############################################
        # Input ekstensi gambar
        self.extention_textbox = QLineEdit(self)
        self.extention_textbox.setMaximumWidth(100)
        self.extention_textbox.setFixedWidth(100)
        ############################################
        # button Output
        self.output_button = QPushButton('Output')
        self.output_button.setMinimumSize(QtCore.QSize(100, 30))
        self.output_button.setMaximumSize(QtCore.QSize(100, 30))
        self.output_button.setObjectName("pushButton")
        self.output_button.clicked.connect(self.saveFileDialog)
        ############################################
        # button Process
        self.process_button = QPushButton('Process')
        self.process_button.setMinimumSize(QtCore.QSize(100, 30))
        self.process_button.setMaximumSize(QtCore.QSize(100, 30))
        self.process_button.setObjectName("pushButton")
        self.process_button.clicked.connect(self.process)
        ############################################

        self.gridLayout.addWidget(self.rule_button, 1, 0)
        self.gridLayout.addWidget(self.label_data_button, 2, 0)
        self.gridLayout.addWidget(self.select_dir_button, 3, 0)
        self.gridLayout.addWidget(self.delimiter_textbox, 4, 0)
        self.gridLayout.addWidget(self.extention_textbox, 5, 0)
        self.gridLayout.addWidget(self.output_button, 6, 0)
        self.gridLayout.addWidget(self.process_button, 7, 0)

    def initRightLayout(self):
        # label Search Rule
        ############################################
        # label Search Rule
        plusHeight = 500
        self.rule_file = QLabel(
            'File csv yang berisi list atribut dataset PETA yang akan diubah ke dalam bentuk matriks'
        )
        self.rule_file.setObjectName("label_file")
        self.rule_file.setGeometry(
            QtCore.QRect(self.rule_file.x(),
                         self.rule_file.y() + plusHeight,
                         self.rule_file.width(), self.rule_file.height()))
        ############################################
        # label Search Label
        self.label_data_file = QLabel(
            'File label yang ada di setiap sub atribut peta yang telah diubah ke dalam bentuk matriks'
        )
        self.label_data_file.setObjectName("label_file")
        self.label_data_file.setGeometry(
            QtCore.QRect(self.label_data_file.x(),
                         self.label_data_file.y() + plusHeight,
                         self.label_data_file.width(),
                         self.label_data_file.width()))
        ############################################
        # label Search Rule
        self.title = QLabel(
            'converting attribute labels to attribute matrices')
        self.title.setObjectName("label_file")
        self.title.setGeometry(
            QtCore.QRect(self.title.x(), self.title.y(), self.title.width(),
                         self.title.height() + plusHeight))
        ############################################
        # label Select Folder
        self.select_file = QLabel('Pilih sub folder dari set data PETA')
        self.select_file.setObjectName("label_file")
        ############################################
        # label delimiter
        self.delimiter_file = QLabel('Inputkan pembatas file')
        self.delimiter_file.setObjectName("label_file")
        ############################################
        # label Ekstensi
        self.extention_file = QLabel('Inputkan ekstensi gambar')
        self.extention_file.setObjectName("label_file")
        ############################################
        # label Output
        self.output_file = QLabel('')
        self.output_file.setObjectName("label_file")
        ############################################
        # label Output
        self.process_label = QLabel('')
        self.process_label.setObjectName("label_file")
        ############################################

        self.gridLayout.addWidget(self.rule_file, 1, 1)
        self.gridLayout.addWidget(self.label_data_file, 2, 1)
        self.gridLayout.addWidget(self.select_file, 3, 1)
        self.gridLayout.addWidget(self.delimiter_file, 4, 1)
        self.gridLayout.addWidget(self.extention_file, 5, 1)
        self.gridLayout.addWidget(self.output_file, 6, 1)
        self.gridLayout.addWidget(self.process_label, 7, 1)

    def initGlobalVariable(self):
        self.rule_string = ''
        self.label_string = ''
        self.dir_string = ''
        self.delimiter_string = ''
        self.extention_string = ''
        self.output_string = ''

    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.fontInit()
        self.initMainLayout()
        self.initLeftLayout()
        self.initRightLayout()
        self.setFixedSize(self.mainlayout.sizeHint())
class myMblbplayout(QtWidgets.QWidget):
    def process(self):
        self.bin = self.bin_textbox.text()
        self.height = self.height_textbox.text()
        self.width = self.width_textbox.text()
        self.img_path = self.dir_label.text()
        print(self.bin)
        print(self.height)
        print(self.width)
        print(self.img_path)
        self.myThread = mblbpthread(self.height, self.width, self.bin,
                                    self.img_path, self.output_string)
        self.myThread.started.connect(self.start)
        self.myThread.start()
        self.myThread.finished.connect(self.please_done)

    def selectfolderpartial(self, btn):
        pathfolder = QFileDialog.getExistingDirectory(self,
                                                      'Select a directory')
        if (btn == self.select_dir_button):
            pathfolder = pathfolder + "/"
            self.dir_label.setText(pathfolder)
            self.dir_string = pathfolder
            self.dir_label.setFixedWidth(500)

    def saveFileDialog(self):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getSaveFileName(
            self,
            "Save as *.csv and *.npy",
            "",
            "All Files (*);;Text Files (*.txt)",
            options=options)
        self.output_label.setText(fileName)
        self.output_string = fileName

    def fontInit(self):
        self.fonth1 = QFont()
        self.fonth1.setPointSize(12)
        self.fonth1.setBold(True)

    def initMainLayout(self):
        # Title
        self.title = QLabel('Multi Block Local Binary Pattern')
        self.title.setObjectName("label_file")
        self.title.setAlignment(QtCore.Qt.AlignHCenter)
        self.title.setFont(self.fonth1)
        ################################################
        self.mainlayout = QVBoxLayout()
        self.mainlayout.setAlignment(QtCore.Qt.AlignTop)
        self.setLayout(self.mainlayout)
        self.secondLayout = QGridLayout()
        self.mainlayout.addWidget(self.title)
        self.mainlayout.addLayout(self.secondLayout)

    def initLayout(self):
        # label Height Rule
        self.height_label = QLabel('Tinggi deskriptor MB-LBP')
        ############################################
        # Input height operator mblbp
        self.height_textbox = QLineEdit(self)
        self.height_textbox.setMaximumWidth(100)
        self.height_textbox.setFixedWidth(100)
        reg_ex = QtCore.QRegExp("\d+")
        self.height_textbox.setText("0")
        input_validator = QtGui.QRegExpValidator(reg_ex, self.height_textbox)
        self.height_textbox.setValidator(input_validator)
        ############################################
        # label Width Rule
        self.width_label = QLabel('Lebar deksriptor MB-LBP')
        ############################################
        # Input width operator mblbp
        self.width_textbox = QLineEdit(self)
        self.width_textbox.setMaximumWidth(100)
        self.width_textbox.setFixedWidth(100)
        reg_ex = QtCore.QRegExp("\d+")
        self.width_textbox.setText("0")
        input_validator = QtGui.QRegExpValidator(reg_ex, self.width_textbox)
        self.width_textbox.setValidator(input_validator)
        ############################################
        # label Bin Rule
        self.bin_label = QLabel('Kuantisasi')
        ############################################
        # Input bin operator mblbp
        self.bin_textbox = QLineEdit(self)
        self.bin_textbox.setMaximumWidth(100)
        self.bin_textbox.setFixedWidth(100)
        reg_ex = QtCore.QRegExp("\d+")
        self.bin_textbox.setText("0")
        input_validator = QtGui.QRegExpValidator(reg_ex, self.bin_textbox)
        self.bin_textbox.setValidator(input_validator)
        ############################################
        self.secondLayout.addWidget(self.height_textbox, 1, 0)
        self.secondLayout.addWidget(self.height_label, 1, 1)
        self.secondLayout.addWidget(self.width_textbox, 2, 0)
        self.secondLayout.addWidget(self.width_label, 2, 1)
        self.secondLayout.addWidget(self.bin_textbox, 3, 0)
        self.secondLayout.addWidget(self.bin_label, 3, 1)
        ############################################
        # button Select Directory Image
        self.select_dir_button = QPushButton('Select Folder')
        self.select_dir_button.setMinimumSize(QtCore.QSize(100, 30))
        self.select_dir_button.setMaximumSize(QtCore.QSize(100, 30))
        self.select_dir_button.setObjectName("pushButton")
        self.select_dir_button.clicked.connect(
            partial(self.selectfolderpartial, self.select_dir_button))
        ############################################
        # label dir
        self.dir_label = QLabel('Folder yang berisi set data citra')
        ############################################
        # button Output
        self.output_button = QPushButton('Output')
        self.output_button.setMinimumSize(QtCore.QSize(100, 30))
        self.output_button.setMaximumSize(QtCore.QSize(100, 30))
        self.output_button.setObjectName("pushButton")
        self.output_button.clicked.connect(self.saveFileDialog)
        ############################################
        # label Output
        self.output_label = QLabel('')
        ############################################
        # button Process
        self.process_button = QPushButton('Process')
        self.process_button.setMinimumSize(QtCore.QSize(100, 30))
        self.process_button.setMaximumSize(QtCore.QSize(100, 30))
        self.process_button.setObjectName("pushButton")
        self.process_button.clicked.connect(self.process)
        ############################################
        # label Process
        self.process_label = QLabel('')
        ############################################
        self.secondLayout.addWidget(self.select_dir_button, 4, 0)
        self.secondLayout.addWidget(self.dir_label, 4, 1)
        self.secondLayout.addWidget(self.output_button, 5, 0)
        self.secondLayout.addWidget(self.output_label, 5, 1)
        self.secondLayout.addWidget(self.process_button, 6, 0)
        self.secondLayout.addWidget(self.process_label, 6, 1)

    def initGlobalVariable(self):
        self.height = ''
        self.width = ''
        self.bin = ''
        self.img_path = ''
        self.output_string = ''

    def setEnabledWidget(self, stat):
        self.height_textbox.setEnabled(stat)
        self.width_textbox.setEnabled(stat)
        self.bin_textbox.setEnabled(stat)
        self.select_dir_button.setEnabled(stat)
        self.output_button.setEnabled(stat)
        self.process_button.setEnabled(stat)

    def start(self):
        self.setEnabledWidget(False)
        self.process_label.setText("Silahkan Tunggu")

    def please_done(self):
        self.setEnabledWidget(True)
        self.process_label.setText("Berhasil")
        self.myThread.terminate()

    def __init__(self, parent=None):
        super(myMblbplayout, self).__init__(parent)
        self.fontInit()
        self.initMainLayout()
        self.initLayout()
        self.setMinimumSize(self.mainlayout.sizeHint())