Testing on target
=================
-To build for target, first build and install dali-core, dali-adaptor and dali-toolkit, then build dali-capi without --keep-packs option.
+To build for target, first build and install dali-core, dali-adaptor and dali-toolkit.
You will need to install libconfig-tiny-perl:
sub info(@);
our $repo = Git->repository();
-our $debug=1;
+our $debug=0;
our $pd_debug=0;
our $root;
our %info_data; # Hash containing all data from .info files
# execute coverage.sh, generating build/tizen/dali.info from lib, and
# *.dir/dali.info. Don't generate html
-`coverage.sh -n`;
+print `./coverage.sh -n`;
chdir "..";
$root = getcwd();
my @cmd=('--no-pager','diff','--no-ext-diff','-U0','--no-color');
my $status = $repo->command("status", "-s");
-if(scalar(@ARGV)) # REMOVE ME
-{
- # REMOVE ME - temp to get past modifying this script in place.
- push @cmd, @ARGV;
-}
-elsif( $status eq "" && !scalar(@ARGV))
+if( $status eq "" && !scalar(@ARGV))
{
# There are no changes in the index or working tree, and
# no diff arguments to append. Use the last patch instead.
//text is "c"
DALI_TEST_EQUALS( "c", editor.GetProperty<std::string>( TextEditor::Property::TEXT ), TEST_LOCATION );
+ // select all text
+ DevelTextEditor::SelectWholeText(editor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Copy the selected text using logical keys
+ application.ProcessEvent( GenerateKey( "", "", "", Dali::DevelKey::DALI_KEY_CONTROL_LEFT, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) );
+ application.ProcessEvent( GenerateKey( "ؤ", "c", "ؤ", KEY_C_CODE, KEY_CONTROL_MODIFIER, 0, Integration::KeyEvent::DOWN, "c", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // select none
+ DevelTextEditor::SelectNone(editor);
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // Paste the selected using logical keys
+ application.ProcessEvent( GenerateKey( "", "", "", Dali::DevelKey::DALI_KEY_CONTROL_LEFT, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) );
+ application.ProcessEvent( GenerateKey( "ر", "v", "ر", KEY_V_CODE, KEY_CONTROL_MODIFIER, 0, Integration::KeyEvent::DOWN, "v", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) );
+
+ //text is "cc"
+ DALI_TEST_EQUALS( "cc", editor.GetProperty<std::string>( TextEditor::Property::TEXT ), TEST_LOCATION );
+
+ // select all using logical keys
+ application.ProcessEvent( GenerateKey( "", "", "", Dali::DevelKey::DALI_KEY_CONTROL_LEFT, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) );
+ application.ProcessEvent( GenerateKey( "ش", "a", "ش", KEY_A_CODE, KEY_CONTROL_MODIFIER, 0, Integration::KeyEvent::DOWN, "a", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ // cut text using logical keys
+ application.ProcessEvent( GenerateKey( "", "", "", Dali::DevelKey::DALI_KEY_CONTROL_LEFT, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) );
+ application.ProcessEvent( GenerateKey( "ء", "x", "ء", KEY_X_CODE, KEY_CONTROL_MODIFIER, 0, Integration::KeyEvent::DOWN, "x", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE ) );
+
+ // Render and notify
+ application.SendNotification();
+ application.Render();
+
+ //text is ""
+ DALI_TEST_EQUALS( "", editor.GetProperty<std::string>( TextEditor::Property::TEXT ), TEST_LOCATION );
+
END_TEST;
}
int keyCode = keyEvent.GetKeyCode();
const std::string& keyString = keyEvent.GetKeyString();
const std::string keyName = keyEvent.GetKeyName();
+ // Key will produce same logical-key value when ctrl
+ // is down, regardless of language layout
+ const std::string logicalKey = keyEvent.GetLogicalKey();
const bool isNullKey = ( 0 == keyCode ) && ( keyString.empty() );
else if ( keyEvent.IsCtrlModifier() && !keyEvent.IsShiftModifier())
{
bool consumed = false;
- if (keyName == KEY_C_NAME || keyName == KEY_INSERT_NAME)
+ if (keyName == KEY_C_NAME || keyName == KEY_INSERT_NAME || logicalKey == KEY_C_NAME || logicalKey == KEY_INSERT_NAME)
{
// Ctrl-C or Ctrl+Insert to copy the selected text
controller.TextPopupButtonTouched( Toolkit::TextSelectionPopup::COPY );
consumed = true;
}
- else if (keyName == KEY_V_NAME)
+ else if (keyName == KEY_V_NAME || logicalKey == KEY_V_NAME)
{
// Ctrl-V to paste the copied text
controller.TextPopupButtonTouched( Toolkit::TextSelectionPopup::PASTE );
consumed = true;
}
- else if (keyName == KEY_X_NAME)
+ else if (keyName == KEY_X_NAME || logicalKey == KEY_X_NAME)
{
// Ctrl-X to cut the selected text
controller.TextPopupButtonTouched( Toolkit::TextSelectionPopup::CUT );
consumed = true;
}
- else if (keyName == KEY_A_NAME)
+ else if (keyName == KEY_A_NAME || logicalKey == KEY_A_NAME)
{
// Ctrl-A to select All the text
controller.TextPopupButtonTouched( Toolkit::TextSelectionPopup::SELECT_ALL );
mPlacementActor(),
mPlayState( DevelImageVisual::PlayState::STOPPED ),
mEventCallback( nullptr ),
- mRendererAdded( false )
+ mRendererAdded( false ),
+ mCoreShutdown(false)
{
// the rasterized image is with pre-multiplied alpha format
mImpl->mFlags |= Impl::IS_PREMULTIPLIED_ALPHA;
mVectorAnimationTask->UploadCompletedSignal().Connect( this, &AnimatedVectorImageVisual::OnUploadCompleted );
mVectorAnimationTask->SetAnimationFinishedCallback( new EventThreadCallback( MakeCallback( this, &AnimatedVectorImageVisual::OnAnimationFinished ) ) );
+
+ auto& vectorAnimationManager = mFactoryCache.GetVectorAnimationManager();
+ vectorAnimationManager.AddObserver(*this);
}
AnimatedVectorImageVisual::~AnimatedVectorImageVisual()
{
- if( mEventCallback )
+ if( ! mCoreShutdown )
{
- mFactoryCache.GetVectorAnimationManager().UnregisterEventCallback( mEventCallback );
+ auto& vectorAnimationManager = mFactoryCache.GetVectorAnimationManager();
+ vectorAnimationManager.RemoveObserver(*this);
+
+ if( mEventCallback )
+ {
+ mFactoryCache.GetVectorAnimationManager().UnregisterEventCallback( mEventCallback );
+ }
+
+ // Finalize animation task and disconnect the signal in the main thread
+ mVectorAnimationTask->UploadCompletedSignal().Disconnect( this, &AnimatedVectorImageVisual::OnUploadCompleted );
+ mVectorAnimationTask->Finalize();
}
+}
- // Finalize animation task and disconnect the signal in the main thread
- mVectorAnimationTask->UploadCompletedSignal().Disconnect( this, &AnimatedVectorImageVisual::OnUploadCompleted );
- mVectorAnimationTask->Finalize();
+void AnimatedVectorImageVisual::VectorAnimationManagerDestroyed()
+{
+ // Core is shutting down. Don't talk to the plugin any more.
+ mCoreShutdown = true;
}
void AnimatedVectorImageVisual::GetNaturalSize( Vector2& naturalSize )
void AnimatedVectorImageVisual::TriggerVectorRasterization()
{
- if( !mEventCallback )
+ if( !mEventCallback && !mCoreShutdown )
{
mEventCallback = MakeCallback( this, &AnimatedVectorImageVisual::OnProcessEvents );
- mFactoryCache.GetVectorAnimationManager().RegisterEventCallback( mEventCallback );
+ auto& vectorAnimationManager = mFactoryCache.GetVectorAnimationManager();
+ vectorAnimationManager.RegisterEventCallback( mEventCallback );
Stage::GetCurrent().KeepRendering( 0.0f ); // Trigger event processing
}
}
#include <dali-toolkit/internal/visuals/visual-url.h>
#include <dali-toolkit/devel-api/visuals/animated-vector-image-visual-actions-devel.h>
#include <dali-toolkit/internal/visuals/animated-vector-image/vector-animation-task.h>
+#include <dali-toolkit/internal/visuals/animated-vector-image/vector-animation-manager.h>
namespace Dali
{
* | url | STRING |
*
*/
-class AnimatedVectorImageVisual: public Visual::Base, public ConnectionTracker
+class AnimatedVectorImageVisual: public Visual::Base, public ConnectionTracker, public VectorAnimationManager::LifecycleObserver
{
public:
*/
void DoCreateInstancePropertyMap( Property::Map& map ) const override;
+protected: // From VectorAnimationManager::LifecycleObserver:
+ /**
+ * @copydoc VectorAnimationManager::LifecycleObserver::VectorAnimationManagerDestroyed()
+ */
+ void VectorAnimationManagerDestroyed() override;
+
protected:
/**
DevelImageVisual::PlayState::Type mPlayState;
CallbackBase* mEventCallback; // Not owned
bool mRendererAdded;
+ bool mCoreShutdown;
};
} // namespace Internal
VectorAnimationManager::VectorAnimationManager()
: mEventCallbacks(),
+ mLifecycleObservers(),
mVectorAnimationThread( nullptr ),
mProcessorRegistered( false )
{
{
Adaptor::Get().UnregisterProcessor( *this );
}
+
+ for( auto observer : mLifecycleObservers )
+ {
+ observer->VectorAnimationManagerDestroyed();
+ }
+}
+
+void VectorAnimationManager::AddObserver( VectorAnimationManager::LifecycleObserver& observer )
+{
+ DALI_ASSERT_DEBUG( mLifecycleObservers.end() == std::find( mLifecycleObservers.begin(), mLifecycleObservers.end(), &observer));
+ mLifecycleObservers.push_back( &observer );
+}
+
+void VectorAnimationManager::RemoveObserver( VectorAnimationManager::LifecycleObserver& observer)
+{
+ auto iterator=std::find(mLifecycleObservers.begin(), mLifecycleObservers.end(), &observer);
+ if( iterator != mLifecycleObservers.end() )
+ {
+ mLifecycleObservers.erase(iterator);
+ }
}
VectorAnimationThread& VectorAnimationManager::GetVectorAnimationThread()
class VectorAnimationManager: public Integration::Processor
{
public:
+ struct LifecycleObserver
+ {
+ virtual void VectorAnimationManagerDestroyed() = 0;
+ };
/**
* @brief Constructor.
~VectorAnimationManager() override;
/**
+ * Add a lifecycle observer
+ * @param[in] observer The object watching this one
+ */
+ void AddObserver( LifecycleObserver& observer );
+
+ /**
+ * Remove a lifecycle observer
+ * @param[in] observer The object watching this one
+ */
+ void RemoveObserver( LifecycleObserver& observer );
+
+ /**
* Get the vector animation thread.
* @return A raw pointer pointing to the vector animation thread.
*/
private:
std::vector< CallbackBase* > mEventCallbacks;
+ std::vector<LifecycleObserver*> mLifecycleObservers;
std::unique_ptr< VectorAnimationThread > mVectorAnimationThread;
bool mProcessorRegistered;
};
{
const unsigned int TOOLKIT_MAJOR_VERSION = 1;
const unsigned int TOOLKIT_MINOR_VERSION = 9;
-const unsigned int TOOLKIT_MICRO_VERSION = 35;
+const unsigned int TOOLKIT_MICRO_VERSION = 36;
const char* const TOOLKIT_BUILD_DATE = __DATE__ " " __TIME__;
#ifdef DEBUG_ENABLED
Name: dali2-toolkit
Summary: Dali 3D engine Toolkit
-Version: 1.9.35
+Version: 1.9.36
Release: 1
Group: System/Libraries
License: Apache-2.0 and BSD-3-Clause and MIT