mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 13:02:45 +00:00 
			
		
		
		
	 0dc9af5f7e
			
		
	
	
		0dc9af5f7e
		
	
	
	
	
		
			
			Also run it across the whole tree to get everything using the One True Style. We don't yet run this in an automated fashion as it's a little slow, but there is a snippet to do so in makeall.sh.
		
			
				
	
	
		
			93 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
	
		
			2.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #pragma once
 | |
| 
 | |
| #include <AK/AKString.h>
 | |
| #include <AK/Vector.h>
 | |
| #include <AK/WeakPtr.h>
 | |
| #include <LibCore/CObject.h>
 | |
| #include <SharedGraphics/Rect.h>
 | |
| #include <WindowServer/WSMenuItem.h>
 | |
| 
 | |
| class WSClientConnection;
 | |
| class WSMenuBar;
 | |
| class WSEvent;
 | |
| class WSWindow;
 | |
| class Font;
 | |
| 
 | |
| class WSMenu final : public CObject {
 | |
| public:
 | |
|     WSMenu(WSClientConnection*, int menu_id, const String& name);
 | |
|     virtual ~WSMenu() override;
 | |
| 
 | |
|     WSClientConnection* client() { return m_client; }
 | |
|     const WSClientConnection* client() const { return m_client; }
 | |
|     int menu_id() const { return m_menu_id; }
 | |
| 
 | |
|     WSMenuBar* menubar() { return m_menubar; }
 | |
|     const WSMenuBar* menubar() const { return m_menubar; }
 | |
|     void set_menubar(WSMenuBar* menubar) { m_menubar = menubar; }
 | |
| 
 | |
|     bool is_empty() const { return m_items.is_empty(); }
 | |
|     int item_count() const { return m_items.size(); }
 | |
|     WSMenuItem* item(int i) { return m_items[i].ptr(); }
 | |
|     const WSMenuItem* item(int i) const { return m_items[i].ptr(); }
 | |
| 
 | |
|     void add_item(OwnPtr<WSMenuItem>&& item) { m_items.append(move(item)); }
 | |
| 
 | |
|     String name() const { return m_name; }
 | |
| 
 | |
|     template<typename Callback>
 | |
|     void for_each_item(Callback callback) const
 | |
|     {
 | |
|         for (auto& item : m_items)
 | |
|             callback(*item);
 | |
|     }
 | |
| 
 | |
|     Rect text_rect_in_menubar() const { return m_text_rect_in_menubar; }
 | |
|     void set_text_rect_in_menubar(const Rect& rect) { m_text_rect_in_menubar = rect; }
 | |
| 
 | |
|     Rect rect_in_menubar() const { return m_rect_in_menubar; }
 | |
|     void set_rect_in_menubar(const Rect& rect) { m_rect_in_menubar = rect; }
 | |
| 
 | |
|     WSWindow* menu_window() { return m_menu_window.ptr(); }
 | |
|     WSWindow& ensure_menu_window();
 | |
| 
 | |
|     int width() const;
 | |
|     int height() const;
 | |
| 
 | |
|     int item_height() const { return 16; }
 | |
|     int frame_thickness() const { return 3; }
 | |
|     int horizontal_padding() const { return left_padding() + right_padding(); }
 | |
|     int left_padding() const { return 14; }
 | |
|     int right_padding() const { return 14; }
 | |
| 
 | |
|     void draw();
 | |
|     const Font& font() const;
 | |
| 
 | |
|     WSMenuItem* item_with_identifier(unsigned);
 | |
|     WSMenuItem* item_at(const Point&);
 | |
|     void redraw();
 | |
| 
 | |
|     const WSMenuItem* hovered_item() const { return m_hovered_item; }
 | |
|     void clear_hovered_item();
 | |
| 
 | |
|     Function<void(WSMenuItem&)> on_item_activation;
 | |
| 
 | |
|     void close();
 | |
| 
 | |
|     void popup(const Point&);
 | |
| 
 | |
| private:
 | |
|     virtual void event(CEvent&) override;
 | |
| 
 | |
|     int padding_between_text_and_shortcut() const { return 50; }
 | |
|     void did_activate(WSMenuItem&);
 | |
|     WSClientConnection* m_client { nullptr };
 | |
|     int m_menu_id { 0 };
 | |
|     String m_name;
 | |
|     Rect m_rect_in_menubar;
 | |
|     Rect m_text_rect_in_menubar;
 | |
|     WSMenuBar* m_menubar { nullptr };
 | |
|     WSMenuItem* m_hovered_item { nullptr };
 | |
|     Vector<OwnPtr<WSMenuItem>> m_items;
 | |
|     OwnPtr<WSWindow> m_menu_window;
 | |
| };
 |