mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 17:52:45 +00:00 
			
		
		
		
	LibGUI: Simplify Dialog::ScreenPosition and allow Dialogs to opt out
These options were created 2 years ago but the only use cases thus far are for Center and CenterWithinParent, so let's chuck the rest for now. Adds a new DoNotPosition option to opt out of automatic centering and a ScreenPosition setter and getter for configuration before exec()
This commit is contained in:
		
							parent
							
								
									dfe06096c7
								
							
						
					
					
						commit
						f76d24c2ec
					
				
					 2 changed files with 15 additions and 84 deletions
				
			
		|  | @ -6,7 +6,6 @@ | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
| #include <LibCore/EventLoop.h> | #include <LibCore/EventLoop.h> | ||||||
| #include <LibGUI/Desktop.h> |  | ||||||
| #include <LibGUI/Dialog.h> | #include <LibGUI/Dialog.h> | ||||||
| #include <LibGUI/Event.h> | #include <LibGUI/Event.h> | ||||||
| #include <LibGfx/Palette.h> | #include <LibGfx/Palette.h> | ||||||
|  | @ -25,83 +24,21 @@ Dialog::ExecResult Dialog::exec() | ||||||
|     VERIFY(!m_event_loop); |     VERIFY(!m_event_loop); | ||||||
|     m_event_loop = make<Core::EventLoop>(); |     m_event_loop = make<Core::EventLoop>(); | ||||||
| 
 | 
 | ||||||
|     auto desktop_rect = Desktop::the().rect(); |  | ||||||
|     auto window_rect = rect(); |  | ||||||
| 
 |  | ||||||
|     auto top_align = [](Gfx::Rect<int>& rect) { rect.set_y(32); }; |  | ||||||
|     auto bottom_align = [this, desktop_rect](Gfx::Rect<int>& rect) { rect.set_y(desktop_rect.height() - Desktop::the().taskbar_height() - height() - 12); }; |  | ||||||
| 
 |  | ||||||
|     auto left_align = [](Gfx::Rect<int>& rect) { rect.set_x(12); }; |  | ||||||
|     auto right_align = [this, desktop_rect](Gfx::Rect<int>& rect) { rect.set_x(desktop_rect.width() - width() - 12); }; |  | ||||||
| 
 |  | ||||||
|     switch (m_screen_position) { |     switch (m_screen_position) { | ||||||
|  |     case ScreenPosition::DoNotPosition: | ||||||
|  |         break; | ||||||
|     case ScreenPosition::CenterWithinParent: |     case ScreenPosition::CenterWithinParent: | ||||||
|         if (parent() && is<Window>(parent())) { |         if (auto parent = find_parent_window(); parent && parent->is_visible()) { | ||||||
|             auto& parent_window = *static_cast<Window*>(parent()); |             center_within(*parent); | ||||||
|             if (parent_window.is_visible()) { |             constrain_to_desktop(); | ||||||
|                 // Check the dialog's position against the Desktop's rect and reposition it to be entirely visible.
 |             break; | ||||||
|                 // If the dialog is larger than the desktop's rect just center it.
 |  | ||||||
|                 window_rect.center_within(parent_window.rect()); |  | ||||||
|                 if (window_rect.size().width() < desktop_rect.size().width() && window_rect.size().height() < desktop_rect.size().height()) { |  | ||||||
|                     auto taskbar_top_y = desktop_rect.bottom() - Desktop::the().taskbar_height(); |  | ||||||
|                     auto palette = GUI::Application::the()->palette(); |  | ||||||
|                     auto border_thickness = palette.window_border_thickness(); |  | ||||||
|                     auto top_border_title_thickness = border_thickness + palette.window_title_height(); |  | ||||||
|                     if (window_rect.top() < top_border_title_thickness) { |  | ||||||
|                         window_rect.set_y(top_border_title_thickness); |  | ||||||
|                     } |  | ||||||
|                     if (window_rect.right() + border_thickness > desktop_rect.right()) { |  | ||||||
|                         window_rect.translate_by((window_rect.right() + border_thickness - desktop_rect.right()) * -1, 0); |  | ||||||
|                     } |  | ||||||
|                     if (window_rect.bottom() + border_thickness > taskbar_top_y) { |  | ||||||
|                         window_rect.translate_by(0, (window_rect.bottom() + border_thickness - taskbar_top_y) * -1); |  | ||||||
|                     } |  | ||||||
|                     if (window_rect.left() - border_thickness < 0) { |  | ||||||
|                         window_rect.set_x(0 + border_thickness); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|                 break; |  | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|         [[fallthrough]]; // Fall back to `Center` if parent window is invalid or not visible
 |         [[fallthrough]]; | ||||||
|     case ScreenPosition::Center: |     case ScreenPosition::Center: | ||||||
|         window_rect.center_within(desktop_rect); |         center_on_screen(); | ||||||
|         break; |  | ||||||
|     case ScreenPosition::CenterLeft: |  | ||||||
|         left_align(window_rect); |  | ||||||
|         window_rect.center_vertically_within(desktop_rect); |  | ||||||
|         break; |  | ||||||
|     case ScreenPosition::CenterRight: |  | ||||||
|         right_align(window_rect); |  | ||||||
|         window_rect.center_vertically_within(desktop_rect); |  | ||||||
|         break; |  | ||||||
|     case ScreenPosition::TopLeft: |  | ||||||
|         left_align(window_rect); |  | ||||||
|         top_align(window_rect); |  | ||||||
|         break; |  | ||||||
|     case ScreenPosition::TopCenter: |  | ||||||
|         window_rect.center_horizontally_within(desktop_rect); |  | ||||||
|         top_align(window_rect); |  | ||||||
|         break; |  | ||||||
|     case ScreenPosition::TopRight: |  | ||||||
|         right_align(window_rect); |  | ||||||
|         top_align(window_rect); |  | ||||||
|         break; |  | ||||||
|     case ScreenPosition::BottomLeft: |  | ||||||
|         left_align(window_rect); |  | ||||||
|         bottom_align(window_rect); |  | ||||||
|         break; |  | ||||||
|     case ScreenPosition::BottomCenter: |  | ||||||
|         window_rect.center_horizontally_within(desktop_rect); |  | ||||||
|         bottom_align(window_rect); |  | ||||||
|         break; |  | ||||||
|     case ScreenPosition::BottomRight: |  | ||||||
|         right_align(window_rect); |  | ||||||
|         bottom_align(window_rect); |  | ||||||
|         break; |         break; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     set_rect(window_rect); |  | ||||||
|     show(); |     show(); | ||||||
|     auto result = m_event_loop->exec(); |     auto result = m_event_loop->exec(); | ||||||
|     m_event_loop = nullptr; |     m_event_loop = nullptr; | ||||||
|  |  | ||||||
|  | @ -22,20 +22,11 @@ public: | ||||||
|         Yes = 3, |         Yes = 3, | ||||||
|         No = 4, |         No = 4, | ||||||
|     }; |     }; | ||||||
|  | 
 | ||||||
|     enum class ScreenPosition { |     enum class ScreenPosition { | ||||||
|         CenterWithinParent = 0, |         DoNotPosition, | ||||||
| 
 |         CenterWithinParent, | ||||||
|         Center = 1, |         Center, | ||||||
|         CenterLeft = 2, |  | ||||||
|         CenterRight = 3, |  | ||||||
| 
 |  | ||||||
|         TopLeft = 4, |  | ||||||
|         TopCenter = 5, |  | ||||||
|         TopRight = 6, |  | ||||||
| 
 |  | ||||||
|         BottomLeft = 7, |  | ||||||
|         BottomCenter = 8, |  | ||||||
|         BottomRight = 9, |  | ||||||
|     }; |     }; | ||||||
| 
 | 
 | ||||||
|     virtual ~Dialog() override = default; |     virtual ~Dialog() override = default; | ||||||
|  | @ -45,6 +36,9 @@ public: | ||||||
|     ExecResult result() const { return m_result; } |     ExecResult result() const { return m_result; } | ||||||
|     void done(ExecResult); |     void done(ExecResult); | ||||||
| 
 | 
 | ||||||
|  |     ScreenPosition screen_position() const { return m_screen_position; } | ||||||
|  |     void set_screen_position(ScreenPosition position) { m_screen_position = position; } | ||||||
|  | 
 | ||||||
|     virtual void event(Core::Event&) override; |     virtual void event(Core::Event&) override; | ||||||
| 
 | 
 | ||||||
|     virtual void close() override; |     virtual void close() override; | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 thankyouverycool
						thankyouverycool