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 <LibGUI/Desktop.h> | ||||
| #include <LibGUI/Dialog.h> | ||||
| #include <LibGUI/Event.h> | ||||
| #include <LibGfx/Palette.h> | ||||
|  | @ -25,83 +24,21 @@ Dialog::ExecResult Dialog::exec() | |||
|     VERIFY(!m_event_loop); | ||||
|     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) { | ||||
|     case ScreenPosition::DoNotPosition: | ||||
|         break; | ||||
|     case ScreenPosition::CenterWithinParent: | ||||
|         if (parent() && is<Window>(parent())) { | ||||
|             auto& parent_window = *static_cast<Window*>(parent()); | ||||
|             if (parent_window.is_visible()) { | ||||
|                 // Check the dialog's position against the Desktop's rect and reposition it to be entirely visible.
 | ||||
|                 // 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; | ||||
|             } | ||||
|         if (auto parent = find_parent_window(); parent && parent->is_visible()) { | ||||
|             center_within(*parent); | ||||
|             constrain_to_desktop(); | ||||
|             break; | ||||
|         } | ||||
|         [[fallthrough]]; // Fall back to `Center` if parent window is invalid or not visible
 | ||||
|         [[fallthrough]]; | ||||
|     case ScreenPosition::Center: | ||||
|         window_rect.center_within(desktop_rect); | ||||
|         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); | ||||
|         center_on_screen(); | ||||
|         break; | ||||
|     } | ||||
| 
 | ||||
|     set_rect(window_rect); | ||||
|     show(); | ||||
|     auto result = m_event_loop->exec(); | ||||
|     m_event_loop = nullptr; | ||||
|  |  | |||
|  | @ -22,20 +22,11 @@ public: | |||
|         Yes = 3, | ||||
|         No = 4, | ||||
|     }; | ||||
| 
 | ||||
|     enum class ScreenPosition { | ||||
|         CenterWithinParent = 0, | ||||
| 
 | ||||
|         Center = 1, | ||||
|         CenterLeft = 2, | ||||
|         CenterRight = 3, | ||||
| 
 | ||||
|         TopLeft = 4, | ||||
|         TopCenter = 5, | ||||
|         TopRight = 6, | ||||
| 
 | ||||
|         BottomLeft = 7, | ||||
|         BottomCenter = 8, | ||||
|         BottomRight = 9, | ||||
|         DoNotPosition, | ||||
|         CenterWithinParent, | ||||
|         Center, | ||||
|     }; | ||||
| 
 | ||||
|     virtual ~Dialog() override = default; | ||||
|  | @ -45,6 +36,9 @@ public: | |||
|     ExecResult result() const { return m_result; } | ||||
|     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 close() override; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 thankyouverycool
						thankyouverycool