From 41c073b2e61e8c0562cbdf25bdad8a3133275f81 Mon Sep 17 00:00:00 2001 From: Lauro Moura Date: Thu, 23 Nov 2017 22:01:25 -0300 Subject: [PATCH] efl_mono: Add examples code. Buildsystem support will be enabled in a future commit --- src/Makefile.am | 1 + .../ecore/efl_loop_callback_add_event.cs | 43 ++++++ src/examples/ecore/efl_loop_timer_example.cs | 52 ++++++++ src/examples/efl_mono/.gitignore | 1 + src/examples/efl_mono/EoInherit01.cs | 64 +++++++++ src/examples/efl_mono/FunctionPointer01.cs | 45 +++++++ src/examples/efl_mono/Makefile.am | 123 +++++++++++++++++ src/examples/efl_mono/example_numberwrapper.c | 87 ++++++++++++ .../efl_mono/example_numberwrapper.eo | 30 +++++ src/examples/eina/EinaArray01.cs | 41 ++++++ src/examples/eina/EinaBinbuf01.cs | 65 +++++++++ src/examples/eina/EinaError01.cs | 75 +++++++++++ src/examples/eina/EinaHash01.cs | 66 +++++++++ src/examples/elementary/efl_ui_slider_mono.cs | 63 +++++++++ src/examples/evas/evas_mono_box.cs | 73 ++++++++++ src/examples/evas/evas_mono_image.cs | 93 +++++++++++++ src/examples/evas/evas_mono_image2.cs | 83 ++++++++++++ src/examples/evas/evas_mono_rectangle.cs | 47 +++++++ src/examples/evas/evas_mono_table.cs | 77 +++++++++++ src/examples/evas/evas_mono_text.cs | 126 ++++++++++++++++++ 20 files changed, 1255 insertions(+) create mode 100644 src/examples/ecore/efl_loop_callback_add_event.cs create mode 100644 src/examples/ecore/efl_loop_timer_example.cs create mode 100644 src/examples/efl_mono/.gitignore create mode 100644 src/examples/efl_mono/EoInherit01.cs create mode 100644 src/examples/efl_mono/FunctionPointer01.cs create mode 100644 src/examples/efl_mono/Makefile.am create mode 100644 src/examples/efl_mono/example_numberwrapper.c create mode 100644 src/examples/efl_mono/example_numberwrapper.eo create mode 100644 src/examples/eina/EinaArray01.cs create mode 100644 src/examples/eina/EinaBinbuf01.cs create mode 100644 src/examples/eina/EinaError01.cs create mode 100644 src/examples/eina/EinaHash01.cs create mode 100644 src/examples/elementary/efl_ui_slider_mono.cs create mode 100644 src/examples/evas/evas_mono_box.cs create mode 100644 src/examples/evas/evas_mono_image.cs create mode 100644 src/examples/evas/evas_mono_image2.cs create mode 100644 src/examples/evas/evas_mono_rectangle.cs create mode 100644 src/examples/evas/evas_mono_table.cs create mode 100644 src/examples/evas/evas_mono_text.cs diff --git a/src/Makefile.am b/src/Makefile.am index 2651fd89ab..74ec6cdb2b 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -125,6 +125,7 @@ examples/emotion \ examples/emile \ examples/elocation \ examples/ethumb_client \ +examples/efl_mono \ examples/elementary if HAVE_ELUA diff --git a/src/examples/ecore/efl_loop_callback_add_event.cs b/src/examples/ecore/efl_loop_callback_add_event.cs new file mode 100644 index 0000000000..fe81bfd9ad --- /dev/null +++ b/src/examples/ecore/efl_loop_callback_add_event.cs @@ -0,0 +1,43 @@ +using System; +using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; + +class TestMain +{ + /* private efl.Loop loop; */ + + public TestMain(efl.Loop loop) + { + /* this.loop = loop; */ + } + + static void Main(string[] args) + { + efl.All.Init(); + + efl.Loop loop = new efl.LoopConcrete(); + + TestMain listener = new TestMain(loop); + + loop.CALLBACK_ADD += listener.callback_added_cb; + + loop.CALLBACK_ADD += listener.on_idle_enter; + loop.CALLBACK_ADD -= listener.on_idle_enter; + + loop.IDLE += listener.on_idle_enter; // Will trigger CALLBACK_ADD + + efl.All.Shutdown(); + } + + public void on_idle_enter(object sender, EventArgs e) + { + Console.WriteLine("I should not be called while the loop is not running..."); + } + + public void callback_added_cb(object sender, EventArgs e) + { + Console.WriteLine("Looks like we added a new callback."); + } +} + + diff --git a/src/examples/ecore/efl_loop_timer_example.cs b/src/examples/ecore/efl_loop_timer_example.cs new file mode 100644 index 0000000000..dd6b2b8606 --- /dev/null +++ b/src/examples/ecore/efl_loop_timer_example.cs @@ -0,0 +1,52 @@ +using System; +using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; + +class TestMain +{ + private efl.Loop loop; + private int count; + + public TestMain(efl.Loop loop) + { + this.loop = loop; + this.count = 0; + } + + static void Main(string[] args) + { + efl.All.Init(); + + efl.Loop loop = new efl.LoopConcrete(); + efl.loop.Timer timer = new efl.loop.TimerConcrete(loop); + + TestMain listener = new TestMain(loop); + + Console.WriteLine("Starting MainLoop"); + + timer.interval_set(1.0); + + timer.TICK += listener.on_tick; + timer.TICK += listener.another_callback; + timer.TICK -= listener.another_callback; + + loop.begin(); + + efl.All.Shutdown(); + } + + public void on_tick(object sender, EventArgs e) + { + Console.WriteLine("on_tick called on listener"); + + if (count++ == 5) + loop.quit(0); + } + + public void another_callback(object sender, EventArgs e) + { + Console.WriteLine("Ooops. Should not have been called..."); + } +} + + diff --git a/src/examples/efl_mono/.gitignore b/src/examples/efl_mono/.gitignore new file mode 100644 index 0000000000..7a426d39c3 --- /dev/null +++ b/src/examples/efl_mono/.gitignore @@ -0,0 +1 @@ +/example_numberwrapper.out diff --git a/src/examples/efl_mono/EoInherit01.cs b/src/examples/efl_mono/EoInherit01.cs new file mode 100644 index 0000000000..6b899aeca1 --- /dev/null +++ b/src/examples/efl_mono/EoInherit01.cs @@ -0,0 +1,64 @@ +using static System.Console; + +class PlusTenNumberWrapper : example.NumberwrapperInherit +{ + public PlusTenNumberWrapper(efl.Object parent = null) + : base(parent) + {} + + public bool derivedCalled = false; + + override public void SetNumber(int n) + { + // Call native EFL method + base.SetNumber(n + 10); + derivedCalled = true; + } +} + +public class ExampleEoInherit01 +{ + public static void Main() + { + eina.Config.Init(); + efl.eo.Config.Init(); + + var inheritObj = new PlusTenNumberWrapper(); + + WriteLine("## Using inherit object ##\n"); + + int given = 111; + + // Call the C# override from the C method + example.NumberwrapperConcrete.example_numberwrapper_number_set(inheritObj.raw_handle, given); + + WriteLine($"Override successfully called? {inheritObj.derivedCalled}!\n"); + + // Call C function from C# object + int stored = inheritObj.GetNumber(); + + WriteLine($"Given value: {given}"); + WriteLine($"Stored value: {stored}\n"); + + // Call C# override directly + given = 333; + inheritObj.SetNumber(given); + + stored = inheritObj.GetNumber(); + + WriteLine($"Given value: {given}"); + WriteLine($"Stored value: {stored}\n"); + + WriteLine("## Using original object ##\n"); + + // Check original EFL object + var origObj = new example.NumberwrapperConcrete(); + given = 111; + origObj.SetNumber(given); + stored = origObj.GetNumber(); + + WriteLine($"Given value: {given}"); + WriteLine($"Stored value: {stored}\n"); + } +} + diff --git a/src/examples/efl_mono/FunctionPointer01.cs b/src/examples/efl_mono/FunctionPointer01.cs new file mode 100644 index 0000000000..2954473a27 --- /dev/null +++ b/src/examples/efl_mono/FunctionPointer01.cs @@ -0,0 +1,45 @@ +using static System.Console; + +public class ExampleFunctionPointer01 +{ + private static bool static_called = false; + + private static int twiceCb(int n) + { + static_called = true; + return n * 2; + } + + public static void Main() + { + eina.Config.Init(); + efl.eo.Config.Init(); + + var obj = new example.NumberwrapperConcrete(); + + // Set internal value + obj.SetNumber(12); + + // With static method + obj.SetNumberCallback(twiceCb); + + var ret = obj.CallCallback(); + + WriteLine($"Callback called? {static_called}."); + WriteLine($"Returned value: {ret}.\n"); + + // With lambda + bool lamda_called = false; + + obj.SetNumberCallback(n => { + lamda_called = true; + return n * 3; + }); + + ret = obj.CallCallback(); + + WriteLine($"Lambda called? {lamda_called}."); + WriteLine($"Returned value: {ret}.\n"); + } +} + diff --git a/src/examples/efl_mono/Makefile.am b/src/examples/efl_mono/Makefile.am new file mode 100644 index 0000000000..6bae1d9ee2 --- /dev/null +++ b/src/examples/efl_mono/Makefile.am @@ -0,0 +1,123 @@ +MAINTAINERCLEANFILES = Makefile.in + +if HAVE_CSHARP + +include $(top_srcdir)/src/Makefile_Eolian_Helper.am +include $(top_srcdir)/src/Makefile_Eolian_Mono_Helper.am +include $(top_srcdir)/src/Makefile_Efl_Mono_MSBuild_Gen_Helper.am + +SRCS = +EXTRA_FILES = +EXTRA_PROGRAMS = +GENERATED = +CLEANFILES = + +# Simple object used by the examples + +EOLIAN_FLAGS := $(EOLIAN_FLAGS) +EOLIAN_FLAGS += \ +-I$(srcdir) \ +-I$(top_srcdir)/src/lib/eo \ +-I$(top_srcdir)/src/lib/efl + +COMMON_FLAGS = \ +@EINA_CFLAGS@ @EINA_LDFLAGS@ \ +-L$(top_builddir)/src/lib/eina/.libs -leina \ +@EO_CFLAGS@ @EO_LDFLAGS@ \ +-L$(top_builddir)/src/lib/eo/.libs -leo \ +@EFL_CFLAGS@ @EFL_LDFLAGS@ \ +-L$(top_builddir)/src/lib/efl/.libs -lefl + +if HAVE_WIN32 +COMMON_FLAGS += \ +@EVIL_CFLAGS@ @EVIL_LDFLAGS@ \ +@EFL_WINDOWS_VERSION_CFLAGS@ \ +-L$(top_builddir)/src/lib/evil/.libs -levil +else +COMMON_FLAGS += \ +-fPIC -DPIC +endif + + +%.eo.c: %.eo + $(AM_V_EOL)$(EOLIAN_GEN) $(EOLIAN_FLAGS) -gc -o c:$@ $< + +%.eo.h: %.eo + $(AM_V_EOL)$(EOLIAN_GEN) $(EOLIAN_FLAGS) -gh -o h:$@ $< + +example_numberwrapper.c: example_numberwrapper.eo.h example_numberwrapper.eo.c + +numberwrapper_lib_name = example_numberwrapper.out + +$(numberwrapper_lib_name): example_numberwrapper.c + $(CC) -shared -o $@ $< -DEFL_BETA_API_SUPPORT -I. $(COMMON_FLAGS) + +SRCS += example_numberwrapper.c +EXTRA_FILES += example_numberwrapper.eo +GENERATED += example_numberwrapper.eo.h example_numberwrapper.eo.c $(numberwrapper_lib_name) + +# CSharp examples + +SRCS += \ +EoInherit01.cs \ +FunctionPointer01.cs + +EXTRA_PROGRAMS += \ +EoInherit01.exe \ +FunctionPointer01.exe + +example_numberwrapper.eo.cs: example_numberwrapper.eo + $(AM_V_EOLMONO) \ + $(EOLIAN_MONO) $(EOLIAN_FLAGS) $(EOLIAN_MONO_FLAGS) --dllimport $(numberwrapper_lib_name) -o $@ -r $(top_builddir)/src/bindings/mono/efl_mono/efl_libs.csv $< + +EoInherit01_exe_SOURCES = EoInherit01.cs +EoInherit01_srcs = $(EoInherit01_exe_SOURCES) example_numberwrapper.eo.cs +EoInherit01.exe$(EXEEXT): $(EoInherit01_srcs) $(am_dirstamp) $(top_builddir)/src/lib/efl_mono/libefl_mono.dll$(EXEEXT) $(numberwrapper_lib_name) + @rm -f $@ + $(AM_V_MCS) $(MCS) $(MCS_FLAGS) -r:$(abs_top_builddir)/src/lib/efl_mono/libefl_mono.dll$(EXEEXT) -out:$@ $(filter %.cs, $(^)) + +$(abs_top_builddir)/EoInherit01.csproj: $(EoInherit01_srcs) $(am_dirstamp) $(numberwrapper_lib_name) + @rm -f $@ + $(EFL_MONO_MSBUILD_GEN) $(MSBUILD_GEN_FLAGS) -o $@ -a EoInherit01.exe -r libefl_mono.dll -t exe $(patsubst %.cs,src/examples/efl_mono/%.cs,$(filter %.cs, $(^))) + + +FunctionPointer01_exe_SOURCES = FunctionPointer01.cs +FunctionPointer01_srcs = $(FunctionPointer01_exe_SOURCES) example_numberwrapper.eo.cs +FunctionPointer01.exe$(EXEEXT): $(FunctionPointer01_srcs) $(am_dirstamp) $(top_builddir)/src/lib/efl_mono/libefl_mono.dll$(EXEEXT) $(numberwrapper_lib_name) + @rm -f $@ + $(AM_V_MCS) $(MCS) $(MCS_FLAGS) -r:$(abs_top_builddir)/src/lib/efl_mono/libefl_mono.dll$(EXEEXT) -out:$@ $(filter %.cs, $(^)) + +$(abs_top_builddir)/FunctionPointer01.csproj: $(FunctionPointer01_srcs) $(am_dirstamp) $(numberwrapper_lib_name) + @rm -f $@ + $(EFL_MONO_MSBUILD_GEN) $(MSBUILD_GEN_FLAGS) -o $@ -a FunctionPointer01.exe -r libefl_mono.dll -t exe $(patsubst %.cs,src/examples/efl_mono/%.cs,$(filter %.cs, $(^))) + +msbuildcsprojs: $(abs_top_builddir)/EoInherit01.csproj $(abs_top_builddir)/FunctionPointer01.csproj + +GENERATED += example_numberwrapper.eo.cs + + +# Finishing + +EXTRA_DIST = $(EXTRA_FILES) + +CLEANFILES += $(GENERATED) + +examples: $(EXTRA_PROGRAMS) + +clean-local: + rm -f $(EXTRA_PROGRAMS) $(GENERATED) + +install-examples: + $(MKDIR_P) $(DESTDIR)$(datadir)/efl_mono/examples + cd $(srcdir) && $(install_sh_DATA) -c $(SRCS) $(EXTRA_FILES) $(DESTDIR)$(datadir)/efl_mono/examples + +uninstall-local: + for f in $(SRCS) $(EXTRA_FILES); do \ + rm -f $(DESTDIR)$(datadir)/efl_mono/examples/$$f ; \ + done + +if ALWAYS_BUILD_EXAMPLES +noinst_PROGRAMS = $(EXTRA_PROGRAMS) +endif + +endif diff --git a/src/examples/efl_mono/example_numberwrapper.c b/src/examples/efl_mono/example_numberwrapper.c new file mode 100644 index 0000000000..f80dee616a --- /dev/null +++ b/src/examples/efl_mono/example_numberwrapper.c @@ -0,0 +1,87 @@ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include + +#undef EOAPI +#undef EAPI +#define EOAPI EAPI EAPI_WEAK + +#ifdef _WIN32 +# ifdef EFL_EO_BUILD +# ifdef DLL_EXPORT +# define EAPI __declspec(dllexport) +# else +# define EAPI +# endif /* ! DLL_EXPORT */ +# else +# define EAPI __declspec(dllimport) +# endif /* ! EFL_EO_BUILD */ +#else +# ifdef __GNUC__ +# if __GNUC__ >= 4 +# define EAPI __attribute__ ((visibility("default"))) +# else +# define EAPI +# endif +# else +# define EAPI +# endif +#endif /* ! _WIN32 */ + +#include "example_numberwrapper.eo.h" + + +typedef struct Example_Numberwrapper_Data +{ + int number; + NumberCb cb; + void *cb_data; + Eina_Free_Cb free_cb; +} Example_Numberwrapper_Data; + +// ##################### // +// Example.Numberwrapper // +// ##################### // + + +void _example_numberwrapper_number_set(EINA_UNUSED Eo *obj, Example_Numberwrapper_Data *pd, int n) +{ + pd->number = n; +} + +int _example_numberwrapper_number_get(EINA_UNUSED Eo *obj, Example_Numberwrapper_Data *pd) +{ + return pd->number; +} + + +void _example_numberwrapper_number_callback_set(EINA_UNUSED Eo *obj, Example_Numberwrapper_Data *pd, void *cb_data, NumberCb cb, Eina_Free_Cb cb_free_cb) +{ + if (pd->free_cb) + pd->free_cb(pd->cb_data); + + pd->cb = cb; + pd->cb_data = cb_data; + pd->free_cb = cb_free_cb; +} + + +int _example_numberwrapper_callback_call(EINA_UNUSED Eo *obj, Example_Numberwrapper_Data *pd) +{ + if (!pd->cb) + { + static Eina_Error no_cb_err = 0; + if (!no_cb_err) + no_cb_err = eina_error_msg_static_register("Trying to call with no callback set"); + eina_error_set(no_cb_err); + return -1; + } + + return pd->cb(pd->cb_data, pd->number); +} + +#include "example_numberwrapper.eo.c" + diff --git a/src/examples/efl_mono/example_numberwrapper.eo b/src/examples/efl_mono/example_numberwrapper.eo new file mode 100644 index 0000000000..85f2ce4a4d --- /dev/null +++ b/src/examples/efl_mono/example_numberwrapper.eo @@ -0,0 +1,30 @@ +function NumberCb { + params { + n: int; + } + return: int; +}; + +class Example.Numberwrapper (Efl.Object) { + methods { + @property number { + get { + } + set { + } + values { + n: int; + } + } + + number_callback_set { + params { + cb: NumberCb; + } + } + + callback_call { + return: int; + } + } +} diff --git a/src/examples/eina/EinaArray01.cs b/src/examples/eina/EinaArray01.cs new file mode 100644 index 0000000000..4ac4a77812 --- /dev/null +++ b/src/examples/eina/EinaArray01.cs @@ -0,0 +1,41 @@ +using static System.Console; + +public class ExampleEinaArray01 +{ + public static void Main() + { + eina.Config.Init(); + + var strings = new string[]{ + "helo", "hera", "starbuck", "kat", "boomer", + "hotdog", "longshot", "jammer", "crashdown", "hardball", + "duck", "racetrack", "apolo", "husker", "freaker", + "skulls", "bulldog", "flat top", "hammerhead", "gonzo" + }; + + var array = new eina.Array(20U); + + // Push new elements + foreach (string s in strings) + { + WriteLine("push: " + s); + array.Push(s); + } + + // Check count + WriteLine("array count: " + array.Count()); + + // Iterate over the array + int idx = 0; + foreach (string s in array) + { + WriteLine($"at[{idx}]: {s}"); + ++idx; + } + + // Remove one by one + while (array.Length != 0) + WriteLine("pop: " + array.Pop()); + } +} + diff --git a/src/examples/eina/EinaBinbuf01.cs b/src/examples/eina/EinaBinbuf01.cs new file mode 100644 index 0000000000..395616879d --- /dev/null +++ b/src/examples/eina/EinaBinbuf01.cs @@ -0,0 +1,65 @@ +using static System.Console; + +public class ExampleEinaBinbuf01 +{ + public static void Main() + { + eina.Config.Init(); + + var bytes = new byte[]{0, 1, 2, 3, 4, 5, 6}; + + var bb = new eina.Binbuf(); + + // Append initial bytes + bb.Append(bytes); + + WriteLine("Printing each byte."); + + int idx = 0; + foreach (byte b in bb.GetBytes()) + { + WriteLine($"byte at[{idx}]: {b}"); + ++idx; + } + + // Append more byte by byte + bb.Append((byte) 7); + bb.Append((byte) 8); + bb.Append((byte) 9); + bb.Append((byte) 0); + + WriteLine("\nPrinting each byte."); + + idx = 0; + foreach (byte b in bb.GetBytes()) + { + WriteLine($"byte at[{idx}]: {b}"); + ++idx; + } + + // Remove some + bb.Remove(2, 5); + + WriteLine("\nPrinting each byte."); + + idx = 0; + foreach (byte b in bb.GetBytes()) + { + WriteLine($"byte at[{idx}]: {b}"); + ++idx; + } + + // Insert new bytes in the middle + bb.Insert(new byte[]{22, 33, 44}, 2); + + WriteLine("\nPrinting each byte."); + + idx = 0; + foreach (byte b in bb.GetBytes()) + { + WriteLine($"byte at[{idx}]: {b}"); + ++idx; + } + } +} + diff --git a/src/examples/eina/EinaError01.cs b/src/examples/eina/EinaError01.cs new file mode 100644 index 0000000000..61af99508b --- /dev/null +++ b/src/examples/eina/EinaError01.cs @@ -0,0 +1,75 @@ +using static System.Console; + +public class ExampleEinaError01 +{ + private static bool RegisteredErrors = false; + private static eina.Error MyErrorNegative; + private static eina.Error MyErrorNull; + + private static void testFunc(int n, string s) + { + if (!RegisteredErrors) + { + MyErrorNegative = eina.Error.Register("Negative number"); + MyErrorNull = eina.Error.Register("NULL pointer"); + RegisteredErrors = true; + } + + if (n < 0) + { + eina.Error.Set(MyErrorNegative); + return; + } + + if (s == null) + { + eina.Error.Set(MyErrorNull); + return; + } + } + + public static void Main() + { + eina.Config.Init(); + efl.eo.Config.Init(); + + // Handling Eina_Error with exception + try + { + testFunc(-1, "abc"); + eina.Error.RaiseIfOccurred(); + } + catch(efl.EflException e) + { + WriteLine($"Caught error: {e.Message}"); + } + + // Handling Eina_Error directly + testFunc(42, null); + eina.Error err = eina.Error.Get(); + if (err != 0) + { + WriteLine($"Error set: {err.Message}"); + } + eina.Error.Clear(); + + // No error set + try + { + testFunc(42, "abc"); + + eina.Error.RaiseIfOccurred(); + + err = eina.Error.Get(); + WriteLine($"Really no error? {err == eina.Error.NO_ERROR}."); + } + catch + { + WriteLine("Unspected error!!!"); + } + + WriteLine("No error message is empty string: \"{0}\"", eina.Error.NO_ERROR.Message); + WriteLine("No error message is empty string: \"{0}\"", eina.Error.MsgGet(0)); + } +} + diff --git a/src/examples/eina/EinaHash01.cs b/src/examples/eina/EinaHash01.cs new file mode 100644 index 0000000000..a645dde1ab --- /dev/null +++ b/src/examples/eina/EinaHash01.cs @@ -0,0 +1,66 @@ +using static System.Console; + +public class ExampleEinaHash01 +{ + public static void Main() + { + eina.Config.Init(); + + var phone_book = new eina.Hash(); + + // Add initial entries to our hash + phone_book.Add("Wolfgang Amadeus Mozart", "+01 23 456-78910"); + phone_book.Add("Ludwig van Beethoven", "+12 34 567-89101"); + phone_book.Add("Richard Georg Strauss", "+23 45 678-91012"); + phone_book.Add("Heitor Villa-Lobos", "+34 56 789-10123"); + + // Look for a specific entry and get its phone number + var entry_name = "Heitor Villa-Lobos"; + var phone = phone_book.Find(entry_name); + + WriteLine("Printing entry."); + WriteLine($"Name: {entry_name}"); + WriteLine($"Number: {phone}\n"); + + // Delete this entry + var r = phone_book.DelByKey(entry_name); + WriteLine($"Hash entry successfully deleted? {r}!\n"); + + // Modify the pointer data of an entry and free the old one + phone_book.Modify("Richard Georg Strauss", "+23 45 111-11111"); + + // Modify or add an entry to the hash + // Let's first add a new entry + entry_name = "Raul Seixas"; + phone_book[entry_name] = "+55 01 234-56789"; + WriteLine("Printing entry."); + WriteLine($"Name: {entry_name}"); + WriteLine($"Number: {phone_book[entry_name]}\n"); + + // Now change the phone number + phone_book["Raul Seixas"] = "+55 02 222-22222"; + WriteLine("Printing entry."); + WriteLine($"Name: {entry_name}"); + WriteLine($"Number: {phone_book[entry_name]}\n"); + + // Check how many items are in the phone book + WriteLine("There are {0} items in the hash.\n", phone_book.Count); + + // Change the name (key) on an entry + phone_book.Move("Raul Seixas", "Alceu Valenca"); + entry_name = "Alceu Valenca"; + WriteLine("Printing entry."); + WriteLine($"Name: {entry_name}"); + WriteLine($"Number: {phone_book[entry_name]}\n"); + + // Empty the phone book, but don't destroy it + phone_book.FreeBuckets(); + WriteLine("There are {0} items in the hash.\n", phone_book.Count); + + // Phone book could still be used, but we are freeing it since we are + // done for now + phone_book.Dispose(); + } +} + + diff --git a/src/examples/elementary/efl_ui_slider_mono.cs b/src/examples/elementary/efl_ui_slider_mono.cs new file mode 100644 index 0000000000..a5aff11547 --- /dev/null +++ b/src/examples/elementary/efl_ui_slider_mono.cs @@ -0,0 +1,63 @@ +using System; + +public class Example +{ + public static efl.ui.Button CreateButton(efl.Object parent, + string text, + int w, int h, + EventHandler callback) { + efl.ui.Button button = new efl.ui.ButtonConcrete(parent); + button.SetText(text); + button.SetSize(w, h); + + button.CLICKED += callback; + + return button; + } + +#if WIN32 // Passed to the C# compiler with -define:WIN32 + // Mono on Windows by default uses multi-thread apartments for COM stuff while + // OLE - used by ecore win32 DnD requires single threading for COM. + [STAThreadAttribute()] +#endif + public static void Main() { + efl.All.Init(efl.Components.Ui); + + efl.ui.Win win = new efl.ui.WinConcrete(null); + win.SetText("Hello, C#!!"); + win.SetAutohide(true); + + efl.ui.Box_Flow box = new efl.ui.Box_FlowConcrete(win); + + efl.ui.Button button = CreateButton(box, "Click to exit", 120, 30, + (object sender, EventArgs e) => { + efl.ui.Config.Exit(); + }); + + box.Pack(button); + + efl.ui.Progressbar bar = new efl.ui.ProgressbarConcrete(box); + bar.SetSize(120, 30); + + efl.ui.Slider slider = new efl.ui.SliderConcrete(box); + slider.SetSize(120, 30); + + slider.CHANGED += (object sender, EventArgs e) => { + bar.SetRangeValue(slider.GetRangeValue()); + }; + + box.Pack(bar); + box.Pack(slider); + + button.SetVisible(true); + box.SetVisible(true); + + win.SetSize(120, 90); + win.SetVisible(true); + + efl.ui.Config.Run(); + + efl.All.Shutdown(); + } + +} diff --git a/src/examples/evas/evas_mono_box.cs b/src/examples/evas/evas_mono_box.cs new file mode 100644 index 0000000000..cdc4b8b150 --- /dev/null +++ b/src/examples/evas/evas_mono_box.cs @@ -0,0 +1,73 @@ +using System; +using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; + +public class MyBox : evas.BoxInherit +{ + public MyBox(efl.Object parent) : base(parent) {} + + [DllImport("evas")] static extern void evas_obj_box_layout_vertical(IntPtr obj, IntPtr data, IntPtr privdata); + [DllImport("evas")] static extern void evas_obj_box_layout_horizontal(IntPtr obj, IntPtr data, IntPtr privdata); + [DllImport("evas")] static extern void evas_object_box_layout_horizontal(IntPtr obj, IntPtr data, IntPtr privdata); + [DllImport("evas")] static extern IntPtr evas_object_evas_get(IntPtr obj); + [DllImport("evas")] static extern void evas_event_freeze(IntPtr obj); + [DllImport("evas")] static extern void evas_event_thaw(IntPtr obj); + + override public void CalculateGroup() + { + IntPtr evas = evas_object_evas_get(raw_handle); + evas_event_freeze(evas); + Console.WriteLine("called group_calculate"); + /* layouting_set(true); */ + evas_obj_box_layout_vertical(raw_handle, IntPtr.Zero, IntPtr.Zero); + /* layouting_set(false); */ + /* children_changed_set(false); */ + evas_event_thaw(evas); + } +} + +class TestMain +{ + static void Main(string[] args) + { + efl.All.Init(); + + efl.Loop loop = new efl.LoopConcrete(); + + + EcoreEvas ecore_evas = new EcoreEvas(); + + efl.canvas.Object canvas = ecore_evas.canvas; + canvas.SetVisible(true); + + efl.Object parent = canvas.GetParent(); + System.Diagnostics.Debug.Assert(parent.raw_handle != IntPtr.Zero); + + evas.Box box = new MyBox(canvas); + eina.Size2D size = new eina.Size2D(); + + size.W = 320; + size.H = 240; + + box.SetSize(size); + box.SetVisible(true); + + efl.canvas.Rectangle rect = new efl.canvas.RectangleConcrete(canvas); + rect.SetColor(0, 0, 255, 255); + size.W = 320; + size.H = 120; + rect.SetSize(size); + rect.SetVisible(true); + box.Append(rect); + + efl.canvas.Rectangle rect2 = new efl.canvas.RectangleConcrete(canvas); + rect2.SetColor(0, 255, 0, 255); + rect2.SetSize(size); + rect2.SetVisible(true); + box.Append(rect2); + + loop.Begin(); + + efl.All.Shutdown(); + } +} diff --git a/src/examples/evas/evas_mono_image.cs b/src/examples/evas/evas_mono_image.cs new file mode 100644 index 0000000000..ff84db5d9a --- /dev/null +++ b/src/examples/evas/evas_mono_image.cs @@ -0,0 +1,93 @@ +using System; +using System.Runtime.CompilerServices; + +class TestMain +{ + static int WIDTH = 320; + static int HEIGHT = 240; + + evas.Image image; + + + static string ImagePath([CallerFilePath] string folder="") + { + return System.IO.Path.GetDirectoryName(folder); + } + + public TestMain(evas.Image image) + { + this.image = image; + } + + static void Main(string[] args) + { + efl.All.Init(); + + efl.Loop loop = new efl.LoopConcrete(); + + EcoreEvas ecore_evas = new EcoreEvas(); + eina.Size2D size = new eina.Size2D(); + + efl.canvas.Object canvas = ecore_evas.canvas; + canvas.SetVisible(true); + + efl.Object parent = canvas.GetParent(); + System.Diagnostics.Debug.Assert(parent.raw_handle != IntPtr.Zero); + + efl.canvas.Rectangle bg = new efl.canvas.RectangleConcrete(canvas); + bg.SetColor(255, 255, 255, 255); + size.W = WIDTH; + size.H = HEIGHT; + bg.SetSize(size); + bg.SetVisible(true); + + string valid_path = args[0]; + evas.Image image = new evas.ImageConcrete(canvas); + image.SetFile(valid_path, null); + + /* FIXME evas-image uses error handling code from + * evas_object_image_load_error_get, which seems to be not available + * efl.image.load.State state = image.load_error_get(); */ + + // FIXME missing move + eina.Rect rect = new eina.Rect(); + + rect.X = 0; + rect.Y = 0; + rect.W = WIDTH / 2; + rect.H = HEIGHT / 2; + image.SetFill(rect); + + size.W = WIDTH / 2; + size.H = HEIGHT / 2; + image.SetSize(size); + image.SetVisible(true); + + rect = image.GetFill(); + rect.Y -= 50; + rect.W += 100; + image.SetFill(rect); + + TestMain listener = new TestMain(image); + + // TODO handle key events in order to alter the image like the C + // example. Meanwhile, just set some w fill + /* EventListener callback = new EventListener(); */ + + /* bg.key_focus_set(true); */ + /* bg.event_callback_priority_add(evas.Callback_Type.Key_down, */ + /* efl.Callback_Priority.Default, */ + /* callback, null); */ + + loop.Begin(); + + efl.All.Shutdown(); + } + + public void on_key_down(object sender, EventArgs e) + { + Console.WriteLine("on_key_down called"); + } +} + + diff --git a/src/examples/evas/evas_mono_image2.cs b/src/examples/evas/evas_mono_image2.cs new file mode 100644 index 0000000000..e2ae49f092 --- /dev/null +++ b/src/examples/evas/evas_mono_image2.cs @@ -0,0 +1,83 @@ +using System; +using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; + +class TestMain +{ + static int WIDTH = 320; + static int HEIGHT = 240; + + + static void Main(string[] args) + { + efl.All.Init(); + + efl.Loop loop = new efl.LoopConcrete(); + + EcoreEvas ecore_evas = new EcoreEvas(); + + eina.Size2D size = new eina.Size2D(); + eina.Position2D pos = new eina.Position2D(); + + efl.canvas.Object canvas = ecore_evas.canvas; + canvas.SetVisible(true); + + efl.canvas.Rectangle bg = new efl.canvas.RectangleConcrete(canvas); + bg.SetColor(255, 255, 255, 255); + pos.X = 0; + pos.Y = 0; + bg.SetPosition(pos); + size.W = WIDTH; + size.H = HEIGHT; + bg.SetSize(size); + bg.SetVisible(true); + + string path = args[0]; + evas.Image logo = new evas.ImageConcrete(canvas); + logo.SetFillAuto(true); + + // TODO add preloaded support (depends on events) + + logo.SetFile(path, null); + size.W = WIDTH / 2; + size.H = HEIGHT / 2; + logo.SetSize(size); + + // TODO add a bunch of key/mouse handlers + + logo.SetVisible(true); + + int[] pixels = new int[(WIDTH/4) * (HEIGHT / 4)]; + System.Random generator = new System.Random(); + for (int i = 0; i < pixels.Length; i++) { + pixels[i] = generator.Next(); + } + + evas.Image noise_img = new evas.ImageConcrete(canvas); + size.W = WIDTH / 4; + size.H = HEIGHT / 4; + noise_img.SetSize(size); + // FIXME Add a way to set the pixels. + // noise_img.data_set(pixels); + noise_img.SetFillAuto(true); + pos.X = WIDTH * 5 / 8; + pos.Y = HEIGHT / 8; + noise_img.SetPosition(pos); + noise_img.SetVisible(true); + Console.WriteLine("Creating noise image with sizez %d, %d", WIDTH/4, HEIGHT/4); + + efl.canvas.Proxy proxy_img = new efl.canvas.ProxyConcrete(canvas); + proxy_img.SetSource(noise_img); + pos.X = WIDTH / 2; + pos.Y = HEIGHT / 2; + proxy_img.SetPosition(pos); + size.W = WIDTH / 2; + size.H = HEIGHT / 2; + proxy_img.SetSize(size); + proxy_img.SetVisible(true); + + loop.Begin(); + } +} + + diff --git a/src/examples/evas/evas_mono_rectangle.cs b/src/examples/evas/evas_mono_rectangle.cs new file mode 100644 index 0000000000..de686b0609 --- /dev/null +++ b/src/examples/evas/evas_mono_rectangle.cs @@ -0,0 +1,47 @@ +using System; + +class TestMain +{ + private static int[,] colors = new int[,] { + {255, 0, 0}, + {0, 255, 0}, + {0, 0, 255} + }; + + static void Main(string[] args) + { + int color_index = 0; + + efl.All.Init(); + + efl.Loop loop = new efl.LoopConcrete(); + EcoreEvas ecore_evas = new EcoreEvas(); + efl.canvas.Object canvas = ecore_evas.canvas; + canvas.SetVisible(true); + + efl.Object parent = canvas.GetParent(); + System.Diagnostics.Debug.Assert(parent.raw_handle != IntPtr.Zero); + + efl.canvas.Rectangle rect = new efl.canvas.RectangleConcrete(canvas); + rect.SetColor(colors[0, 0], colors[0, 1], colors[0, 2], 255); + eina.Size2D size = new eina.Size2D(); + size.W = 640; + size.H = 480; + rect.SetSize(size); + rect.SetVisible(true); + + canvas.KEY_DOWN += (object sender, efl.input.KEY_DOWN_Args e) => { + color_index = (color_index + 1) % 3; + Console.WriteLine("Key Down"); + Console.WriteLine("Got key obj at {0}", e.arg.raw_handle.ToString("X")); + Console.WriteLine("Got key_get() == [{0}]", e.arg.GetKey()); + rect.SetColor(colors[color_index, 0], + colors[color_index, 1], + colors[color_index, 2], 255); + }; + + loop.Begin(); + + efl.All.Shutdown(); + } +} diff --git a/src/examples/evas/evas_mono_table.cs b/src/examples/evas/evas_mono_table.cs new file mode 100644 index 0000000000..e79ad7c956 --- /dev/null +++ b/src/examples/evas/evas_mono_table.cs @@ -0,0 +1,77 @@ +using System; +using System.Runtime.InteropServices; +using System.Runtime.CompilerServices; + +class TestMain +{ + static int WIDTH = 100; + static int HEIGHT = 150; + + static void Main(string[] args) + { + efl.All.Init(); + + efl.Loop loop = new efl.LoopConcrete(); + + EcoreEvas ecore_evas = new EcoreEvas(); + + eina.Size2D size = new eina.Size2D(); + size.W = WIDTH; + size.H = HEIGHT; + + eina.Size2D hint = new eina.Size2D(); + + efl.canvas.Object canvas = ecore_evas.canvas; + canvas.SetVisible(true); + + efl.Object parent = canvas.GetParent(); + System.Diagnostics.Debug.Assert(parent.raw_handle != IntPtr.Zero); + + efl.canvas.Rectangle bg = new efl.canvas.RectangleConcrete(canvas); + bg.SetColor(255, 255, 255, 255); + bg.SetSize(size); + bg.SetVisible(true); + + + evas.Table table = new evas.TableConcrete(canvas); + table.SetHomogeneous(evas.object_table.Homogeneous_Mode.None); + table.SetPadding(0, 0); + table.SetSize(size); + table.SetVisible(true); + + efl.canvas.Rectangle rect = new efl.canvas.RectangleConcrete(canvas); + rect.SetColor(255, 0, 0, 255); + hint.W = 100; + hint.H = 50; + rect.SetHintMin(hint); + rect.SetVisible(true); + table.Pack(rect, 1, 1, 2, 1); + + rect = new efl.canvas.RectangleConcrete(canvas); + rect.SetColor(0, 255, 0, 255); + hint.W = 50; + hint.H = 100; + rect.SetHintMin(hint); + rect.SetVisible(true); + table.Pack(rect, 1, 2, 1, 2); + + rect = new efl.canvas.RectangleConcrete(canvas); + rect.SetColor(0, 0, 255, 255); + hint.W = 50; + hint.H = 50; + rect.SetHintMin(hint); + rect.SetVisible(true); + table.Pack(rect, 2, 2, 1, 1); + + rect = new efl.canvas.RectangleConcrete(canvas); + rect.SetColor(255, 255, 0, 255); + rect.SetHintMin(hint); + rect.SetVisible(true); + table.Pack(rect, 2, 3, 1, 1); + + loop.Begin(); + + efl.All.Shutdown(); + } +} + diff --git a/src/examples/evas/evas_mono_text.cs b/src/examples/evas/evas_mono_text.cs new file mode 100644 index 0000000000..071cba218b --- /dev/null +++ b/src/examples/evas/evas_mono_text.cs @@ -0,0 +1,126 @@ +using System; +using System.Linq; +using System.Collections.Generic; + +static class Extensions +{ + public static IEnumerable Circle(this IEnumerable list, int index=0) + { + var count = list.Count(); + index = index % count; + + while (true) { + yield return list.ElementAt(index); + index = (index + 1) % count; + } + } +} + +class TestMain +{ + static int WIDTH = 320; + static int HEIGHT = 240; + + private EcoreEvas ecore_evas; + private efl.canvas.Object canvas; + private efl.canvas.Rectangle bg; + private evas.Text text; + private evas.Image border; + + public TestMain(String border_file) { + ecore_evas = new EcoreEvas(); + eina.Size2D size = new eina.Size2D(); + eina.Position2D position = new eina.Position2D(); + canvas = ecore_evas.canvas; + canvas.SetVisible(true); + + bg = new efl.canvas.RectangleConcrete(canvas); + bg.SetColor(255, 255, 255, 255); + position.X = 0; + position.Y = 0; + bg.SetPosition(position); + size.W = WIDTH; + size.H = HEIGHT; + bg.SetSize(size); + bg.SetVisible(true); + bg.SetKeyFocus(true); + + bg.KEY_DOWN += On_KeyDown; + + text = new evas.TextConcrete(canvas); + text.SetStyle(evas.Text_Style_Type.OutlineSoftShadow); + + text.SetColor(0, 0, 0, 255); + text.SetGlowColor(255, 0, 0, 255); + text.SetOutlineColor(0, 0, 255, 255); + text.SetShadowColor(0, 255,255, 255); + text.SetFont("Courier", 30); + + text.SetText("sample text"); + size.W = 3*WIDTH / 4; + size.H = HEIGHT / 4; + text.SetSize(size); + position.X = WIDTH / 8; + position.Y = 3 * HEIGHT / 8; + text.SetPosition(position); + text.SetVisible(true); + + efl.font.Size font_size = 0; + String font = String.Empty; + text.GetFont(out font, out font_size); + Console.WriteLine("Adding text object with font {0} and size {1}", font, size); + + // setup border + border = new evas.ImageConcrete(canvas); + border.SetFile(border_file, null); + border.SetBorder(3, 3, 3, 3); + border.SetBorderCenterFill(0); + + size.W = 3 * WIDTH / 4 + 3; + size.H = HEIGHT / 4 + 3; + border.SetSize(size); + position.X = WIDTH / 8 - 3; + position.Y = 3 * HEIGHT / 8 - 3; + border.SetPosition(position); + border.SetVisible(true); + + + } + + private void On_KeyDown(object sender, efl.input.KEY_DOWN_Args e) + { + var key = e.arg.GetKey(); + + if (key == "h") { + Console.WriteLine(commands); + } else if (key == "t") { + evas.Text_Style_Type type = text.GetStyle(); + type = (evas.Text_Style_Type)(((int)type + 1) % 10); // 10 hardcoded from C example + text.SetStyle(type); + } + } + + static string commands = @"commands are: + t - change text's current style + h - print help"; + + + static void Main(string[] args) + { + efl.All.Init(); + + String border_path = "./src/examples/evas/resources/images/red.png"; + + if (args.Length >= 1) + border_path = args[0]; + + efl.Loop loop = new efl.LoopConcrete(); + TestMain t = new TestMain(border_path); + + loop.Begin(); + + efl.All.Shutdown(); + } +} + +