def _setup(self): self.tabs = QTabWidget(self) general = QWidget(self.tabs) layout = QFormLayout() general.setLayout(layout) def make_spinbox(title, low, high, tab): widget = QSpinBox(tab) widget.setRange(low, high) widget.valueChanged.connect(self.edited) tab.layout().addRow(title, widget) return widget self.title = MandatoryField(_("Title"), QLineEdit(general)) self.title.add_to_form(layout) self.title.widget.editingFinished.connect(self.edited) self.depth = make_spinbox(_("Default depth (half-steps)"), 0, 20, general) self.start_depth = make_spinbox(_("Minimum depth"), 0, 20, general) self.max_combination_depth = make_spinbox(_("Forced mode depth"), 0, 24, general) self.dynamic_depth = make_spinbox(_("Static search mode threshold"), 0, 24, general) self.deeper_if_bad = QCheckBox(general) self.deeper_if_bad.stateChanged.connect(self.edited) layout.addRow(_("Think better if situation seem bad"), self.deeper_if_bad) self.moves_bound_low = make_spinbox(_("`Few moves' mode bound"), 1, 5, general) self.moves_bound_high = make_spinbox(_("`Too many moves' mode bound"), 5, 50, general) self.use_positional_score = QCheckBox(general) layout.addRow(_("Use positional score"), self.use_positional_score) self.use_positional_score.stateChanged.connect(self.edited) self.use_timeout = QCheckBox(general) layout.addRow(_("Continue thinking while there is time"), self.use_timeout) self.use_timeout.stateChanged.connect(self.edited) self.use_timeout.stateChanged.connect(self._on_use_timeout) self.timeout = make_spinbox(_("Timeout (seconds)"), 1, 120, general) self.timeout.setEnabled(False) self.random_opening_depth = make_spinbox(_("Random opening depth"), 1, 5, general) self.random_opening_depth.setToolTip( _("Number of first moves to be considered as opening; during these moves, AI will select it's move randomly from several best options" )) self.random_opening_options = make_spinbox(_("Random opening options"), 1, 5, general) self.random_opening_options.setToolTip( _("From how many best options to select during the opening")) self.tabs.addTab(general, _("General")) evaluator = QWidget(self.tabs) layout = QFormLayout() evaluator.setLayout(layout) self.mobility_weight = make_spinbox(_("Mobility"), 0, 100, evaluator) self.backyard_weight = make_spinbox(_("Back row"), -100, 100, evaluator) self.center_weight = make_spinbox(_("Center"), 0, 100, evaluator) self.opposite_side_weight = make_spinbox(_("Opposite side"), 0, 100, evaluator) self.backed_weight = make_spinbox(_("Backed"), 0, 100, evaluator) self.asymetry_weight = make_spinbox(_("Asymetry"), -100, 100, evaluator) self.pre_king_weight = make_spinbox(_("Pre-king"), 1, 100, evaluator) self.king_coef = make_spinbox(_("King"), 1, 100, evaluator) self.attacked_man_coef = make_spinbox(_("Attacked man"), 0, 200, evaluator) self.attacked_king_coef = make_spinbox(_("Attacked king"), 0, 200, evaluator) self.tabs.addTab(evaluator, _("Board evaluation")) extra = QWidget(self.tabs) layout = QVBoxLayout() extra.setLayout(layout) self.extra = QTextEdit(general) self.extra.textChanged.connect(self.edited) layout.addWidget(self.extra) self.tabs.addTab(extra, _("Extra options")) layout = QVBoxLayout() layout.addWidget(self.tabs) hbox = QHBoxLayout() save = QPushButton(_("Save..."), self) save.setIcon(QIcon.fromTheme("document-save")) save.setToolTip(_("Save AI settings to JSON file")) save.clicked.connect(self._on_save) hbox.addWidget(save) load = QPushButton(_("Load..."), self) load.setIcon(QIcon.fromTheme("document-open")) load.setToolTip(_("Load AI settings from JSON file")) load.clicked.connect(self._on_load) hbox.addWidget(load) layout.addLayout(hbox) self.setLayout(layout)