350 lines
9.1 KiB
Go
350 lines
9.1 KiB
Go
package tomo
|
|
|
|
import "image"
|
|
import "image/color"
|
|
import "golang.org/x/image/font"
|
|
import "git.tebibyte.media/sashakoshka/tomo/data"
|
|
import "git.tebibyte.media/sashakoshka/tomo/artist"
|
|
|
|
// IconSize is a type representing valid icon sizes.
|
|
type IconSize int
|
|
|
|
const (
|
|
IconSizeSmall IconSize = 16
|
|
IconSizeLarge IconSize = 48
|
|
)
|
|
|
|
// Pattern lists a number of cannonical pattern types, each with its own ID.
|
|
type Pattern int; const (
|
|
// PatternBackground is the window background of the theme. It appears
|
|
// in things like containers and behind text.
|
|
PatternBackground Pattern = iota
|
|
|
|
// PatternDead is a pattern that is displayed on a "dead area" where no
|
|
// controls exist, but there still must be some indication of visual
|
|
// structure (such as in the corner between two scroll bars).
|
|
PatternDead
|
|
|
|
// PatternRaised is a generic raised pattern.
|
|
PatternRaised
|
|
|
|
// PatternSunken is a generic sunken pattern.
|
|
PatternSunken
|
|
|
|
// PatternPinboard is similar to PatternSunken, but it is textured.
|
|
PatternPinboard
|
|
|
|
// PatternButton is a button pattern.
|
|
PatternButton
|
|
|
|
// PatternInput is a pattern for input fields, editable text areas, etc.
|
|
PatternInput
|
|
|
|
// PatternGutter is a track for things to slide on.
|
|
PatternGutter
|
|
|
|
// PatternHandle is a handle that slides along a gutter.
|
|
PatternHandle
|
|
|
|
// PatternLine is an engraved line that separates things.
|
|
PatternLine
|
|
|
|
// PatternMercury is a fill pattern for progress bars, meters, etc.
|
|
PatternMercury
|
|
)
|
|
|
|
// Color lits a number of cannonical colors, each with its own ID.
|
|
type Color int; const (
|
|
// ColorAccent is the accent color of the theme.
|
|
ColorAccent Color = iota
|
|
|
|
// ColorForeground is the text/icon color of the theme.
|
|
ColorForeground
|
|
)
|
|
|
|
// Icon lists a number of cannonical icons, each with its own ID.
|
|
type Icon int
|
|
|
|
// IconNone specifies no icon.
|
|
const IconNone = -1
|
|
|
|
const (
|
|
// Place icons
|
|
IconHome Icon = iota
|
|
Icon3DObjects
|
|
IconPictures
|
|
IconVideos
|
|
IconMusic
|
|
IconArchives
|
|
IconBooks
|
|
IconDocuments
|
|
IconFonts
|
|
IconPrograms
|
|
IconLibraries
|
|
IconDownloads
|
|
IconRepositories
|
|
IconSettings)
|
|
|
|
const (
|
|
// Object icons
|
|
IconFile Icon = iota + 0x80
|
|
IconDirectory
|
|
IconPopulatedDirectory
|
|
|
|
IconStorage
|
|
IconMagneticTape
|
|
IconFloppyDisk
|
|
IconHDD
|
|
IconSSD
|
|
IconFlashDrive
|
|
IconMemoryCard
|
|
IconRomDisk
|
|
IconRamDisk
|
|
IconCD
|
|
IconDVD
|
|
|
|
IconNetwork
|
|
IconInternet
|
|
|
|
IconDevice
|
|
IconServer
|
|
IconNetworkSwitch
|
|
IconRouter
|
|
IconDesktop
|
|
IconLaptop
|
|
IconTablet
|
|
IconPhone
|
|
IconCamera
|
|
|
|
IconPeripheral
|
|
IconKeyboard
|
|
IconMouse
|
|
IconTrackpad
|
|
IconPenTablet
|
|
IconMonitor
|
|
IconSpeaker
|
|
IconMicrophone
|
|
IconWebcam
|
|
IconGameController
|
|
|
|
IconPort
|
|
IconNetworkPort
|
|
IconUSBPort
|
|
IconParallelPort
|
|
IconSerialPort
|
|
IconPS2Port
|
|
IconMonitorPort)
|
|
|
|
const (
|
|
// Action icons
|
|
IconOpen Icon = iota + 0x100
|
|
IconSave
|
|
IconSaveAs
|
|
IconNew
|
|
IconNewFolder
|
|
IconDelete
|
|
|
|
IconCut
|
|
IconCopy
|
|
IconPaste
|
|
|
|
IconAdd
|
|
IconRemove
|
|
IconAddBookmark
|
|
IconRemoveBookmark
|
|
IconAddFavorite
|
|
IconRemoveFavorite
|
|
|
|
IconPlay
|
|
IconPause
|
|
IconStop
|
|
IconFastForward
|
|
IconRewind
|
|
IconToEnd
|
|
IconToBeginning
|
|
IconRecord
|
|
IconVolumeUp
|
|
IconVolumeDown
|
|
IconMute
|
|
|
|
IconBackward
|
|
IconForward
|
|
IconRefresh
|
|
IconHistory
|
|
|
|
IconYes
|
|
IconNo
|
|
|
|
IconUpward)
|
|
|
|
const (
|
|
// Status icons
|
|
IconInformation Icon = iota + 0x180
|
|
IconQuestion
|
|
IconWarning
|
|
IconError)
|
|
|
|
const (
|
|
// Tool icons
|
|
)
|
|
|
|
// Hints specifies rendering hints for a particular pattern. Elements can take
|
|
// these into account in order to gain extra performance.
|
|
type Hints struct {
|
|
// StaticInset defines an inset rectangular area in the middle of the
|
|
// pattern that does not change between PatternStates. If the inset is
|
|
// zero on all sides, this hint does not apply.
|
|
StaticInset artist.Inset
|
|
|
|
// Uniform specifies a singular color for the entire pattern. If the
|
|
// alpha channel is zero, this hint does not apply.
|
|
Uniform color.RGBA
|
|
}
|
|
|
|
// Theme represents a visual style configuration,
|
|
type Theme interface {
|
|
// FontFace returns the proper font for a given style, size, and case.
|
|
FontFace (FontStyle, FontSize, Case) font.Face
|
|
|
|
// Icon returns an appropriate icon given an icon name, size, and case.
|
|
Icon (Icon, IconSize, Case) artist.Icon
|
|
|
|
// Icon returns an appropriate icon given a file mime type, size, and,
|
|
// case.
|
|
MimeIcon (data.Mime, IconSize, Case) artist.Icon
|
|
|
|
// Pattern returns an appropriate pattern given a pattern name, case,
|
|
// and state.
|
|
Pattern (Pattern, State, Case) artist.Pattern
|
|
|
|
// Color returns an appropriate pattern given a color name, case, and
|
|
// state.
|
|
Color (Color, State, Case) color.RGBA
|
|
|
|
// Padding returns how much space should be between the bounds of a
|
|
// pattern whatever an element draws inside of it.
|
|
Padding (Pattern, Case) artist.Inset
|
|
|
|
// Margin returns the left/right (x) and top/bottom (y) margins that
|
|
// should be put between any self-contained objects drawn within this
|
|
// pattern (if applicable).
|
|
Margin (Pattern, Case) image.Point
|
|
|
|
// Sink returns a vector that should be added to an element's inner
|
|
// content when it is pressed down (if applicable) to simulate a 3D
|
|
// sinking effect.
|
|
Sink (Pattern, Case) image.Point
|
|
|
|
// Hints returns rendering optimization hints for a particular pattern.
|
|
// These are optional, but following them may result in improved
|
|
// performance.
|
|
Hints (Pattern, Case) Hints
|
|
}
|
|
|
|
// Case sepecifies what kind of element is using a pattern. It contains a
|
|
// namespace parameter, an element parameter, and an optional component trail.
|
|
// All parameter values should be written in camel case. Themes can change their
|
|
// styling based on the case for fine-grained control over the look and feel of
|
|
// specific elements.
|
|
type Case struct {
|
|
// Namespace refers to the package that the element comes from. This is
|
|
// so different element packages can have elements with the same name
|
|
// while still allowing themes to differentiate between them.
|
|
Namespace string
|
|
|
|
// Element refers to the name of the element. This should (generally) be
|
|
// the type name of the element. For example: Button, Input, Container,
|
|
// etc.
|
|
Element string
|
|
|
|
// Component specifies the specific part of the element that is being
|
|
// referred to. This parameter is entirely optional.
|
|
Component string
|
|
}
|
|
|
|
// C can be used as shorthand to generate a case struct. The component parameter
|
|
// may be left out of this argument list for brevity. Arguments passed after
|
|
// component will be ignored.
|
|
func C (namespace, element string, component ...string) Case {
|
|
if component == nil { component = []string { "" } }
|
|
return Case {
|
|
Namespace: namespace,
|
|
Element: element,
|
|
Component: component[0],
|
|
}
|
|
}
|
|
|
|
// Match determines if a case matches the specified parameters. A blank string
|
|
// will act as a wildcard.
|
|
func (c Case) Match (namespace, element, component string) bool {
|
|
if namespace == "" { namespace = c.Namespace }
|
|
if element == "" { element = c.Element }
|
|
if component == "" { component = c.Component }
|
|
|
|
return namespace == c.Namespace &&
|
|
element == c.Element &&
|
|
component == c.Component
|
|
}
|
|
|
|
// State lists parameters which can change the appearance of some patterns and
|
|
// colors. For example, passing a State with Selected set to true may result in
|
|
// a pattern that has a colored border within it.
|
|
type State struct {
|
|
// On should be set to true if the element that is using this pattern is
|
|
// in some sort of selected or "on" state, such as if a checkbox is
|
|
// checked, a file is selected, or a switch is toggled on. This is only
|
|
// necessary if the element in question is capable of being toggled or
|
|
// selected.
|
|
On bool
|
|
|
|
// Focused should be set to true if the element that is using this
|
|
// pattern is currently focused.
|
|
Focused bool
|
|
|
|
// Pressed should be set to true if the element that is using this
|
|
// pattern is being pressed down by the mouse. This is only necessary if
|
|
// the element in question processes mouse button events.
|
|
Pressed bool
|
|
|
|
// Disabled should be set to true if the element that is using this
|
|
// pattern is locked and cannot be interacted with. Disabled variations
|
|
// of patterns are typically flattened and greyed-out.
|
|
Disabled bool
|
|
|
|
// Invalid should be set to true if th element that is using this
|
|
// pattern wants to warn the user of an invalid interaction or data
|
|
// entry. Invalid variations typically have some sort of reddish tint
|
|
// or outline.
|
|
Invalid bool
|
|
}
|
|
|
|
// FontStyle specifies stylistic alterations to a font face.
|
|
type FontStyle int; const (
|
|
FontStyleRegular FontStyle = 0
|
|
FontStyleBold FontStyle = 1
|
|
FontStyleItalic FontStyle = 2
|
|
FontStyleBoldItalic FontStyle = 1 | 2
|
|
)
|
|
|
|
// FontSize specifies the general size of a font face in a semantic way.
|
|
type FontSize int; const (
|
|
// FontSizeNormal is the default font size that should be used for most
|
|
// things.
|
|
FontSizeNormal FontSize = iota
|
|
|
|
// FontSizeLarge is a larger font size suitable for things like section
|
|
// headings.
|
|
FontSizeLarge
|
|
|
|
// FontSizeHuge is a very large font size suitable for things like
|
|
// titles, wizard step names, digital clocks, etc.
|
|
FontSizeHuge
|
|
|
|
// FontSizeSmall is a smaller font size. Try not to use this unless it
|
|
// makes a lot of sense to do so, because it can negatively impact
|
|
// accessibility. It is useful for things like copyright notices at the
|
|
// bottom of some window that the average user doesn't actually care
|
|
// about.
|
|
FontSizeSmall
|
|
)
|