установить Matlab WindowButtonDownFcn и сохранить поведение по умолчанию - PullRequest
1 голос
/ 22 мая 2019

можно ли вручную установить WindowButtonDownFcn и выборочно перезаписать правый или средний щелчок, сохраняя поведение по умолчанию?Конечная цель - скопировать фигуру в буфер обмена одним кликом.

set(gcf,'WindowButtonDownFcn',@(src,~) disp(src.SelectionType)); %this seemingly always overwrites default behavior of figure click

Я пытался сделать это со следующими сообщениями об ошибках (прокрутка вправо)

listener(gcf,'WindowButtonDownFcn',@(src,~) disp(src.SelectionType)) %Event 'WindowButtonDownFcn' is not defined for class 'matlab.ui.Figure'.
listener(get(gcf,'parent'),'WindowButtonDownFcn',@(src,~) disp(src.SelectionType)) %Event 'WindowButtonDownFcn' is not defined for class 'matlab.ui.Root'
handle(gcf).addlistener(handle(gcf),'WindowButtonDownFcn',@(src,~) disp(src.SelectionType)) %Unrecognized method, property, or field 'addlistener' for class 'matlab.ui.Figure'.

и еще несколько перестановок с использованием handle и event.listener без успеха

Протестировано в Matlab 2019a.

РЕДАКТИРОВАТЬ: вот шаблонная функция для использования с модификаторами, основанными на добром ответе matlabgui

%copies figure to clipboard when [control]+[right-click] anywhere on figure window (and leaving default functionality intact)
figure; plot(randi(100,1,100)) %random figure
addlistener ( gcf, 'WindowMousePress', @(src,~) myFavFunc(src,[]))

function myFavFunc(src,~)
if strcmp(src.SelectionType,'alt') && numel(src.CurrentModifier)==1 &&  strcmp(src.CurrentModifier,'control')
    print -clipboard -dmeta
    disp('copied figure to clipboard')
end
end

1 Ответ

2 голосов
/ 22 мая 2019

Я не знаю, почему Matlab скрывает некоторые события для фигур, вы можете получить список здесь:

  hFig = figure;
  mc = metaclass(hFig);
  disp ( {mc.EventList.Name}' ) ;

Из этой информации вы можете добавить слушателя к событию нажатия мыши:

hFig = figure;
addlistener ( hFig, 'WindowMousePress', @(src,~)disp('myCallback' ))

Это позволит оставить стандартный обратный вызов рисунка в одиночку, вместо команды disp заставить его запустить функцию, где вы смотрите на свойство рисунка SelectionType, чтобы определить, какая кнопка мыши была нажата.Вы можете расширить его для использования свойства CurrentModifier, чтобы определить, были ли нажаты Ctrl, Shift или Alt для дальнейшей настройки.

...