Xonotic QuakeC
The free, fast arena FPS with crisp movement and a wide array of weapons
playlist.qc
Go to the documentation of this file.
1#include "playlist.qh"
2
4{
6 me.configureXonoticPlayList(me);
7 return me;
8}
9
11{
12 me.nItems = tokenize_console(cvar_string("music_playlist_list0"));
13 me.configureXonoticListBox(me);
14}
15
16void XonoticPlayList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
17{
18 me.itemAbsSize = '0 0 0';
19 SUPER(XonoticPlayList).resizeNotify(me, relOrigin, relSize, absOrigin, absSize);
20
21 me.itemAbsSize.y = absSize.y * me.itemHeight;
22 me.itemAbsSize.x = absSize.x * (1 - me.controlWidth);
23 me.realFontSize.y = me.fontSize / me.itemAbsSize.y;
24 me.realFontSize.x = me.fontSize / me.itemAbsSize.x;
25 me.realUpperMargin = 0.5 * (1 - me.realFontSize.y);
26
27 me.columnNumberOrigin = 0;
28 me.columnNumberSize = 3 * me.realFontSize.x;
29
30 me.columnNameOrigin = me.columnNumberSize + me.realFontSize.x;
31 me.columnNameSize = 1 - me.columnNameOrigin - me.realFontSize.x;
32}
33
35{
36 me.nItems = tokenize_console(cvar_string("music_playlist_list0"));
37 if(me.nItems == 0)
38 {
39 cvar_set("music_playlist_list0", track);
40 return;
41 }
42 float i;
43 for(i = 0; i < me.nItems; ++i)
44 {
45 if(argv(i) == track)
46 return; // track is already in playlist
47 }
48 cvar_set("music_playlist_list0", strcat(cvar_string("music_playlist_list0"), " ", track));
49}
50
52{
53 float i, cpt = false;
54 string s = "";
55 me.nItems = tokenize_console(cvar_string("music_playlist_list0"));
56 if(me.nItems == 0)
57 return;
58 for(i = 0; i < me.nItems; ++i)
59 {
60 if(i == me.selectedItem)
61 {
62 if(i == me.nItems - 1)
63 me.setSelected(me, me.selectedItem - 1);
64 if(cvar("music_playlist_index") == 0 || cvar("music_playlist_index") == 999)
65 {
66 if(cvar("music_playlist_current0") == i)
67 cpt = true; // current playing track (we can't start next track here because startSound calls tokenize_console)
68 else if(cvar("music_playlist_current0") > i)
69 cvar_set("music_playlist_current0", ftos(cvar("music_playlist_current0") - 1));
70 }
71 continue;
72 }
73 s = strcat(s, " ", argv(i));
74 }
75 // we must stop the current playing track if it has been removed
76 // otherwise pause/play button will resume from another track
77 if(s == "")
78 {
79 cvar_set("music_playlist_list0", "");
80 if(cpt)
81 me.stopSound(me);
82 }
83 else
84 {
85 cvar_set("music_playlist_list0", substring(s, 1, strlen(s))); // remove initial space
86 if(cpt)
87 me.startSound(me, 0);
88 }
89}
90
92{
93 me.removeSelectedFromPlayList(me);
94}
95
97{
98 cvar_set("music_playlist_list0", "");
99 me.stopSound(me);
100 me.selectedItem = 0;
101}
102
104{
105 float f, i;
106 i = me.selectedItem;
107 f = SUPER(XonoticPlayList).mouseDrag(me, pos);
108
109 if(me.pressed != 1) // don't change priority if the person is just scrolling
110 {
111 if(me.selectedItem != i)
112 {
113 cvar_set("music_playlist_list0", swapInPriorityList(cvar_string("music_playlist_list0"), me.selectedItem, i));
114 float c = cvar("music_playlist_current0");
115 if(c == i)
116 cvar_set("music_playlist_current0", ftos(me.selectedItem));
117 else if(c == me.selectedItem)
118 cvar_set("music_playlist_current0", ftos(i));
119 }
120 }
121
122 return f;
123}
124
126{
127 me.nItems = tokenize_console(cvar_string("music_playlist_list0"));
128 if(cvar("music_playlist_index") == 0 || cvar("music_playlist_index") == 999)
129 me.playingTrack = cvar("music_playlist_current0");
130 else
131 me.playingTrack = -1;
132 SUPER(XonoticPlayList).draw(me);
133}
134
135void XonoticPlayList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
136{
137 string s;
138 if(isSelected)
139 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_SELECTED, SKINALPHA_LISTBOX_SELECTED);
140 else if(isFocused)
141 {
142 me.focusedItemAlpha = getFadedAlpha(me.focusedItemAlpha, SKINALPHA_LISTBOX_FOCUSED, SKINFADEALPHA_LISTBOX_FOCUSED);
143 draw_Fill('0 0 0', '1 1 0', SKINCOLOR_LISTBOX_FOCUSED, me.focusedItemAlpha);
144 }
145
146 if(i == me.playingTrack)
147 {
148 float f = cvar("music_playlist_sampleposition0");
149 // display Play symbol: Unicode char U+25B6: Black Right-Pointing Triangle
150 if(f <= 0 || (((time * 2) & 1) && f > 0))
151 draw_Text(me.realUpperMargin * eY + (me.columnNumberOrigin + me.columnNumberSize) * eX, "\xE2\x96\xB6", me.realFontSize, '1 1 1', SKINALPHA_TEXT, 0);
152 }
153
154 s = ftos(i+1);
155 draw_CenterText(me.realUpperMargin * eY + (me.columnNumberOrigin + 0.5 * me.columnNumberSize) * eX, s, me.realFontSize, '1 1 1', SKINALPHA_TEXT, 0);
156
157 s = draw_TextShortenToWidth(argv(i), me.columnNameSize, 0, me.realFontSize);
158 draw_Text(me.realUpperMargin * eY + me.columnNameOrigin * eX, s, me.realFontSize, '1 1 1', SKINALPHA_TEXT, 0);
159}
160
162{
163 // STOP: list 0 is disabled by setting the index to -1
164 // we set sampleposition0 to 0 to forget the position that the engine saves in this frame (for this reason we need to wait a frame)
165 if(cvar("music_playlist_index") == 0 || cvar("music_playlist_index") == 999)
166 {
167 cvar_set("music_playlist_index", "-1");
168 localcmd("\nwait; music_playlist_sampleposition0 0\n");
169 localcmd("\ndefer 3 \"cd play $menu_cdtrack\"\n");
170 }
171}
172
174{
175 me.stopSound(me);
176}
177
178void XonoticPlayList_startSound(entity me, float offset)
179{
180 float f;
181 me.nItems = tokenize_console(cvar_string("music_playlist_list0"));
182 if(offset)
183 {
184 if(cvar("music_playlist_index") == -1)
185 return;
186 f = bound(0, cvar("music_playlist_current0") + offset, me.nItems - 1);
187 if(f == cvar("music_playlist_current0"))
188 return;
189 }
190 else
191 {
192 f = me.selectedItem;
193 // if it was paused then resume
194 if(f == cvar("music_playlist_current0"))
195 if(cvar("music_playlist_index") == 999)
196 {
197 me.resumeSound(me);
198 return;
199 }
200 // if it was not paused then proceed with restart
201 }
202
203 // START: list 0 is disabled by setting the index to 999
204 // we set current0 to the selected track and sampleposition0 to 0 to forget the position that the engine saves in this frame (for this reason we need to wait a frame)
205 // then we switch back to list 0
206 cvar_set("music_playlist_index", "999");
207 cvar_set("music_playlist_current0", ftos(f));
208 localcmd("\nwait; music_playlist_sampleposition0 0; wait; music_playlist_index 0\n");
209}
210
212{
213 me.startSound(me, 0);
214}
215
217{
218 me.startSound(me, -1);
219}
220
222{
223 me.startSound(me, +1);
224}
225
227{
228 // RESUME: list 0 is enabled by setting the index to 0
229 // (we reset sampleposition0 to 0 to mark the track as in playing back state)
230 if(cvar("music_playlist_index") == 999)
231 localcmd("\nmusic_playlist_index 0; wait; music_playlist_sampleposition0 0\n");
232}
234{
235 // PAUSE: list 0 is disabled by setting the index to 999
236 // (we know the track is paused because the engine sets sampleposition0 to remember current position)
237 if(cvar("music_playlist_index") == 0)
238 localcmd("\nmusic_playlist_index 999\n");
239 else me.resumeSound(me);
240}
241
243{
244 me.pauseSound(me);
245}
246
248{
249 me.startSound(me, 0);
250}
251
252float XonoticPlayList_keyDown(entity me, float scan, float ascii, float shift)
253{
254 if (scan == K_ENTER || scan == K_KP_ENTER || ((shift & S_CTRL) && scan == K_MOUSE1))
255 {
256 me.startSound(me, 0);
257 return 1;
258 }
259 else if (scan == K_SPACE)
260 {
261 me.pauseSound(me);
262 return 1;
263 }
264 else if (scan == K_DEL || scan == K_KP_DEL || scan == K_BACKSPACE || scan == K_MOUSE3
265 || ascii == '-')
266 {
267 me.removeSelectedFromPlayList(me);
268 return 1;
269 }
270 else
271 return SUPER(XonoticPlayList).keyDown(me, scan, ascii, shift);
272}
var entity(vector mins, vector maxs,.entity tofield) findbox_tofield_OrFallback
string swapInPriorityList(string order, float i, float j)
Definition util.qc:651
float time
#define strlen
#define tokenize_console
const int S_CTRL
Definition hud.qh:130
float K_BACKSPACE
Definition keycodes.qc:14
float K_MOUSE1
Definition keycodes.qc:129
float K_DEL
Definition keycodes.qc:38
float K_MOUSE3
Definition keycodes.qc:131
float K_SPACE
Definition keycodes.qc:10
float K_ENTER
Definition keycodes.qc:8
float K_KP_DEL
Definition keycodes.qc:68
float K_KP_ENTER
Definition keycodes.qc:74
string draw_TextShortenToWidth(string theText, float maxWidth, float ICanHasKallerz, vector SizeThxBye)
Definition draw.qc:378
void draw_Text(vector theOrigin, string theText, vector theSize, vector theColor, float theAlpha, float ICanHasKallerz)
Definition draw.qc:282
void draw_CenterText(vector theOrigin, string theText, vector theSize, vector theColor, float theAlpha, float ICanHasKallerz)
Definition draw.qc:298
void draw_Fill(vector theOrigin, vector theSize, vector theColor, float theAlpha)
Definition draw.qc:97
float getFadedAlpha(float currentAlpha, float startAlpha, float targetAlpha)
Definition util.qc:816
void localcmd(string command,...)
void cvar_set(string name, string value)
float bound(float min, float value, float max)
string substring(string s, float start, float length)
float cvar(string name)
const string cvar_string(string name)
string ftos(float f)
string argv(float n)
strcat(_("^F4Countdown stopped!"), "\n^BG", _("Teams are too unbalanced."))
#define NEW(cname,...)
Definition oo.qh:117
#define SUPER(cname)
Definition oo.qh:231
void XonoticPlayList_stopSound(entity me)
Definition playlist.qc:161
void XonoticPlayList_addToPlayList(entity me, string track)
Definition playlist.qc:34
void StopSound_Click(entity btn, entity me)
Definition playlist.qc:173
void XonoticPlayList_draw(entity me)
Definition playlist.qc:125
void XonoticPlayList_drawListBoxItem(entity me, int i, vector absSize, bool isSelected, bool isFocused)
Definition playlist.qc:135
void NextSound_Click(entity btn, entity me)
Definition playlist.qc:221
entity makeXonoticPlayList()
Definition playlist.qc:3
void PauseSound_Click(entity btn, entity me)
Definition playlist.qc:242
float XonoticPlayList_mouseDrag(entity me, vector pos)
Definition playlist.qc:103
void XonoticPlayList_removeSelectedFromPlayList(entity me)
Definition playlist.qc:51
void XonoticPlayList_startSound(entity me, float offset)
Definition playlist.qc:178
void XonoticPlayList_resumeSound(entity me)
Definition playlist.qc:226
void XonoticPlayList_doubleClickListBoxItem(entity me, float i, vector where)
Definition playlist.qc:247
void XonoticPlayList_pauseSound(entity me)
Definition playlist.qc:233
void XonoticPlayList_configureXonoticPlayList(entity me)
Definition playlist.qc:10
void XonoticPlayList_resizeNotify(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
Definition playlist.qc:16
void PlayList_Remove(entity btn, entity me)
Definition playlist.qc:91
void PlayList_Remove_All(entity btn, entity me)
Definition playlist.qc:96
void PrevSound_Click(entity btn, entity me)
Definition playlist.qc:216
void StartSound_Click(entity btn, entity me)
Definition playlist.qc:211
float XonoticPlayList_keyDown(entity me, float scan, float ascii, float shift)
Definition playlist.qc:252
vector
Definition self.qh:92
const vector eY
Definition vector.qh:45
const vector eX
Definition vector.qh:44