DGrid: обработка onDoubleClick на строке
Разбор
Наткнулся на StackOverflow на вопрос, который давно мучил и меня самого: как в dgrid обрабатывать двойной клик по строке? Встроенного обработчика события onDblClick
в классах библиотеки не было, поэтому я решил посмотреть, можно ли что-то сделать с помощью подручных средств.
Посмотрев код библиотеки, я обнаружил, что у класса Grid
есть методы row()
и cell()
, возвращающие информацию о строке и ячейке соответственно при передаче в качестве параметра события, которое произошло в таблице. Главная сложность была в определении того, на что ставить обработчик. Понятно, что для тысяч строк нельзя вешать onClick()
на каждую строку. В этом случае на контейнер вешают один единственный обработчик, который смотрит на то, от кого пришло событие, и уже тогда что-то делает. Всё оказалось не так уж сложно.
define([
"dojo/_base/declare",
"dojo/_base/lang",
"dgrid/Grid"
], function(declare, lang, Grid){
return declare(Grid, {
onDblClick: function(){
/* Функция-пустышка, которая должна быть заменена на настоящую в классах,
унаследованных от этого. Тут должна быть какая-то работа с переданным
объектом, состоящим из трех полей:
- id - id записи, если есть
- data - полный объект из связанного с таблицей Store
- element - DOM-элемент, на котором случился двойной клик */
},
_onDblClick: function(event){
/* Вызываем onDblClick, передав "чистый" объект с параметрами. Обычно тут
разработчики Dojo Toolkit рекомендуют дополнительно вызывать on.emit с
необходимыми параметрами. На случай, если кто-то ещё должен слушать
события, происходящие в таблице, и как-то на них реагировать */
this.onDblClick(this.row(event));
}, // _onDblClick
postCreate: function(){
// Установка обработчиков на построенную DOM-модель таблицы
this.inherited(arguments);
this.on(".dgrid-content .dgrid-row:dblclick", lang.hitch(this, "_onDblClick"));
} // postCreate
}); // declare
}); //define
Можно пойти дальше и создать класс-расширение, раз уж в Dojo реализовано множественное наследование. Если что, это рекомендуемый способ расширения функционала классов и каноничный подход к написанию плагинов.
Комментарии в исходном коде
Устал искать, в каком месте удалил лишнюю скобку. Устал определять по отступу, где закончился цикл или if
. Поэтому сейчас пишу код примерно так:
define([
/*
* Главное меню приложения.
* Обработчики событий должны устанавливаться в классе Application.
*/
"dojo/_base/array", // array.forEach в одном месте
"dojo/_base/declare",
"dijit/DropDownMenu",
"dijit/MenuBar",
"dijit/MenuBarItem",
"dijit/MenuItem",
"dijit/PopupMenuBarItem"
], function(
array,
declare,
DropDownMenu
MenuBar,
MenuBarItem,
MenuItem,
PopupMenuBarItem
){
// Создает пункт главного меню с DropDown'ом
function createMenuBarItem(label){
return new PopupMenuBarItem({
label: label,
popup: new DropDownMenu({})
});
} // createMenuBarItem
return declare(MenuBar, {
buildRendering: function(){
this.inherited(arguments);
// Какой-то код...
this.fileMenu = createMenuBarItem("Файл");
this.editMenu = createMenuBarItem("Правка");
this.dictsMenu = createMenuBarItem("Справочники");
array.forEach([
this.fileMenu,
this.editMenu,
this.dictsMenu
], this.addChild, this); // forEach
} // buildRendering
}); // declare
}); // define
Если вкратце, то я просто пишу после закрывающих скобок, что именно они закрывают - конец цикла, тела функции, массива и т. д. Подсмотрел такое в исходном коде одного сайта, там верстальщик в комментариях указывал границы логических блоков - хедер, футер, тело страницы, панель навигации и т. д.
Debian Buster, SecureBoot и Nvidia RTX 2070
Условия задачи
Дано:
- Ошибка Xorg в логах:
May 7 16:21:42 darktower kernel: [ 5.572986] Lockdown: ioperm is restricted; see https://wiki.debian.org/SecureBoot
- Debian 10 Booster с подключенными репозиториями
non-free
иcontrib
. - Права
root
- Видеокарта NVidia RTX 2070
- Компьютер с включенной в настройках материнской платы опцией
SecureBoot (EFI)
Проблема в том, что в ряде случаев видеокарта может не запускаться, потому что драйверы не подписаны. Для подписания драйверов следует выполнить действия, описанные в Wiki Debian / SecureBoot.
В моём случае пришлось выполнить следующую последовательность действий:
Установка драйвера Nvidia, исходных кодов ядра и mokutil
apt-get update
apt-get install nvidia-driver nvidia-xconfig linux-headers-amd64 mokutil
Пакет | Предназначение |
---|---|
nvidia-driver | Проприетарный драйвер Nvidia с поддержкой нужных моделей видеокарт. |
nvidia-xconfig | Утилита конфигурирования параметров Xorg для поддержки им нужных драйверов. |
linux-headers-amd64 | Исходные коды установленного ядра. |
mokutil | Утилита для работы с ключами EFI |
Генерация ключа EFI, его установка и подписывание драйверов.
Теперь действуем ровно так, как написано в руководстве Debian'а:
# Генерация ключей и импорт в EFI
cd /root
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=NVidia RTX 2070 key/"
mokutil --import MOK.der
# Подписывание драйверов Nvidia
cd /lib/modules/4.19.0-8-amd64/updates/dkms/
/usr/lib/linux-kbuild-4.19/scripts/sign-file sha256 /root/MOK.priv /root/MOK.der nvidia-current-drm.ko
/usr/lib/linux-kbuild-4.19/scripts/sign-file sha256 /root/MOK.priv /root/MOK.der nvidia-current.ko
/usr/lib/linux-kbuild-4.19/scripts/sign-file sha256 /root/MOK.priv /root/MOK.der nvidia-current-modeset.ko
/usr/lib/linux-kbuild-4.19/scripts/sign-file sha256 /root/MOK.priv /root/MOK.der nvidia-current-uvm.ko
# Перенастройка Xorg под nvidia
cd /etc/X11
rm xorg.conf
nvidia-xconfig
Следует обратить внимание на путь, в котором расположены исходные модули ядра nvidia и скрипт для подписывания драйверов - они могут быть другими.
Перезагрузка
При перезагруке EFI выдаст сообщение, что появился запрос на установку собственного ключа цифровой подписи. Принимаем этот ключ и устанавливаем. После этого компьютер должен перезагрузиться и запустить установленный Linux, используя подписанные данным ключом драйверы. После этого запустится Xorg и всё будет нормально работать.
Автоматизация подписывания ключей.
Можно автоматизировать процесс по максимуму, если ручной выбор исходников ядра переключить на работу с результатами команды uname -r
и поместить всё в файл скрипта:
#!/bin/sh
SIGN=/usr/lib/linux-kbuild-4.19/scripts/sign-file
MOK=/root/MOK.priv
DER=/root/MOK.der
cd /lib/modules/$(uname -r)/updates/dkms/
$SIGN sha256 $MOK $DER nvidia-current-drm.ko
$SIGN sha256 $MOK $DER nvidia-current.ko
$SIGN sha256 $MOK $DER nvidia-current-modeset.ko
$SIGN sha256 $MOK $DER nvidia-current-uvm.ko
Его нужно запускать всякий раз при обновлении драйвера Nvidia или ядра.
Комментариев нет :
Отправить комментарий