PBToolboxAI v5 ← Site

kanban — u_pbt_kanban #

← Referência dos componentes · Índice do guia

kanban é um quadro de cartões arrumados em colunas — as etapas de um trabalho: a fazer, em curso, em revisão, concluído. O utilizador arrasta um cartão de uma coluna para outra, ou sobe-o e desce-o na sua; ue_card_moved diz-lhe qual, de onde, para onde e em que lugar. Cada cartão mostra um título, etiquetas coloridas, o seu responsável, um prazo que fica vermelho em atraso e um emblema; cada coluna tem o seu limite de trabalho em curso e recolhe-se. O quadro preenche-se à mão ou a partir de um DataStore, que recebe as deslocações.

▶ Ver ao vivo — Aplicação de demonstração, mosaico Kanban board: a pré-visualização, o código que o produz e esta página, lado a lado.


Em resumo #

Userobjectu_pbt_kanban
Classes de itensn_pbt_kanban_column (of_column(key)), n_pbt_kanban_card (of_card(key))
Serve paraAcompanhar um fluxo de trabalho: pedidos de suporte, tarefas, encomendas, candidaturas
PrincípioUm cartão tem uma chave única em todo o quadro; a sua coluna é um estado que muda a cada deslocação
Opções opt-inib_veto_moves, ib_write_back, ib_reorderable, ib_toolbar, ib_add_button, ib_quick_add

Início rápido #

// The columns, in the order of the work
uo_board.of_add_column(/*key*/ "todo", /*title*/ "To do")
uo_board.of_add_column(/*key*/ "doing", /*title*/ "In progress")
uo_board.of_add_column(/*key*/ "done", /*title*/ "Done")

// The cards : a key unique on the board, a column, a title
uo_board.of_add_card(/*key*/ "t1", /*column*/ "todo", /*title*/ "Login page")
uo_board.of_add_card(/*key*/ "t2", /*column*/ "doing", /*title*/ "Crash on save")
uo_board.of_card(/*key*/ "t2").is_tags = "Bug"
uo_board.of_card(/*key*/ "t2").is_assignee = "Alan Turing"
// event ue_card_moved of uo_board : (string as_key, string as_from_column,
// string as_to_column, long al_position, long al_from_position)
// Save the new state of the task
UPDATE tasks SET status = :as_to_column WHERE id = :as_key;

Colunas, cartões e posições #

Uma coluna designa-se pela sua chave, um cartão também — e a chave de um cartão é única em todo o quadro, não só na sua coluna: um cartão mantém a sua chave quando muda de coluna, os seus handles continuam válidos e cada evento nomeia-o sozinho. A coluna de um cartão lê-se com of_card(key).of_column(), a sua posição com of_position(); uma posição conta-se a partir de 1, cartões ocultos incluídos.

Uma coluna tem um limite de trabalho em curso (il_limit): o seu cabeçalho conta 3/5, e fica vermelha para lá dele. O limite é flexível — o cartão chega na mesma; para um limite estrito, recuse a deslocação em ue_card_moving comparando il_limit com of_visible_count() da coluna, o que o cabeçalho conta (um cartão oculto não conta). ib_done marca a coluna do trabalho concluído: os seus cartões nunca estão em atraso. Uma coluna recolhe-se numa faixa estreita (a sua seta, ib_collapsed); ainda se pode largar um cartão nela, no fim.

Uma deslocação do utilizador (arrastar, Ctrl + setas, ou o cartão levantado com Espaço e pousado) e uma deslocação do seu código (of_move_card) levantam o mesmo ue_card_moved, como SelectItem levanta o evento do clique. Com ib_veto_moves, ue_card_moving é colocado antes, nos dois casos: devolver FALSE deixa o cartão onde está, e of_move_card devolve então -4.

Com ib_reorderable = true, o utilizador reordena também as colunas: arrasta o cabeçalho de uma coluna (uma barra de destaque vertical mostra onde vai cair, Esc cancela) ou prime Ctrl + Shift + Esquerda / Direita. ue_column_moved dá a coluna e os seus dois lugares, contados a partir de 1 entre todas as colunas; of_move_column faz o mesmo a partir do seu código e levanta o mesmo evento, sendo ue_column_moving colocado antes com ib_veto_moves. Desativado por omissão: as colunas são o processo da sua aplicação. O que o utilizador organizou — a ordem das colunas e o seu recolhimento — lê-se com of_get_layout, devolve-se com of_set_layout, e cada alteração levanta ue_layout_changed com a disposição inteira: guarde-a e devolva-a no próximo arranque.


O conteúdo de um cartão #

Um cartão mostra o seu título (is_title), o seu texto (is_text, cortado após quatro linhas), as suas etiquetas (is_tags, separadas por vírgulas, coloridas por is_tag_tones: Bug=danger|UI=info), o seu responsável (is_assignee, um avatar redondo com as iniciais), o seu prazo (is_due, aaaa-mm-dd: vermelho depois de ultrapassado, laranja no próprio dia, comparado com is_today ou com a data do posto) e um emblema (is_badge). Título, texto e emblema aceitam o texto formatado com etiquetas.

O corpo dos cartões pode ser escrito por um modelo, is_card_template: texto formatado onde {customer} é um campo do cartão — um dos seus (of_set_field), uma coluna do DataStore de onde vem, ou um campo integrado (title, text, tags, assignee, initials, badge, due, column, column_title, key). {due:dddd d mmmm} escreve uma data como um formato de apresentação de DataWindow (os símbolos d dd ddd dddd m mm mmm mmmm yy yyyy, um texto entre aspas duplas — fora delas, uma letra d, m ou y é um símbolo —, [shortdate] e [longdate] na língua da apresentação), {?amount}…{/amount} mantém um pedaço quando o campo diz alguma coisa, {!amount}…{/amount} quando não diz nada, {x:raw} mantém um valor como etiquetas, {{ }} são chavetas. Um valor é sempre mostrado tal como é, nunca lido como etiquetas.

// A field of our own, then the body of every card
uo_board.of_set_field(/*key*/ "t1", /*field*/ "customer", /*value*/ "Acme")
uo_board.is_card_template = "{?customer}For [b]{customer}[/b]{/customer}{?due} - due {due:d mmm}{/due}"

A partir de um DataStore #

of_from_datastore faz um cartão de cada linha de um DataStore, de um DataWindow ou de um DataWindowChild — a mesma chamada, e um DataWindow é reescrito ele próprio. A sua chave é o RowID da linha — of_card(key).of_row() devolve o número da sua linha enquanto o DataStore não for esvaziado nem relido — ou o valor da coluna ROLE_KEY. Uma linha cuja chave está vazia, é inválida, já foi vista ou está ocupada por um cartão acrescentado à mão não é carregada: a chamada devolve 0 e of_get_last_error nomeia-a pelo seu número — dê aos seus cartões à mão chaves que não sejam números. Uma coluna desempenha um papel quando tem o seu nome (title, text, tags, assignee, due, badge, color, order, column, key) ou quando of_map o diz. A coluna ROLE_COLUMN diz em que coluna do quadro está o cartão; um valor que nenhuma coluna tem recebe uma coluna própria, no fim — um valor que contém / ou | toma uma chave em que se tornam - (R&D-QA) e mantém o seu valor, o que uma deslocação reescreve; um valor vazio não é carregado (of_get_last_error nomeia-o), um valor CHAR completado com espaços encontra a sua coluna. Uma coluna nascida de um valor desaparece quando fica vazia, a não ser que o seu código lhe tenha dado uma propriedade ou uma cor. ROLE_ORDER ordena os cartões de uma coluna: a ordem é o lugar de um cartão entre os cartões do DataStore da sua coluna, a partir de 1 (um cartão acrescentado à mão não toma ordem). Com uma chave ROLE_KEY, um segundo carregamento, of_map e of_reload_row atualizam os cartões no lugar: um cartão que volta mantém os seus indicadores, os seus campos e o seu handle. Com a chave RowID, um segundo of_from_datastore é um novo carregamento: o PowerBuilder volta a dar os mesmos RowID depois de um Reset ou de um Retrieve, a outros registos — todos os cartões das linhas antigas saem (o seu handle é libertado) e os cartões são refeitos; of_map e of_reload_row ficam no lugar. Um cartão que o seu código retirou não volta com of_map: a sua linha fica no DataStore, o próximo of_from_datastore volta a lê-la. As datas e os decimais são lidos segundo as definições regionais do posto (um campo decimal lê-se 1234.5). Todas as colunas são campos do modelo.

Com ib_write_back = true, um cartão de uma linha escreve a sua nova coluna na linha (e, com ROLE_ORDER, as ordens das duas colunas) antes de se deslocar — a linha é encontrada pelo seu RowID e por nada mais: ue_card_moved lê o DataStore atualizado, o Update continua a ser consigo. A coluna recebe o valor da coluna de destino (R&D/QA, nunca a sua chave R&D-QA). Tudo ou nada: um valor que o DataStore recusa — a coluna ou uma ordem — repõe o que já estava escrito, deixa o cartão onde estava (nunca sai para voltar) e levanta ue_write_back_failed; of_move_card devolve então -4. Escreve-se uma só deslocação do utilizador de cada vez: um gesto feito antes de a anterior estar escrita é ignorado, e anunciado. Depois de alterar você mesmo uma linha, of_reload_row volta a enviá-la para o quadro.

// The columns of the board : the values of the status column
uo_board.of_add_column(/*key*/ "open", /*title*/ "Open")
uo_board.of_add_column(/*key*/ "active", /*title*/ "Active")
uo_board.of_add_column(/*key*/ "closed", /*title*/ "Closed")

// Which column of the DataStore plays which role
uo_board.of_map(/*role*/ u_pbt_kanban.ROLE_COLUMN, /*column*/ "status")
uo_board.of_map(/*role*/ u_pbt_kanban.ROLE_ASSIGNEE, /*column*/ "owner")
uo_board.of_map(/*role*/ u_pbt_kanban.ROLE_ORDER, /*column*/ "rank")

// A move goes into the DataStore, then the rows become cards
uo_board.ib_write_back = true
uo_board.of_from_datastore(/*ads*/ ids_tasks)

Propriedades #

PropriedadeTipoPredefiniçãoFunção
is_card_templatestring""O corpo de cada cartão, escrito por um modelo (ver acima). Vazio: o texto do cartão (is_text). A pesquisa lê o que o modelo escreve
is_count_templatestring""O contador do cabeçalho de cada coluna, escrito por um modelo: {count} os cartões visíveis, {limit} o limite (vazio sem limite), {shown} os cartões que a pesquisa mantém, {sum:points} a soma de um campo sobre os cartões visíveis (um dos seus ou uma coluna do DataStore), {title} e {key} da coluna; {?limit}…{/limit} mantém um pedaço quando há um limite. Vazio: 3, 3/5, 1 . 3/5 durante uma pesquisa. Para lá do seu limite a coluna fica vermelha diga o modelo o que disser, e o seu cabeçalho di-lo ao leitor de ecrã. {sum:} lê um número escrito com ponto ou na língua da apresentação (1.234,5 em português); um texto não conta. Sem chave, a contagem e a soma são as dos cartões que a demo desenha
is_tag_tonesstring""O tom de cada etiqueta, etiqueta=tom unidos por `: Bug=dangerUI=info. Tons: TONE_SUCCESS, TONE_WARN, TONE_DANGER, TONE_INFO (o destaque), TONE_NEUTRAL`. Uma etiqueta encontra o seu tom seja qual for a sua capitalização; uma etiqueta não listada, ou um tom desconhecido, é neutra
is_todaystring""O dia com que os prazos são comparados, aaaa-mm-dd; vazio: a data do posto. Uma data inválida é recusada: a anterior fica, of_get_last_error diz porquê
is_filterstring""A pesquisa: só ficam os cartões cujo título, corpo, etiquetas, responsável, emblema, chave, um campo seu ou uma coluna do DataStore contêm este texto, sem distinguir maiúsculas nem acentos. O contador de uma coluna diz então primeiro os cartões encontrados (1 . 3). A caixa de pesquisa da barra de ferramentas também a escreve: lida em direto
ib_toolbarbooleanfalseUma barra de ferramentas por cima do quadro, com uma caixa de pesquisa que escreve is_filter (Esc esvazia-a)
ib_add_buttonbooleanfalseUm botão + Adicionar um cartão no fundo de cada coluna aberta: levanta ue_new_requested. Um duplo clique na parte vazia de uma coluna também o levanta, com botão ou sem ele
ib_quick_addbooleanfalseAdição rápida: o botão + Adicionar um cartão e a tecla Insert abrem um campo de título no fundo da coluna; Enter levanta ue_new_requested com o título escrito (um título vazio não pede nada), o campo fica aberto para o cartão seguinte, Esc fecha-o. O quadro continua a não acrescentar nada: o seu código acrescenta o cartão
ib_read_onlybooleanfalseO utilizador não desloca nada: nem arrastar, nem Ctrl + setas, nem Delete, nem botão de adicionar. Continua a selecionar e a abrir os cartões; o seu código continua a deslocá-los
ib_reorderablebooleanfalseO utilizador reordena as colunas: arrasta o seu cabeçalho ou prime Ctrl + Shift + Esquerda / Direita; seguem-se ue_column_moved e depois ue_layout_changed. ib_read_only também o impede; o seu código continua a deslocá-las (of_move_column). Lida em direto
ib_veto_movesbooleanfalseOpt-in: perguntar ue_card_moving antes de cada deslocação, do utilizador como de of_move_card. Desativado por omissão, como todo o evento cancelável da biblioteca
ib_write_backbooleanfalseUm quadro alimentado por of_from_datastore: um cartão de uma linha escreve a sua nova coluna (e as ordens, com ROLE_ORDER) no DataStore antes de se deslocar; um valor recusado deixa-o no lugar (ue_write_back_failed, of_move_card devolve -4). Um cartão acrescentado à mão nunca é escrito
ii_column_widthinteger272A largura de uma coluna aberta, em píxeis, de 180 a 600 (um valor fora é trazido para dentro); 0: as colunas abertas partilham a largura do quadro, 180 píxeis no mínimo cada uma. O quadro desliza de lado quando as colunas não cabem
is_theme_stylestring""Estilo visual do componente (constantes THEME_STYLE_*); vazio = o da aplicação, seguido a cada mudança
is_theme_modestring""Variante clara ou escura (constantes THEME_MODE_*); vazio = a da aplicação, seguida a cada mudança
il_theme_accentlong-1Cor de destaque deste componente (-1 = destaque da aplicação, ou o do tema)
is_tooltipstring""Tooltip simples apresentado ao passar sobre o componente
is_super_tooltip_titlestring""Título do tooltip enriquecido (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto do tooltip enriquecido (aceita marcação enriquecida)
is_super_tooltip_imagestring""Imagem do tooltip enriquecido

Propriedades de uma coluna — n_pbt_kanban_column #

O seu handle, através de of_column(key). O seu of_count() conta os cartões que contém e o seu of_keys_at(n) devolve a chave do n-ésimo, pela sua ordem; of_child_keys devolve-as todas numa só leitura.

PropriedadeTipoPredefiniçãoFunção
is_titlestring""Título da coluna. Aceita o texto formatado com etiquetas. Vazio, a coluna mostra a sua chave
il_limitlong0Limite de trabalho em curso: 0, nenhum. Com um limite o cabeçalho diz 3/5, e a coluna fica vermelha assim que contém mais; enquanto um cartão é arrastado sobre uma coluna cheia, mostra-o. Limite flexível: recuse em ue_card_moving para um estrito
ib_collapsedbooleanfalsetrue recolhe a coluna numa faixa estreita: o seu título escrito para baixo e o seu contador ficam, os seus cartões escondem-se, ainda se larga um cartão nela (no fim). Segue-se ue_column_toggled, como num clique na sua seta. Lida em direto
ib_visiblebooleantruefalse retira a coluna e os seus cartões do quadro; mantêm o seu lugar e a sua ordem
ib_donebooleanfalseA coluna do trabalho concluído: os seus cartões nunca são mostrados em atraso nem a vencer
of_keys_at (long al_index) → string——A chave do cartão na ordem al_index (a partir de 1) na coluna, pela sua ordem; vazia para lá dos limites. Como um cartão se designa só pela sua chave, é o que of_card recebe
of_child_keys (ref string as_keys[]) → long——Preenche as_keys[] com as chaves de todos os cartões da coluna, pela sua ordem — o que of_keys_at(1..n) dá — e devolve o seu número, numa só leitura: percorrer 2000 cartões com of_keys_at relê a lista 2000 vezes
of_position ( ) → long——Devolve o lugar da coluna no quadro agora, contado a partir de 1 entre todas as colunas (ocultas incluídas) — o utilizador pode tê-la deslocado; 0 quando o quadro não a contém
of_visible_count ( ) → long——Devolve o número de cartões visíveis da coluna, o que o seu cabeçalho conta face a il_limit (2/3): um cartão oculto por ib_visible não conta, um cartão fora da pesquisa conta; of_count() conta-os todos. O número a comparar com il_limit para um limite estrito; 0 quando o quadro não contém a coluna
is_tooltipstring""Tooltip simples apresentado ao passar sobre o item
is_super_tooltip_titlestring""Título do tooltip enriquecido do item (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto do tooltip enriquecido do item (aceita marcação enriquecida)
is_super_tooltip_imagestring""Imagem do tooltip enriquecido do item
il_accentlong-1Destaque da coluna: a barra por cima dela e o seu contador usam-no, nunca os seus cartões (-1 = o do componente)
il_back_colorlong-1Fundo da coluna, em RGB(r,g,b) (-1 = o que o tema dá)
il_text_colorlong-1Cor do texto da coluna (-1 = o que o tema dá)
il_back_color_hoverlong-1Fundo do cabeçalho da coluna sob o ponteiro (-1 = o que o tema dá). As cores de uma coluna param nos seus cartões
il_text_color_hoverlong-1Cor do texto do cabeçalho da coluna sob o ponteiro (-1 = o que o tema dá)

Propriedades de um cartão — n_pbt_kanban_card #

PropriedadeTipoPredefiniçãoFunção
is_titlestring""Título do cartão, a negrito. Aceita o texto formatado com etiquetas. Vazio, o cartão mostra a sua chave
is_textstring""Texto sob o título, cortado após quatro linhas (etiquetas aceites). Mostrado enquanto is_card_template estiver vazio
is_tagsstring""Etiquetas, separadas por vírgulas: Bug, UI. Cada uma é uma pastilha colorida por is_tag_tones
is_assigneestring""A pessoa a quem o cartão é confiado: um avatar redondo com as iniciais, da mesma cor a cada carregamento, o nome como tooltip
is_duestring""Prazo, aaaa-mm-dd ("": nenhum): vermelho depois de ultrapassado, laranja no próprio dia, nunca numa coluna ib_done. Uma data inválida é recusada: a anterior fica, of_get_last_error do quadro diz porquê
is_badgestring""Pequeno emblema em cima à direita (etiquetas aceites): uma estimativa, um número, no destaque
ib_visiblebooleantruefalse retira o cartão do quadro; mantém a sua chave, a sua coluna e o seu lugar, e deixa de contar na sua coluna
ib_read_onlybooleanfalseO utilizador não pode nem arrastar este cartão, nem deslocá-lo com o teclado, nem pedir a sua eliminação; o seu código continua a deslocá-lo
of_column ( ) → string——A chave da coluna onde o cartão está agora — o utilizador pode tê-lo deslocado. Só de leitura: um cartão desloca-se com of_move_card
of_position ( ) → long——Devolve o lugar do cartão na sua coluna agora, contado a partir de 1 (cartões ocultos incluídos), 0 quando o quadro não o contém
of_row ( ) → long——Devolve o número de linha de hoje, nas linhas dadas a of_from_datastore, da linha de onde vem o cartão — depois de uma ordenação, de um filtro ou da eliminação de outras linhas; 0 para um cartão acrescentado à mão ou cuja linha desapareceu
is_tooltipstring""Tooltip simples apresentado ao passar sobre o item
is_super_tooltip_titlestring""Título do tooltip enriquecido do item (prevalece sobre is_tooltip)
is_super_tooltip_textstring""Texto do tooltip enriquecido do item (aceita marcação enriquecida)
is_super_tooltip_imagestring""Imagem do tooltip enriquecido do item
il_accentlong-1Destaque do cartão: uma faixa no seu bordo inicial, o seu anel de seleção e o seu emblema usam-no; prevalece sobre a cor de uma coluna ROLE_COLOR. -1 = o do componente, sem faixa
il_back_colorlong-1Fundo do cartão, em RGB(r,g,b) (-1 = o que o tema dá)
il_text_colorlong-1Cor do texto do cartão (-1 = o que o tema dá)
il_back_color_hoverlong-1Fundo do cartão sob o ponteiro (-1 = o que o tema dá)
il_text_color_hoverlong-1Cor do texto do cartão sob o ponteiro (-1 = o que o tema dá)

Três leituras do handle, só de leitura: of_column() devolve a chave da coluna onde o cartão está agora, of_position() o seu lugar nessa coluna a partir de 1 (0 se o quadro não o contiver), of_row() o número da sua linha no DataStore (0 para um cartão acrescentado à mão). Um cartão desloca-se com of_move_card do quadro.


Métodos #

MétodoFunção
of_add_card (string as_key, string as_column, string as_title)Acrescenta um cartão no fundo de uma coluna. A sua chave é única em todo o quadro. Devolve 0 depois de acrescentado, -5 para uma chave vazia, com / ou `, já ocupada (cartões de um DataStore incluídos) ou uma coluna desconhecida, -2` quando o componente não está criado
of_add_column (string as_key, string as_title)Acrescenta uma coluna à direita do quadro. Devolve 0 depois de acrescentada, -5 para uma chave vazia, com / ou `, ou já ocupada, -2` quando o componente não está criado
of_card (string as_key)Devolve o handle de um cartão (criado no primeiro acesso, libertado quando o cartão é retirado)
of_clear ( )Esvazia o quadro: colunas, cartões (os de um DataStore incluídos) e os seus handles; as opções ficam. Devolve 0 depois de aplicado, -2 quando o componente não está criado
of_clear_cards ( )Retira todos os cartões e os seus handles, mantém as colunas: para recarregar os cartões. Devolve 0 depois de aplicado, -2 quando o componente não está criado
of_clear_selection ( )Não deixa nenhum cartão selecionado: segue-se ue_selection_changed com uma chave vazia; nada selecionado, nada é levantado. Devolve 0 depois de aplicado, -2 quando o componente não está criado
of_column (string as_key)Devolve o handle de uma coluna (criado no primeiro acesso, libertado quando a coluna é retirada)
of_from_datastore (datastore ads)Faz um cartão de cada linha do DataStore (ver acima). Um segundo carregamento atualiza os cartões no lugar com uma chave ROLE_KEY, refá-los com a chave RowID; os cartões das linhas desaparecidas saem, os acrescentados à mão ficam; uma linha não carregada é nomeada por of_get_last_error. Devolve 0 depois de carregado, -5 quando o DataStore não é válido ou não tem colunas, -2 quando o componente não está criado
of_from_datastore (datawindow adw)O mesmo a partir das linhas de um DataWindow — o que o utilizador vê ao lado: ib_write_back escreve neste DataWindow. Devolve 0 depois de carregado, -5 quando o DataWindow não é válido, não tem colunas ou não pode partilhar as suas linhas (ShareData), -2 quando o componente não está criado
of_from_datastore (datawindowchild adwc)O mesmo a partir das linhas de um DataWindowChild (uma lista pendente DataWindow, um relatório aninhado), reescrito por ib_write_back. Devolve 0 depois de carregado, -5 quando não é válido, não tem colunas ou não pode partilhar as suas linhas (ShareData), -2 quando o componente não está criado
of_get_field (string as_key, string as_field)Lê um campo de um cartão, em direto: um dos seus, uma coluna do seu DataStore ou um campo integrado (column_title, initials…). Uma cadeia vazia quando não tem
of_get_last_error ( )Porque falhou a última chamada: um método que devolveu -5 ou -4, uma data recusada (is_due, is_today), as linhas que um carregamento deixou de fora, pelo seu número. Esvaziada por cada chamada; senão o último erro da biblioteca
of_get_layout ( )O que o utilizador organizou, em JSON: {"columns":[{"key":"todo","collapsed":false},...]} — cada coluna pela sua ordem (ocultas incluídas), com o seu recolhimento. Para guardar e depois devolver a of_set_layout. Títulos, limites e cartões são seus: não estão lá. Lido em direto
of_map (string as_role, string as_column)Dá um papel a uma coluna do DataStore (ROLE_KEY, ROLE_COLUMN, ROLE_TITLE, ROLE_TEXT, ROLE_TAGS, ROLE_ASSIGNEE, ROLE_DUE, ROLE_BADGE, ROLE_COLOR, ROLE_ORDER). Depois de of_from_datastore, as linhas são relidas no lugar: um cartão deslocado fica onde foi largado e mantém os seus indicadores e o seu handle. Uma coluna vazia devolve o papel à coluna que tem o seu nome. Um cartão que o seu código retirou não volta. Devolve 0 depois de definido, -5 para um papel desconhecido ou uma coluna que o DataStore não tem, -2 quando o componente não está criado
of_move_card (string as_key, string as_column, long al_position)Desloca um cartão para uma coluna, num lugar contado a partir de 1 (para lá do último: no fim), como um arrastar: a pergunta com ib_veto_moves, depois ue_card_moved, e, com ib_write_back, o DataStore escrito antes da deslocação. Devolve 0 depois de deslocado (ou já lá: nada é levantado), -4 quando ue_card_moving recusou, o DataStore recusou a nova coluna ou uma ordem (o cartão fica, ue_write_back_failed, of_get_last_error diz porquê) ou o quadro espera pela página (uma chamada a partir de um temporizador durante uma leitura: nem a pergunta nem a escrita podem ser feitas), -5 para um cartão ou uma coluna desconhecida, -2 quando o componente não está criado
of_move_column (string as_key, long al_position)Desloca uma coluna para um lugar contado a partir de 1 entre todas as colunas, ocultas incluídas (para lá da última: a última), como um arrastar do seu cabeçalho: a pergunta com ib_veto_moves, depois ue_column_moved e ue_layout_changed. Nem ib_reorderable nem ib_read_only param o seu código. Devolve 0 depois de deslocada (ou já lá: nada é levantado), -4 quando ue_column_moving recusou, -5 para uma coluna desconhecida, -2 quando o componente não está criado
of_reload_row (long al_row)Volta a enviar para o quadro uma linha do DataStore de of_from_datastore, lida agora, depois de o seu código a ter alterado; o seu cartão é atualizado no lugar (indicadores, campos e handle ficam) e segue a sua coluna e a sua ordem. Devolve 0 depois de enviada, -5 quando nada está ligado, a linha não existe, a sua chave está ocupada por um cartão acrescentado à mão, o seu valor de coluna está vazio ou o seu valor ROLE_KEY já não é a chave do seu cartão — uma chave é uma identidade: depois de um Update que dá as chaves, volte a carregar com of_from_datastore (of_get_last_error di-lo, nada mudou), -2 quando o componente não está criado
of_remove_card (string as_key)Retira um cartão e liberta o seu handle; retirá-lo selecionado limpa a seleção. Devolve 0 depois de retirado, -5 para um cartão desconhecido, -2 quando o componente não está criado
of_remove_column (string as_key)Retira uma coluna e todos os seus cartões, com os seus handles. Devolve 0 depois de retirada, -5 para uma coluna desconhecida, -2 quando o componente não está criado
of_reset ( )Esvazia o quadro, esquece o DataStore e repõe cada propriedade no seu valor por omissão. Devolve 0 depois de aplicado, -2 quando o componente não está criado
of_select_card (string as_key)Seleciona um cartão como um clique, sem mover a vista (como SelectRow de um DataWindow), e segue-se ue_selection_changed. Devolve 0 depois de selecionado (ou já selecionado: nada é levantado), -5 para um cartão desconhecido ou não desenhado (oculto, numa coluna recolhida ou oculta, fora da pesquisa, para lá do limite de demonstração), -2 quando o componente não está criado
of_selected_key ( )A chave do cartão selecionado, seja quem for que o selecionou; vazia se nenhum. Lida em direto
of_set_field (string as_key, string as_field, string as_value)Dá a um cartão um campo seu, para is_card_template; prevalece sobre uma coluna do DataStore com o mesmo nome. Um nome de campo: letras, algarismos e _, sem algarismo inicial. Devolve 0 depois de definido, -5 para um cartão desconhecido ou um nome inválido, -2 quando o componente não está criado
of_set_layout (string as_layout_json)Devolve uma disposição lida com of_get_layout ou recebida por ue_layout_changed: as colunas que nomeia pela sua ordem, depois as outras pela delas, cada uma com o seu recolhimento; uma coluna que o quadro não contém é ignorada. ue_layout_changed é levantado uma vez se algo mudou (nem ue_column_moved nem ue_column_toggled: repõe um estado). Devolve 0 depois de aplicada, -5 quando o texto está vazio ou não é um objeto JSON, -2 quando o componente não está criado

Eventos #

EventoAcionado quando
ue_card_moved (string as_key, string as_from_column, string as_to_column, long al_position, long al_from_position)Um cartão foi deslocado: arrastado, deslocado com o teclado, ou pelo seu código (of_move_card). As duas chaves de coluna (a mesma para uma deslocação dentro de uma coluna), al_position o seu lugar na coluna de chegada e al_from_position o que deixou, a partir de 1. O cartão já está no seu lugar; com ib_write_back, o DataStore já está escrito
ue_card_moving (string as_key, string as_from_column, string as_to_column, long al_position) → booleanCancelável, colocado antes de uma deslocação, só quando ib_veto_moves = true: arrastar, teclado e of_move_card. Devolver FALSE deixa o cartão onde está. O lugar para um limite estrito: of_column(as_to_column).of_visible_count() >= il_limit
ue_card_clicked (string as_key)Um cartão foi clicado (e selecionado). Não no fim de um arrastar
ue_card_opened (string as_key)Duplo clique num cartão, ou Enter: abra o seu editor
ue_card_rclicked (string as_key, long al_x, long al_y)Clique direito num cartão (selecionado primeiro). al_x, al_y são píxeis do ecrã; para um menu PowerBuilder, PopMenu(PointerX(), PointerY()) da sua janela
ue_column_moved (string as_key, long al_from, long al_to)Uma coluna foi deslocada (ib_reorderable): o seu cabeçalho arrastado, Ctrl + Shift + Esquerda / Direita, ou o seu código (of_move_column). al_from e al_to são os seus lugares entre todas as colunas, ocultas incluídas, a partir de 1. A coluna já está no seu lugar; segue-se ue_layout_changed
ue_column_moving (string as_key, long al_from, long al_to) → booleanCancelável, colocado antes de uma coluna se deslocar, só quando ib_veto_moves = true (o mesmo opt-in dos cartões): arrastar do cabeçalho, teclado e of_move_column. Devolver FALSE deixa a coluna onde está, e of_move_column devolve -4
ue_column_rclicked (string as_key, long al_x, long al_y)Clique direito no cabeçalho de uma coluna. Píxeis do ecrã, como ue_card_rclicked
ue_column_toggled (string as_key, boolean ab_collapsed)Uma coluna recolheu-se (ab_collapsed = TRUE) ou abriu-se: a sua seta, um duplo clique na sua faixa, o teclado no seu cabeçalho (Enter ou Espaço recolhem ou abrem, + abre, - recolhe), ou o seu ib_collapsed definido pelo seu código
ue_delete_requested (string as_key)Delete foi premido no cartão selecionado. O quadro não retira nada: of_remove_card depois de a sua aplicação concordar. Nunca num cartão ou quadro só de leitura
ue_layout_changed (string as_layout_json)A disposição mudou: uma coluna deslocada ou recolhida, pelo utilizador ou pelo seu código, ou of_set_layout. as_layout_json é a disposição inteira, tal como of_get_layout a dá: guarde-a
ue_new_requested (string as_column, string as_title)O utilizador pede um novo cartão numa coluna: o seu botão + Adicionar um cartão, a tecla Insert ou um duplo clique na sua parte vazia; as_title é o título escrito no campo de adição rápida (ib_quick_add), vazio caso contrário. O quadro não acrescenta nada: of_add_card, depois da sua própria caixa de diálogo se quiser
ue_selection_changed (string as_from_key, string as_key)O cartão selecionado mudou: clique, teclado, o seu código (of_select_card, of_clear_selection), ou o cartão selecionado saiu do desenho (retirado, oculto, recolhido, fora da pesquisa: as_key está então vazia)
ue_write_back_failed (string as_key, string as_col, string as_value, string as_reason)ib_write_back: o DataStore recusou a nova coluna de um cartão deslocado (um valor que a sua coluna não aceita, uma linha eliminada desde o carregamento). Também uma ordem recusada (as_reason começa então por « the rank of row »). Nada fica escrito: o que estava é reposto. O cartão não se deslocou (o DataStore é escrito antes da deslocação), ue_card_moved não é levantado e of_move_card devolve -4
ue_ready ( )O componente terminou o carregamento; tudo o que foi enviado antes foi reproduzido
ue_runtime_missing ( )O runtime WebView2 está ausente: o componente permanece vazio
ue_bg_color (long al_color)O componente calculou a cor de fundo do respetivo tema; o userobject já a adotou (backcolor)

Teclado e rato #


Exemplos #

Um limite estrito e uma regra de passagem #

// Once, after the board is built : ask before each move
uo_board.ib_veto_moves = true

// event ue_card_moving of uo_board : a card reaches Done only from Review
if as_to_column = "done" and as_from_column <> "review" then return false

// and a column past its limit takes no more card (what its header counts :
// the visible cards)
if as_to_column <> as_from_column then
	if this.of_column(/*key*/ as_to_column).il_limit > 0 and this.of_column(/*key*/ as_to_column).of_visible_count() >= this.of_column(/*key*/ as_to_column).il_limit then return false
end if
return true

Reencontrar as colunas no próximo arranque #

// Once, after the board is built : the user may move the columns
uo_board.ib_reorderable = true

// The layout stored at the last start, if any
uo_board.of_set_layout(/*layout_json*/ ProfileString(gs_ini, "board", "layout", ""))

// event ue_layout_changed of uo_board : store every change
SetProfileString(gs_ini, "board", "layout", as_layout_json)

Abrir um cartão na sua janela #

// event ue_card_opened of uo_board : the row of the card, edited in your window
OpenWithParm(w_task_edit, uo_board.of_card(/*key*/ as_key).of_row())

// The row may have changed : the card follows it
uo_board.of_reload_row(/*row*/ uo_board.of_card(/*key*/ as_key).of_row())

Um quadro de equipa: pontos, largura partilhada, adição rápida #

// The estimate of a card, a field of our own
uo_board.of_set_field(/*key*/ "t1", /*field*/ "points", /*value*/ "5")

// Every header : its cards, its limit, the sum of the points of its cards
uo_board.is_count_template = "{count}{?limit}/{limit}{/limit} - {sum:points} pts"

// The open columns share the width of the board
uo_board.ii_column_width = 0

// + Add a card opens a title field at the foot of the column
uo_board.ib_add_button = true
uo_board.ib_quick_add = true

// event ue_new_requested of uo_board : the card typed, with a key of ours
uo_board.of_add_card(/*key*/ "new" + String(Cpu()), /*column*/ as_column, /*title*/ as_title)

Boas práticas #

Herdado da base comum #

Estes membros existem em todos os componentes visuais — não são próprios deste. São detalhados uma só vez, nos capítulos transversais; esta tabela apenas diz onde os ler.

MembrosFunçãoDetalhado em
of_count · of_keys_at · of_hasPercorrer o que o componente contém3.2 Os items
of_resetRepor o componente a zero3.6 Repor um componente a zero: of_reset()
of_register_shortcut · of_clear_shortcutsAtalhos de teclado do componente3.5 Os atalhos de teclado
of_is_created · of_is_ready · of_get_last_errorSe nasceu, se está pronto, o que falhou3.7 Diagnóstico
of_save_as_png · of_save_as_jpgExportar a renderização como imagem3.8 Exportar a representação como imagem
of_set_redrawAgrupar as alterações num único repinte3.10 Boas práticas
of_preload_iconsÍcones mostrados sem atrasoApresentação instantânea: of_icon
of_set_translationTraduzir uma legenda do componente5.2 Adaptar uma etiqueta: of_set_translation
of_focus_webviewDar o foco ao componente6.4 Teclado e focus
of_print · of_print_to_pdfImprimir, ou escrever um PDF6.9 Imprimir
of_set_property · of_get_property · of_component_nameControlar uma propriedade pelo nome3.1 O motor de propriedades
is_accessible_name · is_accessible_descriptionO nome e a descrição que um leitor de ecrã diz3.4 Propriedades e eventos opcionais

Duas ajudas não são herdadas: of_icon e of_escape_markup vivem em n_pbt_utils. Declare um — n_pbt_utils lnv_utils, nada a criar — e chame-as nele.

← Referência dos componentes · Índice do guia