UI: Preferences Redesign Part 2
(Part 1 was 00963afc14978b) Does the following changes visible to users: * Use panels and sub-panels for more structured & logical grouping * Re-organized options more logically than before (see images in D4148) * Use flow layout (single column by default). * New layout uses horizontal margin if there's enough space. * Change size of Preferences window to suit new layout. * Move keymap related options from "Input" into own section. * Own, left-bottom aligned region for Save Preferences button. * Adjustments of names, tooltips & icons. * Move buttons from header into the main region (except editor switch). * Hide Preferences header when opened in temporary window. * Use full area width for header. * Don't use slider but regular number widget for UI scale. * Gray out animation player path option if player isn't "Custom" Internal changes: * Rearrange RNA properties to match changed UI structure. * Introduces new "EXECUTE" region type, see reasoning in D3982. * Changes to panel layout and AZone code for dynamic panel region. * Bumps subversion and does versioning for new regions. RNA changes are documented in the release notes: https://wiki.blender.org/wiki/Reference/Release_Notes/2.80/Python_API/Preferences_API Design & implementation mostly done by @billreynish and myself. I recommend checking out the screenshots posted by William: https://developer.blender.org/D4148#93787 Reviewed By: brecht Maniphest Tasks: T54115 Differential Revision: https://developer.blender.org/D4148
This commit is contained in:
@@ -186,52 +186,6 @@ void ED_area_do_refresh(bContext *C, ScrArea *sa)
|
||||
sa->do_refresh = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Action zones are only updated if the mouse is inside of them, but in some cases (currently only fullscreen icon)
|
||||
* it might be needed to update their properties and redraw if the mouse isn't inside.
|
||||
*/
|
||||
void ED_area_azones_update(ScrArea *sa, const int mouse_xy[2])
|
||||
{
|
||||
AZone *az;
|
||||
bool changed = false;
|
||||
|
||||
for (az = sa->actionzones.first; az; az = az->next) {
|
||||
if (az->type == AZONE_FULLSCREEN) {
|
||||
/* only if mouse is not hovering the azone */
|
||||
if (BLI_rcti_isect_pt_v(&az->rect, mouse_xy) == false) {
|
||||
az->alpha = 0.0f;
|
||||
changed = true;
|
||||
|
||||
/* can break since currently only this is handled here */
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (az->type == AZONE_REGION_SCROLL) {
|
||||
/* only if mouse is not hovering the azone */
|
||||
if (BLI_rcti_isect_pt_v(&az->rect, mouse_xy) == false) {
|
||||
View2D *v2d = &az->ar->v2d;
|
||||
|
||||
if (az->direction == AZ_SCROLL_VERT) {
|
||||
az->alpha = v2d->alpha_vert = 0;
|
||||
changed = true;
|
||||
}
|
||||
else if (az->direction == AZ_SCROLL_HOR) {
|
||||
az->alpha = v2d->alpha_hor = 0;
|
||||
changed = true;
|
||||
}
|
||||
else {
|
||||
BLI_assert(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
sa->flag &= ~AREA_FLAG_ACTIONZONES_UPDATE;
|
||||
ED_area_tag_redraw_no_rebuild(sa);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* \brief Corner widget use for quitting fullscreen.
|
||||
*/
|
||||
@@ -412,18 +366,11 @@ static void region_draw_azones(ScrArea *sa, ARegion *ar)
|
||||
}
|
||||
else if (az->type == AZONE_FULLSCREEN) {
|
||||
area_draw_azone_fullscreen(az->x1, az->y1, az->x2, az->y2, az->alpha);
|
||||
|
||||
if (az->alpha != 0.0f) {
|
||||
area_azone_tag_update(sa);
|
||||
}
|
||||
}
|
||||
else if (az->type == AZONE_REGION_SCROLL) {
|
||||
if (az->alpha != 0.0f) {
|
||||
area_azone_tag_update(sa);
|
||||
}
|
||||
/* Don't draw this azone. */
|
||||
}
|
||||
}
|
||||
if (!IS_EQF(az->alpha, 0.0f) && ELEM(az->type, AZONE_FULLSCREEN, AZONE_REGION_SCROLL)) {
|
||||
area_azone_tag_update(sa);
|
||||
}
|
||||
}
|
||||
|
||||
GPU_matrix_pop();
|
||||
@@ -1605,6 +1552,7 @@ void ED_area_update_region_sizes(wmWindowManager *wm, wmWindow *win, ScrArea *ar
|
||||
if (!(area->flag & AREA_FLAG_REGION_SIZE_UPDATE)) {
|
||||
return;
|
||||
}
|
||||
const bScreen *screen = WM_window_get_active_screen(win);
|
||||
|
||||
WM_window_rect_calc(win, &window_rect);
|
||||
area_calc_totrct(area, &window_rect);
|
||||
@@ -1614,6 +1562,9 @@ void ED_area_update_region_sizes(wmWindowManager *wm, wmWindow *win, ScrArea *ar
|
||||
overlap_rect = rect;
|
||||
region_rect_recursive(area, area->regionbase.first, &rect, &overlap_rect, 0);
|
||||
|
||||
/* Dynamically sized regions may have changed region sizes, so we have to force azone update. */
|
||||
area_azone_initialize(win, screen, area);
|
||||
|
||||
for (ARegion *ar = area->regionbase.first; ar; ar = ar->next) {
|
||||
region_subwindow(ar);
|
||||
|
||||
@@ -1621,7 +1572,11 @@ void ED_area_update_region_sizes(wmWindowManager *wm, wmWindow *win, ScrArea *ar
|
||||
if (ar->type->init) {
|
||||
ar->type->init(wm, ar);
|
||||
}
|
||||
|
||||
/* Some AZones use View2D data which is only updated in region init, so call that first! */
|
||||
region_azones_add(screen, area, ar, ar->alignment & ~RGN_SPLIT_PREV);
|
||||
}
|
||||
ED_area_azones_update(area, &win->eventstate->x);
|
||||
|
||||
area->flag &= ~AREA_FLAG_REGION_SIZE_UPDATE;
|
||||
}
|
||||
@@ -2386,6 +2341,9 @@ void ED_region_panels_draw(const bContext *C, ARegion *ar)
|
||||
/* set the view */
|
||||
UI_view2d_view_ortho(v2d);
|
||||
|
||||
/* View2D matrix might have changed due to dynamic sized regions. */
|
||||
UI_blocklist_update_window_matrix(C, &ar->uiblocks);
|
||||
|
||||
/* draw panels */
|
||||
UI_panels_draw(C, ar);
|
||||
|
||||
|
||||
@@ -639,7 +639,7 @@ void ED_screen_set_active_region(bContext *C, wmWindow *win, const int xy[2])
|
||||
ED_screen_areas_iter(win, scr, area_iter) {
|
||||
if (xy[0] > area_iter->totrct.xmin && xy[0] < area_iter->totrct.xmax) {
|
||||
if (xy[1] > area_iter->totrct.ymin && xy[1] < area_iter->totrct.ymax) {
|
||||
if (ED_area_actionzone_refresh_xy(area_iter, xy) == NULL) {
|
||||
if (ED_area_azones_update(area_iter, xy) == NULL) {
|
||||
sa = area_iter;
|
||||
break;
|
||||
}
|
||||
@@ -1251,7 +1251,7 @@ ScrArea *ED_screen_state_toggle(bContext *C, wmWindow *win, ScrArea *sa, const s
|
||||
for (ar = newa->regionbase.first; ar; ar = ar->next) {
|
||||
ar->flagfullscreen = ar->flag;
|
||||
|
||||
if (ELEM(ar->regiontype, RGN_TYPE_UI, RGN_TYPE_HEADER, RGN_TYPE_TOOLS, RGN_TYPE_NAV_BAR)) {
|
||||
if (ELEM(ar->regiontype, RGN_TYPE_UI, RGN_TYPE_HEADER, RGN_TYPE_TOOLS, RGN_TYPE_NAV_BAR, RGN_TYPE_EXECUTE)) {
|
||||
ar->flag |= RGN_FLAG_HIDDEN;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,7 +57,6 @@ int screen_area_join(struct bContext *C, bScreen *scr, ScrArea *sa1, Scr
|
||||
int area_getorientation(ScrArea *sa, ScrArea *sb);
|
||||
|
||||
struct AZone *ED_area_actionzone_find_xy(ScrArea *sa, const int xy[2]);
|
||||
struct AZone *ED_area_actionzone_refresh_xy(ScrArea *sa, const int xy[2]);
|
||||
|
||||
/* screen_geometry.c */
|
||||
int screen_geom_area_height(const ScrArea *area);
|
||||
|
||||
@@ -798,6 +798,32 @@ static AZone *area_actionzone_refresh_xy(ScrArea *sa, const int xy[2], const boo
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (!test_only && !IS_EQF(az->alpha, 0.0f)) {
|
||||
bool changed = false;
|
||||
|
||||
if (az->type == AZONE_FULLSCREEN) {
|
||||
az->alpha = 0.0f;
|
||||
changed = true;
|
||||
}
|
||||
else if (az->type == AZONE_REGION_SCROLL) {
|
||||
if (az->direction == AZ_SCROLL_VERT) {
|
||||
az->alpha = az->ar->v2d.alpha_vert = 0;
|
||||
changed = true;
|
||||
}
|
||||
else if (az->direction == AZ_SCROLL_HOR) {
|
||||
az->alpha = az->ar->v2d.alpha_hor = 0;
|
||||
changed = true;
|
||||
}
|
||||
else {
|
||||
BLI_assert(0);
|
||||
}
|
||||
}
|
||||
|
||||
if (changed) {
|
||||
sa->flag &= ~AREA_FLAG_ACTIONZONES_UPDATE;
|
||||
ED_area_tag_redraw_no_rebuild(sa);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return az;
|
||||
@@ -808,7 +834,7 @@ AZone *ED_area_actionzone_find_xy(ScrArea *sa, const int xy[2])
|
||||
return area_actionzone_refresh_xy(sa, xy, true);
|
||||
}
|
||||
|
||||
AZone *ED_area_actionzone_refresh_xy(ScrArea *sa, const int xy[2])
|
||||
AZone *ED_area_azones_update(ScrArea *sa, const int xy[2])
|
||||
{
|
||||
return area_actionzone_refresh_xy(sa, xy, false);
|
||||
}
|
||||
@@ -2382,8 +2408,12 @@ static int region_scale_modal(bContext *C, wmOperator *op, const wmEvent *event)
|
||||
if (!(rmd->ar->flag & RGN_FLAG_HIDDEN))
|
||||
region_scale_toggle_hidden(C, rmd);
|
||||
}
|
||||
else if (rmd->ar->flag & RGN_FLAG_HIDDEN)
|
||||
else if (rmd->ar->flag & RGN_FLAG_HIDDEN) {
|
||||
region_scale_toggle_hidden(C, rmd);
|
||||
}
|
||||
else if (rmd->ar->flag & RGN_FLAG_DYNAMIC_SIZE) {
|
||||
rmd->ar->sizex = rmd->origval;
|
||||
}
|
||||
}
|
||||
else {
|
||||
int maxsize = region_scale_get_maxsize(rmd);
|
||||
@@ -2411,10 +2441,15 @@ static int region_scale_modal(bContext *C, wmOperator *op, const wmEvent *event)
|
||||
if (!(rmd->ar->flag & RGN_FLAG_HIDDEN))
|
||||
region_scale_toggle_hidden(C, rmd);
|
||||
}
|
||||
else if (maxsize > 0 && (rmd->ar->sizey > maxsize))
|
||||
else if (maxsize > 0 && (rmd->ar->sizey > maxsize)) {
|
||||
rmd->ar->sizey = maxsize;
|
||||
else if (rmd->ar->flag & RGN_FLAG_HIDDEN)
|
||||
}
|
||||
else if (rmd->ar->flag & RGN_FLAG_HIDDEN) {
|
||||
region_scale_toggle_hidden(C, rmd);
|
||||
}
|
||||
else if (rmd->ar->flag & RGN_FLAG_DYNAMIC_SIZE) {
|
||||
rmd->ar->sizey = rmd->origval;
|
||||
}
|
||||
}
|
||||
ED_area_tag_redraw(rmd->sa);
|
||||
WM_event_add_notifier(C, NC_SCREEN | NA_EDITED, NULL);
|
||||
@@ -4349,11 +4384,15 @@ static void SCREEN_OT_back_to_previous(struct wmOperatorType *ot)
|
||||
|
||||
static int userpref_show_invoke(bContext *C, wmOperator *op, const wmEvent *event)
|
||||
{
|
||||
int sizex = (800 + UI_NAVIGATION_REGION_WIDTH) * UI_DPI_FAC;
|
||||
int sizey = 500 * UI_DPI_FAC;
|
||||
int sizex = (500 + UI_NAVIGATION_REGION_WIDTH) * UI_DPI_FAC;
|
||||
int sizey = 520 * UI_DPI_FAC;
|
||||
|
||||
/* changes context! */
|
||||
if (WM_window_open_temp(C, event->x, event->y, sizex, sizey, WM_WINDOW_USERPREFS) != NULL) {
|
||||
/* The header only contains the editor switcher and looks empty. So hiding in the temp window makes sense. */
|
||||
ScrArea *area = CTX_wm_area(C);
|
||||
ARegion *region = BKE_area_find_region_type(area, RGN_TYPE_HEADER);
|
||||
region->flag |= RGN_FLAG_HIDDEN;
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
else {
|
||||
|
||||
Reference in New Issue
Block a user