{"id":32483,"date":"2023-03-08T16:29:03","date_gmt":"2023-03-08T15:29:03","guid":{"rendered":"https:\/\/mimolive.com\/?post_type=user-manual&#038;p=32483"},"modified":"2025-06-16T19:35:00","modified_gmt":"2025-06-16T17:35:00","slug":"controlo-remoto-presets-api","status":"publish","type":"user-manual","link":"https:\/\/mimolive.com\/pt\/user-manual\/custom-layers\/remote-control-presets-api\/","title":{"rendered":"API de predefini\u00e7\u00f5es de controlo remoto"},"content":{"rendered":"<p>Se estiver a criar uma camada personalizada, existe a possibilidade de incluir predefini\u00e7\u00f5es de controlo personalizadas na sua camada. Isto \u00e9 \u00fatil se a sua camada tiver bot\u00f5es de press\u00e3o que controlam o comportamento da sua camada quando est\u00e1 ativa.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"data-structure\">Estrutura de dados<\/h3>\n\n\n\n<p>A estrutura de dados seguinte \u00e9 um exemplo de sa\u00edda que tem de estar presente na composi\u00e7\u00e3o, sob a chave de sa\u00edda da estrutura `tvOut_ControlRepresentations`:<\/p>\n\n\n\n<pre class=\"wp-block-code\" data-no-translation=\"\"><code>{\n  \"tvOut_ControlRepresentations\": &#91;\n    {\n      \"title\": \"Compact Cut's\",\n      \"buttons\": &#91;\n        {\n          \"actions\": &#91;\n            {\n              \"layerId\": \"03627C25-CC8A-474F-A738-C4DEB3353FA4\",\n              \"variantId\": \"F6F52194-06DE-462E-983A-8D505C533A69\",\n              \"type\": \"signal\",\n              \"signalKey\": \"tvGroup_Control__Cut_1_TypeSignal\",\n              \"signalName\": \"Cut 1\"\n            }\n          ],\n          \"liveState\": {\n            \"layerId\": \"03627C25-CC8A-474F-A738-C4DEB3353FA4\",\n            \"variantId\": \"F6F52194-06DE-462E-983A-8D505C533A69\",\n            \"dynamicSourceId\": \"tvIn_VideoSourceAImage\"\n          },\n          \"sourcePreview\": {\n            \"layerId\": \"03627C25-CC8A-474F-A738-C4DEB3353FA4\",\n            \"variantId\": \"F6F52194-06DE-462E-983A-8D505C533A69\",\n            \"dynamicSourceId\": \"tvIn_VideoSourceAImage\"\n          },\n          \"color\": \"#BBBBBB\",\n          \"width\": 1,\n          \"height\": 1,\n          \"x\": 0,\n          \"y\": 0,\n          \"icon\": \"facetime-video\",\n          \"dynamicText\": {\n            \"template\": \"{{inputputValues.tvIn_VideoSourceAName}}\",\n            \"layerId\": \"03627C25-CC8A-474F-A738-C4DEB3353FA4\",\n            \"variantId\": \"F6F52194-06DE-462E-983A-8D505C533A69\"\n          }\n        }\n      ]\n    }\n  ]\n}<\/code><\/pre>\n\n\n\n<p>Uma predefini\u00e7\u00e3o tem um \"t\u00edtulo\" e um conjunto de \"bot\u00f5es\", mas um \u00fanico bot\u00e3o tamb\u00e9m \u00e9 aceit\u00e1vel.<\/p>\n\n\n<section class=\"boinx_section\">\n    <div class=\"main_div\">\n        <div class=\"left_div_icon\">\n                <i class=\"icon_highlight\">*<\/i>\n        <\/div>\n\n        <div class=\"right_div_text\">\n                <div><p class=\"text_highlight_headline\"><\/p><\/div>\n                <div><p class=\"text_highlight\">As chaves `layerId` e `variantId` t\u00eam de ser preenchidas dinamicamente com os dados de cadeia das chaves de entrada de composi\u00e7\u00e3o `tvIn_LayerIdentifier` e `tvIn_RuntimeIdentifier`.<\/p><\/div>\n        <\/div>    \n    <\/div>\n<\/section>\n\n\t\t<style>.boinx_section {\n    margin:30px 0;\n    padding:10px;\n    background-color:rgb(217,237,248);\n    border-radius: 8px;\n  \n}\n\n.icon_highlight {\n    display:block;\n    padding:5px;\n    font-size:80px;\n    color:rgb(58,134,172);\n    line-height:60px;\n}\n\n.text_highlight {\n    color:rgb(58,134,172);\n}\n\n.text_highlight_headline{\n    font-weight:bold;\n    color:rgb(58,134,172);\n}\n\n.main_div\n{\n    display:flex !IMPORTANT;\n    flex-wrap: wrap;\n    flex-direction: row;\n    justify-content : flex-start;\n    align-items : flex-start\n    align-content : flex-start;\n}\n.left_div_icon{\n    display:flex !IMPORTANT;\n    width:40px;\n    padding:0;\n    margin:10px 20px 10px 10px;\n    \n}\n.right_div_text{\n    display:flex !IMPORTANT;\n    flex-direction: column;\n    flex-grow: 1;\n    padding:10px;\n    margin:0;\n    width:200px;\n    }<\/style>\n\t\t\n\n\n<h3 class=\"wp-block-heading\" id=\"using-the-remote-control-preset-api-in-quartz-composer\">Utilizar a predefini\u00e7\u00e3o do controlo remoto <span class=\"caps\">API<\/span> em Quartz Composer<\/h3>\n\n\n\n\n\n<p>As camadas de constru\u00e7\u00e3o do mimoLive est\u00e3o a utilizar um <span class=\"caps\">LUA<\/span> para gerar dinamicamente esta estrutura de dados porque o Quartz Composer n\u00e3o suporta a gera\u00e7\u00e3o de estruturas de dados por si s\u00f3. O <span class=\"caps\">LUA<\/span> O script cont\u00e9m uma fun\u00e7\u00e3o complexa addButton() que pode ser utilizada para criar a estrutura de um \u00fanico bot\u00e3o. Normalmente, basta utilizar esta fun\u00e7\u00e3o e n\u00e3o \u00e9 necess\u00e1rio modific\u00e1-la. Por isso, \u00e9 muito f\u00e1cil criar novas predefini\u00e7\u00f5es de controlo remoto para a sua pr\u00f3pria camada.<\/p>\n\n\n\n<p>Por exemplo, este \u00e9 o <span class=\"caps\">LUA<\/span> para gerar os controlos remotos para a camada Stop Watch. Tenha em aten\u00e7\u00e3o que pode adotar este c\u00f3digo alterando apenas as linhas 15 a 29 do c\u00f3digo.<\/p>\n\n\n\n<pre class=\"wp-block-code\" data-no-translation=\"\"><code>inLayerIdentifier = QC_STRING\ninVariantIdentifier = QC_STRING\noutControlRepresentations = QC_STRUCT\nmain = function()\n  controlRepresentations = {}\n  -- first representation\n  controlRepresenation = {}\n  -- {\n    controlRepresenation&#91;\"Title\"] = \"Stop Watch\"\n    buttons = {}\n    -- {\n      -- addButton(buttonsTable, buttonTitle, subTitle, positionX, positionY, width, height, color, icon, actionTarget, liveStateSource, previewSource)\n      -- first row\n      addButton(buttons, \"{{outputValues.tvOut_TimeString}}\", \"\", 0, 0, 2, 1, \"#333333\", \"\", \"\", \"\", \"\")\n      addButton(buttons, \"Live\", \"{\\{name\\}}\", 2, 0, 1, 1, \"#333333\", \"\", \"toggleLive\", \"layerVariant\", \"\")\n      -- second row\n      addButton(buttons, \"Start\", \"\", 0, 1, 1, 1, \"#33cc33\", \"play\", \"tvGroup_Control__Start_TypeSignal\", \"\", \"\")\n      addButton(buttons, \"Stop\", \"\", 1, 1, 1, 1, \"#cc3333\", \"pause\", \"tvGroup_Control__Stop_TypeSignal\", \"\", \"\")\n      addButton(buttons, \"Reset\", \"\", 2, 1, 1, 1, \"#cccc33\", \"stop\", \"tvGroup_Control__Reset_TypeSignal\", \"\", \"\")\n    -- }\n    controlRepresenation&#91;\"buttons\"] = buttons\n  -- }\n  table.insert(controlRepresentations , controlRepresenation)\n  outControlRepresentations = controlRepresentations\nend\nfunction addButton(buttonsTable, buttonTitle, buttonSubTitle, positionX, positionY, width, height, color, icon, actionTarget, liveStateSource, previewSource)\n  local button = {}\n  -- {\n  if #buttonTitle &amp;gt; 0 then\n    if string.find(buttonTitle, \"{{\") then\n      -- dynamic titel\n      local dynamicText = {}\n      -- {\n        dynamicText&#91;\"layerId\"] = inLayerIdentifier\n        dynamicText&#91;\"variantId\"] = inVariantIdentifier\n        dynamicText&#91;\"template\"] = buttonTitle\n      -- }\n      button&#91;\"dynamicText\"] = dynamicText\n    else\n      -- static title\n      button&#91;\"text\"] = buttonTitle\n    end -- if dynamic\n  end -- if buttonTitle\n  if #buttonSubTitle &amp;gt; 0 then\n    if string.find(buttonSubTitle, \"{{\") then\n      -- dynamic titel\n      local dynamicSubText = {}\n      -- {\n        dynamicSubText&#91;\"layerId\"] = inLayerIdentifier\n        dynamicSubText&#91;\"variantId\"] = inVariantIdentifier\n        dynamicSubText&#91;\"template\"] = buttonSubTitle\n      -- }\n      button&#91;\"dynamicSubText\"] = dynamicSubText\n    else\n      -- static title\n      button&#91;\"subtext\"] = buttonSubTitle\n    end -- if dynamic\n  end -- if buttonSubTitle\n  button&#91;\"x\"] = positionX\n  button&#91;\"y\"] = positionY\n  button&#91;\"width\"] = width\n  button&#91;\"height\"] = height\n  if #color &amp;gt; 0 then\n    button&#91;\"color\"] = color\n  end -- if\n  if #actionTarget &amp;gt; 0 then\n    local actions = {}\n    -- {\n      local action = {}\n      -- {\n        action&#91;\"layerId\"] = inLayerIdentifier\n        action&#91;\"variantId\"] = inVariantIdentifier\n        if string.ends(actionTarget, \"_TypeSignal\") then\n          action&#91;\"type\"] = \"signal\"\n          action&#91;\"signalKey\"] = actionTarget\n          action&#91;\"signalName\"] = buttonTitle\n        elseif actionTarget == \"toggleLive\" then\n          action&#91;\"type\"] = \"toggleLive\"\n        else\n          action&#91;\"type\"] = \"toggleSwitch\"\n          action&#91;\"toggleSwitchKey\"] = actionTarget\n          action&#91;\"toggleSwitchName\"] = buttonTitle\n        end -- if\n      -- }\n      table.insert(actions , action)\n    -- }\n    button&#91;\"actions\"] = actions\n  end -- if actionTarget\n  if #liveStateSource &amp;gt; 0 then\n    local liveState = {}\n    -- {\n      liveState&#91;\"layerId\"] = inLayerIdentifier\n      liveState&#91;\"variantId\"] = inVariantIdentifier\n      if string.starts(liveStateSource,\"tvIn_VideoSource\") then\n        -- get the live state from a dynamic video source\n        liveState&#91;\"dynamicSourceId\"] = liveStateSource\n      elseif liveStateSource == \"layerVariant\" then\n        -- nor more information needed\n      else\n        liveState&#91;\"propertyPath\"] = liveStateSource            end -- if\n    -- }\n    button&#91;\"liveState\"] = liveState\n  end -- if liveState Source\n  if #previewSource &amp;gt; 0 then\n    local sourcePreview = {}\n    -- {\n      sourcePreview&#91;\"layerId\"] = inLayerIdentifier\n      sourcePreview&#91;\"variantId\"] = inVariantIdentifier\n      sourcePreview&#91;\"dynamicSourceId\"] = previewSource\n    -- }\n    button&#91;\"sourcePreview\"] = sourcePreview\n  end -- if\n  if #icon &amp;gt; 0 then\n    -- See bottom of documentation page for list of avaiable icon names\n    button&#91;\"icon\"] = icon\n  end -- if\n  -- }\n  table.insert(buttonsTable, button)\nend -- func\nfunction string.starts(String,Start)\n   return string.sub(String,1,string.len(Start))==Start\nend\nfunction string.ends(String,End)\n   return End=='' or string.sub(String,-string.len(End))==End\nend<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Button Posicionamento<\/h3>\n\n\n\n<p>Quando se utilizam v\u00e1rios bot\u00f5es, a disposi\u00e7\u00e3o dos bot\u00f5es tem de ser controlada manualmente. Isto significa que os bot\u00f5es s\u00e3o posicionados na grelha utilizando os atributos \"x\" e \"y\", que, tal como os atributos \"largura\" e \"altura\", s\u00e3o dados em m\u00faltiplos de c\u00e9lulas da grelha. As posi\u00e7\u00f5es s\u00e3o relativas \u00e0 c\u00e9lula superior esquerda da grelha para a qual o grupo de bot\u00f5es foi arrastado.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"button-positioning\">Button Ac\u00e7\u00f5es<\/h3>\n\n\n\n<p>Os Buttons podem ter v\u00e1rias ac\u00e7\u00f5es, uma \u00fanica a\u00e7\u00e3o ou nenhuma. Existem v\u00e1rias combina\u00e7\u00f5es v\u00e1lidas de objectivos de a\u00e7\u00e3o e tipos de a\u00e7\u00e3o.<br>Note-se que as ac\u00e7\u00f5es \"textInput\" e \"numericInput\" devem ser independentes, uma vez que n\u00e3o \u00e9 garantida uma experi\u00eancia de utilizador consistente no controlo remoto.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"action-targets\">Objectivos de a\u00e7\u00e3o<\/h4>\n\n\n\n<p>Os objectivos de a\u00e7\u00e3o s\u00e3o elementos dentro do documento mimoLive. S\u00e3o abordados de forma hier\u00e1rquica:<\/p>\n\n\n\n<p>O \"ID do documento\" \u00e9 sempre desenhado em tempo de execu\u00e7\u00e3o, pelo que n\u00e3o tem de estar presente na predefini\u00e7\u00e3o.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se nem \"layerId\" nem \"variantId\" forem indicados, a a\u00e7\u00e3o ser\u00e1 desencadeada no pr\u00f3prio documento.<\/li>\n\n\n\n<li>Se for indicado \"layerId\", a a\u00e7\u00e3o ser\u00e1 desencadeada na camada especificada.<\/li>\n\n\n\n<li>Se \"layerId\" <b>e<\/b> \"variantId\" s\u00e3o fornecidos, a a\u00e7\u00e3o ser\u00e1 desencadeada na variante especificada. Apenas neste caso, podem ser especificados os adicionais \"toggleSwitchKey\" ou \"signalKey\" (ver Tipos de a\u00e7\u00e3o abaixo).<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"action-types\">Tipos de a\u00e7\u00e3o<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><th>Tipo de a\u00e7\u00e3o<\/th><th>Explica\u00e7\u00e3o<\/th><th>Atributos adicionais<\/th><th>Objectivos v\u00e1lidos<\/th><\/tr><tr><td>toggleLive<\/td><td>Alternar estado em direto<\/td><td>nenhum<\/td><td>Documento (Iniciar\/Parar exibi\u00e7\u00e3o), Camada, Variante<\/td><\/tr><tr><td>setLive<\/td><td>Definir o estado em direto para \"em direto\"<\/td><td>nenhum<\/td><td>Documento (Start Show), Camada, Variante<\/td><\/tr><tr><td>setOff<\/td><td>Definir o estado ativo para \"desligado\"<\/td><td>nenhum<\/td><td>Documento (Stop Show), Camada, Variante<\/td><\/tr><tr><td>sinal<\/td><td>Acionar um sinal<\/td><td>signalKey, signalName (recomendado)<\/td><td>Variante<\/td><\/tr><tr><td>toggleSwitch<\/td><td>Alternar um valor de entrada booleano<\/td><td>toggleSwitchKey, toggleSwitchName (recomendado)<\/td><td>Variante<\/td><\/tr><tr><td>textInput<\/td><td>Abre um campo de entrada de texto que, ao ser enviado, actualiza o valor em inputKey.<\/td><td>inputKey, inputName (recomendado)<\/td><td>Camada, Variante, Fonte<\/td><\/tr><tr><td>num\u00e9ricoEntrada<\/td><td>Controlo deslizante que controla um valor num\u00e9rico em inputKey.<\/td><td>inputKey, inputDescription (objeto com valores m\u00ednimos e m\u00e1ximos), inputName (recomendado)<\/td><td>Camada, Variante, Fonte<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n<section class=\"boinx_section\">\n    <div class=\"main_div\">\n        <div class=\"left_div_icon\">\n                <i class=\"icon_highlight\">*<\/i>\n        <\/div>\n\n        <div class=\"right_div_text\">\n                <div><p class=\"text_highlight_headline\"><\/p><\/div>\n                <div><p class=\"text_highlight\">Os tipos de a\u00e7\u00e3o \"textInput\" e \"numericInput\" est\u00e3o dispon\u00edveis desde o mimoLive 5.2.<\/p><\/div>\n        <\/div>    \n    <\/div>\n<\/section>\n\n\n\n\n<h3 class=\"wp-block-heading\" id=\"button-live-state\">Button Live State<\/h3>\n\n\n\n<p>O objeto \"liveState\" pode ser utilizado para configurar o estado da luz de contagem do bot\u00e3o, que pode estar ligado (marca\u00e7\u00e3o vermelha), em transi\u00e7\u00e3o (marca\u00e7\u00e3o amarela) ou desligado (sem marca\u00e7\u00e3o).<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"live-state-sources\">Fontes do Estado em direto<\/h4>\n\n\n\n<p>\u00c0 semelhan\u00e7a dos alvos de ac\u00e7\u00f5es de bot\u00e3o, o estado em direto pode ser obtido a partir de v\u00e1rias fontes:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>O \"ID do documento\" \u00e9 sempre desenhado em tempo de execu\u00e7\u00e3o, pelo que n\u00e3o tem de estar presente na predefini\u00e7\u00e3o.<\/li>\n\n\n\n<li>Se nem \"layerId\" nem \"variantId\" forem indicados, \u00e9 utilizado o estado ativo do documento (a apresenta\u00e7\u00e3o come\u00e7ou ou n\u00e3o).<\/li>\n\n\n\n<li>Se for indicado \"layerId\", \u00e9 utilizado o estado ativo da camada.<\/li>\n\n\n\n<li>Se forem indicados \"layerId\" e \"variantId\", \u00e9 utilizado o estado ativo da variante.<br>- Apenas neste caso, o adicional \"propertyPath\" pode ser especificado para indicar que deve ser utilizada uma propriedade booleana nos valores de entrada ou de sa\u00edda da variante.<br>- Outra possibilidade (mutuamente exclusiva de propertyPath!) \u00e9 especificar uma propriedade \"dynamicSourceId\" que redirecciona a pesquisa de estado real para uma fonte (obtida por ID), que respeita as altera\u00e7\u00f5es din\u00e2micas da fonte selecionada (por exemplo, no comutador de v\u00eddeo). O valor de \"dynamicSourceId\" \u00e9 procurado nos valores de entrada da variante.<\/li>\n<\/ul>\n\n\n\n<p><i>*<\/i>Indique o caminho completo para a propriedade, come\u00e7ando na variante como raiz, por exemplo, \"inputValues.some_Boolean_Property\" ou \"outputValues.other_Property\".<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Se for indicado \"sourceId\", \u00e9 utilizado o estado ativo da fonte.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\" id=\"button-text\">Button Texto<\/h3>\n\n\n\n<p>Os bot\u00f5es de a\u00e7\u00e3o podem apresentar linhas de texto prim\u00e1rias e secund\u00e1rias, podendo ambas ser de natureza est\u00e1tica ou din\u00e2mica.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"primary-text\">Texto prim\u00e1rio<\/h4>\n\n\n\n<p>Este texto ser\u00e1 o principal indicador do que o bot\u00e3o far\u00e1 para o utilizador. Se a predefini\u00e7\u00e3o do bot\u00e3o contiver uma propriedade de texto, trata-se de um texto est\u00e1tico que ser\u00e1 apresentado tal como est\u00e1.<\/p>\n\n\n\n<p>Em alternativa, pode ser fornecido um dynamicText que permite a inclus\u00e3o da camada mimoLive ou propriedades variantes utilizando uma sintaxe de modelo simples. Na cadeia de modelos, os caracteres regulares podem ser combinados com caminhos de propriedades entre par\u00eanteses rectos:<\/p>\n\n\n\n<pre class=\"wp-block-code\" data-no-translation=\"\"><code>\"template\": \"{\\{propertyPath\\}}\"<\/code><\/pre>\n\n\n\n<p>Os caminhos de propriedade s\u00e3o avaliados relativamente ao objeto que \u00e9 resolvido utilizando \"layerId\", \"variantId\", \"sourceId\" e \"filterId\". A resolu\u00e7\u00e3o de objectivos segue estas regras:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>O \"ID do documento\" \u00e9 sempre desenhado em tempo de execu\u00e7\u00e3o, pelo que n\u00e3o tem de estar presente na predefini\u00e7\u00e3o.<\/li>\n\n\n\n<li>Se nem \"layerId\" nem \"variantId\" forem indicados, os caminhos das propriedades s\u00e3o avaliados relativamente ao documento<\/li>\n\n\n\n<li>Se for dado \"layerId\" (e opcionalmente \"variantId\"), os caminhos das propriedades s\u00e3o avaliados relativamente a uma camada\/variante.<\/li>\n\n\n\n<li>\u00c9 poss\u00edvel aceder \u00e0 camada-m\u00e3e de uma variante iniciando um caminho com \"camada\", como \"aslayer.name\".<\/li>\n<\/ul>\n\n\n<section class=\"boinx_section\">\n    <div class=\"main_div\">\n        <div class=\"left_div_icon\">\n                <i class=\"icon_highlight\">*<\/i>\n        <\/div>\n\n        <div class=\"right_div_text\">\n                <div><p class=\"text_highlight_headline\"><\/p><\/div>\n                <div><p class=\"text_highlight\">O primeiro segmento de caminho dos valores de entrada e sa\u00edda tem de ser em mai\u00fasculas (\"inputValues.tvIn...\") e n\u00e3o em min\u00fasculas (\"input-values.tvIn...\") como nos documentos API.<\/p><\/div>\n        <\/div>    \n    <\/div>\n<\/section>\n\n\n\n\n<ul class=\"wp-block-list\">\n<li>O texto est\u00e1tico ter\u00e1 sempre preced\u00eancia sobre o texto din\u00e2mico, porque isto permite aos utilizadores substituir o texto din\u00e2mico por algum texto personalizado que possa ser mais \u00fatil na sua situa\u00e7\u00e3o.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"secondary-text\">Texto secund\u00e1rio<\/h4>\n\n\n\n<p>Para dar ao utilizador mais informa\u00e7\u00f5es sobre um bot\u00e3o, como o nome da sua camada principal, pode ser fornecido um texto secund\u00e1rio utilizando as propriedades \"subtext\" ou \"dynamicSubText\".<\/p>\n\n\n\n<p>A sintaxe do modelo e a resolu\u00e7\u00e3o de objectos seguem exatamente as mesmas regras que o texto principal.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\" id=\"button-text-and-icon-size\">Button Tamanho do texto e do \u00edcone<\/h4>\n\n\n\n<p>O texto e os \u00edcones nos bot\u00f5es podem variar de tamanho consoante o contexto. Com a op\u00e7\u00e3o \"fontScale\", pode especificar uma escala relativa a um tamanho predefinido calculado para o tamanho atual do ecr\u00e3. \"1\" ser\u00e1 o tamanho predefinido. Menos de 1 (por exemplo, 0,8) reduzir\u00e1 o tamanho da fonte e mais de 1 (por exemplo, 1,5) aument\u00e1-lo-\u00e1.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Button Pr\u00e9-visualiza\u00e7\u00e3o<\/h3>\n\n\n\n<p>Os bot\u00f5es de a\u00e7\u00e3o podem apresentar uma imagem de pr\u00e9-visualiza\u00e7\u00e3o da fonte que est\u00e3o a controlar, ou de qualquer outra fonte dispon\u00edvel no documento.<\/p>\n\n\n\n<p>Dependendo do facto de a fonte ser est\u00e1tica (apenas imagens que foram arrastadas para o mimoLive), uma imagem est\u00e1tica <span class=\"caps\">PNG<\/span> da fonte \u00e9 carregada uma vez que suporta um canal alfa. Para qualquer outra fonte, um <span class=\"caps\">JPEG<\/span> A representa\u00e7\u00e3o da fonte \u00e9 actualizada regularmente. A taxa de atualiza\u00e7\u00e3o pretendida para fontes din\u00e2micas \u00e9 de 5 fotogramas por segundo, mas esta taxa \u00e9 reduzida quando a velocidade de liga\u00e7\u00e3o \u00e0 rede \u00e9 insuficiente para o carregamento repetido de fotogramas de pr\u00e9-visualiza\u00e7\u00e3o.<\/p>\n\n\n\n<p>Atualmente, n\u00e3o \u00e9 suportado apresentar a sa\u00edda do programa do documento num bot\u00e3o de a\u00e7\u00e3o. As imagens predefinidas da camada, embora n\u00e3o sejam vis\u00edveis na lista de origens, est\u00e3o dispon\u00edveis para pr\u00e9-visualiza\u00e7\u00e3o.<\/p>\n\n\n\n<p>Para especificar uma pr\u00e9-visualiza\u00e7\u00e3o de origem, \u00e9 utilizado um mecanismo de resolu\u00e7\u00e3o de objectos:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>O \"ID do documento\" \u00e9 sempre desenhado em tempo de execu\u00e7\u00e3o, pelo que n\u00e3o tem de estar presente na predefini\u00e7\u00e3o.<\/li>\n\n\n\n<li>Se for indicado \"sourceId\", a fonte com esse ID \u00e9 utilizada para a pr\u00e9-visualiza\u00e7\u00e3o.<\/li>\n\n\n\n<li>Se todos os campos \"layerId\", \"variantId\" e \"dynamicSourceId\" forem fornecidos, o ID da fonte ser\u00e1 procurado na variante da camada especificada sob a chave em \"dynamicSourceId\". Isto pode ser utilizado para referenciar fontes como a fonte A-G do comutador de v\u00eddeo, mesmo quando estas s\u00e3o alteradas no documento.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Button Cor<\/h3>\n\n\n\n<p>Ao utilizar o atributo \"color\", os bot\u00f5es podem ser coloridos com qualquer c\u00f3digo de cor que seja represent\u00e1vel em <span class=\"caps\">HTML<\/span> (por exemplo, \"#f80\", \"#ff0088\", \"orange\", ou \"rgb(255, 66, 88)\").<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Button \u00cdcone<\/h3>\n\n\n\n<p>Os Buttons podem apresentar um \u00edcone para indicar a sua funcionalidade. Para ver uma lista de todos os \u00edcones dispon\u00edveis, abra http:\/\/localhost:8989\/icons\/demo.html enquanto o mimoLive estiver em execu\u00e7\u00e3o e os controlos remotos estiverem activados.<br>Utilize o nome simples do \u00edcone, por exemplo, \"para tr\u00e1s\" ou \"seta para baixo\".<\/p>","protected":false},"excerpt":{"rendered":"<p>If you are creating a custom layer, there is the possibility of even including custom control presets with your layer. This come in handy if your layer has push buttons that controls the behaviour of your layer when its live. Data Structure The following data structure is a sample output which needs to be present [&hellip;]<\/p>","protected":false},"author":3,"featured_media":0,"parent":32482,"menu_order":1,"template":"","meta":{"_acf_changed":false,"_angie_page":false,"_lmt_disableupdate":"no","_lmt_disable":"","footnotes":""},"categories":[258],"tags":[],"class_list":["post-32483","user-manual","type-user-manual","status-publish","hentry","category-manual"],"acf":[],"_links":{"self":[{"href":"https:\/\/mimolive.com\/pt\/wp-json\/wp\/v2\/user-manual\/32483","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mimolive.com\/pt\/wp-json\/wp\/v2\/user-manual"}],"about":[{"href":"https:\/\/mimolive.com\/pt\/wp-json\/wp\/v2\/types\/user-manual"}],"author":[{"embeddable":true,"href":"https:\/\/mimolive.com\/pt\/wp-json\/wp\/v2\/users\/3"}],"version-history":[{"count":2,"href":"https:\/\/mimolive.com\/pt\/wp-json\/wp\/v2\/user-manual\/32483\/revisions"}],"predecessor-version":[{"id":40973,"href":"https:\/\/mimolive.com\/pt\/wp-json\/wp\/v2\/user-manual\/32483\/revisions\/40973"}],"up":[{"embeddable":true,"href":"https:\/\/mimolive.com\/pt\/wp-json\/wp\/v2\/user-manual\/32482"}],"wp:attachment":[{"href":"https:\/\/mimolive.com\/pt\/wp-json\/wp\/v2\/media?parent=32483"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mimolive.com\/pt\/wp-json\/wp\/v2\/categories?post=32483"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mimolive.com\/pt\/wp-json\/wp\/v2\/tags?post=32483"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}