UI: Preference for file browser as fullscreen area

Addes a Preference setting to choose between opening new file browsers
in a maximized area (like with the old file browser) or in a new window
(like the new one).
This commit is contained in:
Julian Eisel 2019-09-18 14:37:11 +02:00
parent cac756a92a
commit f5bbaf55ac
5 changed files with 69 additions and 19 deletions

View File

@ -282,6 +282,7 @@ class USERPREF_PT_interface_temporary_windows(PreferencePanel, Panel):
flow = layout.grid_flow(row_major=False, columns=0, even_columns=True, even_rows=False, align=False)
flow.prop(view, "render_display_type", text="Render in")
flow.prop(view, "filebrowser_display_type", text="File Browser")
class USERPREF_PT_interface_menus(Panel):

View File

@ -621,6 +621,7 @@ void BLO_version_defaults_userpref_blend(Main *bmain, UserDef *userdef)
{
/* pass */
userdef->render_display_type = USER_RENDER_DISPLAY_WINDOW;
userdef->filebrowser_display_type = USER_TEMP_SPACE_DISPLAY_WINDOW;
}
if (userdef->pixelsize == 0.0f) {

View File

@ -815,7 +815,8 @@ typedef struct UserDef {
char viewport_aa;
char render_display_type; /* eUserpref_RenderDisplayType */
char _pad5[5];
char filebrowser_display_type; /* eUserpref_TempSpaceDisplayType */
char _pad5[4];
struct WalkNavigation walk_navigation;

View File

@ -4310,6 +4310,12 @@ static void rna_def_userdef_view(BlenderRNA *brna)
RNA_def_property_ui_text(
prop, "Render Display Type", "Default location where rendered images will be displayed in");
prop = RNA_def_property(srna, "filebrowser_display_type", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_items(prop, temp_space_display_types);
RNA_def_property_ui_text(prop,
"File Browser Display Type",
"Default location where the File Editor will be displayed in");
static const EnumPropertyItem text_hinting_items[] = {
{0, "AUTO", 0, "Auto", ""},
{USER_TEXT_HINTING_NONE, "NONE", 0, "None", ""},

View File

@ -2346,15 +2346,16 @@ static int wm_handler_fileselect_do(bContext *C,
wmWindow *win = CTX_wm_window(C);
const int sizex = 1020 * UI_DPI_FAC;
const int sizey = 600 * UI_DPI_FAC;
ScrArea *area;
if (WM_window_open_temp(C,
IFACE_("Blender File View"),
WM_window_pixels_x(win) / 2,
WM_window_pixels_y(win) / 2,
sizex,
sizey,
SPACE_FILE) != NULL) {
ScrArea *area = CTX_wm_area(C);
if ((area = ED_screen_temp_space_open(C,
IFACE_("Blender File View"),
WM_window_pixels_x(win) / 2,
WM_window_pixels_y(win) / 2,
sizex,
sizey,
SPACE_FILE,
U.filebrowser_display_type))) {
ARegion *region_header = BKE_area_find_region_type(area, RGN_TYPE_HEADER);
BLI_assert(area->spacetype == SPACE_FILE);
@ -2393,17 +2394,18 @@ static int wm_handler_fileselect_do(bContext *C,
}
}
else {
for (wmWindow *win = wm->windows.first; win; win = win->next) {
if (WM_window_is_temp_screen(win)) {
bScreen *screen = WM_window_get_active_screen(win);
ScrArea *file_sa = screen->areabase.first;
wmWindow *temp_win;
ScrArea *ctx_sa = CTX_wm_area(C);
BLI_assert(file_sa->spacetype == SPACE_FILE);
for (temp_win = wm->windows.first; temp_win; temp_win = temp_win->next) {
bScreen *screen = WM_window_get_active_screen(temp_win);
ScrArea *file_sa = screen->areabase.first;
if (screen->temp && (file_sa->spacetype == SPACE_FILE)) {
if (BLI_listbase_is_single(&file_sa->spacedata)) {
BLI_assert(ctx_win != win);
BLI_assert(ctx_win != temp_win);
wm_window_close(C, wm, win);
wm_window_close(C, wm, temp_win);
CTX_wm_window_set(C, ctx_win); // wm_window_close() NULLs.
/* Some operators expect a drawable context (for EVT_FILESELECT_EXEC) */
@ -2412,7 +2414,7 @@ static int wm_handler_fileselect_do(bContext *C,
* opening (UI_BLOCK_MOVEMOUSE_QUIT) */
wm_get_cursor_position(ctx_win, &ctx_win->eventstate->x, &ctx_win->eventstate->y);
wm->winactive = ctx_win; /* Reports use this... */
if (handler->context.win == win) {
if (handler->context.win == temp_win) {
handler->context.win = NULL;
}
}
@ -2426,6 +2428,10 @@ static int wm_handler_fileselect_do(bContext *C,
break;
}
}
if (!temp_win && ctx_sa->full) {
ED_screen_full_prevspace(C, ctx_sa);
}
}
wm_handler_op_context(C, handler, ctx_win->eventstate);
@ -3539,15 +3545,50 @@ void WM_event_add_fileselect(bContext *C, wmOperator *op)
{
wmWindowManager *wm = CTX_wm_manager(C);
wmWindow *win = CTX_wm_window(C);
const bool is_temp_screen = WM_window_is_temp_screen(win);
/* Don't add the file handler to the temporary window, or else it owns the handlers for itself,
* causing dangling pointers once it's destructed through a handler. It has a parent which should
* hold the handlers itself. */
ListBase *modalhandlers = WM_window_is_temp_screen(win) ? &win->parent->modalhandlers :
&win->modalhandlers;
ListBase *modalhandlers = is_temp_screen ? &win->parent->modalhandlers : &win->modalhandlers;
/* Close any popups, like when opening a file browser from the splash. */
UI_popup_handlers_remove_all(C, modalhandlers);
if (!is_temp_screen) {
/* only allow 1 file selector open per window */
LISTBASE_FOREACH_MUTABLE (wmEventHandler *, handler_base, modalhandlers) {
if (handler_base->type == WM_HANDLER_TYPE_OP) {
wmEventHandler_Op *handler = (wmEventHandler_Op *)handler_base;
if (handler->is_fileselect == false) {
continue;
}
bScreen *screen = CTX_wm_screen(C);
bool cancel_handler = true;
/* find the area with the file selector for this handler */
ED_screen_areas_iter(win, screen, sa)
{
if (sa->spacetype == SPACE_FILE) {
SpaceFile *sfile = sa->spacedata.first;
if (sfile->op == handler->op) {
CTX_wm_area_set(C, sa);
wm_handler_fileselect_do(C, &win->modalhandlers, handler, EVT_FILESELECT_CANCEL);
cancel_handler = false;
break;
}
}
}
/* if not found we stop the handler without changing the screen */
if (cancel_handler) {
wm_handler_fileselect_do(
C, &win->modalhandlers, handler, EVT_FILESELECT_EXTERNAL_CANCEL);
}
}
}
}
wmEventHandler_Op *handler = MEM_callocN(sizeof(*handler), __func__);
handler->head.type = WM_HANDLER_TYPE_OP;