1 /*	Public domain	*/
2 
3 #ifndef _AGAR_GUI_SCROLLBAR_H_
4 #define _AGAR_GUI_SCROLLBAR_H_
5 
6 #include <agar/gui/widget.h>
7 
8 #include <agar/gui/begin.h>
9 
10 enum ag_scrollbar_type {
11 	AG_SCROLLBAR_HORIZ,
12 	AG_SCROLLBAR_VERT
13 };
14 
15 enum ag_scrollbar_button {
16 	AG_SCROLLBAR_BUTTON_NONE,
17 	AG_SCROLLBAR_BUTTON_DEC,
18 	AG_SCROLLBAR_BUTTON_INC,
19 	AG_SCROLLBAR_BUTTON_SCROLL
20 };
21 
22 typedef struct ag_scrollbar {
23 	struct ag_widget wid;
24 	Uint flags;
25 #define AG_SCROLLBAR_HFILL	0x01
26 #define AG_SCROLLBAR_VFILL	0x02
27 #define AG_SCROLLBAR_TEXT	0x08	/* Print numbers (for debugging) */
28 #define AG_SCROLLBAR_AUTOHIDE	0x20	/* Show based on range (default) */
29 #define AG_SCROLLBAR_EXCL	0x40	/* Has exclusive access to bindings */
30 #define AG_SCROLLBAR_NOAUTOHIDE 0x80	/* Disable autohide */
31 #define AG_SCROLLBAR_EXPAND	(AG_SCROLLBAR_HFILL|AG_SCROLLBAR_VFILL)
32 
33 	enum ag_scrollbar_type type;	/* Style of scrollbar */
34 	enum ag_scrollbar_button curBtn;	/* Active button */
35 	enum ag_scrollbar_button mouseOverBtn;	/* Mouseover button */
36 	int width;			/* Scrollbar width */
37 	int length;			/* Length of scrolling control area */
38 	int wBar;			/* Preferred control length */
39 	int wBarMin;			/* Minimum control length */
40 	int hArrow;			/* Arrow height */
41 	AG_Event *buttonIncFn;		/* Alt. handler for increment btns */
42 	AG_Event *buttonDecFn;		/* Alt. handler for decrement btns */
43 	AG_Timer moveTo;		/* Timer for scrolling control */
44 	AG_Timer autoHideTo;		/* Timer for autohide check */
45 	int xOffs, xSeek;		/* Cursor offset for scrolling */
46 	Uint lenPre;			/* Preferred length size hint */
47 	int minOffs, maxOffs, visOffs;	/* Constants to add to binding values */
48 } AG_Scrollbar;
49 
50 #define AGSCROLLBAR(p) ((AG_Scrollbar *)p)
51 
52 __BEGIN_DECLS
53 extern AG_WidgetClass agScrollbarClass;
54 
55 AG_Scrollbar *AG_ScrollbarNew(void *, enum ag_scrollbar_type, Uint);
56 void          AG_ScrollbarSizeHint(AG_Scrollbar *, int);
57 void          AG_ScrollbarSetIncFn(AG_Scrollbar *, AG_EventFn, const char *, ...);
58 void          AG_ScrollbarSetDecFn(AG_Scrollbar *, AG_EventFn, const char *, ...);
59 int           AG_ScrollbarVisible(AG_Scrollbar *);
60 
61 /* Set/retrieve scrolling control length */
62 static __inline__ void
AG_ScrollbarSetControlLength(AG_Scrollbar * sb,int bsize)63 AG_ScrollbarSetControlLength(AG_Scrollbar *sb, int bsize)
64 {
65 	AG_ObjectLock(sb);
66 	sb->wBar = (bsize > 10 || bsize == -1) ? bsize : 10;
67 	sb->length = (sb->type == AG_SCROLLBAR_VERT) ? AGWIDGET(sb)->h :
68 	                                               AGWIDGET(sb)->w;
69 	sb->length -= sb->width*2;
70 	sb->length -= sb->wBar;
71 	AG_ObjectUnlock(sb);
72 }
73 /* Set/retrieve scrollbar width in pixels. */
74 static __inline__ void
AG_ScrollbarSetWidth(AG_Scrollbar * sb,int width)75 AG_ScrollbarSetWidth(AG_Scrollbar *sb, int width)
76 {
77 	AG_ObjectLock(sb);
78 	sb->width = width;
79 	AG_ObjectUnlock(sb);
80 }
81 static __inline__ int
AG_ScrollbarWidth(AG_Scrollbar * sb)82 AG_ScrollbarWidth(AG_Scrollbar *sb)
83 {
84 	return (sb->width);
85 }
86 
87 #ifdef AG_LEGACY
88 # define AG_SCROLLBAR_AUTOSIZE	0x10	/* Automatically size control */
89 int AG_ScrollbarControlLength(AG_Scrollbar *) DEPRECATED_ATTRIBUTE;
90 void AG_ScrollbarSetIntIncrement(AG_Scrollbar *, int) DEPRECATED_ATTRIBUTE;
91 void AG_ScrollbarSetRealIncrement(AG_Scrollbar *, double) DEPRECATED_ATTRIBUTE;
92 # define AG_ScrollbarSetBarSize(sb,len) AG_ScrollbarSetControlLength((sb),(len))
93 # define AG_ScrollbarGetBarSize(sb) AG_ScrollbarControlLength(sb)
94 # define AG_ScrollbarSetButtonSize(sb,w) AG_ScrollbarSetWidth((sb),(w))
95 # define AG_ScrollbarGetButtonSize(sb) AG_ScrollbarWidth(sb)
96 #endif
97 __END_DECLS
98 
99 #include <agar/gui/close.h>
100 #endif /* _AGAR_GUI_SCROLLBAR_H_ */
101