Как использовать LuaInterface на Моно / Linux

Конечные автоматы являются слишком обычно низким уровнем, чтобы помочь Вам думать о пользовательском интерфейсе. Они делают хороший выбор реализации для инструментария UI, но существует только слишком много состояний и переходов для описания в нормальном приложении для Вас для описания их вручную.

мне нравится думать о UIs с продолжениями. (Google это - термин является достаточно конкретным, что Вы получите много высококачественных хитов.)

Вместо моих приложений, находящихся в различных состояниях, представленных флагами состояния и режимами, я использую продолжения для управления тем, что приложение делает затем. Является самым легким объяснить с примером. Скажите, что Вы хотите открыть диалоговое окно подтверждения прежде, чем послать электронное письмо. Шаг 1 создает электронное письмо. Шаг 2 получает подтверждение. Шаг 3 посылает электронное письмо. Большинство инструментариев UI требует, чтобы Вы пасовали назад управление к циклу событий после каждого шага, который делает это действительно ужасным, при попытке представить его с конечным автоматом. С продолжениями Вы не думаете с точки зрения шагов силы инструментария на Вас - это - весь один процесс создания и отправки электронного письма. Однако, когда для процесса нужно подтверждение, Вы получаете состояние своего приложения в продолжении и вручаете то продолжение кнопке OK на диалоговом окне подтверждения. Когда хорошо нажимается, Ваше приложение продолжается от того, где это было.

Продолжения относительно редки на языках программирования, но к счастью можно получить вид версии бедного человека с помощью закрытий. Возвращение к электронной почте, отправляющей пример, в точке, необходимо получить подтверждение, которое Вы пишете остальной части процесса как закрытие и затем вручаете то закрытие кнопке OK. Закрытия являются видом подобных анонимных вложенных подпрограмм, которые помнят значения всех Ваших локальных переменных в следующий раз, когда их называют.

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

Обновление: вот полный пример с QT в Ruby. Интересные части находятся в ConfirmationButton и MailButton. Я не QT или эксперт Ruby, таким образом, я ценил бы любые улучшения, которые можно предложить.

require 'Qt4'

class ConfirmationWindow < Qt::Widget
  def initialize(question, to_do_next)
    super()

    label = Qt::Label.new(question)
    ok = ConfirmationButton.new("OK")
    ok.to_do_next = to_do_next
    cancel = Qt::PushButton.new("Cancel")

    Qt::Object::connect(ok, SIGNAL('clicked()'), ok, SLOT('confirmAction()'))
    Qt::Object::connect(ok, SIGNAL('clicked()'), self, SLOT('close()'))
    Qt::Object::connect(cancel, SIGNAL('clicked()'), self, SLOT('close()'))

    box = Qt::HBoxLayout.new()
    box.addWidget(label)
    box.addWidget(ok)
    box.addWidget(cancel)

    setLayout(box)
  end
end

class ConfirmationButton < Qt::PushButton
  slots 'confirmAction()'
  attr_accessor :to_do_next
  def confirmAction()
    @to_do_next.call()
  end
end

class MailButton < Qt::PushButton
  slots 'sendMail()'
  def sendMail()
    lucky = rand().to_s()
    message = "hello world. here's your lucky number: " + lucky
    do_next = lambda {
      # Everything in this block will be delayed until the
      # the confirmation button is clicked. All the local
      # variables calculated earlier in this method will retain
      # their values.
      print "sending mail: " + message + "\n"
    }
    popup = ConfirmationWindow.new("Really send " + lucky + "?", do_next)
    popup.show()
  end
end

app = Qt::Application.new(ARGV)

window = Qt::Widget.new()
send_mail = MailButton.new("Send Mail")
quit = Qt::PushButton.new("Quit")

Qt::Object::connect(send_mail, SIGNAL('clicked()'), send_mail, SLOT('sendMail()'))
Qt::Object::connect(quit, SIGNAL('clicked()'), app, SLOT('quit()'))

box = Qt::VBoxLayout.new(window)
box.addWidget(send_mail)
box.addWidget(quit)

window.setLayout(box)
window.show()
app.exec()
5
задан ulrichb 14 December 2010 в 00:40
поделиться

2 ответа

LuaInterface выглядит как чистый C #, но он использует смешанный режим C ++ / CLI-версию Windows-версии собственной библиотеки Lua, которая смешивает код .NEt и собственный 32-битный код Windows. Компилятора C ++ / CLI для платформ, отличных от Windows, нет, поэтому вы не можете портировать / перекомпилировать код C ++ / CLI, хотя он должен работать на Mono на Win32 (или, возможно, Wine).

Единственный действительно жизнеспособный способ заставить это работать на Mono было бы заставить его использовать P / Invokes вместо C ++ / CLI. Затем вы можете использовать dllmap , чтобы, когда Mono пытается разрешить вызовы P / Invoke для lua51.dll, он перенаправляется на эквивалент Linux, liblua.so.5.1.

6
ответ дан 13 December 2019 в 05:38
поделиться

Старые версии LuaInterface используют чистую оболочку P / Invoke. Вы могли бы использовать это.

Есть также несколько попыток альтернатив, включая мою собственную. http://github.com/jsimmons/LuaSharp

6
ответ дан 13 December 2019 в 05:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: