[Bf-blender-cvs] [38ccbac482c] topbar: Fixes for topbar layout updating
Julian Eisel
noreply at git.blender.org
Sat Jul 29 18:55:13 CEST 2017
Commit: 38ccbac482c75dacee72b269fa2cff327f56b99a
Author: Julian Eisel
Date: Sat Jul 29 17:25:20 2017 +0200
Branches: topbar
https://developer.blender.org/rB38ccbac482c75dacee72b269fa2cff327f56b99a
Fixes for topbar layout updating
===================================================================
M source/blender/editors/screen/area.c
M source/blender/editors/screen/screen_edit.c
M source/blender/makesdna/DNA_screen_types.h
===================================================================
diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index 39020736911..8d2f4ca467f 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -1152,10 +1152,11 @@ static void region_rect_recursive(wmWindow *win, ScrArea *sa, ARegion *ar, rcti
/* user errors */
if (ar->next == NULL && alignment != RGN_ALIGN_QSPLIT)
alignment = RGN_ALIGN_NONE;
-
+
/* prefsize, for header we stick to exception (prevent dpi rounding error) */
- prefsizex = UI_DPI_FAC * (ar->sizex > 1 ? ar->sizex + 0.5f : ar->type->prefsizex);
-
+ const float sizex_dpi_fac = (ar->flag & RGN_SIZEX_DPI_APPLIED) ? 1.0f : UI_DPI_FAC;
+ prefsizex = sizex_dpi_fac * ((ar->sizex > 1) ? ar->sizex + 0.5f : ar->type->prefsizex);
+
if (ar->regiontype == RGN_TYPE_HEADER) {
prefsizey = ED_area_headersize();
}
@@ -1482,10 +1483,16 @@ static void ed_default_handlers(wmWindowManager *wm, ScrArea *sa, ListBase *hand
void screen_area_update_region_sizes(wmWindowManager *wm, wmWindow *win, ScrArea *area)
{
- rcti rect = area->totrct;
+ const int size_x = WM_window_pixels_x(win);
+ const int size_y = WM_window_pixels_y(win);
+ rcti rect;
+
+ area_calc_totrct(area, size_x, size_y);
/* region rect sizes */
+ rect = area->totrct;
region_rect_recursive(win, area, area->regionbase.first, &rect, 0, false);
+
for (ARegion *ar = area->regionbase.first; ar; ar = ar->next) {
region_subwindow(win, ar, false);
@@ -1495,8 +1502,6 @@ void screen_area_update_region_sizes(wmWindowManager *wm, wmWindow *win, ScrArea
}
}
- /* XXX hack to force drawing */
- ED_area_tag_redraw(area);
area->flag &= ~AREA_FLAG_REGION_SIZE_UPDATE;
}
@@ -2177,13 +2182,15 @@ void ED_region_header(const bContext *C, ARegion *ar)
if (xco > maxco)
maxco = xco;
- if (region_layout_based) {
+ if (region_layout_based && (ar->sizex != (maxco + start_ofs))) {
+ /* region size is layout based and needs to be updated */
ScrArea *sa = CTX_wm_area(C);
ar->sizex = maxco + start_ofs;
UI_view2d_region_reinit(&ar->v2d, V2D_COMMONVIEW_HEADER, ar->sizex, ar->winy);
sa->flag |= AREA_FLAG_REGION_SIZE_UPDATE;
+ ar->flag |= RGN_SIZEX_DPI_APPLIED;
ar->flag &= ~RGN_RESIZE_LAYOUT_BASED;
}
UI_block_end(C, block);
@@ -2191,7 +2198,7 @@ void ED_region_header(const bContext *C, ARegion *ar)
}
/* always as last */
- UI_view2d_totRect_set(&ar->v2d, maxco + (region_layout_based ? UI_UNIT_X + 80 : 0), headery);
+ UI_view2d_totRect_set(&ar->v2d, maxco + (region_layout_based ? 0 : UI_UNIT_X + 80), headery);
/* restore view matrix? */
UI_view2d_view_restore(C);
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 43c5270bd5b..0ec2e9c1d1a 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -828,12 +828,26 @@ void ED_screen_ensure_updated(wmWindowManager *wm, wmWindow *win, bScreen *scree
ED_screen_refresh(wm, win);
}
else {
+ const int screen_size_x = WM_window_screen_pixels_x(win);
+ const int screen_size_y = WM_window_screen_pixels_y(win);
+ bool has_updated = false;
+
+ screen_test_scale(win, screen, screen_size_x, screen_size_y);
+
ED_screen_areas_iter(win, screen, area) {
if (area->flag & AREA_FLAG_REGION_SIZE_UPDATE) {
- screen_area_update_region_sizes(wm, win, area);
+ has_updated = true;
break;
}
}
+
+ if (has_updated) {
+ ED_screen_areas_iter(win, screen, area) {
+ screen_area_update_region_sizes(wm, win, area);
+ /* XXX hack to force drawing */
+ ED_area_tag_redraw(area);
+ }
+ }
}
}
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index 4ab94f30122..be41442c423 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -421,7 +421,10 @@ enum {
/* Force delayed reinit of region size data, so that region size is calculated
* just big enough to show all its content (if enough space is available).
* Note that only ED_region_header supports this right now. */
- RGN_RESIZE_LAYOUT_BASED = (1 << 2),
+ RGN_RESIZE_LAYOUT_BASED = (1 << 2),
+ /* The region width stored in ARegion.sizex already has the DPI
+ * factor applied, skip applying it again (in region_rect_recursive) */
+ RGN_SIZEX_DPI_APPLIED = (1 << 3),
};
/* region do_draw */
More information about the Bf-blender-cvs
mailing list