1
0
Fork 0
freesewing/sites/shared/components/workbench/views/view-header.mjs

148 lines
4.4 KiB
JavaScript
Raw Normal View History

2023-06-21 21:17:07 -05:00
import { useContext } from 'react'
import { PanZoomContext } from 'shared/components/workbench/pattern/pan-zoom-context.mjs'
import { useTranslation } from 'next-i18next'
import {
PaperlessIcon,
SaIcon,
RocketIcon,
BulletIcon,
UnitsIcon,
DetailIcon,
IconWrapper,
ClearIcon,
} from 'shared/components/icons.mjs'
2023-06-21 23:11:14 -05:00
export const ns = ['common', 'core-settings', 'ui-settings']
2023-06-21 21:17:07 -05:00
const ZoomInIcon = (props) => (
<IconWrapper {...props}>
<path d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607zM10.5 7.5v6m3-3h-6" />
</IconWrapper>
)
const ZoomOutIcon = (props) => (
<IconWrapper {...props}>
<path d="M21 21l-5.197-5.197m0 0A7.5 7.5 0 105.196 5.196a7.5 7.5 0 0010.607 10.607zM13.5 10.5h-6" />
</IconWrapper>
)
const IconButton = ({ Icon, onClick, dflt = true, title, hide = false }) => (
2023-06-21 23:11:14 -05:00
<div className="tooltip tooltip-bottom tooltip-primary flex items-center" data-tip={title}>
<button
onClick={onClick}
className={`text-${dflt ? 'neutral-content' : 'accent'} hover:text-secondary-focus ${
hide ? 'invisible' : ''
}`}
title={title}
>
<Icon />
</button>
</div>
2023-06-21 21:17:07 -05:00
)
const ZoomButtons = ({ t }) => {
const { zoomFunctions, zoomed } = useContext(PanZoomContext)
if (!zoomFunctions) return null
return (
<div className="flex flex-row content-center gap-4">
<IconButton
Icon={ClearIcon}
onClick={zoomFunctions.reset}
title={t('resetZoom')}
hide={!zoomed}
/>
<IconButton
Icon={ZoomOutIcon}
onClick={() => zoomFunctions.zoomOut()}
title={t('zoomOut')}
dflt
/>
<IconButton
Icon={ZoomInIcon}
onClick={() => zoomFunctions.zoomIn()}
title={t('zoomIn')}
dflt
/>
</div>
)
}
const Spacer = () => <span className="opacity-50">|</span>
2023-06-21 22:14:57 -05:00
export const ViewHeader = ({ update, settings, ui, control, setSettings }) => {
2023-06-21 21:17:07 -05:00
const { t } = useTranslation(ns)
return (
2023-06-21 23:11:14 -05:00
<div className="flex flex-row flex-wrap gap-4 py-4 pt-4 w-full bg-neutral text-neutral-content items-center justify-center lg:sticky top-0 z-20">
2023-06-21 21:17:07 -05:00
<ZoomButtons t={t} />
<Spacer />
<div className="flex flex-row items-center gap-4">
<IconButton
Icon={SaIcon}
dflt={settings.sabool ? false : true}
onClick={() => update.toggleSa()}
2023-06-21 23:11:14 -05:00
title={t('core-settings:sabool.t')}
2023-06-21 21:17:07 -05:00
/>
<IconButton
Icon={PaperlessIcon}
dflt={settings.paperless ? false : true}
onClick={() => update.settings(['paperless'], !settings.paperless)}
2023-06-21 23:11:14 -05:00
title={t('core-settings:paperless.t')}
2023-06-21 21:17:07 -05:00
/>
<IconButton
Icon={DetailIcon}
dflt={settings.complete}
onClick={() =>
update.settings(
['complete'],
typeof settings.complete === 'undefined' ? 0 : settings.complete ? 0 : 1
)
}
2023-06-21 23:11:14 -05:00
title={t('core-settings:complete.t')}
2023-06-21 21:17:07 -05:00
/>
<IconButton
Icon={
settings.units !== 'imperial'
? UnitsIcon
: ({ className }) => <UnitsIcon className={`${className} rotate-180 w-6 h-6`} />
}
dflt={settings.units !== 'imperial'}
onClick={() =>
update.settings(['units'], settings.units === 'imperial' ? 'metric' : 'imperial')
}
2023-06-21 23:11:14 -05:00
title={t('core-settings:units.t')}
2023-06-21 21:17:07 -05:00
/>
</div>
<Spacer />
2023-06-21 23:11:14 -05:00
<div
className="tooltip tooltip-primary tooltip-bottom flex flex-row items-center"
data-tip={t('ui-settings:control.t')}
>
2023-06-21 21:17:07 -05:00
{[1, 2, 3, 4, 5].map((score) => (
<button onClick={() => update.setControl(score)} className="text-primary" key={score}>
<BulletIcon fill={control >= score ? true : false} />
</button>
))}
</div>
<Spacer />
<div className="flex flex-row items-center gap-4">
<IconButton
Icon={RocketIcon}
dflt={ui.renderer !== 'svg'}
onClick={() => update.ui(['renderer'], ui.renderer === 'react' ? 'svg' : 'react')}
2023-06-21 23:11:14 -05:00
title={t('ui-settings:renderer.t')}
2023-06-21 21:17:07 -05:00
/>
</div>
2023-06-21 22:14:57 -05:00
<Spacer />
<div className="flex flex-row items-center gap-4">
<button
2023-06-22 10:32:27 -05:00
onClick={() => setSettings({})}
2023-06-21 22:14:57 -05:00
className={`btn btn-sm btn-outline btn-secondary hover:text-secondary-focus`}
>
<ClearIcon /> {t('clearSettings')}
</button>
</div>
2023-06-21 21:17:07 -05:00
</div>
)
}