Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/slic3r/GUI/GLToolbar.hpp')
-rw-r--r--src/slic3r/GUI/GLToolbar.hpp175
1 files changed, 175 insertions, 0 deletions
diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp
new file mode 100644
index 000000000..65d6748ff
--- /dev/null
+++ b/src/slic3r/GUI/GLToolbar.hpp
@@ -0,0 +1,175 @@
+#ifndef slic3r_GLToolbar_hpp_
+#define slic3r_GLToolbar_hpp_
+
+#include "../../slic3r/GUI/GLTexture.hpp"
+#include "../../callback.hpp"
+
+#include <string>
+#include <vector>
+
+namespace Slic3r {
+namespace GUI {
+
+class GLCanvas3D;
+
+class GLToolbarItem
+{
+public:
+ enum EType : unsigned char
+ {
+ Action,
+ Separator,
+ Num_Types
+ };
+
+ enum EState : unsigned char
+ {
+ Normal,
+ Pressed,
+ Disabled,
+ Hover,
+ HoverPressed,
+ Num_States
+ };
+
+ struct Data
+ {
+ std::string name;
+ std::string tooltip;
+ unsigned int sprite_id;
+ bool is_toggable;
+ PerlCallback* action_callback;
+
+ Data();
+ };
+
+private:
+ EType m_type;
+ EState m_state;
+ Data m_data;
+
+public:
+ GLToolbarItem(EType type, const Data& data);
+
+ EState get_state() const;
+ void set_state(EState state);
+
+ const std::string& get_name() const;
+ const std::string& get_tooltip() const;
+
+ void do_action();
+
+ bool is_enabled() const;
+ bool is_hovered() const;
+ bool is_pressed() const;
+
+ bool is_toggable() const;
+ bool is_separator() const;
+
+ void render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int texture_size, unsigned int border_size, unsigned int icon_size, unsigned int gap_size) const;
+
+private:
+ GLTexture::Quad_UVs get_uvs(unsigned int texture_size, unsigned int border_size, unsigned int icon_size, unsigned int gap_size) const;
+};
+
+class GLToolbar
+{
+public:
+ // items icon textures are assumed to be square and all with the same size in pixels, no internal check is done
+ // icons are layed-out into the texture starting from the top-left corner in the same order as enum GLToolbarItem::EState
+ // from left to right
+ struct ItemsIconsTexture
+ {
+ GLTexture texture;
+ // size of the square icons, in pixels
+ unsigned int items_icon_size;
+ // distance from the border, in pixels
+ unsigned int items_icon_border_size;
+ // distance between two adjacent icons (to avoid filtering artifacts), in pixels
+ unsigned int items_icon_gap_size;
+
+ ItemsIconsTexture();
+ };
+
+ struct Layout
+ {
+ enum Type : unsigned char
+ {
+ Horizontal,
+ Vertical,
+ Num_Types
+ };
+
+ Type type;
+ float top;
+ float left;
+ float separator_size;
+ float gap_size;
+
+ Layout();
+ };
+
+private:
+ typedef std::vector<GLToolbarItem*> ItemsList;
+
+ GLCanvas3D& m_parent;
+ bool m_enabled;
+ ItemsIconsTexture m_icons_texture;
+ Layout m_layout;
+
+ ItemsList m_items;
+
+public:
+ explicit GLToolbar(GLCanvas3D& parent);
+
+ bool init(const std::string& icons_texture_filename, unsigned int items_icon_size, unsigned int items_icon_border_size, unsigned int items_icon_gap_size);
+
+ Layout::Type get_layout_type() const;
+ void set_layout_type(Layout::Type type);
+
+ void set_position(float top, float left);
+ void set_separator_size(float size);
+ void set_gap_size(float size);
+
+ bool is_enabled() const;
+ void set_enabled(bool enable);
+
+ bool add_item(const GLToolbarItem::Data& data);
+ bool add_separator();
+
+ float get_width() const;
+ float get_height() const;
+
+ void enable_item(const std::string& name);
+ void disable_item(const std::string& name);
+
+ bool is_item_pressed(const std::string& name) const;
+
+ void update_hover_state(const Vec2d& mouse_pos);
+
+ // returns the id of the item under the given mouse position or -1 if none
+ int contains_mouse(const Vec2d& mouse_pos) const;
+
+ void do_action(unsigned int item_id);
+
+ void render() const;
+
+private:
+ float get_width_horizontal() const;
+ float get_width_vertical() const;
+ float get_height_horizontal() const;
+ float get_height_vertical() const;
+ float get_main_size() const;
+ void update_hover_state_horizontal(const Vec2d& mouse_pos);
+ void update_hover_state_vertical(const Vec2d& mouse_pos);
+ int contains_mouse_horizontal(const Vec2d& mouse_pos) const;
+ int contains_mouse_vertical(const Vec2d& mouse_pos) const;
+
+ void render_horizontal() const;
+ void render_vertical() const;
+};
+
+} // namespace GUI
+} // namespace Slic3r
+
+#endif // slic3r_GLToolbar_hpp_