1 /*
2 * mouse_slider.h
3 * DIN Is Noise is copyright (c) 2006-2021 Jagannathan Sampath
4 * DIN Is Noise is released under GNU Public License 2.0
5 * For more information, please visit https://dinisnoise.org/
6 */
7 
8 #ifndef __mouse_slider
9 #define __mouse_slider
10 
11 #include "widget.h"
12 #include "arrow_button.h"
13 
14 #include <list>
15 
16 struct mouse_slider_listener {
17 
18 	std::string name;
19 	enum {X, Y, NONE};
20 	int orient;
21   double delta0, delta;
22   mouse_slider_listener ();
23 	virtual void moused (int dir, double scl = 1.0) {}
after_slidemouse_slider_listener24 	virtual void after_slide () {}
25 };
26 
27 struct mouse_slider : widget {
28 
29 	int sz, sz_2, szn, szn_1;
30 	arrow_button axl, axr;
31 	arrow_button ayb, ayt;
32 	void update_x_arrows ();
33 	void update_y_arrows ();
34 
35 	static const int margin = 10;
36 	int lowx, highx, midx;
37 	int lowy, highy, midy;
38 	int prevx, prevy;
39 	int initx, inity, inityy;
40 
41 	std::list<mouse_slider_listener*> mslx, msly;
42 	int nmslx, nmsly;
43   void print (std::list<mouse_slider_listener*>&, std::list<mouse_slider_listener*>&);
44   void print (std::list<mouse_slider_listener*>&);
45 
46 	int dx, dy;
47 
48 	int justx ();
49 	int justy ();
50 
51 	int active;
52 
53   int warp;
54 
55 	int lmb_clicked;
56 
57 	mouse_slider ();
58 	~mouse_slider ();
59 	int handle_input ();
60 
61 	int pts [8];
62 	void draw ();
63 
64   //void printdx ();
65   //void printdy ();
66 
67 	void add (mouse_slider_listener* sl);
68 	void remove (mouse_slider_listener* sl);
69 
70   double base;
71   int shift;
72   struct scalet {
73     enum {FIXED, CHANGING};
74     int style;
75     double value;
76     void operator*= (const double& v) { value *= v; }
77     void operator/= (const double& v) { value /= v; }
78     void calcvalue (double& b, int s);
79   } scale;
80 
81 	int activate (int shft = 0, int scalestyle = scalet::CHANGING);
82 	int deactivate ();
83 
84 };
85 
86 void cant_mouse_slide ();
87 void activate_mouse_slider (int shift = 0, int scalestyle = mouse_slider::scalet::CHANGING);
88 
89 extern mouse_slider mouse_slider0;
90 
91 #define MAKE_MOUSE_SLIDER_LISTENER(name,var) struct name : mouse_slider_listener { void after_slide (); void moused (int dir, double scl); }; name var;
92 #define AFTER_SLIDE(scope,name) void scope::name::after_slide ()
93 #define MOUSED(scope,name) void scope::name::moused (int dir, double scl)
94 
95 #endif
96