| 
									
										
										
										
											2020-01-18 09:38:21 +01:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org> | 
					
						
							|  |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Redistribution and use in source and binary forms, with or without | 
					
						
							|  |  |  |  * modification, are permitted provided that the following conditions are met: | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 1. Redistributions of source code must retain the above copyright notice, this | 
					
						
							|  |  |  |  *    list of conditions and the following disclaimer. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 2. Redistributions in binary form must reproduce the above copyright notice, | 
					
						
							|  |  |  |  *    this list of conditions and the following disclaimer in the documentation | 
					
						
							|  |  |  |  *    and/or other materials provided with the distribution. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | 
					
						
							|  |  |  |  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
					
						
							|  |  |  |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 
					
						
							|  |  |  |  * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | 
					
						
							|  |  |  |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
					
						
							|  |  |  |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | 
					
						
							|  |  |  |  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | 
					
						
							|  |  |  |  * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | 
					
						
							|  |  |  |  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 
					
						
							|  |  |  |  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-24 16:32:20 +02:00
										 |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-13 10:27:19 +02:00
										 |  |  | #include <LibCore/CTimer.h>
 | 
					
						
							| 
									
										
										
										
											2019-07-18 10:15:00 +02:00
										 |  |  | #include <LibDraw/TextAlignment.h>
 | 
					
						
							| 
									
										
										
										
											2020-01-10 19:06:00 +03:00
										 |  |  | #include <LibGUI/GWidget.h>
 | 
					
						
							| 
									
										
										
										
											2019-05-24 22:54:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-02 15:07:41 +01:00
										 |  |  | namespace GUI { | 
					
						
							| 
									
										
										
										
											2019-05-24 16:32:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-02 15:07:41 +01:00
										 |  |  | class Painter; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class AbstractButton : public Widget { | 
					
						
							| 
									
										
										
										
											2020-02-02 12:34:39 +01:00
										 |  |  |     C_OBJECT_ABSTRACT(GAbstractButton) | 
					
						
							| 
									
										
										
										
											2019-05-24 16:32:20 +02:00
										 |  |  | public: | 
					
						
							| 
									
										
										
										
											2020-02-02 15:07:41 +01:00
										 |  |  |     virtual ~AbstractButton() override; | 
					
						
							| 
									
										
										
										
											2019-05-24 16:32:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-24 17:11:42 +02:00
										 |  |  |     Function<void(bool)> on_checked; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-02 14:58:02 +02:00
										 |  |  |     void set_text(const StringView&); | 
					
						
							| 
									
										
										
										
											2019-05-24 16:32:20 +02:00
										 |  |  |     const String& text() const { return m_text; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-12 05:57:26 +02:00
										 |  |  |     bool is_exclusive() const { return m_exclusive; } | 
					
						
							|  |  |  |     void set_exclusive(bool b) { m_exclusive = b; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-24 16:32:20 +02:00
										 |  |  |     bool is_checked() const { return m_checked; } | 
					
						
							|  |  |  |     void set_checked(bool); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool is_checkable() const { return m_checkable; } | 
					
						
							|  |  |  |     void set_checkable(bool); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool is_hovered() const { return m_hovered; } | 
					
						
							|  |  |  |     bool is_being_pressed() const { return m_being_pressed; } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     virtual void click() = 0; | 
					
						
							| 
									
										
										
										
											2019-05-24 17:11:42 +02:00
										 |  |  |     virtual bool accepts_focus() const override { return true; } | 
					
						
							| 
									
										
										
										
											2019-07-09 22:10:03 +02:00
										 |  |  |     virtual bool is_uncheckable() const { return true; } | 
					
						
							| 
									
										
										
										
											2019-05-24 16:32:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-13 10:27:19 +02:00
										 |  |  |     int auto_repeat_interval() const { return m_auto_repeat_interval; } | 
					
						
							|  |  |  |     void set_auto_repeat_interval(int interval) { m_auto_repeat_interval = interval; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-24 16:32:20 +02:00
										 |  |  | protected: | 
					
						
							| 
									
										
										
										
											2020-02-02 15:07:41 +01:00
										 |  |  |     explicit AbstractButton(Widget* parent); | 
					
						
							|  |  |  |     AbstractButton(const StringView&, Widget* parent); | 
					
						
							| 
									
										
										
										
											2019-05-24 16:32:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-02 15:07:41 +01:00
										 |  |  |     virtual void mousedown_event(MouseEvent&) override; | 
					
						
							|  |  |  |     virtual void mousemove_event(MouseEvent&) override; | 
					
						
							|  |  |  |     virtual void mouseup_event(MouseEvent&) override; | 
					
						
							|  |  |  |     virtual void keydown_event(KeyEvent&) override; | 
					
						
							| 
									
										
										
										
											2020-02-02 12:34:39 +01:00
										 |  |  |     virtual void enter_event(Core::Event&) override; | 
					
						
							|  |  |  |     virtual void leave_event(Core::Event&) override; | 
					
						
							| 
									
										
										
										
											2020-02-02 15:07:41 +01:00
										 |  |  |     virtual void change_event(Event&) override; | 
					
						
							| 
									
										
										
										
											2019-05-24 16:32:20 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-02 15:07:41 +01:00
										 |  |  |     void paint_text(Painter&, const Rect&, const Font&, TextAlignment); | 
					
						
							| 
									
										
										
										
											2019-05-24 22:54:37 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-24 16:32:20 +02:00
										 |  |  | private: | 
					
						
							| 
									
										
										
										
											2019-06-12 05:57:26 +02:00
										 |  |  |     virtual bool is_abstract_button() const final { return true; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-05-24 16:32:20 +02:00
										 |  |  |     String m_text; | 
					
						
							|  |  |  |     bool m_checked { false }; | 
					
						
							|  |  |  |     bool m_checkable { false }; | 
					
						
							|  |  |  |     bool m_hovered { false }; | 
					
						
							|  |  |  |     bool m_being_pressed { false }; | 
					
						
							| 
									
										
										
										
											2019-06-12 05:57:26 +02:00
										 |  |  |     bool m_exclusive { false }; | 
					
						
							| 
									
										
										
										
											2019-07-13 10:27:19 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     int m_auto_repeat_interval { 0 }; | 
					
						
							| 
									
										
										
										
											2020-02-02 12:34:39 +01:00
										 |  |  |     RefPtr<Core::Timer> m_auto_repeat_timer; | 
					
						
							| 
									
										
										
										
											2019-05-24 16:32:20 +02:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2019-06-12 05:57:26 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-02 15:07:41 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-12 05:57:26 +02:00
										 |  |  | template<> | 
					
						
							| 
									
										
										
										
											2020-02-02 15:07:41 +01:00
										 |  |  | inline bool Core::is<GUI::AbstractButton>(const Core::Object& object) | 
					
						
							| 
									
										
										
										
											2019-06-12 05:57:26 +02:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2020-02-02 15:07:41 +01:00
										 |  |  |     if (!is<GUI::Widget>(object)) | 
					
						
							| 
									
										
										
										
											2019-06-12 05:57:26 +02:00
										 |  |  |         return false; | 
					
						
							| 
									
										
										
										
											2020-02-02 15:07:41 +01:00
										 |  |  |     return to<GUI::Widget>(object).is_abstract_button(); | 
					
						
							| 
									
										
										
										
											2019-06-12 05:57:26 +02:00
										 |  |  | } |