Commit graph

1901 commits

Author SHA1 Message Date
84399aa407 ChainSearch: verify proper interplay of two dynamic search conditions 2018-09-16 01:08:49 +02:00
84c30fe802 ChainSearch: need to gear up immediately after backtracking
...which can be achieved by checking the backtracking loop
always right after the non-backtracking iteration, exploiting
the fact that the guard conditions of both are complimentary.
So the only case when we'd actually enter the backtracking
loop after regular iteration would precisely be when
we drop down due to exahausting an upper layer.

The result now reads

"sausage-bacon-tomato-and-spam-spam-bacon-spam-tomato-and-spam-bacon-tomato-and-bacon-tomato-and-tomato-and"

...which sounds correct, yay!
2018-09-16 01:08:48 +02:00
646a2e42cf ChainSearch: need to overload also the iterator function
...since usually such evaluation layers are finally wrapped into
an IterableDecorator and then presented as TreeEplorer -- an exercise
we do not want to perform here, since it is pointless in the typicall
use case. The IterChainSearch is already meant to be ready-for-use.

Thus, instead of wrapping again, the pragmatic solution is simply
to overload the missing operator++ and make it call the augmented
iterNext() function. Related to this, we also need to ensure
proper operation in case no further expansion is mandated
2018-09-16 01:08:48 +02:00
38a1aad897 ChainSearch: bugfixes on reworked construction
...seems basically sane now.
Just we still need to wrap it one more time into IterableDecorator;
which means the overall scheme how to build and package the whole pipeline
is not correct yet.

Maybe it is not possible to get it packaged all into one single class?
2018-09-16 01:08:48 +02:00
05e6e7f316 ChainSearch: remould construction to get the logic correct
on closer investigation it turned out that the logic of the
first design attempt was broken altogether. It did not properly
support backtracking (which was the reason to start this whole
exercise) and it caused dangling references within the lambda
closure once the produced iterator pipeline was moved out
into the target location.

Reasoning from first principles then indicated that the only sane
way to build such a search evaluation component is to use *two*
closely collaborating layers. The actual filter configuration
and evaluation logic can not reside and work from within the
expander. Rather, it must sit in a layer on top and work in
a conventional, imperative way (with a while loop).

Sometimes, functional programming is *not* the natural way
of doing things, and we should then stop attempting to force
matters against their nature.
2018-09-16 01:08:45 +02:00
767156e912 TreeExplorer: unit test coverage for injected custom layer 2018-09-16 01:07:23 +02:00
09d923db06 TreeExplorer: add the ability to inject a custom defined layer
this is an rather obvious extension to the TreeExplorer framework.
In some cases, client code wants to define its own very specific
processing layers, beyond of what can be done with filters and
transformers. Obviously, writing such a custom layer requires
intimate knowledge about the internals of TreeExplorer

the actual use case prompting this extension is IterChainSearch;
it turned out that the original design can not be implemented,
unless the resulting object is non-copyable (which violates
the basic traits of a TreeExplorer based pipeline).
2018-09-15 03:09:48 +02:00
8aae789b82 ChainSearch: test case to scrutinise chained filter reconfiguration
...and TADAA ... there we get an insidious bug:

we capture *this by reference into the expansion functor,
and then we move *this away, out from the builder into the target....
2018-09-14 21:06:15 +02:00
29d2c151b3 ChainSearch: add builder function just to replace the filter
Up to now, we had a very simplistic configuration option just
to search for a match, and we had the complete full-blown reconfiguration
builder option, which accepts a functor to work on and reconfigure the
embedded Filter chain.

It occurred to me that in many cases you'd rather want some intermediary
level of flexibility: you want to replace the filter predicate entirely
by some explicitly given functor, yet you don't need the full ability
to re-shape the Filter chain as a whole. In fact the intended use case
for IterChainSearch (which is the EventLog I am about to augment with
backtracking capabilities) will only ever need that intermediate level.


Thus wer're adding this intermediary level of configurability now.

The only twist is that doing so requires us to pass an "arbitrary function like thing"
(captured by universal reference) through a "layer of lambdas". Which means,
we have to capture an "arbitrary thingie" by value.

Fortunately, as I just found out today, C++14 allows something which comes
close to that requirement: the value capture of a lambda is allowe to have
an intialiser. Which means, we can std::forward into the value captured
by the intermediary lambda. I just hope I never need to know or understand
the actual type this captured "value" takes on.... :-)
2018-09-14 21:06:15 +02:00
10f21f77f8 ChainSearch: resolve the problems and get basic functionality to work
with the augmented TreeExplorer, we're now able to get rid of the
spurious base layer, and we're able to discard the filter and
continue with the unfiltered sequence starting from current position.
2018-09-14 21:06:15 +02:00
df7a9492b7 TreeExplorer: helper function so support ChainSearch::clearFilter()
build a special feature into the Explorer component of TreeExplorer,
causing it to "lock into" the current child sequence and discard
all previous sequences from the stack of child explorations
2018-09-14 21:06:15 +02:00
5b92f5cf74 ChainSearch: fix broken logic when configuring base layer
There is an asymetry, insofar the base layer configuration is
evaluated immediately, causing the MutableFilter to be reconfigured
and forwarded to the first match.

to the contrary, when configuring an additional layer, we just
add it to the chain, but then need to iterate once to cause
this configuration actually to be unfolded onto the stack
2018-09-14 21:06:15 +02:00
2ca3e95e9e ChainSearch: allow for overconstrained search
...which just turns the pipeline into exhausted state,
instead of raising an Assertion failure

The point is, expandChildren() does not guard itself,
since it _requires_ an non-empty iterator as precondition.
Thus, any function downstream, which invokes expandChildren(),
has to check and guard this call apropriately.

In the concrete case at hand we just stop adding further constraints
when the pipeline is already in exhausted state
2018-09-14 21:06:15 +02:00
0eec4d3b5f ChainSearch: now use the improved TreeExplorer capabilities to address the shortcoming
...the solution built thus far was logically broken, since it retained the unfiltered
source sequence within the base layer. Thus it would backtrack into this unfiltered
sequence eventually.

The idea was to build a special treatment for attaching the first filter condition;
in fact the first one does not need to be added to the chain, but rather should be
planted directly into the base layer.

WIP: this is a solution draft, but does not work yet
  - when attaching the base layer, the filter is pulled twice
  - an overconstrained filter raises an Assertion failure
    (instead of just transitioning into exhausted state)
2018-09-14 21:06:15 +02:00
7cdd680e78 TreeExplorer: clean-up after refactoring
So we have now a reworked version of the internals of TreeExplorer in place.
It should be easier to debug template instantation traces now, since most
of the redundancy on the type parameters could be remove. Moreover, existing
pipelines can now be re-assigned with similarily built pipelines in many cases,
since the concrete type of the functor is now erased.

The price tag for this refactoring is that we have now to perform a call
through a function pointer on each functor invocation (due to the type erasure).
And seemingly the bloat in the debugging information has been increased slightly
(this overhead is removed by stripping the binary)
2018-09-14 21:06:15 +02:00
9067740456 TreeExplorer: refactor Expander to fit in with the reworked design
Here the design trardeoff becomes clearly visiblie
- on the plus side, we removed that spurous redundant info
  from the template parameter, and we simplified functor rebinding
- but as a tradeoff, we now always have two std::function objects
  nested into each other, which also means that at least the outer
  object resides on the heap and /inevitably/ calls through a
  function pointer, even in case the target function is a lambda,
  simply because some type erasure happened, and the call site
  does not know the actual type anymore
2018-09-14 21:06:15 +02:00
36d79be8b2 TreeExplorer: refactor Filter in a similar way 2018-09-14 21:06:15 +02:00
1e657acbff TreeExplorer: refactor Transformer to employ the improved wrapping style
...step by step switch over to the new usage pattern.
Transformer should be the blueprint for all other functor usages.


The reworked solutions behaves as expected;
we see two functor invocations; the outer functor, which does
the argument adaptation, is allocated in heap memory
2018-09-14 21:06:15 +02:00
a91025bfe0 TreeExplorer: perpare a builder for a suitably adapted, wrapped functor.
This does not touch the existing code-path,
but the idea is to use the _FunTraits directly from within the
constructor of the respective processing layer, and to confine the
knowledge of the actual FUN functor type to within that limited context.
Only the generic signature of the resulting std::function need to be
encoded into the type of the processing component, which should help
to simplify the type signatures
2018-09-14 21:06:15 +02:00
5d4f1015aa TreeExplorer: consider refactoring of the functor adaptatiion mechanism
...and in preparation start with some renamings...


The overall goal is to simplify the type signatures and thereby
to make the generates pipelines more assignment compatible.

The debugging experience form the last days indicated that the
current design is not maintainable on the long run. Both the
template instantiation chains and the call stacks are way to
complicated and hard to understand and diagnose
2018-09-14 21:06:15 +02:00
e3ca8548a4 TreeExplorer: allow for a disabled filter
...considered as one of the building blocks to resolve Problems in the Design of ChainSearch
2018-09-14 21:06:15 +02:00
34b78fc47e ChainSearch: identify some possible problems
- as implemented now, we will finally backtrack into the unfiltered base iterator
- it is not possible to implement a clearFilter() operation
2018-09-14 21:06:15 +02:00
c0b8b63df0 ChainSearch: ensure to pass current state without spurious copy
It is essential that we pass the current state of the filter
into the expand functor, where it needs to be copied (once!)
to create a child state, which can then be augmented.

This augmented state is then pushed onto a stack, to enable backtracking.


Due to the flexible adapters and the wrapping into the TreeExplorer builder,
we ended up performing several spurious copies on the current state
2018-09-14 21:06:14 +02:00
d923138d1c ChainSearch: configure the core of the chained search mechanism
...based on a monadic tree expansion: we define a single step,
which takes the current filter configuration and builds the next
filter configuration, based on a stored chain of configuration functions

The actual exhausting depth-first results just by the greedy application pattern,
and uses the stack embedded in the "Explorer" layer of TreeExplorer
2018-09-14 21:06:14 +02:00
2b72175e04 ChainSearch: Storage for the filter chain 2018-09-14 21:06:14 +02:00
d398177a71 ChainSearch: now actually build the processing pipeline in the ctor
..this resolves the most challenging part of the construction work;
we use the static helper functions to infer a type and construct a suitable
processing pipeline and we invoke the same helper to initialise the base class
in the ctor.

Incidentally... we can now drop all the placeholder stubs,
since we now inherit the full iterator and child explorer API.
The test now starts actually to work... we get spam and sausage!

TODO: now actually fill in the expand functor such as to pick the
concrete filter step in the chain from a sequence of preconfigured
filter bindings
2018-09-14 21:06:14 +02:00
a52ed91de0 ChainSearch: draft a solution how to construct the Expand functor type
...now matters start to get really nasty,
since we have to pick up an infered type from a partially built pipeline
and use it to construct the signature for a functor to bind into the more elaborate complete pipeline
2018-09-14 21:06:14 +02:00
6834c26470 ChainSearch: draft a solution how to construct the pipeline builder base type
this is a tricky undertaking, since our treeExplore() helper constructs
a complex wrapped type, depending on the actual builder expressions used.

Solution is to use decltype on the result of a helper function,
and let the _DecoratorTraits from TreeExplorer do the necessary type adaptations
2018-09-14 21:06:14 +02:00
ec8d0557e8 ChainSearch: draft interface and possible implementation approach
The intention is to augment the iterator based (linear) search
used in EventLog to allow for real backtracking, based on a evaluation tree.
This should be rather staight forward to implement, relying on the
exploreChildren() functionality of TreeExplorer. The trick is to package
the chained search step as a monadic flatMap operation
2018-09-14 21:06:14 +02:00
9d7ce1e6a4 EventLog: now able to use the CursorGear immediately as state core
...since TreeExplorer automatically does the iterator wrapping for us.
As added benefit, we have now a direct API to control the search direction
2018-09-14 21:06:14 +02:00
75e1eab4bb EventLog: drop-in the new TreeExplorer::mutableFilter
while this is basically a drop-in replacement,
it marks the switch to the monadic evaluation technology,
which is prerequisite for building real backtracking into the search.
2018-09-14 21:06:14 +02:00
b3f328f28d EventLog: consolidate existing calls to configure the search
create a narrow configuration API for the underlying search mechanism.
Simplifies the task of turning that search into a real backtracking evaluation.
2018-09-14 21:06:14 +02:00
604ffbf73c TreeExplorer: fix a bug and finish the feature
we did an unnecessary copy of the argument, which was uncovered
by the test case manipulating the state core.


Whew.
Now we have a beautiful new overengineered solution
2018-09-14 21:06:14 +02:00
be7f47d5b7 TreeExplorer: rework the solution to allow for arbitrary functor types
outift the Filter base class with the most generic form of the Functor
wrapper, and rather wrap each functor argument individually. This allows
then to combine various kinds of functors
2018-09-14 21:06:14 +02:00
90c0f43cfd TreeExplorer: code all the combination cases
...this solution works, but has a shortcoming:
the type of the passed lambdas is effectively pinned to conform
with the signature of the first lambda used initially when building the filter.

Well, this is the standard use case, but it kind of turns all the
tricky warpping and re-binding into a nonsense excercise; in this form
the filter can only be used in the monadic case (value -> bool).

Especially this rules out all the advanced usages, where the filter
collaborates with the internals of the source.
2018-09-14 21:06:14 +02:00
e29d9ae19e TreeExplorer: better package this very specific code as subclass
while this is basically just code code cosmetics,
at least it marks this as a very distinct special case,
and keeps the API for the standard Filter layer clean.
2018-09-14 21:06:14 +02:00
8f70b4e902 TreeExplorer: prototype for the extracted boilerplate helper
a quite convoluted construct built from several nested generic lambdas.
When investigated in the debugger, the observed addresses and the
invoked code looks sane and as expected.
2018-09-14 21:06:14 +02:00
b4edf8e33c TreeExplorer: find a way to extract the boilerplate
...based on generic lambdas, which are effectively template classes themselves
2018-09-14 21:06:14 +02:00
94da0f627f TreeExplorer: draft ability to remould the filter
The intention is to switch from the itertools-based filter
to the filter available in the TreeExplorer framework.
Thus "basically" we just need to copy the solution over,
since both are conceptually equivalent.

However...... :-(
The TreeExplorer framework is designed to be way more generic
and accepts basically everything as argument and tries to adapt apropriately.

This means we have to use a lot of intricate boilerplate code,
just to get the same effect that was possible in Itertools with
a simple and elegant in-place lambda assignment
2018-09-14 21:06:14 +02:00
757258fb3a TreeExplorer: fix bug in Filter layer
Fillter needs to be re-evaluated, when an downstream entity requests
expandChildren() onto an upstream source. And obviously the ordering
of the chained calls was wrong here.

As it turns out, I had discovered that necessity to re-evaluate with
the Transformer layer. There is a dedicated test case for that, but
I cut short on verifying the filter in that situation as well, so
that piece of broken copy-n-paste code went through undetected.

This is in fact a rather esoteric corner case, because it is only
triggered when the expandChildren() call is passed through the filter.
When otoh the filter sits /after/ the entity generating the expandChildren()
calls, everything works as intended. And the latter is the typical standard
usage situation of an recursive evalutation algorithm: the filter is here
used as final part to drive the evaluation ahead and pick the solutions.
2018-09-14 21:06:14 +02:00
3fc5a94b87 TreeExplorer: investigate the backtracking abilities
There is a bug or shortcoming in the existing ErrorLog matcher implementation.
It is not really difficult to fix, however doing so would require us to intersperse
yet another helper facility into the log matcher. And it occurred to me, that
this helper would effectively re-implement the stack based backtracking ability,
which is already present in TreeExplorer (and was created precisely to support
this kind of recursive evaluation strategies).

Thus I intend to switch the implementation of the EventLog matcher from the
old IterTool framework to the newer TreeExplorer framework. And this intention
made me re-read the code, fixing several comments and re-thinking the design
2018-09-14 21:06:14 +02:00
2520ee82d1 EventLog: investigate failed match in EventLog
seemingly my quick-n-dirty implementation was to naiive.
We need real backtracking, if we want to support switches
in the search direction (match("y").after("x").before("z")

Up to now, I have cheated myself around this obvious problem :-/
2018-09-14 21:06:13 +02:00
026049a13c UiElement: likewise integrate the Revealer functor (#1162) 2018-09-14 21:06:13 +02:00
41e0496576 NotificationDisplay: now able to build the expand functionality
...by delegating to an Expander placed into the ErrorLogDisplay widget
2018-09-14 21:06:13 +02:00
3f327b335a UiElement: switch MockElement to rely on the new functor based default impl
...which is implicit verified through AbstractTangible_test::markState()
2018-09-14 21:06:13 +02:00
51a7670425 UiElement: integrate a default implementation based on the Expander functor 2018-09-14 21:06:13 +02:00
04424fb8df UiElement: code and document the functor components 2018-09-14 21:06:13 +02:00
551920e952 UiElement: decide upon the design variant to use for expand() / reveal() (#1162) 2018-09-14 21:06:13 +02:00
17bcdd952a UiElement: design of helper abstractions (#1162)
to strive at a generic implementation for
- expanding/collapsing a widget
- revealing a widget

which obviously somehow involes storing a closure
2018-09-14 21:06:13 +02:00
837c6d11ff NotificationDisplay: solve the problem with space allocation
as it turns out, we need to set the property_expand() on the child widget
within Gtk::Expander explicitly, to cause the child to grab and additional
available screen space (which obviously is what we want in case of a
log display with scrollbars)
2018-09-14 21:06:13 +02:00
bc3eb7f8da NotificationDisplay: experiment to build a collapsed display
basically Gtk::Expander will do the trick.
However, resizing of the enclosing panel is not handled properly,
the log does not expand to take up the available space, as it did
automaticall when just added directly into the frame
2018-09-14 21:06:13 +02:00
a0b80d8a46 NotificationDisplay: preliminary plans regarding information display in the UI
...while traveling with the train over the Schwäbische Alb to Karlsruhe;
on my way to FrOSCon 2018
2018-09-14 21:06:13 +02:00
65bbc45e02 NotificationDisplay: care for lifecycle issues and expansion state persistence 2018-09-14 21:06:13 +02:00
7846460530 NotificationDisplay: code up controller protocol in NotificationHub
...mostly by delegating to (stubbed) functions in ErrorLogDisplay
2018-09-14 21:06:13 +02:00
a151f28d86 NotificationDisplay: solved that nasty topic of dock access for now
phew...
2018-09-14 21:06:13 +02:00
67ac8601d8 DockAccess: implement preliminary simplistic lookup and allocation 2018-09-14 21:06:13 +02:00
76e79c02ee NotificationDisplay: view allocation can be pushed into the access functor
no need to define a private function on Wizard anymore, it just forwards the call
to the service actually implementing the view allocation. For now this is the
PanelLocator (and eventually this will be the ViewLocator / ViewSpecDSL)
2018-09-14 21:06:13 +02:00
855944eff3 NotificationDisplay: turn the error log into an optional display 2018-09-14 21:06:13 +02:00
dcde80c4cd DockAccess: wire the new service through the Wizard 2018-09-14 21:06:13 +02:00
8755153d95 DockAccess: consider a preliminary lookup implementation within PanelLocator
PanelLocator is a sub component of the WindowLocator (top-level GUI service).
Eventually this shall become a mere widget/component access service, with the
actual lookup and allocation logic layered on top through ViewLocator, configurable
via ViewSpec-DSL.

We can not implement the full scheme right now, since we're lacking knowledge
about internals of a typical Lumiera UI widget
2018-09-14 21:06:13 +02:00
c0dca2d978 DockAccess: add lookup-by-Type function to PanelManager
...now the mess multiplies
2018-09-14 21:06:12 +02:00
987aad44c1 DockAccess: add ability to retrieve a panel via PanelManager (#1144)
This is only a premature hack, since the whole structure of PanelManager is somewhat broken.
Moreover, the ViewLocator is not really ready for use yet, so this hack at least
allows us to "reach into" a top-level window and "grab" the pannel we need.
2018-09-14 21:06:12 +02:00
e7e09a642b NotificateDisplay: delegate view allocation through a functor 2018-09-14 21:06:12 +02:00
42cbc9219f NotificateDisplay: link to a widget for error log display
The ErrorLogWidget is allocated and placed elsewhere
and not owned by the NotificationHub controller.
2018-09-14 21:06:12 +02:00
a74dc596ce WLink: finished incl. exception handling guarantees and documentation 2018-09-14 21:06:12 +02:00
ae26012bf5 WLink: implement copy operations
swap-based implementation
not sure if attachTo() should be noexcept
2018-09-14 21:06:12 +02:00
c47e3d0210 WLink: draft basic behaviour 2018-09-14 21:06:12 +02:00
e829a74edf NotificationDisplay: draft idea of managed link-to-widget
a smart-reference based on sigc::trackable
2018-09-14 21:06:12 +02:00
36abe4567e NotificationDisplay: define the actual controller behaviour to be implemented
this is specification work; for now the stubs are marked UNIMPLEMENTED
2018-09-14 21:06:12 +02:00
c2c25f8134 NotificationDisplay: define and include the unique error-Log ID 2018-09-14 21:06:12 +02:00
53c47a6fcc Assets: verify creation of ErrorLog meta-Asset 2018-09-14 21:06:12 +02:00
928b4372e0 Assets: investigating the unclear distinction between asset::Struct and asset::Meta (#1156)
including a kind-of Bugfix: the ctor of TimeGrid erroneously categorised it as asset::Kind STRUCT
2018-09-14 21:06:12 +02:00
1d69bb9050 NotificationDisplay: define a new ErrorLog asset
...for now to serve as placeholder type, used as anchor for the corresponding UI display widget
2018-09-14 21:06:12 +02:00
5475839a49 NotificationDisplay: the question where to define the entity-ID 2018-09-14 21:06:12 +02:00
12244afc90 NotificationDisplay: fill in some default implementation for the controller 2018-09-14 21:06:12 +02:00
0c8151cb2f NotificationDisplay: decide upon the architecture for handling notification messages (#1102)
* have a dedicated "information hub" controller, which acts a receiver of "error log messages" on the UI-Bus
 * let that controller in turn allocate an apropriate view on demand
2018-09-14 21:06:12 +02:00
06b3c382f3 DemoGuiRoundtrip: expand on that idea (#1099) and start analysis how to create that UI component
The goal is to build a (in itself completely meaningless) ping-pong interaction
between the UI and Proc-Layer, for the purpose of driving the integration ahead.

The immediate challenge is how to create and place an apropriate "GuiComponentView",
i.e. a Tangible, which is connected to the UI-Bus with an predictable EntryID.
And the problem is to get that settled right now, without building the envisioned
generic framework for View allocation in the UI. When this is achieved,
it should be a rather small step to actually send those notifications over
the UI-Bus, which is basically implemented and ready by now.
2018-09-14 21:06:12 +02:00
3a100972d7 UI-Lifecycle: send up a dummy notification message to indicate start of content population
right now this will just end up in the log, since not even the
notification display is implemented beyond the GuiNotification-facade.

Anyway, we get some kind of communication now for real, in the actual application
2018-08-04 19:07:21 +02:00
4e77a28112 UI-Lifecycle: use dummy-mechanism to get the new command executed
...because due of #211, we usually don't execute commands yet.
For now there is only the backdoor to prefix the command-ID with "test"

With this change, the TODO message appears now immediately after GUI start!
2018-08-04 18:45:58 +02:00
d58890e2d5 UI-Lifecycle: define a new Proc-Command to implement the population trigger (#1150) 2018-08-04 17:10:04 +02:00
eca06a8309 UI-Lifecycle: build trigger point for content population into InteractionDirector (closes #1151)
In the end, I decided against building a generic service here,
since it pretty much looks like a one-time problem.

Preferrably UI content will be pushed or pulled on demand,
rather than actively coding content from within the UI-Layer
2018-08-04 16:02:00 +02:00
4306e47930 (DOC) GTK start-up internals and design of Lumiera's UI-Layer 2018-08-03 22:33:06 +02:00
7db8bf4c0c UI-Lifecycle: research regarding GTK's activation signal. Document the findings
- activation signal is a facility offered and used solely by Gtk::Application
- we do not need nor want an Gtk::Application, we deal with our own application
  concerns as we see fit.
2018-08-03 19:28:12 +02:00
f33573daec UI-Lifecycle: note down reference point for this task in Gtk::Application
Gio::Application holds a signal_activation(), which seems to be used for
precisely that task we need here: to do something right after the UI is operative
2018-08-03 01:48:08 +02:00
d3daed9a18 UI-Lifecycle: invstigate where to issue the trigger (#1151) 2018-08-02 19:59:26 +02:00
9a39781667 UI-Lifecycle: draft a plan how to trigger content population
...and while doing so, also re-check the state of the GTK toolkit initialisation.
Looks like we're still future-proof, while cunningly avoiding all this
Gnome-style "Application" blurb
2018-07-28 19:01:23 +02:00
0c5a0fed6a UI-Lifecycle: verify and rectify start-up sequence (#1147)
...still not entirely decided yet where to plant the mechanism for
UI content retrieval (#1150)
2018-07-14 19:39:00 +02:00
c24778132e After a long break (LAC.2018 Berlin) -- start planning the next steps
I will abandon work on the ViewSpec DSL in current shape (everything fine with that)
and instead work on a general UI start-up and content population sequence.
From there, my intention is to return to the docks, the placement of views
and then finally to the TimelineView
2018-07-12 21:32:41 +02:00
5cac40654f DockAccess: draft code reorganisation (#1144) 2018-06-17 15:09:52 +02:00
8097485dbf ViewSpec: integrate the simple View access case (Unit test PASS)
This finishes the first round of design drafts in this area.
Right now it seems difficult to get any further, since most of
the actual view creation and management in the UI is not yet coded.
2018-06-15 18:02:08 +02:00
800fc5915a ViewSpec: recast the ElementAccess API to work around the design problem
...it is not really solved, rather postponed.
But who knows. Maybe it's already good enough...
2018-06-15 16:42:51 +02:00
2e8bc9227a ViewSpec: analysis of design alternatives
looks like I'm trapped with the choice between a convoluted API design
and an braindead and inefficient implementation. I am leaning towards the latter
2018-06-15 01:51:10 +02:00
f55a8f606b ...one month later: pick up after the LAC.18 Berlin
...happened to be completely absorbed by the preparations
for my workshop about Yoshimi and musical presets
2018-06-14 17:02:34 +02:00
64b45a41c9 ViewSpec: some more musing...
the damn thing is: now we get three consecutive accesses for each invocation.
This starts looking really dumb
2018-06-14 15:15:08 +02:00
363d24ba91 ViewSpec: unsuccessful atempt to implement the allocator token
looks like we're hitting a design mismatch here....

...and unfortunately I have to abandon this task now and concentrate
on preparation of my talk at LAC.2018 in June
2018-06-14 15:13:06 +02:00
852a3521db Static-Init: switch lib::Depend to embed the factory as Meyer's Singleton (#1142)
this is a (hopefully just temporary) workaround to deal with static initialisation
ordering problems. The original solution was cleaner from a code readability viewpoint,
however, when lib::Depend was used from static initialisation code, it could
be observed that the factory constructor was invoked after first use.

And while this did not interfer with the instance lifecycle management itself,
because the zero-initialisation of the instance (atomic) pointer did happen
beforehand, it would discard any special factory functions installed from such
a context (and this counts as bug for my taste).
2018-05-01 18:49:20 +02:00
d0538a55ff ViewSpec: implement the generic access function in ViewLocator
still missing: internal wiring from the allocation token(s) of the DSL
into the ElementAccess service designed last week.
2018-04-15 03:07:54 +02:00
ba3d9e57b5 ViewSpec: draft a way to code an integration test for ViewLocator (#1129)
The original goal for #1129 (ViewSpecDSL_test) is impossible to accomplish,
at least within our existing test framework. Thus I'll limit myself to coding
a clean-room integration test with purely synthetic DSL definitions and mock widgets
2018-04-15 01:39:46 +02:00
86b1aac721 ElementAccess: somewhat improve the mock implementation to cover the standard case
...still quite braindead, but well....
2018-04-14 03:58:02 +02:00
4071a58454 ElementAccess: fix first unit test case
ouch, the typedef Base /is/ already a pointer...
2018-04-14 01:59:41 +02:00
4c273d902c ElementAccess: add very simplistic mock implementation 2018-04-14 01:37:56 +02:00
35ea547fd1 ElementAccess: (WIP) another unsuccessful attempt
Problem is, we can not even compile the conversion in the "other branch".
Thus we need to find some way to pick the suitable branch at compile time.

Quite similar to the solution found for binding Rec<GenNode> onto a typed Tuple
2018-04-09 02:19:54 +02:00
91b83f5ede ElementAccess: (WIP) unsuccessful attempt to solve the typing problem
the intention was to return disparate result types, just depending on the
actual position in the UI-Coordinates. The client knows what to expect
2018-04-09 01:14:12 +02:00
c245098d45 ElementAccess: (WIP) first draft for internal accessor function
...but can not work this way.
Since void* has not RTTI, no secure access with downcast is possible
2018-04-09 00:51:24 +02:00
e99ad7a3e6 ElementAccess: draft simple lookup interface 2018-04-08 18:43:27 +02:00
09359cf92a ElementAccess: initial brainstorming about the interface mechanics 2018-04-07 02:28:29 +02:00
dc97ab5546 ElementAccess: consider helper to encapsulte access to actual GTK structures (#1134) 2018-04-07 01:00:25 +02:00
2f899a921c ViewSpec: draft next steps to address
...should implement the generic invocation in ViewLocator,
without actually implementing the backing UI element allocation logic
2018-04-05 19:43:10 +02:00
18a552002d ViewSpec: use mocked LocationSolver to verify operation of the DSL 2018-04-05 01:09:13 +02:00
64d5f868ea ViewSpec: and finally solve the daunting problem of service access
this is f***ng unbelievable.
Its just two lines of code now
VICTORY!
2018-04-04 04:37:13 +02:00
cb6155c85e ViewSpec: now turn the UILocationSolver into yet another global service
feels a bit uncanny after all
can't be *that* easy
2018-04-04 03:59:11 +02:00
71bb2b48b6 ViewSpec: pick up with dependency-injection into the DSL tokens (#1126)
Attempt to find my way back to the point
where the digression regarding dependency-injection started.

As it turns out, this was a valuable digression, since we can rid ourselves
from lots of ad-hoc functionality, which basically does in a shitty way
what DependencyFactory now provides as standard solution


FIRST STEP is to expose the Navigator as generic "LocationQuery" service
through lib::Depend<LocationQuery>
2018-04-04 03:29:26 +02:00
fb8a5333fc DOC: reduce DependencyFactory page in the TiddlyWiki
...since it has been published almost 1:1 on the Lumiera website.
Retain only some technical reference information here
2018-04-04 01:43:24 +02:00
b3c5142c2f DOC: publish the microbenchmark results in the technical documentation section (closes #1086) 2018-04-03 09:08:40 +02:00
6f2ed76d83 Improve the code for proxy generation
more of a layout improvement, to avoid any code duplication.
The mechanics remain the same
 - write an explicit specialisation
 - trigger template intantiation within a dedicated translation unit
2018-04-03 07:45:13 +02:00
db7172df29 DOC: update technical (doxygen) documentation to reflect the integration with lib::Depend 2018-04-03 06:37:36 +02:00
18d0970a86 Rework Interface-Proxy definition to fit with the new scheme
everything works now after the switch.
BUT this solution is ugly, we need to trigger template instantiation explicitly
2018-04-03 05:15:26 +02:00
f24c548443 Reorganise translation units for interface proxies
from now on, we'll have dedicated individual translation units (*cpp)
for each distinct interface proxy. All of these will include the
interfaceproxy.hpp, which now holds the boilerplate part of the code
and *must not be included* in anything else than interfac proxy
translation units. The reason is, we now *definie* (with external linkage)
implementations of the facade::Link ctor and dtor for each distinct
type of interface proxy. This allows to decouple the proxy definition code
from the service implementation code (which is crucial for plug-ins
like the GUI)
2018-04-03 03:14:55 +02:00
1101e1f1db Dismantle the woefully complex interfaceproxy Accessor in favour of lib::Depend
The recently rewritten lib::Depend front-end for service dependencies,
together with the configuration as lib::DependInject::ServiceInstance
provides all the necessary features and is even threadsafe.

Beyond that, the expectation is that also the instantiation of the
interface proxies can be simplified. The proxies themselves however
need to be hand-written as before
2018-04-03 02:44:12 +02:00
4e0d99e928 Demote the Play-Facade to a in-language (C++) Interface to get rid of InterfaceFacadeLink
I am fully aware this change has some far reaching ramifications.
Effectively I am hereby abandoning the goal of a highly modularised Lumiera,
where every major component is mapped over the Interface-System. This was
always a goal I accepted only reluctantly, and my now years of experience
confirm my reservation: it will cost us lots of efforts just for the
sake of being "sexy".
2018-04-03 02:14:45 +02:00
9f3c127240 (WIP) Draft to replace the Interface-Proxy-Binding by lib::Depend
in theory this should be possible and obsolete a lot of dedicated code,
since lib::Depend provides all the intance management and error checking
2018-04-02 08:20:56 +02:00
29ee5131f4 Switch first Layer-Separation-Interface to expose the service implementation via lib::Depend
Actually this is on the implementation side only.
Since Layer-Separation-Interfaces route each call through a binding layer,
we get two Service-"Instances" to manage
- on the client side we have to route into the Lumiera Interface system
- on the implementation side the C-Language calls from the Interface system
  need to get to the actual service implementation. The latter is now
  managed and exposed via DependInject::ServiceInstance
2018-04-02 04:19:17 +02:00
be789bea59 Fix funny problem with C header stdbool.h
...which is so kind as to redefine bool, true and false as macros. Yessss!
2018-04-02 03:27:07 +02:00
6460ff8344 Switch basic Application initialisation to the rewritten DependencyFactory
this is the classic case of a singleton object
2018-04-02 02:56:08 +02:00
4669260cd1 Fix setup of the ConfigManager implementation
...still using the FAKE implementation, not a real rules engine.
However, with the new Dependency-Injection framework we need to define
the actual class from the service-provider, not from some service-client.
This is more orthogonal, but we're forced to install a Lifecycle-Hook now,
in order to get this configuration into the system prior to any use
2018-04-02 02:20:54 +02:00
d6167c1845 DependencyFactory: reorder destructor to allow for re-entrance
This is borderline yet acceptable;
A service might indeed depend on itself circularly
The concrete example is the Advice-System, which needs to push
the clean-up of AdviceProvicions into a static context. From there
the deleters need to call back into the AdviceSystem, since they have
no wey to find out, if this is an individual Advice being retracted,
or a mass-cleanup due to system shutdown.

Thus the DependencyFactory now invokes the actual deleter
prior to setting the instance-Ptr to NULL.
This sidesteps the whole issue with the ClassLock, which actually
must be already destroyed at that point, according to the C++ standard.
(since it was created on-demand, on first actual usage, *after* the
DependencyFactory was statically initialised). A workaround would be
to have the ctor of DependencyFactory actively pull and allocate the
Monitor for the ClassLock; however this seems a bit overingeneered
to deal with such a borderline issue
2018-04-01 07:06:58 +02:00
21fdce0dfc a better solution to reject out-of-order static access after shutdown
Static initialisation and shutdown can be intricate; but in fact they
work quite precise and deterministic, once you understand the rules
of the game.

In the actual case at hand the ClassLock was already destroyed, and
it must be destroyed at that point, according to the standard. Simply
because it is created on-demand, *after* the initialisation of the
static DependencyFactory, which uses this lock, and so its destructor
must be called befor the dtor of DependencyFactory -- which is precisely
what happens.

So there is no need to establish a special secure "base runtime system",
and this whole idea is ill-guided. I'll thus close ticket #1133 as wontfix

Conflicts:
	src/lib/dependable-base.hpp
2018-04-01 04:52:50 +02:00
f0eeafddaa Identified some problems regarding static destruction
When some dependency or singleton violates Lumiera's policy regarding destructors and shutdown,
we are unable to detect this violation reliably and produce a Fatal Error message.
This is due to lib::Depend's de-initialisating being itself tied to template generated
static variables, which unfortunately have a visibility scope beyond the translation unit
responsible for construction and clean-up.
2018-03-31 17:27:13 +02:00
80207ea224 DI: (WIP) switch to totally rewritten new implementation of lib::Depend (#1086)
- state-of-the-art implementation of access with Double Checked Locking + Atomics
- improved design for configuration of dependencies. Now at the provider, not the consumer
- support for exposing services with a lifecycle through the lib::Depend<SRV> front-end
2018-03-31 01:06:06 +02:00
562c14e15d DI: safer to make DependencyFactor noncopyable
...and to use a dedicated function for transferring the definition
2018-03-30 07:57:08 +02:00
cc46c5b04b DI: solve problem with leftover deleter in testmock. Unit test PASS 2018-03-30 07:42:53 +02:00
5d0c2b6d2c DI: special solution for singletons with private default ctor
...which declare DependencyFactory as friend.
Yes, we want to encourrage that usage pattern.

Problem is, std::is_constructible<X> gives a misleading result in that case.
We need to do the instantiation check within the scope of DependencyFactory
2018-03-30 06:48:34 +02:00
b3d18c1a74 DI: rework dependency-injection configuration in terms of the new DependencyFactory
why is this so damn hard to get right?
2018-03-30 05:56:53 +02:00
5fc85df385 DI: inline into lib::Depend to obsolete InstanceHolder
but now we've got two factory functors.
So there is yet more potential for simplification & refactoring
2018-03-29 16:57:55 +02:00
c3e149028f DI: draft towards unified use of the singleton holder
ideally we want
 - just a plain unique_ptr
 - but with custom deleter delegating to lib::Depend
 - Depend can be made fried to support private ctor/dtor
 - reset the instance-ptr on deletion
 - always kill any instance
2018-03-28 03:27:05 +02:00
d6786870f3 DI: port the old Singleton unit tests
all these tests are ported by drop-in replacement
and should work afterwards exactly as before (and they do indeed)

A minor twist was spotted though (nice to have more unit tests indeed!):
Sometimes we want to pass a custom constructor *not* as modern-style lambda,
but rather as direct function reference, function pointer or even member
function pointer. However, we can not store those types into the closure
for later lazy invocation. This is basically the same twist I run into
yesterday, when modernising the thread-wrapper. And the solution is
similar. Our traits class _Fun<FUN> has a new typedef Functor
with a suitable functor type to be instantiated and copied. In case of
the Lambda this is the (anonymous) lamda class itself, but in case of
a function reference or pointer it is a std::function.
2018-03-26 07:54:16 +02:00
4d783770d0 Bugfix: CallQueue_test initialisation was not threadsafe (see also #1131)
...which showed up under high system load.
The initialisation of the member variables for the check sum
could be delayed while the corresponding thread was already running
2018-03-26 04:40:54 +02:00
942bad5d0a DI: document the reworked Singleton / Dependency-Factory
- polish the text in the TiddlyWiki
 - integrate some new pages in the published documentation
   Still mostly placeholder text with some indications
 - fill in the relevant sections in the overview document
 - adjust, expand and update the Doxygen comments

TODO: could convert the TiddlyWiki page to Asciidoc and
      publish it mostly as-is. Especially the nice benchmarks
      from yesterday :-D
2018-03-25 09:33:57 +02:00
7a250ca9e5 DI: benchmark atomic locking 2018-03-24 11:02:44 +01:00
d78211a9a1 DI: implement C++11 solution of Double-Checked-Locking with std::atomic + Mutex
This solution is considered correct by the experts.

Regarding the dependency-configuration part, we do not care too much about performance
and use the somewhat slower default memory ordering constraint
2018-03-24 11:02:44 +01:00
f05ec78e08 DI: benchmark Double-Checked-Locking with Mutex
This is essentially the solution we used since start of the Lumiera project.
This solution is not entirely correct in theory, because the assignment to the
instance pointer can be visible prior to releasing the Mutex -- so another thread
might see a partially initialised object
2018-03-24 11:02:44 +01:00
ff256d9e57 DI: benchmark naive lock protected access
...which gives us the dramatic numbers we'd expect.
Especially the multithreaded variant contends drastically
2018-03-24 11:02:43 +01:00
d2dababf5c DI: benchmark dependency-factory with unprotected lazy init
NOT threadsafe.
Indeed, crashed several times during the multithreaded benchmark runs
2018-03-24 08:29:39 +01:00
69f21d96af DI: prepare benchmark of reference cases
_not_ using the dependency factory, rather direct access

 - to a shared object in the enclosing stack frame
 - to a heap allocated existing object accessed through uniqe_ptr
2018-03-24 07:48:59 +01:00
3104016cf2 DI: set up framework for investigation of performance impact
We are about to switch to Double Checked Locking with C++11 atomics,
and we want some rough numbers regarding the Impact
2018-03-23 23:42:10 +01:00
364dcd5291 DI: verify and improve static sanity checks
esp. for subclass instance creation from within a lambda
2018-03-22 21:43:19 +01:00
d9af3abb0f DI: implement creating singleton from arbitrary (user provided) closure/functor/lambda
this is quite an ugly feature, but I couldn't come up with
any convincing argument *not* to implement it (and its low hanging fruit)
2018-03-22 06:53:56 +01:00
e74576f6b0 DI: pass-through arbitrary arguments for initialisation of a ServiceInstance
...this part is a no-brainer.
However, it is not clear yet if we can (and want to) do something similar for deferred (lazy) instance creation
2018-03-22 04:19:33 +01:00
5c39498929 DI: clean-up and document the TDD test
...written as byproduct from the reimplementation draft.

NOTE there is a quite similar test from 2013, DependencyFactory_test
For now I prefer to retain both, since the old one should just continue
to work with minor API adjustments (and thus prove this rewrite is a
drop-in replacement).

On the long run those two tests could be merged eventually...
2018-03-19 05:34:27 +01:00
83476b3ef1 DI: Reworked dependency-factory implementation draft complete -- move into library headers
This is a complete makeover of our lib::Depend and lib::DependencyFactory templates.
While retaining the basic idea, the configuration has been completely rewritten
to favour configuration at the point where a service is provided rather,
than at the point where a dependency is used.

Note: we use differently named headers, so the entire Lumiera
code base still uses the old implementation. Next step will be
to switch the tests (which should be drop-in)
2018-03-19 03:46:49 +01:00
f66d452c56 DI: refurbish internal access for the configuration handles
explicit friendship seems adequate here
DependInject<SRV> becomes more or less a hidden part of Depend<SRV>,
but I prefer to bundle all those quite technical details in a separate
header, and close to the usage
2018-03-19 01:14:52 +01:00
b776ce568f DI: fix inspiring Segfault
a bloody closure that bangs itself away....
2018-03-19 00:44:26 +01:00
f0c8928301 DI: draft implementation for testmock support 2018-03-19 00:05:02 +01:00
786f051132 DI: problem of misconfiguration for service access
This is a tricky problem an an immediate consequence of the dynamic configuration
favoured by this design. We avoid a centralised configuration and thus there
are no automatic rules to enforce consistency. It would thus be possible
to start using a dependency in singleton style, but to switch to service
style later, after the fact.

An attempt was made to prevent such a mismatch by static initialisiation;
basically the presence of any Depend<SRV>::ServiceInstance<X> would disable
any usage of Depend<SRV> in singleton style. However, such a mechanism
was found to be fragile at best. It seems more apropriate just to fail
when establishing a ServiceInstance on a dependency already actively in
use (and to lock usage after destroying the ServiceInstance).

This issue is considered rather an architectural one, which can not be
solved by any mechanism at implementation level ever
2018-03-18 17:19:30 +01:00
5516700523 DI: draft configuration for using a service implementation created elsewhere 2018-03-18 02:11:46 +01:00
9f93154f62 DI: draft configuration for using a subclass Singleton 2018-03-18 01:30:51 +01:00
e1ca9f447b DI: draft syntax for special dependency injection configuration 2018-03-18 00:57:25 +01:00
eebe31aa7e DI: change to heap allocation for singletons
up to now we used placement into a static buffer.
While this approach is somewhat cool, I can't see much practical benefit anymore,
given that we use an elaborate framework which rules out the use of Meyers Singleton.
And given that with C++11 we're able just to use std::unique_ptr to do all work.

Moreover, the intended configurability will become much simpler by relying
on a _closure_ to produce a heap-allocated instance for all cases likewise.

The only possible problem I can see is that critical infrastructure might
rely on failsafe creation of some singleton. Up to now this scenario
remains theoretical however
2018-03-17 23:41:56 +01:00
e393d44e92 DI: replace Meyers Singleton by an explicitly managed buffer
Meyers Singleton is elegant and fast and considered the default solution
However...

 - we want an "instance" pointer that can be rebound and reset,
   and thus we are forced to use an explicit Mutex and an atomic variable.
   And the situation is such that the optimiser can not detect/verify this usage
   and thus generates a spurious additional lock for Meyers Singleton

 - we want the option to destroy our singletons explicitly
 - we need to create an abstracted closure for the ctor invocation
 - we need a compiletime-branch to exclude code generation for invoking
   the ctor of an abstract baseclass or interface

All those points would be somehow manageable, but would counterfeit the
simplicity of Meyers Singleton
2018-03-17 17:30:28 +01:00
261049e04d DI: minimalistic design for service access
Problems:
 - using Meyers Singleton plus a ClassLock;
   This is wasteful, since the compiler will emit additional synchronisation
   and will likely not be able to detect the presence of our explicit locking guard

 - what happens if the Meyers Singleton can not even be instantiated, e.g. for
   an abstract baseclass? We are required to install an explicit subclass configuration
   in that case, but the compiler is not able to see this will happen, when just
   compiling the lib::Depend
2018-03-17 03:36:58 +01:00
28176c58ed DI: drafts towards a new dependency factory design 2018-03-16 03:57:02 +01:00
2bc6b398ea DI: thoughts regarding the design of the dependency configuration 2018-03-15 04:24:03 +01:00
533ed45d8b DI: expand the concept of our dependency factory to handle service instances (#1086)
Most dependencies within Lumiera are singletons and this approach remains adequate.
Singletons are not "EVIL" per se. But in some cases, there is an explicit
lifecycle, managed by some subsystem. E.g. some GUI services are only available
while the GTK event loop is running.

This special case can be integrated transparently into our lib::Depend<TY> front-end,
which defaults to creating a singleton otherwise.
2018-03-11 03:20:21 +01:00
9ca9b1b89a ViewSpec: clarify how the inline DSL spec is transformed into a rule set
several nested repackaging ctor calls here.
In the end, it's an UICoord array, which is moved into heap storage within the rules set
2018-03-05 00:56:43 +01:00
69f87e994c ViewSpec: decide how to cast the types for building the DSL
we'll use a typedef to represent the default case
and provide the level within the UI-Tree as template parameter for the generic case

This avoids wrapping each definition into a builder function, which will be
the same function for 99% of the cases, and it looks rather compact and natural
for the default case, while still retaining genericity.

Another alternative would have been to inject the Tree-level at the invocation;
but doing so feels more like magic for me.
2018-02-24 04:25:41 +01:00
41b8d12b66 ViewSpec: reconsider how to build and structure the DSL (#1126)
...in the light of all the foundation components and frameworks created meanwhile
2018-02-23 05:07:39 +01:00
b6360b2e9c LocationSolver: automatically inject persp(UIC_ELIDED) (closes #1128)
decided to add a very specific preprocessing here, to make the DSL notation more natural.
My guess is that most people won't spot the presence of this tiny bit of magic,
and it would be way more surprising to have rules like

UICoord::currentWindow().panel("viewer").create()

fail in most cases, simply because there is a wildcard on the perspective
and the panel viewer does not (yet) exist. In such a case, we now turn the
perspective into a "existential quantified" wildcard, which is treated as if
the actually existing element was written explicitly into the pattern.
2018-02-17 05:11:34 +01:00
0f26f1e0f4 LocationSolver: Documentation and clean-up (#1127) 2018-02-17 03:45:07 +01:00
da8fd6a031 LocationSolver: use the "elided" marker for realistic create rules
...actually just more test coverage,
the feature is already implemented.

What *could* be done though is to inject that UIC_ELIDED marker
on missing perspective specs in create clauses automatically...
2018-02-16 07:34:48 +01:00
983c490644 LocationSolver: test coverage for existentially quantified elements (#1128)
...and again spotted some really insidious bugs
2018-02-16 06:37:43 +01:00
6665fb68d6 LocationSolver: decide not to implement match based on context (#1130)
This looks like YAGNI, and it would be non trivial to implement.
But since the feature looks important for slick UI behaviour,
I've made a new ticket and leave it for now
2018-02-16 03:24:37 +01:00
f3791297d6 LocationSolver: cover most standard usage situations
with the exception of some special situations,
which require additional features from the engine,
especially binding-on-context

Not sure though if I'll implement these or say YAGNI
2018-02-16 01:59:51 +01:00
60d40a6a6e LocationSolver: concept for standard usage situation test coverage
...using a fixed set of rules this time,
while injecting a different (simulated) UI tree for each testcase
2018-02-14 04:42:19 +01:00
98cab32a08 LocationSolver: several rule match test cases 2018-02-14 03:02:44 +01:00
9249c513a9 LocationSolver: wildcard match test cases 2018-02-13 03:13:53 +01:00
c11e557b45 LocationSolver: smallest possible query test cases
querying on window level (=root level)
2018-02-11 04:36:11 +01:00
820abe2bef LocationSolver: provide DSL notation to write "create clauses" 2018-02-11 04:00:59 +01:00
7a167c4c3a LocationSolver: draft pattern for writing those test cases
...which shows: we also need a DSL mechanism for writing "create clauses"
2018-02-11 02:34:56 +01:00
65a86bc426 LocationSolver: define extensive test coverage to be written (#1127) 2018-02-10 02:03:09 +01:00
6d0e8a35a6 LocationSolver: simple unit test PASS 2018-02-10 00:34:24 +01:00
a1ee7574ef LocationSolver: reorganise and complete the decision logic (#1127) 2018-02-09 23:49:36 +01:00
f8dd3a7030 LocationSolver: draft the success cases for a location solution 2018-02-09 04:10:53 +01:00
66bbf146a6 LocationSolver: implement this additional resolving flavour
coverPartially() now computes coverage solution and moves
that solution into place, while retaining the extraneous, uncovered part
2018-02-09 03:30:45 +01:00
c88a68a2a0 LocationSolver: need yet another flavour of the coordinate resolving mechanism
...this happens when you design a subsystem bottom-up
You build five items just to find out that in fact you need only a sixth item....
2018-02-08 03:00:38 +01:00
6022a8afb1 LocationSolver: draft outline of the solving loop 2018-02-08 02:50:48 +01:00
1238d416fc LocationSolver: draft the DSL syntax for sequential alternatives (#1126)
turns out to be somewhat tricky.
The easy shot would be to use the comma operator,
but I don't like that idea, since in logic programming, comma means "and then".

So I prefer an || operator, similar to short-circuit evaluation of boolean OR

Unfortunately, OR binds stronger than assignment, so we need to trick our way
into a smooth DSL syntax by wrapping into intermediary marker types, and accept
rvalue references only, as additional safeguard to enforce the intended inline
definition syntax typical for DSL usage.
2018-02-07 04:24:33 +01:00
10d2cafba9 LocationSolver: draft entities involved in location solving (#1127)
basically this will be built on top of the path matching / resolving mechanism coded thus far.
but we'll need some additional flags and some DSL magic
2018-02-07 04:03:39 +01:00
136e78d023 DockAccess: decide on next steps towards integration (#1126) 2018-02-01 23:08:43 +01:00
134048949c DockAccess: further planning of the location resolution process 2018-01-25 22:45:05 +01:00
1334dfb00d DockAccess: consider how to access the "location query" service
...which also involves some concept how actually to resolve location specifications
2018-01-15 03:56:28 +01:00
3c32cd5acb UI-top-level: decide upon the relation of ViewLocator and Navigator
...and how the former can rely on the latter, abstracted as LocationQuery
2018-01-15 03:56:28 +01:00
22e823fad5 DockAccess: finish setup of allocation specifications within the DSL 2018-01-15 03:56:23 +01:00
b6961e8f03 DockAccess: better pass functor as const& into partial application
seems to be the most orthogonal way to strip adornments from the SIG type
Moreover, we want to move the functor into the closure, where it will be stored anyay.
From there on, we can pass as const& into the binder (for creating the partially closed functor)
2018-01-13 00:58:08 +01:00
90a5d76fc9 DockAccess: solution how to bind partial application into generic lambda
...as it turned out, the result type was the problem: the lambda we provide
typically does not yield an Allocator, but only its baseclass function<UICoord(UICoord)>

solution: make Allocator a typedef, we don't expect any further functionality
2018-01-13 00:20:01 +01:00
5dea8eea1f DockAccess: draft how the partial application-builder for the DSL might work
...but not yet able to get it to compile.
Problem seems to be the generic lambda, which is itself a template.
Thus we need a way to instantiate that template with the correct arguments
prior to binding it into a std::function

been there, seen that recently (-> TreeExplorer, the Expander had a similar problem)
2018-01-12 05:50:01 +01:00
7385b3f525 DockAccess: pick up planning where I left it last September (#1104)
...this was quite an extensive digression, which basically gave us
a solid foundation for topological addressing and pattern matching
within the "interface space"
2018-01-11 02:48:51 +01:00
7dd69003b5 Navigator: finish path matching resolver for UI coordinates (closes #1107) 2018-01-10 04:42:49 +01:00
2d66293c32 Navigator: test for path extension now basically working as intended 2018-01-09 02:12:00 +01:00
ff24f81d3f Navigator: implement extension by (partial) UI-Coordinate spec
rationale: sometimes (likely this is even the standard case) we do not just
want to "extend", rather we want to extent at very specific levels.

This is easy to implement, based on the existing building blocks for path manipulation
2018-01-09 00:50:54 +01:00
55c196e5a2 Navigator: define test cases for path extension after coverage 2018-01-08 23:49:24 +01:00
d5209bfe1d Navigator: get the anchor() cases to work as intended 2018-01-07 07:20:41 +01:00
0daeb02e4a UI-Coordinates/Navigator: identify misconception in the Builder
the original construction works only as long as we stick to the "classical" Builder syntax,
i.e. use chained calls of the builder functions. But as soon as we just invoke
some builder function for sake of the side-effect on the data within the builder,
this data is destroyed and moved out into the value return type, which unfortunately
is being thrown away right afterwards.

Thus: either make a builder really sideeffect-free, i.e. do each mutation
on a new copy (which is kind of inefficient and counterfeits the whole idea)
or just accept the side-effect and return only a reference.
In this case, we can still return a rvalue-Reference, since at the end
we want to move the product of the build process out into the destination.

This works only due to the C++ concept of sequence points, which ensures
the original object stays alive during the whole evaluation of such a chained
builder expression.

NOTE: the TreeMutator (in namespace lib::diff) also uses a similar Builder construction,
but in *that* case we really build a new product in each step and thus *must*
return a value object, otherwise the reference would already be dangling the
moment we leave the builder function.
2018-01-07 05:26:16 +01:00
837aa81fc5 Navigator: cook up some interesting test cases for anchor mutation
...and yes,
even writing seemingly superfluous test cases will uncover yet another bug
2018-01-07 03:17:15 +01:00
2665ad5bf3 Navigator: supply another mutation operation to make anchorage explicit
...basically just a re-use of existing functionality.
Needs some test coverage though
2018-01-07 02:24:33 +01:00
c88747dc99 Navigator: cover selection from several possible solutions 2018-01-06 04:36:18 +01:00
7434212ecf UI-Coordinates: allow for noexcept move construction 2018-01-06 03:38:52 +01:00
e7ce82d17e Navigator: fix covering of an explicit UI-Coordinate
...especially to make the anchorage explicit
2018-01-06 03:32:42 +01:00
0ea5583b62 Navigator: explicitly reject solutions that did not bind all wildcards
...this makes most of the remaining test cases pass

only a plain anchor is not yet properly interpolated
2018-01-05 03:57:27 +01:00
d9db5f3917 Navigator: further unit tests for boundrary cases
NOTE not working yet; trailing wildcards not rejected
2018-01-05 02:14:22 +01:00
f4648c393f Navigator: unit test simple cases of coverage 2018-01-04 04:52:09 +01:00
2a87a80e33 Navigator: implement interpolation of missing anchor prefix 2018-01-04 03:56:41 +01:00
267c3f69ea Navigator: refactor algo core for improved match check
...also prerequisite to implement matching against window specs
2018-01-04 03:08:08 +01:00
f23b916f03 Navigator: rework and sharpen the API
- the default should be to look for total coverage
- the predicates should reflect the actual state of the path only
- the 'canXXX' predicates test for possible covering mutation
2018-01-03 02:46:12 +01:00
92084d10a1 Navigator: Algo now survives first unit test case... 2018-01-02 17:03:43 +01:00
9d0186a8d6 Navigator: implement core of the matching algo 2018-01-02 14:03:04 +01:00
3598e07c59 Navigator: draft skeletton of the patch matching algo 2018-01-02 00:57:41 +01:00
416d6c7b01 TreeExplorer: delayed expansion implemented and unit test PASS 2018-01-01 18:23:04 +01:00
d2bbe9c61b TreeExplorer: define behaviour of new "delayed expansion" feature
...we need yet another feature to build the path matching for the Navigator
2018-01-01 17:43:49 +01:00
d5ae52e558 UI-Coordinates: design implementation of the patch matching algorithm
...which indicates that we need some additional functionality from TreeExplorer
2017-12-31 21:05:15 +01:00
b8047b3310 Navigator: LocationQuery interface now finished. Demo implementation unit test PASS (closes #1108)
I set out to "discover" what operations we actually need on the LocationQuery
interface, in order to build a "coordinate resolver" on top. It seems like
this set of operations is clear by now.

It comes somewhat as a surprise that this API is so small. This became possible
through the idea of a ''child iterator'' with the additional ability to delve down and
expand one level of children of the current element. Such can be ''implemented''
by relying on techniques similar to the "Monads" from functional programming.

Let's see if this was a good choice. The price to pay is a high level of ''formal precision''
when dealing with the abstraction barrier. We need to stick strictly to the notion of a
''logical path'' into a tree-like topology, and we need to be strong enough never to
give in and indulge with "the concrete, tangible". The concrete reality of a tree
processing algorithm with memory management plus backtracking is just to complex
to be handled mentally. So either stick to the rules or get lost.
2017-12-26 14:58:30 +01:00
798b70f7f4 Navigator: add direct test coverage for child expansion
...et voila, it's broken!!

expansion at Perspective level yields "NIL", while it should yield "perspective-A"
2017-12-26 05:07:35 +01:00
33ea1ebb79 Navigator: work around the clumsy design of IterExplorer (#1125)
yet some more trickery to get around this design problem.
I just do not want to rework IterSource right now, since this will be
a major change and require more careful consideration.

Thus introduce a workaround and mark it as future work

Using this implementation, "child expansion" should now be possible.
But we do not cover this directly in Unit test yet
2017-12-26 04:49:59 +01:00
30a90166fb X-mas: switch demo-Child-Iterator to the new framework
...passes all the existing unit tests!
2017-12-24 23:30:22 +01:00
2ea2d38cb2 Navigator: build iterator front-end based on the new TreeExploer capabilities
...but not yet switched into the main LocationQuery interface,
because that would also break the existing implementation;
recasting this implementation is the next step to do....
2017-12-24 04:48:07 +01:00
d653937465 TreeExplorer: allow to call through an IterSource based API for child-expansion
...which basically allows us to return any suitable implementation
for the child iterator, even to switch the concrete iteration on each level.
We need this flexibility when implementing navigation through a concrete UI
2017-12-24 03:28:40 +01:00
64ba7bf372 TreeExplorer: now able to pick up and wrap an IterSource 2017-12-23 18:32:25 +01:00
147aeb4049 TreeExplorer: draft immediate IterSource adaptor
This is just a temporary solution, until IterSource is properly refactored (#1125)
After that, IterSource is /basically a state core/ and the adaptor will be more or less trivial
2017-12-23 02:29:19 +01:00
95b5786798 Navigator: consider to work around problems with adapting IterSource
- as it stands currently, IterSource has a design problem, (see #1125)
- and due to common problems in C++ with mix-ins and extended super interfaces,
  it is surprisingly tricky to build on an extension of IterSource
- thus the idea is to draft a new solution "in green field"
  by allowing TreeExplorer to adapt IterSource automatically
- the new sholution should be templated on the concrete sub interface
  and ideally even resolve the mix-in-problem by re-linearising the
  inheritance line, i.e. replace WrappedLumieraIter by something
  able to wrap its source, in a similar vein as TreeExplorer does
2017-12-23 01:59:31 +01:00
9f171682ce Navigator: resolve problem with including anonymous namespace
...yet I do not want to move all of the traits over into the
publicly visible lib::iter_explorer namespace -- I'm quite happy
with these traits being clearly marked as local internal details
2017-12-23 00:42:18 +01:00
a459468e3e Navigator: draft how building of the iterator might work
NOTE it just type checks right now,
but since meta programming is functional programming, this means
with >90% probability that it might actually work this way....
2017-12-23 00:24:56 +01:00
77c5573c80 Navigator: draft a navigation helper interface
...which also happens to include sibling and child iteration;
this is an attempt to reconcile the inner contradictions of the design
(we need both absolute flexibility for the type of each child level iterator
 yet we want just a single, generic iterator front-end)
2017-12-22 22:37:39 +01:00
1ca890d1b6 Navigator: decide how specifically to build on top of TreeExplorer
...this was a difficult piece of consideration and analysis.
In the end I've settled down on a compromise solution,
with the potential to be extended into the right direction eventually...
2017-12-22 19:35:36 +01:00
08489b5900 Library: avoid spurious copy in string-join
surprise: the standard for-Loop causes a copy of the iterator.
From a logical POV this is correct, since the iterator is named,
it can not just be moved into the loop construct and be consumed.

Thus: write a plain old-fashioned for loop and consume the damn thing.
So the top-level call into util::join(&&) decides, if we copy or consume
2017-12-17 03:15:18 +01:00
1fdeb08f19 TreeExplorer: finished and unit test PASS
several extensions and convenience features are conceivable,
but I'll postpone all of them for later, when actual need arises

Note especially there is one recurring design challenge, when creating
such a demand-driven tree evaluation: more often than not it turns out
that "downstream" will need some information about the nested tree structure,
even while, on the surfice, it looks as if the evaluation could be working
completely "linearised". Often, such a need arises from diagnostic features,
and sometimes we want to invoke another API, which in turn could benefit
from knowing something about the original tree structure, even if just
abstracted.

I have no real solution for this problem, but implementing this pipeline builder
leads to a pragmatic workaround: since the iterator already exposes a expandChildren(),
it may as well expose a depth() call, even while keeping anything beyond that
opaque. This is not the clean solution you'd like, but it comes without any
overhead and does not really break the abstraction.
2017-12-17 03:02:00 +01:00
7ed1948a89 TreeExplorer: refactor to make depth() reflect the logical expansion depth
...so sad.
The existing implementation was way more elegant,
just it discarded an exahusted parent element right while in expansion,
so effectively the child sequence took its place. Resolved that by
decomposing the iterNext() operation. And to keep it still readable,
I make the invariant of this class explicit and check it (which
caught yet another undsicovered bug. Yay!)
2017-12-16 19:21:22 +01:00
add5046c6e TreeExplorer: maybe pragmatic workaround for the remaining design problem
instead of building a very specific collaboration,
rather just pass the tree depth information over the extended iterator API.
This way, "downstream" clients *can* possibly react on nested scope exploration
2017-12-16 06:18:44 +01:00
53efdf6e2b TreeExplorer: investigate logical contradiction in this design
We get conflicting goals here:
 - either the child expansion happens within the opaque source data
   and is thus abstracted away
 - or the actual algorithm evaluation becomes aware of the tree structure
   and is thus able to work with nested evaluation contexts and a local stack
2017-12-15 00:32:30 +01:00
30775b2b32 TreeExplorer: draft demonstration example for a search algorithm
...build on top of the core features of TreeExplorer
- completely encapsulate and abstract the source data structure
- build an backtracking evaluation based on layered evaluation
  of this abstracted expandable data source

NOTE: test passes compilation, but doesn't work yet
2017-12-14 03:06:19 +01:00
46287dac0e TreeExplorer: Monads are of limited usefulnes
...and there is a point where to stop with the mere technicalities,
and return to a design in accordance with the inner nature of things.

Monads are a mere technology, without explicatory power as a concept or pattern

For that reason
 - discard the second expansion pattern implemented yesterday,
   since it just raises the complexity level for no given reason
 - write a summary of my findings while investigating the abilities
   of Monads during this design excercise.
 - the goal remains to abandon IterExplorer and use the now complete
   IterTreeEplorer in its place. Which also defines roughly the extent
   to wich monadic techniques can be useful for real world applications
2017-12-11 02:21:32 +01:00
4ef1801a6f TreeExplorer: draft how depth-first-to-leafs might be implemented
...it can sensibly only be done within the Expander itself.
Question: is this nice-to-have-feature worth the additional complexity
of essentially loading two quite distinct code paths into a single
implementation object?

As it stands, this looks totally confusing to me...
2017-12-11 02:20:15 +01:00
4d21baea6b Bugfix: rectify a moronic tuple type rebinding introduced with #988
At that time, our home-made Tuple type was replaced by std::tuple,
and then the command framework was extended to also allow command invocation
with arguments packaged as lib::diff::Record<GenNode>

With changeset 0e10ef09ec
A rebinding from std::tuple<ARGS...> to Types<ARGS> was introduced,
but unfortunately this was patched-in on top of the existing Types<ARGS...>
just as a partial specialisation.

Doing it this way is especially silly, since now this rebinding also kicks
in when std::tuple appears as regular payload type within Types<....>

This is what happened here: We have a Lambda taking a std::tuple<int, int>
as argument, yet when extracting the argument type, this rebinding kicks in
and transforms this argument into Types<int, int>
Oh well.
2017-12-11 02:20:15 +01:00
13d32916ee TreeExplorer: implement simple auto-expansion
...just expand children instead of normal iteration;
works out of the box, since expansion itself performs a iteration step.
2017-12-10 00:24:36 +01:00
fd5d44f6ca TreeExplorer: draft next case -- auto-expand children
this leads to either unfolding the full tree depth-first,
or, when expanding eagerly, to delve into each sub-branch down to the leaf nodes

Both patterns should be simple to implement on top of what we've built already...
2017-12-09 19:42:22 +01:00
e242053620 TreeExplorer: document wrapping into IterSource 2017-12-09 18:41:35 +01:00
c7e37c29e6 TreeExplorer / IterSource: document design mismatch (-> Ticket #1125)
IterSource should be refactored to have an iteration control API similar to IterStateWrapper.
This would resolve the need to pass that pos-pointer over the abstraction barrier,
which is the root cause for all the problems and complexities incurred here
2017-12-09 06:24:57 +01:00
d56c2295ae TreeExplorer: fix remaining problem and get the test to pass
...but for now the price is that we need to punch a hole into IterAdapter.
And obviously, this is all way to tangled and complex on implementation level.
2017-12-09 04:30:17 +01:00
f300545232 TreeExplorer: investigate wrong behaviour in test
turns out that -- again -- we miss some kind of refresh after expanding children.
But this case is more tricky; it indicates a design mismatch in IterSource:
we (ab)use the pos-pointer to communicate iteration state. While this might be
a clever trick for iterating a real container, it is more than dangerous when
applied to an opaque source state as in this case. After expanding children,
the pos-pointer still points into the cache buffer of the last transformer.
In fact, we miss an actualisation call, but the IterSource interface does not
support such a call (since it tries to get away with state hidden in the pos pointer)
2017-12-09 03:49:59 +01:00
7f6bfc1e45 TreeExplorer: implement wrapping opaquely into an IterSource 2017-12-09 01:17:50 +01:00
ce1ee71955 TreeExplorer: clarify base initialisation
as it turned out, when "inheriting" ctors, C++14 removes the base classes' copy ctors.
C++17 will rectify that. Thus for now we need to define explicitly that
we'll accept the base for initialising the derived. But we need do so
only on one location, namely the most down in the chain.
2017-12-08 05:32:04 +01:00
aa008d6d4a TreeExplorer: draft my requirements for packaging a TreeExplorer pipeline as IterSource
Since this now requires to import iter-adapter-stl.hpp and iter-source.hpp
at the same time, I decided to drop the convenience imports of the STL adapters
into namespace lib. There is no reason to prefer the IterSource-based adapters
over the iter-adapter-stl.hpp variants of the same functionality.
Thus better always import them explicitly at usage site.


...actual implementation of the planned IterSource packaging is only stubbed.
But I needed to redeclare a lot of ctors, which doesn't seem logical
And I get a bad function invocation from another test case which worked correct beforehand.
2017-12-07 05:48:36 +01:00
9b9dcb2b78 TreeExplorer: add yet another convoluted example
Yay!
...and all of this works flawless right away
2017-12-07 03:11:11 +01:00
160a5e5465 TreeExplorer: cover further flavours of predicate definition 2017-12-07 02:19:19 +01:00
e9e7004a2e TreeExplorer: simple implementation based on eager pulling and an Invariant
lazy pulling would require us to store an additional bool
(the way the FilterIterator from itertools does)
2017-12-07 02:19:14 +01:00
2eacde7f2c TreeExplorer: draft the filter operation
should be low hanging fruit now....
2017-12-06 02:33:32 +01:00
085b304a38 TreeExplorer: finish test coverage of expand+transform 2017-12-06 02:02:22 +01:00
9e9c6c3ec6 TreeExplorer: solve refresh-problem when expanding children
We need a way for higher layers to discard their caching and re-evaluate,
once some expansion layer was invoked to replace the current element with
its (functionally defined) "children" -- otherwise the first child will
remain obscured by what was there beforehand.

Solution is to pass such manipulation calls through the full chain of
decorators, allowing them to refresh themselves when necessary. To achieve
that technially, we add a base layer to absorb any such call passed down
through the whole decorator chain -- since we can not assume that the
parent, the original source core implements those manipualation calls
like expandChildren()
2017-12-06 00:43:43 +01:00
52edf7d930 Refactoring: switch IterStateWrapper to member function based API
Considering the fact that we are bound to introduce yet another iteration control function,
because there is literally no other way to cause a refresh within the IterTreeExplorer-Layers,
it is indicated to reconsider the way how IterStateWrapper attaches to the
iteration control API.

As it turns out, we'll never need an ADL-free function here;
and it seems fully adequate to require all "state core" objects to expose
the API as argument less member function. Because these reflect precisely
the contract of a "state core", so why not have them as member functions.
And as a nice extra, the implementation becomes way more concise in
all the cases refactored with this changeset!

Yet still, we stick to the basic design, *not* relying on virtual functions.
So this is a typical example of a Type Class (or "Concept" in C++ terminology)
2017-12-05 03:28:00 +01:00
81c6136509 TreeExplorer: define interaction between expand and transform-operation
good news: it (almost) works out-of-the-box as expected.

There is only one problem: expandChildren() alters the content of the
data source, yet downstream decorators aren't aware of that fact and
continue to present cached evaluations, until the next iterate() call
is issued. Yet unfortunately this iterate already consumes the first
of the expanded children, which thus gets shadowed by the cached
outcome of parent node already consumed and expanded at that point

See the first example:

"10-8-expand-8-4-2-6-4-2"
should be 6 ^^^
2017-12-04 06:11:08 +01:00
823848db37 TreeExplorer: document arcane special case
...which happens to be supported out of the box,
due to the generic adaptor magic shared with the explore-operation

Exploiting this feature, some functor could even subvert the layering order
2017-12-04 04:34:27 +01:00
ca270028a9 TreeExplorer: transform-operation implemented and covered in test 2017-12-04 04:34:27 +01:00
b5453cc429 TreeExplorer: reimplementation with simpler design
- always layer the TreeExplorer (builder) on top of the stack
- always intersperse an IterableDecorator in between adjacent layers
- consequently...
  * each layer implementation is now a "state core"
  * and the source is now always a Lumiera Iterator

This greatly simplifies all the type rebindings and avoids the
ambiguities in argument converison. Basically now we can always convert
down, and we just need to pick the result type of the bound functor.

Downside is we have now always an adaptation wrapper in between,
but we can assume the compiler is able to optimise such inline
accessors away without overhead.
2017-12-04 04:34:26 +01:00
e58e4553f4 TreeExplorer: make the Core -> Core design work, kind of
...yet this seems like a rather bad idea,
it breeds various problems and requires arcane trickery to make it fly

==> abandon this design
==> always intersperse an IterableDecorator between each pair of Layers
2017-12-04 04:34:24 +01:00
94d5801712 Library: add move-support to ItemWrapper
...especially relevant in the context of TreeExplorer,
where the general understanding is that the "Data Source" (whatever it is)
will be piggy-backed into the pipeline builder, and this wrapping is
conceived as being essentially a no-op.

It is quite possible we'll even start using such pipeline builders
in concert with move-only types. Just consider a UI-navigator state
hooked up with a massive implementation internal pointer tree attached
to all of the major widgets in the UI. Nothing you want to copy in passing by.
2017-12-04 04:26:43 +01:00
1df77cc4ff Library: investigate and fix an insidious problem with move-forwarding (util::join / transformIter)
As it turned out, we had two bugs luring in the code base,
with the happy result of one cancelling out the adverse effects of the other

:-D

 - a mistake in the invocation of the Itertools (transform, filter,...)
   caused them to move and consume any input passed by forwarding, instead
   of consuming only the RValue references.
 - but util::join did an extraneous copy on its data source, meaning that
   in all relevant cases where a *copy* got passed into the Itertools,
   only that spurious temporary was consumed by Bug #1.

(Note that most usages of Itertools rely on RValues anyway, since the whole
point of Itertools is to write concise in-line transformation pipelines...)

*** Added additional testcode to prove util::stringify() behaves correct
    now in all cases.
2017-12-04 04:23:30 +01:00
c65c5f812b Library: put the new type rebinding trait into general use
Obsoletes and replaces the ad-hoc written type rebindings from
iter-adapter and friends. The new scheme is more consistent and does
less magic, which necessitates an additional remove_pointer<IT> within
the iterator adaptors. Rationale is, "pointer" is treated now just as
a primitive type without additional magic or unwrapping, since it is
impossible to tell generically if the pointer or the pointee was
meant to be the "value"
2017-12-02 02:51:51 +01:00
847593f18b Investigation: resolve the mystery and fix the problem
Oh well.
This kept me busy a whole day long -- and someone less stubborn like myself
would probably supect a "compiler bug" or put the blame on the language C++

So to stress this point: the compiler behaved CORRECT

Just SFINAE is dangerous stuff: the metafunction I concieved yesterday requires
a complete type, yet, under rather specific circumstances, when instantiating
mutually dependent templates (in our case lib::diff::Record<GenNode> is a
recursive type), the distinction between "complete" and "incomplete"
becomes blurry, and depends on the processing order. Which gave the
misleading impression as if there was a side-effect where the presence
of one definition changes the meaning of another one used in the same
program. What happened in fact was just that the evaluation order was
changed, causing the metafunction to fail silently, thus picking
another specialisation.
2017-12-02 02:51:51 +01:00
a3a64147c1 TreeExplorer: implementation draft for the transform-operation
attempt to re-use the same traits as much as possible

NOTE: new code not passing compiler yet, but refactored old code
      does, and still passes unit test
2017-11-30 03:52:32 +01:00
09a263431c TreeExplorer: note further functionality to supplement
- add a filter (should be low hanging fruit)
- wrap the result as IterSource
2017-11-28 03:53:38 +01:00
5b86b660ae TreeExplorer: draft functionality of transform-operation 2017-11-28 03:53:09 +01:00
134821ca15 DOC: document some of the language limitations highlighted by this research 2017-11-27 05:39:47 +01:00
d8f7a22123 TreeExplorer: cover all the remaining cases supported for the expansion functor 2017-11-27 05:07:06 +01:00
86856390e1 TreeExplorer: cover expansion using a different result type
here using a lambda with side-effect and returning a reference to
a STL collection with the children, which is managed elsewhere.
2017-11-27 05:07:06 +01:00
6667a51a61 TreeExplorer: cover another use case expand( Val -> iter<Val> )
...which uncovered an error in the test fixture
plus helped to spot the spurious copy when passing the argument to the expand functor

And my GDB crashed when loading the executable, YAY!
so we'll need to coment out some code from now on,
until we're able to switch to a more recent toolchain  (#1118)
2017-11-26 22:35:43 +01:00
9e96ea8323 TreeExplorer: documentation of technicalities 2017-11-25 03:56:44 +01:00
76a11b3730 TreeExplorer: rename and refactor for readability
...while this implementation works now, it is still very complex and intricate.
I am still doubtful this is a good approach, but well, we need to try that route....
2017-11-25 03:54:41 +01:00
bb948bff34 TreeExplorer: working solution to accept generic lambda
but possible only for the iterator -> iterator case

Since we can not "probe" a generic lambda, we get only one shot:
we can try to bind it into a std::function with the assumed signature
2017-11-25 02:16:21 +01:00
8bdd9e7d66 Research: build "anything function-like" trait
...with the sole exception that such a trait can not detect
a templated or overloaded function call operator
2017-11-24 23:48:56 +01:00
2533565f83 Research: probing a generic lambda is not possible
...since all those metaprogramming techniques rely on SFINAE,
but *instantiating* a template means to compile it, which is more
than just substituate a type into the signature

If forming the signature fails -> SFINAE, try next one
If instantiating a template fails -> compile error, abort
2017-11-24 23:48:56 +01:00
01937f9736 Research: possiblity to detect a generic Lambda? 2017-11-24 23:48:56 +01:00
18553f22b2 TreeExplorer: cover both variants of functor signature by unit test (PASS) 2017-11-23 03:29:26 +01:00
c5311a116a TreeExplorer: concept how to generalise the expansion functor
Basically we want to support two distinct cases, just by slightly adapting
the invocation of the expansion functor:

Case-1: classical monadic flatMap:
        the Functor accepts a value yielded by the source iterator
        and builds a new "expaneded" iterator

Case-2: manipulation of opaque implementation state
        the Functor knows internal details of the source iterator
        and thus takes the source iterator as such as argument,
        performs some manipulation and then builds a new sub-iterator

A soulution to reconcile those two distinct cases can be built
with the help of a generic lambda
2017-11-23 03:06:02 +01:00
fd3d6fb60e TreeExplorer: first testcase, build either from Lumiera-Iterator or use StateCore
TODO: also wrap any suitable STL iterable.
we need a one-shot solution here
2017-11-19 02:28:48 +01:00
c3b04af76f TreeExplorer: decide upon the steps towards implementation
Here, the tricky question remains, how to relate this evalutaion scheme
to the well known monadic handling of collections and iterators.

It seems, we can not yet decide upon that question, rather we should
first try to build a concrete implementation of the envisioned algorithm
and then reconsider the question later, to what extent this is "monadic"
2017-11-18 03:00:59 +01:00
782b4f949f TreeExplorer: extended analysis regarding tree expanding and backtracking computation (#1117)
This can be seen as a side track, but the hope is
by relying on some kind of monadic evaluation pattern, we'll be
able to to reconcile the IterExplorer draft from 2012 with the requirement
to keep the implementation of "tree position" entirely opaque.

The latter is mandatory in the use case here, since we must not intermingle
the algorithm to resolve UI-coordinates in any way with the code actually
navigating and accessing GTK widgets. Thus, we're forced to build some kind
of abstraction barrier, and this turns out to be surprisingly difficult.
2017-11-17 21:43:50 +01:00
ca35891c41 Navigator: implement the mutation operations defined thus far
...so the only thing not yet implemented is the actual path resolution algorithm
2017-10-30 03:10:51 +01:00
5530bbede8 Navigator: decide upon the fine points of meaning
anchorage vs. coverage
partial vs total
possible anchorage
possible coverage
2017-10-30 01:47:29 +01:00
4b6b4ad708 LocationQuery: now able to handle perspective info properly
...which was deliberately represented in an asymmetric way, to verify the
design's ability to cope with such implementation intricacies. So basically
we have to kick in at LEVEL == 1 and access the implementation differently.

This exercise just shows again, that treating tree structures recursively
is the way to go, and we should do similar when coding up the query-API
for the real GTK toolkit based window elements...
2017-10-29 16:00:08 +01:00
750b124f88 Library: complement the pseudo-iterator by a IterSource front-end 2017-10-29 15:31:34 +01:00
0682e449a3 Library: a pseudo-iterator to yield just a single value
...which can be helpful when a function usually returns a somewhat dressed-up iterator,
but needs to return a specific fixed value under some circumstances
2017-10-29 14:51:51 +01:00
800407637a LocationQuery: compensate for the special representation of perspective info
this assymetry in representation was introduced deliberately,
to test the design's ability to cope with such complications
2017-10-28 01:12:06 +02:00
c39442a287 LocationQuery: recast syntax for inline structure definitions
this fixes a silly mistake:
obviously we want named sub-nodes, aka. "Attributes",
but we used the anonymous sub-nodes instead, aka. "Children"

Incidentally, this renders the definitions also way more readable;
in fact the strange post-fix naming notation of the original version
was a clear indication of using the system backwards....
2017-10-28 00:17:56 +02:00
16abe82cde LocationQuery: fix a segfault due to ill guided conversion path 2017-10-27 05:12:28 +02:00
240459c550 LocationQuery: implement simple resolution of explicit anchoring by window-ID 2017-10-23 02:16:57 +02:00
2c96fcd164 LocationQuery: draft unit test to cover the query API 2017-10-22 00:44:30 +02:00
fd3777de54 Navigator: draft the trivial resolution case
...based on the abstract LocationQuery interface
2017-10-21 23:47:27 +02:00
0dd516a298 Navigator: consider how to approach path resolution
obviously, we get a trivial case, when the path is explicit,
and we need a tricky full blown resolution with backtracking
when forced to interpolate wildcards to cover a given UICoord
spec against the actual UI topology.

Do we need it?
 * actually not right now
 * but already a complete implementation of the ViewSpec concept
   requires such a resolution
2017-10-21 01:53:13 +02:00
121b13e665 Navigator: analysis indicates to limit mutations
...to limit them to the UI-Coordinates themselves,
while declining the possibility to mutate the target environment
through the PathResolver. Better handle changes within the
target environment by dedicated API calls on the target elements,
instead of creating some kind of "universal structure"
2017-10-16 01:28:49 +02:00
2b1c9370b8 Navigator: analysis continued.... 2017-10-15 00:55:06 +02:00
cbd58662ba Navigator: start investigation of requirements (#1107, #1108, #1109) 2017-10-14 02:15:39 +02:00
322467159f DOC: Considerations and Definitions regarding »Interaction Control«
..this collection of ideas, terms and conclusions has been shaped
since some time within the TiddlyWiki. Since I've now started even
some supporting implementation regarding these concepts, its time
to publish them in the design documentation section of the Website
2017-10-09 04:00:07 +02:00
ed76151d14 UI-Coordinates: value representation finished and unit test PASS (#1106) 2017-10-03 00:57:23 +02:00
18d1e7a280 UI-Coordinates: polish test and consider next steps
After completing the self-contained UICoord data elements,
the next thing to consider might be how to resolve UI coordinates
against an actual window topology. We need to define a suitable
command-and-query interface in order to build and verify this
intricate resolution process separated from the actual UI code.
2017-10-02 18:11:21 +02:00
286b1829fe UI-Coordinates: implement path split and appending of multiple components
Unit test passes thus far
2017-10-02 06:49:50 +02:00
835b964e63 UI-Coordinates: implement append / prepend mutation 2017-10-02 06:45:50 +02:00
5097637f0d UI-Coordinates: basic unit test PASS 2017-10-01 21:54:35 +02:00
ac38f0f963 UI-Coordinates: implement string representation 2017-10-01 21:10:18 +02:00
6322f1bc3c UI-Coordinates: define next steps to cover 2017-10-01 20:04:12 +02:00
9378badf6b UI-Coordinates: integrate the initialisation split
...as developed in during the metaprogramming investigation
2017-09-30 00:46:52 +02:00
e5dc7ba2bc Investigation: dissect argument packs
start investigation on generic techniques to dissect an variadic argument pack
2017-09-26 19:23:03 +02:00
6073dbfcaf UI-Coordinates: stub basic access operations (WIP) 2017-09-24 17:20:47 +02:00
08f70c068c UI-Coordinates: dream up some basic properties (WIP)
ZOMG... who is to code up all this stuff...?
2017-09-24 02:04:23 +02:00
78cbf0f57e UI-Coordinates: define basic design 2017-09-23 17:55:40 +02:00
c1f240687b UI-Coordinates: elaborate and simplify DSL draft (WIP) 2017-09-23 01:21:06 +02:00
ff1b22a889 UI-Coordinates: DSL draft (WIP) 2017-09-15 01:38:11 +02:00
8a36327604 DockAccess: elaborate design of the DSL 2017-09-09 15:21:40 +02:00
b27681ec4f DockAccess: design a configuration DSL 2017-09-08 18:50:39 +02:00
a9797e4a4f DockAccess: analysis continued...
exploring the idea of a configuration DSL.
As a first step, this could be a simple internal DSL,
implemented as a bunch of static functor objects, which are internally bound
and thus implemented by the ViewLocator within InteractionDirector
2017-09-08 03:53:52 +02:00
eb04552c88 DockAccess: some analysis regarding Configuration/Strategy for access to views
...we have to face the problem that we need some generic strategy
for access to component views, which possibly will become customisable.
And the allowed patterns of access are quite different for the various
kind of view we know....
2017-09-04 01:21:53 +02:00
753c895035 DockAccess: consider a generic ID addessing scheme for the UI (#1005)
...based on a selection of Model types and an access strategy
2017-09-03 01:04:00 +02:00
0ad387f5c9 DockAccess: create a ViewLocator service
responsible for access and allocation of component views.
Internally wired to the PanelLocator within the global WindowLocator

This setup settles those nasty qeustions of crosswise top-level access
2017-09-02 19:28:57 +02:00
4f77075d9c DockAccess: integrate a PanelLocator intermediary
...into the WindowLocator
This is to become a low-level query and acess front-end
and will be implemented just by traversing the windowList_
2017-09-02 19:03:00 +02:00
0614ca36ca DockAccess: consider how to access view components. Rename WindowList (#1104)
this starts work on a new UI global topic (#1004)

- coin a new term: "view component"
- distinction between veiw component and Panel
- consider how to locate view components
- WindowList becomes WindowLocator
2017-09-02 18:36:58 +02:00
5b445a2361 InfoBox: extract into dedicated widget 2017-09-02 00:51:06 +02:00
ee67e4914c InfoBox: scroll to the last inserted line reliably
need to use a text mark; we can simplify this task somewhat
by exploiting the fact that the text cursor is a default defined text mark
2017-09-01 01:02:48 +02:00
2d2a549341 InfoBox: add a simple text display widget 2017-09-01 00:28:43 +02:00
a91b444ade InfoBox: draft the next preliminary implementation steps (#1002)
...I need a quick-n-dirty temporary solution,
just to have a place to display some messages in the UI asynchronously
2017-08-31 20:32:49 +02:00
45b3a990f2 DemoGuiRoundtrip: add new dock for UI experiments (#1099)
...after investigating problems related to the management of docking pane contents
2017-08-31 20:15:52 +02:00
526fd3ca16 UI-Dispatch: add generic catch-all error handler
...to ensure no exception can escape at top level of the actions
dispatched asynchronously into the UI event thread
2017-08-25 17:38:51 +02:00
937ad64596 DiffMessage: now uniformly plays the role of MutationMessage (closes #1066) 2017-08-13 07:25:32 +02:00
5ea80f39cb DiffMessage: successfully finish extended integration test
now we're able to inject flocks of Borg into the alpha quadrant by diff message
2017-08-13 07:25:32 +02:00
5fbc4b84bf DiffMessage: switch to moving DiffMessage over the bus
basically the opaque-buffer based MutationMessage implementation is obsoleted now
2017-08-12 17:59:02 +02:00
4a2384e242 DiffMessage: add further convenience ctor for varargs
hey... all my dream constructors became true
2017-08-12 03:00:38 +02:00
88b2260496 DiffMessage: draft test steps to drive refactoring 2017-08-11 15:48:28 +02:00
f6baef16c5 DiffMessage: consider to unite the handling of mutation messages (#1066) 2017-08-11 15:23:33 +02:00
f498f3be1b mark next steps to address
- error handling
 - settle MutationMessage
2017-08-11 02:37:29 +02:00
fd0a011ea4 DiffMessage: bold attempt towards a way to produce diffs (#1066)
actually I do not know much regarding the actual situation when,
within the Builder run, we're able to detect a change and generate
a diff description. However, as a first step, I'll pick IterSrouce
as a base interface and use a "generation context", which is to be
passed by shared-ptr
2017-08-11 00:59:10 +02:00
2344d5b03f UI-top-level: implement external UI-Shutdown-Trigger 2017-08-10 20:58:00 +02:00
805e6047ba UI-Dispatch: document some implementation intricacies 2017-08-10 20:57:59 +02:00
768a07f181 UI-Dispatch: draft the dispatcher invocation 2017-08-10 17:14:44 +02:00
07c9ed15e8 UI-Dispatch: how to integrate into the NotificationService
WIP setup of an empty framework
2017-08-10 16:24:36 +02:00
46fc900980 UI-Dispatch: get the multithreded test to work (#1098)
the (trivial) implementation turned out to be correct as written,
but it was (again) damn challenging to get the mulithreaded chaotic
test fixture and especially the lambda captures to work correct.
2017-08-07 05:19:58 +02:00
87dc04f324 UI-Dispatch: verify consistency of argument data handling 2017-08-05 18:44:25 +02:00
3dea3c0fa0 UI-Dispatch: draft basic interface of a queue helper (#1098) 2017-08-05 17:36:32 +02:00
9b285a95c0 UI-Integration: plan the next steps to drive this topic ahead (#1099, #1098)
- concept for a first preliminary implementation of dispatch into the UI thread
 - define an integration effort to build a complete working communication chain
2017-08-05 17:36:32 +02:00
1e81b8d61a Settle proper activation of the external UI interfaces (#1098)
This change was caused by investigation of UI event loop dispatch;
since the GTK UI is designed to run single threaded, any invocation
from other threads need to be diepatched explicitly.

A possible way to achieve this is to use Glib::Dispatcher, which
in turn requires that the current thread (which is in this case the UI thread)
already holds a Glib::MainContext

This prompted me to create a tight link between the external facade interfaces
of the UI and the event loop itself. What remains to be settled is how
to hand over arguments to the action in the main loop
2017-08-05 17:36:32 +02:00
9cf868c9cd after a long break: find my way back into what has to be done.... 2017-08-03 20:34:42 +02:00
c96845ab65 GTK evolution: abandon Gtk::Main and start event loop directly (closes #1032)
After investigation of current GTK and GIO code, I came to the conclusion
that we do *not* want to rely on the shiny new Gtk::Application, which
provides a lot of additional "convenience" functionality we do neither
need nor want. Most notably, we do not want extended desktop integration
like automatically connecting to D-Bus or exposing application actions
as desktop events.

After stripping away all those optional functions and extensions, it turns
out the basic code to operate the GTK main event loop is quite simple.
This changeset extracts this code from the (deprecated) Gtk::Main and
integrates it directly in Lumiera's UI framework object (UiManager).
2017-05-19 23:42:55 +02:00
f089a34934 UI-Lifecycle: tie UI-Bus and UI-Manager directly to GtkLumiera
this is just a tiny change to make things more othogonal.
Now the unwinding and calls to any GTK / Widget dtors happen *after*
emitting the term signal from UI shutdown. Which means, the other subsystems
are shutting down (in their dedicated threads) as well, thus lowering
the probability of some action still using the UI and triggering an exception
2017-05-19 18:12:58 +02:00
5e172ff6a0 UI-top-level: reactivate the updateActionState function as NOP
as it turned out, the former functionality was deactivated in 2009
with changeset 6151415

The whole concept seems to be unfinished, and needs to be reworked
and integrated with "Views and Perspectives" (whatever that is...)

See also #1097
2017-05-19 17:00:41 +02:00
e59e8d0ab5 UI-top-level: consider how to rework the UI main object (#1067)
Gtk::Main is deprecated, but the new solution, instantiating a
Gtk::Application object does not match our use case, since we handle
all application concerns already and just need a Gtk main loop to run.

Anyway, it became clear that the "main object" will be the new UiManager.
As a first step, I've now moved the (deprecated) Gtk::Main object
down there. Next step (planned) will be to inherit from Gio::Application
and clone some functionality from Gtk::Application
2017-05-03 02:37:48 +02:00
5cb5ad3507 Menu-Actions: just log unimplemented actions for now (closes #1085)
this topic is basically settled by now.
Mostly by delegating to other entites not-yet-implemented :-D
2017-04-23 18:46:58 +02:00
1ccf54fa41 CmdAccess: draft some further command invocations
...which opens more questions than it solves at the moment.
Especially note #1096, the question how to refer to object-IDs
Maybe we need to enable sending EntryIDs via GenNode?

Anyway, the magic spell is broken now: we have a way how to
establish commands and how to issue them from the UI, with full integration
of UI-Bus, layer separation facade, instance management and ProcDispatcher

Looks like a stepping stone
2017-04-17 23:16:57 +02:00
6a80053395 CmdAccess: reworked draft for context-bound commands and resolver expressions 2017-04-17 21:20:51 +02:00
10c2e4b9a9 CmdAccess: rename the front-end to CmdContext to clarify the purpose 2017-04-17 20:00:07 +02:00
82d66cef73 CmdAccess: discard the InvocationTrail concept
after extended analysis, it turned out to be a "placeholder concept"
and introduces an indirection, which can be removed altogether

- simple command invocation happens at gui::model::Tangible
- it is based on the command (definition) ID
- instance management happens automatically and transparently
- the extended case of context-bound commands will be treated later,
  and is entirely self-contained
2017-04-17 18:21:52 +02:00
8c7ac997de CmdAccess: replace existing usages of InvocationTrail 2017-04-17 16:57:09 +02:00
876c1dd1fd Commands: change implementation frame to include the command-ID
while the initial design treated the commands in a strictly top-down manner,
where the ID is known solely to the CommandRegistry, this change and information
duplication became necessary now, since by default we now always enqueue and
dispatch anonymous clone copies from the original command definition (prototype).

This implementation uses the trick to tag this command-ID when a command-hanlde
is activated, which is also the moment when it is tracked in the registry.
2017-04-17 03:09:12 +02:00
410c36d2c3 Commands: change semantics of command instance management (#1089)
in accordance to the design changes concluded yesterday.
 - in the standard cases we now check the global registry first
 - automatically create anonymous clone copy from global commands
 - reorganise code internally to use common tail implementation
2017-04-16 18:27:05 +02:00
67e1032f7d Commands: draft the changes to be done with command instance management
...as consequence to be drawn from the design critique
2017-04-16 02:51:38 +02:00
730f559ab2 CmdAccess: design critique 2017-04-15 23:48:42 +02:00
5f6854621e Command-Cycle: remove the separate 'bang!' message
as it turns out, we can always trigger commands right away,
the moment all arguments are known. Thus it is sufficient to
send a single argument binding message, which allows us to
get rid of a lot or ugly complexities (payload visitor).
2017-04-14 23:45:35 +02:00
35a4e7705b CmdAccess: expand on the DSL draft 2017-04-14 03:22:08 +02:00
08d332c70f CmdAccess: initial draft for a framework and DSL to use commands (#1090) 2017-04-13 18:55:07 +02:00
aecef2a8f4 Commands: refactor integration into SessionCommandService (#1089)
It seems more adequate to push the somewhat intricate mechanics
for the "fall back" onto generic commands down into the implementation
level of CommandInstanceManager. The point is, we know the standard
usage situation is to rely on the instance manager, and thus we want
to avoid redundant table lookups, only to support the rare case of
fallback to global commands. The latter is currently used only from
unit-tests, but might in future also be used by scripts.

Due to thread safety considerations, I have refrained from handing
out a direct reference to the command token sitting in the registry,
even while not doing so incurs a small runtime penalty (accessing
the shared ref-count for creating a copy of the smart-handle).
This is the typical situation where you'd be tempted to sacrifice
sanity for the sake of an imaginary performance benefit, which
in fact is dwarfed by all the machinery of UI-Bus and argument
passing via GenNode.
2017-04-09 19:11:40 +02:00
45f86e42e4 Commands: Instance management integrated in SessionCommandService
but I am not happy with the implementation yet: the maybeGet just
doesn't feel right. Likely it will be a better idea to push that
fallback mechanism generally down into the CommandInstanceManager?
2017-04-09 03:58:38 +02:00
a53032cfc5 Analysis regarding the next step, integration of InstanceManagement into SessionCommand facade 2017-04-09 01:34:18 +02:00
22c1a1d189 Commands: rename some of the planned components for command access
...to make the names more handy
2017-04-08 16:24:36 +02:00
a4527c5e75 Commands: Instance management implementation finished (#1089) 2017-04-08 15:42:51 +02:00
b2dc6a0cb4 Commands: draft test case to clarify command instance identity 2017-04-06 19:58:45 +02:00
d37037fc22 Commands: change policy to disallow duplicate command instances
just by reasoning from the concept, an instance should always correspond
to a single invocation trail. Having several sets of invocation state
compete with each other, means to keep them distinct, otherwise the
implicit state is going to be corrupted
2017-04-06 18:32:01 +02:00
9c21164ae6 Doxygen Fixes (#1062)
This changeset fixes a huge pile of problems, as indicated in the
error log of the Doxygen run after merging all the recent Doxygen improvements

unfortunately, auto-linking does still not work at various places.
There is no clear indication what might be the problem.
Possibly the rather unstable Sqlite support in this Doxygen version
is the cause. Anyway, needs to be investigated further.
2017-04-02 04:22:51 +02:00
32f995f1ce Commands: simple instance management unit test PASS (#1089) 2017-04-01 18:39:53 +02:00
16737eb74c Commands: adjustments due to the change to anonymous instances
this is indeed a change of concept.
A 'command instance' can not be found through the official
Command front-end anymore, since we do not create a registration.
This allows us to avoid decorating command IDs with running counters
2017-04-01 02:56:49 +02:00
97e42f75ee Commands: code up implementation of CommandInstanceManager
interesting new twist: we do not even need to decorate with a running number,
since we'll get away with an anonymous command instance, thanks to Command
being a smart-handle
2017-04-01 02:33:15 +02:00
a91d03b60a Commands: draft usage of CommandInstanceManager (#1089) 2017-04-01 02:33:15 +02:00
95af930a71 Commands: finish CommandSetup helper (#1088)
this is a prerequisite for command instance management:
We have now an (almost) complete framework for writing actual
command definitions in practice, which will be registered automatically.

This could be complemented (future work) by a script in the build process
to regenerate proc/cmd.hpp based on the IDs of those automatic definitions.
2017-03-31 18:30:29 +02:00
e7d24febee Commands: add automatic registration ON_GLOBAL_INIT
...which makes the unit test PASS
2017-03-31 04:36:26 +02:00
b303bcebc0 Commands: complete the test case
verify the commands where indeed defined as given by the lambda
2017-03-31 03:27:26 +02:00
180b1224e7 Commands: implement invocation of enqueued command definitions 2017-03-18 05:28:56 +01:00
b865acf758 Commands: decide about the basic concept how commands are to be defined (#215)
The point in question is how to manage these definitions in practice,
since we're about to create a huge lot of them eventually. The solution
attempted here is heavily inspired by the boost-test framework
2017-03-18 01:55:45 +01:00
c251f9c2a9 Commands: establish location for defining commands 2017-03-17 21:07:12 +01:00
ada40609f5 more planning of command invocation structure 2017-03-17 04:09:44 +01:00
cfe9cc96f6 planning and analysis regarding command invocation 2017-03-15 04:37:06 +01:00
ff42530f25 push on the topic of global action definitions (#1085)
...because this topic serves as a vehicle to elaborate various core concepts
of the UI backbone, especially how to access, bind and invoke Proc-Layer commands
2017-03-14 04:30:02 +01:00
57a336ab49 more planning with respect to UI/Session command access (#1087) 2017-03-11 02:07:52 +01:00
789246fc3a draft a concept for command instantiation (#1070) 2017-03-08 04:25:33 +01:00
2f538f5f95 continue analysis regarding command invocation (#1070)
...turns out to be a nasty subject, now we're able to see
in more concrete detail how this interaction needs to be carried out.
Basically this is a blocker for the top-level, since it is obviously
some service in top-level, which ultimately becomes responsible for
orchestrating this activity
2017-03-05 02:53:04 +01:00
c068779a80 command-invocation: use case analysis 2017-03-03 23:59:22 +01:00
40eba94917 planning: next steps towards command invocation (#1070) 2017-03-03 19:42:53 +01:00
41ea59176c UI-top-level: include global help controller ("wizzard") 2017-03-02 23:49:23 +01:00
8d27585976 Menu-Actions: add stubs to forward session operations to InteractionDirector 2017-03-02 23:08:01 +01:00
02d8744f25 UI-top-level: Considerations regarding control structure (#1085) 2017-03-02 18:01:11 +01:00
198ccff396 UI-top-level: install presentation state recording service (#1081) 2017-02-19 04:46:13 +01:00
cddc5afe41 UI-top-level: establish top-level model and control structure 2017-02-19 02:50:55 +01:00
f1f7b06d90 UI-top-level: introduce new entities for Interaction Control (#979, #1078, #1080)
In fact this also introduces various new concepts and represents
a fundamental decision regarding the organisation of the UI
2017-02-18 02:54:50 +01:00
3e6b2ae51f UI-top-level: rearrange various file locations
"workspace" is no longer the de-facto backbone of the UI,
rather, we got a global context residing in "ctrl"
2017-02-17 21:16:42 +01:00
d3937261ab detailed analyse regarding focus movements 2017-02-16 21:51:53 +01:00
e40c14606e more generic analysis regarding fundamentals of *interaction control* 2017-02-16 04:01:08 +01:00
4d8579e0ee DOC: rename page 2017-02-16 02:33:23 +01:00
5dcbfd0fe2 continue analysis for #1070 2017-02-15 01:41:22 +01:00
e94b294121 UI-top-level: wiring in accordance to the new global context
this pretty much resolves most of the uncertainities:
we now get a set of mutually dependent services, each of which
is aware of each other member's capabilities, but accesses those
only through this partner's API
2017-02-14 03:42:03 +01:00
f8eb640dd7 UI-top-level: decision to form a cohesive top-level context (#1067) 2017-02-14 03:01:19 +01:00
4f302eb81b pondering over the top-level UI structure.... 2017-02-13 01:19:33 +01:00
8a912926ec UI-top-level: integrate and wire the new InteractionDirector 2017-02-11 00:09:20 +01:00
27c8e78cf5 UI-top-level: invent a new backbone entity to link between model and interaction state
After quite some pondering, it occured to me that we both
- need some top-level model::Tangible to correspond to the RootMO in the session
- need some Controller to handle globally relevant actions
- need a way to link action invocation to transient interaction state (like focus)

This leads to the introduction of a new top-level controller, which is better
suited to fill that role than the depreacted model-controller or the demoted window-manager


looks like we're in management business here  ;-)
we chop off heads, slaughter the holy cows and then install -- a new manager
2017-02-10 23:10:17 +01:00
eb42db537f implement opening the initial top level window 2017-02-08 04:08:55 +01:00
02ba010d2c UI-top-level: define the menu bindings by lambda
...allows us to get rid of a lot of sigc boilerplate syntax.
The downside is that the resulting functors are not sigc::trackable.
This seems adequate here, since the whole top-level UI backbone is
maintained by GtkLumiera, and thus ensured to exist as long as the
main GTK event loop is running.

WARNING: beware of creating "wild" background thrads in the UI, without
proper scheduling of any communication via the event loop!
2017-02-02 21:52:22 +01:00
f913f30499 UI-top-level: reshape Actions
start with drilling down unnecessary includes
2017-02-02 20:51:03 +01:00
0f5280a4f0 UI-top-level: draft a concept how to attach actions to the current window (#1069)
This is a very pervasive change and basically turns the whole top-level
of the GTK-UI bottom-up. If this change turns out right, it would likely
solve #1048

WARNING: in parts not implemented, breaks UI
2017-02-01 03:55:20 +01:00
865ee11621 UI-top-level: push down Config access to actual usage site (#1067)
...allows us to get rid of the access key constants and the
accessor functions in GtkLumiera
2017-02-01 03:46:30 +01:00
4e1641f192 sketchy workaround for access to the PlayController (#1072)
...which itself is obsolete and needs to be redesigned from scratch.
For now we create a local instance of this obsolete PlaybackController
in each viewer panel and we use a static accessor function to just some
instance. Which would break if we start playback with multiple viewer
panels. But we can't anyway, since the Player itself is also a broken
leftover from an obsoleted design study from the early days.

so why care...
2017-01-28 01:11:04 +01:00
c09eb3e1ed remove the obsolete Project and Controler from ctor arguments
...this (finally) allows us to get rid of these elements within GtkLumiera.
Our Model will be represented in a quite different way (via UI-Bus).
2017-01-27 23:30:38 +01:00
d49983d4cb identify items which force GtkLumiera to be a singleton
- WindowList (ex WindowManager)
- Project & Controller

the latter ones are defunct and can be replicated down into each
of the old timeline pannel instances. They just serve the purpose
to keep this old code barely functional, so it can be used as reference
for building the new timeline
2017-01-27 22:17:58 +01:00
86d6e11505 demote the WindowManager to be a petty window list (#1964)
the only adequate thing you can do with managers is to demote them.
2017-01-27 20:48:01 +01:00
1cb2567557 Ui-top-level: use a sincle UiManager instance
instead of letting each window create its own "private interface"
2017-01-26 22:02:45 +01:00
43bd5c3f57 further decisions regarting the UI top-level 2017-01-26 20:51:43 +01:00
7a51a0bd18 split functionality according to concerns (#1067)
window handling -> WindowManager
styles, icons, themes  -> UiManager
2017-01-23 01:13:38 +01:00
735563ebc5 Rectify UI top-level -- introduce a global UiManager (#1067)
There seems to be a mismatch in the arrangement of the top-level entities
 * we support multiple windows, yet from reading the code, you'd ge the impression we aren't really aware we have multiple top-level windows
 * the `WindowManager` is the core UI manager, which feels like a mix-up in concerns
 * the `WorkspaceWindow::createUI()` does the global UI initialisation. Again, we have multiple workspace windows.
 * `GtkLumiera::main()` creates a `Model` and a `Controller` in local function scope, but stores the `WindowManager` in an object field.
 * it seems, for that very reason, `GtlLumiera` needed to be a singleton, to allow by-name access to "the" `WindowManager`
 * needless to say, this causes a host of problems when shutting down the UI.

The idea is to introduce a dedicated UiManager, to deal with the central
framework induced concerns solely, and to demote the WindowManager and the
WorkspaceWindows to care only for their local concerns
2017-01-23 00:40:17 +01:00
6baff38beb GuiNotification: actually pass the calls through the interface system 2017-01-20 04:23:00 +01:00
0d5ca55019 GuiNotification: define outline of this service interface 2017-01-20 03:27:32 +01:00
8105be399e GuiNotification: demote this service to be just a BusTerm
in fact it just does not fulfil any of the behavioural properties
of a full-fledged UI-Element. All it needs is an uplink bus connection,
so let's just keep it as that

Sidenote: I've realised today that such a "free standing" BusTerm
without registration in Nexus is a good idea and acceptable solution.
2017-01-20 02:40:38 +01:00
8f2023dea3 Nexus/CoreService: verify shutdown cycle
yes, it's a cycle and indeed quite tricky.
Just verified it (again) with the debugger and saw all
dtor calls happening in the expected order. Also the number
of Nexus registration is sane
2017-01-20 02:23:24 +01:00
06a61773fa Nexus/CoreService: consider handling of bus connections.
Now I've realised that there are two degrees of connectedness.
It is very much possible to have a "free standing" BusTerm, which
only allows to send uplink messages. In fact, this is how CoreService
is implemented, and probably it should also the way how to connect
the GuiNotification service...
2017-01-20 01:54:49 +01:00
2354c53a50 GuiStart / Shutdown: nailed the Heisenbug
Reason was some insideous detail regarding Lambdas:
When a Lambda captures context, a *closure* is created.
And while the Lambda itself is generated code, pretty much
like an anonymous function, the closure depends on the context
that was captured. In our case here, the Lambda used to start
the thread was the problem: it captured the termCallback functor
from the argument of the enclosing function. In fact it did not
help or change anything if we successively package that lambda
into a function objet and store this by value, because the
lambda still refers to the transient function context present
on stack at the moment it was captured.

The solution is to revert back to a bind expression, since this
creates a dedicated storage for the bound function arguments
managed within the bind-functor. This makes us independent
from the call context
2017-01-19 23:41:32 +01:00
22be990631 GuiStart / shutdown: chasing a Heisenbug 2017-01-19 23:08:09 +01:00
4ba8032a60 Nexus/CoreService: fix sanity check on shutdown
...because some Bus connections stem from elements which are
member of CoreService, thus the'll still be connected when the
sanity check in the dtor runs

But even with this fix, we still get a SEGFAULT
2017-01-19 23:08:09 +01:00
aec700f1b1 GuiNotification: connect to UI-Bus by inheriting from Controller
TODO
 - is this actually a sensible idea, from a design viewpoint?
 - in which way to bind GuiNotification for receiving diff messages?
 - Problem with disconnnecting from Nexus on shutdown
2017-01-19 23:08:09 +01:00
2045132d3e SessionCommand: multithreaded stress test PASS (closes #1046)
Writing and debugging such tests is always an interesting challenge...

Fortunately this exercise didn't unveil any problem in the newly written
code, only some insidious problems in the test fixture itself. Which
again highlights the necessity, that each *command instance* needs
to be an independent clone from the original *command prototype*,
since argument binding messages and trigger messages can appear
in arbitrary order.
2017-01-14 08:37:46 +01:00
0b0575050d SessionCommand: second function test PASS 2017-01-13 09:01:05 +01:00
2e9bd78791 consider to extend the command handling protocol on UI-Bus (#1058) 2017-01-09 03:24:17 +01:00
38b908d510 CoreService: simple (and obvious) implementation of command handling (#1046)
disregarding all doubts due to the massive indirection
and deferring the question where command-IDs are actually to be allocated....
2017-01-09 02:32:56 +01:00
cfbbb750f8 considerations regarding the integration of commmand invocations (#1046)
not quite sure how to get the design straight.
Also a bit concerned because we'll get this much indirections;
the approach to send invocations via the UI-Bus needs to prove its viability
2017-01-09 01:22:43 +01:00
c2c6262be6 mark where command handling needs to be integrated (#1046) 2017-01-07 03:18:39 +01:00
c0337abcaf Application: from now on start the »session subsystem« (closes #699) 2017-01-07 02:48:51 +01:00
dd041ff80c Library: thread self recognition implemented and tested (closes #1054) 2017-01-07 01:01:39 +01:00
458fda4058 DispatcherLoop implementation complete (closes #1049)
Did a full review of state and locking logic, seems airtight now.
- command processing itself is unimplemented, we log a TODO message for now
- likewise, builder is not implemented
- need to add the deadlock safeguard #1054
2017-01-05 23:36:42 +01:00
3915e3230e DispatcherLoop: add wake-up notification on state change 2017-01-05 21:40:37 +01:00
f26ef5230c CommandQueue: finish integration into ProcDispatcher
...leaving out the *actual operations* of
- command dispatch
- builder run
2017-01-05 20:43:53 +01:00
1b970cd943 Session-Subsytem(#318): finish review of locking and lifecycle sanity
This subsystem as such can be considered as implemented now,
while several details still wait to be filled in.
2017-01-05 03:38:46 +01:00
77303ad007 Session-Subsystem(#318): investigation of locking sanity (ongoing...)
Found an inconsistency and a deadlock!
See proc-dispatcher.cpp, the lambda embedded into the start() operation!
2017-01-04 01:44:35 +01:00
34686713d4 Proc-Layer: Builder is not a subsystem (anymore)
We found out that it's best to run it single threaded
within the session loop thread. This does not mean the Builder
itself is necessarily single threaded, but the Builder's top level
will block any other session operation, and this is a good thing.
For this reason it makes more sense to have the Builder integrated
as a component into the session subsystem.
2017-01-03 21:10:27 +01:00
b6d5cd1c76 SessionCommandService implemented by delegating to the ProcDispatcher 2016-12-23 23:42:27 +01:00
b3f0605b9b SessionCommand-facade: consider how to expose command invocation
after reading some related code, I am leaning towards a design
to mirror the way command messages are sent over the UI-Bus.

Unfortunately this pretty much abandons the possibility to
invoke these operations from a client written in C or any
other hand made language binding. Which pretty much confirms
my initial reservation towards such an excessively open
and generic interface system.
2016-12-23 07:26:00 +01:00
8bbc0fb97f more clean-up and comments 2016-12-22 19:35:42 +01:00
0d436deb9e clean-up and comments for the implementation finished thus far 2016-12-22 04:04:41 +01:00
96def6b1ba Looper: elaborate implementation
looks doable indeed...
2016-12-22 03:12:14 +01:00
6073df3554 Looper: other (better?) idea how to handle "builder dirty" automatically
...this means to turn Looper into a state machine.
Yet it seems more feasible, since the DispatcherLoop has a nice
checkpoint after each iteration through the while loop, and we'd
keep that whole builder-dirty business completely confined within
the Looper (with a little help of the DispatcherLoop)

Let's see if the state transition logic can actually be implemented
based just on such a checkpoint....?
2016-12-20 03:53:48 +01:00
14e0d65468 Looper: idea how to determine "builder dirty"
...just by offloading that task onto the CommandQueue,
which happens to know when a new command is being scheduled
2016-12-20 03:18:03 +01:00
bae3d4b96f mark a solution how to create a safeguard against deadlock on session shutdown
....if by some weird coincidence, a command dispatched into the session
happens to trigger session shutdown or re-loading, this will cause a deadlock,
since decommissioning of session data structures must wait for the
ProcDispatcher to disable command processing -- and this will obviously
never happen when in a callstack below some command execution!
2016-12-20 02:35:45 +01:00
746866f5fc Looper: draft requirements on logic for triggering the builder 2016-12-16 23:56:53 +01:00
53ed0e9aa3 ProcDispatcher: consider and document the fine points of operational semantics
there are some pitfalls related to timing and state,
especially since some state changes are triggered, but not immediately reached
2016-12-16 23:11:19 +01:00
7b860947b1 ProcDispatcher: skeleton of the processing loop
including a draft of the Looper control component and the
invocation of the object monitor for waiting on condition var
2016-12-15 22:15:20 +01:00
00077d0431 ProcDispatcher: decide on requirements and implementation structure (#1049) 2016-12-15 20:48:35 +01:00
7e65dda771 draft request to halt the dispatcher loop 2016-12-15 06:21:59 +01:00
86f446c197 better control of the shutdown sequence
holding the SessionCommandService in a unique_ptr allows us to
close the Interface reliably *before* the Loop is halted.
2016-12-15 05:54:48 +01:00
1ec883787a DOC: decision about where to home the SessionCommandService
After some consideration, it became clear that this service implementation
is closely tied to the DispatcherLoop -- which will consequently be
responsible to run and expose this service implementation
2016-12-15 05:07:40 +01:00
eb73242113 document decisions regarding session subsystem components and lifecycle
* "session subsystem" == running the ProcDispatcher
* session itself is pulled up on demand by the SessionManager
2016-12-14 05:10:51 +01:00
479f4170c2 implement activated state
need to keep state variables on both levels,
since the session manager (lifecycle) "opens" the session
for external access by starting the dispatcher; it may well happen
thus that the session starts up, while the *session subsystem*
is not(yet) started
2016-12-14 04:57:08 +01:00
a853851447 add complete locking to the ProcDispatcher
on both levels
- the front-end needs locking to ensure consistent state (memory barrier)
- the back-end nees locking to coordinate command processing
2016-12-14 04:18:58 +01:00
1a8408afb5 rework ProcDispatcher to run dispatcher thread as PImpl
note the idea is to have a joinable thread, where deleting
the enclosing object blocks until the thread is finished
2016-12-13 04:34:28 +01:00
014a828c63 next task: implement minimal "Session subsystem" (#318)
mark TODOs in code to make that happen.
Actually, it is not hard to do so, it just requires to combine
all the existing building blocks. When this is done, we can define
the "Session" subsystem as prerequisite for "GUI" in main.cpp

Unless I've made some (copy-n-paste) mistake with defining the facades,
this should be sufficient to pull up "the Session" and automatically
let the Gui-Plugin connect against the SessionCommandService
2016-12-12 03:45:21 +01:00
b6e7caf737 Guistart(#1045): relocate opening of GuiNotification into the CoreServices
up to now this happened from the GuiRunner, which was a rather bad idea
- it can throw and thus interfer with the startup process
- the GuiNotification can not sensibly be *implemented* just backed
  by the GuiRunner. While CoreService offers access to the necessary
  implementation facilities to do so
2016-12-12 01:49:11 +01:00
79800bb6eb workaround for shutdown problems due to circular UI-Bus topology
so the true reason is an inner contradiction in the design
- I want it to be completely self similar
- but the connection to CoreService does not conform
- and I do not want to hard code CoreService into the Nexus classdefinition

So we treat CoreService as uplink für Nexus and Nexus as uplink for CoreService,
with the obvious consequences that we're f**ed at init and shutdown.

And since I want to retain the overall design, I resort to implement
a short circuit detector, which suppresses circular deregistration calls
2016-12-11 01:34:32 +01:00
e75152b29d install and activate UI-Bus in the actual GUI (#1043)
Decision was made to use the CoreService as PImpl to organise
all those technical aspects of running the backbone. Thus,
the Nexus (UI-Bus hub) becomes part of CoreService
2016-12-10 04:01:06 +01:00
562b47166d identify problems with existing UI lifecycle (#1048) 2016-12-10 03:10:34 +01:00
4322c90367 set up dummy-session-connection to implement this scaffolding
...and as first step towards an UI-Session connection:
actually include the Nexus and the CoreService in to ui-bus.cpp
2016-12-10 01:58:58 +01:00
a54990de7c define the plan for some scaffolding to drive the UI-Session connection (#1042)
...following a similar idea as employed when developing the Player-Engine connection
2016-12-10 01:21:08 +01:00
1627edd96f define (preliminary) diff bindings for a MarkerWidget
...problem is, I actually don't know much about what kinds of markers
we'll get, and how we handle them. Thus introducing a marker kind
is just a wild guess, in order to get *any* tangible attribute
2016-12-04 00:29:50 +01:00
c5eff7f4c5 markers can appear at various scopes
need to add them at the respective levels into the structural model
2016-12-03 22:37:41 +01:00
5d077ae5b4 add the necessary widgets to be maintained by the Presenters 2016-12-03 22:01:44 +01:00
9b8fae1a9b (re)consider the problem how to deal with mandatory/optional object fields
this is a tricky problem and a tough decision.
After quite some pondering I choose to enforce mandatory fields
through the ctor, and not to allow myself cheating my way around it
2016-12-03 19:37:52 +01:00
8666daca94 flesh out the buildup of the control hierarchy
TODO
 - define the actual diff bindings
 - find out how to inject the views
2016-12-03 06:22:21 +01:00
f995dd51e2 define creation and control structure of TimelineWidget 2016-12-03 05:42:34 +01:00
14588dbc19 clarify the principles of UI - Core collaboration
it occurred to me that effectively we abandoned the use of
a business facade and proxy model in the UI. The connection
becomes entirely message based now.

To put that into context, the originally intended architecture
never came to life. The UI development stalled before this could
happen; possibly it was also hampered by the "impedance mismatch"
between our intentions in the core and such a classical, model centric
architecture. Joel several times complained that he felt blocked; but
I did not really understand this issue. Only recently, when I came to
adapting the timeline display to GTK-3, I realised the model centric
approach can not possibly work with such an open model as intended
in our case. It would lead to endless cascades of introspection.
2016-12-02 20:07:31 +01:00
3ffd511a76 consider lifecycle and instance management of the timeline 2016-12-02 19:34:38 +01:00
3c976485ba DOC: add some explanations to the drawing from yesterday 2016-12-02 19:14:45 +01:00
d13f42128e DOC: TiddlyWiki has split into "classic" and TiddlyWiki-5
...better add the URL to tiddlywiki.org,
which seems to be the OpenSourceProject

not sure about the intentions of tiddlywiki.com
2016-12-02 19:13:24 +01:00
7c09f55a9a DOC: drawing to show the structure of timeline display 2016-12-02 04:07:46 +01:00
0b1bc6a579 define and document the building blocks of the new timeline UI
these are just empty class files, but writing a basic description
for each made me flesh out a lot of organisational aspects of what
I am about to build now
2016-12-02 01:53:00 +01:00
67beeab25a start with actual rework of the timeline display
draft a concept for timeline layout management
2016-12-01 21:01:45 +01:00
170c505a8a (cont) analysis of timeline display control 2016-11-28 03:41:25 +01:00
f5ea31a533 consider how diff application might interplay with display changes
...it seemed first that we'd might run into a very fundamental problem;
but after some consideration it turns out the interspersed display manager
and the decoupling between model/presenter and widget happens to mitigate
this problem as well.
2016-11-26 04:18:43 +01:00
5badfe211e expand analysis regarding changes of the display structure 2016-11-21 01:37:54 +01:00
b1d0eaad8e expand analysis on the (possible) global structure of timeline display 2016-11-20 23:54:11 +01:00
3757a56ac9 more detailed planning of architecture for clip presentation
...first UML diagram created with Umbrello!
2016-11-20 17:52:21 +01:00
25328865fa a rough solution draft for dealing with the clip presentation problem 2016-11-19 19:42:33 +01:00
e61eb4959e continue analysis regarding clip display 2016-11-19 04:43:45 +01:00
f56b7ed576 DOC: reorganise tiddlers regarding custom widgets and custom drawing
the content of the "GuiTimelineWidgetStructure" tiddler is
actually related to architecture questions related to custom widgets
in general, plus working notes regarding an investigation of the
Gtk::Layout widget.
2016-11-18 05:47:12 +01:00
251fbfc418 first draft planning for clip display in the UI (#1038) 2016-11-18 05:13:17 +01:00
1e642dc805 Inv(#1020): remove debugging output
...done thus far!
2016-11-01 23:44:42 +01:00
1fbade3a67 Inv(#1020): find a reliable way to determine extension of the canvas
bottom line
- seems we need to do that manually
- must wait until in the on_draw() callback
- use Container::foreach() to visit all child widgets
- Layout::set_size()
2016-11-01 23:20:43 +01:00
6fd0045a65 Inv(#1020): adjust curtom drawing for scrolled viewport
this makes the custom drawing stiched to the absolute canvas,
allowing to move around with the help of the scrollbars...
2016-10-30 17:08:41 +01:00
90cc17b733 Inv(#1020): learn how to draw a simple line
here we draw a red diagnoal line behind the embedded widgets.
2016-10-30 02:55:38 +01:00
1255a4fc04 Inv(#1020): framework for custom drawing 2016-10-30 02:15:01 +01:00
ae07329ada Inv(#1020): expand some widgets by text change 2016-10-29 18:17:58 +02:00
1b9a45930b Inv(#1020): control extension of the scrollable area
this uncovers some possible problem in GTK (#1037)
2016-10-29 17:53:52 +02:00
e4bf84657c Inv(#1020): erase arbitrary child widgets 2016-10-29 16:05:37 +02:00
8348696a56 Inv(#1020): add function to align all widgets in a single row
...which allows us to verify consistency of z-order
2016-10-29 15:40:23 +02:00
03a9611608 Inv(#1020): iteration and moving of children 2016-10-29 03:26:07 +02:00
94a0adcb5b Inv(#1020): place widgets irregularily
- partially overlapping
- beyond the scrollable area
2016-10-29 00:51:28 +02:00
e7d284783b Inv(#1020): place widgets on canvas
- randomly
- partially overlapping
- event dispatch works as expected
2016-10-28 17:32:43 +02:00
f3e791d1ac Ticket #1034 : leave note at dlclose() call 2016-10-28 16:54:02 +02:00
dd9f34e93a Inv(#1020): prepare Investigation
- define tasks to be addressed during investigation
- read documentation, identify problematic aspects
- prepare a child widget class to be placed on the canvas
2016-10-27 22:57:46 +02:00
2350998fdb setup layout for experiments (closes #1021) 2016-10-27 04:15:20 +02:00
c8b6e7a699 mark some code smells (#1026) 2016-10-26 18:44:27 +02:00
5981f35650 consider the next steps (#1020) 2016-10-14 20:21:29 +02:00
9f1c57b560 Research: canvas widget in GTK-3 2016-10-13 18:47:20 +02:00
d58f8c853a TreeMutator binding: extend collection binding to support std::map
actually this is a pragmatic extension for some special use cases,
and in general rather discurraged, since it contradicts the
established diff semantics. Yet with some precaution, it should
be possible to transport information via an intermediary ETD

Map -> ETD -> Map
2016-10-03 19:31:59 +02:00
ffcfa7afd4 WIP: draft a concrete TreeMutator binding for MockElm
...this is the first attempt to integrate the Diff-Framework into (mock) UI code.
Right now there is a conceptual problem with the representation of attributes;
I tend to reject idea of binding to an "attribute map"
2016-10-03 01:59:47 +02:00
c8ad698ac4 MutationMessage: limit to treating of gui::model::Tangible
the generic typing to DiffMutatble does not make much sense,
since the desired implementation within gui::ctrl::Nexus
is bound to work on Tangibles only, since that is what
the UI-Bus stores in the routing table
2016-10-02 23:51:45 +02:00
76fc444437 MutationMessage: implementation draft 2016-10-02 22:21:17 +02:00
d2e4f826ed UI-Bus/mutation: expand on draft for mutation message 2016-10-01 23:09:08 +02:00
d87111f703 DOC: MutationMessage 2016-10-01 22:36:52 +02:00
27ba8d5896 UI-Bus/mutation: draft idea for mutation message on UI-Bus 2016-09-30 22:23:55 +02:00
6c3024adcd UI-Bus/mutation: search for ways how to integrate Diff processing 2016-09-30 18:13:04 +02:00
e6223a80b9 UI-Bus/mutation: re-read documentation and code
seems I've mostly forgotten what is built and ready to use
2016-09-08 18:49:27 +02:00
89bfbcab43 merge work on UI-Bus and diff framework to Master
a lot of important work done during Spring and Summer 2016
now mature enough to be considered official
2016-09-05 04:46:12 +02:00
7a29e260e9 tree-diff-language: remove the magic _THIS_ and _CHILD_ construct
at first, this seemed like a good idea, but it caused already
numerous quirks and headache all over the place. And now, with
the intent to switch to the TreeMutator based implementation,
it would be damn hard to retain these features, if at all
possible.

Thus let's ditch those in time and forget about it!
2016-09-05 04:04:02 +02:00
5c0baba2eb finish implementation of GenNode - TreeMutator binding
some minor code clean-up and comments;
the solution dafted yesterday is the way to go.
2016-09-04 20:55:21 +02:00
17f8922775 solution (draft) for the type field problem
unit test PASS

but the resulting code is hard to understand
should refactor it to use a binding class
similar to the other binding cases
2016-09-03 22:34:36 +02:00
8530d50b7c complete unit test definition
...but this uncovers problem with handling of the type field
2016-09-03 21:41:12 +02:00
a73e5ffffe TreeMutator binding: change handling of AFTER(Ref::ATTRIBS)
this is a subtle change in the semantics of the diff language,
actually IMHO a change towards the better. It was prompted by the
desire to integrate diff application onto GenNode-trees into the
implementation framework based on TreeMutator, and do away with
the dedicated implementation.

Now it is a matter of the *selector* to decide if a given layer
is responsible for "attributes". If so, then *all* elements within
this layer count as "attribute" and an after(Ref::ATTRIBS) verb
will fast forward behind *the end of this layer*

Note that the meta token Ref::ATTRIBS is a named GenNode,
and thus trivially responds to isNamed() == true
2016-09-02 18:40:16 +02:00
a01435f367 WIP: outline of a new GenNode binding
...instead of using a hand written implementation,
the idea is to rely on the now implemented building blocks,
with just some custom closures to make it work.
2016-08-31 17:09:32 +02:00
3774960dcc finish and document some loose ends
...with the exception of a GenNode binding, the whole
diff application and binding framework is now built and ready for use
2016-08-29 22:14:03 +02:00
77ada853a2 verify and clean-up implementation diff application through TreeMutator
- esp. verify the proper inclusion of the Selector closure in all Operations
- straighten the implementation of Attribute binding
- clean-up the error checking helpers
2016-08-26 16:29:50 +02:00
22281d7323 deal with a mismatch between diff language and impl situation
- for sake of consistency, diff language requires INS
- but typically, that implementation will be NOP
2016-08-26 02:56:48 +02:00
1b6a87324d implement value assignment through TreeMutator 2016-08-25 18:42:51 +02:00
cc91e5bba6 implement rest of the list diff verbs plus accept-until construct
basically just assembling the ready made building blocks now...
2016-08-25 17:48:40 +02:00
0782dd4922 investigate and confirm the logic underlying the matchSrc, skipSrc and acceptSrc primitives
In Theory, acceptSrc and skipSrc are to operate symmetrically,
with the sole difference that skipSrc does not move anything
into the new content.

BUT, since skipSrc is also used to implement the `skip` verb,
which serves to discard garbage left back by a preceeding `find`,
we cannot touch the data found in the src position without risk
of SEGFAULT. For this reason, there is a dedicated matchSrc operation,
which shall be used to generate the verification step to properly
implement the `del` verb.

I've spent quite some time to verify the logic of predicate evaluation.
It seems to be OK: whenever the SELECTOR applies, then we'll perform
the local match, and then also we'll perform the skipSrc. Otherwise,
we'll delegate both operations likewise to the next lower layer,
without touching anything here.
2016-08-09 23:42:42 +02:00
6e829e3f22 guard applicability by selector predicate
OMG ... this can't possibly work???!
2016-08-07 01:58:26 +02:00
78c9b0835e solution draft for integration of the whole tree diff application machinery
This is the first skeleton to combine all the building blocks,
and it passes compilation, while of course most of the binding
implementation still needs to be filled in...
2016-07-31 00:33:25 +02:00
ed18e1161c WIP: code organisation - double layered architecture 2016-07-31 00:33:19 +02:00
4a2340ca5e solution for access to "tree mutator building closure"
- default recommendation is to implement DiffMutable interface
- ability to pick up similar non-virtual method on target
- for anything else client shall provide free function mutatorBinding(subject)


PERSONAL NOTE: this is the first commit after an extended leave,
where I was in hospital to get an abdominal cancer removed.
Right now it looks like surgery was successful.
2016-07-21 19:29:16 +02:00
5744244f73 considerations how to access the "tree mutator building closure"
this is at the core of the integration problem: how do we expose
the ability of some opaque data structure to create a TreeMutator?

The idea is
 - to use a marker/capability interface
 - to use template specialisation to fabricate an instance of that interface
   based on the given access point to the opaque data structure
2016-06-14 02:33:28 +02:00
61627b26a0 WIP: first attempt to use a TreeMutator based binding
but unfortunately this runs straight into a tough problem,
which I tried to avoid and circumvent all the time:
At some point, we're bound to reveal the concrete type
of the Mutator -- at least to such an extent that we're
able to determine the size of an allocator buffer.

Moreover, by the design chosen thus far, the active
TreeMutator instance (subclass) is assumed to live within
the top-level of a Stack, which means that we need to
place-construct it into that location. Thus, either
we know the type, or we need to move it into place.
2016-06-11 19:40:53 +02:00
115f03b092 draft idea for the next (integration) test
the plan is to put together an integration test
of diff application to opaque data through the TreeMutator,
using the now roughly finished binding primitives.

moreover, the idea is to apply precisely the same diff sequence,
as was used in the detail test (TreeMutatorBinding_test).


NOTE: right now, the existing placehoder code applies this sequence
onto a Rec<GenNode>. This should work already -- and it does,
BUT the result of the third step is wrong. Really have to
investigate this accidental finding, because this highlights
a conceptual mismatch in the handling of mixed scopes.
2016-06-09 02:15:50 +02:00
ef27c09fa2 round-up and document the attribute binding and test 2016-06-09 01:10:52 +02:00
b5ab5df929 supply implementation, basically working already
so this test case is more or less finished,
just needs some more polishing and documentation
2016-06-05 17:26:48 +02:00
1ae3c1991d second round of this test implemented
...which mostly just is either ignoring the
operations or indicating failure on attempt to
'reorder' attributes (which don't have any notion of 'ordering')
2016-06-04 15:08:10 +02:00
76b898b602 amend the design and then implement the two concrete setter/mutator cases
overall, the structure of this implementation is still rather confusing,
yet any alternatives seem even less convincing

- if we want to avoid the delegation to base-class, we'd have
  to duplicate several functions and the combined class would
  handle two distinct concerns.
- any attempt to handle the IDs more "symmetrically" seems to
  create additional problems on one side or the other
2016-06-04 14:20:59 +02:00
ee99c405fd Reorganise implementation into base class + overlay
...as preparation for implementing the two flavours of
binding attributes either via  a setter lambda or via
creation of a nested mutator.
2016-05-29 03:01:27 +02:00
e5bbcb27d8 identify attributes through an EntryID (including type hash)
this also supersedes and removes the initial implementation
draft for attribute binding with the 'setAttribute' API
The elementary part of diff application incl. setting
new attribute values works by now.
2016-05-28 03:41:03 +02:00
201b6542f2 API change to allow to detect missing attribute binding
The way we build this attribute binding, there is no single
entity to handle all attribute bindings. Thus the only way
to detect a missing binding is when none of the binding layers
was able to handle a given INS verb
2016-05-28 01:17:45 +02:00
34f6d38919 WIP: implant outline of the implementation
...again by overriding all TreeMutator operations
2016-05-27 02:08:29 +02:00
b4c91fd968 start next tree mutator test case: settle outline of the implementation
the idea is again to perform the same sequence of primitives,
this time with a binding to some local variables within the test function
here to enact the role of "object fields"

together with drafting the first segment of the test code,
I've settled down onto an implementation approach
2016-05-26 04:05:37 +02:00
dcad50ef1b test diff: codify and document the diff sequence
the plan is to use this specific diff sequence
both in the individual binding tests, and in a
more high level integration test. Hopefully this
helps to make these quite technical tests more readable
2016-05-26 01:56:13 +02:00
b47b4c3f94 flip logic of emptySrc -> hasSrc
..as concluded from the preceding analysis.
NOTE this entails a semantical change, since this
predicate is now only meant to be indicative, not conclusive

remarks: the actual implementation of the diff application process
as bound via the TreeMutator remains yet to be written...
2016-05-24 21:34:08 +02:00
f72e50bd3c Analysis finished: decision regarding support of optional fields 2016-05-24 20:51:11 +02:00
021db98b98 Analysis contd.: even defaultable fields turn out to be problematic
not sure if we're able to maintain the simple line
other than mentioning every field explicitly right away
2016-05-21 19:06:13 +02:00
72f9b4edb1 Analysis continued: inner contradictions of object field vs attribute
...after re-reading my own documentation, it occured to me that
we need to draw a border line and thus decide, what not to support
2016-05-21 17:55:48 +02:00
d3869d2280 Design/Analysis: Attribute TreeMutator binding
how can ordinary object fields be treated as "Attributes"
and thus tied into the Diff framework defined thus far.
This turns out to be really tricky, even questionable
2016-04-30 00:26:19 +02:00
7467e6da2a extend test to cover nested mutation of another disjoint sub-scope
which also verifies the object ownership and lifecycle handling
of the opaque buffer used to place the nested mutator.
2016-04-18 01:41:41 +02:00
835c43027d add support for Ref::THIS (questionable, #996)
while simple to add into the implementation, this whole feature
seems rather qestionable to me now, thus I've added a Ticket
to be revisited later.

In a nutshell, right here, when implementing the binding layer
for STL collections, it is easy to enable the framework to treat
Ref::THIS properly, but the *actual implementation* will necessarily
be offloaded onto each and every concrete binding implementation.
Thus client code would have to add support for an rather obscure
shortcut within the Diff language. The only way to avoid this
would be to change the semantics of the "match"-lambda: if this
binding would rather be a back-translation of implementation data
into GenNode::ID values, then we'd be able to implement Ref::THIS
natively. But such an approach looks like a way inferiour deisgn
to me; having delegated the meaning of a "match" to the client
seems like an asset, since it is both natural and opens a lot
of flexibility, without adding complexity.

For that reason I tend to avoid that shortcut now, in the hope
to be able to drop it entirely from the language
2016-04-18 01:21:38 +02:00
69c63045e6 DOC: constituting elements of the TreeMutator
write down a first draft for a definiton section,
to describe the fundamental parts involved, when
applying a diff message onto implementation defined
data structures

After a break of tree weeks, I found it difficult to find may way
amidst all those various levels of abstraction. In addition to this
definition, we'll probably also need a high level overview of the
whole diff system operation.
2016-04-17 03:53:10 +02:00
8167fbff77 implement fast-forward and assignment to value
...all of this implementation boils down to slightly adjusting
the code written for the test-mutation-target. Insofar it pays off now
having implemented this diagnostic and demonstration first.

Moreover I'm implementing this basic scheme of "diff application"
roughly the fourth time, thus things kindof fall into place now.
What's really hard is all those layers of abstraction in between.

Lesson learned (after being off for three weeks, due to LAC and
other obligations): I really need to document the meaning of the
closures, and I need to document the "abstract operational semantics"
of diff application, otherwise no one will be able to provide
the correct closures.
2016-04-17 01:07:07 +02:00
7f42b9b7e7 draft third round of mutation operations to be implemented
...now about opening a sub mutator within a nested scope
2016-04-16 02:20:23 +02:00
54fb335a9c allow to "peek" into an embedded Record's type field
while I still keep my stance not to allow reflection and
switch-on-type, access to the internal / semantic type of
an embedded record seems a valid compromise to allow
to deal with collections of object-like children
of mixed kind.

Indirectly (and quite intentional) this also opens a loophole
to detect if a given GenNode might constitute a nested scope,
but with the for the actual nested element indeed to cary
a type symbol. Effectively this limits the use of this shortcut
to situations where the handling context does have some pre-established
knowledge about what types *might* be expected. This is precisely
the kind of constraint I intend to uphold: I do not want the
false notion of "total flexibility", as is conveyed by introspection.
2016-04-16 00:48:15 +02:00
e18d973a96 pick up the design work where I left before my trip to LAC Berlin 2016-04-16 00:18:09 +02:00
fb1857423e implement mutation start and lifecycle
the whole implementation will very much be based on
my experiences with the TestMutationTarget and TestWireTap.
Insofar it was a good idea to implement this test dummy first,
as a prototype. Basically what emerges here is a standard pattern
how to implement a tree mutator:

- the TreeMutator will be a one-way-off "throwaway" object.
- its lifecylce starts with sucking away the previous contents
- consuming the diff moves contents back in place
- thus the mutator always attaches onto a target by reference
  and needs the ability to manipulate the target
2016-03-25 20:46:48 +01:00
e698a3800b verify signatures of binding lambdas
the collection binding can be configured with various
lambdas to supply the basic building blocks of the generated binding.

Since we allow picking up basically anything (functors,
function pointers, function objects, lamdas), and since
we speculate on inlining optimisation of lambdas, we can not
enforce a specific signature in the builder functions.

But at least we can static_assert on the effective signature
at the point where we're generating the actual binding configuration
2016-03-25 02:51:56 +01:00
2098e69981 move metafunction to GenNode
because this is something of wider usage potential.
It allows us to detect if a type in question can be
placed within a GenNode
2016-03-24 21:32:56 +01:00
4a0ad73ade WIP: verify and confirm design
re-evaluated the decision to build on lambdas, not virtual functions:
- it leads for sure to clearer code at the usag site
- it /might/ offer better, but certainly not worse potential for compiler optimisation
2016-03-24 17:33:24 +01:00
1b24453f5b set up the full builder definition chain 2016-03-18 19:35:48 +01:00
5579e9c86f draft a way to configure the binding to a STL collection
this is the most relevant binding layer for TreeMutator,
enabling to transform and mutate child elements managed
within a STL collection.
2016-03-18 00:31:04 +01:00
67054aa06c design the properties of the selector within TreeMutator
...and write down some insights about the architecure
and design of tree binding and tree description related
to the TreeMutator.

When reading my notes from last year, it became clear
to me that the design of the TreeMutator has evolved
significantly, and became quite something different
than I'd imagined at start
2016-03-16 04:49:29 +01:00
6404106f1a what's next... 2016-03-16 03:40:34 +01:00
75a6b4c05d specify and stub the test thus far to complete API design
now the full API for the "mutation primitives" is shaped.
Of course the actual implementation is missing, but that
should be low hanging fuit by now.

What still requires some thinking though is how to implement
the selector, so we'll actually get a onion shaped decorator
2016-03-06 03:55:31 +01:00
d2e7e1e06d idea how to crack the (daunting) problem regarding mutator storage
basically we'll establish a collaboration where both sides
know only the interface (contract) of the partner; a safe margin
for allocation size has to be established through metaprogramming (TODO)
2016-03-06 02:26:42 +01:00
7b73aa6950 add some further checks and coverage to the test
...basically we've now the list mutation primitives working,
albeit in a test/dummy implementation only. Next steps will
be to integrate the assignment and sub scope primitives,
and then to re-do the same implementation respectively
for the case of mutating a standard collection of arbitrary type
2016-03-04 23:56:53 +01:00
7d63167276 WIP: define usage of the reordering part of the mutation primitives
...this kind of settles the problem with the "opaque" position
2016-03-04 20:55:52 +01:00
af50e84737 first partial implementation unit test PASS
that is, the dummy/diagnostic-implementation
of the first "mutation primitive", namely injectNew(elm)
2016-03-04 00:25:36 +01:00
d8fe9bce94 baseline of test-dummy implementation or a mutation target binding
- we're using the source / target buffer paradigm to implement the mutation
 - we're using Record<string> to account for "the current content"
2016-03-03 23:11:36 +01:00
48f519e785 align naming of mutation primitives
...convinced myself to retain an uniform naming scheme,
even while the implementation spans several onion-like layers
2016-03-03 22:02:01 +01:00
8bcd37df0a stub first round of mutation primitives to pass compiler again
now this feels like making progress again,
even when just writing stubs ;-)

Moreover, it became clear that the "typing" of typed child collections
will always be ad hoc, and thus needs to be ensured on a case by case
base. As a consequence, all mutation primitives must carry the
necessary information for the internal selector to decide if this
primitive is applicable to a given decorator layer. Because
otherwise it is not possible to uphold the concept of a single,
abstracted "source position", where in fact each typed sub-collection
of children (and thus each "onion layer" in the decorator chain)
maintains its own private position
2016-02-27 01:47:33 +01:00
5d230aa7ac WIP: start defining the inner API systematically
...trying to get ahead step by step
2016-02-27 00:18:06 +01:00
bdf48e1b7b WIP: desperate attempt to get out of the design deadlock
Arrrrgh.
I go round in circles since hours now.
Whatever I attempt, it again relies on
yet further unsecured suppositions
2016-02-26 22:57:49 +01:00
a10db41d91 WIP: shaping a solution approach 2016-02-26 17:50:44 +01:00
49d451b134 WIP: reflection about the situation
where we are, what the essential problems are,
if we're doomed, and what can be done about that
2016-02-25 21:04:59 +01:00
2a037f49ee WIP: daft top layer of generic diff applicator
BUT the daunting question is how to deal with
the allocation of recursive mutator objects
2016-02-21 00:49:13 +01:00
dd1afef970 WIP: consider what kind of changes to support and how
especially the nagging question is:
- do we need to support children of mixed type
- and how can we support those, wihtout massively indirected calls
2016-02-20 00:19:01 +01:00
afbba968b5 WIP: decide how to target the task of mutating "unspecific" data structures 2016-02-19 20:25:30 +01:00
d22cc18c13 introduce a value assignment verb into the tree-diff-language
after sleeping one night over the problem, this seems to be
the most natural solution, since the possibility of assignment
naturally arises from the fact that, for tree diff, we have
to distinguish between the *identity* of an element node and
its payload (which could be recursive). Thus, IFF the payoad
is an assignable value, why not allow to assign it. Doing so
elegnatly solves the problem with assignment of attributes

Signed-off-by: Ichthyostega <prg@ichthyostega.de>
2016-02-19 17:22:41 +01:00
40b69e1fd2 planning: consider implications of tree-diff application to arbitrary data structures 2016-02-19 16:34:32 +01:00
c0ee98d73d planning: find out what the next steps would be like
...we want to attack the structural mutaion, finally
2016-02-17 01:38:04 +01:00
d7d90bf491 Element protocol: broadcast of state reset messages unit test PASS
This basically finishes definition of the fundamental
UI-Element and Bus protocol -- with one notable exception:
how to mutate elements by diff.

This will be the next topic to address
2016-02-14 05:03:08 +01:00
358fd84c71 write down the understanding about presentation state gained thus far 2016-02-13 22:55:58 +01:00
26d0f50e47 state mark handling within the base element: unit test PASS
...and I made the decision *not* to consider any kind of
generic properties for now. YAGNI.

UI coding is notorious spaghetti code.
No point in fighting that, it is just the way it is,
because somewhere you're bound to get concrete, hands-on.
2016-02-13 22:55:58 +01:00
44785859ea convenience shortcut to simplify command invocation via Bus 2016-02-13 22:55:57 +01:00
dfc28ca2a0 UI-Bus command handling protocol unit test PASS
still TODO: the ability to use immutable types
within the command framework. In theory, this
shouldn't be had to implement, since we're creating
a new opaque value holder within the command registry
anyway, so it should be sufficient to refrain from
re-assigning a new value tuple. This is relevant,
since e.g. our time framework is built on immutable
value types.
2016-02-06 01:28:39 +01:00
1cbebb1fab research: investigate narrowing conversion problem
as it turns out, this is a Bug in GCC 4.9 (resolved in 5.x)
See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63723

Problem is, GCC emits a warning on narrowing conversions,
while the standard actually disallows them when building
objects from brace-enclosed initialisers.

Unfortunately GCC also emits such a warning from within
a SFINAE context, instead of letting those spurious dangerous
cases fail. So we end up with additional visitor double dispatch
paths, and a lot of additional warnings.

Temporary solution is to hack a custom trait, which
explicitly declares some conversions paths as "narrowing".
Probably this can be implemented in a way more intelligent
way (using std::numeric_limits), but this doesn't seem
worth the effort, since the problem will go away through
compiler evolution eventually.
2016-01-24 13:44:12 +01:00
f4bcdcf4e8 research: full solution, including double-dispatch converter stack
now we're able to construct suitable parameter values from the
arguments passed embedded in the GenNodes, as is demonstrated with the
EntryID<long> constructed from an ID-string. We really need a full-blown
double-dispatch, since the content type of the concrete GenNode is only
known at runtime (encoded in the RTTI)

There is still the problem with generating some spurions additional
conversion pathes, some of which are narrowing (and thus dangerous).
The copiler emits several warnings here, and all of them are justified.

E.g. it would be possible to pass an int64_t in the GenNode and initialise
a short from it. This might be convenient at times, but I tend rather to
be prohibitive here and thus consider to built in distinct limitations
on the allowed conversions.
2016-01-24 00:15:19 +01:00
a95103eb3b research: define new metaprogramming task
need to bridge between generic typing of tuples
and the DOM-like typing of UI-Bus messages
2016-01-23 11:57:19 +01:00
fd2d56ca45 refactoring(#988): switch function-closure to std::tuple
not sure yet if any of this works, because the
technicalities of dealing with variadic types are
quite different to our LISP-style typelist processing.

The good news is that with variadic templates it is
indeed possible, to supply dynamically picked arguments
to another function taking arbitrary arguments.

This all relies on the feature to unpack argument packs,
and, more specifically, about the possiblity to "wrap"
this unpacking around interspersed function call syntax

template<size_t...i>
Xyz
do_something(MyTuple myTuple)
  {
    return Xyz (std::get<i> (myTuple) ... );
  }

Here the '...' will be applied to the i... and then
the whole std::get-construct will be wrapped around
each element. Mind bogging, but very powerful
2016-01-19 03:56:53 +01:00
a5ca8ed3b1 ...and back to #975 : draft command invocation on UI elements
First part is to define the steps (the protocol) at the
model element level, which gets a command prepared and invoked.

Test fails still, because there is no actual argument binding
invoked in the TestNexus
2016-01-12 02:14:06 +01:00
2e4d74747e implement logging overrides in the Test-Nexus implementation
the actual functionality is forwareded to the base class,
which is the regular Nexus Hub
2016-01-02 19:16:37 +01:00
dddcbe9994 DOC: supply basics of UI-Bus and generic UI-element protocol
the initial draft of this concept is in place now, and
the first round of unit tests pass. I've got some understanding
of the purpose of the interactions and involved elements
and I'm confident this design is evolving in a sane way.

Note: extensive documentation is in the TiddlyWiki,
here I've just pasted and reworded some paragraphs from there
and integrated them into the Doxygen docs
2015-12-27 01:58:15 +01:00
b9ef66b221 provide and cover a mock implementation of receiving notification messages 2015-12-26 04:40:38 +01:00
9aa1fec369 UI-Element protocol: clarify the role of the doExpand() extension point
and let the concrete extension point decide if the corresponding
state change was actually relevant and should be persisted
2015-12-26 00:59:16 +01:00
449fa16444 WIP: draft of the UI backbone setup
- front-end handle
- Nexus == routing hub
- CoreService == service access point for command invocation
2015-12-19 03:40:19 +01:00
0f793e0a79 untangle the setup of test nexus 2015-12-18 19:50:57 +01:00
af98d75da4 consider the bus side of the generic UI base in more detail
especially define the outline of the bus communication
and connection management
2015-12-18 01:02:19 +01:00
a9a6aabcbc return to topic: UI element protocol
next step will be to rig the mock element and set up
and cover the basic / generic element behaviour

This changeset
 - adapts the (planned) unit test to the semantic of
   the EventLog, which is now fully implemented

 - adjusts the function names on the public Tangible interface,
   to be better in line with the naming convention of the
   corrsponding operations on the UI-Bus:

   * "mark" operations are towards the UI element
   * "note" messages are from the UI element towards some
     state manager, which can be reached via the bus
2015-12-16 02:16:53 +01:00
2704ad4512 decide upon the actual mechanics of command binding and invocation 2015-11-28 08:15:32 +01:00
42cec6d604 decision to follow the generic approach (#978, #979) 2015-11-28 05:51:53 +01:00
7b16c6b130 fundamental concerns regarding command binding
prompted by first attempt to define the Tangible interface...
ZOMG! And I thought I might be able just to code-up that stuff
2015-11-28 01:20:40 +01:00
25805635ff WIP: test-driven brainstorming -- a framework for event log verification
this is a recipe for writing UI related tests
2015-11-27 02:38:23 +01:00
bb627fc1f8 draft of the UI-Bus communication structure
what you see here now is just the tip of the icebearg...
If we follow this route, the Lumiera UI will become way more
elaborate and responsive than average desktop applications
2015-11-26 21:10:38 +01:00
16c01ab2bd planning the fundamentals of UI-Bus communication 2015-11-25 00:20:56 +01:00
decaa143fb recherche: library for JSON parsing
looked at
 - boost property_tree
 - boost spirit
 - JSON-C
 - JsonCpp
 - rapidjson
 - vjson / gason

the results where quite obvious: --> rapidjson

Rationale: we do not want yet another object system;
rapidjson has an SAX-style API (and additionally an DOM API
if needed). And it is fast, supports in-situ parsing,
extended Unicode support, full JSON support and
an exchangable allocator.

License is MIT
2015-11-24 00:41:38 +01:00
d305254837 planning generic UI element behaviour 2015-11-21 05:10:36 +01:00
6a0b9980e3 After a looong break.... start reading code
wtf was I doing before that damn release and packaing business
2015-11-21 03:39:07 +01:00
60b6267eac DOC: after release 0.pre.03 -- checklist with steps for release preparation 2015-11-20 06:12:59 +01:00
96a4704738 DOC: some problems when building with GCC-5 2015-11-20 05:34:11 +01:00
313eeba70a post-release: Merge hotfixes from release branch 2015-11-15 07:05:13 +01:00
e856283c48 build on Mint 2015-11-05 03:30:46 +01:00
8a707f3a41 post-release: tighten library dependencies
NOTE: we have the policy to always support current Debian/stable
amd at least one Ubuntu LTS release, unless hard dependency problems prevent that.
Currently, Ubuntu/Trusty is already a bit dated, but the only problematic dependency
could be libboost (1.54 in Trusty, 1.55 in Jessie).
GCC-4.8 can be replaced by GCC-4.9 in Trusty without problems

It is always a bit tricky to find out the precise lower boundary,
so we try to upgrade these requirements as our platform progresses.
For now we have used the level available on Ubuntu/Trusty to set
the lower constraints for most libraries
2015-11-03 03:39:00 +01:00
3248741db1 upgrade current release to 0.pre.03 2015-11-02 22:25:54 +01:00
03eb0ff8f1 Pre-release 0.pre.03
This is a development snaphot pre release of Lumiera.
It features codebase maintenance, upgrade to C++14 and GTK-3
and some work towards a Proc-GUI connection (unfinished)

Update README, AUTHORS, LICENSE and similar release docs.
2015-11-02 22:19:26 +01:00
12cefe914e release prep: clean-up obsolete information 2015-11-02 21:14:24 +01:00
4a3b077824 Bugfix: find verb should check for ID match
because otherwise we'd need to send a whole subtree
over the wire and then descend into it just to find an element.

This too is a ripple effect of making '==' deep
2015-11-01 23:11:55 +01:00
34d79ee8df tree-diff-application: unit test PASS
well... this was quite a piece of work
Added some documentation, but a complete documentation,
preferably to the website, would be desirable, as would
be a more complete test covering the negative corner cases
2015-11-01 07:03:47 +01:00
c94bbcbb15 extend storage arrangement to deal with nested child objects
It is difficult to reconcile our general architecture for the
linearised diff representation with the processing of recursive,
tree-like data structures. The natural and most clean way to
deal with trees is to use recursion, i.e. the processor stack.
But in our case, this means we'd have to peek into the next
token of the language and then forward the diff iterator
into a recursive call on the nested scope. Essentially, this
breaks the separation between receiving a token sequence and
interpretation for a concrete target data structure.

For this reason, it is preferrable to make the stack an
internal state of the concrete interpreter. The downside of
this approach is the quite confusing data storage management;
we try to make the role of the storage elements a bit more
clear through descriptive accessor functions.
2015-10-30 03:11:33 +01:00
4356315021 diff-language interpreter: prefer to take payload by const&
each language token of our "linearised diff representation"
carries a payload data element, which typically is the piece
of data to be altered (added, mutated, etc).

Basically, these elements have value semantics and are
"sent over wire", and thus it seems natural when the
language interpreter functions accept that piece of payload
by-value. But since we're now sending GenNode elements as
parameter data in our diff, which typically are of the
size of 10 data elements (640 bit on a 64bit machine),
it seems more resonable to pass these argument elements
by const& through the interpreter function. This still
means we can (and will indeed) copy the mutated data
values when applying the diff, but we're able to
relay the data more efficiently to the point where
it's consumed.
2015-10-24 02:42:13 +02:00
e438a9fe51 chosing an implementation approach for tree-diff-application 2015-10-23 19:24:34 +02:00
c90e6a6f65 on second thought: yet a better solution
...is to let the diff applicator work *on* a Rec::Mutator
This is outright natural -- why is it that I needed 2 days
to come up with this solution?
2015-10-23 01:32:47 +02:00
eabeee3b7b decide on the implementation approach for tree diff application
this boils down to the two alternatives
 - manipulate the target data structure
 - build an altered copy

since our goal is to handle large tree structures efficiently,
the decision was cast in favour of data manipulation
2015-10-23 00:40:02 +02:00
2704b38da6 WIP rework demonstration diff to be valid type-wise
so basically it's time to explicate the way
our diff language will actually be written.

Similar to the list diff case, it's a linear sequence
of verb tokens, but in this case, the payload value
in each token is a GenNode. This is the very reason
why GenNode was conceived as value object with an
opaque DataCap payload
2015-10-09 03:03:27 +02:00
6ecd24a0a0 Design: pick up the task of defining a Tree Diff Language 2015-10-02 02:49:15 +02:00
0d10e62851 WIP: draft a monad-like scope expanding iterator implementation
Initially I intended just to supply an addapter to use
the monadic IterExplorer for this recursive expansion
of GenNode contents. Investigating this approach was
relevant to highlight the minimum requirements for
such an evaluation mechanics: since our GenNode
is an hierarchical structure without back-links,
we are bound to use a stack at some point. And
since an Iterator is a materialised continuation,
we can not use the processor stack and are forced
to represent this stack in memory.

Yet, on second thought, we do not need the full power
of the IterExplorer monad; especially we do not need
to bind arbitrary functions into the monad, just one
single scope exploring function, implemented as
Variant visitor. Based on these observations, we can
"inline" the monad structure into a double nested
iterator, where the outer capsule carries a stack
of scopes to be explored.
2015-09-11 04:06:51 +02:00
be70e58441 considering how to implement the GenNode sequence iteration
remembered that some years ago I had to deal with a very similar problem
for planning the frame rendering jobs. It turned out, that the
iterator monad developed for this looks promising for our task at hand
2015-08-31 03:34:23 +02:00
aa96cb6dd1 implement full data-based equality for GenNode
initially my intention was to use the ID for equality test.
But on a second thought, this seemed like a bad idea, since
it confuses the concepts of equality and identity.

Note: at the moment, I do not know if we even need an equality test,
so it is provided here rather for sake of completeness. And this
means even more that we want an 'equality' implementation that
does what one would naively expect: compare the object identity
*and* compare the contents.
2015-08-28 16:12:04 +02:00
a56226f297 Record "object" representation now finished and passes Test 2015-08-17 22:13:36 +02:00
7650b36f1e Generic Record: finish implementation of Mutator
especially setting (changing) attributes turned out to be tricky,
since in case of a GenNode this would mean to re-bind the hash ID;
we can not possibly do that properly without knowing the type of the payload,
and by design this payload type is opaque (erased).

As resort, I changed the semantics of the assign operation:
now it rather builds a new payload element, with a given initialiser.
In case of the strings, this ends up being the same operation,
while in case of GenNode, this is now something entirely different:
we can now build a new GenNode "in place" of the old one, and both
will have the same symbolic ID (attribute key). Incidentally,
our Variant implementation will reject such a re-building operatinon
when this means to change the (opaque) payload type.

in addition, I created a new API function on the Mutator,
allowing to move-in a complete attribute object. Actually this
new function became the working implementation. This way, it is
still possible to emplace a new attribute efficiently (consider
this to be a whole object graph!). But only, if the key (ID)
embedded in the attribute object is already what is the intended
key for this attribute. This way, we elegantly circumvent the
problem of having to re-bind a hash ID without knowing the type seed
2015-08-17 20:31:07 +02:00
61b6868bff pick up work where I left one month ago
OMG, what was all this about?
OK... this cant possibly work this way.
At least we need to trim after splitting the attributes.
But this is not enough, we want the value, which implies
to make the type flexible (since we cant return a const& to
a substring extracted on-the-fly)
2015-08-17 01:22:01 +02:00
24d7f55935 Merge Platform upgrade and Diff-Framework development 2015-08-16 01:42:26 +02:00
430107fcd8 draft impl of Record<string>
this specialisation of the Record template is provided as
default implementation for simple unit tests
2015-08-16 01:35:31 +02:00
bfb7bbd2f5 implement Record: operator string() for diagnostics 2015-08-16 01:35:30 +02:00
5b0d58518e WIP: stub GenNode ref 2015-08-16 01:35:30 +02:00
d92878876a WIP: attempt to define the object builder invocation chain
TODO still unresolved issues with the bootstrap.
Looks like we shall not initiate from the basic Rec(),
but reather require an explicit construction.
2015-08-16 01:35:30 +02:00
8e990fc04d WIP: simple implementation / stubbing
especially I've now decided how to handle const-ness:
We're open to all forms of const-ness, the actual usage decides.
const GenNode will only expose a const& to the data values

still TODO is the object builder notation for diff::Record
2015-08-16 01:35:30 +02:00
1fa7a4a437 WIP: define the full set of default copy operations explicitly
on a second thought, this "workaround" does not look so bad,
due to the C++11 feature to request the default implementation explicitly.
Maybe we'll never need a generic solution for these cases
2015-08-16 01:35:30 +02:00
f15266e435 GenNode(#956): define the ctors
implies decision on the ID representation
2015-08-16 01:35:30 +02:00
7ea4f739bd introduce a new header for #984 2015-08-16 01:35:29 +02:00
248fbef9b4 WIP: draft a DSL for simplified definition of literal records
This is just a draft for now -- kindof a by-catch, since it is
chep to build that DSL on top of the Rec::Mutator.
This DSL could be of value later, when it comes to define
some configuration data inline, in a copact and clear fashion,
without the need to use a bridge to/from JSON
2015-08-16 01:35:29 +02:00
b81419ad63 WIP: decide to implement the record ref as simple referenc wrapper 2015-08-16 01:35:29 +02:00
c70ad01ad3 resolve some conflicts in the design of the "External Tree Representation"
for the purpose of working out the inner logic, I frequently use the
help of a mindmap -- so why not commiting this alongside? For sure,
it is preliminary and the worked out concepts will be cast in code
and documented on the website. Yet the thought-process leading to
these decisions might be of some interest, at least for myself.
2015-08-16 01:35:29 +02:00
8e27416594 planning towards a tree diff language
before engaging into the implementation of lib::Record,
I prefer to conduct a round of planning, to get a clearer
view about the requirements we'll meet when extending
our existing list diff to tree structures
2015-08-16 01:35:29 +02:00
b91734b0a6 WIP: first draft -- properties of an external symbolic record type
This Record type is intended to play a role in the
diff description / exchange of GUI data structures.
2015-08-16 01:35:28 +02:00
ff0950fd3b DOC: a note regarding Lumiera Forward Iterators and the range-for loop 2015-08-16 01:35:28 +02:00
e40c85fd7b DOK: rename Track -> Fork (III) -- closes #155
Introduce the new term "Fork" at various relevant places
within the documentation. We do not entirely purge the
term "track" though; rather we

- make clear that "Fork" is the entity to build tracks
- use "fork" also synonymous to the "tree of tracks"
2015-05-31 03:46:05 +02:00
07822182d9 player: planning play proces memory management 2015-05-30 17:52:44 +02:00
dece405801 LANDING: transition to GTK-3
This switches the Lumiera UI from GTK-2 to GTK-3
Unfortunately, this move breaks two crucial features, which have been
disabled for now: the display of video and our custom timeline widget.

Since both of these require some reworking, which in fact has already
started, we prefer to do the library and framework switch right away.
2015-05-30 17:11:41 +02:00
75aa5c970e summarise my thoughts regarding the 'External Tree Description'
seems like a new concept, closely related to the 'systematic metadata' RfC
2015-05-26 16:17:00 +02:00
6de24bc7f0 Ticket #956: decide layout and handling of GenNode elements
to carry out that rather obvious step, I was bound to consider
all the implications of choosing a given layout and handling pattern
for our external structure representation.

Finally, I settled upon the following decisions
- the value space represented within the DataCap is flat, not further structured
- the distinction between "attribute" and "nested object" is merely conceptual
  and will be enforced solely by the diff detection / representation protocol
- basically, a nested subtree may appear as an attribute; the difference
  between attributes and children lies solely in the way of access and referral:
  by-name vs. positional
- it is pointless to save space for the representation of the discriminator ID
- but we can omit any further explicit type tag, because
- we do *not* support programming by switch-on-type, and thus
- we do *not* support full introspection, only a passive type-safety check
- this is *not* a limitation, since we acknowledge that GenNode is a *Monad*
- and the partial function needed within any flatMap implementation
  maps naturally onto our Variant-Visitor; thus
- the DataCap can basically just *be* a Variant
- and GenNode has just to supply the neccessary shaffolding
  to turn that into a full fledged Monad implementation, including
  direct construction by wrapping a value and flatMap with tree walk
2015-05-02 01:11:39 +02:00
Christoph Varga
f952cad073 Lumiera GUI thoughts -- Mindmap to complement the Interface concept PDF
This mindmap explains some of the ideas and concepts in more detail.
It can be viewed with the "freeplane" mind mapping software.
("freemind" works as well, but will mess up some of the formatting)
2015-04-26 23:22:42 +02:00
Christoph Varga
05e5ab95a3 Lumiera GUI thoughts -- early draft for an interface concept
note by the committer: this mindmap was really work in progress.
Christoph shared it with me while in discussion. I'll place it
here in the git history, since it might be interesting to se
how the thoughts evolved. Isn't that what mindmaps are all about?
2015-04-26 23:22:40 +02:00
51cdc85e58 back from LAC2015: re-read and simplify the code draft 2015-04-13 15:49:38 +02:00
723d1e0164 settle architectural considerations regarding the TreeMuator concept
so yes, it is complicated, and inevitably involves three layers
of indirection. The alternative seems to bind the GUI direcly to
the Session interface -- is there a middle gound?

For the messages from GUI to Proc, we have our commands, based
on PlacementRef entities. But for feeding model updates to the
GUI, whatever I consider, I end up either with diff messages or
an synchronised access to Session attributes, which ties the
responsiveness of the GUI to the Builder operation.
2015-04-03 20:10:22 +02:00
e490fe0263 expand that draft to cover some of the technicalities
- how to deal with children
- how to integrate typing of children
2015-04-01 02:45:22 +02:00
513c02d767 design breakthrough? concept how to implement tree mutations
this is an attempt to resolve the "impedance mismatch" between
a generic metadata model and heterogeneous GUI implementation code
2015-03-30 00:25:37 +02:00
7742d78ba7 investigating use cases of state update notification
the scope is to find out what is relevant for the diff representation,
to be able do design the GenNode element accordingly
2015-03-22 17:39:47 +01:00
b051845835 identify and decide on some of the insidious questions of design
- how to deal with typing
- how to relate equality and mutations
2015-03-21 19:23:41 +01:00
f5ddfa0dbe decide on the foundations of tree diff representation
- we use a GenNode element
- this holds a polymorphic value known as DataCap
- besides simple attribute values, this may hold collections of GenNode sub elements
- a special kind of GenNode collection, the Record, is used to represent objects

The purpose of this setup is to enable an external model representation
which is only loosely coupled to the interndal data representation
through the exchange of (tree)diff messages
2015-03-21 02:00:55 +01:00
9a9e17578c extended planning to define the operation of UI-Bus and model update
this includes a decision about the tree diff representation and handling format
2015-01-17 16:08:56 +01:00
28d18a7326 refactoring: better name for the query focus shifting operation
previously this operation was named 'attach', which an be confused
with attching an object to this location. Indeed, the session interface
even offers such an attach function. By renaming the focus moving
operation into QueryFocus::shift(Scope), this ambiguity is resolved
2015-01-08 15:13:27 +01:00
8b6177a1c5 Design: Backbone of the GUI
This is the first step towards a generic backbone to connect
any GUI elements to the session within Proc-Layer.

It is based on a spefic understanding of Model-View-Controller,
which turns the Model-Controller interactions into messages.
2015-01-06 23:44:58 +01:00
371c13f790 add TODO markers regarding #959
Some parts of the GUI model will be remoulded
2015-01-05 15:47:23 +01:00
1a5e5eaa10 DOC: Wiki / UML clean-up
Remove some orphaned diagrams and PNG images not actually used
in the TiddlyWiki. Add a page with some hints regarding Bouml

See also #960 -- Bouml has been discontinued and is closed source now
not sure how to proceed with this
2015-01-05 15:44:17 +01:00
6d5f86423c sharpening the concept of structured data exchange through diff 2015-01-03 12:36:10 +01:00
beb57cde22 DOC: decision to use a simplistic implementation to start with
This means to discontinue any research into emitting an optimal
diff verb sequence for now and just to document the possible path
I see to reach at such a optimal solution later, when it turns out
to be really necessary performance wise.

Personal note: I arrived at this conclusion while whatching the
New Year fireworks 2014/2015 at the banks of the Isar river in
the centre of the city.
Too sad that 2014 didn't bring us World War III
2015-01-01 04:11:20 +01:00
73f310eb23 DOC: reread and slightly reworded 2014-12-23 02:18:28 +01:00
fe9105f321 DOC: reasoning behind the construction of our list diff algorithm
this is a theoretical description of our method, and gives
the reaoning why it is correct, plus the assesment of
size and complexity order.
2014-12-22 05:20:49 +01:00
42f69b6cb5 DOC: assumptions and definitions for diff handling
...plus a started draft of the list diff algorithm
2014-12-21 07:48:04 +01:00
e00a08b056 reorganise the DSL aspect of the design
we want a simple and straight forward way of defining tokens
of the "diff language". Each token is bound to a specific
handler function in the language interpreter interface.
2014-12-14 03:47:23 +01:00
c911456909 Refactoring: separate DiffLanguage, Interpreter and concrete Language definition
Problem is that likely we'll get a ListDiffLanguage and a TreeDiffLanguage;
after all, I really don't know yet how far to take this whole
diff representation endeavour...
2014-12-12 04:17:02 +01:00
55f49746a1 clarify diff implementation approach 2014-12-06 23:35:22 +01:00
f4cb2896b7 WIP: start with drafting the GUI diff representation
...first step is to design a generic linearised list diff representation.
Basically just need to pull together the theoretical work of the last weeks.
Next steps will be to extend to typed ordered trees.
2014-12-01 02:50:46 +01:00
09e7e1f8f5 WIP: pondering diff representation variants
Actually I arried at the conclusion, that the *receiving* of
a diff representation is actually a typical double-dispatch situation.
This leads to the attempt to come up with a specialised visitor
as standard pattern to handle and apply a diff. Obviously,
we do not want the classical GoF-Visitor, but (yes, we had
that discussion allready) -- well in terms of runtime cost,
we have to deal with at least two indirections anyway;
so now I'm exploring the idea to implement one of these
indirections through a functor object, which at the same time
acts as "Tag" in the diff representation language (instead
of using an enum as tag)
2014-11-10 04:00:39 +01:00
ed54f44b5e Write down some fundamental insight regarding diff algorithms 2014-11-07 03:58:37 +01:00
85d24e980d Design: devise a "linear diff language"
This DSL is usable as wire format for sending
structural change data to another, loosely coupled entity.
A similar format could be used for model serialisation later on.
2014-11-04 04:56:19 +01:00
c09e14f4dc Analysis: some conclusions regarding the diffing mechanism 2014-11-03 02:19:37 +01:00
4c74a2dd43 Design: draft a tree diffing algorithm 2014-10-27 04:49:32 +01:00
6c663a5c9e Design: elaborating how GUI model updates might work
esp. regarding parallelism
2014-10-27 04:48:49 +01:00
a35a6b0724 Design decision regarding model communication in the GUI
this is a quite fundamental decision: we split the GUI into
two sub-layers, and one of them is GTK agnosic
2014-10-25 04:00:11 +02:00
20105d1228 Design: considerations regarding widget structure in the timeline 2014-10-25 03:37:20 +02:00
ead58d03a9 DOC: expand concept map
I know that "reactive" is some kind of a fad currently.
But the term captures the intent very well, and I for sure
wanted such a GUI 5 years ago. Waiting after each stroke or
trim for 5 seconds or even 30 seconds for the UI to update
just totally sucks and kills any creative flow.

We all know that an application needs to be built for reactivity
and exactly that is what we do.
2014-10-25 01:56:44 +02:00
41a711120c planning the access structure to session content
initial considerations; there is a concurrency problem, since
all of session handling within Proc is deliberately not threadsafe.
Thus the decision is to make this the gui::model::SessionFacade's responsibility
2014-10-19 05:54:20 +02:00
1c0e86d373 DOC: complete the core concepts of workflow
A lot of details could be expanded, but this are the
most important concepts and relations for any GUI design
2014-10-18 22:53:55 +02:00
ac5816df4f DOC: expand on the core concepts of workflow 2014-10-18 21:39:13 +02:00
ed601d9eba DOC: start a concept map for workflow and interaction design 2014-10-17 04:02:56 +02:00
99438d459c some notes regarding the design of a GUI proxy model 2014-10-17 03:43:01 +02:00
718d544d8e Design: decide on the conventions for representing a timeline in the GUI
Actually this is nothing new, just making explicit what is evident
from the definition of the Proc-Layer model entities. By following
these conventions, it should be possible to come up with a
clearer structure for the custom timeline widget(s).
2014-10-16 04:38:44 +02:00
7c3efb309a explain the term 'subsystem' 2014-02-16 22:03:47 +01:00
5d835c71f3 TiddlyWiki: fix some orphaned pages
...caused by image names starting with upper case letter
2014-02-16 22:02:55 +01:00
6822a9e2fb DOC: reorganise the Doxygen configuration and structure
- upgrade the configuration to a current version
- provide a frontpage with cross-links to other documentation
- define a set of modules; relevant classes and files can be
  added to these, to create a exploration path for new readers
- fix a lot of errors in documentation comments
- use a custom configuration for the documentation pages
- tweak the navigation, the sections and further arrangements
2013-10-25 06:34:38 +02:00
567ab3819b WIP: draft an improved version of the Singleton factory
...this would both improve our general design and circumvent
the problems with Clang and static variables
2013-10-14 01:18:56 +02:00
5cbc152833 before FrOSCon 2013: recent coding work and documentation improvements 2013-08-20 04:42:57 +02:00
160dafebdb WIP re-read the code, try to understand the problem to be solved
unfortunately there was an interruption of more than a month
since my last Lumiera contribution
2013-08-13 01:16:29 +02:00
fada231a6b upgrade TiddlyWiki to v2.8.1
Notably TiddlyWiki provides now a fallback mechanism
in case the saving to a local file fails due to security
restrictions. When this happens, TiddlyWiki generates a
download link pointing to the current content; this way
one is at least able to "save as" through the browser
context menu.

Due to some controversial policy changes in recent Firefox versions
the support for saving to local files was removed. The rationale
given by the Firefox developers was that this is a rarely used
and generally outdated concept; preferrably people shall use
extensions and save to cloud services (!)

Anyway, Jeremy Ruston, the original author of TiddlyWiki, wrote
a Firefox plugin called "TiddlyFox" to work around these
arcane limitations.
2013-08-10 05:36:57 +02:00
77066ee3ce WIP: how to start the actual calculation streams within EngineService
this draft fills in the structure how to get from an invocation
of the engine service to the starting of actual CalcStream instances.

Basically the EngineService implementation is repsonsile to
instruct the Segmentation to provide a suitable Dispatcher.
2013-06-03 05:25:13 +02:00
723096d3f2 WIP introduce a new kind of job closure to perform the planning
this might help solving that gordian knot related to the TimeAnchor,
the Dispatcher and the introduction of a possible playback strategy
2013-06-02 03:09:18 +02:00
56be672358 WIP: reworking the dispatcher interface
the goal is still how to introduce a playback strategy
2013-05-30 02:10:56 +02:00
8982223a4d pondering about a suitable definition of a planning chunk (#920)
mostly this seems to be a matter of getting the terms
and meaning of the involved entities straight
2013-05-21 04:35:25 +02:00
7c596a8089 remove the old Main-TiddlyWiki
this is superseded by our website since a looooong time.
I've just re-checked that all relevant content is indeed
migrated to Lumiera.org
2013-05-20 03:33:53 +02:00
00dc435169 upgrade TiddlyWiki to v2.7.2
we were using an very ancient TiddlyWiki version, basically
unaltered since the start of the Lumiera project.

Recent Firefox versions (starting with FF-17) effectively
removed the ability for JavaScript code to get additional
privileges for writing local files; this change seriuosly
undermines the usability of TiddlyWiki and a lot of similar
portable local JavaScript applications.

The original author of TiddlyWiki, Jeremy Ruston, has written
a Firefox plug-in to work around this restriction; this prompts
us to upgrade to a recent TiddlyWiki version as well.

The good news is: recent TiddlyWiki versions are able to import
Tiddlers from older Wikis without much hassle.
2013-05-20 03:24:02 +02:00
7ada9ff291 consider how to integrate a playback mode strategy 2013-02-11 03:19:24 +01:00
9f7e229a12 DOC: requirement analysis of playback modes 2013-01-19 23:29:10 +01:00
30409e66bd WIP: considering how to support non-linear playback modes 2013-01-13 23:20:20 +01:00
f41d3221c8 remove the old "main" TiddlyWiki
now, the Proc-Layer TiddlyWiki is the only one to survive...
2013-01-03 11:22:41 +01:00
65feeb83fd supply some documentation about lumiera::Query 2013-01-02 03:32:49 +01:00
e902757a14 (DRAFT) refactor the way how to retrieve the syntactic query representation
there can't be a callback from the base ctor;
instead the subclass must pass a QueryText definition
2012-12-29 00:31:24 +01:00
5dfe5e099f refactor namespaces for query and defaults manager 2012-12-01 08:44:07 +01:00
baefd74ae7 prepare refactoring of the Query interface 2012-11-25 02:04:19 +01:00
062e1bbdc1 explicate the JobPlanningSequence definition
..causing the compiler to instantiate the
involved templates, i.e. get the complete
pipeline definition through the compiler
2012-10-10 05:20:22 +02:00
016a739a5c WIP back to the original problem: how to dispatch jobs...
brainstorming how to implement the job planning stage

the idea is to built on top of the IterExplorer,
but have the "stack" of re-evaluation integrated
into a custom type, which exploits the static
node network structure to avoid heap allocations

solution idea: again use a builder function?
2012-10-10 05:20:20 +02:00
ddff8b654b WIP investigating the relation of Jobs, JobTicket and Closure in detail 2012-10-10 05:20:14 +02:00
08d266819d re-read my own code and pick up the design work
..next question is: how to shape the dispatcher interface,
in order to support ongoing chunk wise planning
of new jobs, including a continuation
2012-10-10 05:20:13 +02:00
365f54d59e Proc-Layer TiddlyWiki entrance pages: some minor updates 2012-10-10 05:20:11 +02:00
875342fa40 initial draft for the job representation
this draft is based on
 - Cehteh's draft for the scheduler
 - my plannings about segmentation and JobTicket

it defines "Job" as a closure which can be invoked
from plain-C, using the information in the
job descriptor datastructure
2012-10-10 05:20:11 +02:00
e9dbb3bdb1 stubs for some important components of play/engine (JobTicket...)
also touches the question how to represent the job
descriptor datastructure. @Cehteh: I've just pasted
in your preliminary data struct definitinons
from the relevant mailing list discussions.
2012-10-10 05:20:11 +02:00
23ac29028c design draft: job tickets and planning... 2012-10-10 05:20:10 +02:00
157e3b6867 test-driven brainstorming: define default timings... 2012-10-10 05:20:10 +02:00
2cb254365c some musing about timing constraints and quantisation 2012-10-10 05:20:10 +02:00
a4e3383367 turn Dispatcher into an interface 2012-10-10 05:20:09 +02:00
e581246f63 forming some entities to support the dispatch step 2012-10-10 05:19:56 +02:00
9dae352731 clarification regarding the Dispatcher 2012-10-10 05:18:59 +02:00
3768791c76 considerations how to connect exit nodes to external outputs 2012-10-10 05:18:58 +02:00
7e7ecc5d51 draft: integrating an engine mock implementation 2012-10-10 05:18:58 +02:00
687102feb3 planning next steps: how to transform DummyPlayer into a real player 2012-10-10 05:18:57 +02:00
ee4e6905d2 Documentation: integrate the time quantisation concept pages
These pages from the TiddlyWiky feature a complete glossary
of terms relevant for time and timecode handling, plus the
architecural decisions related to this topic
2012-10-10 05:18:46 +02:00
d2f83523ca join recent player subsystem work, SCons overhaul and documentation 2012-01-11 07:54:43 +01:00
0e08f269f5 remove the superfluous TiddlyWikis
..after integrating all still relevant asciidoced content
into the main website.
2012-01-11 06:55:54 +01:00
06c7c27252 merge diagnostic facilities 2011-12-31 06:49:31 +01:00
87f7a8f6e8 unit test to cover thread-local helper 2011-12-24 05:55:31 +01:00
451b0abec5 spelling and typos 2011-12-24 05:48:31 +01:00
d27e3b15a9 clarify the handling of specific output operation modes (e.g. number of channels) 2011-12-23 02:22:38 +01:00
74a982409e document the internal structore of OutputSlot
...as far as decided and clarified by now
2011-12-20 04:59:00 +01:00
cedfa34074 considerations regarding clean-up of superseded model segments 2011-12-17 22:40:01 +01:00
bda0dea990 clarify the relation of PlayProcess, CalcStream and EngineFacade 2011-12-17 02:20:48 +01:00
c7d4412cec integrate recent GUI / timeline and work done on the player subsystem 2011-11-27 02:15:11 +01:00
91b74ad7bd implement missing parts of test/dummy buffer provider 2011-11-20 01:35:52 +01:00
63dbc89b6f draft implementation setup for OutputSlot baseclass 2011-11-05 16:51:24 +01:00
5188982e71 considering details regarding the usage of buffer metadata 2011-09-25 19:26:08 +02:00
ed5091d8f5 considering Buffer handling and BuffTable in more detail 2011-09-25 19:26:06 +02:00
1f13931640 test driven brainstorming: using a BufferProvider 2011-09-25 19:26:05 +02:00
8016547d9c rework and clarify node invocation sequence
while passing by, identified quite some
node invocation code to be rewritten
2011-09-25 19:26:05 +02:00
95bb5e64aa WIP desiging the interplay of BufferProvider and BuffHandle 2011-09-25 19:26:05 +02:00
737765260d Test-driven brainstorming: diagnostic adaptor for the engine 2011-09-25 19:26:03 +02:00
3125d1c573 a first draft for the Engine Interface 2011-09-25 19:26:03 +02:00
4a62444ad4 WIP pick up on the design work regarding Engine, OutputSlot and Player 2011-09-25 19:26:02 +02:00