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

Right click identification #839

Open
wants to merge 16 commits into
base: rgis-develop
Choose a base branch
from
114 changes: 110 additions & 4 deletions addon/components/flexberry-map.js
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,31 @@ let FlexberryMapComponent = Ember.Component.extend(
'fadeAnimation', 'zoomAnimation', 'zoomAnimationThreshold', 'markerZoomAnimation'
],

/**
Map tool that should be enabled when right clicking

@property rightClickToolName
@type String
@default null
*/
rightClickToolName: null,
Copy link
Contributor

Choose a reason for hiding this comment

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

Давай поставим значение по умолчанию зачем издеваться над прикладными проектами, и заставлять гадать, если у нас пока по сути один инструмент предполагается?)
Возможность переопределения - это отлично. но вот необходимость гадать - это уже плохо.

Copy link
Contributor Author

@viatkinviatkin viatkinviatkin Apr 24, 2024

Choose a reason for hiding this comment

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

Исправил, всё тут

export default Ember.Service.extend({
/**
Flag: indicates whether tool is performed when right-clicking on map.
@property isRightClickToolAvailable
@type Bool
@default false
*/
isRightClickToolAvailable: false,
/**
Map tool that should be enabled when right clicking
@property rightClickToolName
@type String
@default 'identify-visible-rectangle'
*/
rightClickToolName: 'identify-visible-rectangle',


/**
Identification map tool options

@property rightClickToolProperties
@type Object
@default null
*/
rightClickToolProperties: null,

/**
List of available tools for switching to identification mode using the right click and saving active state of working tool
@property rightClickAvailiblePrevMapTools
@type String []
*/
rightClickAvailiblePrevMapTools: [],
Copy link
Contributor

Choose a reason for hiding this comment

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

И тут тоже можно значение по умолчанию задать. хотя бы тот же drag и zoom-in/zoom-out

Copy link
Contributor Author

@viatkinviatkin viatkinviatkin Apr 24, 2024

Choose a reason for hiding this comment

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

Исправил, всё тут

export default Ember.Service.extend({
/**
Flag: indicates whether tool is performed when right-clicking on map.
@property isRightClickToolAvailable
@type Bool
@default false
*/
isRightClickToolAvailable: false,
/**
Map tool that should be enabled when right clicking
@property rightClickToolName
@type String
@default 'identify-visible-rectangle'
*/
rightClickToolName: 'identify-visible-rectangle',
/**
Right click map tool options
@property rightClickToolProperties
@type Object
@default null
*/
rightClickToolProperties: null,


/**
List of leaflet map properties bindings.
*/
Expand All @@ -143,6 +168,8 @@ let FlexberryMapComponent = Ember.Component.extend(
*/
lat: null,

maptoolOptionsService: Ember.inject.service('maptool-options'),

/**
Map center longitude.

Expand Down Expand Up @@ -503,6 +530,10 @@ let FlexberryMapComponent = Ember.Component.extend(

// Store map's container as jQuery object.
let $leafletContainer = this.$();

// Выключаем стандартный обработчик ПКМ для контейнера карты
$leafletContainer.on('contextmenu', (e) => e.preventDefault());

this.set('_$leafletContainer', $leafletContainer);

let options = this.get('options');
Expand All @@ -513,20 +544,95 @@ let FlexberryMapComponent = Ember.Component.extend(
if (this.get('mainMap')) {
leafletMap.mainMap = true;
L.DomEvent.on(leafletMap, 'mousedown mouseup mousein mouseout', (e) => {
// Обработка ПКМ: Включение инструмента идентификации типа "Прямоугольник"
// При mouseDown включение, создание вершины, переключение в draggable-состояние для задания области идентификации
// При mouseUp идентификация, переключение инструмента
if (e.originalEvent.button === 2) {
DaryaNeko marked this conversation as resolved.
Show resolved Hide resolved
if (!this.get('maptoolOptionsService.identifyOnRightClick')) {
return;
}

// ПКМ обработчик карты пока умеет работать только с identify-visible-rectangle
// this.rightClickToolProperties должен содержать перечень слоев для идентификации
if (this.get('rightClickToolName') !== 'identify-visible-rectangle' || !this.get('rightClickToolProperties')) {
Copy link
Contributor

Choose a reason for hiding this comment

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

давай все таки тут имя зашивать не будем, иначе какой смысл от того, что мы дали его определять? пусть будет на совести прикладного разработчика

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Исправил

return;
}

if (e.type === 'mousedown') {
let rightClickAvailiblePrevMapTools = this.get('rightClickAvailiblePrevMapTools');
let savePrevEnabledTool = rightClickAvailiblePrevMapTools.includes(leafletMap.flexberryMap.tools.getEnabled().name);

// Сохраняем предыдущий инструмент из списка "включаемых" инструментов
if (savePrevEnabledTool) {
DaryaNeko marked this conversation as resolved.
Show resolved Hide resolved
this.set('prevEnabledTools', {
name: leafletMap.flexberryMap.tools.getEnabled().name,
mapToolProperties: leafletMap.flexberryMap.tools.getEnabled().mapToolProperties
});
}

// Включаем инструмент идентификации
let identifyTool = leafletMap.flexberryMap.tools.enable(this.get('rightClickToolName'), this.get('rightClickToolProperties'));
let identifyEditTools = Ember.get(identifyTool, '_editTools');

// Инициируем нажатие ЛКМ для создания стартовой точки и перехода в состояние "перетаскивание" инструмента
let newMouseDownEvent = new MouseEvent('mousedown');
identifyEditTools.onMousedown({
latlng: e.latlng,
originalEvent: newMouseDownEvent
});
}

if (e.type === 'mouseup') {
let currentMapTool = leafletMap.flexberryMap.tools.getEnabled();

if (Ember.get(currentMapTool, 'name') === this.get('rightClickToolName')) {
let identifyEditTools = Ember.get(currentMapTool, '_editTools');

if (!Ember.isNone(identifyEditTools)) {
identifyEditTools.stopDrawing();
}
}

if (!Ember.isNone(this.get('prevEnabledTools'))) {
leafletMap.flexberryMap.tools.enable(this.get('prevEnabledTools.name'), this.get('prevEnabledTools.mapToolProperties'));
} else {
leafletMap.flexberryMap.tools.enable('drag');
}

this.set('prevEnabledTools', null);
}

return;
}

// Обработка средней клавиши мыши: возможность перетаскивания карты из любого рабочего инструмента
// При mouseDown включение инструмента "рука"
// При mouseUp переключение обратно в рабочий инструмент
if (e.originalEvent.button === 1) {
if (e.type === 'mousedown') {
e.originalEvent.preventDefault();
let enabledTools = {

this.set('prevEnabledTools', {
name: leafletMap.flexberryMap.tools.getEnabled().name,
mapToolProperties: leafletMap.flexberryMap.tools.getEnabled().mapToolProperties
};
this.set('prevEnabledTools', enabledTools);
});

leafletMap.flexberryMap.tools.enable('drag');
} else {
leafletMap.flexberryMap.tools.enable(this.get('prevEnabledTools.name'), this.get('prevEnabledTools.mapToolProperties'));
this.set('prevEnabledTools', null);
}
} else if (!Ember.isNone(this.get('prevEnabledTools'))) {

return;
}

// Обработка ЛКМ: перезагрузить рабочий инструмент
// Если во время работы инструмента что-то пошло не так (двойной клик, одновременный клик лкм+пкм, выход за границы рабочей области)
if (e.originalEvent.button === 0) {
if (Ember.isNone(this.get('prevEnabledTools'))) {
return;
}

leafletMap.flexberryMap.tools.enable(this.get('prevEnabledTools.name'), this.get('prevEnabledTools.mapToolProperties'));
this.set('prevEnabledTools', null);
}
Expand Down
9 changes: 9 additions & 0 deletions addon/map-tools/identify.js
Original file line number Diff line number Diff line change
Expand Up @@ -404,6 +404,15 @@ export default BaseNonclickableMapTool.extend({
if (!Ember.isNone(editTools)) {
editTools.off('editable:drawing:mousedown', this._drawingStart, this);
editTools.off('editable:drawing:end', this._drawingDidEnd, this);

if (editTools.drawing()) {
let feature = editTools._drawingEditor ? editTools._drawingEditor.feature : null;
if (feature) {
feature.disableEdit();
feature.remove();
}
}

editTools.stopDrawing();
}
},
Expand Down
18 changes: 0 additions & 18 deletions addon/mixins/geom-only-map-tool.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,23 +25,5 @@ export default Ember.Mixin.create({

// а работаем в любом случае с workingPolygon
leafletMap.fire('flexberry-map:geomChanged', { wkt: workingPolygon.toEWKT(L.CRS.EPSG4326) });
},

_disableDraw() {
let editTools = this.get('_editTools');
if (!Ember.isNone(editTools)) {
editTools.off('editable:drawing:mousedown', this._drawingStart, this);
editTools.off('editable:drawing:end', this._drawingDidEnd, this);

if (editTools.drawing()) {
let feature = editTools._drawingEditor ? editTools._drawingEditor.feature : null;
if (feature) {
feature.disableEdit();
feature.remove();
}
}

editTools.stopDrawing();
}
}
});
13 changes: 13 additions & 0 deletions addon/services/maptool-options.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import Ember from 'ember';

export default Ember.Service.extend({

/**
Flag: indicates whether identification is performed when right-clicking on map.

@property identifyOnRightClick
@type Bool
@default false
*/
identifyOnRightClick: false,
});
1 change: 1 addition & 0 deletions app/services/maptool-options.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from 'ember-flexberry-gis/services/maptool-options';
Loading