Skip to content

Commit

Permalink
Merge pull request #5429 from quincylvania/relation-membership-highli…
Browse files Browse the repository at this point in the history
…ghting

Adds hover-highlighting for relations in the raw membership list
  • Loading branch information
bhousel committed Oct 27, 2018
2 parents dc81883 + 1161767 commit 0570956
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 11 deletions.
11 changes: 5 additions & 6 deletions modules/ui/raw_member_editor.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ import { uiDisclosure } from './disclosure';
import {
utilDisplayName,
utilDisplayType,
utilNoAuto
utilNoAuto,
utilHighlightEntity
} from '../util';


Expand All @@ -37,8 +38,7 @@ export function uiRawMemberEditor(context) {
context.map().zoomTo(entity);

// highlight the feature in case it wasn't previously on-screen
var selectorPrefix = d.type === 'node' ? 'g.' : 'path.';
context.surface().selectAll(selectorPrefix+d.id).classed('highlighted', true);
utilHighlightEntity(d.id, true, context);
}


Expand Down Expand Up @@ -135,12 +135,11 @@ export function uiRawMemberEditor(context) {
if (d.member) {

// highlight the member feature in the map while hovering on the list item
var selectorPrefix = d.type === 'node' ? 'g.' : 'path.';
d3_select(this).on('mouseover', function() {
context.surface().selectAll(selectorPrefix+d.id).classed('highlighted', true);
utilHighlightEntity(d.id, true, context);
});
d3_select(this).on('mouseout', function() {
context.surface().selectAll(selectorPrefix+d.id).classed('highlighted', false);
utilHighlightEntity(d.id, false, context);
});

var label = d3_select(this).append('label')
Expand Down
12 changes: 11 additions & 1 deletion modules/ui/raw_membership_editor.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ import { osmEntity, osmRelation } from '../osm';
import { services } from '../services';
import { svgIcon } from '../svg';
import { uiDisclosure } from './disclosure';
import { utilDisplayName, utilNoAuto } from '../util';
import { utilDisplayName, utilNoAuto, utilHighlightEntity } from '../util';


export function uiRawMembershipEditor(context) {
Expand Down Expand Up @@ -173,6 +173,16 @@ export function uiRawMembershipEditor(context) {
.append('li')
.attr('class', 'member-row member-row-normal form-field');

enter.each(function(d){
// highlight the relation in the map while hovering on the list item
d3_select(this).on('mouseover', function() {
utilHighlightEntity(d.relation.id, true, context);
});
d3_select(this).on('mouseout', function() {
utilHighlightEntity(d.relation.id, false, context);
});
});

var label = enter
.append('label')
.attr('class', 'form-label')
Expand Down
7 changes: 3 additions & 4 deletions modules/ui/selection_list.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { t } from '../util/locale';
import { modeSelect } from '../modes';
import { osmEntity } from '../osm';
import { svgIcon } from '../svg';
import { utilDisplayName } from '../util';
import { utilDisplayName, utilHighlightEntity } from '../util';


export function uiSelectionList(context, selectedIDs) {
Expand Down Expand Up @@ -70,12 +70,11 @@ export function uiSelectionList(context, selectedIDs) {
enter
.each(function(d) {
// highlight the feature in the map while hovering on the list item
var selectorPrefix = d.type === 'node' ? 'g.' : 'path.';
d3_select(this).on('mouseover', function() {
context.surface().selectAll(selectorPrefix+d.id).classed('highlighted', true);
utilHighlightEntity(d.id, true, context);
});
d3_select(this).on('mouseout', function() {
context.surface().selectAll(selectorPrefix+d.id).classed('highlighted', false);
utilHighlightEntity(d.id, false, context);
});
});

Expand Down
2 changes: 2 additions & 0 deletions modules/util/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,14 @@ export { utilDisplayType } from './util';
export { utilEditDistance } from './util';
export { utilEntitySelector } from './util';
export { utilEntityOrMemberSelector } from './util';
export { utilEntityOrDeepMemberSelector } from './util';
export { utilFastMouse } from './util';
export { utilFunctor } from './util';
export { utilGetAllNodes } from './util';
export { utilGetPrototypeOf } from './util';
export { utilGetSetValue } from './get_set_value';
export { utilHashcode } from './util';
export { utilHighlightEntity } from './util';
export { utilIdleWorker } from './idle_worker';
export { utilNoAuto } from './util';
export { utilPrefixCSSProperty } from './util';
Expand Down
33 changes: 33 additions & 0 deletions modules/util/util.js
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,32 @@ export function utilEntityOrMemberSelector(ids, graph) {
}


export function utilEntityOrDeepMemberSelector(ids, graph) {
var seen = {};
var allIDs = [];
function addEntityAndMembersIfNotYetSeen(id) {
// avoid infinite recursion for circular relations by skipping seen entities
if (seen[id]) return;
// mark the entity as seen
seen[id] = true;
// add the id;
allIDs.push(id);
if (graph.hasEntity(id)) {
var entity = graph.entity(id);
if (entity.type === 'relation' && entity.members) {
entity.members.forEach(function(member){
addEntityAndMembersIfNotYetSeen(member.id);
});
}
}
}
ids.forEach(function(id) {
addEntityAndMembersIfNotYetSeen(id);
});
return utilEntitySelector(allIDs);
}


export function utilGetAllNodes(ids, graph) {
var seen = {};
var nodes = [];
Expand Down Expand Up @@ -282,3 +308,10 @@ export function utilHashcode(str) {
}
return hash;
}

// Adds or removes highlight styling for the specified entity's SVG elements in the map.
export function utilHighlightEntity(id, highlighted, context) {
context.surface()
.selectAll(utilEntityOrDeepMemberSelector([id], context.graph()))
.classed('highlighted', highlighted);
}

0 comments on commit 0570956

Please sign in to comment.