-- mod-version:3
local core = require "core"
local common = require "core.common"
local command = require "core.command"
local keymap = require "core.keymap"
local RootView = require "core.rootview"

local opacity_on = true
local use_mousewheel = true
local opacity_steps = 0.05
local default_opacity = 1
local current_opacity = default_opacity

local function set_opacity(opacity)
  if not opacity_on then return end
  current_opacity = common.clamp(opacity, 0.2, 1)
  system.set_window_opacity(current_opacity)
end

local on_mouse_wheel = RootView.on_mouse_wheel

function RootView:on_mouse_wheel(d, ...)
  if keymap.modkeys["shift"] and use_mousewheel then
    if d < 0 then command.perform "opacity:decrease" end
    if d > 0 then command.perform "opacity:increase" end
  else
    return on_mouse_wheel(self, d, ...)
  end
end

local function tog_opacity()
  opacity_on = not opacity_on
  if opacity_on then
    core.log("Opacity: on")
    system.set_window_opacity(current_opacity)
  else
    core.log("Opacity: off")
    system.set_window_opacity(default_opacity)
  end
end

local function res_opacity()
  set_opacity(default_opacity)
end

local function inc_opacity()
  set_opacity(current_opacity + opacity_steps)
end

local function dec_opacity()
  set_opacity(current_opacity - opacity_steps)
end

command.add(nil, {
  ["opacity:toggle"  ] = function() tog_opacity() end,
  ["opacity:reset"   ] = function() res_opacity() end,
  ["opacity:decrease"] = function() dec_opacity() end,
  ["opacity:increase"] = function() inc_opacity() end,
  ["opacity:toggle mouse wheel use"] = function()
    use_mousewheel = not use_mousewheel
    if use_mousewheel then
      core.log("Opacity (shift + mouse wheel): on")
    else
      core.log("Opacity (shift + mouse wheel): off")
    end
  end,
})

keymap.add {
  ["shift+f11"] = "opacity:toggle",
  ["ctrl+f11"]  = "opacity:toggle mouse wheel use",
}
