Esempio n. 1
0
 def searchButtonPressedBackspace(self, index):
     self.searchtimer.stop()
     if self.searchlastkey[0] == -2:
         if self.search_hangul.step == 0:
             self.search_hangul = Hangul()
             self.searchlastkey = [-1, 0]
         else:
             self.search_hangul.step -= 1
             self.search_hangul.searchlastkey = [-1, 0]
             if self.search_hangul.step <= 2:
                 self.search_hangul.jongsung2 = ''
             if self.search_hangul.step <= 1:
                 self.search_hangul.jongsung = ''
             if self.search_hangul.step <= 0:
                 self.search_hangul.jungsung = ''
             # if delete vowel and no leading consonant
             if self.search_hangul.step == 0 and not self.search_hangul.chosung:
                 self.searchlastkey = [-1, 0]
             self.searchtimer.start()
     elif self.searchlastkey[0] != -1:
         self.searchlastkey = [-1, 0, '']
     else:
         self.searchstring = self.searchstring[:-1]
     self.searchTextDisplay()
     self.callSearchCallback()
Esempio n. 2
0
 def searchButtonPressedTimeout(self):
     self.searchtimer.stop()
     if self.searchlastkey[0] != -1:
         self.searchstring = self.searchGetFinalString()
         self.searchlastkey = [-1, 0, '']
         self.search_hangul = Hangul()
         self.searchTextDisplay()
Esempio n. 3
0
    def startSearch(self, searchtype=0):
        """display the search bar

        searchtype:
            0=alphanumeric
            1=numbers only
        """
        self.insearch = True
        self.searchstring = ''
        self.searchtype = searchtype
        self.searchindex = 0
        self.search_hangul = Hangul()

        if len(self.search_keyboard[self.searchtype]) > 1:
            self.searchfunctionoption[3].show()
        else:
            self.searchfunctionoption[3].hide()

        self.displaySearchNumbers()
        self.searchbg.show()
        self.setSearchPos()
        self.setSearchTextSize()
        self.searchTextDisplay()
        self.callSearchCallback()
Esempio n. 4
0
    def searchKoreanNumber(self, index):
        self.searchlastkey = [-2, 0]
        if 0 <= index <= 2:  # Vowels
            if self.search_hangul.step == 2:
                self.searchstring += self.search_hangul.getHangul(1)
                self.search_hangul.chosung = self.search_hangul.jongsung
                self.search_hangul.jungsung = self.search_hangul.jongsung = self.search_hangul.jongsung2 = ""
            elif self.search_hangul.step == 3:
                self.searchstring += self.search_hangul.getHangul(2)
                self.search_hangul.chosung = self.search_hangul.jongsung2
                self.search_hangul.jungsung = self.search_hangul.jongsung = self.search_hangul.jongsung2 = ""

            beforedata = self.search_hangul.jungsung
            self.search_hangul.step = 1
            self.search_hangul.searchlastkey = [-1, 0]

            if index == 0:  # ㅣ ㅓ ㅕ ㅐ ㅔ ㅖ ㅒ ㅚ ㅟ ㅙ ㅝ ㅞ ㅢ
                if beforedata == "ㆍ": nowdata = "ㅓ"
                elif beforedata == ":": nowdata = "ㅕ"
                elif beforedata == "ㅏ": nowdata = "ㅐ"
                elif beforedata == "ㅑ": nowdata = "ㅒ"
                elif beforedata == "ㅓ": nowdata = "ㅔ"
                elif beforedata == "ㅕ": nowdata = "ㅖ"
                elif beforedata == "ㅗ": nowdata = "ㅚ"
                elif beforedata == "ㅜ": nowdata = "ㅟ"
                elif beforedata == "ㅠ": nowdata = "ㅝ"
                elif beforedata == "ㅘ": nowdata = "ㅙ"
                elif beforedata == "ㅝ": nowdata = "ㅞ"
                elif beforedata == "ㅡ": nowdata = "ㅢ"
                else:
                    nowdata = "ㅣ"
            elif index == 1:  # ㆍ : ㅏ ㅑ ㅜ ㅠ ㅘ
                if beforedata == "ㆍ": nowdata = ":"
                elif beforedata == ":": nowdata = "ㆍ"
                elif beforedata == "ㅣ": nowdata = "ㅏ"
                elif beforedata == "ㅏ": nowdata = "ㅑ"
                elif beforedata == "ㅡ": nowdata = "ㅜ"
                elif beforedata == "ㅜ": nowdata = "ㅠ"
                elif beforedata == "ㅚ": nowdata = "ㅘ"
                else:
                    nowdata = "ㆍ"
            elif index == 2:  # ㅡ ㅗ ㅛ
                if beforedata == "ㆍ": nowdata = "ㅗ"
                elif beforedata == ":": nowdata = "ㅛ"
                else:
                    nowdata = "ㅡ"

            self.search_hangul.jungsung = nowdata

        elif 3 <= index <= 9:  # Consonants
            if self.search_hangul.step == 1:
                if self.search_hangul.jungsung == "ㆍ" or self.search_hangul.jungsung == ":":
                    self.search_hangul = Hangul()
                else:
                    self.search_hangul.step = 2

            if index == self.search_hangul.searchlastkey[0]:
                self.search_hangul.searchlastkey[1] = (
                    self.search_hangul.searchlastkey[1] + 1) % len(
                        self.search_keyboard[self.searchtype][
                            self.searchindex][1][index])
            else:
                self.search_hangul.searchlastkey = [index, 0]
                if self.search_hangul.step == 2 and self.search_hangul.jongsung:
                    self.search_hangul.step = 3
                elif self.search_hangul.step == 3:
                    self.searchstring += self.search_hangul.getHangul()
                    self.search_hangul = Hangul()

            nowdata = self.search_keyboard[self.searchtype][self.searchindex][
                1][index][self.search_hangul.searchlastkey[1]]
            if self.search_hangul.step == 0:
                self.search_hangul.chosung = nowdata
            elif self.search_hangul.step == 2:
                self.search_hangul.jongsung = nowdata
            elif self.search_hangul.step == 3:
                self.search_hangul.jongsung2 = nowdata
Esempio n. 5
0
class SelectorWindow(CommonWindow):
    """Selector window"""

    statustext = ''
    timer = QTimer()

    def __init__(self):
        super().__init__()
        self.setWindowTitle("Selector")

        self.globalfont = QFont()
        self.fontcolor = settings.config['font.color']
        self.fontstylesheet = 'color: ' + self.fontcolor + ';'
        self.nosingerimage = QPixmap(settings.themeDir + 'default_singer.jpg')

        self.timer.timeout.connect(self.setOldStatusText)

        self.createLayout()

        geo = list(map(int, settings.config['selector.window'].split(',')))
        if settings.config.getboolean('selector.frameless'):
            self.setWindowFlag(Qt.FramelessWindowHint)
        self.move(geo[0], geo[1])
        self.show()
        self.resize(geo[2], geo[3])
        if settings.config.getboolean('selector.fullscreen'):
            self.setWindowState(Qt.WindowFullScreen)

    def createLayout(self):
        # background image
        self.bglabel = QLabel()
        self.bglabel.setScaledContents(True)
        self.bglabel.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
        self.bglabel.setPixmap(QPixmap(settings.themeDir + 'selector.jpg'))
        self.bglayout = setZeroMargins(QHBoxLayout(self))
        self.bglayout.addWidget(self.bglabel)

        # create the vertical frame
        self.vlayout = setZeroMargins(QVBoxLayout(self.bglabel))

        # create the header toolbar
        self.headerlayout = setZeroMargins(QHBoxLayout())
        self.headeroption = []

        self.homeoption = QLabelButton()
        self.homeoption.clicked.connect(screen.startHomeScreen)
        self.homeoption.setScaledContents(True)
        self.homeoption.setPixmap(
            QPixmap(settings.themeDir + 'buttons/home.png'))
        self.headeroption.append(self.homeoption)
        self.backoption = QLabelButton()
        self.backoption.setScaledContents(True)
        self.backoption.setPixmap(
            QPixmap(settings.themeDir + 'buttons/arrow-left.png'))
        self.headeroption.append(self.backoption)

        self.switchchannel = QLabelButton()
        self.switchchannel.clicked.connect(playlist.switchChannel)
        self.switchchannel.setScaledContents(True)
        self.switchchannel.setPixmap(
            QPixmap(settings.themeDir + 'buttons/music.png'))
        self.headeroption.append(self.switchchannel)
        self.playnextsong = QLabelButton()
        self.playnextsong.clicked.connect(playlist.playNextSong)
        self.playnextsong.setScaledContents(True)
        self.playnextsong.setPixmap(
            QPixmap(settings.themeDir + 'buttons/step-forward.png'))
        self.headeroption.append(self.playnextsong)
        self.pitchup = QLabelButton()
        self.pitchup.clicked.connect(playlist.setPitchUp)
        self.pitchup.setText('♭')
        self.headeroption.append(self.pitchup)
        self.pitchflat = QLabelButton()
        self.pitchflat.clicked.connect(playlist.setPitchFlat)
        self.pitchflat.setText('♮')
        self.headeroption.append(self.pitchflat)
        self.pitchdown = QLabelButton()
        self.pitchdown.clicked.connect(playlist.setPitchDown)
        self.pitchdown.setText('♯')
        self.headeroption.append(self.pitchdown)

        for opt in self.headeroption:
            opt.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
            opt.setAlignment(Qt.AlignCenter)
            opt.setStyleSheet(
                'color: white; font-weight: 800; border-radius: 3px; background-color: rgba(120, 120, 120, 40);'
            )

        self.headerlayout.addStretch(2)
        self.headerlayout.addWidget(self.homeoption, 4)
        self.headerlayout.addStretch(2)
        self.headerlayout.addWidget(self.backoption, 4)
        self.headerlayout.addStretch(100)
        self.headerlayout.addWidget(self.playnextsong, 4)
        self.headerlayout.addStretch(2)
        self.headerlayout.addWidget(self.switchchannel, 4)
        self.headerlayout.addStretch(5)
        self.headerlayout.addWidget(self.pitchup, 4)
        self.headerlayout.addStretch(2)
        self.headerlayout.addWidget(self.pitchflat, 4)
        self.headerlayout.addStretch(2)
        self.headerlayout.addWidget(self.pitchdown, 4)
        self.headerlayout.addStretch(2)

        # create the function buttons
        self.functionlayout = setZeroMargins(QHBoxLayout())
        self.functionoption = []
        self.functionlayout.addStretch(30)
        for i in range(4):
            self.functionoption.append(QLabelListButton())
            self.functionoption[i].setSizePolicy(QSizePolicy.Ignored,
                                                 QSizePolicy.Ignored)
            self.functionoption[i].setLabelText('F' + str(i + 1))
            self.functionoption[i].index = "F" + str(i + 1)
            self.functionlayout.addWidget(self.functionoption[i], 100)
            self.functionlayout.addStretch(20)
        self.functionlayout.addStretch(10)

        # create the content area, with 2 stacks
        self.contentoption = [[], []]
        self.contentlayout = []
        self.stackedlayout = QStackedLayout()
        for i in range(2):
            self.stackedlayout.addWidget(QLabel())

        # create 1st page of content (10 options vertically align)
        self.vcontentlayout1 = setZeroMargins(
            QHBoxLayout(self.stackedlayout.widget(0)))
        self.contentlayout.append(setZeroMargins(QVBoxLayout()))
        for i in range(10):
            btn = QLabelListButton()
            self.contentoption[0].append(btn)
            btn.setLabelText(str((i + 1) % 10))
            btn.index = i
            self.contentlayout[0].addWidget(btn)
        self.vcontentlayout1.addStretch(1)
        self.vcontentlayout1.addLayout(self.contentlayout[0], 10)
        self.vcontentlayout1.addStretch(1)

        # create 2nd page of content (10 image options in 5x2)
        self.vcontentlayout2 = setZeroMargins(
            QHBoxLayout(self.stackedlayout.widget(1)))
        self.contentlayout.append(
            setZeroMargins(QGridLayout(self.stackedlayout.widget(1))))
        for i in range(10):
            btn = QLabeImageButton()
            self.contentoption[1].append(btn)
            btn.setLabelText(str((i + 1) % 10))
            btn.index = i
            self.contentlayout[1].addWidget(btn, i / 5, i % 5)
        self.vcontentlayout2.addStretch(1)
        self.vcontentlayout2.addLayout(self.contentlayout[1], 15)
        self.vcontentlayout2.addStretch(1)

        self.stackedlayout.setCurrentIndex(1)

        # create footer
        self.footerlayout = setZeroMargins(QHBoxLayout())

        self.pageroption = QLabel()
        self.pageroption.setSizePolicy(QSizePolicy.Ignored,
                                       QSizePolicy.Ignored)
        self.pageroption.setStyleSheet(self.fontstylesheet)
        self.pageroption.setAlignment(Qt.AlignCenter)

        #pageup/pagedown
        self.footeroption = [QLabelButton(), QLabelButton()]
        for opt in self.footeroption:
            opt.setSizePolicy(QSizePolicy.Ignored, QSizePolicy.Ignored)
            opt.setAlignment(Qt.AlignCenter)
            opt.setStyleSheet(self.fontstylesheet)

        self.footerlayout.addStretch(50)
        self.footerlayout.addWidget(self.footeroption[0], 10)
        self.footerlayout.addStretch(10)
        self.footerlayout.addWidget(self.pageroption, 20)
        self.footerlayout.addStretch(10)
        self.footerlayout.addWidget(self.footeroption[1], 10)
        self.footerlayout.addStretch(50)

        # status bar
        self.statusframe = QMarquee()
        self.statusframe.setFontColor(self.fontcolor)

        # add contents to vlayout
        self.vlayout.addStretch(3)
        self.vlayout.addLayout(self.headerlayout, 12)
        self.vlayout.addStretch(10)
        self.vlayout.addLayout(self.functionlayout, 15)
        self.vlayout.addStretch(5)
        self.vlayout.addLayout(self.stackedlayout, 200)
        self.vlayout.addStretch(5)
        self.vlayout.addLayout(self.footerlayout, 15)
        self.vlayout.addStretch(10)
        self.vlayout.addWidget(self.statusframe, 20)

        # done
        self.createSearchLayout()

    def setTextSize(self):
        """resize text size to label height"""
        self.globalfont.setPixelSize(self.headeroption[0].size().height())
        for option in self.headeroption:
            option.setFont(self.globalfont)
        self.globalfont.setPixelSize(self.functionoption[0].size().height() *
                                     0.7)
        for option in self.functionoption:
            option.setFont(self.globalfont)
        self.contentlayout[0].setSpacing(self.size().height() * 0.01)
        self.contentlayout[1].setSpacing(self.size().height() * 0.03)
        self.globalfont.setPixelSize(self.contentoption[0][0].size().height() *
                                     0.4)
        for option in self.contentoption[0]:
            option.setFont(self.globalfont)
        self.globalfont.setPixelSize(self.pageroption.size().height() * 0.7)
        self.pageroption.setFont(self.globalfont)
        for option in self.footeroption:
            option.setFont(self.globalfont)
        self.statusframe.setPixelSize(self.statusframe.size().height() * 0.7)

        if self.searchbg.isVisible():
            self.setSearchTextSize()

    """
    search functions
    """

    insearch = False
    numstylesheet = '<span style="color:#999999">'
    search_display = {
        0:
        [[
            'EN',
            ('1', 'ABC2', 'DEF3', 'GHI4', 'JKL5', 'MNO6', 'PQRS7', 'TUV8',
             'WXYZ9', '0')
        ],
         [
             'JP',
             (numstylesheet + '1:</span> あ', numstylesheet + '2:</span> か',
              numstylesheet + '3:</span> さ', numstylesheet + '4:</span> た',
              numstylesheet + '5:</span> な', numstylesheet + '6:</span> は',
              numstylesheet + '7:</span> ま', numstylesheet + '8:</span> や',
              numstylesheet + '9:</span> ら', numstylesheet + '0:</span> わ')
         ],
         [
             'KR',
             (numstylesheet + '1:</span> ㅣ', numstylesheet + '2:</span> ㆍ',
              numstylesheet + '3:</span> ㅡ', numstylesheet + '4:</span> ㄱㅋ',
              numstylesheet + '5:</span> ㄴㄹ', numstylesheet + '6:</span> ㄷㅌ',
              numstylesheet + '7:</span> ㅂㅍ', numstylesheet + '8:</span> ㅅㅎ',
              numstylesheet + '9:</span> ㅈㅊ', numstylesheet + '0:</span> ㅇㅁ')
         ]],
        1: [['NUM', ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')]]
    }
    search_keyboard = {
        0:
        [[
            'EN',
            ('1', 'ABC2', 'DEF3', 'GHI4', 'JKL5', 'MNO6', 'PQRS7', 'TUV8',
             'WXYZ9', '0')
        ],
         [
             'JP',
             ('あいうえおぁぃぅぇぉ', 'かきくけこ', 'さしすせそ', 'たちつてとっ', 'なにぬねの', 'はひふへほ',
              'まみむめも', 'やゆよゃゅょ', 'らりるれろ', 'わゐゑを')
         ],
         ['KR', ('', '', '', 'ㄱㅋㄲ', 'ㄴㄹ', 'ㄷㅌㄸ', 'ㅂㅍㅃ', 'ㅅㅎㅆ', 'ㅈㅊㅉ', 'ㅇㅁ')]],
        1: [['NUM', ('1', '2', '3', '4', '5', '6', '7', '8', '9', '0')]]
    }
    searchtype = 0
    searchindex = 0
    searchlastkey = [-1, 0]
    searchstring = ''
    searchthreshold = 2
    searchtimer = QTimer()
    searchcallback = None
    search_hangul = Hangul()

    def createSearchLayout(self):
        fontstylesheet = self.fontstylesheet
        btnstylesheet='color: white; border-radius: 5px;' + \
            'background-color: qradialgradient(spread:pad, cx:0.272, cy:0.354515, radius:0.848, fx:0.071, fy:0.199045, stop:0 rgba(130, 130, 130, 255), stop:0.2 rgba(101, 101, 101, 255), stop:1 rgba(27, 27, 27, 170));' + \
            'border: 1px solid #858585;border-right: 1px solid #414141;border-bottom: solid 3px #414141;'

        self.searchbg = QLabel(self)
        self.searchbg.setCursor(Qt.WaitCursor)

        self.searchbglayout = setZeroMargins(QGridLayout(self.searchbg))
        self.searchframe = QLabel()
        self.searchframe.setScaledContents(True)
        self.searchframe.setSizePolicy(QSizePolicy.Ignored,
                                       QSizePolicy.Ignored)
        self.searchimage = QPixmap(settings.themeDir + "search.jpg")
        self.searchframe.setCursor(Qt.ArrowCursor)
        self.searchframe.setPixmap(self.searchimage)
        self.searchbglayout.addWidget(QWidget(), 0, 1)
        self.searchbglayout.addWidget(QWidget(), 1, 0)
        self.searchbglayout.addWidget(QWidget(), 2, 1)
        self.searchbglayout.addWidget(QWidget(), 3, 0)
        self.searchbglayout.addWidget(self.searchframe, 1, 1)
        self.searchbglayout.setColumnStretch(0, 70)
        self.searchbglayout.setColumnStretch(1, 40)
        self.searchbglayout.setColumnStretch(2, 1)
        self.searchbglayout.setRowStretch(0, 3)
        self.searchbglayout.setRowStretch(1, 4)
        self.searchbglayout.setRowStretch(2, 1)

        self.searchlayout = QGridLayout(self.searchframe)
        self.searchlayout.setSpacing(10)

        # title
        self.searchtitle = QLabel()
        self.searchtitle.setSizePolicy(QSizePolicy.Ignored,
                                       QSizePolicy.Ignored)
        self.searchtitle.setStyleSheet(fontstylesheet + ';font:bold;')
        self.searchtitle.setText(_("Search character:"))
        self.searchlayout.addWidget(self.searchtitle, 0, 0, 1, 2)

        # F1 to F4
        f_text = (_('F1: Ok'), _('F2: Del'), _('F3: Cancel'), _('F4: 🌐'))
        self.searchfunctionoption = []
        #create a filler "F4"
        for i in range(4):
            self.searchfunctionoption.append(QLabelButton())
            self.searchfunctionoption[i].setSizePolicy(QSizePolicy.Ignored,
                                                       QSizePolicy.Ignored)
            self.searchfunctionoption[i].setText(f_text[i])
            self.searchfunctionoption[i].setStyleSheet(btnstylesheet)
            self.searchfunctionoption[i].setAlignment(Qt.AlignCenter)
            self.searchfunctionoption[i].index = "F" + str(i + 1)
            self.searchfunctionoption[i].clicked.connect(
                self.searchButtonPressedFunction)
        for i in range(3):
            self.searchlayout.addWidget(self.searchfunctionoption[i], 1, i)
        self.searchlayout.addWidget(self.searchfunctionoption[3], 0, 2)

        # display text
        self.searchlabel = QLabel()
        self.searchlabel.setSizePolicy(QSizePolicy.Ignored,
                                       QSizePolicy.Ignored)
        self.searchlabel.setStyleSheet(
            fontstylesheet + "; padding: 0 10%; border: 1px solid blue;")
        self.searchlabel.setStyleSheet(
            self.fontstylesheet +
            'border: 3px solid black; border-radius: 5px; background-color: qlineargradient(spread:pad, x1:0, x2:1, stop:0 rgba(0, 0, 0, 200), stop:1 rgba(120, 120, 120, 100));padding: 0px 10%;'
        )
        self.searchlayout.addWidget(self.searchlabel, 2, 0, 1, 3)

        # 0 -9
        self.searchcontentoption = []
        for i in range(10):
            self.searchcontentoption.append(QLabelButton())
            self.searchcontentoption[i].setSizePolicy(QSizePolicy.Ignored,
                                                      QSizePolicy.Ignored)
            self.searchcontentoption[i].setStyleSheet(btnstylesheet)
            self.searchcontentoption[i].setAlignment(Qt.AlignCenter)
            self.searchcontentoption[i].index = i
            self.searchcontentoption[i].clicked.connect(
                self.searchButtonPressedNumber)
        for i in range(9):
            self.searchlayout.addWidget(self.searchcontentoption[i], 3 + i / 3,
                                        i % 3)
        self.searchlayout.addWidget(self.searchcontentoption[9], 6, 1)

        # backspace
        self.searchbackspaceoption = QLabelButton()
        self.searchbackspaceoption.setSizePolicy(QSizePolicy.Ignored,
                                                 QSizePolicy.Ignored)
        self.searchbackspaceoption.setStyleSheet(btnstylesheet)
        self.searchbackspaceoption.setAlignment(Qt.AlignCenter)
        self.searchbackspaceoption.setText("🡄")
        self.searchbackspaceoption.clicked.connect(
            self.searchButtonPressedBackspace)
        # self.searchlayout.addWidget(self.searchbackspaceoption, 6, 0)

        # enter
        self.searchenteroption = QLabelButton()
        self.searchenteroption.setSizePolicy(QSizePolicy.Ignored,
                                             QSizePolicy.Ignored)
        self.searchenteroption.setStyleSheet(btnstylesheet)
        self.searchenteroption.setAlignment(Qt.AlignCenter)
        self.searchenteroption.setText("[Enter]")
        self.searchenteroption.clicked.connect(self.searchButtonPressedEnter)
        # self.searchlayout.addWidget(self.searchenteroption, 6, 2)

        self.searchbg.hide()

        self.searchtimer.setSingleShot(True)
        self.searchtimer.setInterval(self.searchthreshold * 1000)
        self.searchtimer.timeout.connect(self.searchButtonPressedTimeout)

    def setSearchTextSize(self):
        self.globalfont.setPixelSize(
            self.searchfunctionoption[0].size().height() * 0.7)
        for option in self.searchfunctionoption:
            option.setFont(self.globalfont)
        self.globalfont.setPixelSize(
            self.searchcontentoption[0].size().height() * 0.7)
        for option in self.searchcontentoption:
            option.setFont(self.globalfont)
        self.searchbackspaceoption.setFont(self.globalfont)
        self.searchenteroption.setFont(self.globalfont)
        self.globalfont.setPixelSize(self.searchtitle.size().height() * 0.9)
        self.searchtitle.setFont(self.globalfont)
        self.globalfont.setPixelSize(self.searchlabel.size().height() * 0.7)
        self.searchlabel.setFont(self.globalfont)

    def setSearchPos(self):
        if self.searchbg.isVisible():
            self.searchbg.setFixedSize(self.width(), self.height())

    def displaySearchNumbers(self):
        for i in range(10):
            self.searchcontentoption[i].setText(
                self.search_display[self.searchtype][self.searchindex][1][i])

    def startSearch(self, searchtype=0):
        """display the search bar

        searchtype:
            0=alphanumeric
            1=numbers only
        """
        self.insearch = True
        self.searchstring = ''
        self.searchtype = searchtype
        self.searchindex = 0
        self.search_hangul = Hangul()

        if len(self.search_keyboard[self.searchtype]) > 1:
            self.searchfunctionoption[3].show()
        else:
            self.searchfunctionoption[3].hide()

        self.displaySearchNumbers()
        self.searchbg.show()
        self.setSearchPos()
        self.setSearchTextSize()
        self.searchTextDisplay()
        self.callSearchCallback()

    def stopSearch(self):
        self.insearch = False
        self.searchbg.hide()

    def searchGetFinalString(self):
        searchstring = self.searchstring
        if self.searchlastkey[0] == -2:
            searchstring += self.search_hangul.getHangul()
        elif 0 <= self.searchlastkey[0] < 10:
            searchstring += self.search_keyboard[self.searchtype][
                self.searchindex][1][self.searchlastkey[0]][
                    self.searchlastkey[1]]
        return searchstring

    def setSearchCallback(self, callback):
        self.searchcallback = callback

    def callSearchCallback(self):
        if callable(self.searchcallback):
            self.searchcallback(self.searchGetFinalString())

    def searchTextDisplay(self):
        searchstring = ' '.join(self.searchGetFinalString())
        if self.searchlastkey[0] != -1:
            searchstring = searchstring[:
                                        -1] + '<font color="cyan">' + searchstring[
                                            -1] + '</font>'
        self.searchlabel.setText(searchstring)

    @pyqtSlot(object)
    def searchKeyPressedAlpha(self, char):
        #A to Z only
        if 65 <= ord(char[0]) <= 90:
            self.searchButtonPressedTimeout()
            self.searchstring += char[0]
            self.searchTextDisplay()
            self.callSearchCallback()

    def searchKoreanNumber(self, index):
        self.searchlastkey = [-2, 0]
        if 0 <= index <= 2:  # Vowels
            if self.search_hangul.step == 2:
                self.searchstring += self.search_hangul.getHangul(1)
                self.search_hangul.chosung = self.search_hangul.jongsung
                self.search_hangul.jungsung = self.search_hangul.jongsung = self.search_hangul.jongsung2 = ""
            elif self.search_hangul.step == 3:
                self.searchstring += self.search_hangul.getHangul(2)
                self.search_hangul.chosung = self.search_hangul.jongsung2
                self.search_hangul.jungsung = self.search_hangul.jongsung = self.search_hangul.jongsung2 = ""

            beforedata = self.search_hangul.jungsung
            self.search_hangul.step = 1
            self.search_hangul.searchlastkey = [-1, 0]

            if index == 0:  # ㅣ ㅓ ㅕ ㅐ ㅔ ㅖ ㅒ ㅚ ㅟ ㅙ ㅝ ㅞ ㅢ
                if beforedata == "ㆍ": nowdata = "ㅓ"
                elif beforedata == ":": nowdata = "ㅕ"
                elif beforedata == "ㅏ": nowdata = "ㅐ"
                elif beforedata == "ㅑ": nowdata = "ㅒ"
                elif beforedata == "ㅓ": nowdata = "ㅔ"
                elif beforedata == "ㅕ": nowdata = "ㅖ"
                elif beforedata == "ㅗ": nowdata = "ㅚ"
                elif beforedata == "ㅜ": nowdata = "ㅟ"
                elif beforedata == "ㅠ": nowdata = "ㅝ"
                elif beforedata == "ㅘ": nowdata = "ㅙ"
                elif beforedata == "ㅝ": nowdata = "ㅞ"
                elif beforedata == "ㅡ": nowdata = "ㅢ"
                else:
                    nowdata = "ㅣ"
            elif index == 1:  # ㆍ : ㅏ ㅑ ㅜ ㅠ ㅘ
                if beforedata == "ㆍ": nowdata = ":"
                elif beforedata == ":": nowdata = "ㆍ"
                elif beforedata == "ㅣ": nowdata = "ㅏ"
                elif beforedata == "ㅏ": nowdata = "ㅑ"
                elif beforedata == "ㅡ": nowdata = "ㅜ"
                elif beforedata == "ㅜ": nowdata = "ㅠ"
                elif beforedata == "ㅚ": nowdata = "ㅘ"
                else:
                    nowdata = "ㆍ"
            elif index == 2:  # ㅡ ㅗ ㅛ
                if beforedata == "ㆍ": nowdata = "ㅗ"
                elif beforedata == ":": nowdata = "ㅛ"
                else:
                    nowdata = "ㅡ"

            self.search_hangul.jungsung = nowdata

        elif 3 <= index <= 9:  # Consonants
            if self.search_hangul.step == 1:
                if self.search_hangul.jungsung == "ㆍ" or self.search_hangul.jungsung == ":":
                    self.search_hangul = Hangul()
                else:
                    self.search_hangul.step = 2

            if index == self.search_hangul.searchlastkey[0]:
                self.search_hangul.searchlastkey[1] = (
                    self.search_hangul.searchlastkey[1] + 1) % len(
                        self.search_keyboard[self.searchtype][
                            self.searchindex][1][index])
            else:
                self.search_hangul.searchlastkey = [index, 0]
                if self.search_hangul.step == 2 and self.search_hangul.jongsung:
                    self.search_hangul.step = 3
                elif self.search_hangul.step == 3:
                    self.searchstring += self.search_hangul.getHangul()
                    self.search_hangul = Hangul()

            nowdata = self.search_keyboard[self.searchtype][self.searchindex][
                1][index][self.search_hangul.searchlastkey[1]]
            if self.search_hangul.step == 0:
                self.search_hangul.chosung = nowdata
            elif self.search_hangul.step == 2:
                self.search_hangul.jongsung = nowdata
            elif self.search_hangul.step == 3:
                self.search_hangul.jongsung2 = nowdata

    def searchFindFromKeyboard(self, index):
        if 0 <= index < 10:
            if len(self.search_keyboard[self.searchtype][self.searchindex][1]
                   [index]) == 1:
                self.searchstring += str(self.search_keyboard[self.searchtype][
                    self.searchindex][1][index])
            else:
                if index == self.searchlastkey[0]:
                    self.searchlastkey[1] = (self.searchlastkey[1] + 1) % len(
                        self.search_keyboard[self.searchtype][
                            self.searchindex][1][index])
                else:
                    if self.searchlastkey[0] != -1:
                        self.searchstring = self.searchGetJoinString()
                    self.searchlastkey = [index, 0, '']

    @pyqtSlot(object)
    def searchButtonPressedNumber(self, index):
        try:
            self.searchtimer.stop()
            if self.search_keyboard[self.searchtype][
                    self.searchindex][0] == 'KR':
                self.searchKoreanNumber(index)
            else:
                self.searchFindFromKeyboard(index)
            self.searchtimer.start()
        except:
            settings.logger.printException()
        self.searchTextDisplay()
        self.callSearchCallback()

    @pyqtSlot()
    def searchButtonPressedTimeout(self):
        self.searchtimer.stop()
        if self.searchlastkey[0] != -1:
            self.searchstring = self.searchGetFinalString()
            self.searchlastkey = [-1, 0, '']
            self.search_hangul = Hangul()
            self.searchTextDisplay()

    @pyqtSlot(object)
    def searchButtonPressedFunction(self, index):
        if index == 'F1':
            self.searchenteroption.click()
        elif index == 'F2':
            self.searchbackspaceoption.click()
        elif index == 'F3':
            self.searchstring = ''
            self.searchlastkey = [-1, 0, '']
            self.searchenteroption.click()
        elif index == 'F4':
            self.searchButtonPressedTimeout()
            self.searchindex = (self.searchindex + 1) % len(
                self.search_keyboard[self.searchtype])
            self.displaySearchNumbers()

    @pyqtSlot(object)
    def searchButtonPressedBackspace(self, index):
        self.searchtimer.stop()
        if self.searchlastkey[0] == -2:
            if self.search_hangul.step == 0:
                self.search_hangul = Hangul()
                self.searchlastkey = [-1, 0]
            else:
                self.search_hangul.step -= 1
                self.search_hangul.searchlastkey = [-1, 0]
                if self.search_hangul.step <= 2:
                    self.search_hangul.jongsung2 = ''
                if self.search_hangul.step <= 1:
                    self.search_hangul.jongsung = ''
                if self.search_hangul.step <= 0:
                    self.search_hangul.jungsung = ''
                # if delete vowel and no leading consonant
                if self.search_hangul.step == 0 and not self.search_hangul.chosung:
                    self.searchlastkey = [-1, 0]
                self.searchtimer.start()
        elif self.searchlastkey[0] != -1:
            self.searchlastkey = [-1, 0, '']
        else:
            self.searchstring = self.searchstring[:-1]
        self.searchTextDisplay()
        self.callSearchCallback()

    @pyqtSlot(object)
    def searchButtonPressedEnter(self, index):
        self.searchButtonPressedTimeout()
        self.stopSearch()
        self.callSearchCallback()

    def resizeEvent(self, QResizeEvent):
        super().resizeEvent(QResizeEvent)
        self.setSearchPos()
        self.setTextSize()

    def gotoPage(self, u_int):
        self.stackedlayout.setCurrentIndex(u_int)
        self.setTextSize()

    def setHeaders(self, options):
        for i, option in enumerate(self.functionoption):
            try:
                option.clicked.disconnect()
            except:
                pass
            if i in options.keys():
                try:
                    option.setText(options[i]['text'])
                    if callable(options[i]['func']):
                        option.clicked.connect(options[i]['func'])
                except:
                    settings.logger.printException()
            else:
                option.setText('')

    def setFooters(self, options):
        for i, option in enumerate(self.footeroption):
            try:
                option.clicked.disconnect()
            except:
                pass
            if i in options.keys():
                try:
                    option.setText(options[i]['text'])
                    if callable(options[i]['func']):
                        option.clicked.connect(options[i]['func'])
                except:
                    settings.logger.printException()
            else:
                option.setText('')
        if 'pagertext' in options.keys():
            self.pageroption.setText(options['pagertext'])
        else:
            self.pageroption.setText('')

    def setContents(self, screenNum, options):
        if 0 <= screenNum <= 1:
            self.gotoPage(screenNum)
            for i, option in enumerate(self.contentoption[screenNum]):
                try:
                    option.clicked.disconnect()
                except:
                    pass
                if i in options.keys():
                    try:
                        option.setText(options[i]['text'])
                        if callable(options[i]['func']):
                            option.clicked.connect(options[i]['func'])
                            option.connect = options[i]['func']
                        altimage = self.nosingerimage if type(
                            option) == QLabeImageButton else None
                        try:
                            option.setImage(options[i]['image'], altimage)
                        except:
                            option.setPixmap(altimage)
                    except:
                        settings.logger.printException()
                else:
                    option.setText('')
                    if callable(option.clearPixmap):
                        option.clearPixmap()

    def setBackCallback(self, backcallback):
        try:
            self.backoption.clicked.disconnect()
        except:
            pass
        try:
            if callable(backcallback):
                self.backoption.clicked.connect(backcallback)
        except:
            settings.logger.printException()

    def setStatusText(self, p_str):
        self.statustext = p_str
        if not self.timer.isActive():
            self.statusframe.setText(p_str)

    def setStatusTempText(self, p_str, msec):
        if self.timer.isActive():
            self.timer.stop()
        self.timer.setSingleShot(True)
        self.timer.start(msec)

        self.statusframe.setText(p_str)
        self.statusframe.x = 0
        self.statusframe.paused = True
        self.statusframe.repaint()

    @pyqtSlot()
    def setOldStatusText(self):
        self.statusframe.setText(self.statustext)
        self.statusframe.paused = False