Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add shift and control modifiers to close window button #18537

Merged

Conversation

ccahiggins
Copy link
Contributor

Add keyboard modifiers to the window close widget.
Pressing shift while closing the window leaves that window open, but closes all other windows, e.g. close all staff windows leaving ride construction open.
Pressing control while closing the window closes all windows of the current window class, e.g. close all guest widows.

@IntelOrca
Copy link
Contributor

You should try to avoid needing this logic in every window and see if you can make the logic generic and part of the core window logic.

@ccahiggins
Copy link
Contributor Author

You should try to avoid needing this logic in every window and see if you can make the logic generic and part of the core window logic.

Oh that sounds like a good idea. Remove duplicating the input check each time. Would it be confusing if Close() has the check in it? Probably need more testing if it affects all windows rather than specific ones, just in case it causes some weirdness.

@IntelOrca
Copy link
Contributor

@ccahiggins It could go in Close, but that is used in other circumstances. I think the close button widget uses its own widget type, CloseBox, so you could put the check logic in the generic code. Set a flag to say next close call for what specific window owning the widget should do your special logic.

@ccahiggins
Copy link
Contributor Author

@IntelOrca Good point, could lead to some confusion if Close() is called while shift happens to be pressed. Ok thanks, I'll have a look at CloseBox and see if I can do something with that.

@ccahiggins
Copy link
Contributor Author

Ok, so one way to do this could be to use MouseInput and check on LeftReleased that it was a CloseBox that was pressed. A new field in rct_window can be set to shift/ctrl/none, and checked inside Close().

@IntelOrca
Copy link
Contributor

IntelOrca commented Nov 9, 2022

Ok, so one way to do this could be to use MouseInput and check on LeftReleased that it was a CloseBox that was pressed. A new field in rct_window can be set to shift/ctrl/none, and checked inside Close().

Only one window will ever have this flag set at one time, so no need for it to be stored in every window. Instead have a global that stores the (window class, number) that should close with special logic.

@ccahiggins
Copy link
Contributor Author

Ok yeah that makes sense. C++ is definitely not my first language, too used to Java, so this is some fun learning, thanks :)

How's this sound?
src/openrct2/interface/Window.h:

  • Enum for modifier types (shift, control, none)
  • Struct for rct_windownumber, WindowClass, modifier Enum
  • extern to struct defined in Window.cpp

src/openrct2/interface/Window.cpp:

  • define struct for last window modifier

src/openrct2-ui/input/MouseInput.cpp:

  • in InputStateWidgetPressed, check when state == LeftRelease
  • if widget == CloseBox, and shift/ctrl pressed, set last modifier to shift/control

src/openrct2-ui/interface/Window.cpp:

  • in Close(), check if this is last window with close modifier
  • close other window/windows of class type, depending on last modifier
  • reset last modifier to none
  • maybe also set none if number/class don't match, just in case close is called by something else to avoid random issues

Notes:

Instead of defining a new Enum, reuse the PLACE_OBJECT_MODIFIER Enum?

With the MouseInput, two ways to test for this:

  • new if statement for state == LeftRelease
  • use existing switch, case MouseState::LeftRelease: - however this would need a fallthrough otherwise inputs are very broken

Also, I've noticed RightPress state gets set even when I don't press the right button, is that normal? And released is set a lot (is that release for right when I have left pressed?)

Not all windows are refactored to the new openrct2-ui Window class, options:

  • use this solution, understanding that some windows won't have this functionality until they are refactored
  • wait until all have been refactored so that all windows can use this
  • add additional code to all classes implementing old Window class, which can be removed when they are refactored
  • don't think this is a good one: also add modifier check to window_close so other windows also can use this

@IntelOrca
Copy link
Contributor

Sounds good. It is a bit hacky, but the best that can be done for now until we are able to make the code for window shims more common.

Struct for rct_windownumber, WindowClass, modifier Enum

I think there is already a struct for class, number and widget index, so use that - even if it is in a new structure that is together with the enum.

Instead of defining a new Enum, reuse the PLACE_OBJECT_MODIFIER Enum?

I would make a new enum with more meaningful identifiers.

Also, I've noticed RightPress state gets set even when I don't press the right button, is that normal? And released is set a lot (is that release for right when I have left pressed?)

The input logic is very messy, so I am not surprised by this. I am not really sure what the right behaviour is.

use this solution, understanding that some windows won't have this functionality until they are refactored

I think this makes the most sense.

@ccahiggins
Copy link
Contributor Author

Changes have been pushed now.

And this is a demo of the new behaviour (image links to a YouTube demo)

Demo

Copy link
Contributor

@IntelOrca IntelOrca left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good for the most part, a changelog entry should be added for this.

src/openrct2/interface/Window.h Outdated Show resolved Hide resolved
src/openrct2/interface/Window.h Outdated Show resolved Hide resolved
src/openrct2/interface/Window.cpp Outdated Show resolved Hide resolved
src/openrct2-ui/interface/Window.cpp Outdated Show resolved Hide resolved
@tupaschoal
Copy link
Member

@IntelOrca can you review this again and see if it's ready for merge? Seems like the changes you requested were incorporated by the OP

@ccahiggins tip for the future: whenever you implement suggestions as they are by reviewers, make sure to mark the conversations as resolved, so that the PR history becomes cleaner and easier to re-review.

Copy link
Member

@tupaschoal tupaschoal left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@ccahiggins can you rebase so that the changelog entry sits on the 0.4.4 version, since 0.4.3 was already released?

Also I don't know if we can do better on the changelog to explain what the modifiers do?

Chris Higgins and others added 7 commits December 27, 2022 08:59
Shift closes all but current window.
Control closes all windows of the same window class/type.
Reorder Input.h includes to match code style
Move code from each window to underlying Window code
Use MouseInput to set flag when shift/control are pressed
Check in Window Close() method if modifier was pressed closing the window and determine the appropriate closing action
Remove Input includes no longer necessary
Add new enum and struct to set last modifier pressed when closing a window
Changes to method and enum casing
Tidy up placement of struct/enums
Add changelog
@tupaschoal tupaschoal force-pushed the feature/CloseWindowKeyboardModifiers branch from 49d8234 to fa11e01 Compare December 27, 2022 12:00
@tupaschoal tupaschoal changed the title Feature/close window keyboard modifiers Add shift and control modifiers to close window button Dec 27, 2022
@tupaschoal tupaschoal enabled auto-merge (squash) December 27, 2022 12:10
@tupaschoal tupaschoal added this to the v0.4.4 milestone Dec 27, 2022
@tupaschoal tupaschoal merged commit 279675b into OpenRCT2:develop Dec 27, 2022
janisozaur added a commit that referenced this pull request Mar 28, 2023
- Feature: [#11269] Add properties for speed and length of vehicle animations.
- Feature: [#15849] Objectives can now be set for up to 50000 guests.
- Feature: [#18537] Add shift/control modifiers to window close buttons, closing all but the given window or all windows of the same type, respectively.
- Feature: [#18732] [Plugin] API to get the guests thoughts.
- Feature: [#18744] Cheat to allow using a regular path as a queue path.
- Feature: [#19023] Add Canadian French translation.
- Feature: [#19341] Add “All Scenery” tab to scenery window.
- Feature: [#19378] Add command to combine CSG1i.DAT and CSG1.DAT.
- Feature: [objects#226] Port RCT1 Corkscrew Coaster train.
- Feature: [objects#229] Port RCT1 go karts with helmets.
- Feature: [OpenMusic#20, OpenMusic#21] Added Blizzard and Extraterresterial ride music styles.
- Improved: [#11473] Hot reload for plug-ins now works on macOS.
- Improved: [#12466] RCT1 parks now use RCT1’s interest calculation algorithm.
- Improved: [#14635] Scenery window now shows up to 255 scenery groups.
- Improved: [#17288] Reorganise the order of shortcut keys in the Shortcut Keys window.
- Improved: [#18706] Ability to view the list of contributors in-game.
- Improved: [#18749] Ability to have 4 active awards for more than one month in a row.
- Improved: [#18826] [Plugin] Added all actions and their documentation to plugin API.
- Improved: [#18945] Languages can now fall back to other languages than English.
- Improved: [#18970] Trying to load a non-park save will now display a context error.
- Improved: [#18975] Add lift sprites for steep hills on the wooden roller coaster.
- Improved: [#19044] Added special thanks to RMC and Wiegand to the About page.
- Improved: [#19131] Track missing objects when selecting scenery groups in console.
- Improved: [#19253] Queue junctions drawn properly when using regular paths as queue. Note: Requires using tile inspector to indicate railings can be used at T or X junctions.
- Improved: [#19067] New Ride window now allows filtering similarly to Object Selection.
- Improved: [#19272] Scenery window now allows filtering similarly to Object Selection.
- Improved: [#19447] The control key now enables word jumping in text input fields.
- Improved: [#19463] Added ‘W’ and ‘Y’ with circumflex to sprite font (for Welsh).
- Improved: [#19549] Enable large address awareness for 32 bit Windows builds allowing to use 4 GiB of virtual memory.
- Improved: [#19668] Decreased the minimum map size from 13 to 3.
- Improved: [#19683] The delays for ride ratings to appear has been reduced drastically.
- Improved: [#19697] “Show guest purchases” will now work in multiplayer.
- Change: [#19018] Renamed actions to fit the naming scheme.
- Change: [#19091] [Plugin] Add game action information to callback arguments of custom actions.
- Change: [#19233] Reduce lift speed minimum and maximum values for “Classic Wooden Coaster”.
- Removed: [#19520] Support for Windows Vista systems.
- Fix: [#474] Mini golf window shows more players than there actually are (original bug).
- Fix: [#592] Window scrollbar not able to navigate to the end of large lists.
- Fix: [#7210] Land tile smoothing occurs with edge tiles (original bug).
- Fix: [#17996] Finances window not cleared when starting some .park scenarios.
- Fix: [#18260] Crash opening parks that have multiple tiles referencing the same banner entry.
- Fix: [#18467] “Selected only” Object Selection filter is active in Track Designs Manager, and cannot be toggled.
- Fix: [#18904] OpenRCT2 audio object accidentally exported in saves.
- Fix: [#18905] Ride Construction window theme is not applied correctly.
- Fix: [#18911] Mini Golf station does not draw correctly from all angles.
- Fix: [#18971] New Game does not prompt for save before quitting.
- Fix: [#18986] [Plugin] Sending remote scripts larger than 63KiB crashing all clients.
- Fix: [#18994] Title music doesn’t start after enabling master volume.
- Fix: [#19025] Park loan behaves inconsistently with non-round and out-of-bounds values.
- Fix: [#19026] Park loan is clamped to a 32-bit integer.
- Fix: [#19068] Guests may not join queues correctly.
- Fix: [#19091] [Plugin] Remote plugins in multiplayer servers do not unload properly.
- Fix: [#19112] Clearing the last character in the Object Selection filter does not properly reset it.
- Fix: [#19112] Text boxes not updated with empty strings in Track List, Server List, and Start Server windows.
- Fix: [#19114] [Plugin] ‘GameActionResult’ does not comply to API specification.
- Fix: [#19136] SV6 saves with experimental RCT1 paths not imported correctly.
- Fix: [#19243] .park scenarios don’t complete properly.
- Fix: [#19250] MusicObjects do not free their preview images.
- Fix: [#19292] Overflow in ‘totalRideValue’.
- Fix: [#19339] Incorrect import of crashed particles from SV4.
- Fix: [#19379] “No platforms” station style shows platforms on the Junior Roller Coaster.
- Fix: [#19380] Startup crash when no sequences are installed and random sequences are enabled.
- Fix: [#19391] String corruption caused by an improper buffer handling in ‘GfxWrapString’.
- Fix: [#19434, #19509] Object types added by OpenRCT2 do not get removed when executing ‘remove_unused_objects’.
- Fix: [#19475] Cannot increase loan when more than £1000 in debt.
- Fix: [#19493] SV4 saves not importing the correct vehicle colours.
- Fix: [#19517] Crash when peeps try to exit or enter hacked rides that have no waypoints specified.
- Fix: [#19524] Staff counter shows incorrect values if there are more than 32767 staff members.
- Fix: [#19574] Handle exits in null locations.
- Fix: [#19641, #19643] Missing water tile in Infernal Views’ and Six Flags Holland’s river.
qwzhaox pushed a commit to qwzhaox/OpenRCT2 that referenced this pull request Apr 10, 2023
- Feature: [OpenRCT2#11269] Add properties for speed and length of vehicle animations.
- Feature: [OpenRCT2#15849] Objectives can now be set for up to 50000 guests.
- Feature: [OpenRCT2#18537] Add shift/control modifiers to window close buttons, closing all but the given window or all windows of the same type, respectively.
- Feature: [OpenRCT2#18732] [Plugin] API to get the guests thoughts.
- Feature: [OpenRCT2#18744] Cheat to allow using a regular path as a queue path.
- Feature: [OpenRCT2#19023] Add Canadian French translation.
- Feature: [OpenRCT2#19341] Add “All Scenery” tab to scenery window.
- Feature: [OpenRCT2#19378] Add command to combine CSG1i.DAT and CSG1.DAT.
- Feature: [objects#226] Port RCT1 Corkscrew Coaster train.
- Feature: [objects#229] Port RCT1 go karts with helmets.
- Feature: [OpenMusic#20, OpenMusic#21] Added Blizzard and Extraterresterial ride music styles.
- Improved: [OpenRCT2#11473] Hot reload for plug-ins now works on macOS.
- Improved: [OpenRCT2#12466] RCT1 parks now use RCT1’s interest calculation algorithm.
- Improved: [OpenRCT2#14635] Scenery window now shows up to 255 scenery groups.
- Improved: [OpenRCT2#17288] Reorganise the order of shortcut keys in the Shortcut Keys window.
- Improved: [OpenRCT2#18706] Ability to view the list of contributors in-game.
- Improved: [OpenRCT2#18749] Ability to have 4 active awards for more than one month in a row.
- Improved: [OpenRCT2#18826] [Plugin] Added all actions and their documentation to plugin API.
- Improved: [OpenRCT2#18945] Languages can now fall back to other languages than English.
- Improved: [OpenRCT2#18970] Trying to load a non-park save will now display a context error.
- Improved: [OpenRCT2#18975] Add lift sprites for steep hills on the wooden roller coaster.
- Improved: [OpenRCT2#19044] Added special thanks to RMC and Wiegand to the About page.
- Improved: [OpenRCT2#19131] Track missing objects when selecting scenery groups in console.
- Improved: [OpenRCT2#19253] Queue junctions drawn properly when using regular paths as queue. Note: Requires using tile inspector to indicate railings can be used at T or X junctions.
- Improved: [OpenRCT2#19067] New Ride window now allows filtering similarly to Object Selection.
- Improved: [OpenRCT2#19272] Scenery window now allows filtering similarly to Object Selection.
- Improved: [OpenRCT2#19447] The control key now enables word jumping in text input fields.
- Improved: [OpenRCT2#19463] Added ‘W’ and ‘Y’ with circumflex to sprite font (for Welsh).
- Improved: [OpenRCT2#19549] Enable large address awareness for 32 bit Windows builds allowing to use 4 GiB of virtual memory.
- Improved: [OpenRCT2#19668] Decreased the minimum map size from 13 to 3.
- Improved: [OpenRCT2#19683] The delays for ride ratings to appear has been reduced drastically.
- Improved: [OpenRCT2#19697] “Show guest purchases” will now work in multiplayer.
- Change: [OpenRCT2#19018] Renamed actions to fit the naming scheme.
- Change: [OpenRCT2#19091] [Plugin] Add game action information to callback arguments of custom actions.
- Change: [OpenRCT2#19233] Reduce lift speed minimum and maximum values for “Classic Wooden Coaster”.
- Removed: [OpenRCT2#19520] Support for Windows Vista systems.
- Fix: [OpenRCT2#474] Mini golf window shows more players than there actually are (original bug).
- Fix: [OpenRCT2#592] Window scrollbar not able to navigate to the end of large lists.
- Fix: [OpenRCT2#7210] Land tile smoothing occurs with edge tiles (original bug).
- Fix: [OpenRCT2#17996] Finances window not cleared when starting some .park scenarios.
- Fix: [OpenRCT2#18260] Crash opening parks that have multiple tiles referencing the same banner entry.
- Fix: [OpenRCT2#18467] “Selected only” Object Selection filter is active in Track Designs Manager, and cannot be toggled.
- Fix: [OpenRCT2#18904] OpenRCT2 audio object accidentally exported in saves.
- Fix: [OpenRCT2#18905] Ride Construction window theme is not applied correctly.
- Fix: [OpenRCT2#18911] Mini Golf station does not draw correctly from all angles.
- Fix: [OpenRCT2#18971] New Game does not prompt for save before quitting.
- Fix: [OpenRCT2#18986] [Plugin] Sending remote scripts larger than 63KiB crashing all clients.
- Fix: [OpenRCT2#18994] Title music doesn’t start after enabling master volume.
- Fix: [OpenRCT2#19025] Park loan behaves inconsistently with non-round and out-of-bounds values.
- Fix: [OpenRCT2#19026] Park loan is clamped to a 32-bit integer.
- Fix: [OpenRCT2#19068] Guests may not join queues correctly.
- Fix: [OpenRCT2#19091] [Plugin] Remote plugins in multiplayer servers do not unload properly.
- Fix: [OpenRCT2#19112] Clearing the last character in the Object Selection filter does not properly reset it.
- Fix: [OpenRCT2#19112] Text boxes not updated with empty strings in Track List, Server List, and Start Server windows.
- Fix: [OpenRCT2#19114] [Plugin] ‘GameActionResult’ does not comply to API specification.
- Fix: [OpenRCT2#19136] SV6 saves with experimental RCT1 paths not imported correctly.
- Fix: [OpenRCT2#19243] .park scenarios don’t complete properly.
- Fix: [OpenRCT2#19250] MusicObjects do not free their preview images.
- Fix: [OpenRCT2#19292] Overflow in ‘totalRideValue’.
- Fix: [OpenRCT2#19339] Incorrect import of crashed particles from SV4.
- Fix: [OpenRCT2#19379] “No platforms” station style shows platforms on the Junior Roller Coaster.
- Fix: [OpenRCT2#19380] Startup crash when no sequences are installed and random sequences are enabled.
- Fix: [OpenRCT2#19391] String corruption caused by an improper buffer handling in ‘GfxWrapString’.
- Fix: [OpenRCT2#19434, OpenRCT2#19509] Object types added by OpenRCT2 do not get removed when executing ‘remove_unused_objects’.
- Fix: [OpenRCT2#19475] Cannot increase loan when more than £1000 in debt.
- Fix: [OpenRCT2#19493] SV4 saves not importing the correct vehicle colours.
- Fix: [OpenRCT2#19517] Crash when peeps try to exit or enter hacked rides that have no waypoints specified.
- Fix: [OpenRCT2#19524] Staff counter shows incorrect values if there are more than 32767 staff members.
- Fix: [OpenRCT2#19574] Handle exits in null locations.
- Fix: [OpenRCT2#19641, OpenRCT2#19643] Missing water tile in Infernal Views’ and Six Flags Holland’s river.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

4 participants