示例#1
0
    def embedGroup(self):
        layout = QtWidgets.QVBoxLayout()

        row = QtWidgets.QHBoxLayout()
        row.addWidget(self.embedEnableButton)
        layout.addLayout(row)

        ret = QtWidgets.QGroupBox(mytr_("Embed translation"))
        ret.setLayout(layout)

        ss = settings.global_()
        ret.setEnabled(ss.isGameAgentEnabled())
        ss.gameAgentEnabledChanged.connect(ret.setEnabled)
        return ret
示例#2
0
  def _createMenu(self, q):
    self._menu = menu = QMenu(self._parentWidget)

    m = main.manager()

    menu.addAction(
      mytr_("Spring Board") + " (%s)" % tr_("Double Click")
    ).triggered.connect(m.showSpringBoard)
    menu.addAction(mytr_("Game Board")).triggered.connect(m.showGameBoard)
    menu.addAction(tr_("Preferences")).triggered.connect(m.showPreferences)
    menu.addAction(mytr_("Shared Dictionary")).triggered.connect(m.showTermView)
    menu.addAction(mytr_("Test Machine Translation")).triggered.connect(m.showMachineTranslationTester)
    menu.addAction(mytr_("Text Reader")).triggered.connect(m.showTextReader)

    menu.addSeparator()
    menu.addAction(mytr_("Sync with Running Game")).triggered.connect(m.openRunningGame)
    menu.addAction(mytr_("Game Wizard")).triggered.connect(m.showGameWizard)

    #menu.addSeparator()
    #self._gamePrefsAct = menu.addAction(mytr_("Text Settings"))
    #self._gamePrefsAct.triggered.connect(m.showTextSettings)

    #self._captureAct = menu.addAction(self.q.tr("Game Screenshot"))
    #self._captureAct.triggered.connect(gameman.manager().captureWindow)

    #self._backlogAct = menu.addAction(mytr_("Backlog"))
    #self._backlogAct.triggered.connect(m.showBacklog)

    #self._liveEditAct = menu.addAction(self.q.tr("Edit Subtitles Online "))
    #self._liveEditAct.triggered.connect(m.liveEdit)

    #menu.addSeparator()

    #self._onlineAct = menu.addAction("")
    #self._onlineAct.triggered.connect(netman.manager().updateOnline)

    #menu.addSeparator()
    #menu.addAction(self.q.tr("Growl!")).triggered.connect(growl.show)
    #menu.addAction(self.q.tr("Omajinai☆")).triggered.connect(m.showOmajinai)

    menu.addSeparator()
    menu.addAction(tr_("Check for updates")).triggered.connect(m.checkUpdate)
    menu.addAction(tr_("About")).triggered.connect(m.about)
    menu.addAction(tr_("Wiki")).triggered.connect(lambda: m.openWiki('VNR'))
    menu.addAction(tr_("Credits")).triggered.connect(m.showCredits)
    menu.addSeparator()
    menu.addAction(tr_("Restart")).triggered.connect(m.restart)
    menu.addAction(tr_("Quit")).triggered.connect(m.quit)

    q.setContextMenu(menu)
示例#3
0
  def _createUi(self, q):
    self.edit = QtWidgets.QLineEdit()
    skqss.class_(self.edit, 'normal')

    grid = QtWidgets.QGridLayout()
    r = 0
    self.updateCommentButton = QtWidgets.QRadioButton(mytr_("Update reason"))
    self.updateCommentButton.setChecked(True)
    self.commentButton = QtWidgets.QRadioButton(tr_("Comment"))
    g = QtWidgets.QButtonGroup(q)
    g.addButton(self.updateCommentButton)
    g.addButton(self.commentButton)
    grid.addWidget(create_label(tr_("Property")), r, 0)
    for i,b in enumerate(g.buttons()):
      grid.addWidget(b, r, i+1)

    r += 1
    self.appendButton = QtWidgets.QRadioButton(tr_("Append"))
    self.appendButton.setChecked(True)
    self.overwriteButton = QtWidgets.QRadioButton(tr_("Overwrite"))
    g = QtWidgets.QButtonGroup(q)
    g.addButton(self.appendButton)
    g.addButton(self.overwriteButton)
    grid.addWidget(create_label(tr_("Method")), r, 0)
    for i,b in enumerate(g.buttons()):
      grid.addWidget(b, r, i+1)

    layout = QtWidgets.QVBoxLayout()
    layout.addWidget(self.edit)

    optionGroup = QtWidgets.QGroupBox(tr_("Option"))
    optionGroup.setLayout(grid)
    layout.addWidget(optionGroup)

    buttonBox = QtWidgets.QDialogButtonBox(
        QtWidgets.QDialogButtonBox.Ok|
        QtWidgets.QDialogButtonBox.Cancel)
    layout.addWidget(buttonBox)
    buttonBox.accepted.connect(q.accept)
    buttonBox.rejected.connect(q.reject)

    okButton = buttonBox.button(buttonBox.Ok)
    okButton.setDefault(True)
    skqss.class_(okButton, 'btn btn-primary')
    #cancelButton = buttonBox.button(buttonBox.Cancel)

    q.setLayout(layout)
示例#4
0
  def _addText(self, _, data, signature, name):
    """
    @param  _  bytearray  raw data
    @param  data  bytearray rendered data
    @param  signature  long
    @param  name  str
    """
    if not self.wizard().profile().isTextHookAttached(): # FIXME: only texthook is supported
      return
    dprint("thread name = %s" % name)
    try:
      t = self._threads[signature]
    except KeyError:
      t = SelectThreadPage.Thread()
      t.signature = signature
      t.name = name
      self._threads[signature] = t

      if name == defs.HCODE_THREAD_NAME:
        n = mytr_("H-code")
      elif name in defs.CAONIMAGEBI_ENGINES:
        n = name + defs.CAONIMAGEBI_USERNAME
      elif name in defs.OK123_ENGINES:
        n = name + defs.OK123_USERNAME
      else:
        n = name
      text = "%s %x" % (n, signature)
      enc = config.guess_thread_encoding(name)
      if enc:
        text += " (%s)" % enc
      b = self._grid.addButton(text,
          tip=str(signature),
          value=signature)  # value MUST BE signature, which is used to get the current signature ID

      tt = defs.threadtype(name)
      b.setToolTip(i18n.threadtip(tt))
      b.setStyleSheet(SS_RADIOBUTTONS[tt])

    finally:
      t.data.append(data)

    if signature == self._currentSignature():
      self._refresh()
示例#5
0
  def refresh(self):
    """@reimp"""
    self.newPostButton.setVisible(bool(self.topicId))
    self.gameButton.setVisible(bool(self.subjectId))

    host = config.API_HOST # must be the same as rest.coffee for the same origin policy

    user = dataman.manager().user()

    w = self.webView
    w.setHtml(rc.haml_template('haml/reader/topicsview').render({
      'host': host,
      'locale': config.language2htmllocale(user.language),
      'title': mytr_("Messages"),
      'subjectId': self.subjectId,
      #'subjectType': self.subjectType,
      'topicId': self.topicId,
      'userName': user.name if not user.isGuest() else '',
      'userPassword': user.password,
      'rc': rc,
      'tr': tr_,
    }), host)
    self._injectBeans()
示例#6
0
  def setVisible(self, visible):
    """@reimp @public"""
    d = self.__d
    if visible:
      g = _gameprofile()
      icon = g.icon() if g else None
      if not icon or icon.isNull():
        icon = rc.icon('logo-reader')
      self.setWindowIcon(icon)

      title = "%s (%s)" % (
        mytr_("Text Settings"),
        my.tr("Engine: ITH"),
      )

      name = g.name() if g else None
      if name:
        title = "%s - %s" % (name, title)
      self.setWindowTitle(title)

    if visible:
      texthook.global_().hijackProcess()

    if visible != self.isVisible():
      if visible:
        d.clear()
        d.load()
        self.updateEnabled()
        skevents.runlater(self.updateSize)
      else:
        d.unload()

    texthook.global_().setWhitelistEnabled(not visible)

    d.setActive(visible)
    super(TextPrefsDialog, self).setVisible(visible)
示例#7
0
 def __init__(self, parent=None):
     super(TextSettingsHelpDialog, self).__init__(parent)
     self.setWindowTitle("%s - %s" % (tr_("Help"), mytr_("Text Settings")))
     self.setHtml(info.renderTextSettingsHelp())
     self.resize(500, 400)
     dprint("pass")
示例#8
0
 def __init__(self, parent=None):
   super(CommentInputDialog, self).__init__(parent)
   skqss.class_(self, 'texture')
   self.setWindowTitle(mytr_("Update reason"))
   #self.setWindowIcon(rc.icon('window-shortcuts'))
   self.__d = _CommentInputDialog(self)
示例#9
0
    def _createUi(self, q):
        layout = QtWidgets.QVBoxLayout()

        #tt = defs.threadtype(self.name)
        #ttip = i18n.threadtip(tt)

        #if self.name == defs.HCODE_THREAD_NAME:
        #  n = mytr_("H-code")
        #elif self.name in defs.CAONIMAGEBI_ENGINES:
        #  n = self.name + '<span style="color:red">%s</span>' % defs.CAONIMAGEBI_USERNAME
        #elif self.name in defs.OK123_ENGINES:
        #  n = self.name + '<span style="color:red">%s</span>' % defs.OK123_USERNAME
        #else:
        #  n = self.name

        title = """<span style="color:gray">%x</span>""" % self.signature
        #title = """%s <span style="color:gray">%x</span>""" % (n, self.signature)
        #enc = config.guess_thread_encoding(self.name)
        #if enc:
        #  title += """ <span style="color:#333">%s</span>""" % enc

        label = QtWidgets.QLabel(title)
        #label.setStyleSheet(SS_LABELS[tt])
        #label.setToolTip(ttip)

        # Must be consist with button rows
        self.buttonRow = skwidgets.SkButtonRow()

        b = self.buttonRow.addButton(
            mytr_("dialog"), tip=my.tr("This is main scenario"))  # scenario
        skqss.class_(b, 'btn btn-default btn-sm')
        b.toggled.connect(
            partial(
                lambda b, value: skqss.toggleclass(b, 'btn-primary', value),
                b))

        b = self.buttonRow.addButton(
            mytr_("name"), tip=my.tr("These are character names"))  # scenario
        skqss.class_(b, 'btn btn-default btn-sm')
        b.toggled.connect(
            partial(
                lambda b, value: skqss.toggleclass(b, 'btn-success', value),
                b))

        #b = self.buttonRow.addButton(tr_("other"),
        #    tip=my.tr("This is extra scenario"))   # other
        #skqss.class_(b, 'btn btn-default btn-sm')
        #b.toggled.connect(partial(lambda b, value:
        #    skqss.toggleclass(b, 'btn-info', value),
        #    b))

        #b = self.buttonRow.addButton(tr_("ignore"),
        #    tip=my.tr("Don't translate the text")) # ignored
        b = self.buttonRow.addButton(
            tr_("other"), tip=my.tr("This is extra scenario"))  # other
        skqss.class_(b, 'btn btn-default btn-sm')
        b.toggled.connect(
            partial(lambda b, value: skqss.toggleclass(b, 'btn-info', value),
                    b))
        self.buttonRow.setCurrentIndex(_TextThreadView.IGNORE_BUTTON_ROW)
        self.buttonRow.currentIndexChanged.connect(self._onSelectedRoleChanged)
        self.buttonRow.currentIndexChanged.connect(self.updateStyleSheet)

        self.textEdit = QtWidgets.QPlainTextEdit()
        #self.textEdit.setToolTip(mytr_("Game text"))
        #self.textEdit.setToolTip(ttip)
        self.textEdit.setReadOnly(True)
        self.textEdit.setMaximumHeight(TEXTEDIT_MAX_HEIGHT)
        self.textEdit.setMinimumWidth(TEXTEDIT_MIN_WIDTH)
        #self.textEdit.setStyleSheet(
        #    SS_TEXTEDIT_HOOK_IGNORED if self.name == defs.HCODE_THREAD_NAME else
        #    SS_TEXTEDIT_IGNORED)

        header = QtWidgets.QHBoxLayout()
        header.addWidget(self.buttonRow)
        header.addStretch()
        header.addWidget(label)
        layout.addLayout(header)
        layout.addWidget(self.textEdit)
        q.setLayout(layout)
示例#10
0
    def _createUi(self, q):
        layout = QtWidgets.QVBoxLayout()

        # Options
        grid = QtWidgets.QGridLayout()
        r = 0

        grid.addWidget(create_label("From"), r, 0)
        row = QtWidgets.QHBoxLayout()
        row.addWidget(self.sourceLanguageEdit)
        row.addWidget(
            self._createInfoLabel(
                my.tr("should always be Japanese for a Japanese game")))
        grid.addLayout(row, r, 1)
        r += 1

        grid.addWidget(create_label("To"), r, 0)
        row = QtWidgets.QHBoxLayout()
        row.addWidget(self.targetLanguageEdit)
        row.addWidget(
            self._createInfoLabel(my.tr("target language to translate to")))
        grid.addLayout(row, r, 1)
        r += 1
        r += 1

        grid.addWidget(create_label(tr_("Type")), r, 0)
        row = QtWidgets.QHBoxLayout()
        row.addWidget(self.typeEdit)
        row.addWidget(self.typeLabel)
        grid.addLayout(row, r, 1)
        r += 1

        grid.addWidget(create_label(tr_("Context")), r, 0)
        row = QtWidgets.QHBoxLayout()
        row.addWidget(self.contextEdit)
        row.addWidget(
            self._createInfoLabel(my.tr("only enable under selected context")))
        grid.addLayout(row, r, 1)
        r += 1

        grid.addWidget(create_label(tr_("Translator")), r, 0)
        row = QtWidgets.QHBoxLayout()
        row.addWidget(self.hostEdit)
        row.addWidget(
            self._createInfoLabel(
                my.tr("only enable for selected translator")))
        grid.addLayout(row, r, 1)
        r += 1

        grid.addWidget(create_label(tr_("Options")), r, 0)
        grid.addWidget(self.specialButton, r, 1)
        r += 1

        grid.addWidget(self.regexButton, r, 1)
        r += 1

        grid.addWidget(self.phraseButton, r, 1)
        r += 1

        grid.addWidget(self.icaseButton, r, 1)
        r += 1

        #grid.addWidget(self.syntaxButton, r, 1)
        #r += 1

        grid.addWidget(self.privateButton, r, 1)
        r += 1

        grid.addWidget(create_label(tr_("Pattern")), r, 0)
        row = QtWidgets.QHBoxLayout()
        row.addWidget(self.patternEdit)
        row.addWidget(self.patternTtsButton)
        grid.addLayout(row, r, 1)
        r += 1

        grid.addWidget(create_label(tr_("Kanji")), r, 0)
        grid.addWidget(self.kanjiEdit, r, 1)  # span for two rows
        r += 1

        grid.addWidget(create_label(tr_("Priority")), r, 0)
        row = QtWidgets.QHBoxLayout()
        row.addWidget(self.priorityEdit)
        row.addWidget(self.priorityLabel)
        grid.addLayout(row, r, 1)
        r += 1

        grid.addWidget(create_label(tr_("Translation")), r, 0)
        row = QtWidgets.QHBoxLayout()
        row.addWidget(self.textEdit)
        row.addWidget(self.textTtsButton)
        grid.addLayout(row, r, 1)
        r += 1

        grid.addWidget(create_label(mytr_("Yomigana")), r, 0)
        grid.addWidget(self.yomiEdit, r, 1)  # span for two rows
        r += 1

        grid.addWidget(create_label(mytr_("Ruby")), r, 0)
        grid.addWidget(self.rubyEdit, r, 1)  # span for two rows
        r += 1

        grid.addWidget(create_label(tr_("Role")), r, 0)
        grid.addWidget(self.roleEdit, r, 1)
        r += 1

        grid.addWidget(create_label(tr_("Comment")), r, 0)
        grid.addWidget(self.commentEdit, r, 1)
        r += 1

        layout.addLayout(grid)

        # Footer
        layout.addWidget(self.statusLabel)

        row = QtWidgets.QHBoxLayout()
        row.addStretch()
        row.addWidget(self.helpButton)
        row.addWidget(self.cancelButton)
        row.addWidget(self.saveButton)
        layout.addLayout(row)

        q.setLayout(layout)
示例#11
0
 def __init__(self, parent=None):
     super(GameFinder, self).__init__(parent=parent, readonly=True)
     self.setWindowTitle(mytr_("Game Finder"))
     self.setWindowIcon(rc.icon('window-gamefinder'))
示例#12
0
 def _createNameButton(self, index): # int -> QPushButton
   ret = QtWidgets.QPushButton(mytr_("Name"))
   skqss.class_(ret, "btn btn-primary")
   ret.setToolTip(my.tr("Add to Shared Dictionary"))
   ret.clicked.connect(partial(self._newName, index))
   return ret
示例#13
0
 def specialButton(self):
     ret = QtWidgets.QCheckBox(mytr_("Series-specific"))
     ret.setChecked(True)  # enable series-specific by default
     ret.toggled.connect(self._refreshStatus)
     return ret
示例#14
0
 def scoreEdits(self):
     return OrderedDict((
         ('overall', self._createScoreEdit(tr_("Score"))),
         ('ecchi', self._createScoreEdit(mytr_("Ecchi"))),
     ))
示例#15
0
 def __init__(self, parent=None):
   WINDOW_FLAGS = Qt.Dialog|Qt.WindowMinMaxButtonsHint
   super(TopicsView, self).__init__(parent, WINDOW_FLAGS)
   self.setWindowIcon(rc.icon('window-forum'))
   self.setWindowTitle(mytr_("Messages"))
   self.__d = _TopicsView(self)
示例#16
0
  def _createUi(self, q):
    layout = QtWidgets.QVBoxLayout()

    tt = defs.threadtype(self.name)
    ttip = i18n.threadtip(tt)

    if self.name == defs.NULL_THREAD_NAME:
      n = tr_("Not specified")
    elif self.name == defs.HCODE_THREAD_NAME:
      n = mytr_("H-code")
    elif self.name in defs.CAONIMAGEBI_ENGINES:
      n = self.name + '<span style="color:red">%s</span>' % defs.CAONIMAGEBI_USERNAME
    elif self.name in defs.OK123_ENGINES:
      n = self.name + '<span style="color:red">%s</span>' % defs.OK123_USERNAME
    #elif self.name.startswith('sce') or self.name in config.PSP_ALL_TEXT_THREADS:
    #  n = self.name + '<span style="color:gray">=0.9.x</span>' # no need to show
    elif self.name in config.PSP_099_TEXT_THREADS:
      n = self.name + '<span style="color:red">=0.9.9</span>'
    elif self.name in config.PSP_098_TEXT_THREADS:
      n = self.name + '<span style="color:purple">=0.9.8</span>'
    else:
      n = self.name
    if config.game_thread_embeddable(self.name):
      t = mytr_("embeddable")
      if self.name in config.EMBEDDED_EN_GAME_ENGINES:
        t += ', <span style="color:purple">%s</span>' % my.tr("English-only")
      n += ' <span style="color:darkgreen">(%s)</span>' % t
    title = '%s <span style="color:gray">%x</span>' % (n, self.signature)
    enc = config.guess_thread_encoding(self.name)
    if enc:
      title += ' <span style="color:#333">%s</span>' % enc
    elif self.name and self.name not in (defs.HCODE_THREAD_NAME, defs.NULL_THREAD_NAME) and 'PSP' not in self.name:
      title += '<br/><span style="color:red;font-weight:bold">(%s)</span>' % my.tr("Not supported, please update VNR")

    label = QtWidgets.QLabel(title)
    label.setStyleSheet(SS_LABELS[tt])
    label.setToolTip(ttip)

    # Must be consist with button rows
    self.buttonRow = skwidgets.SkButtonRow()

    b = self.buttonRow.addButton(mytr_("dialog"),
        tip=my.tr("This is main scenario"))   # scenario
    skqss.class_(b, 'btn btn-default btn-sm')
    b.toggled.connect(partial(lambda b, value:
        skqss.toggleclass(b, 'btn-primary', value),
        b))

    b = self.buttonRow.addButton(mytr_("name"),
        tip=my.tr("These are character names"))   # scenario
    skqss.class_(b, 'btn btn-default btn-sm')
    b.toggled.connect(partial(lambda b, value:
        skqss.toggleclass(b, 'btn-success', value),
        b))

    b = self.buttonRow.addButton(tr_("other"),
        tip=my.tr("This is extra scenario"))   # other
    skqss.class_(b, 'btn btn-default btn-sm')
    b.toggled.connect(partial(lambda b, value:
        skqss.toggleclass(b, 'btn-info', value),
        b))

    b = self.buttonRow.addButton(tr_("ignore"),
        tip=my.tr("Don't translate the text")) # ignored
    skqss.class_(b, 'btn btn-default btn-sm')
    b.toggled.connect(partial(lambda b, value:
        skqss.toggleclass(b, 'btn-danger', value),
        b))

    self.buttonRow.setCurrentIndex(_TextThreadView.IGNORE_BUTTON_ROW)
    self.buttonRow.currentIndexChanged.connect(self._emitThreadType)
    self.buttonRow.currentIndexChanged.connect(self.updateStyleSheet)

    self.textEdit = QtWidgets.QPlainTextEdit()
    #self.textEdit.setToolTip(mytr_("Game text"))
    self.textEdit.setToolTip(ttip)
    self.textEdit.setReadOnly(True)
    self.textEdit.setMaximumHeight(TEXTEDIT_MAX_HEIGHT)
    self.textEdit.setMinimumWidth(TEXTEDIT_MIN_WIDTH)
    self.textEdit.setStyleSheet(
        SS_TEXTEDIT_HOOK_IGNORED if self.name == defs.HCODE_THREAD_NAME else
        SS_TEXTEDIT_IGNORED)

    header = QtWidgets.QHBoxLayout()
    header.addWidget(self.buttonRow)
    header.addStretch()
    header.addWidget(label)
    layout.addLayout(header)
    layout.addWidget(self.textEdit)
    q.setLayout(layout)
示例#17
0
    def _createUi(self, q):
        self.userTab = _prefs.UserTab()
        self.textTab = _prefs.TextTab()
        self.ttsTab = _prefs.TtsTab()
        self.ocrTab = _prefs.OcrTab()
        #self.srTab = _prefs.SrTab()
        self.gameTab = _prefs.GameTab()
        self.shortcutsTab = _prefs.ShortcutsTab()
        self.uiTab = _prefs.UiTab()
        self.recordingsTab = _prefs.RecordingsTab()
        self.i18nTab = _prefs.I18nTab()
        self.engineTab = _prefs.EngineTab()
        self.internetTab = _prefs.InternetTab()
        self.featureTab = _prefs.FeatureTab()
        #self.pluginTab = _prefs.PluginTab()

        self.translationTab = _prefs.TranslationTab()
        self.machineTranslationTab = _prefs.MachineTranslationTab()
        self.dictionaryTranslationTab = _prefs.DictionaryTranslationTab()
        self.romanTranslationTab = _prefs.RomanTranslationTab()
        self.chineseTranslationTab = _prefs.ChineseTranslationTab()
        #self.translationScriptTab = _prefs.TranslationScriptTab()

        self.termTab = _prefs.TermTab()

        self.downloadsTab = _prefs.DownloadsTab()
        self.dictionaryDownloadsTab = _prefs.DictionaryDownloadsTab()
        self.launcherDownloadsTab = _prefs.LauncherDownloadsTab()
        self.fontDownloadsTab = _prefs.FontDownloadsTab()

        self.libraryTab = _prefs.LibraryTab()
        self.localeLibraryTab = _prefs.LocaleLibraryTab()
        self.translatorLibraryTab = _prefs.TranslatorLibraryTab()
        self.dictionaryLibraryTab = _prefs.DictionaryLibraryTab()
        self.ttsLibraryTab = _prefs.TtsLibraryTab()
        self.ocrLibraryTab = _prefs.OcrLibraryTab()

        #for t in self.itertabs():
        #  t.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
        #                  QtWidgets.QSizePolicy.Expanding)

        container = QtWidgets.QScrollArea()  # widget container
        container.setWidgetResizable(True)  # false by default
        container.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        container.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded)
        #container.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
        #container.setAlignment(Qt.AlignTop | Qt.AlignHCenter)

        self.controller = skmvc.SkWidgetTreeController(
            parent=q,
            container=container,
            data={
                'display':
                tr_("Preferences"),
                'children': [
                    {
                        'widget': self.userTab,
                        'user': self._indexWidget(self.userTab),
                        'decoration': rc.icon('pref-user'),
                        'display': tr_("Account"),
                        'toolTip': my.tr("User account"),
                    },
                    {
                        'widget': self.engineTab,
                        'user': self._indexWidget(self.engineTab),
                        #'display': u"%s (α)" % mytr_("Embedded"),
                        'display': mytr_("Embedded"),
                        'decoration': rc.icon('pref-config'),
                        'toolTip': my.tr("Embedded subtitles"),
                    },
                    {
                        'widget':
                        self.downloadsTab,
                        'user':
                        self._indexWidget(self.downloadsTab),
                        'decoration':
                        rc.icon('pref-download'),
                        'display':
                        tr_("Downloads"),
                        'toolTip':
                        my.tr("Download additional resources"),
                        'children': [
                            {
                                'widget':
                                self.launcherDownloadsTab,
                                'user':
                                self._indexWidget(self.launcherDownloadsTab),
                                'decoration':
                                rc.icon('pref-locale'),
                                'display':
                                tr_("Launch"),
                                'toolTip':
                                my.tr("Locale changers"),
                            },
                            {
                                'widget':
                                self.dictionaryDownloadsTab,
                                'user':
                                self._indexWidget(self.dictionaryDownloadsTab),
                                'decoration':
                                rc.icon('pref-dict'),
                                'display':
                                tr_("Dictionaries"),
                                'toolTip':
                                my.tr("Manage dictionaries"),
                            },
                            {
                                'widget': self.fontDownloadsTab,
                                'user':
                                self._indexWidget(self.fontDownloadsTab),
                                'decoration': rc.icon('pref-font'),
                                'display': tr_("Fonts"),
                                'toolTip': my.tr("Manage fonts"),
                            },
                        ]
                    },
                    {
                        'widget':
                        self.libraryTab,
                        'user':
                        self._indexWidget(self.libraryTab),
                        'decoration':
                        rc.icon('pref-library'),
                        'display':
                        tr_("Locations"),
                        'toolTip':
                        my.tr("Locations of external libraries"),
                        'children': [
                            {
                                'widget':
                                self.localeLibraryTab,
                                'user':
                                self._indexWidget(self.localeLibraryTab),
                                'decoration':
                                rc.icon('pref-locale'),
                                'display':
                                tr_("Launch"),
                                'toolTip':
                                my.tr("Locations of external locale changers"),
                            },
                            {
                                'widget':
                                self.translatorLibraryTab,
                                'user':
                                self._indexWidget(self.translatorLibraryTab),
                                'decoration':
                                rc.icon('pref-tr-path'),
                                'display':
                                tr_("Translators"),
                                'toolTip':
                                my.tr("Locations of external translators"),
                            },
                            {
                                'widget':
                                self.dictionaryLibraryTab,
                                'user':
                                self._indexWidget(self.dictionaryLibraryTab),
                                'decoration':
                                rc.icon('pref-dict'),
                                'display':
                                tr_("Dictionaries"),
                                'toolTip':
                                my.tr("Locations of external dictionary"),
                            },
                            {
                                'widget': self.ttsLibraryTab,
                                'user': self._indexWidget(self.ttsLibraryTab),
                                'decoration': rc.icon('pref-tts-path'),
                                'display': mytr_("TTS"),
                                'toolTip': my.tr("Locations of external TTS"),
                            },
                            {
                                'widget':
                                self.ocrLibraryTab,
                                'user':
                                self._indexWidget(self.ocrLibraryTab),
                                'decoration':
                                rc.icon('pref-ocr-path'),
                                'display':
                                mytr_("OCR"),
                                'toolTip':
                                my.tr("Locations of external OCR libraries"),
                            },
                        ]
                    },
                    {
                        'widget':
                        self.translationTab,
                        'user':
                        self._indexWidget(self.translationTab),
                        'decoration':
                        rc.icon('pref-tr'),
                        'display':
                        tr_("Translation"),
                        'toolTip':
                        my.tr("Machine translators"),
                        'children': [
                            {
                                'widget':
                                self.machineTranslationTab,
                                'user':
                                self._indexWidget(self.machineTranslationTab),
                                'decoration':
                                rc.icon('pref-tr-path'),
                                'display':
                                tr_("Translators"),
                                'toolTip':
                                my.tr("Preferred machine translators"),
                            },
                            {
                                'widget':
                                self.dictionaryTranslationTab,
                                'user':
                                self._indexWidget(
                                    self.dictionaryTranslationTab),
                                'decoration':
                                rc.icon('pref-dict'),
                                'display':
                                tr_("Dictionaries"),
                                'toolTip':
                                my.tr("Preferred look-up dictionaries"),
                            },
                            {
                                'widget':
                                self.romanTranslationTab,
                                'user':
                                self._indexWidget(self.romanTranslationTab),
                                'decoration':
                                rc.icon('pref-roman'),
                                'display':
                                mytr_("C/K Ruby"),
                                'toolTip':
                                my.
                                tr("Romanization of texts in Chinese and Korean"
                                   ),
                            },
                            {
                                'widget':
                                self.chineseTranslationTab,
                                'user':
                                self._indexWidget(self.chineseTranslationTab),
                                'decoration':
                                rc.icon('pref-zh'),
                                'display':
                                tr_("Chinese"),
                                'toolTip':
                                my.tr("Preferred Chinese variant"),
                            },
                            #{ 'widget': self.translationScriptTab,
                            #  'user': self._indexWidget(self.translationScriptTab),
                            #  'decoration': rc.icon('pref-script'),
                            #  'display': tr_("Scripts"),
                            #  'toolTip': my.tr("Translation replacement scripts"),
                            #},
                        ]
                    },
                    {
                        'widget': self.ttsTab,
                        'user': self._indexWidget(self.ttsTab),
                        'decoration': rc.icon('pref-tts'),
                        'display': mytr_("Text-To-Speech"),
                        'toolTip': mytr_("Text-To-Speech") + " (TTS)",
                    },
                    #{ 'widget': self.srTab,
                    #  'user': self._indexWidget(self.srTab),
                    #  'decoration': rc.icon('pref-sr'),
                    #  'display': u"%s (α)" % mytr_("ASR"),
                    #  'toolTip': mytr_("Automatic speech recognition") + " (ASR)",
                    #},
                    {
                        'widget':
                        self.ocrTab,
                        'user':
                        self._indexWidget(self.ocrTab),
                        'decoration':
                        rc.icon('pref-ocr'),
                        'display':
                        u"%s (α)" % mytr_("OCR"),
                        'toolTip':
                        mytr_("Optical character recognition") + " (OCR)",
                    },
                    {
                        'widget': self.textTab,
                        'user': self._indexWidget(self.textTab),
                        'display': tr_("Font"),
                        'decoration': rc.icon('pref-text'),
                        'toolTip': my.tr("Text rendering"),
                    },
                    {
                        'widget': self.gameTab,
                        'user': self._indexWidget(self.gameTab),
                        'decoration': rc.icon('pref-app'),
                        'display': tr_("Launch"),
                        'toolTip': my.tr("Game launch settings"),
                    },
                    {
                        'widget': self.shortcutsTab,
                        'user': self._indexWidget(self.shortcutsTab),
                        'decoration': rc.icon('pref-shortcuts'),
                        'display': mytr_("Shortcuts"),
                        'toolTip': my.tr("Mouse and keyboard shortcuts"),
                    },
                    {
                        'widget': self.recordingsTab,
                        'user': self._indexWidget(self.recordingsTab),
                        'decoration': rc.icon('pref-rec'),
                        'display': mytr_("Recordings"),
                        'toolTip': my.tr("Game recordings"),
                    },
                    {
                        'widget': self.uiTab,
                        'user': self._indexWidget(self.uiTab),
                        'decoration': rc.icon('pref-ui'),
                        'display': tr_("UI"),
                        'toolTip': my.tr("UI Theme"),
                    },
                    {
                        'widget': self.i18nTab,
                        'user': self._indexWidget(self.i18nTab),
                        'display': tr_("i18n"),
                        'decoration': rc.icon('pref-i18n'),
                        'toolTip': tr_("International"),
                    },
                    {
                        'widget': self.termTab,
                        'user': self._indexWidget(self.termTab),
                        'decoration': rc.icon('pref-share'),
                        'display': mytr_("Shared Dictionary"),
                        'toolTip': mytr_("Shared Dictionary"),
                    },
                    {
                        'widget': self.internetTab,
                        'user': self._indexWidget(self.internetTab),
                        'decoration': rc.icon('pref-internet'),
                        'display': tr_("Internet"),
                        'toolTip': my.tr("Internet options"),
                    },
                    {
                        'widget': self.featureTab,
                        'user': self._indexWidget(self.featureTab),
                        'decoration': rc.icon('pref-feature'),
                        'display': tr_("Features"),
                        'toolTip': my.tr("Application features"),
                    },
                ],
            })
        self.controller.treeView().setHeaderHidden(True)
        self.controller.treeView().expandAll()

        left = QtWidgets.QWidget()
        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.controller.treeView())
        row = QtWidgets.QHBoxLayout()
        row.addWidget(self.controller.filterEdit())
        row.addWidget(self.controller.countLabel())
        layout.addLayout(row)
        left.setLayout(layout)
        q.addWidget(left)

        skqss.class_(self.controller.treeView(), 'texture')

        right = self.controller.widgetView()
        #right.setSizePolicy(QtWidgets.QSizePolicy.Expanding,
        #                    QtWidgets.QSizePolicy.Expanding)
        q.addWidget(right)

        self.controller.currentIndexChanged.connect(self._refreshCurrentWidget)

        w = self.controller.filterEdit()
        w.setToolTip("%s (%s, %s, Ctrl+F)" %
                     (tr_("Search"), tr_("case-insensitive"),
                      tr_("regular expression")))
        shortcut('ctrl+f', w.setFocus, parent=q)
示例#18
0
  def _createUi(self, q):
    hookPrefsButton = QtWidgets.QPushButton(my.tr("Edit /H Hook Code"))
    skqss.class_(hookPrefsButton, 'btn btn-info')
    hookPrefsButton.setToolTip(my.tr("Modify the game-specific ITH hook code") + " (Alt+H)")
    hookPrefsButton.setStatusTip(hookPrefsButton.toolTip())
    hookPrefsButton.clicked.connect(self._showHookPrefs)

    helpButton = QtWidgets.QPushButton(tr_("Help"))
    helpButton.setToolTip(tr_("Help"))
    skqss.class_(helpButton, 'btn btn-success')
    helpButton.clicked.connect(lambda: self.helpDialog.show())

    wikiButton = QtWidgets.QPushButton(tr_("Wiki"))
    wikiButton.setToolTip(tr_("Wiki"))
    skqss.class_(wikiButton, 'btn btn-default')
    import main
    wikiButton.clicked.connect(lambda: main.manager().openWiki('VNR/Text Settings'))

    #cancelButton = QtWidgets.QPushButton(tr_("Cancel"))
    #cancelButton.clicked.connect(self.q.hide)

    threadArea = QtWidgets.QScrollArea()
    threadArea.setWidget(skwidgets.SkLayoutWidget(self.threadLayout))
    threadArea.setWidgetResizable(True)

    threadGroup = QtWidgets.QGroupBox()
    threadGroup.setTitle(mytr_("Text threads"))
    threadGroup.setLayout(skwidgets.SkWidgetLayout(threadArea))
    #threadGroup.setLayout(self.threadLayout)

    option = QtWidgets.QGroupBox(tr_("Options"))
    optionLayout = QtWidgets.QVBoxLayout()
    row = QtWidgets.QHBoxLayout()
    row.addWidget(QtWidgets.QLabel(mytr_("Game language")+ ":"))
    row.addWidget(self.languageEdit)
    row.addStretch()
    row.addWidget(QtWidgets.QLabel(tr_("Text encoding") + ":"))
    row.addWidget(self.encodingEdit)
    optionLayout.addLayout(row)
    optionLayout.addWidget(self.keepsThreadsButton)
    optionLayout.addWidget(self.removesRepeatButton)
    optionLayout.addWidget(self.ignoresRepeatButton)
    optionLayout.addWidget(self.keepsSpaceButton)
    option.setLayout(optionLayout)

    layout = QtWidgets.QVBoxLayout()
    row = QtWidgets.QHBoxLayout()
    row.addWidget(self.saveButton)
    row.addWidget(hookPrefsButton)
    row.addWidget(self.resetButton)
    row.addWidget(wikiButton)
    row.addWidget(helpButton)
    #row.addWidget(QtWidgets.QLabel(
    #  " <= " + my.tr("click help if you have questions")
    #))
    row.addStretch()
    layout.addLayout(row)

    row = QtWidgets.QHBoxLayout()
    row.addWidget(option)
    row.addStretch()
    layout.addLayout(row)

    layout.addWidget(threadGroup)

    #msg = QtWidgets.QLabel(my.tr("WARNING: PLEASE DO NOT TURN ON REPETITION FILTERS UNLESS THERE ARE REPETITIONS!"))
    msgLabel = QtWidgets.QLabel(my.tr("Don't forget to maximize the text speed (see Help)."))
    skqss.class_(msgLabel, "text-success")
    layout.addWidget(msgLabel)

    wikiLabel = QtWidgets.QLabel(my.tr('Please check this <a href="http://sakuradite.com/wiki/en/VNR/Game_Settings">Game Settings</a> wiki if there is no correct text.'))
    wikiLabel.setOpenExternalLinks(True)
    #skqss.class_(wikiLabel, "text-info")
    layout.addWidget(wikiLabel)

    #buttons = QtWidgets.QHBoxLayout()
    #buttons.addStretch()
    #buttons.addWidget(cancelButton)
    #buttons.addWidget(self.saveButton)
    #layout.addLayout(buttons)
    #layout.addWidget(introLabel)

    #layout.setContentsMargins(18, 18, 18, 9) # left, top, right, bottom
    #self.q.setCentralWidget(skwidgets.SkLayoutWidget(layout))

    q.setLayout(layout)

    skwidgets.shortcut('alt+h', self._showHookPrefs, parent=q)
示例#19
0
 def clear(self):
   if self.isVisible():
     self.setWindowIcon(QIcon())
     self.setWindowTitle(mytr_("Text Settings"))
   self.__d.clear()
示例#20
0
 def _createYomiButton(self, index): # int -> QPushButton
   ret = QtWidgets.QPushButton(mytr_("Yomi"))
   skqss.class_(ret, "btn btn-success")
   ret.setToolTip(my.tr("Add to Shared Dictionary"))
   ret.clicked.connect(partial(self._newYomi, index))
   return ret
示例#21
0
 def ttsButton(self):
     ret = QtWidgets.QPushButton(mytr_("TTS"))
     skqss.class_(ret, 'btn btn-default')
     ret.setToolTip(my.tr("Read the recognized text"))
     ret.clicked.connect(self._tts)
     return ret
示例#22
0
    def _createUi(self, q):
        #hookPrefsButton = QtWidgets.QPushButton(my.tr("Edit /H Hook Code"))
        #skqss.class_(hookPrefsButton, 'btn btn-info')
        #hookPrefsButton.setToolTip(my.tr("Modify the game-specific ITH hook code") + " (Alt+H)")
        #hookPrefsButton.setStatusTip(hookPrefsButton.toolTip())
        #hookPrefsButton.clicked.connect(self._showHookPrefs)

        helpButton = QtWidgets.QPushButton(tr_("Help"))
        helpButton.setToolTip(tr_("Help"))
        skqss.class_(helpButton, 'btn btn-success')
        helpButton.clicked.connect(lambda: self.helpDialog.show())

        #wikiButton = QtWidgets.QPushButton(tr_("Wiki"))
        #wikiButton.setToolTip(tr_("Wiki"))
        #skqss.class_(wikiButton, 'btn btn-default')
        #import main
        #wikiButton.clicked.connect(lambda: main.manager().openWiki('VNR/Text Settings'))

        #cancelButton = QtWidgets.QPushButton(tr_("Cancel"))
        #cancelButton.clicked.connect(self.q.hide)

        threadArea = QtWidgets.QScrollArea()
        threadArea.setWidget(skwidgets.SkLayoutWidget(self.threadLayout))
        threadArea.setWidgetResizable(True)

        threadGroup = QtWidgets.QGroupBox()
        threadGroup.setTitle(mytr_("Text threads"))
        threadGroup.setLayout(skwidgets.SkWidgetLayout(threadArea))
        #threadGroup.setLayout(self.threadLayout)

        info = QtWidgets.QGroupBox("%s (%s)" % (
            tr_("Information"),
            tr_("read-only"),
        ))
        infoLayout = QtWidgets.QVBoxLayout()
        row = QtWidgets.QHBoxLayout()
        row.addWidget(QtWidgets.QLabel(mytr_("Game engine") + ":"))
        row.addWidget(self.engineLabel)
        row.addStretch()
        infoLayout.addLayout(row)
        info.setLayout(infoLayout)

        option = QtWidgets.QGroupBox(tr_("Options"))
        optionLayout = QtWidgets.QVBoxLayout()
        row = QtWidgets.QHBoxLayout()
        row.addWidget(QtWidgets.QLabel(mytr_("Game language") + ":"))
        row.addWidget(self.languageEdit)
        row.addStretch()
        row.addWidget(QtWidgets.QLabel(tr_("Text encoding") + ":"))
        row.addWidget(self.encodingEdit)
        optionLayout.addLayout(row)
        option.setLayout(optionLayout)

        layout = QtWidgets.QVBoxLayout()
        row = QtWidgets.QHBoxLayout()
        if not READONLY:
            row.addWidget(self.saveButton)

        #row.addWidget(hookPrefsButton)
        row.addWidget(self.resetButton)
        #row.addWidget(wikiButton)
        if not READONLY:
            row.addWidget(helpButton)
        #row.addWidget(QtWidgets.QLabel(
        #  " <= " + my.tr("click help if you have questions")
        #))
        row.addStretch()
        layout.addLayout(row)

        col = QtWidgets.QVBoxLayout()
        col.addWidget(info)
        col.addWidget(option)
        row = QtWidgets.QHBoxLayout()
        row.addLayout(col)
        row.addStretch()
        layout.addLayout(row)

        layout.addWidget(threadGroup)

        msg = QtWidgets.QLabel(
            "%s: %s" % (tr_("Note"), my.tr("All settings are read-only.")))
        skqss.class_(msg, "text-error")
        layout.addWidget(msg)

        #buttons = QtWidgets.QHBoxLayout()
        #buttons.addStretch()
        #buttons.addWidget(cancelButton)
        #buttons.addWidget(self.saveButton)
        #layout.addLayout(buttons)
        #layout.addWidget(introLabel)

        #layout.setContentsMargins(18, 18, 18, 9) # left, top, right, bottom
        #self.q.setCentralWidget(skwidgets.SkLayoutWidget(layout))

        q.setLayout(layout)
示例#23
0
 def speakButton(self):
     ret = QtWidgets.QPushButton(mytr_("Speak"))
     ret.setToolTip(mytr_("Speak"))
     skqss.class_(ret, 'btn btn-inverse')
     ret.clicked.connect(self._speak)
     return ret
示例#24
0
 def _createYomiEdit(self):
   return self._createLabel('text-success', mytr_("Yomi"), NAME_EDIT_MIN_WIDTH)
示例#25
0
  if isinstance(type, str):
    return tr_(type)
  if isinstance(type, unicode):
    return utr_(type)
  return ''

def term_type_name(type):
  """
  @param  type  str
  @return  unicode
  """
  import dataman
  return dataman.Term.typeName(type)

TRANSLATOR_NAMES = { # [TranslatorTraits]
  'romaji': mytr_("Yomigana"),
  'bing': "Bing.com",
  'google': "Google.com",
  'lecol': mytr_("LEC Online"),
  'infoseek': "Infoseek.co.jp",
  'excite': "Excite.co.jp",
  'nifty': "@nifty.com",
  'systran': "SYSTRANet.com",
  'babylon': "Babylon.com",
  'transru': "Translate.Ru",
  'naver': "Naver.com",
  'baidu': mytr_("Baidu") + ".com",
  'youdao': mytr_("Youdao") + ".com",
  'jbeijing': mytr_("JBeijing"),
  'fastait': mytr_("FastAIT"),
  'dreye': "Dr.eye",
示例#26
0
 def contextSizeLabel(self):
   ret = QtWidgets.QLabel()
   ret.setToolTip(mytr_("Context count"))
   skqss.class_(ret, 'readonly')
   return ret
示例#27
0
 def replaceEdit(self):
     ret = QtWidgets.QLineEdit()
     skqss.class_(ret, 'normal')
     ret.setToolTip(mytr_("Replaced text"))
     ret.setPlaceholderText(ret.toolTip())
     return ret
示例#28
0
  def _createUi(self, q):
    layout = QtWidgets.QVBoxLayout()

    # User

    row = QtWidgets.QHBoxLayout()
    row.addWidget(create_label(tr_("Type")))
    row.addWidget(self.typeEdit)

    row.addWidget(create_label(tr_("Language")))
    row.addWidget(self.languageEdit)

    row.addStretch()

    #row.addWidget(create_label(tr_("User")))
    row.addWidget(self.userNameLabel)
    layout.addLayout(row)

    # Status
    row = QtWidgets.QHBoxLayout()
    row.addWidget(create_label(tr_("Status")))
    row.addWidget(self.enabledButton)
    row.addWidget(self.lockedButton)
    row.addStretch()

    #row.addWidget(create_label(tr_("Date")))
    row.addWidget(self.timestampLabel)
    layout.addLayout(row)

    # Context size
    row = QtWidgets.QHBoxLayout()
    row.addWidget(create_label(mytr_("Context count")))
    row.addWidget(self.contextSizeLabel)
    row.addStretch()
    layout.addLayout(row)

    layout.addWidget(self.textEdit)

    # Context
    layout.addWidget(QtWidgets.QLabel(
      tr_("Context") + " (%s):" % tr_("read-only")
    ))
    layout.addWidget(self.currentContextEdit)

    layout.addWidget(QtWidgets.QLabel(
      mytr_("Previous context") + " (%s):" % tr_("read-only")
    ))
    layout.addWidget(self.previousContextEdit)

    layout.addWidget(create_label(tr_("Comment") ))
    layout.addWidget(self.commentEdit)

    row = QtWidgets.QHBoxLayout()
    row.addWidget(create_label(tr_("Permission")))
    row.addWidget(self.textPermissionLabel)

    row.addWidget(create_label(tr_("Internet status")))
    row.addWidget(self.onlineLabel)

    row.addStretch()
    row.addWidget(self.deleteButton)
    row.addWidget(self.refreshButton)
    layout.addLayout(row)
    q.setLayout(layout)
示例#29
0
 def _loadName(self):
     name = self.game.name
     self.nameEdit.setText(name)
     title = "%s - %s" % (name, mytr_("Game Properties"))
     self.q.setWindowTitle(title)
示例#30
0
  def __init__(self, wiz):
    super(SelectThreadPage, self).__init__(wiz)
    self.setTitle(my.tr("Select the text thread"))
    self.setCommitPage(True)

    self._active = False

    wiz.visibleChanged.connect(self._setActive)
    wiz.visibleChanged.connect(self._clear)

    self._threads = {} # {long signature:TextThread}

    introLabel = QtWidgets.QLabel(my.tr(
      "Please play the game a little bit, and pick one text thread that has the same contents as the game text. If no text thread appears, please try editing the /H hook code for this game."
    ))
    introLabel.setWordWrap(True)

    # grid of thread sources
    self._grid = skwidgets.SkRadioButtonGrid(self, col=2)
    self._grid.currentIndexChanged.connect(self._refresh)
    self._grid.currentIndexChanged.connect(self.completeChanged)
    threadGroup = QtWidgets.QGroupBox()
    threadGroup.setLayout(self._grid.layout())
    threadGroup.setTitle(mytr_("Text threads"))

    self._encodingEdit = QtWidgets.QComboBox()
    self._encodingEdit.setEditable(False)
    self._encodingEdit.setToolTip(tr_("Text encoding"))
    self._encodingEdit.addItems(map(i18n.encoding_desc, config.ENCODINGS))
    self._encodingEdit.currentIndexChanged.connect(self._refresh)

    self._keepsSpaceButton = QtWidgets.QCheckBox(
        my.tr("Insert spaces between words") +
        " (%s: %s)" % (tr_("for example"), "Howareyou! => How are you!"))
    self._keepsSpaceButton.toggled.connect(texthook.global_().setKeepsSpace)

    self._removesRepeatButton = QtWidgets.QCheckBox(
        my.tr("Eliminate finite repetition in the text") +
        " (%s: %s)" % (tr_("for example"), "YYeess!!NoNo! => Yes!No!"))
    self._removesRepeatButton.toggled.connect(self._refresh)

    self._ignoresRepeatButton = QtWidgets.QCheckBox(
        my.tr("Ignore infinite cyclic repetition in the text") +
        " (%s: %s)" % (tr_("for example"), "YesYesYes... => Yes"))
    self._ignoresRepeatButton.toggled.connect(texthook.global_().setRemovesRepeat)

    clearButton = QtWidgets.QPushButton(tr_("Clear"))
    clearButton.clicked.connect(self._clear)
    skqss.class_(clearButton, 'btn btn-danger')

    hookPrefsButton = QtWidgets.QPushButton(my.tr("Edit /H Hook Code"))
    skqss.class_(hookPrefsButton, 'btn btn-info')
    hookPrefsButton.clicked.connect(lambda: self.hookPrefsDialog.show())

    helpButton = QtWidgets.QPushButton(tr_("Help"))
    skqss.class_(helpButton, 'btn btn-success')
    helpButton.clicked.connect(lambda: self.helpDialog.show())

    self._textEdit = QtWidgets.QPlainTextEdit()
    self._textEdit.setReadOnly(True)
    self._textEdit.setToolTip(mytr_("Game text"))
    self._textEdit.setPlainText(my.tr("No game text"))

    layout = QtWidgets.QVBoxLayout()
    layout.addWidget(introLabel)
    row = QtWidgets.QHBoxLayout()
    row.addWidget(self._encodingEdit)
    row.addWidget(clearButton)
    row.addStretch()

    row.addWidget(hookPrefsButton)
    row.addWidget(helpButton)
    layout.addLayout(row)
    layout.addWidget(self._removesRepeatButton)
    layout.addWidget(self._ignoresRepeatButton)
    layout.addWidget(self._keepsSpaceButton)
    layout.addWidget(threadGroup)
    layout.addWidget(self._textEdit)
    self.setLayout(layout)