package fallbackIcons 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/event" import "git.tebibyte.media/tomo/tomo/canvas" import "git.tebibyte.media/tomo/backend/style" import "git.tebibyte.media/tomo/nasin/internal/util" //go:embed assets/icons-small.png var atlasSmallBytes []byte //go:embed assets/icons-large.png var atlasLargeBytes []byte const ( iconApplicationXGeneric = tomo.Icon("application/x-generic") iconApplicationXExecutable = tomo.Icon("application/x-executable") iconAudioXGeneric = tomo.Icon("audio/x-generic") iconFontXGeneric = tomo.Icon("font/x-generic") iconImageXGeneric = tomo.Icon("image/x-generic") iconModelXGeneric = tomo.Icon("model/x-generic") iconPackageXGeneric = tomo.Icon("package/x-generic") iconTextXGeneric = tomo.Icon("text/x-generic") iconTextHtml = tomo.Icon("text/html") iconTextXGenericTemplate = tomo.Icon("text/x-generic-template") iconTextXScript = tomo.Icon("text/x-script") iconVideoXGeneric = tomo.Icon("video/x-generic") iconXOfficeAddressBook = tomo.Icon("x-office-address-book") iconXOfficeCalendar = tomo.Icon("x-office-calendar") iconXOfficeDocument = tomo.Icon("x-office-document") iconXOfficePresentation = tomo.Icon("x-office-presentation") iconXOfficeSpreadsheet = tomo.Icon("x-office-spreadsheet") ) func generateSource (data []byte, width int) (canvas.TextureCloser, map[tomo.Icon] canvas.Texture) { atlasImage, _, err := image.Decode(bytes.NewReader(data)) if err != nil { panic(err) } atlasTexture := tomo.NewTexture(atlasImage) source := make(map[tomo.Icon] canvas.Texture) x := 0 y := 0 row := func () { x = 0 y ++ } col := func (id tomo.Icon) { source[id] = atlasTexture.SubTexture(image.Rect ( x * width, y * width, (x + 1) * width, (y + 1) * width)) x++ } col(tomo.IconUnknown) col(iconApplicationXGeneric) col(iconApplicationXExecutable) col(iconAudioXGeneric) col(iconFontXGeneric) col(iconImageXGeneric) col(iconModelXGeneric) col(iconPackageXGeneric) col(iconTextXGeneric) col(iconTextHtml) col(iconTextXGenericTemplate) col(iconTextXScript) col(iconVideoXGeneric) col(iconXOfficeAddressBook) col(iconXOfficeCalendar) col(iconXOfficeDocument) col(iconXOfficePresentation) col(iconXOfficeSpreadsheet) row() // actions col(tomo.IconAddressBookNew) col(tomo.IconApplicationExit) col(tomo.IconAppointmentNew) col(tomo.IconCallStart) col(tomo.IconCallStop) col(tomo.IconContactNew) // actions: dialog col(tomo.IconDialogOkay) col(tomo.IconDialogCancel) // actions: edit col(tomo.IconEditClear) col(tomo.IconEditCopy) col(tomo.IconEditCut) col(tomo.IconEditDelete) col(tomo.IconEditFind) col(tomo.IconEditFindReplace) col(tomo.IconEditPaste) col(tomo.IconEditRedo) col(tomo.IconEditSelectAll) col(tomo.IconEditUndo) // actions: file col(tomo.IconFileNew) col(tomo.IconDirectoryNew) col(tomo.IconFileOpen) col(tomo.IconFileOpenRecent) col(tomo.IconFilePageSetup) col(tomo.IconFilePrint) col(tomo.IconFilePrintPreview) col(tomo.IconFilePermissions) col(tomo.IconFileProperties) col(tomo.IconFileRename) col(tomo.IconFileRevert) col(tomo.IconFileSave) col(tomo.IconFileSaveAs) col(tomo.IconFileSend) row() // actions: format col(tomo.IconFormatIndentLess) col(tomo.IconFormatIndentMore) col(tomo.IconFormatAlignCenter) col(tomo.IconFormatAlignEven) col(tomo.IconFormatAlignLeft) col(tomo.IconFormatAlignRight) col(tomo.IconFormatTextDirectionLtr) col(tomo.IconFormatTextDirectionRtl) col(tomo.IconFormatTextBold) col(tomo.IconFormatTextItalic) col(tomo.IconFormatTextUnderline) col(tomo.IconFormatTextStrikethrough) // actions: go col(tomo.IconGoBottom) col(tomo.IconGoDown) col(tomo.IconGoFirst) col(tomo.IconGoHome) col(tomo.IconGoJump) col(tomo.IconGoLast) col(tomo.IconGoNext) col(tomo.IconGoPrevious) col(tomo.IconGoTop) col(tomo.IconGoUp) // actions: help col(tomo.IconHelpAbout) col(tomo.IconHelpContents) col(tomo.IconHelpFaq) // actions: insert col(tomo.IconInsertImage) col(tomo.IconInsertLink) col(tomo.IconInsertObject) col(tomo.IconInsertText) row() // actions: list col(tomo.IconListAdd) col(tomo.IconListRemove) col(tomo.IconListChoose) col(tomo.IconListExpand) col(tomo.IconListContract) row() // actions: mail col(tomo.IconMailForward) col(tomo.IconMailMarkImportant) col(tomo.IconMailMarkJunk) col(tomo.IconMailMarkNotJunk) col(tomo.IconMailMarkRead) col(tomo.IconMailMarkUnread) col(tomo.IconMailMessageNew) col(tomo.IconMailReplyAll) col(tomo.IconMailReplySender) col(tomo.IconMailSend) col(tomo.IconMailReceive) // actions: media col(tomo.IconMediaEject) col(tomo.IconMediaPlaybackPause) col(tomo.IconMediaPlaybackStart) col(tomo.IconMediaPlaybackStop) col(tomo.IconMediaRecord) col(tomo.IconMediaSeekBackward) col(tomo.IconMediaSeekForward) col(tomo.IconMediaSkipBackward) col(tomo.IconMediaSkipForward) // actions: object col(tomo.IconObjectFlipHorizontal) col(tomo.IconObjectFlipVertical) col(tomo.IconObjectRotateLeft) col(tomo.IconObjectRotateRight) // actions: process col(tomo.IconProcessStop) // actions: system col(tomo.IconSystemLockScreen) col(tomo.IconSystemLogOut) col(tomo.IconSystemRun) col(tomo.IconSystemSearch) col(tomo.IconSystemReboot) col(tomo.IconSystemShutdown) row() // actions: tools col(tomo.IconToolsCheckSpelling) // actions: value col(tomo.IconValueIncrement) col(tomo.IconValueDecrement) col(tomo.IconValueReset) // actions: view col(tomo.IconViewFullscreen) col(tomo.IconViewRefresh) col(tomo.IconViewRestore) col(tomo.IconViewSortAscending) col(tomo.IconViewSortDescending) // actions: window col(tomo.IconWindowClose) col(tomo.IconWindowNew) // actions: zoom col(tomo.IconZoomFitBest) col(tomo.IconZoomIn) col(tomo.IconZoomOriginal) col(tomo.IconZoomOut) row() // applications // Keep these in sync with nasin.ApplicationRole! col(tomo.IconApplication) col(tomo.IconApplicationWebBrowser) col(tomo.IconApplicationMesssanger) col(tomo.IconApplicationPhone) col(tomo.IconApplicationMail) col(tomo.IconApplicationTerminalEmulator) col(tomo.IconApplicationFileBrowser) col(tomo.IconApplicationTextEditor) col(tomo.IconApplicationDocumentViewer) col(tomo.IconApplicationWordProcessor) col(tomo.IconApplicationSpreadsheet) col(tomo.IconApplicationSlideshow) col(tomo.IconApplicationCalculator) col(tomo.IconApplicationPreferences) col(tomo.IconApplicationProcessManager) col(tomo.IconApplicationSystemInformation) col(tomo.IconApplicationManual) col(tomo.IconApplicationCamera) col(tomo.IconApplicationImageViewer) col(tomo.IconApplicationMediaPlayer) col(tomo.IconApplicationImageEditor) col(tomo.IconApplicationAudioEditor) col(tomo.IconApplicationVideoEditor) col(tomo.IconApplicationClock) col(tomo.IconApplicationCalendar) col(tomo.IconApplicationChecklist) row() // categories: applications col(tomo.IconApplications) col(tomo.IconApplicationsAccessories) col(tomo.IconApplicationsDevelopment) col(tomo.IconApplicationsEngineering) col(tomo.IconApplicationsGames) col(tomo.IconApplicationsGraphics) col(tomo.IconApplicationsInternet) col(tomo.IconApplicationsMultimedia) col(tomo.IconApplicationsOffice) col(tomo.IconApplicationsScience) col(tomo.IconApplicationsSystem) col(tomo.IconApplicationsUtilities) // categories: preferences col(tomo.IconPreferences) col(tomo.IconPreferencesDesktop) col(tomo.IconPreferencesPeripherals) col(tomo.IconPreferencesPersonal) col(tomo.IconPreferencesSystem) col(tomo.IconPreferencesNetwork) row() // devices col(tomo.IconDevice) col(tomo.IconDeviceCamera) col(tomo.IconDeviceWebCamera) col(tomo.IconDeviceComputer) col(tomo.IconDevicePda) col(tomo.IconDevicePhone) col(tomo.IconDevicePrinter) col(tomo.IconDeviceScanner) col(tomo.IconDeviceMultimediaPlayer) col(tomo.IconDeviceVideoDisplay) col(tomo.IconDeviceAudioInput) col(tomo.IconDeviceAudioOutput) // devices: hardware col(tomo.IconHardware) col(tomo.IconHardwareCPU) col(tomo.IconHardwareGPU) col(tomo.IconHardwareRAM) col(tomo.IconHardwareSoundCard) col(tomo.IconHardwareNetworkAdapter) // devices: power col(tomo.IconPowerBattery) // devices: storage col(tomo.IconStorageHardDisk) col(tomo.IconStorageFloppyDisk) col(tomo.IconStorageSolidState) col(tomo.IconStorageOptical) col(tomo.IconStorageFlashStick) col(tomo.IconStorageFlashCard) col(tomo.IconStorageMagneticTape) // devices: input col(tomo.IconInputGaming) col(tomo.IconInputKeyboard) col(tomo.IconInputMouse) col(tomo.IconInputTablet) row() // devices: network col(tomo.IconNetworkWired) col(tomo.IconNetworkWireless) col(tomo.IconNetworkCellular) col(tomo.IconNetworkLocal) col(tomo.IconNetworkInternet) col(tomo.IconNetworkVPN) col(tomo.IconNetworkServer) col(tomo.IconNetworkWorkgroup) row() // emblems col(tomo.IconEmblemDefault) col(tomo.IconEmblemEncrypted) col(tomo.IconEmblemFavorite) col(tomo.IconEmblemImportant) col(tomo.IconEmblemReadOnly) col(tomo.IconEmblemShared) col(tomo.IconEmblemSymbolicLink) col(tomo.IconEmblemSynchronized) col(tomo.IconEmblemSystem) col(tomo.IconEmblemUnreadable) row() // places col(tomo.IconPlaceDirectory) col(tomo.IconPlaceRemote) col(tomo.IconPlaceHome) col(tomo.IconPlaceDownloads) col(tomo.IconPlaceDesktop) col(tomo.IconPlacePhotos) col(tomo.IconPlaceBooks) col(tomo.IconPlaceBookmarks) col(tomo.IconPlaceTrash) col(tomo.IconPlaceDocuments) col(tomo.IconPlaceRepositories) col(tomo.IconPlaceMusic) col(tomo.IconPlaceArchives) col(tomo.IconPlaceFonts) col(tomo.IconPlaceBinaries) col(tomo.IconPlaceVideos) col(tomo.IconPlace3DObjects) col(tomo.IconPlaceHistory) col(tomo.IconPlacePreferences) row() // status: appointments col(tomo.IconAppointmentMissed) col(tomo.IconAppointmentSoon) // status: dialogs col(tomo.IconDialogError) col(tomo.IconDialogInformation) col(tomo.IconDialogPassword) col(tomo.IconDialogQuestion) col(tomo.IconDialogWarning) // status: directories col(tomo.IconDirectoryDragAccept) col(tomo.IconDirectoryFull) col(tomo.IconDirectoryOpen) col(tomo.IconDirectoryVisiting) // status: trash col(tomo.IconTrashFull) // status: resource col(tomo.IconResourceLoading) col(tomo.IconResourceMissing) // status: mail col(tomo.IconMailAttachment) col(tomo.IconMailUnread) col(tomo.IconMailReplied) col(tomo.IconMailSigned) col(tomo.IconMailSignedVerified) row() // status: network col(tomo.IconCellularSignal0) col(tomo.IconCellularSignal1) col(tomo.IconCellularSignal2) col(tomo.IconCellularSignal3) col(tomo.IconWirelessSignal0) col(tomo.IconWirelessSignal1) col(tomo.IconWirelessSignal2) col(tomo.IconWirelessSignal3) col(tomo.IconNetworkError) col(tomo.IconNetworkIdle) col(tomo.IconNetworkOffline) col(tomo.IconNetworkReceive) col(tomo.IconNetworkTransmit) col(tomo.IconNetworkTransmitReceive) // status: print col(tomo.IconPrintError) col(tomo.IconPrintPrinting) // status: security col(tomo.IconSecurityHigh) col(tomo.IconSecurityMedium) col(tomo.IconSecurityLow) // status: software col(tomo.IconSoftwareUpdateAvailable) col(tomo.IconSoftwareUpdateUrgent) col(tomo.IconSoftwareInstalling) // status: sync col(tomo.IconSyncError) col(tomo.IconSyncSynchronizing) // status: tasks col(tomo.IconTaskDue) col(tomo.IconTaskPastDue) // status: users col(tomo.IconUserAvailable) col(tomo.IconUserAway) col(tomo.IconUserIdle) col(tomo.IconUserOffline) row() // status: power col(tomo.IconBattery0) col(tomo.IconBattery1) col(tomo.IconBattery2) col(tomo.IconBattery3) col(tomo.IconBrightness0) col(tomo.IconBrightness1) col(tomo.IconBrightness2) col(tomo.IconBrightness3) // status: media col(tomo.IconVolume0) col(tomo.IconVolume1) col(tomo.IconVolume2) col(tomo.IconVolume3) col(tomo.IconPlaylistRepeat) col(tomo.IconPlaylistShuffle) // status: weather col(tomo.IconWeatherClear) col(tomo.IconWeatherClearNight) col(tomo.IconWeatherFewClouds) col(tomo.IconWeatherFewCloudsNight) col(tomo.IconWeatherFog) col(tomo.IconWeatherOvercast) col(tomo.IconWeatherSevereAlert) col(tomo.IconWeatherShowers) col(tomo.IconWeatherShowersScattered) col(tomo.IconWeatherSnow) col(tomo.IconWeatherStorm) return atlasTexture, source } type iconSet struct { atlasSmall canvas.TextureCloser atlasLarge canvas.TextureCloser texturesSmall map[tomo.Icon] canvas.Texture texturesLarge map[tomo.Icon] canvas.Texture } // New creates a new fallback icon set. func New () (style.IconSet, event.Cookie) { iconSet := new(iconSet) return iconSet, iconSet } func (this *iconSet) ensure () { if this.texturesSmall != nil { return } this.atlasSmall, this.texturesSmall = generateSource(atlasSmallBytes, 16) this.atlasLarge, this.texturesLarge = generateSource(atlasLargeBytes, 32) } func (this *iconSet) selectSource (size tomo.IconSize) map[tomo.Icon] canvas.Texture { if size == tomo.IconSizeSmall { return this.texturesSmall } else { return this.texturesLarge } } func (this *iconSet) Icon (icon tomo.Icon, size tomo.IconSize) canvas.Texture { this.ensure() source := this.selectSource(size) if texture, ok := source[icon]; ok { return texture } return nil } func (this *iconSet) MimeIcon (mime data.Mime, size tomo.IconSize) canvas.Texture { this.ensure() source := this.selectSource(size) if icon, ok := source[tomo.Icon(mime.String())]; ok { return icon } if mime == data.M("inode", "directory") { return source[tomo.IconPlaceDirectory] } else if icon, ok := source[tomo.Icon(util.GeneralizeXDGIconMimeType(mime).String())]; ok { return icon } else { return source[tomo.Icon(iconApplicationXGeneric)] } } func (this *iconSet) Close () { if this.atlasSmall != nil { this.atlasSmall.Close() } if this.atlasLarge != nil { this.atlasLarge.Close() } }