Нажатие кнопки не должно снимать выделение

Автор Ципихович Эндрю, 20 марта 2026, 15:08

0 Пользователи и 1 гость просматривают эту тему.

Ципихович Эндрю

здравствуйте, собственно сабж...
прежде чем спросить у общества исследовал вопрос самостоятельно:
в настройках кнопки должно быть указано, что она НЕ должна снимать выделение: Свойства элемента Keep selection=Сохранить выделение — не нашёл такую настройку, где она?
"Захватить фокус при щелчке" на вкладке «Общие» есть, а искомую настройку не нашёл...
спасибо

sokol92

#1
Не совсем понятен вопрос.
Первое, что нужно поверить - не находится ли форма в режиме дизайна:
Меню / Сервис / Формы / Режим дизайна
(я такую кнопку добавил к Стандартной панели).
Если установлен режим дизайна (пункт меню выделен), то щелчок по кнопке выделяет саму кнопку. Разумеется, если до этого были выделены какие-то ячейки, то выделение убирается.

Если режим дизайна не установлен, то щелчок по по кнопке вызывает действия, определенные в свойствах элемента управления. Выделение ячеек при этом сохраняется.
Цитата: Ципихович Эндрю от 20 марта 2026, 15:08"Захватить фокус при щелчке" на вкладке «Общие» есть
Если это свойство установлено, то при щелчке кнопка получит фокус (текст на кнопке будет обведен пунктиром).

P.S. На "автопилоте" написал ответ про Calc, а не Writer.  :)
Для Writer всё так же, переключатель режима дизайна:
Меню / Форма / Режим дизайна


Владимир.

Ципихович Эндрю

Цитата: sokol92 от 20 марта 2026, 16:08Первое, что нужно поверить - не находится ли форма в режиме дизайна
конечно же нет - режим дизайна это когда у кнопки шесть квадратиков появляются при взаимодействии с ней и открывается возможность изменить её свойства
Цитата: sokol92 от 20 марта 2026, 16:08Если режим дизайна не установлен, то щелчок по по кнопке вызывает действия, определенные в свойствах элемента управления. Выделение ячеек при этом сохраняется
НЕ верю(по Станилавскому)))
в честь чего выделение текста сохранится? если я собственноручно нажал кнопку и тем самым перенёс фокус с выделения на кнопку...

sokol92

Цитата: Ципихович Эндрю от 21 марта 2026, 07:13НЕ верю(по Станилавскому)))
LibreOffice - территория знаний, а не веры.

За определение выделения отвечает контроллер документа (можно также использовать (псевдо)свойство CurrentSelection документа). После того, как Вы нажали и отпустили кнопку, запустите MRI и изучите этот вопрос.
Владимир.

Ципихович Эндрю

Цитата: Ципихович Эндрю от 20 марта 2026, 15:08прежде чем спросить у общества исследовал вопрос самостоятельно:
в настройках кнопки должно быть указано, что она НЕ должна снимать выделение: Свойства элемента Keep selection=Сохранить выделение — не нашёл такую настройку
да уж похоже нет её, понял, что только макрос (я ещё порадовался-насколько помню в Ворде нет такого...)и вот он макрос:

import uno
import winsound  # Модуль для воспроизведения звукового сигнала

# --- 1. МАКРОС ДЛЯ РАБОТЫ КНОПКИ InsertImage
def InsertImage(_=None):
    """
    Простейший макрос для проверки.
    Издает стандартный звуковой сигнал Windows.
    """
    winsound.MessageBeep(winsound.MB_OK)


# --- 2. МАКРОС ДЛЯ СОХРАНЕНИЯ ВЫДЕЛЕНИЯ ---

def restore_selection(doc, start_pos, end_pos):
    """Восстанавливает выделение в документе по переданным позициям"""
    try:
        controller = doc.getCurrentController()
        controller.select(start_pos)
        controller.goToRange(end_pos, False) # False - чтобы не снимать выделение
    except Exception as e:
        pass # Если что-то пошло не так, просто молчим

def ButtonAction_keep_selection(event):
    """Макрос-обёртка для кнопок панели инструментов
       Сохраняет текущее выделение, позволяет кнопке сработать,
       и возвращает выделение на место"""
    ctx = uno.getComponentContext()
    desktop = ctx.ServiceManager.createInstanceWithContext("com.sun.star.frame.Desktop", ctx)
   
    # Проверки на случай, если документ не открыт или не поддерживает контроллер
    if not hasattr(desktop, 'getCurrentComponent'):
        event.doit = True
        return

    doc = desktop.getCurrentComponent()
   
    if not hasattr(doc, 'getCurrentController'):
        event.doit = True
        return

    # 1. СОХРАНЯЕМ ТЕКУЩЕЕ ВЫДЕЛЕНИЕ
    try:
        controller = doc.getCurrentController()
        view_cursor = controller.getViewCursor()
        start_pos = view_cursor.getStart()
        end_pos = view_cursor.getEnd()
    except Exception as e:
        event.doit = True
        return

    # 2. ВЫПОЛНЯЕМ ДЕЙСТВИЕ КНОПКИ
    event.doit = True

    # 3. ВОЗВРАЩАЕМ ВЫДЕЛЕНИЕ (с задержкой)
    delay = ctx.ServiceManager.createInstanceWithContext("com.sun.star.util.Delay", ctx)
    delay.wait(100)
   
    restore_selection(doc, start_pos, end_pos)


# --- 3. ТОЧКА ВХОДА (РЕГИСТРАЦИЯ МАКРОСОВ) ---
# Теперь мы регистрируем ОБЕ функции, чтобы LibreOffice знала о них
g_exportedScripts = InsertImage, ButtonAction_keep_selection,
опробовал - ошибки нет и звука нет-если просто нажать на кнопку, а если выделить текст в документе то и звука нет и выделение снимается, чяднт?
кнопка-это та, что создал вручную:
Вид - Панели инструментов - Элементы управления
повесил на неё макрос
События - Выполнение действия - Макрос

sokol92

Давайте действовать последовательно.
Цитата: sokol92 от 21 марта 2026, 13:05За определение выделения отвечает контроллер документа (можно также использовать (псевдо)свойство CurrentSelection документа). После того, как Вы нажали и отпустили кнопку, запустите MRI и изучите этот вопрос.
1. Выделяем фрагмент текста
2. Нажимаем и отпускаем кнопку (макрос на эту кнопку пока не надо назначать)
3. Меню / Сервис / Дополнения / MRI <- selection (это и есть выделение)
4. На вкладке Services мы должны увидеть "com.sun.star.text.TextRanges" (выделен один или несколько фрагментов текста). Визуальное выделение текста также сохраняется.
5. На вкладке Methods дважды щелкаем по методу getByIndex, выбираем 0.
6. Выбираем вкладку Properties, в свойстве String видим содержание выделенного текста.
Проверка утверждения завершена.

Далее уже идет следующий вопрос: данный макрос работает не так, как (вероятно) задумал автор и (вероятно) реализовал искусственный интеллект. В настоящий момент времени нейросети не так квалифицированы в области LibreOffice, как в Python и некоторых других областях. Но они (нейросети) читают материалы нашего форума (я это лично видел  :) )


Владимир.

Ципихович Эндрю

Цитата: sokol92 от 21 марта 2026, 18:086. Выбираем вкладку Properties, в свойстве String видим содержание выделенного текста.
вижу ""
Цитата: sokol92 от 21 марта 2026, 18:08Проверка утверждения завершена
-не совсем пока понимаю, что это, ну ОК
Цитата: sokol92 от 21 марта 2026, 18:08Далее уже идет следующий вопрос: данный макрос работает не так, как (вероятно) задумал автор и (вероятно) реализовал искусственный интеллект. В настоящий момент времени нейросети не так квалифицированы в области LibreOffice, как в Python и некоторых других областях. Но они (нейросети) читают материалы нашего форума (я это лично видел  :) )
так было же сказано
макрос на эту кнопку пока не надо назначать - и тогда ....прострация, полная прострация
что делать, куда бежать, где красные, где белые?
что говорить о макросе - который не нужно назначать?
и ещё я заметил, что когда на кнопку нажимаешь\отпускаешь - это одно
а при выделенном фрагменте текста - совсем другое, нажимать нужно дважды, то есть типа снять выделение-щелчок сама кнопка зрительно не нажимается, а потом после второго щелчка уже сама работа кнопки-она нажимается...
и как же заставить работать кнопку чтобы она обошла преграду - выделение теста НЕ понятно...

sokol92

Прежде, чем писать какой-либо макрос, следует определить его цель.

Итак:

1. Мы выделили фрагмент текста (несколько фрагментов?)
2. Мы нажали и отпустили кнопку, которая встроена в документ.

Что должен сделать макрос, который назначен для обработки нажатия кнопки?
Владимир.

Ципихович Эндрю

видимо был не прав...
одна голова хорошо - а две лучше))
решил пойти другим путём-назначить макросу для его запуска сочетание клавиш, следую инструкции:
Чтобы назначить сочетание клавиш для макроса в LibreOffice Writer, выполните следующие шаги:
1 Откройте LibreOffice Writer.
2 Перейдите в меню «Сервис» → «Настройка».
3 В открывшемся окне выберите вкладку Keyboard=Клавиатура.
4 В разделе «Категория» найдите и разверните пункт «LibreOffice Macros» (или «Мои макросы», если ваш макрос сохранён в этом разделе).
5 В списке «Команда» выберите нужный макрос (например, InsertImage).
6 В поле «Комбинация клавиш» введите желаемое сочетание (например, Ctrl+Alt+I).
7 Нажмите кнопку «Назначить».
8 Подтвердите изменения, нажав «ОК».
и пункт 6 не могу выполнить, что-только с клавиатуры не вводил - не отображается команда в этом окне, чяднт?, спасибо

bigor

Цитата: Ципихович Эндрю от 22 марта 2026, 10:16что-только с клавиатуры не вводил
там не надо вводить, нужно выбрать вверху нужное сочетание клавиш и нажать назначить
Снимок экрана_20260322_114806.png
Поддержать наш форум можно здесь

sokol92

#10
Напомню, что горячие клавиши могут быть назначены на 3 уровнях (в порядке убывания приоритета обработки).

1. Для документа.
Клавиша будет срабатывать только в случае, когда документ является активным. Описание горячей клавиши сохраняется в документе.
Я не знаю способа, как назначение на уровне документа может быть выполнено через интерфейс пользователя. Пример, как это сделать макросом, здесь.

2. Для модуля (Calc, Writer, Impress, BasicIDE, ...)
Описание сохраняется в настройках LibreOffice для пользователя.
Горячая клавиша может назначаться как через интерфейс пользователя, так и макросом.

2. Для приложения LibreOffice (все модули).
Описание сохраняется в настройках LibreOffice для пользователя.
Горячая клавиша может назначаться как через интерфейс пользователя, так и макросом.

Список горячих клавиш на уровне модуля и приложения можно посмотреть с помощью следующего макроса.
Владимир.

Ципихович Эндрю