Hi Peter while I see a strong need for this, I think we should discuss if that is really what we want to do (with our limited resources). I miss one reply from legal, then I have a full proposal where we can use Qt without anybody can point fingers at us.
rgds jan i. ---------- Forwarded message ---------- From: <pmke...@apache.org> Date: 29 July 2015 at 12:44 Subject: incubator-corinthia git commit: Initial start on an Apache-licensed UI toolkit To: comm...@corinthia.incubator.apache.org Repository: incubator-corinthia Updated Branches: refs/heads/master 6677e0032 -> 40310dcb8 Initial start on an Apache-licensed UI toolkit Project: http://git-wip-us.apache.org/repos/asf/incubator-corinthia/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-corinthia/commit/40310dcb Tree: http://git-wip-us.apache.org/repos/asf/incubator-corinthia/tree/40310dcb Diff: http://git-wip-us.apache.org/repos/asf/incubator-corinthia/diff/40310dcb Branch: refs/heads/master Commit: 40310dcb8fb8d64f8e9acce06b6c96734c304163 Parents: 6677e00 Author: Peter Kelly <pe...@uxproductivity.com> Authored: Wed Jul 29 17:43:20 2015 +0700 Committer: Peter Kelly <pe...@uxproductivity.com> Committed: Wed Jul 29 17:44:11 2015 +0700 ---------------------------------------------------------------------- ui/src/AColor.h | 28 ++++++++++ ui/src/AEvent.h | 27 ++++++++++ ui/src/APoint.h | 26 +++++++++ ui/src/ARect.h | 31 +++++++++++ ui/src/AShared.cpp | 48 +++++++++++++++++ ui/src/AShared.h | 137 ++++++++++++++++++++++++++++++++++++++++++++++++ ui/src/ASize.h | 26 +++++++++ ui/src/AString.cpp | 81 ++++++++++++++++++++++++++++ ui/src/AString.h | 52 ++++++++++++++++++ ui/src/AView.h | 60 +++++++++++++++++++++ ui/src/uitest.cpp | 75 ++++++++++++++++++++++++++ 11 files changed, 591 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/40310dcb/ui/src/AColor.h ---------------------------------------------------------------------- diff --git a/ui/src/AColor.h b/ui/src/AColor.h new file mode 100644 index 0000000..eb0d9d4 --- /dev/null +++ b/ui/src/AColor.h @@ -0,0 +1,28 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#pragma once + +struct AColor +{ + AColor() : red(0.0), green(0.0), blue(0.0) { } + AColor(double _red, double _green, double _blue) : + red(_red), green(_green), blue(_blue) { } + double red; + double green; + double blue; +}; http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/40310dcb/ui/src/AEvent.h ---------------------------------------------------------------------- diff --git a/ui/src/AEvent.h b/ui/src/AEvent.h new file mode 100644 index 0000000..e4744a0 --- /dev/null +++ b/ui/src/AEvent.h @@ -0,0 +1,27 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#pragma once + +#include "AShared.h" + +class AEvent : public AShared +{ +public: + AEvent() { } + virtual ~AEvent() { } +}; http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/40310dcb/ui/src/APoint.h ---------------------------------------------------------------------- diff --git a/ui/src/APoint.h b/ui/src/APoint.h new file mode 100644 index 0000000..6956166 --- /dev/null +++ b/ui/src/APoint.h @@ -0,0 +1,26 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#pragma once + +struct APoint +{ + APoint() : x(0), y(0) { } + APoint(double _x, double _y) : x(_x), y(_y) { } + double x; + double y; +}; http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/40310dcb/ui/src/ARect.h ---------------------------------------------------------------------- diff --git a/ui/src/ARect.h b/ui/src/ARect.h new file mode 100644 index 0000000..239db42 --- /dev/null +++ b/ui/src/ARect.h @@ -0,0 +1,31 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#pragma once + +#include "APoint.h" +#include "ASize.h" + +struct ARect +{ + ARect() { } + ARect(const APoint &o, const ASize &s) : origin(o), size(s) { } + ARect(double x, double y, double width, double height) + : origin(APoint(x,y)), size(ASize(width,height)) { } + APoint origin; + ASize size; +}; http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/40310dcb/ui/src/AShared.cpp ---------------------------------------------------------------------- diff --git a/ui/src/AShared.cpp b/ui/src/AShared.cpp new file mode 100644 index 0000000..1886916 --- /dev/null +++ b/ui/src/AShared.cpp @@ -0,0 +1,48 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#include "AShared.h" +#include <assert.h> +#include <stdio.h> + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// AShared // +// // +//////////////////////////////////////////////////////////////////////////////////////////////////// + +void AShared::ref() +{ + _refCount++; + printf("%p ref(): now _refCount = %d\n",this,_refCount); +} + +void AShared::deref() +{ + _refCount--; + printf("%p deref(): now _refCount = %d\n",this,_refCount); + if (_refCount == 0) + delete this; +} + +void AShared::addWeakRef(AWeakRefData *wref) +{ +} + +void AShared::removeWeakRef(AWeakRefData *wref) +{ +} http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/40310dcb/ui/src/AShared.h ---------------------------------------------------------------------- diff --git a/ui/src/AShared.h b/ui/src/AShared.h new file mode 100644 index 0000000..c8de282 --- /dev/null +++ b/ui/src/AShared.h @@ -0,0 +1,137 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#pragma once + +#include <stddef.h> + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// AWeakRefData // +// // +//////////////////////////////////////////////////////////////////////////////////////////////////// + +struct AWeakRefData +{ + AWeakRefData() : ptr(NULL), prev(NULL), next(NULL) { } + void *ptr; + AWeakRefData *prev; + AWeakRefData *next; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// AShared // +// // +//////////////////////////////////////////////////////////////////////////////////////////////////// + +class AShared +{ +public: + AShared() : _refCount(0) { } + virtual ~AShared() { } + + void ref(); + void deref(); + + void addWeakRef(AWeakRefData *wref); + void removeWeakRef(AWeakRefData *wref); + +private: + int _refCount; + struct { + AWeakRefData *first; + AWeakRefData *last; + } _weakRefs; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// ARef // +// // +//////////////////////////////////////////////////////////////////////////////////////////////////// + +template <class T> +class ARef +{ +public: + ARef() : _ptr(NULL) { } + ARef(T *ptr) : _ptr(NULL) { setPtr(ptr); } + ARef(const ARef<T> &other) : _ptr(NULL) { setPtr(other._ptr); } + ~ARef() { setPtr(NULL); } + + ARef<T> &operator=(const ARef<T> &other) { + setPtr(other._ptr); + return *this; + } + + T &operator*() const { return *_ptr; } + T *operator->() const { return _ptr; } + T *ptr() const { return _ptr; } + bool isNull() const { return (_ptr == NULL); } + + void setPtr(T *newPtr) { + T *oldPtr = _ptr; + if (newPtr != NULL) + newPtr->ref(); + if (oldPtr != NULL) + oldPtr->deref(); + _ptr = newPtr; + } + + private: + T *_ptr; +}; + +//////////////////////////////////////////////////////////////////////////////////////////////////// +// // +// AWeakRef // +// // +//////////////////////////////////////////////////////////////////////////////////////////////////// + +template<class T> +class AWeakRef +{ +public: + AWeakRef() : _ptr(NULL) { } + AWeakRef(T *ptr) : _ptr(NULL) { setPtr(ptr); } + AWeakRef(const AWeakRef<T> &other) : _ptr(NULL) { setPtr(other._ptr); } + ~AWeakRef() { setPtr(NULL); } + + AWeakRef &operator=(const AWeakRef<T> &other) { + setPtr(other._ptr); + return *this; + } + + T &operator*() const { return *_ptr; } + T *operator->() const { return _ptr; } + T *ptr() const { return _ptr; } + bool isNull() const { return (_ptr == NULL); } + + void setPtr(T *newPtr) { + T *oldPtr = _ptr; + if (oldPtr != NULL) + oldPtr->removeWeakRef(&_data); + if (newPtr != NULL) + newPtr->addWeakRef(&_data); + _ptr = newPtr; + } + + private: + T *_ptr; + AWeakRefData _data; +}; http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/40310dcb/ui/src/ASize.h ---------------------------------------------------------------------- diff --git a/ui/src/ASize.h b/ui/src/ASize.h new file mode 100644 index 0000000..900fff9 --- /dev/null +++ b/ui/src/ASize.h @@ -0,0 +1,26 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#pragma once + +struct ASize +{ + ASize() : width(0), height(0) { } + ASize(double w, double h) : width(w), height(h) { } + double width; + double height; +}; http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/40310dcb/ui/src/AString.cpp ---------------------------------------------------------------------- diff --git a/ui/src/AString.cpp b/ui/src/AString.cpp new file mode 100644 index 0000000..25d5c6b --- /dev/null +++ b/ui/src/AString.cpp @@ -0,0 +1,81 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#include "AString.h" +#include <string.h> + +class AStringImpl : public AShared +{ +public: + AStringImpl() { } + ~AStringImpl() { delete chars; } + AChar *chars; + unsigned int len; +}; + +AString::AString() +{ + _impl = NULL; +} + +AString::AString(const char *utf8) +{ + _impl = new AStringImpl(); + _impl->len = strlen(utf8); + _impl->chars = new AChar[_impl->len]; + // FIXME: Do propert UTF-8 decoding here + for (unsigned int i = 0; i < _impl->len; i++) + _impl->chars[i] = utf8[i]; +} + +AString::AString(AChar *chars, unsigned int length) +{ + _impl = new AStringImpl(); + _impl->chars = new AChar[length]; + _impl->len = length; +} + +AString::AString(const AString &other) +{ + _impl = other._impl; +} + +AString::~AString() +{ +} + +AString &AString::operator=(const AString &other) +{ + _impl = other._impl; + return *this; +} + +unsigned int AString::length() const +{ + if (_impl.isNull()) + return 0; + else + return _impl->len; +} + +AChar AString::charAt(int index) const +{ + if (_impl.isNull()) + return 0; + else + return _impl->chars[index]; +} http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/40310dcb/ui/src/AString.h ---------------------------------------------------------------------- diff --git a/ui/src/AString.h b/ui/src/AString.h new file mode 100644 index 0000000..ea43c8f --- /dev/null +++ b/ui/src/AString.h @@ -0,0 +1,52 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +class AStringImpl; + +#include <stdint.h> +#include "AShared.h" + +typedef uint32_t AChar; + +class AString +{ +public: + AString(); + AString(const char *utf8); + AString(AChar *chars, unsigned int length); + AString(const AString &other); + ~AString(); + + AString &operator=(const AString &other); + + unsigned int length() const; + AChar charAt(int index) const; + + /* + int compare(const AString &other) const; + bool hasPrefix(const AString &other) const; + bool hasSuffix(const AString &other) const; + AString substring(int start, int end) const; + AString substringTo(int start) const; + AString substringFrom(int end) const; + AString lowerCase() const; + AString upperCase() const; + */ + + private: + ARef<AStringImpl> _impl; +}; http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/40310dcb/ui/src/AView.h ---------------------------------------------------------------------- diff --git a/ui/src/AView.h b/ui/src/AView.h new file mode 100644 index 0000000..278d239 --- /dev/null +++ b/ui/src/AView.h @@ -0,0 +1,60 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#pragma once + +#include "ARect.h" +#include "AColor.h" +#include "AEvent.h" +#include "AShared.h" + +class AView : public AShared +{ +public: + AView() : _visible(true), + _enabled(true), + _parent(NULL), + _nextSibling(NULL), + _prevSibling(NULL), + _firstChild(NULL), + _lastChild(NULL) { } + AView(const ARect &frame) : _frame(frame) { } + virtual ~AView() { } + + ARect frame() const { return _frame; } + void setFrame(const ARect &newFrame) { _frame = newFrame; } + + AColor backgroundColor() const { return _backgroundColor; } + void setBackgroundColor(const AColor &newBackgroundColor) { _backgroundColor = newBackgroundColor; } + + bool visible() const { return _visible; } + void setVisible(bool newVisible) { _visible = newVisible; } + + bool enabled() const { return _enabled; } + void setEnabled(bool newEnabled) { _enabled = newEnabled; } + +private: + ARect _frame; + AColor _backgroundColor; + bool _visible; + bool _enabled; + AView *_parent; + AView *_nextSibling; + AView *_prevSibling; + AView *_firstChild; + AView *_lastChild; +}; http://git-wip-us.apache.org/repos/asf/incubator-corinthia/blob/40310dcb/ui/src/uitest.cpp ---------------------------------------------------------------------- diff --git a/ui/src/uitest.cpp b/ui/src/uitest.cpp new file mode 100644 index 0000000..ee9c09f --- /dev/null +++ b/ui/src/uitest.cpp @@ -0,0 +1,75 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +#include <stdio.h> +#include "AView.h" +#include "AString.h" + +class Foo : public AShared +{ +public: + Foo(int value) : x(value) { printf("%p Foo::Foo()\n",this); } + virtual ~Foo() { printf("%p Foo::~Foo()\n",this); } + int x; + void print() { + printf("x = %d\n",x); + } +}; + +class StrongHolder +{ +public: + StrongHolder() { } + StrongHolder(const ARef<Foo> &_ref) : ref(_ref) { } + StrongHolder(Foo *ptr) : ref(ptr) { } + ARef<Foo> ref; +}; + +class WeakHolder +{ +public: + WeakHolder() { } + WeakHolder(const AWeakRef<Foo> &_ref) : ref(_ref) { } + WeakHolder(Foo *ptr) : ref(ptr) { } + AWeakRef<Foo> ref; +}; + +int main(int argc, const char **argv) +{ + printf("Hello World\n"); + Foo *f = new Foo(4); + printf("f = %p\n",f); + + StrongHolder *s1 = new StrongHolder(); + /* + StrongHolder *s2 = new StrongHolder(); + StrongHolder *s3 = new StrongHolder(); + WeakHolder *w1 = new WeakHolder(); + WeakHolder *w2 = new WeakHolder(); + WeakHolder *w3 = new WeakHolder(); + */ + printf("s1 = %p\n",s1); + + printf("s1->ref.ptr() = %p\n",s1->ref.ptr()); + printf("before\n"); + s1->ref = f; + printf("after\n"); + printf("s1->ref.ptr() = %p\n",s1->ref.ptr()); + // printf("s1->ref.ptr()->x = %d\n",s1->ref.ptr()->x); + + return 0; +}