277 lines
9.6 KiB
Python
277 lines
9.6 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
|
|
import collections
|
|
|
|
import consts
|
|
from __version__ import __author__, __title__
|
|
from qt5 import QtWidgets, QtCore
|
|
|
|
|
|
class SettingStrings(QtCore.QObject):
|
|
"""
|
|
Setting string for translation
|
|
"""
|
|
|
|
def __init__(self):
|
|
super().__init__()
|
|
|
|
self.KEYBOARD = self.tr("Keyboard settings")
|
|
self.MOVE_LEFT = self.tr("Move left")
|
|
self.MOVE_RIGHT = self.tr("Move right")
|
|
self.ROTATE_CLOCKWISE = self.tr("Rotate clockwise")
|
|
self.ROTATE_COUNTERCLOCKWISE = self.tr("Rotate counterclockwise")
|
|
self.SOFT_DROP = self.tr("Soft drop")
|
|
self.HARD_DROP = self.tr("Hard drop")
|
|
self.HOLD = self.tr("Hold")
|
|
self.PAUSE = self.tr("Pause")
|
|
self.OTHER = self.tr("Other settings")
|
|
|
|
self.DELAYS = self.tr("Delays")
|
|
self.AUTO_SHIFT_DELAY = self.tr("Auto-shift delay")
|
|
self.AUTO_REPEAT_RATE = self.tr("Auto-repeat rate")
|
|
|
|
self.SOUND = self.tr("Sound")
|
|
self.MUSIC_VOLUME = self.tr("Music volume")
|
|
self.SFX_VOLUME = self.tr("Effects volume")
|
|
|
|
self.GHOST = self.tr("Show ghost piece")
|
|
self.SHOW_NEXT_QUEUE = self.tr("Show next queue")
|
|
self.HOLD_ENABLED = self.tr("Hold enabled")
|
|
|
|
|
|
class KeyButton(QtWidgets.QPushButton):
|
|
""" Button widget capturing key name on focus """
|
|
|
|
names = {
|
|
value: name.replace("Key_", "")
|
|
for name, value in QtCore.Qt.__dict__.items()
|
|
if "Key_" in name
|
|
}
|
|
|
|
def __init__(self, *args):
|
|
super().__init__(*args)
|
|
|
|
def keyPressEvent(self, event):
|
|
key = event.key()
|
|
self.setText(self.names[key])
|
|
|
|
|
|
class SettingsGroup(QtWidgets.QGroupBox):
|
|
""" Group box of a type of settings """
|
|
|
|
def __init__(self, group, parent, cls):
|
|
super().__init__(group, parent)
|
|
layout = QtWidgets.QFormLayout(self)
|
|
self.widgets = {}
|
|
for setting, value in settings[group].items():
|
|
if cls == KeyButton:
|
|
widget = KeyButton(value)
|
|
elif cls == QtWidgets.QCheckBox:
|
|
widget = QtWidgets.QCheckBox(setting)
|
|
widget.setChecked(value)
|
|
elif cls == QtWidgets.QSpinBox:
|
|
widget = QtWidgets.QSpinBox()
|
|
widget.setRange(0, 1000)
|
|
widget.setValue(value)
|
|
widget.setSuffix(" ms")
|
|
elif cls == QtWidgets.QSlider:
|
|
widget = QtWidgets.QSlider(QtCore.Qt.Horizontal)
|
|
widget.setValue(value)
|
|
if cls == QtWidgets.QCheckBox:
|
|
layout.addRow(widget)
|
|
else:
|
|
layout.addRow(setting, widget)
|
|
self.widgets[setting] = widget
|
|
self.setLayout(layout)
|
|
|
|
|
|
class SettingsDialog(QtWidgets.QDialog):
|
|
""" Show settings dialog """
|
|
|
|
def __init__(self, parent):
|
|
super().__init__(parent)
|
|
self.setWindowTitle(self.tr("Settings"))
|
|
self.setModal(True)
|
|
|
|
layout = QtWidgets.QGridLayout()
|
|
|
|
self.groups = {}
|
|
self.groups[s.KEYBOARD] = SettingsGroup(s.KEYBOARD, self, KeyButton)
|
|
self.groups[s.DELAYS] = SettingsGroup(s.DELAYS, self, QtWidgets.QSpinBox)
|
|
self.groups[s.SOUND] = SettingsGroup(s.SOUND, self, QtWidgets.QSlider)
|
|
self.groups[s.OTHER] = SettingsGroup(s.OTHER, self, QtWidgets.QCheckBox)
|
|
|
|
layout.addWidget(self.groups[s.KEYBOARD], 0, 0, 3, 1)
|
|
layout.addWidget(self.groups[s.DELAYS], 0, 1)
|
|
layout.addWidget(self.groups[s.SOUND], 1, 1)
|
|
layout.addWidget(self.groups[s.OTHER], 2, 1)
|
|
|
|
buttons = QtWidgets.QDialogButtonBox(
|
|
QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel
|
|
)
|
|
buttons.accepted.connect(self.ok)
|
|
buttons.rejected.connect(self.close)
|
|
layout.addWidget(buttons, 3, 0, 1, 2)
|
|
|
|
self.setLayout(layout)
|
|
|
|
self.groups[s.SOUND].widgets[s.MUSIC_VOLUME].valueChanged.connect(
|
|
parent.frames.music.setVolume
|
|
)
|
|
self.groups[s.SOUND].widgets[s.MUSIC_VOLUME].sliderPressed.connect(
|
|
parent.frames.music.play)
|
|
self.groups[s.SOUND].widgets[s.MUSIC_VOLUME].sliderReleased.connect(
|
|
parent.frames.music.pause)
|
|
|
|
self.groups[s.SOUND].widgets[s.SFX_VOLUME].sliderReleased.connect(
|
|
parent.frames.stats.line_clear_sfx.play)
|
|
|
|
self.show()
|
|
|
|
def ok(self):
|
|
""" Save settings """
|
|
|
|
for group, elements in self.groups.items():
|
|
for setting, widget in elements.widgets.items():
|
|
if isinstance(widget, KeyButton):
|
|
value = widget.text()
|
|
elif isinstance(widget, QtWidgets.QCheckBox):
|
|
value = widget.isChecked()
|
|
elif isinstance(widget, QtWidgets.QSpinBox):
|
|
value = widget.value()
|
|
elif isinstance(widget, QtWidgets.QSlider):
|
|
value = widget.value()
|
|
settings[group][setting] = value
|
|
qsettings.setValue(group + "/" + setting, value)
|
|
self.close()
|
|
|
|
|
|
s = SettingStrings()
|
|
|
|
qsettings = QtCore.QSettings(__author__, __title__)
|
|
|
|
settings = collections.OrderedDict(
|
|
[
|
|
(
|
|
s.KEYBOARD,
|
|
collections.OrderedDict(
|
|
[
|
|
(
|
|
s.MOVE_LEFT,
|
|
qsettings.value(s.KEYBOARD + "/" + s.MOVE_LEFT, consts.DEFAULT_MOVE_LEFT_KEY),
|
|
),
|
|
(
|
|
s.MOVE_RIGHT,
|
|
qsettings.value(
|
|
s.KEYBOARD + "/" + s.MOVE_RIGHT, consts.DEFAULT_MOVE_RIGHT_KEY
|
|
),
|
|
),
|
|
(
|
|
s.ROTATE_CLOCKWISE,
|
|
qsettings.value(
|
|
s.KEYBOARD + "/" + s.ROTATE_CLOCKWISE, consts.DEFAULT_ROTATE_CLOCKWISE_KEY
|
|
),
|
|
),
|
|
(
|
|
s.ROTATE_COUNTERCLOCKWISE,
|
|
qsettings.value(
|
|
s.KEYBOARD + "/" + s.ROTATE_COUNTERCLOCKWISE,
|
|
consts.DEFAULT_ROTATE_COUNTERCLOCKWISE_KEY,
|
|
),
|
|
),
|
|
(
|
|
s.SOFT_DROP,
|
|
qsettings.value(s.KEYBOARD + "/" + s.SOFT_DROP, consts.DEFAULT_SOFT_DROP_KEY),
|
|
),
|
|
(
|
|
s.HARD_DROP,
|
|
qsettings.value(
|
|
s.KEYBOARD + "/" + s.HARD_DROP, consts.DEFAULT_HARD_DROP_KEY
|
|
),
|
|
),
|
|
(
|
|
s.HOLD,
|
|
qsettings.value(s.KEYBOARD + "/" + s.HOLD, consts.DEFAULT_HOLD_KEY),
|
|
),
|
|
(
|
|
s.PAUSE,
|
|
qsettings.value(s.KEYBOARD + "/" + s.PAUSE, consts.DEFAULT_PAUSE_KEY),
|
|
),
|
|
]
|
|
),
|
|
),
|
|
(
|
|
s.DELAYS,
|
|
collections.OrderedDict(
|
|
[
|
|
(
|
|
s.AUTO_SHIFT_DELAY,
|
|
int(
|
|
qsettings.value(
|
|
s.DELAYS + "/" + s.AUTO_SHIFT_DELAY, consts.DEFAULT_AUTO_SHIFT_DELAY
|
|
)
|
|
),
|
|
),
|
|
(
|
|
s.AUTO_REPEAT_RATE,
|
|
int(
|
|
qsettings.value(
|
|
s.DELAYS + "/" + s.AUTO_REPEAT_RATE, consts.DEFAULT_AUTO_REPEAT_RATE
|
|
)
|
|
),
|
|
),
|
|
]
|
|
),
|
|
),
|
|
(
|
|
s.SOUND,
|
|
collections.OrderedDict(
|
|
[
|
|
(
|
|
s.MUSIC_VOLUME,
|
|
int(
|
|
qsettings.value(s.SOUND + "/" + s.MUSIC_VOLUME, consts.DEFAUT_MUSIC_VOLUME)
|
|
),
|
|
),
|
|
(
|
|
s.SFX_VOLUME,
|
|
int(
|
|
qsettings.value(
|
|
s.SOUND + "/" + s.SFX_VOLUME, consts.DEFAULT_SFX_VOLUME
|
|
)
|
|
),
|
|
),
|
|
]
|
|
),
|
|
),
|
|
(
|
|
s.OTHER,
|
|
collections.OrderedDict(
|
|
[
|
|
(
|
|
s.GHOST,
|
|
bool(qsettings.value(s.OTHER + "/" + s.GHOST, consts.DEFAULT_SHOW_GHOST)),
|
|
),
|
|
(
|
|
s.SHOW_NEXT_QUEUE,
|
|
bool(
|
|
qsettings.value(
|
|
s.OTHER + "/" + s.SHOW_NEXT_QUEUE, consts.DEFAULT_SHOW_NEXT_QUEUE
|
|
)
|
|
),
|
|
),
|
|
(
|
|
s.HOLD_ENABLED,
|
|
bool(
|
|
qsettings.value(
|
|
s.OTHER + "/" + s.HOLD_ENABLED, consts.DEFAULT_HOLD_ENABLED
|
|
)
|
|
),
|
|
),
|
|
]
|
|
),
|
|
),
|
|
]
|
|
) |