Skip to content

Filters buttons #10

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

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
169 changes: 122 additions & 47 deletions src/GToolkit-Coder-UI/GtFiltersElement.class.st
Original file line number Diff line number Diff line change
Expand Up @@ -11,26 +11,51 @@ Class {
#category : #'GToolkit-Coder-UI-Filters'
}

{ #category : #private }
{ #category : #accessing }
GtFiltersElement >> addAllDefaults [
| filterElement defaultDescriptors |

defaultDescriptors := self descriptors select: [ :each | each showAsDefaultWhenEmpty ].
defaultDescriptors
do: [ :defaultDescriptor |
defaultDescriptors := self descriptors
select: [:each | each showAsDefaultWhenEmpty].
defaultDescriptors do:
[:defaultDescriptor |
filterElement := self createFilterTagFor: defaultDescriptor.
filterElement makeDefaultFilter.
self addChild: filterElement at: self nextTagPosition]
]

self addChild: filterElement at: self childrenCount ]
{ #category : #accessing }
GtFiltersElement >> addFilterButtonFor: descriptor label: label icon: icon [
^ BrButton new
aptitude: self defaultAptitude;
icon: icon;
label: label;
margin: (BlInsets all: 2);
beSmallSize;
hExact: 20;
constraintsDo: [ :c | c flow vertical alignCenter ];
action: [ :aButton |
(self filtersWithDescriptor: descriptor)
ifEmpty: [ self addFilterForDescriptor: descriptor andValue: '' ]
ifNotEmpty: [ :coll | coll do: [ :e | self removeChild: e ] ].
self applyFilters ]
]

{ #category : #accessing }
GtFiltersElement >> addFilterForDescriptor: aFilterDescriptor andValue: aString [
| element |
element := self createFilterTagFor: aFilterDescriptor.
aFilterDescriptor valueIsRequired
ifTrue: [ element valueString: aString ].
self addChild: element at: self childrenCount
aFilterDescriptor valueIsRequired ifTrue: [element valueString: aString].
self addChild: element at: self nextTagPosition
]

{ #category : #accessing }
GtFiltersElement >> additionalDefaultButtons [
| sortedPragmas |
sortedPragmas := (Pragma allNamed: #gtFilterElement: in: self class)
sort: [ :aPragma | aPragma arguments first ] ascending
, [ :aPragma | aPragma methodSelector ] ascending.
^ (sortedPragmas collect: [ :e | self perform: e methodSelector ])
reject: [ :e | e isNil ]
]

{ #category : #private }
Expand All @@ -43,11 +68,11 @@ GtFiltersElement >> applyFiltersDueTo: aReason [
self fireEvent: (GtFiltersChangedEvent new filterElement: self; reason: aReason)
]

{ #category : #private }
{ #category : #accessing }
GtFiltersElement >> areAllDefaults [
^ self childrenCount > 1
and: [ (1 to: self childrenCount - 1)
allSatisfy: [ :index | (self childAt: index) isDefaultAllFilter ] ]
^self childrenCount > self defaultButtonCount and:
[(1 to: self childrenCount - self defaultButtonCount)
allSatisfy: [:index | (self childAt: index) isDefaultAllFilter]]
]

{ #category : #'api - filters' }
Expand All @@ -70,11 +95,11 @@ GtFiltersElement >> buildFilters: aBlock [
aBlock value
]

{ #category : #'api - filters' }
{ #category : #accessing }
GtFiltersElement >> clearFilters [
"Remove all filters"

[ self childrenCount > 1 ] whileTrue: [ self removeChildAt: 1 ]
[self childrenCount > self defaultButtonCount]
whileTrue: [self removeChildAt: 1]
]

{ #category : #'private - instance creation' }
Expand All @@ -88,19 +113,40 @@ GtFiltersElement >> createFilterTagFor: aFilterDescription [
{ #category : #private }
GtFiltersElement >> createNewTag [
| tag |
self descriptors
ifNotEmpty: [ :items |
self descriptors ifNotEmpty:
[:items |
"self areAllDefaults ifTrue: [ self clearFilters ]."
tag := self createFilterTagFor: items first.
self addChild: tag at: self childrenCount.
tag activateEditor ]
self addChild: tag at: self nextTagPosition.
tag activateEditor]
]

{ #category : #'api - filters' }
GtFiltersElement >> currentFilters [
^ Array streamContents: [ :aStream | self filtersDo: [ :eachFilter :eachValue | aStream nextPut: (eachFilter -> eachValue) ] ]
]

{ #category : #'private - instance creation' }
GtFiltersElement >> defaultAptitude [
^ BrGlamorousButtonRectangularAptitude new + BrGlamorousButtonIconAptitude new
+ BrGlamorousButtonWithLabelTooltipAptitude new
+ (BrStyleCommonAptitude new
default: [ :aStyle |
aStyle
border: BlBorder empty;
background: self theme status neutralBackgroundColor ];
hovered: [ :aStyle | aStyle background: self theme status neutralBackgroundColor darker ];
pressed: [ :aStyle | aStyle background: self theme status neutralBackgroundColor darker darker ];
focused: [ :aStyle | aStyle border: (BlBorder paint: self theme editor focusedBorderColor width: 1) ])
]

{ #category : #accessing }
GtFiltersElement >> defaultButtonCount [
| addButton |
addButton := self childWithId: GtFiltersAddButtonId.
^ self childrenCount - (self childIndexOf: addButton) + 1
]

{ #category : #accessing }
GtFiltersElement >> descriptors [
^ (descriptors isBlock ifTrue: [ descriptors value ] ifFalse: [ descriptors ])
Expand All @@ -110,23 +156,53 @@ GtFiltersElement >> descriptors [
{ #category : #accessing }
GtFiltersElement >> descriptors: aCollection [
descriptors := aCollection.

BlFrameTelemetry
time: [ 'Add default filter tag' ]
during: [ self addAllDefaults ]
during: [ self addAllDefaults ].

self updateAdditionalFilters
]

{ #category : #'api - filters' }
GtFiltersElement >> filtersDo: aBlock [
"Iterate over all valid filters"
1 to: self childrenCount - self defaultButtonCount
do:
[:i |
| filterTagElement |
filterTagElement := self childAt: i.
filterTagElement isValid
ifTrue:
[aBlock value: filterTagElement descriptor
value: filterTagElement valueString]]
]

1 to: self childrenCount - 1 do: [ :i |
| filterTagElement |
filterTagElement := self childAt: i.
filterTagElement isValid
ifTrue: [ aBlock
value: filterTagElement descriptor
value: filterTagElement valueString ] ]
{ #category : #accessing }
GtFiltersElement >> filtersWithDescriptor: aDescriptor [
| result |
result := OrderedCollection new.
1
to: self childrenCount - self defaultButtonCount
do: [ :i |
| filterTagElement |
filterTagElement := self childAt: i.
filterTagElement descriptor = aDescriptor
ifTrue: [ result add: filterTagElement ] ].
^ result
]

{ #category : #accessing }
GtFiltersElement >> gtTestFilter [
<gtFilterElement: 10>
| descriptor |
descriptor := self descriptors
detect: [ :e | e name = 'Instance methods' ]
ifNone: [ ^ nil ].
^ self
addFilterButtonFor: descriptor
label: 'Add instance methods filter'
icon: BrGlamorousVectorIcons emphasizedInspect
]

{ #category : #'gt - extensions' }
Expand All @@ -149,37 +225,36 @@ GtFiltersElement >> initialize [
super initialize.
self hMatchParent.
self vFitContent.
self addChild: self newAddTagButton
self addChild: self newAddTagButton.
self updateAdditionalFilters
]

{ #category : #'private - instance creation' }
GtFiltersElement >> newAddTagButton [
^ BrButton new
id: GtFiltersAddButtonId;
aptitude:
BrGlamorousButtonRectangularAptitude new
+ BrGlamorousButtonIconAptitude new
+ BrGlamorousButtonWithLabelTooltipAptitude new
+ (BrStyleCommonAptitude new
default: [ :aStyle |
aStyle
border: BlBorder empty;
background: self theme status neutralBackgroundColor ];
hovered: [ :aStyle |
aStyle background: self theme status neutralBackgroundColor darker ];
pressed: [ :aStyle |
aStyle background: self theme status neutralBackgroundColor darker darker ];
focused: [ :aStyle |
aStyle border: (BlBorder paint: self theme editor focusedBorderColor width: 1) ]);
aptitude: self defaultAptitude;
icon: BrGlamorousVectorIcons add;
label: 'Add Filter';
margin: (BlInsets all: 2);
beSmallSize;
hExact: 20;
constraintsDo: [ :c | c flow vertical alignCenter ];
action: [ :aButton | self createNewTag ];
addShortcut:
(BlShortcutWithAction new
addShortcut: (BlShortcutWithAction new
combination: BlKeyCombination enter;
action: [ :anEvent | self createNewTag ])
]

{ #category : #accessing }
GtFiltersElement >> nextTagPosition [
^self childrenCount - self defaultButtonCount + 1
]

{ #category : #accessing }
GtFiltersElement >> updateAdditionalFilters [
[ self defaultButtonCount > 1 ]
whileTrue: [ self removeChildAt: self childrenCount - 1 ].

self additionalDefaultButtons do: [ :e | self addChild: e ]
]