seminar11 slider
This commit is contained in:
		
							parent
							
								
									514012f0cb
								
							
						
					
					
						commit
						f1e450cc9e
					
				
					 5 changed files with 218 additions and 0 deletions
				
			
		
							
								
								
									
										6
									
								
								seminar11_events/02_slider/Makefile
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								seminar11_events/02_slider/Makefile
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,6 @@ | |||
| build: | ||||
| 	g++ ./slider.cpp -std=c++11 -o slider -lsfml-graphics -lsfml-window -lsfml-system  | ||||
| build_debug: | ||||
| 	g++ ./slider.cpp -std=c++11 -o slider -lsfml-graphics -lsfml-window -lsfml-system -D_DEBUG | ||||
| build_circle: | ||||
| 	g++ ./circle.cpp -std=c++11 -o circle -lsfml-graphics -lsfml-window -lsfml-system  | ||||
							
								
								
									
										57
									
								
								seminar11_events/02_slider/circle.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								seminar11_events/02_slider/circle.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,57 @@ | |||
| #include <iostream> | ||||
| #include <SFML/Window.hpp> | ||||
| #include <SFML/Graphics.hpp> | ||||
| #include "slider.hpp" | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|     int result; | ||||
|     unsigned char r, g, b; | ||||
| 
 | ||||
|     sf::RenderWindow window(sf::VideoMode(800, 600), "Slider"); | ||||
|     window.setFramerateLimit(60); | ||||
| 
 | ||||
|     sf::Font font; | ||||
|     if (!font.loadFromFile("consolas.ttf")) { | ||||
|         std::cout << "Can't load button font" << std::endl; | ||||
|     } | ||||
| 
 | ||||
|     Slider slider(window, font, sf::Vector2f{200, 100}, 10, 250); | ||||
|      | ||||
|     Slider slider_r(window, font, sf::Vector2f{800, 200}, 0, 255); | ||||
|     Slider slider_g(window, font, sf::Vector2f{800, 300}, 0, 255); | ||||
|     Slider slider_b(window, font, sf::Vector2f{800, 400}, 0, 255); | ||||
|      | ||||
|     sf::CircleShape circle(10); | ||||
|     circle.setPosition(sf::Vector2f{400, 400}); | ||||
| 
 | ||||
|     while (window.isOpen()) { | ||||
|         sf::Event event; | ||||
|         while (window.pollEvent(event)) { | ||||
|             if (event.type == sf::Event::Closed) { | ||||
|                 window.close(); | ||||
|             } | ||||
| 
 | ||||
|             result = slider.handleEvent(event); | ||||
| 
 | ||||
|             /* Centering of the circle */ | ||||
|             circle.setPosition(circle.getPosition() + sf::Vector2f{circle.getRadius() - result, circle.getRadius() - result}); | ||||
|             circle.setRadius(result); | ||||
| 
 | ||||
|             r = slider_r.handleEvent(event); | ||||
|             g = slider_g.handleEvent(event); | ||||
|             b = slider_b.handleEvent(event); | ||||
|             circle.setFillColor(sf::Color{r, g, b}); | ||||
|         } | ||||
|         window.clear(sf::Color::Black); | ||||
| 
 | ||||
|         slider.draw(); | ||||
|         slider_r.draw(); | ||||
|         slider_g.draw(); | ||||
|         slider_b.draw(); | ||||
| 
 | ||||
|         window.draw(circle); | ||||
|         window.display(); | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										
											BIN
										
									
								
								seminar11_events/02_slider/consolas.ttf
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								seminar11_events/02_slider/consolas.ttf
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										36
									
								
								seminar11_events/02_slider/slider.cpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								seminar11_events/02_slider/slider.cpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,36 @@ | |||
| #include <iostream> | ||||
| #include <SFML/Window.hpp> | ||||
| #include <SFML/Graphics.hpp> | ||||
| #include "slider.hpp" | ||||
| 
 | ||||
| int main() | ||||
| { | ||||
|     int result; | ||||
| 
 | ||||
|     sf::RenderWindow window(sf::VideoMode(800, 600), "Slider"); | ||||
|     window.setFramerateLimit(60); | ||||
| 
 | ||||
|     sf::Font font; | ||||
|     if (!font.loadFromFile("consolas.ttf")) { | ||||
|         std::cout << "Can't load button font" << std::endl; | ||||
|     } | ||||
| 
 | ||||
|     Slider slider(window, font); | ||||
| 
 | ||||
|     while (window.isOpen()) { | ||||
|         sf::Event event; | ||||
|         while (window.pollEvent(event)) { | ||||
|             if (event.type == sf::Event::Closed) { | ||||
|                 window.close(); | ||||
|             } | ||||
| 
 | ||||
|             result = slider.handleEvent(event); | ||||
|             std::cout << result << std::endl; | ||||
|         } | ||||
|         window.clear(sf::Color::Black); | ||||
| 
 | ||||
|         slider.draw(); | ||||
|         window.display(); | ||||
|     } | ||||
|     return 0; | ||||
| } | ||||
							
								
								
									
										119
									
								
								seminar11_events/02_slider/slider.hpp
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								seminar11_events/02_slider/slider.hpp
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,119 @@ | |||
| #pragma once | ||||
| #include <SFML/Window.hpp> | ||||
| #include <SFML/Graphics.hpp> | ||||
| #include <sstream> | ||||
| 
 | ||||
| class Slider | ||||
| { | ||||
| private: | ||||
|     inline static const sf::Color defaultColor {sf::Color(190, 210, 190)}; | ||||
|     inline static const sf::Color pressedColor {sf::Color(150, 170, 150)}; | ||||
|     inline static const sf::Color textColor {sf::Color::Black}; | ||||
| 	inline static const int kCharacterSize = 14; | ||||
| 	 | ||||
|     int mMinValue; | ||||
| 	int mMaxValue; | ||||
| 	float mSliderPosition = 0; | ||||
|   | ||||
|     sf::RenderWindow& mRenderWindow; | ||||
|     sf::RectangleShape mSlider; | ||||
|     sf::RectangleShape mAxis; | ||||
|     sf::Text mText; | ||||
|      | ||||
|     /* Is slider pressed at the moment */ | ||||
|     bool mIsPressed = false; | ||||
| 
 | ||||
|     int onMousePressed(const sf::Event& event) | ||||
|     { | ||||
|         if (event.mouseButton.button == sf::Mouse::Left) { | ||||
|             sf::Vector2f mousePosition = mRenderWindow.mapPixelToCoords({event.mouseButton.x, event.mouseButton.y}); | ||||
|             if (mSlider.getGlobalBounds().contains(mousePosition))  | ||||
|                     mIsPressed = true; | ||||
|             else if (mAxis.getGlobalBounds().contains(mousePosition)) | ||||
|                 { | ||||
|                     mIsPressed = true; | ||||
|                     if (mousePosition.x + mSlider.getSize().x <= mAxis.getPosition().x + mAxis.getSize().x) { | ||||
|                         mSlider.setPosition({mousePosition.x, mSlider.getPosition().y}); | ||||
|                         mSliderPosition = (mSlider.getPosition().x - mAxis.getPosition().x) / (mAxis.getSize().x - mSlider.getSize().x); | ||||
|                     } | ||||
|                     else { | ||||
|                         mSlider.setPosition({mAxis.getPosition().x + mAxis.getSize().x - mSlider.getSize().x, mSlider.getPosition().y}); | ||||
|                         mSliderPosition = 1; | ||||
|                     } | ||||
|                 } | ||||
|             }         | ||||
|         return mMinValue + (mMaxValue - mMinValue) * mSliderPosition; | ||||
|     } | ||||
| 
 | ||||
|     int onMouseMove(const sf::Event& event) | ||||
|     { | ||||
|         if (!mIsPressed) { | ||||
|             return mMinValue + (mMaxValue - mMinValue) * mSliderPosition; | ||||
|         } | ||||
|         sf::Vector2f mousePosition = mRenderWindow.mapPixelToCoords({event.mouseMove.x, event.mouseMove.y}); | ||||
|         if ((mousePosition.x >= mAxis.getPosition().x) && (mousePosition.x + mSlider.getSize().x <= mAxis.getPosition().x + mAxis.getSize().x)) { | ||||
|             mSlider.setPosition({mousePosition.x, mSlider.getPosition().y}); | ||||
|         } | ||||
|         else if (mousePosition.x < mAxis.getPosition().x) { | ||||
|             mSlider.setPosition({mAxis.getPosition().x, mSlider.getPosition().y}); | ||||
|         } | ||||
|         else if (mousePosition.x + mSlider.getSize().x > mAxis.getPosition().x + mAxis.getSize().x) { | ||||
|             mSlider.setPosition({mAxis.getPosition().x + mAxis.getSize().x - mSlider.getSize().x, mSlider.getPosition().y}); | ||||
|         } | ||||
| 
 | ||||
|         mSliderPosition = (mSlider.getPosition().x - mAxis.getPosition().x) / (mAxis.getSize().x - mSlider.getSize().x); | ||||
| 
 | ||||
|         return mMinValue + (mMaxValue - mMinValue) * mSliderPosition; | ||||
|     } | ||||
| 
 | ||||
| public: | ||||
| 
 | ||||
|     Slider(sf::RenderWindow& window, const sf::Font& font, sf::Vector2f position = {100,200},int min = 0, int max = 100) : mRenderWindow(window) | ||||
|     {    | ||||
|         mSlider.setFillColor(sf::Color::Red); | ||||
|         mSlider.setSize({10,30}); | ||||
|         mSlider.setPosition(position - sf::Vector2f{0, 10}); | ||||
|         mSlider.setOutlineColor(sf::Color::Black); | ||||
|         mSlider.setOutlineThickness(2); | ||||
| 
 | ||||
|         mAxis.setFillColor(defaultColor); | ||||
|         mAxis.setSize({500,10}); | ||||
|         mAxis.setPosition(position); | ||||
| 
 | ||||
|         std::stringstream ss; | ||||
|         ss << mMinValue; | ||||
|         mText.setString(ss.str()); | ||||
|         mText.setFont(font); | ||||
|         mText.setCharacterSize(kCharacterSize); | ||||
|         mText.setFillColor(sf::Color::White); | ||||
|         mText.setPosition(position + sf::Vector2f{mAxis.getSize().x + 10, -4}); | ||||
| 
 | ||||
|         mMinValue = min; | ||||
|         mMaxValue = max; | ||||
|         mIsPressed = false; | ||||
|     } | ||||
|   | ||||
|     void draw() | ||||
|     { | ||||
|         std::stringstream ss; | ||||
|         ss << mMinValue + (mMaxValue - mMinValue) * mSliderPosition; | ||||
|         mText.setString(ss.str()); | ||||
| 
 | ||||
| 		mRenderWindow.draw(mAxis); | ||||
|         mRenderWindow.draw(mSlider); | ||||
|         mRenderWindow.draw(mText); | ||||
|     } | ||||
| 
 | ||||
|     int handleEvent(const sf::Event& event) { | ||||
|         if (event.type == sf::Event::MouseMoved) { | ||||
|             return onMouseMove(event); | ||||
|         } | ||||
|         else if (event.type == sf::Event::MouseButtonPressed) { | ||||
|             return onMousePressed(event); | ||||
|         } | ||||
|         else if (event.type == sf::Event::MouseButtonReleased) { | ||||
|             mIsPressed = false; | ||||
|         } | ||||
|         return mMinValue + (mMaxValue - mMinValue) * mSliderPosition; | ||||
|     } | ||||
| }; | ||||
		Reference in a new issue