mirror of https://gitlab.com/nakst/essence
sliders
This commit is contained in:
parent
dbc595a344
commit
abf4494701
|
@ -4946,6 +4946,101 @@ EsIconDisplay *EsIconDisplayCreate(EsElement *parent, uint64_t flags, const EsSt
|
||||||
return display;
|
return display;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// --------------------------------- Sliders.
|
||||||
|
|
||||||
|
struct EsSlider : EsElement {
|
||||||
|
EsElement *point;
|
||||||
|
double value;
|
||||||
|
uint32_t steps;
|
||||||
|
int32_t dragOffset;
|
||||||
|
bool inDrag, endDrag;
|
||||||
|
};
|
||||||
|
|
||||||
|
int ProcessSliderPointMessage(EsElement *element, EsMessage *message) {
|
||||||
|
EsSlider *slider = (EsSlider *) EsElementGetLayoutParent(element);
|
||||||
|
|
||||||
|
if (message->type == ES_MSG_MOUSE_LEFT_DRAG) {
|
||||||
|
double range = slider->width - slider->point->currentStyle->preferredWidth;
|
||||||
|
slider->inDrag = true;
|
||||||
|
EsSliderSetValue(slider, (message->mouseDragged.newPositionX + element->offsetX - slider->dragOffset) / range);
|
||||||
|
} else if (message->type == ES_MSG_MOUSE_LEFT_UP && slider->inDrag) {
|
||||||
|
slider->inDrag = false;
|
||||||
|
slider->endDrag = true; // Force sending the update message.
|
||||||
|
EsSliderSetValue(slider, slider->value);
|
||||||
|
slider->endDrag = false;
|
||||||
|
} else if (message->type == ES_MSG_MOUSE_LEFT_DOWN) {
|
||||||
|
slider->dragOffset = message->mouseDown.positionX;
|
||||||
|
EsElementFocus(slider);
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ES_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
int ProcessSliderMessage(EsElement *element, EsMessage *message) {
|
||||||
|
EsSlider *slider = (EsSlider *) element;
|
||||||
|
|
||||||
|
if (message->type == ES_MSG_LAYOUT) {
|
||||||
|
int pointWidth = slider->point->currentStyle->preferredWidth;
|
||||||
|
int pointHeight = slider->point->currentStyle->preferredHeight;
|
||||||
|
slider->point->InternalMove(pointWidth, pointHeight, (slider->width - pointWidth) * slider->value, (slider->height - pointHeight) / 2);
|
||||||
|
} else if (message->type == ES_MSG_FOCUSED_START) {
|
||||||
|
slider->point->customStyleState |= THEME_STATE_FOCUSED_ITEM;
|
||||||
|
slider->point->MaybeRefreshStyle();
|
||||||
|
} else if (message->type == ES_MSG_FOCUSED_END) {
|
||||||
|
slider->point->customStyleState &= ~THEME_STATE_FOCUSED_ITEM;
|
||||||
|
slider->point->MaybeRefreshStyle();
|
||||||
|
} else if (message->type == ES_MSG_KEY_TYPED && message->keyboard.scancode == ES_SCANCODE_LEFT_ARROW) {
|
||||||
|
EsSliderSetValue(slider, slider->value - (slider->steps ? 1.0 / slider->steps : 0.02));
|
||||||
|
} else if (message->type == ES_MSG_KEY_TYPED && message->keyboard.scancode == ES_SCANCODE_RIGHT_ARROW) {
|
||||||
|
EsSliderSetValue(slider, slider->value + (slider->steps ? 1.0 / slider->steps : 0.02));
|
||||||
|
} else if (message->type == ES_MSG_KEY_TYPED && message->keyboard.scancode == ES_SCANCODE_HOME) {
|
||||||
|
EsSliderSetValue(slider, 0.0);
|
||||||
|
} else if (message->type == ES_MSG_KEY_TYPED && message->keyboard.scancode == ES_SCANCODE_END) {
|
||||||
|
EsSliderSetValue(slider, 1.0);
|
||||||
|
} else if (message->type == ES_MSG_PAINT) {
|
||||||
|
// TODO Draw ticks.
|
||||||
|
} else {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return ES_HANDLED;
|
||||||
|
}
|
||||||
|
|
||||||
|
double EsSliderGetValue(EsSlider *slider) {
|
||||||
|
return slider->value;
|
||||||
|
}
|
||||||
|
|
||||||
|
void EsSliderSetValue(EsSlider *slider, double newValue, bool sendUpdatedMessage) {
|
||||||
|
newValue = ClampDouble(0.0, 1.0, newValue);
|
||||||
|
|
||||||
|
if (slider->steps) {
|
||||||
|
newValue = EsCRTfloor((slider->steps - 1) * newValue + 0.5) / (slider->steps - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
double previous = slider->value;
|
||||||
|
if (previous == newValue && !slider->endDrag) return;
|
||||||
|
slider->value = newValue;
|
||||||
|
EsElementRelayout(slider);
|
||||||
|
|
||||||
|
if (sendUpdatedMessage) {
|
||||||
|
EsMessage m = { ES_MSG_SLIDER_MOVED, .sliderMoved = { .value = newValue, .previous = previous, .inDrag = slider->inDrag } };
|
||||||
|
EsMessageSend(slider, &m);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
EsSlider *EsSliderCreate(EsElement *parent, uint64_t flags, const EsStyle *style, double value, uint32_t steps) {
|
||||||
|
EsSlider *slider = (EsSlider *) EsHeapAllocate(sizeof(EsSlider), true);
|
||||||
|
slider->Initialise(parent, flags | ES_ELEMENT_FOCUSABLE, ProcessSliderMessage, style ?: ES_STYLE_SLIDER_TRACK);
|
||||||
|
slider->cName = "slider";
|
||||||
|
slider->point = EsCustomElementCreate(slider, ES_FLAGS_DEFAULT, ES_STYLE_SLIDER_POINT);
|
||||||
|
slider->point->messageUser = ProcessSliderPointMessage;
|
||||||
|
slider->steps = steps;
|
||||||
|
EsSliderSetValue(slider, value, false);
|
||||||
|
return slider;
|
||||||
|
}
|
||||||
|
|
||||||
// --------------------------------- Message loop and core UI infrastructure.
|
// --------------------------------- Message loop and core UI infrastructure.
|
||||||
|
|
||||||
void EsElement::PrintTree(int depth) {
|
void EsElement::PrintTree(int depth) {
|
||||||
|
|
|
@ -13,6 +13,7 @@ opaque_type EsSplitter EsElement;
|
||||||
opaque_type EsImageDisplay EsElement;
|
opaque_type EsImageDisplay EsElement;
|
||||||
opaque_type EsListDisplay EsElement;
|
opaque_type EsListDisplay EsElement;
|
||||||
opaque_type EsCanvasPane EsElement;
|
opaque_type EsCanvasPane EsElement;
|
||||||
|
opaque_type EsSlider EsElement;
|
||||||
opaque_type EsTextPlan none;
|
opaque_type EsTextPlan none;
|
||||||
opaque_type EsPaintTarget none;
|
opaque_type EsPaintTarget none;
|
||||||
opaque_type EsUndoManager none;
|
opaque_type EsUndoManager none;
|
||||||
|
@ -945,6 +946,7 @@ enum EsMessageType {
|
||||||
ES_MSG_COLOR_CHANGED = 0x3003 // Color well's color has changed. See message->colorChanged.
|
ES_MSG_COLOR_CHANGED = 0x3003 // Color well's color has changed. See message->colorChanged.
|
||||||
ES_MSG_LIST_DISPLAY_GET_MARKER = 0x3004 // Get the string for a marker in an EsListDisplay. See message->getContent.
|
ES_MSG_LIST_DISPLAY_GET_MARKER = 0x3004 // Get the string for a marker in an EsListDisplay. See message->getContent.
|
||||||
ES_MSG_REORDER_ITEM_TEST = 0x3005
|
ES_MSG_REORDER_ITEM_TEST = 0x3005
|
||||||
|
ES_MSG_SLIDER_MOVED = 0x3006 // The slider has been moved.
|
||||||
|
|
||||||
// Desktop messages:
|
// Desktop messages:
|
||||||
ES_MSG_POWER_BUTTON_PRESSED = 0x4801
|
ES_MSG_POWER_BUTTON_PRESSED = 0x4801
|
||||||
|
@ -1637,6 +1639,11 @@ struct EsMessageScrollbarMoved {
|
||||||
int scroll, previous;
|
int scroll, previous;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct EsMessageSliderMoved {
|
||||||
|
double value, previous;
|
||||||
|
bool inDrag;
|
||||||
|
};
|
||||||
|
|
||||||
struct EsMessageColorChanged {
|
struct EsMessageColorChanged {
|
||||||
uint32_t newColor;
|
uint32_t newColor;
|
||||||
bool pickerClosed;
|
bool pickerClosed;
|
||||||
|
@ -1782,6 +1789,7 @@ struct EsMessage {
|
||||||
|
|
||||||
// Specific element messages:
|
// Specific element messages:
|
||||||
EsMessageScrollbarMoved scrollbarMoved;
|
EsMessageScrollbarMoved scrollbarMoved;
|
||||||
|
EsMessageSliderMoved sliderMoved;
|
||||||
EsMessageColorChanged colorChanged;
|
EsMessageColorChanged colorChanged;
|
||||||
EsMessageNumberDragDelta numberDragDelta;
|
EsMessageNumberDragDelta numberDragDelta;
|
||||||
EsMessageNumberUpdated numberUpdated;
|
EsMessageNumberUpdated numberUpdated;
|
||||||
|
@ -2315,7 +2323,6 @@ function EsElement *EsButtonGetCheckBuddy(EsButton *button); // TODO Public pro
|
||||||
// Textboxes.
|
// Textboxes.
|
||||||
|
|
||||||
function EsTextbox *EsTextboxCreate(EsElement *parent, uint64_t flags = ES_FLAGS_DEFAULT, const EsStyle *style = ES_NULL);
|
function EsTextbox *EsTextboxCreate(EsElement *parent, uint64_t flags = ES_FLAGS_DEFAULT, const EsStyle *style = ES_NULL);
|
||||||
|
|
||||||
function bool EsTextboxFind(EsTextbox *textbox, STRING string, int32_t *line, int32_t *byte, uint32_t flags);
|
function bool EsTextboxFind(EsTextbox *textbox, STRING string, int32_t *line, int32_t *byte, uint32_t flags);
|
||||||
function void EsTextboxInsert(EsTextbox *textbox, STRING string = BLANK_STRING, bool sendUpdatedMessage = true); // Deletes existing selection first.
|
function void EsTextboxInsert(EsTextbox *textbox, STRING string = BLANK_STRING, bool sendUpdatedMessage = true); // Deletes existing selection first.
|
||||||
function char *EsTextboxGetContents(EsTextbox *textbox, size_t *bytes = ES_NULL, uint32_t flags = ES_FLAGS_DEFAULT); // Result will be zero-terminated; free with EsHeapFree.
|
function char *EsTextboxGetContents(EsTextbox *textbox, size_t *bytes = ES_NULL, uint32_t flags = ES_FLAGS_DEFAULT); // Result will be zero-terminated; free with EsHeapFree.
|
||||||
|
@ -2336,6 +2343,12 @@ function void EsTextboxSetTextStyle(EsTextbox *textbox, const EsTextStyle *textS
|
||||||
function void EsTextboxSetupSyntaxHighlighting(EsTextbox *textbox, uint32_t language, uint32_t *customColors = ES_NULL, size_t customColorCount = 0);
|
function void EsTextboxSetupSyntaxHighlighting(EsTextbox *textbox, uint32_t language, uint32_t *customColors = ES_NULL, size_t customColorCount = 0);
|
||||||
function void EsTextboxStartEdit(EsTextbox *textbox);
|
function void EsTextboxStartEdit(EsTextbox *textbox);
|
||||||
|
|
||||||
|
// Sliders.
|
||||||
|
|
||||||
|
function EsSlider *EsSliderCreate(EsElement *parent, uint64_t flags = ES_FLAGS_DEFAULT, const EsStyle *style = ES_NULL, double value = 0, uint32_t steps = 0);
|
||||||
|
function double EsSliderGetValue(EsSlider *slider);
|
||||||
|
function void EsSliderSetValue(EsSlider *slider, double newValue, bool sendUpdatedMessage = true);
|
||||||
|
|
||||||
// Panels, spacers and splitters.
|
// Panels, spacers and splitters.
|
||||||
|
|
||||||
function EsPanel *EsPanelCreate(EsElement *parent, uint64_t flags = ES_FLAGS_DEFAULT, const EsStyle *style = ES_NULL);
|
function EsPanel *EsPanelCreate(EsElement *parent, uint64_t flags = ES_FLAGS_DEFAULT, const EsStyle *style = ES_NULL);
|
||||||
|
|
|
@ -324,6 +324,15 @@ void SettingsPageMouse(EsElement *element, SettingsPage *page) {
|
||||||
// TODO Use a slider instead?
|
// TODO Use a slider instead?
|
||||||
SettingsAddNumberBox(table, INTERFACE_STRING(DesktopSettingsMouseSpeed), 'M', "general", "cursor_speed", -20, 20, nullptr, 0, 0.05);
|
SettingsAddNumberBox(table, INTERFACE_STRING(DesktopSettingsMouseSpeed), 'M', "general", "cursor_speed", -20, 20, nullptr, 0, 0.05);
|
||||||
|
|
||||||
|
table = EsPanelCreate(container, ES_CELL_H_FILL, &styleSettingsCheckboxGroup);
|
||||||
|
SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsMouseUseAcceleration), 'C', "general", "use_cursor_acceleration");
|
||||||
|
SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsMouseSlowOnAlt), 'O', "general", "use_cursor_alt_slow");
|
||||||
|
|
||||||
|
EsSpacerCreate(container, ES_CELL_H_FILL, ES_STYLE_BUTTON_GROUP_SEPARATOR);
|
||||||
|
|
||||||
|
table = EsPanelCreate(container, ES_CELL_H_FILL | ES_PANEL_TABLE | ES_PANEL_HORIZONTAL, &styleSettingsTable);
|
||||||
|
EsPanelSetBands(table, 2);
|
||||||
|
|
||||||
// TODO Mouse trails.
|
// TODO Mouse trails.
|
||||||
EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsMouseCursorTrails));
|
EsTextDisplayCreate(table, ES_CELL_H_RIGHT | ES_CELL_H_PUSH, 0, INTERFACE_STRING(DesktopSettingsMouseCursorTrails));
|
||||||
textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED, &styleSettingsNumberTextbox);
|
textbox = EsTextboxCreate(table, ES_CELL_H_LEFT | ES_CELL_H_PUSH | ES_TEXTBOX_EDIT_BASED, &styleSettingsNumberTextbox);
|
||||||
|
@ -342,8 +351,6 @@ void SettingsPageMouse(EsElement *element, SettingsPage *page) {
|
||||||
SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsMouseSwapLeftAndRightButtons), 'B', "general", "swap_left_and_right_buttons");
|
SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsMouseSwapLeftAndRightButtons), 'B', "general", "swap_left_and_right_buttons");
|
||||||
SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsMouseShowShadow), 'W', "general", "show_cursor_shadow");
|
SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsMouseShowShadow), 'W', "general", "show_cursor_shadow");
|
||||||
SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsMouseLocateCursorOnCtrl), 'L', "general", "locate_cursor_on_ctrl");
|
SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsMouseLocateCursorOnCtrl), 'L', "general", "locate_cursor_on_ctrl");
|
||||||
SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsMouseUseAcceleration), 'C', "general", "use_cursor_acceleration");
|
|
||||||
SettingsAddCheckbox(table, INTERFACE_STRING(DesktopSettingsMouseSlowOnAlt), 'O', "general", "use_cursor_alt_slow");
|
|
||||||
|
|
||||||
EsSpacerCreate(container, ES_CELL_H_FILL, ES_STYLE_BUTTON_GROUP_SEPARATOR);
|
EsSpacerCreate(container, ES_CELL_H_FILL, ES_STYLE_BUTTON_GROUP_SEPARATOR);
|
||||||
|
|
||||||
|
|
|
@ -88,6 +88,8 @@ define_private ES_STYLE_SCROLLBAR_THUMB_HORIZONTAL (ES_STYLE_CAST(1367))
|
||||||
define_private ES_STYLE_SCROLLBAR_THUMB_VERTICAL (ES_STYLE_CAST(1369))
|
define_private ES_STYLE_SCROLLBAR_THUMB_VERTICAL (ES_STYLE_CAST(1369))
|
||||||
define_private ES_STYLE_SCROLLBAR_PAD (ES_STYLE_CAST(1371))
|
define_private ES_STYLE_SCROLLBAR_PAD (ES_STYLE_CAST(1371))
|
||||||
define ES_STYLE_SEPARATOR_HORIZONTAL (ES_STYLE_CAST(1373))
|
define ES_STYLE_SEPARATOR_HORIZONTAL (ES_STYLE_CAST(1373))
|
||||||
|
define_private ES_STYLE_SLIDER_POINT (ES_STYLE_CAST(1607))
|
||||||
|
define_private ES_STYLE_SLIDER_TRACK (ES_STYLE_CAST(1601))
|
||||||
define_private ES_STYLE_SPLIT_BAR_HORIZONTAL (ES_STYLE_CAST(1375))
|
define_private ES_STYLE_SPLIT_BAR_HORIZONTAL (ES_STYLE_CAST(1375))
|
||||||
define_private ES_STYLE_SPLIT_BAR_VERTICAL (ES_STYLE_CAST(1377))
|
define_private ES_STYLE_SPLIT_BAR_VERTICAL (ES_STYLE_CAST(1377))
|
||||||
define_private ES_STYLE_TASK_BAR_BAR (ES_STYLE_CAST(1379))
|
define_private ES_STYLE_TASK_BAR_BAR (ES_STYLE_CAST(1379))
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -294,7 +294,9 @@ EsTextPlanGetLineCount=292
|
||||||
EsTextPlanDestroy=293
|
EsTextPlanDestroy=293
|
||||||
EsTextDisplaySetContents=294
|
EsTextDisplaySetContents=294
|
||||||
EsSystemConfigurationReadInteger=295
|
EsSystemConfigurationReadInteger=295
|
||||||
|
EsSliderCreate=296
|
||||||
EsSystemConfigurationReadString=297
|
EsSystemConfigurationReadString=297
|
||||||
|
EsSliderGetValue=298
|
||||||
EsGameControllerStatePoll=299
|
EsGameControllerStatePoll=299
|
||||||
EsInstanceDestroy=300
|
EsInstanceDestroy=300
|
||||||
EsRandomU8=301
|
EsRandomU8=301
|
||||||
|
@ -418,3 +420,4 @@ EsFontDatabaseInsertFile=418
|
||||||
EsFileStoreGetSize=419
|
EsFileStoreGetSize=419
|
||||||
EsFileStoreMap=420
|
EsFileStoreMap=420
|
||||||
EsTimerCancel=421
|
EsTimerCancel=421
|
||||||
|
EsSliderSetValue=422
|
||||||
|
|
Loading…
Reference in New Issue