refs #934 Now the moderator and the presenter can have user status

This commit is contained in:
alexandrekreis 2013-10-02 15:51:08 -03:00
parent fb550226a5
commit ccffb5074c
3 changed files with 218 additions and 196 deletions

View File

@ -24,17 +24,17 @@ package org.bigbluebutton.main.model.users.events
{
public static const CHANGE_STATUS:String = "CHANGE_STATUS_EVENT";
public static const CLEAR_STATUS:String = "clear_status";
public static const RAISE_HAND:String = "raise_hand";
public static const AGREE:String = "agree";
public static const DISAGREE:String = "disagree";
public static const SPEAK_LOUDER:String = "speak_louder";
public static const SPEAK_LOWER:String = "speak_lower";
public static const SPEAK_FASTER:String = "speak_faster";
public static const SPEAK_SLOWER:String = "speak_slower";
public static const BE_RIGHT_BACK:String = "be_right_back";
public static const LAUGHTER:String = "laughter";
public static const SAD:String = "sad";
public static const CLEAR_STATUS:String = "CLEAR_STATUS";
public static const RAISE_HAND:String = "RAISE_HAND";
public static const AGREE:String = "AGREE";
public static const DISAGREE:String = "DISAGREE";
public static const SPEAK_LOUDER:String = "SPEAK_LOUDER";
public static const SPEAK_LOWER:String = "SPEAK_LOWER";
public static const SPEAK_FASTER:String = "SPEAK_FASTER";
public static const SPEAK_SLOWER:String = "SPEAK_SLOWER";
public static const BE_RIGHT_BACK:String = "BE_RIGHT_BACK";
public static const LAUGHTER:String = "LAUGHTER";
public static const SAD:String = "SAD";
private var status:String;
public var userId:String;

View File

@ -92,116 +92,129 @@
private function updateButton(unneeded:Object = null):void {
if (data != null)
{
if (data.presenter)
if (rolledOver) //if i'm moderator and I rolled the mouse
{
roleImg.source = images.presenter_new;
roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.presenter');
roleImg.visible = true;
roleBtn.visible = false;
roleBtn.enabled = false;
}
else if (rolledOver)
{
roleImg.visible = false;
roleBtn.visible = true;
roleBtn.enabled = true;
if (data.userHasStatus)
{
roleBtn.setStyle("icon", images.delete_icon);
roleBtn.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.clearStatus');
statusBtn.setStyle("icon", images.delete_icon);
statusBtn.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.clearStatus');
statusImg.visible = false;
statusBtn.visible = true;
statusBtn.enabled = true;
}
else
if(!data.presenter)
{
roleBtn.setStyle("icon", images.presenter_new);
roleBtn.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.changePresenter');
roleImg.visible = false;
roleBtn.visible = true;
roleBtn.enabled = true;
}
}
else
{
//updating which role to show: presenter or moderator
if (data.presenter)
{
roleImg.source = images.presenter_new;
roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.presenter')
}
else if(data.role == Role.MODERATOR)
{
roleImg.source = images.moderator;
roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.moderator');
roleImg.visible = true;
roleBtn.visible = false;
roleBtn.enabled = false;
}
else if (data.userHasStatus)
{
switch(data.currentStatus)
{
case ChangeStatusEvent.RAISE_HAND:
roleImg.source = images.hand_new;
roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.handRaised');
break;
case ChangeStatusEvent.AGREE:
roleImg.source = images.agree;
roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.agree');
break;
case ChangeStatusEvent.DISAGREE:
roleImg.source = images.disagree;
roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.disagree');
break;
case ChangeStatusEvent.SPEAK_LOUDER:
roleImg.source = images.speak_louder;
roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.status.speak_louder');
break;
case ChangeStatusEvent.SPEAK_LOWER:
roleImg.source = images.speak_lower;
roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.status.speak_lower');
break;
case ChangeStatusEvent.SPEAK_FASTER:
roleImg.source = images.speak_faster;
roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.status.speak_faster');
break;
case ChangeStatusEvent.SPEAK_SLOWER:
roleImg.source = images.speak_slower;
roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.status.speak_slower');
break;
case ChangeStatusEvent.BE_RIGHT_BACK:
roleImg.source = images.be_right_back;
roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.be_right_back');
break;
case ChangeStatusEvent.LAUGHTER:
roleImg.source = images.laughter;
roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.status.laughter');
break;
case ChangeStatusEvent.SAD:
roleImg.source = images.sad;
roleImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.status.sad');
}
roleImg.visible = true;
roleBtn.visible = false;
roleBtn.enabled = false;
}
else
{
roleImg.source = null;
roleImg.toolTip = "";
}
//updating which status to show
switch(data.currentStatus)
{
case ChangeStatusEvent.RAISE_HAND:
statusImg.source = images.hand_new;
statusImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.handRaised');
break;
case ChangeStatusEvent.AGREE:
statusImg.source = images.agree;
statusImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.agree');
break;
case ChangeStatusEvent.DISAGREE:
statusImg.source = images.disagree;
statusImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.disagree');
break;
case ChangeStatusEvent.SPEAK_LOUDER:
statusImg.source = images.speak_louder;
statusImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.status.speak_louder');
break;
case ChangeStatusEvent.SPEAK_LOWER:
statusImg.source = images.speak_lower;
statusImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.status.speak_lower');
break;
case ChangeStatusEvent.SPEAK_FASTER:
statusImg.source = images.speak_faster;
statusImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.status.speak_faster');
break;
case ChangeStatusEvent.SPEAK_SLOWER:
statusImg.source = images.speak_slower;
statusImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.status.speak_slower');
break;
case ChangeStatusEvent.BE_RIGHT_BACK:
statusImg.source = images.be_right_back;
statusImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer.be_right_back');
break;
case ChangeStatusEvent.LAUGHTER:
statusImg.source = images.laughter;
statusImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.status.laughter');
break;
case ChangeStatusEvent.SAD:
statusImg.source = images.sad;
statusImg.toolTip = ResourceUtil.getInstance().getString('bbb.users.status.sad');
break;
default: //user has no status...
statusImg.source = null;
statusImg.toolTip = "";
}
roleImg.visible = true;
statusImg.visible = true;
roleBtn.visible = false;
statusBtn.visible = false;
roleBtn.enabled = false;
statusBtn.enabled = false;
}
}
}
private function onRollOver(e:UsersRollEvent):void{
private function onRollOver(e:UsersRollEvent):void{ //descobrir qual botão: role ou status
if (moderator && (e.userID == data.userID) && !data.phoneUser) {
rolledOver = true;
updateButton();
}
}
private function onRollOut(e:UsersRollEvent):void{
private function onRollOut(e:UsersRollEvent):void{ //descobrir qual botão: role ou status
if (moderator) {
rolledOver = false;
updateButton();
@ -209,21 +222,16 @@
}
private function roleBtnClicked():void
{
// Ignore if the selected user is already the presenter.
if (data.presenter) return;
if (data.userHasStatus)
{
dispatchEvent( new ChangeStatusEvent(data.userID, ChangeStatusEvent.CLEAR_STATUS) )
}
else
{
var e:RoleChangeEvent = new RoleChangeEvent(RoleChangeEvent.ASSIGN_PRESENTER);
e.userid = data.userID;
e.username = data.name;
dispatchEvent(e);
}
private function statusBtnClicked():void
{
dispatchEvent( new ChangeStatusEvent(data.userID, ChangeStatusEvent.CLEAR_STATUS) )
}
// Need to refresh the roleBtn toolTip text on locale change
@ -233,7 +241,10 @@
]]>
</mx:Script>
<mx:Image id="roleImg" visible="true" width="16" height="16" includeInLayout="{roleImg.visible}" />
<mx:Button id="roleBtn" visible="false" enabled="false" width="20" height="20" click="roleBtnClicked()" includeInLayout="{roleBtn.visible}" />
<mx:Button id="roleBtn" visible="false" enabled="false" width="16" height="16" click="roleBtnClicked()" includeInLayout="{roleBtn.visible}" />
<mx:Image id="statusImg" visible="true" width="16" height="16" includeInLayout="{statusImg.visible}" />
<mx:Button id="statusBtn" visible="false" enabled="false" width="16" height="16" click="statusBtnClicked()" includeInLayout="{statusBtn.visible}" />
<!-- Helper objects because direct bindings to data break when the itemRenderer is recycled -->
<mx:Image id="presenterInd" includeInLayout="false" visible="{data.presenter}" />

View File

@ -89,6 +89,7 @@
private var users:ArrayCollection = new ArrayCollection();
private var amIModerator:Boolean = false;
private var baseIndex:int = 0;
private const FOCUS_USERS_LIST:String = "Focus Users List";
private const MAKE_PRESENTER:String = "Make Presenter";
@ -104,9 +105,8 @@
users = UserManager.getInstance().getConference().users;
amIModerator = UserManager.getInstance().getConference().amIModerator();
settingsBtn.visible = settingsBtn.includeInLayout = partOptions.enableSettingsButton && amIModerator;
//settingsBtn.visible = settingsBtn.includeInLayout = partOptions.enableSettingsButton && amIModerator;
BindingUtils.bindSetter(changeButtons, UserManager.getInstance().getConference(), "amIPresenter");
BindingUtils.bindSetter(updateNumberofUsers, users, "length");
this.addEventListener(KeyboardEvent.KEY_DOWN, handleKeyDown);
@ -115,8 +115,6 @@
modifier = ExternalInterface.call("determineModifier");
loadKeyCombos(modifier);
changeButtons(UserManager.getInstance().getConference().amIPresenter);
resourcesChanged();
titleBarOverlay.tabIndex = partOptions.baseTabIndex;
@ -142,10 +140,6 @@
resourcesChanged();
}
private function changeButtons(presenter:Boolean):void {
statusBtn.visible = statusBtn.includeInLayout = partOptions.enableRaiseHand && !(presenter || amIModerator);
}
private function onItemRollOver(event:ListEvent):void{
var item:IListItemRenderer = event.itemRenderer;
var user:BBBUser = item.data as BBBUser;
@ -168,80 +162,6 @@
}
}
private function openParticipantStatus():void {
var menuStatusData:Array = [];
menuStatusData[0] = {label: ResourceUtil.getInstance().getString('bbb.users.status.clearStatus'), icon: images.delete_icon};
menuStatusData[1] = {label: ResourceUtil.getInstance().getString('bbb.shortcutkey.raiseHand.function'), icon: images.hand_new};
menuStatusData[2] = {label: ResourceUtil.getInstance().getString('bbb.users.status.agree'), icon: images.agree};
menuStatusData[3] = {label: ResourceUtil.getInstance().getString('bbb.users.status.disagree'), icon: images.disagree};
menuStatusData[4] = {label: ResourceUtil.getInstance().getString('bbb.users.status.speak_louder'), icon: images.speak_louder};
menuStatusData[5] = {label: ResourceUtil.getInstance().getString('bbb.users.status.speak_lower'), icon: images.speak_lower};
menuStatusData[6] = {label: ResourceUtil.getInstance().getString('bbb.users.status.speak_faster'), icon: images.speak_faster};
menuStatusData[7] = {label: ResourceUtil.getInstance().getString('bbb.users.status.speak_slower'), icon: images.speak_slower};
menuStatusData[8] = {label: ResourceUtil.getInstance().getString('bbb.users.status.be_right_back'), icon: images.be_right_back};
menuStatusData[9] = {label: ResourceUtil.getInstance().getString('bbb.users.status.laughter'), icon: images.laughter};
menuStatusData[10] = {label: ResourceUtil.getInstance().getString('bbb.users.status.sad'), icon: images.sad};
// make sure the previous menu is closed before opening a new one
// This could be improved to include a flag that tells if the menu is open,
// but it would require an extra listener for the MenuCloseEvent.
if (menuStatus) menuStatus.hide();
menuStatus = Menu.createMenu(null, menuStatusData, true);
menuStatus.variableRowHeight = true;
menuStatus.show(this.x + settingsBtn.x + 2, this.y + this.height + 25);
menuStatus.addEventListener(MenuEvent.ITEM_CLICK, menuStatusClickHandler);
menuStatus.setFocus();
}
private function menuStatusClickHandler(e:MenuEvent):void {
switch (e.index) {
case 0:
changeStatus(ChangeStatusEvent.CLEAR_STATUS);
break;
case 1:
changeStatus(ChangeStatusEvent.RAISE_HAND);
break;
case 2:
changeStatus(ChangeStatusEvent.AGREE);
break;
case 3:
changeStatus(ChangeStatusEvent.DISAGREE);
break;
case 4:
changeStatus(ChangeStatusEvent.SPEAK_LOUDER);
break;
case 5:
changeStatus(ChangeStatusEvent.SPEAK_LOWER);
break;
case 6:
changeStatus(ChangeStatusEvent.SPEAK_FASTER);
break;
case 7:
changeStatus(ChangeStatusEvent.SPEAK_SLOWER);
break;
case 8:
changeStatus(ChangeStatusEvent.BE_RIGHT_BACK);
break;
case 9:
changeStatus(ChangeStatusEvent.LAUGHTER);
break;
default:
changeStatus(ChangeStatusEvent.SAD);
}
}
private function changeStatus(whichStatus:String):void{
if (UserManager.getInstance().getConference().getMyRole() == Role.VIEWER) {
var e:ChangeStatusEvent = new ChangeStatusEvent(UserManager.getInstance().getConference().getMyUserId(), whichStatus);
dispatchEvent(e);
}
}
private function clearAllStatus():void { // Pendente: ver clear status do moderador
for (var i:int = 0; i < users.length; i++) {
var p:BBBUser = users.getItemAt(i) as BBBUser;
@ -254,13 +174,39 @@
// everyone can see the audio settings
var myMenuData:Array = [];
if(amIModerator)
{
myMenuData[0] = {label: ResourceUtil.getInstance().getString('bbb.users.settings.clearAllStats'), icon: images.delete_icon};
if (!roomMuted) {
if (!roomMuted)
{
myMenuData[1] = {label: ResourceUtil.getInstance().getString('bbb.users.settings.muteAll'), icon: images.audio_muted};
if (UserManager.getInstance().getConference().getPresenter())
myMenuData[2] = {label: ResourceUtil.getInstance().getString('bbb.users.settings.muteAllExcept') + ": " + UserManager.getInstance().getConference().getPresenter().name, icon: images.audio_muted};
} else
baseIndex = 2;
}
else
{
myMenuData[1] = {label: ResourceUtil.getInstance().getString('bbb.users.settings.unmuteAll'), icon: images.audio};
baseIndex = 1;
}
}
if(partOptions.enableRaiseHand)
{
myMenuData[baseIndex+1] = {label: ResourceUtil.getInstance().getString('bbb.users.status.clearStatus'), icon: images.delete_icon};
myMenuData[baseIndex+2] = {label: ResourceUtil.getInstance().getString('bbb.shortcutkey.raiseHand.function'), icon: images.hand_new};
myMenuData[baseIndex+3] = {label: ResourceUtil.getInstance().getString('bbb.users.status.agree'), icon: images.agree};
myMenuData[baseIndex+4] = {label: ResourceUtil.getInstance().getString('bbb.users.status.disagree'), icon: images.disagree};
myMenuData[baseIndex+5] = {label: ResourceUtil.getInstance().getString('bbb.users.status.speak_louder'), icon: images.speak_louder};
myMenuData[baseIndex+6] = {label: ResourceUtil.getInstance().getString('bbb.users.status.speak_lower'), icon: images.speak_lower};
myMenuData[baseIndex+7] = {label: ResourceUtil.getInstance().getString('bbb.users.status.speak_faster'), icon: images.speak_faster};
myMenuData[baseIndex+8] = {label: ResourceUtil.getInstance().getString('bbb.users.status.speak_slower'), icon: images.speak_slower};
myMenuData[baseIndex+9] = {label: ResourceUtil.getInstance().getString('bbb.users.status.be_right_back'), icon: images.be_right_back};
myMenuData[baseIndex+10] = {label: ResourceUtil.getInstance().getString('bbb.users.status.laughter'), icon: images.laughter};
myMenuData[baseIndex+11] = {label: ResourceUtil.getInstance().getString('bbb.users.status.sad'), icon: images.sad};
}
// make sure the previous menu is closed before opening a new one
// This could be improved to include a flag that tells if the menu is open,
@ -276,8 +222,29 @@
}
private function menuClickHandler(e:MenuEvent):void {
// case 1 is the separator and can never get called
private function menuClickHandler(e:MenuEvent):void
{
if(baseIndex == 0) //not a moderator
{
changeStatusHandler(e.index)
}
else if(baseIndex == 1) //i'm a moderator and there is NOT the "mute all except" option
{
switch (e.index) {
case 0:
clearAllStatus();
break;
case 1:
muteAll();
break;
default:
changeStatusHandler(e.index);
}
}
else //i'm a moderator and the option "mute all except" is enabled
{
switch (e.index) {
case 0:
clearAllStatus();
@ -287,8 +254,57 @@
break;
case 2:
muteAlmostAll();
break;
default:
changeStatusHandler(e.index);
}
}
}
private function changeStatusHandler(index:int):void {
switch (index) {
case baseIndex+1:
changeStatus(ChangeStatusEvent.CLEAR_STATUS);
break;
case baseIndex+2:
changeStatus(ChangeStatusEvent.RAISE_HAND);
break;
case baseIndex+3:
changeStatus(ChangeStatusEvent.AGREE);
break;
case baseIndex+4:
changeStatus(ChangeStatusEvent.DISAGREE);
break;
case baseIndex+5:
changeStatus(ChangeStatusEvent.SPEAK_LOUDER);
break;
case baseIndex+6:
changeStatus(ChangeStatusEvent.SPEAK_LOWER);
break;
case baseIndex+7:
changeStatus(ChangeStatusEvent.SPEAK_FASTER);
break;
case baseIndex+8:
changeStatus(ChangeStatusEvent.SPEAK_SLOWER);
break;
case baseIndex+9:
changeStatus(ChangeStatusEvent.BE_RIGHT_BACK);
break;
case baseIndex+10:
changeStatus(ChangeStatusEvent.LAUGHTER);
break;
case baseIndex+11:
changeStatus(ChangeStatusEvent.SAD);
}
}
private function changeStatus(whichStatus:String):void
{
var e:ChangeStatusEvent = new ChangeStatusEvent(UserManager.getInstance().getConference().getMyUserId(), whichStatus);
dispatchEvent(e);
}
private function setRoomMute(e:UsersEvent):void {
roomMuted = e.mute_state;
@ -465,7 +481,7 @@
tabIndex="{partOptions.baseTabIndex+5}"
accessibilityName="{ResourceUtil.getInstance().getString('bbb.users.usersGrid.accessibilityName')}" >
<mx:columns>
<mx:DataGridColumn dataField="userStatus" headerText="{ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer')}" editable="false" width="45" minWidth="45"
<mx:DataGridColumn dataField="userStatus" headerText="{ResourceUtil.getInstance().getString('bbb.users.usersGrid.statusItemRenderer')}" editable="false" width="60" minWidth="60"
itemRenderer="org.bigbluebutton.modules.users.views.StatusItemRenderer" sortable="false" />
<mx:DataGridColumn dataField="name" headerText="{ResourceUtil.getInstance().getString('bbb.users.usersGrid.nameItemRenderer')}" editable="false" sortable="false" minWidth="60"
itemRenderer="org.bigbluebutton.modules.users.views.NameItemRenderer"/>
@ -480,11 +496,6 @@
click="openSettings()" visible="true"
tabIndex="{partOptions.baseTabIndex+10}" />
<mx:Button id="statusBtn" icon="{images.status}" width="30" height="30"
toolTip="{ResourceUtil.getInstance().getString('bbb.users.statusBtn.toolTip')}"
click="openParticipantStatus()" visible="false"
tabIndex="{partOptions.baseTabIndex+15}" />
<mx:Label id="roomMutedLbl" text="{ResourceUtil.getInstance().getString('bbb.users.settings.muteAll')}" />
<mx:Spacer width="100%"/>
</mx:ControlBar>