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