From 19344d644b2c9de7c9f7215527ea2f8678dfe9df Mon Sep 17 00:00:00 2001
From: Alfred Burgess <alfred.burgess95@gmail.com>
Date: Mon, 18 Dec 2023 17:49:57 +0800
Subject: [PATCH] Created font-fild and text rendering

---
 assets/MonoRegular-jEmAR.ttf   | Bin 0 -> 11908 bytes
 assets/arrow.png               | Bin 0 -> 1476 bytes
 include/colour.h               |   2 +-
 include/components/cFontfile.h |  28 +++++++++++++++
 include/components/cTexture.h  |  18 +++++++---
 include/entities/eButton.h     |  21 +++++++++++
 include/window.h               |  13 ++++++-
 src/components/cFontfile.cpp   |  53 +++++++++++++++++++++++++++
 src/components/cTexture.cpp    |  13 ++-----
 src/entities/eButton.cpp       |   5 +++
 src/game-engine.cpp            |  28 ++++-----------
 src/window.cpp                 |  63 +++++++++++++--------------------
 12 files changed, 168 insertions(+), 76 deletions(-)
 create mode 100644 assets/MonoRegular-jEmAR.ttf
 create mode 100644 assets/arrow.png
 create mode 100644 include/components/cFontfile.h
 create mode 100644 include/entities/eButton.h
 create mode 100644 src/components/cFontfile.cpp
 create mode 100644 src/entities/eButton.cpp

diff --git a/assets/MonoRegular-jEmAR.ttf b/assets/MonoRegular-jEmAR.ttf
new file mode 100644
index 0000000000000000000000000000000000000000..4a91568d61829b0200e5bd9e7a268d037162a39d
GIT binary patch
literal 11908
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
Y&byE&U7{?I%7Y{LQ{`$6iXH#|0Q;e&cmMzZ

literal 0
HcmV?d00001

diff --git a/assets/arrow.png b/assets/arrow.png
new file mode 100644
index 0000000000000000000000000000000000000000..197722bde7a16b1d053fc1b97f34723530d3d7de
GIT binary patch
literal 1476
zcmV;#1v~nQP)<h;3K|Lk000e1NJLTq003kF003kN0ssI2|9}Dm00001b5ch_0Itp)
z=>Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1zAZ%K~#8N?VK%h
z+dvS8x1ckbDG4kLEDS8^jA3CwfJtTyQ&w137+7f7pHLVWXc$;n7-(3SzR8}qo0Tl-
z<ok?o`+)d#mXyb<)k=y>kM!7>NR#D3lQoH-^m9RrCTpBEt%<`dXc!*o;e<|_tVw*K
zFU}OgENd`-=nv}D6<xidH_jBoOlqJ)oza=IqvA9EnW@LgmbTyNd#@voOS;6gW0%F6
zPU+NH*#(OFC;B8mqs(LSk;>wdw4zm46Jklrzx4MjedU)IbiwaB7FnYQ8WusH%-0>m
zE#30q>y$OBMu*YFNLroKxeUG@S@(30-*BQJWDU-4H*~Y1jad)#p5F7!U-U}`YnA1t
zhNCxw_Tk?1vb8E&)(j&OUTV6ywG<@_wR4_}Zs5SVrt3SpGn<%)TWL|UW}6DD#(>rG
zR<L_|JhLp6Sl+GPh-zd2Y?OE48-3H`nPmya8g`eP<}Apm(3~qvkp<8+KV7Wu0%vy^
zG;`A6_Mmf@p&(fRzHn{f_Vn4;n$~7c0^H^cm&KqDluHc+dU3rJ4Z(sIhqMKwxD8h!
z3+yZWa@`A?NJI0kQ1B)Yc3i(G3RA*NyrXyVlFMzQB3S^wR<v?E-U%d^nI8(bfx2XA
zP`TW1unV*oW=<&F1}c@MO)Y6@mIlXdsYY4a6sp+absd)k1LspT!){~M$@>2^IFKoQ
z3lx`r-J27=xBZyXWyzIC5K};|``+T;bC?r_Y*F9#V~Uog55OR%x@QT5IZ?RL&M^qe
zl@+|G|DYdkb^OG17iO9ptw>hzqJB^JQmS}`{4>JLbfdM%3T_H(K(*!-ex#4QLVk(R
zGY7^&&rn{1o7&P=iaL_(H~r>u9zn=VfCS`0T!iXzrYu>(8--iC)z6&u4Kg?MQkK*;
zc?zv5NS5w^f|$}PL|~nIsT+MMOYWw@njU9Lk%fZ=r##+K)R)6e0ckJMI(7SX@rXlD
z1|<#kpiqP?bFg%~!5N@7iH_bC%4egGI37XBh$g?R;e%y1IP38W@q<~!NG(T5EpxAn
zl_jUD-h*Wxa-zV;Ag8}B`a|O5&b=s8mTnY+9DP8i>hSX+ee-%j3%t?2C{UJZsm#*Z
zNUC;k8+6eJqfRt4jmah}c=O5V3&4q~Dspw0IZPf|kxXr9BiZ4Vs?e&_3SlNN8DvE=
zg-%WW%tS5#rz1@nhgr&`mKDhqkmegXGH?dm2lnLYt4zD--LZ7C@X6~>FRUqDs%G~e
z`ZQ|p2r`Leq4Ci@dRSBXmt4`xEcF7Sc|F<gI_N_W5!Mutg#ADt4qr2$9DDE0Mwg{c
zbswc1j!vskZS6kd%8FOcg@Gqm!HFm<fvJ>f1!BocU<#y6D-d2*)D}ULIITcnSy5XA
zL*ldo!DN|)LPRwM2A;D=B7iJtLWR-^6{AHk?EAa^s2nQG9CwJ=3B|~L74vufQJF8R
zd)y^RC`Om|ecyqL!Aw~up^|B0(wBC|PZpOasNsF(NORl?={p8tsw^aqafC>mP)x40
z0wb~pz7L4&@{|cBr0*Dn5m|*~laQrj5JqI_Cu_M<Nt2~x5JqGbMXruPs7Y4F($3T*
zD`RPAYLdmK5N13XO_m4M$jaL^FxAM)+cYrM$dc-wrD<TQk;SGEW;`WLmIrmnDxtcA
zI%Jhl-9a6)N~rFj4q0ppVa5~FWO>kJdC+8e&}4bgWO>kJc~F6@hq3P;C8Gja*>AlI
z70Akd>s_co7Mntt@$^(6OP&>)@$^(6i=T>LNBe)+rc;5ea%i$VXtF$LvOH+AJZQ2!
eXtE|lkN*HlT2HY1*5t(i0000<MNUMnLSTY6g}H73

literal 0
HcmV?d00001

diff --git a/include/colour.h b/include/colour.h
index 80e875f..bf2ad7c 100644
--- a/include/colour.h
+++ b/include/colour.h
@@ -1,7 +1,7 @@
 #ifndef __COLOUR_H__
 #define __COLOUR_H__
 
-#include <cstdint>;
+#include <cstdint>
 
 struct RGBA{
 	uint8_t r;
diff --git a/include/components/cFontfile.h b/include/components/cFontfile.h
new file mode 100644
index 0000000..cb06e74
--- /dev/null
+++ b/include/components/cFontfile.h
@@ -0,0 +1,28 @@
+#ifndef __COMPONENTS__FONTFILE_H__
+#define __COMPONENTS__FONTFILE_H__
+
+#include <SDL_image.h>
+#include <SDL_ttf.h>
+
+#include "components/cTexture.h"
+#include "colour.h"
+
+class cFontfile : public cTexture
+{
+	static bool ttf_isInit;
+	public:
+		cFontfile();
+		void renderText( std::string str );
+		bool loadFromFile( std::string path );
+
+		void setColour( Colour colour );
+		void setColour( uint8_t red, uint8_t green, uint8_t blue );
+	private:
+		TTF_Font* _font = NULL;
+		Colour _colour = Colour(0, 0, 0);
+		SDL_Color _col = { 0xff, 0xff, 0x00 };
+		uint8_t _fontsize = 28;
+};
+
+
+#endif // __COMPONENTS__FONTFILE_H__
\ No newline at end of file
diff --git a/include/components/cTexture.h b/include/components/cTexture.h
index 0afd96c..d76eea8 100644
--- a/include/components/cTexture.h
+++ b/include/components/cTexture.h
@@ -6,11 +6,10 @@
 #include <string>
 #include "components/components-generic.h"
 #include "window.h"
+#include "logger.h"
 #include "colour.h"
 #include "maths/vec2.h"
 
-
-
 class cTexture : public CComponentGeneric
 {
 	public:
@@ -18,8 +17,14 @@ class cTexture : public CComponentGeneric
 		~cTexture();
 		bool loadFromFile( std::string path );
 		void free();
-		void render( Vec2 pt );
-		void render( Vec2 pt, SDL_Renderer *renderer, SDL_Rect *clip = NULL );
+		void render(
+			SDL_Renderer *renderer,
+			Vec2 pt,
+			SDL_Rect *clip = NULL,
+			double angle = 0,
+			SDL_Point* center = NULL,
+			SDL_RendererFlip flip = SDL_FLIP_NONE
+		);
 
 		int getWidth(){ return this->_width; }
 		int getHeight(){ return this->_height; }
@@ -29,10 +34,13 @@ class cTexture : public CComponentGeneric
 		
 		void setBlendMode( SDL_BlendMode blending );
 		void setAlpha( uint8_t alpha );
-	private:
+	protected:
+		Logger &_logger;
 		SDL_Texture* _texture;
 		uint16_t _width;
 		uint16_t _height;
 };
 
+class cFontfile;
+
 #endif // __COMPONENTS__TEXTURE_H__
diff --git a/include/entities/eButton.h b/include/entities/eButton.h
new file mode 100644
index 0000000..90f3c62
--- /dev/null
+++ b/include/entities/eButton.h
@@ -0,0 +1,21 @@
+#ifndef __ENTITIES__BUTTON
+#define __ENTITIES__BUTTON
+
+#include <SDL.h>
+
+#include "entities/entity-generic.h"
+#include "maths/maths.h"
+#include "components/cTexture.h"
+
+class eButton : public EntityGeneric
+{
+	public:
+		void setPosition( Vec2 pos );
+		void handleEvent( SDL_Event* evt );
+		void render();
+	private:
+		Vec2 _pos;
+		cTexture _sprite;
+};
+
+#endif // __ENTITIES__BUTTON
diff --git a/include/window.h b/include/window.h
index 52f660f..c40d6a0 100644
--- a/include/window.h
+++ b/include/window.h
@@ -10,8 +10,13 @@
 #include "logger.h"
 #include "colour.h"
 #include "maths/vec2.h"
-#include "components/cTexture.h"
 
+
+
+// #include "components/cFontfile.h"
+// #include "components/cTexture.h"
+
+class cFontfile;
 class cTexture;
 
 const uint16_t SCREEN_HEIGHT = 600;
@@ -54,12 +59,15 @@ class Window
 		SDL_Surface* loadSurface( std::string path );
 		Logger& _logger;
 		SDL_Window* _window;
+		size_t _frame = 0;
 		SDL_Texture* _activeTexture;
 
 		Colour _screenModulation;
 		cTexture* _background;
 		cTexture* _character;
+		cTexture* _arrow;
 		cTexture* _textureSprite;
+		cFontfile* _fontFile;
 		SDL_Rect _sprites[4];
 		uint8_t _alpha = 0xff;
 
@@ -84,4 +92,7 @@ class Window
 		void clean();
 };
 
+
+
+
 #endif // __WINDOW_H__
\ No newline at end of file
diff --git a/src/components/cFontfile.cpp b/src/components/cFontfile.cpp
new file mode 100644
index 0000000..519d56b
--- /dev/null
+++ b/src/components/cFontfile.cpp
@@ -0,0 +1,53 @@
+#include "components/cFontfile.h"
+
+bool cFontfile::ttf_isInit = false;
+
+cFontfile::cFontfile()
+	: cTexture()
+{
+	if( ! cFontfile::ttf_isInit )
+	{
+		if( TTF_Init() == -1 )
+			{ printf( "SDL_ttf could not initialize! SDL_ttf Error: %s\n", TTF_GetError() ); }
+		else { cFontfile::ttf_isInit = true; }
+	}
+}
+
+
+bool cFontfile::loadFromFile( std::string path )
+{
+	this->_logger.info( "Loading Font: "+path );
+	this->free();
+	SDL_Texture* texture = NULL;
+	this->_font = TTF_OpenFont( path.c_str(), this->_fontsize );
+	if( this->_font == NULL )
+		{ printf( "Failed to load lazy font! SDL_ttf Error: %s\n", TTF_GetError() ); }
+	else
+	{
+
+	}
+	return texture != NULL;
+}
+
+void cFontfile::renderText( std::string str )
+{
+	free();
+
+	SDL_Surface* textSurface = TTF_RenderText_Solid( this->_font, str.c_str(), this->_col );
+
+	if( textSurface == NULL )
+		{ /* error */ return; }
+	this->_texture = SDL_CreateTextureFromSurface( Window::renderer, textSurface );
+	if( ! this->_texture )
+		{ /* error */ return; }
+
+	this->_width = textSurface->w;
+	this->_height = textSurface->h;
+
+	SDL_FreeSurface( textSurface );
+}
+
+void cFontfile::setColour( Colour colour ) { this->_colour = colour; }
+void cFontfile::setColour( uint8_t red, uint8_t green, uint8_t blue ) {
+	this->_colour = Colour( red, green, blue );
+}
\ No newline at end of file
diff --git a/src/components/cTexture.cpp b/src/components/cTexture.cpp
index 499ae0f..2562f51 100644
--- a/src/components/cTexture.cpp
+++ b/src/components/cTexture.cpp
@@ -2,6 +2,7 @@
 
 cTexture::cTexture()
 	: _texture( NULL ),
+	_logger( Logger::instance() ),
 	_width( 0 ), _height( 0 )
 {}
 
@@ -50,7 +51,7 @@ void cTexture::setColour( uint8_t red, uint8_t green, uint8_t blue ) { SDL_SetTe
 void cTexture::setBlendMode( SDL_BlendMode blending ) { SDL_SetTextureBlendMode( this->_texture, blending ); }
 void cTexture::setAlpha( uint8_t alpha ) { SDL_SetTextureAlphaMod( this->_texture, alpha ); }
 
-void cTexture::render( Vec2 pt, SDL_Renderer *renderer, SDL_Rect* clip )
+void cTexture::render( SDL_Renderer *renderer, Vec2 pt,  SDL_Rect* clip, double angle, SDL_Point* center, SDL_RendererFlip flip )
 {
 	if( this->_width && this->_height )
 	{
@@ -60,14 +61,6 @@ void cTexture::render( Vec2 pt, SDL_Renderer *renderer, SDL_Rect* clip )
 			quad.w = clip->w;
 			quad.h = clip->h;
 		}
-		SDL_RenderCopy( renderer, this->_texture, clip, &quad );
-	}
-}
-void cTexture::render( Vec2 pt )
-{
-	if( Window::renderer != NULL )
-	{
-		SDL_Rect quad = { (int)pt.x, (int)pt.y, this->_width, this->_height };
-		SDL_RenderCopy( Window::renderer, this->_texture, NULL, &quad );
+		SDL_RenderCopyEx( renderer, this->_texture, clip, &quad, angle, center, flip );
 	}
 }
\ No newline at end of file
diff --git a/src/entities/eButton.cpp b/src/entities/eButton.cpp
new file mode 100644
index 0000000..b4f5fc3
--- /dev/null
+++ b/src/entities/eButton.cpp
@@ -0,0 +1,5 @@
+#include "entities/eButton.h"
+
+void eButton::setPosition( Vec2 pos ){}
+void eButton::handleEvent( SDL_Event* evt ){}
+void eButton::render(){}
\ No newline at end of file
diff --git a/src/game-engine.cpp b/src/game-engine.cpp
index e24ab03..2563fa2 100644
--- a/src/game-engine.cpp
+++ b/src/game-engine.cpp
@@ -36,8 +36,8 @@ void GameEngine::run()
 	this->init();
 	this->isRunning = true;
 	this->_frame = 0;
-	std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
-	std::time_t _frametime = std::chrono::system_clock::to_time_t(now);
+	std::chrono::system_clock::time_point now = std::chrono::high_resolution_clock::now();
+	std::time_t _frametime = std::chrono::high_resolution_clock::to_time_t(now);
 	while( this->isRunning ) { this->update(); }
 }
 
@@ -47,13 +47,15 @@ void GameEngine::update()
 	this->handleInput();
 
 	this->_entityManager.update();
-	std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
+	std::chrono::system_clock::time_point now = std::chrono::high_resolution_clock::now();
 
 	if ( ++this->_frame % 1 == 0 ) {
-		std::time_t cTime = std::chrono::system_clock::to_time_t(now);
+		std::time_t cTime = std::chrono::high_resolution_clock::to_time_t(now);
 		size_t delTime = cTime - this->_frametime;
 		this->_frametime = cTime;
-		printf( "Frame: %i at %.2f fps\n", this->_frame, delTime == 0 ? 0.0 : 1.0 / delTime );
+		std::cout << cTime  << std::endl;
+		// printf( "Frame: %i at %.2f fps\n", this->_frame, delTime == 0 ? 0.0 : 1.0 / delTime );
+		printf( "Frame: %i at %.2f fps over %i s\n", this->_frame, delTime == 0 ? 0.0 : 1.0 / delTime, delTime );
 	}
 	this->_window->update();
 }
@@ -70,22 +72,6 @@ void GameEngine::handleInput()
 			{
 				case SDL_QUIT: this->close(); break;
 				case SDLK_ESCAPE: this->close(); break;
-				// case SDLK_PAGEUP:
-				// 	this->_screenModulation.brighten( 5 );
-				// 	break;
-				// case SDLK_PAGEDOWN:
-				// 	this->_screenModulation.darken( 5 );
-				// 	break;
-				// case SDLK_PLUS:
-				// case SDLK_KP_PLUS:
-				// case SDLK_GREATER:
-				// 	if( this->_alpha < 0xFF ) this->_alpha += 5;
-				// 	break;
-				// case SDLK_LESS:
-				// case SDLK_MINUS:
-				// case SDLK_KP_MINUS:
-				// 	if( this->_alpha > 5 ) this->_alpha -= 5;
-				// 	break;
 			}
 		}
 	}
diff --git a/src/window.cpp b/src/window.cpp
index abd0c53..abe9cd5 100644
--- a/src/window.cpp
+++ b/src/window.cpp
@@ -1,4 +1,6 @@
 #include "window.h"
+#include "components/cFontfile.h"
+#include "components/cTexture.h"
 
 bool Window::sdlIsInit = false;
 SDL_Renderer* Window::renderer = NULL;
@@ -14,7 +16,9 @@ Window::Window()
 	this->_renderSurface = nullptr;
 	this->_background = new cTexture();
 	this->_character = new cTexture();
+	this->_arrow = new cTexture();
 	this->_water = new cTexture();
+	this->_fontFile = new cFontfile();
 	this->_textureSprite = new cTexture();
 
 	this->_screenModulation = Colour( 0x88, 0x88, 0x88, 0xFF );
@@ -38,6 +42,7 @@ void Window::initialise()
 
 	this->_toClose = false;
 	this->_hasInit = true;
+	this->_frame = 0;
 }
 
 SDL_Texture* Window::loadTexture( std::string path )
@@ -85,6 +90,9 @@ void Window::loadMedia()
 {
 	this->_background->loadFromFile( "assets/background.png" );
 	this->_character->loadFromFile( "assets/person.png" );
+	this->_arrow->loadFromFile( "assets/arrow.png" );
+	this->_fontFile->loadFromFile( "assets/MonoRegular-jEmAR.ttf" );
+	this->_fontFile->setColour( 255, 255, 0 );
 	if( this->_water->loadFromFile( "assets/water_animated.png" ) )
 	{
 		// Set Frame 1
@@ -156,20 +164,19 @@ void Window::update() {
 
 	SDL_Rect bg = this->_createViewport( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
 	this->_background->setColour( this->_screenModulation );
-	this->_background->render( {0,0}, this->_renderer );
-	this->_character->render( {SCREEN_HEIGHT/3,SCREEN_HEIGHT/3}, this->_renderer );
-	// this->_textureSprite->render( {0,0}, this->_renderer );
+	this->_background->render( this->_renderer, {0,0} );
+	this->_character->render( this->_renderer, {SCREEN_HEIGHT/3,SCREEN_HEIGHT/3} );
+	// this->_textureSprite->render( this->_renderer, {0,0} );
 
 	//Render top left sprite
 	this->_textureSprite->setAlpha( this->_alpha );
-	this->_textureSprite->render( {0, 0}, this->_renderer, &this->_sprites[ 0 ] );
+	this->_textureSprite->render( this->_renderer, {0, 0}, &this->_sprites[ 0 ] );
 	//Render top right sprite
-	this->_textureSprite->render( {SCREEN_WIDTH - this->_sprites[ 1 ].w, 0}, this->_renderer, &this->_sprites[ 1 ] );
+	this->_textureSprite->render( this->_renderer, {SCREEN_WIDTH - this->_sprites[ 1 ].w, 0}, &this->_sprites[ 1 ] );
 	//Render bottom left sprite
-	this->_textureSprite->render( {0, SCREEN_HEIGHT - this->_sprites[ 2 ].h}, this->_renderer, &this->_sprites[ 2 ] );
+	this->_textureSprite->render( this->_renderer, {0, SCREEN_HEIGHT - this->_sprites[ 2 ].h}, &this->_sprites[ 2 ] );
 	//Render bottom right sprite
-	this->_textureSprite->render( {SCREEN_WIDTH - this->_sprites[ 3 ].w, SCREEN_HEIGHT - this->_sprites[ 3 ].h}, this->_renderer, &this->_sprites[ 3 ] );
-
+	this->_textureSprite->render( this->_renderer, {SCREEN_WIDTH - this->_sprites[ 3 ].w, SCREEN_HEIGHT - this->_sprites[ 3 ].h}, &this->_sprites[ 3 ] );
 
 	
 	SDL_Rect core = this->_createViewport( SCREEN_WIDTH / 4, SCREEN_HEIGHT / 4, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 );
@@ -183,7 +190,13 @@ void Window::update() {
 		this->_drawPoint( { SCREEN_WIDTH / 2, i } );
 	}
 
+	// Water
+	this->_water->render( this->_renderer, { 0, 0 }, &this->_waterTicks[ this->_frame % this->_waterFrames ] );
+
+
 	SDL_Rect overlay = this->_createViewport( 0, 0, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 );
+	this->_arrow->render( this->_renderer, {100, 100}, NULL, this->_frame % 360 );
+
 	const int hexRad = 10;
 	const int hexSpacing = 1;
 	const int drawHexRad = hexRad + hexSpacing;
@@ -202,7 +215,11 @@ void Window::update() {
 
 	// SDL_RenderCopy( this->_renderer, this->_activeTexture, NULL, NULL );
 
+	overlay = this->_createViewport( 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT );
+	this->_fontFile->renderText( std::to_string(this->_frame) );
+	this->_fontFile->render( this->_renderer, {50,50} );
 
+	++this->_frame;
 	SDL_RenderPresent( this->_renderer );
 }
 
@@ -296,36 +313,6 @@ void Window::spawn()
 
 void Window::processInput()
 {
-	SDL_Event e;
-	while( SDL_PollEvent( &e ) )
-	{
-		// std::cout << "event" << std::endl;
-		if( e.type == SDL_QUIT ) this->_toClose = true;
-		else if( e.type == SDL_KEYDOWN )
-		{
-			switch( e.key.keysym.sym )
-			{
-				case SDL_QUIT: this->_toClose = true; break;
-				case SDLK_ESCAPE: this->_toClose = true; break;
-				case SDLK_PAGEUP:
-					this->_screenModulation.brighten( 5 );
-					break;
-				case SDLK_PAGEDOWN:
-					this->_screenModulation.darken( 5 );
-					break;
-				case SDLK_PLUS:
-				case SDLK_KP_PLUS:
-				case SDLK_GREATER:
-					if( this->_alpha < 0xFF ) this->_alpha += 5;
-					break;
-				case SDLK_LESS:
-				case SDLK_MINUS:
-				case SDLK_KP_MINUS:
-					if( this->_alpha > 5 ) this->_alpha -= 5;
-					break;
-			}
-		}
-	}
 }
 
 void Window::clean()
-- 
GitLab