Добрый день.
Подскажите, пожалуйста, есть ли возможность в SVG-панели реализовать поведение RANGE-type управления?
Типа такого:
Хочу сделать примерно такой GUI для диммера:
Добрый день.
Подскажите, пожалуйста, есть ли возможность в SVG-панели реализовать поведение RANGE-type управления?
Типа такого:
Хочу сделать примерно такой GUI для диммера:
Добрый день.
То есть нажатие (щелчок) на одну стрелочку инкрментит а на вторую - декрементит значение? Да, можно, описав правилом.
@BrainRoot, cпасибо. Нашёл пример. Разобрался. Работает.
Вопрос в развитие темы. Как я понял, события создаются по отпусканию кнопки. Тогда есть ли возможность реализации поведения holding-dimmer’a? Т.е. пока держим кнопку, значение изменяется с заданной скоростью; отпускаем - изменение прекращается. Можно, конечно, создавать таймер при нажатии и останавливать его при следующем нажатии. А можно ли создавать при нажатии и останавливать при отпускании?
(Поясню. Хочу сделать графический интерфейс на SVG для HMI-панели. Понятно, что можно диммировать множественными нажатиями на соответствующую кнопку, но хотелось бы удержанием, как у физического диммера)
Попробуйте сделать вспомогательный топик инкрементации, правило при его срабатывании и повесьте на него длинное нажатие

Подскажите пожалуйста как это делается?
А пример от пользователя не подошёл?
У меня немного другая задача, мне просто нужно две кнопки, одна при нажатии инкрементирует, другая декрементирует, проблема в том что у меня нет понимания куда писать правило и тд, если подскажете, буду очень признателен
Думаю, пример вам подойдёт. Куда писать правила, можно почитать в документации по wb-rules.
Да спасибо, разобрался
Получилось сделать?
Глянул - функции типов: whenChanged, asSoonAs, when все работают по отжатию кнопки.
Даже интересно стало, а как нужно.)
whenChanged использовал, вроде по нажатию срабатывает
Нет, если говорить про кнопку pushbutton, в веб-интерфейсе то она не генерирует событие отпускания, вообще.
defineVirtualDevice('up_down', {
title: 'Up Down Value',
cells: {
whenChanged: {
title: 'whenChanged',
type: 'pushbutton',
order: 2,
},
when: {
title: 'when',
type: 'pushbutton',
order: 3,
},
asSoonAs: {
title: 'asSoonAs',
type: 'pushbutton',
order: 3,
},
},
});
defineRule('test_whenChanged', {
whenChanged: ['up_down/whenChanged'],
then: function (newValue, devName, cellName) {
log('click whenChanged');
},
});
defineRule({
when: function() {
return dev["up_down/when"]; // правило сработает, когда значение параметра изменится на истинное
},
then: function (newValue, devName, cellName) {
log('click when');
}
});
defineRule({
asSoonAs: function() {
return dev["up_down/asSoonAs"]; // правило сработает, когда значение параметра изменится на истинное
},
then: function (newValue, devName, cellName) {
log("Click asSoonAs");
dev["up_down/asSoonAs"] = !dev["up_down/asSoonAs"];
}
});
2024-07-12 13-14-25_cut.mkv (789,9 КБ)
А, да, я понял, не очень верно сформулировал. Я про то что нет отдельного события "нажатие " и “отпускание”.
То есть нельзя сделать например “длинное” нажатие на кнопку.
Понял, спасибо!
Так это от меня пример ![]()
Да, подошёл, если диммировать множественными нажатиями (т.е. одно нажатие изменяет яркость на один “шаг”).
Но хотелось бы сделать, как у физического диммера: нажали - началось изменение в нужную сторону с нужным шагом: отпустили - изменение прекратилось.
т.е. в svg не получится сэмулировать поведение физического диммера?
Нет, не получится. По крайней мере в текущей реализации.
Можно попробовать сделать следующие решения:
Но мне кажется, что достаточно найти пару используемых сценариев и сделать под каждый свою кнопку.
Извините, был не прав.
У svg есть событие “долгий клик”, на него вешаем функцию приращения значения.
На обычный клик (который срабатывает при отпускании) мы вешаем остановку приращения.
Пока что потестировал с пищалкой - работает.
defineVirtualDevice("test_buzzer", {
title: "Test Buzzer",
cells: {
enabled: {
type: "switch",
value: false
},
disabled: {
type: "pushbutton",
value: false
}
}
});
defineRule({
whenChanged: "test_buzzer/enabled",
then: function (newValue, devName, cellName) {
dev["buzzer/enabled"] = dev["test_buzzer/enabled"];
}
});
defineRule({
whenChanged: "test_buzzer/disabled",
then: function (newValue, devName, cellName) {
if (dev["test_buzzer/disabled"] == true)
{
dev["test_buzzer/enabled"] = false;
}
}
});