cleanup: Use inheritance for Actor classes instead of composition
Remove the `this.actor = ...` and `this.actor._delegate = this` patterns in most of classes, by inheriting all the actor container classes. Uses interfaces when needed for making sure that multiple classes will implement some required methods or to avoid redefining the same code multiple times. https://gitlab.gnome.org/GNOME/gnome-shell/merge_requests/559
This commit is contained in:

committed by
Florian Müllner

parent
f67b409fc1
commit
c4c5c4fd5c
@ -118,18 +118,21 @@ var SlideLayout = GObject.registerClass({
|
||||
}
|
||||
});
|
||||
|
||||
var SlidingControl = class {
|
||||
constructor(params) {
|
||||
var SlidingControl = GObject.registerClass(
|
||||
class SlidingControl extends St.Widget {
|
||||
_init(params) {
|
||||
params = Params.parse(params, { slideDirection: SlideDirection.LEFT });
|
||||
|
||||
this._visible = true;
|
||||
this._inDrag = false;
|
||||
|
||||
this.layout = new SlideLayout();
|
||||
this.layout.slideDirection = params.slideDirection;
|
||||
this.actor = new St.Widget({ layout_manager: this.layout,
|
||||
style_class: 'overview-controls',
|
||||
clip_to_allocation: true });
|
||||
super._init({
|
||||
layout_manager: this.layout,
|
||||
style_class: 'overview-controls',
|
||||
clip_to_allocation: true
|
||||
});
|
||||
|
||||
this._visible = true;
|
||||
this._inDrag = false;
|
||||
|
||||
Main.overview.connect('hiding', this._onOverviewHiding.bind(this));
|
||||
|
||||
@ -147,20 +150,20 @@ var SlidingControl = class {
|
||||
}
|
||||
|
||||
_updateSlide() {
|
||||
this.actor.ease_property('@layout.slide-x', this._getSlide(), {
|
||||
this.ease_property('@layout.slide-x', this._getSlide(), {
|
||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||
duration: SIDE_CONTROLS_ANIMATION_TIME,
|
||||
});
|
||||
}
|
||||
|
||||
getVisibleWidth() {
|
||||
let child = this.actor.get_first_child();
|
||||
let child = this.get_first_child();
|
||||
let [, , natWidth] = child.get_preferred_size();
|
||||
return natWidth;
|
||||
}
|
||||
|
||||
_getTranslation() {
|
||||
let child = this.actor.get_first_child();
|
||||
let child = this.get_first_child();
|
||||
let direction = getRtlSlideDirection(this.layout.slideDirection, child);
|
||||
let visibleWidth = this.getVisibleWidth();
|
||||
|
||||
@ -186,7 +189,7 @@ var SlidingControl = class {
|
||||
return;
|
||||
|
||||
this.layout.translation_x = translationStart;
|
||||
this.actor.ease_property('@layout.translation-x', translationEnd, {
|
||||
this.ease_property('@layout.translation-x', translationEnd, {
|
||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD,
|
||||
duration: SIDE_CONTROLS_ANIMATION_TIME,
|
||||
});
|
||||
@ -218,7 +221,7 @@ var SlidingControl = class {
|
||||
}
|
||||
|
||||
fadeIn() {
|
||||
this.actor.ease({
|
||||
this.ease({
|
||||
opacity: 255,
|
||||
duration: SIDE_CONTROLS_ANIMATION_TIME / 2,
|
||||
mode: Clutter.AnimationMode.EASE_IN_QUAD
|
||||
@ -226,7 +229,7 @@ var SlidingControl = class {
|
||||
}
|
||||
|
||||
fadeHalf() {
|
||||
this.actor.ease({
|
||||
this.ease({
|
||||
opacity: 128,
|
||||
duration: SIDE_CONTROLS_ANIMATION_TIME / 2,
|
||||
mode: Clutter.AnimationMode.EASE_OUT_QUAD
|
||||
@ -249,37 +252,38 @@ var SlidingControl = class {
|
||||
// selector; this means we can now safely set the full slide for
|
||||
// the next page, since slideIn or slideOut might have been called,
|
||||
// changing the visiblity
|
||||
this.actor.remove_transition('@layout.slide-x');
|
||||
this.remove_transition('@layout.slide-x');
|
||||
this.layout.slide_x = this._getSlide();
|
||||
this._updateTranslation();
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
var ThumbnailsSlider = class extends SlidingControl {
|
||||
constructor(thumbnailsBox) {
|
||||
super({ slideDirection: SlideDirection.RIGHT });
|
||||
var ThumbnailsSlider = GObject.registerClass(
|
||||
class ThumbnailsSlider extends SlidingControl {
|
||||
_init(thumbnailsBox) {
|
||||
super._init({ slideDirection: SlideDirection.RIGHT });
|
||||
|
||||
this._thumbnailsBox = thumbnailsBox;
|
||||
|
||||
this.actor.request_mode = Clutter.RequestMode.WIDTH_FOR_HEIGHT;
|
||||
this.actor.reactive = true;
|
||||
this.actor.track_hover = true;
|
||||
this.actor.add_actor(this._thumbnailsBox);
|
||||
this.request_mode = Clutter.RequestMode.WIDTH_FOR_HEIGHT;
|
||||
this.reactive = true;
|
||||
this.track_hover = true;
|
||||
this.add_actor(this._thumbnailsBox);
|
||||
|
||||
Main.layoutManager.connect('monitors-changed', this._updateSlide.bind(this));
|
||||
global.workspace_manager.connect('active-workspace-changed',
|
||||
this._updateSlide.bind(this));
|
||||
global.workspace_manager.connect('notify::n-workspaces',
|
||||
this._updateSlide.bind(this));
|
||||
this.actor.connect('notify::hover', this._updateSlide.bind(this));
|
||||
this._thumbnailsBox.bind_property('visible', this.actor, 'visible', GObject.BindingFlags.SYNC_CREATE);
|
||||
this.connect('notify::hover', this._updateSlide.bind(this));
|
||||
this._thumbnailsBox.bind_property('visible', this, 'visible', GObject.BindingFlags.SYNC_CREATE);
|
||||
}
|
||||
|
||||
_getAlwaysZoomOut() {
|
||||
// Always show the pager on hover, during a drag, or if workspaces are
|
||||
// actually used, e.g. there are windows on any non-active workspace
|
||||
let workspaceManager = global.workspace_manager;
|
||||
let alwaysZoomOut = this.actor.hover ||
|
||||
let alwaysZoomOut = this.hover ||
|
||||
this._inDrag ||
|
||||
!Meta.prefs_get_dynamic_workspaces() ||
|
||||
workspaceManager.n_workspaces > 2 ||
|
||||
@ -304,12 +308,12 @@ var ThumbnailsSlider = class extends SlidingControl {
|
||||
}
|
||||
|
||||
getNonExpandedWidth() {
|
||||
let child = this.actor.get_first_child();
|
||||
let child = this.get_first_child();
|
||||
return child.get_theme_node().get_length('visible-width');
|
||||
}
|
||||
|
||||
_onDragEnd() {
|
||||
this.actor.sync_hover();
|
||||
this.sync_hover();
|
||||
super._onDragEnd();
|
||||
}
|
||||
|
||||
@ -321,7 +325,7 @@ var ThumbnailsSlider = class extends SlidingControl {
|
||||
if (alwaysZoomOut)
|
||||
return 1;
|
||||
|
||||
let child = this.actor.get_first_child();
|
||||
let child = this.get_first_child();
|
||||
let preferredHeight = child.get_preferred_height(-1)[1];
|
||||
let expandedWidth = child.get_preferred_width(preferredHeight)[1];
|
||||
|
||||
@ -335,24 +339,25 @@ var ThumbnailsSlider = class extends SlidingControl {
|
||||
else
|
||||
return this.getNonExpandedWidth();
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
var DashSlider = class extends SlidingControl {
|
||||
constructor(dash) {
|
||||
super({ slideDirection: SlideDirection.LEFT });
|
||||
var DashSlider = GObject.registerClass(
|
||||
class DashSlider extends SlidingControl {
|
||||
_init(dash) {
|
||||
super._init({ slideDirection: SlideDirection.LEFT });
|
||||
|
||||
this._dash = dash;
|
||||
|
||||
// SlideLayout reads the actor's expand flags to decide
|
||||
// whether to allocate the natural size to its child, or the whole
|
||||
// available allocation
|
||||
this._dash.actor.x_expand = true;
|
||||
this._dash.x_expand = true;
|
||||
|
||||
this.actor.x_expand = true;
|
||||
this.actor.x_align = Clutter.ActorAlign.START;
|
||||
this.actor.y_expand = true;
|
||||
this.x_expand = true;
|
||||
this.x_align = Clutter.ActorAlign.START;
|
||||
this.y_expand = true;
|
||||
|
||||
this.actor.add_actor(this._dash.actor);
|
||||
this.add_actor(this._dash);
|
||||
|
||||
this._dash.connect('icon-size-changed', this._updateSlide.bind(this));
|
||||
}
|
||||
@ -371,7 +376,7 @@ var DashSlider = class extends SlidingControl {
|
||||
_onWindowDragEnd() {
|
||||
this.fadeIn();
|
||||
}
|
||||
};
|
||||
});
|
||||
|
||||
var DashSpacer = GObject.registerClass(
|
||||
class DashSpacer extends St.Widget {
|
||||
@ -416,12 +421,21 @@ var ControlsLayout = GObject.registerClass({
|
||||
}
|
||||
});
|
||||
|
||||
var ControlsManager = class {
|
||||
constructor(searchEntry) {
|
||||
var ControlsManager = GObject.registerClass(
|
||||
class ControlsManager extends St.Widget {
|
||||
_init(searchEntry) {
|
||||
let layout = new ControlsLayout();
|
||||
super._init({
|
||||
layout_manager: layout,
|
||||
x_expand: true,
|
||||
y_expand: true,
|
||||
clip_to_allocation: true
|
||||
});
|
||||
|
||||
this.dash = new Dash.Dash();
|
||||
this._dashSlider = new DashSlider(this.dash);
|
||||
this._dashSpacer = new DashSpacer();
|
||||
this._dashSpacer.setDashActor(this._dashSlider.actor);
|
||||
this._dashSpacer.setDashActor(this._dashSlider);
|
||||
|
||||
this._thumbnailsBox = new WorkspaceThumbnail.ThumbnailsBox();
|
||||
this._thumbnailsSlider = new ThumbnailsSlider(this._thumbnailsBox);
|
||||
@ -431,20 +445,15 @@ var ControlsManager = class {
|
||||
this.viewSelector.connect('page-changed', this._setVisibility.bind(this));
|
||||
this.viewSelector.connect('page-empty', this._onPageEmpty.bind(this));
|
||||
|
||||
let layout = new ControlsLayout();
|
||||
this.actor = new St.Widget({ layout_manager: layout,
|
||||
x_expand: true, y_expand: true,
|
||||
clip_to_allocation: true });
|
||||
this._group = new St.BoxLayout({ name: 'overview-group',
|
||||
x_expand: true, y_expand: true });
|
||||
this.actor.add_actor(this._group);
|
||||
this.add_actor(this._group);
|
||||
|
||||
this.actor.add_actor(this._dashSlider.actor);
|
||||
this.add_actor(this._dashSlider);
|
||||
|
||||
this._group.add_actor(this._dashSpacer);
|
||||
this._group.add(this.viewSelector.actor, { x_fill: true,
|
||||
expand: true });
|
||||
this._group.add_actor(this._thumbnailsSlider.actor);
|
||||
this._group.add(this.viewSelector, { x_fill: true, expand: true });
|
||||
this._group.add_actor(this._thumbnailsSlider);
|
||||
|
||||
layout.connect('allocation-changed', this._updateWorkspacesGeometry.bind(this));
|
||||
|
||||
@ -452,18 +461,18 @@ var ControlsManager = class {
|
||||
}
|
||||
|
||||
_updateWorkspacesGeometry() {
|
||||
let [x, y] = this.actor.get_transformed_position();
|
||||
let [width, height] = this.actor.get_transformed_size();
|
||||
let [x, y] = this.get_transformed_position();
|
||||
let [width, height] = this.get_transformed_size();
|
||||
let geometry = { x: x, y: y, width: width, height: height };
|
||||
|
||||
let spacing = this.actor.get_theme_node().get_length('spacing');
|
||||
let spacing = this.get_theme_node().get_length('spacing');
|
||||
let dashWidth = this._dashSlider.getVisibleWidth() + spacing;
|
||||
let thumbnailsWidth = this._thumbnailsSlider.getNonExpandedWidth() + spacing;
|
||||
|
||||
geometry.width -= dashWidth;
|
||||
geometry.width -= thumbnailsWidth;
|
||||
|
||||
if (this.actor.get_text_direction() == Clutter.TextDirection.LTR)
|
||||
if (this.get_text_direction() == Clutter.TextDirection.LTR)
|
||||
geometry.x += dashWidth;
|
||||
else
|
||||
geometry.x += thumbnailsWidth;
|
||||
@ -510,4 +519,4 @@ var ControlsManager = class {
|
||||
|
||||
this._updateSpacerVisibility();
|
||||
}
|
||||
};
|
||||
});
|
||||
|
Reference in New Issue
Block a user