mirror of
https://github.com/Rafostar/clapper.git
synced 2025-08-31 00:11:59 +02:00
206 lines
4.5 KiB
JavaScript
206 lines
4.5 KiB
JavaScript
const { GObject, Gtk } = imports.gi;
|
|
|
|
var CustomButton = GObject.registerClass(
|
|
class ClapperCustomButton extends Gtk.Button
|
|
{
|
|
_init(opts)
|
|
{
|
|
opts = opts || {};
|
|
|
|
let defaults = {
|
|
margin_top: 4,
|
|
margin_bottom: 4,
|
|
margin_start: 2,
|
|
margin_end: 2,
|
|
can_focus: false,
|
|
};
|
|
Object.assign(opts, defaults);
|
|
|
|
super._init(opts);
|
|
|
|
this.floatUnaffected = false;
|
|
this.wantedVisible = true;
|
|
this.isFullscreen = false;
|
|
this.isFloating = false;
|
|
|
|
this.add_css_class('flat');
|
|
}
|
|
|
|
setFullscreenMode(isFullscreen)
|
|
{
|
|
if(this.isFullscreen === isFullscreen)
|
|
return;
|
|
|
|
this.margin_top = (isFullscreen) ? 5 : 4;
|
|
this.margin_start = (isFullscreen) ? 3 : 2;
|
|
this.margin_end = (isFullscreen) ? 3 : 2;
|
|
this.can_focus = isFullscreen;
|
|
|
|
this.isFullscreen = isFullscreen;
|
|
}
|
|
|
|
setFloatingMode(isFloating)
|
|
{
|
|
if(this.isFloating === isFloating)
|
|
return;
|
|
|
|
this.isFloating = isFloating;
|
|
|
|
if(this.floatUnaffected)
|
|
return;
|
|
|
|
if(isFloating)
|
|
super.set_visible(false);
|
|
else
|
|
super.set_visible(this.wantedVisible);
|
|
}
|
|
|
|
set_visible(isVisible)
|
|
{
|
|
this.wantedVisible = isVisible;
|
|
|
|
if(this.isFloating && !this.floatUnaffected)
|
|
super.set_visible(false);
|
|
else
|
|
super.set_visible(isVisible);
|
|
}
|
|
|
|
vfunc_clicked()
|
|
{
|
|
if(!this.isFullscreen)
|
|
return;
|
|
|
|
let { player } = this.get_ancestor(Gtk.Grid);
|
|
player._setHideControlsTimeout();
|
|
}
|
|
});
|
|
|
|
var IconButton = GObject.registerClass(
|
|
class ClapperIconButton extends CustomButton
|
|
{
|
|
_init(icon)
|
|
{
|
|
super._init({
|
|
icon_name: icon,
|
|
});
|
|
this.floatUnaffected = true;
|
|
}
|
|
|
|
setFullscreenMode(isFullscreen)
|
|
{
|
|
/* Redraw icon after style class change */
|
|
this.set_icon_name(this.icon_name);
|
|
super.setFullscreenMode(isFullscreen);
|
|
}
|
|
});
|
|
|
|
var IconToggleButton = GObject.registerClass(
|
|
class ClapperIconToggleButton extends IconButton
|
|
{
|
|
_init(primaryIcon, secondaryIcon)
|
|
{
|
|
super._init(primaryIcon);
|
|
|
|
this.primaryIcon = primaryIcon;
|
|
this.secondaryIcon = secondaryIcon;
|
|
}
|
|
|
|
setPrimaryIcon()
|
|
{
|
|
this.icon_name = this.primaryIcon;
|
|
}
|
|
|
|
setSecondaryIcon()
|
|
{
|
|
this.icon_name = this.secondaryIcon;
|
|
}
|
|
});
|
|
|
|
var LabelButton = GObject.registerClass(
|
|
class ClapperLabelButton extends CustomButton
|
|
{
|
|
_init(text)
|
|
{
|
|
super._init({
|
|
margin_start: 0,
|
|
margin_end: 0,
|
|
});
|
|
|
|
this.customLabel = new Gtk.Label({
|
|
label: text,
|
|
single_line_mode: true,
|
|
});
|
|
this.customLabel.add_css_class('labelbutton');
|
|
this.set_child(this.customLabel);
|
|
}
|
|
|
|
set_label(text)
|
|
{
|
|
this.customLabel.set_text(text);
|
|
}
|
|
});
|
|
|
|
var PopoverButton = GObject.registerClass(
|
|
class ClapperPopoverButton extends IconButton
|
|
{
|
|
_init(icon)
|
|
{
|
|
super._init(icon);
|
|
|
|
this.floatUnaffected = false;
|
|
this.popover = new Gtk.Popover({
|
|
position: Gtk.PositionType.TOP,
|
|
});
|
|
this.popoverBox = new Gtk.Box({
|
|
orientation: Gtk.Orientation.VERTICAL,
|
|
});
|
|
|
|
this.popover.set_child(this.popoverBox);
|
|
this.popover.set_offset(0, -this.margin_top);
|
|
|
|
if(this.isFullscreen)
|
|
this.popover.add_css_class('osd');
|
|
|
|
this.popover.connect('closed', this._onClosed.bind(this));
|
|
this.popover.set_parent(this);
|
|
}
|
|
|
|
setFullscreenMode(isFullscreen)
|
|
{
|
|
if(this.isFullscreen === isFullscreen)
|
|
return;
|
|
|
|
super.setFullscreenMode(isFullscreen);
|
|
|
|
this.popover.set_offset(0, -this.margin_top);
|
|
|
|
let cssClass = 'osd';
|
|
if(isFullscreen === this.popover.has_css_class(cssClass))
|
|
return;
|
|
|
|
let action = (isFullscreen) ? 'add' : 'remove';
|
|
this.popover[action + '_css_class'](cssClass);
|
|
}
|
|
|
|
vfunc_clicked()
|
|
{
|
|
super.vfunc_clicked();
|
|
|
|
this.set_state_flags(Gtk.StateFlags.CHECKED, false);
|
|
this.popover.popup();
|
|
}
|
|
|
|
_onClosed()
|
|
{
|
|
let { player } = this.get_ancestor(Gtk.Grid);
|
|
player.widget.grab_focus();
|
|
|
|
this.unset_state_flags(Gtk.StateFlags.CHECKED);
|
|
}
|
|
|
|
_onCloseRequest()
|
|
{
|
|
this.popover.unparent();
|
|
}
|
|
});
|