View Issue Details

IDProjectCategoryView StatusLast Update
0005122DarkRadiantSelection Systempublic08.11.2020 18:41
ReporterDragofer Assigned Togreebo  
PrioritynormalSeverityminorReproducibilityN/A
Status closedResolutionfixed 
Product Version2.6.0 
Target Version2.8.0Fixed in Version2.8.0 
Summary0005122: Feature: Selection by Filter
DescriptionI'd often like to select or deselect everything that belongs to a filter; at the moment I can think of these example cases:
- if I want to check for leaks I want to show nothing but worldspawn brushes and visportals
- if I suspect there's a mistake in my AI paths I want to show nothing but paths, maybe also worldspawn brushes & monsterclip
- sometimes I also make new filters if I want to isolate & work on a certain kind of entity, i.e. speakers or func_emitters

I've devised my own technique to isolate constituents of a filter:
- set the filter to hidden
- select & hide the whole map
- set the filter to visible

I think it'd be a useful feature to be able to directly select and deselect according to filters.
Maybe it could be done by adding 2 mutually exclusive toggles beneath "Deactivate all Filters" to the filter list: "select by filter", "deselect by filter"? If one of these toggles is active, any clicks on a filter in the list will select/deselect instead of hiding/showing.
Additional InformationA little cherry on top would be if the filters list stayed open after each click, whether showing/hiding or selecting/deselecting, and only disappeared if the mapper clicked somewhere else or on "Edit Filters".
Would make it easier to change several filters at a time, but really it's just a small convenience.
TagsNo tags attached.

Relationships

related to 0005226 closedgreebo Feature: "Select Parent Entities" 

Activities

greebo

greebo

05.04.2020 15:00

administrator   ~0012332

Will mark this as resolved until feedback during beta tests. Feature is accessible through the Orthoview's context menu, through the console ("SelectByFilterYYY"/"DeselectByFilterYYY") as well as custom bindings to those events.
Dragofer

Dragofer

24.04.2020 11:54

developer   ~0012380

Last edited: 24.04.2020 11:55

View 2 revisions

Feedback: I think it'd be better if filter selection selected/deselected whole entities rather than only individual members. I've been trying to isolate i.e. all nodrawsolid brushes in the map, but a lot of them are in func_statics together with other brushes, so when I perform the following procedure I only get a small fraction of the nodrawsolid brushes in the map:

Select by Filter -> Nodraw Textures -> press I & h to invert selection and hide everything else

It'd be more useful for me to have too much (i.e. nodrawsolid brushes and other brushes/patches in the same func_statics) than too little (only those entities consisting of nothing but nodrawsolid).
greebo

greebo

24.04.2020 14:03

administrator   ~0012384

I understand what you want to achieve, but that's not how the filter system is working.
When you specify to filter to hide or show a certain material (by name), it'd be against the logic if I told it to affect other objects too, just because they might share the same parent. Selecting objects based on filters has to use the same rules as the Filters for showing/hiding stuff.

I guess what you need is a completely separate algorithm which checks the objects affected by a filter and then does something based on that, like selecting the parent entity. Maybe that would be a separate command or feature? Selecting the parent entity of any selected object?
Dragofer

Dragofer

24.04.2020 21:47

developer   ~0012392

"Selection by filter" actually looks like it selects the parent entities, so much so that I could move my selection to a blank part of the map if I wanted to take a look at all the entities containing nodrawsolid brushes - something I couldn't achieve before.
The problem only arises as soon as I press i to invert the selection, because then I tend to lose a lot of those parent entities because they weren't purely nodrawsolid brushes.

Maybe if there were an alternate selection inversion, ctrl + i, that extends my current selection to the parent entities before it performs the inversion?
greebo

greebo

25.04.2020 04:13

administrator   ~0012395

Yes, I was having something like this in mind, like "Select Parent Entities" or something more intuitive sounding.
Dragofer

Dragofer

25.04.2020 16:07

developer   ~0012406

Last edited: 25.04.2020 16:10

View 3 revisions

I've looked some more into why I was losing a lot of my "Select by Filter" selections when I perform invert & hide:

it turns out that if I use "Select by Filter" -> press i, the currently selected children stay selected, now in addition to everything else belonging to that parent. This doesn't happen when I use "Select Group Parts" -> select a child -> press i.

For demonstrating this, I've attached a room from a WIP, in which the focus is on the bed in the northeast which is a single func_static consisting of both clip and visible textures. My aim is to evaluate the bed's clip brushes, so I want to hide everything but keep the bed's clip brushes (or at least the whole bed entity) visible.

1) Select by Filter -> Clip Textures -> this selects the clip textures belonging to the bed func_static as well as the chest's lone setfrobable brush.
2) Move the clip textures into the void so you have a clear view of them for the next steps. (This would've been difficult to achieve without "Select by Filter")
3) Press i to invert -> the clip is still selected despite the inversion, together with everything else in the map
4) Press h to hide -> nothing is visible anymore.
Dragofer

Dragofer

25.04.2020 16:08

developer   ~0012407

invert.map (304,546 bytes)
Dragofer

Dragofer

29.04.2020 07:43

developer   ~0012431

Also, I noticed that De/Select by Filter doesn't respect layer visibilities - so it'll select/deselect everything eligible in the whole map.
greebo

greebo

29.04.2020 15:59

administrator   ~0012432

I can confirm the last one, invisible objects have been selected by the filter. I switched that off in the recent commit.

As for the selection inversion weirdness, I think this behaviour is somewhat unrelated to this feature here. It's more of a general problem when single primitives of entities are selected and the selection is inverted. You can open a new issue report for that if you like, but I don't think that this can be solved easily since DR technically cannot invert the selection if a single child is selected. If the entity itself is selected, all the children are implicitly selected too. So, when inverting the selection of a single child, DR would need to select the parent entity and all its children *except* for that initially selected primitive - which is not possible, since the parent selection affects all the children.
Dragofer

Dragofer

29.04.2020 20:19

developer   ~0012433

That's strange, because if I use "Select Group Parts" to select single primitives inside an entity I'm able to invert and hide correctly within this and other "Group" entities. The only problem in that case is that "Invert" ignores non-"Group" entities.

I understand that "Select Group Parts" works differently from "Select by Filter" though, and if it's a larger problem I wouldn't want to hold back 2.8.0's release, which sure is already chock-full of goodies.
greebo

greebo

30.04.2020 03:43

administrator   ~0012434

Yes, the invert selection algorithm is sensitive to the selection mode you're in (Entity, Group Part, etc.)
Maybe you can get near what you want in your scenario by switching the selection mode before hitting invert?
Dragofer

Dragofer

02.05.2020 16:36

developer   ~0012445

Setting this to resolved since my quibble seems more related to the inversion algorithm than this new selection algorithm (child selections staying selected after performing "invert"). And it's in fact the new "Select Parents" feature that lets me achieve my desired functionality - not "Select Group Parts", since that deselects everything.

Related Changesets

DarkRadiant: master b3c70171

2020-03-29 04:54:19

greebo

Details Diff
Refactor filter system InstanceUpdateWalker Affected Issues
0005122
mod - radiant/filters/BasicFilterSystem.cpp Diff File
mod - radiant/filters/InstanceUpdateWalker.h Diff File

DarkRadiant: master 0da2832e

2020-03-29 08:00:04

greebo

Details Diff
Straighten the BasicFilterSystem class a bit Affected Issues
0005122
mod - radiant/filters/BasicFilterSystem.cpp Diff File
mod - radiant/filters/XMLFilter.cpp Diff File
mod - radiant/filters/XMLFilter.h Diff File

DarkRadiant: master 7b57cad1

2020-03-29 11:19:41

greebo

Details Diff
0005122: Add SelectByFilterWalker to evaluate whether a single XMLFilter applies to various nodes in which case they will be highlighted Affected Issues
0005122
mod - radiant/filters/BasicFilterSystem.cpp Diff File
mod - radiant/filters/BasicFilterSystem.h Diff File
mod - radiant/filters/InstanceUpdateWalker.h Diff File
add - radiant/filters/SelectByFilterWalker.h Diff File
mod - tools/msvc/DarkRadiant.vcxproj Diff File
mod - tools/msvc/DarkRadiant.vcxproj.filters Diff File

DarkRadiant: master 5ecb33eb

2020-03-29 14:30:04

greebo

Details Diff
0005122: Implement the DeselectObjectsByFilter command Affected Issues
0005122
mod - radiant/filters/BasicFilterSystem.cpp Diff File
mod - radiant/filters/BasicFilterSystem.h Diff File
mod - tools/msvc/DarkRadiant.vcxproj Diff File
mod - tools/msvc/DarkRadiant.vcxproj.filters Diff File

DarkRadiant: master 78dd0d8f

2020-03-29 18:13:46

greebo

Details Diff
0005122: Add ortho context menu entries to select/deselect by filter Affected Issues
0005122
mod - include/iorthocontextmenu.h Diff File
mod - radiant/Makefile.am Diff File
mod - radiant/filters/BasicFilterSystem.cpp Diff File
mod - radiant/filters/BasicFilterSystem.h Diff File
mod - radiant/ui/UserInterfaceModule.cpp Diff File
add - radiant/ui/filters/FilterContextMenu.cpp Diff File
add - radiant/ui/filters/FilterContextMenu.h Diff File
add - radiant/ui/filters/FilterOrthoContextMenuItem.cpp Diff File
add - radiant/ui/filters/FilterOrthoContextMenuItem.h Diff File
mod - radiant/ui/ortho/OrthoContextMenu.cpp Diff File
mod - tools/msvc/DarkRadiant.vcxproj Diff File
mod - tools/msvc/DarkRadiant.vcxproj.filters Diff File

DarkRadiant: master 2e5d2380

2020-03-29 18:17:01

greebo

Details Diff
0005122: Move FilterMenu class to ui/filters folder Affected Issues
0005122
mod - radiant/Makefile.am Diff File
mod - radiant/uimanager/UIManager.cpp Diff File
mod - tools/msvc/DarkRadiant.vcxproj Diff File
mod - tools/msvc/DarkRadiant.vcxproj.filters Diff File

DarkRadiant: master e7849252

2020-03-30 05:53:36

greebo

Details Diff
Minor refactoring Affected Issues
0005122
mod - radiant/filters/BasicFilterSystem.cpp Diff File
mod - radiant/filters/XMLFilter.h Diff File

DarkRadiant: master b216481b

2020-03-30 17:37:52

greebo

Details Diff
Move filter event management to separate helper class Affected Issues
0005122
mod - radiant/filters/BasicFilterSystem.cpp Diff File
mod - radiant/filters/BasicFilterSystem.h Diff File
mod - radiant/filters/XMLFilter.cpp Diff File
mod - radiant/filters/XMLFilter.h Diff File
add - radiant/filters/XmlFilterEventAdapter.h Diff File
mod - tools/msvc/DarkRadiant.vcxproj Diff File
mod - tools/msvc/DarkRadiant.vcxproj.filters Diff File

DarkRadiant: master 5c62786b

2020-03-31 02:41:00

greebo

Details Diff
Use shared_ptrs to store XMLFilter to avoid copying stuff around too much.
Some code cleanup.
Affected Issues
0005122
mod - radiant/filters/BasicFilterSystem.cpp Diff File
mod - radiant/filters/BasicFilterSystem.h Diff File
mod - radiant/filters/XMLFilter.h Diff File
mod - radiant/filters/XmlFilterEventAdapter.h Diff File

DarkRadiant: master 4540cf23

2020-03-31 03:25:58

greebo

Details Diff
0005122: Generate events to select/deselect objects by filter, such that shortcuts can be bound to it.
Refactor the toggle binding to use the same approach as the select/deselect commands.
Affected Issues
0005122
mod - radiant/Makefile.am Diff File
mod - radiant/filters/BasicFilterSystem.cpp Diff File
add - radiant/filters/XmlFilterEventAdapter.cpp Diff File
mod - radiant/filters/XmlFilterEventAdapter.h Diff File
mod - tools/msvc/DarkRadiant.vcxproj Diff File
mod - tools/msvc/DarkRadiant.vcxproj.filters Diff File

DarkRadiant: master 505608ac

2020-03-31 05:14:12

greebo

Details Diff
0005122: Add IEventManager::renameEvent method to avoid deleting and creating the event just to change its mapping.
Fix a consequential bug when saving filters due to the FiltersMenu not being safely deconstructed before renaming events.
Affected Issues
0005122
mod - include/ieventmanager.h Diff File
mod - radiant/eventmanager/EventManager.cpp Diff File
mod - radiant/eventmanager/EventManager.h Diff File
mod - radiant/filters/XmlFilterEventAdapter.cpp Diff File
mod - radiant/ui/filterdialog/FilterDialog.cpp Diff File

DarkRadiant: master 6b6398af

2020-04-01 04:30:09

greebo

Details Diff
0005122: Refactor IFilterVisitor to be a functor, replace some insert(std::make_pair()) calls with emplace. Affected Issues
0005122
mod - include/ifilter.h Diff File
mod - radiant/filters/BasicFilterSystem.cpp Diff File
mod - radiant/filters/BasicFilterSystem.h Diff File
mod - radiant/ui/filterdialog/FilterDialog.cpp Diff File
mod - radiant/ui/filters/FilterContextMenu.cpp Diff File
mod - radiant/ui/filters/FilterContextMenu.h Diff File
mod - radiant/ui/filters/FilterMenu.cpp Diff File
mod - radiant/ui/filters/FilterMenu.h Diff File
mod - radiant/ui/menu/FiltersMenu.cpp Diff File

DarkRadiant: master 8d56b55a

2020-04-01 18:56:22

greebo

Details Diff
0005122: Fix some warnings during module shutdown Affected Issues
0005122
mod - radiant/filters/BasicFilterSystem.cpp Diff File
mod - radiant/filters/XmlFilterEventAdapter.cpp Diff File

DarkRadiant: master f14869cc

2020-04-06 05:02:58

greebo

Details Diff
0005122 Remove unused local variables Affected Issues
0005122
mod - radiant/filters/BasicFilterSystem.cpp Diff File

DarkRadiant: master 1f70ccdb

2020-04-29 15:54:54

greebo

Details Diff
0005122: Don't select nodes that aren't visible Affected Issues
0005122
mod - radiant/filters/SetObjectSelectionByFilterWalker.h Diff File

DarkRadiant: master 16d2d84d

2020-04-30 03:41:28

greebo

Details Diff
0005122: Ignore any children of invisible nodes when selecting by filter. Affected Issues
0005122
mod - radiant/filters/SetObjectSelectionByFilterWalker.h Diff File

Issue History

Date Modified Username Field Change
11.01.2020 14:20 Dragofer New Issue
11.01.2020 14:26 Dragofer Description Updated View Revisions
11.01.2020 14:26 Dragofer Additional Information Updated View Revisions
11.01.2020 16:29 greebo Status new => acknowledged
29.03.2020 14:20 greebo Assigned To => greebo
29.03.2020 14:20 greebo Status acknowledged => assigned
29.03.2020 14:21 greebo Target Version => 2.8.0
29.03.2020 18:26 greebo Changeset attached => DarkRadiant master 2e5d2380
29.03.2020 18:26 greebo Changeset attached => DarkRadiant master 78dd0d8f
29.03.2020 18:27 greebo Changeset attached => DarkRadiant master 5ecb33eb
29.03.2020 18:27 greebo Changeset attached => DarkRadiant master 7b57cad1
29.03.2020 18:27 greebo Changeset attached => DarkRadiant master 0da2832e
29.03.2020 18:27 greebo Changeset attached => DarkRadiant master b3c70171
05.04.2020 14:57 greebo Changeset attached => DarkRadiant master 8d56b55a
05.04.2020 14:57 greebo Changeset attached => DarkRadiant master 6b6398af
05.04.2020 14:57 greebo Changeset attached => DarkRadiant master 505608ac
05.04.2020 14:57 greebo Changeset attached => DarkRadiant master 4540cf23
05.04.2020 14:57 greebo Changeset attached => DarkRadiant master 5c62786b
05.04.2020 14:57 greebo Changeset attached => DarkRadiant master e7849252
05.04.2020 14:58 greebo Changeset attached => DarkRadiant master b216481b
05.04.2020 15:00 greebo Status assigned => resolved
05.04.2020 15:00 greebo Resolution open => fixed
05.04.2020 15:00 greebo Fixed in Version => 2.8.0
05.04.2020 15:00 greebo Note Added: 0012332
06.04.2020 05:58 greebo Changeset attached => DarkRadiant master f14869cc
24.04.2020 11:54 Dragofer Assigned To greebo =>
24.04.2020 11:54 Dragofer Status resolved => feedback
24.04.2020 11:54 Dragofer Resolution fixed => reopened
24.04.2020 11:54 Dragofer Note Added: 0012380
24.04.2020 11:55 Dragofer Note Edited: 0012380 View Revisions
24.04.2020 14:03 greebo Note Added: 0012384
24.04.2020 21:47 Dragofer Note Added: 0012392
24.04.2020 21:47 Dragofer Status feedback => new
24.04.2020 21:48 Dragofer Assigned To => greebo
24.04.2020 21:48 Dragofer Status new => feedback
25.04.2020 04:13 greebo Note Added: 0012395
25.04.2020 09:48 Dragofer Relationship added related to 0005226
25.04.2020 14:44 Dragofer Status feedback => resolved
25.04.2020 14:44 Dragofer Resolution reopened => fixed
25.04.2020 16:07 Dragofer Status resolved => feedback
25.04.2020 16:07 Dragofer Resolution fixed => reopened
25.04.2020 16:07 Dragofer Note Added: 0012406
25.04.2020 16:08 Dragofer Note Added: 0012407
25.04.2020 16:08 Dragofer File Added: invert.map
25.04.2020 16:08 Dragofer Status feedback => assigned
25.04.2020 16:09 Dragofer Note Edited: 0012406 View Revisions
25.04.2020 16:10 Dragofer Status assigned => feedback
25.04.2020 16:10 Dragofer Note Edited: 0012406 View Revisions
29.04.2020 07:43 Dragofer Note Added: 0012431
29.04.2020 07:43 Dragofer Status feedback => assigned
29.04.2020 07:43 Dragofer Status assigned => feedback
29.04.2020 15:55 greebo Changeset attached => DarkRadiant master 1f70ccdb
29.04.2020 15:59 greebo Note Added: 0012432
29.04.2020 20:19 Dragofer Note Added: 0012433
29.04.2020 20:19 Dragofer Status feedback => assigned
29.04.2020 20:19 Dragofer Status assigned => feedback
30.04.2020 03:41 greebo Changeset attached => DarkRadiant master 16d2d84d
30.04.2020 03:43 greebo Note Added: 0012434
02.05.2020 16:36 Dragofer Status feedback => resolved
02.05.2020 16:36 Dragofer Resolution reopened => fixed
02.05.2020 16:36 Dragofer Note Added: 0012445
08.11.2020 18:41 greebo Status resolved => closed