TETRIS2000/settings.py
2018-08-06 12:23:47 +02:00

277 lines
9.3 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
)
),
),
]
),
),
]
)