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