#ifndef ENV_SHELL_H #define ENV_SHELL_H #include "env.h" #include #include namespace env { class ShellMenu { public: ShellMenu(QMainWindow* mw); // noncopyable ShellMenu(const ShellMenu&) = delete; ShellMenu& operator=(const ShellMenu&) = delete; ShellMenu(ShellMenu&&) = default; ShellMenu& operator=(ShellMenu&&) = default; void addFile(QFileInfo fi); int fileCount() const; void exec(const QPoint& pos); HMENU getMenu(); bool wndProc(HWND hwnd, UINT m, WPARAM wp, LPARAM lp, LRESULT* out); void invoke(const QPoint& p, int cmd); private: QMainWindow* m_mw; std::vector m_files; COMPtr m_cm; COMPtr m_cm2; COMPtr m_cm3; HMenuPtr m_menu; void create(); std::vector createIdls(const std::vector& files); COMPtr createItemArray(std::vector& idls); void createContextMenu(IShellItemArray* array); void createPopupMenu(IContextMenu* cm); COMPtr createShellItem(const std::wstring& path); COMPtr getPersistIDList(IShellItem* item); CoTaskMemPtr getIDList(IPersistIDList* pidlist); HMenuPtr createDummyMenu(const QString& what); void onMenuSelect(HWND hwnd, HMENU hmenu, int item, HMENU hmenuPopup, UINT flags); }; class ShellMenuCollection { public: ShellMenuCollection(QMainWindow* mw); void addDetails(QString s); void add(QString name, ShellMenu m); void exec(const QPoint& pos); private: struct MenuInfo { QString name; ShellMenu menu; }; QMainWindow* m_mw; std::vector m_details; std::vector m_menus; MenuInfo* m_active; bool wndProc(HWND hwnd, UINT m, WPARAM wp, LPARAM lp, LRESULT* out); void onMenuSelect(HWND hwnd, HMENU hmenu, int item, HMENU hmenuPopup, UINT flags); }; } // namespace env #endif // ENV_SHELL_H