12.1.1. Пример добавления пользовательских меню

В этом примере показана схема добавления пользовательких меню в приложение.

Чтобы включить пример, и посмотреть как он работает нужно выполнить следующие действия.

Переименовать файл action.py.template в action.py (см. раздел Шаблоны расширяемых Python-модулей)

В файле action.py расскоментировать вызов функции примера:

import cerebro
import examples

def init_actions():
    examples.action.main()

Модуль примера добавления меню расположен в examples/action.py (см. раздел Организация файлов)

examples/action.py

# -*- coding: utf-8 -*-
"""
Этот пример покажет как работать с элементами меню и кнопками приложения.
В примере рассмотрена работа с главным меню, контексными меню задач, сообщений и вложений.

Функции:

main() - функция для запуска примера
remove_menu() - удаляет и скрывает меню приложения
add_menu() - Создает меню приложения

hello_user() - Приветствие пользователя
hello_administrator() - Приветствие администратора
task_info() - заглушка для действия с чекбоксом
task_info_show() - Показать информацию о сообщении
message_text() - Показать текст сообщения
message_id() - показать ID сообщения
attach_size() - Показать размер вложения
"""

import cerebro


def main():
        # Добавление меню и действий
        add_menu()
        # Удаление меню и действий
        remove_menu()

def add_menu():
        # Путь к иконке
        icon = cerebro.core.python_api_dir() + '/examples/icon.png'

        # Добавим в главное меню пользовательское меню
        mainMenu = cerebro.actions.MainMenu() # Получили главное меню
        userMenu = mainMenu.add_menu('Users menu') # добавили пользовательское меню
        userSubmenu = userMenu.add_menu('Users submenu') # добавили в пользовательское меню подменю

        current_user = cerebro.core.user_profile() # получили профиль пользователя

        # В пользовательское меню добавим действия
        userSubmenu.add_action('examples.action.hello_user', 'Приветствие', icon) # добавили действие
        adminAction = userSubmenu.add_action('examples.action.hello_administrator', 'Приветствие администратора', icon) # добавили действие
        # Сделаем кнопку администратора недоступной для пользователя
        if current_user[cerebro.aclasses.Users.DATA_LOGIN] != 'Администратор': # проверяем пользователя
                adminAction.set_enabled(False) # Сделали кнопку недоступной

        # Добавим действия в контекстное меню задачи на вкладке навигация
        taskMenu = cerebro.actions.TaskNavigatorMenu() # Получили контестное меню задачи
        taskInfoAction = taskMenu.add_action('examples.action.task_info', 'Информация о задаче(ID + Name)') # добавили действие
        # Сформируем действие для его использование в других меню
        act = cerebro.actions.Action('examples.action.task_info_show', 'Информация о задаче', icon)
        taskMenu.add_action(act) # добавили действие
        taskInfoAction.set_checkable(True) # установили кнопку с чекбоксом

        # Добавим действие в панель инструментов задач
        taskToolBar = cerebro.actions.TaskToolBar() # Получили панель инструментов
        taskToolBarUserMenu = taskToolBar.insert_menu(taskToolBar.size() - 2, 'Меню', icon) # вставим меню на предпоследнюю позицию панели инструментов
        taskToolBarUserMenu.add_action(act) # добавим действие

        # Добавим подменю в контекстное меню сообщения
        messageMenu = cerebro.actions.MessageForumMenu()
        userMessageMenu = messageMenu.insert_menu(0, 'User Message menu') # вставим меню на первую позицию
        messageMenu.insert_separator(1)
        userMessageMenu.add_action('examples.action.message_text', 'Текст сообщения') # добавили действие
        userMessageMenu.add_separator() # добавили разделитель
        userMessageMenu.add_action('examples.action.message_creator', 'Автор сообщения') # добавили действие

        # Добавим действие на панель инструментов вложений задачи
        attachToolBar = cerebro.actions.AttachmentForumToolBar() # Получили панель инструментов
        attachToolBar.add_action('examples.action.attach_size', 'Размер вложения', icon) # добавили действие

def remove_menu():
        # Уберем всем пользователям меню Web conference из главного меню
        mainMenu = cerebro.actions.MainMenu() # Получили главное меню
        mainMenu.remove_menu('conference') # удалили меню Web conference

        # В контестном меню задачи запретим всем пользователям кроме пользователя с логином 'Администратор' вырезать задачи
        taskNavMenu = cerebro.actions.TaskNavigatorMenu() # получили контекстное меню задачи
        current_user = cerebro.core.user_profile() # получили профиль пользователя
        if current_user[cerebro.aclasses.Users.DATA_LOGIN] != 'Администратор': # проверяем пользователя
                if taskNavMenu.has_action('app.action.task.cut'): # проверяем существует ли такой пункт меню
                        taskNavMenu.action('app.action.task.cut').set_visible(False) # скрываем меню
                if taskNavMenu.has_action('app.action.task.cut_referense'): # проверяем существует ли такой пункт меню
                        taskNavMenu.action('app.action.task.cut_referense').set_visible(False) # скрываем меню

def hello_user(): # Приветствие пользователя
        current_user = cerebro.core.user_profile() # получили профиль пользователя
        msg = 'Hello ' + current_user[cerebro.aclasses.Users.DATA_FULL_NAME] # сформировали сообщение
        cerebro.gui.information_box('Cerebro Python API', msg) # показали сообщение

def hello_administrator(): # Приветствие администратора
        current_user = cerebro.core.user_profile() # получили профиль пользователя
        msg = 'Hello administrator' + current_user[cerebro.aclasses.Users.DATA_FULL_NAME] # сформировали сообщение
        cerebro.gui.information_box('Cerebro Python API', msg) # показали сообщение

def task_info(): # заглушка для действия с чекбоксом
        pass

def task_info_show(): # Показать информацию о сообщении
        task = cerebro.core.current_task() # Получили текущее сообщение

        # Получим состояние кнопки 'Информация о задаче(ID + Name)'
        taskMenu = cerebro.actions.TaskNavigatorMenu() # Получили контестное меню задачи
        chkAction = taskMenu.action('examples.action.task_info')

        # Сформируем сообщение в зависимости от условия
        if chkAction.is_checked():
                msg = 'Имя задачи: ' + task.name() + ', ID задачи: ' + str(task.id()) # Сообщение при включенном пункте 'Информация о задаче(ID + Name)'
        else:
                msg = 'Имя задачи: ' + task.name() # Сообщение при выключенном пункте 'Информация о задаче(ID + Name)'
        cerebro.gui.information_box('Cerebro Python API', msg) # показали сообщение

def message_text(): # Показать текст сообщения
        # Проверяем выбрано ли сообщение
        if cerebro.core.selected_messages():
                message = cerebro.core.selected_messages()[0] # Получили первое выбранное сообщение
                msg = 'Текст сообщения: \n' + message.text_as_plain()  # Сформировали сообщение
        else:
                msg = 'Не выбрано ни одного сообщения!'  # Сформировали сообщение
        cerebro.gui.information_box('Cerebro Python API', msg) # показали сообщение

def message_creator(): # показать ID сообщения
        # Проверяем выбрано ли сообщение
        if cerebro.core.selected_messages():
                message = cerebro.core.selected_messages()[0] # Получили первое выбранное сообщение
                msg = 'Автор сообщения: ' + message.data()[cerebro.aclasses.Message.DATA_CREATOR_NAME] # Сформировали сообщение
        else:
                msg = 'Не выбрано ни одного сообщения!'  # Сформировали сообщение
        cerebro.gui.information_box('Cerebro Python API', msg) # показали сообщение

def attach_size(): # Показать размер вложения
        # Проверяем выбрано ли вложение
        if cerebro.core.selected_attachments():
                attach = cerebro.core.selected_attachments()[0] # Получили первое выбранное вложение
                msg = 'Размер вложения: ' + str(attach.file_size())  # Сформировали сообщение
        else:
                msg = 'Не выбрано ни одного вложения!'  # Сформировали сообщение
        cerebro.gui.information_box('Cerebro Python API', msg) # показали сообщение

Главное меню

_images/capi_example_menu1.png

Меню задач

_images/capi_example_menu2.png

Меню форума

_images/capi_example_menu3.png