feat(ags cursorbox): when release click outside box, don't run func
This commit is contained in:
parent
11f5eecbc2
commit
b255853935
2 changed files with 58 additions and 32 deletions
|
@ -3,6 +3,7 @@ import { Box, Icon, Label } from 'resource:///com/github/Aylur/ags/widget.js';
|
|||
|
||||
const DEFAULT_KB = 'at-translated-set-2-keyboard';
|
||||
|
||||
|
||||
export default () => Box({
|
||||
className: 'toggle-off',
|
||||
css: 'padding: 0 10px;',
|
||||
|
|
|
@ -1,49 +1,74 @@
|
|||
import Variable from 'resource:///com/github/Aylur/ags/variable.js';
|
||||
import { Button, EventBox } from 'resource:///com/github/Aylur/ags/widget.js';
|
||||
|
||||
import Gtk from 'gi://Gtk';
|
||||
import Gdk from 'gi://Gdk';
|
||||
const display = Gdk.Display.get_default();
|
||||
|
||||
|
||||
// TODO: wrap in another EventBox for disabled cursor
|
||||
export default ({
|
||||
isButton = false,
|
||||
reset = true,
|
||||
onHover = () => {},
|
||||
onHoverLost = () => {},
|
||||
onPrimaryClickRelease = () => {},
|
||||
...props
|
||||
}) => {
|
||||
if (!isButton) {
|
||||
return EventBox({
|
||||
...props,
|
||||
onHover: self => {
|
||||
if (!self.child.sensitive || !self.sensitive)
|
||||
self.window.set_cursor(Gdk.Cursor.new_from_name(display, 'not-allowed'));
|
||||
// Make this variable to know if the function should
|
||||
// be executed depending on where the click is released
|
||||
const CanRun = Variable(true);
|
||||
|
||||
else
|
||||
self.window.set_cursor(Gdk.Cursor.new_from_name(display, 'pointer'));
|
||||
const properties = {
|
||||
...props,
|
||||
onPrimaryClickRelease: self => {
|
||||
// Every click, do a one shot connect to
|
||||
// CanRun to wait for location of click
|
||||
const id = CanRun.connect('changed', () => {
|
||||
if (CanRun.value)
|
||||
onPrimaryClickRelease(self);
|
||||
|
||||
onHover(self);
|
||||
},
|
||||
onHoverLost: self => {
|
||||
if (reset)
|
||||
self.window.set_cursor(null);
|
||||
CanRun.disconnect(id);
|
||||
});
|
||||
},
|
||||
onHover: self => {
|
||||
if (!self.child.sensitive || !self.sensitive)
|
||||
self.window.set_cursor(Gdk.Cursor.new_from_name(display, 'not-allowed'));
|
||||
|
||||
onHoverLost(self);
|
||||
},
|
||||
});
|
||||
}
|
||||
else {
|
||||
return Button({
|
||||
...props,
|
||||
onHover: self => {
|
||||
if (!self.child.sensitive || !self.sensitive)
|
||||
self.window.set_cursor(Gdk.Cursor.new_from_name(display, 'not-allowed'));
|
||||
else
|
||||
self.window.set_cursor(Gdk.Cursor.new_from_name(display, 'pointer'));
|
||||
},
|
||||
onHoverLost: self => {
|
||||
if (reset)
|
||||
self.window.set_cursor(null);
|
||||
},
|
||||
});
|
||||
}
|
||||
else
|
||||
self.window.set_cursor(Gdk.Cursor.new_from_name(display, 'pointer'));
|
||||
|
||||
onHover(self);
|
||||
},
|
||||
onHoverLost: self => {
|
||||
if (reset)
|
||||
self.window.set_cursor(null);
|
||||
|
||||
onHoverLost(self);
|
||||
},
|
||||
};
|
||||
|
||||
let widget;
|
||||
if (!isButton)
|
||||
widget = EventBox(properties);
|
||||
else
|
||||
widget = Button(properties);
|
||||
|
||||
const gesture = Gtk.GestureLongPress.new(widget);
|
||||
|
||||
widget.connectTo(gesture, () => {
|
||||
const pointer = gesture.get_point(null);
|
||||
const x = pointer[1];
|
||||
const y = pointer[2];
|
||||
|
||||
if ((!x || !y) || x === 0 && y === 0)
|
||||
return;
|
||||
|
||||
CanRun.value = !(
|
||||
x > widget.get_allocated_width() ||
|
||||
y > widget.get_allocated_height()
|
||||
);
|
||||
}, 'end');
|
||||
|
||||
return widget;
|
||||
};
|
||||
|
|
Loading…
Reference in a new issue