Modal windows
-
- Enthusiast
- Posts: 443
- Joined: Sun Apr 06, 2008 12:54 pm
- Location: Brisbane, Qld, Australia
- Contact:
Modal windows
Yes, I know it's been asked many times before, going back to 2002, but I'd like to put in another vote for a cross-platform method of making a window modal, such as by using a flag like #PB_Window_Modal as suggested here. Meanwhile, I'll use the tip posted here, but a single extra flag would be really nice! After all, we've probably all got an Options window that needs to be modal.
-
- Enthusiast
- Posts: 443
- Joined: Sun Apr 06, 2008 12:54 pm
- Location: Brisbane, Qld, Australia
- Contact:
Good question! In Microsoft land it seems to be the norm. I've just checked several applications on my Windows PC and they all display Options dialogs as modal windows, except for PureBasic, which leaves the window on top but still allows me to access the main PB window. On my Apple iMac the rules are looser. Some Apple apps treat the Preferences window modally, but many do not. Those that do not treat the Preferences window as just another window, and don't even keep it on top if you go another window in the app.Trond wrote:Why would it need that?After all, we've probably all got an Options window that needs to be modal.
In my app the Options window probably doesn't need to be modal. I'll review this. But I do have some other modal windows.
Don't know anything about GTK, but in a quick check of the documentation I found the function gtk_window_set_modal (). By "api" I presume you mean Windows api? I'm trying wherever possible to keep everything cross-platform, but Windows api calls are OK if I can find equivalent functionality for Apple and Linux, and then use CompilerIf #PB_Compiler_OS=... commands to select the appropriate code.srod wrote:I'd like proper (modal and modeless) Windows dialogs (although I am unsure if there are GTK equivalents etc?) I use them more and more these days (via api of course); although using api is no real hardship in these cases.
Re: Modal windows
I would like, and use, modal windows also and it would be a good addition to pb.
It occurs to me that, if you are entering data, that affects other windows, then the window should be modal. Otherwise, you will have to read the data as it is being put in and the other windows will have to be updated real-time or the other windows will have to be updated upon closing the window (ie. preferences window). It would be easier just to have one window open at a time but that is a problem with the Mac since you end up moving the menus all the time (you can only have one menu and it has to have a window).
I suppose you could make a window modal by the code in the event loop but I haven't tried it.. yet.
Oh, thanks ts-soft. I was writing this as you posted. I'm going to look at your example!
It occurs to me that, if you are entering data, that affects other windows, then the window should be modal. Otherwise, you will have to read the data as it is being put in and the other windows will have to be updated real-time or the other windows will have to be updated upon closing the window (ie. preferences window). It would be easier just to have one window open at a time but that is a problem with the Mac since you end up moving the menus all the time (you can only have one menu and it has to have a window).
I suppose you could make a window modal by the code in the event loop but I haven't tried it.. yet.
Oh, thanks ts-soft. I was writing this as you posted. I'm going to look at your example!
Last edited by WilliamL on Sat Dec 19, 2009 6:55 pm, edited 1 time in total.
MacBook Pro-M1 (2021), Sequoia 15.4, PB 6.20
Re: Modal windows
A Modal-Window (crossplattform) is available!
Greetings
Thomas
Code: Select all
Procedure ModalWindow()
OpenWindow(1, 0, 0, 300, 200, "Modal", #PB_Window_SystemMenu | #PB_Window_WindowCentered, WindowID(0))
DisableWindow(0, #True)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
CloseWindow(1)
DisableWindow(0, #False)
Break
EndSelect
ForEver
EndProcedure
OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "Main", #PB_Window_SystemMenu)
ButtonGadget(0, 100, 100, 80, 30, "Modal Dialog")
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = 0
ModalWindow()
EndIf
EndSelect
ForEver
Thomas
Re: Modal windows
This works but there is the problem of clicking on the window 'close box' (which I use as a 'cancel' in some programs). Ideally, I wouldn't want to have to check on which window is open in the event loop which defeats the whole purpose of 'DisableWindow()' otherwise I could just check which window is open and make it modal that way.
Code: Select all
#maxwindows=2
Procedure MakeModalWindow(mwnd)
For cnt=1 To #maxwindows
If IsWindow(cnt)
If cnt<>mwnd : DisableWindow(cnt, #True) : EndIf
EndIf
Next
EndProcedure
Procedure ReleaseModalWindow()
For cnt=1 To #maxwindows
If IsWindow(cnt)
DisableWindow(cnt, #False)
EndIf
Next
EndProcedure
OpenWindow(1, 0, 0, 300, 200, "Window 1", #PB_Window_SystemMenu | #PB_Window_WindowCentered)
ButtonGadget(3,10,10,60,20,"Done")
OpenWindow(2, 40,40, 200, 200, "Window 2", #PB_Window_SystemMenu)
MakeModalWindow(2)
ButtonGadget(4,10,10,90,20,"Release")
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
If EventGadget() = 4
ReleaseModalWindow()
EndIf
EndSelect
ForEver
MacBook Pro-M1 (2021), Sequoia 15.4, PB 6.20
Re: Modal windows
I miss the ParentID in your code, this is required!
Your EventLoop should select the Window!
PB can't go the way with a simple flag, PB is not eventdriven!
greetings
Thomas
Your EventLoop should select the Window!
PB can't go the way with a simple flag, PB is not eventdriven!
greetings
Thomas
Re: Modal windows
ts-soft - you're right. The parent window concept is new to me. It's pretty cool but I'm thinking of a modal window, like preferences, that is opened from a menu selection.
Here is some hastily thrown together code trying to make a modal window using the event loop. Yeah, I don't like it either.
Here is some hastily thrown together code trying to make a modal window using the event loop. Yeah, I don't like it either.

Code: Select all
#maxwindows=2
#prefwnd=2
Global modalwindow.l=0
Procedure MakeModalWindow(mwnd)
For cnt=1 To #maxwindows
If IsWindow(cnt)
If cnt<>mwnd : DisableWindow(cnt, #True) : EndIf
EndIf
Next
modalwindow=mwnd
EndProcedure
Procedure ReleaseModalWindow()
For cnt=1 To #maxwindows
If IsWindow(cnt)
DisableWindow(cnt, #False)
EndIf
Next
modalwindow=0
EndProcedure
OpenWindow(1, 50, 50, 200, 200, "Window 1", #PB_Window_SystemMenu)
ButtonGadget(3,10,10,60,20,"End")
OpenWindow(#prefwnd, 140,140, 200, 200, "Preferences", #PB_Window_SystemMenu)
MakeModalWindow(#prefwnd)
ButtonGadget(4,10,10,90,20,"Release")
Repeat
event=WaitWindowEvent()
wndw=EventWindow()
If modalwindow
If modalwindow<>wndw
wndw=0
EndIf
EndIf
Select wndw
Case #prefwnd
Select event
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadget()
Case #PB_Event_CloseWindow
Break
Case 4
ReleaseModalWindow()
EndSelect
EndSelect
Case 1
Select event
Case #PB_Event_CloseWindow
Break
Case #PB_Event_Gadget
Select EventGadget()
Case #PB_Event_CloseWindow
Break
Case 3
Break
EndSelect
EndSelect
EndSelect
ForEver
Last edited by WilliamL on Sat Dec 19, 2009 11:06 pm, edited 2 times in total.
MacBook Pro-M1 (2021), Sequoia 15.4, PB 6.20
Re: Modal windows
I don't understand the problem, here another example:
Code: Select all
OpenWindow(0, #PB_Ignore, #PB_Ignore, 640, 480, "Main", #PB_Window_SystemMenu)
If CreateMenu(0, WindowID(0))
MenuTitle("Options")
MenuItem(1, "Preferences")
EndIf
; ...
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
Select EventWindow()
Case 0
Break
Default
CloseWindow(EventWindow())
DisableWindow(0, #False)
EndSelect
Case #PB_Event_Menu
If EventMenu() = 1
DisableWindow(0, #True)
OpenWindow(1, 0, 0, 200, 150, "Preferences", #PB_Window_SystemMenu | #PB_Window_WindowCentered, WindowID(0))
; ...
EndIf
EndSelect
ForEver
Re: Modal windows
I guess what I don't understand is, what if there is more than one window open? You've tied the modal window to one window but what about the other windows? What if the modal window is the first window of the program (ie Game name:). Your example would be perfect for modal input to an existing window and I would use your example for that.
MacBook Pro-M1 (2021), Sequoia 15.4, PB 6.20
Re: Modal windows
You have to disable the others to, the only active window for the application can only one modal window.WilliamL wrote:I guess what I don't understand is, what if there is more than one window open? You've tied the modal window to one window but what about the other windows?
Modal to what? The first window can never applicationmodal.WilliamL wrote: What if the modal window is the first window of the program (ie Game name:). Your example would be perfect for modal input to an existing window and I would use your example for that.
Or your question for a Systemmodal window? This is not available without API.
Re: Modal windows
ts-soft
Thanks for the insight. I think I've exhausted my understanding and will have to think about what you have shown me.
It's this kind of dialog that makes this forum so good!
Thanks for the insight. I think I've exhausted my understanding and will have to think about what you have shown me.
It's this kind of dialog that makes this forum so good!

MacBook Pro-M1 (2021), Sequoia 15.4, PB 6.20
-
- Enthusiast
- Posts: 469
- Joined: Sun Mar 16, 2008 9:18 am
Re:
Depends on the app. Some apps need an option to be selected by the user before continuing, to prevent data loss. It's quite normal.Trond wrote:Why would it need that?After all, we've probably all got an Options window that needs to be modal.
Access to it, yes, but you can't edit the code when it's running. The debugger has made the IDE modal for all intents and purposes.ozzie wrote:except for PureBasic, which leaves the window on top but still allows me to access the main PB window