Compare commits
	
		
			No commits in common. "3f4318e1931e0d5bc355deb5461ee464a75934a4" and "30a785eabbd060aa228f26e68486123351daca52" have entirely different histories.
		
	
	
		
			3f4318e193
			...
			30a785eabb
		
	
		
| @ -1,78 +0,0 @@ | |||||||
| import { Emitter, EventType } from "@Model/Emitter"; |  | ||||||
| import { Component, FunctionComponent, ReactNode, Consumer } from "react"; |  | ||||||
| 
 |  | ||||||
| type RenderComponent = (new (...p: any) => Component<any, any, any>) | FunctionComponent<any>; |  | ||||||
| 
 |  | ||||||
| function superConnectWithEvent<C extends Emitter<E>, E extends Record<EventType, any>>( |  | ||||||
| 	consumer: Consumer<C>, keyName: string |  | ||||||
| ) { |  | ||||||
| 	return (...events: Array<keyof E>) => { |  | ||||||
| 		return <R extends RenderComponent>(components: R): R => { |  | ||||||
| 			const Components = components as any; |  | ||||||
| 			const Consumer = consumer; |  | ||||||
| 			return class extends Component<R> { |  | ||||||
| 	 |  | ||||||
| 				private status: C | undefined; |  | ||||||
| 				private isEventMount: boolean = false; |  | ||||||
| 				private propsObject: Record<string, C> = {}; |  | ||||||
| 	 |  | ||||||
| 				private handelChange = () => { |  | ||||||
| 					this.forceUpdate(); |  | ||||||
| 				} |  | ||||||
| 	 |  | ||||||
| 				private mountEvent() { |  | ||||||
| 					if (this.status && !this.isEventMount) { |  | ||||||
| 						this.isEventMount = true; |  | ||||||
| 						console.log("Component dep event mount: " + events.join(", ")); |  | ||||||
| 						for (let i = 0; i < events.length; i++) { |  | ||||||
| 							this.status.on(events[i], this.handelChange); |  | ||||||
| 						} |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 	 |  | ||||||
| 				private unmountEvent() { |  | ||||||
| 					if (this.status) { |  | ||||||
| 						for (let i = 0; i < events.length; i++) { |  | ||||||
| 							this.status.off(events[i], this.handelChange); |  | ||||||
| 						} |  | ||||||
| 					} |  | ||||||
| 				} |  | ||||||
| 	 |  | ||||||
| 				public render(): ReactNode { |  | ||||||
| 					return <Consumer> |  | ||||||
| 						{(status: C) => { |  | ||||||
| 							this.status = status; |  | ||||||
| 							this.propsObject[keyName] = status; |  | ||||||
| 							this.mountEvent(); |  | ||||||
| 							return <Components {...this.props} {...this.propsObject}/>; |  | ||||||
| 						}} |  | ||||||
| 					</Consumer> |  | ||||||
| 				} |  | ||||||
| 	 |  | ||||||
| 				public componentWillUnmount() { |  | ||||||
| 					this.unmountEvent(); |  | ||||||
| 				} |  | ||||||
| 	 |  | ||||||
| 			} as any; |  | ||||||
| 		} |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| function superConnect<C extends Emitter<any>>(consumer: Consumer<C>, keyName: string) { |  | ||||||
| 	return <R extends RenderComponent>(components: R): R => { |  | ||||||
| 		return ((props: any) => { |  | ||||||
| 
 |  | ||||||
| 			const Components = components as any; |  | ||||||
| 			const Consumer = consumer; |  | ||||||
| 
 |  | ||||||
| 			return <Consumer> |  | ||||||
| 				{(status: C) => <Components |  | ||||||
| 					{...props} |  | ||||||
| 					{...{[keyName]: status}} |  | ||||||
| 				/>} |  | ||||||
| 			</Consumer> |  | ||||||
| 		}) as any; |  | ||||||
| 	} |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| export { superConnectWithEvent, superConnect }; |  | ||||||
| @ -1,5 +1,4 @@ | |||||||
| import { createContext } from "react"; | import { createContext, Component, FunctionComponent } from "react"; | ||||||
| import { superConnect, superConnectWithEvent } from "./Context"; |  | ||||||
| import { Emitter } from "@Model/Emitter"; | import { Emitter } from "@Model/Emitter"; | ||||||
| import { Layout } from "@Model/Layout"; | import { Layout } from "@Model/Layout"; | ||||||
| 
 | 
 | ||||||
| @ -13,11 +12,9 @@ enum Themes { | |||||||
| 
 | 
 | ||||||
| type Language = "ZH_CN" | "EN_US"; | type Language = "ZH_CN" | "EN_US"; | ||||||
| 
 | 
 | ||||||
| interface ISettingEvents extends Setting { | class Setting extends Emitter< | ||||||
|     change: keyof Setting; |     Setting & {change: keyof Setting} | ||||||
| } | > { | ||||||
| 
 |  | ||||||
| class Setting extends Emitter<ISettingEvents> { |  | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * 主题 |      * 主题 | ||||||
| @ -54,14 +51,21 @@ SettingContext.displayName = "Setting"; | |||||||
| const SettingProvider = SettingContext.Provider; | const SettingProvider = SettingContext.Provider; | ||||||
| const SettingConsumer = SettingContext.Consumer; | const SettingConsumer = SettingContext.Consumer; | ||||||
| 
 | 
 | ||||||
|  | type RenderComponent = (new (...p: any) => Component<any, any, any>) | FunctionComponent<any>; | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
|  * 修饰器 |  * 修饰器 | ||||||
|  */ |  */ | ||||||
| const useSetting = superConnect<Setting>(SettingConsumer, "setting"); | function useSetting<R extends RenderComponent>(components: R): R { | ||||||
| 
 |     return ((props: any) => { | ||||||
| const useStatusWithEvent = superConnectWithEvent<Setting, ISettingEvents>(SettingConsumer, "setting"); |         const C = components; | ||||||
|  |         return <SettingConsumer> | ||||||
|  |             {(setting: Setting) => <C {...props} setting={setting}></C>} | ||||||
|  |         </SettingConsumer> | ||||||
|  |     }) as any; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| export { | export { | ||||||
|     Themes, Setting, SettingContext, useSetting, Language, useStatusWithEvent, |     Themes, Setting, SettingContext, useSetting, Language, | ||||||
|     IMixinSettingProps, SettingProvider, SettingConsumer |     IMixinSettingProps, SettingProvider, SettingConsumer | ||||||
| }; | }; | ||||||
| @ -1,4 +1,4 @@ | |||||||
| import { createContext, Component, FunctionComponent, ReactNode } from "react"; | import { createContext, Component, FunctionComponent, useState, useEffect, ReactNode } from "react"; | ||||||
| import { Emitter } from "@Model/Emitter"; | import { Emitter } from "@Model/Emitter"; | ||||||
| import { Model, ObjectID } from "@Model/Model"; | import { Model, ObjectID } from "@Model/Model"; | ||||||
| import { Label } from "@Model/Label"; | import { Label } from "@Model/Label"; | ||||||
| @ -9,7 +9,6 @@ import { AbstractRenderer } from "@Model/Renderer"; | |||||||
| import { ClassicRenderer, MouseMod } from "@GLRender/ClassicRenderer"; | import { ClassicRenderer, MouseMod } from "@GLRender/ClassicRenderer"; | ||||||
| import { Setting } from "./Setting"; | import { Setting } from "./Setting"; | ||||||
| import { I18N } from "@Component/Localization/Localization"; | import { I18N } from "@Component/Localization/Localization"; | ||||||
| import { superConnectWithEvent, superConnect } from "./Context"; |  | ||||||
| 
 | 
 | ||||||
| function randomColor(unNormal: boolean = false) { | function randomColor(unNormal: boolean = false) { | ||||||
|     const color = [ |     const color = [ | ||||||
| @ -259,12 +258,67 @@ StatusContext.displayName = "Status"; | |||||||
| const StatusProvider = StatusContext.Provider; | const StatusProvider = StatusContext.Provider; | ||||||
| const StatusConsumer = StatusContext.Consumer; | const StatusConsumer = StatusContext.Consumer; | ||||||
| 
 | 
 | ||||||
|  | type RenderComponent = (new (...p: any) => Component<any, any, any>) | FunctionComponent<any>; | ||||||
|  | 
 | ||||||
| /** | /** | ||||||
|  * 修饰器 |  * 修饰器 | ||||||
|  */ |  */ | ||||||
| const useStatus = superConnect<Status>(StatusConsumer, "status"); | function useStatus<R extends RenderComponent>(components: R): R { | ||||||
|  |     return ((props: any) => { | ||||||
|  |         const C = components; | ||||||
|  |         return <StatusConsumer> | ||||||
|  |             {(status: Status) => <C {...props} status={status}></C>} | ||||||
|  |         </StatusConsumer> | ||||||
|  |     }) as any; | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| const useStatusWithEvent = superConnectWithEvent<Status, IStatusEvent>(StatusConsumer, "status"); | function useStatusWithEvent(...events: Array<keyof IStatusEvent>) { | ||||||
|  |     return <R extends RenderComponent>(components: R): R => { | ||||||
|  |         const C = components as any; | ||||||
|  |         return class extends Component<R> { | ||||||
|  | 
 | ||||||
|  |             private status: Status | undefined; | ||||||
|  |             private isEventMount: boolean = false; | ||||||
|  | 
 | ||||||
|  |             private handelChange = () => { | ||||||
|  |                 this.forceUpdate(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             private mountEvent() { | ||||||
|  |                 if (this.status && !this.isEventMount) { | ||||||
|  |                     this.isEventMount = true; | ||||||
|  |                     console.log("Component dep event mount: " + events.join(", ")); | ||||||
|  |                     for (let i = 0; i < events.length; i++) { | ||||||
|  |                         this.status.on(events[i], this.handelChange); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             private unmountEvent() { | ||||||
|  |                 if (this.status) { | ||||||
|  |                     for (let i = 0; i < events.length; i++) { | ||||||
|  |                         this.status.off(events[i], this.handelChange); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             public render(): ReactNode { | ||||||
|  |                 return <StatusConsumer> | ||||||
|  |                     {(status: Status) => { | ||||||
|  |                         this.status = status; | ||||||
|  |                         this.mountEvent(); | ||||||
|  |                         return <C {...this.props} status={status}></C>; | ||||||
|  |                     }} | ||||||
|  |                 </StatusConsumer> | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             public componentWillUnmount() { | ||||||
|  |                 this.unmountEvent(); | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |         } as any; | ||||||
|  |     } | ||||||
|  | } | ||||||
| 
 | 
 | ||||||
| export { | export { | ||||||
|     Status, StatusContext, useStatus, useStatusWithEvent, |     Status, StatusContext, useStatus, useStatusWithEvent, | ||||||
|  | |||||||
| @ -46,7 +46,7 @@ class Label { | |||||||
|      * 判断是否为相同标签 |      * 判断是否为相同标签 | ||||||
|      */ |      */ | ||||||
|     public equal(label: Label): boolean { |     public equal(label: Label): boolean { | ||||||
|         // if (this.isDeleted() || label.isDeleted()) return false;
 |         if (this.isDeleted() || label.isDeleted()) return false; | ||||||
|         return this === label || this.id === label.id; |         return this === label || this.id === label.id; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user