Автообновление (время) всплывающей подсказки в Griffon SystemTray - PullRequest
0 голосов
/ 04 декабря 2010

Эй, Я думаю об использовании griffon в очень простом приложении DeskTop, которое меня попросили написать. 90% его функций - это несколько щелчков мышью от панели задач, это как «запуск / выбор / остановка». Одна вещь, которая мне понадобится, - это всплывающая подсказка, которая будет обновлять содержимое каждую секунду (или минуту, неважно ;-)), считая время, когда кто-то работал над какой-то конкретной задачей.

Мои вопросы:

  • Как сделать так, чтобы «Вы работали на: $ {HourMin.since model.startedWorkingAt}» регулярно вызывался, чтобы подсказка всегда была актуальной? Используя этот код, он вызывается только один раз, во время создания всплывающей подсказки.
  • Как я могу динамически добавлять "действия" в popupMenu в течение времени жизни приложения?

Спасибо за любые советы - книжные советы, где такие проблемы решаются, также были бы весьма полезны.

actions {
  action(id: 'cutAction',
          name: 'Pokaż okno',
          closure: {
            trayIcon.displayMessage("Cut", "Cut some content", NONE)
          },
          mnemonic: 'T',
          accelerator: shortcut('X'),
          smallIcon: imageIcon(resource: "icons/cut.png", class: Console),
          shortDescription: 'Cut'
  )
//... more actions
}

systemTray {
  trayIcon(id: "trayIcon",
          resource: "/groovy/ui/ConsoleIcon.png",
          class: groovy.ui.Console,
          toolTip: {
            "Youre working for: ${HourMin.since model.startedWorkingAt}"
          },
          actionPerformed: {
//            todo do toggle
          }) {
    popupMenu {
      menuItem(cutAction)
      menuItem(copyAction)
      menuItem(pasteAction)
      separator()
      menuItem(exitAction)
    }
  }
}

Ответы [ 2 ]

1 голос
/ 04 декабря 2010

Вы пытались связать GString?

toolTip: bind {
        "Youre working for: ${HourMin.since model.startedWorkingAt}"
      },
0 голосов
/ 05 декабря 2010

Я нашел способ сделать это, вот как:

// in the controller
def updateSystemTimeTask = new TimerTask() {
  @Override
  void run() {
    onSystemTimeUpdate System.currentTimeMillis()
  }
}

def onSystemTimeUpdate(Long systemTime) {
  if (model.working) {
    view.systemTray.trayIcons[0].toolTip = "Pracujesz już ${HourMin.since model.startedWorkingAt}".toString()
  } else {
    view.systemTray.trayIcons[0].toolTip = = "Obecnie nie pracujesz."
  }
}

// ant this in the initialization method
def myTimer = new Timer().schedule updateSystemTimeTask, initialDelay, minute

Я не уверен, что это самый чистый из возможных способов, но, я думаю, вполне нормально, поскольку все действия выполняются в контроллере представлений.

...