From cc13ce3b6350a534d869f3afcde551d63c1dd70b Mon Sep 17 00:00:00 2001 From: Jinkun Jang Date: Mon, 18 Mar 2013 15:26:29 +0900 Subject: [PATCH] sync with master --- LICENSE | 206 +++++++++++ NOTICE | 4 + description.xml | 10 + project/data/nofile.dummy | 0 project/inc/FeatureManagerForm.h | 99 ++++++ project/inc/FeatureSetGenerator.h | 77 ++++ project/inc/FileManagerForm.h | 94 +++++ project/inc/GeneratePanel.h | 46 +++ project/inc/IFeatureSetGeneratorListener.h | 27 ++ project/inc/ImageFeatureApp.h | 65 ++++ project/inc/ImageFeatureFormFactory.h | 30 ++ project/inc/ImageFeaturePanelFactory.h | 30 ++ project/inc/MainForm.h | 76 ++++ project/inc/UpdatePanel.h | 45 +++ project/manifest.xml | 31 ++ project/res/screen-density-high/home_type3.png | Bin 0 -> 3217 bytes project/res/screen-density-high/message_type3.png | Bin 0 -> 3699 bytes project/res/screen-density-xhigh/home_type3.png | Bin 0 -> 1639 bytes project/res/screen-density-xhigh/message_type3.png | Bin 0 -> 3312 bytes .../IDC_GENERATION_MODE_PANEL.xml | 37 ++ .../res/screen-size-normal/IDC_MESSAGE_POPUP.xml | 22 ++ .../screen-size-normal/IDC_UPDATE_MODE_PANEL.xml | 42 +++ project/res/screen-size-normal/IDF_FORM.xml | 36 ++ project/shared/data/nofile.dummy | 0 .../shared/res/screen-density-xhigh/mainmenu.png | Bin 0 -> 17581 bytes project/shared/trusted/nofile.dummy | 0 project/src/FeatureManagerForm.cpp | 340 ++++++++++++++++++ project/src/FeatureSetGenerator.cpp | 212 +++++++++++ project/src/FileManagerForm.cpp | 392 +++++++++++++++++++++ project/src/GeneratePanel.cpp | 177 ++++++++++ project/src/ImageFeatureApp.cpp | 118 +++++++ project/src/ImageFeatureAppEntry.cpp | 60 ++++ project/src/ImageFeatureFormFactory.cpp | 97 +++++ project/src/ImageFeaturePanelFactory.cpp | 55 +++ project/src/MainForm.cpp | 261 ++++++++++++++ project/src/UpdatePanel.cpp | 253 +++++++++++++ sample.xml | 34 ++ screenshot.png | Bin 0 -> 9798 bytes 38 files changed, 2976 insertions(+) create mode 100644 LICENSE create mode 100644 NOTICE create mode 100644 description.xml create mode 100644 project/data/nofile.dummy create mode 100644 project/inc/FeatureManagerForm.h create mode 100644 project/inc/FeatureSetGenerator.h create mode 100644 project/inc/FileManagerForm.h create mode 100644 project/inc/GeneratePanel.h create mode 100644 project/inc/IFeatureSetGeneratorListener.h create mode 100644 project/inc/ImageFeatureApp.h create mode 100644 project/inc/ImageFeatureFormFactory.h create mode 100644 project/inc/ImageFeaturePanelFactory.h create mode 100644 project/inc/MainForm.h create mode 100644 project/inc/UpdatePanel.h create mode 100644 project/manifest.xml create mode 100644 project/res/screen-density-high/home_type3.png create mode 100644 project/res/screen-density-high/message_type3.png create mode 100644 project/res/screen-density-xhigh/home_type3.png create mode 100644 project/res/screen-density-xhigh/message_type3.png create mode 100644 project/res/screen-size-normal/IDC_GENERATION_MODE_PANEL.xml create mode 100644 project/res/screen-size-normal/IDC_MESSAGE_POPUP.xml create mode 100644 project/res/screen-size-normal/IDC_UPDATE_MODE_PANEL.xml create mode 100644 project/res/screen-size-normal/IDF_FORM.xml create mode 100755 project/shared/data/nofile.dummy create mode 100644 project/shared/res/screen-density-xhigh/mainmenu.png create mode 100755 project/shared/trusted/nofile.dummy create mode 100644 project/src/FeatureManagerForm.cpp create mode 100644 project/src/FeatureSetGenerator.cpp create mode 100644 project/src/FileManagerForm.cpp create mode 100644 project/src/GeneratePanel.cpp create mode 100644 project/src/ImageFeatureApp.cpp create mode 100644 project/src/ImageFeatureAppEntry.cpp create mode 100644 project/src/ImageFeatureFormFactory.cpp create mode 100644 project/src/ImageFeaturePanelFactory.cpp create mode 100644 project/src/MainForm.cpp create mode 100644 project/src/UpdatePanel.cpp create mode 100644 sample.xml create mode 100755 screenshot.png diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..917b21e --- /dev/null +++ b/LICENSE @@ -0,0 +1,206 @@ +Flora License + +Version 1.0, May, 2012 + +http://www.tizenopensource.org/license + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + +"License" shall mean the terms and conditions for use, reproduction, +and distribution as defined by Sections 1 through 9 of this document. + +"Licensor" shall mean the copyright owner or entity authorized by +the copyright owner that is granting the License. + +"Legal Entity" shall mean the union of the acting entity and +all other entities that control, are controlled by, or are +under common control with that entity. For the purposes of +this definition, "control" means (i) the power, direct or indirect, +to cause the direction or management of such entity, +whether by contract or otherwise, or (ii) ownership of fifty percent (50%) +or more of the outstanding shares, or (iii) beneficial ownership of +such entity. + +"You" (or "Your") shall mean an individual or Legal Entity +exercising permissions granted by this License. + +"Source" form shall mean the preferred form for making modifications, +including but not limited to software source code, documentation source, +and configuration files. + +"Object" form shall mean any form resulting from mechanical +transformation or translation of a Source form, including but +not limited to compiled object code, generated documentation, +and conversions to other media types. + +"Work" shall mean the work of authorship, whether in Source or Object form, +made available under the License, as indicated by a copyright notice +that is included in or attached to the work (an example is provided +in the Appendix below). + +"Derivative Works" shall mean any work, whether in Source or Object form, +that is based on (or derived from) the Work and for which the editorial +revisions, annotations, elaborations, or other modifications represent, +as a whole, an original work of authorship. For the purposes of this License, +Derivative Works shall not include works that remain separable from, +or merely link (or bind by name) to the interfaces of, the Work and +Derivative Works thereof. + +"Contribution" shall mean any work of authorship, including the original +version of the Work and any modifications or additions to that Work or +Derivative Works thereof, that is intentionally submitted to Licensor +for inclusion in the Work by the copyright owner or by an individual or +Legal Entity authorized to submit on behalf of the copyright owner. +For the purposes of this definition, "submitted" means any form of +electronic, verbal, or written communication sent to the Licensor or +its representatives, including but not limited to communication on +electronic mailing lists, source code control systems, and issue +tracking systems that are managed by, or on behalf of, the Licensor +for the purpose of discussing and improving the Work, but excluding +communication that is conspicuously marked or otherwise designated +in writing by the copyright owner as "Not a Contribution." + +"Contributor" shall mean Licensor and any individual or Legal Entity +on behalf of whom a Contribution has been received by Licensor and +subsequently incorporated within the Work. + +"Tizen Certified Platform" shall mean a software platform that complies +with the standards set forth in the Compatibility Definition Document +and passes the Compatibility Test Suite as defined from time to time +by the Tizen Technical Steering Group and certified by the Tizen +Association or its designated agent. + +2. Grant of Copyright License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +copyright license to reproduce, prepare Derivative Works of, +publicly display, publicly perform, sublicense, and distribute the +Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of +this License, each Contributor hereby grants to You a perpetual, +worldwide, non-exclusive, no-charge, royalty-free, irrevocable +(except as stated in this section) patent license to make, have made, +use, offer to sell, sell, import, and otherwise transfer the Work +solely as incorporated into a Tizen Certified Platform, where such +license applies only to those patent claims licensable by such +Contributor that are necessarily infringed by their Contribution(s) +alone or by combination of their Contribution(s) with the Work solely +as incorporated into a Tizen Certified Platform to which such +Contribution(s) was submitted. If You institute patent litigation +against any entity (including a cross-claim or counterclaim +in a lawsuit) alleging that the Work or a Contribution incorporated +within the Work constitutes direct or contributory patent infringement, +then any patent licenses granted to You under this License for that +Work shall terminate as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the +Work or Derivative Works thereof pursuant to the copyright license +above, in any medium, with or without modifications, and in Source or +Object form, provided that You meet the following conditions: + + 1. You must give any other recipients of the Work or Derivative Works + a copy of this License; and + 2. You must cause any modified files to carry prominent notices stating + that You changed the files; and + 3. You must retain, in the Source form of any Derivative Works that + You distribute, all copyright, patent, trademark, and attribution + notices from the Source form of the Work, excluding those notices + that do not pertain to any part of the Derivative Works; and + 4. If the Work includes a "NOTICE" text file as part of its distribution, + then any Derivative Works that You distribute must include a readable + copy of the attribution notices contained within such NOTICE file, + excluding those notices that do not pertain to any part of + the Derivative Works, in at least one of the following places: + within a NOTICE text file distributed as part of the Derivative Works; + within the Source form or documentation, if provided along with the + Derivative Works; or, within a display generated by the Derivative Works, + if and wherever such third-party notices normally appear. + The contents of the NOTICE file are for informational purposes only + and do not modify the License. + +You may add Your own attribution notices within Derivative Works +that You distribute, alongside or as an addendum to the NOTICE text +from the Work, provided that such additional attribution notices +cannot be construed as modifying the License. You may add Your own +copyright statement to Your modifications and may provide additional or +different license terms and conditions for use, reproduction, or +distribution of Your modifications, or for any such Derivative Works +as a whole, provided Your use, reproduction, and distribution of +the Work otherwise complies with the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, +any Contribution intentionally submitted for inclusion in the Work +by You to the Licensor shall be under the terms and conditions of +this License, without any additional terms or conditions. +Notwithstanding the above, nothing herein shall supersede or modify +the terms of any separate license agreement you may have executed +with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade +names, trademarks, service marks, or product names of the Licensor, +except as required for reasonable and customary use in describing the +origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or +agreed to in writing, Licensor provides the Work (and each +Contributor provides its Contributions) on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +implied, including, without limitation, any warranties or conditions +of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A +PARTICULAR PURPOSE. You are solely responsible for determining the +appropriateness of using or redistributing the Work and assume any +risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, +whether in tort (including negligence), contract, or otherwise, +unless required by applicable law (such as deliberate and grossly +negligent acts) or agreed to in writing, shall any Contributor be +liable to You for damages, including any direct, indirect, special, +incidental, or consequential damages of any character arising as a +result of this License or out of the use or inability to use the +Work (including but not limited to damages for loss of goodwill, +work stoppage, computer failure or malfunction, or any and all +other commercial damages or losses), even if such Contributor +has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing +the Work or Derivative Works thereof, You may choose to offer, +and charge a fee for, acceptance of support, warranty, indemnity, +or other liability obligations and/or rights consistent with this +License. However, in accepting such obligations, You may act only +on Your own behalf and on Your sole responsibility, not on behalf +of any other Contributor, and only if You agree to indemnify, +defend, and hold each Contributor harmless for any liability +incurred by, or claims asserted against, such Contributor by reason +of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Flora License to your work + +To apply the Flora License to your work, attach the following +boilerplate notice, with the fields enclosed by brackets "[]" +replaced with your own identifying information. (Don't include +the brackets!) The text should be enclosed in the appropriate +comment syntax for the file format. We also recommend that a +file or class name and description of purpose be included on the +same "printed page" as the copyright notice for easier +identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Flora License, Version 1.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.tizenopensource.org/license + + 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. + diff --git a/NOTICE b/NOTICE new file mode 100644 index 0000000..3997999 --- /dev/null +++ b/NOTICE @@ -0,0 +1,4 @@ +Copyright (c) Samsung Electronics Co., Ltd. All rights reserved. +Except as noted, this software is licensed under Flora License, Version 1. +Please, see the LICENSE file for Flora License terms and conditions. + diff --git a/description.xml b/description.xml new file mode 100644 index 0000000..0b88bef --- /dev/null +++ b/description.xml @@ -0,0 +1,10 @@ + + + + + ImageFeatureManager + 1.0 + screenshot.png + The ImageFeatureManager sample application demonstrates how you can enable your device to generate and update image feature for image recognition. + + diff --git a/project/data/nofile.dummy b/project/data/nofile.dummy new file mode 100644 index 0000000..e69de29 diff --git a/project/inc/FeatureManagerForm.h b/project/inc/FeatureManagerForm.h new file mode 100644 index 0000000..ecdc941 --- /dev/null +++ b/project/inc/FeatureManagerForm.h @@ -0,0 +1,99 @@ +// +// Tizen Native SDK +// Open Service Platform +// Copyright (c) 2013 Samsung Electronics Co., Ltd. +// All rights reserved. +// +// This software contains confidential and proprietary information +// of Samsung Electronics Co., Ltd. +// The user of this software agrees not to disclose, disseminate or copy such +// Confidential Information and shall use the software only in accordance with +// the terms of the license agreement the user entered into with Samsung. +// + +#ifndef _FEATURE_MANAGER_FORM_H_ +#define _FEATURE_MANAGER_FORM_H_ + +#include +#include +#include +#include + +#include +#include + +class FeatureManagerForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::IListViewItemProvider + , public Tizen::Ui::Controls::IListViewItemEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + FeatureManagerForm(void); + virtual ~FeatureManagerForm(void); + + bool Initialize(void); + bool CreateMainList(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnListViewItemStateChanged(Tizen::Ui::Controls::ListView &listView, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status); + virtual void OnListViewItemSwept(Tizen::Ui::Controls::ListView &listView, int index, Tizen::Ui::Controls::SweepDirection direction); + virtual void OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView &listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus state); + virtual void OnItemReordered(Tizen::Ui::Controls::ListView &view, int oldIndex, int newIndex); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::ListItemBase* CreateItem (int index, int itemWidth); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::ListItemBase *pItem, int itemWidth); + + void OnActionPerformed (const Tizen::Ui::Control &source, int actionId); + + void SetDatabasePath(Tizen::Base::String path); + void SetDatabase(Tizen::Uix::Vision::ImageFeatureManager* pDatabase); + +private: + + void GetDirs(Tizen::Base::String dirPath); + bool CheckExt(Tizen::Base::String fileName); + void GoDownDir(void); + void GoUpDir(Tizen::Base::String dir); + bool IsFile(Tizen::Base::String filePath); + + void OnFormBackRequested(Tizen::Ui::Controls::Form &source); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + +private: + static const int ID_FORMAT_STRING = 500; + static const int ID_FORMAT_BITMAP = 501; + static const int ID_BUTTON_CLOSE_POPUP = 502; + + static const int ID_ITEM_DELETE = 505; + static const int ID_ITEM_DETAILS = 506; + + static const int ID_BUTTON_SAVE = 511; + + Tizen::Ui::Controls::ListView* __pList; + Tizen::Ui::Controls::Label* __pLabel; + Tizen::Ui::Controls::ListContextItem* __pItemContext; + Tizen::Ui::Controls::Popup* __pPopup; + +private: + class StrComparer + : public Tizen::Base::Collection::IComparerT + { + virtual result Compare(const Tizen::Base::String& str1, const Tizen::Base::String& str2, int& cmp) const + { + cmp = Tizen::Base::String::Compare(str1, str2); + return E_SUCCESS; + } + }; +}; + +#endif diff --git a/project/inc/FeatureSetGenerator.h b/project/inc/FeatureSetGenerator.h new file mode 100644 index 0000000..f051bef --- /dev/null +++ b/project/inc/FeatureSetGenerator.h @@ -0,0 +1,77 @@ +// +// Tizen Native SDK +// Open Service Platform +// Copyright (c) 2013 Samsung Electronics Co., Ltd. +// All rights reserved. +// +// This software contains confidential and proprietary information +// of Samsung Electronics Co., Ltd. +// The user of this software agrees not to disclose, disseminate or copy such +// Confidential Information and shall use the software only in accordance with +// the terms of the license agreement the user entered into with Samsung. +// + +#ifndef _DB_GENERATOR_H_ +#define _DB_GENERATOR_H_ + +#include +#include +#include "IFeatureSetGeneratorListener.h" + +struct ResultInfo +{ + ResultInfo(void) + : appendTime(-1) + , writeTime(-1) + , appendedObjectsNumber(-1) + , rejectedObjectsNumber(-1) + , totalObjectsNumber(-1) + {} + + int appendTime; + int writeTime; + int appendedObjectsNumber; + int rejectedObjectsNumber; + int totalObjectsNumber; +}; + +class FeatureSetGenThread: public Tizen::Base::Runtime::Thread +{ +public: + + FeatureSetGenThread(void); + ~FeatureSetGenThread(void); + result Construct(void); + + void SetListener(IFeatureSetGeneratorListener*); + void SetImagePath(const Tizen::Base::String& imPath); + void SetFeatureManager(Tizen::Uix::Vision::ImageFeatureManager* pImageFeatureManager); + void GetResults(ResultInfo&); + +private: + Tizen::Base::Object* Run(void); + bool Generate(Tizen::Base::String imPath, ResultInfo&); + bool CheckExt(Tizen::Base::String fileName); + +private: + IFeatureSetGeneratorListener* __pListener; + Tizen::Base::String __imagePath; + Tizen::Base::String __databasePath; + ResultInfo __resultInfo; + Tizen::Base::Collection::ArrayListT __files; + Tizen::Uix::Vision::ImageFeatureManager* __pImageFeatureManager; + +private: + class StrComparer + : public Tizen::Base::Collection::IComparerT + { + virtual result Compare(const Tizen::Base::String& str1, const Tizen::Base::String& str2, int& cmp) const + { + cmp = Tizen::Base::String::Compare(str1, str2); + return E_SUCCESS; + } + }; + +}; + +#endif // DBGENERATOR_H_ diff --git a/project/inc/FileManagerForm.h b/project/inc/FileManagerForm.h new file mode 100644 index 0000000..b8928c8 --- /dev/null +++ b/project/inc/FileManagerForm.h @@ -0,0 +1,94 @@ +// +// Tizen Native SDK +// Open Service Platform +// Copyright (c) 2013 Samsung Electronics Co., Ltd. +// All rights reserved. +// +// This software contains confidential and proprietary information +// of Samsung Electronics Co., Ltd. +// The user of this software agrees not to disclose, disseminate or copy such +// Confidential Information and shall use the software only in accordance with +// the terms of the license agreement the user entered into with Samsung. +// + +#ifndef _FILE_MANAGER_H_ +#define _FILE_MANAGER_H_ + +#include +#include +#include +#include + +class FileManagerForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::Controls::IListViewItemProvider + , public Tizen::Ui::Controls::IListViewItemEventListener + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Scenes::ISceneEventListener +{ +public: + FileManagerForm(void); + virtual ~FileManagerForm(void); + + bool Initialize(const Tizen::Base::Collection::ArrayListT& , bool); + bool CreateMainList(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + + virtual void OnListViewItemStateChanged(Tizen::Ui::Controls::ListView &listView, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status); + virtual void OnListViewItemSwept(Tizen::Ui::Controls::ListView &listView, int index, Tizen::Ui::Controls::SweepDirection direction); + virtual void OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView &listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus state); + virtual void OnItemReordered(Tizen::Ui::Controls::ListView &view, int oldIndex, int newIndex); + + virtual int GetItemCount(void); + virtual Tizen::Ui::Controls::ListItemBase* CreateItem(int index, int itemWidth); + virtual bool DeleteItem(int index, Tizen::Ui::Controls::ListItemBase *pItem, int itemWidth); + + void OnActionPerformed(const Tizen::Ui::Control &source, int actionId); + +private: + void GetDirs(Tizen::Base::String dirPath); + bool CheckExt(Tizen::Base::String fileName); + void GoDownDir(void); + void GoUpDir(Tizen::Base::String dir); + bool IsFile(Tizen::Base::String filePath); + + void OnFormBackRequested(Tizen::Ui::Controls::Form &source); + + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + +private: + static const int ID_FORMAT_STRING = 500; + static const int ID_FORMAT_BITMAP = 501; + static const int ID_BUTTON_EXIT = 502; + + Tizen::Ui::Controls::ListView* __pList; + Tizen::Base::Collection::ArrayListT __files; + Tizen::Base::String __currentPath; + Tizen::Ui::Controls::EditField* __pEditField; + Tizen::Graphics::Bitmap* __pFileIcon; + Tizen::Graphics::Bitmap* __pFolderIcon; + Tizen::Base::Collection::ArrayListT __fileExts; + bool __canChooseNew; + bool __canChooseOne; + + +private: + class StrComparer + : public Tizen::Base::Collection::IComparerT + { + virtual result Compare(const Tizen::Base::String& str1, const Tizen::Base::String& str2, int& cmp) const + { + cmp = Tizen::Base::String::Compare(str1, str2); + return E_SUCCESS; + } + }; + +}; + +#endif // _FILE_MANAGER_H_ diff --git a/project/inc/GeneratePanel.h b/project/inc/GeneratePanel.h new file mode 100644 index 0000000..c3369c0 --- /dev/null +++ b/project/inc/GeneratePanel.h @@ -0,0 +1,46 @@ + +#ifndef _GENERATEPANEL_H_ +#define _GENERATEPANEL_H_ + +#include +#include +#include "FeatureSetGenerator.h" + + +class GeneratePanel + : public Tizen::Ui::Controls::Panel + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + , public IFeatureSetGeneratorListener +{ +public: + GeneratePanel(void); + virtual ~GeneratePanel(void); + bool Initialize(); + result OnInitializing(void); + result OnTerminating(void); + + virtual void OnFinish(void); + virtual void OnImageProcessed(int im_no, int total); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + +// Implementation +protected: + static const int ID_BUTTON_CHOOSE_FEATURE_SET_PATH = 401; + static const int ID_BUTTON_GENERATE_FEATURE_SET = 402; + static const int ID_BUTTON_CHOOSE_IMAGE_FOLDER_PATH = 501; + +// Generated call-back functions +public: + +private: + Tizen::Base::String __currentFeaturePath; + Tizen::Base::String __currentImagePath; +}; + +#endif diff --git a/project/inc/IFeatureSetGeneratorListener.h b/project/inc/IFeatureSetGeneratorListener.h new file mode 100644 index 0000000..8d31daa --- /dev/null +++ b/project/inc/IFeatureSetGeneratorListener.h @@ -0,0 +1,27 @@ +// +// Tizen Native SDK +// Open Service Platform +// Copyright (c) 2013 Samsung Electronics Co., Ltd. +// All rights reserved. +// +// This software contains confidential and proprietary information +// of Samsung Electronics Co., Ltd. +// The user of this software agrees not to disclose, disseminate or copy such +// Confidential Information and shall use the software only in accordance with +// the terms of the license agreement the user entered into with Samsung. +// + +#ifndef _IBASE_GENERATOR_LISTENER_H_ +#define _IBASE_GENERATOR_LISTENER_H_ + +class IFeatureSetGeneratorListener +{ +public: + virtual ~IFeatureSetGeneratorListener() + { + } + virtual void OnImageProcessed(int im_no, int total) = 0; + virtual void OnFinish(void) = 0; +}; + +#endif /* _IBASE_GENERATOR_LISTENER_H_ */ diff --git a/project/inc/ImageFeatureApp.h b/project/inc/ImageFeatureApp.h new file mode 100644 index 0000000..c2a7f46 --- /dev/null +++ b/project/inc/ImageFeatureApp.h @@ -0,0 +1,65 @@ +// +// Tizen Native SDK +// Open Service Platform +// Copyright (c) 2013 Samsung Electronics Co., Ltd. +// All rights reserved. +// +// This software contains confidential and proprietary information +// of Samsung Electronics Co., Ltd. +// The user of this software agrees not to disclose, disseminate or copy such +// Confidential Information and shall use the software only in accordance with +// the terms of the license agreement the user entered into with Samsung. +// + +#ifndef _IMAGE_FEATURE_APP_H_ +#define _IMAGE_FEATURE_APP_H_ + +#include +#include +#include +#include + +class ImageFeatureApp + : public Tizen::App::UiApp + , public Tizen::System::IScreenEventListener +{ +public: + static Tizen::App::UiApp* CreateInstance(void); + +public: + ImageFeatureApp(void); + virtual~ImageFeatureApp(void); + +public: + // Called when the UiApp is initializing. + bool OnAppInitializing(Tizen::App::AppRegistry& appRegistry); + + // Called when the UiApp initializing is finished. + bool OnAppInitialized(void); + + // Called when the UiApp is requested to terminate. + bool OnAppWillTerminate(void); + + // Called when the UiApp is terminating. + bool OnAppTerminating(Tizen::App::AppRegistry& appRegistry, bool forcedTermination = false); + + // Called when the UiApp's frame moves to the top of the screen. + void OnForeground(void); + + // Called when this UiApp's frame is moved from top of the screen to the background. + void OnBackground(void); + + // Called when the system memory is not sufficient to run the UiApp any further. + void OnLowMemory(void); + + // Called when the battery level changes. + void OnBatteryLevelChanged(Tizen::System::BatteryLevel batteryLevel); + + // Called when the screen turns on. + void OnScreenOn(void); + + // Called when the screen turns off. + void OnScreenOff(void); +}; + +#endif // _IMAGE_FEATURE_APP_H_ diff --git a/project/inc/ImageFeatureFormFactory.h b/project/inc/ImageFeatureFormFactory.h new file mode 100644 index 0000000..261d159 --- /dev/null +++ b/project/inc/ImageFeatureFormFactory.h @@ -0,0 +1,30 @@ +// +// Tizen Native SDK +// Open Service Platform +// Copyright (c) 2013 Samsung Electronics Co., Ltd. +// All rights reserved. +// +// This software contains confidential and proprietary information +// of Samsung Electronics Co., Ltd. +// The user of this software agrees not to disclose, disseminate or copy such +// Confidential Information and shall use the software only in accordance with +// the terms of the license agreement the user entered into with Samsung. +// + +#ifndef _IMAGEFEATURE_FORM_FACTORY_H_ +#define _IMAGEFEATURE_FORM_FACTORY_H_ + +#include + + +class ImageFeatureFormFactory + : public Tizen::Ui::Scenes::IFormFactory +{ +public: + ImageFeatureFormFactory(void); + virtual ~ImageFeatureFormFactory(void); + + virtual Tizen::Ui::Controls::Form* CreateFormN(const Tizen::Base::String& formId, const Tizen::Ui::Scenes::SceneId& sceneId); +}; + +#endif // _IMAGEFEATURE_FORM_FACTORY_H_ diff --git a/project/inc/ImageFeaturePanelFactory.h b/project/inc/ImageFeaturePanelFactory.h new file mode 100644 index 0000000..ca2efab --- /dev/null +++ b/project/inc/ImageFeaturePanelFactory.h @@ -0,0 +1,30 @@ +// +// Tizen Native SDK +// Open Service Platform +// Copyright (c) 2013 Samsung Electronics Co., Ltd. +// All rights reserved. +// +// This software contains confidential and proprietary information +// of Samsung Electronics Co., Ltd. +// The user of this software agrees not to disclose, disseminate or copy such +// Confidential Information and shall use the software only in accordance with +// the terms of the license agreement the user entered into with Samsung. +// + +#ifndef _IMAGE_FEATURE_PANEL_FACTORY_H_ +#define _IMAGE_FEATURE_PANEL_FACTORY_H_ + +#include + + +class ImageFeaturePanelFactory + : public Tizen::Ui::Scenes::IPanelFactory +{ +public: + ImageFeaturePanelFactory(void); + virtual ~ImageFeaturePanelFactory(void); + + virtual Tizen::Ui::Controls::Panel* CreatePanelN(const Tizen::Base::String& panelId, const Tizen::Ui::Scenes::SceneId& sceneId); +}; + +#endif // _IMAGE_FEATURE_PANEL_FACTORY_H_ diff --git a/project/inc/MainForm.h b/project/inc/MainForm.h new file mode 100644 index 0000000..f6d1319 --- /dev/null +++ b/project/inc/MainForm.h @@ -0,0 +1,76 @@ +// +// Tizen Native SDK +// Open Service Platform +// Copyright (c) 2013 Samsung Electronics Co., Ltd. +// All rights reserved. +// +// This software contains confidential and proprietary information +// of Samsung Electronics Co., Ltd. +// The user of this software agrees not to disclose, disseminate or copy such +// Confidential Information and shall use the software only in accordance with +// the terms of the license agreement the user entered into with Samsung. +// + +#ifndef _MAIN_FORM_H_ +#define _MAIN_FORM_H_ + +#include +#include +#include "FeatureSetGenerator.h" + + +class MainForm + : public Tizen::Ui::Controls::Form + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Controls::IFormBackEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + , public IFeatureSetGeneratorListener +{ +public: + MainForm(void); + virtual ~MainForm(void); + bool Initialize(void); + +public: + // DBgenerator Listener: + virtual void OnImageProcessed(int im_no, int total); + virtual void OnFinish(void); + + virtual result OnInitializing(void); + virtual result OnTerminating(void); + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + virtual void OnFormBackRequested(Tizen::Ui::Controls::Form& source); + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + virtual result OnDraw(void); + + virtual void OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs); + + void AppendImageFolder(const Tizen::Base::String& imPath, IFeatureSetGeneratorListener* listener = null); + +public: + static const int ID_BUTTON_GENERATE_MODE = 201; + static const int ID_BUTTON_UPDATE_MODE = 202; + + static const int ID_BUTTON_RESULTS = 333; + static const int ID_BUTTON_CLOSE_RESULTS = 334; + + static const RequestId REQUEST_RESULT = 505; + + Tizen::Uix::Vision::ImageFeatureManager* GetFeatureManager(void); + +private: + FeatureSetGenThread __dbGen; + ResultInfo __resInfo; + Tizen::Base::String __headerTitle; + Tizen::Ui::Controls::RadioGroup* __pRadioGroupMode; + Tizen::Uix::Vision::ImageFeatureManager* __pFeatureManager; + + Tizen::Ui::Controls::Popup* __pMessagePopup; + Tizen::Ui::Controls::Label* __pMessageLabel; +}; + +#endif //_MAIN_FORM_H_ diff --git a/project/inc/UpdatePanel.h b/project/inc/UpdatePanel.h new file mode 100644 index 0000000..7f6cd60 --- /dev/null +++ b/project/inc/UpdatePanel.h @@ -0,0 +1,45 @@ + +#ifndef _UPDATEPANEL_H_ +#define _UPDATEPANEL_H_ + +#include +#include +#include +#include +#include "FeatureSetGenerator.h" + + +class UpdatePanel + : public Tizen::Ui::Controls::Panel + , public Tizen::Ui::IActionEventListener + , public Tizen::Ui::Scenes::ISceneEventListener + , public IFeatureSetGeneratorListener +{ +public: + UpdatePanel(void); + virtual ~UpdatePanel(void); + bool Initialize(); + result OnInitializing(void); + result OnTerminating(void); + virtual void OnFinish(void); + virtual void OnImageProcessed(int im_no, int total); + + virtual void OnActionPerformed(const Tizen::Ui::Control& source, int actionId); + virtual void OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs); + virtual void OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId); + + // Implementation +protected: + static const int ID_BUTTON_DELETE_FEATURES = 301; + static const int ID_BUTTON_UPDATE_FEATURE_SET = 302; + static const int ID_BUTTON_LOAD_FEATURE_SET = 303; + static const int ID_BUTTON_CHOOSE_IMAGE_FOLDER = 304; + +private: + Tizen::Base::String __currentFeaturePath; + Tizen::Base::String __currentImagePath; +}; + +#endif diff --git a/project/manifest.xml b/project/manifest.xml new file mode 100644 index 0000000..3498a38 --- /dev/null +++ b/project/manifest.xml @@ -0,0 +1,31 @@ + + + $(manifestAppId) + 1.0.0 + C++App + + + + + x86 + vfpv3 + + + 2.1 + + http://tizen.org/privilege/power + + + + + + $(projectName) + + + mainmenu.png + + + + + + diff --git a/project/res/screen-density-high/home_type3.png b/project/res/screen-density-high/home_type3.png new file mode 100644 index 0000000000000000000000000000000000000000..71a19857ba6cad8fae81e0fb108209433e2ef44d GIT binary patch literal 3217 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 Dh!yca literal 0 HcmV?d00001 diff --git a/project/res/screen-density-high/message_type3.png b/project/res/screen-density-high/message_type3.png new file mode 100644 index 0000000000000000000000000000000000000000..63b58169ac19f706acbbc75c0a0e10a2db7eb4f4 GIT binary patch literal 3699 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 Dgy1rx literal 0 HcmV?d00001 diff --git a/project/res/screen-size-normal/IDC_GENERATION_MODE_PANEL.xml b/project/res/screen-size-normal/IDC_GENERATION_MODE_PANEL.xml new file mode 100644 index 0000000..88de83e --- /dev/null +++ b/project/res/screen-size-normal/IDC_GENERATION_MODE_PANEL.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + diff --git a/project/res/screen-size-normal/IDC_MESSAGE_POPUP.xml b/project/res/screen-size-normal/IDC_MESSAGE_POPUP.xml new file mode 100644 index 0000000..e4f7131 --- /dev/null +++ b/project/res/screen-size-normal/IDC_MESSAGE_POPUP.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + diff --git a/project/res/screen-size-normal/IDC_UPDATE_MODE_PANEL.xml b/project/res/screen-size-normal/IDC_UPDATE_MODE_PANEL.xml new file mode 100644 index 0000000..116b778 --- /dev/null +++ b/project/res/screen-size-normal/IDC_UPDATE_MODE_PANEL.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + diff --git a/project/res/screen-size-normal/IDF_FORM.xml b/project/res/screen-size-normal/IDF_FORM.xml new file mode 100644 index 0000000..e652021 --- /dev/null +++ b/project/res/screen-size-normal/IDF_FORM.xml @@ -0,0 +1,36 @@ + + + + + 720 +
+ + + + +
+ + +
+
+ + +
+ + + + + + + + + + + + + + + +
diff --git a/project/shared/data/nofile.dummy b/project/shared/data/nofile.dummy new file mode 100755 index 0000000..e69de29 diff --git a/project/shared/res/screen-density-xhigh/mainmenu.png b/project/shared/res/screen-density-xhigh/mainmenu.png new file mode 100644 index 0000000000000000000000000000000000000000..983c883493a0ae561b9592d54ea8204042b4b6fb GIT binary patch literal 17581 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 + __pItemContext->AddElement(ID_ITEM_DELETE, L"Delete"); + __pItemContext->AddElement(ID_ITEM_DETAILS, L"Details"); + + return true; +} + +result +FeatureManagerForm::OnInitializing(void) +{ + Header* pHeader = GetHeader(); + pHeader->SetTitleText(L"Manage database"); + if (!CreateMainList()) + { + return false; + } + + Footer* pFooter = GetFooter(); + + pFooter->SetStyle(FOOTER_STYLE_BUTTON_TEXT); + Form::SetFormBackEventListener(this); + + pFooter->SetBackButton(); + + pFooter->AddActionEventListener(*this); + + return E_SUCCESS; +} + +result +FeatureManagerForm::OnTerminating(void) +{ + result r = E_SUCCESS; + return r; +} + +bool +FeatureManagerForm::CreateMainList(void) +{ + __pList = new ListView(); + __pList->Construct(Rectangle(0, 80, GetClientAreaBounds().width, GetClientAreaBounds().height - 120), true, false); + __pList->SetItemProvider(*this); + __pList->AddListViewItemEventListener(*this); + AddControl(*__pList); + + return true; +} + + +void +FeatureManagerForm::OnActionPerformed (const Tizen::Ui::Control &source, int actionId) +{ + Tizen::Ui::Controls::Frame *pFrame = Tizen::App::Application::GetInstance()->GetAppFrame()->GetFrame(); + MainForm* pForm = static_cast(pFrame->GetControl(L"IDF_FORM", true)); + + switch(actionId) + { + case ID_BUTTON_SAVE: + { + if(pForm->GetFeatureManager() != null) + { + pForm->GetFeatureManager()->Flush(null); + } + } + break; + case ID_BUTTON_CLOSE_POPUP: + { + __pPopup->SetShowState(false); + __pPopup->SetEnabled(false); + delete __pPopup; + } + break; + default: + break; + } +} + +void +FeatureManagerForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_ZOOM_OUT)); +} + + +int +FeatureManagerForm::GetItemCount(void) +{ + Tizen::Ui::Controls::Frame *pFrame = Tizen::App::Application::GetInstance()->GetAppFrame()->GetFrame(); + MainForm* pForm = static_cast(pFrame->GetControl(L"IDF_FORM", true)); + + if(pForm == null) + { + return 0; + } + + if (pForm->GetFeatureManager()) + { + return pForm->GetFeatureManager()->GetTotalNumberOfFeatures(); + } + return 0; +} + +bool +FeatureManagerForm::DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth) +{ + delete pItem; + pItem = null; + return true; +} + +Tizen::Ui::Controls::ListItemBase* +FeatureManagerForm::CreateItem(int index, int itemWidth) +{ + ListAnnexStyle style = LIST_ANNEX_STYLE_NORMAL; + CustomItem* pItem = new (std::nothrow) CustomItem(); + Rectangle thumbnailElementRect(10, 20, 200, 200); + Rectangle descElementRect(220, 20, 650, 50); + Rectangle idElementRect(220, 40, 650, 30); + Dimension itemDimension(itemWidth, 200); + + pItem->Construct(itemDimension, style); + + Tizen::Ui::Controls::Frame *pFrame = Tizen::App::Application::GetInstance()->GetAppFrame()->GetFrame(); + MainForm* pForm = static_cast(pFrame->GetControl(L"IDF_FORM", true)); + if (pForm->GetFeatureManager()) + { + const Tizen::Uix::Vision::ImageFeatureInfo* pFeature = pForm->GetFeatureManager()->GetImageFeatureInfo(index); + if(pFeature == null) + { + return pItem; + } + + ByteBuffer* pByteBuffer = null; + pByteBuffer = pFeature->GetThumbnailN(); + if (pByteBuffer == null) + { + return null; + } + int __thumbnailWidth = pFeature->GetThumbnailWidth(); + int __thumbnailHeight = pFeature->GetThumbnailHeight(); + unsigned char* ptr = const_cast(pByteBuffer->GetPointer()); + unsigned char* end = ptr + __thumbnailWidth * __thumbnailHeight; + + ByteBuffer imageBuffer; + imageBuffer.Construct(__thumbnailWidth * __thumbnailHeight * 4); + unsigned char* iptr = const_cast(imageBuffer.GetPointer()); + + for (;ptr < end; ++ptr) + { + *(iptr++) = *ptr; + *(iptr++) = *ptr; + *(iptr++) = *ptr; + *(iptr++) = 255; + } + + Bitmap* pBitmap = new Bitmap(); + pBitmap->Construct(imageBuffer, Dimension(__thumbnailWidth, __thumbnailHeight), BITMAP_PIXEL_FORMAT_R8G8B8A8); + pItem->AddElement(thumbnailElementRect, ID_FORMAT_BITMAP, *pBitmap, null, null); + + //before this we should get name of the item + Tizen::Base::String name; + name.Format(80, L"%i: %ls", index, pFeature->GetDescription().GetPointer()); + + pItem->AddElement(descElementRect, ID_FORMAT_STRING, name, true); + + if(pByteBuffer) + { + delete pByteBuffer; + } + + } + + pItem->SetContextItem(__pItemContext); + + return pItem; +} + +void +FeatureManagerForm::OnListViewItemStateChanged(Tizen::Ui::Controls::ListView &view, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status) +{ + if(status == LIST_ITEM_STATUS_SELECTED) + { + __pList->UpdateList(); + __pList->Draw(true); + __pList->Show(); + } +} + +void +FeatureManagerForm::OnListViewItemSwept(Tizen::Ui::Controls::ListView &listView, int index, Tizen::Ui::Controls::SweepDirection direction) +{ +} + +void +FeatureManagerForm::OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView &listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus state) +{ + Tizen::Ui::Controls::Frame *pFrame = Tizen::App::Application::GetInstance()->GetAppFrame()->GetFrame(); + MainForm* pForm = static_cast(pFrame->GetControl(L"IDF_FORM", true)); + + switch(elementId) + { + case ID_ITEM_DELETE: + { + pForm->GetFeatureManager()->DeleteFeature(index); + __pList->UpdateList(); + __pList->Draw(true); + __pList->Show(); + break; + } + case ID_ITEM_DETAILS: + { + const Tizen::Uix::Vision::ImageFeatureInfo* pFeature = pForm->GetFeatureManager()->GetImageFeatureInfo(index); + + __pPopup = new Popup(); + __pPopup->Construct(true, Dimension(700, 1000)); + __pPopup->SetTitleText(L"Item details"); + + ByteBuffer* pByteBuffer; + pByteBuffer = pFeature->GetThumbnailN(); + if(pByteBuffer == null) + { + return; + } + + int __thumbnailWidth = pFeature->GetThumbnailWidth(); + int __thumbnailHeight = pFeature->GetThumbnailHeight(); + unsigned char* ptr = const_cast(pByteBuffer->GetPointer()); + unsigned char* end = ptr + __thumbnailWidth * __thumbnailHeight; + + ByteBuffer imageBuffer; + imageBuffer.Construct(__thumbnailWidth * __thumbnailHeight * 4); + unsigned char* iptr = const_cast(imageBuffer.GetPointer()); + + for (;ptr < end; ++ptr) + { + *(iptr++) = *ptr; + *(iptr++) = *ptr; + *(iptr++) = *ptr; + *(iptr++) = 255; + } + + Bitmap* pBitmap = new Bitmap(); + pBitmap->Construct(imageBuffer, Dimension(__thumbnailWidth, __thumbnailHeight), BITMAP_PIXEL_FORMAT_R8G8B8A8); + + Rectangle rect; + rect = __pPopup->GetClientAreaBounds(); + + Button* pButton = new Button; + pButton->Construct(Rectangle(0, 0, rect.width, rect.width), ""); + pButton->SetNormalBackgroundBitmap(*pBitmap); + pButton->SetActionId(ID_BUTTON_CLOSE_POPUP); + pButton->AddActionEventListener(*this); + __pPopup->AddControl(*pButton); + + String description = pFeature->GetDescription(); + String itemId; + itemId.Format(256, L"Item id: %i", index); + + Label* pDescLabel = new Label(); + pDescLabel->Construct(Rectangle(10, rect.width + 50, rect.width, rect.height - rect.width), description); + pDescLabel->SetTextHorizontalAlignment(ALIGNMENT_CENTER); + __pPopup->AddControl(*pDescLabel); + + Label* pIdLabel = new Label(); + pIdLabel->Construct(Rectangle(10, rect.width, rect.width, rect.height - rect.width), itemId); + pIdLabel->SetTextHorizontalAlignment(ALIGNMENT_CENTER); + __pPopup->AddControl(*pIdLabel); + + __pPopup->SetShowState(true); + __pPopup->Show(); + break; + } + }; +} + +void +FeatureManagerForm::OnItemReordered(Tizen::Ui::Controls::ListView &listView, int oldIndex, int newIndex) +{ +} + +void +FeatureManagerForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs) +{ + __pList->ScrollToItem(0); + __pList->UpdateList(); + + if(pArgs != null) + { + pArgs->RemoveAll(); + delete pArgs; + } +} + +void +FeatureManagerForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ +} diff --git a/project/src/FeatureSetGenerator.cpp b/project/src/FeatureSetGenerator.cpp new file mode 100644 index 0000000..8cd1ccf --- /dev/null +++ b/project/src/FeatureSetGenerator.cpp @@ -0,0 +1,212 @@ +// +// Tizen Native SDK +// Open Service Platform +// Copyright (c) 2013 Samsung Electronics Co., Ltd. +// All rights reserved. +// +// This software contains confidential and proprietary information +// of Samsung Electronics Co., Ltd. +// The user of this software agrees not to disclose, disseminate or copy such +// Confidential Information and shall use the software only in accordance with +// the terms of the license agreement the user entered into with Samsung. +// + +#include "FeatureSetGenerator.h" + +#include +#include + +FeatureSetGenThread::FeatureSetGenThread(void) + : __pListener(0) + , __pImageFeatureManager(0) +{ +} + +FeatureSetGenThread::~FeatureSetGenThread(void) +{ +} + +result +FeatureSetGenThread::Construct(void) +{ + return Thread::Construct(); +} + +Tizen::Base::Object* +FeatureSetGenThread::Run(void) +{ + __resultInfo.appendTime = 0; + __resultInfo.totalObjectsNumber = 0; + __resultInfo.appendedObjectsNumber = 0; + __resultInfo.rejectedObjectsNumber = 0; + + Generate(__imagePath, __resultInfo); + + if (__pListener) + { + __pListener->OnFinish(); + } + + return null; +} + +void +FeatureSetGenThread::SetListener(IFeatureSetGeneratorListener* pListener) +{ + if (__pListener == pListener) + { + return; + } + __pListener = pListener; +} + +bool +FeatureSetGenThread::Generate(Tizen::Base::String imPath, ResultInfo& resInfo) +{ + bool isRes = true; + int currObject = 0; + int objectID = 0; + + if(!__pImageFeatureManager) + { + return false; + } + + Tizen::Base::TimeSpan start(0, 0, 1), finish(0, 0, 1); + Tizen::System::SystemTime::GetUptime(start); + Tizen::Io::Directory dir; + + result r = dir.Construct(imPath); + if (!IsFailed(r)) + { + + Tizen::Base::String folder(imPath); + if (folder[folder.GetLength() - 1] != '/') + { + folder += "/"; + } + + Tizen::Io::DirEnumerator* pDirEnum = dir.ReadN(); + if (!pDirEnum) + { + return false; + } + + while(pDirEnum->MoveNext() == E_SUCCESS) + { + Tizen::Io::DirEntry dirEntry = pDirEnum->GetCurrentDirEntry(); + if (!dirEntry.IsDirectory()) + { + if(Tizen::Io::File::IsFileExist(imPath + "/" + dirEntry.GetName())) + { + __files.Add(imPath + "/" + dirEntry.GetName()); + } + } + } + pDirEnum->Reset(); + + } + else + { + + if(CheckExt(imPath) && Tizen::Io::File::IsFileExist(imPath)) + { + __files.Add(imPath); + } + else + { + return false; + } + } + + StrComparer* pStrComparer = new StrComparer(); + __files.Sort(*pStrComparer); + delete pStrComparer; + + // Uses an enumerator to access elements in the list + Tizen::Base::Collection::IEnumeratorT* pEnum = __files.GetEnumeratorN(); + Tizen::Base::String pName; + + while (pEnum->MoveNext() == E_SUCCESS) + { + pEnum->GetCurrent(pName); + + ++currObject; + + if (__pListener) + { + __pListener->OnImageProcessed(currObject, __files.GetCount()); + } + + if (-1 != (objectID = __pImageFeatureManager->AddFeature(pName))) + { + ++resInfo.appendedObjectsNumber; + } + else + { + ++resInfo.rejectedObjectsNumber; + } + } + delete pEnum; + __files.RemoveAll(); + + resInfo.totalObjectsNumber = __pImageFeatureManager->GetTotalNumberOfFeatures(); + + Tizen::System::SystemTime::GetUptime(finish); + resInfo.appendTime = 60000 * (finish - start).GetMinutes() + 1000 * (finish - start).GetSeconds() + + (finish - start).GetMilliseconds(); + + Tizen::System::SystemTime::GetUptime(start); + Tizen::System::SystemTime::GetUptime(finish); + resInfo.writeTime = 60000 * (finish - start).GetMinutes() + 1000 * (finish - start).GetSeconds() + (finish - start).GetMilliseconds(); + + //Causing UI frees after exit + Sleep(500); + + return isRes; +} + +void +FeatureSetGenThread::SetImagePath(const Tizen::Base::String& imPath) +{ + __imagePath = imPath; +} + +void +FeatureSetGenThread::GetResults(ResultInfo& resInfo) +{ + resInfo = __resultInfo; +} + +bool +FeatureSetGenThread::CheckExt(Tizen::Base::String fileName) +{ + int period = 0; + const Tizen::Base::String period_symbol = "."; + if (E_SUCCESS != fileName.LastIndexOf(period_symbol, fileName.GetLength()-1, period)) + { + return false; + } + Tizen::Base::String extension; + if(E_SUCCESS != fileName.SubString(period + 1, extension)) + { + return false; + } + + if ( (extension.Equals(L"jpg",true)) || + (extension.Equals(L"bmp",true)) || + (extension.Equals(L"png",true)) || + (extension.Equals(L"jpeg",true))) + { + return true; + } + + return false; + +} + +void +FeatureSetGenThread::SetFeatureManager(Tizen::Uix::Vision::ImageFeatureManager* pImageFeatureManager) +{ + __pImageFeatureManager = pImageFeatureManager; +} diff --git a/project/src/FileManagerForm.cpp b/project/src/FileManagerForm.cpp new file mode 100644 index 0000000..766fc78 --- /dev/null +++ b/project/src/FileManagerForm.cpp @@ -0,0 +1,392 @@ +// +// Tizen Native SDK +// Open Service Platform +// Copyright (c) 2013 Samsung Electronics Co., Ltd. +// All rights reserved. +// +// This software contains confidential and proprietary information +// of Samsung Electronics Co., Ltd. +// The user of this software agrees not to disclose, disseminate or copy such +// Confidential Information and shall use the software only in accordance with +// the terms of the license agreement the user entered into with Samsung. +// + +#include "FileManagerForm.h" + +using namespace Tizen::App; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; +using namespace Tizen::Graphics; + +FileManagerForm::FileManagerForm(void) + : __pList(0) + , __pEditField(0) + , __canChooseNew(false) + , __canChooseOne(true) +{ +} + +FileManagerForm::~FileManagerForm(void) +{ +} + +bool +FileManagerForm::Initialize(const Tizen::Base::Collection::ArrayListT& fileExt, bool isEditField) +{ + Construct(FORM_STYLE_NORMAL | FORM_STYLE_HEADER | FORM_STYLE_INDICATOR | FORM_STYLE_FOOTER); + + __fileExts.Construct(fileExt); + __canChooseNew = isEditField; + + AppResource* pAppResource = Application::GetInstance()->GetAppResource(); + __pFileIcon = pAppResource->GetBitmapN(L"home_type3.png"); + __pFolderIcon = pAppResource->GetBitmapN(L"message_type3.png"); + + return true; +} + +result +FileManagerForm::OnInitializing(void) +{ + if (!CreateMainList()) + { + return false; + } + + Footer* pFooter = GetFooter(); + + pFooter->SetStyle(FOOTER_STYLE_BUTTON_TEXT); + Form::SetFormBackEventListener(this); + + pFooter->AddActionEventListener(*this); + + return E_SUCCESS; +} + +result +FileManagerForm::OnTerminating(void) +{ + result r = E_SUCCESS; + return r; +} + +bool +FileManagerForm::CreateMainList(void) +{ + __pList = new ListView(); + + if (__canChooseNew) + { + __pEditField = new EditField(); + __pEditField->Construct(Rectangle(30, 0, GetClientAreaBounds().width - 60, 100)); + __pEditField->SetKeypadEnabled(false); + this->AddControl(*__pEditField); + + __pList->Construct(Rectangle(0, 130, GetClientAreaBounds().width, GetClientAreaBounds().height - 130), true, false); + } + else + { + __pList->Construct(Rectangle(0, 0, GetClientAreaBounds().width, GetClientAreaBounds().height), true, false); + } + __pList->SetItemProvider(*this); + __pList->AddListViewItemEventListener(*this); + AddControl(*__pList); + + return true; +} + +void +FileManagerForm::OnActionPerformed (const Tizen::Ui::Control &source, int actionId) +{ + if (actionId == ID_BUTTON_EXIT) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + ArrayList* pList = new (std::nothrow) ArrayList; + AppAssert(pList); + pList->Construct(); + String* pFolder = new String(""); + if (__canChooseNew) + { + String fileName = __pEditField->GetText(); + if (fileName.IsEmpty()) + { + fileName = "default.xdb"; + } + if (!fileName.EndsWith(".xdb")) + { + fileName.Append(".xdb"); + } + *pFolder = __currentPath + "/" + fileName; + } + else + { + *pFolder = __currentPath; + } + pList->Add(*pFolder); + + pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_ZOOM_OUT), pList); + } +} + +void +FileManagerForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_ZOOM_OUT), null /*pList*/); +} + + +int +FileManagerForm::GetItemCount(void) +{ + return __files.GetCount(); +} + +bool +FileManagerForm::DeleteItem(int index, Tizen::Ui::Controls::ListItemBase* pItem, int itemWidth) +{ + delete pItem; + pItem = null; + return true; +} + +Tizen::Ui::Controls::ListItemBase* +FileManagerForm::CreateItem(int index, int itemWidth) +{ + ListAnnexStyle style = LIST_ANNEX_STYLE_NORMAL; + CustomItem* pItem = new CustomItem(); + pItem->Construct(Tizen::Graphics::Dimension(itemWidth, 100), style); + + Tizen::Base::String fileName; + __files.GetAt(index, fileName); + + Tizen::Io::FileAttributes fileAtt; + + if (Tizen::Io::File::GetAttributes(__currentPath + "/" + fileName, fileAtt) == E_SUCCESS) + { + if (fileAtt.IsDirectory()) + { + pItem->AddElement(Rectangle(10, 20, 60, 60), ID_FORMAT_BITMAP, *__pFolderIcon, null, null); + } + else + { + pItem->AddElement(Rectangle(10, 20, 60, 60), ID_FORMAT_BITMAP, *__pFileIcon, null, null); + } + } + + pItem->AddElement(Rectangle(80, 25, 720, 50), ID_FORMAT_STRING, fileName, true); + + return pItem; +} + +void +FileManagerForm::OnListViewItemStateChanged(Tizen::Ui::Controls::ListView &view, int index, int elementId, Tizen::Ui::Controls::ListItemStatus status) +{ + Tizen::Base::String fileName; + __files.GetAt(index, fileName); + + if (status == LIST_ITEM_STATUS_SELECTED) + { + // Load database on click + if (fileName == "..") + { + GoDownDir(); + __pList->ScrollToItem(0); + GetDirs(__currentPath); + } + else if (CheckExt(fileName)) + { + if (__canChooseNew) + { + __pEditField->SetText(fileName); + __pEditField->RequestRedraw(true); + } + else if (__canChooseOne) + { + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + ArrayList* pList = new (std::nothrow) ArrayList; + AppAssert(pList); + pList->Construct(); + String* pFolder = new String(__currentPath + "/" + fileName); + pList->Add(*pFolder); + + pSceneManager->GoBackward(BackwardSceneTransition(SCENE_TRANSITION_ANIMATION_TYPE_ZOOM_OUT), pList); + } + } + else + { + GoUpDir(fileName); + __pList->ScrollToItem(0); + GetDirs(__currentPath); + } + + __pList->UpdateList(); + __pList->Draw(true); + __pList->Show(); + } +} + +void +FileManagerForm::OnListViewItemSwept(Tizen::Ui::Controls::ListView &listView, int index, Tizen::Ui::Controls::SweepDirection direction) +{ +} + +void +FileManagerForm::OnListViewContextItemStateChanged(Tizen::Ui::Controls::ListView &listView, int index, int elementId, Tizen::Ui::Controls::ListContextItemStatus state) +{ +} + +void +FileManagerForm::OnItemReordered(Tizen::Ui::Controls::ListView &listView, int oldIndex, int newIndex) +{ +} + +bool +FileManagerForm::CheckExt(Tizen::Base::String fileName) +{ + int period = 0; + const Tizen::Base::String period_symbol = "."; + if (E_SUCCESS != fileName.LastIndexOf(period_symbol, fileName.GetLength()-1, period)) + { + return false; + } + Tizen::Base::String extension; + if(E_SUCCESS != fileName.SubString(period + 1, extension)) + { + return false; + } + + if (__fileExts.Contains(extension)) + { + return true; + } + + return false; + +} + +void +FileManagerForm::GetDirs(Tizen::Base::String dirPath) +{ + Tizen::Io::Directory dir; + Tizen::Io::DirEnumerator *pDirEnum(null); + Tizen::Io::File file; + Tizen::Io::FileAttributes fileAtt; + + if (dir.Construct(dirPath) == E_SUCCESS) + { + pDirEnum = dir.ReadN(); + __files.RemoveAll(); + + while(pDirEnum->MoveNext() == E_SUCCESS) + { + Tizen::Io::DirEntry dirEntry = pDirEnum->GetCurrentDirEntry(); + if (CheckExt(dirEntry.GetName()) || dirEntry.IsDirectory()) + { + __files.Add(dirEntry.GetName()); + } + } + + StrComparer* pStrComparer = new StrComparer(); + __files.Sort(*pStrComparer); + delete pStrComparer; + + __files.Remove("."); + } + else if (Tizen::Io::File::GetAttributes(dirPath, fileAtt) == E_SUCCESS) + { + GoDownDir(); + } + + delete pDirEnum; +} + +void +FileManagerForm::GoDownDir(void) +{ + int separator_pos = 0; + const Tizen::Base::String separator_symbol = "/"; + if (E_SUCCESS != __currentPath.LastIndexOf(separator_symbol, __currentPath.GetLength()-1, separator_pos)) + { + return; + } + if (E_SUCCESS != __currentPath.SubString(0, separator_pos, __currentPath)) + { + return; + } + if (__currentPath.IsEmpty()) + { + __currentPath = "/"; + } + + if (__pEditField) + { + __pEditField->RequestRedraw(true); + } +} + +void +FileManagerForm::GoUpDir(Tizen::Base::String dir) +{ + if (!__currentPath.Equals(L"/", false)) + { + __currentPath += "/"; + } + __currentPath += dir; + + if (__pEditField) + { + __pEditField->RequestRedraw(true); + } +} + +bool +FileManagerForm::IsFile(Tizen::Base::String filePath) +{ + Tizen::Io::File file; + Tizen::Io::FileAttributes fileAtt; + return Tizen::Io::File::GetAttributes(filePath, fileAtt) == E_SUCCESS; +} + +void +FileManagerForm::OnSceneActivatedN(const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, Tizen::Base::Collection::IList* pArgs) +{ + + Footer* pFooter = GetFooter(); + pFooter->RemoveAllButtons(); + pFooter->SetBackButton(); + + if (currentSceneId == "ChooseImageScene") + { + FooterItem footerItemChooseFolder; + footerItemChooseFolder.Construct(ID_BUTTON_EXIT); + footerItemChooseFolder.SetText("Choose"); + pFooter->AddItem(footerItemChooseFolder); + } + else if (currentSceneId == "ChooseNewFeatureSetScene") + { + __pEditField->SetKeypadEnabled(true); + FooterItem footerItemChooseFolder; + footerItemChooseFolder.Construct(ID_BUTTON_EXIT); + footerItemChooseFolder.SetText("Create"); + pFooter->AddItem(footerItemChooseFolder); + } + + __currentPath = "/opt/media"; + __pList->ScrollToItem(0); + GetDirs(__currentPath); + __pList->UpdateList(); +} + +void +FileManagerForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ +} diff --git a/project/src/GeneratePanel.cpp b/project/src/GeneratePanel.cpp new file mode 100644 index 0000000..fe8e501 --- /dev/null +++ b/project/src/GeneratePanel.cpp @@ -0,0 +1,177 @@ +#include "GeneratePanel.h" +#include "MainForm.h" +#include "FileManagerForm.h" + +using namespace Tizen::Base; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + + +GeneratePanel::GeneratePanel(void) + : __currentFeaturePath("/opt/media/default.xdb") + , __currentImagePath("/opt/media") +{ +} + +GeneratePanel::~GeneratePanel(void) +{ +} + +bool +GeneratePanel::Initialize() +{ + Panel::Construct(L"IDC_GENERATION_MODE_PANEL"); + return true; +} + +result +GeneratePanel::OnInitializing(void) +{ + result r = E_SUCCESS; + + Button *pButton = null; + Tizen::Ui::Controls::Frame *pFrame = Tizen::App::Application::GetInstance()->GetAppFrame()->GetFrame(); + MainForm* pForm = static_cast(pFrame->GetControl(L"IDF_FORM", true)); + + Rectangle clienRect = pForm->GetClientAreaBounds(); + this->SetBounds(clienRect); + + pButton = static_cast(GetControl(L"IDC_BUTTON_GENERATE_FEATURE_SET", true)); + if (pButton) + { + pButton->SetActionId(ID_BUTTON_GENERATE_FEATURE_SET); + pButton->AddActionEventListener(*this); + } + + pButton = static_cast(GetControl(L"IDC_BUTTON_CHOOSE_IMAGE_FOLDER", true)); + if (pButton) + { + pButton->SetActionId(ID_BUTTON_CHOOSE_IMAGE_FOLDER_PATH); + pButton->AddActionEventListener(*this); + } + + pButton = static_cast(GetControl(L"IDC_BUTTON_CHOOSE_FEATURE_SET_PATH", true)); + if (pButton) + { + pButton->SetActionId(ID_BUTTON_CHOOSE_FEATURE_SET_PATH); + pButton->AddActionEventListener(*this); + } + + return r; +} + +result +GeneratePanel::OnTerminating(void) +{ + result r = E_SUCCESS; + return r; +} + + +void +GeneratePanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case ID_BUTTON_CHOOSE_FEATURE_SET_PATH: + { + pSceneManager->GoForward( + ForwardSceneTransition("ChooseNewFeatureSetScene", + SCENE_TRANSITION_ANIMATION_TYPE_ZOOM_IN, + SCENE_HISTORY_OPTION_ADD_HISTORY, + SCENE_DESTROY_OPTION_KEEP),0); + } + break; + + case ID_BUTTON_CHOOSE_IMAGE_FOLDER_PATH: + { + pSceneManager->GoForward( + ForwardSceneTransition("ChooseImageScene", + SCENE_TRANSITION_ANIMATION_TYPE_ZOOM_IN, + SCENE_HISTORY_OPTION_ADD_HISTORY, + SCENE_DESTROY_OPTION_KEEP), 0); + } + break; + + case ID_BUTTON_GENERATE_FEATURE_SET: + { + Tizen::Ui::Controls::Frame *pFrame = Tizen::App::Application::GetInstance()->GetAppFrame()->GetFrame(); + MainForm* pForm = static_cast(pFrame->GetControl(L"IDF_FORM", true)); + pForm->GetFeatureManager()->DeleteAllFeatures(); + pForm->AppendImageFolder(__currentImagePath, this); + } + break; + } +} + + +void +GeneratePanel::OnSceneActivatedN( + const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + if ((previousSceneId == "ChooseImageScene") && pArgs) + { + if (pArgs->GetCount() > 0) + { + __currentImagePath = *(dynamic_cast(pArgs->GetAt(0))); + } + } + else if ((previousSceneId == "ChooseNewFeatureSetScene") && pArgs) + { + if (pArgs->GetCount() > 0) + { + __currentFeaturePath = *(dynamic_cast(pArgs->GetAt(0))); + } + } + + if(pArgs) + { + pArgs->RemoveAll(true); + delete pArgs; + } + + Button* pButtonPath = null; + pButtonPath = static_cast(GetControl(L"IDC_BUTTON_CHOOSE_FEATURE_SET_PATH", true)); + if (pButtonPath) + { + pButtonPath->SetText(__currentFeaturePath); + } + + pButtonPath = static_cast(GetControl(L"IDC_BUTTON_CHOOSE_IMAGE_FOLDER", true)); + if (pButtonPath) + { + pButtonPath->SetText(__currentImagePath); + } +} + +void +GeneratePanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ +} + +void +GeneratePanel::OnImageProcessed(int imNo, int total) +{ + Tizen::Ui::Controls::Frame *pFrame = Tizen::App::Application::GetInstance()->GetAppFrame()->GetFrame(); + MainForm* pForm = static_cast(pFrame->GetControl(L"IDF_FORM", true)); + + pForm->OnImageProcessed(imNo, total); +} + +void +GeneratePanel::OnFinish(void) +{ + Tizen::Ui::Controls::Frame *pFrame = Tizen::App::Application::GetInstance()->GetAppFrame()->GetFrame(); + MainForm* pForm = static_cast(pFrame->GetControl(L"IDF_FORM", true)); + + pForm->GetFeatureManager()->Flush(&__currentFeaturePath); + pForm->OnFinish(); +} diff --git a/project/src/ImageFeatureApp.cpp b/project/src/ImageFeatureApp.cpp new file mode 100644 index 0000000..40da93d --- /dev/null +++ b/project/src/ImageFeatureApp.cpp @@ -0,0 +1,118 @@ +// +// Tizen Native SDK +// Open Service Platform +// Copyright (c) 2013 Samsung Electronics Co., Ltd. +// All rights reserved. +// +// This software contains confidential and proprietary information +// of Samsung Electronics Co., Ltd. +// The user of this software agrees not to disclose, disseminate or copy such +// Confidential Information and shall use the software only in accordance with +// the terms of the license agreement the user entered into with Samsung. +// + +#include "ImageFeatureApp.h" +#include "ImageFeatureFormFactory.h" +#include "ImageFeaturePanelFactory.h" + +using namespace Tizen::App; +using namespace Tizen::Base; +using namespace Tizen::System; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + + +ImageFeatureApp::ImageFeatureApp(void) +{ +} + +ImageFeatureApp::~ImageFeatureApp(void) +{ +} + +UiApp* +ImageFeatureApp::CreateInstance(void) +{ + return new ImageFeatureApp(); +} + +bool +ImageFeatureApp::OnAppInitializing(AppRegistry& appRegistry) +{ + PowerManager::SetScreenEventListener(*this); + PowerManager::KeepScreenOnState(true, false); + return true; +} + +bool +ImageFeatureApp::OnAppInitialized(void) +{ + Frame* pAppFrame = new Frame(); + pAppFrame->Construct(); + AddFrame(*pAppFrame); + + SceneManager* pSceneManager = SceneManager::GetInstance(); + static ImageFeatureFormFactory formFactory; + static ImageFeaturePanelFactory panelFactory; + pSceneManager->RegisterFormFactory(formFactory); + pSceneManager->RegisterPanelFactory(panelFactory); + + pSceneManager->RegisterScene(L"GenerationModeScene", L"MainForm", L"PanelGenerate"); + pSceneManager->RegisterScene(L"UpdateModeScene", L"MainForm", L"PanelUpdate"); + + pSceneManager->RegisterScene(L"ChooseExistingFeatureSetScene", L"ChooseExistingFeatureSetForm", L""); + pSceneManager->RegisterScene(L"ChooseNewFeatureSetScene", L"ChooseNewFeatureSetForm", L""); + pSceneManager->RegisterScene(L"ChooseImageScene", L"ChooseImageForm", L""); + + pSceneManager->RegisterScene(L"ManageScene", L"DatabaseManagerForm", L""); + + if (pSceneManager->GoForward(ForwardSceneTransition(L"GenerationModeScene")) != E_SUCCESS) + return false; + + return true; +} + +bool +ImageFeatureApp::OnAppWillTerminate(void) +{ + return true; +} + +bool +ImageFeatureApp::OnAppTerminating(AppRegistry& appRegistry, bool forcedTermination) +{ + return true; +} + +void +ImageFeatureApp::OnForeground(void) +{ + PowerManager::KeepScreenOnState(true, false); +} + +void +ImageFeatureApp::OnBackground(void) +{ +} + +void +ImageFeatureApp::OnLowMemory(void) +{ +} + +void +ImageFeatureApp::OnBatteryLevelChanged(BatteryLevel batteryLevel) +{ +} + +void +ImageFeatureApp::OnScreenOn(void) +{ + PowerManager::KeepScreenOnState(true, false); +} + +void +ImageFeatureApp::OnScreenOff(void) +{ +} diff --git a/project/src/ImageFeatureAppEntry.cpp b/project/src/ImageFeatureAppEntry.cpp new file mode 100644 index 0000000..12ea248 --- /dev/null +++ b/project/src/ImageFeatureAppEntry.cpp @@ -0,0 +1,60 @@ +// +// Tizen Native SDK +// Open Service Platform +// Copyright (c) 2013 Samsung Electronics Co., Ltd. +// All rights reserved. +// +// This software contains confidential and proprietary information +// of Samsung Electronics Co., Ltd. +// The user of this software agrees not to disclose, disseminate or copy such +// Confidential Information and shall use the software only in accordance with +// the terms of the license agreement the user entered into with Samsung. +// + +/** + * This file contains the Tizen application entry point. + */ +#include "ImageFeatureApp.h" + +using namespace Tizen::Base; +using namespace Tizen::Base::Collection; + +#ifdef __cplusplus +extern "C" +{ +#endif // __cplusplus + +_EXPORT_ int OspMain(int argc, char *pArgv[]); + +/** + * The entry function of Tizen application called by the operating system. + */ +int +OspMain(int argc, char *pArgv[]) +{ + result r = E_SUCCESS; + + AppLog("Application started."); + ArrayList* pArgs = new ArrayList(); + pArgs->Construct(); + for (int i = 0; i < argc; i++) + { + pArgs->Add(*(new String(pArgv[i]))); + } + + r = Tizen::App::UiApp::Execute(ImageFeatureApp::CreateInstance, pArgs); + if (IsFailed(r)) + { + AppLogException("Application execution failed-[%s].", GetErrorMessage(r)); + r &= 0x0000FFFF; + } + + pArgs->RemoveAll(true); + delete pArgs; + AppLog("Application finished."); + + return static_cast(r); +} +#ifdef __cplusplus +} +#endif // __cplusplus diff --git a/project/src/ImageFeatureFormFactory.cpp b/project/src/ImageFeatureFormFactory.cpp new file mode 100644 index 0000000..2608fe9 --- /dev/null +++ b/project/src/ImageFeatureFormFactory.cpp @@ -0,0 +1,97 @@ +// +// Tizen Native SDK +// Open Service Platform +// Copyright (c) 2013 Samsung Electronics Co., Ltd. +// All rights reserved. +// +// This software contains confidential and proprietary information +// of Samsung Electronics Co., Ltd. +// The user of this software agrees not to disclose, disseminate or copy such +// Confidential Information and shall use the software only in accordance with +// the terms of the license agreement the user entered into with Samsung. +// + +#include "ImageFeatureFormFactory.h" +#include "MainForm.h" +#include "FileManagerForm.h" +#include "FeatureManagerForm.h" + +using namespace Tizen::Ui::Scenes; + + +ImageFeatureFormFactory::ImageFeatureFormFactory(void) +{ +} + +ImageFeatureFormFactory::~ImageFeatureFormFactory(void) +{ +} + +Tizen::Ui::Controls::Form* +ImageFeatureFormFactory::CreateFormN(const Tizen::Base::String& formId, const Tizen::Ui::Scenes::SceneId& sceneId) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + Tizen::Ui::Controls::Form* pNewForm = null; + Tizen::Base::Collection::ArrayListT fileExts; + + if (formId == L"MainForm") + { + MainForm* pForm = new MainForm(); + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + + if (formId == L"ChooseNewFeatureSetForm") + { + fileExts.RemoveAll(); + fileExts.Add(Tizen::Base::String(L"xdb")); + + FileManagerForm* pForm = new FileManagerForm(); + pForm->Initialize(fileExts, true); + Tizen::Ui::Controls::Header* pHeader = pForm->GetHeader(); + pHeader->SetTitleText("Create New Feature Set"); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + + if (formId == L"ChooseExistingFeatureSetForm") + { + fileExts.RemoveAll(); + fileExts.Add(Tizen::Base::String(L"xdb")); + + FileManagerForm* pForm = new FileManagerForm(); + pForm->Initialize(fileExts, false); + Tizen::Ui::Controls::Header* pHeader = pForm->GetHeader(); + pHeader->SetTitleText("Choose Feature Set"); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + + if (formId == L"ChooseImageForm") + { + fileExts.RemoveAll(); + fileExts.Add(Tizen::Base::String(L"jpg")); + fileExts.Add(Tizen::Base::String(L"jpeg")); + fileExts.Add(Tizen::Base::String(L"png")); + fileExts.Add(Tizen::Base::String(L"bmp")); + + FileManagerForm* pForm = new FileManagerForm(); + pForm->Initialize(fileExts, false); + Tizen::Ui::Controls::Header* pHeader = pForm->GetHeader(); + pHeader->SetTitleText("Choose Image Folder"); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + + if (formId == L"DatabaseManagerForm") + { + FeatureManagerForm* pForm = new FeatureManagerForm(); + pForm->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pForm); + pNewForm = pForm; + } + + return pNewForm; +} diff --git a/project/src/ImageFeaturePanelFactory.cpp b/project/src/ImageFeaturePanelFactory.cpp new file mode 100644 index 0000000..ce367de --- /dev/null +++ b/project/src/ImageFeaturePanelFactory.cpp @@ -0,0 +1,55 @@ +// +// Tizen Native SDK +// Open Service Platform +// Copyright (c) 2013 Samsung Electronics Co., Ltd. +// All rights reserved. +// +// This software contains confidential and proprietary information +// of Samsung Electronics Co., Ltd. +// The user of this software agrees not to disclose, disseminate or copy such +// Confidential Information and shall use the software only in accordance with +// the terms of the license agreement the user entered into with Samsung. +// + +#include "ImageFeaturePanelFactory.h" +#include + +#include "GeneratePanel.h" +#include "UpdatePanel.h" + +using namespace Tizen::Ui::Scenes; +using namespace Tizen::Ui::Controls; + +ImageFeaturePanelFactory::ImageFeaturePanelFactory(void) +{ +} + +ImageFeaturePanelFactory::~ImageFeaturePanelFactory(void) +{ +} + +Tizen::Ui::Controls::Panel* +ImageFeaturePanelFactory::CreatePanelN(const Tizen::Base::String& panelId, const Tizen::Ui::Scenes::SceneId& sceneId) +{ + Panel* pNewPanel = null; + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + if (panelId == L"PanelGenerate") + { + GeneratePanel* pPanel = new GeneratePanel(); + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } + + else if (panelId == L"PanelUpdate") + { + UpdatePanel* pPanel = new UpdatePanel(); + pPanel->Initialize(); + pSceneManager->AddSceneEventListener(sceneId, *pPanel); + pNewPanel = pPanel; + } + + return pNewPanel; +} diff --git a/project/src/MainForm.cpp b/project/src/MainForm.cpp new file mode 100644 index 0000000..168fbcd --- /dev/null +++ b/project/src/MainForm.cpp @@ -0,0 +1,261 @@ +// +// Tizen Native SDK +// Open Service Platform +// Copyright (c) 2013 Samsung Electronics Co., Ltd. +// All rights reserved. +// +// This software contains confidential and proprietary information +// of Samsung Electronics Co., Ltd. +// The user of this software agrees not to disclose, disseminate or copy such +// Confidential Information and shall use the software only in accordance with +// the terms of the license agreement the user entered into with Samsung. +// + +#include +#include "MainForm.h" +#include "FileManagerForm.h" +#include "GeneratePanel.h" + +using namespace Tizen::Base; +using namespace Tizen::App; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + +static const String SAMPLE_TITLE = L"ImageFeatureManager"; + +MainForm::MainForm(void) + : __headerTitle(SAMPLE_TITLE) + , __pRadioGroupMode(null) + , __pFeatureManager(null) + , __pMessagePopup(null) + , __pMessageLabel(null) +{ +} + +MainForm::~MainForm(void) +{ + if(__pFeatureManager) + { + delete __pFeatureManager; + } + delete __pMessagePopup; +} + +bool +MainForm::Initialize(void) +{ + Construct(L"IDF_FORM"); + return true; +} + +result +MainForm::OnInitializing(void) +{ + result r = E_SUCCESS; + + SetFormBackEventListener(this); + + CheckButton* pCheckButton = null; + + __pRadioGroupMode = new RadioGroup(); + __pRadioGroupMode->Construct(); + + pCheckButton = static_cast(GetControl(L"IDC_UPDATE_MODE_BUTTON", true)); + if (pCheckButton) + { + pCheckButton->AddActionEventListener(*this); + pCheckButton->SetActionId(ID_BUTTON_UPDATE_MODE, 0, 0); + __pRadioGroupMode->Add(*pCheckButton); + } + + pCheckButton = static_cast(GetControl(L"IDC_GENERATION_MODE_BUTTON", true)); + + if (pCheckButton) + { + pCheckButton->SetSelected(true); + pCheckButton->AddActionEventListener(*this); + pCheckButton->SetActionId(ID_BUTTON_GENERATE_MODE, 0, 0); + __pRadioGroupMode->Add(*pCheckButton); + } + + Footer* pFooter = GetFooter(); + pFooter->SetStyle(FOOTER_STYLE_BUTTON_TEXT); + pFooter->SetBackButton(); + pFooter->AddActionEventListener(*this); + + __dbGen.Construct(); + __dbGen.SetListener(this); + + __pFeatureManager = new Tizen::Uix::Vision::ImageFeatureManager(); + __pFeatureManager->Construct(); + + __pMessagePopup = new Popup(); + __pMessagePopup->Construct("IDC_MESSAGE_POPUP"); + __pMessageLabel = static_cast(__pMessagePopup->GetControl("IDC_LABEL_MASSEGE_TEXT", true)); + + Button* pButton = static_cast(__pMessagePopup->GetControl("IDC_BUTTON_MESSAGE_CLOSE", true)); + if (pButton) + { + pButton->AddActionEventListener(*this); + pButton->SetActionId(ID_BUTTON_CLOSE_RESULTS); + } + + return r; +} + +result +MainForm::OnTerminating(void) +{ + result r = E_SUCCESS; + return r; +} + +void +MainForm::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case ID_BUTTON_GENERATE_MODE: + { + __pFeatureManager->DeleteAllFeatures(); + pSceneManager->GoForward( + ForwardSceneTransition("GenerationModeScene", + SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, + SCENE_DESTROY_OPTION_KEEP), null); + } + break; + case ID_BUTTON_UPDATE_MODE: + { + __pFeatureManager->DeleteAllFeatures(); + pSceneManager->GoForward( + ForwardSceneTransition("UpdateModeScene", + SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, + SCENE_DESTROY_OPTION_KEEP), null); + } + break; + case ID_BUTTON_CLOSE_RESULTS: + __pMessagePopup->SetShowState(false); + break; + default: + break; + } +} + +void +MainForm::AppendImageFolder(const Tizen::Base::String& imPath, IFeatureSetGeneratorListener* listener) +{ + if(listener != null) + { + __dbGen.SetListener(listener); + } + else + { + __dbGen.SetListener(this); + } + __dbGen.SetImagePath(imPath); + __dbGen.SetFeatureManager(__pFeatureManager); + this->SetEnabled(false); + __dbGen.Start(); +} + +void +MainForm::OnFormBackRequested(Tizen::Ui::Controls::Form& source) +{ + UiApp* pApp = UiApp::GetInstance(); + AppAssert(pApp); + pApp->Terminate(); +} + +void +MainForm::OnSceneActivatedN( + const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ +} + +void +MainForm::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ +} + +void +MainForm::OnImageProcessed(int imNo, int total) +{ + __headerTitle = "Generating... "; + __headerTitle.Append(Integer(imNo).ToString()); + __headerTitle.Append('/'); + __headerTitle.Append(Integer(total).ToString()); + RequestRedraw(true); +} + +void +MainForm::OnFinish(void) +{ + SendUserEvent(REQUEST_RESULT, 0); +} + +result +MainForm::OnDraw(void) +{ + Header* pHeader = GetHeader(); + pHeader->SetTitleText(__headerTitle); + return E_SUCCESS; +} + +void +MainForm::OnUserEventReceivedN(RequestId requestId, Tizen::Base::Collection::IList* pArgs) +{ + switch(requestId) + { + case REQUEST_RESULT: + { + __dbGen.GetResults(__resInfo); + this->SetEnabled(true); + this->RequestRedraw(true); + __headerTitle = SAMPLE_TITLE; + if (__resInfo.appendTime > 0) + { + if (__resInfo.appendedObjectsNumber != 0) + { + __pMessageLabel->SetText( + "\nTotal time: " + Integer(__resInfo.appendTime).ToString() + "ms" + + "\nAverage time: " + Integer(__resInfo.appendTime / __resInfo.appendedObjectsNumber).ToString() + " ms" + + "\nAdded images: " + Integer(__resInfo.appendedObjectsNumber).ToString() + + "\nRejected files: " + Integer(__resInfo.rejectedObjectsNumber).ToString() + + "\nTotal files count: " + Integer(__resInfo.totalObjectsNumber).ToString() + ); + } + else + { + __pMessageLabel->SetText( + "\nTotal time: " + Integer(__resInfo.appendTime).ToString() + "ms" + + "\nAdded images: " + Integer(__resInfo.appendedObjectsNumber).ToString() + + "\nRejected files: " + Integer(__resInfo.rejectedObjectsNumber).ToString() + + "\nTotal files count: " + Integer(__resInfo.totalObjectsNumber).ToString() + ); + } + + __pMessagePopup->SetShowState(true); + __pMessagePopup->Show(); + } + break; + } + default: + break; + } +} + +Tizen::Uix::Vision::ImageFeatureManager* +MainForm::GetFeatureManager(void) +{ + return __pFeatureManager; +} diff --git a/project/src/UpdatePanel.cpp b/project/src/UpdatePanel.cpp new file mode 100644 index 0000000..e65835c --- /dev/null +++ b/project/src/UpdatePanel.cpp @@ -0,0 +1,253 @@ +#include "UpdatePanel.h" +#include "FileManagerForm.h" +#include "MainForm.h" + +using namespace Tizen::Base; +using namespace Tizen::Graphics; +using namespace Tizen::Ui; +using namespace Tizen::Ui::Controls; +using namespace Tizen::Ui::Scenes; + + +UpdatePanel::UpdatePanel(void) + : __currentFeaturePath("") + , __currentImagePath("") +{ +} + +UpdatePanel::~UpdatePanel(void) +{ +} + +bool +UpdatePanel::Initialize() +{ + Panel::Construct(L"IDC_UPDATE_MODE_PANEL"); + return true; +} + +result +UpdatePanel::OnInitializing(void) +{ + result r = E_SUCCESS; + + Button *pButton = null; + Tizen::Ui::Controls::Frame *pFrame = Tizen::App::Application::GetInstance()->GetAppFrame()->GetFrame(); + MainForm* pForm = static_cast(pFrame->GetControl(L"IDF_FORM", true)); + + Rectangle clienRect = pForm->GetClientAreaBounds(); + this->SetBounds(clienRect); + + pButton = static_cast(GetControl(L"IDC_BUTTON_LOAD_FEATURE_SET", true)); + if (pButton) + { + pButton->SetActionId(ID_BUTTON_LOAD_FEATURE_SET); + pButton->AddActionEventListener(*this); + } + + pButton = static_cast(GetControl(L"IDC_BUTTON_DELETE_FEATURES", true)); + if (pButton) + { + pButton->SetActionId(ID_BUTTON_DELETE_FEATURES); + pButton->AddActionEventListener(*this); + } + + pButton = static_cast(GetControl(L"IDC_BUTTON_UPDATE_FEATURE_SET", true)); + if (pButton) + { + pButton->SetActionId(ID_BUTTON_UPDATE_FEATURE_SET); + pButton->AddActionEventListener(*this); + } + + pButton = static_cast(GetControl(L"IDC_BUTTON_UPDATE_IMAGE_FOLDER", true)); + if (pButton) + { + pButton->SetActionId(ID_BUTTON_CHOOSE_IMAGE_FOLDER); + pButton->AddActionEventListener(*this); + } + + return r; +} + +result +UpdatePanel::OnTerminating(void) +{ + result r = E_SUCCESS; + return r; +} + +void +UpdatePanel::OnActionPerformed(const Tizen::Ui::Control& source, int actionId) +{ + SceneManager* pSceneManager = SceneManager::GetInstance(); + AppAssert(pSceneManager); + + switch (actionId) + { + case ID_BUTTON_LOAD_FEATURE_SET: + { + pSceneManager->GoForward( + ForwardSceneTransition("ChooseExistingFeatureSetScene", + SCENE_TRANSITION_ANIMATION_TYPE_ZOOM_IN, + SCENE_HISTORY_OPTION_ADD_HISTORY, + SCENE_DESTROY_OPTION_KEEP), 0); + } + break; + + case ID_BUTTON_DELETE_FEATURES: + { + pSceneManager->GoForward( + ForwardSceneTransition("ManageScene", + SCENE_TRANSITION_ANIMATION_TYPE_ZOOM_IN, + SCENE_HISTORY_OPTION_ADD_HISTORY, + SCENE_DESTROY_OPTION_KEEP), null); + } + break; + + case ID_BUTTON_CHOOSE_IMAGE_FOLDER: + { + pSceneManager->GoForward( + ForwardSceneTransition("ChooseImageScene", + SCENE_TRANSITION_ANIMATION_TYPE_ZOOM_IN, + SCENE_HISTORY_OPTION_ADD_HISTORY, + SCENE_DESTROY_OPTION_KEEP), /*pList*/null); + } + break; + + case ID_BUTTON_UPDATE_FEATURE_SET: + { + Tizen::Ui::Controls::Frame *pFrame = Tizen::App::Application::GetInstance()->GetAppFrame()->GetFrame(); + MainForm* pForm = static_cast(pFrame->GetControl(L"IDF_FORM", true)); + pForm->GetFeatureManager()->Flush(0); + //Reloading feature set + //pForm->GetFeatureManager()->DeleteAllFeatures(); + pForm->GetFeatureManager()->Load(__currentFeaturePath); + } + break; + } + +} + + +void +UpdatePanel::OnSceneActivatedN( + const Tizen::Ui::Scenes::SceneId& previousSceneId, + const Tizen::Ui::Scenes::SceneId& currentSceneId, + Tizen::Base::Collection::IList* pArgs) +{ + + Tizen::Ui::Controls::Frame *pFrame = Tizen::App::Application::GetInstance()->GetAppFrame()->GetFrame(); + MainForm* pForm = static_cast(pFrame->GetControl(L"IDF_FORM", true)); + + if ((previousSceneId == "ChooseImageScene") && pArgs) + { + if (pArgs->GetCount() > 0) + { + __currentImagePath = *(dynamic_cast(pArgs->GetAt(0))); + pForm->AppendImageFolder(__currentImagePath, this); + } + } + else if ((previousSceneId == "ChooseExistingFeatureSetScene") && pArgs) + { + if (pArgs->GetCount() > 0) + { + __currentFeaturePath = *(dynamic_cast(pArgs->GetAt(0))); + if (E_SUCCESS != pForm->GetFeatureManager()->Load(__currentFeaturePath)) + { + __currentFeaturePath = ""; + } + } + } + else if(previousSceneId == "GenerationModeScene") + { + pForm->GetFeatureManager()->Load(__currentFeaturePath); + } + + if(pArgs) + { + pArgs->RemoveAll(true); + delete pArgs; + } + + Button* pButtonPath = null; + pButtonPath = static_cast(GetControl(L"IDC_BUTTON_LOAD_FEATURE_SET", true)); + if (pButtonPath) + { + pButtonPath->SetText(__currentFeaturePath); + } + + pButtonPath = static_cast(GetControl(L"IDC_BUTTON_UPDATE_IMAGE_FOLDER", true)); + if (pButtonPath) + { + if (__currentFeaturePath.IsEmpty()) + { + pButtonPath->SetEnabled(false); + } + else + { + pButtonPath->SetEnabled(true); + } + + pButtonPath->SetText(__currentImagePath); + } + + pButtonPath = static_cast(GetControl(L"IDC_BUTTON_UPDATE_FEATURE_SET", true)); + if (pButtonPath) + { + if (__currentFeaturePath.IsEmpty()) + { + pButtonPath->SetEnabled(false); + } + else + { + pButtonPath->SetEnabled(true); + } + } + + pButtonPath = static_cast(GetControl(L"IDC_BUTTON_DELETE_FEATURES", true)); + if (pButtonPath) + { + if (__currentFeaturePath.IsEmpty()) + { + pButtonPath->SetEnabled(false); + } + else + { + pButtonPath->SetEnabled(true); + } + } +} + +void +UpdatePanel::OnSceneDeactivated(const Tizen::Ui::Scenes::SceneId& currentSceneId, + const Tizen::Ui::Scenes::SceneId& nextSceneId) +{ +} + +void +UpdatePanel::OnImageProcessed(int imNo, int total) +{ + Tizen::Ui::Controls::Frame *pFrame = Tizen::App::Application::GetInstance()->GetAppFrame()->GetFrame(); + MainForm* pForm = static_cast(pFrame->GetControl(L"IDF_FORM", true)); + pForm->OnImageProcessed(imNo, total); +} + + +void +UpdatePanel::OnFinish(void) +{ + Tizen::Ui::Controls::Frame *pFrame = Tizen::App::Application::GetInstance()->GetAppFrame()->GetFrame(); + MainForm* pForm = static_cast(pFrame->GetControl(L"IDF_FORM", true)); + + //pForm->GetFeatureManager()->Flush(null); + //pForm->GetFeatureManager()->Load(__currentFeaturePath); + + __currentImagePath = ""; + Button* pButtonPath = static_cast(GetControl(L"IDC_BUTTON_UPDATE_IMAGE_FOLDER", true)); + if (pButtonPath) + { + pButtonPath->SetText(__currentImagePath); + } + + pForm->OnFinish(); +} diff --git a/sample.xml b/sample.xml new file mode 100644 index 0000000..f63ffae --- /dev/null +++ b/sample.xml @@ -0,0 +1,34 @@ + + diff --git a/screenshot.png b/screenshot.png new file mode 100755 index 0000000000000000000000000000000000000000..f877e32ba4dcf4f24e26acd8c69e6146c8979ba4 GIT binary patch literal 9798 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 literal 0 HcmV?d00001 -- 2.7.4