Add left and right running indicator options

This commit is contained in:
Charles Gagnon
2019-09-05 22:58:48 -04:00
parent f02744ceef
commit d3785e1eb7
6 changed files with 119 additions and 65 deletions

View File

@@ -5060,9 +5060,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="xalign">0</property>
<property name="active">True</property>
<property name="draw_indicator">True</property>
<signal name="toggled" handler="dots_bottom_button_toggled_cb" swapped="no"/>
@@ -5070,7 +5068,7 @@
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
<property name="position">0</property>
</packing>
</child>
<child>
@@ -5079,20 +5077,52 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="xalign">0</property>
<property name="image_position">bottom</property>
<property name="draw_indicator">True</property>
<property name="group">dots_bottom_button</property>
<signal name="toggled" handler="dots_top_button_toggled_cb" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="dots_left_button">
<property name="label" translatable="yes">Left</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="valign">center</property>
<property name="draw_indicator">True</property>
<property name="group">dots_bottom_button</property>
<signal name="toggled" handler="dots_left_button_toggled_cb" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">2</property>
</packing>
</child>
<child>
<object class="GtkRadioButton" id="dots_right_button">
<property name="label" translatable="yes">Right</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">False</property>
<property name="valign">center</property>
<property name="draw_indicator">True</property>
<property name="group">dots_bottom_button</property>
<signal name="toggled" handler="dots_right_button_toggled_cb" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>

View File

@@ -66,7 +66,9 @@ let DOT_STYLE = {
let DOT_POSITION = {
TOP: "TOP",
BOTTOM: "BOTTOM"
BOTTOM: "BOTTOM",
LEFT: 'LEFT',
RIGHT: 'RIGHT'
}
let recentlyClickedAppLoopId = 0;
@@ -132,9 +134,15 @@ var taskbarAppIcon = Utils.defineClass({
let isVertical = Panel.checkIfVertical();
let dtpIconContainerOpts = { layout_manager: new Clutter.BinLayout() };
if (!this._isGroupApps) {
dtpIconContainerOpts.style = 'padding: ' + (isVertical ? '4px' : '0 4px');
}
this._container = new St.Widget({ style_class: 'dtp-container', layout_manager: new Clutter.BinLayout() });
this._dotsContainer = new St.Widget({ layout_manager: new Clutter.BinLayout() });
this._dtpIconContainer = new St.Widget({ style: 'padding: ' + (isVertical ? '4px 0' : '0 4px'), layout_manager: new Clutter.BinLayout() });
this._dtpIconContainer = new St.Widget(dtpIconContainerOpts);
this.actor.remove_actor(this._iconContainer);
@@ -209,7 +217,7 @@ var taskbarAppIcon = Utils.defineClass({
this._dtpSettingsSignalIds = [
Me.settings.connect('changed::dot-position', Lang.bind(this, this._settingsChangeRefresh)),
Me.settings.connect('changed::dot-size', Lang.bind(this, this._updateDotSize)),
Me.settings.connect('changed::dot-size', Lang.bind(this, this._settingsChangeRefresh)),
Me.settings.connect('changed::dot-style-focused', Lang.bind(this, this._settingsChangeRefresh)),
Me.settings.connect('changed::dot-style-unfocused', Lang.bind(this, this._settingsChangeRefresh)),
Me.settings.connect('changed::dot-color-dominant', Lang.bind(this, this._settingsChangeRefresh)),
@@ -376,7 +384,6 @@ var taskbarAppIcon = Utils.defineClass({
this._focusedDots = new St.Widget({
layout_manager: new Clutter.BinLayout(),
x_expand: true, y_expand: true,
height: this._getRunningIndicatorHeight(),
visible: false
});
@@ -385,9 +392,10 @@ var taskbarAppIcon = Utils.defineClass({
this.actor.disconnect(mappedId);
});
} else {
this._focusedDots = new St.DrawingArea({ width:1, y_expand: true });
let dotsOpts = { width: 1, y_expand: true, pivot_point: new Clutter.Point({ x: .5, y: .5 }) };
this._focusedDots = new St.DrawingArea(dotsOpts),
this._focusedDots._tweeningToWidth = null;
this._unfocusedDots = new St.DrawingArea({width:1, y_expand: true});
this._unfocusedDots = new St.DrawingArea(dotsOpts);
this._unfocusedDots._tweeningToWidth = null;
this._focusedDots.connect('repaint', Lang.bind(this, function() {
@@ -418,14 +426,6 @@ var taskbarAppIcon = Utils.defineClass({
this._dotsContainer.add_child(this._focusedDots);
},
_updateDotSize: function() {
if (!this._isGroupApps) {
this._focusedDots.height = this._getRunningIndicatorHeight();
}
this._settingsChangeRefresh();
},
_settingsChangeRefresh: function() {
if (this._isGroupApps) {
this._updateWindows();
@@ -449,7 +449,6 @@ var taskbarAppIcon = Utils.defineClass({
this._windowTitle.clutter_text.natural_width_set = useFixedWidth;
this._windowTitle.set_style('font-size: ' + Me.settings.get_int('group-apps-label-font-size') + 'px;' +
'font-weight: ' + fontWeight + ';' +
(Panel.checkIfVertical() ? 'padding-left: 4px;' : '') +
(useFixedWidth ? '' : 'max-width: ' + maxLabelWidth + 'px;') +
'color: ' + Me.settings.get_string('group-apps-label-font-color'));
}
@@ -587,20 +586,26 @@ var taskbarAppIcon = Utils.defineClass({
_displayProperIndicator: function (force) {
let isFocused = this._isFocusedWindow();
let position = Me.settings.get_string('dot-position');
this._setIconStyle(isFocused);
if(!this._isGroupApps) {
if (this.window && (Me.settings.get_boolean('group-apps-underline-unfocused') || isFocused)) {
let dotPosition = Me.settings.get_string('dot-position');
let align = Clutter.ActorAlign[position == DOT_POSITION.TOP || position == DOT_POSITION.LEFT ? 'START' : 'END'];
this._focusedDots.y_align = dotPosition == DOT_POSITION.TOP ? Clutter.ActorAlign.START : Clutter.ActorAlign.END;
this._focusedDots.set_size(0, 0);
this._focusedDots[position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM ? 'height' : 'width'] = this._getRunningIndicatorSize();
this._focusedDots.y_align = this._focusedDots.x_align = Clutter.ActorAlign.FILL;
this._focusedDots[(position == DOT_POSITION.TOP || position == DOT_POSITION.BOTTOM ? 'y' : 'x') + '_align'] = align;
this._focusedDots.background_color = this._getRunningIndicatorColor(isFocused);
this._focusedDots.show();
} else if (this._focusedDots.visible) {
this._focusedDots.hide();
}
} else {
let rotation = 0;
let containerWidth = this._container.width;
let focusedDotStyle = Me.settings.get_string('dot-style-focused');
let unfocusedDotStyle = Me.settings.get_string('dot-style-unfocused');
@@ -622,6 +627,16 @@ var taskbarAppIcon = Utils.defineClass({
this.actor.remove_style_class_name('focused');
}
});
if (position == DOT_POSITION.BOTTOM) {
rotation = 180;
} else if (position == DOT_POSITION.LEFT) {
rotation = 270;
} else if (position == DOT_POSITION.RIGHT) {
rotation = 90;
}
this._focusedDots.rotation_angle_z = this._unfocusedDots.rotation_angle_z = rotation;
if(focusedIsWide) {
newFocusedDotsWidth = (isFocused && this._nWindows > 0) ? containerWidth : 0;
@@ -911,7 +926,7 @@ var taskbarAppIcon = Utils.defineClass({
return Math.min(this._nWindows, MAX_INDICATORS);
},
_getRunningIndicatorHeight: function() {
_getRunningIndicatorSize: function() {
return Me.settings.get_int('dot-size') * St.ThemeContext.get_for_stage(global.stage).scale_factor;
},
@@ -970,16 +985,14 @@ var taskbarAppIcon = Utils.defineClass({
let bodyColor = this._getRunningIndicatorColor(isFocused);
let [width, height] = area.get_surface_size();
let cr = area.get_context();
let size = this._getRunningIndicatorHeight();
let padding = 0; // distance from the margin
let yOffset = Me.settings.get_string('dot-position') == DOT_POSITION.TOP ? 0 : (height - padding - size);
let size = this._getRunningIndicatorSize();
if(type == DOT_STYLE.DOTS) {
// Draw the required numbers of dots
let radius = size/2;
let spacing = Math.ceil(width/18); // separation between the dots
cr.translate((width - (2*n)*radius - (n-1)*spacing)/2, yOffset);
cr.translate((width - (2*n)*radius - (n-1)*spacing)/2, 0);
Clutter.cairo_set_source_color(cr, bodyColor);
for (let i = 0; i < n; i++) {
@@ -990,7 +1003,7 @@ var taskbarAppIcon = Utils.defineClass({
} else if(type == DOT_STYLE.SQUARES) {
let spacing = Math.ceil(width/18); // separation between the dots
cr.translate(Math.floor((width - n*size - (n-1)*spacing)/2), yOffset);
cr.translate(Math.floor((width - n*size - (n-1)*spacing)/2), 0);
Clutter.cairo_set_source_color(cr, bodyColor);
for (let i = 0; i < n; i++) {
@@ -1002,7 +1015,7 @@ var taskbarAppIcon = Utils.defineClass({
let spacing = Math.ceil(width/18); // separation between the dots
let dashLength = Math.floor(width/4) - spacing;
cr.translate(Math.floor((width - n*dashLength - (n-1)*spacing)/2), yOffset);
cr.translate(Math.floor((width - n*dashLength - (n-1)*spacing)/2), 0);
Clutter.cairo_set_source_color(cr, bodyColor);
for (let i = 0; i < n; i++) {
@@ -1014,7 +1027,7 @@ var taskbarAppIcon = Utils.defineClass({
let spacing = Math.ceil(width/18); // separation between the dots
let dashLength = Math.ceil((width - ((n-1)*spacing))/n);
cr.translate(0, yOffset);
cr.translate(0, 0);
Clutter.cairo_set_source_color(cr, bodyColor);
for (let i = 0; i < n; i++) {
@@ -1026,7 +1039,7 @@ var taskbarAppIcon = Utils.defineClass({
let spacing = size; // separation between the dots
let lineLength = width - (size*(n-1)) - (spacing*(n-1));
cr.translate(0, yOffset);
cr.translate(0, 0);
Clutter.cairo_set_source_color(cr, bodyColor);
cr.newSubPath();
@@ -1038,7 +1051,7 @@ var taskbarAppIcon = Utils.defineClass({
cr.fill();
} else if (type == DOT_STYLE.METRO) {
if(n <= 1) {
cr.translate(0, yOffset);
cr.translate(0, 0);
Clutter.cairo_set_source_color(cr, bodyColor);
cr.newSubPath();
cr.rectangle(0, 0, width, size);
@@ -1049,7 +1062,7 @@ var taskbarAppIcon = Utils.defineClass({
let blackenedColor = bodyColor.shade(.3);
let darkenedColor = bodyColor.shade(.7);
cr.translate(0, yOffset);
cr.translate(0, 0);
Clutter.cairo_set_source_color(cr, bodyColor);
cr.newSubPath();
@@ -1065,7 +1078,7 @@ var taskbarAppIcon = Utils.defineClass({
cr.fill();
}
} else { // solid
cr.translate(0, yOffset);
cr.translate(0, 0);
Clutter.cairo_set_source_color(cr, bodyColor);
cr.newSubPath();
cr.rectangle(0, 0, width, size);

View File

@@ -60,6 +60,7 @@ let tracker = Shell.WindowTracker.get_default();
var sizeFunc;
var fixedCoord;
var varCoord;
var size;
function getPosition() {
let position = Me.settings.get_string('panel-position');
@@ -99,18 +100,6 @@ var dtpPanelWrapper = Utils.defineClass({
Utils.wrapActor(this.panel);
Utils.wrapActor(this.panel.statusArea.activities || 0);
if (!isSecondary) {
if (checkIfVertical()) {
sizeFunc = 'get_preferred_height',
fixedCoord = { c1: 'x1', c2: 'x2' },
varCoord = { c1: 'y1', c2: 'y2' };
} else {
sizeFunc = 'get_preferred_width';
fixedCoord = { c1: 'y1', c2: 'y2' };
varCoord = { c1: 'x1', c2: 'x2' };
}
}
},
enable : function() {
@@ -454,8 +443,7 @@ var dtpPanelWrapper = Utils.defineClass({
_bindSettingsChanges: function() {
this._dtpSettingsSignalIds = [
Me.settings.connect('changed::panel-size', Lang.bind(this, function() {
this._setPanelPosition();
this.taskbar.resetAppIcons();
this._resetGeometry();
})),
Me.settings.connect('changed::appicon-margin', Lang.bind(this, function() {
@@ -482,14 +470,13 @@ var dtpPanelWrapper = Utils.defineClass({
this._displayShowDesktopButton(Me.settings.get_boolean('show-showdesktop-button'));
})),
Me.settings.connect('changed::showdesktop-button-width', () => this._setShowDesktopButtonWidth())
Me.settings.connect('changed::showdesktop-button-width', () => this._setShowDesktopButtonWidth()),
Me.settings.connect('changed::group-apps', () => this._resetGeometry())
];
if (checkIfVertical()) {
this._dtpSettingsSignalIds.push(
Me.settings.connect('changed::group-apps-label-max-width', () => this._resetGeometry()),
Me.settings.connect('changed::group-apps', () => this._resetGeometry()),
);
this._dtpSettingsSignalIds.push(Me.settings.connect('changed::group-apps-label-max-width', () => this._resetGeometry()));
}
},
@@ -508,19 +495,30 @@ var dtpPanelWrapper = Utils.defineClass({
},
_getGeometry: function() {
let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor || 1;
let position = getPosition();
let size = Me.settings.get_int('panel-size');
let x = 0, y = 0;
let w = 0, h = 0;
size = Me.settings.get_int('panel-size') * scaleFactor;
if (checkIfVertical()) {
if (!Me.settings.get_boolean('group-apps')) {
size += Me.settings.get_int('group-apps-label-max-width');
// add 8 for the 4px css side padding of _dtpIconContainer when vertical
size += Me.settings.get_int('group-apps-label-max-width') + 8 / scaleFactor;
}
sizeFunc = 'get_preferred_height',
fixedCoord = { c1: 'x1', c2: 'x2' },
varCoord = { c1: 'y1', c2: 'y2' };
w = size;
h = this.monitor.height;
} else {
sizeFunc = 'get_preferred_width';
fixedCoord = { c1: 'y1', c2: 'y2' };
varCoord = { c1: 'x1', c2: 'x2' };
w = this.monitor.width;
h = size;
}
@@ -539,8 +537,7 @@ var dtpPanelWrapper = Utils.defineClass({
return {
x: x, y: y,
w: w, h: h,
position: position,
size: size * (St.ThemeContext.get_for_stage(global.stage).scale_factor || 1)
position: position
};
},

View File

@@ -309,7 +309,7 @@ var dtpPanelManager = Utils.defineClass({
_getBoxPointerPreferredHeight: function(boxPointer, alloc, monitor) {
if (boxPointer._dtpInPanel && boxPointer.sourceActor && Me.settings.get_boolean('intellihide')) {
monitor = monitor || Main.layoutManager.findMonitorForActor(boxPointer.sourceActor);
let excess = alloc.natural_size + Me.settings.get_int('panel-size') + 10 - monitor.height; // 10 is arbitrary
let excess = alloc.natural_size + Panel.size + 10 - monitor.height; // 10 is arbitrary
if (excess > 0) {
alloc.natural_size -= excess;

View File

@@ -256,7 +256,12 @@ const Settings = new Lang.Class({
case 'TOP':
this._builder.get_object('dots_top_button').set_active(true);
break;
case 'LEFT':
this._builder.get_object('dots_left_button').set_active(true);
break;
case 'RIGHT':
this._builder.get_object('dots_right_button').set_active(true);
break;
}
this._builder.get_object('dot_style_focused_combo').set_active_id(this._settings.get_string('dot-style-focused'));
@@ -1809,6 +1814,16 @@ const Settings = new Lang.Class({
this._settings.set_string('dot-position', "TOP");
},
dots_left_button_toggled_cb: function(button) {
if (button.get_active())
this._settings.set_string('dot-position', "LEFT");
},
dots_right_button_toggled_cb: function(button) {
if (button.get_active())
this._settings.set_string('dot-position', "RIGHT");
},
preview_title_position_bottom_button_toggled_cb: function(button) {
if (button.get_active())
this._settings.set_string('window-preview-title-position', 'BOTTOM');

View File

@@ -78,7 +78,7 @@ var PreviewMenu = Utils.defineClass({
this.isVertical = geom.position == St.Side.LEFT || geom.position == St.Side.RIGHT;
this._translationProp = 'translation_' + (this.isVertical ? 'x' : 'y');
this._translationDirection = (geom.position == St.Side.TOP || geom.position == St.Side.LEFT ? -1 : 1);
this._translationOffset = Math.min(Me.settings.get_int('panel-size'), MAX_TRANSLATION) * this._translationDirection;
this._translationOffset = Math.min(Panel.size, MAX_TRANSLATION) * this._translationDirection;
this.menu = new St.Widget({
name: 'preview-menu',
@@ -417,7 +417,6 @@ var PreviewMenu = Utils.defineClass({
let x, y, w, h;
let geom = this._panelWrapper.geom;
let panelBoxTheme = this._panelWrapper.panelBox.get_theme_node();
let panelSize = geom.size;
let previewSize = (Me.settings.get_int('window-preview-size') +
Me.settings.get_int('window-preview-padding') * 2) * scaleFactor;
@@ -432,13 +431,13 @@ var PreviewMenu = Utils.defineClass({
}
if (geom.position == St.Side.LEFT) {
x = this._panelWrapper.monitor.x + panelSize + panelBoxTheme.get_padding(St.Side.LEFT);
x = this._panelWrapper.monitor.x + Panel.size + panelBoxTheme.get_padding(St.Side.LEFT);
} else if (geom.position == St.Side.RIGHT) {
x = this._panelWrapper.monitor.x + this._panelWrapper.monitor.width - (panelSize + previewSize) - panelBoxTheme.get_padding(St.Side.RIGHT);
x = this._panelWrapper.monitor.x + this._panelWrapper.monitor.width - (Panel.size + previewSize) - panelBoxTheme.get_padding(St.Side.RIGHT);
} else if (geom.position == St.Side.TOP) {
y = this._panelWrapper.monitor.y + panelSize + panelBoxTheme.get_padding(St.Side.TOP);
y = this._panelWrapper.monitor.y + Panel.size + panelBoxTheme.get_padding(St.Side.TOP);
} else { //St.Side.BOTTOM
y = this._panelWrapper.monitor.y + this._panelWrapper.monitor.height - (panelSize + panelBoxTheme.get_padding(St.Side.BOTTOM) + previewSize + headerHeight);
y = this._panelWrapper.monitor.y + this._panelWrapper.monitor.height - (Panel.size + panelBoxTheme.get_padding(St.Side.BOTTOM) + previewSize + headerHeight);
}
Utils.setClip(this, x, y, w, h);