| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  | import LayerConfig from "./ThemeConfig/LayerConfig" | 
					
						
							|  |  |  | import { UIEventSource } from "../Logic/UIEventSource" | 
					
						
							| 
									
										
										
										
											2023-04-07 03:54:11 +02:00
										 |  |  | import UserRelatedState from "../Logic/State/UserRelatedState" | 
					
						
							|  |  |  | import { Utils } from "../Utils" | 
					
						
							| 
									
										
										
										
											2023-04-19 03:20:49 +02:00
										 |  |  | import { LocalStorageSource } from "../Logic/Web/LocalStorageSource" | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Indicates if a menu is open, and if so, which tab is selected; | 
					
						
							|  |  |  |  * Some tabs allow to highlight an element. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Some convenience methods are provided for this as well | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | export class MenuState { | 
					
						
							| 
									
										
										
										
											2023-04-14 04:33:06 +02:00
										 |  |  |     private static readonly _themeviewTabs = ["intro", "filters", "download", "copyright"] as const | 
					
						
							| 
									
										
										
										
											2023-04-19 03:20:49 +02:00
										 |  |  |     public readonly themeIsOpened: UIEventSource<boolean> | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  |     public readonly themeViewTabIndex: UIEventSource<number> | 
					
						
							|  |  |  |     public readonly themeViewTab: UIEventSource<typeof MenuState._themeviewTabs[number]> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     private static readonly _menuviewTabs = ["about", "settings", "community", "privacy"] as const | 
					
						
							| 
									
										
										
										
											2023-04-19 03:20:49 +02:00
										 |  |  |     public readonly menuIsOpened: UIEventSource<boolean> | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  |     public readonly menuViewTabIndex: UIEventSource<number> | 
					
						
							|  |  |  |     public readonly menuViewTab: UIEventSource<typeof MenuState._menuviewTabs[number]> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public readonly highlightedLayerInFilters: UIEventSource<string> = new UIEventSource<string>( | 
					
						
							|  |  |  |         undefined | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2023-04-07 02:13:57 +02:00
										 |  |  |     public highlightedUserSetting: UIEventSource<string> = new UIEventSource<string>(undefined) | 
					
						
							| 
									
										
										
										
											2023-04-19 03:20:49 +02:00
										 |  |  |     constructor(themeid: string = "") { | 
					
						
							|  |  |  |         if (themeid) { | 
					
						
							|  |  |  |             themeid += "-" | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         this.themeIsOpened = LocalStorageSource.GetParsed(themeid + "thememenuisopened", true) | 
					
						
							|  |  |  |         this.themeViewTabIndex = LocalStorageSource.GetParsed(themeid + "themeviewtabindex", 0) | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  |         this.themeViewTab = this.themeViewTabIndex.sync( | 
					
						
							|  |  |  |             (i) => MenuState._themeviewTabs[i], | 
					
						
							|  |  |  |             [], | 
					
						
							|  |  |  |             (str) => MenuState._themeviewTabs.indexOf(<any>str) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-19 03:20:49 +02:00
										 |  |  |         this.menuIsOpened = LocalStorageSource.GetParsed(themeid + "menuisopened", false) | 
					
						
							|  |  |  |         this.menuViewTabIndex = LocalStorageSource.GetParsed(themeid + "menuviewtabindex", 0) | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  |         this.menuViewTab = this.menuViewTabIndex.sync( | 
					
						
							|  |  |  |             (i) => MenuState._menuviewTabs[i], | 
					
						
							|  |  |  |             [], | 
					
						
							|  |  |  |             (str) => MenuState._menuviewTabs.indexOf(<any>str) | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2023-04-14 02:42:57 +02:00
										 |  |  |         this.menuIsOpened.addCallbackAndRun((isOpen) => { | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  |             if (!isOpen) { | 
					
						
							| 
									
										
										
										
											2023-04-14 02:42:57 +02:00
										 |  |  |                 this.highlightedUserSetting.setData(undefined) | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         this.themeViewTab.addCallbackAndRun((tab) => { | 
					
						
							|  |  |  |             if (tab !== "filters") { | 
					
						
							|  |  |  |                 this.highlightedLayerInFilters.setData(undefined) | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     public openFilterView(highlightLayer?: LayerConfig | string) { | 
					
						
							|  |  |  |         this.themeIsOpened.setData(true) | 
					
						
							|  |  |  |         this.themeViewTab.setData("filters") | 
					
						
							|  |  |  |         if (highlightLayer) { | 
					
						
							|  |  |  |             if (typeof highlightLayer !== "string") { | 
					
						
							|  |  |  |                 highlightLayer = highlightLayer.id | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             this.highlightedLayerInFilters.setData(highlightLayer) | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-07 02:13:57 +02:00
										 |  |  |     public openUsersettings(highlightTagRendering?: string) { | 
					
						
							|  |  |  |         this.menuIsOpened.setData(true) | 
					
						
							|  |  |  |         this.menuViewTab.setData("settings") | 
					
						
							| 
									
										
										
										
											2023-04-07 03:54:11 +02:00
										 |  |  |         if ( | 
					
						
							|  |  |  |             highlightTagRendering !== undefined && | 
					
						
							|  |  |  |             !UserRelatedState.availableUserSettingsIds.some((tr) => tr === highlightTagRendering) | 
					
						
							|  |  |  |         ) { | 
					
						
							|  |  |  |             console.error( | 
					
						
							|  |  |  |                 "No tagRendering with id '" + highlightTagRendering + "'; maybe you meant:", | 
					
						
							|  |  |  |                 Utils.sortedByLevenshteinDistance( | 
					
						
							|  |  |  |                     highlightTagRendering, | 
					
						
							|  |  |  |                     UserRelatedState.availableUserSettingsIds, | 
					
						
							|  |  |  |                     (x) => x | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2023-04-07 02:13:57 +02:00
										 |  |  |         this.highlightedUserSetting.setData(highlightTagRendering) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  |     public closeAll() { | 
					
						
							|  |  |  |         this.menuIsOpened.setData(false) | 
					
						
							|  |  |  |         this.themeIsOpened.setData(false) | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |