diff --git a/clients/flash/air-client/src/Main.mxml b/clients/flash/air-client/src/Main.mxml index fb42d0e853f6886f3dc4bd11e353e15b8c9f3c69..0ae7ebbef6d3fa38a256a634366fac45a095b7f0 100755 --- a/clients/flash/air-client/src/Main.mxml +++ b/clients/flash/air-client/src/Main.mxml @@ -71,7 +71,7 @@ .configure(ParticipantsConfig) .configure(UsersConfig) .configure(ChatConfig) - .configure(new ContextView(this)); + .configure(new ContextView(this.systemManager as DisplayObjectContainer)); // If you wish to change the log level then uncomment the line below and set // the logLevel to the value you desire. The default logLevel is DEBUG, which // is set in the MVCSBundle. The default log level traces out the framework diff --git a/clients/flash/air-client/src/css/hdpi.css b/clients/flash/air-client/src/css/hdpi.css index ffa3be5167448396b2b1b1ea0a17b26691fd91b0..8f4f7c1e81706af4fd26d61dea572b266f3eb87e 100755 --- a/clients/flash/air-client/src/css/hdpi.css +++ b/clients/flash/air-client/src/css/hdpi.css @@ -113,6 +113,10 @@ fontSize: 18.00; } + main|EmojiPopUp { + fontSize: 16.50; + } + .icon { fontSize: 15.00; } diff --git a/clients/flash/air-client/src/css/ldpi.css b/clients/flash/air-client/src/css/ldpi.css index 6913ca3b44b931f22a43fc3025cb624d33ffafd4..189a499cba7ee2abde09e0042516878583e9c57e 100755 --- a/clients/flash/air-client/src/css/ldpi.css +++ b/clients/flash/air-client/src/css/ldpi.css @@ -113,6 +113,10 @@ fontSize: 9.000; } + main|EmojiPopUp { + fontSize: 8.250; + } + .icon { fontSize: 7.500; } diff --git a/clients/flash/air-client/src/css/mdpi.css b/clients/flash/air-client/src/css/mdpi.css index 7b156dd70acd406e2847ee73346bcdf8a911d51a..cedc89f168c26237447d3ff28af3c32a2c2c8e2a 100755 --- a/clients/flash/air-client/src/css/mdpi.css +++ b/clients/flash/air-client/src/css/mdpi.css @@ -113,6 +113,10 @@ fontSize: 12.0; } + main|EmojiPopUp { + fontSize: 11.0; + } + .icon { fontSize: 10.0; } diff --git a/clients/flash/air-client/src/css/xhdpi.css b/clients/flash/air-client/src/css/xhdpi.css index bcbdd07b3f9000ad6c865fa04f7be0ae74f4cc8e..3fec492d8b425b02df61daba6587470964702747 100755 --- a/clients/flash/air-client/src/css/xhdpi.css +++ b/clients/flash/air-client/src/css/xhdpi.css @@ -102,6 +102,10 @@ fontSize : 24; } + main|EmojiPopUp { + fontSize : 22; + } + .icon { fontSize : 20; } diff --git a/clients/flash/air-client/src/css/xxhdpi.css b/clients/flash/air-client/src/css/xxhdpi.css index 03118bff89d0e576bfb055b5d069e70d27d85a44..7bff7f17cb80d258b13f6b95097b0323c8718d55 100755 --- a/clients/flash/air-client/src/css/xxhdpi.css +++ b/clients/flash/air-client/src/css/xxhdpi.css @@ -113,6 +113,10 @@ fontSize: 36.0; } + main|EmojiPopUp { + fontSize: 33.0; + } + .icon { fontSize: 30.0; } diff --git a/clients/flash/air-client/src/css/xxxhdpi.css b/clients/flash/air-client/src/css/xxxhdpi.css index 6fab6be135fba8f7eef99f9af9d62f1dcb896470..f155b1d2aa555231549ccded357d9b04efbf4878 100755 --- a/clients/flash/air-client/src/css/xxxhdpi.css +++ b/clients/flash/air-client/src/css/xxxhdpi.css @@ -113,6 +113,10 @@ fontSize: 48; } + main|EmojiPopUp { + fontSize: 44; + } + .icon { fontSize: 40; } diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/main/MainConfig.as b/clients/flash/air-client/src/org/bigbluebutton/air/main/MainConfig.as index 2b68c6e55f642f97103c229179128a5bb2da3892..9d525594a01d6b1f059a829318283325a93e6265 100755 --- a/clients/flash/air-client/src/org/bigbluebutton/air/main/MainConfig.as +++ b/clients/flash/air-client/src/org/bigbluebutton/air/main/MainConfig.as @@ -10,6 +10,8 @@ package org.bigbluebutton.air.main { import org.bigbluebutton.air.main.views.BannerViewMediator; import org.bigbluebutton.air.main.views.DisconnectView; import org.bigbluebutton.air.main.views.DisconnectViewMediator; + import org.bigbluebutton.air.main.views.EmojiPopUp; + import org.bigbluebutton.air.main.views.EmojiPopUpMediator; import org.bigbluebutton.air.main.views.ExitView; import org.bigbluebutton.air.main.views.ExitViewMediator; import org.bigbluebutton.air.main.views.LoadingScreen; @@ -44,22 +46,17 @@ package org.bigbluebutton.air.main { */ private function mediators():void { /* - mediatorMap.map(INavigationButton).toMediator(NavigationButtonMediator); - mediatorMap.map(IRecordingStatus).toMediator(RecordingStatusMediator); - mediatorMap.map(IPagesNavigatorView).toMediator(PagesNavigatorViewMediator); - mediatorMap.map(IMenuButtonsView).toMediator(MenuButtonsViewMediator); - mediatorMap.map(ILoginPageView).toMediator(LoginPageViewMediator); - mediatorMap.map(ILoadingScreen).toMediator(LoadingScreenMediator); - mediatorMap.map(IDisconnectPageView).toMediator(DisconnectPageViewMediator); - mediatorMap.map(IProfileView).toMediator(ProfileViewMediator); - mediatorMap.map(IChangeStatusPopUp).toMediator(ChangeStatusPopUpMediator); - mediatorMap.map(IExitPageView).toMediator(ExitPageViewMediator); + mediatorMap.map(INavigationButton).toMediator(NavigationButtonMediator); + mediatorMap.map(IRecordingStatus).toMediator(RecordingStatusMediator); + mediatorMap.map(IPagesNavigatorView).toMediator(PagesNavigatorViewMediator); + mediatorMap.map(IProfileView).toMediator(ProfileViewMediator); */ mediatorMap.map(LoadingScreen).toMediator(LoadingScreenMediator); mediatorMap.map(PagesNavigatorView).toMediator(PagesNavigatorViewMediator); mediatorMap.map(BannerView).toMediator(BannerViewMediator); mediatorMap.mapMatcher(new TypeMatcher().allOf(TopToolbarBase)).toMediator(TopToolbarMediator); mediatorMap.map(MenuButtons).toMediator(MenuButtonsMediator); + mediatorMap.map(EmojiPopUp).toMediator(EmojiPopUpMediator); mediatorMap.map(ExitView).toMediator(ExitViewMediator); mediatorMap.map(DisconnectView).toMediator(DisconnectViewMediator); } diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/main/commands/EmojiCommand.as b/clients/flash/air-client/src/org/bigbluebutton/air/main/commands/EmojiCommand.as index c52d0cdcf207a7d293c2c6461cc28a93bbcee9a9..2759c8a1a33da2fa81d866412d8ebbe9b6de9a87 100755 --- a/clients/flash/air-client/src/org/bigbluebutton/air/main/commands/EmojiCommand.as +++ b/clients/flash/air-client/src/org/bigbluebutton/air/main/commands/EmojiCommand.as @@ -1,7 +1,7 @@ package org.bigbluebutton.air.main.commands { - import org.bigbluebutton.air.main.models.IUserSession; import org.bigbluebutton.air.user.models.EmojiStatus; + import org.bigbluebutton.air.user.models.User2x; import org.bigbluebutton.air.user.services.IUsersService; import robotlegs.bender.bundles.mvcs.Command; @@ -12,7 +12,7 @@ package org.bigbluebutton.air.main.commands { public var userService:IUsersService; [Inject] - public var userId:String; + public var user:User2x; [Inject] public var status:String; @@ -20,7 +20,7 @@ package org.bigbluebutton.air.main.commands { override public function execute():void { trace("EmojiCommand.execute() - change emoji status"); if (EmojiStatus.STATUS_ARRAY.indexOf(status) != -1) { - userService.emojiStatus(userId, status); + userService.emojiStatus(user.intId, status); } else { trace("Emoji status [" + status + "] not supported"); } diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/main/commands/EmojiSignal.as b/clients/flash/air-client/src/org/bigbluebutton/air/main/commands/EmojiSignal.as index cb982ff2e5a6c159dbf1ad45fa15e79f8af6f711..8c0038666e1bd24a0dd08def1395299d582f74fb 100755 --- a/clients/flash/air-client/src/org/bigbluebutton/air/main/commands/EmojiSignal.as +++ b/clients/flash/air-client/src/org/bigbluebutton/air/main/commands/EmojiSignal.as @@ -1,14 +1,15 @@ package org.bigbluebutton.air.main.commands { + import org.bigbluebutton.air.user.models.User2x; import org.osflash.signals.Signal; public class EmojiSignal extends Signal { + /** + * @1 user + * @2 status + */ public function EmojiSignal() { - /** - * @1 userId - * @2 status - */ - super(String, String); + super(User2x, String); } } } diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/main/commands/GoToSlideSignal.as b/clients/flash/air-client/src/org/bigbluebutton/air/main/commands/GoToSlideSignal.as index 28b7685a73089b5702665c464f43288f56cb429e..2e42c0a341474abd88364ff46c6948011eea0039 100755 --- a/clients/flash/air-client/src/org/bigbluebutton/air/main/commands/GoToSlideSignal.as +++ b/clients/flash/air-client/src/org/bigbluebutton/air/main/commands/GoToSlideSignal.as @@ -4,7 +4,7 @@ package org.bigbluebutton.air.main.commands { public class GoToSlideSignal extends Signal { public function GoToSlideSignal() { /** - * @1 mute + * @1 pageId */ super(String); } diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/main/views/EmojiItemRenderer.mxml b/clients/flash/air-client/src/org/bigbluebutton/air/main/views/EmojiItemRenderer.mxml new file mode 100644 index 0000000000000000000000000000000000000000..7d1cc15936b96337ee39a0cb0223cda3e5a52333 --- /dev/null +++ b/clients/flash/air-client/src/org/bigbluebutton/air/main/views/EmojiItemRenderer.mxml @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="utf-8"?> +<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:s="library://ns.adobe.com/flex/spark" + xmlns:mx="library://ns.adobe.com/flex/mx" + styleName="statusItemStyle"> + <s:states> + <s:State name="normal" /> + <s:State name="selected" /> + </s:states> + + <fx:Script> + <![CDATA[ + override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void { + icon.text = getStyle("icon"); + icon.setStyle("fontFamily", getStyle("iconFont")); + icon.setStyle("fontSize", getStyle("iconSize")); + icon.setStyle("color", getStyle("iconColor")); + + if (selected) { + setStyle("color", getStyle("selectedColor")); + icon.setStyle("color", getStyle("selectedColor")); + } + + super.updateDisplayList(unscaledWidth, unscaledHeight); + } + + override public function set data(obj:Object):void { + super.data = obj; + if (obj) { + styleName = "icon-" + obj.icon; + } + } + ]]> + </fx:Script> + <s:HGroup id="content" + width="100%" + verticalAlign="middle" + padding="6" + height="{getStyle('itemHeight')}"> + + <s:Label id="icon" /> + + <s:Label id="labelDisplay" + maxDisplayedLines="1" /> + </s:HGroup> +</s:ItemRenderer> diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/main/views/EmojiListSkin.mxml b/clients/flash/air-client/src/org/bigbluebutton/air/main/views/EmojiListSkin.mxml new file mode 100644 index 0000000000000000000000000000000000000000..76a8654d935a0e9824158a7f8372a9cf1f32c657 --- /dev/null +++ b/clients/flash/air-client/src/org/bigbluebutton/air/main/views/EmojiListSkin.mxml @@ -0,0 +1,184 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You under the Apache License, Version 2.0 + (the "License"); you may not use this file except in compliance with + the License. You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +--> + + +<!--- The default skin class for a Spark List component. + + @see spark.components.List + + @langversion 3.0 + @playerversion Flash 10 + @playerversion AIR 1.5 + @productversion Flex 4 +--> +<s:SparkSkin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" + xmlns:fb="http://ns.adobe.com/flashbuilder/2009" minWidth="112" + alpha.disabled="0.5" blendMode="normal"> + + <fx:Metadata> + <![CDATA[ + /** + * @copy spark.skins.spark.ApplicationSkin#hostComponent + */ + [HostComponent("spark.components.List")] + ]]> + </fx:Metadata> + + <fx:Script fb:purpose="styling"> + <![CDATA[ + import mx.core.FlexVersion; + + /* Define the skin elements that should not be colorized. + For list, the skin itself is colorized but the individual parts are not. */ + static private const exclusions:Array = ["scroller", "background", "border"]; + + /* exclusions before Flex 4.5 for backwards-compatibility purposes */ + static private const exclusions_4_0:Array = ["scroller", "background"]; + + /** + * @private + */ + override public function get colorizeExclusions():Array + { + // Since border is styleable via borderColor, no need to allow chromeColor to affect + // the border. This is wrapped in a compatibility flag since this change was added + // in Flex 4.5 + if (FlexVersion.compatibilityVersion < FlexVersion.VERSION_4_5) + { + return exclusions_4_0; + } + + return exclusions; + } + + /* Define the content fill items that should be colored by the "contentBackgroundColor" style. */ + static private const contentFill:Array = ["bgFill"]; + + /** + * @private + */ + override public function get contentItems():Array { return contentFill; } + + /** + * @private + */ + override protected function initializationComplete():void + { + useChromeColor = true; + super.initializationComplete(); + } + + /** + * @private + */ + override protected function updateDisplayList(unscaledWidth:Number, unscaledHeight:Number):void + { + if (getStyle("borderVisible") == true) + { + border.visible = true; + background.left = background.top = background.right = background.bottom = 1; + scroller.minViewportInset = 1; + } + else + { + border.visible = false; + background.left = background.top = background.right = background.bottom = 0; + scroller.minViewportInset = 0; + } + + borderStroke.color = getStyle("borderColor"); + borderStroke.alpha = getStyle("borderAlpha"); + + super.updateDisplayList(unscaledWidth, unscaledHeight); + } + ]]> + </fx:Script> + + <s:states> + <s:State name="normal" /> + <s:State name="disabled" /> + </s:states> + + <fx:Declarations> + <!--- + Defines the appearance of the the List's drop indicator. + To customize the drop indicator appearance, create a custom ListSkin class. + The List's layout takes care to size and position the dropIndicator. + The size of the <code>dropIndicator</code> is typically set to the size of the gaps between the items. + The minimum and maximum settings are typically respected only in the direction + along the major axis (the gap axis). For example a VerticalLayout ignores the + <code>minWidth</code> and <code>maxWidth</code> settings, + but respect <code>minHeight</code> and <code>maxHeight</code>. + + @copy spark.components.List#dropIndicator + --> + <fx:Component id="dropIndicator"> + <s:Group minWidth="3" minHeight="3" maxWidth="3" maxHeight="3"> + <s:Rect left="0" right="0" top="0" bottom="0"> + <s:fill> + <!--- Defines the color of the background. --> + <s:SolidColor color="0xBBBBBB" /> + </s:fill> + <s:stroke> + <s:SolidColorStroke color="0x868686" weight="1"/> + </s:stroke> + </s:Rect> + </s:Group> + </fx:Component> + </fx:Declarations> + + <!-- border --> + <!--- @private --> + <s:Rect left="0" right="0" top="0" bottom="0" id="border"> + <s:stroke> + <!--- @private --> + <s:SolidColorStroke id="borderStroke" weight="1"/> + </s:stroke> + </s:Rect> + + <!-- fill --> + <!--- Defines the background appearance of the list-based component. --> + <s:Rect id="background" left="1" right="1" top="1" bottom="1" > + <s:fill> + <!--- Defines the color of the background. The default color is 0xFFFFFF. --> + <s:SolidColor id="bgFill" color="0xFFFFFF" /> + </s:fill> + </s:Rect> + + <!--- The Scroller component to add scroll bars to the list. --> + <s:Scroller left="0" top="0" right="0" bottom="0" id="scroller" minViewportInset="1" hasFocusableChildren="false"> + <!--- @copy spark.components.SkinnableDataContainer#dataGroup --> + <s:DataGroup id="dataGroup" itemRenderer="org.bigbluebutton.air.main.views.EmojiItemRenderer"> + <s:layout> + <!--- The default layout is vertical and measures at least for 5 rows. + When switching to a different layout, HorizontalLayout for example, + make sure to adjust the minWidth, minHeight sizes of the skin --> + <s:VerticalLayout gap="0" horizontalAlign="contentJustify" requestedMinRowCount="5" /> + </s:layout> + </s:DataGroup> + </s:Scroller> + + <s:Path id="triangle" bottom="-15" left="20" data="M 0 0 L 40 0 L 20 15 z"> + <s:fill> + <s:SolidColor id="arrow" color="0xFFFFFF" /> + </s:fill> + </s:Path> + +</s:SparkSkin> diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/main/views/EmojiPopUp.as b/clients/flash/air-client/src/org/bigbluebutton/air/main/views/EmojiPopUp.as new file mode 100644 index 0000000000000000000000000000000000000000..fa7d85aa162bdbe5b15c2e397bfd2bc95ca7fd7e --- /dev/null +++ b/clients/flash/air-client/src/org/bigbluebutton/air/main/views/EmojiPopUp.as @@ -0,0 +1,58 @@ +package org.bigbluebutton.air.main.views { + import mx.collections.ArrayCollection; + import mx.core.ScrollPolicy; + + import spark.components.List; + import spark.components.SkinnablePopUpContainer; + import spark.components.VGroup; + import spark.layouts.HorizontalAlign; + import spark.layouts.VerticalAlign; + + import org.bigbluebutton.air.user.models.EmojiStatus; + + public class EmojiPopUp extends SkinnablePopUpContainer { + + private var _statusList:List; + + public function get statusList():List { + return _statusList; + } + + public function EmojiPopUp() { + super(); + + var mainGroup:VGroup = new VGroup(); + mainGroup.horizontalAlign = HorizontalAlign.CENTER; + mainGroup.verticalAlign = VerticalAlign.MIDDLE; + this.addElement(mainGroup); + + _statusList = new List(); + _statusList.percentWidth = 100; + _statusList.minWidth = 160; + _statusList.styleName = "statusList"; + _statusList.percentHeight = 100; + _statusList.labelField = "label"; + _statusList.dataProvider = new ArrayCollection([ + {label: "Raise", signal: EmojiStatus.RAISE_HAND, icon: "hand"}, + {label: "Happy", signal: EmojiStatus.HAPPY, icon: "happy"}, + {label: "Undecided", signal: EmojiStatus.NEUTRAL, icon: "undecided"}, + {label: "Sad", signal: EmojiStatus.SAD, icon: "sad"}, + {label: "Confused", signal: EmojiStatus.CONFUSED, icon: "confused"}, + {label: "Away", signal: EmojiStatus.AWAY, icon: "hand"}, + {label: "Thumbs up", signal: EmojiStatus.THUMBS_UP, icon: "thumbs-up"}, + {label: "Thumbs down", signal: EmojiStatus.THUMBS_DOWN, icon: "thumbs-down"}, + {label: "Applause", signal: EmojiStatus.APPLAUSE, icon: "applause"}, + {label: "Clear", signal: EmojiStatus.NO_STATUS, icon: "clear-status"}] + ); + mainGroup.addElement(_statusList); + } + + + override protected function updateDisplayList(w:Number, h:Number):void { + super.updateDisplayList(w, h); + + _statusList.setStyle('verticalScrollPolicy', ScrollPolicy.OFF); + _statusList.setStyle('horizontalScrollPolicy', ScrollPolicy.OFF); + } + } +} diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/main/views/EmojiPopUpMediator.as b/clients/flash/air-client/src/org/bigbluebutton/air/main/views/EmojiPopUpMediator.as new file mode 100644 index 0000000000000000000000000000000000000000..af9e14aa1ea1b3ce7a3d3f7e5f37f22388383605 --- /dev/null +++ b/clients/flash/air-client/src/org/bigbluebutton/air/main/views/EmojiPopUpMediator.as @@ -0,0 +1,71 @@ +package org.bigbluebutton.air.main.views { + import flash.events.MouseEvent; + + import mx.collections.ArrayCollection; + import mx.events.FlexMouseEvent; + + import spark.components.SkinnablePopUpContainer; + + import org.bigbluebutton.air.main.commands.EmojiSignal; + import org.bigbluebutton.air.main.models.IMeetingData; + + import robotlegs.bender.bundles.mvcs.Mediator; + + public class EmojiPopUpMediator extends Mediator { + + [Inject] + public var meetingData:IMeetingData; + + [Inject] + public var view:EmojiPopUp; + + [Inject] + public var emojiSignal:EmojiSignal; + + protected var dataProvider:ArrayCollection; + + override public function initialize():void { + view.statusList.addEventListener(MouseEvent.CLICK, onSelectStatus); + + for (var i:Number = 0; i < view.statusList.dataProvider.length; i++) { + if (meetingData.users.me.emoji == view.statusList.dataProvider.getItemAt(i).signal) { + view.statusList.setSelectedIndex(i); + break; + } + } + updateListOrientation(); + view.addEventListener(FlexMouseEvent.MOUSE_DOWN_OUTSIDE, closePopUp); + } + + private function closePopUp(e:FlexMouseEvent):void { + (view as SkinnablePopUpContainer).close(false); + } + + private function updateListOrientation():void { + /* + if (FlexGlobals.topLevelApplication.aspectRatio == "landscape") { + view.statusList.layout = new HorizontalLayout(); + view.statusList.width = FlexGlobals.topLevelApplication.width; + view.statusList.setStyle('verticalScrollPolicy', ScrollPolicy.OFF); + view.statusList.itemRenderer = new ClassFactory(HorizontalStatusItemRenderer); + } else { + + } + */ + } + + private function onSelectStatus(event:MouseEvent):void { + emojiSignal.dispatch(meetingData.users.me, view.statusList.selectedItem.signal); + view.close(); + } + + override public function destroy():void { + view.statusList.addEventListener(MouseEvent.CLICK, onSelectStatus); + view.removeEventListener(FlexMouseEvent.MOUSE_DOWN_OUTSIDE, closePopUp); + view.close(); + view = null; + super.destroy(); + } + + } +} diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/main/views/MenuButtonsMediator.as b/clients/flash/air-client/src/org/bigbluebutton/air/main/views/MenuButtonsMediator.as index d8b67f4dcd2233f3755676e208e5200a772f6b4a..fed60934919386d9cb12df05c7e05ece023d8f16 100755 --- a/clients/flash/air-client/src/org/bigbluebutton/air/main/views/MenuButtonsMediator.as +++ b/clients/flash/air-client/src/org/bigbluebutton/air/main/views/MenuButtonsMediator.as @@ -1,5 +1,6 @@ package org.bigbluebutton.air.main.views { + import flash.display.DisplayObjectContainer; import flash.events.MouseEvent; import org.bigbluebutton.air.common.PageEnum; @@ -14,12 +15,16 @@ package org.bigbluebutton.air.main.views { import org.bigbluebutton.air.voice.models.VoiceUser; import robotlegs.bender.bundles.mvcs.Mediator; + import robotlegs.bender.extensions.mediatorMap.api.IMediatorMap; public class MenuButtonsMediator extends Mediator { [Inject] public var view:MenuButtons; + [Inject] + public var mediatorMap:IMediatorMap; + [Inject] public var shareMicrophoneSignal:ShareMicrophoneSignal; @@ -51,20 +56,14 @@ package org.bigbluebutton.air.main.views { } private function changeStatus(e:MouseEvent):void { - /*var changeStatusPopUp:ChangeStatusPopUp = new ChangeStatusPopUp(); - mediatorMap.mediate(changeStatusPopUp); - changeStatusPopUp.width = view.width; - changeStatusPopUp.height = view.height; - changeStatusPopUp.open(view as DisplayObjectContainer, true); - - if (FlexGlobals.topLevelApplication.aspectRatio == "landscape") { - changeStatusPopUp.x = view.x + view.statusButton.x; - changeStatusPopUp.y = view.y - changeStatusPopUp.height * 2; - } else { - changeStatusPopUp.x = -(view.width - view.statusButton.x - view.statusButton.width) / 2 - (view.statusButton.width - (view.statusButton.skin as PresentationButtonSkin).backgroundEllipse.width) / 2 + 6; - changeStatusPopUp.y = view.y - changeStatusPopUp.height * changeStatusPopUp.statusList.dataProvider.length; - } - */ + // TODO : improve use a singel instance + var emojiPopUp:EmojiPopUp = new EmojiPopUp(); + emojiPopUp.width = view.width; + emojiPopUp.height = view.height; + emojiPopUp.open(view.parentApplication as DisplayObjectContainer, true); + + emojiPopUp.x = view.x + view.statusButton.x - 10; + emojiPopUp.y = view.y - emojiPopUp.height * 2 - 35; } protected function micOnOff(e:MouseEvent):void { diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/main/views/menubuttons/changestatus/StatusItemRenderer.mxml b/clients/flash/air-client/src/org/bigbluebutton/air/main/views/menubuttons/changestatus/StatusItemRenderer.mxml new file mode 100644 index 0000000000000000000000000000000000000000..5610991beb8851a79fec0fe0cef4100871329976 --- /dev/null +++ b/clients/flash/air-client/src/org/bigbluebutton/air/main/views/menubuttons/changestatus/StatusItemRenderer.mxml @@ -0,0 +1,89 @@ +<?xml version="1.0" encoding="utf-8"?> +<s:ItemRenderer xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:s="library://ns.adobe.com/flex/spark" + xmlns:mx="library://ns.adobe.com/flex/mx" + autoDrawBackground="false" + styleName="statusItemStyle"> + <s:states> + <s:State name="normal" /> + <s:State name="selected" /> + </s:states> + + <fx:Script> + <![CDATA[ + override public function set data(obj:Object):void { + super.data = obj; + if (obj) { + statusButton.styleName = "bottomPresentationBtnStyle " + obj.style; + } + } + ]]> + </fx:Script> + <s:Group id="content" + width="100%" + height="{getStyle('itemHeight')}"> + <s:layout> + <s:HorizontalLayout verticalAlign="middle" + horizontalAlign="right" + paddingLeft="{getStyle('itemPaddingLeft')}" + paddingRight="{getStyle('itemPaddingRight')}" /> + </s:layout> + + <s:Label id="labelDisplay" + textAlign="right" + width="100%" + height="100%" + styleName="contentFontSize" /> + + <s:Group id="icon"> + <s:Button id="statusButton" + height="100%" /> + </s:Group> + </s:Group> + + <s:Group visible.normal="false" + width="100%" + x="{icon.x + icon.width - selectionCircle.width/1.5}" + y="{icon.y + icon.height/4}" + height="100%"> + <s:Ellipse id="selectionCircle" + height="30%" + width="{selectionCircle.height}"> + <s:fill> + <s:SolidColor color="{getStyle('selectedColor')}" /> + </s:fill> + </s:Ellipse> + + <s:Ellipse id="innerSelectionCircle" + height="{selectionCircle.height * 0.7}" + width="{innerSelectionCircle.height}" + x="{selectionCircle.x + (selectionCircle.width - innerSelectionCircle.width)/2}" + y="{selectionCircle.y + (selectionCircle.height - innerSelectionCircle.height)/2}"> + <s:stroke> + <s:SolidColorStroke color="{getStyle('strokeColor')}" /> + </s:stroke> + </s:Ellipse> + + <s:Line id="selectedLine1" + xFrom="{innerSelectionCircle.x + innerSelectionCircle.width / 3.2}" + xTo="{innerSelectionCircle.x + innerSelectionCircle.width / 2.3}" + yFrom="{innerSelectionCircle.y + innerSelectionCircle.height / 2}" + yTo="{innerSelectionCircle.y + innerSelectionCircle.height / 1.5}"> + <s:stroke> + <s:SolidColorStroke color="{getStyle('strokeColor')}" /> + </s:stroke> + </s:Line> + + <s:Line id="selectedLine2" + xFrom="{innerSelectionCircle.x + innerSelectionCircle.width / 1.4}" + xTo="{innerSelectionCircle.x + innerSelectionCircle.width / 2.3}" + yFrom="{innerSelectionCircle.y + innerSelectionCircle.height / 2.5}" + yTo="{innerSelectionCircle.y + innerSelectionCircle.height / 1.5}"> + <s:stroke> + <s:SolidColorStroke color="{getStyle('strokeColor')}" /> + </s:stroke> + </s:Line> + + </s:Group> + +</s:ItemRenderer> diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/main/views/skins/PresentationButtonSkin.mxml b/clients/flash/air-client/src/org/bigbluebutton/air/main/views/skins/PresentationButtonSkin.mxml new file mode 100644 index 0000000000000000000000000000000000000000..b037ab503af726b501b4960901c618c7472a82df --- /dev/null +++ b/clients/flash/air-client/src/org/bigbluebutton/air/main/views/skins/PresentationButtonSkin.mxml @@ -0,0 +1,37 @@ +<?xml version="1.0" encoding="utf-8"?> +<s:Skin xmlns:fx="http://ns.adobe.com/mxml/2009" + xmlns:s="library://ns.adobe.com/flex/spark"> + <!-- host component --> + <fx:Metadata> + [HostComponent("spark.components.Button")] + </fx:Metadata> + + <!-- states --> + <s:states> + <s:State name="disabled" /> + <s:State name="down" /> + <s:State name="over" /> + <s:State name="up" /> + </s:states> + + <s:Ellipse id="backgroundEllipse" + height="{image.height * 3/2}" + width="{backgroundEllipse.height}" + x="{(this.width - backgroundEllipse.width)/2}" + y="{(this.height - backgroundEllipse.height)/2}"> + <s:fill> + <s:SolidColor color="{hostComponent.getStyle('backgroundColor')}" + color.down="{hostComponent.getStyle('selectedBackgroundColor')}" /> + </s:fill> + </s:Ellipse> + <s:BitmapImage id="image" + source="{getStyle('backgroundImage')}" + horizontalCenter="0" + verticalCenter="0" /> + + <s:Label id="iconLabel" + text="{hostComponent.label}" + x="{(this.width - iconLabel.width)/2}" + y="{backgroundEllipse.y + backgroundEllipse.height * 9/8}" /> + +</s:Skin> diff --git a/clients/flash/air-client/src/org/bigbluebutton/air/user/models/EmojiStatus.as b/clients/flash/air-client/src/org/bigbluebutton/air/user/models/EmojiStatus.as index 209673d59c455cb1ec5f8da2eedbdc9e87ba1629..94d3dcdac49e1f8a7ba33040007b9a6348524409 100755 --- a/clients/flash/air-client/src/org/bigbluebutton/air/user/models/EmojiStatus.as +++ b/clients/flash/air-client/src/org/bigbluebutton/air/user/models/EmojiStatus.as @@ -21,7 +21,6 @@ package org.bigbluebutton.air.user.models { public static const APPLAUSE:String = "applause"; - public static const STATUS_ARRAY:Array = [RAISE_HAND, HAPPY, NEUTRAL, SAD, CONFUSED, AWAY, THUMBS_UP, THUMBS_DOWN, APPLAUSE]; } }