122 lines
3.5 KiB
Lua
122 lines
3.5 KiB
Lua
local core = require "core"
|
|
local common = require "core.common"
|
|
local style = require "core.style"
|
|
local View = require "core.view"
|
|
|
|
local restore_command = {
|
|
symbol = "w", action = function() system.set_window_mode("normal") end
|
|
}
|
|
|
|
local maximize_command = {
|
|
symbol = "W", action = function() system.set_window_mode("maximized") end
|
|
}
|
|
|
|
local title_commands = {
|
|
{symbol = "_", action = function() system.set_window_mode("minimized") end},
|
|
maximize_command,
|
|
{symbol = "X", action = function() core.quit() end},
|
|
}
|
|
|
|
---@class core.titleview : core.view
|
|
---@field super core.view
|
|
local TitleView = View:extend()
|
|
|
|
local function title_view_height()
|
|
return style.font:get_height() + style.padding.y * 2
|
|
end
|
|
|
|
function TitleView:new()
|
|
TitleView.super.new(self)
|
|
self.visible = true
|
|
end
|
|
|
|
function TitleView:configure_hit_test(borderless)
|
|
if borderless then
|
|
local title_height = title_view_height()
|
|
local icon_w = style.icon_font:get_width("_")
|
|
local icon_spacing = icon_w
|
|
local controls_width = (icon_w + icon_spacing) * #title_commands + icon_spacing
|
|
system.set_window_hit_test(title_height, controls_width, icon_spacing)
|
|
-- core.hit_test_title_height = title_height
|
|
else
|
|
system.set_window_hit_test()
|
|
end
|
|
end
|
|
|
|
function TitleView:update()
|
|
self.size.y = self.visible and title_view_height() or 0
|
|
title_commands[2] = core.window_mode == "maximized" and restore_command or maximize_command
|
|
TitleView.super.update(self)
|
|
end
|
|
|
|
|
|
function TitleView:draw_window_title()
|
|
local h = style.font:get_height()
|
|
local ox, oy = self:get_content_offset()
|
|
local color = style.text
|
|
local x, y = ox + style.padding.x, oy + style.padding.y
|
|
x = common.draw_text(style.icon_font, color, "M ", nil, x, y, 0, h)
|
|
local title = core.compose_window_title(core.window_title)
|
|
common.draw_text(style.font, color, title, nil, x, y, 0, h)
|
|
end
|
|
|
|
function TitleView:each_control_item()
|
|
local icon_h, icon_w = style.icon_font:get_height(), style.icon_font:get_width("_")
|
|
local icon_spacing = icon_w
|
|
local ox, oy = self:get_content_offset()
|
|
ox = ox + self.size.x
|
|
local i, n = 0, #title_commands
|
|
local iter = function()
|
|
i = i + 1
|
|
if i <= n then
|
|
local dx = - (icon_w + icon_spacing) * (n - i + 1)
|
|
local dy = style.padding.y
|
|
return title_commands[i], ox + dx, oy + dy, icon_w, icon_h
|
|
end
|
|
end
|
|
return iter
|
|
end
|
|
|
|
|
|
function TitleView:draw_window_controls()
|
|
for item, x, y, w, h in self:each_control_item() do
|
|
local color = item == self.hovered_item and style.text or style.dim
|
|
common.draw_text(style.icon_font, color, item.symbol, nil, x, y, 0, h)
|
|
end
|
|
end
|
|
|
|
|
|
function TitleView:on_mouse_pressed(button, x, y, clicks)
|
|
local caught = TitleView.super.on_mouse_pressed(self, button, x, y, clicks)
|
|
if caught then return end
|
|
core.set_active_view(core.last_active_view)
|
|
if self.hovered_item then
|
|
self.hovered_item.action()
|
|
end
|
|
end
|
|
|
|
|
|
function TitleView:on_mouse_moved(px, py, ...)
|
|
if self.size.y == 0 then return end
|
|
TitleView.super.on_mouse_moved(self, px, py, ...)
|
|
self.hovered_item = nil
|
|
local x_min, x_max, y_min, y_max = self.size.x, 0, self.size.y, 0
|
|
for item, x, y, w, h in self:each_control_item() do
|
|
x_min, x_max = math.min(x, x_min), math.max(x + w, x_max)
|
|
y_min, y_max = y, y + h
|
|
if px > x and py > y and px <= x + w and py <= y + h then
|
|
self.hovered_item = item
|
|
return
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
function TitleView:draw()
|
|
self:draw_background(style.background2)
|
|
self:draw_window_title()
|
|
self:draw_window_controls()
|
|
end
|
|
|
|
return TitleView
|