Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate

PopFav -- simple popup menu launcher inspired by PopSel


  • Please log in to reply
2 replies to this topic
boor
  • Guests
  • Last active:
  • Joined: --
PopSel is wonderful utility by Horst Schaeffer:
http://home.mnet-onl...st.muc/wpop.htm
It makes it easy to create pop-up menus to launch programs, documents, etc. It is tiny, self-contained, and is perfectly compatible with AutoHotkey. However, since I recently started using AutoHotkey, I decided to try and implement the gist of PopSel with an .ahk script.

The beauty of PopSel is that it keeps menu definitions in plain text files with a very simple structure. They are simpler than standard .ini files and are very easy to create and maintain. This is much more efficient than dealing with shortcuts (e.g., Favorites or Start Menu) or a fancy GUI configurator. (PopSel also provides a GUI manager.)

The limitation is that only one level submenus are possible.

As a prototype, I used the code of Favorite Folders by Savage:
http://www.autohotke... ... olders.htm
Thus the name PopFav. The idea is similar to Favorite Folders. The improvements are:
- Each menu can contain any number of level one sumbenus.
- Menu creation is wrapped into a function to simplify creation of several menus.

Below is the code with two sample menus defined in it. Menus are launched with Ctr-1 and Ctrl-2. Hope this will be useful.

; PopFav -- simple popup menu launcher inspired by PopSel

; Sample menus are given in the special commented section below between /* */.
; Two menus are created. Use hotkeys Ctrl-1 and Ctrl-2 to launch them.
; If you want to read menus from another file, change POPFAV_MENU_FILE below.
;
; First line of a menu definition contains a unique Menu Name which identifies
; the menu.  It must be the first instance of this Name in the file.
; Next line with Menu Name ends Menu definition.  Menu Names must conform to
; the rules of AHK variable naming: letters, numbers, and _ only, no spaces.
;
; Within each menu, one line corresponds to one menu item.
; Specify the name of the menu item first, followed by the == string, followed
; by the Target parameter for the Run command.
; See http://www.autohotkey.com/docs/commands/Run.htm for details.
; It's not possible to specify Run parameters other than Target.
;
; To create separator line, omit text after the == string.
; Lines without == are ignored, e.g., blank lines, comments.
;
; Use >> string to create submenu. Only one level sumbenus are possible, that
; is only the first >> string is treated as sumbenu separator.
;
; Once a menu name is defined, use it to create popup menu:
; 1. Call function
;   POPFAV_Create_Menu("MenuName", POPFAV_MENU_FILE)
; 2. Create hotkey
;   {Hotkey}::Menu, MenuName, Show
; See below for examples.

/*
=========== MENU DEFINITIONS =================================================

___________ POPFAV_DEMO_MENU1 ________________________________________________
/Documents and Settings    == C:\Documents and Settings
        folders can open faster if file manager is specified
/Program Files             == explorer.exe %ProgramFiles%
        create separator in main menu
--------==
/%A_Temp%                  == explorer.exe %A_Temp%

        create sumbenu Applications
Applications >> !Notepad.exe  == notepad.exe
Applications >> edit this script in notepad   == notepad.exe %A_ScriptFullPath%
Applications >> !Calc.exe     == Calc.exe
Applications >> !cmd.exe      ==  %comspec% /k cd %A_ScripDir%

        these are examples from AHK help for Run command
AHK help examples >> My Computer        == ::{20d04fe0-3aea-1069-a2d8-08002b30309d}
AHK help examples >> Recycle Bin        == ::{645ff040-5081-101b-9f08-00aa002f954e}
AHK help examples >> ------------------ ==
        Do not escape , in Target string.
AHK help examples >> Display Properties->Settings == rundll32.exe shell32.dll,Control_RunDLL desk.cpl,, 3

        create separator in main menu, this ends previous sumbenu
--------==

        Potential gotchas with deref. Don't use %% unless you have to.
Gotchas >> this menu name: %MenuName%        == %A_Space%
Gotchas >> edit menu definition file in notepad   == notepad.exe %MenuFile%
___________ POPFAV_DEMO_MENU1 ________________________________________________


___________ POPFAV_DEMO_MENU2 ________________________________________________
        links
autohotkey.com          == http://www.autohotkey.com
autohotkey.com/docs     == http://www.autohotkey.com/docs/
google                      == http://www.google.com/webhp?num=100
___________ POPFAV_DEMO_MENU2 ________________________________________________

========= END OF MENU DEFINITIONS ============================================
*/

;;;;; Specify file which contains PopFav menu definitions.
; Menus are defined at the start of this script file between /* */.
POPFAV_MENU_FILE = %A_ScriptFullPath%
; Menus are defined in external file in this script's dir.
; POPFAV_MENU_FILE = %A_ScriptDir%\PopFav.menus

;;;;; Create PopFav menus.  Use menu names defined in menu file.
POPFAV_Create_Menu("POPFAV_DEMO_MENU1", POPFAV_MENU_FILE)
POPFAV_Create_Menu("POPFAV_DEMO_MENU2", POPFAV_MENU_FILE)

;;;;; Create hotkeys which show PopFav menus.
^1::Menu, POPFAV_DEMO_MENU1, Show
^2::Menu, POPFAV_DEMO_MENU2, Show

;;;;; End of PopFav configuration. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
return
;====================== end of auto-execute section ==========================
;=============================================================================


POPFAV_Create_Menu(MenuName, MenuFile) {
; Parse menu definition MenuName from file MenuFile.
; Create menu MenuName and its submenus.
    global
    local pos
    local _left, _right ; parts before and after == separator
    local _left1, _left2 ; parts before and after >> separator
    local OutsideOfMenu = 1
    local SubLev = 0 ; 0 if in main menu, 1 if in submenu
    local SubName ; current submenu item; part before >> with whitespace stripped
    local MenuIdx = 1 ; main menu item index, also a submenu id: %MenuName%%MenuIdx%
    local SubIdx = 1 ; current sumbenu item index, increment after adding to sumbenu

    Loop, Read, %MenuFile%
    {
        ; Skip lines until the first line with MenuName.
        if OutsideOfMenu
        {
            IfInString, A_LoopReadLine, %MenuName%
                OutsideOfMenu = 0
            continue
        }
        ; Second line with MenuName marks the end of menu definition.
        ; Add last submenu, if any, and exit loop.
        IfInString, A_LoopReadLine, %MenuName%
        {
            if SubLev = 1
                Menu, %MenuName%, Add, %SubName%, :%MenuName%%MenuIdx%
            break
        }
        ; We are inside menu definition.
        ; Add menu item to (sub)menu and create global variable containing the
        ; command of this (sub)menu item. Variables are named:
        ;      %MenuName%_cmd%MenuIdx%           --main menu
        ;      %MenuName%%MenuIdx%_cmd%SubIdx%   --submenu
        ; Add menu separator if there is nothing after the first == string.
        ; NOTE: increment (sub)menu item index after adding any item, including
        ; separator or submenu.
        ;
        ; get location of ==
        StringGetPos, pos, A_LoopReadLine, ==
        if pos < 0; ignore line without ==
            continue
        ; get part after ==
        StringTrimLeft, _right, A_LoopReadLine, pos+2
        _right = %_right%  ; strip whitespace
        ; get part before ==
        StringLeft, _left, A_LoopReadLine, pos
        ; resolve any references to variables (assumes that submenu separator cannot be created)
        Transform, _left, deref, %_left%
        _left = %_left%  ; strip whitespace
        ; check for submenu separator
        StringGetPos, pos, _left, >>
        ;;;;;;;;;; there is no submenu, add item to main menu
        if pos < 0
        {
            if SubLev = 1 ; previous submenu ended, add it
            {
                SubLev = 0
                Menu, %MenuName%, Add, %SubName%, :%MenuName%%MenuIdx%
                MenuIdx++
                SubIdx = 1
            }
            if _right =
            {
                Menu, %MenuName%, Add
                MenuIdx++
            }
            else
            {
                Transform, %MenuName%_cmd%MenuIdx%, deref, %_right%
                Menu, %MenuName%, Add, %_left%, POPFAV_MENU_HANDLER
                MenuIdx++
            }
        }
        ;;;;;;;;;; there is a submenu; add item to it
        else
        {
            StringLeft, _left1, _left, pos ; sumbenu name
            _left1 = %_left1%
            StringTrimLeft, _left2, _left, pos+2 ; sumbenu item name
            _left2 = %_left2%
            ;;;;; new submenu after main menu
            if SubLev = 0
            {
                SubLev = 1
                SubName = %_left1%
            }
            ;;;;; another item of previous submenu, nothing changed
            else if _left1 = %SubName%
            {
            }
            ;;;;; new submenu after previous submenu
            else
            {
                ; add previous submenu
                Menu, %MenuName%, Add, %SubName%, :%MenuName%%MenuIdx%
                MenuIdx++
                SubIdx = 1
                ; start building new submenu
                SubName = %_left1%
            }
            ;;;;; add item to sumbenu, add separator if there is nothing after ==
            if _right =
            {
                Menu, %MenuName%%MenuIdx%, Add
                SubIdx++
            }
            else
            {
                Transform, %MenuName%%MenuIdx%_cmd%SubIdx%, deref, %_right%
                Menu, %MenuName%%MenuIdx%, Add, %_left2%, POPFAV_MENU_HANDLER
                SubIdx++
            }
        }
    }
}


POPFAV_MENU_HANDLER:
; Handler for all PopFav menu items.
    ; Fetch variable containing action for selected menu item.
    ; _popfav_cmd contains last menu action: handy for debugging
    _popfav_cmd := %A_ThisMenu%_cmd%A_ThisMenuItemPos%
    Run, %_popfav_cmd%
return


  • Guests
  • Last active:
  • Joined: --
nice script. i like it alot

cheers
/michael

Binocular222
  • Members
  • 99 posts
  • Last active: Jul 25 2014 04:28 AM
  • Joined: 26 Feb 2012
I made a much better version here:
http://www.autohotke...=572704#p572704