module Filechooser

require 'pathname'

require 'highline'

Constants

NO_CHOICE
STARTFOLDER

Public Class Methods

dirchooser(startfolder=STARTFOLDER) click to toggle source
# File lib/filechooser/api.rb, line 5
def dirchooser(startfolder=STARTFOLDER) # return the directory chosen by the user
  p0 = Pathname.new(startfolder)
    while true
      case get_answer(p0)
        when /[cC]/ then return p0.to_s
        when /[xX]/ then return ''
        when /[lL]/ then Dir.chdir(p0) do
                           system("ls -d */ ")  # list directories only
                         end
        when /[dD]/ then Highline.cli.say("Subdirectories of '#{p0}':".style(":info"))
                         uvz=choose_uvz(p0) 
                         if uvz==''
                           Highline.cli.say("No subdirectories found.".style(":warning"))
                         else
                           uvz=File.expand_path(uvz,p0)
                           uvz=Pathname.new(uvz)
                           p0=uvz
                         end
        when /[nN]/ then name=Highline.cli.ask("Name of new directory? ".style(":ask_line"))
                         if name.verboten? 
                           Highline.cli.say("Name contains deprecated characters. Aborted.".style(":warning"))
                         else
                           begin
                             Dir.chdir(p0) do
                               if File.directory?(name)
                                 Highline.cli.say("Directory already exists.".style(":warning"))
                               else
                                 Dir.mkdir(name) 
                               end
                             end
                             uvz=File.expand_path(name,p0)
                             uvz=Pathname.new(uvz)
                             p0=uvz
                           rescue
                             Highline.cli.say("Error: Could not create directory.".style(":warning"))
                           end
                         end
        when /[uU]/ then p0=p0.parent
      end
    end
  
end
filechooser(startfolder=STARTFOLDER) click to toggle source
# File lib/filechooser/api.rb, line 49
def filechooser(startfolder=STARTFOLDER)  # return the file chosen by the user
      p0 = Pathname.new(startfolder)
      while true
        case get_answer(p0)
          when /[cC]/ then  Highline.cli.say("Files of #{p0}:".style(":info"))
                            datei=choose_datei(p0) 
                            if datei==''
                              Highline.cli.say("No files found.".style(":warning"))
                            elsif datei==NO_CHOICE
                              # Do nothing
                            else
                              datei=File.expand_path(datei,p0)
                              datei=Pathname.new(datei)
                              return datei.to_s
                            end
          when /[xX]/ then return ''
          when /[lL]/ then system("ls -p '#{p0}'") # List directories with a trailing forward-slash
          when /[dD]/ then Highline.cli.say("Subdirectories of '#{p0}':".style(":info"))
                           uvz=choose_uvz(p0) 
                           if uvz==''
                             Highline.cli.say("No subdirectories found.".style(":warning"))
                           else
                             uvz=File.expand_path(uvz,p0)
                             uvz=Pathname.new(uvz)
                             p0=uvz
                           end
          when /[nN]/ then name=Highline.cli.ask("Name of new file? ".style(":ask_line"))
                           if name.verboten? 
                             Highline.cli.say("Name contains deprecated characters. Aborted.".style(":warning"))
                           else
                             begin
                               Dir.chdir(p0) do
                                 if File.file?(name)
                                   Highline.cli.say("File already exists.".style(":warning"))
                                 else
                                   if permission_given("Create and choose file '#{name}'")
                                     File.open(name,"a") 
                                     datei=File.expand_path(name,p0)
                                     datei=Pathname.new(datei)
                                     return datei
                                   end
                                 end
                               end
                             rescue
                               Highline.cli.say("Error: Could not create file.".style(":warning"))
                             end
                           end
          when /[uU]/ then p0=p0.parent
        end
      end
    
  end

Private Class Methods

choose_datei(vz) click to toggle source
# File lib/filechooser/api.rb, line 123
def choose_datei(vz)  # returns chosen file of vz
    a=dateien(vz)
    return '' if a==[]
    a << NO_CHOICE
    Highline.cli.choose do |menu|
      menu.prompt = "Your Choice? "
      a.each {|s| menu.choice(s) { return s } }
    end
  end
choose_uvz(vz) click to toggle source
# File lib/filechooser/api.rb, line 114
def choose_uvz(vz)  # returns chosen subdirectory of vz
  a=unterverzeichnisse(vz)
  return '' if a==[]
  Highline.cli.choose do |menu|
    menu.prompt = "Your Choice? "
    a.each {|s| menu.choice(s) { return s } }
  end
end
dateien(vz) click to toggle source
# File lib/filechooser/api.rb, line 145
def dateien(vz)    # Array with all regular files of vz, no hidden ones
  rf=[]
  begin
  Dir.chdir(vz) do  
    Dir['*'].each { |sd| rf << sd if File.file?(sd)} 
  end
  rescue
    Highline.cli.say("Error: Could not enter directory.".style(":warning"))
  end
  return rf.sort
end
get_answer(p0) click to toggle source
# File lib/filechooser/api.rb, line 104
def get_answer(p0)
  Highline.cli.say("Current Directory: #{p0}".style(":info"))
  sd=unterverzeichnisse(p0).length  # p0.children.select(&:directory?).length would count hidden folders too
  f=dateien(p0).length
  Highline.cli.say("(#{sd} directories, #{f} files)".style(":info"))
  choices= "(L)ist (C)hoose (D)own (U)p (N)ew E(x)it ? "
  answer = Highline.cli.ask(choices.style(":ask_line")) {|q| q.character = true}
end
permission_given(wofuer) click to toggle source
# File lib/filechooser/api.rb, line 158
def permission_given(wofuer)  # true = yes = permission given
  (Highline.cli.ask("#{wofuer}? (Yn) ".style(":ask_line")) do |q| q.character = true  end).downcase=='y'
end
unterverzeichnisse(vz) click to toggle source
# File lib/filechooser/api.rb, line 133
def unterverzeichnisse(vz)    # Array with all direct subdirectories of vz, no hidden ones
  uvz=[]
  begin
    Dir.chdir(vz) do  
      Dir['*/'].each { |sd| uvz << sd.chop} # sd comes with / at the end
    end
  rescue
    Highline.cli.say("Error: Could not enter directory.".style(":warning"))
  end
  return uvz.sort
end