AMULET Automatic Manufacture of Usable and Learnable Editors and Toolkits Maria Alice G. V. Ferreira Ver. 2003 Características Novo modelo para desenvolvimento de interfaces • • • • Brad Myers - Carnegie Mellon University paradigma da orientação a objetos - C++ Plataformas: X11 - Windows 95 - Windows NT propõe desenho, prototipação, implementação e avaliação de interfaces • novos modelos: – para os objetos – restrições – animação – entrada e saída – comandos – UNDO Características Arquitetura: aberta • permite a investigação de novas soluções • Ex: “constraints solvers” múltiplos • Widgets modificáveis Fornecer suporte de alto nível para os “insides” dos programas • “inside” - conteúdo dos programas. Ex: parte de desenho, como em CADs, sistemas de visualização, editores gráficos, etc “Application framework” • sistema que permite implementar partes dos aplicativos e não somente a interface Características Suporte: • • • • “redesenho” automático restrições entre widgets funcionamento interativo facilitado comandos de edição, tipo “cut”, “paste”, etc objetos de interface estão disponíveis em tempo de execução, podendo ser manipulados interativamente EXEMPLO Outros toolkits: • menus • barras de ferramentas AMULET • permite implementar o circuito com suas restrições e compromissos Destina-se a aplicações de natureza gráfica, principalmente. Usuários potenciais: estudantes, pesquisadores e desenvolvedores Conceitos básicos tudo é representado como objeto Utiliza-se de um sistema de objetos denominado “prototype-instance” nenhuma distinção entre classe e instância (no topo de C++), portanto uma instância pode ser utilizada como protótipo para outras instâncias (objetos) Objetos possuem “slots” (atributos), porém podem ser criados em tempo de execução (dinâmicos), tipos podem ser atribuídos dinamicamente a estes slots, que podem conter dados ou métodos Herança é permitida dinamicamente, se o objeto tiver um valor para o “slot” Conceitos básicos Criação de objetos • por instanciação - herda “slots”, que podem ser “setados” com novos valores • por cópia - todos os “slots’ têm os valores copiados • EX: Am_Bitmap objeto de biblioteca Amulet – and_bitmap_image imagem adequada Um programa - Hello World! Padrão já visto em outros sistemas, como VB, SUIT, Motif etc Interactors O objeto interactor permite que cada objeto responda de forma conveniente às entradas. Existem alguns tipos de Interactors permitidos. Move Grow é um destes tipos e permite a movimentação e redimensionamento dos objetos: new_gate.Add_Part(Am_Move_Grow_Interactor.Create()); Am_Move_Grow_Interactor permite as ações de mover e redimensionar o objeto ao qual é adicionado através de Add_Part; por default, funciona com o botão esquerdo do mouse, porém isto pode ser alterado. Em outras palavras, Add_Part adiciona uma nova funcionalidade ao objeto new_gate, criado em uma das transparências anteriores. Para cada plataforma, cada objeto mantém o “look and feel” conveniente, automaticamente. “Command objects” Para executar comandos do aplicativo, alocam-se instâncias de “Command objects”; estes possuem métodos especificados nos slots Am_DO_METHOD “Command objects” possuem slots para métodos de Undoing, Redoing, Help, Repeating, Enabling e Disabling Existem “Command objects” de biblioteca, que podem ser usados pelos programas “Command objects” Ex: Am_Object my_button = Am_Button.Create(). Add_Part(Am_COMMAND, Am_Quit_Command.Create() .Set(Am_LABEL,”Goodbye, World!”)))); Compromissos (“Constraints”) Compromissos Declarados pelo usuário e mantidos pelo sistema Formula constraints - similar às das planilhas, e descritas em C++. Definem procedimentos a serem executados pela fórmula Ex: // define uma fórmula denominada right_of_tool_panel_formula // que retorna uma valor inteiro Am_Define_Formula(int, right_of_tool_panel_formula){ return (int)tool_panel.Get(Am_LEFT) + (int)tool_panel.Get(Am_WIDTH) + 5; Reconhecimento de gestos Agate - uma ferramenta interativa que permite este reconhecimento, através do fornecimento de amostras de gestos pelo usuário, e que são associadas a um nome (cadeia de caracteres) Os nomes são associados com as operações Exemplo: gestos associados à interface de circuitos apresentada (criação de “gates”) Reconhecimento de gestos Interface de Agate (treinamento) Animação Animações são criadas com auxílio do sistema de compromissos do Amulet Quando um compromisso de animação é ligado a um slot e o slot altera o seu valor, o novo valor é removido do slot, este recebe o antigo valor e então, de forma suave, novos valores interpolados entre o valor antigo e o novo são colocados no slot; lembrar que ao ser alterado o valor de um slot, todo o sistema é redesenhado. Exemplo: Mover os números 0 e 1 entre os gates do circuito. Animação Arquitetura Novo Modelo para objetos ORE - Object Registering and Encoding - nível do Amulet que implementa o sistema de protótipos e intâncias de objetos (“prototype-instance object system”) no topo da linguagem C++ Objetivos: adquirir um nível mais dinâmico de manipulação dos objetos (manipulação em tempo de execução), poder obter em tempo de execução informação completa sobre os objetos e poder sobrepor métodos de objetos em tempo de execução. No modelo de protótipos e instâncias dos objetos não existe distinção entre classe e instância; toda instância pode ser usada como protótipo para a geração de novas instâncias “Slots” - podem conter atributos ou métodos Instanciação de objetos: os objetos podem ser instanciados ou copiados. Os objetos instanciados herdam todos os “slots” do protótipo; se estes “slots” forem alterados no protótipo, todos os objetos instanciados são alterados também e, se houver alteração de aspecto gráfico, a tela é redesenhada. Os objetos instanciados que tiverem seus valores redefinidos não são alterados, quando os “slots” do protótipo são alterados. No caso dos objetos copiados a alteração dos “slots” do protótipo não altera os objetos copiados. Este segundo modelo permite uma alternativa ao modelo de instanciação. Classes e objetos As instâncias podem ter os valores “default” (os do protótipo) redefinidos através de comandos Set Am_Object new_obj = zero_one_proto.Create( ) .Set(Am_LEFT,new_obj_left) .Set(Am_TOP,new_obj_top);//comando instanciação new_obj . Set (Am_LEFT,40); redefinição dos comandos new_obj . Set (Am_TEXT,“Hello!”); os “slots” podem ser excluídos ou adicionados aos objetos em tempo de execução. os valores dos “slots” podem ser alterados em tempo de execução. os tipos de dados contidos nos “slots” podem ser alterados dinamicamente. Para isso, todo um mecanismo que execute a alteração destes tipos foi implementado. “Wrapper” - uma classe que permite manipular os tipos de dados do C++, em tempo de execução. Esta classe deve ser usada quando se deseja armazenar algum dado em um “slot” que tenha seu tipo verificado pela linguagem. Am_Object Am_Object Am_Object Am_Object Set (Am_Slot_Key key, Am_Wrapper* value); Set (Am_Slot_Key key, void* value); Set (Am_Slot_Key key, int value); Set (Am_Slot_Key key, float value); Um “slot” contendo dados pode ser sobreposto por um método, em qualquer instante. Amulet utiliza um procedimento especial para o mecanismo que nos demais UIMS é manipulado via “callback”, o Am_DO_METHOD. Am_Define_Method - macro que cria um novo método que tem o tipo do primeiro parâmetro (Am_Object_Method). Este método chama uma função que retorna o tipo do segundo parâmetro (void); a função tem o nome do terceiro parâmetro (clear_selection). O quarto parâmetro especifica a lista de parâmetros, a serem utilizados pelo método Am_Define_Method (Am_Object_Method, void, clear_selection, (Am_Object /*cmd*/)) { y_selection . Set (Am_VALUE, NULL); Para se colocar a especificação do método no “slot” conveniente utiliza-se o método Get_Part tool_panel . Get_Part (AM_COMMAND) . Set (Am_DO_METHOD, clear_selection); Hierarquia “Part-Owner” “Owner” - grupo de objetos ou objetos associados a uma janela “Part” - outros grupos ou primitivos como linhas, textos ou retângulos Hieraquia “Part-Owner” - é uma hierarquia estrutural, que permite herança estrutural Interactors “Interactor” - um objeto que pode ser ligado às entradas do sistema, para que um objeto gráfico responda a essas entradas. O “interactor” - por default - inicia sua operação ao ser pressionado o botão esquerdo do mouse, porém este default pode ser alterado. O “interactor” fornece feedback ao usuário (através de movimentação, redimensionamento dos objetos ou através de caixas de diálogo convenientes). O “interactor” pode ter seu funcionamento abortado através de chaves apropriadas ou através de chamada, pelo programa, de um método que realiza esta tarefa. Ao se abortar uma interação, restaura-se o estado do programa. Quando a interação se encerra normalmente, o feedback é encerrado, e um objeto de comando é atribuído ao sistema “Interactors” possuem vários parâmetros, o que permite alto grau de variação de funcionamento (início, fim, abortamento da interação, tipo de feedback, etc) Existem 6 tipos diferentes de “interactors” Um mesmo “interactor” pode operar sobre um conjunto de objetos. Ex: move_grow_interactor, ligado a uma janela, opera sobre todos os objetos na janela “Interactors”- Choice Interactor Escolhe um objeto dentro de um conjunto de objetos. O usuário move o mouse sobre o conjunto de objetos até encontrar o item desejado. Pode ser usado, também, para a seleção entre itens de menu ou botões de comandos. Permite a selação de um único item (um item de um menu) ou de múltiplos itens (vários arquivos a serem copiados de um diretório). “Interactors” - Disparo e MoveGrow Disparo - É utilizado quando se deseja que alguma coisa ocorra logo após o disparo, como por exemplo a digitação de uma tecla, um click do mouse, etc. Move-Grow - É utilizado para movimentar ou alterar o tamanho de um objeto, como: atividades de “dragging” numa “scroll-bar”, operações de edição de um objeto, etc “Interactors”: New Points, Text e Reconhecimento de Gestos New Points - permite que se introduza pontos que podem indicar a posição de novos objetos Text Edit - permite a introdução de texto nas formas padrões e permite tabelas de tradução e comandos de edição Reconhecimento de Gestos - Gestos são definidos através de exemplificação e o sistema utiliza o reconhecedor denominado Agate “Interactors” são ligados aos objetos que devem sofrer interação Um “interactor” pode ser ligado a um conjunto de objetos // permite a movimentação de my_object com a pressão do botão // esquerdo do mouse my_object . Add_Part (A_Move_Grow_Interactor . Create()); // permite que qualquer parte de my_group tenha tamanho // alterado, com pressão do botão direito do mouse my_group. Add_Part (A_Move_Grow_Interactor . Create() .Set (Am_GROWING, true) .Set (Am_START_EVENT, “RIGHT_DOWN”)); Referências Bibliográficas Links: http://www-2.cs.cmu.edu/~amulet/ permite a obtenção de todo material bibliográfico a respeito, bem como de novos projetos Figuras: http://www2.cs.cmu.edu/afs/cs/project/amulet/www/amuletall-pictures.html