From e3ed146f5c8ec6e34d30a8b0d0a918b44f0107b4 Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Tue, 29 Apr 2025 18:28:29 +0300 Subject: [PATCH] Removing old UIKit code --- AutoCat.xcodeproj/project.pbxproj | 70 +--- AutoCat/Controllers/NewNumberController.swift | 206 ------------ .../ACKeyboardButton.swift | 0 .../{ => NumberEditView}/ACKeyboardView.swift | 0 .../{ => NumberEditView}/NumberEditView.swift | 0 .../PNButtonType.swift} | 10 +- AutoCat/Views/BlockBarButtonItem.swift | 29 -- AutoCat/Views/CellProgressView.swift | 41 --- AutoCat/Views/CustomButton.swift | 14 - AutoCat/Views/CustomTextField.swift | 32 -- AutoCat/Views/FlagLayer.swift | 41 --- AutoCat/Views/PNKeyboard.swift | 300 ------------------ AutoCat/Views/PlateView.swift | 191 ----------- 13 files changed, 20 insertions(+), 914 deletions(-) delete mode 100644 AutoCat/Controllers/NewNumberController.swift rename AutoCat/SwiftUI/{ => NumberEditView}/ACKeyboardButton.swift (100%) rename AutoCat/SwiftUI/{ => NumberEditView}/ACKeyboardView.swift (100%) rename AutoCat/SwiftUI/{ => NumberEditView}/NumberEditView.swift (100%) rename AutoCat/SwiftUI/{Environment.swift => NumberEditView/PNButtonType.swift} (53%) delete mode 100644 AutoCat/Views/BlockBarButtonItem.swift delete mode 100644 AutoCat/Views/CellProgressView.swift delete mode 100644 AutoCat/Views/CustomButton.swift delete mode 100644 AutoCat/Views/CustomTextField.swift delete mode 100644 AutoCat/Views/FlagLayer.swift delete mode 100644 AutoCat/Views/PNKeyboard.swift delete mode 100644 AutoCat/Views/PlateView.swift diff --git a/AutoCat.xcodeproj/project.pbxproj b/AutoCat.xcodeproj/project.pbxproj index 2122ec0..4dec920 100644 --- a/AutoCat.xcodeproj/project.pbxproj +++ b/AutoCat.xcodeproj/project.pbxproj @@ -16,7 +16,6 @@ 7A1022722C554A1300B84627 /* CustomHostingController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1022712C554A1300B84627 /* CustomHostingController.swift */; }; 7A1022772C557EC400B84627 /* LocationPickerScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1022762C557EC400B84627 /* LocationPickerScreen.swift */; }; 7A1022792C557ED600B84627 /* LocationPickerViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1022782C557ED600B84627 /* LocationPickerViewModel.swift */; }; - 7A1090EC24A4E3E100B4F0B2 /* CellProgressView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1090EB24A4E3E100B4F0B2 /* CellProgressView.swift */; }; 7A11470A23FDE7E600B424AF /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 7A11470923FDE7E600B424AF /* Assets.xcassets */; }; 7A131FD32D37B75500DC7755 /* HistoryScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A131FD22D37B75500DC7755 /* HistoryScreen.swift */; }; 7A131FD52D37B76A00DC7755 /* HistoryViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A131FD42D37B76A00DC7755 /* HistoryViewModel.swift */; }; @@ -25,7 +24,6 @@ 7A17CE4A2A2E820300626A6E /* UIStackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A17CE492A2E820300626A6E /* UIStackView.swift */; }; 7A17CE4C2A2E850200626A6E /* UISegmentedControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A17CE4B2A2E850200626A6E /* UISegmentedControl.swift */; }; 7A1CF81629A42117007962DA /* Realm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1CF81529A42117007962DA /* Realm.swift */; }; - 7A1DC38E2517ED98002E9C99 /* BlockBarButtonItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1DC38D2517ED98002E9C99 /* BlockBarButtonItem.swift */; }; 7A1E78F62CE900330004B740 /* ReportScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1E78F52CE900330004B740 /* ReportScreen.swift */; }; 7A1E78F82CE900440004B740 /* ReportViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1E78F72CE900440004B740 /* ReportViewModel.swift */; }; 7A1E78FF2CE91A740004B740 /* Vehicle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A1E78FE2CE91A740004B740 /* Vehicle.swift */; }; @@ -81,10 +79,8 @@ 7A6B65B32CFB0DB500AABA6B /* NullifyDate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6B65B22CFB0DB500AABA6B /* NullifyDate.swift */; }; 7A6C4D9E2C56BCA600982597 /* SwiftLocation in Frameworks */ = {isa = PBXBuildFile; productRef = 7A6C4D9D2C56BCA600982597 /* SwiftLocation */; }; 7A6C65222D999325001240C2 /* AudioRecordViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6C65212D999325001240C2 /* AudioRecordViewModel.swift */; }; - 7A6DD903242BF4A5009DE740 /* PlateView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD902242BF4A5009DE740 /* PlateView.swift */; }; 7A6DD90824329144009DE740 /* CenterTextLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD90724329144009DE740 /* CenterTextLayer.swift */; }; 7A6DD90A24329541009DE740 /* RoadNumbers2.0.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7A6DD90924329541009DE740 /* RoadNumbers2.0.otf */; }; - 7A6DD90C24335A6D009DE740 /* FlagLayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6DD90B24335A6D009DE740 /* FlagLayer.swift */; }; 7A6F096026DBF588003A965D /* VehicleNote.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A6F095F26DBF588003A965D /* VehicleNote.swift */; }; 7A7097C22C9EC139007CFDCA /* ServiceContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A7097C12C9EC139007CFDCA /* ServiceContainer.swift */; }; 7A7158002C43EA6900852088 /* OwnersScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7A7157FF2C43EA6900852088 /* OwnersScreen.swift */; }; @@ -140,8 +136,6 @@ 7AB587322C42D38E00FA7B66 /* StorageServiceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB587312C42D38E00FA7B66 /* StorageServiceProtocol.swift */; }; 7AB587342C42D3FA00FA7B66 /* StorageService+Notes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB587332C42D3FA00FA7B66 /* StorageService+Notes.swift */; }; 7AB587412C42FFE200FA7B66 /* ApiServiceProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB587402C42FFE200FA7B66 /* ApiServiceProtocol.swift */; }; - 7AB67E8C2435C38700258F61 /* CustomTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB67E8B2435C38700258F61 /* CustomTextField.swift */; }; - 7AB67E8E2435D1A000258F61 /* CustomButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB67E8D2435D1A000258F61 /* CustomButton.swift */; }; 7AB9FE222D08C2A5005DE374 /* EventsScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB9FE212D08C2A5005DE374 /* EventsScreen.swift */; }; 7AB9FE282D08C2F4005DE374 /* EventsViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB9FE272D08C2F4005DE374 /* EventsViewModel.swift */; }; 7AB9FE2A2D08CF35005DE374 /* EventsScreenMode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AB9FE292D08CF35005DE374 /* EventsScreenMode.swift */; }; @@ -153,7 +147,6 @@ 7ABDA80D2D8721B10083C715 /* Substrings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ABDA80C2D8721B10083C715 /* Substrings.swift */; }; 7ABDA80F2D8723F90083C715 /* StorageService+AudioRecords.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ABDA80E2D8723F90083C715 /* StorageService+AudioRecords.swift */; }; 7AC3554A2969652F00889457 /* SwiftEntryKit in Frameworks */ = {isa = PBXBuildFile; productRef = 7AC355492969652F00889457 /* SwiftEntryKit */; }; - 7AC3555029696D5A00889457 /* NewNumberController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC3554F29696D5A00889457 /* NewNumberController.swift */; }; 7AC35554296973E100889457 /* ACButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC35553296973E100889457 /* ACButton.swift */; }; 7AC355592969746600889457 /* UIControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC355582969746600889457 /* UIControl.swift */; }; 7AC3555B296995B200889457 /* UIEdgeInsets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC3555A296995B200889457 /* UIEdgeInsets.swift */; }; @@ -164,9 +157,8 @@ 7AC8B2762D6A01C700190706 /* UISearchTextField+Dumb.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AC8B2752D6A01C700190706 /* UISearchTextField+Dumb.swift */; }; 7ACBB91E2CB9B155005A5168 /* Mockable in Frameworks */ = {isa = PBXBuildFile; productRef = 7ACBB91D2CB9B155005A5168 /* Mockable */; }; 7ACBB9202CB9B16C005A5168 /* Mockable in Frameworks */ = {isa = PBXBuildFile; productRef = 7ACBB91F2CB9B16C005A5168 /* Mockable */; }; - 7AD176AD2DC110830023049D /* Environment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AD176AC2DC110830023049D /* Environment.swift */; }; + 7AD176B02DC127540023049D /* PNButtonType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7AD176AF2DC127540023049D /* PNButtonType.swift */; }; 7ADCBC572DB51739002522C0 /* AutoCatApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADCBC562DB51739002522C0 /* AutoCatApp.swift */; }; - 7ADF6C97250F41B000F237B2 /* PNKeyboard.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADF6C96250F41B000F237B2 /* PNKeyboard.swift */; }; 7ADF6C99250F872C00F237B2 /* RoadNumbers.otf in Resources */ = {isa = PBXBuildFile; fileRef = 7ADF6C98250F872C00F237B2 /* RoadNumbers.otf */; }; 7ADF6CA12512244400F237B2 /* MapExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADF6CA02512244400F237B2 /* MapExt.swift */; }; 7ADFC9572DAD0288001A43E3 /* GoogleAuthScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7ADFC9562DAD0288001A43E3 /* GoogleAuthScreen.swift */; }; @@ -270,7 +262,6 @@ 7A1022712C554A1300B84627 /* CustomHostingController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomHostingController.swift; sourceTree = ""; }; 7A1022762C557EC400B84627 /* LocationPickerScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationPickerScreen.swift; sourceTree = ""; }; 7A1022782C557ED600B84627 /* LocationPickerViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LocationPickerViewModel.swift; sourceTree = ""; }; - 7A1090EB24A4E3E100B4F0B2 /* CellProgressView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CellProgressView.swift; sourceTree = ""; }; 7A1146FD23FDE7E500B424AF /* AutoCat.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = AutoCat.app; sourceTree = BUILT_PRODUCTS_DIR; }; 7A11470923FDE7E600B424AF /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 7A11470E23FDE7E600B424AF /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; @@ -286,7 +277,6 @@ 7A17CE492A2E820300626A6E /* UIStackView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIStackView.swift; sourceTree = ""; }; 7A17CE4B2A2E850200626A6E /* UISegmentedControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UISegmentedControl.swift; sourceTree = ""; }; 7A1CF81529A42117007962DA /* Realm.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Realm.swift; sourceTree = ""; }; - 7A1DC38D2517ED98002E9C99 /* BlockBarButtonItem.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BlockBarButtonItem.swift; sourceTree = ""; }; 7A1E78F52CE900330004B740 /* ReportScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportScreen.swift; sourceTree = ""; }; 7A1E78F72CE900440004B740 /* ReportViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReportViewModel.swift; sourceTree = ""; }; 7A1E78FE2CE91A740004B740 /* Vehicle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Vehicle.swift; sourceTree = ""; }; @@ -350,10 +340,8 @@ 7A659B5824A2B1BA0043A0F2 /* AudioRecord.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecord.swift; sourceTree = ""; }; 7A6B65B22CFB0DB500AABA6B /* NullifyDate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NullifyDate.swift; sourceTree = ""; }; 7A6C65212D999325001240C2 /* AudioRecordViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AudioRecordViewModel.swift; sourceTree = ""; }; - 7A6DD902242BF4A5009DE740 /* PlateView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlateView.swift; sourceTree = ""; }; 7A6DD90724329144009DE740 /* CenterTextLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CenterTextLayer.swift; sourceTree = ""; }; 7A6DD90924329541009DE740 /* RoadNumbers2.0.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = RoadNumbers2.0.otf; sourceTree = ""; }; - 7A6DD90B24335A6D009DE740 /* FlagLayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FlagLayer.swift; sourceTree = ""; }; 7A6DD90D24337930009DE740 /* PlateNumber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PlateNumber.swift; sourceTree = ""; }; 7A6F095F26DBF588003A965D /* VehicleNote.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleNote.swift; sourceTree = ""; }; 7A7097C12C9EC139007CFDCA /* ServiceContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ServiceContainer.swift; sourceTree = ""; }; @@ -406,8 +394,6 @@ 7AB587312C42D38E00FA7B66 /* StorageServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StorageServiceProtocol.swift; sourceTree = ""; }; 7AB587332C42D3FA00FA7B66 /* StorageService+Notes.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StorageService+Notes.swift"; sourceTree = ""; }; 7AB587402C42FFE200FA7B66 /* ApiServiceProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApiServiceProtocol.swift; sourceTree = ""; }; - 7AB67E8B2435C38700258F61 /* CustomTextField.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomTextField.swift; sourceTree = ""; }; - 7AB67E8D2435D1A000258F61 /* CustomButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomButton.swift; sourceTree = ""; }; 7AB9FE212D08C2A5005DE374 /* EventsScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventsScreen.swift; sourceTree = ""; }; 7AB9FE272D08C2F4005DE374 /* EventsViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventsViewModel.swift; sourceTree = ""; }; 7AB9FE292D08CF35005DE374 /* EventsScreenMode.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EventsScreenMode.swift; sourceTree = ""; }; @@ -418,7 +404,6 @@ 7ABDA80A2D8715DC0083C715 /* VehicleRecordError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VehicleRecordError.swift; sourceTree = ""; }; 7ABDA80C2D8721B10083C715 /* Substrings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Substrings.swift; sourceTree = ""; }; 7ABDA80E2D8723F90083C715 /* StorageService+AudioRecords.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "StorageService+AudioRecords.swift"; sourceTree = ""; }; - 7AC3554F29696D5A00889457 /* NewNumberController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NewNumberController.swift; sourceTree = ""; }; 7AC35553296973E100889457 /* ACButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ACButton.swift; sourceTree = ""; }; 7AC355582969746600889457 /* UIControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIControl.swift; sourceTree = ""; }; 7AC3555A296995B200889457 /* UIEdgeInsets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIEdgeInsets.swift; sourceTree = ""; }; @@ -427,9 +412,8 @@ 7AC44B892DB4395300ADC026 /* SearchSplitScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchSplitScreen.swift; sourceTree = ""; }; 7AC76D7A270083AE0084DB27 /* TextView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextView.swift; sourceTree = ""; }; 7AC8B2752D6A01C700190706 /* UISearchTextField+Dumb.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UISearchTextField+Dumb.swift"; sourceTree = ""; }; - 7AD176AC2DC110830023049D /* Environment.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Environment.swift; sourceTree = ""; }; + 7AD176AF2DC127540023049D /* PNButtonType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PNButtonType.swift; sourceTree = ""; }; 7ADCBC562DB51739002522C0 /* AutoCatApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutoCatApp.swift; sourceTree = ""; }; - 7ADF6C96250F41B000F237B2 /* PNKeyboard.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PNKeyboard.swift; sourceTree = ""; }; 7ADF6C98250F872C00F237B2 /* RoadNumbers.otf */ = {isa = PBXFileReference; lastKnownFileType = file; path = RoadNumbers.otf; sourceTree = ""; }; 7ADF6CA02512244400F237B2 /* MapExt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapExt.swift; sourceTree = ""; }; 7ADFC9562DAD0288001A43E3 /* GoogleAuthScreen.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GoogleAuthScreen.swift; sourceTree = ""; }; @@ -588,13 +572,11 @@ 7AB587352C42E3BF00FA7B66 /* Preview */, 7AFBE8C52C30812E003C491D /* SwiftUI */, 7AC355552969742800889457 /* ACUIKit */, - 7A11471423FDEAF800B424AF /* Controllers */, 7A1441632C297E9800E79018 /* Screens */, 7A3F07A924360D9100E59687 /* Extensions */, 7A6DD90424326788009DE740 /* Fonts */, 7A11472C23FECA3E00B424AF /* ThirdParty */, 7A11474223FF06B600B424AF /* Utils */, - 7A6DD901242BF48D009DE740 /* Views */, 7A64AE6B2469DC6900ABE48E /* AutoCat.entitlements */, 7A11470E23FDE7E600B424AF /* Info.plist */, 7A11470923FDE7E600B424AF /* Assets.xcassets */, @@ -606,14 +588,6 @@ path = AutoCat; sourceTree = ""; }; - 7A11471423FDEAF800B424AF /* Controllers */ = { - isa = PBXGroup; - children = ( - 7AC3554F29696D5A00889457 /* NewNumberController.swift */, - ); - path = Controllers; - sourceTree = ""; - }; 7A11472C23FECA3E00B424AF /* ThirdParty */ = { isa = PBXGroup; children = ( @@ -858,20 +832,6 @@ path = AudioRecordView; sourceTree = ""; }; - 7A6DD901242BF48D009DE740 /* Views */ = { - isa = PBXGroup; - children = ( - 7A6DD902242BF4A5009DE740 /* PlateView.swift */, - 7A6DD90B24335A6D009DE740 /* FlagLayer.swift */, - 7AB67E8B2435C38700258F61 /* CustomTextField.swift */, - 7AB67E8D2435D1A000258F61 /* CustomButton.swift */, - 7A1090EB24A4E3E100B4F0B2 /* CellProgressView.swift */, - 7ADF6C96250F41B000F237B2 /* PNKeyboard.swift */, - 7A1DC38D2517ED98002E9C99 /* BlockBarButtonItem.swift */, - ); - path = Views; - sourceTree = ""; - }; 7A6DD90424326788009DE740 /* Fonts */ = { isa = PBXGroup; children = ( @@ -1074,6 +1034,17 @@ path = MainScreen; sourceTree = ""; }; + 7AD176AE2DC127290023049D /* NumberEditView */ = { + isa = PBXGroup; + children = ( + 7AD176AF2DC127540023049D /* PNButtonType.swift */, + 7AB490282D6B1217002F39C6 /* ACKeyboardView.swift */, + 7AB4902A2D6B1446002F39C6 /* ACKeyboardButton.swift */, + 7A589E0E2D6B6E8E00EF3FBE /* NumberEditView.swift */, + ); + path = NumberEditView; + sourceTree = ""; + }; 7ADFC9552DAD026C001A43E3 /* GoogleAuthScreen */ = { isa = PBXGroup; children = ( @@ -1136,6 +1107,7 @@ 7AFBE8C52C30812E003C491D /* SwiftUI */ = { isa = PBXGroup; children = ( + 7AD176AE2DC127290023049D /* NumberEditView */, 7AAAFAD12C4D0FB00050410D /* ACImageSlider */, 7AFBE8C62C30814E003C491D /* ACProgressHud */, 7A961C6B2C4C3C8600CE2211 /* TextRowView.swift */, @@ -1150,11 +1122,7 @@ 7A912F362D381B7400002938 /* LicensePlateView.swift */, 7AB4E42B2D397D8E0006D052 /* VehicleCellView.swift */, 7AC8B2752D6A01C700190706 /* UISearchTextField+Dumb.swift */, - 7AB490282D6B1217002F39C6 /* ACKeyboardView.swift */, - 7AB4902A2D6B1446002F39C6 /* ACKeyboardButton.swift */, - 7A589E0E2D6B6E8E00EF3FBE /* NumberEditView.swift */, 7AF231982DA27C1B00AE5EB3 /* ACButtonView.swift */, - 7AD176AC2DC110830023049D /* Environment.swift */, ); path = SwiftUI; sourceTree = ""; @@ -1386,7 +1354,6 @@ buildActionMask = 2147483647; files = ( 7A961C6C2C4C3C8600CE2211 /* TextRowView.swift in Sources */, - 7AD176AD2DC110830023049D /* Environment.swift in Sources */, 7A1022772C557EC400B84627 /* LocationPickerScreen.swift in Sources */, 7A4322932CB2CCAA00085CF6 /* FiltersViewModel.swift in Sources */, 7A5D7E0C2C71EB25002C17E7 /* ToggleRowView.swift in Sources */, @@ -1399,10 +1366,7 @@ 7AAAFADA2C4D1AFE0050410D /* Zoomable.swift in Sources */, 7ADFC9572DAD0288001A43E3 /* GoogleAuthScreen.swift in Sources */, 7AC8B2762D6A01C700190706 /* UISearchTextField+Dumb.swift in Sources */, - 7A6DD90C24335A6D009DE740 /* FlagLayer.swift in Sources */, 7A2E11292CCE395300E5CA17 /* OptionalDatePicker.swift in Sources */, - 7AC3555029696D5A00889457 /* NewNumberController.swift in Sources */, - 7AB67E8C2435C38700258F61 /* CustomTextField.swift in Sources */, 7AF860702CBAA24500954D2F /* NavigationLink.swift in Sources */, 7ADCBC572DB51739002522C0 /* AutoCatApp.swift in Sources */, 7AFFF7A02DBAAFF300EE2DEE /* SideBarItem.swift in Sources */, @@ -1413,7 +1377,6 @@ 7A4927D52CCE438600851C01 /* OptionalBinding.swift in Sources */, 7A5911EE2D63226F00EC51BA /* SearchScreen.swift in Sources */, 7A17CE4A2A2E820300626A6E /* UIStackView.swift in Sources */, - 7A1DC38E2517ED98002E9C99 /* BlockBarButtonItem.swift in Sources */, 7AC44B882DB438F200ADC026 /* UIView+layout.swift in Sources */, 7A6C65222D999325001240C2 /* AudioRecordViewModel.swift in Sources */, 7A06E0AE2C7065C7005731AC /* SettingsViewModel.swift in Sources */, @@ -1422,6 +1385,7 @@ 7ADF6CA12512244400F237B2 /* MapExt.swift in Sources */, 7AC44B822DB390B900ADC026 /* MainTabScreen.swift in Sources */, 7A7158122C444A6400852088 /* AdsViewModel.swift in Sources */, + 7AD176B02DC127540023049D /* PNButtonType.swift in Sources */, 7AF231952DA1C29300AE5EB3 /* AuthViewModel.swift in Sources */, 7AB4E4662D58A16C0006D052 /* GenericError.swift in Sources */, 7AFBE8CA2C3081C7003C491D /* ACProgressHud+Modifiers.swift in Sources */, @@ -1439,10 +1403,8 @@ 7A2C96122C3B155B00AE46B5 /* NoteAlertModifier.swift in Sources */, 7AE24C5F251F1B4E00758E39 /* Buttons.swift in Sources */, 7A7DADAC2D99738300F52F6C /* AudioRecordView.swift in Sources */, - 7A1090EC24A4E3E100B4F0B2 /* CellProgressView.swift in Sources */, 7AB9FE2A2D08CF35005DE374 /* EventsScreenMode.swift in Sources */, 7AB490292D6B1217002F39C6 /* ACKeyboardView.swift in Sources */, - 7A6DD903242BF4A5009DE740 /* PlateView.swift in Sources */, 7A1022722C554A1300B84627 /* CustomHostingController.swift in Sources */, 7A1022792C557ED600B84627 /* LocationPickerViewModel.swift in Sources */, 7AF231932DA1C28100AE5EB3 /* AuthScreen.swift in Sources */, @@ -1456,7 +1418,6 @@ 7A8AB76525A0DB8F00ECF2C1 /* BundleVersion.swift in Sources */, 7A9519822D80B6E500E69883 /* RecordsViewModel.swift in Sources */, 7AC355592969746600889457 /* UIControl.swift in Sources */, - 7AB67E8E2435D1A000258F61 /* CustomButton.swift in Sources */, 7AC35554296973E100889457 /* ACButton.swift in Sources */, 7AAAFADC2C4D1E130050410D /* ACImageSliderView+Modifier.swift in Sources */, 7AFBE8C42C302561003C491D /* ACHudContainer.swift in Sources */, @@ -1476,7 +1437,6 @@ 7AB9FE222D08C2A5005DE374 /* EventsScreen.swift in Sources */, 7A5911F02D63266B00EC51BA /* SearchViewModel.swift in Sources */, 7A589E0F2D6B6E8E00EF3FBE /* NumberEditView.swift in Sources */, - 7ADF6C97250F41B000F237B2 /* PNKeyboard.swift in Sources */, 7A17CE4C2A2E850200626A6E /* UISegmentedControl.swift in Sources */, 7A9519802D80B6C100E69883 /* RecordsScreen.swift in Sources */, 7A131FD52D37B76A00DC7755 /* HistoryViewModel.swift in Sources */, diff --git a/AutoCat/Controllers/NewNumberController.swift b/AutoCat/Controllers/NewNumberController.swift deleted file mode 100644 index 2d8d158..0000000 --- a/AutoCat/Controllers/NewNumberController.swift +++ /dev/null @@ -1,206 +0,0 @@ -import UIKit -import AutoCatCore - -// MARK: - Types - -enum NumberType: Int, CaseIterable { - - case plateNumber = 0 - case vin = 1 - - var title: String { - switch self { - case .plateNumber: return "GRZ" - case .vin: return "VIN" - } - } -} - -class NewNumberController: UIViewController { - - // MARK: - Views - - private lazy var keyboardView: PNKeyboard = { - let keyboard = PNKeyboard(target: self.plateView) - keyboard.delegate = self - return keyboard - }() - - private lazy var plateView: PlateView = { - let view = PlateView(frame: .zero) - view.fontSize = 48 - view.number = PlateNumber("") - view.onChange = onNumberChanged - view.setContentHuggingPriority(.defaultHigh, for: .horizontal) - view.accessibilityIdentifier = "plateView" - return view - }() - - private lazy var vinField: UITextField = { - let view = UITextField() - view.translatesAutoresizingMaskIntoConstraints = false - view.borderStyle = .roundedRect - view.isHidden = true - return view - }() - - private lazy var checkButton: ACButton = { - let button = ACButton(title: NSLocalizedString("Check", comment: ""), onTap: check) - button.isEnabled = false - button.contentEdgeInsets = .init(top: 0, left: 8, bottom: 0, right: 8) - button.accessibilityIdentifier = "checkButton" - button.setContentHuggingPriority(.defaultHigh, for: .horizontal) - return button - }() - - private lazy var stackView: UIStackView = .horizontal([ - plateView, vinField, checkButton - ]) - - private let titleLabel: UILabel = { - let label = UILabel() - label.text = NSLocalizedString("Check number", comment: "") - label.font = UIFont.preferredFont(forTextStyle: .headline) - label.textAlignment = .center - label.translatesAutoresizingMaskIntoConstraints = false - return label - }() - - private lazy var mainStackView: UIStackView = .vertical([ - titleLabel, - stackView, - //settingsStackView, - keyboardView - ]) - - private let locationSwitcherView: UISegmentedControl = .segments(images: [ - UIImage(systemName: "location.fill"), - UIImage(systemName: "location"), - UIImage(systemName: "location.slash") - ]) - - private lazy var numTypeSwitcherView: UISegmentedControl = .segments(titles: NumberType.allCases.map(\.title)) - .select(index: NumberType.plateNumber.rawValue) - .onValueChanged(onNumberTypeChanged) - - private lazy var settingsStackView: UIStackView = .horizontal([ - numTypeSwitcherView, - locationSwitcherView - ]) - .distribution(.fillProportionally) - - // MARK: - Variables - - public var onCheck: ((String) -> Void)? - private var numberType: NumberType = .plateNumber - - // MARK: - Lifecycle - - override func viewDidLoad() { - super.viewDidLoad() - - view.addSubview(mainStackView) - mainStackView.pin(to: view, insets: .all(16)) - - #if targetEnvironment(macCatalyst) - - addKeyCommand(UIKeyCommand(input: "v", modifierFlags: .command, action: #selector(pasteText))) - - #endif - } - - func check() { - guard let number = plateView.number, number.isValid else { - return - } - - let numberNormalized = number.asString().filter { !$0.isWhitespace }.uppercased() - onCheck?(numberNormalized) - } - - func onNumberChanged() { - checkButton.isEnabled = plateView.number?.isValid ?? false - } - - func onNumberTypeChanged(_ index: Int) { - guard let type = NumberType(rawValue: index) else { - return - } - - numberType = type - - switch type { - case .plateNumber: - plateView.isHidden = false - vinField.isHidden = true - keyboardView.target = plateView - keyboardView.type = .plateNumber - case .vin: - plateView.isHidden = true - vinField.isHidden = false - keyboardView.target = vinField - keyboardView.type = .vin - } - } -} - -extension NewNumberController: PNKeyboardDelegate { - - func returnClicked() { - check() - } -} - -#if targetEnvironment(macCatalyst) - -extension NewNumberController { - - override func pressesBegan(_ presses: Set, with event: UIPressesEvent?) { - - let ruLetters = Constants.pnLettersMap.keys.map(String.init) - let enLetters = Constants.pnLettersMap.values.map(String.init) - let numbers = Array((0..<10).map(String.init)) - - var didHandleEvent = true - - for press in presses { - guard let key = press.key else { - continue - } - - switch key.keyCode { - case .keyboardReturnOrEnter: - check() - case .keyboardEscape: - dismiss(animated: true) - case .keyboardDeleteOrBackspace: - plateView.deleteBackward() - default: - let c = key.charactersIgnoringModifiers.uppercased() - if ruLetters.contains(c) || numbers.contains(c) { - plateView.insertText(c) - } else if enLetters.contains(c) { - if let ruChar = Constants.pnLettersMap.first(where: { $0.value == c.first })?.key { - plateView.insertText(String(ruChar)) - } - } else { - didHandleEvent = false - } - } - } - - if didHandleEvent == false { - super.pressesBegan(presses, with: event) - } - } - - @objc func pasteText() { - guard let text = UIPasteboard.general.string else { - return - } - - plateView.setNumber(text) - } -} - -#endif diff --git a/AutoCat/SwiftUI/ACKeyboardButton.swift b/AutoCat/SwiftUI/NumberEditView/ACKeyboardButton.swift similarity index 100% rename from AutoCat/SwiftUI/ACKeyboardButton.swift rename to AutoCat/SwiftUI/NumberEditView/ACKeyboardButton.swift diff --git a/AutoCat/SwiftUI/ACKeyboardView.swift b/AutoCat/SwiftUI/NumberEditView/ACKeyboardView.swift similarity index 100% rename from AutoCat/SwiftUI/ACKeyboardView.swift rename to AutoCat/SwiftUI/NumberEditView/ACKeyboardView.swift diff --git a/AutoCat/SwiftUI/NumberEditView.swift b/AutoCat/SwiftUI/NumberEditView/NumberEditView.swift similarity index 100% rename from AutoCat/SwiftUI/NumberEditView.swift rename to AutoCat/SwiftUI/NumberEditView/NumberEditView.swift diff --git a/AutoCat/SwiftUI/Environment.swift b/AutoCat/SwiftUI/NumberEditView/PNButtonType.swift similarity index 53% rename from AutoCat/SwiftUI/Environment.swift rename to AutoCat/SwiftUI/NumberEditView/PNButtonType.swift index 151b355..709a5ad 100644 --- a/AutoCat/SwiftUI/Environment.swift +++ b/AutoCat/SwiftUI/NumberEditView/PNButtonType.swift @@ -1,14 +1,14 @@ // -// Environment.swift +// PNButtonType.swift // AutoCat // // Created by Selim Mustafaev on 29.04.2025. // Copyright © 2025 Selim Mustafaev. All rights reserved. // -import SwiftUI - -extension EnvironmentValues { +enum PNButtonType { - @Entry var selectedTab: SideBarItem = .history + case symbol(Character) + case backspace + case done } diff --git a/AutoCat/Views/BlockBarButtonItem.swift b/AutoCat/Views/BlockBarButtonItem.swift deleted file mode 100644 index 4672c57..0000000 --- a/AutoCat/Views/BlockBarButtonItem.swift +++ /dev/null @@ -1,29 +0,0 @@ -import UIKit - -class BlockBarButtonItem: UIBarButtonItem { - typealias ActionHandler = (UIBarButtonItem) -> Void - - private var actionHandler: ActionHandler? - - convenience init(image: UIImage?, style: UIBarButtonItem.Style, actionHandler: ActionHandler?) { - self.init(image: image, style: style, target: nil, action: #selector(barButtonItemPressed(sender:))) - target = self - self.actionHandler = actionHandler - } - - convenience init(title: String?, style: UIBarButtonItem.Style, actionHandler: ActionHandler?) { - self.init(title: title, style: style, target: nil, action: #selector(barButtonItemPressed(sender:))) - target = self - self.actionHandler = actionHandler - } - - convenience init(barButtonSystemItem systemItem: UIBarButtonItem.SystemItem, actionHandler: ActionHandler?) { - self.init(barButtonSystemItem: systemItem, target: nil, action: #selector(barButtonItemPressed(sender:))) - target = self - self.actionHandler = actionHandler - } - - @objc func barButtonItemPressed(sender: UIBarButtonItem) { - actionHandler?(sender) - } -} diff --git a/AutoCat/Views/CellProgressView.swift b/AutoCat/Views/CellProgressView.swift deleted file mode 100644 index abd38f3..0000000 --- a/AutoCat/Views/CellProgressView.swift +++ /dev/null @@ -1,41 +0,0 @@ -import UIKit - -class CellProgressView: UIView { - - let progressLayer = CAShapeLayer() - - var progress: Double = 0 { - didSet { - let path = UIBezierPath(rect: self.rect(for: self.progress)) - let pathFrom = self.progressLayer.path - self.progressLayer.path = path.cgPath - if self.progress != 0 { - let animation = CABasicAnimation(keyPath: "path") - animation.duration = 0.2 - animation.fromValue = pathFrom - animation.toValue = path.cgPath - animation.timingFunction = CAMediaTimingFunction(name: .linear) - self.progressLayer.add(animation, forKey: "pathAnimation") - } - } - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - - self.progressLayer.frame = self.layer.bounds - self.progressLayer.path = UIBezierPath(rect: self.layer.bounds).cgPath - self.progressLayer.fillColor = UIColor.systemBlue.cgColor - self.progressLayer.opacity = 0.3 - self.layer.addSublayer(self.progressLayer) - } - - override func layoutSubviews() { - super.layoutSubviews() - self.progressLayer.frame = rect(for: self.progress) - } - - func rect(for progress: Double) -> CGRect { - return CGRect(x: 0, y: 0, width: self.bounds.width*CGFloat(progress), height: self.bounds.height) - } -} diff --git a/AutoCat/Views/CustomButton.swift b/AutoCat/Views/CustomButton.swift deleted file mode 100644 index 010ba9e..0000000 --- a/AutoCat/Views/CustomButton.swift +++ /dev/null @@ -1,14 +0,0 @@ -import UIKit - -class CustomButton: UIButton { - - required init?(coder: NSCoder) { - super.init(coder: coder) - self.layer.cornerRadius = 6 - } - - override func layoutSubviews() { - super.layoutSubviews() - self.layer.opacity = self.isEnabled ? 1 : 0.5 - } -} diff --git a/AutoCat/Views/CustomTextField.swift b/AutoCat/Views/CustomTextField.swift deleted file mode 100644 index f16c7bb..0000000 --- a/AutoCat/Views/CustomTextField.swift +++ /dev/null @@ -1,32 +0,0 @@ -import UIKit - -class CustomTextField: UITextField, UITextFieldDelegate { - - @IBInspectable var editable: Bool = true - - @IBInspectable var borderWidth: CGFloat = 1 { - didSet { - self.layer.borderWidth = self.borderWidth - } - } - - @IBInspectable var cornerRadius: CGFloat = 6 { - didSet { - self.layer.cornerRadius = self.cornerRadius - } - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - self.delegate = self - } - - override func layoutSubviews() { - super.layoutSubviews() - self.layer.borderColor = UIColor.secondaryLabel.cgColor - } - - func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { - return self.editable - } -} diff --git a/AutoCat/Views/FlagLayer.swift b/AutoCat/Views/FlagLayer.swift deleted file mode 100644 index 32ac4f2..0000000 --- a/AutoCat/Views/FlagLayer.swift +++ /dev/null @@ -1,41 +0,0 @@ -import UIKit - -class FlagLayer: CALayer { - let pixelWidth: CGFloat - - // Flag colors - https://ru.wikipedia.org/wiki/%D0%A4%D0%BB%D0%B0%D0%B3_%D0%A0%D0%BE%D1%81%D1%81%D0%B8%D0%B8 - let blue = CGColor(srgbRed: 0, green: 57/256.0, blue: 166/256.0, alpha: 1) - let red = CGColor(srgbRed: 213/256.0, green: 43/256.0, blue: 30/256.0, alpha: 1) - - init(scale: CGFloat) { - - self.pixelWidth = 1/scale - super.init() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func draw(in ctx: CGContext) { - ctx.saveGState() - super.draw(in: ctx) - - ctx.setStrokeColor(UIColor.black.cgColor) - ctx.setLineWidth(0) - - ctx.setFillColor(UIColor.white.cgColor) - ctx.fill(bounds.inset(by: UIEdgeInsets(top: 0, left: 0, bottom: bounds.height*2/3, right: 0))) - - ctx.setFillColor(self.blue) - ctx.fill(bounds.insetBy(dx: 0, dy: bounds.height/3)) - - ctx.setFillColor(self.red) - ctx.fill(bounds.inset(by: UIEdgeInsets(top: bounds.height*2/3, left: 0, bottom: 0, right: 0))) - - ctx.setLineWidth(pixelWidth) - ctx.stroke(bounds.insetBy(dx: pixelWidth/2, dy: pixelWidth/2)) - - ctx.restoreGState() - } -} diff --git a/AutoCat/Views/PNKeyboard.swift b/AutoCat/Views/PNKeyboard.swift deleted file mode 100644 index 732e6ba..0000000 --- a/AutoCat/Views/PNKeyboard.swift +++ /dev/null @@ -1,300 +0,0 @@ -import UIKit -import AutoCatCore - -@MainActor -protocol PNKeyboardDelegate: AnyObject { - func returnClicked() -} - -@MainActor -protocol PNButtonDelegate: AnyObject { - func buttonTapped(_ button: PNButton) -} - -enum PNButtonType { - case symbol(Character) - case backspace - case done -} - -enum PNKeyboardType { - - case plateNumber - case vin -} - -class PNButton: UIButton { - private(set) var type: PNButtonType - private var keyboardType: PNKeyboardType = .plateNumber - private var rectLayer = CAShapeLayer() - private var bgColor = UIColor(named: "KeyBackground") - - weak var delegate: PNButtonDelegate? - - var letterFont: UIFont? { - - switch keyboardType { - case .plateNumber: - return UIFont(name: "RoadNumbers", size: 36) - case .vin: - return .systemFont(ofSize: 24) - } - } - - var digitFont: UIFont? { - - switch keyboardType { - case .plateNumber: - return UIFont(name: "RoadNumbersCyr-Regular", size: 30) - case .vin: - return .systemFont(ofSize: 24) - } - } - - init(letter: Character, keyboardType: PNKeyboardType = .plateNumber) { - self.type = .symbol(letter) - self.keyboardType = keyboardType - super.init(frame: .zero) - self.setup() - self.titleLabel?.font = letterFont - let title = String(Constants.pnLettersMap[letter] ?? letter) - self.setTitle(title, for: .normal) - self.setTitleColor(.label, for: .normal) - } - - init(digit: Int, keyboardType: PNKeyboardType = .plateNumber) { - self.type = .symbol(String(digit).first!) - self.keyboardType = keyboardType - super.init(frame: .zero) - self.setup() - self.titleLabel?.font = digitFont - let character = Character(String(digit)) - let title = String(Constants.pnLettersMap[character] ?? character) - self.setTitle(title, for: .normal) - self.setTitleColor(.label, for: .normal) - } - - init(imageName: String, type: PNButtonType) { - self.type = type - self.bgColor = UIColor(named: "DarkKeyBackground") - super.init(frame: .zero) - self.setup() - self.setImage(UIImage(systemName: imageName), for: .normal) - self.tintColor = .label - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - func setup(_ radius: CGFloat = 0.5) { - self.rectLayer.cornerRadius = 6 - self.layer.addSublayer(self.rectLayer) - self.imageView?.layer.zPosition = 2 - - self.contentEdgeInsets = .vertical(12) - - self.rectLayer.shadowColor = UIColor.black.cgColor - self.rectLayer.shadowOpacity = 0.4 - self.rectLayer.shadowOffset = CGSize(width: 0.0, height : 1.0) - self.rectLayer.shadowRadius = radius - - self.addTarget(self, action: #selector(buttonDown), for: .touchDown) - self.addTarget(self, action: #selector(buttonUp), for: [.touchUpInside, .touchUpOutside, .touchCancel]) - self.addTarget(self, action: #selector(touchUpInside), for: .touchUpInside) - } - - override func layoutSubviews() { - super.layoutSubviews() - self.rectLayer.backgroundColor = self.bgColor?.cgColor - self.rectLayer.frame = self.layer.bounds.inset(by: UIEdgeInsets(top: 4, left: 4, bottom: 4, right: 4)) - } - - @objc func buttonDown(_ sender: PNButton) { - sender.layer.opacity = 0.3 - } - - @objc func buttonUp(_ sender: PNButton) { - sender.layer.opacity = 1 - } - - @objc func touchUpInside(_ sender: PNButton) { - self.delegate?.buttonTapped(self) - } - - func setBacgroundColor(color: UIColor) { - self.bgColor = color - self.setNeedsLayout() - } -} - -class PNKeyboard: UIView, UIInputViewAudioFeedback, PNButtonDelegate { - public weak var target: UIKeyInput? - weak var delegate: PNKeyboardDelegate? - - private let insets: UIEdgeInsets - - public var type: PNKeyboardType { - didSet { - setupButtons() - } - } - - var letters: [Character] { - - switch type { - case .plateNumber: - return Array(Constants.pnLettersMap.keys) - case .vin: - return Constants.vinLetters - } - } - - private var lettersWidthConstraint: NSLayoutConstraint? - private var digitsWidthConstraint: NSLayoutConstraint? - - var mainStack: UIStackView = .horizontal([]) - //.distribution(.fillProportionally) - .spacing(16) - - init(target: UIKeyInput, type: PNKeyboardType = .plateNumber, insets: UIEdgeInsets = .zero) { - self.target = target - self.insets = insets - self.type = type - super.init(frame: .zero) - self.autoresizingMask = [.flexibleWidth, .flexibleHeight] - - let blurEffectView = UIVisualEffectView(effect: UIBlurEffect()) - blurEffectView.autoresizingMask = [.flexibleWidth, .flexibleHeight] - self.addSubview(blurEffectView) - self.addSubview(mainStack) - - NSLayoutConstraint.activate([ - mainStack.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: insets.left), - mainStack.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: -insets.right), - mainStack.topAnchor.constraint(equalTo: self.topAnchor, constant: insets.top), - mainStack.bottomAnchor.constraint(equalTo: self.safeAreaLayoutGuide.bottomAnchor, constant: -insets.bottom) - ]) - - self.setupButtons() - } - - required init?(coder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - - override func layoutSubviews() { - super.layoutSubviews() - - let lettersMult: CGFloat = type == .plateNumber ? 0.5 : 2.0/3.0 - let digitsMult: CGFloat = type == .plateNumber ? 0.5 : 1.0/3.0 - let availableWidth = frame.width - mainStack.spacing - - let newLettersWidth = availableWidth*lettersMult - let newDigitsWidth = availableWidth*digitsMult - - let needChangeConstraints = lettersWidthConstraint?.constant != newLettersWidth - || digitsWidthConstraint?.constant != newDigitsWidth - - if needChangeConstraints { - lettersWidthConstraint?.constant = newLettersWidth - digitsWidthConstraint?.constant = newDigitsWidth - } - } - - func letterRows(from buttons: [PNButton]) -> [UIView] { - - switch type { - case .plateNumber: - return [ - createLetterStack([buttons[0], buttons[1], buttons[2]]), - createLetterStack([buttons[3], buttons[4], buttons[5]]), - createLetterStack([buttons[6], buttons[7], buttons[8]]), - createLetterStack([buttons[9], buttons[10], buttons[11]]) - ] - case .vin: - return [ - createLetterStack([buttons[0], buttons[1], buttons[2], buttons[3], buttons[4], buttons[5]]), - createLetterStack([buttons[6], buttons[7], buttons[8], buttons[9], buttons[10], buttons[11]]), - createLetterStack([buttons[12], buttons[13], buttons[14], buttons[15], buttons[16], buttons[17]]), - createLetterStack([buttons[18], buttons[19], buttons[20], buttons[21], buttons[22]]) - ] - } - } - - func setupButtons() { - let letterButtons: [PNButton] = letters.sorted().map { letter in - let button = PNButton(letter: letter, keyboardType: type) - button.delegate = self - return button - } - let digits: [PNButton] = [1,2,3,4,5,6,7,8,9,0].map { digit in - let button = PNButton(digit: digit, keyboardType: type) - button.delegate = self - return button - } - let backspace = PNButton(imageName: "delete.left", type: .backspace) - backspace.delegate = self - - let done = PNButton(imageName: "arrow.turn.down.left", type: .done) - done.delegate = self - done.setBacgroundColor(color: .systemBlue) - done.tintColor = .white - - let rows = letterRows(from: letterButtons) - let lettersStack = UIStackView(arrangedSubviews: rows) - lettersStack.axis = .vertical - lettersStack.distribution = .fillEqually - //lettersStack.spacing = 8 - - let digitRows = [ - self.createLetterStack([digits[0], digits[1], digits[2]]), - self.createLetterStack([digits[3], digits[4], digits[5]]), - self.createLetterStack([digits[6], digits[7], digits[8]]), - self.createLetterStack([digits[9], backspace, done]) - ] - - let digitsStack = UIStackView(arrangedSubviews: digitRows) - digitsStack.axis = .vertical - digitsStack.distribution = .fillEqually - //digitsStack.spacing = 8 - - mainStack.setArrangedSubviews([lettersStack, digitsStack]) - - lettersWidthConstraint = lettersStack.widthAnchor.constraint(equalToConstant: 0) - digitsWidthConstraint = digitsStack.widthAnchor.constraint(equalToConstant: 0) - - lettersWidthConstraint?.priority = .defaultLow - digitsWidthConstraint?.priority = .defaultLow - - NSLayoutConstraint.activate([lettersWidthConstraint, digitsWidthConstraint].compactMap { $0 }) - } - - func createLetterStack(_ views: [UIView]) -> UIStackView { - let stack = UIStackView(arrangedSubviews: views) - stack.distribution = .fillEqually - //stack.spacing = 8 - return stack - } - - // MARK: - PNButtonDelegate - - func buttonTapped(_ button: PNButton) { - UIDevice.current.playInputClick() - - switch button.type { - case .symbol(let s): - self.target?.insertText(String(s)) - case .backspace: - self.target?.deleteBackward() - case .done: - self.delegate?.returnClicked() - } - } - - // MARK: - UIInputViewAudioFeedback - - var enableInputClicksWhenVisible: Bool { - return true - } -} diff --git a/AutoCat/Views/PlateView.swift b/AutoCat/Views/PlateView.swift deleted file mode 100644 index 08707c7..0000000 --- a/AutoCat/Views/PlateView.swift +++ /dev/null @@ -1,191 +0,0 @@ -import UIKit -import AutoCatCore - -private class CALayerAnimationsDisablingDelegate: NSObject, CALayerDelegate { - @MainActor static let shared = CALayerAnimationsDisablingDelegate() - private let null = NSNull() - - func action(for layer: CALayer, forKey event: String) -> CAAction? { - null - } -} - -class PlateView: UIView { - // Some driver plate parameters from "ГОСТ Р 50577-93" - // http://docs.cntd.ru/document/gost-r-50577-93 - private static let aspectRatio: CGFloat = 112.0/520.0 - private static let fontHeightCoeff: CGFloat = 58.0/76.0 - - private var bgLayer = CALayer() - private var mainBgLayer = CALayer() - private var regionBgLayer = CALayer() - private var numberLayer = CenterTextLayer(coeff: fontHeightCoeff) - private var regionLayer = CenterTextLayer(coeff: fontHeightCoeff) - private var countryLayer = CenterTextLayer() - private var flagLayer = FlagLayer(scale: UIScreen.main.scale) - - var number: PlateNumber? { - didSet { - self.layoutSubviews() - } - } - - var foreground: UIColor? { - didSet { - self.layoutSubviews() - } - } - - var fontSize: CGFloat = 10 { - didSet { - self.layoutSubviews() - } - } - - var onChange: (@MainActor () -> Void)? - - override init(frame: CGRect) { - super.init(frame: frame) - setup() - } - - required init?(coder: NSCoder) { - super.init(coder: coder) - setup() - } - - func setup() { - self.layer.backgroundColor = UIColor.clear.cgColor - - self.bgLayer.cornerRadius = 6 //self.bounds.height/8 - self.layer.addSublayer(self.bgLayer) - - self.mainBgLayer.cornerRadius = 4 - self.layer.addSublayer(self.mainBgLayer) - - self.regionBgLayer.cornerRadius = 4 - self.layer.addSublayer(self.regionBgLayer) - - self.numberLayer.alignmentMode = .center - self.numberLayer.contentsScale = UIScreen.main.scale - self.layer.addSublayer(self.numberLayer) - - self.regionLayer.alignmentMode = .center - self.regionLayer.contentsScale = UIScreen.main.scale - self.layer.addSublayer(self.regionLayer) - - self.countryLayer.contentsScale = UIScreen.main.scale - self.countryLayer.string = "RUS" - self.countryLayer.alignmentMode = .center - self.layer.addSublayer(self.countryLayer) - - self.flagLayer.contentsScale = UIScreen.main.scale - self.layer.addSublayer(self.flagLayer) - - disableAnimations(for: [ - bgLayer, - mainBgLayer, - regionBgLayer, - numberLayer, - regionLayer, - countryLayer, - flagLayer - ]) - } - - func disableAnimations(for layers: [CALayer]) { - layers.forEach { $0.delegate = CALayerAnimationsDisablingDelegate.shared } - } - - private func pathForFlag(in rect: CGRect) -> CGPath { - let path = CGMutablePath() - let rect = CGPath(rect: rect, transform: nil) - path.addPath(rect) - return path - } - - override func layoutSubviews() { - super.layoutSubviews() - guard let number = self.number else { return } - guard let fgColorMain = UIColor(named: "PlateForeground")?.cgColor else { return } - guard let bgColor = UIColor(named: "PlateBackground")?.cgColor else { return } - - let fgColor = self.foreground?.cgColor ?? fgColorMain - - self.bgLayer.backgroundColor = fgColor - self.bgLayer.frame = self.bounds - - self.mainBgLayer.backgroundColor = bgColor - self.regionBgLayer.backgroundColor = bgColor - self.mainBgLayer.frame = self.bounds.inset(by: UIEdgeInsets(top: 2, left: 2, bottom: 2, right: self.bounds.width*0.27 + 1)) - self.regionBgLayer.frame = self.bounds.inset(by: UIEdgeInsets(top: 2, left: self.bounds.width*0.73 + 1, bottom: 2, right: 2)) - - self.numberLayer.frame = self.mainBgLayer.frame.insetBy(dx: 4, dy: 0) - let font = UIFont(name: "RoadNumbers", size: self.mainBgLayer.frame.height*1.1) ?? UIFont.boldSystemFont(ofSize: 24) - let attributes: [NSAttributedString.Key: Any] = [ - .kern: 3, - .font: font, - .foregroundColor: fgColor - ] - let attributed = NSAttributedString(string: number.mainPart(), attributes: attributes) - self.numberLayer.string = attributed - - let rbgSize = self.regionBgLayer.frame.size - - self.regionLayer.frame = self.regionBgLayer.frame.inset(by: UIEdgeInsets(top: 2, left: 2, bottom: rbgSize.height*0.35, right: 2)) - let regionFont = UIFont(name: "RoadNumbers", size: rbgSize.height*0.8) ?? UIFont.boldSystemFont(ofSize: 24) - let regionAttrs: [NSAttributedString.Key: Any] = [ - .kern: 1, - .font: regionFont, - .foregroundColor: fgColor - ] - let attributedRegion = NSAttributedString(string: number.region(), attributes: regionAttrs) - self.regionLayer.string = attributedRegion - - self.countryLayer.foregroundColor = fgColor - self.countryLayer.frame = self.regionBgLayer.frame.inset(by: UIEdgeInsets(top: rbgSize.height*0.64, left: rbgSize.width*0.08, bottom: rbgSize.height*0.07, right: rbgSize.width*0.42)) - self.countryLayer.fontSize = self.countryLayer.frame.size.height - - let top = (self.regionBgLayer.frame.origin.y + rbgSize.height*0.68).rounded(.toNearestOrAwayFromZero) - let left = (self.regionBgLayer.frame.origin.x + rbgSize.width*0.62).rounded(.toNearestOrAwayFromZero) - let w = (rbgSize.width*0.34).rounded(.toNearestOrAwayFromZero) - let h = (rbgSize.height*0.28).rounded(.toNearestOrAwayFromZero) - self.flagLayer.frame = CGRect(x: left, y: top, width: w, height: h) - self.flagLayer.setNeedsDisplay() - } - - override var intrinsicContentSize: CGSize { - - let height = fontSize/1.1 + 4 - let width = height/PlateView.aspectRatio - print("") - return CGSize(width: width, height: height) - } - - func setNumber(_ number: String) { - self.number?.setNumber(number) - layoutSubviews() - onChange?() - } -} - -extension PlateView: UIKeyInput { - - var hasText: Bool { - number?.hasText ?? false - } - - func insertText(_ text: String) { - if number?.insertText(text) == true { - layoutSubviews() - onChange?() - } - } - - func deleteBackward() { - if number?.deleteBackward() == true { - layoutSubviews() - onChange?() - } - } -}