Ticket #2539: fade.patch

File fade.patch, 28.0 KB (added by meddle, 11 years ago)

Design patch

  • modules/org.sophie2.main.app.halos/src/main/java/org/sophie2/main/app/halos/huds/appearance/AppearanceHud.java

    ### Eclipse Workspace Patch 1.0
    #P sophie
     
    66import java.util.Collections; 
    77import java.util.List; 
    88 
     9import javax.swing.Box; 
     10import javax.swing.BoxLayout; 
    911import javax.swing.JPanel; 
    1012 
    1113import org.sophie2.base.bound.BoundCheckBox; 
     
    1820import org.sophie2.base.bound.BoundValidation.Status; 
    1921import org.sophie2.base.bound.ComboInput; 
    2022import org.sophie2.base.bound.ComboState; 
     23import org.sophie2.base.commons.skin.IconId; 
     24import org.sophie2.base.commons.skin.IconsSet; 
    2125import org.sophie2.base.commons.structures.ImmTreeList; 
     26import org.sophie2.base.commons.util.ImageUtil; 
    2227import org.sophie2.base.commons.util.ImmColor; 
    2328import org.sophie2.base.commons.util.ImmList; 
    2429import org.sophie2.base.commons.util.position.ImmInsets; 
     
    2833import org.sophie2.base.halos.HudDialog; 
    2934import org.sophie2.base.halos.HudTitleBar; 
    3035import org.sophie2.base.halos.SubHudButton; 
     36import org.sophie2.base.layout.LogicR3Button; 
    3137import org.sophie2.base.media.TimePos; 
    3238import org.sophie2.base.model.book.BackgroundType; 
    3339import org.sophie2.base.model.book.FrameH; 
     
    4955import org.sophie2.base.skins.SkinElementId; 
    5056import org.sophie2.base.visual.BaseSwingVisualElement; 
    5157import org.sophie2.base.visual.BaseVisualElement; 
     58import org.sophie2.base.visual.SwingVisualElement; 
    5259import org.sophie2.base.visual.VisualElement; 
    5360import org.sophie2.base.visual.skins.ElementPartCreator; 
    5461import org.sophie2.base.visual.skins.RelatedChildren; 
     
    5663import org.sophie2.base.visual.skins.VisualElementDef; 
    5764import org.sophie2.core.logging.SophieLog; 
    5865import org.sophie2.core.mvc.EventFilterBuilder; 
     66import org.sophie2.core.mvc.EventParams; 
    5967import org.sophie2.core.mvc.OperationDef; 
    6068import org.sophie2.core.mvc.events.EventR3; 
    6169import org.sophie2.core.prolib.annot.Own; 
     70import org.sophie2.core.prolib.annot.Setup; 
    6271import org.sophie2.core.prolib.impl.AutoListProperty; 
    6372import org.sophie2.core.prolib.impl.AutoProperty; 
    6473import org.sophie2.core.prolib.impl.ResourceProperty; 
     
    7281import org.sophie2.main.app.commons.page.PageWorkArea; 
    7382import org.sophie2.main.app.commons.page.RootPageView; 
    7483import org.sophie2.main.app.halos.actions.ChangeFrameVisibilityAction; 
     84import org.sophie2.main.app.halos.actions.FadeInAction; 
     85import org.sophie2.main.app.halos.actions.FadeOutAction; 
    7586import org.sophie2.main.app.halos.common.AppHaloUtil; 
    7687import org.sophie2.main.app.halos.huds.ElementHud; 
    7788import org.sophie2.main.app.halos.huds.TemplatesControlGroup; 
     89import org.sophie2.main.app.halos.huds.appearance.AppearanceHud.AlphaControlsContainer.FadeInButton; 
     90import org.sophie2.main.app.halos.huds.appearance.AppearanceHud.AlphaControlsContainer.FadeOutButton; 
     91import org.sophie2.main.app.halos.huds.appearance.AppearanceHud.AlphaControlsContainer.FrameAlphaSlider; 
     92import org.sophie2.main.app.halos.huds.appearance.AppearanceHud.AlphaControlsContainer.ResetButton; 
    7893import org.sophie2.main.app.halos.huds.color.ColorPickerHudField; 
    7994import org.sophie2.main.app.halos.shared.AppearanceHaloButton; 
    8095 
     
    92107        AppearanceHud.BorderColorField.class, 
    93108        AppearanceHud.BorderSizeField.class, 
    94109        AppearanceHud.BackgroundPanel.class, 
    95         AppearanceHud.FrameAlphaSlider.class, 
     110        AppearanceHud.AlphaControlsContainer.class, 
    96111        AppearanceHud.FrameVisibleCheck.class, 
    97112        AppearanceHud.BackgroundOpacitySlider.class, 
    98113        //      removed for test-relase3 
     
    139154        } 
    140155 
    141156        /** 
    142          * The field that determines whether a frame is initially shown. 
    143          * 
     157         * The container the alpha manipulation controls. 
     158         *  
    144159         * @author meddle 
    145160         */ 
    146         @VisualElementDef(parent = AppearanceHud.class, sortKey = "aaa-frame-alpha-field") 
    147         public static class FrameAlphaSlider extends BoundSlider { 
     161        @RelatedChildren({ 
     162                AlphaControlsContainer.FrameAlphaSlider.class, 
     163                AlphaControlsContainer.FadeInButton.class, 
     164                AlphaControlsContainer.FadeOutButton.class, 
     165                AlphaControlsContainer.ResetButton.class 
     166        }) 
     167        @VisualElementDef(parent = AppearanceHud.class, sortKey = "aaa-alpha-controls-container") 
     168        public static class AlphaControlsContainer extends BaseSwingVisualElement { 
    148169 
    149170                @SuppressWarnings("unused") 
    150171                @SkinPartDef 
    151                 private static void fillSkinParts(ElementPartCreator part) { 
    152                         part.add(TITLE_PROP_ID, "Opacity"); 
    153                         part.add(FONT_ID, new Font("Arial", Font.BOLD, 10)); 
    154                         part.add(FONT_COLOR_ID, new ImmColor(0.17578125f, 0.26171875f, 0.6875f)); 
    155                         part.add(CONTROL_SIZE_PROP_ID, new ImmSize(70, 30)); 
    156                         part.add(SIZE_PROP_ID, new ImmSize(150, 50)); 
     172                private static void defineSkin(ElementPartCreator part) { 
     173                        part.add(SIZE_PROP_ID, new ImmSize(200, 22)); 
     174                } 
    157175 
    158                         part.add(MINIMUM_RANGE_PROP_ID, 0); 
    159                         part.add(MAXIMUM_RANGE_PROP_ID, 100); 
    160                         part.add(MINOR_TICK_SPACING_PROP_ID, 5); 
    161                         part.add(MAJOR_TICK_SPACING_PROP_ID, 25); 
    162                         part.add(PAINT_TICKS_PROP_ID, false); 
    163                         part.add(PAINT_LABELS_PROP_ID, false); 
     176                @Override 
     177                public Prop<JPanel> swingComponent() { 
     178                        class swingComponent extends ResourceProperty<JPanel> { 
     179 
     180                                @Override 
     181                                protected JPanel create() { 
     182                                        JPanel res = new JPanel(); 
     183 
     184                                        BoxLayout layout = new BoxLayout(res, BoxLayout.X_AXIS); 
     185                                        res.setLayout(layout); 
     186                                        return res; 
     187                                } 
     188 
     189                                @Override 
     190                                protected void destroy(JPanel res) { 
     191                                        // do nothing. 
     192                                } 
     193 
     194                                @Override 
     195                                protected void setup(JPanel res) { 
     196                                        res.setVisible(visible().get()); 
     197                                } 
     198 
     199                                @SuppressWarnings("unused") 
     200                                @Setup 
     201                                protected void setupElements(JPanel res) { 
     202                                        res.removeAll(); 
     203 
     204                                        for (SwingVisualElement e : elements().get()) { 
     205                                                if (e instanceof ResetButton) { 
     206                                                        res.add(Box.createHorizontalStrut(10)); 
     207                                                } 
     208                                                 
     209                                                res.add(e.swingComponent().get()); 
     210                                        } 
     211                                } 
     212 
     213                        } 
     214                        return getBean().makeProp(swingComponent.class); 
    164215                } 
    165216 
    166217                @Override 
     
    170221                        return (view != null) && Boolean.TRUE.equals(view.transparent().get()); 
    171222                } 
    172223 
    173                 @Override 
    174                 protected Integer computeModelData() { 
    175                         FrameView frameView = AppHaloUtil.getSingleFrameView(this); 
    176                         if (frameView == null) { 
    177                                 return 0; 
     224                /** 
     225                 * The elements inside this container. 
     226                 *  
     227                 * @return  
     228                 *                      List property. 
     229                 */ 
     230                @Own 
     231                public ListProp<? extends SwingVisualElement> elements() { 
     232                        class elements extends AutoListProperty<SwingVisualElement> { 
     233 
     234                                @SuppressWarnings("synthetic-access") 
     235                                @Override 
     236                                protected ProList<SwingVisualElement> constructList() { 
     237                                        return createElementPropList(SwingVisualElement.class, AlphaControlsContainer.this.getClass(), 
     238                                                        null); 
     239                                } 
    178240                        } 
     241                        return getBean().makeProp(elements.class); 
     242                } 
    179243 
    180                         TimePos time = frameView.getTime(); 
     244                /** 
     245                 * The IDs of the events the alpha controls fire. 
     246                 *  
     247                 * @author meddle 
     248                 */ 
     249                public enum EventIds { 
     250                         
     251                        /** 
     252                         * The user sets fade-in effect from the current time of the timeline. 
     253                         */ 
     254                        @EventParams({}) 
     255                        FADE_IN, 
     256                         
    181257 
    182                         ResourceAccess access = frameView.getAccess(); 
    183                         VisibleChannel alphaChannel = ElementR4.KEY_ALPHA.get(access); 
     258                        /** 
     259                         * The user sets fade-out effect from the current time of the timeline. 
     260                         */ 
     261                        @EventParams({}) 
     262                        FADE_OUT,  
     263                         
     264                        /** 
     265                         * The user resets all the visibility effects. 
     266                         */ 
     267                        @EventParams({}) 
     268                        RESET; 
     269                } 
     270                 
     271                /** 
     272                 * The field that determines whether a frame is initially shown. 
     273                 * 
     274                 * @author meddle 
     275                 */ 
     276                @VisualElementDef(parent = AlphaControlsContainer.class, sortKey = "aaa-frame-alpha-field") 
     277                public static class FrameAlphaSlider extends BoundSlider { 
     278 
     279                        @SuppressWarnings("unused") 
     280                        @SkinPartDef 
     281                        private static void fillSkinParts(ElementPartCreator part) { 
     282                                part.add(TITLE_PROP_ID, "Opacity"); 
     283                                part.add(FONT_ID, new Font("Arial", Font.BOLD, 10)); 
     284                                part.add(FONT_COLOR_ID, new ImmColor(0.17578125f, 0.26171875f, 0.6875f)); 
     285                                part.add(CONTROL_SIZE_PROP_ID, new ImmSize(70, 30)); 
     286                                part.add(SIZE_PROP_ID, new ImmSize(150, 30)); 
     287 
     288                                part.add(MINIMUM_RANGE_PROP_ID, 0); 
     289                                part.add(MAXIMUM_RANGE_PROP_ID, 100); 
     290                                part.add(MINOR_TICK_SPACING_PROP_ID, 5); 
     291                                part.add(MAJOR_TICK_SPACING_PROP_ID, 25); 
     292                                part.add(PAINT_TICKS_PROP_ID, false); 
     293                                part.add(PAINT_LABELS_PROP_ID, false); 
     294                        } 
     295 
     296                        @Override 
     297                        protected boolean computeVisible() { 
     298                                FrameView view = AppHaloUtil.getSingleFrameView(this); 
     299 
     300                                return (view != null) && Boolean.TRUE.equals(view.transparent().get()); 
     301                        } 
     302 
     303                        @Override 
     304                        protected Integer computeModelData() { 
     305                                FrameView frameView = AppHaloUtil.getSingleFrameView(this); 
     306                                if (frameView == null) { 
     307                                        return 0; 
     308                                } 
     309 
     310                                TimePos time = frameView.getTime(); 
     311 
     312                                ResourceAccess access = frameView.getAccess(); 
     313                                VisibleChannel alphaChannel = ElementR4.KEY_ALPHA.get(access); 
     314 
     315                                return 100 - alphaChannel.getValue(time); 
     316                        } 
    184317 
    185                         return 100 - alphaChannel.getValue(time); 
     318                        @Override 
     319                        protected BoundValidation validate(Integer inputData) { 
     320                                return BoundValidation.SUCCESS; 
     321                        } 
    186322                } 
    187323 
    188                 @Override 
    189                 protected BoundValidation validate(Integer inputData) { 
    190                         return BoundValidation.SUCCESS; 
     324                /** 
     325                 * The button for fade-in effect. 
     326                 *  
     327                 * @author meddle 
     328                 */ 
     329                @VisualElementDef(parent = AlphaControlsContainer.class, sortKey = "bbb-fade-in-button") 
     330                public static class FadeInButton extends LogicR3Button { 
     331 
     332                        @SuppressWarnings("unused") 
     333                        @SkinPartDef 
     334                        private static void fillSkinParts(ElementPartCreator part) { 
     335                                IconsSet iconsSet = new IconsSet(); 
     336 
     337                                iconsSet.addIcon(IconId.DEFAULT, ImageUtil.loadIcon("appearanceHud/fade_in.png")); 
     338                                iconsSet.addIcon(IconId.MOUSE_OVER, ImageUtil.loadIcon("appearanceHud/fade_in_over.png")); 
     339                                iconsSet.addIcon(IconId.PRESSED, ImageUtil.loadIcon("appearanceHud/fade_in_pressed.png")); 
     340 
     341                                part.add(TOOL_TIP_PROP_ID, "Fade in after the current timeline position"); 
     342                                part.add(SIZE_PROP_ID, new ImmSize(21, 22)); 
     343                                part.add(ICON_SET_PROP_ID, iconsSet); 
     344                        } 
     345 
     346                        @Override 
     347                        protected ImmList<EventR3> computeEvents() { 
     348                                return ImmTreeList.<EventR3>create(new EventR3(this, null, null, null, EventIds.FADE_IN)); 
     349                        } 
     350 
     351                        @Override 
     352                        protected boolean computeVisible() { 
     353                                FrameView view = AppHaloUtil.getSingleFrameView(this); 
     354 
     355                                return (view != null) && Boolean.TRUE.equals(view.transparent().get()); 
     356                        } 
    191357                } 
    192         } 
     358                 
     359                /** 
     360                 * The button for fade-in effect. 
     361                 *  
     362                 * @author meddle 
     363                 */ 
     364                @VisualElementDef(parent = AlphaControlsContainer.class, sortKey = "bbb-fade-out-button") 
     365                public static class FadeOutButton extends LogicR3Button { 
     366 
     367                        @SuppressWarnings("unused") 
     368                        @SkinPartDef 
     369                        private static void fillSkinParts(ElementPartCreator part) { 
     370                                IconsSet iconsSet = new IconsSet(); 
     371 
     372                                iconsSet.addIcon(IconId.DEFAULT, ImageUtil.loadIcon("appearanceHud/fade_out.png")); 
     373                                iconsSet.addIcon(IconId.MOUSE_OVER, ImageUtil.loadIcon("appearanceHud/fade_out_over.png")); 
     374                                iconsSet.addIcon(IconId.PRESSED, ImageUtil.loadIcon("appearanceHud/fade_out_pressed.png")); 
     375 
     376                                part.add(TOOL_TIP_PROP_ID, "Fade out after the current timeline position"); 
     377                                part.add(SIZE_PROP_ID, new ImmSize(21, 22)); 
     378                                part.add(ICON_SET_PROP_ID, iconsSet); 
     379                        } 
     380 
     381                        @Override 
     382                        protected ImmList<EventR3> computeEvents() { 
     383                                return ImmTreeList.<EventR3>create(new EventR3(this, null, null, null, EventIds.FADE_OUT)); 
     384                        } 
     385 
     386                        @Override 
     387                        protected boolean computeVisible() { 
     388                                FrameView view = AppHaloUtil.getSingleFrameView(this); 
     389 
     390                                return (view != null) && Boolean.TRUE.equals(view.transparent().get()); 
     391                        } 
     392                } 
     393                 
     394                /** 
     395                 * The button for reseting all the alpha effects on the current element's visibility channel. 
     396                 *  
     397                 * @author meddle 
     398                 */ 
     399                @VisualElementDef(parent = AlphaControlsContainer.class, sortKey = "bbb-reset-button") 
     400                public static class ResetButton extends LogicR3Button { 
     401 
     402                        @SuppressWarnings("unused") 
     403                        @SkinPartDef 
     404                        private static void fillSkinParts(ElementPartCreator part) { 
     405                                IconsSet iconsSet = new IconsSet(); 
     406 
     407                                iconsSet.addIcon(IconId.DEFAULT, ImageUtil.loadIcon("appearanceHud/reset.png")); 
     408                                iconsSet.addIcon(IconId.MOUSE_OVER, ImageUtil.loadIcon("appearanceHud/reset_over.png")); 
     409                                iconsSet.addIcon(IconId.PRESSED, ImageUtil.loadIcon("appearanceHud/reset_pressed.png")); 
     410 
     411                                part.add(TOOL_TIP_PROP_ID, "Reset visibility - remove effects and set the frame to be visible"); 
     412                                part.add(SIZE_PROP_ID, new ImmSize(21, 22)); 
     413                                part.add(ICON_SET_PROP_ID, iconsSet); 
     414                        } 
     415 
     416                        @Override 
     417                        protected ImmList<EventR3> computeEvents() { 
     418                                return ImmTreeList.<EventR3>create(new EventR3(this, null, null, null, EventIds.RESET)); 
     419                        } 
     420 
     421                        @Override 
     422                        protected boolean computeVisible() { 
     423                                FrameView view = AppHaloUtil.getSingleFrameView(this); 
    193424 
     425                                return (view != null) && Boolean.TRUE.equals(view.transparent().get()); 
     426                        } 
     427                }                
     428        } 
     429         
    194430        /** 
    195431         * The field that determines whether a frame is initially shown. 
    196432         * 
     
    415651                protected BoundValidation validate(String inputData) { 
    416652                        return BoundValidation.validateNumber(inputData, Float.class, 
    417653                                        ShadowStyleH.MIN_POSITION, ShadowStyleH.MAX_POSITION, 
    418                         "Shadow offset should be between %g and %g"); 
     654                                        "Shadow offset should be between %g and %g"); 
    419655                } 
    420656 
    421657                @Override 
     
    631867         */ 
    632868        @RelatedChildren( { BackgroundColorField.class, BackgroundGradientField.class, 
    633869                BackgroundImageField.class}) 
    634                 @VisualElementDef(parent = AppearanceHud.class, sortKey = "iii-background-panel") 
    635                 public static class BackgroundPanel extends BaseSwingVisualElement { 
     870        @VisualElementDef(parent = AppearanceHud.class, sortKey = "iii-background-panel") 
     871        public static class BackgroundPanel extends BaseSwingVisualElement { 
    636872 
    637873                @SuppressWarnings("unused") 
    638874                @SkinPartDef 
     
    705941                                                        res.repaint(); 
    706942 
    707943                                                        AppearanceHud hud = 
    708                                                                 BackgroundPanel.this.findParentElement(AppearanceHud.class); 
     944                                                                        BackgroundPanel.this.findParentElement(AppearanceHud.class); 
    709945                                                        hud.subHud().set(null); 
    710946                                                } 
    711947                                        } 
     
    7861022         * Retrieves the helper for border and background keys. 
    7871023         * 
    7881024         * @param element 
    789          *            The element looking for the related model. 
    790          * @return The helper. 
     1025         *          The element looking for the related model. 
     1026         * @return  
     1027         *                      The helper. 
    7911028         */ 
    7921029        protected static ShadowStyleH getShadowHelper(VisualElement element) { 
    7931030                AppearanceHud hud = BaseVisualElement.findParentElement(element, AppearanceHud.class); 
     
    7981035        /** 
    7991036         * Returns the {@link StyledElementH} for the current element. 
    8001037         * 
    801          * @return The property. 
     1038         * @return  
     1039         *                      The property. 
    8021040         */ 
    8031041        public Prop<ShadowStyleH> shadowHelper() { 
    8041042                class shadowHelper extends AutoProperty<ShadowStyleH> { 
     
    10621300                }, 
    10631301 
    10641302                /** 
     1303                 * Handles pressing the fade-in button of the hud. 
     1304                 *  
     1305                 * @author meddle 
     1306                 */ 
     1307                ON_FADE_IN { 
     1308 
     1309                        @Override 
     1310                        public void defineFilter(EventFilterBuilder filter) { 
     1311                                filter.setEventId(AlphaControlsContainer.EventIds.FADE_IN); 
     1312                                filter.setSourceClass(FadeInButton.class); 
     1313                        } 
     1314 
     1315                        @Override 
     1316                        public boolean handle(EventR3 event) { 
     1317                                System.out.println("fade in!!!"); 
     1318                                 
     1319                                VisualElement source = event.getSource(FadeInButton.class); 
     1320 
     1321                                FrameView view = AppHaloUtil.getSingleFrameView(source); 
     1322                                if (view == null) { 
     1323                                        return false; 
     1324                                } 
     1325                                 
     1326                                ResourceAccess access = view.getAccess(); 
     1327                                final VisibleChannel channel = ElementR4.KEY_ALPHA.get(access); 
     1328                                 
     1329                                TimePos time = view.getTime(); 
     1330                                AutoAction action = new FadeInAction(Message.create(FRAME_FADE_IN), 
     1331                                                true, channel,time); 
     1332                                 
     1333                                action.register(access); 
     1334                                 
     1335                                return true; 
     1336                        } 
     1337                         
     1338                }, 
     1339                 
     1340                /** 
     1341                 * Handles pressing the fade-out button of the hud. 
     1342                 *  
     1343                 * @author meddle 
     1344                 */ 
     1345                ON_FADE_OUT { 
     1346 
     1347                        @Override 
     1348                        public void defineFilter(EventFilterBuilder filter) { 
     1349                                filter.setEventId(AlphaControlsContainer.EventIds.FADE_OUT); 
     1350                                filter.setSourceClass(FadeOutButton.class); 
     1351                        } 
     1352 
     1353                        @Override 
     1354                        public boolean handle(EventR3 event) { 
     1355                                VisualElement source = event.getSource(FadeOutButton.class); 
     1356 
     1357                                FrameView view = AppHaloUtil.getSingleFrameView(source); 
     1358                                if (view == null) { 
     1359                                        return false; 
     1360                                } 
     1361                                 
     1362                                ResourceAccess access = view.getAccess(); 
     1363                                final VisibleChannel channel = ElementR4.KEY_ALPHA.get(access); 
     1364                                 
     1365                                TimePos time = view.getTime(); 
     1366                                AutoAction action = new FadeOutAction(Message.create(FRAME_FADE_OUT), 
     1367                                                true, channel,time); 
     1368                                 
     1369                                action.register(access); 
     1370                                 
     1371                                return true; 
     1372                        } 
     1373                         
     1374                }, 
     1375 
     1376                /** 
     1377                 * Handles pressing reset button for the visibility/alpha effects. 
     1378                 *  
     1379                 * @author meddle 
     1380                 */ 
     1381                ON_RESET_FRAME_EFFECTS { 
     1382 
     1383                        @Override 
     1384                        public void defineFilter(EventFilterBuilder filter) { 
     1385                                filter.setEventId(AlphaControlsContainer.EventIds.RESET); 
     1386                                filter.setSourceClass(ResetButton.class); 
     1387                        } 
     1388 
     1389                        @Override 
     1390                        public boolean handle(EventR3 event) { 
     1391                                VisualElement source = event.getSource(ResetButton.class); 
     1392 
     1393                                FrameView view = AppHaloUtil.getSingleFrameView(source); 
     1394                                if (view == null) { 
     1395                                        return false; 
     1396                                } 
     1397                                 
     1398                                ResourceAccess access = view.getAccess(); 
     1399                                 
     1400                                final VisibleChannel channel = ElementR4.KEY_ALPHA.get(access); 
     1401                                 
     1402                                new AutoAction(Message.create(FRAME_FADE_OUT), true) { 
     1403 
     1404                                        @Override 
     1405                                        public void performAuto() { 
     1406                                                getChanger().setRaw(ElementR4.KEY_ALPHA, channel.setAll(0)); 
     1407                                        } 
     1408                                         
     1409                                }.register(access); 
     1410                                 
     1411                                return true; 
     1412                        } 
     1413                         
     1414                }, 
     1415                 
     1416                /** 
    10651417                 * Sets the frame visibility. 
    10661418                 */ 
    10671419                ON_FRAME_VISIBLE_SUBMIT { 
     
    10701422                        public void defineFilter(EventFilterBuilder filter) { 
    10711423                                filter.setEventId(BoundControl.EventIds.SUBMIT); 
    10721424                                filter.setSourceClass(FrameVisibleCheck.class); 
    1073  
    10741425                        } 
    10751426 
    10761427                        @Override 
     
    12921643        public static final String FRAME_VISIBILITY = "Toggle frame visibility."; 
    12931644 
    12941645        /** 
     1646         * Constant created for adding a fade-in effect to a frame. 
     1647         * Constant created to be a parameter of a message of an {@link AutoAction}. 
     1648         * Used for skinning. 
     1649         */ 
     1650        public static final String FRAME_FADE_IN = "Add fade-in effect."; 
     1651 
     1652        /** 
     1653         * Constant created for adding a fade-out effect to a frame. 
     1654         * Constant created to be a parameter of a message of an {@link AutoAction}. 
     1655         * Used for skinning. 
     1656         */ 
     1657        public static final String FRAME_FADE_OUT = "Add fade-out effect."; 
     1658 
     1659        /** 
     1660         * Constant created for reseting alpha effects. 
     1661         * Constant created to be a parameter of a message of an {@link AutoAction}. 
     1662         * Used for skinning. 
     1663         */ 
     1664        public static final String FRAME_RESET_ALPHA_EFFECTS = "Reset all alpha/visibility effects"; 
     1665         
     1666        /** 
    12951667         * Constant created for changing wrap mode. 
    12961668         * Constant created to be a parameter of a message of an {@link AutoAction}. 
    12971669         * Used for skinning. 
  • modules/org.sophie2.base.model.book/src/main/java/org/sophie2/base/model/book/timelines/Channel.java

     
    6868         * Gets the last entry before given time. 
    6969         * 
    7070         * @param time 
    71          *            The time at which to get the value. 
    72          * @return The last entry available, or default entry if there are no 
    73          *         entries prior this time. 
     71         *          The time at which to get the value. 
     72         * @return  
     73         *                      The last entry available, or default entry if there are no 
     74         *          entries prior this time. 
    7475         */ 
    7576        public ImmMap.ImmEntry<TimePos, T> getLast(TimePos time) { 
    7677                int last = getEntries().find(ImmFind.LAST_LE, time); 
     
    8586         * exists. 
    8687         * 
    8788         * @param time 
    88          *            The moment in time. 
    89          * @return The effective value. 
     89         *          The moment in time. 
     90         * @return  
     91         *                      The effective value. 
    9092         */ 
    9193        // protected because for some channels a more apropriate method is needed. 
    9294        protected T getValue(TimePos time) { 
     
    9799         * Sets the value for a specific moment in time. 
    98100         * 
    99101         * @param time 
    100          *            The moment in time. 
     102         *          The moment in time. 
    101103         * @param value 
    102          *            The value to set. 
    103          * @return a newly created channel holding the value. 
     104         *          The value to set. 
     105         * @return  
     106         *                      A newly created channel holding the value. 
    104107         */ 
    105108        public C setValue(TimePos time, T value) { 
    106109                return produce(getEntries().put(time, value)); 
     
    111114         * one (erases all entries). 
    112115         * 
    113116         * @param value 
    114          *            The value to be set. 
    115          * @return The created channel. 
     117         *          The value to be set. 
     118         * @return  
     119         *                      The created channel. 
    116120         */ 
    117121        public C setAll(T value) { 
    118122                ImmMap<TimePos, T> newEntries = ImmTreeMap.empty(); 
     
    123127         * Clears an interval from this channel. 
    124128         * 
    125129         * @param begin 
    126          *            The start position (inclusive). 
     130         *          The start position (inclusive). 
    127131         * @param end 
    128          *            The end position (exclusive). 
    129          * @return Channel like this one, but with all entries in the given interval 
    130          *         removed. 
     132         *          The end position (exclusive). 
     133         * @return  
     134         *                      Channel like this one, but with all entries in the given interval 
     135         *          removed. 
    131136         */ 
    132137        public C clearInterval(TimePos begin, TimePos end) { 
    133138                ImmMap<TimePos, T> newEntries = getEntries(); 
     
    141146         * Replaces all values in the interval with a single one with given value. 
    142147         * 
    143148         * @param begin 
    144          *            The start of the interval (inclusive). 
     149         *          The start of the interval (inclusive). 
    145150         * @param end 
    146          *            The end of the interval (exclusive). 
     151         *          The end of the interval (exclusive). 
    147152         * @param value 
    148          *            The replacing value. 
    149          * @return Channel like this one, but with the described modification. 
     153         *          The replacing value. 
     154         * @return  
     155         *                      Channel like this one, but with the described modification. 
    150156         */ 
    151157        public C setInterval(TimePos begin, TimePos end, T value) { 
    152158                return clearInterval(begin, end).setValue(begin, value); 
  • modules/org.sophie2.base.media/src/main/java/org/sophie2/base/media/TimePos.java

     
    1313 * phases, you need to know the specific length of the phases. 
    1414 * 
    1515 * @author milo 
    16  * 
    1716 */ 
    1817@Immutable(kind = "time-pos") 
    1918public class TimePos implements Comparable<TimePos> { 
     19         
    2020        /** 
    2121         * The time unit. All positions are in whole units. 
    2222         */ 
  • modules/org.sophie2.main.app.halos/src/main/java/org/sophie2/main/app/halos/actions/FadeOutAction.java

     
     1package org.sophie2.main.app.halos.actions; 
     2 
     3import org.sophie2.base.media.TimePos; 
     4import org.sophie2.base.model.book.resource.r4.ElementR4; 
     5import org.sophie2.base.model.book.timelines.VisibleChannel; 
     6import org.sophie2.base.model.resources.r4.changes.AutoAction; 
     7import org.sophie2.base.skins.Message; 
     8 
     9/** 
     10 * Action for creating a fade-out effect using the {@link VisibleChannel} of an element. 
     11 *  
     12 * @author meddle 
     13 */ 
     14public class FadeOutAction extends AutoAction { 
     15 
     16        private final VisibleChannel channel; 
     17        private final TimePos currentTime; 
     18         
     19        /** 
     20         * Constructs the action. 
     21         *  
     22         * @param description 
     23         *             The description of the AutoAction. 
     24         * @param significant 
     25         *                              The significance of the AutoAction. 
     26         * @param channel 
     27         *              The {@link VisibleChannel} of the source. 
     28         * @param time 
     29         *                      The time from where the effect will take place. 
     30         */ 
     31        public FadeOutAction(Message description, boolean significant,  
     32                        VisibleChannel channel, TimePos time) { 
     33                super(description, significant); 
     34                 
     35                this.channel = channel; 
     36                this.currentTime = time; 
     37        } 
     38         
     39        @Override 
     40        public void performAuto() { 
     41                TimePos current = this.currentTime; 
     42                int alpha = this.channel.getValue(current); 
     43                 
     44                VisibleChannel curChannel = this.channel;//.setInterval(start, current, alpha); 
     45                 
     46                long endMillis = current.getMillis() + 1000L; 
     47                 
     48                for (long i = current.getMillis() + 10; i < endMillis; i += 10) { 
     49                        TimePos begin = new TimePos(current.getPhase(), i); 
     50                        TimePos end = new TimePos(current.getPhase(), i + 10); 
     51                 
     52                        if (alpha < 100) { 
     53                                alpha++; 
     54                        } 
     55                        curChannel = curChannel.setInterval(begin, end, alpha); 
     56                } 
     57                 
     58                TimePos endEffect = new TimePos(current.getPhase(), endMillis); 
     59                VisibleChannel value = curChannel.setInterval(endEffect, TimePos.MAX, 100); 
     60                 
     61                getChanger().setRaw(ElementR4.KEY_ALPHA, value); 
     62        } 
     63 
     64} 
  • modules/org.sophie2.main.app.halos/src/main/java/org/sophie2/main/app/halos/actions/FadeInAction.java

     
     1package org.sophie2.main.app.halos.actions; 
     2 
     3import org.sophie2.base.media.TimePos; 
     4import org.sophie2.base.model.book.resource.r4.ElementR4; 
     5import org.sophie2.base.model.book.timelines.VisibleChannel; 
     6import org.sophie2.base.model.resources.r4.changes.AutoAction; 
     7import org.sophie2.base.skins.Message; 
     8 
     9/** 
     10 * Action for creating a fade-in effect using the {@link VisibleChannel} of an element. 
     11 *  
     12 * @author meddle 
     13 */ 
     14public class FadeInAction extends AutoAction { 
     15 
     16        private final VisibleChannel channel; 
     17        private final TimePos currentTime; 
     18         
     19        /** 
     20         * Constructs the action. 
     21         *  
     22         * @param description 
     23         *             The description of the AutoAction. 
     24         * @param significant 
     25         *                              The significance of the AutoAction. 
     26         * @param channel 
     27         *              The {@link VisibleChannel} of the source. 
     28         * @param time 
     29         *                      The time from where the effect will take place. 
     30         */ 
     31        public FadeInAction(Message description, boolean significant,  
     32                        VisibleChannel channel, TimePos time) { 
     33                super(description, significant); 
     34                 
     35                this.channel = channel; 
     36                this.currentTime = time; 
     37        } 
     38 
     39        @Override 
     40        public void performAuto() { 
     41                TimePos start = TimePos.INTRO_START; 
     42                TimePos current = this.currentTime; 
     43                int alpha = 100; 
     44                 
     45                VisibleChannel curChannel = this.channel.setInterval(start, current, alpha); 
     46                 
     47                long endMillis = current.getMillis() + 1000L; 
     48                 
     49                for (long i = current.getMillis() + 10; i < endMillis; i += 10) { 
     50                        TimePos begin = new TimePos(current.getPhase(), i); 
     51                        TimePos end = new TimePos(current.getPhase(), i + 10); 
     52                 
     53                        alpha--; 
     54                        curChannel = curChannel.setInterval(begin, end, alpha); 
     55                } 
     56                 
     57                TimePos endEffect = new TimePos(current.getPhase(), endMillis); 
     58                VisibleChannel visible = curChannel.setInterval(endEffect, TimePos.MAX, 0); 
     59                 
     60                VisibleChannel value = visible; 
     61                 
     62                getChanger().setRaw(ElementR4.KEY_ALPHA, value); 
     63        } 
     64 
     65}