Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/interface/interface_panel.cc
| Show First 20 Lines • Show All 992 Lines • ▼ Show 20 Lines | |||||
| const int tab_v_pad_text = round_fl_to_int(TABS_PADDING_TEXT_FACTOR * dpi_fac * zoom) + 2 * px; | const int tab_v_pad_text = round_fl_to_int(TABS_PADDING_TEXT_FACTOR * dpi_fac * zoom) + 2 * px; | ||||
| /* Padding between tabs. */ | /* Padding between tabs. */ | ||||
| const int tab_v_pad = round_fl_to_int(TABS_PADDING_BETWEEN_FACTOR * dpi_fac * zoom); | const int tab_v_pad = round_fl_to_int(TABS_PADDING_BETWEEN_FACTOR * dpi_fac * zoom); | ||||
| bTheme *btheme = UI_GetTheme(); | bTheme *btheme = UI_GetTheme(); | ||||
| const float tab_curve_radius = btheme->tui.wcol_tab.roundness * U.widget_unit * zoom; | const float tab_curve_radius = btheme->tui.wcol_tab.roundness * U.widget_unit * zoom; | ||||
| const int roundboxtype = is_left ? (UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT) : | const int roundboxtype = is_left ? (UI_CNR_TOP_LEFT | UI_CNR_BOTTOM_LEFT) : | ||||
| (UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_RIGHT); | (UI_CNR_TOP_RIGHT | UI_CNR_BOTTOM_RIGHT); | ||||
| bool is_alpha; | bool is_alpha; | ||||
| bool do_scaletabs = false; | |||||
| #ifdef USE_FLAT_INACTIVE | #ifdef USE_FLAT_INACTIVE | ||||
| bool is_active_prev = false; | bool is_active_prev = false; | ||||
| #endif | #endif | ||||
| float scaletabs = 1.0f; | |||||
| /* Same for all tabs. */ | /* Same for all tabs. */ | ||||
| /* Intentionally don't scale by 'px'. */ | /* Intentionally don't scale by 'px'. */ | ||||
| const int rct_xmin = is_left ? v2d->mask.xmin + 3 : (v2d->mask.xmax - category_tabs_width); | const int rct_xmin = is_left ? v2d->mask.xmin + 3 : (v2d->mask.xmax - category_tabs_width); | ||||
| const int rct_xmax = is_left ? v2d->mask.xmin + category_tabs_width : (v2d->mask.xmax - 3); | const int rct_xmax = is_left ? v2d->mask.xmin + category_tabs_width : (v2d->mask.xmax - 3); | ||||
| const int text_v_ofs = (rct_xmax - rct_xmin) * 0.3f; | const int text_v_ofs = (rct_xmax - rct_xmin) * 0.3f; | ||||
| int y_ofs = tab_v_pad; | int y_ofs = tab_v_pad; | ||||
| Show All 25 Lines | |||||
| BLF_size(fontid, fstyle_points * U.pixelsize, U.dpi); | BLF_size(fontid, fstyle_points * U.pixelsize, U.dpi); | ||||
| /* Check the region type supports categories to avoid an assert | /* Check the region type supports categories to avoid an assert | ||||
| * for showing 3D view panels in the properties space. */ | * for showing 3D view panels in the properties space. */ | ||||
| if ((1 << region->regiontype) & RGN_TYPE_HAS_CATEGORY_MASK) { | if ((1 << region->regiontype) & RGN_TYPE_HAS_CATEGORY_MASK) { | ||||
| BLI_assert(UI_panel_category_is_visible(region)); | BLI_assert(UI_panel_category_is_visible(region)); | ||||
| } | } | ||||
| /* Calculate tab rectangle and check if we need to scale down. */ | /* Calculate tab rectangle for each panel. */ | ||||
| LISTBASE_FOREACH (PanelCategoryDyn *, pc_dyn, ®ion->panels_category) { | LISTBASE_FOREACH (PanelCategoryDyn *, pc_dyn, ®ion->panels_category) { | ||||
| rcti *rct = &pc_dyn->rect; | rcti *rct = &pc_dyn->rect; | ||||
| const char *category_id = pc_dyn->idname; | const char *category_id = pc_dyn->idname; | ||||
| const char *category_id_draw = IFACE_(category_id); | const char *category_id_draw = IFACE_(category_id); | ||||
| const int category_width = BLF_width(fontid, category_id_draw, BLF_DRAW_STR_DUMMY_MAX); | const int category_width = BLF_width(fontid, category_id_draw, BLF_DRAW_STR_DUMMY_MAX); | ||||
| rct->xmin = rct_xmin; | rct->xmin = rct_xmin; | ||||
| rct->xmax = rct_xmax; | rct->xmax = rct_xmax; | ||||
| rct->ymin = v2d->mask.ymax - (y_ofs + category_width + (tab_v_pad_text * 2)); | rct->ymin = v2d->mask.ymax - (y_ofs + category_width + (tab_v_pad_text * 2)); | ||||
| rct->ymax = v2d->mask.ymax - (y_ofs); | rct->ymax = v2d->mask.ymax - (y_ofs); | ||||
| y_ofs += category_width + tab_v_pad + (tab_v_pad_text * 2); | y_ofs += category_width + tab_v_pad + (tab_v_pad_text * 2); | ||||
| } | } | ||||
| if (y_ofs > BLI_rcti_size_y(&v2d->mask)) { | const int max_scroll = max_ii(y_ofs - BLI_rcti_size_y(&v2d->mask), 0); | ||||
| scaletabs = (float)BLI_rcti_size_y(&v2d->mask) / (float)y_ofs; | const int scroll = clamp_i(region->category_scroll, 0, max_scroll); | ||||
| region->category_scroll = scroll; | |||||
| LISTBASE_FOREACH (PanelCategoryDyn *, pc_dyn, ®ion->panels_category) { | LISTBASE_FOREACH (PanelCategoryDyn *, pc_dyn, ®ion->panels_category) { | ||||
| rcti *rct = &pc_dyn->rect; | rcti *rct = &pc_dyn->rect; | ||||
| rct->ymin = ((rct->ymin - v2d->mask.ymax) * scaletabs) + v2d->mask.ymax; | rct->ymin += scroll; | ||||
| rct->ymax = ((rct->ymax - v2d->mask.ymax) * scaletabs) + v2d->mask.ymax; | rct->ymax += scroll; | ||||
| } | |||||
| do_scaletabs = true; | |||||
| } | } | ||||
| /* Begin drawing. */ | /* Begin drawing. */ | ||||
| GPU_line_smooth(true); | GPU_line_smooth(true); | ||||
| uint pos = GPU_vertformat_attr_add( | uint pos = GPU_vertformat_attr_add( | ||||
| immVertexFormat(), "pos", GPU_COMP_I32, 2, GPU_FETCH_INT_TO_FLOAT); | immVertexFormat(), "pos", GPU_COMP_I32, 2, GPU_FETCH_INT_TO_FLOAT); | ||||
| immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); | immBindBuiltinProgram(GPU_SHADER_2D_UNIFORM_COLOR); | ||||
| Show All 19 Lines | |||||
| if (is_alpha) { | if (is_alpha) { | ||||
| GPU_blend(GPU_BLEND_NONE); | GPU_blend(GPU_BLEND_NONE); | ||||
| } | } | ||||
| immUnbindProgram(); | immUnbindProgram(); | ||||
| LISTBASE_FOREACH (PanelCategoryDyn *, pc_dyn, ®ion->panels_category) { | LISTBASE_FOREACH (PanelCategoryDyn *, pc_dyn, ®ion->panels_category) { | ||||
| const rcti *rct = &pc_dyn->rect; | const rcti *rct = &pc_dyn->rect; | ||||
| const bool is_visible = rct->ymin < v2d->mask.ymax && rct->ymax > v2d->mask.ymin; | |||||
| if (!is_visible) { | |||||
| continue; | |||||
| } | |||||
| const char *category_id = pc_dyn->idname; | const char *category_id = pc_dyn->idname; | ||||
| const char *category_id_draw = IFACE_(category_id); | const char *category_id_draw = IFACE_(category_id); | ||||
| const int category_width = BLI_rcti_size_y(rct) - (tab_v_pad_text * 2); | |||||
| size_t category_draw_len = BLF_DRAW_STR_DUMMY_MAX; | size_t category_draw_len = BLF_DRAW_STR_DUMMY_MAX; | ||||
| #if 0 | #if 0 | ||||
| int category_width = BLF_width(fontid, category_id_draw, BLF_DRAW_STR_DUMMY_MAX); | int category_width = BLF_width(fontid, category_id_draw, BLF_DRAW_STR_DUMMY_MAX); | ||||
| #endif | #endif | ||||
| const bool is_active = STREQ(category_id, category_id_active); | const bool is_active = STREQ(category_id, category_id_active); | ||||
| GPU_blend(GPU_BLEND_ALPHA); | GPU_blend(GPU_BLEND_ALPHA); | ||||
| ▲ Show 20 Lines • Show All 45 Lines • ▼ Show 20 Lines | |||||
| rct->ymin + px, | rct->ymin + px, | ||||
| is_left ? rct->xmax : rct->xmin + px, | is_left ? rct->xmax : rct->xmin + px, | ||||
| rct->ymax - px); | rct->ymax - px); | ||||
| immUnbindProgram(); | immUnbindProgram(); | ||||
| } | } | ||||
| /* Tab titles. */ | /* Tab titles. */ | ||||
| if (do_scaletabs) { | |||||
| category_draw_len = BLF_width_to_strlen( | |||||
| fontid, category_id_draw, category_draw_len, category_width, nullptr); | |||||
| } | |||||
| BLF_position(fontid, rct->xmax - text_v_ofs, rct->ymin + tab_v_pad_text, 0.0f); | BLF_position(fontid, rct->xmax - text_v_ofs, rct->ymin + tab_v_pad_text, 0.0f); | ||||
| BLF_color3ubv(fontid, is_active ? theme_col_text_hi : theme_col_text); | BLF_color3ubv(fontid, is_active ? theme_col_text_hi : theme_col_text); | ||||
| BLF_draw(fontid, category_id_draw, category_draw_len); | BLF_draw(fontid, category_id_draw, category_draw_len); | ||||
| GPU_blend(GPU_BLEND_NONE); | GPU_blend(GPU_BLEND_NONE); | ||||
| /* Not essential, but allows events to be handled right up to the region edge (T38171). */ | /* Not essential, but allows events to be handled right up to the region edge (T38171). */ | ||||
| if (is_left) { | if (is_left) { | ||||
| ▲ Show 20 Lines • Show All 765 Lines • ▼ Show 20 Lines | |||||
| if (active_but && ui_but_supports_cycling(active_but)) { | if (active_but && ui_but_supports_cycling(active_but)) { | ||||
| /* Skip - exception to make cycling buttons using ctrl+mousewheel work in tabbed regions. */ | /* Skip - exception to make cycling buttons using ctrl+mousewheel work in tabbed regions. */ | ||||
| } | } | ||||
| else { | else { | ||||
| const char *category = UI_panel_category_active_get(region, false); | const char *category = UI_panel_category_active_get(region, false); | ||||
| if (LIKELY(category)) { | if (LIKELY(category)) { | ||||
| PanelCategoryDyn *pc_dyn = UI_panel_category_find(region, category); | PanelCategoryDyn *pc_dyn = UI_panel_category_find(region, category); | ||||
| if (LIKELY(pc_dyn)) { | if (LIKELY(pc_dyn) && (event->modifier & KM_CTRL)) { | ||||
| if (is_mousewheel) { | if (is_mousewheel) { | ||||
| /* We can probably get rid of this and only allow Ctrl-Tabbing. */ | /* We can probably get rid of this and only allow Ctrl-Tabbing. */ | ||||
| pc_dyn = (event->type == WHEELDOWNMOUSE) ? pc_dyn->next : pc_dyn->prev; | pc_dyn = (event->type == WHEELDOWNMOUSE) ? pc_dyn->next : pc_dyn->prev; | ||||
| } | } | ||||
| else { | else { | ||||
| const bool backwards = event->modifier & KM_SHIFT; | const bool backwards = event->modifier & KM_SHIFT; | ||||
| pc_dyn = backwards ? pc_dyn->prev : pc_dyn->next; | pc_dyn = backwards ? pc_dyn->prev : pc_dyn->next; | ||||
| if (!pc_dyn) { | if (!pc_dyn) { | ||||
| /* Proper cyclic behavior, back to first/last category (only used for ctrl+tab). */ | /* Proper cyclic behavior, back to first/last category (only used for ctrl+tab). */ | ||||
| pc_dyn = backwards ? static_cast<PanelCategoryDyn *>(region->panels_category.last) : | pc_dyn = backwards ? static_cast<PanelCategoryDyn *>(region->panels_category.last) : | ||||
| static_cast<PanelCategoryDyn *>(region->panels_category.first); | static_cast<PanelCategoryDyn *>(region->panels_category.first); | ||||
| } | } | ||||
| } | } | ||||
| if (pc_dyn) { | if (pc_dyn) { | ||||
| /* Intentionally don't reset scroll in this case, | /* Intentionally don't reset scroll in this case, | ||||
| * allowing for quick browsing between tabs. */ | * allowing for quick browsing between tabs. */ | ||||
| UI_panel_category_active_set(region, pc_dyn->idname); | UI_panel_category_active_set(region, pc_dyn->idname); | ||||
| ED_region_tag_redraw(region); | ED_region_tag_redraw(region); | ||||
| } | } | ||||
| return WM_UI_HANDLER_BREAK; | |||||
| } | } | ||||
| } | } | ||||
| return WM_UI_HANDLER_BREAK; | |||||
| } | } | ||||
| return WM_UI_HANDLER_CONTINUE; | return WM_UI_HANDLER_CONTINUE; | ||||
| } | } | ||||
| int ui_handler_panel_region(bContext *C, | int ui_handler_panel_region(bContext *C, | ||||
| const wmEvent *event, | const wmEvent *event, | ||||
| ARegion *region, | ARegion *region, | ||||
| ▲ Show 20 Lines • Show All 285 Lines • Show Last 20 Lines | |||||