Skip to content

Commit

Permalink
Merge pull request #89831 from bruvzg/macos_pm_title
Browse files Browse the repository at this point in the history
[macOS] Use `expand_to_title` for the project manager.
  • Loading branch information
akien-mga committed Mar 24, 2024
2 parents 9293ced + 2257618 commit 06abc86
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 2 deletions.
66 changes: 65 additions & 1 deletion editor/project_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
#include "editor/editor_settings.h"
#include "editor/editor_string_names.h"
#include "editor/gui/editor_file_dialog.h"
#include "editor/gui/editor_title_bar.h"
#include "editor/plugins/asset_library_editor_plugin.h"
#include "editor/project_manager/project_dialog.h"
#include "editor/project_manager/project_list.h"
Expand Down Expand Up @@ -80,6 +81,12 @@ void ProjectManager::_notification(int p_what) {
case NOTIFICATION_ENTER_TREE: {
Engine::get_singleton()->set_editor_hint(false);

Window *main_window = get_window();
if (main_window) {
// Handle macOS fullscreen and extend-to-title changes.
main_window->connect("titlebar_changed", callable_mp(this, &ProjectManager::_titlebar_resized));
}

// Theme has already been created in the constructor, so we can skip that step.
_update_theme(true);
} break;
Expand All @@ -91,6 +98,7 @@ void ProjectManager::_notification(int p_what) {

_select_main_view(MAIN_VIEW_PROJECTS);
_update_list_placeholder();
_titlebar_resized();
} break;

case NOTIFICATION_VISIBILITY_CHANGED: {
Expand Down Expand Up @@ -1007,6 +1015,24 @@ void ProjectManager::_files_dropped(PackedStringArray p_files) {
project_list->find_projects_multiple(folders);
}

void ProjectManager::_titlebar_resized() {
DisplayServer::get_singleton()->window_set_window_buttons_offset(Vector2i(title_bar->get_global_position().y + title_bar->get_size().y / 2, title_bar->get_global_position().y + title_bar->get_size().y / 2), DisplayServer::MAIN_WINDOW_ID);
const Vector3i &margin = DisplayServer::get_singleton()->window_get_safe_title_margins(DisplayServer::MAIN_WINDOW_ID);
if (left_menu_spacer) {
int w = (root_container->is_layout_rtl()) ? margin.y : margin.x;
left_menu_spacer->set_custom_minimum_size(Size2(w, 0));
right_spacer->set_custom_minimum_size(Size2(w, 0));
}
if (right_menu_spacer) {
int w = (root_container->is_layout_rtl()) ? margin.x : margin.y;
right_menu_spacer->set_custom_minimum_size(Size2(w, 0));
left_spacer->set_custom_minimum_size(Size2(w, 0));
}
if (title_bar) {
title_bar->set_custom_minimum_size(Size2(0, margin.z - title_bar->get_global_position().y));
}
}

// Object methods.

ProjectManager::ProjectManager() {
Expand Down Expand Up @@ -1102,10 +1128,19 @@ ProjectManager::ProjectManager() {
root_container->add_child(main_vbox);

// Title bar.
bool can_expand = bool(EDITOR_GET("interface/editor/expand_to_title")) && DisplayServer::get_singleton()->has_feature(DisplayServer::FEATURE_EXTEND_TO_TITLE);

{
title_bar = memnew(HBoxContainer);
title_bar = memnew(EditorTitleBar);
main_vbox->add_child(title_bar);

if (can_expand) {
// Add spacer to avoid other controls under window minimize/maximize/close buttons (left side).
left_menu_spacer = memnew(Control);
left_menu_spacer->set_mouse_filter(Control::MOUSE_FILTER_PASS);
title_bar->add_child(left_menu_spacer);
}

HBoxContainer *left_hbox = memnew(HBoxContainer);
left_hbox->set_alignment(BoxContainer::ALIGNMENT_BEGIN);
left_hbox->set_h_size_flags(Control::SIZE_EXPAND_FILL);
Expand All @@ -1117,12 +1152,26 @@ ProjectManager::ProjectManager() {
left_hbox->add_child(title_bar_logo);
title_bar_logo->connect("pressed", callable_mp(this, &ProjectManager::_show_about));

if (can_expand) {
// Spacer to center main toggles.
left_spacer = memnew(Control);
left_spacer->set_mouse_filter(Control::MOUSE_FILTER_PASS);
title_bar->add_child(left_spacer);
}

main_view_toggles = memnew(HBoxContainer);
main_view_toggles->set_alignment(BoxContainer::ALIGNMENT_CENTER);
main_view_toggles->set_h_size_flags(Control::SIZE_EXPAND_FILL);
main_view_toggles->set_stretch_ratio(2.0);
title_bar->add_child(main_view_toggles);

if (can_expand) {
// Spacer to center main toggles.
right_spacer = memnew(Control);
right_spacer->set_mouse_filter(Control::MOUSE_FILTER_PASS);
title_bar->add_child(right_spacer);
}

main_view_toggles_group.instantiate();

HBoxContainer *right_hbox = memnew(HBoxContainer);
Expand All @@ -1136,6 +1185,13 @@ ProjectManager::ProjectManager() {
quick_settings_button->set_text(TTR("Settings"));
right_hbox->add_child(quick_settings_button);
quick_settings_button->connect("pressed", callable_mp(this, &ProjectManager::_show_quick_settings));

if (can_expand) {
// Add spacer to avoid other controls under the window minimize/maximize/close buttons (right side).
right_menu_spacer = memnew(Control);
right_menu_spacer->set_mouse_filter(Control::MOUSE_FILTER_PASS);
title_bar->add_child(right_menu_spacer);
}
}

main_view_container = memnew(PanelContainer);
Expand Down Expand Up @@ -1537,6 +1593,14 @@ ProjectManager::ProjectManager() {
}
}

// Extend menu bar to window title.
if (can_expand) {
DisplayServer::get_singleton()->process_events();
DisplayServer::get_singleton()->window_set_flag(DisplayServer::WINDOW_FLAG_EXTEND_TO_TITLE, true, DisplayServer::MAIN_WINDOW_ID);
title_bar->set_can_move_window(true);
title_bar->connect("item_rect_changed", callable_mp(this, &ProjectManager::_titlebar_resized));
}

_update_size_limits();
}

Expand Down
8 changes: 7 additions & 1 deletion editor/project_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ class CheckBox;
class EditorAbout;
class EditorAssetLibrary;
class EditorFileDialog;
class EditorTitleBar;
class HFlowContainer;
class LineEdit;
class LinkButton;
Expand Down Expand Up @@ -71,12 +72,17 @@ class ProjectManager : public Control {

void _update_size_limits();
void _update_theme(bool p_skip_creation = false);
void _titlebar_resized();

MarginContainer *root_container = nullptr;
Panel *background_panel = nullptr;
VBoxContainer *main_vbox = nullptr;

HBoxContainer *title_bar = nullptr;
EditorTitleBar *title_bar = nullptr;
Control *left_menu_spacer = nullptr;
Control *left_spacer = nullptr;
Control *right_menu_spacer = nullptr;
Control *right_spacer = nullptr;
Button *title_bar_logo = nullptr;
HBoxContainer *main_view_toggles = nullptr;
Button *quick_settings_button = nullptr;
Expand Down

0 comments on commit 06abc86

Please sign in to comment.