diff --git a/src/GToolkit-Coder-UI/GtFiltersElement.class.st b/src/GToolkit-Coder-UI/GtFiltersElement.class.st index caaebcdd1..d8f2dfacc 100644 --- a/src/GToolkit-Coder-UI/GtFiltersElement.class.st +++ b/src/GToolkit-Coder-UI/GtFiltersElement.class.st @@ -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 } @@ -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' } @@ -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' } @@ -88,12 +113,12 @@ 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' } @@ -101,6 +126,27 @@ 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 ]) @@ -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 [ + + | 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' } @@ -149,28 +225,15 @@ 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); @@ -178,8 +241,20 @@ GtFiltersElement >> newAddTagButton [ 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 ] +]