#pragma once #include "../item.qh" CLASS(ListBox, MenuItem) 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, mouseMove, float(entity, vector)); METHOD(ListBox, mousePress, bool(ListBox this, vector pos)); METHOD(ListBox, mouseDrag, float(entity, vector)); METHOD(ListBox, mouseRelease, float(entity, vector)); METHOD(ListBox, focusLeave, void(entity)); ATTRIB(ListBox, focusable, float, 1); ATTRIB(ListBox, focusedItem, int, -1); ATTRIB(ListBox, focusedItemAlpha, float, 0.3); METHOD(ListBox, setFocusedItem, void(entity, int)); ATTRIB(ListBox, mouseMoveOffset, float, -1); // let know where the cursor is when the list scrolls without moving the cursor ATTRIB(ListBox, allowFocusSound, float, 1); ATTRIB(ListBox, selectedItem, int, 0); ATTRIB(ListBox, size, vector, '0 0 0'); ATTRIB(ListBox, origin, vector, '0 0 0'); ATTRIB(ListBox, scrollPos, float, 0); // measured in window heights, fixed when needed ATTRIB(ListBox, scrollPosTarget, float, 0); METHOD(ListBox, isScrolling, bool(entity)); ATTRIB(ListBox, needScrollToItem, float, -1); METHOD(ListBox, scrollToItem, void(entity, int)); ATTRIB(ListBox, previousValue, float, 0); ATTRIB(ListBox, pressed, float, 0); // 0 = normal, 1 = scrollbar dragging, 2 = item dragging, 3 = released 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, dragScrollPos, vector, '0 0 0'); ATTRIB(ListBox, selectionDoesntMatter, bool, false); // improves scrolling by keys for lists that don't need to show an active selection ATTRIB(ListBox, src, string); // scrollbar ATTRIB(ListBox, color, vector, '1 1 1'); ATTRIB(ListBox, color2, vector, '1 1 1'); ATTRIB(ListBox, colorC, vector, '1 1 1'); ATTRIB(ListBox, colorF, vector, '1 1 1'); ATTRIB(ListBox, tolerance, vector, '0 0 0'); // drag tolerance ATTRIB(ListBox, scrollbarWidth, float, 0); // pixels ATTRIB(ListBox, nItems, float, 42); // FIXME: why?!? ATTRIB(ListBox, itemHeight, float, 0); ATTRIB(ListBox, itemAbsSize, vector, '0 0 0'); ATTRIB(ListBox, colorBG, vector, '0 0 0'); ATTRIB(ListBox, alphaBG, float, 0); ATTRIB(ListBox, lastClickedItem, float, -1); ATTRIB(ListBox, lastClickedTime, float, 0); METHOD(ListBox, drawListBoxItem, void(entity, int, vector, bool, bool)); // item number, width/height, isSelected, isFocused METHOD(ListBox, clickListBoxItem, void(entity, float, vector)); // item number, relative clickpos METHOD(ListBox, doubleClickListBoxItem, void(entity, float, vector)); // item number, relative clickpos METHOD(ListBox, setSelected, void(entity, float)); METHOD(ListBox, focusedItemChangeNotify, void(entity)); METHOD(ListBox, getLastFullyVisibleItemAtScrollPos, float(entity, float)); METHOD(ListBox, getFirstFullyVisibleItemAtScrollPos, float(entity, float)); // NOTE: override these four methods if you want variable sized list items METHOD(ListBox, getTotalHeight, float(entity)); METHOD(ListBox, getItemAtPos, float(entity, float)); METHOD(ListBox, getItemStart, float(entity, float)); METHOD(ListBox, getItemHeight, float(entity, float)); // NOTE: if getItemAt* are overridden, it may make sense to cache the // start and height of the last item returned by getItemAtPos and fast // track returning their properties for getItemStart and getItemHeight. // The "hot" code path calls getItemAtPos first, then will query // getItemStart and getItemHeight on it soon. // When overriding, the following consistency rules must hold: // getTotalHeight() == SUM(getItemHeight(i), i, 0, me.nItems-1) // getItemStart(i+1) == getItemStart(i) + getItemHeight(i) // for 0 <= i < me.nItems-1 // getItemStart(0) == 0 // getItemStart(getItemAtPos(p)) <= p // if p >= 0 // getItemAtPos(p) == 0 // if p < 0 // getItemStart(getItemAtPos(p)) + getItemHeight(getItemAtPos(p)) > p // if p < getTotalHeigt() // getItemAtPos(p) == me.nItems - 1 // if p >= getTotalHeight() ENDCLASS(ListBox)