aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Hotline.xcodeproj/project.pbxproj12
-rw-r--r--Hotline/macOS/Files/FileDetailsSheet.swift141
-rw-r--r--Hotline/macOS/Files/FileDetailsView.swift147
-rw-r--r--Hotline/macOS/Files/FilesView.swift35
-rw-r--r--Hotline/macOS/Files/NewFolderSheet.swift32
5 files changed, 183 insertions, 184 deletions
diff --git a/Hotline.xcodeproj/project.pbxproj b/Hotline.xcodeproj/project.pbxproj
index 2579dbe..1f9bdef 100644
--- a/Hotline.xcodeproj/project.pbxproj
+++ b/Hotline.xcodeproj/project.pbxproj
@@ -8,7 +8,7 @@
/* Begin PBXBuildFile section */
11A726082BE0672A000C1DA7 /* FileDetails.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11A726072BE0672A000C1DA7 /* FileDetails.swift */; };
- 11A7260A2BE0675A000C1DA7 /* FileDetailsView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11A726092BE06759000C1DA7 /* FileDetailsView.swift */; platformFilters = (macos, ); };
+ 11A7260A2BE0675A000C1DA7 /* FileDetailsSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11A726092BE06759000C1DA7 /* FileDetailsSheet.swift */; platformFilters = (macos, ); };
11F8288B2BF9428100216BA0 /* AccountManagerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 11F8288A2BF9428100216BA0 /* AccountManagerView.swift */; };
DA0D698D2B1E7CF700C71DF5 /* UsersView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA0D698C2B1E7CF700C71DF5 /* UsersView.swift */; platformFilter = ios; };
DA0D698F2B1E841600C71DF5 /* MessageBoardView.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA0D698E2B1E841600C71DF5 /* MessageBoardView.swift */; platformFilter = ios; };
@@ -22,6 +22,7 @@
DA32CD4B2B29318E0053B98B /* FileInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA32CD4A2B29318E0053B98B /* FileInfo.swift */; };
DA32CD4D2B2931B50053B98B /* ChatMessage.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA32CD4C2B2931B50053B98B /* ChatMessage.swift */; };
DA32CD4F2B2931CC0053B98B /* NewsInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA32CD4E2B2931CC0053B98B /* NewsInfo.swift */; };
+ DA32F1CC2EC4175F00B243BC /* NewFolderSheet.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA32F1CB2EC4175F00B243BC /* NewFolderSheet.swift */; };
DA3429AE2EB9C0280010784E /* HotlineFileUploadClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA3429AD2EB9C0220010784E /* HotlineFileUploadClient.swift */; };
DA3429B02EBA70790010784E /* HotlineFolderUploadClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA3429AF2EBA70790010784E /* HotlineFolderUploadClient.swift */; };
DA3429B32EBA7ADF0010784E /* HotlineFilePreviewClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = DA3429B22EBA7ADE0010784E /* HotlineFilePreviewClient.swift */; };
@@ -120,7 +121,7 @@
/* Begin PBXFileReference section */
11A726072BE0672A000C1DA7 /* FileDetails.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileDetails.swift; sourceTree = "<group>"; };
- 11A726092BE06759000C1DA7 /* FileDetailsView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileDetailsView.swift; sourceTree = "<group>"; };
+ 11A726092BE06759000C1DA7 /* FileDetailsSheet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FileDetailsSheet.swift; sourceTree = "<group>"; };
11F8288A2BF9428100216BA0 /* AccountManagerView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountManagerView.swift; sourceTree = "<group>"; };
DA0D698C2B1E7CF700C71DF5 /* UsersView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UsersView.swift; sourceTree = "<group>"; };
DA0D698E2B1E841600C71DF5 /* MessageBoardView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MessageBoardView.swift; sourceTree = "<group>"; };
@@ -136,6 +137,7 @@
DA32CD4A2B29318E0053B98B /* FileInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FileInfo.swift; sourceTree = "<group>"; };
DA32CD4C2B2931B50053B98B /* ChatMessage.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChatMessage.swift; sourceTree = "<group>"; };
DA32CD4E2B2931CC0053B98B /* NewsInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewsInfo.swift; sourceTree = "<group>"; };
+ DA32F1CB2EC4175F00B243BC /* NewFolderSheet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewFolderSheet.swift; sourceTree = "<group>"; };
DA3429AD2EB9C0220010784E /* HotlineFileUploadClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HotlineFileUploadClient.swift; sourceTree = "<group>"; };
DA3429AF2EBA70790010784E /* HotlineFolderUploadClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HotlineFolderUploadClient.swift; sourceTree = "<group>"; };
DA3429B22EBA7ADE0010784E /* HotlineFilePreviewClient.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HotlineFilePreviewClient.swift; sourceTree = "<group>"; };
@@ -339,7 +341,8 @@
DAE735002B2E71F2000C56F6 /* FilesView.swift */,
DA5268A42EB0743000DCB941 /* FileItemView.swift */,
DA5268A22EB0741B00DCB941 /* FolderItemView.swift */,
- 11A726092BE06759000C1DA7 /* FileDetailsView.swift */,
+ DA32F1CB2EC4175F00B243BC /* NewFolderSheet.swift */,
+ 11A726092BE06759000C1DA7 /* FileDetailsSheet.swift */,
DAAEE66E2B47625600A5BA07 /* FilePreviewImageView.swift */,
DAB4D87D2B4C8BCA0048A05C /* FilePreviewTextView.swift */,
DA3429B82EBAB2130010784E /* FilePreviewQuickLookView.swift */,
@@ -678,6 +681,7 @@
DA32CD4F2B2931CC0053B98B /* NewsInfo.swift in Sources */,
DA9CAFBB2B126D5700CDA197 /* MacApp.swift in Sources */,
DAAEE66B2B3FBC2100A5BA07 /* TransferInfo.swift in Sources */,
+ DA32F1CC2EC4175F00B243BC /* NewFolderSheet.swift in Sources */,
DA0D698F2B1E841600C71DF5 /* MessageBoardView.swift in Sources */,
DAE735072B3251B3000C56F6 /* SoundEffects.swift in Sources */,
DA55AC752BE4888300034857 /* InstantMessage.swift in Sources */,
@@ -686,7 +690,7 @@
DA5268B12EB2708E00DCB941 /* HotlineState.swift in Sources */,
DA55AC792BE6A1AD00034857 /* RegularExpressions.swift in Sources */,
DA5268A02EB073BC00DCB941 /* SoundSettingsView.swift in Sources */,
- 11A7260A2BE0675A000C1DA7 /* FileDetailsView.swift in Sources */,
+ 11A7260A2BE0675A000C1DA7 /* FileDetailsSheet.swift in Sources */,
DA72A0DD2B4CD0BF00A0F48A /* NewsEditorView.swift in Sources */,
DA52689C2EB0738B00DCB941 /* GeneralSettingsView.swift in Sources */,
DA501BE92EBE9589001714F8 /* TrackerItemView.swift in Sources */,
diff --git a/Hotline/macOS/Files/FileDetailsSheet.swift b/Hotline/macOS/Files/FileDetailsSheet.swift
new file mode 100644
index 0000000..d798fd4
--- /dev/null
+++ b/Hotline/macOS/Files/FileDetailsSheet.swift
@@ -0,0 +1,141 @@
+import Foundation
+import SwiftUI
+
+struct FileDetailsSheet: View {
+ @Environment(HotlineState.self) private var model: HotlineState
+ @Environment(\.presentationMode) var presentationMode
+
+ var fd: FileDetails
+
+ @State private var comment: String = ""
+ @State private var filename: String = ""
+
+ var body: some View {
+ VStack(alignment: .leading, spacing: 16) {
+ HStack(alignment: .center, spacing: 16){
+ FileIconView(filename: fd.name, fileType: nil)
+ .frame(width: 32, height: 32)
+ TextField("", text: $filename)
+ .disabled(!self.canRename())
+ }
+
+ let rows: [(String, String)] = [
+ ("Type", fd.type),
+ ("Creator", fd.creator),
+ ("Size", self.formattedSize(byteCount: fd.size)),
+ ("Created", Self.dateFormatter.string(from: fd.created)),
+ ("Modified", Self.dateFormatter.string(from: fd.modified))
+ ]
+
+ Grid(alignment: .leading, horizontalSpacing: 12, verticalSpacing: 8) {
+ ForEach(rows, id: \.0) { label, value in
+ GridRow {
+ Text(label)
+ .font(.body.bold())
+ .gridColumnAlignment(.trailing) // right-align label column
+ Text(value)
+ .font(.body)
+ .gridColumnAlignment(.leading) // left-align value column
+ }
+ }
+ }
+ .frame(maxWidth: .infinity, alignment: .leading)
+ .padding(.leading, 32 + 16)
+
+ TextField(text: self.$comment, prompt: Text("Comments"), axis: .vertical) {
+ EmptyView()
+ }
+ .font(.body)
+ .lineLimit(10, reservesSpace: true)
+ .padding(.leading, 32 + 16)
+ .disabled(!self.canSetComment())
+ }
+ .padding(.vertical, 24)
+ .padding(.horizontal, 24)
+ .frame(width: 400)
+ .toolbar {
+ ToolbarItem(placement: .cancellationAction) {
+ Button("Cancel") {
+ presentationMode.wrappedValue.dismiss()
+ }
+ }
+
+ ToolbarItem(placement: .primaryAction) {
+ Button{
+ var editedFilename: String?
+ if filename != fd.name {
+ editedFilename = filename
+ }
+
+ var editedComment: String?
+ if comment != fd.comment {
+ editedComment = comment
+ }
+
+ model.setFileInfo(fileName: fd.name, path: fd.path, fileNewName: editedFilename, comment: editedComment)
+ presentationMode.wrappedValue.dismiss()
+
+ // TODO: Update the file list if the filename was changed
+ } label: {
+ Text("Save")
+ }.disabled(!isEdited())
+ }
+ }
+ .onAppear {
+ self.filename = fd.name
+ self.comment = fd.comment
+ }
+ }
+
+
+ static var dateFormatter: DateFormatter = {
+ var dateFormatter = DateFormatter()
+ dateFormatter.dateStyle = .long
+ dateFormatter.timeStyle = .short
+
+ // Original format: Fri, Aug 20, 2021, 5:14:07 PM
+ return dateFormatter
+ }()
+
+ static var byteCountSizeFormatter: NumberFormatter = {
+ let numberFormatter = NumberFormatter()
+ numberFormatter.numberStyle = .decimal
+ return numberFormatter
+ }()
+
+ static let byteFormatter = ByteCountFormatter()
+
+ private func formattedFileSize(_ fileSize: UInt) -> String {
+ FileItemView.byteFormatter.allowedUnits = [.useAll]
+ FileItemView.byteFormatter.countStyle = .file
+ return FileItemView.byteFormatter.string(fromByteCount: Int64(fileSize))
+ }
+
+ // Format byte count Int into string like: 23.4M (24,601,664 bytes)
+ private func formattedSize(byteCount: Int) -> String {
+ let formattedByteCount = Self.byteCountSizeFormatter.string(from: NSNumber(value:byteCount)) ?? "0"
+ return "\(FileItemView.byteFormatter.string(fromByteCount: Int64(byteCount))) (\(formattedByteCount) bytes)"
+ }
+
+ private func isEdited() -> Bool {
+ return self.filename != fd.name || self.comment != fd.comment
+ }
+
+ private func canRename() -> Bool {
+ if self.fd.type == "fldr" {
+ return model.access?.contains(.canRenameFolders) == true
+ }
+ return model.access?.contains(.canRenameFiles) == true
+ }
+
+ private func canSetComment() -> Bool {
+ if self.fd.type == "fldr" {
+ return model.access?.contains(.canSetFolderComment) == true
+ }
+ return model.access?.contains(.canSetFileComment) == true
+ }
+}
+
+//#Preview {
+// FileDetailsView(fd: FileDetails(name: "AppleWorks 6.sit", path: [""], size: 24601664, comment: "test comment", type: "SITD", creator: "SIT!", created: Date.now, modified: Date.now ))
+//}
diff --git a/Hotline/macOS/Files/FileDetailsView.swift b/Hotline/macOS/Files/FileDetailsView.swift
deleted file mode 100644
index d001df2..0000000
--- a/Hotline/macOS/Files/FileDetailsView.swift
+++ /dev/null
@@ -1,147 +0,0 @@
-import Foundation
-import SwiftUI
-
-struct FileDetailsView: View {
- @Environment(HotlineState.self) private var model: HotlineState
- @Environment(\.presentationMode) var presentationMode
-
- var fd: FileDetails
-
- @State private var comment: String = ""
- @State private var filename: String = ""
-
- var body: some View {
- VStack (alignment: .leading){
- Form {
- HStack(alignment: .center){
- FileIconView(filename: fd.name, fileType: nil)
- .frame(width: 32, height: 32)
- TextField("", text: $filename)
- .disabled(!self.canRename())
- }
- HStack(alignment: .center){
- Text("Type:").bold().padding(.leading, 43)
- Text(fd.type)
- }
- HStack(alignment: .center){
- Text("Creator:").bold().padding(.leading, 26)
- Text(fd.creator)
- }
- HStack(alignment: .center){
- Text("Size:").bold().bold().padding(.leading, 48)
- Text(self.formattedSize(byteCount: fd.size))
- }
- HStack(alignment: .center){
- Text("Created:").bold().padding(.leading, 24)
- Text("\(FileDetailsView.dateFormatter.string(from: fd.created))")
- }
- HStack(alignment: .center){
- Text("Modified:").bold().padding(.leading, 19)
- Text("\(FileDetailsView.dateFormatter.string(from: fd.modified))")
- }
- HStack(alignment: .center){
- Text("Comments:").bold().padding(.top, 8)
- .padding(.leading, 5)
- }
-
- VStack(alignment: .trailing){
- TextEditor(text: $comment)
- .padding(.leading, 2)
- .padding(.top, 1)
- .font(.system(size: 13))
- .background(Color(nsColor: .textBackgroundColor))
- .border(Color.secondary, width: 1)
- .clipShape(RoundedRectangle(cornerRadius: 2, style: .continuous))
- .disabled(!self.canSetComment())
- }
- }
- .toolbar {
- ToolbarItem(placement: .cancellationAction) {
- Button("Cancel") {
- presentationMode.wrappedValue.dismiss()
- }
- }
-
- ToolbarItem(placement: .primaryAction) {
- Button{
- var editedFilename: String?
- if filename != fd.name {
- editedFilename = filename
- }
-
- var editedComment: String?
- if comment != fd.comment {
- editedComment = comment
- }
-
- model.setFileInfo(fileName: fd.name, path: fd.path, fileNewName: editedFilename, comment: editedComment)
- presentationMode.wrappedValue.dismiss()
-
- // TODO: Update the file list if the filename was changed
- } label: {
- Text("Save")
- }.disabled(!isEdited())
- }
- }
-
- .onAppear {
- self.filename = fd.name
- self.comment = fd.comment
- }
- .padding(EdgeInsets(top: 16, leading: 24, bottom: 16, trailing: 24))
- }
- .frame(minWidth: 400, minHeight: 400)
- }
-
-
- static var dateFormatter: DateFormatter = {
- var dateFormatter = DateFormatter()
- dateFormatter.dateStyle = .long
- dateFormatter.timeStyle = .short
-
- // Original format: Fri, Aug 20, 2021, 5:14:07 PM
- return dateFormatter
- }()
-
- static var byteCountSizeFormatter: NumberFormatter = {
- let numberFormatter = NumberFormatter()
- numberFormatter.numberStyle = .decimal
- return numberFormatter
- }()
-
- static let byteFormatter = ByteCountFormatter()
-
- private func formattedFileSize(_ fileSize: UInt) -> String {
- FileItemView.byteFormatter.allowedUnits = [.useAll]
- FileItemView.byteFormatter.countStyle = .file
- return FileItemView.byteFormatter.string(fromByteCount: Int64(fileSize))
- }
-
- // Format byte count Int into string like: 23.4M (24,601,664 bytes)
- private func formattedSize(byteCount: Int) -> String {
- let formattedByteCount = FileDetailsView.byteCountSizeFormatter.string(from: NSNumber(value:byteCount)) ?? "0"
- return "\(FileItemView.byteFormatter.string(fromByteCount: Int64(byteCount))) (\(formattedByteCount) bytes)"
- }
-
- private func isEdited() -> Bool {
- return self.filename != fd.name || self.comment != fd.comment
- }
-
- private func canRename() -> Bool {
- if self.fd.type == "fldr" {
- return model.access?.contains(.canRenameFolders) == true
- }
- return model.access?.contains(.canRenameFiles) == true
- }
-
- private func canSetComment() -> Bool {
- if self.fd.type == "fldr" {
- return model.access?.contains(.canSetFolderComment) == true
- }
- return model.access?.contains(.canSetFileComment) == true
- }
-}
-
-//#Preview {
-// FileDetailsView(fd: FileDetails(name: "AppleWorks 6.sit", path: [""], size: 24601664, comment: "test comment", type: "SITD", creator: "SIT!", created: Date.now, modified: Date.now ))
-//}
diff --git a/Hotline/macOS/Files/FilesView.swift b/Hotline/macOS/Files/FilesView.swift
index 3732d9a..a9b0b83 100644
--- a/Hotline/macOS/Files/FilesView.swift
+++ b/Hotline/macOS/Files/FilesView.swift
@@ -2,37 +2,6 @@ import SwiftUI
import UniformTypeIdentifiers
import AppKit
-struct NewFolderSheet: View {
- @Environment(\.dismiss) private var dismiss
-
- let action: ((String) -> Void)?
-
- @State private var folderName: String = "Untitled"
-
- var body: some View {
- Form {
- TextField(text: self.$folderName) {
- Text("Folder Name")
- }
- }
- .formStyle(.grouped)
- .fixedSize(horizontal: false, vertical: true)
- .toolbar {
- ToolbarItem(placement: .confirmationAction) {
- Button("New Folder") {
- self.dismiss()
- self.action?(self.folderName)
- }
- }
- ToolbarItem(placement: .cancellationAction) {
- Button("Cancel") {
- self.dismiss()
- }
- }
- }
- }
-}
-
struct FilesView: View {
@Environment(HotlineState.self) private var model: HotlineState
@Environment(\.openWindow) private var openWindow
@@ -265,8 +234,8 @@ struct FilesView: View {
self.newFolder(name: folderName, parent: self.selection)
}
}
- .sheet(item: $fileDetails) { item in
- FileDetailsView(fd: item)
+ .sheet(item: self.$fileDetails) { item in
+ FileDetailsSheet(fd: item)
}
.fileImporter(isPresented: $uploadFileSelectorDisplayed, allowedContentTypes: [.data, .folder], allowsMultipleSelection: false, onCompletion: { results in
switch results {
diff --git a/Hotline/macOS/Files/NewFolderSheet.swift b/Hotline/macOS/Files/NewFolderSheet.swift
new file mode 100644
index 0000000..a899f36
--- /dev/null
+++ b/Hotline/macOS/Files/NewFolderSheet.swift
@@ -0,0 +1,32 @@
+import SwiftUI
+
+struct NewFolderSheet: View {
+ @Environment(\.dismiss) private var dismiss
+
+ let action: ((String) -> Void)?
+
+ @State private var folderName: String = "Untitled"
+
+ var body: some View {
+ Form {
+ TextField(text: self.$folderName) {
+ Text("Folder Name")
+ }
+ }
+ .formStyle(.grouped)
+ .fixedSize(horizontal: false, vertical: true)
+ .toolbar {
+ ToolbarItem(placement: .confirmationAction) {
+ Button("New Folder") {
+ self.dismiss()
+ self.action?(self.folderName)
+ }
+ }
+ ToolbarItem(placement: .cancellationAction) {
+ Button("Cancel") {
+ self.dismiss()
+ }
+ }
+ }
+ }
+}