package defaultTheme import "bytes" import "image" import _ "embed" import _ "image/png" import "git.tebibyte.media/tomo/tomo" import "git.tebibyte.media/tomo/tomo/data" import "git.tebibyte.media/tomo/tomo/theme" import "git.tebibyte.media/tomo/tomo/canvas" //go:embed assets/icons-small.png var atlasSmallBytes []byte //go:embed assets/icons-large.png var atlasLargeBytes []byte func generateSource (data []byte, width int) map[theme.Icon] canvas.Texture { atlasImage, _, err := image.Decode(bytes.NewReader(data)) if err != nil { panic(err) } atlasTexture := tomo.NewTexture(atlasImage) source := make(map[theme.Icon] canvas.Texture) x := 0 y := 0 row := func () { x = 0 y ++ } col := func (id theme.Icon) { source[id] = atlasTexture.Clip(image.Rect ( x * width, y * width, (x + 1) * width, (y + 1) * width)) x++ } // objects col(theme.IconUnknown) col(theme.IconFile) col(theme.IconDirectory) col(theme.IconStorage) col(theme.IconApplication) col(theme.IconNetwork) col(theme.IconDevice) col(theme.IconPeripheral) col(theme.IconPort) // actions: files row() col(theme.IconActionOpen) col(theme.IconActionOpenIn) col(theme.IconActionSave) col(theme.IconActionSaveAs) col(theme.IconActionPrint) col(theme.IconActionNew) col(theme.IconActionNewDirectory) col(theme.IconActionDelete) col(theme.IconActionRename) col(theme.IconActionGetInformation) col(theme.IconActionChangePermissions) col(theme.IconActionRevert) // actions: list management row() col(theme.IconActionAdd) col(theme.IconActionRemove) col(theme.IconActionAddBookmark) col(theme.IconActionRemoveBookmark) col(theme.IconActionAddFavorite) col(theme.IconActionRemoveFavorite) // actions: media row() col(theme.IconActionPlay) col(theme.IconActionPause) col(theme.IconActionStop) col(theme.IconActionFastForward) col(theme.IconActionRewind) col(theme.IconActionToBeginning) col(theme.IconActionToEnd) col(theme.IconActionRecord) col(theme.IconActionVolumeUp) col(theme.IconActionVolumeDown) col(theme.IconActionMute) // actions: editing row() col(theme.IconActionUndo) col(theme.IconActionRedo) col(theme.IconActionCut) col(theme.IconActionCopy) col(theme.IconActionPaste) col(theme.IconActionFind) col(theme.IconActionReplace) col(theme.IconActionSelectAll) col(theme.IconActionSelectNone) col(theme.IconActionIncrement) col(theme.IconActionDecrement) // actions: window management row() col(theme.IconActionClose) col(theme.IconActionQuit) col(theme.IconActionIconify) col(theme.IconActionShade) col(theme.IconActionMaximize) col(theme.IconActionFullScreen) col(theme.IconActionRestore) // actions: view row() col(theme.IconActionExpand) col(theme.IconActionContract) col(theme.IconActionBack) col(theme.IconActionForward) col(theme.IconActionUp) col(theme.IconActionDown) col(theme.IconActionReload) col(theme.IconActionZoomIn) col(theme.IconActionZoomOut) col(theme.IconActionZoomReset) col(theme.IconActionMove) col(theme.IconActionResize) col(theme.IconActionGoTo) // actions: tools row() col(theme.IconActionTransform) col(theme.IconActionTranslate) col(theme.IconActionRotate) col(theme.IconActionScale) col(theme.IconActionWarp) col(theme.IconActionCornerPin) col(theme.IconActionSelectRectangle) col(theme.IconActionSelectEllipse) col(theme.IconActionSelectLasso) col(theme.IconActionSelectGeometric) col(theme.IconActionSelectAuto) col(theme.IconActionCrop) col(theme.IconActionFill) row() col(theme.IconActionGradient) col(theme.IconActionPencil) col(theme.IconActionBrush) col(theme.IconActionEraser) col(theme.IconActionText) col(theme.IconActionEyedropper) // status: dialog row() col(theme.IconStatusInformation) col(theme.IconStatusQuestion) col(theme.IconStatusWarning) col(theme.IconStatusError) col(theme.IconStatusCancel) col(theme.IconStatusOkay) // status: network row() col(theme.IconStatusCellSignal0) col(theme.IconStatusCellSignal1) col(theme.IconStatusCellSignal2) col(theme.IconStatusCellSignal3) col(theme.IconStatusWirelessSignal0) col(theme.IconStatusWirelessSignal1) col(theme.IconStatusWirelessSignal2) col(theme.IconStatusWirelessSignal3) // status: power row() col(theme.IconStatusBattery0) col(theme.IconStatusBattery1) col(theme.IconStatusBattery2) col(theme.IconStatusBattery3) col(theme.IconStatusBrightness0) col(theme.IconStatusBrightness1) col(theme.IconStatusBrightness2) col(theme.IconStatusBrightness3) // status: media row() col(theme.IconStatusVolume0) col(theme.IconStatusVolume1) col(theme.IconStatusVolume2) col(theme.IconStatusVolume3) return source } type iconTheme struct { texturesSmall map[theme.Icon] canvas.Texture texturesLarge map[theme.Icon] canvas.Texture } func (this *iconTheme) ensure () { if this.texturesSmall != nil { return } this.texturesSmall = generateSource(atlasSmallBytes, 16) this.texturesLarge = generateSource(atlasLargeBytes, 32) } func (this *iconTheme) selectSource (size theme.IconSize) map[theme.Icon] canvas.Texture { if size == theme.IconSizeSmall { return this.texturesSmall } else { return this.texturesLarge } } func (this *iconTheme) Icon (icon theme.Icon, size theme.IconSize) canvas.Texture { this.ensure() source := this.selectSource(size) if texture, ok := source[icon]; ok { return texture } return source[theme.IconUnknown] } func (this *iconTheme) MimeIcon (mime data.Mime, size theme.IconSize) canvas.Texture { this.ensure() source := this.selectSource(size) if mime == data.M("inode", "directory") { return source[theme.IconDirectory] } else { return source[theme.IconFile] } }