r2903 - in trunk/data/qcsrc/menu-div0test: . item nexuiz

DONOTREPLY at icculus.org DONOTREPLY at icculus.org
Sun Nov 4 16:36:06 EST 2007


Author: div0
Date: 2007-11-04 16:36:02 -0500 (Sun, 04 Nov 2007)
New Revision: 2903

Added:
   trunk/data/qcsrc/menu-div0test/item/listbox.c
Modified:
   trunk/data/qcsrc/menu-div0test/classes.c
   trunk/data/qcsrc/menu-div0test/draw.qc
   trunk/data/qcsrc/menu-div0test/draw.qh
   trunk/data/qcsrc/menu-div0test/item/slider.c
   trunk/data/qcsrc/menu-div0test/menu.qc
   trunk/data/qcsrc/menu-div0test/menu.qh
   trunk/data/qcsrc/menu-div0test/msys.qh
   trunk/data/qcsrc/menu-div0test/nexuiz/dialog_settings_audio.c
   trunk/data/qcsrc/menu-div0test/progs.src
Log:
add somewhat working listbox; but it can't do anything useful yet


Modified: trunk/data/qcsrc/menu-div0test/classes.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/classes.c	2007-11-04 18:51:33 UTC (rev 2902)
+++ trunk/data/qcsrc/menu-div0test/classes.c	2007-11-04 21:36:02 UTC (rev 2903)
@@ -13,6 +13,7 @@
 #include "item/dialog.c"
 #include "item/tab.c"
 #include "item/textslider.c"
+#include "item/listbox.c"
 #include "nexuiz/dialog.c"
 #include "nexuiz/tab.c"
 #include "nexuiz/mainwindow.c"

Modified: trunk/data/qcsrc/menu-div0test/draw.qc
===================================================================
--- trunk/data/qcsrc/menu-div0test/draw.qc	2007-11-04 18:51:33 UTC (rev 2902)
+++ trunk/data/qcsrc/menu-div0test/draw.qc	2007-11-04 21:36:02 UTC (rev 2903)
@@ -208,3 +208,20 @@
 	//print("draw_TextWidth \"", theText, "\"\n");
 	return stringwidth(theText, 0);
 }
+
+float draw_clipSet;
+void draw_SetClip()
+{
+	if(draw_clipSet)
+		error("Already clipping, no stack implemented here, sorry");
+	drawsetcliparea(draw_shift_x, draw_shift_y, draw_scale_x, draw_scale_y);
+	draw_clipSet = 1;
+}
+
+void draw_ClearClip()
+{
+	if(!draw_clipSet)
+		error("Not clipping, can't clear it then");
+	drawresetcliparea();
+	draw_clipSet = 0;
+}

Modified: trunk/data/qcsrc/menu-div0test/draw.qh
===================================================================
--- trunk/data/qcsrc/menu-div0test/draw.qh	2007-11-04 18:51:33 UTC (rev 2902)
+++ trunk/data/qcsrc/menu-div0test/draw.qh	2007-11-04 21:36:02 UTC (rev 2903)
@@ -13,6 +13,9 @@
 void draw_Text(vector origin, string text, vector size, vector color, float alpha);
 float draw_TextWidth(string text);
 
+void draw_SetClip();
+void draw_ClearClip();
+
 vector boxToGlobal(vector v, vector shift, vector scale);
 vector boxToGlobalSize(vector v, vector scale);
 vector globalToBox(vector v, vector shift, vector scale);

Added: trunk/data/qcsrc/menu-div0test/item/listbox.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/item/listbox.c	                        (rev 0)
+++ trunk/data/qcsrc/menu-div0test/item/listbox.c	2007-11-04 21:36:02 UTC (rev 2903)
@@ -0,0 +1,255 @@
+#ifdef INTERFACE
+CLASS(ListBox) EXTENDS(Item)
+	METHOD(ListBox, resizeNotify, void(entity, vector, vector, vector, vector))
+	METHOD(ListBox, configureListBox, void(entity, float, float))
+	METHOD(ListBox, draw, void(entity))
+	METHOD(ListBox, keyDown, float(entity, float, float, float))
+	METHOD(ListBox, mousePress, float(entity, vector))
+	METHOD(ListBox, mouseDrag, float(entity, vector))
+	METHOD(ListBox, mouseRelease, float(entity, vector))
+	ATTRIB(ListBox, focusable, float, 1)
+	ATTRIB(ListBox, selectedItem, float, 0)
+	ATTRIB(ListBox, size, vector, '0 0 0')
+	ATTRIB(ListBox, scrollPos, float, 0) // measured in window heights, fixed when needed
+	ATTRIB(ListBox, previousValue, float, 0)
+	ATTRIB(ListBox, pressed, float, 0)
+	ATTRIB(ListBox, pressOffset, float, 0)
+
+	METHOD(ListBox, updateControlTopBottom, void(entity))
+	ATTRIB(ListBox, controlTop, float, 0)
+	ATTRIB(ListBox, controlBottom, float, 0)
+	ATTRIB(ListBox, controlWidth, float, 0)
+	ATTRIB(ListBox, dragScrollTimer, float, 0)
+	ATTRIB(ListBox, dragScrollPos, vector, '0 0 0')
+
+	ATTRIB(ListBox, src, string, "") // scrollbar
+	ATTRIB(ListBox, tolerance, vector, '0 0 0') // drag tolerance
+	ATTRIB(ListBox, scrollbarWidth, float, 0) // pixels
+	ATTRIB(ListBox, nItems, float, 0)
+	ATTRIB(ListBox, itemHeight, float, 0)
+	METHOD(ListBox, drawListBoxItem, void(entity, float, vector, float)) // item number, width/height, selected
+	METHOD(ListBox, clickListBoxItem, void(entity, float, vector)) // item number, relative clickpos
+ENDCLASS(ListBox)
+#endif
+
+#ifdef IMPLEMENTATION
+void resizeNotifyListBox(entity me, vector relOrigin, vector relSize, vector absOrigin, vector absSize)
+{
+	me.size = absSize;
+	me.controlWidth = me.scrollbarWidth / absSize_x;
+}
+void configureListBoxListBox(entity me, float theScrollbarWidth, float theItemHeight)
+{
+	me.scrollbarWidth = theScrollbarWidth;
+	me.itemHeight = theItemHeight;
+}
+float keyDownListBox(entity me, float key, float ascii, float shift)
+{
+	if(key == K_DOWNARROW)
+		me.selectedItem += 1;
+	else if(key == K_UPARROW)
+		me.selectedItem -= 1;
+	else if(key == K_MWHEELUP)
+	{
+		me.scrollPos = max(me.scrollPos - 0.5, 0);
+		me.selectedItem = min(me.selectedItem, floor((me.scrollPos + 1) / me.itemHeight - 1));
+	}
+	else if(key == K_MWHEELDOWN)
+	{
+		me.scrollPos = min(me.scrollPos + 0.5, me.nItems * me.itemHeight - 1);
+		me.selectedItem = max(me.selectedItem, ceil(me.scrollPos / me.itemHeight));
+	}
+	else if(key == K_PGUP)
+		me.selectedItem = me.selectedItem - 1 / me.itemHeight;
+	else if(key == K_PGDN)
+		me.selectedItem = me.selectedItem + 1 / me.itemHeight;
+	else if(key == K_HOME)
+		me.selectedItem = 0;
+	else if(key == K_END)
+		me.selectedItem = me.nItems - 1;
+	else
+		return 0;
+	me.selectedItem = floor(0.5 + bound(0, me.selectedItem, me.nItems - 1));
+	return 1;
+}
+float mouseDragListBox(entity me, vector pos)
+{
+	float hit;
+	float v;
+	me.updateControlTopBottom(me);
+	me.dragScrollPos = pos;
+	if(me.pressed == 1)
+	{
+		hit = 1;
+		if(pos_x < 1 - me.controlWidth - me.tolerance_x) hit = 0;
+		if(pos_y < 0 - me.tolerance_y) hit = 0;
+		if(pos_x >= 1 + me.tolerance_x) hit = 0;
+		if(pos_y >= 1 + me.tolerance_y) hit = 0;
+		if(hit)
+		{
+			// calculate new pos to v
+			float delta;
+			delta = (pos_y - me.pressOffset) / (1 - 1 / (me.nItems * me.itemHeight)) * (me.nItems * me.itemHeight - 1);
+			me.scrollPos = me.previousValue + delta;
+		}
+		else
+			me.scrollPos = me.previousValue;
+		me.scrollPos = min(me.scrollPos, me.nItems * me.itemHeight - 1);
+		me.scrollPos = max(me.scrollPos, 0);
+		me.selectedItem = min(me.selectedItem, floor((me.scrollPos + 1) / me.itemHeight - 1));
+		me.selectedItem = max(me.selectedItem, ceil(me.scrollPos / me.itemHeight));
+	}
+	else if(me.pressed == 2)
+	{
+		me.selectedItem = (me.scrollPos + pos_y) / me.itemHeight;
+		me.selectedItem = floor(0.5 + bound(0, me.selectedItem, me.nItems - 1));
+	}
+	return 1;
+}
+float mousePressListBox(entity me, vector pos)
+{
+	if(pos_x < 0) return 0;
+	if(pos_y < 0) return 0;
+	if(pos_x >= 1) return 0;
+	if(pos_y >= 1) return 0;
+	me.updateControlTopBottom(me);
+	if(pos_x >= 1 - me.controlWidth)
+	{
+		// if hit, set me.pressed, otherwise scroll by one page
+		if(pos_y < me.controlTop)
+		{
+			// page up
+			me.scrollPos = max(me.scrollPos - 1, 0);
+			me.selectedItem = min(me.selectedItem, floor((me.scrollPos + 1) / me.itemHeight - 1));
+		}
+		else if(pos_y > me.controlBottom)
+		{
+			// page down
+			me.scrollPos = min(me.scrollPos + 1, me.nItems * me.itemHeight - 1);
+			me.selectedItem = max(me.selectedItem, ceil(me.scrollPos / me.itemHeight));
+		}
+		else
+		{
+			me.pressed = 1;
+			me.pressOffset = pos_y;
+			me.previousValue = me.scrollPos;
+		}
+	}
+	else
+	{
+		// an item has been clicked. Select it, ...
+		me.selectedItem = (me.scrollPos + pos_y) / me.itemHeight;
+		me.selectedItem = floor(0.5 + bound(0, me.selectedItem, me.nItems - 1));
+		// continue doing that while dragging (even when dragging outside). When releasing, forward the click to the then selected item.
+		me.pressed = 2;
+	}
+	return 1;
+}
+float mouseReleaseListBox(entity me, vector pos)
+{
+	vector absSize, clickOrigin;
+	if(me.pressed == 1)
+	{
+		// slider dragging mode
+		// in that case, nothing happens on releasing
+	}
+	else if(me.pressed == 2)
+	{
+		// item dragging mode
+		// select current one one last time...
+		me.selectedItem = (me.scrollPos + pos_y) / me.itemHeight;
+		me.selectedItem = floor(0.5 + bound(0, me.selectedItem, me.nItems - 1));
+		// and give it a nice click event
+		if(me.nItems > 0)
+		{
+			absSize = boxToGlobalSize(me.size, eX * (1 - me.controlWidth) + eY);
+			me.clickListBoxItem(me, me.selectedItem, globalToBox(pos, eX * (me.selectedItem * me.itemHeight - me.scrollPos), absSize));
+		}
+	}
+	me.pressed = 0;
+	return 1;
+}
+void updateControlTopBottomListBox(entity me)
+{
+	// scrollPos is in 0..1 and indicates where the "page" currently shown starts.
+	if(me.nItems * me.itemHeight <= 1)
+	{
+		// we don't need no stinkin' scrollbar, we don't need no view control...
+		me.controlTop = 0;
+		me.controlBottom = 1;
+		me.scrollPos = 0;
+	}
+	else
+	{
+		if(frametime) // only do this in draw frames
+		{
+			me.dragScrollTimer -= frametime;
+			if(me.dragScrollTimer < 0)
+			{
+				float save;
+				save = me.scrollPos;
+				// if selected item is below listbox, increase scrollpos so it is in
+				me.scrollPos = max(me.scrollPos, me.selectedItem * me.itemHeight - 1 + me.itemHeight);
+				// if selected item is above listbox, decrease scrollpos so it is in
+				me.scrollPos = min(me.scrollPos, me.selectedItem * me.itemHeight);
+				if(me.scrollPos != save)
+					me.dragScrollTimer = 0.2;
+			}
+		}
+		// if scroll pos is below end of list, fix it
+		me.scrollPos = min(me.scrollPos, me.nItems * me.itemHeight - 1);
+		// if scroll pos is above beginning of list, fix it
+		me.scrollPos = max(me.scrollPos, 0);
+		// now that we know where the list is scrolled to, find out where to draw the control
+		me.controlTop = max(0, me.scrollPos / (me.nItems * me.itemHeight));
+		me.controlBottom = min((me.scrollPos + 1) / (me.nItems * me.itemHeight), 1);
+	}
+}
+void drawListBox(entity me)
+{
+	float i;
+	vector absSize;
+	vector oldshift, oldscale;
+	if(me.pressed == 2)
+		me.mouseDrag(me, me.dragScrollPos); // simulate mouseDrag event
+	me.updateControlTopBottom(me);
+	draw_VertButtonPicture(eX * (1 - me.controlWidth), strcat(me.src, "_s"), eX * me.controlWidth + eY, '1 1 1', 1);
+	if(me.nItems * me.itemHeight > 1)
+	{
+		vector o, s;
+		o = eX * (1 - me.controlWidth) + eY * me.controlTop;
+		s = eX * me.controlWidth + eY * (me.controlBottom - me.controlTop);
+		if(me.pressed)
+			draw_VertButtonPicture(o, strcat(me.src, "_c"), s, '1 1 1', 1);
+		else if(me.focused)
+			draw_VertButtonPicture(o, strcat(me.src, "_f"), s, '1 1 1', 1);
+		else
+			draw_VertButtonPicture(o, strcat(me.src, "_n"), s, '1 1 1', 1);
+	}
+	draw_SetClip();
+	oldshift = draw_shift;
+	oldscale = draw_scale;
+	absSize = boxToGlobalSize(me.size, eX * (1 - me.controlWidth) + eY * me.itemHeight);
+	for(i = floor(me.scrollPos / me.itemHeight); i < me.nItems; ++i)
+	{
+		float y;
+		y = i * me.itemHeight - me.scrollPos;
+		if(y >= 1)
+			break;
+		draw_shift = boxToGlobal(eY * y, oldshift, oldscale);
+		draw_scale = boxToGlobalSize(eY * me.itemHeight + eX * (1 - me.controlWidth), oldscale);
+		me.drawListBoxItem(me, i, absSize, (me.selectedItem == i));
+	}
+	draw_ClearClip();
+}
+
+void clickListBoxItemListBox(entity me, float i, vector where)
+{
+	// itemclick, itemclick, does whatever itemclick does
+}
+
+void drawListBoxItemListBox(entity me, float i, vector absSize, float selected)
+{
+	draw_Text('0 0 0', strcat("Item ", ftos(i)), eX * (8 / absSize_x) + eY * (8 / absSize_y), (selected ? '0 1 0' : '1 1 1'), 1);
+}
+#endif

Modified: trunk/data/qcsrc/menu-div0test/item/slider.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/item/slider.c	2007-11-04 18:51:33 UTC (rev 2902)
+++ trunk/data/qcsrc/menu-div0test/item/slider.c	2007-11-04 21:36:02 UTC (rev 2903)
@@ -155,17 +155,17 @@
 	float controlCenter;
 	if(me.disabled)
 		return 0;
-	if(pos_x < 0 - me.tolerance_x) return 0;
-	if(pos_y < 0 - me.tolerance_y) return 0;
-	if(pos_x >= 1 - me.textSpace + me.tolerance_x) return 0;
-	if(pos_y >= 1 + me.tolerance_y) return 0;
+	if(pos_x < 0) return 0;
+	if(pos_y < 0) return 0;
+	if(pos_x >= 1 - me.textSpace) return 0;
+	if(pos_y >= 1) return 0;
 	controlCenter = (me.value - me.valueMin) / (me.valueMax - me.valueMin) * (1 - me.textSpace - me.controlWidth) + 0.5 * me.controlWidth;
 	if(fabs(pos_x - controlCenter) <= 0.5 * me.controlWidth)
 	{
 		me.pressed = 1;
 		me.pressOffset = pos_x - controlCenter;
 		me.previousValue = me.value;
-		me.mouseDrag(me, pos);
+		//me.mouseDrag(me, pos);
 	}
 	else
 	{

Modified: trunk/data/qcsrc/menu-div0test/menu.qc
===================================================================
--- trunk/data/qcsrc/menu-div0test/menu.qc	2007-11-04 18:51:33 UTC (rev 2902)
+++ trunk/data/qcsrc/menu-div0test/menu.qc	2007-11-04 21:36:02 UTC (rev 2903)
@@ -34,7 +34,7 @@
 		return;
 	draw_reset();
 	main.keyUp(main, key, ascii, menuShiftState);
-	if(key >= K_MOUSE1 && key <= K_MOUSE10)
+	if(key >= K_MOUSE1 && key <= K_MOUSE3)
 	{
 		--mouseButtonsPressed;
 		if(!mouseButtonsPressed)
@@ -68,11 +68,11 @@
 			if(key == K_ESCAPE)
 				if(gamestatus & (GAME_ISSERVER | GAME_CONNECTED)) // don't back out to console only
 					m_hide(); // disable menu on unhandled ESC
-		if(key >= K_MOUSE1 && key <= K_MOUSE10)
+		if(key >= K_MOUSE1 && key <= K_MOUSE3)
 			if(!mouseButtonsPressed)
 				main.mousePress(main, menuMousePos);
 	}
-	if(key >= K_MOUSE1 && key <= K_MOUSE10)
+	if(key >= K_MOUSE1 && key <= K_MOUSE3)
 	{
 		++mouseButtonsPressed;
 		if(mouseButtonsPressed > 10)
@@ -142,6 +142,8 @@
 	}
 	main.draw(main);
 	draw_drawMousePointer(menuMousePos);
+
+	frametime = 0;
 };
 
 void() m_display =

Modified: trunk/data/qcsrc/menu-div0test/menu.qh
===================================================================
--- trunk/data/qcsrc/menu-div0test/menu.qh	2007-11-04 18:51:33 UTC (rev 2902)
+++ trunk/data/qcsrc/menu-div0test/menu.qh	2007-11-04 21:36:02 UTC (rev 2903)
@@ -32,3 +32,5 @@
 
 entity keyGrabber;
 .void(entity me, float key, float ascii) keyGrabbed;
+
+void SUB_Null();

Modified: trunk/data/qcsrc/menu-div0test/msys.qh
===================================================================
--- trunk/data/qcsrc/menu-div0test/msys.qh	2007-11-04 18:51:33 UTC (rev 2902)
+++ trunk/data/qcsrc/menu-div0test/msys.qh	2007-11-04 21:36:02 UTC (rev 2903)
@@ -136,17 +136,22 @@
 float K_MOUSE1		=	512;
 float K_MOUSE2		=	513;
 float K_MOUSE3		=	514;
-float K_MOUSE4		=	515;
-float K_MOUSE5		=	516;
-float K_MOUSE6		=	517;
-float K_MOUSE7		=	518;
-float K_MOUSE8		=	519;
-float K_MOUSE9		=	520;
-float K_MOUSE10		=	521;
+float K_MWHEELUP	=	515;
+float K_MWHEELDOWN	=	516;
+float K_MOUSE4		=	517;
+float K_MOUSE5		=	518;
+float K_MOUSE6		=	519;
+float K_MOUSE7		=	520;
+float K_MOUSE8		=	521;
+float K_MOUSE9		=	522;
+float K_MOUSE10		=	523;
+float K_MOUSE11		=	524;
+float K_MOUSE12		=	525;
+float K_MOUSE13		=	526;
+float K_MOUSE14		=	527;
+float K_MOUSE15		=	528;
+float K_MOUSE16		=	529;
 
-float K_MWHEELDOWN	=	K_MOUSE4;
-float K_MWHEELUP	=	K_MOUSE5;
-
 ///////////////////////////
 // key dest constants
 

Modified: trunk/data/qcsrc/menu-div0test/nexuiz/dialog_settings_audio.c
===================================================================
--- trunk/data/qcsrc/menu-div0test/nexuiz/dialog_settings_audio.c	2007-11-04 18:51:33 UTC (rev 2902)
+++ trunk/data/qcsrc/menu-div0test/nexuiz/dialog_settings_audio.c	2007-11-04 21:36:02 UTC (rev 2903)
@@ -17,6 +17,13 @@
 	me.configureDialog(me);
 	return me;
 }
+entity makeNexuizDemoListbox()
+{
+	entity me;
+	me = spawnListBox();
+	me.configureListBox(me, 16, 0.1);
+	return me;
+}
 void fillNexuizAudioSettingsTab(entity me)
 {
 	entity e;
@@ -32,6 +39,7 @@
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Ambient Volume:"));
 		me.TD(me, 1, 2, e = makeNexuizSlider(0, 255, 1, "snd_staticvolume"));
 	me.TR(me);
+		me.TD(me, 7, 3, e = makeNexuizDemoListbox());
 
 	me.gotoXY(me, 0, 3.5); me.setFirstColumn(me, me.currentColumn);
 		me.TD(me, 1, 1, e = makeNexuizTextLabel(0, "Frequency:"));

Modified: trunk/data/qcsrc/menu-div0test/progs.src
===================================================================
--- trunk/data/qcsrc/menu-div0test/progs.src	2007-11-04 18:51:33 UTC (rev 2902)
+++ trunk/data/qcsrc/menu-div0test/progs.src	2007-11-04 21:36:02 UTC (rev 2903)
@@ -15,6 +15,11 @@
 oo/classdefs.h
 	classes.c
 
+oo/constructors.h
+	classes.c
+oo/implementation.h
+	classes.c
+
 ../common/util.qc
 ../common/gamecommand.qc
 gamecommand.qc
@@ -22,7 +27,3 @@
 draw.qc
 nexuiz/util.qc
 
-oo/constructors.h
-	classes.c
-oo/implementation.h
-	classes.c




More information about the nexuiz-commits mailing list