import logging from arcaea_offline.database import Database from arcaea_offline.models import Chart from arcaea_offline.utils.rating import rating_class_to_text from PySide6.QtCore import Signal, Slot from PySide6.QtWidgets import QWidget from ui.designer.components.chartSelector_ui import Ui_ChartSelector from ui.extends.shared.database import databaseUpdateSignals from ui.extends.shared.language import LanguageChangeEventFilter from ui.implements.components.songIdSelector import SongIdSelectorMode logger = logging.getLogger(__name__) class ChartSelector(Ui_ChartSelector, QWidget): valueChanged = Signal() def __init__(self, parent=None): super().__init__(parent) self.db = Database() self.setupUi(self) self.languageChangeEventFilter = LanguageChangeEventFilter(self) self.installEventFilter(self.languageChangeEventFilter) self.valueChanged.connect(self.updateResultLabel) self.songIdSelector.valueChanged.connect(self.updateRatingClassEnabled) self.songIdSelector.quickSearchActivated.connect( self.__songIdSelectedQuickSearchActivated ) self.songIdSelector.valueChanged.connect(self.valueChanged) self.ratingClassSelector.valueChanged.connect(self.valueChanged) # handle `songIdSelector.updateDatabase` by this component databaseUpdateSignals.songAddOrDelete.disconnect( self.songIdSelector.updateDatabase ) databaseUpdateSignals.songAddOrDelete.connect(self.updateDatabase) databaseUpdateSignals.chartInfoUpdated.connect(self.updateResultLabel) def setSongIdSelectorMode(self, mode: SongIdSelectorMode): self.songIdSelector.setMode(mode) def value(self): songId = self.songIdSelector.songId() ratingClass = self.ratingClassSelector.value() if songId and isinstance(ratingClass, int): result = self.db.get_chart(songId, ratingClass) if result is None and self.songIdSelector.mode == SongIdSelectorMode.SongId: return Chart( song_id=songId, rating_class=ratingClass, set=self.songIdSelector.packId(), ) return result return None def updateDatabase(self): # remember selection and restore later ratingClass = self.ratingClassSelector.value() # wait `songIdSelector` finish self.songIdSelector.updateDatabase() if ratingClass is not None: self.ratingClassSelector.select(ratingClass) @Slot() def updateResultLabel(self): chart = self.value() if isinstance(chart, Chart): if chart.constant is not None: pack = self.db.get_pack(chart.set) texts = [ [ pack.name, chart.title, f"{rating_class_to_text(chart.rating_class)} " f"{chart.rating}{'+' if chart.rating_plus else ''}" f"({chart.constant / 10})", ], [pack.id, chart.song_id, str(chart.rating_class)], ] texts = [" | ".join(t) for t in texts] text = f'{texts[0]}
{texts[1]}' else: text = ( "No chart data
" f'{chart.set} | {chart.song_id} | {chart.rating_class}' ) self.resultLabel.setText(text) else: self.resultLabel.setText("...") def updateRatingClassEnabled(self): ratingClasses = [] if songId := self.songIdSelector.songId(): if self.songIdSelector.mode == SongIdSelectorMode.Chart: items = self.db.get_charts_by_song_id(songId) else: items = self.db.get_difficulties_by_song_id(songId) ratingClasses = [item.rating_class for item in items] self.ratingClassSelector.setButtonsEnabled(ratingClasses) @Slot() def on_resetButton_clicked(self): self.songIdSelector.reset() def selectChart(self, chart: Chart): self.songIdSelector.selectChart(chart) self.ratingClassSelector.select(chart.rating_class) def __songIdSelectedQuickSearchActivated(self, chart: Chart): self.ratingClassSelector.select(chart.rating_class)