From 48b0aea709522693fccf053208f2b445a05eb828 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Sun, 12 May 2024 23:14:22 +0100 Subject: [PATCH 01/21] properly name `utilityAreaViewModel` across the project --- .../StatusBarBreakpointButton.swift | 8 +-- .../StatusBarCursorLocationLabel.swift | 6 +- .../StatusBarToggleUtilityAreaButton.swift | 12 ++-- .../StatusBar/Views/StatusBarView.swift | 4 +- .../DebugUtility/UtilityAreaDebugView.swift | 4 +- .../OutputUtility/UtilityAreaOutputView.swift | 6 +- .../UtilityAreaTerminalView.swift | 61 ++++++++++--------- .../Toolbar/StatusBarClearButton.swift | 4 +- .../Toolbar/StatusBarMaximizeButton.swift | 8 +-- .../StatusBarSplitTerminalButton.swift | 4 +- .../UtilityArea/Views/UtilityAreaView.swift | 12 ++-- .../WindowCommands/ViewCommands.swift | 1 - CodeEdit/WorkspaceView.swift | 6 +- 13 files changed, 66 insertions(+), 70 deletions(-) diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarBreakpointButton.swift b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarBreakpointButton.swift index c331b6ddf8..3237d93aa0 100644 --- a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarBreakpointButton.swift +++ b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarBreakpointButton.swift @@ -1,6 +1,6 @@ // // StatusBarBreakpointButton.swift -// CodeEditModules/StatusBar +// CodeEdit // // Created by Stef Kors on 14/04/2022. // @@ -9,13 +9,13 @@ import SwiftUI import CodeEditSymbols struct StatusBarBreakpointButton: View { - @EnvironmentObject private var model: UtilityAreaViewModel + @EnvironmentObject private var utilityAreaViewModel: UtilityAreaViewModel var body: some View { Button { - model.isBreakpointEnabled.toggle() + utilityAreaViewModel.isBreakpointEnabled.toggle() } label: { - if model.isBreakpointEnabled { + if utilityAreaViewModel.isBreakpointEnabled { Image.breakpointFill .foregroundColor(.accentColor) } else { diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorLocationLabel.swift b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorLocationLabel.swift index af4ee347e7..38c7f1e3a8 100644 --- a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorLocationLabel.swift +++ b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorLocationLabel.swift @@ -1,6 +1,6 @@ // // StatusBarCursorLocationLabel.swift -// CodeEditModules/StatusBar +// CodeEdit // // Created by Lukas Pistrol on 22.03.22. // @@ -14,7 +14,7 @@ struct StatusBarCursorLocationLabel: View { @Environment(\.modifierKeys) private var modifierKeys - @EnvironmentObject private var model: UtilityAreaViewModel + @EnvironmentObject private var utilityAreaViewModel: UtilityAreaViewModel @EnvironmentObject private var editorManager: EditorManager @State private var tab: EditorInstance? @@ -87,7 +87,7 @@ struct StatusBarCursorLocationLabel: View { EmptyView() } } - .font(model.toolbarFont) + .font(utilityAreaViewModel.toolbarFont) .foregroundColor(foregroundColor) .fixedSize() .lineLimit(1) diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarToggleUtilityAreaButton.swift b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarToggleUtilityAreaButton.swift index f88d89a13b..16d525d814 100644 --- a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarToggleUtilityAreaButton.swift +++ b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarToggleUtilityAreaButton.swift @@ -1,6 +1,6 @@ // // StatusBarToggleUtilityAreaButton.swift -// CodeEditModules/StatusBar +// CodeEdit // // Created by Lukas Pistrol on 22.03.22. // @@ -11,17 +11,17 @@ internal struct StatusBarToggleUtilityAreaButton: View { @Environment(\.controlActiveState) var controlActiveState - @EnvironmentObject private var model: UtilityAreaViewModel + @EnvironmentObject private var utilityAreaViewModel: UtilityAreaViewModel internal var body: some View { Button { - model.togglePanel() + utilityAreaViewModel.togglePanel() } label: { Image(systemName: "square.bottomthird.inset.filled") } .buttonStyle(.icon) .keyboardShortcut("Y", modifiers: [.command, .shift]) - .help(model.isCollapsed ? "Show the Utility area" : "Hide the Utility area") + .help(utilityAreaViewModel.isCollapsed ? "Show the Utility area" : "Hide the Utility area") .onHover { isHovering($0) } .onChange(of: controlActiveState) { newValue in if newValue == .key { @@ -29,7 +29,7 @@ internal struct StatusBarToggleUtilityAreaButton: View { name: "Toggle Utility Area", title: "Toggle Utility Area", id: "open.drawer", - command: CommandClosureWrapper.init(closure: model.togglePanel) + command: CommandClosureWrapper.init(closure: utilityAreaViewModel.togglePanel) ) } } @@ -38,7 +38,7 @@ internal struct StatusBarToggleUtilityAreaButton: View { name: "Toggle Utility Area", title: "Toggle Utility Area", id: "open.drawer", - command: CommandClosureWrapper.init(closure: model.togglePanel) + command: CommandClosureWrapper.init(closure: utilityAreaViewModel.togglePanel) ) } } diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarView.swift b/CodeEdit/Features/StatusBar/Views/StatusBarView.swift index db703e1ad3..99c1a88aa0 100644 --- a/CodeEdit/Features/StatusBar/Views/StatusBarView.swift +++ b/CodeEdit/Features/StatusBar/Views/StatusBarView.swift @@ -1,6 +1,6 @@ // // StatusBarView.swift -// CodeEditModules/StatusBar +// CodeEdit // // Created by Lukas Pistrol on 19.03.22. // @@ -20,8 +20,6 @@ struct StatusBarView: View { @Environment(\.controlActiveState) private var controlActive - @EnvironmentObject private var model: UtilityAreaViewModel - static let height = 28.0 @Environment(\.colorScheme) diff --git a/CodeEdit/Features/UtilityArea/DebugUtility/UtilityAreaDebugView.swift b/CodeEdit/Features/UtilityArea/DebugUtility/UtilityAreaDebugView.swift index eeb92b3552..e81659baef 100644 --- a/CodeEdit/Features/UtilityArea/DebugUtility/UtilityAreaDebugView.swift +++ b/CodeEdit/Features/UtilityArea/DebugUtility/UtilityAreaDebugView.swift @@ -8,12 +8,12 @@ import SwiftUI struct UtilityAreaDebugView: View { - @EnvironmentObject private var model: UtilityAreaViewModel + @EnvironmentObject private var utilityAreaViewModel: UtilityAreaViewModel @State var tabSelection = 0 var body: some View { - UtilityAreaTabView(model: model.tabViewModel) { _ in + UtilityAreaTabView(model: utilityAreaViewModel.tabViewModel) { _ in Text("Nothing to debug") .font(.system(size: 16)) .foregroundColor(.secondary) diff --git a/CodeEdit/Features/UtilityArea/OutputUtility/UtilityAreaOutputView.swift b/CodeEdit/Features/UtilityArea/OutputUtility/UtilityAreaOutputView.swift index c1786e024f..6a2f4f95cb 100644 --- a/CodeEdit/Features/UtilityArea/OutputUtility/UtilityAreaOutputView.swift +++ b/CodeEdit/Features/UtilityArea/OutputUtility/UtilityAreaOutputView.swift @@ -1,5 +1,5 @@ // -// UtilityAreaDebugView.swift +// UtilityAreaOutputView.swift // CodeEdit // // Created by Austin Condiff on 5/25/23. @@ -9,7 +9,7 @@ import SwiftUI import LogStream struct UtilityAreaOutputView: View { - @EnvironmentObject private var model: UtilityAreaViewModel + @EnvironmentObject private var utilityAreaViewModel: UtilityAreaViewModel @ObservedObject var extensionManager = ExtensionManager.shared @@ -26,7 +26,7 @@ struct UtilityAreaOutputView: View { } var body: some View { - UtilityAreaTabView(model: model.tabViewModel) { _ in + UtilityAreaTabView(model: utilityAreaViewModel.tabViewModel) { _ in Group { if selectedOutputSource == nil { Text("No output") diff --git a/CodeEdit/Features/UtilityArea/TerminalUtility/UtilityAreaTerminalView.swift b/CodeEdit/Features/UtilityArea/TerminalUtility/UtilityAreaTerminalView.swift index 815d1a16f2..867c8d43fd 100644 --- a/CodeEdit/Features/UtilityArea/TerminalUtility/UtilityAreaTerminalView.swift +++ b/CodeEdit/Features/UtilityArea/TerminalUtility/UtilityAreaTerminalView.swift @@ -1,5 +1,5 @@ // -// DebuggerAreaTerminal.swift +// UtilityAreaTerminal.swift // CodeEdit // // Created by Austin Condiff on 5/25/23. @@ -42,7 +42,7 @@ struct UtilityAreaTerminalView: View { @EnvironmentObject private var workspace: WorkspaceDocument - @EnvironmentObject private var model: UtilityAreaViewModel + @EnvironmentObject private var utilityAreaViewModel: UtilityAreaViewModel @State private var sidebarIsCollapsed = false @@ -55,7 +55,7 @@ struct UtilityAreaTerminalView: View { private func initializeTerminals() { let id = UUID() - model.terminals = [ + utilityAreaViewModel.terminals = [ UtilityAreaTerminal( id: id, url: workspace.workspaceFileManager?.folderUrl ?? URL(filePath: "/"), @@ -64,13 +64,13 @@ struct UtilityAreaTerminalView: View { ) ] - model.selectedTerminals = [id] + utilityAreaViewModel.selectedTerminals = [id] } private func addTerminal(shell: String? = nil) { let id = UUID() - model.terminals.append( + utilityAreaViewModel.terminals.append( UtilityAreaTerminal( id: id, url: URL(filePath: "\(id)"), @@ -79,17 +79,17 @@ struct UtilityAreaTerminalView: View { ) ) - model.selectedTerminals = [id] + utilityAreaViewModel.selectedTerminals = [id] } private func getTerminal(_ id: UUID) -> UtilityAreaTerminal? { - return model.terminals.first(where: { $0.id == id }) ?? nil + return utilityAreaViewModel.terminals.first(where: { $0.id == id }) ?? nil } private func updateTerminal(_ id: UUID, title: String? = nil) { - let terminalIndex = model.terminals.firstIndex(where: { $0.id == id }) + let terminalIndex = utilityAreaViewModel.terminals.firstIndex(where: { $0.id == id }) if terminalIndex != nil { - updateTerminalByReference(of: &model.terminals[terminalIndex!], title: title) + updateTerminalByReference(of: &utilityAreaViewModel.terminals[terminalIndex!], title: title) } } @@ -121,16 +121,16 @@ struct UtilityAreaTerminalView: View { } func moveItems(from source: IndexSet, to destination: Int) { - model.terminals.move(fromOffsets: source, toOffset: destination) + utilityAreaViewModel.terminals.move(fromOffsets: source, toOffset: destination) } var body: some View { - UtilityAreaTabView(model: model.tabViewModel) { tabState in + UtilityAreaTabView(model: utilityAreaViewModel.tabViewModel) { tabState in ZStack { - if model.selectedTerminals.isEmpty { + if utilityAreaViewModel.selectedTerminals.isEmpty { CEContentUnavailableView("No Selection") } - ForEach(model.terminals) { terminal in + ForEach(utilityAreaViewModel.terminals) { terminal in TerminalEmulatorView( url: terminal.url!, shellType: terminal.shell, @@ -144,14 +144,17 @@ struct UtilityAreaTerminalView: View { .padding(.top, 10) .padding(.horizontal, 10) .contentShape(Rectangle()) - .disabled(terminal.id != model.selectedTerminals.first) - .opacity(terminal.id == model.selectedTerminals.first ? 1 : 0) + .disabled(terminal.id != utilityAreaViewModel.selectedTerminals.first) + .opacity(terminal.id == utilityAreaViewModel.selectedTerminals.first ? 1 : 0) } } .paneToolbar { PaneToolbarSection { - UtilityAreaTerminalPicker(selectedIDs: $model.selectedTerminals, terminals: model.terminals) - .opacity(tabState.leadingSidebarIsCollapsed ? 1 : 0) + UtilityAreaTerminalPicker( + selectedIDs: $utilityAreaViewModel.selectedTerminals, + terminals: utilityAreaViewModel.terminals + ) + .opacity(tabState.leadingSidebarIsCollapsed ? 1 : 0) } Spacer() PaneToolbarSection { @@ -168,7 +171,7 @@ struct UtilityAreaTerminalView: View { } } .background { - if model.selectedTerminals.isEmpty { + if utilityAreaViewModel.selectedTerminals.isEmpty { EffectView(.contentBackground) } else if useThemeBackground { Color(nsColor: backgroundColor) @@ -181,27 +184,27 @@ struct UtilityAreaTerminalView: View { } } .colorScheme( - model.selectedTerminals.isEmpty + utilityAreaViewModel.selectedTerminals.isEmpty ? colorScheme : matchAppearance && darkAppearance ? themeModel.selectedDarkTheme?.appearance == .dark ? .dark : .light : themeModel.selectedTheme?.appearance == .dark ? .dark : .light ) } leadingSidebar: { _ in - List(selection: $model.selectedTerminals) { - ForEach(model.terminals, id: \.self.id) { terminal in + List(selection: $utilityAreaViewModel.selectedTerminals) { + ForEach(utilityAreaViewModel.terminals, id: \.self.id) { terminal in UtilityAreaTerminalTab( terminal: terminal, - removeTerminals: model.removeTerminals, - isSelected: model.selectedTerminals.contains(terminal.id), - selectedIDs: model.selectedTerminals + removeTerminals: utilityAreaViewModel.removeTerminals, + isSelected: utilityAreaViewModel.selectedTerminals.contains(terminal.id), + selectedIDs: utilityAreaViewModel.selectedTerminals ) .tag(terminal.id) .listRowSeparator(.hidden) } .onMove(perform: moveItems) } - .focusedObject(model) + .focusedObject(utilityAreaViewModel) .listStyle(.automatic) .accentColor(.secondary) .contextMenu { @@ -221,7 +224,7 @@ struct UtilityAreaTerminalView: View { } } } - .onChange(of: model.terminals) { newValue in + .onChange(of: utilityAreaViewModel.terminals) { newValue in if newValue.isEmpty { addTerminal() } @@ -234,12 +237,12 @@ struct UtilityAreaTerminalView: View { Image(systemName: "plus") } Button { - model.removeTerminals(model.selectedTerminals) + utilityAreaViewModel.removeTerminals(utilityAreaViewModel.selectedTerminals) } label: { Image(systemName: "minus") } - .disabled(model.terminals.count <= 1) - .opacity(model.terminals.count <= 1 ? 0.5 : 1) + .disabled(utilityAreaViewModel.terminals.count <= 1) + .opacity(utilityAreaViewModel.terminals.count <= 1 ? 0.5 : 1) } Spacer() } diff --git a/CodeEdit/Features/UtilityArea/Toolbar/StatusBarClearButton.swift b/CodeEdit/Features/UtilityArea/Toolbar/StatusBarClearButton.swift index 74e174d24f..8153879ffd 100644 --- a/CodeEdit/Features/UtilityArea/Toolbar/StatusBarClearButton.swift +++ b/CodeEdit/Features/UtilityArea/Toolbar/StatusBarClearButton.swift @@ -1,6 +1,6 @@ // // StatusBarClearButton.swift -// CodeEditModules/StatusBar +// CodeEdit // // Created by Stef Kors on 12/04/2022. // @@ -8,8 +8,6 @@ import SwiftUI struct StatusBarClearButton: View { - @EnvironmentObject private var model: UtilityAreaViewModel - var body: some View { Button { // Clear terminal diff --git a/CodeEdit/Features/UtilityArea/Toolbar/StatusBarMaximizeButton.swift b/CodeEdit/Features/UtilityArea/Toolbar/StatusBarMaximizeButton.swift index ac87eeb894..572f97c71e 100644 --- a/CodeEdit/Features/UtilityArea/Toolbar/StatusBarMaximizeButton.swift +++ b/CodeEdit/Features/UtilityArea/Toolbar/StatusBarMaximizeButton.swift @@ -1,6 +1,6 @@ // // StatusBarMaximizeButton.swift -// CodeEditModules/StatusBar +// CodeEdit // // Created by Stef Kors on 12/04/2022. // @@ -8,14 +8,14 @@ import SwiftUI struct StatusBarMaximizeButton: View { - @EnvironmentObject private var model: UtilityAreaViewModel + @EnvironmentObject private var utilityAreaViewModel: UtilityAreaViewModel var body: some View { Button { - model.isMaximized.toggle() + utilityAreaViewModel.isMaximized.toggle() } label: { Image(systemName: "arrowtriangle.up.square") - .foregroundColor(model.isMaximized ? .accentColor : .secondary) + .foregroundColor(utilityAreaViewModel.isMaximized ? .accentColor : .secondary) } .buttonStyle(.plain) } diff --git a/CodeEdit/Features/UtilityArea/Toolbar/StatusBarSplitTerminalButton.swift b/CodeEdit/Features/UtilityArea/Toolbar/StatusBarSplitTerminalButton.swift index 71e1288410..5760036213 100644 --- a/CodeEdit/Features/UtilityArea/Toolbar/StatusBarSplitTerminalButton.swift +++ b/CodeEdit/Features/UtilityArea/Toolbar/StatusBarSplitTerminalButton.swift @@ -1,6 +1,6 @@ // // StatusBarSplitTerminalButton.swift -// CodeEditModules/StatusBar +// CodeEdit // // Created by Stef Kors on 14/04/2022. // @@ -8,8 +8,6 @@ import SwiftUI struct StatusBarSplitTerminalButton: View { - @EnvironmentObject private var model: UtilityAreaViewModel - var body: some View { Button { // todo diff --git a/CodeEdit/Features/UtilityArea/Views/UtilityAreaView.swift b/CodeEdit/Features/UtilityArea/Views/UtilityAreaView.swift index fc611b03ac..bd897f902a 100644 --- a/CodeEdit/Features/UtilityArea/Views/UtilityAreaView.swift +++ b/CodeEdit/Features/UtilityArea/Views/UtilityAreaView.swift @@ -1,6 +1,6 @@ // // UtilityAreaView.swift -// CodeEditModules/StatusBar +// CodeEdit // // Created by Lukas Pistrol on 22.03.22. // @@ -17,7 +17,7 @@ struct UtilityAreaView: View { @Environment(\.colorScheme) private var colorScheme - @EnvironmentObject private var model: UtilityAreaViewModel + @EnvironmentObject private var utilityAreaViewModel: UtilityAreaViewModel @StateObject private var themeModel: ThemeModel = .shared @@ -34,7 +34,7 @@ struct UtilityAreaView: View { } .safeAreaInset(edge: .leading, spacing: 0) { HStack(spacing: 0) { - AreaTabBar(items: $model.tabItems, selection: $selection, position: .side) + AreaTabBar(items: $utilityAreaViewModel.tabItems, selection: $selection, position: .side) Divider() .overlay(Color(nsColor: colorScheme == .dark ? .black : .clear)) } @@ -44,15 +44,15 @@ struct UtilityAreaView: View { Divider() HStack(spacing: 0) { Button { - model.isMaximized.toggle() + utilityAreaViewModel.isMaximized.toggle() } label: { Image(systemName: "arrowtriangle.up.square") } - .buttonStyle(.icon(isActive: model.isMaximized, size: 24)) + .buttonStyle(.icon(isActive: utilityAreaViewModel.isMaximized, size: 24)) } } .colorScheme( - model.selectedTerminals.isEmpty + utilityAreaViewModel.selectedTerminals.isEmpty ? colorScheme : matchAppearance && darkAppearance ? themeModel.selectedDarkTheme?.appearance == .dark ? .dark : .light diff --git a/CodeEdit/Features/WindowCommands/ViewCommands.swift b/CodeEdit/Features/WindowCommands/ViewCommands.swift index 8113439f78..238480f67a 100644 --- a/CodeEdit/Features/WindowCommands/ViewCommands.swift +++ b/CodeEdit/Features/WindowCommands/ViewCommands.swift @@ -20,7 +20,6 @@ struct ViewCommands: Commands { @State var windowController: CodeEditWindowController? private let documentController: CodeEditDocumentController = CodeEditDocumentController() - private let statusBarViewModel: UtilityAreaViewModel = UtilityAreaViewModel() @FocusedBinding(\.navigationSplitViewVisibility) var navigationSplitViewVisibility diff --git a/CodeEdit/WorkspaceView.swift b/CodeEdit/WorkspaceView.swift index 94f4db792b..b2649faccb 100644 --- a/CodeEdit/WorkspaceView.swift +++ b/CodeEdit/WorkspaceView.swift @@ -21,7 +21,7 @@ struct WorkspaceView: View { @EnvironmentObject private var workspace: WorkspaceDocument @EnvironmentObject private var editorManager: EditorManager - @EnvironmentObject private var utilityAreaModel: UtilityAreaViewModel + @EnvironmentObject private var utilityAreaViewModel: UtilityAreaViewModel @StateObject private var themeModel: ThemeModel = .shared @@ -43,7 +43,7 @@ struct WorkspaceView: View { focus: $focusedEditor ) .collapsable() - .collapsed($utilityAreaModel.isMaximized) + .collapsed($utilityAreaViewModel.isMaximized) .frame(minHeight: 170 + 29 + 29) .frame(maxWidth: .infinity, maxHeight: .infinity) .holdingPriority(.init(1)) @@ -52,7 +52,7 @@ struct WorkspaceView: View { } UtilityAreaView() .collapsable() - .collapsed($utilityAreaModel.isCollapsed) + .collapsed($utilityAreaViewModel.isCollapsed) .frame(idealHeight: 260) .frame(minHeight: 100) } From 8c8aad3669790a63d911ade1eddfd411ab2c270c Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Sun, 12 May 2024 23:15:38 +0100 Subject: [PATCH 02/21] add article docs for `CodeEdit/UtilityAreaView` --- .../App Window/UtilityAreaView.md | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Documentation.docc/App Window/UtilityAreaView.md diff --git a/Documentation.docc/App Window/UtilityAreaView.md b/Documentation.docc/App Window/UtilityAreaView.md new file mode 100644 index 0000000000..82f5d666b0 --- /dev/null +++ b/Documentation.docc/App Window/UtilityAreaView.md @@ -0,0 +1,27 @@ +# ``CodeEdit/UtilityAreaView`` + +## Topics + +### Model + +- ``UtilityAreaTab`` + +### View Model + +- ``UtilityAreaViewModel`` +- ``UtilityAreaTabViewModel`` + +### Utility + +- ``UtilityAreaTerminal`` +- ``UtilityAreaTerminalTab`` +- ``UtilityAreaDebugView`` +- ``UtilityAreaOutputView`` + +### Toolbar + +- ``UtilityAreaView`` +- ``StatusBarSplitTerminalButton`` +- ``StatusBarMaximizeButton`` +- ``StatusBarClearButton`` +- ``FilterTextField`` From 8f89c219e64d635e5f989630fd960adb42693c6d Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Sun, 12 May 2024 23:16:17 +0100 Subject: [PATCH 03/21] update article docs for `CodeEdit/StatusBarView` --- Documentation.docc/App Window/StatusBarView.md | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/Documentation.docc/App Window/StatusBarView.md b/Documentation.docc/App Window/StatusBarView.md index 2582bd2e14..82a29054a6 100644 --- a/Documentation.docc/App Window/StatusBarView.md +++ b/Documentation.docc/App Window/StatusBarView.md @@ -4,24 +4,14 @@ ### Model -- ``StatusBarViewModel`` -- ``StatusBarTabType`` - ``CursorLocation`` ### Items -- ``StatusBarMenuLabel`` +- ``StatusBarMenuStyle`` - ``StatusBarBreakpointButton`` - ``StatusBarIndentSelector`` - ``StatusBarEncodingSelector`` - ``StatusBarLineEndSelector`` -- ``StatusBarToggleDrawerButton`` +- ``StatusBarToggleUtilityAreaButton`` - ``StatusBarCursorLocationLabel`` - -### Drawer - -- ``UtilityAreaView`` -- ``StatusBarSplitTerminalButton`` -- ``StatusBarMaximizeButton`` -- ``StatusBarClearButton`` -- ``FilterTextField`` From 1a842815dbd84bc77810a8d2220ddf51af02c188 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Sun, 12 May 2024 23:19:14 +0100 Subject: [PATCH 04/21] properly name items in `CodeEdit/Features/UtilityArea/Toolbar` --- CodeEdit.xcodeproj/project.pbxproj | 32 +++++++++---------- .../OutputUtility/UtilityAreaOutputView.swift | 2 +- ...ton.swift => UtilityAreaClearButton.swift} | 4 +-- ...swift => UtilityAreaFilterTextField.swift} | 6 ++-- ....swift => UtilityAreaMaximizeButton.swift} | 4 +-- ....swift => UtilityAreaTerminalButton.swift} | 4 +-- .../App Window/UtilityAreaView.md | 8 ++--- 7 files changed, 30 insertions(+), 30 deletions(-) rename CodeEdit/Features/UtilityArea/Toolbar/{StatusBarClearButton.swift => UtilityAreaClearButton.swift} (80%) rename CodeEdit/Features/UtilityArea/Toolbar/{FilterTextField.swift => UtilityAreaFilterTextField.swift} (93%) rename CodeEdit/Features/UtilityArea/Toolbar/{StatusBarMaximizeButton.swift => UtilityAreaMaximizeButton.swift} (86%) rename CodeEdit/Features/UtilityArea/Toolbar/{StatusBarSplitTerminalButton.swift => UtilityAreaTerminalButton.swift} (78%) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 45913944ae..300eff5e97 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -203,10 +203,10 @@ 5882252A292C280D00E83CDE /* StatusBarToggleUtilityAreaButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822510292C280D00E83CDE /* StatusBarToggleUtilityAreaButton.swift */; }; 5882252B292C280D00E83CDE /* StatusBarCursorLocationLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822511292C280D00E83CDE /* StatusBarCursorLocationLabel.swift */; }; 5882252C292C280D00E83CDE /* UtilityAreaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822513292C280D00E83CDE /* UtilityAreaView.swift */; }; - 5882252D292C280D00E83CDE /* StatusBarSplitTerminalButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822515292C280D00E83CDE /* StatusBarSplitTerminalButton.swift */; }; - 5882252E292C280D00E83CDE /* StatusBarMaximizeButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822516292C280D00E83CDE /* StatusBarMaximizeButton.swift */; }; - 5882252F292C280D00E83CDE /* StatusBarClearButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822517292C280D00E83CDE /* StatusBarClearButton.swift */; }; - 58822530292C280D00E83CDE /* FilterTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822518292C280D00E83CDE /* FilterTextField.swift */; }; + 5882252D292C280D00E83CDE /* UtilityAreaTerminalButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822515292C280D00E83CDE /* UtilityAreaTerminalButton.swift */; }; + 5882252E292C280D00E83CDE /* UtilityAreaMaximizeButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822516292C280D00E83CDE /* UtilityAreaMaximizeButton.swift */; }; + 5882252F292C280D00E83CDE /* UtilityAreaClearButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822517292C280D00E83CDE /* UtilityAreaClearButton.swift */; }; + 58822530292C280D00E83CDE /* UtilityAreaFilterTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822518292C280D00E83CDE /* UtilityAreaFilterTextField.swift */; }; 58822531292C280D00E83CDE /* View+isHovering.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5882251A292C280D00E83CDE /* View+isHovering.swift */; }; 58822532292C280D00E83CDE /* UtilityAreaViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5882251C292C280D00E83CDE /* UtilityAreaViewModel.swift */; }; 58822534292C280D00E83CDE /* CursorLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5882251E292C280D00E83CDE /* CursorLocation.swift */; }; @@ -768,10 +768,10 @@ 58822510292C280D00E83CDE /* StatusBarToggleUtilityAreaButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarToggleUtilityAreaButton.swift; sourceTree = ""; }; 58822511292C280D00E83CDE /* StatusBarCursorLocationLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarCursorLocationLabel.swift; sourceTree = ""; }; 58822513292C280D00E83CDE /* UtilityAreaView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaView.swift; sourceTree = ""; }; - 58822515292C280D00E83CDE /* StatusBarSplitTerminalButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarSplitTerminalButton.swift; sourceTree = ""; }; - 58822516292C280D00E83CDE /* StatusBarMaximizeButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarMaximizeButton.swift; sourceTree = ""; }; - 58822517292C280D00E83CDE /* StatusBarClearButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarClearButton.swift; sourceTree = ""; }; - 58822518292C280D00E83CDE /* FilterTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FilterTextField.swift; sourceTree = ""; }; + 58822515292C280D00E83CDE /* UtilityAreaTerminalButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaTerminalButton.swift; sourceTree = ""; }; + 58822516292C280D00E83CDE /* UtilityAreaMaximizeButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaMaximizeButton.swift; sourceTree = ""; }; + 58822517292C280D00E83CDE /* UtilityAreaClearButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaClearButton.swift; sourceTree = ""; }; + 58822518292C280D00E83CDE /* UtilityAreaFilterTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaFilterTextField.swift; sourceTree = ""; }; 5882251A292C280D00E83CDE /* View+isHovering.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "View+isHovering.swift"; sourceTree = ""; }; 5882251C292C280D00E83CDE /* UtilityAreaViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaViewModel.swift; sourceTree = ""; }; 5882251E292C280D00E83CDE /* CursorLocation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CursorLocation.swift; sourceTree = ""; }; @@ -2041,10 +2041,10 @@ 58822514292C280D00E83CDE /* Toolbar */ = { isa = PBXGroup; children = ( - 58822515292C280D00E83CDE /* StatusBarSplitTerminalButton.swift */, - 58822516292C280D00E83CDE /* StatusBarMaximizeButton.swift */, - 58822517292C280D00E83CDE /* StatusBarClearButton.swift */, - 58822518292C280D00E83CDE /* FilterTextField.swift */, + 58822515292C280D00E83CDE /* UtilityAreaTerminalButton.swift */, + 58822516292C280D00E83CDE /* UtilityAreaMaximizeButton.swift */, + 58822517292C280D00E83CDE /* UtilityAreaClearButton.swift */, + 58822518292C280D00E83CDE /* UtilityAreaFilterTextField.swift */, ); path = Toolbar; sourceTree = ""; @@ -3307,7 +3307,7 @@ 6C5B63DE29C76213005454BA /* WindowCodeFileView.swift in Sources */, 58F2EB08292FB2B0004A9BDE /* TextEditingSettings.swift in Sources */, 201169DB2837B34000F92B46 /* SourceControlNavigatorChangedFileView.swift in Sources */, - 5882252E292C280D00E83CDE /* StatusBarMaximizeButton.swift in Sources */, + 5882252E292C280D00E83CDE /* UtilityAreaMaximizeButton.swift in Sources */, 77A01E2E2BB4261200F0EA38 /* CEWorkspaceSettings.swift in Sources */, 6C4104E9297C970F00F472BA /* AboutDefaultView.swift in Sources */, 587B9E6F29301D8F00AC7927 /* GitLabProjectAccess.swift in Sources */, @@ -3426,7 +3426,7 @@ 77A01E322BB4274B00F0EA38 /* TasksCEWorkspaceSettingsView.swift in Sources */, B6E41C8F29DE9CD80088F9F4 /* AccountsSettingsDetailsView.swift in Sources */, 5882252B292C280D00E83CDE /* StatusBarCursorLocationLabel.swift in Sources */, - 5882252D292C280D00E83CDE /* StatusBarSplitTerminalButton.swift in Sources */, + 5882252D292C280D00E83CDE /* UtilityAreaTerminalButton.swift in Sources */, 58798238292E30B90085B254 /* FeedbackWindowController.swift in Sources */, 587B9E6C29301D8F00AC7927 /* GitLabNamespace.swift in Sources */, 6C48D8F22972DAFC00D6D205 /* Env+IsFullscreen.swift in Sources */, @@ -3473,7 +3473,7 @@ 850C631229D6B03400E1444C /* SettingsPage.swift in Sources */, 587B9E6729301D8F00AC7927 /* GitLabEventData.swift in Sources */, B66A4E4529C8E86D004573B4 /* CommandsFixes.swift in Sources */, - 5882252F292C280D00E83CDE /* StatusBarClearButton.swift in Sources */, + 5882252F292C280D00E83CDE /* UtilityAreaClearButton.swift in Sources */, 6CE622692A2A174A0013085C /* InspectorTab.swift in Sources */, 58F2EB04292FB2B0004A9BDE /* SourceControlSettings.swift in Sources */, 58710159298EB80000951BA4 /* CEWorkspaceFileManager.swift in Sources */, @@ -3615,7 +3615,7 @@ 587B9E7629301D8F00AC7927 /* GitTime.swift in Sources */, 587B9E5D29301D8F00AC7927 /* GitLabUserRouter.swift in Sources */, 588847692992ABCA00996D95 /* Array+SortURLs.swift in Sources */, - 58822530292C280D00E83CDE /* FilterTextField.swift in Sources */, + 58822530292C280D00E83CDE /* UtilityAreaFilterTextField.swift in Sources */, 6C82D6B929BFE34900495C54 /* HelpCommands.swift in Sources */, 6C147C4929A32A080089B630 /* EditorLayoutView.swift in Sources */, 6C147C4129A328BF0089B630 /* EditorLayout.swift in Sources */, diff --git a/CodeEdit/Features/UtilityArea/OutputUtility/UtilityAreaOutputView.swift b/CodeEdit/Features/UtilityArea/OutputUtility/UtilityAreaOutputView.swift index 6a2f4f95cb..5c76724374 100644 --- a/CodeEdit/Features/UtilityArea/OutputUtility/UtilityAreaOutputView.swift +++ b/CodeEdit/Features/UtilityArea/OutputUtility/UtilityAreaOutputView.swift @@ -77,7 +77,7 @@ struct UtilityAreaOutputView: View { .labelsHidden() .controlSize(.small) Spacer() - FilterTextField(title: "Filter", text: $filterText) + UtilityAreaFilterTextField(title: "Filter", text: $filterText) .frame(maxWidth: 175) Button { output = [] diff --git a/CodeEdit/Features/UtilityArea/Toolbar/StatusBarClearButton.swift b/CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaClearButton.swift similarity index 80% rename from CodeEdit/Features/UtilityArea/Toolbar/StatusBarClearButton.swift rename to CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaClearButton.swift index 8153879ffd..9becd5015f 100644 --- a/CodeEdit/Features/UtilityArea/Toolbar/StatusBarClearButton.swift +++ b/CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaClearButton.swift @@ -1,5 +1,5 @@ // -// StatusBarClearButton.swift +// UtilityAreaClearButton.swift // CodeEdit // // Created by Stef Kors on 12/04/2022. @@ -7,7 +7,7 @@ import SwiftUI -struct StatusBarClearButton: View { +struct UtilityAreaClearButton: View { var body: some View { Button { // Clear terminal diff --git a/CodeEdit/Features/UtilityArea/Toolbar/FilterTextField.swift b/CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaFilterTextField.swift similarity index 93% rename from CodeEdit/Features/UtilityArea/Toolbar/FilterTextField.swift rename to CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaFilterTextField.swift index 20de5db6f8..523055b7b0 100644 --- a/CodeEdit/Features/UtilityArea/Toolbar/FilterTextField.swift +++ b/CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaFilterTextField.swift @@ -1,13 +1,13 @@ // -// FilterTextField.swift -// CodeEditModules/StatusBar +// UtilityAreaFilterTextField.swift +// CodeEdit // // Created by Stef Kors on 12/04/2022. // import SwiftUI -struct FilterTextField: View { +struct UtilityAreaFilterTextField: View { let title: String @Binding var text: String diff --git a/CodeEdit/Features/UtilityArea/Toolbar/StatusBarMaximizeButton.swift b/CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaMaximizeButton.swift similarity index 86% rename from CodeEdit/Features/UtilityArea/Toolbar/StatusBarMaximizeButton.swift rename to CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaMaximizeButton.swift index 572f97c71e..bb63d2521b 100644 --- a/CodeEdit/Features/UtilityArea/Toolbar/StatusBarMaximizeButton.swift +++ b/CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaMaximizeButton.swift @@ -1,5 +1,5 @@ // -// StatusBarMaximizeButton.swift +// UtilityAreaMaximizeButton.swift // CodeEdit // // Created by Stef Kors on 12/04/2022. @@ -7,7 +7,7 @@ import SwiftUI -struct StatusBarMaximizeButton: View { +struct UtilityAreaMaximizeButton: View { @EnvironmentObject private var utilityAreaViewModel: UtilityAreaViewModel var body: some View { diff --git a/CodeEdit/Features/UtilityArea/Toolbar/StatusBarSplitTerminalButton.swift b/CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaTerminalButton.swift similarity index 78% rename from CodeEdit/Features/UtilityArea/Toolbar/StatusBarSplitTerminalButton.swift rename to CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaTerminalButton.swift index 5760036213..ed3baa13ac 100644 --- a/CodeEdit/Features/UtilityArea/Toolbar/StatusBarSplitTerminalButton.swift +++ b/CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaTerminalButton.swift @@ -1,5 +1,5 @@ // -// StatusBarSplitTerminalButton.swift +// UtilityAreaTerminalButton.swift // CodeEdit // // Created by Stef Kors on 14/04/2022. @@ -7,7 +7,7 @@ import SwiftUI -struct StatusBarSplitTerminalButton: View { +struct UtilityAreaTerminalButton: View { var body: some View { Button { // todo diff --git a/Documentation.docc/App Window/UtilityAreaView.md b/Documentation.docc/App Window/UtilityAreaView.md index 82f5d666b0..50e5e93988 100644 --- a/Documentation.docc/App Window/UtilityAreaView.md +++ b/Documentation.docc/App Window/UtilityAreaView.md @@ -21,7 +21,7 @@ ### Toolbar - ``UtilityAreaView`` -- ``StatusBarSplitTerminalButton`` -- ``StatusBarMaximizeButton`` -- ``StatusBarClearButton`` -- ``FilterTextField`` +- ``UtilityAreaSplitTerminalButton`` +- ``UtilityAreaMaximizeButton`` +- ``UtilityAreaClearButton`` +- ``UtilityAreaFilterTextField`` From 900066447e65f9cb80f01f92c7b23fca419d6205 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Sun, 12 May 2024 23:24:25 +0100 Subject: [PATCH 05/21] remove UtilityAreaViewModel properties from status bar implementation --- .../StatusBarItems/StatusBarBreakpointButton.swift | 10 +++++++--- .../StatusBarItems/StatusBarCursorLocationLabel.swift | 2 +- .../UtilityArea/ViewModels/UtilityAreaViewModel.swift | 3 +-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarBreakpointButton.swift b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarBreakpointButton.swift index 3237d93aa0..d3d2778b13 100644 --- a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarBreakpointButton.swift +++ b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarBreakpointButton.swift @@ -9,13 +9,17 @@ import SwiftUI import CodeEditSymbols struct StatusBarBreakpointButton: View { - @EnvironmentObject private var utilityAreaViewModel: UtilityAreaViewModel + // @EnvironmentObject private var utilityAreaViewModel: UtilityAreaViewModel + + @State private var isBreakpointEnabled = false var body: some View { Button { - utilityAreaViewModel.isBreakpointEnabled.toggle() + // utilityAreaViewModel.isBreakpointEnabled.toggle() + isBreakpointEnabled.toggle() } label: { - if utilityAreaViewModel.isBreakpointEnabled { + // if utilityAreaViewModel.isBreakpointEnabled { + if isBreakpointEnabled { Image.breakpointFill .foregroundColor(.accentColor) } else { diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorLocationLabel.swift b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorLocationLabel.swift index 38c7f1e3a8..faa4beccd3 100644 --- a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorLocationLabel.swift +++ b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorLocationLabel.swift @@ -87,7 +87,7 @@ struct StatusBarCursorLocationLabel: View { EmptyView() } } - .font(utilityAreaViewModel.toolbarFont) + .font(.system(size: 11, weight: .medium)) .foregroundColor(foregroundColor) .fixedSize() .lineLimit(1) diff --git a/CodeEdit/Features/UtilityArea/ViewModels/UtilityAreaViewModel.swift b/CodeEdit/Features/UtilityArea/ViewModels/UtilityAreaViewModel.swift index 542def1310..cb9499c7e0 100644 --- a/CodeEdit/Features/UtilityArea/ViewModels/UtilityAreaViewModel.swift +++ b/CodeEdit/Features/UtilityArea/ViewModels/UtilityAreaViewModel.swift @@ -9,8 +9,7 @@ import SwiftUI /// # UtilityAreaViewModel /// -/// A model class to host and manage data for the ``StatusBarView`` -/// +/// A model class to host and manage data for the Utility area. class UtilityAreaViewModel: ObservableObject { /// Returns the current location of the cursor in an editing view @Published var cursorLocation: CursorLocation = .init(line: 1, column: 1) // Implementation needed!! From fe5c5bb9ede356d1b21685f33bc04afa13eba53e Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Sun, 12 May 2024 23:30:52 +0100 Subject: [PATCH 06/21] remove unused properties in `UtilityAreaViewModel` --- .../ViewModels/UtilityAreaViewModel.swift | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/CodeEdit/Features/UtilityArea/ViewModels/UtilityAreaViewModel.swift b/CodeEdit/Features/UtilityArea/ViewModels/UtilityAreaViewModel.swift index cb9499c7e0..671ccf3278 100644 --- a/CodeEdit/Features/UtilityArea/ViewModels/UtilityAreaViewModel.swift +++ b/CodeEdit/Features/UtilityArea/ViewModels/UtilityAreaViewModel.swift @@ -11,8 +11,6 @@ import SwiftUI /// /// A model class to host and manage data for the Utility area. class UtilityAreaViewModel: ObservableObject { - /// Returns the current location of the cursor in an editing view - @Published var cursorLocation: CursorLocation = .init(line: 1, column: 1) // Implementation needed!! @Published var terminals: [UtilityAreaTerminal] = [] @@ -27,24 +25,12 @@ class UtilityAreaViewModel: ObservableObject { /// The current height of the drawer. Zero if hidden @Published var currentHeight: Double = 0 - /// Indicates whether the drawer is being resized or not - @Published var isDragging: Bool = false - - /// Indicates whether the breakpoint is enabled or not - @Published var isBreakpointEnabled: Bool = true - - /// Search value to filter in drawer - @Published var searchText: String = "" - - /// The tab bar items for the DebugAreaView + /// The tab bar items for the UtilityAreaView @Published var tabItems: [UtilityAreaTab] = UtilityAreaTab.allCases /// The tab bar view model for UtilityAreaTabView @Published var tabViewModel = UtilityAreaTabViewModel() - /// Returns the font for status bar items to use - private(set) var toolbarFont: Font = .system(size: 11, weight: .medium) - func removeTerminals(_ ids: Set) { terminals.removeAll(where: { terminal in ids.contains(terminal.id) From cd8082e4bb391756fb4d4aa8e2c0013544304961 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Sun, 12 May 2024 23:32:32 +0100 Subject: [PATCH 07/21] delete `CursorLocation` model --- CodeEdit.xcodeproj/project.pbxproj | 12 ------------ .../StatusBar/Models/CursorLocation.swift | 18 ------------------ Documentation.docc/App Window/StatusBarView.md | 4 ---- 3 files changed, 34 deletions(-) delete mode 100644 CodeEdit/Features/StatusBar/Models/CursorLocation.swift diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 300eff5e97..b0b68bda8e 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -209,7 +209,6 @@ 58822530292C280D00E83CDE /* UtilityAreaFilterTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822518292C280D00E83CDE /* UtilityAreaFilterTextField.swift */; }; 58822531292C280D00E83CDE /* View+isHovering.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5882251A292C280D00E83CDE /* View+isHovering.swift */; }; 58822532292C280D00E83CDE /* UtilityAreaViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5882251C292C280D00E83CDE /* UtilityAreaViewModel.swift */; }; - 58822534292C280D00E83CDE /* CursorLocation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5882251E292C280D00E83CDE /* CursorLocation.swift */; }; 588847632992A2A200996D95 /* CEWorkspaceFile.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588847622992A2A200996D95 /* CEWorkspaceFile.swift */; }; 588847692992ABCA00996D95 /* Array+SortURLs.swift in Sources */ = {isa = PBXBuildFile; fileRef = 588847682992ABCA00996D95 /* Array+SortURLs.swift */; }; 5894E59729FEF7740077E59C /* CEWorkspaceFile+Recursion.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5894E59629FEF7740077E59C /* CEWorkspaceFile+Recursion.swift */; }; @@ -774,7 +773,6 @@ 58822518292C280D00E83CDE /* UtilityAreaFilterTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaFilterTextField.swift; sourceTree = ""; }; 5882251A292C280D00E83CDE /* View+isHovering.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "View+isHovering.swift"; sourceTree = ""; }; 5882251C292C280D00E83CDE /* UtilityAreaViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaViewModel.swift; sourceTree = ""; }; - 5882251E292C280D00E83CDE /* CursorLocation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CursorLocation.swift; sourceTree = ""; }; 588847622992A2A200996D95 /* CEWorkspaceFile.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CEWorkspaceFile.swift; sourceTree = ""; }; 588847682992ABCA00996D95 /* Array+SortURLs.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Array+SortURLs.swift"; sourceTree = ""; }; 5894E59629FEF7740077E59C /* CEWorkspaceFile+Recursion.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "CEWorkspaceFile+Recursion.swift"; sourceTree = ""; }; @@ -1994,7 +1992,6 @@ 588224FF292C280D00E83CDE /* StatusBar */ = { isa = PBXGroup; children = ( - 5882251B292C280D00E83CDE /* Models */, 58822508292C280D00E83CDE /* Views */, ); path = StatusBar; @@ -2049,14 +2046,6 @@ path = Toolbar; sourceTree = ""; }; - 5882251B292C280D00E83CDE /* Models */ = { - isa = PBXGroup; - children = ( - 5882251E292C280D00E83CDE /* CursorLocation.swift */, - ); - path = Models; - sourceTree = ""; - }; 58822539292C333600E83CDE /* ViewModels */ = { isa = PBXGroup; children = ( @@ -3273,7 +3262,6 @@ 3000516C2BBD3A9500A98562 /* ServiceWrapper.swift in Sources */, 77A01E1F2BB33FB500F0EA38 /* CEWorkspaceSettingsView.swift in Sources */, 587B9DA029300ABD00AC7927 /* PanelDivider.swift in Sources */, - 58822534292C280D00E83CDE /* CursorLocation.swift in Sources */, 201169E52837B40300F92B46 /* SourceControlNavigatorRepositoryView.swift in Sources */, 587B9E6A29301D8F00AC7927 /* GitLabPermissions.swift in Sources */, B6EA1FF529DA380E001BF195 /* TextEditingSettingsView.swift in Sources */, diff --git a/CodeEdit/Features/StatusBar/Models/CursorLocation.swift b/CodeEdit/Features/StatusBar/Models/CursorLocation.swift deleted file mode 100644 index a3f7a764f1..0000000000 --- a/CodeEdit/Features/StatusBar/Models/CursorLocation.swift +++ /dev/null @@ -1,18 +0,0 @@ -// -// CursorLocation.swift -// CodeEditModules/StatusBar -// -// Created by Lukas Pistrol on 11.05.22. -// - -import Foundation - -/// The location (line, column) of the cursor in the editor view -/// -/// - Note: Not yet implemented -struct CursorLocation { - /// The current line the cursor is located at. - var line: Int - /// The current column the cursor is located at. - var column: Int -} diff --git a/Documentation.docc/App Window/StatusBarView.md b/Documentation.docc/App Window/StatusBarView.md index 82a29054a6..5f2aac1774 100644 --- a/Documentation.docc/App Window/StatusBarView.md +++ b/Documentation.docc/App Window/StatusBarView.md @@ -2,10 +2,6 @@ ## Topics -### Model - -- ``CursorLocation`` - ### Items - ``StatusBarMenuStyle`` From 6467f88fefda3da7fa3832e2016e1f4e471a9f47 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Sun, 12 May 2024 23:38:04 +0100 Subject: [PATCH 08/21] rename `StatusBarCursorLocationLabel` to `StatusBarCursorPositionLabel` --- CodeEdit.xcodeproj/project.pbxproj | 8 ++++---- ...tionLabel.swift => StatusBarCursorPositionLabel.swift} | 4 ++-- CodeEdit/Features/StatusBar/Views/StatusBarView.swift | 2 +- Documentation.docc/App Window/StatusBarView.md | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) rename CodeEdit/Features/StatusBar/Views/StatusBarItems/{StatusBarCursorLocationLabel.swift => StatusBarCursorPositionLabel.swift} (97%) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index b0b68bda8e..0441c14dfe 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -201,7 +201,7 @@ 58822528292C280D00E83CDE /* StatusBarEncodingSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5882250E292C280D00E83CDE /* StatusBarEncodingSelector.swift */; }; 58822529292C280D00E83CDE /* StatusBarLineEndSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5882250F292C280D00E83CDE /* StatusBarLineEndSelector.swift */; }; 5882252A292C280D00E83CDE /* StatusBarToggleUtilityAreaButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822510292C280D00E83CDE /* StatusBarToggleUtilityAreaButton.swift */; }; - 5882252B292C280D00E83CDE /* StatusBarCursorLocationLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822511292C280D00E83CDE /* StatusBarCursorLocationLabel.swift */; }; + 5882252B292C280D00E83CDE /* StatusBarCursorPositionLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822511292C280D00E83CDE /* StatusBarCursorPositionLabel.swift */; }; 5882252C292C280D00E83CDE /* UtilityAreaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822513292C280D00E83CDE /* UtilityAreaView.swift */; }; 5882252D292C280D00E83CDE /* UtilityAreaTerminalButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822515292C280D00E83CDE /* UtilityAreaTerminalButton.swift */; }; 5882252E292C280D00E83CDE /* UtilityAreaMaximizeButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822516292C280D00E83CDE /* UtilityAreaMaximizeButton.swift */; }; @@ -765,7 +765,7 @@ 5882250E292C280D00E83CDE /* StatusBarEncodingSelector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarEncodingSelector.swift; sourceTree = ""; }; 5882250F292C280D00E83CDE /* StatusBarLineEndSelector.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarLineEndSelector.swift; sourceTree = ""; }; 58822510292C280D00E83CDE /* StatusBarToggleUtilityAreaButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarToggleUtilityAreaButton.swift; sourceTree = ""; }; - 58822511292C280D00E83CDE /* StatusBarCursorLocationLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarCursorLocationLabel.swift; sourceTree = ""; }; + 58822511292C280D00E83CDE /* StatusBarCursorPositionLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarCursorPositionLabel.swift; sourceTree = ""; }; 58822513292C280D00E83CDE /* UtilityAreaView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaView.swift; sourceTree = ""; }; 58822515292C280D00E83CDE /* UtilityAreaTerminalButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaTerminalButton.swift; sourceTree = ""; }; 58822516292C280D00E83CDE /* UtilityAreaMaximizeButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaMaximizeButton.swift; sourceTree = ""; }; @@ -2016,7 +2016,7 @@ 5882250E292C280D00E83CDE /* StatusBarEncodingSelector.swift */, 5882250F292C280D00E83CDE /* StatusBarLineEndSelector.swift */, 58822510292C280D00E83CDE /* StatusBarToggleUtilityAreaButton.swift */, - 58822511292C280D00E83CDE /* StatusBarCursorLocationLabel.swift */, + 58822511292C280D00E83CDE /* StatusBarCursorPositionLabel.swift */, ); path = StatusBarItems; sourceTree = ""; @@ -3413,7 +3413,7 @@ 6C2C155A29B4F4CC00EA60A5 /* Variadic.swift in Sources */, 77A01E322BB4274B00F0EA38 /* TasksCEWorkspaceSettingsView.swift in Sources */, B6E41C8F29DE9CD80088F9F4 /* AccountsSettingsDetailsView.swift in Sources */, - 5882252B292C280D00E83CDE /* StatusBarCursorLocationLabel.swift in Sources */, + 5882252B292C280D00E83CDE /* StatusBarCursorPositionLabel.swift in Sources */, 5882252D292C280D00E83CDE /* UtilityAreaTerminalButton.swift in Sources */, 58798238292E30B90085B254 /* FeedbackWindowController.swift in Sources */, 587B9E6C29301D8F00AC7927 /* GitLabNamespace.swift in Sources */, diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorLocationLabel.swift b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorPositionLabel.swift similarity index 97% rename from CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorLocationLabel.swift rename to CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorPositionLabel.swift index faa4beccd3..f24b092606 100644 --- a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorLocationLabel.swift +++ b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorPositionLabel.swift @@ -1,5 +1,5 @@ // -// StatusBarCursorLocationLabel.swift +// StatusBarCursorPositionLabel.swift // CodeEdit // // Created by Lukas Pistrol on 22.03.22. @@ -8,7 +8,7 @@ import SwiftUI import CodeEditSourceEditor -struct StatusBarCursorLocationLabel: View { +struct StatusBarCursorPositionLabel: View { @Environment(\.controlActiveState) private var controlActive @Environment(\.modifierKeys) diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarView.swift b/CodeEdit/Features/StatusBar/Views/StatusBarView.swift index 99c1a88aa0..0cec5a1e70 100644 --- a/CodeEdit/Features/StatusBar/Views/StatusBarView.swift +++ b/CodeEdit/Features/StatusBar/Views/StatusBarView.swift @@ -36,7 +36,7 @@ struct StatusBarView: View { // StatusBarDivider() Spacer() HStack(alignment: .center, spacing: 10) { - StatusBarCursorLocationLabel() + StatusBarCursorPositionLabel() } StatusBarDivider() StatusBarToggleUtilityAreaButton() diff --git a/Documentation.docc/App Window/StatusBarView.md b/Documentation.docc/App Window/StatusBarView.md index 5f2aac1774..ceaa951085 100644 --- a/Documentation.docc/App Window/StatusBarView.md +++ b/Documentation.docc/App Window/StatusBarView.md @@ -10,4 +10,4 @@ - ``StatusBarEncodingSelector`` - ``StatusBarLineEndSelector`` - ``StatusBarToggleUtilityAreaButton`` -- ``StatusBarCursorLocationLabel`` +- ``StatusBarCursorPositionLabel`` From 71d30f75bae8eeff6cb736f167fd4c52684e3d48 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Sun, 12 May 2024 23:44:58 +0100 Subject: [PATCH 09/21] add `StatusBarViewModel` --- CodeEdit.xcodeproj/project.pbxproj | 12 ++++++++++++ .../Controllers/CodeEditWindowController.swift | 1 + .../Features/Documents/WorkspaceDocument.swift | 1 + .../ViewModels/StatusBarViewModel.swift | 18 ++++++++++++++++++ .../StatusBarBreakpointButton.swift | 8 +++----- .../StatusBarCursorPositionLabel.swift | 3 ++- Documentation.docc/App Window/StatusBarView.md | 4 ++++ 7 files changed, 41 insertions(+), 6 deletions(-) create mode 100644 CodeEdit/Features/StatusBar/ViewModels/StatusBarViewModel.swift diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 0441c14dfe..c4bf54b9bc 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -285,6 +285,7 @@ 661EF7B82BEE215300C3E577 /* ImageFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 661EF7B72BEE215300C3E577 /* ImageFileView.swift */; }; 661EF7BD2BEE215300C3E577 /* LoadingFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 661EF7BC2BEE215300C3E577 /* LoadingFileView.swift */; }; 669BC4082BED306400D1197C /* AnyFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 669BC4072BED306400D1197C /* AnyFileView.swift */; }; + 66AF6CE22BF17CC300D83C9D /* StatusBarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CE12BF17CC300D83C9D /* StatusBarViewModel.swift */; }; 66F2C8C42BEAA939004674F7 /* PDFFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66F2C8C32BEAA939004674F7 /* PDFFileView.swift */; }; 66F370342BEE537B00D3B823 /* NonTextFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66F370332BEE537B00D3B823 /* NonTextFileView.swift */; }; 6C049A372A49E2DB00D42923 /* DirectoryEventStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C049A362A49E2DB00D42923 /* DirectoryEventStream.swift */; }; @@ -849,6 +850,7 @@ 661EF7B72BEE215300C3E577 /* ImageFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageFileView.swift; sourceTree = ""; }; 661EF7BC2BEE215300C3E577 /* LoadingFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingFileView.swift; sourceTree = ""; }; 669BC4072BED306400D1197C /* AnyFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyFileView.swift; sourceTree = ""; }; + 66AF6CE12BF17CC300D83C9D /* StatusBarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarViewModel.swift; sourceTree = ""; }; 66F2C8C32BEAA939004674F7 /* PDFFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PDFFileView.swift; sourceTree = ""; }; 66F370332BEE537B00D3B823 /* NonTextFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonTextFileView.swift; sourceTree = ""; }; 6C049A362A49E2DB00D42923 /* DirectoryEventStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectoryEventStream.swift; sourceTree = ""; }; @@ -1992,6 +1994,7 @@ 588224FF292C280D00E83CDE /* StatusBar */ = { isa = PBXGroup; children = ( + 66AF6CE02BF17CB100D83C9D /* ViewModels */, 58822508292C280D00E83CDE /* Views */, ); path = StatusBar; @@ -2320,6 +2323,14 @@ path = FuzzySearch; sourceTree = ""; }; + 66AF6CE02BF17CB100D83C9D /* ViewModels */ = { + isa = PBXGroup; + children = ( + 66AF6CE12BF17CC300D83C9D /* StatusBarViewModel.swift */, + ); + path = ViewModels; + sourceTree = ""; + }; 6C092EDC2A53A63E00489202 /* Views */ = { isa = PBXGroup; children = ( @@ -3350,6 +3361,7 @@ 587B9E7329301D8F00AC7927 /* GitRouter.swift in Sources */, 6C2C156129B4F52F00EA60A5 /* SplitViewModifiers.swift in Sources */, 61A53A812B4449F00093BF8A /* WorkspaceDocument+Index.swift in Sources */, + 66AF6CE22BF17CC300D83C9D /* StatusBarViewModel.swift in Sources */, 201169DD2837B3AC00F92B46 /* SourceControlNavigatorToolbarBottom.swift in Sources */, 587B9E8B29301D8F00AC7927 /* GitHubAccount+deleteReference.swift in Sources */, 58798237292E30B90085B254 /* FeedbackView.swift in Sources */, diff --git a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift index 26c9955440..8aa2fc6063 100644 --- a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift +++ b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift @@ -88,6 +88,7 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate, Obs WorkspaceView() .environmentObject(workspace) .environmentObject(workspace.editorManager) + .environmentObject(workspace.statusBarViewModel) .environmentObject(workspace.utilityAreaModel) } } diff --git a/CodeEdit/Features/Documents/WorkspaceDocument.swift b/CodeEdit/Features/Documents/WorkspaceDocument.swift index dff436bddb..f1fb5e725e 100644 --- a/CodeEdit/Features/Documents/WorkspaceDocument.swift +++ b/CodeEdit/Features/Documents/WorkspaceDocument.swift @@ -30,6 +30,7 @@ final class WorkspaceDocument: NSDocument, ObservableObject, NSToolbarDelegate { } } + var statusBarViewModel = StatusBarViewModel() var utilityAreaModel = UtilityAreaViewModel() var searchState: SearchState? var quickOpenViewModel: QuickOpenViewModel? diff --git a/CodeEdit/Features/StatusBar/ViewModels/StatusBarViewModel.swift b/CodeEdit/Features/StatusBar/ViewModels/StatusBarViewModel.swift new file mode 100644 index 0000000000..4fc0735c37 --- /dev/null +++ b/CodeEdit/Features/StatusBar/ViewModels/StatusBarViewModel.swift @@ -0,0 +1,18 @@ +// +// StatusBarViewModel.swift +// CodeEdit +// +// Created by Paul Ebose on 2024/5/12. +// + +import SwiftUI + +final class StatusBarViewModel: ObservableObject { + + /// Indicates whether the breakpoint is enabled or not. + @Published var isBreakpointEnabled = true + + /// The font style of items shown in the status bar. + private(set) var statusBarFont = Font.system(size: 11, weight: .medium) + +} diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarBreakpointButton.swift b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarBreakpointButton.swift index d3d2778b13..3743412e34 100644 --- a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarBreakpointButton.swift +++ b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarBreakpointButton.swift @@ -9,17 +9,15 @@ import SwiftUI import CodeEditSymbols struct StatusBarBreakpointButton: View { - // @EnvironmentObject private var utilityAreaViewModel: UtilityAreaViewModel + @EnvironmentObject private var statusBarViewModel: StatusBarViewModel @State private var isBreakpointEnabled = false var body: some View { Button { - // utilityAreaViewModel.isBreakpointEnabled.toggle() - isBreakpointEnabled.toggle() + statusBarViewModel.isBreakpointEnabled.toggle() } label: { - // if utilityAreaViewModel.isBreakpointEnabled { - if isBreakpointEnabled { + if statusBarViewModel.isBreakpointEnabled { Image.breakpointFill .foregroundColor(.accentColor) } else { diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorPositionLabel.swift b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorPositionLabel.swift index f24b092606..df4cf52280 100644 --- a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorPositionLabel.swift +++ b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarCursorPositionLabel.swift @@ -14,6 +14,7 @@ struct StatusBarCursorPositionLabel: View { @Environment(\.modifierKeys) private var modifierKeys + @EnvironmentObject private var statusBarViewModel: StatusBarViewModel @EnvironmentObject private var utilityAreaViewModel: UtilityAreaViewModel @EnvironmentObject private var editorManager: EditorManager @@ -87,7 +88,7 @@ struct StatusBarCursorPositionLabel: View { EmptyView() } } - .font(.system(size: 11, weight: .medium)) + .font(statusBarViewModel.statusBarFont) .foregroundColor(foregroundColor) .fixedSize() .lineLimit(1) diff --git a/Documentation.docc/App Window/StatusBarView.md b/Documentation.docc/App Window/StatusBarView.md index ceaa951085..c865b80836 100644 --- a/Documentation.docc/App Window/StatusBarView.md +++ b/Documentation.docc/App Window/StatusBarView.md @@ -2,6 +2,10 @@ ## Topics +### View Model + +- ``StatusBarViewModel`` + ### Items - ``StatusBarMenuStyle`` From 60a2e65a591c222bda2e34fc62e9cd2e2dd57e84 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Sun, 12 May 2024 23:52:38 +0100 Subject: [PATCH 10/21] show non-text file info in the status bar --- CodeEdit.xcodeproj/project.pbxproj | 4 ++ .../Editor/Views/EditorAreaFileView.swift | 6 ++- .../Features/Editor/Views/ImageFileView.swift | 24 +++++++++++ .../Editor/Views/NonTextFileView.swift | 18 ++++++++ .../ViewModels/StatusBarViewModel.swift | 9 ++++ .../StatusBarFileInfoView.swift | 41 +++++++++++++++++++ .../StatusBar/Views/StatusBarView.swift | 5 ++- 7 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index c4bf54b9bc..f3ca4c08de 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -286,6 +286,7 @@ 661EF7BD2BEE215300C3E577 /* LoadingFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 661EF7BC2BEE215300C3E577 /* LoadingFileView.swift */; }; 669BC4082BED306400D1197C /* AnyFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 669BC4072BED306400D1197C /* AnyFileView.swift */; }; 66AF6CE22BF17CC300D83C9D /* StatusBarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CE12BF17CC300D83C9D /* StatusBarViewModel.swift */; }; + 66AF6CE42BF17F6800D83C9D /* StatusBarFileInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CE32BF17F6800D83C9D /* StatusBarFileInfoView.swift */; }; 66F2C8C42BEAA939004674F7 /* PDFFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66F2C8C32BEAA939004674F7 /* PDFFileView.swift */; }; 66F370342BEE537B00D3B823 /* NonTextFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66F370332BEE537B00D3B823 /* NonTextFileView.swift */; }; 6C049A372A49E2DB00D42923 /* DirectoryEventStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C049A362A49E2DB00D42923 /* DirectoryEventStream.swift */; }; @@ -851,6 +852,7 @@ 661EF7BC2BEE215300C3E577 /* LoadingFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoadingFileView.swift; sourceTree = ""; }; 669BC4072BED306400D1197C /* AnyFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyFileView.swift; sourceTree = ""; }; 66AF6CE12BF17CC300D83C9D /* StatusBarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarViewModel.swift; sourceTree = ""; }; + 66AF6CE32BF17F6800D83C9D /* StatusBarFileInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarFileInfoView.swift; sourceTree = ""; }; 66F2C8C32BEAA939004674F7 /* PDFFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PDFFileView.swift; sourceTree = ""; }; 66F370332BEE537B00D3B823 /* NonTextFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonTextFileView.swift; sourceTree = ""; }; 6C049A362A49E2DB00D42923 /* DirectoryEventStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectoryEventStream.swift; sourceTree = ""; }; @@ -2020,6 +2022,7 @@ 5882250F292C280D00E83CDE /* StatusBarLineEndSelector.swift */, 58822510292C280D00E83CDE /* StatusBarToggleUtilityAreaButton.swift */, 58822511292C280D00E83CDE /* StatusBarCursorPositionLabel.swift */, + 66AF6CE32BF17F6800D83C9D /* StatusBarFileInfoView.swift */, ); path = StatusBarItems; sourceTree = ""; @@ -3313,6 +3316,7 @@ 587B9E6929301D8F00AC7927 /* GitLabEvent.swift in Sources */, B60718442B17DBE5009CDAB4 /* SourceControlNavigatorRepositoryItem.swift in Sources */, B67DB0F92AFDF638002DC647 /* IconButtonStyle.swift in Sources */, + 66AF6CE42BF17F6800D83C9D /* StatusBarFileInfoView.swift in Sources */, 587B9E5E29301D8F00AC7927 /* GitLabCommitRouter.swift in Sources */, 58F2EB0D292FB2B0004A9BDE /* ThemeSettings.swift in Sources */, 587B9D9F29300ABD00AC7927 /* SegmentedControl.swift in Sources */, diff --git a/CodeEdit/Features/Editor/Views/EditorAreaFileView.swift b/CodeEdit/Features/Editor/Views/EditorAreaFileView.swift index 4746c6b825..37d0a63baa 100644 --- a/CodeEdit/Features/Editor/Views/EditorAreaFileView.swift +++ b/CodeEdit/Features/Editor/Views/EditorAreaFileView.swift @@ -13,8 +13,8 @@ import SwiftUI struct EditorAreaFileView: View { @EnvironmentObject private var editorManager: EditorManager - @EnvironmentObject private var editor: Editor + @EnvironmentObject private var statusBarViewModel: StatusBarViewModel @Environment(\.edgeInsets) private var edgeInsets @@ -33,6 +33,10 @@ struct EditorAreaFileView: View { NonTextFileView(fileDocument: document) .padding(.top, edgeInsets.top - 1.74) // Use the magic number to fine-tune its appearance. .padding(.bottom, StatusBarView.height + 1.26) // Use the magic number to fine-tune its appearance. + .onDisappear { + statusBarViewModel.dimensions = nil + statusBarViewModel.fileSize = nil + } } } else { diff --git a/CodeEdit/Features/Editor/Views/ImageFileView.swift b/CodeEdit/Features/Editor/Views/ImageFileView.swift index 044f4ed8da..352f4bab29 100644 --- a/CodeEdit/Features/Editor/Views/ImageFileView.swift +++ b/CodeEdit/Features/Editor/Views/ImageFileView.swift @@ -27,6 +27,16 @@ struct ImageFileView: View { self.imageURL = imageURL } + @EnvironmentObject private var editorManager: EditorManager + @EnvironmentObject private var statusBarViewModel: StatusBarViewModel + + private func updateStatusBarInfo(fileURL: URL, dimensions: (Int, Int)? = nil) { + statusBarViewModel.dimensions = dimensions + if let fileSize = try? fileURL.resourceValues(forKeys: [.fileSizeKey]).fileSize { + statusBarViewModel.fileSize = fileSize + } + } + var body: some View { if let nsImage = NSImage(contentsOf: imageURL), let imageReps = nsImage.representations.first { @@ -43,6 +53,20 @@ struct ImageFileView: View { ) } .frame(width: proxy.size.width, height: proxy.size.height) + .onAppear { + updateStatusBarInfo( + fileURL: imageURL, + dimensions: (imageReps.pixelsWide, imageReps.pixelsHigh) + ) + } + .onChange(of: editorManager.activeEditor.selectedTab) { newTab in + if let newTab { + updateStatusBarInfo( + fileURL: newTab.file.url, + dimensions: (imageReps.pixelsWide, imageReps.pixelsHigh) + ) + } + } } } else { Text("Cannot preview image") diff --git a/CodeEdit/Features/Editor/Views/NonTextFileView.swift b/CodeEdit/Features/Editor/Views/NonTextFileView.swift index cb5c776bcb..937b330223 100644 --- a/CodeEdit/Features/Editor/Views/NonTextFileView.swift +++ b/CodeEdit/Features/Editor/Views/NonTextFileView.swift @@ -17,6 +17,16 @@ struct NonTextFileView: View { /// The file document you wish to open. let fileDocument: CodeFileDocument + @EnvironmentObject private var editorManager: EditorManager + @EnvironmentObject private var statusBarViewModel: StatusBarViewModel + + private func updateStatusBarInfo(fileURL: URL, dimensions: (Int, Int)? = nil) { + statusBarViewModel.dimensions = dimensions + if let fileSize = try? fileURL.resourceValues(forKeys: [.fileSizeKey]).fileSize { + statusBarViewModel.fileSize = fileSize + } + } + var body: some View { if let fileURL = fileDocument.fileURL { @@ -27,9 +37,17 @@ struct NonTextFileView: View { case .some(.pdf): PDFFileView(fileURL) + .onAppear { updateStatusBarInfo(fileURL: fileURL) } + .onChange(of: editorManager.activeEditor.selectedTab) { newTab in + if let newTab { updateStatusBarInfo(fileURL: newTab.file.url) } + } default: AnyFileView(fileURL) + .onAppear { updateStatusBarInfo(fileURL: fileURL) } + .onChange(of: editorManager.activeEditor.selectedTab) { newTab in + if let newTab { updateStatusBarInfo(fileURL: newTab.file.url) } + } } } else { diff --git a/CodeEdit/Features/StatusBar/ViewModels/StatusBarViewModel.swift b/CodeEdit/Features/StatusBar/ViewModels/StatusBarViewModel.swift index 4fc0735c37..0e72e71435 100644 --- a/CodeEdit/Features/StatusBar/ViewModels/StatusBarViewModel.swift +++ b/CodeEdit/Features/StatusBar/ViewModels/StatusBarViewModel.swift @@ -9,10 +9,19 @@ import SwiftUI final class StatusBarViewModel: ObservableObject { + /// The file size of the currently opened file. + @Published var fileSize: Int? + + /// The dimensions (width x height) of the currently opened media file. + @Published var dimensions: (Int, Int)? + /// Indicates whether the breakpoint is enabled or not. @Published var isBreakpointEnabled = true /// The font style of items shown in the status bar. private(set) var statusBarFont = Font.system(size: 11, weight: .medium) + /// The color of the text shown in the status bar. + private(set) var foregroundStyle = Color.secondary + } diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift new file mode 100644 index 0000000000..469263fec8 --- /dev/null +++ b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift @@ -0,0 +1,41 @@ +// +// StatusBarFileInfoView.swift +// CodeEdit +// +// Created by Paul Ebose on 2024/5/12. +// + +import SwiftUI + +/// Shows media information about the currently opened file. +/// +/// This currently shows the file size and media dimensions, if available. +struct StatusBarFileInfoView: View { + + @EnvironmentObject private var statusBarViewModel: StatusBarViewModel + + private let numberStyle = IntegerFormatStyle(locale: Locale(identifier: "en_US")).grouping(.never) + + var body: some View { + + HStack(spacing: 15) { + + if let dimensions = statusBarViewModel.dimensions { + var width = numberStyle.format(dimensions.0) + var height = numberStyle.format(dimensions.1) + + Text("\(width)x\(height)") + .font(statusBarViewModel.statusBarFont) + .foregroundStyle(statusBarViewModel.foregroundStyle) + } + + if let fileSize = statusBarViewModel.fileSize { + Text(fileSize.formatted(.byteCount(style: .memory))) + .font(statusBarViewModel.statusBarFont) + .foregroundStyle(statusBarViewModel.foregroundStyle) + } + + } + } + +} diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarView.swift b/CodeEdit/Features/StatusBar/Views/StatusBarView.swift index 0cec5a1e70..a40f4d9532 100644 --- a/CodeEdit/Features/StatusBar/Views/StatusBarView.swift +++ b/CodeEdit/Features/StatusBar/Views/StatusBarView.swift @@ -11,7 +11,9 @@ import SwiftUI /// /// A View that lives on the bottom of the window and offers information /// about compilation errors/warnings, git, cursor position in text, -/// indentation width (in spaces), text encoding and linebreak +/// indentation width (in spaces), text encoding and linebreak. +/// +/// Also information about the file size and dimensions, if available. /// /// Additionally it offers a togglable/resizable drawer which can /// host a terminal or additional debug information @@ -35,6 +37,7 @@ struct StatusBarView: View { // StatusBarBreakpointButton() // StatusBarDivider() Spacer() + StatusBarFileInfoView() HStack(alignment: .center, spacing: 10) { StatusBarCursorPositionLabel() } From d83152ac9d436cabcaa520e36443d42454bc49db Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Sun, 12 May 2024 23:53:07 +0100 Subject: [PATCH 11/21] fix unpredictable image dimensions in status bar --- CodeEdit/Features/Editor/Views/ImageFileView.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CodeEdit/Features/Editor/Views/ImageFileView.swift b/CodeEdit/Features/Editor/Views/ImageFileView.swift index 352f4bab29..47a2e6c91b 100644 --- a/CodeEdit/Features/Editor/Views/ImageFileView.swift +++ b/CodeEdit/Features/Editor/Views/ImageFileView.swift @@ -60,10 +60,10 @@ struct ImageFileView: View { ) } .onChange(of: editorManager.activeEditor.selectedTab) { newTab in - if let newTab { + if let newTab, let newTabImageReps = NSImage(contentsOf: newTab.file.url)?.representations.first { updateStatusBarInfo( fileURL: newTab.file.url, - dimensions: (imageReps.pixelsWide, imageReps.pixelsHigh) + dimensions: (newTabImageReps.pixelsWide, newTabImageReps.pixelsHigh) ) } } From 20837cb13f97d73c0ca473c4b17ec7765907f52c Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Mon, 13 May 2024 00:08:44 +0100 Subject: [PATCH 12/21] add UpdateStatusBarInfo view modifier to clean up implementation --- CodeEdit.xcodeproj/project.pbxproj | 12 ++++ .../Features/Editor/Views/ImageFileView.swift | 25 +------- .../Editor/Views/NonTextFileView.swift | 18 +----- .../ViewModels/StatusBarViewModel.swift | 2 +- .../ViewModifiers/UpdateStatusBarInfo.swift | 64 +++++++++++++++++++ .../App Window/StatusBarView.md | 4 ++ 6 files changed, 85 insertions(+), 40 deletions(-) create mode 100644 CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index f3ca4c08de..cb0c4347de 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -287,6 +287,7 @@ 669BC4082BED306400D1197C /* AnyFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 669BC4072BED306400D1197C /* AnyFileView.swift */; }; 66AF6CE22BF17CC300D83C9D /* StatusBarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CE12BF17CC300D83C9D /* StatusBarViewModel.swift */; }; 66AF6CE42BF17F6800D83C9D /* StatusBarFileInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CE32BF17F6800D83C9D /* StatusBarFileInfoView.swift */; }; + 66AF6CE72BF17FFB00D83C9D /* UpdateStatusBarInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CE62BF17FFB00D83C9D /* UpdateStatusBarInfo.swift */; }; 66F2C8C42BEAA939004674F7 /* PDFFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66F2C8C32BEAA939004674F7 /* PDFFileView.swift */; }; 66F370342BEE537B00D3B823 /* NonTextFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66F370332BEE537B00D3B823 /* NonTextFileView.swift */; }; 6C049A372A49E2DB00D42923 /* DirectoryEventStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C049A362A49E2DB00D42923 /* DirectoryEventStream.swift */; }; @@ -853,6 +854,7 @@ 669BC4072BED306400D1197C /* AnyFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AnyFileView.swift; sourceTree = ""; }; 66AF6CE12BF17CC300D83C9D /* StatusBarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarViewModel.swift; sourceTree = ""; }; 66AF6CE32BF17F6800D83C9D /* StatusBarFileInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarFileInfoView.swift; sourceTree = ""; }; + 66AF6CE62BF17FFB00D83C9D /* UpdateStatusBarInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateStatusBarInfo.swift; sourceTree = ""; }; 66F2C8C32BEAA939004674F7 /* PDFFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PDFFileView.swift; sourceTree = ""; }; 66F370332BEE537B00D3B823 /* NonTextFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonTextFileView.swift; sourceTree = ""; }; 6C049A362A49E2DB00D42923 /* DirectoryEventStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectoryEventStream.swift; sourceTree = ""; }; @@ -1996,6 +1998,7 @@ 588224FF292C280D00E83CDE /* StatusBar */ = { isa = PBXGroup; children = ( + 66AF6CE52BF17FEF00D83C9D /* ViewModifiers */, 66AF6CE02BF17CB100D83C9D /* ViewModels */, 58822508292C280D00E83CDE /* Views */, ); @@ -2334,6 +2337,14 @@ path = ViewModels; sourceTree = ""; }; + 66AF6CE52BF17FEF00D83C9D /* ViewModifiers */ = { + isa = PBXGroup; + children = ( + 66AF6CE62BF17FFB00D83C9D /* UpdateStatusBarInfo.swift */, + ); + path = ViewModifiers; + sourceTree = ""; + }; 6C092EDC2A53A63E00489202 /* Views */ = { isa = PBXGroup; children = ( @@ -3529,6 +3540,7 @@ 587B9E8029301D8F00AC7927 /* GitHubConfiguration.swift in Sources */, 58822524292C280D00E83CDE /* StatusBarView.swift in Sources */, 581550D429FBD37D00684881 /* ProjectNavigatorToolbarBottom.swift in Sources */, + 66AF6CE72BF17FFB00D83C9D /* UpdateStatusBarInfo.swift in Sources */, 587B9E7E29301D8F00AC7927 /* GitHubGistRouter.swift in Sources */, B6AB09A52AAAC00F0003A3A6 /* EditorTabBarTrailingAccessories.swift in Sources */, 04BA7C0B2AE2A2D100584E1C /* GitBranch.swift in Sources */, diff --git a/CodeEdit/Features/Editor/Views/ImageFileView.swift b/CodeEdit/Features/Editor/Views/ImageFileView.swift index 47a2e6c91b..3f9a160df5 100644 --- a/CodeEdit/Features/Editor/Views/ImageFileView.swift +++ b/CodeEdit/Features/Editor/Views/ImageFileView.swift @@ -27,16 +27,6 @@ struct ImageFileView: View { self.imageURL = imageURL } - @EnvironmentObject private var editorManager: EditorManager - @EnvironmentObject private var statusBarViewModel: StatusBarViewModel - - private func updateStatusBarInfo(fileURL: URL, dimensions: (Int, Int)? = nil) { - statusBarViewModel.dimensions = dimensions - if let fileSize = try? fileURL.resourceValues(forKeys: [.fileSizeKey]).fileSize { - statusBarViewModel.fileSize = fileSize - } - } - var body: some View { if let nsImage = NSImage(contentsOf: imageURL), let imageReps = nsImage.representations.first { @@ -51,22 +41,9 @@ struct ImageFileView: View { maxWidth: min(pixelWidth, proxy.size.width, nsImage.size.width), maxHeight: min(pixelHeight, proxy.size.height, nsImage.size.height) ) + } .frame(width: proxy.size.width, height: proxy.size.height) - .onAppear { - updateStatusBarInfo( - fileURL: imageURL, - dimensions: (imageReps.pixelsWide, imageReps.pixelsHigh) - ) - } - .onChange(of: editorManager.activeEditor.selectedTab) { newTab in - if let newTab, let newTabImageReps = NSImage(contentsOf: newTab.file.url)?.representations.first { - updateStatusBarInfo( - fileURL: newTab.file.url, - dimensions: (newTabImageReps.pixelsWide, newTabImageReps.pixelsHigh) - ) - } - } } } else { Text("Cannot preview image") diff --git a/CodeEdit/Features/Editor/Views/NonTextFileView.swift b/CodeEdit/Features/Editor/Views/NonTextFileView.swift index 937b330223..7bfb8e571c 100644 --- a/CodeEdit/Features/Editor/Views/NonTextFileView.swift +++ b/CodeEdit/Features/Editor/Views/NonTextFileView.swift @@ -20,13 +20,6 @@ struct NonTextFileView: View { @EnvironmentObject private var editorManager: EditorManager @EnvironmentObject private var statusBarViewModel: StatusBarViewModel - private func updateStatusBarInfo(fileURL: URL, dimensions: (Int, Int)? = nil) { - statusBarViewModel.dimensions = dimensions - if let fileSize = try? fileURL.resourceValues(forKeys: [.fileSizeKey]).fileSize { - statusBarViewModel.fileSize = fileSize - } - } - var body: some View { if let fileURL = fileDocument.fileURL { @@ -34,20 +27,15 @@ struct NonTextFileView: View { switch fileDocument.utType { case .some(.image): ImageFileView(fileURL) + .modifier(UpdateStatusBarInfo(withURL: fileURL)) case .some(.pdf): PDFFileView(fileURL) - .onAppear { updateStatusBarInfo(fileURL: fileURL) } - .onChange(of: editorManager.activeEditor.selectedTab) { newTab in - if let newTab { updateStatusBarInfo(fileURL: newTab.file.url) } - } + .modifier(UpdateStatusBarInfo(withURL: fileURL)) default: AnyFileView(fileURL) - .onAppear { updateStatusBarInfo(fileURL: fileURL) } - .onChange(of: editorManager.activeEditor.selectedTab) { newTab in - if let newTab { updateStatusBarInfo(fileURL: newTab.file.url) } - } + .modifier(UpdateStatusBarInfo(withURL: fileURL)) } } else { diff --git a/CodeEdit/Features/StatusBar/ViewModels/StatusBarViewModel.swift b/CodeEdit/Features/StatusBar/ViewModels/StatusBarViewModel.swift index 0e72e71435..f81083a5ac 100644 --- a/CodeEdit/Features/StatusBar/ViewModels/StatusBarViewModel.swift +++ b/CodeEdit/Features/StatusBar/ViewModels/StatusBarViewModel.swift @@ -12,7 +12,7 @@ final class StatusBarViewModel: ObservableObject { /// The file size of the currently opened file. @Published var fileSize: Int? - /// The dimensions (width x height) of the currently opened media file. + /// The dimensions (width x height) of the currently opened image. @Published var dimensions: (Int, Int)? /// Indicates whether the breakpoint is enabled or not. diff --git a/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift b/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift new file mode 100644 index 0000000000..6316745ae3 --- /dev/null +++ b/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift @@ -0,0 +1,64 @@ +// +// UpdateStatusBarInfo.swift +// CodeEdit +// +// Created by Paul Ebose on 2024/5/12. +// + +import SwiftUI + +/// Updates ``StatusBarFileInfoView``'s `fileSize` and `dimensions`. +/// ```swift +/// FileView +/// .modifier(UpdateStatusBarInfo(with)) +/// ``` +struct UpdateStatusBarInfo: ViewModifier { + + /// The URL of the file to compute information from. + let withURL: URL + + @EnvironmentObject private var editorManager: EditorManager + @EnvironmentObject private var editor: Editor + @EnvironmentObject private var statusBarViewModel: StatusBarViewModel + + /// This is returned by ``UpdateStatusBarInfo`` `.computeStatusBarInfo`. + private struct ComputedStatusBarInfo { + let fileSize: Int + let dimensions: (Int, Int)? + } + + /// Compute information that can be used to update properties in ``StatusBarFileInfoView``. + /// - Parameter url: URL of the file to compute information from. + /// - Returns: The file size and its image dimensions (if any). + private func computeStatusBarInfo(url: URL) -> ComputedStatusBarInfo? { + guard let resourceValues = try? url.resourceValues(forKeys: [.contentTypeKey, .fileSizeKey]), + let fileSize = resourceValues.fileSize, + let contentType = resourceValues.contentType + else { + return nil + } + + if contentType.conforms(to: .image), let imageReps = NSImage(contentsOf: url)?.representations.first { + let dimensions = (imageReps.pixelsWide, imageReps.pixelsHigh) + return ComputedStatusBarInfo(fileSize: fileSize, dimensions: dimensions) + } else { // non-image file + return ComputedStatusBarInfo(fileSize: fileSize, dimensions: nil) + } + } + + func body(content: Content) -> some View { + content + .onAppear { + let statusBarInfo = computeStatusBarInfo(url: withURL) + statusBarViewModel.fileSize = statusBarInfo?.fileSize + statusBarViewModel.dimensions = statusBarInfo?.dimensions + } + .onChange(of: editorManager.activeEditor.selectedTab) { newTab in + guard let newTab else { return } + let statusBarInfo = computeStatusBarInfo(url: newTab.file.url) + statusBarViewModel.fileSize = statusBarInfo?.fileSize + statusBarViewModel.dimensions = statusBarInfo?.dimensions + } + } + +} diff --git a/Documentation.docc/App Window/StatusBarView.md b/Documentation.docc/App Window/StatusBarView.md index c865b80836..5d7b0b337b 100644 --- a/Documentation.docc/App Window/StatusBarView.md +++ b/Documentation.docc/App Window/StatusBarView.md @@ -6,6 +6,10 @@ - ``StatusBarViewModel`` +### View Modifiers + +- ``UpdateStatusBarInfo`` + ### Items - ``StatusBarMenuStyle`` From c3f2138e39f836350b703307690587fe88f53676 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Mon, 13 May 2024 00:09:26 +0100 Subject: [PATCH 13/21] move the `NonTextFileView.onDisappear` modifier to inside the view --- .../Editor/Views/EditorAreaFileView.swift | 5 --- .../Editor/Views/NonTextFileView.swift | 44 +++++++++++-------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/CodeEdit/Features/Editor/Views/EditorAreaFileView.swift b/CodeEdit/Features/Editor/Views/EditorAreaFileView.swift index 37d0a63baa..18dad183f4 100644 --- a/CodeEdit/Features/Editor/Views/EditorAreaFileView.swift +++ b/CodeEdit/Features/Editor/Views/EditorAreaFileView.swift @@ -14,7 +14,6 @@ struct EditorAreaFileView: View { @EnvironmentObject private var editorManager: EditorManager @EnvironmentObject private var editor: Editor - @EnvironmentObject private var statusBarViewModel: StatusBarViewModel @Environment(\.edgeInsets) private var edgeInsets @@ -33,10 +32,6 @@ struct EditorAreaFileView: View { NonTextFileView(fileDocument: document) .padding(.top, edgeInsets.top - 1.74) // Use the magic number to fine-tune its appearance. .padding(.bottom, StatusBarView.height + 1.26) // Use the magic number to fine-tune its appearance. - .onDisappear { - statusBarViewModel.dimensions = nil - statusBarViewModel.fileSize = nil - } } } else { diff --git a/CodeEdit/Features/Editor/Views/NonTextFileView.swift b/CodeEdit/Features/Editor/Views/NonTextFileView.swift index 7bfb8e571c..f067313f58 100644 --- a/CodeEdit/Features/Editor/Views/NonTextFileView.swift +++ b/CodeEdit/Features/Editor/Views/NonTextFileView.swift @@ -22,27 +22,33 @@ struct NonTextFileView: View { var body: some View { - if let fileURL = fileDocument.fileURL { - - switch fileDocument.utType { - case .some(.image): - ImageFileView(fileURL) - .modifier(UpdateStatusBarInfo(withURL: fileURL)) - - case .some(.pdf): - PDFFileView(fileURL) - .modifier(UpdateStatusBarInfo(withURL: fileURL)) - - default: - AnyFileView(fileURL) - .modifier(UpdateStatusBarInfo(withURL: fileURL)) - } - - } else { - ZStack { - Text("Cannot retrieve URL to the file you opened.") + Group { + if let fileURL = fileDocument.fileURL { + + switch fileDocument.utType { + case .some(.image): + ImageFileView(fileURL) + .modifier(UpdateStatusBarInfo(withURL: fileURL)) + + case .some(.pdf): + PDFFileView(fileURL) + .modifier(UpdateStatusBarInfo(withURL: fileURL)) + + default: + AnyFileView(fileURL) + .modifier(UpdateStatusBarInfo(withURL: fileURL)) + } + + } else { + ZStack { + Text("Cannot retrieve URL to the file you opened.") + } } } + .onDisappear { + statusBarViewModel.dimensions = nil + statusBarViewModel.fileSize = nil + } } } From 9b0318186290b2da6891e2c43a75f1511a8cff9f Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Mon, 13 May 2024 00:11:30 +0100 Subject: [PATCH 14/21] change `StatusBarViewModel.dimensions` from tuple to struct --- CodeEdit.xcodeproj/project.pbxproj | 12 ++++++++++++ .../StatusBar/Models/ImageDimensions.swift | 14 ++++++++++++++ .../StatusBar/ViewModels/StatusBarViewModel.swift | 2 +- .../ViewModifiers/UpdateStatusBarInfo.swift | 4 ++-- .../StatusBarItems/StatusBarFileInfoView.swift | 4 ++-- Documentation.docc/App Window/StatusBarView.md | 4 ++++ 6 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 CodeEdit/Features/StatusBar/Models/ImageDimensions.swift diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index cb0c4347de..88d39b399a 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -288,6 +288,7 @@ 66AF6CE22BF17CC300D83C9D /* StatusBarViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CE12BF17CC300D83C9D /* StatusBarViewModel.swift */; }; 66AF6CE42BF17F6800D83C9D /* StatusBarFileInfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CE32BF17F6800D83C9D /* StatusBarFileInfoView.swift */; }; 66AF6CE72BF17FFB00D83C9D /* UpdateStatusBarInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CE62BF17FFB00D83C9D /* UpdateStatusBarInfo.swift */; }; + 66AF6CF02BF183CA00D83C9D /* ImageDimensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66AF6CEF2BF183CA00D83C9D /* ImageDimensions.swift */; }; 66F2C8C42BEAA939004674F7 /* PDFFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66F2C8C32BEAA939004674F7 /* PDFFileView.swift */; }; 66F370342BEE537B00D3B823 /* NonTextFileView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66F370332BEE537B00D3B823 /* NonTextFileView.swift */; }; 6C049A372A49E2DB00D42923 /* DirectoryEventStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6C049A362A49E2DB00D42923 /* DirectoryEventStream.swift */; }; @@ -855,6 +856,7 @@ 66AF6CE12BF17CC300D83C9D /* StatusBarViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarViewModel.swift; sourceTree = ""; }; 66AF6CE32BF17F6800D83C9D /* StatusBarFileInfoView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StatusBarFileInfoView.swift; sourceTree = ""; }; 66AF6CE62BF17FFB00D83C9D /* UpdateStatusBarInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UpdateStatusBarInfo.swift; sourceTree = ""; }; + 66AF6CEF2BF183CA00D83C9D /* ImageDimensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageDimensions.swift; sourceTree = ""; }; 66F2C8C32BEAA939004674F7 /* PDFFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PDFFileView.swift; sourceTree = ""; }; 66F370332BEE537B00D3B823 /* NonTextFileView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonTextFileView.swift; sourceTree = ""; }; 6C049A362A49E2DB00D42923 /* DirectoryEventStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DirectoryEventStream.swift; sourceTree = ""; }; @@ -1998,6 +2000,7 @@ 588224FF292C280D00E83CDE /* StatusBar */ = { isa = PBXGroup; children = ( + 66AF6CEE2BF183C500D83C9D /* Models */, 66AF6CE52BF17FEF00D83C9D /* ViewModifiers */, 66AF6CE02BF17CB100D83C9D /* ViewModels */, 58822508292C280D00E83CDE /* Views */, @@ -2345,6 +2348,14 @@ path = ViewModifiers; sourceTree = ""; }; + 66AF6CEE2BF183C500D83C9D /* Models */ = { + isa = PBXGroup; + children = ( + 66AF6CEF2BF183CA00D83C9D /* ImageDimensions.swift */, + ); + path = Models; + sourceTree = ""; + }; 6C092EDC2A53A63E00489202 /* Views */ = { isa = PBXGroup; children = ( @@ -3621,6 +3632,7 @@ 77A01E8E2BC9A09C00F0EA38 /* EditCETaskView.swift in Sources */, 58D01C97293167DC00C5B6B4 /* String+SHA256.swift in Sources */, B6EA1FFD29DB792C001BF195 /* ThemeSettingsColorPreview.swift in Sources */, + 66AF6CF02BF183CA00D83C9D /* ImageDimensions.swift in Sources */, 2806E904297958B9000040F4 /* ContributorRowView.swift in Sources */, 3000516A2BBD3A8200A98562 /* ServiceType.swift in Sources */, 6C578D8C29CD372700DC73B2 /* ExtensionCommands.swift in Sources */, diff --git a/CodeEdit/Features/StatusBar/Models/ImageDimensions.swift b/CodeEdit/Features/StatusBar/Models/ImageDimensions.swift new file mode 100644 index 0000000000..7d652824bf --- /dev/null +++ b/CodeEdit/Features/StatusBar/Models/ImageDimensions.swift @@ -0,0 +1,14 @@ +// +// ImageDimensions.swift +// CodeEdit +// +// Created by Paul Ebose on 2024/5/13. +// + +import Foundation + +/// Helper struct used to store the (width x height) of the currently opened image. +struct ImageDimensions { + var width: Int + var height: Int +} diff --git a/CodeEdit/Features/StatusBar/ViewModels/StatusBarViewModel.swift b/CodeEdit/Features/StatusBar/ViewModels/StatusBarViewModel.swift index f81083a5ac..c7f00ae929 100644 --- a/CodeEdit/Features/StatusBar/ViewModels/StatusBarViewModel.swift +++ b/CodeEdit/Features/StatusBar/ViewModels/StatusBarViewModel.swift @@ -13,7 +13,7 @@ final class StatusBarViewModel: ObservableObject { @Published var fileSize: Int? /// The dimensions (width x height) of the currently opened image. - @Published var dimensions: (Int, Int)? + @Published var dimensions: ImageDimensions? /// Indicates whether the breakpoint is enabled or not. @Published var isBreakpointEnabled = true diff --git a/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift b/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift index 6316745ae3..ba51b258b4 100644 --- a/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift +++ b/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift @@ -24,7 +24,7 @@ struct UpdateStatusBarInfo: ViewModifier { /// This is returned by ``UpdateStatusBarInfo`` `.computeStatusBarInfo`. private struct ComputedStatusBarInfo { let fileSize: Int - let dimensions: (Int, Int)? + let dimensions: ImageDimensions? } /// Compute information that can be used to update properties in ``StatusBarFileInfoView``. @@ -39,7 +39,7 @@ struct UpdateStatusBarInfo: ViewModifier { } if contentType.conforms(to: .image), let imageReps = NSImage(contentsOf: url)?.representations.first { - let dimensions = (imageReps.pixelsWide, imageReps.pixelsHigh) + let dimensions = ImageDimensions(width: imageReps.pixelsWide, height: imageReps.pixelsHigh) return ComputedStatusBarInfo(fileSize: fileSize, dimensions: dimensions) } else { // non-image file return ComputedStatusBarInfo(fileSize: fileSize, dimensions: nil) diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift index 469263fec8..acf4672123 100644 --- a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift +++ b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift @@ -21,8 +21,8 @@ struct StatusBarFileInfoView: View { HStack(spacing: 15) { if let dimensions = statusBarViewModel.dimensions { - var width = numberStyle.format(dimensions.0) - var height = numberStyle.format(dimensions.1) + var width = numberStyle.format(dimensions.width) + var height = numberStyle.format(dimensions.height) Text("\(width)x\(height)") .font(statusBarViewModel.statusBarFont) diff --git a/Documentation.docc/App Window/StatusBarView.md b/Documentation.docc/App Window/StatusBarView.md index 5d7b0b337b..c786a4afad 100644 --- a/Documentation.docc/App Window/StatusBarView.md +++ b/Documentation.docc/App Window/StatusBarView.md @@ -2,6 +2,10 @@ ## Topics +### Model + +- ``ImageDimensions`` + ### View Model - ``StatusBarViewModel`` From a5938ea896e4d3c0767f0547c38c674b2f11eb50 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Mon, 13 May 2024 00:12:38 +0100 Subject: [PATCH 15/21] refactor `StatusBarFileInfoView` --- .../Views/StatusBarItems/StatusBarFileInfoView.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift index acf4672123..23a0f9f4f3 100644 --- a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift +++ b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift @@ -14,15 +14,15 @@ struct StatusBarFileInfoView: View { @EnvironmentObject private var statusBarViewModel: StatusBarViewModel - private let numberStyle = IntegerFormatStyle(locale: Locale(identifier: "en_US")).grouping(.never) + private let dimensionsNumberStyle = IntegerFormatStyle(locale: Locale(identifier: "en_US")).grouping(.never) var body: some View { HStack(spacing: 15) { if let dimensions = statusBarViewModel.dimensions { - var width = numberStyle.format(dimensions.width) - var height = numberStyle.format(dimensions.height) + let width = dimensionsNumberStyle.format(dimensions.width) + let height = dimensionsNumberStyle.format(dimensions.height) Text("\(width)x\(height)") .font(statusBarViewModel.statusBarFont) From c63d0efbcc922a906a8d6c978195e74a311cf139 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Mon, 13 May 2024 12:09:06 +0100 Subject: [PATCH 16/21] fix SwiftLint violation --- .../Documents/Controllers/CodeEditWindowController.swift | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift index 8aa2fc6063..a4bf4edc72 100644 --- a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift +++ b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift @@ -224,9 +224,7 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate, Obs case .branchPicker: let toolbarItem = NSToolbarItem(itemIdentifier: .branchPicker) let view = NSHostingView( - rootView: ToolbarBranchPicker( - workspaceFileManager: workspace?.workspaceFileManager - ) + rootView: ToolbarBranchPicker(workspaceFileManager: workspace?.workspaceFileManager) ) toolbarItem.view = view From cfd410cd30354b74d525fedb045497aa4d426522 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Mon, 13 May 2024 12:14:46 +0100 Subject: [PATCH 17/21] minor doc change in `UpdateStatusBarInfo` --- .../Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift b/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift index ba51b258b4..6cc028a3ea 100644 --- a/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift +++ b/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift @@ -10,7 +10,7 @@ import SwiftUI /// Updates ``StatusBarFileInfoView``'s `fileSize` and `dimensions`. /// ```swift /// FileView -/// .modifier(UpdateStatusBarInfo(with)) +/// .modifier(UpdateStatusBarInfo(withURL)) /// ``` struct UpdateStatusBarInfo: ViewModifier { From 773990ce3df386d3f2daea57d279329099234eb0 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Mon, 13 May 2024 12:16:12 +0100 Subject: [PATCH 18/21] remove unused editor variable in `UpdateStatusBarInfo` --- .../Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift | 1 - 1 file changed, 1 deletion(-) diff --git a/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift b/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift index 6cc028a3ea..5d0d00902a 100644 --- a/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift +++ b/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift @@ -18,7 +18,6 @@ struct UpdateStatusBarInfo: ViewModifier { let withURL: URL @EnvironmentObject private var editorManager: EditorManager - @EnvironmentObject private var editor: Editor @EnvironmentObject private var statusBarViewModel: StatusBarViewModel /// This is returned by ``UpdateStatusBarInfo`` `.computeStatusBarInfo`. From a648652a61584b444e78c677887ec422e9f9f8a3 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Mon, 13 May 2024 12:28:02 +0100 Subject: [PATCH 19/21] refactor - stylistic changes - docs change - properly name `UtilityAreaSplitTerminalButton` - remove unused `isBreakpointEnabled` in `StatusBarBreakpointButton` --- CodeEdit.xcodeproj/project.pbxproj | 8 ++++---- .../StatusBar/ViewModifiers/UpdateStatusBarInfo.swift | 4 ++-- .../Views/StatusBarItems/StatusBarBreakpointButton.swift | 2 -- .../Views/StatusBarItems/StatusBarFileInfoView.swift | 8 +++----- ...lButton.swift => UtilityAreaSplitTerminalButton.swift} | 4 ++-- 5 files changed, 11 insertions(+), 15 deletions(-) rename CodeEdit/Features/UtilityArea/Toolbar/{UtilityAreaTerminalButton.swift => UtilityAreaSplitTerminalButton.swift} (77%) diff --git a/CodeEdit.xcodeproj/project.pbxproj b/CodeEdit.xcodeproj/project.pbxproj index 88d39b399a..3b116c607e 100644 --- a/CodeEdit.xcodeproj/project.pbxproj +++ b/CodeEdit.xcodeproj/project.pbxproj @@ -203,7 +203,7 @@ 5882252A292C280D00E83CDE /* StatusBarToggleUtilityAreaButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822510292C280D00E83CDE /* StatusBarToggleUtilityAreaButton.swift */; }; 5882252B292C280D00E83CDE /* StatusBarCursorPositionLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822511292C280D00E83CDE /* StatusBarCursorPositionLabel.swift */; }; 5882252C292C280D00E83CDE /* UtilityAreaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822513292C280D00E83CDE /* UtilityAreaView.swift */; }; - 5882252D292C280D00E83CDE /* UtilityAreaTerminalButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822515292C280D00E83CDE /* UtilityAreaTerminalButton.swift */; }; + 5882252D292C280D00E83CDE /* UtilityAreaSplitTerminalButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822515292C280D00E83CDE /* UtilityAreaSplitTerminalButton.swift */; }; 5882252E292C280D00E83CDE /* UtilityAreaMaximizeButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822516292C280D00E83CDE /* UtilityAreaMaximizeButton.swift */; }; 5882252F292C280D00E83CDE /* UtilityAreaClearButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822517292C280D00E83CDE /* UtilityAreaClearButton.swift */; }; 58822530292C280D00E83CDE /* UtilityAreaFilterTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58822518292C280D00E83CDE /* UtilityAreaFilterTextField.swift */; }; @@ -771,7 +771,7 @@ 58822510292C280D00E83CDE /* StatusBarToggleUtilityAreaButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarToggleUtilityAreaButton.swift; sourceTree = ""; }; 58822511292C280D00E83CDE /* StatusBarCursorPositionLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StatusBarCursorPositionLabel.swift; sourceTree = ""; }; 58822513292C280D00E83CDE /* UtilityAreaView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaView.swift; sourceTree = ""; }; - 58822515292C280D00E83CDE /* UtilityAreaTerminalButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaTerminalButton.swift; sourceTree = ""; }; + 58822515292C280D00E83CDE /* UtilityAreaSplitTerminalButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaSplitTerminalButton.swift; sourceTree = ""; }; 58822516292C280D00E83CDE /* UtilityAreaMaximizeButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaMaximizeButton.swift; sourceTree = ""; }; 58822517292C280D00E83CDE /* UtilityAreaClearButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaClearButton.swift; sourceTree = ""; }; 58822518292C280D00E83CDE /* UtilityAreaFilterTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UtilityAreaFilterTextField.swift; sourceTree = ""; }; @@ -2050,7 +2050,7 @@ 58822514292C280D00E83CDE /* Toolbar */ = { isa = PBXGroup; children = ( - 58822515292C280D00E83CDE /* UtilityAreaTerminalButton.swift */, + 58822515292C280D00E83CDE /* UtilityAreaSplitTerminalButton.swift */, 58822516292C280D00E83CDE /* UtilityAreaMaximizeButton.swift */, 58822517292C280D00E83CDE /* UtilityAreaClearButton.swift */, 58822518292C280D00E83CDE /* UtilityAreaFilterTextField.swift */, @@ -3452,7 +3452,7 @@ 77A01E322BB4274B00F0EA38 /* TasksCEWorkspaceSettingsView.swift in Sources */, B6E41C8F29DE9CD80088F9F4 /* AccountsSettingsDetailsView.swift in Sources */, 5882252B292C280D00E83CDE /* StatusBarCursorPositionLabel.swift in Sources */, - 5882252D292C280D00E83CDE /* UtilityAreaTerminalButton.swift in Sources */, + 5882252D292C280D00E83CDE /* UtilityAreaSplitTerminalButton.swift in Sources */, 58798238292E30B90085B254 /* FeedbackWindowController.swift in Sources */, 587B9E6C29301D8F00AC7927 /* GitLabNamespace.swift in Sources */, 6C48D8F22972DAFC00D6D205 /* Env+IsFullscreen.swift in Sources */, diff --git a/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift b/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift index 5d0d00902a..e5385074d7 100644 --- a/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift +++ b/CodeEdit/Features/StatusBar/ViewModifiers/UpdateStatusBarInfo.swift @@ -31,8 +31,8 @@ struct UpdateStatusBarInfo: ViewModifier { /// - Returns: The file size and its image dimensions (if any). private func computeStatusBarInfo(url: URL) -> ComputedStatusBarInfo? { guard let resourceValues = try? url.resourceValues(forKeys: [.contentTypeKey, .fileSizeKey]), - let fileSize = resourceValues.fileSize, - let contentType = resourceValues.contentType + let contentType = resourceValues.contentType, + let fileSize = resourceValues.fileSize else { return nil } diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarBreakpointButton.swift b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarBreakpointButton.swift index 3743412e34..db376a5b34 100644 --- a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarBreakpointButton.swift +++ b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarBreakpointButton.swift @@ -11,8 +11,6 @@ import CodeEditSymbols struct StatusBarBreakpointButton: View { @EnvironmentObject private var statusBarViewModel: StatusBarViewModel - @State private var isBreakpointEnabled = false - var body: some View { Button { statusBarViewModel.isBreakpointEnabled.toggle() diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift index 23a0f9f4f3..7fe6d430f3 100644 --- a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift +++ b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift @@ -9,7 +9,7 @@ import SwiftUI /// Shows media information about the currently opened file. /// -/// This currently shows the file size and media dimensions, if available. +/// This currently shows the file size and image dimensions, if available. struct StatusBarFileInfoView: View { @EnvironmentObject private var statusBarViewModel: StatusBarViewModel @@ -25,17 +25,15 @@ struct StatusBarFileInfoView: View { let height = dimensionsNumberStyle.format(dimensions.height) Text("\(width)x\(height)") - .font(statusBarViewModel.statusBarFont) - .foregroundStyle(statusBarViewModel.foregroundStyle) } if let fileSize = statusBarViewModel.fileSize { Text(fileSize.formatted(.byteCount(style: .memory))) - .font(statusBarViewModel.statusBarFont) - .foregroundStyle(statusBarViewModel.foregroundStyle) } } + .font(statusBarViewModel.statusBarFont) + .foregroundStyle(statusBarViewModel.foregroundStyle) } } diff --git a/CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaTerminalButton.swift b/CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaSplitTerminalButton.swift similarity index 77% rename from CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaTerminalButton.swift rename to CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaSplitTerminalButton.swift index ed3baa13ac..9b93382a18 100644 --- a/CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaTerminalButton.swift +++ b/CodeEdit/Features/UtilityArea/Toolbar/UtilityAreaSplitTerminalButton.swift @@ -1,5 +1,5 @@ // -// UtilityAreaTerminalButton.swift +// UtilityAreaSplitTerminalButton.swift // CodeEdit // // Created by Stef Kors on 14/04/2022. @@ -7,7 +7,7 @@ import SwiftUI -struct UtilityAreaTerminalButton: View { +struct UtilityAreaSplitTerminalButton: View { var body: some View { Button { // todo From 7627aa681c53ae6804eb0e73ae5acfadbfecce22 Mon Sep 17 00:00:00 2001 From: Austin Condiff Date: Thu, 16 May 2024 14:22:38 -0500 Subject: [PATCH 20/21] Update CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift --- .../StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift index 7fe6d430f3..58d6896d64 100644 --- a/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift +++ b/CodeEdit/Features/StatusBar/Views/StatusBarItems/StatusBarFileInfoView.swift @@ -24,7 +24,7 @@ struct StatusBarFileInfoView: View { let width = dimensionsNumberStyle.format(dimensions.width) let height = dimensionsNumberStyle.format(dimensions.height) - Text("\(width)x\(height)") + Text("\(width) × \(height)") } if let fileSize = statusBarViewModel.fileSize { From dcc3dba3d67c83dab296446dd5f0acb369056581 Mon Sep 17 00:00:00 2001 From: Paul Ebose Date: Fri, 17 May 2024 09:05:45 +0100 Subject: [PATCH 21/21] properly resolve merge conflict I used the GitHub UI, it didn't come out how I expected --- .../CodeEditWindowController.swift | 116 ------------------ 1 file changed, 116 deletions(-) diff --git a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift index 8d5c499624..3d496d873b 100644 --- a/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift +++ b/CodeEdit/Features/Documents/Controllers/CodeEditWindowController.swift @@ -120,122 +120,6 @@ final class CodeEditWindowController: NSWindowController, NSToolbarDelegate, Obs self.listenToDocumentEdited(workspace: workspace) } - private func setupToolbar() { - let toolbar = NSToolbar(identifier: UUID().uuidString) - toolbar.delegate = self - toolbar.displayMode = .labelOnly - toolbar.showsBaselineSeparator = false - self.window?.titleVisibility = toolbarCollapsed ? .visible : .hidden - self.window?.toolbarStyle = .unifiedCompact - if Settings[\.general].tabBarStyle == .native { - // Set titlebar background as transparent by default in order to - // style the toolbar background in native tab bar style. - self.window?.titlebarSeparatorStyle = .none - } else { - // In Xcode tab bar style, we use default toolbar background with - // line separator. - self.window?.titlebarSeparatorStyle = .automatic - } - self.window?.toolbar = toolbar - } - - // MARK: - Toolbar - - func toolbarDefaultItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { - [ - .toggleFirstSidebarItem, - .sidebarTrackingSeparator, - .branchPicker, - .flexibleSpace, - .itemListTrackingSeparator, - .flexibleSpace, - .toggleLastSidebarItem - ] - } - - func toolbarAllowedItemIdentifiers(_ toolbar: NSToolbar) -> [NSToolbarItem.Identifier] { - [ - .toggleFirstSidebarItem, - .sidebarTrackingSeparator, - .flexibleSpace, - .itemListTrackingSeparator, - .toggleLastSidebarItem, - .branchPicker - ] - } - - func toggleToolbar() { - toolbarCollapsed.toggle() - updateToolbarVisibility() - } - - private func updateToolbarVisibility() { - if toolbarCollapsed { - window?.titleVisibility = .visible - window?.title = workspace?.workspaceFileManager?.folderUrl.lastPathComponent ?? "Empty" - window?.toolbar = nil - } else { - window?.titleVisibility = .hidden - setupToolbar() - } - } - - func toolbar( - _ toolbar: NSToolbar, - itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, - willBeInsertedIntoToolbar flag: Bool - ) -> NSToolbarItem? { - switch itemIdentifier { - case .itemListTrackingSeparator: - guard let splitViewController else { return nil } - - return NSTrackingSeparatorToolbarItem( - identifier: .itemListTrackingSeparator, - splitView: splitViewController.splitView, - dividerIndex: 1 - ) - case .toggleFirstSidebarItem: - let toolbarItem = NSToolbarItem(itemIdentifier: NSToolbarItem.Identifier.toggleFirstSidebarItem) - toolbarItem.label = "Navigator Sidebar" - toolbarItem.paletteLabel = " Navigator Sidebar" - toolbarItem.toolTip = "Hide or show the Navigator" - toolbarItem.isBordered = true - toolbarItem.target = self - toolbarItem.action = #selector(self.toggleFirstPanel) - toolbarItem.image = NSImage( - systemSymbolName: "sidebar.leading", - accessibilityDescription: nil - )?.withSymbolConfiguration(.init(scale: .large)) - - return toolbarItem - case .toggleLastSidebarItem: - let toolbarItem = NSToolbarItem(itemIdentifier: NSToolbarItem.Identifier.toggleLastSidebarItem) - toolbarItem.label = "Inspector Sidebar" - toolbarItem.paletteLabel = "Inspector Sidebar" - toolbarItem.toolTip = "Hide or show the Inspectors" - toolbarItem.isBordered = true - toolbarItem.target = self - toolbarItem.action = #selector(self.toggleLastPanel) - toolbarItem.image = NSImage( - systemSymbolName: "sidebar.trailing", - accessibilityDescription: nil - )?.withSymbolConfiguration(.init(scale: .large)) - - return toolbarItem - case .branchPicker: - let toolbarItem = NSToolbarItem(itemIdentifier: .branchPicker) - let view = NSHostingView( - rootView: ToolbarBranchPicker(workspaceFileManager: workspace?.workspaceFileManager) - ) - toolbarItem.view = view - - return toolbarItem - - default: - return NSToolbarItem(itemIdentifier: itemIdentifier) - } - } - private func getSelectedCodeFile() -> CodeFileDocument? { workspace?.editorManager.activeEditor.selectedTab?.file.fileDocument }