diff --git a/MiniScanner.xcodeproj/project.pbxproj b/MiniScanner.xcodeproj/project.pbxproj index f2abd73e050524651ab645d287c5c5f8dc6f0b17..d9764904884d9e9e1837ef017f77f8c2af4be973 100644 --- a/MiniScanner.xcodeproj/project.pbxproj +++ b/MiniScanner.xcodeproj/project.pbxproj @@ -198,6 +198,8 @@ 67807F992C49320100D1F168 /* MainViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67807F982C49320100D1F168 /* MainViewModel.swift */; }; 67807F9B2C49325A00D1F168 /* MainView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67807F9A2C49325A00D1F168 /* MainView.swift */; }; 67807FA02C4934BD00D1F168 /* View+LayoutChanges.swift in Sources */ = {isa = PBXBuildFile; fileRef = 67807F9F2C4934BD00D1F168 /* View+LayoutChanges.swift */; }; + 678BD70D2C4CF18300833DA5 /* CustomMenuPickerItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 678BD70C2C4CF18300833DA5 /* CustomMenuPickerItem.swift */; }; + 678BD70F2C4CF1A000833DA5 /* CustomMenuPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 678BD70E2C4CF1A000833DA5 /* CustomMenuPicker.swift */; }; B827E5196CC419E773B843E1 /* Pods_MiniScanner.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E9A37DC9F9A8E3AF632DFB98 /* Pods_MiniScanner.framework */; }; EC0CF1FE254D8BBF00888722 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0CF1FD254D8BBF00888722 /* AppDelegate.swift */; }; EC0CF200254D8BBF00888722 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC0CF1FF254D8BBF00888722 /* SceneDelegate.swift */; }; @@ -446,6 +448,8 @@ 67807F982C49320100D1F168 /* MainViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainViewModel.swift; sourceTree = "<group>"; }; 67807F9A2C49325A00D1F168 /* MainView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MainView.swift; sourceTree = "<group>"; }; 67807F9F2C4934BD00D1F168 /* View+LayoutChanges.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "View+LayoutChanges.swift"; sourceTree = "<group>"; }; + 678BD70C2C4CF18300833DA5 /* CustomMenuPickerItem.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomMenuPickerItem.swift; sourceTree = "<group>"; }; + 678BD70E2C4CF1A000833DA5 /* CustomMenuPicker.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomMenuPicker.swift; sourceTree = "<group>"; }; E8AF4FB39674DF589D719DCF /* Pods-MiniScanner.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-MiniScanner.release.xcconfig"; path = "Target Support Files/Pods-MiniScanner/Pods-MiniScanner.release.xcconfig"; sourceTree = "<group>"; }; E9A37DC9F9A8E3AF632DFB98 /* Pods_MiniScanner.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_MiniScanner.framework; sourceTree = BUILT_PRODUCTS_DIR; }; EC0CF1FA254D8BBF00888722 /* MiniScanner.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = MiniScanner.app; sourceTree = BUILT_PRODUCTS_DIR; }; @@ -1070,6 +1074,7 @@ 672C46C12C47E98A00497EF0 /* Model */ = { isa = PBXGroup; children = ( + 678BD70C2C4CF18300833DA5 /* CustomMenuPickerItem.swift */, 672C46C02C47E98A00497EF0 /* SupportedLanguage.swift */, 672C46D22C47EA8F00497EF0 /* SupportedColorScheme.swift */, ); @@ -1115,6 +1120,7 @@ 67807F972C49313C00D1F168 /* Presentation */ = { isa = PBXGroup; children = ( + 678BD70E2C4CF1A000833DA5 /* CustomMenuPicker.swift */, 67807F9A2C49325A00D1F168 /* MainView.swift */, 67807F982C49320100D1F168 /* MainViewModel.swift */, 67807F942C49306C00D1F168 /* MainCoordinator.swift */, @@ -1566,6 +1572,7 @@ 53CD5F5C2C1505A20010424B /* Globals.swift in Sources */, EC8A9B03254DC08800F9AF99 /* NSNotification+Extensions.swift in Sources */, 539996492C26E86700671340 /* CDCameraOverlayView.m in Sources */, + 678BD70D2C4CF18300833DA5 /* CustomMenuPickerItem.swift in Sources */, 5359841A2C145E55003EB6ED /* DocumentsTableViewCell.swift in Sources */, EC702522254DF13200BE1958 /* PencilKitViewController.swift in Sources */, 5399968F2C27130000671340 /* ConstraintConfig.swift in Sources */, @@ -1642,6 +1649,7 @@ 53014F9C2C11A8E80071CE39 /* CGRect+Utils.swift in Sources */, 539996842C27130000671340 /* ConstraintAttributes.swift in Sources */, 53EDEDA32C183FFF00DB8DF9 /* PagerImageCollectionViewCell.swift in Sources */, + 678BD70F2C4CF1A000833DA5 /* CustomMenuPicker.swift in Sources */, 53014FA12C11A8E80071CE39 /* MultiPageScanSessionViewController.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/MiniScanner/Features/Common/Data/Model/CustomMenuPickerItem.swift b/MiniScanner/Features/Common/Data/Model/CustomMenuPickerItem.swift new file mode 100644 index 0000000000000000000000000000000000000000..468c520c6b907505fdc06730fd87a35dbc9f7cc9 --- /dev/null +++ b/MiniScanner/Features/Common/Data/Model/CustomMenuPickerItem.swift @@ -0,0 +1,14 @@ +// +// CustomMenuPickerItem.swift +// MiniScanner +// +// Created by Mustafa Merza on 7/18/24. +// Copyright © 2024 AppsNectar. All rights reserved. +// + +import Foundation + +protocol CustomMenuPickerItem: Identifiable, Hashable { + + var displayedName: String { get } +} diff --git a/MiniScanner/Features/Common/Presentation/CustomMenuPicker.swift b/MiniScanner/Features/Common/Presentation/CustomMenuPicker.swift new file mode 100644 index 0000000000000000000000000000000000000000..cb8c8f944652f0ab7cbd898297a855a5f0c15897 --- /dev/null +++ b/MiniScanner/Features/Common/Presentation/CustomMenuPicker.swift @@ -0,0 +1,32 @@ +// +// CustomMenuPicker.swift +// MiniScanner +// +// Created by Mustafa Merza on 7/18/24. +// Copyright © 2024 AppsNectar. All rights reserved. +// + +import SwiftUI + +struct CustomMenuPicker<Item: CustomMenuPickerItem, Label: View>: View { + + @Binding var selectedItem: Item + var items: [Item] + + @ViewBuilder var label: () -> Label + + var body: some View { + Menu(content: { + Picker(selection: $selectedItem, label: EmptyView()) { + + ForEach(items) { item in + + Text(item.displayedName) + .tag(item) + } + } + }, label: { + label() + }) + } +}