Skip to content

Commit 323d0f0

Browse files
committed
icon view: Use a fixed vertical spacing in the normal icon view.
This greatly reduces the amount of processing involved in loading large folders.
1 parent f1c4a29 commit 323d0f0

7 files changed

Lines changed: 64 additions & 27 deletions

libnemo-private/nemo-icon-canvas-item.c

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2022,6 +2022,25 @@ nemo_icon_canvas_item_set_entire_text (NemoIconCanvasItem *item,
20222022
}
20232023
}
20242024

2025+
gint
2026+
nemo_icon_canvas_item_get_fixed_text_height_for_layout (NemoIconCanvasItem *item)
2027+
{
2028+
NemoIconContainer *container;
2029+
PangoLayout *layout;
2030+
gint line_height, total_height, lines;
2031+
2032+
container = NEMO_ICON_CONTAINER (EEL_CANVAS_ITEM (item)->canvas);
2033+
lines = nemo_icon_container_get_max_layout_lines (container);
2034+
lines += nemo_icon_container_get_additional_text_line_count (container);
2035+
layout = create_label_layout (item, "-");
2036+
pango_layout_get_pixel_size (layout, NULL, &line_height);
2037+
2038+
total_height = (line_height * lines) + (LABEL_LINE_SPACING * (lines - 1));
2039+
g_object_unref (layout);
2040+
2041+
return total_height;
2042+
}
2043+
20252044
/* Class initialization function for the icon canvas item. */
20262045
static void
20272046
nemo_icon_canvas_item_class_init (NemoIconCanvasItemClass *class)

libnemo-private/nemo-icon-canvas-item.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ void nemo_icon_canvas_item_set_is_visible (NemoIconCanvasItem
104104
/* whether the entire label text must be visible at all times */
105105
void nemo_icon_canvas_item_set_entire_text (NemoIconCanvasItem *icon_item,
106106
gboolean entire_text);
107-
107+
gint nemo_icon_canvas_item_get_fixed_text_height_for_layout (NemoIconCanvasItem *item);
108108
G_END_DECLS
109109

110110
#endif /* NEMO_ICON_CANVAS_ITEM_H */

libnemo-private/nemo-icon-container.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4903,6 +4903,8 @@ nemo_icon_container_init (NemoIconContainer *container)
49034903
details->font_size_table[NEMO_ZOOM_LEVEL_LARGER] = 0 * PANGO_SCALE;
49044904
details->font_size_table[NEMO_ZOOM_LEVEL_LARGEST] = 0 * PANGO_SCALE;
49054905

4906+
details->fixed_text_height = -1;
4907+
49064908
details->view_constants = g_slice_new0 (NemoViewLayoutConstants);
49074909

49084910
container->details = details;
@@ -5828,6 +5830,8 @@ nemo_icon_container_invalidate_labels (NemoIconContainer *container)
58285830
GList *p;
58295831
NemoIcon *icon;
58305832

5833+
container->details->fixed_text_height = -1;
5834+
58315835
for (p = container->details->icons; p != NULL; p = p->next) {
58325836
icon = p->data;
58335837

@@ -8096,4 +8100,10 @@ nemo_icon_container_update_icon (NemoIconContainer *container,
80968100
NEMO_ICON_CONTAINER_GET_CLASS (container)->update_icon (container, icon);
80978101
}
80988102

8103+
gint
8104+
nemo_icon_container_get_additional_text_line_count (NemoIconContainer *container)
8105+
{
8106+
return NEMO_ICON_CONTAINER_GET_CLASS (container)->get_additional_text_line_count (container);
8107+
}
8108+
80998109
#endif /* ! NEMO_OMIT_SELF_CHECK */

libnemo-private/nemo-icon-container.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@ typedef struct {
163163
NemoIconData *data);
164164
gint (* get_max_layout_lines_for_pango) (NemoIconContainer *container);
165165
gint (* get_max_layout_lines) (NemoIconContainer *container);
166+
gint (* get_additional_text_line_count) (NemoIconContainer *container);
166167

167168
/* Queries on icons for subclass/client.
168169
* These must be implemented => These are signals !
@@ -371,4 +372,5 @@ void nemo_icon_container_widget_to_file_operation_position (NemoIco
371372
void nemo_icon_container_setup_tooltip_preference_callback (NemoIconContainer *container);
372373
void nemo_icon_container_update_tooltip_text (NemoIconContainer *container,
373374
NemoIconCanvasItem *item);
375+
gint nemo_icon_container_get_additional_text_line_count (NemoIconContainer *container);
374376
#endif /* NEMO_ICON_CONTAINER_H */

libnemo-private/nemo-icon-private.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,7 @@ struct NemoIconContainerDetails {
302302

303303
GList *current_selection;
304304
gint current_selection_count;
305+
gint fixed_text_height;
305306
};
306307

307308
typedef struct {

src/nemo-icon-view-container.c

Lines changed: 24 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -720,8 +720,6 @@ lay_down_icons_horizontal (NemoIconContainer *container,
720720
EelDRect bounds;
721721
EelDRect icon_bounds;
722722
EelDRect text_bounds;
723-
double max_height_above, max_height_below;
724-
double height_above, height_below;
725723
double line_width;
726724
double grid_width;
727725
double max_text_width, max_icon_width;
@@ -755,7 +753,7 @@ lay_down_icons_horizontal (NemoIconContainer *container,
755753
text_size = nemo_get_icon_text_width_for_zoom_level (container->details->zoom_level);
756754

757755
use_size = MAX (icon_size, text_size) + 15;
758-
756+
icon_size /= ppu;
759757
if (container->details->label_position == NEMO_ICON_LABEL_POSITION_BESIDE) {
760758
/* Would it be worth caching these bounds for the next loop? */
761759
for (p = icons; p != NULL; p = p->next) {
@@ -782,54 +780,42 @@ lay_down_icons_horizontal (NemoIconContainer *container,
782780
y = start_y + gap;
783781
i = 0;
784782

785-
max_height_above = 0;
786-
max_height_below = 0;
787783
for (p = icons; p != NULL; p = p->next) {
788784
icon = p->data;
789785

786+
if (container->details->fixed_text_height == -1) {
787+
container->details->fixed_text_height = nemo_icon_canvas_item_get_fixed_text_height_for_layout (icon->item) / ppu;
788+
}
789+
790790
/* Assume it's only one level hierarchy to avoid costly affine calculations */
791791
nemo_icon_canvas_item_get_bounds_for_layout (icon->item,
792792
&bounds.x0, &bounds.y0,
793793
&bounds.x1, &bounds.y1);
794794

795795
icon_bounds = nemo_icon_canvas_item_get_icon_rectangle (icon->item);
796-
797796
icon_width = grid_width;
798-
/* Calculate size above/below baseline */
799-
height_above = icon_bounds.y1 - bounds.y0;
800-
height_below = bounds.y1 - icon_bounds.y1;
801797

802798
/* If this icon doesn't fit, it's time to lay out the line that's queued up. */
803799
if (line_start != p && line_width + icon_width >= canvas_width ) {
804800
if (container->details->label_position == NEMO_ICON_LABEL_POSITION_BESIDE) {
805801
y += gap;
806802
} else {
807803
/* Advance to the baseline. */
808-
y += gap + max_height_above;
804+
y += gap + icon_size;
809805
}
810806

811-
lay_down_one_line (container, line_start, p, y, max_height_above, positions, FALSE, gap);
807+
lay_down_one_line (container, line_start, p, y, icon_size, positions, FALSE, gap);
812808

813809
if (container->details->label_position == NEMO_ICON_LABEL_POSITION_BESIDE) {
814-
y += max_height_above + max_height_below + gap;
810+
y += gap + icon_size;
815811
} else {
816812
/* Advance to next line. */
817-
y += max_height_below + gap;
813+
y += container->details->fixed_text_height + gap;
818814
}
819815

820816
line_width = container->details->label_position == NEMO_ICON_LABEL_POSITION_BESIDE ? gap : 0;
821817
line_start = p;
822818
i = 0;
823-
824-
max_height_above = height_above;
825-
max_height_below = height_below;
826-
} else {
827-
if (height_above > max_height_above) {
828-
max_height_above = height_above;
829-
}
830-
if (height_below > max_height_below) {
831-
max_height_below = height_below;
832-
}
833819
}
834820

835821
g_array_set_size (positions, i + 1);
@@ -855,10 +841,10 @@ lay_down_icons_horizontal (NemoIconContainer *container,
855841
y += gap;
856842
} else {
857843
/* Advance to the baseline. */
858-
y += gap + max_height_above;
844+
y += gap + icon_size;
859845
}
860846

861-
lay_down_one_line (container, line_start, NULL, y, max_height_above, positions, TRUE, gap);
847+
lay_down_one_line (container, line_start, NULL, y, icon_size, positions, TRUE, gap);
862848
}
863849

864850
g_array_free (positions, TRUE);
@@ -2041,12 +2027,23 @@ nemo_icon_view_container_get_max_layout_lines (NemoIconContainer *container)
20412027
}
20422028

20432029
if (limit <= 0) {
2044-
return G_MAXINT;
2030+
return 3;
20452031
}
20462032

20472033
return limit;
20482034
}
20492035

2036+
static gint
2037+
nemo_icon_view_container_get_additional_text_line_count (NemoIconContainer *container)
2038+
{
2039+
G_GNUC_UNUSED GQuark *attributes;
2040+
gint len;
2041+
2042+
attributes = nemo_icon_view_container_get_icon_text_attribute_names (container, &len);
2043+
2044+
return len;
2045+
}
2046+
20502047
static void
20512048
finalize (GObject *object)
20522049
{
@@ -2096,6 +2093,7 @@ nemo_icon_view_container_class_init (NemoIconViewContainerClass *klass)
20962093
ic_class->finish_adding_new_icons = nemo_icon_view_container_finish_adding_new_icons;
20972094
ic_class->icon_get_bounding_box = nemo_icon_view_container_icon_get_bounding_box;
20982095
ic_class->set_zoom_level = nemo_icon_view_container_set_zoom_level;
2096+
ic_class->get_additional_text_line_count = nemo_icon_view_container_get_additional_text_line_count;
20992097
}
21002098

21012099
static void

src/nemo-icon-view-grid-container.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1545,6 +1545,12 @@ nemo_icon_view_grid_container_get_max_layout_lines (NemoIconContainer *containe
15451545
return limit;
15461546
}
15471547

1548+
static gint
1549+
nemo_icon_view_grid_container_get_additional_text_line_count (NemoIconContainer *container)
1550+
{
1551+
return quarkv_length (NEMO_ICON_VIEW_GRID_CONTAINER (container)->attributes);
1552+
}
1553+
15481554
static void
15491555
captions_changed_callback (NemoIconContainer *container)
15501556
{
@@ -1672,6 +1678,7 @@ nemo_icon_view_grid_container_class_init (NemoIconViewGridContainerClass *klass)
16721678
ic_class->prioritize_thumbnailing = nemo_icon_view_grid_container_prioritize_thumbnailing;
16731679
ic_class->get_max_layout_lines_for_pango = nemo_icon_view_grid_container_get_max_layout_lines_for_pango;
16741680
ic_class->get_max_layout_lines = nemo_icon_view_grid_container_get_max_layout_lines;
1681+
ic_class->get_additional_text_line_count = nemo_icon_view_grid_container_get_additional_text_line_count;
16751682

16761683
ic_class->compare_icons = nemo_icon_view_grid_container_compare_icons;
16771684
ic_class->freeze_updates = nemo_icon_view_grid_container_freeze_updates;

0 commit comments

Comments
 (0)