summaryrefslogtreecommitdiff
path: root/builder
diff options
context:
space:
mode:
authorAdeel Kazmi <adeel.kazmi@samsung.com>2015-02-26 16:28:29 +0000
committerAdeel Kazmi <adeel.kazmi@samsung.com>2015-02-26 17:28:02 +0000
commit4c735b1a526e92865428ce68260489c6c637207c (patch)
tree61703474731869afbb57afe9d4a4062b87004e2f /builder
parent28039ec65a1a8eb7517efb43f4ad870bb191fde6 (diff)
downloaddali-demo-4c735b1a526e92865428ce68260489c6c637207c.tar.gz
dali-demo-4c735b1a526e92865428ce68260489c6c637207c.tar.bz2
dali-demo-4c735b1a526e92865428ce68260489c6c637207c.zip
Reorganised folders & examples automatically built
New Structure: build | tizen builder | dali-builder.cpp demo | [demo source & header files] examples | [example-name] | | [example source files] packaging | com.samsung.dali-demo.spec resources | images | | [all images] | models | | [all models] | scripts | | [all scripts] shared | view.h Now, each example should be in its own subdirectory within the "examples" directory. This will get automatically built. README also updated. Change-Id: Idae4cedf220698a4a2d928535cff88e8bf25f82a
Diffstat (limited to 'builder')
-rw-r--r--builder/dali-builder.cpp319
1 files changed, 319 insertions, 0 deletions
diff --git a/builder/dali-builder.cpp b/builder/dali-builder.cpp
new file mode 100644
index 00000000..9f70d71f
--- /dev/null
+++ b/builder/dali-builder.cpp
@@ -0,0 +1,319 @@
+/*
+ * Copyright (c) 2014 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.
+ * 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.
+ *
+ */
+//------------------------------------------------------------------------------
+//
+// Run a json script layout file
+//
+// - watches an named file and reloads actor tree if the file changes
+// ie run
+// builder-run layout.json
+//
+// and edit layout.json in a text editor saving to trigger the reload
+//
+//------------------------------------------------------------------------------
+
+#include <dali/dali.h>
+#include <dali-toolkit/dali-toolkit.h>
+#include <dali-toolkit/public-api/builder/builder.h>
+#include <dali-toolkit/public-api/builder/tree-node.h>
+#include <iostream>
+#include <map>
+#include <string>
+#include <fstream>
+#include <streambuf>
+#include <boost/scoped_ptr.hpp>
+
+//#include <boost/regex.hpp>
+#include "sys/stat.h"
+#include <ctime>
+
+#include <dali/integration-api/debug.h>
+
+#define TOKEN_STRING(x) #x
+
+using namespace Dali;
+using namespace Dali::Toolkit;
+
+namespace
+{
+
+std::string JSON_BROKEN(" \
+{ \
+ 'stage': \
+ [ \
+ { \
+ 'type':'TextActor', \
+ 'size': [50,50,1], \
+ 'parent-origin': 'CENTER', \
+ 'text':'COULD NOT LOAD JSON FILE' \
+ } \
+ ] \
+} \
+");
+
+std::string ReplaceQuotes(const std::string &single_quoted)
+{
+ std::string s(single_quoted);
+
+ // wrong as no embedded quote but had regex link problems
+ std::replace(s.begin(), s.end(), '\'', '"');
+
+ return s;
+}
+
+} // anon namespace
+
+
+//------------------------------------------------------------------------------
+//
+//
+//
+//------------------------------------------------------------------------------
+class FileWatcher
+{
+public:
+ FileWatcher(void);
+ ~FileWatcher(void);
+ explicit FileWatcher(const std::string &fn): mLastTime(0) { SetFilename(fn) ; };
+
+ void SetFilename(const std::string &fn);
+ std::string GetFilename();
+
+ bool FileHasChanged(void);
+ std::string GetFileContents(void) { return GetFileContents(mstringPath) ; };
+
+private:
+ // compiler does
+ // FileWatcher(const FileWatcher&);
+ // FileWatcher &operator=(const FileWatcher &);
+
+ std::time_t mLastTime;
+ std::string mstringPath;
+
+ std::string GetFileContents(const std::string &fn)
+ {
+ std::ifstream t(fn.c_str());
+ return std::string((std::istreambuf_iterator<char>(t)), std::istreambuf_iterator<char>());
+ };
+};
+
+FileWatcher::FileWatcher(void) : mLastTime(0)
+{
+}
+
+bool FileWatcher::FileHasChanged(void)
+{
+ struct stat buf;
+
+ if(0 != stat(mstringPath.c_str(), &buf))
+ {
+ DALI_LOG_WARNING("File does not exist '%s'\n", mstringPath.c_str());
+ return false;
+ }
+ else
+ {
+ if(buf.st_mtime > mLastTime)
+ {
+ mLastTime = buf.st_mtime;
+ return true;
+ }
+ else
+ {
+ mLastTime = buf.st_mtime;
+ return false;
+ }
+ }
+
+ return false;
+}
+
+FileWatcher::~FileWatcher()
+{
+}
+
+void FileWatcher::SetFilename(const std::string &fn)
+{
+ mstringPath = fn;
+}
+
+std::string FileWatcher::GetFilename(void)
+{
+ return mstringPath;
+}
+
+
+//------------------------------------------------------------------------------
+//
+//
+//
+//------------------------------------------------------------------------------
+class ExampleApp : public ConnectionTracker
+{
+public:
+ ExampleApp(Application &app) : mApp(app)
+ {
+ app.InitSignal().Connect(this, &ExampleApp::Create);
+
+ }
+
+ ~ExampleApp() {}
+
+public:
+ void SetJSONFilename(std::string const &fn) { fw.SetFilename(fn) ; };
+
+ void Create(Application& app)
+ {
+ mTimer = Timer::New( 500 ); // ms
+ mTimer.TickSignal().Connect( this, &ExampleApp::OnTimer);
+ mTimer.Start();
+
+ // Connect to key events in order to exit
+ Stage::GetCurrent().KeyEventSignal().Connect(this, &ExampleApp::OnKeyEvent);
+ }
+
+private:
+ Application& mApp;
+ Layer mRootLayer;
+
+ FileWatcher fw;
+ Timer mTimer;
+
+ void ReloadJsonFile(Builder& builder, Layer& layer)
+ {
+ Stage stage = Stage::GetCurrent();
+
+ builder = Builder::New();
+ builder.QuitSignal().Connect( this, &ExampleApp::OnBuilderQuit );
+
+ Property::Map defaultDirs;
+ defaultDirs[ TOKEN_STRING(DALI_IMAGE_DIR) ] = DALI_IMAGE_DIR;
+ defaultDirs[ TOKEN_STRING(DALI_MODEL_DIR) ] = DALI_MODEL_DIR;
+ defaultDirs[ TOKEN_STRING(DALI_SCRIPT_DIR) ] = DALI_SCRIPT_DIR;
+
+ builder.AddConstants( defaultDirs );
+
+ if(!layer)
+ {
+ layer = Layer::New();
+ layer.SetParentOrigin(ParentOrigin::CENTER);
+ layer.SetAnchorPoint(AnchorPoint::CENTER);
+ layer.SetSize( stage.GetRootLayer().GetCurrentSize() );
+ stage.GetRootLayer().Add(layer);
+
+ // render tasks may have been setup last load so remove them
+ RenderTaskList taskList = stage.GetRenderTaskList();
+ if( taskList.GetTaskCount() > 1 )
+ {
+ typedef std::vector<RenderTask> Collection;
+ typedef Collection::iterator ColIter;
+ Collection tasks;
+
+ for(unsigned int i = 1; i < taskList.GetTaskCount(); ++i)
+ {
+ tasks.push_back( taskList.GetTask(i) );
+ }
+
+ for(ColIter iter = tasks.begin(); iter != tasks.end(); ++iter)
+ {
+ taskList.RemoveTask(*iter);
+ }
+
+ RenderTask defaultTask = taskList.GetTask(0);
+ defaultTask.SetSourceActor( stage.GetRootLayer() );
+ defaultTask.SetTargetFrameBuffer( FrameBufferImage() );
+ }
+ }
+
+ unsigned int numChildren = layer.GetChildCount();
+
+ for(unsigned int i=0; i<numChildren; ++i)
+ {
+ layer.Remove( layer.GetChildAt(0) );
+ }
+
+ std::string data(fw.GetFileContents());
+
+ try
+ {
+ builder.LoadFromString(data);
+ }
+ catch(...)
+ {
+ builder.LoadFromString(ReplaceQuotes(JSON_BROKEN));
+ }
+
+ builder.AddActors( layer );
+
+ }
+
+
+ bool OnTimer(void)
+ {
+ if(fw.FileHasChanged())
+ {
+ ReloadJsonFile( mBuilder, mRootLayer );
+ }
+
+ return true;
+ }
+
+ // Process Key events to Quit on back-key
+ void OnKeyEvent( const KeyEvent& event )
+ {
+ if( event.state == KeyEvent::Down )
+ {
+ if( IsKey( event, Dali::DALI_KEY_ESCAPE ) || IsKey( event, Dali::DALI_KEY_BACK ) )
+ {
+ mApp.Quit();
+ }
+ }
+ }
+
+ void OnBuilderQuit()
+ {
+ mApp.Quit();
+ }
+
+ Builder mBuilder;
+};
+
+//------------------------------------------------------------------------------
+//
+//
+//
+//------------------------------------------------------------------------------
+int main(int argc, char **argv)
+{
+ Application dali_app = Application::New(&argc, &argv);
+
+ ExampleApp app(dali_app);
+
+
+ if(argc > 1)
+ {
+ std::cout << "Loading file:" << argc << " " << argv[1] << std::endl;
+ app.SetJSONFilename(argv[1]);
+ }
+ else
+ {
+ DALI_ASSERT_ALWAYS(!"Specify JSON file on command line\n");
+ }
+
+ dali_app.MainLoop();
+
+ return 0;
+}