Ui/Paint/PaintUi.razor
@using Sandbox;
@using Sandbox.UI;
@inherits PanelComponent
@namespace Clover.Ui
<root>
<div class="paint-window" @ref=" Window">
<div class="vsplit expand">
<div class="header">
<h1>Paint</h1>
<button class="close" @onclick=@( () => { Enabled = false; } )>
<i class="icon">close</i>
</button>
</div>
<div class="hsplit expand">
<div class="menu">
<section>
<h2 class="section-title">Tools</h2>
<div class="tools">
<button @onclick=@( () => CurrentTool = PaintTool.Pencil ) class="paint-button @( CurrentTool == PaintTool.Pencil ? "active" : "" )" tooltip="Pencil">
<img src="ui/icons/paint/pencil-solid-24.png"/>
</button>
<button @onclick=@( () => CurrentTool = PaintTool.Fill ) class="paint-button @( CurrentTool == PaintTool.Fill ? "active" : "" )" tooltip="Fill">
<img src="ui/icons/paint/color-fill-solid-24.png"/>
</button>
<button @onclick=@( () => CurrentTool = PaintTool.Spray ) class="paint-button @( CurrentTool == PaintTool.Spray ? "active" : "" )" tooltip="Spray">
<img src="ui/icons/paint/spray-can-solid-24.png"/>
</button>
<button @onclick=@( () => CurrentTool = PaintTool.Eraser ) class="paint-button @( CurrentTool == PaintTool.Eraser ? "active" : "" )" tooltip="Eraser">
<img src="ui/icons/paint/eraser-solid-24.png"/>
</button>
<button @onclick=@( () => CurrentTool = PaintTool.Eyedropper ) class="paint-button @( CurrentTool == PaintTool.Eyedropper ? "active" : "" )" tooltip="Eyedropper">
<img src="ui/icons/paint/eyedropper-solid-24.png"/>
</button>
<button @onclick=@( () => CurrentTool = PaintTool.Line ) class="paint-button @( CurrentTool == PaintTool.Line ? "active" : "" )" tooltip="Line">
<img src="ui/icons/paint/minus-regular-24.png"/>
</button>
<button @onclick=@( () => CurrentTool = PaintTool.Rectangle ) class="paint-button @( CurrentTool == PaintTool.Rectangle ? "active" : "" )" tooltip="Rectangle">
<img src="ui/icons/paint/rectangle-regular-24.png"/>
</button>
<button @onclick=@( () => CurrentTool = PaintTool.Circle ) class="paint-button @( CurrentTool == PaintTool.Circle ? "active" : "" )" tooltip="Circle">
<img src="ui/icons/paint/circle-regular-24.png"/>
</button>
<button @onclick=@( () => CurrentTool = PaintTool.Move ) class="paint-button @( CurrentTool == PaintTool.Move ? "active" : "" )" tooltip="Move">
<img src="ui/icons/paint/move-regular-24.png"/>
</button>
<button @onclick=@( () => CurrentTool = PaintTool.Clone ) class="paint-button @( CurrentTool == PaintTool.Clone ? "active" : "" )" tooltip="Clone">
<img src="ui/icons/paint/select-multiple-regular-24.png"/>
</button>
<button @onclick=@( () => CurrentTool = PaintTool.Dodge ) class="paint-button @( CurrentTool == PaintTool.Dodge ? "active" : "" )" tooltip="Dodge">
<img src="ui/icons/paint/sun-regular-24.png"/>
</button>
<button @onclick=@( () => CurrentTool = PaintTool.Burn ) class="paint-button @( CurrentTool == PaintTool.Burn ? "active" : "" )" tooltip="Burn">
<img src="ui/icons/paint/moon-solid-24.png"/>
</button>
</div>
<div class="button-pair">
@*<button class="paint-button" @onclick=@( () => ZoomIn() )>
<img src="ui/icons/paint/zoom-in-solid-24.png"/>
</button>
<button class="paint-button" @onclick=@( () => ZoomOut() )>
<img src="ui/icons/paint/zoom-out-solid-24.png"/>
</button>*@
<button class="paint-button" @onclick=@( () => ShowGrid = !ShowGrid ) tooltip="Toggle Grid">
<img src="ui/icons/paint/table-regular-24.png"/>
</button>
</div>
<div class="button-pair">
<button class="paint-button @( UndoStack.Count == 0 ? "disabled" : "" )" @onclick=@( () => Undo() )>
<img src="ui/icons/paint/undo-regular-24.png"/>
</button>
<button class="paint-button @( RedoStack.Count == 0 ? "disabled" : "" )" @onclick=@( () => Redo() )>
<img src="ui/icons/paint/redo-regular-24.png"/>
</button>
</div>
</section>
@if ( ShowBrushSizeForCurrentTool() )
{
<section>
<h2 class="section-title">Tool size</h2>
<div class="button-pair">
<button class="paint-button" @onclick=@( () => DecreaseBrushSize() )>
️<i class="icon">remove</i>
</button>
<button class="paint-button" @onclick=@( () => IncreaseBrushSize() )>
️<i class="icon">add</i>
</button>
</div>
<div>@( $"Brush Size: {BrushSize}" )</div>
</section>
}
@if ( !Monochrome )
{
<section>
<h2 class="section-title">Palettes</h2>
<button @onclick=@( () => ShowPalettes = !ShowPalettes ) class="paint-button small">
<i class="icon">@( ShowPalettes ? "chevron_right" : "expand_more" )</i>
@PaletteName
</button>
@if ( ShowPalettes )
{
<dialog class="paint-popup">
@foreach ( var palette in Utilities.Decals.GetPalettes() )
{
<button @onclick=@( () => SetPalette( palette ) ) class="paint-button small @( palette == PaletteName ? "active" : "" )">
@palette
</button>
}
</dialog>
}
</section>
}
<section class="actions">
<h2 class="section-title">Actions</h2>
<button class="paint-button" @onclick=@( () => ShowFileActions = !ShowFileActions )>
<i class="icon">@( ShowFileActions ? "chevron_right" : "expand_more" )</i>
File
</button>
@if ( ShowFileActions )
{
<dialog class="paint-popup">
<TextEntry class="paint-input" Value:bind="@CurrentFileName" placeholder="Filename"/>
<TextEntry class="paint-input" Value:bind="@CurrentName" placeholder="Name"/>
<button class="paint-button" @onclick=@( () => Save() )>Save</button>
@*<button class="paint-button" @onclick=@( () => ResetPaint() )>Reset</button>*@
<button class="paint-button" @onclick=@( () => New() )>New</button>
</dialog>
}
</section>
@*<section>
<h2>Stats</h2>
</section>*@
</div>
<div class="vsplit expand main">
<div @ref=" CanvasContainer" class="canvas">
<div @ref=" CanvasSquare" class="canvas-square">
<Image class="canvas-texture" @ref=" CanvasImage" Texture=@DrawTexture @onmousedown=@OnCanvasMouseDown @onmouseup=@OnCanvasMouseUp/>
<Image class="preview-overlay" @ref=" PreviewOverlay" Texture=@PreviewTexture/>
@*<Image class="grid" @ref=" Grid" Texture=@GridTexture/>*@
@if ( ShowGrid )
{
<GridRenderer class="grid" TextureSize=@TextureSize/>
}
</div>
<div @ref=" Crosshair" class="crosshair"></div>
<div class="preview">
@if ( _currentPaintType == PaintType.Pumpkin )
{
<PumpkinPanel Texture=@DrawTexture/>
}
else if ( _currentPaintType == PaintType.Snowman )
{
<SnowmanPanel Texture=@DrawTexture/>
}
else
{
<Image Texture=@DrawTexture/>
}
</div>
</div>
<div class="toolbar">
<div class="vsplit">
@if ( ShowFavoritesEditor )
{
<div class="favorites-editor">
@for ( var i = 0; i < Palette.Count; i++ )
{
var index = i;
var color = Palette[index];
<button
class="color-button"
@onmousedown=@( ( PanelEvent e ) => FavoriteEditorColorButtonClick( e, index ) )
style="background-color: @color.Hex">
</button>
}
</div>
}
<div class="hsplit expand no-shrink">
<div class="current-colors">
<div class="color-fg" style="background-color: @ForegroundColor.Hex"></div>
<div class="color-bg" style="background-color: @BackgroundColor.Hex"></div>
</div>
<div class="palette-favorites">
@if ( Palette.Count > FavoriteColors.Length )
{
@for ( var i = 0; i < FavoriteColors.Length; i++ )
{
var index = i;
var color = FavoriteColors[index];
<button
class="color-button big @( ShowFavoritesEditor && SelectedFavorite == index ? "selected" : "" )"
@onmousedown=@( ( PanelEvent e ) => FavoriteColorButtonClick( e, index ) )
style="background-color: @GetColorFromByte( color ).Hex">
</button>
}
<button class="paint-button @( ShowFavoritesEditor ? "active" : "" )" @onclick=@ToggleShowFavoritesEditor>
<i class="icon">edit</i>
</button>
<button class="paint-button" @onclick=@GenerateFavoriteColors>
<i class="icon">refresh</i>
</button>
}
else
{
@for ( var i = 0; i < Palette.Count; i++ )
{
var index = i;
var color = Palette[index];
<button
class="color-button big"
@onmousedown=@( ( PanelEvent e ) => SetColor( e, index ) )
tooltip="@color.Hex"
style="background-color: @color.Hex">
</button>
}
}
</div>
</div>
</div>
</div>
</div>
<div class="sidebar">
<div class="decals">
<h2 class="section-title">Decals</h2>
@foreach ( var decal in Decals )
{
<button @onclick=@( () => LoadDecal( decal.FileName ) ) class="decal">
<Image [email protected]/>
<div class="decal-name">@decal.Decal.Name</div>
</button>
}
<button class="paint-button" @onclick=@PopulateDecals>Refresh (@Decals.Count)</button>
</div>
<div class="images">
<h2 class="section-title">Import</h2>
@foreach ( var image in Images )
{
<button @onclick=@( () => LoadImage( image ) ) class="image">
<Image Texture=@image/>
<div class="image-name">@image.ResourceName</div>
</button>
}
<button class="paint-button" @onclick=@PopulateImages>Refresh (@Images.Count)</button>
</div>
</div>
</div>
</div>
</div>
</root>