Newer
Older
music / app / src / main / java / com / lukas / music / ui / fragments / SongFragment.kt
package com.lukas.music.ui.fragments

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.AdapterView
import android.widget.ArrayAdapter
import android.widget.TableRow
import android.widget.TextView
import androidx.cardview.widget.CardView
import androidx.core.view.setMargins
import androidx.fragment.app.Fragment
import com.lukas.music.databinding.FragmentSongBinding
import com.lukas.music.song.Song
import com.lukas.music.song.note.Note
import com.lukas.music.song.note.NoteName


class SongFragment : Fragment(), AdapterView.OnItemSelectedListener {
    private lateinit var binding: FragmentSongBinding
    var displayChordNames = true

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = FragmentSongBinding.inflate(inflater)
        binding.chords.isStretchAllColumns = true
        binding.literalChords.isChecked = true
        binding.literalChords.setOnCheckedChangeListener { _, isChecked ->
            displayChordNames = isChecked
            updateChords()
        }
        val adapter = ArrayAdapter(
            binding.root.context,
            android.R.layout.simple_spinner_dropdown_item, NoteName.VALUES
        )
        binding.keySelection.adapter = adapter
        binding.keySelection.onItemSelectedListener = this
        binding.keySelection.setSelection(Song.currentSong.root.noteName.index)
        updateChords()
        return binding.root
    }

    private fun updateChords() {
        binding.chords.removeAllViews()
        for (phrase in Song.currentSong.chordProgression.phrases) {
            val row = TableRow(binding.root.context)
            for (chord in phrase.chords) {
                val card = CardView(binding.root.context)
                card.radius = 10f
                card.layoutParams = layout
                val text = TextView(binding.root.context)
                text.text = chord.toString(displayChordNames, Song.currentSong.root)
                text.layoutParams = layout
                card.addView(text)
                row.addView(card)
            }
            binding.chords.addView(row)
        }
    }

    companion object {
        val layout = TableRow.LayoutParams(
            TableRow.LayoutParams.MATCH_PARENT,
            TableRow.LayoutParams.MATCH_PARENT
        )

        init {
            layout.setMargins(10)
        }
    }

    override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) {
        Song.currentSong.root = Note.of(NoteName.VALUES[position], 4)
        if (displayChordNames) {
            updateChords()
        }
    }

    override fun onNothingSelected(parent: AdapterView<*>?) {
    }
}