Быстрый и доступный способ попасть в подсказки: посмотрите эти диалоги!

диалоги

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

Недавно я полностью погрузился в разработку своей новой IDE на основе сотовой связи, Olive.jl. Что такое IDE на основе ячеек? Во многом Olive будет похож на стандартное приложение для ноутбука, только с гораздо более расширенными возможностями. Однако я предпочитаю термин IDE на основе ячеек, хотя оба они разумны. Однако Olive в основном работает с модулями и файлами Julia, а также будет включать в себя интерактивных разработчиков с «перетаскиванием». Я планирую сделать один из них для самого Toolips. По сути, это сделало бы интерфейс, похожий на Glade или Visual-Basic.

Хотя может показаться, что это много, и это действительно так, я на самом деле не вижу, чтобы это занимало намного больше времени, чем сами инструменты. Toolips на самом деле была сложной частью этого уравнения, я считаю, что написать настоящее приложение Olive будет довольно легко, хотя на этом пути, безусловно, будут сбои. Какое отношение все это имеет к диалогам?

В Olive есть много инфраструктуры приложений, и если вы хотите узнать больше о дизайне этого проекта и о том, что все это включает, я написал статью, которую можно прочитать здесь:



По сути, Olive нужны диалоговые окна, которые могут всплывать и отображать контент. Таким образом, я решил создать воспроизводимый всплывающий модуль. Этот модуль просто обеспечивает основу для создания быстрых и простых диалогов с помощью всплывающих подсказок. Несмотря на то, что модуль прост, эта простота может дать отличное представление о том, как именно туллипы можно использовать в этом контексте для создания воспроизводимых интерфейсов.

диалоги всплывающих подсказок

Теперь, когда мы знаем, что такое диалоговое окно на самом деле и почему кто-то вроде меня может захотеть его создать, давайте быстро погрузимся в то, как я создаю их в туллипах. Начнем с диалоговой базы. Это диалоговый компонент с собственной верхней панелью:

function dialog(c::Connection,
    name::String, x::String = 35percent, y::String = 20percent;
    label::String = "popup")
    maindia::Component{:dialog} = Component(name, "dialog")
    style!(maindia, "margin-left" => x, "margin-top" => y, "width" => 30percent,
    "position" => "fixed", "display" => "block", "background" => "transparent", "border-width" => 0px)
    # top bar
    topbar::Component{:div} = div("bar$name")
    topblabel::Component{:b} = Toolips.b(text = label, align = "center")
    style!(topblabel, "color" => "white", "display" => "inline-block", "margin-left" => 5px)
    xbutton::Component{:button} = button("topx$name", text = "X", align = "right")
    on(c, xbutton, "click") do cm::ComponentModifier
        remove!(cm, maindia)
    end
    style!(xbutton, "color" => "white", "background-color" => "red", "display" => "inline-block", "float" => "right",
    "border-radius" => 4px, "border-width" => 0px)
    style!(topbar,
    "background-color" => "blue", "border-radius" => 4px, "padding" => 1px, "border-width" => 0px)
    push!(topbar, topblabel, xbutton)
    # contents
    maindia[:children] = [topbar]
    contentarea::Component{:div} = div("content$name")
    style!(contentarea, "background-color" => "white", "border-radius" => "3px",
    "border-top" => "0px", "border-width" => 5px, "border-color" => "gray")
    push!(maindia, contentarea)
    maindia
end

Это, конечно, очень сложно разобрать, если мы посмотрим на все сразу, но, как и построчно, это невероятно просто и включает только простые вызовы методов и декларативное программирование. Начнем с создания самого диалогового компонента:

maindia::Component{:dialog} = Component(name, "dialog")

Нам также нужно стилизовать этот диалог, сделав положение фиксированным и где-то в середине экрана в зависимости от наших значений x и y:

maindia::Component{:dialog} = Component(name, "dialog")
    style!(maindia, "margin-left" => x, "margin-top" => y, "width" => 30percent,
    "position" => "fixed", "display" => "block", "background" => "transparent", "border-width" => 0px)

Затем мы создаем верхнюю панельную часть коробки.

topbar::Component{:div} = div("bar$name")
    topblabel::Component{:b} = Toolips.b(text = label, align = "center")
    style!(topblabel, "color" => "white", "display" => "inline-block", "margin-left" => 5px)
    xbutton::Component{:button} = button("topx$name", text = "X", align = "right")
    on(c, xbutton, "click") do cm::ComponentModifier
        remove!(cm, maindia)
    end

Это включает в себя три разных компонента: один для метки диалогового окна, один для кнопки, которая закрывает диалоговое окно, и один для самой панели. Мы составляем их все вместе здесь:

push!(topbar, topblabel, xbutton)

Наконец, я создаю фактическую часть контента, которая, конечно же, будет меняться, а затем появляется диалоговое окно.

# contents
    maindia[:children] = [topbar]
    contentarea::Component{:div} = div("content$name")
    style!(contentarea, "background-color" => "white", "border-radius" => "3px",
    "border-top" => "0px", "border-width" => 5px, "border-color" => "gray")
    push!(maindia, contentarea)
    maindia

Я планирую использовать этот базовый формат для создания нескольких различных типов диалогов, однако моей первой реализацией такого диалога, конечно же, был простой информационный диалог, который также нуждается в кнопке «ОК», но, безусловно, работает, давайте посмотрим:

function textdialog(c::Connection, name::String; text::String = "text")
    d = dialog(c, name)
    mytp = p("text$name", text = text)
    push!(d[:children]["content$(d.name)"], mytp)
    d
end

Давайте посмотрим, как они выглядят в действии. Я создам быстрый маршрут и запущу функцию:

function home(c::Connection)
    write!(c, DOCTYPE())
    td = textdialog(c, "mytext", text = "hello!")
    write!(c, td)
end
routes = [route("/", home), fourofour]
extensions = Vector{ServerExtension}([Logger(), Session()])
function start(IP::String = "127.0.0.1", PORT::Integer = 8000)
     ws = WebServer(IP, PORT, routes = routes, extensions = extensions)
     ws.start(); ws
end

Итак, это очень простой пример всплывающих окон в их первоначальном виде, однако в этих модулях будет больше, а вместе с ними и гораздо больше интересных вещей, которые можно сделать. Спасибо за чтение, и я надеюсь, что это было интересно и здорово смотреть. Это один из многих проектов toollips, находящихся в стадии разработки, и я невероятно взволнован, чтобы завершить их, так что до тех пор; Спасибо за чтение!