Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ open Avalonia.FuncUI.Elmish
open Avalonia.FuncUI.ControlCatalog.Views
open Avalonia.Themes.Fluent
open Avalonia.FuncUI
open Avalonia.FuncUI.DSL
open Avalonia.Controls

type MainWindow() as this =
Expand All @@ -26,6 +27,24 @@ type App() =
inherit Application()

override this.Initialize() =
let menu = NativeMenu.create [
NativeMenu.items [
NativeMenuItem.create [
NativeMenuItem.header "File"
NativeMenuItem.isChecked true
NativeMenuItem.isEnabled false
]
]
]
let tray =
TrayIcon.create [
TrayIcon.toolTipText "Control Catalog"
TrayIcon.menu menu
]
let icon = Avalonia.FuncUI.VirtualDom.VirtualDom.createObject tray :?> TrayIcon
let icons = TrayIcons()
icons.Add(icon)
TrayIcon.SetIcons(this, icons)
this.Styles.Add (FluentTheme())
this.Styles.Load "avares://Avalonia.FuncUI.ControlCatalog/Styles/TabControl.xaml"

Expand Down
3 changes: 3 additions & 0 deletions src/Avalonia.FuncUI/Avalonia.FuncUI.fsproj
Original file line number Diff line number Diff line change
Expand Up @@ -154,8 +154,11 @@
<Compile Include="DSL\ListBoxItem.fs" />
<Compile Include="DSL\MenuBase.fs" />
<Compile Include="DSL\Menu.fs" />
<Compile Include="DSL\NativeMenu.fs" />
<Compile Include="DSL\ContextMenu.fs" />
<Compile Include="DSL\MenuItem.fs" />
<Compile Include="DSL\NativeMenuItem.fs" />
<Compile Include="DSL\TrayIcon.fs" />
<Compile Include="DSL\GridSplitter.fs" />
<Compile Include="DSL\DatePickerPresenter.fs" />
<Compile Include="DSL\TimePickerPresenter.fs" />
Expand Down
16 changes: 16 additions & 0 deletions src/Avalonia.FuncUI/DSL/NativeMenu.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
namespace Avalonia.FuncUI.DSL

[<AutoOpen>]
module NativeMenu =
open Avalonia.Controls
open Avalonia.FuncUI.Builder
open Avalonia.FuncUI.Types

let create (attrs: IAttr<NativeMenu> list): IView<NativeMenu> =
ViewBuilder.Create<NativeMenu>(attrs)

type NativeMenu with
static member items<'t when 't :> NativeMenu>(value: IView list) : IAttr<'t> =
let getter : ('t -> obj) = (fun control -> control.Items :> obj)

AttrBuilder<'t>.CreateContentMultiple("Items", ValueSome getter, ValueNone, value)
30 changes: 30 additions & 0 deletions src/Avalonia.FuncUI/DSL/NativeMenuItem.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
namespace Avalonia.FuncUI.DSL
open Avalonia.Input
open Avalonia.Interactivity
open System.Windows.Input

[<AutoOpen>]
module NativeMenuItem =
open Avalonia.Controls
open Avalonia.FuncUI.Types
open Avalonia.FuncUI.Builder

let create (attrs: IAttr<NativeMenuItem> list): IView<NativeMenuItem> =
ViewBuilder.Create<NativeMenuItem>(attrs)

type NativeMenuItem with

static member command<'t when 't :> NativeMenuItem>(command: ICommand) : IAttr<'t> =
AttrBuilder<'t>.CreateProperty<ICommand>(NativeMenuItem.CommandProperty, command, ValueNone)

static member commandParameter<'t when 't :> NativeMenuItem>(parameter: obj) : IAttr<'t> =
AttrBuilder<'t>.CreateProperty<obj>(NativeMenuItem.CommandParameterProperty, parameter, ValueNone)

static member header<'t when 't :> NativeMenuItem>(header: string) : IAttr<'t> =
AttrBuilder<'t>.CreateProperty<string>(NativeMenuItem.HeaderProperty, header, ValueNone)

static member isChecked<'t when 't :> NativeMenuItem>(value: bool) : IAttr<'t> =
AttrBuilder<'t>.CreateProperty<bool>(NativeMenuItem.IsCheckedProperty, value, ValueNone)

static member isEnabled<'t when 't :> NativeMenuItem>(value: bool) : IAttr<'t> =
AttrBuilder<'t>.CreateProperty<bool>(NativeMenuItem.IsEnabledProperty, value, ValueNone)
34 changes: 34 additions & 0 deletions src/Avalonia.FuncUI/DSL/TrayIcon.fs
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
namespace Avalonia.FuncUI.DSL
open Avalonia.Input
open Avalonia.Interactivity
open System.Windows.Input

[<AutoOpen>]
module TrayIcon =
open Avalonia.Controls
open Avalonia.FuncUI.Builder
open Avalonia.FuncUI.Types

let create (attrs: IAttr<TrayIcon> list): IView<TrayIcon> =
ViewBuilder.Create<TrayIcon>(attrs)

type TrayIcon with
static member command<'t when 't :> TrayIcon>(command: ICommand) : IAttr<'t> =
AttrBuilder<'t>.CreateProperty<ICommand>(TrayIcon.CommandProperty, command, ValueNone)

static member commandParameter<'t when 't :> TrayIcon>(parameter: obj) : IAttr<'t> =
AttrBuilder<'t>.CreateProperty<obj>(TrayIcon.CommandParameterProperty, parameter, ValueNone)

static member isVisible<'t when 't :> TrayIcon>(isVisible: bool) : IAttr<'t> =
AttrBuilder<'t>.CreateProperty<bool>(TrayIcon.IsVisibleProperty, isVisible, ValueNone)

static member toolTipText<'t when 't :> TrayIcon>(toolTipText: string) : IAttr<'t> =
AttrBuilder<'t>.CreateProperty<string>(TrayIcon.ToolTipTextProperty, toolTipText, ValueNone)

static member menu<'t when 't :> TrayIcon>(menu: IView option) : IAttr<'t> =
AttrBuilder<'t>.CreateContentSingle(TrayIcon.MenuProperty, menu)

static member menu<'t when 't :> TrayIcon>(value: IView) : IAttr<'t> =
value
|> Some
|> TrayIcon.menu
8 changes: 6 additions & 2 deletions src/Avalonia.FuncUI/VirtualDom/VirtualDom.fs
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,17 @@ open Avalonia.Controls

open Avalonia.FuncUI.Types
open Avalonia.FuncUI.VirtualDom.Delta
open Avalonia

module rec VirtualDom =
let createObject (view: IView) : AvaloniaObject =
view
|> ViewDelta.From
|> Patcher.create

let create (view: IView) : Control =
view
|> ViewDelta.From
|> Patcher.create :?> Control
|> createObject :?> Control

let update (root: Control, last: IView, next: IView) : unit =
let delta = Differ.diff(last, next)
Expand Down
Loading