mirror of
https://github.com/Theaninova/TheaninovOS.git
synced 2025-12-12 19:46:20 +00:00
136 lines
4.8 KiB
JavaScript
136 lines
4.8 KiB
JavaScript
const {Gdk, Gtk} = imports.gi
|
|
const GObject = imports.gi.GObject
|
|
const Lang = imports.lang
|
|
import {Utils, Widget} from "../../imports.js"
|
|
|
|
// min-height/min-width for height/width
|
|
// background-color/color for background/indicator color
|
|
// padding for pad of indicator
|
|
// font-size for selected index (0-based)
|
|
export const NavigationIndicator = (count, vertical, props) =>
|
|
Widget({
|
|
...props,
|
|
type: Gtk.DrawingArea,
|
|
setup: area => {
|
|
const styleContext = area.get_style_context()
|
|
const width = Math.max(
|
|
styleContext.get_property("min-width", Gtk.StateFlags.NORMAL),
|
|
area.get_allocated_width(),
|
|
)
|
|
const height = Math.max(
|
|
styleContext.get_property("min-height", Gtk.StateFlags.NORMAL),
|
|
area.get_allocated_height(),
|
|
)
|
|
area.set_size_request(width, height)
|
|
|
|
area.connect(
|
|
"draw",
|
|
Lang.bind(area, (area, cr) => {
|
|
const styleContext = area.get_style_context()
|
|
const width = Math.max(
|
|
styleContext.get_property("min-width", Gtk.StateFlags.NORMAL),
|
|
area.get_allocated_width(),
|
|
)
|
|
const height = Math.max(
|
|
styleContext.get_property("min-height", Gtk.StateFlags.NORMAL),
|
|
area.get_allocated_height(),
|
|
)
|
|
// console.log('allocated width/height:', area.get_allocated_width(), '/', area.get_allocated_height())
|
|
area.set_size_request(width, height)
|
|
const paddingLeft = styleContext.get_padding(Gtk.StateFlags.NORMAL).left
|
|
const paddingRight = styleContext.get_padding(Gtk.StateFlags.NORMAL).right
|
|
const paddingTop = styleContext.get_padding(Gtk.StateFlags.NORMAL).top
|
|
const paddingBottom = styleContext.get_padding(Gtk.StateFlags.NORMAL).bottom
|
|
|
|
const selectedCell = styleContext.get_property("font-size", Gtk.StateFlags.NORMAL)
|
|
|
|
let cellWidth = width
|
|
let cellHeight = height
|
|
if (vertical) cellHeight /= count
|
|
else cellWidth /= count
|
|
const indicatorWidth = cellWidth - paddingLeft - paddingRight
|
|
const indicatorHeight = cellHeight - paddingTop - paddingBottom
|
|
|
|
const background_color = styleContext.get_property("background-color", Gtk.StateFlags.NORMAL)
|
|
const color = styleContext.get_property("color", Gtk.StateFlags.NORMAL)
|
|
cr.setLineWidth(2)
|
|
// Background
|
|
cr.setSourceRGBA(
|
|
background_color.red,
|
|
background_color.green,
|
|
background_color.blue,
|
|
background_color.alpha,
|
|
)
|
|
cr.rectangle(0, 0, width, height)
|
|
cr.fill()
|
|
|
|
// The indicator line
|
|
cr.setSourceRGBA(color.red, color.green, color.blue, color.alpha)
|
|
if (vertical) {
|
|
cr.rectangle(
|
|
paddingLeft,
|
|
paddingTop + cellHeight * selectedCell + indicatorWidth / 2,
|
|
indicatorWidth,
|
|
indicatorHeight - indicatorWidth,
|
|
)
|
|
cr.stroke()
|
|
cr.rectangle(
|
|
paddingLeft,
|
|
paddingTop + cellHeight * selectedCell + indicatorWidth / 2,
|
|
indicatorWidth,
|
|
indicatorHeight - indicatorWidth,
|
|
)
|
|
cr.fill()
|
|
cr.arc(
|
|
paddingLeft + indicatorWidth / 2,
|
|
paddingTop + cellHeight * selectedCell + indicatorWidth / 2,
|
|
indicatorWidth / 2,
|
|
Math.PI,
|
|
2 * Math.PI,
|
|
)
|
|
cr.fill()
|
|
cr.arc(
|
|
paddingLeft + indicatorWidth / 2,
|
|
paddingTop + cellHeight * selectedCell + indicatorHeight - indicatorWidth / 2,
|
|
indicatorWidth / 2,
|
|
0,
|
|
Math.PI,
|
|
)
|
|
cr.fill()
|
|
} else {
|
|
cr.rectangle(
|
|
paddingLeft + cellWidth * selectedCell + indicatorHeight / 2,
|
|
paddingTop,
|
|
indicatorWidth - indicatorHeight,
|
|
indicatorHeight,
|
|
)
|
|
cr.stroke()
|
|
cr.rectangle(
|
|
paddingLeft + cellWidth * selectedCell + indicatorHeight / 2,
|
|
paddingTop,
|
|
indicatorWidth - indicatorHeight,
|
|
indicatorHeight,
|
|
)
|
|
cr.fill()
|
|
cr.arc(
|
|
paddingLeft + cellWidth * selectedCell + indicatorHeight / 2,
|
|
paddingTop + indicatorHeight / 2,
|
|
indicatorHeight / 2,
|
|
0.5 * Math.PI,
|
|
1.5 * Math.PI,
|
|
)
|
|
cr.fill()
|
|
cr.arc(
|
|
paddingLeft + cellWidth * selectedCell + indicatorWidth - indicatorHeight / 2,
|
|
paddingTop + indicatorHeight / 2,
|
|
indicatorHeight / 2,
|
|
-0.5 * Math.PI,
|
|
0.5 * Math.PI,
|
|
)
|
|
cr.fill()
|
|
}
|
|
}),
|
|
)
|
|
},
|
|
})
|