panel work
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				studiorailgun/Renderer/pipeline/head There was a failure building this commit
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	studiorailgun/Renderer/pipeline/head There was a failure building this commit
				
			This commit is contained in:
		
							parent
							
								
									ac3059caf2
								
							
						
					
					
						commit
						183a8ce901
					
				| @ -103,7 +103,7 @@ public class MenuWorldSelect { | |||||||
|         Label worldNameLabel = Label.createLabel("Input Name: "); |         Label worldNameLabel = Label.createLabel("Input Name: "); | ||||||
|         worldNameInputContainer.addChild(worldNameLabel); |         worldNameInputContainer.addChild(worldNameLabel); | ||||||
|         TextInput worldNameInput = TextInput.createTextInput(); |         TextInput worldNameInput = TextInput.createTextInput(); | ||||||
|         worldNameInput.setMinWidth(100); |         worldNameInput.setMinWidth(150); | ||||||
|         worldNameInput.setMaxWidthPercent(50); |         worldNameInput.setMaxWidthPercent(50); | ||||||
|         worldNameInput.setText("World name"); |         worldNameInput.setText("World name"); | ||||||
|         worldNameInputContainer.addChild(worldNameInput); |         worldNameInputContainer.addChild(worldNameInput); | ||||||
| @ -114,7 +114,7 @@ public class MenuWorldSelect { | |||||||
|         Label worldSeedLabel = Label.createLabel("Input Seed: "); |         Label worldSeedLabel = Label.createLabel("Input Seed: "); | ||||||
|         worldSeedInputContainer.addChild(worldSeedLabel); |         worldSeedInputContainer.addChild(worldSeedLabel); | ||||||
|         TextInput worldSeedInput = TextInput.createTextInput(); |         TextInput worldSeedInput = TextInput.createTextInput(); | ||||||
|         worldSeedInput.setMinWidth(100); |         worldSeedInput.setMinWidth(150); | ||||||
|         worldSeedInput.setMaxWidthPercent(50); |         worldSeedInput.setMaxWidthPercent(50); | ||||||
|         worldSeedInput.setText(System.currentTimeMillis() + ""); |         worldSeedInput.setText(System.currentTimeMillis() + ""); | ||||||
|         worldSeedInputContainer.addChild(worldSeedInput); |         worldSeedInputContainer.addChild(worldSeedInput); | ||||||
|  | |||||||
| @ -30,6 +30,11 @@ public class Button extends StandardContainerElement implements DrawableElement, | |||||||
|     static float COLOR_FRAME_FOCUSED_DEFAULT = 0.1f; |     static float COLOR_FRAME_FOCUSED_DEFAULT = 0.1f; | ||||||
|     static float COLOR_FRAME_UNFOCUSED_DEFAULT = 0.01f; |     static float COLOR_FRAME_UNFOCUSED_DEFAULT = 0.01f; | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Default padding applied to buttons | ||||||
|  |      */ | ||||||
|  |     static final int DEFAULT_PADDING = 10; | ||||||
|  | 
 | ||||||
|     /** |     /** | ||||||
|      * The color of the backing element |      * The color of the backing element | ||||||
|      */ |      */ | ||||||
| @ -40,6 +45,11 @@ public class Button extends StandardContainerElement implements DrawableElement, | |||||||
|      */ |      */ | ||||||
|     Vector3f frameColor = new Vector3f(COLOR_FRAME_FOCUSED_DEFAULT); |     Vector3f frameColor = new Vector3f(COLOR_FRAME_FOCUSED_DEFAULT); | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * The color of the background of the frame | ||||||
|  |      */ | ||||||
|  |     Vector3f frameBackgroundColor = new Vector3f(COLOR_FRAME_UNFOCUSED_DEFAULT); | ||||||
|  | 
 | ||||||
|     Vector3f boxPosition = new Vector3f(); |     Vector3f boxPosition = new Vector3f(); | ||||||
|     Vector3f boxDimensions = new Vector3f(); |     Vector3f boxDimensions = new Vector3f(); | ||||||
|     Vector3f texPosition = new Vector3f(0,0,0); |     Vector3f texPosition = new Vector3f(0,0,0); | ||||||
| @ -49,6 +59,11 @@ public class Button extends StandardContainerElement implements DrawableElement, | |||||||
|     boolean visible = false; |     boolean visible = false; | ||||||
|     boolean focused = false; |     boolean focused = false; | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Controls whether the button draws its decorative frame or not | ||||||
|  |      */ | ||||||
|  |     boolean drawFrame = true; | ||||||
|  | 
 | ||||||
|     FocusEventCallback onFocusCallback; |     FocusEventCallback onFocusCallback; | ||||||
|     FocusEventCallback onLoseFocusCallback; |     FocusEventCallback onLoseFocusCallback; | ||||||
|     ClickEventCallback clickCallback; |     ClickEventCallback clickCallback; | ||||||
| @ -89,6 +104,10 @@ public class Button extends StandardContainerElement implements DrawableElement, | |||||||
|      */ |      */ | ||||||
|     public static Button createButton(String text, Runnable callback){ |     public static Button createButton(String text, Runnable callback){ | ||||||
|         Button rVal = new Button(); |         Button rVal = new Button(); | ||||||
|  |         rVal.setPaddingTop(DEFAULT_PADDING); | ||||||
|  |         rVal.setPaddingRight(DEFAULT_PADDING); | ||||||
|  |         rVal.setPaddingLeft(DEFAULT_PADDING); | ||||||
|  |         rVal.setPaddingBottom(DEFAULT_PADDING); | ||||||
|         Label rValLabel = Label.createLabel(text); |         Label rValLabel = Label.createLabel(text); | ||||||
|         rValLabel.setText(text); |         rValLabel.setText(text); | ||||||
|         rVal.addChild(rValLabel); |         rVal.addChild(rValLabel); | ||||||
| @ -111,6 +130,10 @@ public class Button extends StandardContainerElement implements DrawableElement, | |||||||
|      */ |      */ | ||||||
|     public static Button createButtonCentered(String text, Runnable callback){ |     public static Button createButtonCentered(String text, Runnable callback){ | ||||||
|         Button rVal = new Button(); |         Button rVal = new Button(); | ||||||
|  |         rVal.setPaddingTop(DEFAULT_PADDING); | ||||||
|  |         rVal.setPaddingRight(DEFAULT_PADDING); | ||||||
|  |         rVal.setPaddingLeft(DEFAULT_PADDING); | ||||||
|  |         rVal.setPaddingBottom(DEFAULT_PADDING); | ||||||
|         Label rValLabel = Label.createLabel(text); |         Label rValLabel = Label.createLabel(text); | ||||||
|         rValLabel.setText(text); |         rValLabel.setText(text); | ||||||
|         rVal.addChild(rValLabel); |         rVal.addChild(rValLabel); | ||||||
| @ -134,6 +157,10 @@ public class Button extends StandardContainerElement implements DrawableElement, | |||||||
|      */ |      */ | ||||||
|     public static Button createButtonCentered(String text, float fontSize, Runnable callback){ |     public static Button createButtonCentered(String text, float fontSize, Runnable callback){ | ||||||
|         Button rVal = new Button(); |         Button rVal = new Button(); | ||||||
|  |         rVal.setPaddingTop(DEFAULT_PADDING); | ||||||
|  |         rVal.setPaddingRight(DEFAULT_PADDING); | ||||||
|  |         rVal.setPaddingLeft(DEFAULT_PADDING); | ||||||
|  |         rVal.setPaddingBottom(DEFAULT_PADDING); | ||||||
|         Label rValLabel = Label.createLabel(text, fontSize); |         Label rValLabel = Label.createLabel(text, fontSize); | ||||||
|         rValLabel.setText(text); |         rValLabel.setText(text); | ||||||
|         rVal.addChild(rValLabel); |         rVal.addChild(rValLabel); | ||||||
| @ -234,20 +261,20 @@ public class Button extends StandardContainerElement implements DrawableElement, | |||||||
|         openGLState.glViewport(framebuffer.getWidth(), framebuffer.getHeight()); |         openGLState.glViewport(framebuffer.getWidth(), framebuffer.getHeight()); | ||||||
| 
 | 
 | ||||||
|         //render background of window |         //render background of window | ||||||
|         if(this.isFocused()){ |         if(this.drawFrame){ | ||||||
|             frameColor.set(COLOR_FRAME_FOCUSED_DEFAULT); |             if(this.isFocused()){ | ||||||
|             UIFrameUtils.drawFrame( |                 UIFrameUtils.drawFrame( | ||||||
|                 AssetDataStrings.UI_FRAME_TEXTURE_DEFAULT_3, frameColor, 48, 12, |                     AssetDataStrings.UI_FRAME_TEXTURE_DEFAULT_3, frameColor, 48, 12, | ||||||
|                 this.getAbsoluteX(), this.getAbsoluteY(), this.getWidth(), this.getHeight(),  |                     this.getAbsoluteX(), this.getAbsoluteY(), this.getWidth(), this.getHeight(),  | ||||||
|                 framebuffer, framebufferPosX, framebufferPosY |                     framebuffer, framebufferPosX, framebufferPosY | ||||||
|             ); |                 ); | ||||||
|         } else { |             } else { | ||||||
|             frameColor.set(COLOR_FRAME_UNFOCUSED_DEFAULT); |                 UIFrameUtils.drawFrame( | ||||||
|             UIFrameUtils.drawFrame( |                     AssetDataStrings.UI_FRAME_TEXTURE_DEFAULT_3, frameBackgroundColor, 48, 12, | ||||||
|                 AssetDataStrings.UI_FRAME_TEXTURE_DEFAULT_3, frameColor, 48, 12, |                     this.getAbsoluteX(), this.getAbsoluteY(), this.getWidth(), this.getHeight(),  | ||||||
|                 this.getAbsoluteX(), this.getAbsoluteY(), this.getWidth(), this.getHeight(),  |                     framebuffer, framebufferPosX, framebufferPosY | ||||||
|                 framebuffer, framebufferPosX, framebufferPosY |                 ); | ||||||
|             ); |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         // |         // | ||||||
| @ -339,4 +366,20 @@ public class Button extends StandardContainerElement implements DrawableElement, | |||||||
|         this.color.set(color); |         this.color.set(color); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Sets whether the button should draw its frame or not | ||||||
|  |      * @param drawFrame true if it should draw its frame, false otherwise | ||||||
|  |      */ | ||||||
|  |     public void setDrawFrame(boolean drawFrame){ | ||||||
|  |         this.drawFrame = drawFrame; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Gets whether the button should draw its frame or not | ||||||
|  |      * @return true if it should draw its frame, false otherwise | ||||||
|  |      */ | ||||||
|  |     public boolean getDrawFrame(){ | ||||||
|  |         return this.drawFrame; | ||||||
|  |     } | ||||||
|  |      | ||||||
| } | } | ||||||
|  | |||||||
| @ -26,7 +26,7 @@ public class Label extends StandardContainerElement implements DrawableElement { | |||||||
|     String text = ""; |     String text = ""; | ||||||
|     int textPixelWidth = 0; |     int textPixelWidth = 0; | ||||||
|      |      | ||||||
|     float fontSize = 1.0f; |     float fontSize = DEFAULT_FONT_SIZE; | ||||||
|      |      | ||||||
|     static final Vector3f windowDrawDebugColor = new Vector3f(1.0f,1.0f,1.0f); |     static final Vector3f windowDrawDebugColor = new Vector3f(1.0f,1.0f,1.0f); | ||||||
| 
 | 
 | ||||||
| @ -38,7 +38,7 @@ public class Label extends StandardContainerElement implements DrawableElement { | |||||||
|      * @return the label element |      * @return the label element | ||||||
|      */ |      */ | ||||||
|     public static Label createLabel(String text){ |     public static Label createLabel(String text){ | ||||||
|         Label rVal = new Label(1.0f); |         Label rVal = new Label(DEFAULT_FONT_SIZE); | ||||||
|         rVal.setText(text); |         rVal.setText(text); | ||||||
|         return rVal; |         return rVal; | ||||||
|     } |     } | ||||||
|  | |||||||
							
								
								
									
										96
									
								
								src/main/java/electrosphere/renderer/ui/elements/Panel.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								src/main/java/electrosphere/renderer/ui/elements/Panel.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,96 @@ | |||||||
|  | package electrosphere.renderer.ui.elements; | ||||||
|  | 
 | ||||||
|  | import org.joml.Vector3f; | ||||||
|  | import org.lwjgl.util.yoga.Yoga; | ||||||
|  | 
 | ||||||
|  | import electrosphere.engine.assetmanager.AssetDataStrings; | ||||||
|  | import electrosphere.renderer.OpenGLState; | ||||||
|  | import electrosphere.renderer.RenderPipelineState; | ||||||
|  | import electrosphere.renderer.framebuffer.Framebuffer; | ||||||
|  | import electrosphere.renderer.ui.elementtypes.DrawableElement; | ||||||
|  | import electrosphere.renderer.ui.elementtypes.Element; | ||||||
|  | import electrosphere.renderer.ui.events.Event; | ||||||
|  | import electrosphere.renderer.ui.frame.UIFrameUtils; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * A panel that should contain other elements | ||||||
|  |  */ | ||||||
|  | public class Panel extends StandardContainerElement implements DrawableElement { | ||||||
|  |      | ||||||
|  | 
 | ||||||
|  |     static final Vector3f windowDrawDebugColor = new Vector3f(1.0f,1.0f,1.0f); | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Default padding applied to buttons | ||||||
|  |      */ | ||||||
|  |     static final int DEFAULT_PADDING = 10; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * The default color of the frame | ||||||
|  |      */ | ||||||
|  |     static float COLOR_FRAME_FOCUSED_DEFAULT = 0.1f; | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * The color of the frame | ||||||
|  |      */ | ||||||
|  |     Vector3f frameColor = new Vector3f(COLOR_FRAME_FOCUSED_DEFAULT); | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Creates a label element | ||||||
|  |      * @param text the text for the label | ||||||
|  |      * @return the label element | ||||||
|  |      */ | ||||||
|  |     public static Panel createPanel(){ | ||||||
|  |         Panel rVal = new Panel(); | ||||||
|  |         rVal.setPaddingTop(DEFAULT_PADDING); | ||||||
|  |         rVal.setPaddingRight(DEFAULT_PADDING); | ||||||
|  |         rVal.setPaddingLeft(DEFAULT_PADDING); | ||||||
|  |         rVal.setPaddingBottom(DEFAULT_PADDING); | ||||||
|  |         return rVal; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Constructor | ||||||
|  |      */ | ||||||
|  |     private Panel(){ | ||||||
|  |         super(); | ||||||
|  |         Yoga.YGNodeStyleSetFlexDirection(this.yogaNode, Yoga.YGFlexDirectionRow); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public void setColor(Vector3f color){ | ||||||
|  |         for(Element character : childList){ | ||||||
|  |             ((BitmapCharacter)character).setColor(color); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public void draw( | ||||||
|  |         RenderPipelineState renderPipelineState, | ||||||
|  |         OpenGLState openGLState, | ||||||
|  |         Framebuffer framebuffer, | ||||||
|  |         int framebufferPosX, | ||||||
|  |         int framebufferPosY | ||||||
|  |     ) { | ||||||
|  | 
 | ||||||
|  |         UIFrameUtils.drawFrame( | ||||||
|  |             AssetDataStrings.UI_FRAME_TEXTURE_DEFAULT_3, frameColor, 48, 12, | ||||||
|  |             this.getAbsoluteX(), this.getAbsoluteY(), this.getWidth(), this.getHeight(),  | ||||||
|  |             framebuffer, framebufferPosX, framebufferPosY | ||||||
|  |         ); | ||||||
|  | 
 | ||||||
|  |         for(Element child : childList){ | ||||||
|  |             ((DrawableElement)child).draw( | ||||||
|  |                 renderPipelineState, | ||||||
|  |                 openGLState, | ||||||
|  |                 framebuffer, | ||||||
|  |                 framebufferPosX, | ||||||
|  |                 framebufferPosY | ||||||
|  |             ); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     public boolean handleEvent(Event event){ | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | } | ||||||
| @ -52,7 +52,7 @@ public class TextInput extends StandardContainerElement implements DrawableEleme | |||||||
|     String text = ""; |     String text = ""; | ||||||
|     int textPixelWidth = 0; |     int textPixelWidth = 0; | ||||||
|      |      | ||||||
|     float fontSize = 1.0f; |     float fontSize = Label.DEFAULT_FONT_SIZE; | ||||||
|      |      | ||||||
| 
 | 
 | ||||||
|     Font font; |     Font font; | ||||||
| @ -72,7 +72,8 @@ public class TextInput extends StandardContainerElement implements DrawableEleme | |||||||
|      * @return The text input |      * @return The text input | ||||||
|      */ |      */ | ||||||
|     public static TextInput createTextInput(){ |     public static TextInput createTextInput(){ | ||||||
|         return new TextInput(Label.DEFAULT_FONT_SIZE); |         TextInput rVal = new TextInput(Label.DEFAULT_FONT_SIZE); | ||||||
|  |         return rVal; | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     /** |     /** | ||||||
| @ -84,13 +85,16 @@ public class TextInput extends StandardContainerElement implements DrawableEleme | |||||||
|         this.font = Globals.fontManager.getFont("default"); |         this.font = Globals.fontManager.getFont("default"); | ||||||
|         this.fontSize = fontSize; |         this.fontSize = fontSize; | ||||||
|         this.color = new Vector3f(1,1,1); |         this.color = new Vector3f(1,1,1); | ||||||
|         setHeight((int)(font.getFontHeight() * fontSize)); |         this.setHeight((int)(font.getFontHeight() * fontSize)); | ||||||
|         Yoga.YGNodeStyleSetFlexDirection(this.yogaNode, Yoga.YGFlexDirectionRow); |         Yoga.YGNodeStyleSetFlexDirection(this.yogaNode, Yoga.YGFlexDirectionRow); | ||||||
|         Yoga.YGNodeStyleSetMinHeight(this.yogaNode, font.getFontHeight() * fontSize); |         Yoga.YGNodeStyleSetMinHeight(this.yogaNode, font.getFontHeight() * fontSize); | ||||||
|         Yoga.YGNodeStyleSetMinWidth(this.yogaNode, 1); |         Yoga.YGNodeStyleSetMinWidth(this.yogaNode, 1); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     void generateLetters(){ |     /** | ||||||
|  |      * Generate letter elements | ||||||
|  |      */ | ||||||
|  |     private void generateLetters(){ | ||||||
|         for(Element el : getChildren()){ |         for(Element el : getChildren()){ | ||||||
|             Globals.signalSystem.post(SignalType.YOGA_DESTROY, el); |             Globals.signalSystem.post(SignalType.YOGA_DESTROY, el); | ||||||
|         } |         } | ||||||
| @ -106,12 +110,12 @@ public class TextInput extends StandardContainerElement implements DrawableEleme | |||||||
|      |      | ||||||
|     public void setText(String text){ |     public void setText(String text){ | ||||||
|         this.text = text; |         this.text = text; | ||||||
|         textPixelWidth = 0; |         this.textPixelWidth = 0; | ||||||
|         for(int i = 0; i < text.length(); i++){ |         for(int i = 0; i < text.length(); i++){ | ||||||
|             Vector3f bitMapDimension = this.font.getDimensionOfCharacterDiscrete(text.charAt(i)); |             Vector3f bitMapDimension = this.font.getDimensionOfCharacterDiscrete(text.charAt(i)); | ||||||
|             textPixelWidth = textPixelWidth + (int)bitMapDimension.x; |             this.textPixelWidth = this.textPixelWidth + (int)bitMapDimension.x; | ||||||
|         } |         } | ||||||
|         generateLetters(); |         this.generateLetters(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public void setColor(Vector3f color){ |     public void setColor(Vector3f color){ | ||||||
| @ -133,16 +137,6 @@ public class TextInput extends StandardContainerElement implements DrawableEleme | |||||||
|         int framebufferPosX, |         int framebufferPosX, | ||||||
|         int framebufferPosY |         int framebufferPosY | ||||||
|     ) { |     ) { | ||||||
|         // |  | ||||||
|         //Draw decorations |  | ||||||
| 
 |  | ||||||
|         float ndcWidth =  (float)getWidth()/framebuffer.getWidth(); |  | ||||||
|         float ndcHeight = (float)getHeight()/framebuffer.getHeight(); |  | ||||||
|         float ndcX =      (float)this.absoluteToFramebuffer(getAbsoluteX(),framebufferPosX)/framebuffer.getWidth(); |  | ||||||
|         float ndcY =      (float)this.absoluteToFramebuffer(getAbsoluteY(),framebufferPosY)/framebuffer.getHeight(); |  | ||||||
|         boxPosition = new Vector3f(ndcX,ndcY,0); |  | ||||||
|         boxDimensions = new Vector3f(ndcWidth,ndcHeight,0); |  | ||||||
| 
 |  | ||||||
|         //this call binds the screen as the "texture" we're rendering to |         //this call binds the screen as the "texture" we're rendering to | ||||||
|         //have to call before actually rendering |         //have to call before actually rendering | ||||||
|         framebuffer.bind(openGLState); |         framebuffer.bind(openGLState); | ||||||
| @ -151,13 +145,13 @@ public class TextInput extends StandardContainerElement implements DrawableEleme | |||||||
|         //render background of window |         //render background of window | ||||||
|         if(this.isFocused()){ |         if(this.isFocused()){ | ||||||
|             UIFrameUtils.drawFrame( |             UIFrameUtils.drawFrame( | ||||||
|                 AssetDataStrings.UI_FRAME_TEXTURE_DEFAULT_3, backgroundColor, 48, 12, |                 AssetDataStrings.UI_FRAME_TEXTURE_DEFAULT_1, backgroundColor, 48, 12, | ||||||
|                 this.getAbsoluteX(), this.getAbsoluteY(), this.getWidth(), this.getHeight(),  |                 this.getAbsoluteX(), this.getAbsoluteY(), this.getWidth(), this.getHeight(),  | ||||||
|                 framebuffer, framebufferPosX, framebufferPosY |                 framebuffer, framebufferPosX, framebufferPosY | ||||||
|             ); |             ); | ||||||
|         } else { |         } else { | ||||||
|             UIFrameUtils.drawFrame( |             UIFrameUtils.drawFrame( | ||||||
|                 AssetDataStrings.UI_FRAME_TEXTURE_DEFAULT_3, backgroundColor, 48, 12, |                 AssetDataStrings.UI_FRAME_TEXTURE_DEFAULT_2, backgroundColor, 48, 12, | ||||||
|                 this.getAbsoluteX(), this.getAbsoluteY(), this.getWidth(), this.getHeight(),  |                 this.getAbsoluteX(), this.getAbsoluteY(), this.getWidth(), this.getHeight(),  | ||||||
|                 framebuffer, framebufferPosX, framebufferPosY |                 framebuffer, framebufferPosX, framebufferPosY | ||||||
|             ); |             ); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user