require 'fileutils'
require 'set'
require 'yaml'
require 'minicomic/util/observable'
module Minicomic
module UI
class Preferences < Util::Observable
observer_method :recent_projects_changed, 1 # projects
PREFERENCES_FILENAME = 'preferences.yaml'
MAX_RECENT_PROJECTS = 10
def initialize(sequencer, profile_dir)
super(sequencer)
@profile_dir = profile_dir.to_s.dup
FileUtils.mkdir_p @profile_dir
@filename = File.join(@profile_dir, PREFERENCES_FILENAME)
@flush_needed = false
begin
@preferences = File.open(@filename, "r") { |stream|
YAML.load(stream)
}
rescue Exception
@preferences = {}
end
end
def queue_flush
unless @flush_needed
@flush_needed = true
flush
end
end
private :queue_flush
def do_flush
if @flush_needed
File.open(@filename, "w") do |stream|
YAML.dump(@preferences, stream)
end
@flush_needed = false
end
end
private :do_flush
def flush
later { do_flush }
end
def shutdown
later { do_flush }
end
def recent_projects
@preferences['recent_projects'] ||= []
end
private :recent_projects
def add_recent_project(path)
later do
queue_flush
projects = recent_projects
old_index = projects.index path
projects.delete_at old_index if old_index
projects.unshift path
projects.pop while projects.size > MAX_RECENT_PROJECTS
@observers.recent_projects_changed(projects.dup.freeze)
end
end
def clear_recent_projects
later do
queue_flush
projects = recent_projects
size = projects.size
projects.clear
@observers.recent_projects_changed([].freeze)
end
end
def update_new_observer(observer)
observer.recent_projects_changed(recent_projects.dup.freeze)
end
end
end
end