/*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2020 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
*
*/
+// EXTERNAL INCLUDES
#include <dali-toolkit/dali-toolkit.h>
-
+#include <dali/devel-api/actors/actor-devel.h>
+#include <sstream>
#include <iostream>
+#include <dali-toolkit/devel-api/controls/table-view/table-view.h>
+#include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
+
using namespace Dali;
using Dali::Toolkit::TextLabel;
namespace
{
-const char* IMAGE_PATH[] = {
- DEMO_IMAGE_DIR "application-icon-0.png",
- DEMO_IMAGE_DIR "application-icon-100.png",
- DEMO_IMAGE_DIR "application-icon-101.png",
- DEMO_IMAGE_DIR "application-icon-102.png",
- DEMO_IMAGE_DIR "application-icon-103.png",
- DEMO_IMAGE_DIR "application-icon-104.png",
- DEMO_IMAGE_DIR "application-icon-105.png",
- DEMO_IMAGE_DIR "application-icon-106.png",
- DEMO_IMAGE_DIR "application-icon-107.png",
- DEMO_IMAGE_DIR "application-icon-108.png",
- DEMO_IMAGE_DIR "application-icon-109.png",
- DEMO_IMAGE_DIR "application-icon-10.png",
- DEMO_IMAGE_DIR "application-icon-110.png",
- DEMO_IMAGE_DIR "application-icon-111.png",
- DEMO_IMAGE_DIR "application-icon-112.png",
- DEMO_IMAGE_DIR "application-icon-113.png",
- DEMO_IMAGE_DIR "application-icon-114.png",
- DEMO_IMAGE_DIR "application-icon-115.png",
- DEMO_IMAGE_DIR "application-icon-116.png",
- DEMO_IMAGE_DIR "application-icon-117.png",
- DEMO_IMAGE_DIR "application-icon-118.png",
- DEMO_IMAGE_DIR "application-icon-119.png",
- DEMO_IMAGE_DIR "application-icon-11.png",
- DEMO_IMAGE_DIR "application-icon-120.png",
- DEMO_IMAGE_DIR "application-icon-121.png",
- DEMO_IMAGE_DIR "application-icon-122.png",
- DEMO_IMAGE_DIR "application-icon-123.png",
- DEMO_IMAGE_DIR "application-icon-124.png",
- DEMO_IMAGE_DIR "application-icon-125.png",
- DEMO_IMAGE_DIR "application-icon-126.png",
- DEMO_IMAGE_DIR "application-icon-127.png",
- DEMO_IMAGE_DIR "application-icon-128.png",
- DEMO_IMAGE_DIR "application-icon-129.png",
- DEMO_IMAGE_DIR "application-icon-12.png",
- DEMO_IMAGE_DIR "application-icon-130.png",
- DEMO_IMAGE_DIR "application-icon-131.png",
- DEMO_IMAGE_DIR "application-icon-132.png",
- DEMO_IMAGE_DIR "application-icon-133.png",
- DEMO_IMAGE_DIR "application-icon-134.png",
- DEMO_IMAGE_DIR "application-icon-135.png",
- DEMO_IMAGE_DIR "application-icon-136.png",
- DEMO_IMAGE_DIR "application-icon-137.png",
- DEMO_IMAGE_DIR "application-icon-138.png",
- DEMO_IMAGE_DIR "application-icon-139.png",
- DEMO_IMAGE_DIR "application-icon-13.png",
- DEMO_IMAGE_DIR "application-icon-140.png",
- DEMO_IMAGE_DIR "application-icon-141.png",
- DEMO_IMAGE_DIR "application-icon-142.png",
- DEMO_IMAGE_DIR "application-icon-143.png",
- DEMO_IMAGE_DIR "application-icon-144.png",
- DEMO_IMAGE_DIR "application-icon-145.png",
- DEMO_IMAGE_DIR "application-icon-146.png",
- DEMO_IMAGE_DIR "application-icon-147.png",
- DEMO_IMAGE_DIR "application-icon-14.png",
- DEMO_IMAGE_DIR "application-icon-15.png",
- DEMO_IMAGE_DIR "application-icon-16.png",
- DEMO_IMAGE_DIR "application-icon-17.png",
- DEMO_IMAGE_DIR "application-icon-18.png",
- DEMO_IMAGE_DIR "application-icon-19.png",
- DEMO_IMAGE_DIR "application-icon-1.png",
- DEMO_IMAGE_DIR "application-icon-20.png",
- DEMO_IMAGE_DIR "application-icon-21.png",
- DEMO_IMAGE_DIR "application-icon-22.png",
- DEMO_IMAGE_DIR "application-icon-23.png",
- DEMO_IMAGE_DIR "application-icon-24.png",
- DEMO_IMAGE_DIR "application-icon-25.png",
- DEMO_IMAGE_DIR "application-icon-26.png",
- DEMO_IMAGE_DIR "application-icon-27.png",
- DEMO_IMAGE_DIR "application-icon-28.png",
- DEMO_IMAGE_DIR "application-icon-29.png",
- DEMO_IMAGE_DIR "application-icon-2.png",
- DEMO_IMAGE_DIR "application-icon-30.png",
- DEMO_IMAGE_DIR "application-icon-31.png",
- DEMO_IMAGE_DIR "application-icon-32.png",
- DEMO_IMAGE_DIR "application-icon-33.png",
- DEMO_IMAGE_DIR "application-icon-34.png",
- DEMO_IMAGE_DIR "application-icon-35.png",
- DEMO_IMAGE_DIR "application-icon-36.png",
- DEMO_IMAGE_DIR "application-icon-37.png",
- DEMO_IMAGE_DIR "application-icon-38.png",
- DEMO_IMAGE_DIR "application-icon-39.png",
- DEMO_IMAGE_DIR "application-icon-3.png",
- DEMO_IMAGE_DIR "application-icon-40.png",
- DEMO_IMAGE_DIR "application-icon-41.png",
- DEMO_IMAGE_DIR "application-icon-42.png",
- DEMO_IMAGE_DIR "application-icon-43.png",
- DEMO_IMAGE_DIR "application-icon-44.png",
- DEMO_IMAGE_DIR "application-icon-45.png",
- DEMO_IMAGE_DIR "application-icon-46.png",
- DEMO_IMAGE_DIR "application-icon-47.png",
- DEMO_IMAGE_DIR "application-icon-48.png",
- DEMO_IMAGE_DIR "application-icon-49.png",
- DEMO_IMAGE_DIR "application-icon-4.png",
- DEMO_IMAGE_DIR "application-icon-50.png",
- DEMO_IMAGE_DIR "application-icon-51.png",
- DEMO_IMAGE_DIR "application-icon-52.png",
- DEMO_IMAGE_DIR "application-icon-53.png",
- DEMO_IMAGE_DIR "application-icon-54.png",
- DEMO_IMAGE_DIR "application-icon-55.png",
- DEMO_IMAGE_DIR "application-icon-56.png",
- DEMO_IMAGE_DIR "application-icon-57.png",
- DEMO_IMAGE_DIR "application-icon-58.png",
- DEMO_IMAGE_DIR "application-icon-59.png",
- DEMO_IMAGE_DIR "application-icon-5.png",
- DEMO_IMAGE_DIR "application-icon-60.png",
- DEMO_IMAGE_DIR "application-icon-61.png",
- DEMO_IMAGE_DIR "application-icon-62.png",
- DEMO_IMAGE_DIR "application-icon-63.png",
- DEMO_IMAGE_DIR "application-icon-64.png",
- DEMO_IMAGE_DIR "application-icon-65.png",
- DEMO_IMAGE_DIR "application-icon-66.png",
- DEMO_IMAGE_DIR "application-icon-67.png",
- DEMO_IMAGE_DIR "application-icon-68.png",
- DEMO_IMAGE_DIR "application-icon-69.png",
- DEMO_IMAGE_DIR "application-icon-6.png",
- DEMO_IMAGE_DIR "application-icon-70.png",
- DEMO_IMAGE_DIR "application-icon-71.png",
- DEMO_IMAGE_DIR "application-icon-72.png",
- DEMO_IMAGE_DIR "application-icon-73.png",
- DEMO_IMAGE_DIR "application-icon-74.png",
- DEMO_IMAGE_DIR "application-icon-75.png",
- DEMO_IMAGE_DIR "application-icon-76.png",
- DEMO_IMAGE_DIR "application-icon-77.png",
- DEMO_IMAGE_DIR "application-icon-78.png",
- DEMO_IMAGE_DIR "application-icon-79.png",
- DEMO_IMAGE_DIR "application-icon-7.png",
- DEMO_IMAGE_DIR "application-icon-80.png",
- DEMO_IMAGE_DIR "application-icon-81.png",
- DEMO_IMAGE_DIR "application-icon-82.png",
- DEMO_IMAGE_DIR "application-icon-83.png",
- DEMO_IMAGE_DIR "application-icon-84.png",
- DEMO_IMAGE_DIR "application-icon-85.png",
- DEMO_IMAGE_DIR "application-icon-86.png",
- DEMO_IMAGE_DIR "application-icon-87.png",
- DEMO_IMAGE_DIR "application-icon-88.png",
- DEMO_IMAGE_DIR "application-icon-89.png",
- DEMO_IMAGE_DIR "application-icon-8.png",
- DEMO_IMAGE_DIR "application-icon-90.png",
- DEMO_IMAGE_DIR "application-icon-91.png",
- DEMO_IMAGE_DIR "application-icon-92.png",
- DEMO_IMAGE_DIR "application-icon-93.png",
- DEMO_IMAGE_DIR "application-icon-94.png",
- DEMO_IMAGE_DIR "application-icon-95.png",
- DEMO_IMAGE_DIR "application-icon-96.png",
- DEMO_IMAGE_DIR "application-icon-97.png",
- DEMO_IMAGE_DIR "application-icon-98.png",
- DEMO_IMAGE_DIR "application-icon-99.png",
- DEMO_IMAGE_DIR "application-icon-9.png",
- NULL
+enum IconType
+{
+ IMAGEVIEW,
+ CHECKBOX
};
+const char* IMAGE_PATH_PREFIX ( DEMO_IMAGE_DIR "application-icon-" );
+const char* IMAGE_PATH_POSTFIX ( ".png" );
+const int TOTAL_ICON_DEFINITIONS ( 147 );
+
+const char* BACKGROUND_IMAGE ( DEMO_IMAGE_DIR "background-3.jpg" );
+const float PAGE_SCALE_FACTOR_X ( 0.95f );
+const float PAGE_SCALE_FACTOR_Y ( 0.95f );
+const float PAGE_DURATION_SCALE_FACTOR ( 10.0f ); ///< Time-scale factor, larger = animation is slower
+
+const float DEFAULT_OPT_ROW_COUNT ( 5 );
+const float DEFAULT_OPT_COL_COUNT ( 4 );
+const float DEFAULT_OPT_PAGE_COUNT ( 10 );
+const bool DEFAULT_OPT_USE_TABLEVIEW ( true );
+const bool DEFAULT_OPT_ICON_LABELS ( true );
+const IconType DEFAULT_OPT_ICON_TYPE ( IMAGEVIEW );
+const bool DEFAULT_OPT_USE_TEXT_LABEL ( false );
+
+// The image/label area tries to make sure the positioning will be relative to previous sibling
+const float IMAGE_AREA ( 0.60f );
+const float LABEL_AREA ( 0.50f );
+
+
+
/**
- * Random words used as unique application names
+ * Random words used as unique application names.
+ * The number matches the value of TOTAL_ICON_DEFINITIONS.
*/
const char* DEMO_APPS_NAMES[] =
{
- "Achdyer",
- "Achtortor",
- "Ackirlor",
- "Ackptin",
- "Aighte",
- "Akala",
- "Alealdny",
- "Angash",
- "Anglor",
- "Anveraugh",
- "Ardangas",
- "Ardug",
- "Ardworu",
- "Ascerald",
- "Ash'ach",
- "Athiund",
- "Aughm",
- "Aughtheryer",
- "Awitad",
- "Banengon",
- "Banhinat",
- "Belrisash",
- "Bilorm",
- "Bleustcer",
- "Bliagelor",
- "Blorynton",
- "Booten",
- "Bripolqua",
- "Bryray",
- "Burust",
- "Cataikel",
- "Cerilwar",
- "Cerl",
- "Certin",
- "Checerper",
- "Chegit",
- "Cheirat",
- "Che'rak",
- "Cheves",
- "Chiperath",
- "Chralerack",
- "Chram",
- "Clyimen",
- "Coqueang",
- "Craennther",
- "Cykage",
- "Dalek",
- "Darhkel",
- "Daril",
- "Darpban",
- "Dasrad",
- "Deeqskel",
- "Delurnther",
- "Denalda",
- "Derynkel",
- "Deurnos",
- "Doyaryke",
- "Draithon",
- "Drantess",
- "Druardny",
- "Dynsaytor",
- "Dytinris",
- "Eeni",
- "Elmryn",
- "Emgha",
- "Emiton",
- "Emworeng",
- "Endnys",
- "Enessray",
- "Engyer",
- "En'rady",
- "Enthount",
- "Enundem",
- "Essina",
- "Faughald",
- "Fiummos",
- "Garash",
- "Garight",
- "Garrynath",
- "Ghalora",
- "Ghatan",
- "Gibanis",
- "Hatdyn",
- "Heesban",
- "Hesub",
- "Hinkelenth",
- "Hirryer",
- "Ideinta",
- "Im'eld",
- "Ina'ir",
- "Ing'moro",
- "Ingormess",
- "Ingshy",
- "Issath",
- "Issendris",
- "Issey",
- "Issum",
- "Itenthbel",
- "K'ackves",
- "Kagdra",
- "Kalbankim",
- "Kal'enda",
- "Kimest",
- "Kimundeng",
- "Koachlor",
- "Kuren",
- "Kygver",
- "Kyning",
- "Laiyach",
- "Lasuzu",
- "Lekew",
- "Lerengom",
- "Lertan",
- "Liadem",
- "Liathar",
- "Liephden",
- "Likellor",
- "Loightmos",
- "Loromum",
- "Lorr",
- "Lortas",
- "Lyerr",
- "Maustbur",
- "Menvor",
- "Meusten",
- "Mirodskel",
- "Morhatrod",
- "Moserbel",
- "Mosorrad",
- "Mosraye",
- "Mosth",
- "Neabar",
- "Neerdem",
- "Nichqua",
- "Nudraough",
- "Nuyim",
- "Nycha",
- "Nyia",
- "Nyjac",
- "Nystondar",
- "Okine",
- "Oldit",
- "Om'mose",
- "Onye",
- "Ososrak",
- "Pecertin",
- "Perrd",
- "Phutorny",
- "Puizlye",
- "Quirantai",
- NULL
+ "Achdyer", "Aughm", "Cerl", "Daril", "Emgha", "Ghatan", "Issum", "Lertan", "Mosorrad",
+ "Achtortor", "Aughtheryer", "Certin", "Darpban", "Emiton", "Gibanis", "Itenthbel", "Liadem", "Mosraye",
+ "Ackirlor", "Awitad", "Checerper", "Dasrad", "Emworeng", "Hatdyn", "K'ackves", "Liathar", "Mosth",
+ "Ackptin", "Banengon", "Chegit", "Deeqskel", "Endnys", "Heesban", "Kagdra", "Liephden", "Neabar",
+ "Aighte", "Banhinat", "Cheirat", "Delurnther", "Enessray", "Hesub", "Kalbankim", "Likellor", "Neerdem",
+ "Akala", "Belrisash", "Che'rak", "Denalda", "Engyer", "Hinkelenth", "Kal'enda", "Loightmos", "Nichqua",
+ "Alealdny", "Bilorm", "Cheves", "Derynkel", "En'rady", "Hirryer", "Kimest", "Loromum", "Nudraough",
+ "Angash", "Bleustcer", "Chiperath", "Deurnos", "Enthount", "Ideinta", "Kimundeng", "Lorr", "Nuyim",
+ "Anglor", "Bliagelor", "Chralerack", "Doyaryke", "Enundem", "Im'eld", "Koachlor", "Lortas", "Nycha",
+ "Anveraugh", "Blorynton", "Chram", "Draithon", "Essina", "Ina'ir", "Kuren", "Lyerr", "Nyia",
+ "Ardangas", "Booten", "Clyimen", "Drantess", "Faughald", "Ing'moro", "Kygver", "Maustbur", "Nyjac",
+ "Ardug", "Bripolqua", "Coqueang", "Druardny", "Fiummos", "Ingormess", "Kyning", "Menvor", "Nystondar",
+ "Ardworu", "Bryray", "Craennther", "Dynsaytor", "Garash", "Ingshy", "Laiyach", "Meusten", "Okine",
+ "Ascerald", "Burust", "Cykage", "Dytinris", "Garight", "Issath", "Lasuzu", "Mirodskel", "Oldit",
+ "Ash'ach", "Cataikel", "Dalek", "Eeni", "Garrynath", "Issendris", "Lekew", "Morhatrod", "Om'mose",
+ "Athiund", "Cerilwar", "Darhkel", "Elmryn", "Ghalora", "Issey", "Lerengom", "Moserbel", "Onye",
+ "Ososrak", "Pecertin", "Perrd"
};
-// this code comes from command-line-options.cpp. the reason it's here is to
-// keep consistent the extra-help formatting when '--help' used
-
+// This code comes from command-line-options.cpp. the reason it's here is to
+// keep consistent the extra-help formatting when '--help' used.
void PrintHelp( const char * const opt, const char * const optDescription)
{
const std::ios_base::fmtflags flags = std::cout.flags();
std::cout.flags( flags );
}
-const float PAGE_SCALE_FACTOR_X ( 0.95f );
-const float PAGE_SCALE_FACTOR_Y ( 0.95f );
-const float PAGE_DURATION_SCALE_FACTOR ( 2.0f ); // time-scale factor, larger = animation is slower
-
-const float DEFAULT_OPT_ROW_COUNT ( 5 );
-const float DEFAULT_OPT_COL_COUNT ( 4 );
-const float DEFAULT_OPT_PAGE_COUNT ( 10 );
-const bool DEFAULT_OPT_USETABLEVIEW ( false );
-
}
-// This example is a benchmark that mimics the paged applications list of the homescreen app
-//
+/**
+ * @brief This example is a benchmark that mimics the paged applications list of the homescreen application.
+ */
class HomescreenBenchmark : public ConnectionTracker
{
public:
// Config structure passed to the constructor. It makes easier to increase number
- // of setup parameters if needed
+ // of setup parameters if needed.
struct Config
{
Config() :
mRows( DEFAULT_OPT_ROW_COUNT ),
mCols( DEFAULT_OPT_COL_COUNT ),
mPageCount( DEFAULT_OPT_PAGE_COUNT ),
- mUseTableView( DEFAULT_OPT_USETABLEVIEW )
+ mTableViewEnabled( DEFAULT_OPT_USE_TABLEVIEW ),
+ mIconLabelsEnabled( DEFAULT_OPT_ICON_LABELS ),
+ mIconType( DEFAULT_OPT_ICON_TYPE ),
+ mUseTextLabel( DEFAULT_OPT_USE_TEXT_LABEL )
{
}
- int mRows;
- int mCols;
- int mPageCount;
- bool mUseTableView;
+ int mRows;
+ int mCols;
+ int mPageCount;
+ bool mTableViewEnabled;
+ bool mIconLabelsEnabled;
+ IconType mIconType;
+ bool mUseTextLabel;
};
// animation script data
struct ScriptData
{
ScriptData( int pages, float duration, bool flick )
+ : mPages( pages ),
+ mDuration( duration ),
+ mFlick( flick )
{
- mPages = pages;
- mDuration = duration;
- mFlick = flick;
}
- int mPages; // number of pages to scroll
- float mDuration; // duration
- bool mFlick; // use flick or 'one-by-one' scroll
+ int mPages; ///< Number of pages to scroll
+ float mDuration; ///< Duration
+ bool mFlick; ///< Use flick or 'one-by-one' scroll
};
HomescreenBenchmark( Application& application, const Config& config )
: mApplication( application ),
mConfig( config ),
+ mScriptFrame( 0 ),
mCurrentPage( 0 )
{
- // Connect to the Application's Init signal
+ // Connect to the Application's Init signal.
mApplication.InitSignal().Connect( this, &HomescreenBenchmark::Create );
}
~HomescreenBenchmark()
{
- // Nothing to do here;
}
- // The Init signal is received once (only) during the Application lifetime
+ // The Init signal is received once (only) during the Application lifetime.
void Create( Application& application )
{
- // create benchmark script
+ // Create benchmark script
CreateScript();
- // Get a handle to the stage
- Stage stage = Stage::GetCurrent();
+ // Get a handle to the window
+ Window window = application.GetWindow();
mScrollParent = Actor::New();
mScrollParent.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
- mScrollParent.SetAnchorPoint( AnchorPoint::CENTER );
- mScrollParent.SetParentOrigin( ParentOrigin::CENTER );
+ mScrollParent.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
+ mScrollParent.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
// create background
- Toolkit::ImageView background = Toolkit::ImageView::New( DEMO_IMAGE_DIR "background-3.jpg");
- Stage::GetCurrent().Add(background);
+ Toolkit::ImageView background = Toolkit::ImageView::New( BACKGROUND_IMAGE );
+ window.Add( background );
background.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS );
- background.SetAnchorPoint( AnchorPoint::CENTER );
- background.SetParentOrigin( ParentOrigin::CENTER );
+ background.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
+ background.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
PopulatePages();
- stage.Add(mScrollParent);
+ window.Add( mScrollParent );
- // Respond to a click anywhere on the stage
- stage.GetRootLayer().TouchedSignal().Connect( this, &HomescreenBenchmark::OnTouch );
+ // Respond to a click anywhere on the window.
+ window.GetRootLayer().TouchSignal().Connect( this, &HomescreenBenchmark::OnTouch );
+
+ // Respond to key events
+ window.KeyEventSignal().Connect( this, &HomescreenBenchmark::OnKeyEvent );
}
bool OnTouch( Actor actor, const TouchEvent& touch )
{
- // quit the application
+ // Quit the application.
mApplication.Quit();
return true;
}
Actor AddPage()
{
- // create root page actor
- Actor pageActor;
+ // Create root page actor.
+ Toolkit::Control pageActor;
- if( mConfig.mUseTableView )
+ if( mConfig.mTableViewEnabled )
{
- Toolkit::TableView tableView = Toolkit::TableView::New( mConfig.mRows, mConfig.mCols );
- tableView.SetBackgroundColor( Vector4( 0.0f, 0.0f, 0.0f, 0.5f ) );
- pageActor = tableView;
+ pageActor = Toolkit::TableView::New( mConfig.mRows, mConfig.mCols );
}
else
{
pageActor = Toolkit::Control::New();
- pageActor.SetProperty( Toolkit::Control::Property::BACKGROUND_COLOR, Vector4( 0.0f, 0.0f, 0.0f, 0.5f ) );
}
- pageActor.SetParentOrigin( ParentOrigin::CENTER );
- pageActor.SetAnchorPoint( AnchorPoint::CENTER );
+ pageActor.SetBackgroundColor( Vector4( 0.0f, 0.0f, 0.0f, 0.5f ) );
+ pageActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
+ pageActor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
pageActor.SetResizePolicy( ResizePolicy::SIZE_RELATIVE_TO_PARENT, Dimension::ALL_DIMENSIONS );
- pageActor.SetSizeModeFactor(Vector3( PAGE_SCALE_FACTOR_X, PAGE_SCALE_FACTOR_Y, 1.0f ) );
+ pageActor.SetProperty( Actor::Property::SIZE_MODE_FACTOR, Vector3( PAGE_SCALE_FACTOR_X, PAGE_SCALE_FACTOR_Y, 1.0f ) );
return pageActor;
}
- void AddIconsToPage(Actor page)
+ Toolkit::ImageView CreateImageView( const unsigned int currentIconIndex )
{
- Size stageSize( Stage::GetCurrent().GetSize() );
- const float scaledHeight = stageSize.y * PAGE_SCALE_FACTOR_Y;
- const float scaledWidth = stageSize.x * PAGE_SCALE_FACTOR_X;
+ // Create empty image to avoid early renderer creation
+ Toolkit::ImageView imageView = Toolkit::ImageView::New();
+
+ // Auto-generate the Icons image URL.
+ Property::Map map;
+ std::stringstream imagePath;
+ imagePath << IMAGE_PATH_PREFIX << currentIconIndex << IMAGE_PATH_POSTFIX;
+ map[ Dali::Toolkit::ImageVisual::Property::URL ] = imagePath.str();
+
+ imageView.SetProperty( Toolkit::ImageView::Property::IMAGE, map );
+ imageView.SetResizePolicy( ResizePolicy::SIZE_RELATIVE_TO_PARENT, Dimension::ALL_DIMENSIONS );
+ imageView.SetProperty( Actor::Property::SIZE_SCALE_POLICY, SizeScalePolicy::FIT_WITH_ASPECT_RATIO );
+ imageView.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
+ imageView.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
+ imageView.SetProperty( Actor::Property::SIZE_MODE_FACTOR, Vector3( IMAGE_AREA, IMAGE_AREA, 1.0f ) );
+
+ return imageView;
+ }
- const float PADDING = stageSize.y / 64.0f;
- const float ROW_HEIGHT = ( scaledHeight - (PADDING*2.0f) ) / (float)mConfig.mRows;
- const float COL_WIDTH = ( scaledWidth - (PADDING*2.0f) ) / (float)mConfig.mCols;
+ Toolkit::Button CreateButton( const unsigned int currentIconIndex )
+ {
+ Toolkit::CheckBoxButton button = Toolkit::CheckBoxButton::New();
+ button.SetResizePolicy( ResizePolicy::SIZE_RELATIVE_TO_PARENT, Dimension::ALL_DIMENSIONS );
+ button.SetProperty( Actor::Property::SIZE_SCALE_POLICY, SizeScalePolicy::FIT_WITH_ASPECT_RATIO );
+ button.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
+ button.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
+ button.SetProperty( Toolkit::Button::Property::SELECTED, ( currentIconIndex % 2 == 0 ) ); // Select half the button
+
+ return button;
+ }
- // the image/label area tries to make sure the positioning will be relative to previous sibling
- const float IMAGE_AREA = 0.60f;
- const float LABEL_AREA = 0.50f;
+ void AddIconsToPage( Actor page, bool useTextLabel )
+ {
+ Window window = mApplication.GetWindow();
- static int currentIconIndex = 0;
+ Size windowSize( window.GetSize() );
+ const float scaledHeight = windowSize.y * PAGE_SCALE_FACTOR_Y;
+ const float scaledWidth = windowSize.x * PAGE_SCALE_FACTOR_X;
+ const float PADDING = windowSize.y / 64.0f;
+ const float ROW_HEIGHT = ( scaledHeight - (PADDING*2.0f) ) / static_cast<float>( mConfig.mRows );
+ const float COL_WIDTH = ( scaledWidth - (PADDING*2.0f) ) / static_cast<float>( mConfig.mCols );
+
+ Vector2 dpi = window.GetDpi();
- Vector2 dpi = Stage::GetCurrent().GetDpi();
+ static int currentIconIndex = 0;
for( int y = 0; y < mConfig.mRows; ++y )
{
for( int x = 0; x < mConfig.mCols; ++x )
{
- // create parent icon view
+ // Create parent icon view
Toolkit::Control iconView = Toolkit::Control::New();
- iconView.SetAnchorPoint( AnchorPoint::TOP_LEFT );
- iconView.SetParentOrigin( ParentOrigin::TOP_LEFT );
+ iconView.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
+ iconView.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
- if( !mConfig.mUseTableView )
+ if( !mConfig.mTableViewEnabled )
{
float rowX = x * COL_WIDTH + PADDING;
float rowY = y * ROW_HEIGHT + PADDING;
- iconView.SetSize( Vector3( COL_WIDTH, ROW_HEIGHT, 1.0f ) );
- iconView.SetPosition( Vector3( rowX, rowY, 0.0f ) );
+ iconView.SetProperty( Actor::Property::SIZE, Vector3( COL_WIDTH, ROW_HEIGHT, 1.0f ) );
+ iconView.SetProperty( Actor::Property::POSITION, Vector3( rowX, rowY, 0.0f ) );
}
else
{
iconView.SetResizePolicy( ResizePolicy::SIZE_RELATIVE_TO_PARENT, Dimension::ALL_DIMENSIONS );
- iconView.SetSizeScalePolicy( SizeScalePolicy::FIT_WITH_ASPECT_RATIO );
+ iconView.SetProperty( Actor::Property::SIZE_SCALE_POLICY, SizeScalePolicy::FIT_WITH_ASPECT_RATIO );
}
- // create image view
- Toolkit::ImageView imageView = Toolkit::ImageView::New( IMAGE_PATH[currentIconIndex] );
- imageView.SetResizePolicy( ResizePolicy::SIZE_RELATIVE_TO_PARENT, Dimension::ALL_DIMENSIONS );
- imageView.SetSizeScalePolicy( SizeScalePolicy::FIT_WITH_ASPECT_RATIO );
- imageView.SetAnchorPoint( AnchorPoint::CENTER );
- imageView.SetParentOrigin( ParentOrigin::CENTER );
- imageView.SetSizeModeFactor( Vector3(IMAGE_AREA, IMAGE_AREA, 1.0f) );
+ Actor icon;
- // create label
- Toolkit::TextLabel textLabel = Toolkit::TextLabel::New( DEMO_APPS_NAMES[currentIconIndex] );
- textLabel.SetAnchorPoint( AnchorPoint::TOP_CENTER );
- textLabel.SetParentOrigin( ParentOrigin::BOTTOM_CENTER );
-
- textLabel.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS );
- textLabel.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, Vector4( 1.0f, 1.0f, 1.0f, 1.0f ) );
- textLabel.SetProperty( Toolkit::TextLabel::Property::POINT_SIZE, (((float)( ROW_HEIGHT * LABEL_AREA ) * 72.0f) / (dpi.y))*0.25f );
- textLabel.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
- textLabel.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "TOP" );
+ switch( mConfig.mIconType )
+ {
+ case CHECKBOX:
+ {
+ icon = CreateButton( currentIconIndex );
+ break;
+ }
+ case IMAGEVIEW:
+ {
+ icon = CreateImageView( currentIconIndex );
+ break;
+ }
+ }
- iconView.Add( imageView );
- imageView.Add( textLabel );
+ if( mConfig.mIconLabelsEnabled )
+ {
+ // create label
+ if( useTextLabel )
+ {
+ Toolkit::TextLabel textLabel = Toolkit::TextLabel::New( DEMO_APPS_NAMES[currentIconIndex] );
+ textLabel.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER );
+ textLabel.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::BOTTOM_CENTER );
+ textLabel.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::ALL_DIMENSIONS );
+ textLabel.SetProperty( Toolkit::TextLabel::Property::TEXT_COLOR, Vector4( 1.0f, 1.0f, 1.0f, 1.0f ) ); // White.
+ textLabel.SetProperty( Toolkit::TextLabel::Property::POINT_SIZE, ( ( static_cast<float>( ROW_HEIGHT * LABEL_AREA ) * 72.0f ) / dpi.y ) * 0.25f );
+ textLabel.SetProperty( Toolkit::TextLabel::Property::HORIZONTAL_ALIGNMENT, "CENTER" );
+ textLabel.SetProperty( Toolkit::TextLabel::Property::VERTICAL_ALIGNMENT, "TOP" );
+ icon.Add( textLabel );
+ }
+ else
+ {
+ Property::Map map;
+ map.Add( Toolkit::Visual::Property::TYPE, Toolkit::Visual::TEXT ).
+ Add( Toolkit::TextVisual::Property::TEXT, DEMO_APPS_NAMES[currentIconIndex] ).
+ Add( Toolkit::TextVisual::Property::TEXT_COLOR, Color::WHITE ).
+ Add( Toolkit::TextVisual::Property::POINT_SIZE, ( ( static_cast<float>( ROW_HEIGHT * LABEL_AREA ) * 72.0f ) / dpi.y ) * 0.25f ).
+ Add( Toolkit::TextVisual::Property::HORIZONTAL_ALIGNMENT, "CENTER" ).
+ Add( Toolkit::TextVisual::Property::VERTICAL_ALIGNMENT, "TOP" );
+
+ Toolkit::Control control = Toolkit::Control::New();
+ control.SetProperty( Toolkit::Control::Property::BACKGROUND, map );
+ control.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_CENTER );
+ control.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::BOTTOM_CENTER );
+ icon.Add( control );
+ }
+ }
- page.Add(iconView);
+ iconView.Add( icon );
+ page.Add( iconView );
- if( !IMAGE_PATH[ ++currentIconIndex ] )
+ // We only have images and names for a certain number of icons.
+ // Wrap around if we have used them all.
+ if( ++currentIconIndex == TOTAL_ICON_DEFINITIONS )
{
currentIconIndex = 0;
}
void CreateScript()
{
- const int lastPage = mConfig.mPageCount-1;
- const int halfA = lastPage/2;
- const int halfB = lastPage/2 + lastPage%2;
- mScriptFrameData.push_back( ScriptData( lastPage, 1.5f, true));
- mScriptFrameData.push_back( ScriptData( -lastPage, 1.5f, true ));
- mScriptFrameData.push_back( ScriptData( halfA, 1.0f, true ));
- mScriptFrameData.push_back( ScriptData( halfB, 1.0f, true ));
- mScriptFrameData.push_back( ScriptData( -lastPage, 0.5f, false ));
- mScriptFrameData.push_back( ScriptData( halfA, 0.5f, false ));
- mScriptFrameData.push_back( ScriptData( halfB, 1.0f, true ));
- mScriptFrameData.push_back( ScriptData( -halfA, 1.0f, true ));
- mScriptFrameData.push_back( ScriptData( 1, 0.1f, true ));
- mScriptFrameData.push_back( ScriptData( -1, 0.1f, true ));
- mScriptFrameData.push_back( ScriptData( 1, 0.1f, true ));
- mScriptFrameData.push_back( ScriptData( -1, 0.1f, true ));
- mScriptFrameData.push_back( ScriptData( 1, 0.1f, true ));
- mScriptFrameData.push_back( ScriptData( -1, 0.1f, true ));
- mScriptFrameData.push_back( ScriptData( halfA, 1.0f, true ));
+ const int lastPage = mConfig.mPageCount - 1;
+ const int halfA = lastPage / 2;
+ const int halfB = lastPage / 2 + lastPage % 2;
+ mScriptFrameData.push_back( ScriptData( lastPage, 1.5f, true ) );
+ mScriptFrameData.push_back( ScriptData( -lastPage, 1.5f, true ) );
+ mScriptFrameData.push_back( ScriptData( halfA, 1.0f, true ) );
+ mScriptFrameData.push_back( ScriptData( halfB, 1.0f, true ) );
+ mScriptFrameData.push_back( ScriptData( -lastPage, 0.5f, false ) );
+ mScriptFrameData.push_back( ScriptData( halfA, 0.5f, false ) );
+ mScriptFrameData.push_back( ScriptData( halfB, 1.0f, true ) );
+ mScriptFrameData.push_back( ScriptData( -halfA, 1.0f, true ) );
+ mScriptFrameData.push_back( ScriptData( 1, 0.1f, true ) );
+ mScriptFrameData.push_back( ScriptData( -1, 0.1f, true ) );
+ mScriptFrameData.push_back( ScriptData( 1, 0.1f, true ) );
+ mScriptFrameData.push_back( ScriptData( -1, 0.1f, true ) );
+ mScriptFrameData.push_back( ScriptData( 1, 0.1f, true ) );
+ mScriptFrameData.push_back( ScriptData( -1, 0.1f, true ) );
+ mScriptFrameData.push_back( ScriptData( halfA, 1.0f, true ) );
}
void PopulatePages()
{
- Vector3 stageSize( Stage::GetCurrent().GetSize() );
- const float SCALED_HEIGHT = stageSize.y * PAGE_SCALE_FACTOR_Y;
+ Vector3 windowSize( mApplication.GetWindow().GetSize() );
for( int i = 0; i < mConfig.mPageCount; ++i )
{
- // create page
+ // Create page.
Actor page = AddPage();
- // populate icons
- AddIconsToPage(page);
+ // Populate icons.
+ AddIconsToPage( page, mConfig.mUseTextLabel );
- // move page 'a little bit up'
- page.SetParentOrigin( ParentOrigin::CENTER );
- page.SetAnchorPoint( AnchorPoint::CENTER );
- page.SetPosition( Vector3(stageSize.x*i, -0.30f*( stageSize.y-SCALED_HEIGHT ), 0.0f) );
+ // Move page 'a little bit up'.
+ page.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
+ page.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
+ page.SetProperty( Actor::Property::POSITION, Vector3( windowSize.x * i, 0.0f, 0.0f ) );
mScrollParent.Add( page );
}
- mScrollParent.SetOpacity( 0.0f );
- mScrollParent.SetScale( Vector3(0.0f, 0.0f, 0.0f) );
+ mScrollParent.SetProperty( Actor::Property::OPACITY, 1.0f );
+ mScrollParent.SetProperty( Actor::Property::SCALE, Vector3::ONE );
- // fade in
+ // Fade in.
ShowAnimation();
}
void ShowAnimation()
{
- mShowAnimation = Animation::New(1.0f);
- mShowAnimation.AnimateTo( Property(mScrollParent, Actor::Property::COLOR_ALPHA), 1.0f, AlphaFunction::EASE_IN_OUT );
- mShowAnimation.AnimateTo( Property(mScrollParent, Actor::Property::SCALE), Vector3(1.0f, 1.0f, 1.0f), AlphaFunction::EASE_IN_OUT );
+ mShowAnimation = Animation::New( 1.0f );
+ mShowAnimation.AnimateTo( Property( mScrollParent, Actor::Property::COLOR_ALPHA ), 1.0f, AlphaFunction::EASE_IN_OUT );
+ mShowAnimation.AnimateTo( Property( mScrollParent, Actor::Property::SCALE ), Vector3::ONE, AlphaFunction::EASE_IN_OUT );
mShowAnimation.FinishedSignal().Connect( this, &HomescreenBenchmark::OnAnimationEnd );
mShowAnimation.Play();
}
void ScrollPages(int pages, float duration, bool flick)
{
duration *= PAGE_DURATION_SCALE_FACTOR;
- Vector3 stageSize( Stage::GetCurrent().GetSize() );
- mScrollAnimation = Animation::New(duration);
+ Vector3 windowSize( mApplication.GetWindow().GetSize() );
+ mScrollAnimation = Animation::New( duration );
if( flick )
{
- mScrollAnimation.AnimateBy( Property(mScrollParent, Actor::Property::POSITION), Vector3(-stageSize.x*pages, 0.0f, 0.0f), AlphaFunction::EASE_IN_OUT );
+ mScrollAnimation.AnimateBy( Property( mScrollParent, Actor::Property::POSITION ), Vector3( -windowSize.x * pages, 0.0f, 0.0f ), AlphaFunction::EASE_IN_OUT );
}
else
{
- for( int i = 0; i < abs(pages); ++i )
+ int totalPages = abs( pages );
+ for( int i = 0; i < totalPages; ++i )
{
- mScrollAnimation.AnimateBy( Property(mScrollParent, Actor::Property::POSITION), Vector3(pages < 0 ? stageSize.x : -stageSize.x, 0.0f, 0.0f), AlphaFunction::EASE_IN_OUT, TimePeriod(duration*i, duration) );
+ mScrollAnimation.AnimateBy( Property( mScrollParent, Actor::Property::POSITION ), Vector3( pages < 0 ? windowSize.x : -windowSize.x, 0.0f, 0.0f ), AlphaFunction::EASE_IN_OUT, TimePeriod( duration * i, duration ) );
}
}
mScrollAnimation.FinishedSignal().Connect( this, &HomescreenBenchmark::OnAnimationEnd );
void OnAnimationEnd( Animation& source )
{
- if( source == mShowAnimation )
- {
- ScriptData& frame = mScriptFrameData[0];
- ScrollPages( frame.mPages, frame.mDuration, frame.mFlick );
- mScriptFrame = 1;
- }
- else if( mScriptFrame < mScriptFrameData.size() && source == mScrollAnimation )
+ if( mScriptFrame < mScriptFrameData.size() )
{
ScriptData& frame = mScriptFrameData[mScriptFrame];
ScrollPages( frame.mPages, frame.mDuration, frame.mFlick );
}
}
+ void OnKeyEvent( const KeyEvent& event )
+ {
+ if( event.GetState() == KeyEvent::Down )
+ {
+ if ( IsKey( event, Dali::DALI_KEY_ESCAPE ) || IsKey( event, Dali::DALI_KEY_BACK ) )
+ {
+ mApplication.Quit();
+ }
+ }
+ }
+
private:
- Application& mApplication;
+ Application& mApplication;
Actor mScrollParent;
-
Animation mShowAnimation;
Animation mScrollAnimation;
-
Config mConfig;
-
std::vector<ScriptData> mScriptFrameData;
size_t mScriptFrame;
-
int mCurrentPage;
};
-void RunTest( Application& application, const HomescreenBenchmark::Config& config, bool printHelpAndExit )
-{
- HomescreenBenchmark test( application, config );
-
- if( printHelpAndExit )
- {
- PrintHelp( "c<num>", " Number of columns");
- PrintHelp( "r<num>", " Number of rows");
- PrintHelp( "p<num>", " Number of pages ( must be greater than 1 )");
- PrintHelp( "-use-tableview", " Uses TableView for layouting");
- return;
- }
-
- application.MainLoop();
-}
-
-// Entry point for Linux & Tizen applications
-//
-int main( int argc, char **argv )
+int DALI_EXPORT_API main( int argc, char **argv )
{
- // default settings
+ // Default settings.
HomescreenBenchmark::Config config;
bool printHelpAndExit = false;
- for( int i(1) ; i < argc; ++i )
+ for( int i = 1 ; i < argc; ++i )
{
std::string arg( argv[i] );
if( arg.compare( 0, 2, "-r" ) == 0 )
{
config.mPageCount = atoi( arg.substr( 2 ).c_str() );
}
- else if( arg.compare( "--use-tableview" ) == 0 )
+ else if( arg.compare( "--disable-tableview" ) == 0 )
+ {
+ config.mTableViewEnabled = false;
+ }
+ else if( arg.compare( "--disable-icon-labels" ) == 0 )
+ {
+ config.mIconLabelsEnabled = false;
+ }
+ else if( arg.compare( "--use-checkbox" ) == 0 )
{
- config.mUseTableView = true;
+ config.mIconType = CHECKBOX;
+ }
+ else if( arg.compare("--use-text-label" ) == 0)
+ {
+ config.mUseTextLabel = true;
}
else if( arg.compare( "--help" ) == 0 )
{
printHelpAndExit = true;
}
-
}
Application application = Application::New( &argc, &argv );
+ HomescreenBenchmark test( application, config );
- RunTest( application, config, printHelpAndExit );
+ if( printHelpAndExit )
+ {
+ PrintHelp( "c<num>", " Number of columns" );
+ PrintHelp( "r<num>", " Number of rows" );
+ PrintHelp( "p<num>", " Number of pages ( must be greater than 1 )" );
+ PrintHelp( "-disable-tableview", " Disables the use of TableView for layouting" );
+ PrintHelp( "-disable-icon-labels", " Disables labels for each icon" );
+ PrintHelp( "-use-checkbox", " Uses checkboxes for icons" );
+ PrintHelp( "-use-text-label", " Uses TextLabel instead of a TextVisual" );
+ return 0;
+ }
+
+ application.MainLoop();
return 0;
}