sketchucation logo sketchucation
    • Login
    Oops, your profile's looking a bit empty! To help us tailor your experience, please fill in key details like your SketchUp version, skill level, operating system, and more. Update and save your info on your profile page today!
    πŸ«› Lightbeans Update | Metallic and Roughness auto-applied in SketchUp 2025+ Download

    Dialog to Return a Folder

    Scheduled Pinned Locked Moved Developers' Forum
    7 Posts 4 Posters 1.1k Views 4 Watching
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • TIGT Offline
      TIG Moderator
      last edited by

      Currently UI.openpanel() only returns a file-path and you have to get its directory to select a folder.
      I have a cross-platform tool where at one point you need to select a folder - if it's new or empty you can't select it without first making a temporary file in it and picking that... My client is unimpressed with the this aspect [as am I]. I had hoped that entering '.' at the file prompt would allow you to select the folder by its hidden '.' - it doesn't work... Does anyone have any ideas about selecting a folder/directory directly - e.g. is there a java-script - web-dialog solution I haven't come across ? It must work on PC and Mac πŸ˜’

      TIG

      1 Reply Last reply Reply Quote 0
      • J Offline
        Jim
        last edited by

        I consider this a proof-of-concept, so needs some work to make it usable. But so far, it is cross-platform. If you (or anyone) wants to turn it into something useful for everyone, please do.


        folder_browser.zip

        Hi

        1 Reply Last reply Reply Quote 0
        • thomthomT Offline
          thomthom
          last edited by

          Godd idea Jim. Too bad it's not possible to make modal webdialogs on OSX. (hopes for something nice in SU8)

          Thomas Thomassen β€” SketchUp Monkey & Coding addict
          List of my plugins and link to the CookieWare fund

          1 Reply Last reply Reply Quote 0
          • TIGT Offline
            TIG Moderator
            last edited by

            Thanks Jim, I'll investigate it...........

            TIG

            1 Reply Last reply Reply Quote 0
            • Dan RathbunD Offline
              Dan Rathbun
              last edited by

              Amazing.. was thinking of doing this exact thing, night before last.
              This is a good start.
              Needs some cosmetics, and a few bugs fixed.

              • The pwd output to the console, seems to be 1 dir behind.* should have an image entry in the css to set image background transparent (so the pick hilte shows thru.)* needs the meta-tag in the html <HEAD> to turn on XP style controls

              I'm not here much anymore.

              1 Reply Last reply Reply Quote 0
              • Dan RathbunD Offline
                Dan Rathbun
                last edited by

                After playing around with Jim's browser for a few mins...
                my initial reactions are:

                (1) It's (at least on my XP machine,) much faster at displaying folder lists than the native Windows FileExplorer. (Probably because it does not worry about file type associations, or right-click context menus for everything displayed.)

                (2) It's much more fun (ie, more intuitive, easier to use, faster, etc.) than that 'darned' postage stamp sized Windows (pre-Vista,) native folder picker. Add the fact it's customizable... and it can be a candidate to also use outside of Sketchup on a PC with a full Ruby install. (It would likely run as an HTA in that case.)

                Thumbs up πŸ‘ and three cheers so far Jim!

                I'm not here much anymore.

                1 Reply Last reply Reply Quote 0
                • TIGT Offline
                  TIG Moderator
                  last edited by

                  Thanks

                  I clobbered together a folder_browser as part of a larger code set using your ideas... as it's subject to a NDA I can't post it here, BUT here are some tips about what I changed/added - in no particular order...

                  I set a @ variable to represent the returned folderpath.

                  The starter is def startfb(dir=nil, input=nil)
                  this is to separate it from another 'start', by running it with arguments I can determine which directory to start the list in [dir] and then what action to take [def to run] with the resulting @folderpath [using input].
                  So we don't mess with the current working directory we remember it, reset it to dir then process and set it back on closing [inside the calling code NOT the fb itself]

                  I made it a sub-def of a wider class and ensured that @dlg etc were renamed so as not to clash with another @dlg I already had open.

                  I changed the dialog to be a fixed size [also added 'instructions' into the top-bar] - in the js etc I made the list 80% so it never squeezes the buttons off screen. I also swapped the location to the top of the dialog and removed the 'Location:' text as it sees clear what the string is anyway.

                  I changed the 'OK' button size to be bigger value=OK style='width:146px' and added new functions to 'Cancel' and 'New Folder' onclick="cancel()" and onclick="mkdir()"... These in turn 'call' back and close the dialog or open another dialog into which you can type the new folder name...

                  If you add a new folder it is added to the list immediately after the folder-up item, the rest are listed in order - this makes finding that new folder much easier - if you navigate away and back it will now get added to the list in the correct order...

                  The call back is a new sub-def called 'newfolder()' and that opens another simple dialog to get the the new name - it's trapped in my case to ensure it only has _ and alphanumerics in it - newDir.gsub!(/[^_A-Za-z0-9]/,''). It also checks for validity and preexistence and warns appropriately.
                  Dir.mkdir(newDir) @dlgfb.execute_script('clear_list()') self.populatefb(Dir.pwd, newDir)
                  Note how the populate def [renamed to avoid a clash] takes arguments - this is to set the starting directory and IF there's a new-directory to pass it over so that the list can be manipulated to have its name second on the updated list. list << file if File.basename(file) != newDir and
                  scr='appendDiv("../");' @dlgfb.execute_script(scr) scr='appendDiv("'+newDir+'");' if newDir
                  Then the list is appended...

                  @dlgfb.show_modal{} ensures that the dialog stays foremost until you Cancel or OK,

                  I added
                  img{ opacity:0.66; /*Firefox & Chrome*/ filter:alpha(opacity=66); /* IE */ }
                  to the css so that the images are slightly transparent and show the selected item through themselves.
                  I also edited the folder.png and erased the white edge areas so that it was 'transparent'. I also duplicated it as folderup.png and added an 'up' arrow onto it - this img is then added to the listed item IF its text is ../ - i.e. it's the navigate folder-up at the top of the list...
                  if ( txt == '../') d.innerHTML = '<img src="./folderup.png"/> '+txt; else d.innerHTML = '<img src="./folder.png"/> '+txt;
                  Also added tests for js's OK
                  if ( selected_elem == null ) my_alert(); else if ( selected_elem.innerText.trim() == "../" ) my_alert(); else use_this( selected_elem.innerText.trim() );
                  Where my_alert() opens an error message telling you to select a folder before clicking OK - - the first trap is you haven't selected a folder yet and the second is you've selected the first item 'folder-up' which can't be taken as a folder-path.
                  Also note how this
                  d.ondblclick = function(id) { selected_elem = null folder_select(d.id);return(false); }
                  ensures that if you have double-clicked the folder-up item or another folder, to move the list into there, then there is nothing remembered as the selected_elem - otherwise hitting OK when you were in the next folder level would take the last selected folder [double-clicked >> current-folder] as the desired one which is not what's wanted - but this way my_alert() will tell you to select something in the current list before pressing OK...

                  I also changed the selection color to be less dark [ruby:3dez4ubj]this.style.background = 'gray';[/ruby:3dez4ubj]

                  Hope these bits help... πŸ˜„

                  TIG

                  1 Reply Last reply Reply Quote 0
                  • 1 / 1
                  • First post
                    Last post
                  Buy SketchPlus
                  Buy SUbD
                  Buy WrapR
                  Buy eBook
                  Buy Modelur
                  Buy Vertex Tools
                  Buy SketchCuisine
                  Buy FormFonts

                  Advertisement