AutoHotkey Homepage AutoHotkey Community
Let's help each other out
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Recent Folders script
Goto page 1, 2, 3  Next
 
Post new topic   Reply to topic    AutoHotkey Community Forum Index -> Scripts & Functions
View previous topic :: View next topic  
Author Message
CarlosTheTackle



Joined: 19 Oct 2004
Posts: 102

PostPosted: Sun Jan 23, 2005 3:35 pm    Post subject: Recent Folders script Reply with quote

I don't know if anyone's made one of these yet, but it was a good learning experience nevertheless.

This script monitors your Windows explorer navigation and keeps a log of folders you visit (and spend more than a few seconds in, to eliminate logging 'pass-thru' folders on your way deeper into the path structure). The list of most recently visited places is stored in a menu which can be accessed via the tray or by pressing Win-LeftMouseButton.
On exit, it will write your list of recent folders to a file called 'Recent Folders lists.log' so it can remember the list from session to session.

The script can be exited quickly with a double-click on the tray icon.

Thanks to Rajat for alerting me to the %A_ThisMenuItem% variable as a means to keep track of an ever-changing menu.

Comments and suggestions welcome.
Code:
;CONFIG
rf_foldernum=10   ;set this value to the maximum number of folders you want remembered
rf_timer=2000   ;this is the period of the timer that checks the current window.
      ;Experiment to find something that works for you
      ;Too long = quick-access folders won't be picked up
      ;Too short = too many 'pass-thru' folders will be logged.


Process, Priority,, High ;This is necessary on my PC, but can probably be disabled on most modern, fast PCs.

;load current folder list from file
Loop, Read, Recent Folders list.log
   {
   If A_LoopReadLine=
      break
   rf_folder%A_Index%=%A_LoopReadLine%
   }


;Get display names for those folder paths
Loop
   {
   If rf_folder%A_Index%=
      break
   StringSplit, temp_path_split, rf_folder%A_Index%,\,
   rf_display%A_Index%:=temp_path_split%temp_path_split0%
   }

;Launch initial menu items
Menu, Tray, NoStandard
;Menu, Tray, Icon, folders.ico ;add your own icon here, and de-comment this line.
Menu, Tray, Add, Exit Recent Folders, rf_close
menu, tray, Add ; separator
Menu, Tray, Default, Exit Recent Folders
Loop, %rf_foldernum%
   {
   temp_display:=rf_display%A_Index%
   If temp_display<>
      Menu, Tray, Add, %temp_display%, rf_launch
   }

;load filter list
Loop, Read, Recent Folders filter.log
   {
   rf_filter%A_Index% = %A_LoopReadLine%
   rf_filternum = %A_Index%
   }



SetTimer, rf_trackfolders, %rf_timer%

#LButton:: Menu, Tray, Show ;Shows the menu wherever the mouse is. Key can be changed to whatever you like.

rf_trackfolders:  ;monitors windows and updates the script with any folder windows.
WinGetActiveTitle, rf_current_win
WinGetClass, rf_class, %rf_current_win%
If rf_class = CabinetWClass
   {
   ;Acquires folder path from window
   SetTitleMatchMode, Slow
   WinGetText, rf_win_info, %rf_current_win%, %rf_current_win%,
   StringSplit, rf_new_folder, rf_win_info,`n
   rf_new_folder= %rf_new_folder1%
   StringTrimRight, rf_new_folder, rf_new_folder, 1
   if rf_new_folder = %rf_last_folder%  ;makes sure folder window has had focus for at least 1 complete cycle of timer
      {
      ;check folder against filter list.
      Loop, %rf_filternum%
        {
        temp_filter := rf_filter%A_Index%
      If rf_current_win = %temp_filter%
        {
        rf_skip=1
        break
        }
      }
      ;Begin re-sort menu - checks for a match to an existing item
      If rf_skip<>1
        {
      Loop
           {
           temp_hold := rf_folder%A_Index%
           If rf_new_folder = %temp_hold%
              {
              match=1
              If rf_display%A_Index%<>%rf_foldernum%
                {
                rf_slot_number=%A_Index%
                Gosub, rf_reshuffle_match
                break
                }
              }
           If rf_folder%A_Index%=
              {
              rf_first_empty=%A_Index%
              break
              }
           }
        If match<>1  ;adds new folder to empty slot
           {
           StringSplit, temp_path_split, rf_new_folder,\
           If rf_first_empty <= %rf_foldernum%
              {
              rf_folder%rf_first_empty% = %rf_new_folder%
              rf_display%rf_first_empty% :=temp_path_split%temp_path_split0%
              temp_display :=rf_display%rf_first_empty%
              Menu, Tray, Add, %temp_display%, rf_launch
              }
           else   ;what happens when all slots are full - shuffles them all down 1
              {
              Menu, Tray, Delete, %rf_display1%
              Loop
                 {
                 plus_count=%A_Index%
                 plus_count += 1
                 If A_Index > %rf_foldernum%
                    {
                    rf_folder%rf_foldernum% = %rf_new_folder%
                    rf_display%rf_foldernum% :=temp_path_split%temp_path_split0%
                    temp_display := rf_display%rf_foldernum%
                    Menu, Tray, Add, %temp_display%, rf_launch
                    break
                    }
                 rf_folder%A_Index% := rf_folder%plus_count%
                 rf_display%A_Index% := rf_display%plus_count%
                 }
              }
           match=
           }
        }
      rf_last_folder=
      }
   else
      rf_last_folder = %rf_new_folder%
   }
match=
rf_skip=
return


rf_launch:
Loop   ;checks which menu item folder to launch
   {
   If rf_display%A_Index% = %A_ThisMenuItem%
      {
      rf_open_folder := rf_folder%A_Index%
      If rf_open_folder=Desktop ;these exceptions take care of some of the special folders - more to do.
         {
         Run, %A_Desktop%
         break
         }
      If rf_open_folder=My Documents
         {
         Run, %A_MyDocuments%
         break
         }
      Run, %rf_open_folder%
      }
   If A_Index > %rf_foldernum%
      break
   }
return

rf_reshuffle_match:
temp_tray := rf_display%rf_slot_number%
Menu, Tray, Delete, %temp_tray%
StringSplit, temp_path_split, rf_new_folder,\
rf_count=%rf_slot_number%
Loop
   {
   plus_count=%rf_count%
   plus_count += 1
   If rf_count = %rf_foldernum%
      {
      rf_folder%rf_foldernum% = %rf_new_folder%
      rf_display%rf_foldernum% :=temp_path_split%temp_path_split0%
      temp_display := rf_display%rf_foldernum%
      Menu, Tray, Add, %temp_display%, rf_launch
      break
      }
   rf_folder%rf_count% := rf_folder%plus_count%
   rf_display%rf_count% := rf_display%plus_count%
   rf_count++
   }
return

rf_close:   ;writes current folder list to file on exit
FileDelete, Recent Folders list.log
Loop
   {
   If rf_display%A_Index% =
      break
   rf_write_string := rf_folder%A_Index%
   FileAppend, %rf_write_string%`n, Recent Folders list.log
   }
ExitApp


Cheers,

C

Edit: Updated script with the changes listed in subsequent posts.


Last edited by CarlosTheTackle on Mon Jan 24, 2005 11:23 am; edited 2 times in total
Back to top
View user's profile Send private message
Rajat



Joined: 28 Mar 2004
Posts: 1718

PostPosted: Sun Jan 23, 2005 4:53 pm    Post subject: Reply with quote

that's a nice script! Smile
_________________
Back to top
View user's profile Send private message
Rajat



Joined: 28 Mar 2004
Posts: 1718

PostPosted: Sun Jan 23, 2005 11:02 pm    Post subject: Reply with quote

i don't know how many ppl tried this script, but i'm adding it to my 24*7.
_________________
Back to top
View user's profile Send private message
corrupt



Joined: 29 Dec 2004
Posts: 2397

PostPosted: Sun Jan 23, 2005 11:16 pm    Post subject: Reply with quote

Very nice Smile. That's really handy. Thanks Smile.
Back to top
View user's profile Send private message Visit poster's website
CarlosTheTackle



Joined: 19 Oct 2004
Posts: 102

PostPosted: Mon Jan 24, 2005 12:18 am    Post subject: Reply with quote

Thanks for the comments guys.

Improvements I'm thinking of making:
1. Add a 'filter list' for folders that never get added to the log (for things you have easy access to anyway, like My Computer, or whatever)
2. Currently, folders move further down the list no matter how recently they've been used. I'd like to modify it so that when you go to a folder it autmatically moves its entry to the top slot, so that you never lose your most commonly accessed folders.

Any other suggestions welcome.

C.
Back to top
View user's profile Send private message
CarlosTheTackle



Joined: 19 Oct 2004
Posts: 102

PostPosted: Mon Jan 24, 2005 10:07 am    Post subject: Reply with quote

OK, I've made those two improvements above, and changed the script code in my original post to accomodate it. The filter list is simply a file called 'Recent Folders filter.log' where you can make a list of folders that you don't want captured by the script. eg.:
Quote:
My Computer
My Documents
Joe Blogg's Secret stuff


The folder list now also updates existing folders to the top of the list, so frequently visited places don't creep down the list and disappear.

And now one question/suggestion for Chris:
It is mildly annoying that when using the 'Menu, Tray, Show' command, the menu appears down from the current mouse position (as long as it's not too close to the bottom of the screen), whereas when accessed from the tray it appears up from the mouse position, so if I've designed it so the 'Exit' option is furtherest from the tray origin, it appears closest when shown with the 'Show' command.
It would be nice if either:
a) the menu order could be instructed to appear in reverse with something like 'Menu, Tray, Show, Reverse' or
b)the menu would appear upwards by default (except for when it is too close to the top of the screen).

Just a thought.

Cheers all,
C
Back to top
View user's profile Send private message
JSLover



Joined: 20 Dec 2004
Posts: 542
Location: LooseChange911.com... the WTC attacks were done by the US Gov't... the official story is a lie...

PostPosted: Mon Jan 24, 2005 11:19 am    Post subject: Reply with quote

Rajat wrote:
i don't know how many ppl tried this script, but i'm adding it to my 24*7.

...I tried it, it didn't work...I open my AutoHotkey dir (or any dir) & it adds a "Links" item to the list, I close the folder & click the menu item & get an error (from AHK, a bad error)...

Code:
Error: Failed attempt to launch program or document:
Action: <Links>
Params: <>

The current thread will exit.

Specifically: The system cannot find the file specified.


        Line#
        151: Break
        152: }
        153: if rf_open_folder = My Documents
        154: {
        155: Run,%A_MyDocuments%
        156: Break
        157: }
--->    158: Run,%rf_open_folder%
        159: }
        160: if A_Index > %rf_foldernum%
        161: Break
        162: }
        163: Return
        166: temp_tray := rf_display%rf_slot_number%
        167: Menu,Tray,Delete,%temp_tray%

...evidently my toolbars are different (than yours...they are default for my computer tho) & the search for the window text...

Code:
WinGetText, rf_win_info, %rf_current_win%, %rf_current_win%,

...don't find the right thing...Window Spy say's the control is Edit1, so instead of window text, you should try some type of ControlGet...or loop thru all window text looking for at least one : (colon) & one or more \ (backslashes) & any other path stuff to make sure you found a path. This was testing the 1st version, but it's still there in the revised version, also in the revised version I got...

Code:
Error: Icon could not be loaded.  The current thread will exit.

Specifically: folders.ico

        Line#
        022: {
        023: if rf_folder%A_Index% =
        024: Break
        025: StringSplit,temp_path_split,rf_folder%A_Index%,\
        026: rf_display%A_Index% := temp_path_split%temp_path_split0%
        027: }
        030: Menu,Tray,NoStandard
--->    031: Menu,Tray,Icon,folders.ico
        032: Menu,Tray,Add,Exit Recent Folders,rf_close
        033: Menu,tray,Add
        034: Menu,Tray,Default,Exit Recent Folders
        035: Loop,%rf_foldernum%
        036: {
        037: temp_display := rf_display%A_Index%
        038: if temp_display <>

...after that thread exited, it hadn't added the exit menu item & the double click code didn't work...so I couldn't exit. Chris, AHK needs a Ctrl+Shift+Right click tray option to get the standard items in an emergency like this, when it crashes & can't exit...or make it crash in a way that exits so it don't ever get stuck like that. You might wanna move NoStandard to the bottom of the menu commands so it only does that after everything else succeeds & also use IfExist on the tray icon & only add (the special icon) if found...you should also provide a place to download the icon if that's what we're supposed to use.
_________________

Home • Click image! • Blog
Back to top
View user's profile Send private message Visit poster's website
CarlosTheTackle



Joined: 19 Oct 2004
Posts: 102

PostPosted: Mon Jan 24, 2005 11:32 am    Post subject: Reply with quote

OK, sorry about the icon thing; have editied it to comment this line so it won't try and find an icon that isn't there!

As for the other issue - I guess the nature of the WinText for CabinetWClass windows on your system is different than mine. I thought it would be standard, but maybe not. What Windows are you on? Mine's XP, and it's working fine.

I guess I'll look into those other options to see how else I can pull the relevant folder info from the winow.

Incidentally, what entries are being added to the menu?

C
Back to top
View user's profile Send private message
JSLover



Joined: 20 Dec 2004
Posts: 542
Location: LooseChange911.com... the WTC attacks were done by the US Gov't... the official story is a lie...

PostPosted: Mon Jan 24, 2005 12:19 pm    Post subject: Reply with quote

CarlosTheTackle wrote:
OK, sorry about the icon thing; have editied it to comment this line so it won't try and find an icon that isn't there!

...don't exactly need to comment it out, I changed that part too...

Code:
IfExist, folders.ico
   Menu, Tray, Icon, folders.ico

...& it slides past it with no problems.

CarlosTheTackle wrote:
As for the other issue - I guess the nature of the WinText for CabinetWClass windows on your system is different than mine.

...some of what Window Spy say's about the CabinetWClass...

Code:
>>>>>>>>>>( Window Title & Class )<<<<<<<<<<<
AutoHotkey
ahk_class CabinetWClass

>>>>>>>>>>>( Visible Window Text )<<<<<<<<<<<
Links
FolderView

>>>>>>>>>>>( Hidden Window Text )<<<<<<<<<<<

>>>>( TitleMatchMode=slow Visible Text )<<<<
C:\Program Files\AutoHotkey
C:\Program Files\AutoHotkey

>>>>( TitleMatchMode=slow Hidden Text )<<<<

...the 1st text the script will find is "Links".

CarlosTheTackle wrote:
What Windows are you on? Mine's XP, and it's working fine.

...WinXP here too, but what toolbars are on your folder windows?

CarlosTheTackle wrote:
I guess I'll look into those other options to see how else I can pull the relevant folder info from the winow.

...my changes...

Code:
IfExist, folders.ico
   Menu, Tray, Icon, folders.ico
; ...skip...
; moved...
Menu, Tray, NoStandard
;...below the Loop which adds menu items.
; commented these out...
   ;WinGetText, rf_win_info, %rf_current_win%, %rf_current_win%,
   ;StringSplit, rf_new_folder, rf_win_info,`n
   ;rf_new_folder= %rf_new_folder1%
   ;StringTrimRight, rf_new_folder, rf_new_folder, 1
; added this...
   ControlGetText, rf_new_folder, Edit1, %rf_current_win%, %rf_current_win%,
; but I don't know why you need %rf_current_win% for both WinTitle & WinText params, should only be on WinTitle & the extra comma at the end is unnecessary.

CarlosTheTackle wrote:
Incidentally, what entries are being added to the menu?

JSLover wrote:
...& it adds a "Links" item to the list...

..."Links" is the only item it adds, for every window it sees "Links", knows that it saw it before & does nothing. With my edits it works (for me anyway...).

You need to add an OnExit command to make it run your exit sub no matter how the script exits, currently, running the script again & saying Yes to the #SingleInstance message, quit the previous copy in a way that don't save anything. Actually it don't always save even if I exit with the menu, but I haven't tried to find out why.
_________________

Home • Click image! • Blog
Back to top
View user's profile Send private message Visit poster's website
jonny



Joined: 13 Nov 2004
Posts: 3004
Location: Minnesota

PostPosted: Mon Jan 24, 2005 3:40 pm    Post subject: Reply with quote

Quote:
It would be nice if either:
a) the menu order could be instructed to appear in reverse with something like 'Menu, Tray, Show, Reverse' or
b)the menu would appear upwards by default (except for when it is too close to the top of the screen).


Hey Chris, a whole set of new Menu options would be nice. I have many uses for menus, and it would be nice to have more control over them. Some examples:

  • Positional control, like Carlos hinted toward.
  • More advanced sorting options than the order in which they were added.
  • Support for icons on the individual items.
  • Certain automatic menu-building functions, like making an entire folder a submenu (with, without, or only subfolders), making other system menus into submenus, etc.
  • Possibly (I know I'm stretching it here) "tear-offs" like some menu software has - that is, you can drag the menu someplace and it will become a window of it's own.
Back to top
View user's profile Send private message
Chris
Site Admin


Joined: 02 Mar 2004
Posts: 10467

PostPosted: Mon Jan 24, 2005 4:04 pm    Post subject: Reply with quote

CarlosTheTackle wrote:
It would be nice if either:
a) the menu order could be instructed to appear in reverse with something like 'Menu, Tray, Show, Reverse' or
b)the menu would appear upwards by default (except for when it is too close to the top of the screen).
That sounds good. I will add it to the to-do list, probably taking the former approach to avoid changing the behavior of existing scripts.

JSLover wrote:
AHK needs a Ctrl+Shift+Right click tray option to get the standard items in an emergency like this, when it crashes & can't exit...or make it crash in a way that exits so it don't ever get stuck like that.
I've considered things of that nature but decided against them to reduce code complexity, which keeps the size of compiled scripts lower. Although you do get "trapped" in rare cases, you can "end task" a script, or have another script close that script via DetectHiddenWindows and WinClose. I know it's not pretty.

jonny wrote:
a whole set of new Menu options would be nice. I have many uses for menus, and it would be nice to have more control over them.
Thanks for that great list of suggestions. I'm adding them to the to-do list next to the other menu enhancements that are planned.
Back to top
View user's profile Send private message Send e-mail
Rajat



Joined: 28 Mar 2004
Posts: 1718

PostPosted: Tue Jan 25, 2005 11:42 pm    Post subject: Reply with quote

if ppl are having issues regarding window class of explorers then the mod i use of this script in my 24*7 might be of some help:

Code:

WinGetActiveTitle, CurrWTitle
FileGetAttrib, PathAtr, %CurrWTitle%
IfInString, PathAtr, D
{
....
}


this might even work for other file explorers.
_________________
Back to top
View user's profile Send private message
CarlosTheTackle



Joined: 19 Oct 2004
Posts: 102

PostPosted: Sun Feb 13, 2005 12:18 am    Post subject: Reply with quote

OK, this might work better if you change (from my original post):
Code:
  ;Acquires folder path from window
   SetTitleMatchMode, Slow
   WinGetText, rf_win_info, %rf_current_win%, %rf_current_win%,
   StringSplit, rf_new_folder, rf_win_info,`n
   rf_new_folder= %rf_new_folder1%
   StringTrimRight, rf_new_folder, rf_new_folder, 1

to:
Code:
   ;Acquires folder path from window
   ControlGet, rf_new_folder, Line, 1, Edit1, %rf_current_win%


Please note, though, that this requires the Address bar to be visible in your explorer windows, or else you will need to use the original way to detect the folder path from the window. (If anyone has a sure-fire way to get the folder path from an explorer window that will work for EVERY system, be sure to let us know)
Back to top
View user's profile Send private message
sebastian
Guest





PostPosted: Tue Oct 16, 2007 11:17 pm    Post subject: Reply with quote

guys this script is awesome!

I have some questions though...

Is it possible to display the whole path or at least more than the folder name in the menu Question
I have similar folder structures with same names for different projects and when I open say folder "design" all design folders in my list open up. Surprised

what is the timer setting you use? 2000? I ended up with 500 otherwise nothing would come up in my folder list. Maybe I navigate to quick Cool

Is it possible to open the folder window with the folder tree (explorer bar: folders) ON Question maybe by adding a some "explorer bar folder on" command to the call... *duckandrun*

anyway this script is great and I am glad I found it!
Back to top
sebastian
Guest





PostPosted: Tue Oct 16, 2007 11:42 pm    Post subject: Reply with quote

error/bug Question

has anyone any ideas about the error message I get quite often



I can't figure out when it happens but sometimes it is only once, then again it won't go away!
Back to top
Display posts from previous:   
Post new topic   Reply to topic    AutoHotkey Community Forum Index -> Scripts & Functions All times are GMT
Goto page 1, 2, 3  Next
Page 1 of 3

 
Jump to:  
You can post new topics in this forum
You can reply to topics in this forum


Powered by phpBB © 2001, 2005 phpBB Group