class DirAction < Action include BulletList DIR_PAGE = '/' FILE_PAGE = '/file' VIEW_AREA_OPTS = {:width => -100, :margin_left => 10, :margin_right => @gutter} def initialize super @filter_selection = Controller::FILTER_NAMES.first @sort_selection = Controller::SORT_NAMES.first end def execute(filename=nil) info "dir_action.execute(#{filename})" dir_item = @values.select{|item| item.path == filename}.first rescue nil @gutter = app.gutter app.background app.palegreen app.style(Shoes::Link, :underline => false, :stroke => app.blue) app.style(Shoes::LinkHover, :underline => true, :stroke => app.red) app.flow(:width => '100%') do title_stack = app.stack(:width => '100%') do app.background app.gradient(app.rgb(0, 255, 0), app.rgb(225, 255, 0), :angle => 135) app.title("Git Shoes", :align => 'center') end command_widget(dir_item, :width => 100) if dir_item.nil? @view_area = directory_widget(VIEW_AREA_OPTS) else @view_area = file_widget(dir_item, VIEW_AREA_OPTS) end end end def command_widget(dir_item, opt={}) app.stack(opt) do app.background app.gradient(app.rgb(0, 255, 0), app.rgb(255, 255, 0), :angle => -35) app.para app.link("Files", :click => lambda{app.visit(DIR_PAGE)}) app.rect(5, 30, 90, 1) if Controller.in_repository? app.para app.link("Status", :click => lambda{status_action}) if !dir_item.nil? && (dir_item.modified? || dir_item.candidate?) app.para app.link("Add", :click => lambda{add_action}) else app.para "Add" end if !dir_item.nil? && dir_item.modified? app.para app.link("Diff", :click => lambda{diff_action}) else app.para "Diff" end app.para app.link("Commit", :click => lambda{commit_action}) app.para "Config" else # app.para 'Status' # app.para "Diff" # app.para "Commit" # app.para "Branch" # app.para "Config" end end end def add_action # TODO implement puts "need to implement add_action" end def diff_action # TODO implement puts "need to implement diff_action" end def commit_action # TODO implement puts "need to implement commit_action" end def status_action if Controller.in_repository? @view_area.clear {status_widget(VIEW_AREA_OPTS)} end end def status_widget(opt={}) app.stack(opt) do app.para `git status` app.info app.para.text end end def file_widget(dir_item, opt={}) app.stack(opt) do app.para "filename: #{dir_item.path}" # TODO: everything there is to know about the file ;) app.para(app.strong('Log')) app.flow(:height => 200, :margin_right => @gutter, :scroll => true) do app.background app.turquoise app.para(dir_item.log) end if dir_item.modified? app.para app.para(app.strong('Diff')) app.flow(:height => 200, :margin_right => @gutter, :scroll => true) do app.background app.turquoise app.para dir_item.diff end end end end def directory_widget(opt={}) app.stack(opt) do cwd = Controller.cwd git_project_dir = Controller.git_project_dir if git_project_dir.nil? app.caption("Directory", :align => 'center') app.para(cwd) else repository_widget(cwd, git_project_dir) end file_selection(git_project_dir) end end def repository_widget(cwd, git_project_dir) app.caption("Git Repository", :align => 'center') app.flow do app.para "Branch: " @branch_listbox = app.list_box(:items => Controller.branches) do |list| Controller.branch = list.text file_selection_changed end @branch_listbox.choose(Controller.branch(false)) app.button("New", :margin_left => 10) # TODO Hook it up app.button("Delete", :margin_left => 10) # TODO Hook it up app.button("Stash", :margin_left => 10) { Controller.stash } app.button("Stash Pop", :margin_left => 10) { Controller.stash_pop } end app.para("Branch: ", app.strong(Controller.branch(true))) app.para(app.strong(git_project_dir, app.em(cwd.gsub(git_project_dir, '')))) buf = [] repository_info = Controller.repository_info repository_info.each do |key, value| buf << "#{value} #{key} files" end app.para buf.join(", ") end def file_selection(git_project_dir) app.flow do app.para 'Filter by: ' if git_project_dir.nil? filter_items = Controller::FILTER_NAMES unless filter_items.include?(@filter_selection) @filter_selection = filter_items.first end else filter_items = Controller::GIT_FILTER_NAMES end @filter_by = app.list_box(:items => filter_items) do |list| file_selection_changed end app.para ' Sort by: ' @sort_by = app.list_box(:items => Controller::SORT_NAMES) do |list| file_selection_changed end @listing = app.stack @filter_by.choose(@filter_selection) @sort_by.choose(@sort_selection) # need to fire a selection changed to get the intial loading of @listing file_selection_changed end end def file_selection_changed @filter_selection = @filter_by.text @sort_selection = @sort_by.text @values = Controller.files do |filename| if filename.nil? app.visit(DIR_PAGE) else app.visit(FILE_PAGE + '/' + filename) end end @values = Controller.filter_by(@filter_by.text, @values) @values = Controller.sort_by(@sort_by.text, @values) @listing.clear {bullet_list(@values, :bullet => fs_bullets)} end def fs_bullets lambda do |item| if item.path == '..' bullet = BulletList::SPACE_BULLET else if item.directory? app.fill app.black bullet = BulletList::PLUS_BULLET else if item.modified? app.fill app.red elsif item.managed? app.fill app.lime else app.fill app.black end bullet = BulletList::CIRCLE_BULLET end end bullet end end end