Patch by Psy-Fi + my minor changes

Adds conformation on exit for windows. Needs to be enabled in user perf.

Tried to edit blender.exe.manifest for more modern dialog look, but didn't work out.
This commit is contained in:
2012-03-16 17:37:45 +00:00
parent 2caa507b7e
commit ed44ddd816
11 changed files with 71 additions and 2 deletions

View File

@@ -842,6 +842,14 @@ extern void GHOST_putClipboard(GHOST_TInt8 *buffer, int selection);
*/
extern int GHOST_toggleConsole(int action);
/**
* Confirms quitting he program when there is just one window left open
* in the application
*/
extern int GHOST_confirmQuit(GHOST_WindowHandle windowhandle);
#ifdef __cplusplus
}
#endif

View File

@@ -392,7 +392,11 @@ public:
*/
virtual void putClipboard(GHOST_TInt8 *buffer, bool selection) const = 0;
/**
* Confirms quitting he program when there is just one window left open
* in the application
*/
virtual int confirmQuit(GHOST_IWindow * window) const = 0;
protected:
/**
* Initialize the system.

View File

@@ -865,3 +865,9 @@ int GHOST_toggleConsole(int action)
GHOST_ISystem* system = GHOST_ISystem::getSystem();
return system->toggleConsole(action);
}
int GHOST_confirmQuit(GHOST_WindowHandle windowhandle){
GHOST_ISystem* system = GHOST_ISystem::getSystem();
return system->confirmQuit((GHOST_IWindow*) windowhandle);
}

View File

@@ -366,3 +366,9 @@ GHOST_TSuccess GHOST_System::createFullScreenWindow(GHOST_Window** window, const
}
return success;
}
int GHOST_System::confirmQuit(GHOST_IWindow * window) const
{
return 1;
}

View File

@@ -297,6 +297,13 @@ public:
*/
virtual void putClipboard(GHOST_TInt8 *buffer, bool selection) const = 0;
/**
* Confirms quitting he program when there is just one window left open
* in the application
*/
virtual int confirmQuit(GHOST_IWindow * window) const;
protected:
/**

View File

@@ -1356,3 +1356,9 @@ int GHOST_SystemWin32::toggleConsole(int action)
return m_consoleStatus;
}
int GHOST_SystemWin32::confirmQuit(GHOST_IWindow * window) const
{
return (MessageBox(window ? ((GHOST_WindowWin32*)window)->getHWND() : 0, "Some changes have not been saved.\nDo you really want to quit ?",
"Exit Blender", MB_OKCANCEL | MB_ICONWARNING | MB_TOPMOST) == IDOK);
}

View File

@@ -200,7 +200,13 @@ public:
* @return Indication whether the event was handled.
*/
static GHOST_TSuccess pushDragDropEvent(GHOST_TEventType eventType, GHOST_TDragnDropTypes draggedObjectType,GHOST_IWindow* window, int mouseX, int mouseY, void* data);
/**
* Confirms quitting he program when there is just one window left open
* in the application
*/
virtual int confirmQuit(GHOST_IWindow * window) const;
protected:
/**
* Initializes the system.

View File

@@ -244,6 +244,9 @@ class USERPREF_PT_interface(Panel):
col.prop(view, "show_splash")
if os.name == 'nt':
col.prop(view, "quit_dialog")
class USERPREF_PT_edit(Panel):
bl_space_type = 'USER_PREFERENCES'

View File

@@ -510,6 +510,7 @@ extern UserDef U; /* from blenkernel blender.c */
#define USER_SPLASH_DISABLE (1 << 27)
#define USER_HIDE_RECENT (1 << 28)
#define USER_SHOW_THUMBNAILS (1 << 29)
#define USER_QUIT_PROMPT (1 << 30)
/* Auto-Keying mode */
/* AUTOKEY_ON is a bitflag */

View File

@@ -2369,6 +2369,11 @@ static void rna_def_userdef_view(BlenderRNA *brna)
RNA_def_property_ui_text(prop, "Sub Level Menu Open Delay",
"Time delay in 1/10 seconds before automatically opening sub level menus");
prop = RNA_def_property(srna, "quit_dialog", PROP_BOOLEAN, PROP_NONE);
RNA_def_property_boolean_sdna(prop, NULL, "uiflag", USER_QUIT_PROMPT);
RNA_def_property_ui_text(prop, "Prompt Quit",
"Asks for confirmation when quitting through the window close button");
/* Toolbox click-hold delay */
prop = RNA_def_property(srna, "open_left_mouse_delay", PROP_INT, PROP_NONE);
RNA_def_property_int_sdna(prop, NULL, "tb_leftmouse");

View File

@@ -250,8 +250,25 @@ wmWindow *wm_window_copy(bContext *C, wmWindow *winorig)
/* this is event from ghost, or exit-blender op */
void wm_window_close(bContext *C, wmWindowManager *wm, wmWindow *win)
{
wmWindow *tmpwin;
bScreen *screen= win->screen;
/* first check if we have any non-temp remaining windows */
if((U.uiflag & USER_QUIT_PROMPT) && !wm->file_saved){
if(wm->windows.first) {
for(tmpwin = wm->windows.first; tmpwin; tmpwin = tmpwin->next){
if(tmpwin == win)
continue;
if(tmpwin->screen->temp == 0)
break;
}
if(tmpwin == NULL){
if(!GHOST_confirmQuit(win->ghostwin))
return;
}
}
}
BLI_remlink(&wm->windows, win);
wm_draw_window_clear(win);