popupMenu: Remove combo boxes and child menus
They're no longer used with the removal of the avatar widget. https://bugzilla.gnome.org/show_bug.cgi?id=704368
This commit is contained in:
parent
d802416dae
commit
3816db03f5
@ -189,13 +189,6 @@ StScrollBar StButton#vhandle:active {
|
|||||||
border-width: 0px;
|
border-width: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.popup-combo-menu {
|
|
||||||
background-color: rgba(0,0,0,0.9);
|
|
||||||
padding: 1em 0em;
|
|
||||||
border: 1px solid #5f5f5f;
|
|
||||||
border-radius: 9px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* The remaining popup-menu sizing is all done in ems, so that if you
|
/* The remaining popup-menu sizing is all done in ems, so that if you
|
||||||
* override .popup-menu.font-size, everything else will scale with it.
|
* override .popup-menu.font-size, everything else will scale with it.
|
||||||
*/
|
*/
|
||||||
@ -219,10 +212,6 @@ StScrollBar StButton#vhandle:active {
|
|||||||
.popup-image-menu-item {
|
.popup-image-menu-item {
|
||||||
}
|
}
|
||||||
|
|
||||||
.popup-combobox-item {
|
|
||||||
spacing: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.popup-separator-menu-item {
|
.popup-separator-menu-item {
|
||||||
-gradient-height: 1px;
|
-gradient-height: 1px;
|
||||||
-gradient-start: rgba(255,255,255,0.0);
|
-gradient-start: rgba(255,255,255,0.0);
|
||||||
|
@ -130,18 +130,16 @@ const PopupBaseMenuItem = new Lang.Class({
|
|||||||
this.emit('activate', event);
|
this.emit('activate', event);
|
||||||
},
|
},
|
||||||
|
|
||||||
setActive: function (active, params) {
|
setActive: function (active) {
|
||||||
let activeChanged = active != this.active;
|
let activeChanged = active != this.active;
|
||||||
params = Params.parse (params, { grabKeyboard: true });
|
|
||||||
|
|
||||||
if (activeChanged) {
|
if (activeChanged) {
|
||||||
this.active = active;
|
this.active = active;
|
||||||
if (active) {
|
if (active) {
|
||||||
this.actor.add_style_pseudo_class('active');
|
this.actor.add_style_pseudo_class('active');
|
||||||
if (params.grabKeyboard)
|
|
||||||
this.actor.grab_key_focus();
|
this.actor.grab_key_focus();
|
||||||
} else
|
} else {
|
||||||
this.actor.remove_style_pseudo_class('active');
|
this.actor.remove_style_pseudo_class('active');
|
||||||
|
}
|
||||||
this.emit('active-changed', active);
|
this.emit('active-changed', active);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -735,10 +733,6 @@ const PopupMenuBase = new Lang.Class({
|
|||||||
return !hasVisibleChildren;
|
return !hasVisibleChildren;
|
||||||
},
|
},
|
||||||
|
|
||||||
isChildMenu: function() {
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
itemActivated: function(animate) {
|
itemActivated: function(animate) {
|
||||||
if (animate == undefined)
|
if (animate == undefined)
|
||||||
animate = BoxPointer.PopupAnimation.FULL;
|
animate = BoxPointer.PopupAnimation.FULL;
|
||||||
@ -1039,7 +1033,6 @@ const PopupMenu = new Lang.Class({
|
|||||||
global.focus_manager.add_group(this.actor);
|
global.focus_manager.add_group(this.actor);
|
||||||
this.actor.reactive = true;
|
this.actor.reactive = true;
|
||||||
|
|
||||||
this._childMenus = [];
|
|
||||||
this._openedSubMenu = null;
|
this._openedSubMenu = null;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1074,28 +1067,6 @@ const PopupMenu = new Lang.Class({
|
|||||||
this._boxPointer.setSourceAlignment(alignment);
|
this._boxPointer.setSourceAlignment(alignment);
|
||||||
},
|
},
|
||||||
|
|
||||||
isChildMenu: function(menu) {
|
|
||||||
return this._childMenus.indexOf(menu) != -1;
|
|
||||||
},
|
|
||||||
|
|
||||||
addChildMenu: function(menu) {
|
|
||||||
if (this.isChildMenu(menu))
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._childMenus.push(menu);
|
|
||||||
this.emit('child-menu-added', menu);
|
|
||||||
},
|
|
||||||
|
|
||||||
removeChildMenu: function(menu) {
|
|
||||||
let index = this._childMenus.indexOf(menu);
|
|
||||||
|
|
||||||
if (index == -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._childMenus.splice(index, 1);
|
|
||||||
this.emit('child-menu-removed', menu);
|
|
||||||
},
|
|
||||||
|
|
||||||
open: function(animate) {
|
open: function(animate) {
|
||||||
if (this.isOpen)
|
if (this.isOpen)
|
||||||
return;
|
return;
|
||||||
@ -1117,10 +1088,6 @@ const PopupMenu = new Lang.Class({
|
|||||||
if (this._activeMenuItem)
|
if (this._activeMenuItem)
|
||||||
this._activeMenuItem.setActive(false);
|
this._activeMenuItem.setActive(false);
|
||||||
|
|
||||||
this._childMenus.forEach(function(childMenu) {
|
|
||||||
childMenu.close();
|
|
||||||
});
|
|
||||||
|
|
||||||
if (this._boxPointer.actor.visible) {
|
if (this._boxPointer.actor.visible) {
|
||||||
this._boxPointer.hide(animate, Lang.bind(this, function() {
|
this._boxPointer.hide(animate, Lang.bind(this, function() {
|
||||||
this.emit('menu-closed');
|
this.emit('menu-closed');
|
||||||
@ -1144,10 +1111,6 @@ const PopupDummyMenu = new Lang.Class({
|
|||||||
this.actor._delegate = this;
|
this.actor._delegate = this;
|
||||||
},
|
},
|
||||||
|
|
||||||
isChildMenu: function() {
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
getSensitive: function() {
|
getSensitive: function() {
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
@ -1412,247 +1375,6 @@ const PopupSubMenuMenuItem = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const PopupComboMenu = new Lang.Class({
|
|
||||||
Name: 'PopupComboMenu',
|
|
||||||
Extends: PopupMenuBase,
|
|
||||||
|
|
||||||
_init: function(sourceActor) {
|
|
||||||
this.parent(sourceActor, 'popup-combo-menu');
|
|
||||||
|
|
||||||
this.actor = this.box;
|
|
||||||
this.actor._delegate = this;
|
|
||||||
this.actor.connect('key-focus-in', Lang.bind(this, this._onKeyFocusIn));
|
|
||||||
sourceActor.connect('style-changed',
|
|
||||||
Lang.bind(this, this._onSourceActorStyleChanged));
|
|
||||||
this._activeItemPos = -1;
|
|
||||||
global.focus_manager.add_group(this.actor);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onKeyFocusIn: function(actor) {
|
|
||||||
let items = this._getMenuItems();
|
|
||||||
let activeItem = items[this._activeItemPos];
|
|
||||||
activeItem.actor.grab_key_focus();
|
|
||||||
},
|
|
||||||
|
|
||||||
_onSourceActorStyleChanged: function() {
|
|
||||||
// PopupComboBoxMenuItem clones the active item's actors
|
|
||||||
// to work with arbitrary items in the menu; this means
|
|
||||||
// that we need to propagate some style information and
|
|
||||||
// enforce style updates even when the menu is closed
|
|
||||||
let activeItem = this._getMenuItems()[this._activeItemPos];
|
|
||||||
if (this.sourceActor.has_style_pseudo_class('insensitive'))
|
|
||||||
activeItem.actor.add_style_pseudo_class('insensitive');
|
|
||||||
else
|
|
||||||
activeItem.actor.remove_style_pseudo_class('insensitive');
|
|
||||||
|
|
||||||
// To propagate the :active style, we need to make sure that the
|
|
||||||
// internal state of the PopupComboMenu is updated as well, but
|
|
||||||
// we must not move the keyboard grab
|
|
||||||
activeItem.setActive(this.sourceActor.has_style_pseudo_class('active'),
|
|
||||||
{ grabKeyboard: false });
|
|
||||||
|
|
||||||
_ensureStyle(this.actor);
|
|
||||||
},
|
|
||||||
|
|
||||||
open: function() {
|
|
||||||
if (this.isOpen)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (this.isEmpty())
|
|
||||||
return;
|
|
||||||
|
|
||||||
this.isOpen = true;
|
|
||||||
|
|
||||||
let [sourceX, sourceY] = this.sourceActor.get_transformed_position();
|
|
||||||
let items = this._getMenuItems();
|
|
||||||
let activeItem = items[this._activeItemPos];
|
|
||||||
|
|
||||||
this.actor.set_position(sourceX, sourceY - activeItem.actor.y);
|
|
||||||
this.actor.width = Math.max(this.actor.width, this.sourceActor.width);
|
|
||||||
this.actor.raise_top();
|
|
||||||
|
|
||||||
this.actor.opacity = 0;
|
|
||||||
this.actor.show();
|
|
||||||
|
|
||||||
Tweener.addTween(this.actor,
|
|
||||||
{ opacity: 255,
|
|
||||||
transition: 'linear',
|
|
||||||
time: BoxPointer.POPUP_ANIMATION_TIME });
|
|
||||||
|
|
||||||
this.emit('open-state-changed', true);
|
|
||||||
},
|
|
||||||
|
|
||||||
close: function() {
|
|
||||||
if (!this.isOpen)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this.isOpen = false;
|
|
||||||
Tweener.addTween(this.actor,
|
|
||||||
{ opacity: 0,
|
|
||||||
transition: 'linear',
|
|
||||||
time: BoxPointer.POPUP_ANIMATION_TIME,
|
|
||||||
onComplete: Lang.bind(this,
|
|
||||||
function() {
|
|
||||||
this.actor.hide();
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
this.emit('open-state-changed', false);
|
|
||||||
},
|
|
||||||
|
|
||||||
setActiveItem: function(position) {
|
|
||||||
this._activeItemPos = position;
|
|
||||||
},
|
|
||||||
|
|
||||||
getActiveItem: function() {
|
|
||||||
return this._getMenuItems()[this._activeItemPos];
|
|
||||||
},
|
|
||||||
|
|
||||||
setItemVisible: function(position, visible) {
|
|
||||||
if (!visible && position == this._activeItemPos) {
|
|
||||||
log('Trying to hide the active menu item.');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._getMenuItems()[position].actor.visible = visible;
|
|
||||||
},
|
|
||||||
|
|
||||||
getItemVisible: function(position) {
|
|
||||||
return this._getMenuItems()[position].actor.visible;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const PopupComboBoxMenuItem = new Lang.Class({
|
|
||||||
Name: 'PopupComboBoxMenuItem',
|
|
||||||
Extends: PopupBaseMenuItem,
|
|
||||||
|
|
||||||
_init: function (params) {
|
|
||||||
this.parent(params);
|
|
||||||
|
|
||||||
this.actor.accessible_role = Atk.Role.COMBO_BOX;
|
|
||||||
|
|
||||||
this._itemBox = new Shell.Stack();
|
|
||||||
this.addActor(this._itemBox);
|
|
||||||
|
|
||||||
let expander = new St.Label({ text: '\u2304' });
|
|
||||||
this.addActor(expander, { align: St.Align.END });
|
|
||||||
|
|
||||||
this._menu = new PopupComboMenu(this.actor);
|
|
||||||
Main.uiGroup.add_actor(this._menu.actor);
|
|
||||||
this._menu.actor.hide();
|
|
||||||
|
|
||||||
if (params.style_class)
|
|
||||||
this._menu.actor.add_style_class_name(params.style_class);
|
|
||||||
|
|
||||||
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
|
|
||||||
|
|
||||||
this._activeItemPos = -1;
|
|
||||||
this._items = [];
|
|
||||||
},
|
|
||||||
|
|
||||||
_getTopMenu: function() {
|
|
||||||
let actor = this.actor.get_parent();
|
|
||||||
while (actor) {
|
|
||||||
if (actor._delegate && actor._delegate instanceof PopupMenu)
|
|
||||||
return actor._delegate;
|
|
||||||
|
|
||||||
actor = actor.get_parent();
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onScrollEvent: function(actor, event) {
|
|
||||||
if (this._activeItemPos == -1)
|
|
||||||
return;
|
|
||||||
|
|
||||||
let position = this._activeItemPos;
|
|
||||||
let direction = event.get_scroll_direction();
|
|
||||||
if (direction == Clutter.ScrollDirection.DOWN) {
|
|
||||||
while (position < this._items.length - 1) {
|
|
||||||
position++;
|
|
||||||
if (this._menu.getItemVisible(position))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else if (direction == Clutter.ScrollDirection.UP) {
|
|
||||||
while (position > 0) {
|
|
||||||
position--;
|
|
||||||
if (this._menu.getItemVisible(position))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (position == this._activeItemPos)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this.setActiveItem(position);
|
|
||||||
this.emit('active-item-changed', position);
|
|
||||||
},
|
|
||||||
|
|
||||||
activate: function(event) {
|
|
||||||
let topMenu = this._getTopMenu();
|
|
||||||
if (!topMenu)
|
|
||||||
return;
|
|
||||||
|
|
||||||
topMenu.addChildMenu(this._menu);
|
|
||||||
this._menu.toggle();
|
|
||||||
},
|
|
||||||
|
|
||||||
addMenuItem: function(menuItem, position) {
|
|
||||||
if (position === undefined)
|
|
||||||
position = this._menu.numMenuItems;
|
|
||||||
|
|
||||||
this._menu.addMenuItem(menuItem, position);
|
|
||||||
_ensureStyle(this._menu.actor);
|
|
||||||
|
|
||||||
let item = new St.BoxLayout({ style_class: 'popup-combobox-item' });
|
|
||||||
|
|
||||||
let children = menuItem.actor.get_children();
|
|
||||||
for (let i = 0; i < children.length; i++) {
|
|
||||||
let clone = new Clutter.Clone({ source: children[i] });
|
|
||||||
item.add(clone, { y_fill: false });
|
|
||||||
}
|
|
||||||
|
|
||||||
let oldItem = this._items[position];
|
|
||||||
if (oldItem)
|
|
||||||
this._itemBox.remove_actor(oldItem);
|
|
||||||
|
|
||||||
this._items[position] = item;
|
|
||||||
this._itemBox.add_actor(item);
|
|
||||||
|
|
||||||
menuItem.connect('activate',
|
|
||||||
Lang.bind(this, this._itemActivated, position));
|
|
||||||
},
|
|
||||||
|
|
||||||
checkAccessibleLabel: function() {
|
|
||||||
let activeItem = this._menu.getActiveItem();
|
|
||||||
this.actor.label_actor = activeItem.label;
|
|
||||||
},
|
|
||||||
|
|
||||||
setActiveItem: function(position) {
|
|
||||||
let item = this._items[position];
|
|
||||||
if (!item)
|
|
||||||
return;
|
|
||||||
if (this._activeItemPos == position)
|
|
||||||
return;
|
|
||||||
this._menu.setActiveItem(position);
|
|
||||||
this._activeItemPos = position;
|
|
||||||
for (let i = 0; i < this._items.length; i++)
|
|
||||||
this._items[i].visible = (i == this._activeItemPos);
|
|
||||||
|
|
||||||
this.checkAccessibleLabel();
|
|
||||||
},
|
|
||||||
|
|
||||||
setItemVisible: function(position, visible) {
|
|
||||||
this._menu.setItemVisible(position, visible);
|
|
||||||
},
|
|
||||||
|
|
||||||
_itemActivated: function(menuItem, event, position) {
|
|
||||||
this.setActiveItem(position);
|
|
||||||
this.emit('active-item-changed', position);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
/* Basic implementation of a menu manager.
|
/* Basic implementation of a menu manager.
|
||||||
* Call addMenu to add menus
|
* Call addMenu to add menus
|
||||||
*/
|
*/
|
||||||
@ -1672,8 +1394,6 @@ const PopupMenuManager = new Lang.Class({
|
|||||||
let menudata = {
|
let menudata = {
|
||||||
menu: menu,
|
menu: menu,
|
||||||
openStateChangeId: menu.connect('open-state-changed', Lang.bind(this, this._onMenuOpenState)),
|
openStateChangeId: menu.connect('open-state-changed', Lang.bind(this, this._onMenuOpenState)),
|
||||||
childMenuAddedId: menu.connect('child-menu-added', Lang.bind(this, this._onChildMenuAdded)),
|
|
||||||
childMenuRemovedId: menu.connect('child-menu-removed', Lang.bind(this, this._onChildMenuRemoved)),
|
|
||||||
destroyId: menu.connect('destroy', Lang.bind(this, this._onMenuDestroy)),
|
destroyId: menu.connect('destroy', Lang.bind(this, this._onMenuDestroy)),
|
||||||
enterId: 0,
|
enterId: 0,
|
||||||
focusInId: 0
|
focusInId: 0
|
||||||
@ -1703,8 +1423,6 @@ const PopupMenuManager = new Lang.Class({
|
|||||||
|
|
||||||
let menudata = this._menus[position];
|
let menudata = this._menus[position];
|
||||||
menu.disconnect(menudata.openStateChangeId);
|
menu.disconnect(menudata.openStateChangeId);
|
||||||
menu.disconnect(menudata.childMenuAddedId);
|
|
||||||
menu.disconnect(menudata.childMenuRemovedId);
|
|
||||||
menu.disconnect(menudata.destroyId);
|
menu.disconnect(menudata.destroyId);
|
||||||
|
|
||||||
if (menudata.enterId)
|
if (menudata.enterId)
|
||||||
@ -1731,7 +1449,7 @@ const PopupMenuManager = new Lang.Class({
|
|||||||
|
|
||||||
_onMenuOpenState: function(menu, open) {
|
_onMenuOpenState: function(menu, open) {
|
||||||
if (open) {
|
if (open) {
|
||||||
if (this.activeMenu && !this.activeMenu.isChildMenu(menu))
|
if (this.activeMenu)
|
||||||
this.activeMenu.close(BoxPointer.PopupAnimation.FADE);
|
this.activeMenu.close(BoxPointer.PopupAnimation.FADE);
|
||||||
this._grabHelper.grab({ actor: menu.actor, focus: menu.sourceActor,
|
this._grabHelper.grab({ actor: menu.actor, focus: menu.sourceActor,
|
||||||
onUngrab: Lang.bind(this, this._closeMenu, menu) });
|
onUngrab: Lang.bind(this, this._closeMenu, menu) });
|
||||||
@ -1740,14 +1458,6 @@ const PopupMenuManager = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_onChildMenuAdded: function(menu, childMenu) {
|
|
||||||
this.addMenu(childMenu);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onChildMenuRemoved: function(menu, childMenu) {
|
|
||||||
this.removeMenu(childMenu);
|
|
||||||
},
|
|
||||||
|
|
||||||
_changeMenu: function(newMenu) {
|
_changeMenu: function(newMenu) {
|
||||||
newMenu.open(this.activeMenu ? BoxPointer.PopupAnimation.FADE
|
newMenu.open(this.activeMenu ? BoxPointer.PopupAnimation.FADE
|
||||||
: BoxPointer.PopupAnimation.FULL);
|
: BoxPointer.PopupAnimation.FULL);
|
||||||
@ -1760,13 +1470,6 @@ const PopupMenuManager = new Lang.Class({
|
|||||||
if (this._grabHelper.isActorGrabbed(menu.actor))
|
if (this._grabHelper.isActorGrabbed(menu.actor))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
let isChildMenu = this._grabHelper.grabStack.some(function(grab) {
|
|
||||||
let existingMenu = grab.actor._delegate;
|
|
||||||
return existingMenu.isChildMenu(menu);
|
|
||||||
});
|
|
||||||
if (isChildMenu)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
this._changeMenu(menu);
|
this._changeMenu(menu);
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user