Skip to content

Commit 71cba15

Browse files
[Project Manager] Fix Wrap Long Project Title
Fixes several issues where long project titles were not wrapping correctly in the project list. Co-authored-by: unit-tick <official.prince.john@gmail.com>
1 parent 51105cc commit 71cba15

2 files changed

Lines changed: 45 additions & 79 deletions

File tree

editor/project_manager/project_list.cpp

Lines changed: 41 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ void ProjectListItemControl::_notification(int p_what) {
175175
} break;
176176

177177
case NOTIFICATION_READY: {
178-
set_project_title_autowrap();
178+
callable_mp(this, &ProjectListItemControl::set_project_title_autowrap).call_deferred();
179179
} break;
180180
}
181181
}
@@ -424,72 +424,47 @@ void ProjectListItemControl::set_is_grayed(bool p_grayed) {
424424
}
425425
}
426426

427-
void ProjectListItemControl::set_project_title_index(int p_title_index) {
428-
project_title_index = p_title_index;
429-
}
430-
431427
void ProjectListItemControl::set_project_title_autowrap() {
428+
ProjectList *pl = get_list();
429+
pl->window_size_cache = get_window()->get_size().x;
432430
title_fullsize_cache = project_title->get_size().x;
433-
window_size_cache = get_window()->get_size().x;
434431

435432
int tag_size = 0;
436433
int tag_maxsize = 0;
437434
for (Node *child : tag_container->iterate_children()) {
438435
ProjectTag *tag = Object::cast_to<ProjectTag>(child);
439-
tag_size += tag->get_size().x;
440-
441-
if (tag_maxsize == 0) {
442-
tag_maxsize = tag->get_custom_maximum_size().x;
436+
int temp_tag_size = tag->get_size().x;
437+
tag_size += temp_tag_size;
438+
if (temp_tag_size > tag_maxsize) {
439+
tag_maxsize = temp_tag_size;
443440
}
444441
}
442+
tag_fullsize_cache = tag_size;
445443
tag_size_cache = MIN(tag_size, tag_maxsize);
446-
int &title_size_cache = get_list()->title_size_cache[project_title_index];
447444

448-
int size_check = 800 * EDSCALE;
449-
if (title_size_cache == 0) {
450-
title_size_cache = size_check;
451-
}
452-
453-
if (title_fullsize_cache > size_check - tag_size_cache) {
454-
resize_project_title();
445+
const int title_size = pl->title_size_cache;
446+
if (title_fullsize_cache > title_size - tag_size) {
447+
resize_project_title(title_size);
455448
}
456449
}
457450

458-
void ProjectListItemControl::resize_project_title() {
459-
if (get_window() == nullptr) {
460-
return;
461-
}
462-
463-
int window_size = get_window()->get_size().x;
464-
int difference = window_size - window_size_cache;
465-
window_size_cache = window_size;
466-
467-
int &title_size_cache = get_list()->title_size_cache[project_title_index];
468-
title_size_cache += difference;
469-
470-
if (title_size_cache > title_fullsize_cache + tag_size_cache) {
471-
project_title->set_custom_maximum_size(Vector2(-1, -1));
472-
project_title->set_custom_minimum_size(Vector2(0, 0));
473-
project_title->set_autowrap_mode(TextServer::AUTOWRAP_OFF);
474-
451+
void ProjectListItemControl::resize_project_title(int p_title_size) {
452+
if (p_title_size >= title_fullsize_cache + tag_fullsize_cache) {
453+
if (project_title->get_autowrap_mode() != TextServer::AUTOWRAP_OFF) {
454+
project_title->set_custom_maximum_size(Vector2(-1, -1));
455+
project_title->set_custom_minimum_size(Vector2(0, 0));
456+
project_title->set_autowrap_mode(TextServer::AUTOWRAP_OFF);
457+
}
475458
return;
476459
}
477-
ProjectTag tag = ProjectTag("dummy");
478-
int tag_maxsize = tag.get_custom_maximum_size().x;
479-
int title_maxsize = title_size_cache - tag_size_cache;
480-
int title_minsize = title_size_cache - tag_maxsize;
481460

482-
int abs_minsize = (200 * EDSCALE);
483-
if (title_fullsize_cache > abs_minsize) {
484-
if (title_minsize < abs_minsize) {
485-
title_minsize = abs_minsize + tag_maxsize - tag_size_cache;
486-
}
487-
if (title_maxsize < title_minsize) {
488-
project_title->set_custom_maximum_size(Vector2(title_minsize, -1));
489-
} else {
490-
project_title->set_custom_maximum_size(Vector2(title_maxsize, -1));
491-
}
492-
project_title->set_custom_minimum_size(Vector2(title_minsize, 0));
461+
const int abs_minsize = (200 * EDSCALE);
462+
const int abs_title_minsize = MAX((338 * EDSCALE) - tag_size_cache, abs_minsize);
463+
if (title_fullsize_cache >= abs_title_minsize) {
464+
const int title_maxsize = MIN(p_title_size - tag_size_cache, title_fullsize_cache);
465+
const int title_size = MAX(title_maxsize, abs_title_minsize);
466+
project_title->set_custom_maximum_size(Vector2(title_size, -1));
467+
project_title->set_custom_minimum_size(Vector2(title_size, 0));
493468
project_title->set_autowrap_mode(TextServer::AUTOWRAP_WORD_SMART);
494469
}
495470
}
@@ -703,7 +678,11 @@ void ProjectList::_notification(int p_what) {
703678
AccessibilityServer::get_singleton()->update_set_role(ae, AccessibilityServerEnums::AccessibilityRole::ROLE_LIST_BOX);
704679
AccessibilityServer::get_singleton()->update_set_list_item_count(ae, _projects.size());
705680
AccessibilityServer::get_singleton()->update_set_flag(ae, AccessibilityServerEnums::AccessibilityFlags::FLAG_MULTISELECTABLE, false);
706-
}
681+
} break;
682+
683+
case NOTIFICATION_READY: {
684+
title_size_cache = 798 * EDSCALE;
685+
} break;
707686
}
708687
}
709688

@@ -936,14 +915,12 @@ void ProjectList::update_project_list() {
936915
// If you have 150 projects, it may read through 150 files on your disk at once + load 150 icons.
937916
// FIXME: Does it really have to be a full, hard reload? Runtime updates should be made much cheaper.
938917

939-
int temp_title_index = -1;
940918
if (ProjectManager::get_singleton()->is_initialized()) {
941919
// Clear whole list
942920
for (int i = 0; i < _projects.size(); ++i) {
943921
Item &project = _projects.write[i];
944922
CRASH_COND(project.control == nullptr);
945923

946-
temp_title_index = project.project_title_index;
947924
memdelete(project.control); // Why not queue_free()?
948925
}
949926

@@ -956,9 +933,6 @@ void ProjectList::update_project_list() {
956933

957934
// Create controls
958935
for (int i = 0; i < _projects.size(); ++i) {
959-
Item &item = _projects.write[i];
960-
item.project_title_index = temp_title_index;
961-
962936
_create_project_item_control(i);
963937
}
964938

@@ -1146,14 +1120,10 @@ int ProjectList::refresh_project(const String &dir_path) {
11461120

11471121
bool was_selected = _selected_project_paths.has(dir_path);
11481122

1149-
int temp_title_index = -1;
1150-
11511123
// Remove item in any case
11521124
for (int i = 0; i < _projects.size(); ++i) {
11531125
const Item &existing_item = _projects[i];
11541126
if (existing_item.path == dir_path) {
1155-
temp_title_index = existing_item.project_title_index;
1156-
11571127
_remove_project(i, false);
11581128
break;
11591129
}
@@ -1165,7 +1135,6 @@ int ProjectList::refresh_project(const String &dir_path) {
11651135

11661136
Item item = load_project_data(dir_path, is_favorite);
11671137

1168-
item.project_title_index = temp_title_index;
11691138
_projects.push_back(item);
11701139
_create_project_item_control(_projects.size() - 1);
11711140

@@ -1233,15 +1202,6 @@ void ProjectList::_create_project_item_control(int p_index) {
12331202
#endif
12341203
hb->connect("request_menu", callable_mp(this, &ProjectList::_open_menu).bind(hb));
12351204

1236-
if (item.project_title_index == -1) {
1237-
project_title_index_count++;
1238-
title_size_cache[project_title_index_count] = 0;
1239-
item.project_title_index = project_title_index_count;
1240-
hb->set_project_title_index(project_title_index_count);
1241-
} else {
1242-
hb->set_project_title_index(item.project_title_index);
1243-
}
1244-
12451205
project_list_vbox->add_child(hb);
12461206
}
12471207

@@ -1597,8 +1557,18 @@ void ProjectList::erase_selected_projects(bool p_delete_project_contents) {
15971557
// Resize project titles.
15981558

15991559
void ProjectList::resize_project_titles() {
1560+
Window *win = get_window();
1561+
if (win == nullptr) {
1562+
return;
1563+
}
1564+
1565+
const int window_size = win->get_size().x;
1566+
const int difference = window_size - window_size_cache;
1567+
window_size_cache = window_size;
1568+
title_size_cache += difference;
1569+
16001570
for (Item &item : _projects) {
1601-
item.control->resize_project_title();
1571+
item.control->resize_project_title(title_size_cache);
16021572
}
16031573
}
16041574

editor/project_manager/project_list.h

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,6 @@ class ProjectListItemControl : public HBoxContainer {
6262

6363
Color favorite_focus_color;
6464

65-
int project_title_index = -1;
66-
6765
bool project_is_missing = false;
6866
bool icon_needs_reload = true;
6967
bool is_selected = false;
@@ -97,8 +95,8 @@ class ProjectListItemControl : public HBoxContainer {
9795
// Caches for resizing project titles.
9896

9997
int title_fullsize_cache = 0;
98+
int tag_fullsize_cache = 0;
10099
int tag_size_cache = 0;
101-
int window_size_cache = 0;
102100

103101
protected:
104102
void _notification(int p_what);
@@ -120,10 +118,9 @@ class ProjectListItemControl : public HBoxContainer {
120118
void set_is_favorite(bool p_favorite);
121119
void set_is_missing(bool p_missing);
122120
void set_is_grayed(bool p_grayed);
123-
void set_project_title_index(int p_title_index);
124121
void set_project_title_autowrap();
125122

126-
void resize_project_title();
123+
void resize_project_title(int p_title_size);
127124

128125
ProjectListItemControl();
129126
};
@@ -172,7 +169,6 @@ class ProjectList : public ScrollContainer {
172169
bool missing = false;
173170
bool recovery_mode = false;
174171
int version = 0;
175-
int project_title_index = -1;
176172

177173
ProjectListItemControl *control = nullptr;
178174

@@ -221,8 +217,8 @@ class ProjectList : public ScrollContainer {
221217
String get_last_edited_string() const;
222218
};
223219

224-
HashMap<int, int> title_size_cache;
225-
int project_title_index_count = -1;
220+
int window_size_cache = 0;
221+
int title_size_cache = 0;
226222

227223
private:
228224
String _config_path;

0 commit comments

Comments
 (0)