Skip to content

Commit d50c91c

Browse files
committed
File save dialog revamp. Display spectrum name in charts legends
1 parent 78a5fa1 commit d50c91c

File tree

7 files changed

+75
-55
lines changed

7 files changed

+75
-55
lines changed

app/src/main/kotlin/io/github/vikulin/opengammakit/SpectrumFragment.kt

Lines changed: 44 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -318,14 +318,9 @@ class SpectrumFragment : SerialConnectionFragment(),
318318
}
319319

320320
btnSaveSpectrum.setOnClickListener {
321-
if(spectrumDataSet.data.size>1){
322-
// show select spectrum to save into a file
323-
val spectrumFileChooserDialog = SaveSelectedSpectrumDialogFragment.newInstance(spectrumDataSet)
324-
spectrumFileChooserDialog.show(childFragmentManager, "save_spectrum_file_dialog_fragment")
325-
} else {
326-
val saveSpectrumIntoFileDialog = SaveSpectrumDataIntoFileDialogFragment.newInstance(spectrumDataSet)
327-
saveSpectrumIntoFileDialog.show(childFragmentManager, "save_spectrum_into_file_dialog_fragment")
328-
}
321+
// show select spectrum to save into a file
322+
val spectrumFileChooserDialog = SaveSelectedSpectrumDialogFragment.newInstance(spectrumDataSet)
323+
spectrumFileChooserDialog.show(childFragmentManager, "save_spectrum_file_dialog_fragment")
329324
}
330325

331326
btnToggleFilter.setOnClickListener {
@@ -533,12 +528,12 @@ class SpectrumFragment : SerialConnectionFragment(),
533528
return components.joinToString("")
534529
}
535530

536-
private fun getSpectrumLabel(index: Int, entry: GammaKitEntry): String{
537-
val ct = entry.resultData.energySpectrum.validPulseCount
538-
val mt = entry.resultData.energySpectrum.measurementTime
539-
val ch = entry.resultData.energySpectrum.numberOfChannels
531+
private fun getSpectrumLabel(index: Int, entry: OpenGammaKitData): String{
532+
val ct = entry.data[index].resultData.energySpectrum.validPulseCount
533+
val mt = entry.data[index].resultData.energySpectrum.measurementTime
534+
val ch = entry.data[index].resultData.energySpectrum.numberOfChannels
540535
val t = formatTimeSkipZeros(mt)
541-
return (entry.deviceData.deviceName?:"Spectrum ${index + 1}")+" Ch $ch Ct $ct T $t"
536+
return entry.data[index].deviceData.deviceName +" ${entry.derivedSpectra[index]?.name} Ch $ch Ct $ct T $t"
542537
}
543538

544539
private fun setupChart() {
@@ -553,7 +548,7 @@ class SpectrumFragment : SerialConnectionFragment(),
553548
val entries = spectrum.mapIndexed { ch, count ->
554549
Entry(ch.toFloat(), count.toFloat())
555550
}
556-
val label = getSpectrumLabel(entry.key, spectrumDataSet.data[entry.key])
551+
val label = getSpectrumLabel(entry.key, spectrumDataSet)
557552
LineDataSet(entries, label).apply {
558553
mode = LineDataSet.Mode.CUBIC_BEZIER
559554
lineWidth = 1.5f
@@ -616,7 +611,7 @@ class SpectrumFragment : SerialConnectionFragment(),
616611
val entries = spectrum.mapIndexed { ch, count ->
617612
Entry(ch.toFloat(), count.toFloat())
618613
}
619-
val label = getSpectrumLabel(entry.key, spectrumDataSet.data[entry.key])
614+
val label = getSpectrumLabel(entry.key, spectrumDataSet)
620615
LineDataSet(entries, label).apply {
621616
mode = LineDataSet.Mode.CUBIC_BEZIER
622617
lineWidth = 1.5f
@@ -665,7 +660,7 @@ class SpectrumFragment : SerialConnectionFragment(),
665660
val energy = interpolateEnergy(sortedCalibrationList, index.toDouble())
666661
Entry(energy.toFloat(), count.toFloat())
667662
}
668-
val label = getSpectrumLabel(selectedIndex, spectrumDataSet.data[selectedIndex])
663+
val label = getSpectrumLabel(selectedIndex, spectrumDataSet)
669664
val calibratedDataSet = LineDataSet(energyEntries, label).apply {
670665
mode = LineDataSet.Mode.CUBIC_BEZIER
671666
lineWidth = 1.5f
@@ -1506,22 +1501,44 @@ class SpectrumFragment : SerialConnectionFragment(),
15061501

15071502
override fun onChoose(uri: String) {
15081503
val openGammaKitData = readAndParseFile(requireContext(), uri.toUri())
1509-
spectrumDataSet.data.addAll(openGammaKitData.data)
1504+
1505+
openGammaKitData.data.forEachIndexed { index, spectrum ->
1506+
val addedIndex = spectrumDataSet.data.size
1507+
spectrumDataSet.data.add(spectrum)
1508+
1509+
spectrumDataSet.derivedSpectra[addedIndex] = openGammaKitData.derivedSpectra[index]
1510+
?: DerivedSpectrumEntry(
1511+
name = "Copied from raw spectrum",
1512+
resultSpectrum = spectrum.resultData.energySpectrum.spectrum.map { it.toDouble() },
1513+
modifiers = mutableListOf(),
1514+
peaks = mutableListOf()
1515+
)
1516+
}
1517+
15101518
updateChartSpectrumData()
15111519
}
15121520

1513-
override fun onChooseMultiple(selectedIndexes: List<Int>) {
1514-
// Filter entries based on selected indexes
1515-
val selectedEntries = spectrumDataSet.data.filterIndexed { index, _ ->
1516-
index in selectedIndexes
1517-
}.toMutableList()
1521+
override fun onChooseMultiple(selectedIndexes: MutableMap<Int, String>) {
1522+
// Filter entries and remap derivedSpectra with updated names
1523+
val selectedEntries = mutableListOf<GammaKitEntry>()
1524+
val selectedDerivedSpectra = mutableMapOf<Int, DerivedSpectrumEntry>()
1525+
1526+
for ((originalIndex, newName) in selectedIndexes) {
1527+
val entry = spectrumDataSet.data.getOrNull(originalIndex) ?: continue
1528+
selectedEntries.add(entry)
15181529

1519-
// Create a submap of derivedSpectra for selected indexes
1520-
val selectedDerivedSpectra = spectrumDataSet.derivedSpectra
1521-
.filterKeys { it in selectedIndexes }
1522-
.toMutableMap()
1530+
val derived = spectrumDataSet.derivedSpectra[originalIndex]?.copy(name = newName)
1531+
?: DerivedSpectrumEntry(
1532+
name = newName,
1533+
resultSpectrum = entry.resultData.energySpectrum.spectrum.map { it.toDouble() },
1534+
modifiers = mutableListOf(),
1535+
peaks = mutableListOf()
1536+
)
1537+
1538+
selectedDerivedSpectra[selectedEntries.lastIndex] = derived
1539+
}
15231540

1524-
// Create a new OpenGammaKitData with the same schema version and modified data
1541+
// Create a new OpenGammaKitData with selected and renamed items
15251542
val modifiedData = OpenGammaKitData(
15261543
schemaVersion = spectrumDataSet.schemaVersion,
15271544
data = selectedEntries,

app/src/main/kotlin/io/github/vikulin/opengammakit/adapter/SpectrumFwhmSelectAdapter.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ class SpectrumFwhmSelectAdapter(
2020

2121
inner class SpectrumViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
2222
val colorIndicator: MaterialCardView = itemView.findViewById(R.id.colorIndicator)
23-
val deviceName: TextView = itemView.findViewById(R.id.deviceName)
23+
val deviceName: TextView = itemView.findViewById(R.id.spectrumName)
2424

2525
fun bind(entry: GammaKitEntry, index: Int) {
2626
colorIndicator.setBackgroundTintList(ColorStateList.valueOf(SpectrumFragment.getLineColor(dialog.requireContext(), index)))

app/src/main/kotlin/io/github/vikulin/opengammakit/adapter/SpectrumSaveAdapter.kt

Lines changed: 17 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,49 +6,50 @@ import android.view.LayoutInflater
66
import android.view.View
77
import android.view.ViewGroup
88
import android.widget.CheckBox
9-
import android.widget.TextView
9+
import android.widget.EditText
1010
import androidx.recyclerview.widget.RecyclerView
1111
import com.google.android.material.card.MaterialCardView
1212
import io.github.vikulin.opengammakit.R
1313
import io.github.vikulin.opengammakit.SpectrumFragment
14-
import io.github.vikulin.opengammakit.model.GammaKitEntry
14+
import io.github.vikulin.opengammakit.model.OpenGammaKitData
15+
import kotlin.collections.mutableMapOf
1516

1617
class SpectrumSaveAdapter(
1718
private val context: Context,
18-
private val spectrumData: List<GammaKitEntry>
19+
private val spectrumData: OpenGammaKitData
1920
) : RecyclerView.Adapter<SpectrumSaveAdapter.SpectrumViewHolder>() {
2021

21-
private val selectedPositions = mutableSetOf<Int>()
22+
private val selectedPositions = mutableMapOf<Int, String>()
2223

2324
inner class SpectrumViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
2425
private val colorIndicator: MaterialCardView = itemView.findViewById(R.id.colorIndicator)
25-
private val deviceName: TextView = itemView.findViewById(R.id.deviceName)
26+
private val spectrumName: EditText = itemView.findViewById(R.id.spectrumName)
2627
private val checkBox: CheckBox = itemView.findViewById(R.id.spectrumCheckBox)
2728

28-
fun bind(entry: GammaKitEntry, index: Int) {
29+
fun bind(entry: OpenGammaKitData, index: Int) {
2930
colorIndicator.setBackgroundTintList(
3031
ColorStateList.valueOf(SpectrumFragment.getLineColor(context, index))
3132
)
3233

33-
val name = entry.deviceData.deviceName.takeIf { it.isNotEmpty() } ?: "Spectrum #$index"
34-
deviceName.text = name
34+
val name = entry.derivedSpectra[index]?.name ?: "Noname"
35+
spectrumName.setText(name)
3536
checkBox.isChecked = selectedPositions.contains(index)
3637

3738
itemView.setOnClickListener {
38-
toggleSelection(index)
39+
toggleSelection(index, spectrumName.text.toString())
3940
notifyItemChanged(index)
4041
}
4142

4243
checkBox.setOnClickListener {
43-
toggleSelection(index)
44+
toggleSelection(index, spectrumName.text.toString())
4445
}
4546
}
4647

47-
private fun toggleSelection(index: Int) {
48+
private fun toggleSelection(index: Int, name: String) {
4849
if (selectedPositions.contains(index)) {
4950
selectedPositions.remove(index)
5051
} else {
51-
selectedPositions.add(index)
52+
selectedPositions[index] = name
5253
}
5354
}
5455
}
@@ -59,16 +60,12 @@ class SpectrumSaveAdapter(
5960
}
6061

6162
override fun onBindViewHolder(holder: SpectrumViewHolder, position: Int) {
62-
holder.bind(spectrumData[position], position)
63+
holder.bind(spectrumData, position)
6364
}
6465

65-
override fun getItemCount(): Int = spectrumData.size
66+
override fun getItemCount(): Int = spectrumData.data.size
6667

67-
fun getSelectedItems(): List<GammaKitEntry> {
68-
return selectedPositions.map { spectrumData[it] }
69-
}
70-
71-
fun getSelectedIndexes(): List<Int> {
72-
return selectedPositions.toList()
68+
fun getSelectedIndexes(): MutableMap<Int, String> {
69+
return selectedPositions
7370
}
7471
}

app/src/main/kotlin/io/github/vikulin/opengammakit/view/SaveSelectedSpectrumDialogFragment.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ class SaveSelectedSpectrumDialogFragment : DialogFragment() {
5353
val spectrumData = arguments?.getSerializable(SPECTRUM_DATA) as? OpenGammaKitData
5454
?: return view
5555

56-
adapter = SpectrumSaveAdapter(this.requireContext(), spectrumData.data)
56+
adapter = SpectrumSaveAdapter(this.requireContext(), spectrumData)
5757
recyclerView.layoutManager = LinearLayoutManager(context)
5858
recyclerView.adapter = adapter
5959

@@ -73,6 +73,6 @@ class SaveSelectedSpectrumDialogFragment : DialogFragment() {
7373

7474
// Updated callback to support multiple selection
7575
interface ChooseSpectrumDialogListener {
76-
fun onChooseMultiple(selectedIndexes: List<Int>)
76+
fun onChooseMultiple(selectedIndexes: MutableMap<Int, String>)
7777
}
7878
}

app/src/main/kotlin/io/github/vikulin/opengammakit/view/SaveSpectrumDataIntoFileDialogFragment.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class SaveSpectrumDataIntoFileDialogFragment : DialogFragment() {
6060
val formatter = SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault())
6161
val timestamp = formatter.format(Date())
6262
val fileName = "spectrum_$timestamp.json"
63-
fileNameEditText.setText(fileName)
63+
fileNameEditText.text = fileName
6464
selectedLocationText.text = "Documents/OpenGammaKit/"
6565
selectLocationButton.setOnClickListener {
6666
val name = fileNameEditText.text.toString().trim()

app/src/main/res/layout/item_fwhm_spectrum.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
android:layout_marginEnd="20dp" />
1616

1717
<TextView
18-
android:id="@+id/deviceName"
18+
android:id="@+id/spectrumName"
1919
android:layout_width="0dp"
2020
android:layout_height="wrap_content"
2121
android:text="Spectrum #1"

app/src/main/res/layout/item_save_spectrum.xml

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,20 @@
1414
android:backgroundTint="@color/colorAccent"
1515
android:layout_marginEnd="20dp" />
1616

17-
<TextView
18-
android:id="@+id/deviceName"
17+
<EditText
18+
android:id="@+id/spectrumName"
1919
android:layout_width="0dp"
2020
android:layout_height="wrap_content"
21+
android:layout_weight="1"
22+
android:autofillHints="name"
23+
android:minWidth="300dp"
2124
android:text="Spectrum #1"
25+
android:hint="Spectrum name"
26+
android:maxLength="10"
27+
android:inputType="text"
28+
android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-"
2229
android:textColor="@color/colorPrimaryText"
2330
android:textSize="14sp"
24-
android:layout_weight="1"
2531
android:gravity="center_vertical" />
2632

2733
<CheckBox

0 commit comments

Comments
 (0)