[gnome-shell] levelBar: Factor out bar drawing
- From: Florian Müllner <fmuellner src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-shell] levelBar: Factor out bar drawing
- Date: Tue, 31 Jul 2018 18:20:44 +0000 (UTC)
commit c90a4e48493072f02b87c2538b395b1549353b34
Author: Didier Roche <didrocks ubuntu com>
Date: Thu Feb 8 19:04:42 2018 +0100
levelBar: Factor out bar drawing
Split drawing logic from Slider to BarLevel subclass.
This changes part of the theme css from -slider- to -barlevel-.
https://bugzilla.gnome.org/show_bug.cgi?id=790280.
data/theme/gnome-shell-sass/_common.scss | 12 +--
js/js-resources.gresource.xml | 1 +
js/ui/barLevel.js | 131 +++++++++++++++++++++++++++++++
js/ui/slider.js | 103 ++++--------------------
4 files changed, 153 insertions(+), 94 deletions(-)
---
diff --git a/data/theme/gnome-shell-sass/_common.scss b/data/theme/gnome-shell-sass/_common.scss
index 594badc63..de107d7b7 100644
--- a/data/theme/gnome-shell-sass/_common.scss
+++ b/data/theme/gnome-shell-sass/_common.scss
@@ -128,12 +128,12 @@ StScrollBar {
.slider {
height: 1em;
- -slider-height: 0.3em;
- -slider-background-color: $insensitive_bg_color; //background of the trough
- -slider-border-color: $borders_color; //trough border color
- -slider-active-background-color: $selected_bg_color; //active trough fill
- -slider-active-border-color: darken($selected_bg_color,10%); //active trough border
- -slider-border-width: 1px;
+ -barlevel-height: 0.3em;
+ -barlevel-background-color: $insensitive_bg_color; //background of the trough
+ -barlevel-border-color: $borders_color; //trough border color
+ -barlevel-active-background-color: $selected_bg_color; //active trough fill
+ -barlevel-active-border-color: darken($selected_bg_color,10%); //active trough border
+ -barlevel-border-width: 1px;
-slider-handle-radius: 6px;
}
diff --git a/js/js-resources.gresource.xml b/js/js-resources.gresource.xml
index cc1da4461..3c0feab60 100644
--- a/js/js-resources.gresource.xml
+++ b/js/js-resources.gresource.xml
@@ -43,6 +43,7 @@
<file>ui/audioDeviceSelection.js</file>
<file>ui/backgroundMenu.js</file>
<file>ui/background.js</file>
+ <file>ui/barLevel.js</file>
<file>ui/boxpointer.js</file>
<file>ui/calendar.js</file>
<file>ui/checkBox.js</file>
diff --git a/js/ui/barLevel.js b/js/ui/barLevel.js
new file mode 100644
index 000000000..c018ef31b
--- /dev/null
+++ b/js/ui/barLevel.js
@@ -0,0 +1,131 @@
+/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
+
+const Atk = imports.gi.Atk;
+const Cairo = imports.cairo;
+const Clutter = imports.gi.Clutter;
+const Lang = imports.lang;
+const St = imports.gi.St;
+const Signals = imports.signals;
+
+var BarLevel = new Lang.Class({
+ Name: "BarLevel",
+
+ _init(value, params) {
+ if (isNaN(value))
+ // Avoid spreading NaNs around
+ throw TypeError('The bar level value must be a number');
+ this._value = Math.max(Math.min(value, 1), 0);
+ this._barLevelWidth = 0;
+
+ if (params == undefined)
+ params = {}
+
+ this.actor = new St.DrawingArea({ styleClass: params['styleClass'] || 'barlevel',
+ can_focus: params['canFocus'] || false,
+ reactive: params['reactive'] || false,
+ accessible_role: params['accessibleRole'] || Atk.Role.LEVEL_BAR });
+ this.actor.connect('repaint', this._barLevelRepaint.bind(this));
+ this.actor.connect('allocation-changed', (actor, box) => {
+ this._barLevelWidth = box.get_width();
+ });
+
+ this._customAccessible = St.GenericAccessible.new_for_actor(this.actor);
+ this.actor.set_accessible(this._customAccessible);
+
+ this._customAccessible.connect('get-current-value', this._getCurrentValue.bind(this));
+ this._customAccessible.connect('get-minimum-value', this._getMinimumValue.bind(this));
+ this._customAccessible.connect('get-maximum-value', this._getMaximumValue.bind(this));
+ this._customAccessible.connect('set-current-value', this._setCurrentValue.bind(this));
+
+ this.connect('value-changed', this._valueChanged.bind(this));
+ },
+
+ setValue(value) {
+ if (isNaN(value))
+ throw TypeError('The bar level value must be a number');
+
+ this._value = Math.max(Math.min(value, 1), 0);
+ this.actor.queue_repaint();
+ },
+
+ _barLevelRepaint(area) {
+ let cr = area.get_context();
+ let themeNode = area.get_theme_node();
+ let [width, height] = area.get_surface_size();
+
+ let barLevelHeight = themeNode.get_length('-barlevel-height');
+ let barLevelBorderRadius = Math.min(width, barLevelHeight) / 2;
+ let fgColor = themeNode.get_foreground_color();
+
+ let barLevelColor = themeNode.get_color('-barlevel-background-color');
+ let barLevelActiveColor = themeNode.get_color('-barlevel-active-background-color');
+
+ let barLevelBorderWidth = themeNode.get_length('-barlevel-border-width');
+ let barLevelBorderColor = themeNode.get_color('-barlevel-border-color');
+ let barLevelActiveBorderColor = themeNode.get_color('-barlevel-active-border-color');
+
+ const TAU = Math.PI * 2;
+
+ let endX = barLevelBorderRadius + (width - 2 * barLevelBorderRadius) * this._value;
+
+ /* background bar */
+ cr.arc(width - barLevelBorderRadius - barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * 3
/ 4, TAU * 1 / 4);
+ cr.lineTo(endX, (height + barLevelHeight) / 2);
+ cr.lineTo(endX, (height - barLevelHeight) / 2);
+ cr.lineTo(width - barLevelBorderRadius - barLevelBorderWidth, (height - barLevelHeight) / 2);
+ Clutter.cairo_set_source_color(cr, barLevelColor);
+ cr.fillPreserve();
+ Clutter.cairo_set_source_color(cr, barLevelBorderColor);
+ cr.setLineWidth(barLevelBorderWidth);
+ cr.stroke();
+
+ /* normal progress bar */
+ cr.arc(barLevelBorderRadius + barLevelBorderWidth, height / 2, barLevelBorderRadius, TAU * 1 / 4,
TAU * 3 / 4);
+ cr.lineTo(endX, (height - barLevelHeight) / 2);
+ cr.lineTo(endX, (height + barLevelHeight) / 2);
+ cr.lineTo(barLevelBorderRadius + barLevelBorderWidth, (height + barLevelHeight) / 2);
+ Clutter.cairo_set_source_color(cr, barLevelActiveColor);
+ cr.fillPreserve();
+ Clutter.cairo_set_source_color(cr, barLevelActiveBorderColor);
+ cr.setLineWidth(barLevelBorderWidth);
+ cr.stroke();
+
+ /* end progress bar arc */
+ Clutter.cairo_set_source_color(cr, barLevelActiveColor);
+ cr.arc(endX, height / 2, barLevelBorderRadius, TAU * 3 / 4, TAU * 1 / 4);
+ cr.lineTo(Math.floor(endX), (height + barLevelHeight) / 2);
+ cr.lineTo(Math.floor(endX), (height - barLevelHeight) / 2);
+ cr.lineTo(endX, (height - barLevelHeight) / 2);
+ cr.fillPreserve();
+ cr.setLineWidth(barLevelBorderWidth);
+ cr.stroke();
+
+ cr.$dispose();
+ },
+
+ _getCurrentValue(actor) {
+ return this._value;
+ },
+
+ _getMinimumValue(actor) {
+ return 0;
+ },
+
+ _getMaximumValue(actor) {
+ return 1;
+ },
+
+ _setCurrentValue(actor, value) {
+ this._value = value;
+ },
+
+ _valueChanged(barLevel, value, property) {
+ this._customAccessible.notify("accessible-value");
+ },
+
+ get value() {
+ return this._value;
+ }
+});
+
+Signals.addSignalMethods(BarLevel.prototype);
diff --git a/js/ui/slider.js b/js/ui/slider.js
index 9853929eb..c1e2ea6a6 100644
--- a/js/ui/slider.js
+++ b/js/ui/slider.js
@@ -7,55 +7,38 @@ const Lang = imports.lang;
const St = imports.gi.St;
const Signals = imports.signals;
+const BarLevel = imports.ui.barLevel;
+
var SLIDER_SCROLL_STEP = 0.02; /* Slider scrolling step in % */
var Slider = new Lang.Class({
Name: "Slider",
+ Extends: BarLevel.BarLevel,
_init(value) {
- if (isNaN(value))
- // Avoid spreading NaNs around
- throw TypeError('The slider value must be a number');
- this._value = Math.max(Math.min(value, 1), 0);
- this._sliderWidth = 0;
-
- this.actor = new St.DrawingArea({ style_class: 'slider',
- can_focus: true,
- reactive: true,
- accessible_role: Atk.Role.SLIDER });
- this.actor.connect('repaint', this._sliderRepaint.bind(this));
+ let params = {
+ styleClass: 'slider',
+ canFocus: true,
+ reactive: true,
+ accessibleRole: Atk.Role.SLIDER,
+ }
+ this.parent(value, params)
+
this.actor.connect('button-press-event', this._startDragging.bind(this));
this.actor.connect('touch-event', this._touchDragging.bind(this));
this.actor.connect('scroll-event', this._onScrollEvent.bind(this));
this.actor.connect('key-press-event', this.onKeyPressEvent.bind(this));
- this.actor.connect('allocation-changed', (actor, box) => {
- this._sliderWidth = box.get_width();
- });
this._releaseId = this._motionId = 0;
this._dragging = false;
- this._customAccessible = St.GenericAccessible.new_for_actor(this.actor);
- this.actor.set_accessible(this._customAccessible);
-
- this._customAccessible.connect('get-current-value', this._getCurrentValue.bind(this));
- this._customAccessible.connect('get-minimum-value', this._getMinimumValue.bind(this));
- this._customAccessible.connect('get-maximum-value', this._getMaximumValue.bind(this));
this._customAccessible.connect('get-minimum-increment', this._getMinimumIncrement.bind(this));
- this._customAccessible.connect('set-current-value', this._setCurrentValue.bind(this));
-
- this.connect('value-changed', this._valueChanged.bind(this));
},
- setValue(value) {
- if (isNaN(value))
- throw TypeError('The slider value must be a number');
-
- this._value = Math.max(Math.min(value, 1), 0);
- this.actor.queue_repaint();
- },
+ _barLevelRepaint(area) {
+ this.parent(area);
- _sliderRepaint(area) {
+ // Add handle
let cr = area.get_context();
let themeNode = area.get_theme_node();
let [width, height] = area.get_surface_size();
@@ -66,41 +49,9 @@ var Slider = new Lang.Class({
let [hasHandleColor, handleBorderColor] =
themeNode.lookup_color('-slider-handle-border-color', false);
- let sliderHeight = themeNode.get_length('-slider-height');
-
- let sliderBorderWidth = themeNode.get_length('-slider-border-width');
- let sliderBorderRadius = Math.min(width, sliderHeight) / 2;
-
- let sliderBorderColor = themeNode.get_color('-slider-border-color');
- let sliderColor = themeNode.get_color('-slider-background-color');
-
- let sliderActiveBorderColor = themeNode.get_color('-slider-active-border-color');
- let sliderActiveColor = themeNode.get_color('-slider-active-background-color');
-
const TAU = Math.PI * 2;
let handleX = handleRadius + (width - 2 * handleRadius) * this._value;
-
- cr.arc(sliderBorderRadius + sliderBorderWidth, height / 2, sliderBorderRadius, TAU * 1/4, TAU * 3/4);
- cr.lineTo(handleX, (height - sliderHeight) / 2);
- cr.lineTo(handleX, (height + sliderHeight) / 2);
- cr.lineTo(sliderBorderRadius + sliderBorderWidth, (height + sliderHeight) / 2);
- Clutter.cairo_set_source_color(cr, sliderActiveColor);
- cr.fillPreserve();
- Clutter.cairo_set_source_color(cr, sliderActiveBorderColor);
- cr.setLineWidth(sliderBorderWidth);
- cr.stroke();
-
- cr.arc(width - sliderBorderRadius - sliderBorderWidth, height / 2, sliderBorderRadius, TAU * 3/4,
TAU * 1/4);
- cr.lineTo(handleX, (height + sliderHeight) / 2);
- cr.lineTo(handleX, (height - sliderHeight) / 2);
- cr.lineTo(width - sliderBorderRadius - sliderBorderWidth, (height - sliderHeight) / 2);
- Clutter.cairo_set_source_color(cr, sliderColor);
- cr.fillPreserve();
- Clutter.cairo_set_source_color(cr, sliderBorderColor);
- cr.setLineWidth(sliderBorderWidth);
- cr.stroke();
-
let handleY = height / 2;
let color = themeNode.get_foreground_color();
@@ -246,7 +197,7 @@ var Slider = new Lang.Class({
relX = absX - sliderX;
relY = absY - sliderY;
- let width = this._sliderWidth;
+ let width = this._barLevelWidth;
let handleRadius = this.actor.get_theme_node().get_length('-slider-handle-radius');
let newvalue;
@@ -261,33 +212,9 @@ var Slider = new Lang.Class({
this.emit('value-changed', this._value);
},
- _getCurrentValue(actor) {
- return this._value;
- },
-
- _getMinimumValue(actor) {
- return 0;
- },
-
- _getMaximumValue(actor) {
- return 1;
- },
-
_getMinimumIncrement(actor) {
return 0.1;
},
-
- _setCurrentValue(actor, value) {
- this._value = value;
- },
-
- _valueChanged(slider, value, property) {
- this._customAccessible.notify ("accessible-value");
- },
-
- get value() {
- return this._value;
- }
});
Signals.addSignalMethods(Slider.prototype);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]