1 Reply Latest reply on Apr 11, 2017 9:39 AM by johnrellis

    How to change a font dynamically?

    Griffel Level 1

      At a dialog I try to change a font dynamically. "Dynamically" means, changes of the font name and size by changes of related controls should affect the font of a static text (or edit field) immediatetly – not only if the values are stored at preferences and read by a subsequent call of the dialog. A test script:

      ***

      local LrDialogs = import 'LrDialogs'

      local LrView = import 'LrView'

      local LrFunctionContext = import 'LrFunctionContext'

      local LrBinding = import 'LrBinding'

      local LrPrefs = import 'LrPrefs'

       

      local LrLogger = import 'LrLogger'

      local log = LrLogger('TestLogger')

      log:enable('logfile')

       

      local f = LrView.osFactory()

      local bind = LrView.bind

      local prefs = LrPrefs.prefsForPlugin()

       

      local text = 'Lorem ipsum dolor sit amet, consectetur adipisici elit, ...'

       

      LrFunctionContext.callWithContext ('showPreview', function(context)

        local props = LrBinding.makePropertyTable(context)

        props.font_name = prefs.fontName or 'Courier'

        props.font_size = prefs.fontSize or 12

        log:trace('Read: ' .. props.font_name .. '/' .. props.font_size)

       

        local previewText = f:static_text {

          title = text,

          font = {

            name = props.font_name,

            size = tonumber(props.font_size)

          },

        }

       

        local function updateFont()

          previewText.font = {

            name = props.font_name,

            size = tonumber(props.font_size),

          }

          log:trace('Change: ' .. props.font_name .. '/' .. props.font_size)

        end

       

        props:addObserver('font_name', updateFont)

        props:addObserver('font_size', updateFont)

       

        local contents = f:column {

          spacing = f:control_spacing(),

          bind_to_object = props,

       

          previewText, -- defined above

          f:separator { fill_horizontal = 1 },

          f:row {

            f:static_text { title = 'Font Name:' },

            f:combo_box {

              value = bind 'font_name',

              width_in_chars = 10,

              immediate = true,

              items = {

                'Courier', -- Mac

                'Courier New', -- Win

                'Lucida Console', -- Win

                'Monaco', -- Mac

              },

            },

            f:static_text { title = 'Font Size:' },

            f:combo_box {

              value = bind 'font_size',

              width_in_chars = 2,

              immediate = true,

              precision = 0,

              items = { 10, 12, 14, 16, },

            },

          },

        }

       

        LrDialogs.presentModalDialog({

          title = 'Font Change Test',

          contents = contents,

        })

       

        log:trace('Save: ' .. props.font_name .. '/' .. props.font_size)

        prefs.fontName = props.font_name

        prefs.fontSize = props.font_size

       

      end)

      ***

       

      The problem is: It works on macOS, not on Windows.

        • 1. Re: How to change a font dynamically?
          johnrellis Most Valuable Participant

          The problem is: It works on macOS, not on Windows.

          Some of these restrictions are documented, many not.  (For example, "background_color" of scrolled_view() cannot be dynamically changed on Windows.)

           

          I worked around the restriction by using two overlapping static_text() controls, one with regular font and one with bold, with the visibility of each dynamically controlled.