ポップアップメニューを利用したスクリプトを作ってみました

2019-01-28

選択したファイルを別のフォルダにコピーするスクリプト。

  • コピー先はタブで開いているフォルダのいずれか
  • ポップアップメニューでコピー先を選択

動作の様子

タブで開いている C:\ C:\Apps D:\ D:\Games が、コピー先の選択肢としてポップアップしています。

Tablacus Explorer

スクリプト

// 選択したファイルをタブで開いているフォルダにコピーするスクリプト
//
// Mode
//  0:Copy
//  1:Move (Copy+Delete)
//
// PopupPos
//  0:Item
//  1:Mouse Cursor

exec = function(Mode, PopupPos) {
    const FV = GetFolderView(Ctrl, pt);
    if (FV) {
        const Selected = FV.SelectedItems();
        if (Selected) {
            const distPath = OpenedTabsMenu(FV, PopupPos);
            if (distPath) {
                for (let i = 0; i < Selected.Count; i++) {
                    const path = fso.BuildPath(distPath, fso.GetFilename(Selected.Item(i).Path));
                    if (fso.FolderExists(Selected.Item(i).Path)) {
                        if (fso.FolderExists(path)) {
                            if (!confirmOk(path, "Overwrite?")) continue;
                        }
                        fso.CopyFolder(Selected.Item(i).Path, distPath + '\\');
                        if (Mode == 1) {
                            fso.DeleteFolder(Selected.Item(i).Path);
                        }
                    } else {
                        if (fso.FileExists(path)) {
                            if (!confirmOk(path, "Overwrite?")) continue;
                        }
                        fso.CopyFile(Selected.Item(i).Path, distPath + '\\');
                        if (Mode == 1) {
                            fso.DeleteFile(Selected.Item(i).Path);
                        }
                    }
                }
                FV.Refresh();
            }
        }
    }
}

function OpenedTabsMenu(Ctrl, PopupPos) {
    let items = [];
    let items_ct = 0;

    // Item
    const TC = Ctrl.Parent;
    for (let i = 0; i < TC.length; i++) {
        if (fso.FolderExists(TC[i].FolderItem.Path) && TC[i].FolderItem.Path != Ctrl.FolderItem.Path) {
            items[items_ct++] = TC[i].FolderItem.Path;
        }
    }

    // Popup
    const nVerb = PopupMenu(items, Ctrl, PopupPos);
    if (nVerb == 0) {
        return false;
    }

    return items[nVerb - 1];
}

function PopupMenu(Items, Ctrl, PopupPos) {
    const hMenu = api.CreatePopupMenu();
    for (let i = 0; i < Items.length; i++) {
        const mii = api.Memory("MENUITEMINFO");
        mii.cbSize = mii.Size;
        mii.fMask = MIIM_ID | MIIM_STRING | MIIM_BITMAP;
        mii.wId = i + 1;
        mii.dwTypeData = String(Items[i]);
        api.InsertMenuItem(hMenu, 0, false, mii);
    }

    const pt = api.Memory("POINT");
    if (PopupPos == 1) {
        api.GetCursorPos(pt);
    } else {
        const rc = api.Memory("RECT");
        Ctrl.GetItemRect(Ctrl.FocusedItem || Ctrl.SelectedItem, rc);
        pt.x = rc.left;
        pt.y = rc.top;
        api.ClientToScreen(Ctrl.hwnd, pt);
    }

    const nVerb = api.TrackPopupMenuEx(hMenu, TPM_RETURNCMD, pt.x, pt.y, te.hwnd, null);
    api.DestroyMenu(hMenu);

    return nVerb;
}

登録

スクリプト名を Copy2OpenedTabs.js とした場合の登録例。

Tablacus Explorer

exec(動作モード, ポップアップ表示位置)

動作モード
0:コピー
1:移動
ポップアップ表示位置
0:選択アイテム位置にポップアップ(キーアドオンに登録して使用する場合など)
1:マウスカーソル位置にポップアップ(コンテキストに登録して使用する場合など)

関連記事

    APPs
    APPs
    Game
    Qonoha
    Sublime Text
    Tablacus Explorer
    OBLIVION
    Oblivion
    Alchemy and Crafting
    Body, Head and Hair
    Combat
    Console
    Construction Set
    Equipment
    Immersion and Realism
    Locations and Player Homes
    Magic and Enchantments
    Mercantiles
    MODs List
    NPC
    Overhauls
    Photo
    Pose and Animation
    Quests
    Recommended
    Skills and Leveling
    TES4Edit
    Troubles
    User Interfaces
    Wrye Bash
    CODING
    Coding
    JavaScript