IUP resumo do curso preparado pelo Ovídio (by Rodrigo Toledo) IUP 1 Apresentação • O IUP é composto de um Toolkit virtual e uma linguagem de especificação de Diálogos, denominada LED. IUP 2 Conteúdo • • • • IUP LED CD LUA IUPLUA 3 Características do IUP • Multiplataforma • Pequeno • Aproximadamente 40 funções • Prototipagem rápida • Expansível • O layout é especificado abstratamente IUP 4 Layout Concreto x Layout Abstrato • Mais utilizado (Microsoft, Borland, Delphi, VB). • Dependente da resolução do sistema. • Ao variar o tamanho da janela os objetos ficam desposicionados. • Ferramenta de especificação interativa (“visual”) se torna mais simples . IUP • Pouco utilizado. • Independente da resolução do sistema. • Rearranjo automático dos elementos após alteração do tamanho da janela. • Sintaxe mais simples e agradável. • Manutenção mais simples. • Ferramenta de especificação interativa (“visual”) se torna mais complexa. 5 Layout Abstrato O posicionamento dos elementos no diálogo não é feito através das suas coordenadas como na maioria dos sistemas de interface. Ao lado um diálogo com centralização horizontal do elemento LABEL. HBOX FILL LABEL FILL Teste Texto Centralizado Horizontalmente Teste Texto Centralizado Horizontalmente IUP 6 Fundamentos Interfaces & Orientação à eventos IUP 7 Sistemas de Interface com o Usuário Elementos de interface: Diálogo •Botão •Janelas •Texto(estático ou editável) •Ícones •Lista •Mouse •Menu •Toggle •Radio •Image •Extras (Matriz, Dial, …) •Canvas (Área de trabalho) IUP 8 Programação Convencional e Orientada à Eventos início Os comandos são executados segundo uma ordem preestabelecida e sequencial. captura dados início captura evento executa Fç evento processa dados não fim? sim fim IUP O controle do fluxo não pertence ao programador da aplicação somente, mas também, ao usuário que interage com o programa gerando eventos. fim 9 Programação por Callbacks Aplicação inicio captura evento registra funções executa Fç evento interage c/ usuário evento final ? não Gerenciador de callbacks fim IUP retorna p/ aplicação 10 Arquitetura Aplicação IUP Macintosh Motif otk Windows DOS IUP XWindows 11 Descrição Conceitual - Modelo • • IUP O IUP utiliza um modelo de layout abstrato baseado no paradigma boxes-andglue do processador de texto TEX. Esse modelo, aliado à linguagem de especificação de diálogos (LED) ou do binding LUA (IUPLUA) torna a tarefa de criação dos diálogos mais flexível e independente da resolução do sistema gráfico. Os elementos de interface disponíveis na versão atual podem ser divididos nas seguintes categorias e são controlados pelos seus atributos e callbacks: • Preenchimento (ocupação de espaços vazios dinamicamente): fill. • Composição (definição de uma forma de exibir os elementos): hbox, vbox e zbox. • Agrupamento (definição de uma funcionalidade comum para um grupo de elementos): dialog, radio, menu. • Primitivos (interação efetiva com o usuário): button, label, text, multiline, list, toggle, frame, canvas, image, item, submenu. 12 LED - Lingugem de Especificação de Diálogos Linguagem de Expressões Sintaxe simples : Nomes = Elementos[Atributos](Parâmetros ou Expressão) Exemplo: botao1 = BUTTON(“Botao 1”, do_bot1) botao2 = BUTTON(“Botao 2”, do_bot2) caixa_bot = HBOX(FILL(), botao1, FILL(), botao2, FILL()) texto_est = LABEL(“Texto estatico”) caixa_texto = HBOX(FILL(), texto_est, FILL()) corpo_dial = VBOX(FILL(), caixa_texto, FILL(), caixa_bot, FILL()) dial_1 = DIALOG[TITLE=“Titulo”](corpo_dial) Notas : 1. Os nomes dos atributos são obrigatoriamente dados com letras maiúsculas. 2. As variáveis “LED” não podem ser usadas mais de uma vez e já devem estar definidas. 3. Os comentários são feitos após o sinal “#”. 4. As notas acima podem ser verificadas no arquivo primitivos.led IUP 13 Elementos de Interface IUP Sintaxe, atributos e exemplos IUP 14 Elemento de Preenchimento - FILL O elemento de preenchimento FILL, ocupa os espaços vazios dinamicamente, mantendo os elementos alinhados e o layout inalterado, mesmo após uma mudança no tamanho da janela. FILL [ATRIBUTOS] () Principais Atributos: •EXPAND •SIZE Exemplo: caixa = HBOX(FILL(), text[VALUE=“abcd”](), FILL()) IUP 15 Elementos de Composição Elementos que não possuem uma representação visual, mas são fundamentais para o funcionamento do mecanismo de especificação abstrata de layout. • HBOX [ATRIBUTOS] (elem1, elem2, …) Agrupa os elementos exibindo-os horizontalmente da esquerda para a direita. • VBOX [ATRIBUTOS] (elem1, elem2, …) Agrupa os elementos exibindo-os verticalmente de cima para baixo. • ZBOX [ATRIBUTOS] (elem1, elem2, …) Empilha os elementos sobrepondo-os uns aos outros. Somente o topo da pilha é mostrado. Atributos: ALIGNMENT, MARGIN, SIZE e GAP (Este último só para HBOX e VBOX) IUP 16 Elementos de Agrupamento Obs: radio será apresentado depois, junto com toggle IUP 17 Diálogo Para exibir qualquer elemento de interface é necessário encapsulá-lo em um dialog. O dialog, gerencia a interação do usuário com os elementos de interface. A aplicação torna-se um conjunto de diálogos. DIALOG [ATRIBUTOS] (Expressão) Principais atributos •TITLE •MENU •SIZE •ICON •BORDER •CURSOR •MENUBOX •MINBOX •MAXBOX Exemplo: dial_1 = DIALOG[TITLE=“Titulo”](corpo_dial) IUP 18 Menu (Item, Separator e Submenu) Agrupa 3 tipos de elementos de interface: item, submenu e separator. Qualquer outro elemento de interface definido dentro de um menu é ignorado. ITEM [ATRIBUTOS] (Título, Ação) MENU [ATRIBUTOS] (Item1, Item2 ,Submenu1,…, separator(),… ) SUBMENU [ATRIBUTOS] (Título, Menu) Principais Atributos: Exemplo: ACTIVE & KEY item_abre = ITEM[KEY=K_A]("Abre", acao_abre) item_salva = ITEM[KEY=K_S]("Salva", acao_salva) menu_secundario = MENU[ACTIVE=NO](item_abre, separator(), item_salva) submenu_geral = SUBMENU[KEY=K_G]("Geral", menu_secundario) item_final = ITEM[KEY=K_F]("Finaliza", acao_final) menu_princ = MENU(submenu_geral, item_final) dial_1 = DIALOG[MENU=menu_princ, MINBOX=NO, TITLE="Título"](corpo_dial) IUP 19 Elementos Primitivos IUP 20 Botão Exibe um botão capaz de executar uma ação específica. Sua apresentação visual pode conter um texto ou uma imagem. BUTTON [ATRIBUTOS] (Título, Ação) Principais Atributos: •ACTIVE •IMAGE •IMPRESS •IMINACTIVE •SIZE •TITLE •KANY •K_* ( * - Segundo tabela de codificação do teclado) Exemplo: botao1 = BUTTON("Botao 1", acao_1) botao2 = BUTTON("Botao 2", acao_2) caixa_bot = HBOX(FILL(), botao1, FILL(), botao2, FILL()) IUP 21 Texto Estático Exibe um texto ou uma imagem para o usuário. LABEL [ATRIBUTOS] (Título) Principais Atributos: •BGCOLOR •FGCOLOR •FONT •IMAGE •TITLE Exemplo: msg = LABEL[FGCOLOR="0 0 255"]("Pressione o botão para sair") IUP 22 Caixa de Texto Editável Exibe um campo editável de uma linha. Permite ao programador capturar uma string qualquer digitada pelo usuário. TEXT [ATRIBUTOS] (Ação) Principais Atributos: •VALUE •NC •BORDER •MASK •CARET •SELECTION •SELECTEDTEXT •KANY Exemplo: campo = TEXT[VALUE="1234", NC=4](acao_tecla) IUP 23 Caixa de Texto Editável com Várias Linhas Campo editável de uma ou mais linhas. MULTILINE [ATRIBUTOS] (Ação) Principais Atributos: •VALUE •NC •SELECTEDTEXT •SELECTION •BORDER •CARET Exemplo: texto = MULTILINE [VALUE="Primeira linha\nSegunda linha", SIZE=110x50] (acao_texto) IUP 24 Lista Lista de itens de dois estados (on e off). Uma ação é gerada para cada troca de estado de um item. LIST [ATRIBUTOS] (Ação) Principais Atributos: •1, 2, 3, ... •MULTIPLE •VALUE •DROPDOWN •VISIBLEITEMS Exemplo: pais_lista = LIST [1=“Brasil”, 2=“Eua”, 3=“Noruega”, VALUE=1](acao_pais) IUP 25 Botão de Dois Estados (Moldura) Botão de dois estados (on/off). Sua apresentação visual pode conter um texto ou uma imagem. Uma moldura (FRAME), foi usada para envolver o elemento de interface em questão, a qual pode ser usada em qualquer elemento. TOGGLE [ATRIBUTOS] (Título, Ação) Principais Atributos: •IMAGE •TITLE •VALUE Exemplo: port = TOGGLE [VALUE=ON] (“4 Portas”, acao_equip) ar = TOGGLE [VALUE=OFF](“Ar Cond.”, acao_equip) moldura = FRAME[TITLE=“Acessórios”](hbox(port, ar)) IUP 26 Botões de Dois Estados Mutuamente Exclusivos Este elemento exige que apenas um dos seus toggles descendentes esteja no estado on. RADIO[ATRIBUTOS](vbox(Toggle1, Toggle2 ,…, Togglen ,…, )) RADIO[ATRIBUTOS](hbox(Toggle1, Toggle2 ,…, Togglen ,…, )) Principal Atributo: Exemplo: VALUE masc = TOGGLE (“Masc.”, acao_sexo) fem = TOGGLE (“Fem.”, acao_sexo) exclusivo = RADIO[VALUE=“fem”]( vbox(masc, fem) ) moldura = FRAME[TITLE=“Sexo”](exclusivo) IUP 27 Imagem (Cor) Sua apresentção visual se dá em um label, button ou toggle IMAGE [ATRIBUTOS] (Largura, Altura, Lista de Índices) Principais Atributos: 0, 1, 2, 3, ... , n Exemplo: azul = COLOR (0, 0, 255) vermelho = COLOR (255, 0, 0) xis = IMAGE[0="azul",1="255 0 0"] ( 5,5, 1,0,0,0,1, 0,1,0,1,0, 0,0,1,0,0, 0,1,0,1,0, 1,0,0,0,1) label_xis = LABEL[IMAGE = xis]("") IUP 28 Área de Trabalho Este elemento, reserva uma área no diálogo para a aplicação sem a interferência do IUP. É através desta área que o IUP se relaciona com os sistemas gráficos como o GKS, CD, OpenGL, etc. CANVAS [ATRIBUTOS] (Ação) Principais Atributos: •CURSOR •SCROLLBAR •POSX e POSY •BORDER •EXPAND •CALLBACKS (mouse, resize, scrollbar) Exemplo: area_trab = CANVAS[MOTION_CB=acao_MotionCB,BUTTON_CB=acao_ButtonCB, RESIZE_CB=acao_ResizeCB](acao_Repaint) IUP 29 Elementos de Interface Extras I Elementos que servem para estabelecer regulagens ou ajustes. Uma diferença básica entre estes elementos é que o Valuator possui limites bem definidos. • Dial (Disco, relógio, mostrador) DIAL [ATRIBUTOS] (Tipo) Tipo: HORIZONTAL, VERTICAL ou CIRCULAR Atributos: DENSITY, MOUSEMOVE_CB, BUTTON_PRESS_CB, BUTTON_RELEASE_CB • Valuator (Estima, aprecia) VAL [ATRIBUTOS] (Tipo) Tipo: HORIZONTAL ou VERTICAL Atributos: MIN, MAX, VALUE, IUP BUTTON_PRESS_CB, BUTTON_RELEASE_CB, MOUSEMOVE_CB 30 Elementos de Interface Extras II • Tabs (Tira, aba, pala) TABS [ATRIBUTOS](elem1, elem2, ...) elem1, elem2, …: Estes parâmetros vão ser "chaveados", devendo cada um possuir o atributo "TABTITLE", que especifica o texto a ser mostrado na lingüeta de seu Tab. Se este atributo for omitido, o comportamento do Tabs é indefinido. Atributos: TYPE, VALUE, TABCHANGE_CB Tipos: TOP, BOTTOM, LEFT, RIGHT • Gauge (Medida, escala) GAUGE [ATRIBUTOS]( ) Mostra um valor percentual que pode ser modificado para delinear uma progressão. Atributos: TEXT, VALUE, SHOW_TEXT IUP 31 Elementos de Interface Extras III • Matrix - É uma matriz de campos alfanuméricos editáveis. Todos os campos são do tipo string. MATRIX [ATRIBUTOS](Ação) Principais Atributos: IUP •NUMCOL •RESIZEMATRIX •NUMLIN •ALIGNMENT •MARKED •L:C, L:0, 0:C, 0:0 •MARKED_MODE •WIDTHDEF •MULTIPLE •SCROLLBAR 32 Elementos de Interface Extras IV • ColorBrowser - Permite a seleção interativa de cores no modelo HLS (Hue Saturation Brightness). COLORBROWSER [ATRIBUTOS](Ação) Principal Atributo: IUP RGB 33 Prática 5 - Programando em LED •Criar o diálogo abaixo utilizando a linguagem LED. Utilize um editor de textos como o pfe. Visualize o arquivo criado através do programa View. •Crie também um menu com a seguinte estrutura: Arquivo(Gravar, Sair) e Opções(Incluir, Modificar, Remover). Dados Pessoais Arquivo Opções Nome : End. : Tel. : Sexo Masculino Feminino IUP Limpa Estado Civil Solteiro Casado Viuvo Outros Termina 34 Diálogos Predefinidos São diálogos com funcionalidade predefinida, usados com muita freqüência na maior parte das aplicações. Também serviram para manter a compatibilidade com o IntGraf, sistema de interface anterior ao IUP. Não podem ser usados em LED. • IupGetFile • IupMessage • IupGetColor IUP • IupListDialog • IupScanf • IupAlarm 35 Atributos Relacionados a Todos os Elementos • • • • • BGCOLOR FGCOLOR FONT EXPAND TIP (Informar) Volte às práticas 3 e 4 e coloque o mouse sobre os elementos visualizados. IUP • • • • RASTERSIZE SIZE KANY K_* (Segundo tabela de codificação do teclado) • ACTIVE • VISIBLE • WID (Identificador do elemento no sistema de interface nativo) • TITLE • VALUE 36 Guia de Programação C - I void main(void) { /* Inicializa o IUP */ if (IupOpen() == IUP_ERROR) { fprintf(stderr, "Error Opening IUP"); return; } /* Interpreta e cria os elementos descritos no arq. LED IupLoad (“arquivo.led”); /* Mapea e mostra o diálogo principal.Eventualmente /* é necessário mapear o diálogo antes e nestes casos /* usa-se a função IupMap.*/ IupShow(IupGetHandle(“dialogo_princ”)); /* Registra as funções - Próxima transparência ... /* Estabelece a interação com o usuário */ IupMainLoop(); /* Libera memória e finaliza o IUP */ IupClose(); } IUP */ */ */ */ 37 Guia de Programação C - II Como a programação do IUP é feita por Callbacks, antes da rotina IupMainLoop é necessário registrar as funções que serão chamadas para cada ação do usuário. Exemplo: int quit (void) { return IUP_CLOSE; } /* Registra a função quit p/ a acao_saida */ IupSetFunction ("acao_saida", (Icallback)quit); Nota: A especificação da interface que aprendemos em LED pode ser feita em C, o que a torna menos flexível. Já existe também o programa LED2C que a partir de uma especificação LED gera o código C equivalente. IUP 38 Prática 6 - Primeiro Programa • Para exercitar a programação C necessária ao IUP, crie um programa mínimo que exiba a especificação construida na prática anterior. • Construa pelo menos a callback de saída do programa associando-a à uma opção do MENU e à ação de click no botão “Termina”. IUP 39 Controlando os Atributos - I Consultando: char *IupGetAttribute(Ihandle *elemento, char *a); elemento: identificador do elemento de interface a: nome do atributo Consulta o valor de um atributo de um elemento de interface. A função retorna o valor do atributo. Se o atributo não existe, o retorno é NULL. Todos os valores de atributos são strings. Para dispor do Ihandle do elemento, basta usar a função IupGetHandle (char *nome_elemento). Exemplo: char *vis = IupGetAttribute(IupGetHandle("dialogo"), IUP_VISIBLE); Outras funções: IupGetInt, IupGetFloat, IupGetAttributes, IupGetGlobal IUP 40 Controlando os Atributos - II Alterando: void IupSetAttribute(Ihandle *elemento, char *a, char *v); elemento: identificador do elemento de interface a: nome do atributo v: valor do atributo. Se v for igual a NULL, o atributo é retirado do elemento. Define um atributo para um elemento de interface. O valor guardado no attributo não é duplicado pelo IUP que guarda apenas o ponteiro especificado, assim o ponteiro não pode ser liberado enquanto o elemento existir. Para o IUP guardar o atributo, duplicando o ponteiro, use a função IupStoreAttribute (disponível na versão 1.8). Exemplo: IupSetAttribute(IupGetHandle("text1"), IUP_VALUE, "Olá!"); IupSetAttribute(indicador, IUP_VALUE, IUP_ON); Outras funções: IupStoreAttribute, IupSetAttributes, IupSetfAttribute, IupSetGlobal IUP 41 Mais sobre Atributos (StoreAttribute x SetAttribute) • A função IupGetAttribute retorna um ponteiro que funciona como um buffer interno do IUP, assim a segunda chamada escreve por cima da área retornada pela primeira. IUP 42 Retornos de uma Callback São valores que devem ser retornados no final de cada callback. IUP_DEFAULT: prossegue normalmente com a interação com o usuário. Caso os outros valores de retorno não sejam aplicados, deve-se retornar sempre este valor. IUP_CLOSE: faz a função IupMainLoop retornar o controle para a aplicação. Isso geralmente faz com que a aplicação termine, portanto deve-se usar com atenção. IUP_IGNORE: faz com que o sistema nativo ignore a ação daquela callback, aplicável somente para algumas ações. Veja a documentação de cada ação para saber se é aplicável à aquela ação. IUP 43 Callbacks Especiais IUP_IDLE_ACTION Ação predefinida do IUP, gerada quando não há eventos. IUP_DEFAULT_ACTION Ação predefinida do IUP, gerada sempre que uma ação não tiver uma função associada. Junto com a função IupGetActionName, pode ser útil para verificar eventuais erros de digitação no registro de Callbacks. IUP 44