processEvents
Parameters
- self:*ScrollBarWidget
- *ScrollBarWidget
- grabrs:Rect.Physical
- Rect.Physical
Source
Implementation
pub fn processEvents(self: *ScrollBarWidget, grabrs: Rect.Physical) void {
const rs = self.data().borderRectScale();
const evts = dvui.events();
for (evts) |*e| {
if (!dvui.eventMatchSimple(e, self.data()))
continue;
switch (e.evt) {
.mouse => |me| {
switch (me.action) {
.focus => {
if (self.focus_id) |fid| {
e.handle(@src(), self.data());
dvui.focusWidget(fid, null, e.num);
}
},
.press => {
if (me.button.pointer()) {
e.handle(@src(), self.data());
if (grabrs.contains(me.p)) {
// capture and start drag
dvui.captureMouse(self.data(), e.num);
switch (self.dir) {
.vertical => dvui.dragPreStart(me.button, me.p, .{ .cursor = .arrow, .offset = .{ .y = me.p.y - (grabrs.y + grabrs.h / 2) } }),
.horizontal => dvui.dragPreStart(me.button, me.p, .{ .cursor = .arrow, .offset = .{ .x = me.p.x - (grabrs.x + grabrs.w / 2) } }),
}
} else {
if (if (self.dir == .vertical) (me.p.y < grabrs.y) else (me.p.x < grabrs.x)) {
// clicked above grab
self.si.scrollPageUp(self.dir);
} else {
// clicked below grab
self.si.scrollPageDown(self.dir);
}
dvui.refresh(null, @src(), self.data().id);
}
}
},
.release => {
if (me.button.pointer()) {
e.handle(@src(), self.data());
// stop possible drag and capture
dvui.captureMouse(null, e.num);
dvui.dragEnd();
}
},
.motion => {
if (dvui.captured(self.data().id)) {
e.handle(@src(), self.data());
// move if dragging
if (dvui.dragging(me.p, null)) |dps| {
_ = dps;
const min = switch (self.dir) {
.vertical => rs.r.y + grabrs.h / 2,
.horizontal => rs.r.x + grabrs.w / 2,
};
const max = switch (self.dir) {
.vertical => rs.r.y + rs.r.h - grabrs.h / 2,
.horizontal => rs.r.x + rs.r.w - grabrs.w / 2,
};
const grabmid = switch (self.dir) {
.vertical => me.p.y - dvui.dragOffset().y,
.horizontal => me.p.x - dvui.dragOffset().x,
};
var f: f32 = 0;
if (max > min) {
f = (grabmid - min) / (max - min);
}
self.si.scrollToFraction(self.dir, f);
dvui.refresh(null, @src(), self.data().id);
}
}
},
.position => {
dvui.cursorSet(.arrow);
self.highlight = true;
},
.wheel_x => |ticks| {
if (self.dir == .horizontal) {
e.handle(@src(), self.data());
self.si.scrollByOffset(self.dir, -ticks);
dvui.refresh(null, @src(), self.data().id);
}
},
.wheel_y => |ticks| {
// Don't care about the direction, because "normal" wheel on
// horizontal scrollBar seems still natural to be scrolled
e.handle(@src(), self.data());
self.si.scrollByOffset(self.dir, -ticks);
dvui.refresh(null, @src(), self.data().id);
},
}
},
else => {},
}
}
}