/* * Copyright (C) 2020 Linux Studio Plugins Project * (C) 2020 Vladimir Sadovnikov * * This file is part of lsp-plugins * Created on: 18 сент. 2017 г. * * lsp-plugins is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * any later version. * * lsp-plugins is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with lsp-plugins. If not, see . */ #ifndef UI_TK_WIDGETS_LSPMENU_H_ #define UI_TK_WIDGETS_LSPMENU_H_ namespace lsp { namespace tk { class LSPMenuItem; class LSPMenu: public LSPWidgetContainer { public: static const w_class_t metadata; protected: class MenuWindow: public LSPWindow { protected: LSPMenu *pMenu; protected: virtual LSPWidget *find_widget(ssize_t x, ssize_t y); LSPMenu *get_handler(ws_event_t *e); public: MenuWindow(LSPDisplay *dpy, LSPMenu *menu, size_t screen); virtual ~MenuWindow(); public: virtual void render(ISurface *s, bool force); virtual void size_request(size_request_t *r); virtual status_t on_mouse_down(const ws_event_t *e); virtual status_t on_mouse_up(const ws_event_t *e); virtual status_t on_mouse_scroll(const ws_event_t *e); virtual status_t on_mouse_move(const ws_event_t *e); }; enum selection_t { SEL_NONE = -3, SEL_TOP_SCROLL = -2, SEL_BOTTOM_SCROLL = -1 }; protected: cvector vItems; LSPFont sFont; MenuWindow *pWindow; LSPMenu *pParentMenu; LSPMenu *pActiveMenu; LSPTimer sScroll; ssize_t nPopupLeft; ssize_t nPopupTop; ssize_t nSelected; ssize_t nScroll; ssize_t nScrollMax; size_t nMBState; LSPColor sSelColor; LSPColor sBorderColor; size_t nBorder; size_t nSpacing; protected: ssize_t find_item(ssize_t x, ssize_t y, ssize_t *ry); static status_t timer_handler(timestamp_t time, void *arg); void update_scroll(); void selection_changed(ssize_t sel, ssize_t ry); LSPMenu *check_inside_submenu(ws_event_t *e); void do_destroy(); public: explicit LSPMenu(LSPDisplay *dpy); virtual ~LSPMenu(); virtual status_t init(); virtual void destroy(); public: inline ssize_t popup_left() const { return nPopupLeft; } inline ssize_t popup_top() const { return nPopupTop; } inline size_t border() const { return nBorder; }; inline size_t spacing() const { return nSpacing; }; inline ssize_t scroll() const { return nScroll; }; LSPColor *sel_color() { return &sSelColor; } LSPColor *border_color() { return &sBorderColor; } public: inline void set_popup_left(ssize_t value) { nPopupLeft = value; } inline void set_popup_top(ssize_t value) { nPopupTop = value; } void set_border(size_t value); void set_spacing(size_t value); void set_scroll(ssize_t scroll); virtual status_t add(LSPWidget *child); virtual status_t remove(LSPWidget *child); virtual void draw(ISurface *s); virtual void query_resize(); virtual void size_request(size_request_t *r); virtual void realize(const realize_t *r); virtual bool hide(); virtual bool show(); virtual bool show(size_t screen); virtual bool show(size_t screen, ssize_t left, ssize_t top); virtual bool show(LSPWidget *w, size_t screen, ssize_t left, ssize_t top); virtual bool show(LSPWidget *w); virtual bool show(LSPWidget *w, ssize_t left, ssize_t top); virtual bool show(LSPWidget *w, const ws_event_t *ev); virtual status_t on_mouse_down(const ws_event_t *e); virtual status_t on_mouse_up(const ws_event_t *e); virtual status_t on_mouse_move(const ws_event_t *e); virtual status_t on_mouse_scroll(const ws_event_t *e); }; } /* namespace tk */ } /* namespace lsp */ #endif /* UI_TK_WIDGETS_LSPMENU_H_ */