performance updates
This commit is contained in:
@@ -745,22 +745,19 @@ struct LibraryView: View {
|
||||
}
|
||||
Spacer()
|
||||
TextField("Search karaoke music",text:$search).textFieldStyle(.roundedBorder).frame(maxWidth:260)
|
||||
if ["Library","Singer Songs","Playlists"].contains(source) {
|
||||
Button("Song Settings") { djSongSettings = true }
|
||||
.sheet(isPresented:$djSongSettings) {
|
||||
VStack(spacing:0) {
|
||||
HStack { VStack(alignment:.leading,spacing:4) { Text("Song Settings").font(.title2.bold());Text(selectedSong?.title ?? "Select a karaoke track to adjust its settings").font(.callout).foregroundStyle(.secondary) };Spacer() }.padding(24)
|
||||
Divider()
|
||||
detailPanel.frame(height:150).padding(16)
|
||||
Divider()
|
||||
HStack { Text("Changes save automatically").font(.caption).foregroundStyle(.secondary);Spacer();Button("Done") { djSongSettings = false }.keyboardShortcut(.defaultAction) }.padding(20)
|
||||
}.frame(width:920).background(Color(nsColor:.windowBackgroundColor))
|
||||
}
|
||||
}
|
||||
if source == "Library" {
|
||||
Button { importing = true } label: { Label("Import Music",systemImage:"plus") }.buttonStyle(.bordered)
|
||||
}
|
||||
}.padding(.horizontal,22).padding(.vertical,18)
|
||||
.sheet(isPresented:$djSongSettings) {
|
||||
VStack(spacing:0) {
|
||||
HStack { VStack(alignment:.leading,spacing:4) { Text("Song Settings").font(.title2.bold());Text(selectedSong?.title ?? "Select a karaoke track to adjust its settings").font(.callout).foregroundStyle(.secondary) };Spacer() }.padding(24)
|
||||
Divider()
|
||||
detailPanel.frame(height:150).padding(16)
|
||||
Divider()
|
||||
HStack { Text("Changes save automatically").font(.caption).foregroundStyle(.secondary);Spacer();Button("Done") { djSongSettings = false }.keyboardShortcut(.defaultAction) }.padding(20)
|
||||
}.frame(width:920).background(Color(nsColor:.windowBackgroundColor))
|
||||
}
|
||||
sourceContent.frame(maxWidth:.infinity,maxHeight:.infinity)
|
||||
if let progress = model.waveformJob {
|
||||
HStack(spacing:10) {
|
||||
@@ -1058,12 +1055,12 @@ struct LibraryView: View {
|
||||
}.tableStyle(.inset(alternatesRowBackgrounds:true))
|
||||
.contextMenu(forSelectionType:Int64.self) { ids in
|
||||
if ids.count > 1 {
|
||||
Button("Generate Waveforms for \(ids.count) Selected Tracks") { model.generateWaveforms(ids) }.disabled(model.generatingWaveforms || model.scanningSource != nil)
|
||||
Button("Regenerate Selected Waveforms") { model.generateWaveforms(ids,force:true) }.disabled(model.generatingWaveforms || model.scanningSource != nil)
|
||||
Button("Reinterpret Names…") { beginReinterpretation(ids) }
|
||||
Button("Edit \(ids.count) Songs…") { tableSelection = ids;batchEditing = true }
|
||||
}
|
||||
else if let id = ids.first,let song = model.songs.first(where:{$0.id == id}) { songActions(song) }
|
||||
Divider()
|
||||
Menu("Waveforms") { waveformActions(ids) }.disabled(model.generatingWaveforms || model.scanningSource != nil)
|
||||
} primaryAction: { ids in if let id = ids.first { selected = id;tableSelection = [id];playSelected() } }
|
||||
.overlay {
|
||||
if visibleSongs.isEmpty {
|
||||
@@ -1078,9 +1075,8 @@ struct LibraryView: View {
|
||||
}
|
||||
@ViewBuilder private func songActions(_ song: Song) -> some View {
|
||||
Button("Play") { selected = song.id;playSelected() }
|
||||
Button("Song Settings…") { selected = song.id;tableSelection = [song.id];djSongSettings = true }
|
||||
Button("Song Info…") { editingSong = song }
|
||||
Button("Generate Waveform") { model.generateWaveforms([song.id]) }.disabled(model.generatingWaveforms || model.scanningSource != nil || song.audio.hasPrefix("showscreen:"))
|
||||
Button("Regenerate Waveform") { model.generateWaveforms([song.id],force:true) }.disabled(model.generatingWaveforms || model.scanningSource != nil || song.audio.hasPrefix("showscreen:"))
|
||||
Button("Reinterpret Name…") { beginReinterpretation([song.id]) }
|
||||
Button("Find Metadata Online…") { metadataLookup = song }
|
||||
Button("Batch Edit Selected…") { if tableSelection.isEmpty { tableSelection = [song.id] };batchEditing = true }
|
||||
@@ -1233,13 +1229,17 @@ struct LibraryView: View {
|
||||
}.padding(14).frame(maxWidth:.infinity,maxHeight:.infinity).background(StudioTheme.navy).overlay(Rectangle().stroke(StudioTheme.line))
|
||||
}
|
||||
private var playlistPane: some View { PlaylistWorkspace(model:model,query:$search) }
|
||||
@ViewBuilder private var waveformActions: some View {
|
||||
@ViewBuilder private var waveformActions: some View { waveformActions(tableSelection) }
|
||||
@ViewBuilder private func waveformActions(_ ids: Set<Int64>) -> some View {
|
||||
Button("Generate Waveform for Loaded Track") { if let id = model.player.currentSongID { model.generateWaveforms([id]) } }.disabled(model.player.currentSongID == nil)
|
||||
Button("Generate Waveform for Selected Track") { if let selected { model.generateWaveforms([selected]) } }.disabled(tableSelection.count > 1 || selected == nil)
|
||||
Button("Generate Waveforms for \(tableSelection.count) Selected Tracks") { model.generateWaveforms(tableSelection) }.disabled(tableSelection.isEmpty)
|
||||
if ids.count == 1 {
|
||||
Button("Generate Waveform for Selected Track") { model.generateWaveforms(ids) }
|
||||
} else {
|
||||
Button("Generate Waveforms for \(ids.count) Selected Tracks") { model.generateWaveforms(ids) }.disabled(ids.isEmpty)
|
||||
}
|
||||
Button("Generate Waveforms for All Library Tracks") { model.generateWaveforms() }.disabled(model.songs.isEmpty)
|
||||
Divider()
|
||||
Button("Regenerate Selected Waveforms") { model.generateWaveforms(tableSelection,force:true) }.disabled(tableSelection.isEmpty)
|
||||
Button("Regenerate Selected Waveforms") { model.generateWaveforms(ids,force:true) }.disabled(ids.isEmpty)
|
||||
Button("Regenerate All Library Waveforms") { model.generateWaveforms(force:true) }.disabled(model.songs.isEmpty)
|
||||
}
|
||||
private var footer: some View {
|
||||
@@ -1248,7 +1248,6 @@ struct LibraryView: View {
|
||||
Text("\(libraryRows.count) songs").font(.caption).foregroundStyle(.secondary)
|
||||
if !model.tagsStatus.isEmpty { Text(model.tagsStatus).font(.caption).foregroundStyle(.secondary).lineLimit(1) }
|
||||
Spacer()
|
||||
Menu { waveformActions } label: { Label("Waveforms",systemImage:"waveform") }.controlSize(.small).disabled(model.generatingWaveforms || model.scanningSource != nil)
|
||||
if tableSelection.count > 1 { Button("Edit \(tableSelection.count) Songs…") { batchEditing = true }.controlSize(.small) }
|
||||
Text(model.currentVenueName).font(.caption).foregroundStyle(.secondary)
|
||||
RepeatButton(player:model.player).buttonStyle(.borderless)
|
||||
|
||||
Reference in New Issue
Block a user