qml 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -13,7 +13,7 @@ struct WeakValueReference::Data
13
13
 
14
14
  static VALUE finalize(VALUE args, VALUE data) {
15
15
  Q_UNUSED(args);
16
- auto variant = wrapperRubyClass<Ext::AnyWrapper>().unwrap(data)->value();
16
+ auto variant = wrapperRubyClass<Ext_AnyWrapper>().unwrap(data)->value();
17
17
  auto sp = variant.value<std::shared_ptr<Data>>();
18
18
  sp->invalidiate();
19
19
  return Qnil;
@@ -33,7 +33,7 @@ WeakValueReference::WeakValueReference(RubyValue value) :
33
33
  d->mValue = value;
34
34
  static auto objspace = RubyModule::fromPath("ObjectSpace");
35
35
  protect([&] {
36
- auto proc = rb_proc_new((VALUE (*)(...))&Data::finalize, Ext::AnyWrapper::create(QVariant::fromValue(d)));
36
+ auto proc = rb_proc_new((VALUE (*)(...))&Data::finalize, Ext_AnyWrapper::create(QVariant::fromValue(d)));
37
37
  VALUE args[] = { value };
38
38
  rb_funcall_with_block(objspace, RUBYQML_INTERN("define_finalizer"), 1, args, proc);
39
39
  });
data/lib/qml.rb CHANGED
@@ -4,6 +4,7 @@ require 'qml/qml'
4
4
  require 'qml/geometry'
5
5
  require 'qml/reactive'
6
6
 
7
+ require 'qml/init'
7
8
  require 'qml/meta_object'
8
9
  require 'qml/plugin_loader'
9
10
  require 'qml/component'
@@ -19,25 +20,3 @@ require 'qml/dispatchable'
19
20
 
20
21
  require 'qml/data'
21
22
  require 'qml/test_util'
22
-
23
- module QML
24
-
25
- def initialized?
26
- Kernel.initialized?
27
- end
28
-
29
- # Initializes ruby-qml.
30
- # @param [Hash] opts
31
- # @option opts [Boolean] :offscreen (false) set this to true to run application offscreen (without GUI)
32
- def init(opts = {})
33
- opts = {offscreen: false}.merge opts
34
- fail AlreadyInitializedError, "ruby-qml already initialized" if initialized?
35
- argv = [$PROGRAM_NAME]
36
- argv += %w{-platform offscreen} if opts[:offscreen]
37
- Kernel.init(argv)
38
- application.events_processed.each do
39
- Dispatcher.instance.run_tasks
40
- end
41
- end
42
- module_function :initialized?, :init
43
- end
@@ -23,17 +23,9 @@ module QML
23
23
  fail ApplicationError, "cannot create Application instance manually"
24
24
  end
25
25
 
26
- # @!method events_processed
27
- # This signal is emitted every time events are processed in the event loop.
28
- # @return [Reactive::Signal]
29
- signal :events_processed, []
30
-
31
26
  def initialize
32
27
  super()
33
28
  @extension = Plugins.core.createApplicationExtension(self)
34
- @extension.events_processed.each do
35
- events_processed.call
36
- end
37
29
  end
38
30
 
39
31
  # @return [Engine] The engine of the application.
@@ -10,12 +10,13 @@ module QML
10
10
  MAX_DURATION = 1/10.to_r
11
11
 
12
12
  def initialize
13
- @tasks = []
14
13
  super
14
+ @tasks = []
15
15
  end
16
16
 
17
17
  def add_task(&task)
18
18
  synchronize do
19
+ Kernel.set_event_loop_hook_enabled_later true if @tasks.empty?
19
20
  @tasks << task
20
21
  end
21
22
  end
@@ -35,10 +36,18 @@ module QML
35
36
  task = @tasks.shift
36
37
  task.call
37
38
  end
39
+ Kernel.set_event_loop_hook_enabled_later false if @tasks.empty?
38
40
  end
39
41
  end
40
42
  end
41
43
 
44
+ on_init do
45
+ Kernel.event_loop_hook_timer.timeout.connect do
46
+ puts "======== run tasks"
47
+ Dispatcher.instance.run_tasks
48
+ end
49
+ end
50
+
42
51
  # Runs a block asynchronously within the event loop.
43
52
  #
44
53
  # QML UI is not thread-safe and can only be accessed from the main thread.
@@ -0,0 +1,29 @@
1
+ module QML
2
+
3
+ # @return [Boolean] whether {#init} is already called.
4
+ def initialized?
5
+ Kernel.initialized?
6
+ end
7
+
8
+ # Initializes ruby-qml.
9
+ # @param [Hash] opts
10
+ # @option opts [Boolean] :offscreen (false) set this to true to run application offscreen (without GUI)
11
+ def init(opts = {})
12
+ opts = {offscreen: false}.merge opts
13
+ fail AlreadyInitializedError, "ruby-qml already initialized" if initialized?
14
+ argv = [$PROGRAM_NAME]
15
+ argv += %w{-platform offscreen} if opts[:offscreen]
16
+ Kernel.init(argv)
17
+ @on_init.each(&:call)
18
+ end
19
+
20
+ @on_init = []
21
+
22
+ # Registers a block to be called just after {#init} is called.
23
+ # @yield
24
+ def on_init(&block)
25
+ @on_init << block
26
+ end
27
+
28
+ module_function :initialized?, :init, :on_init
29
+ end
@@ -1,3 +1,3 @@
1
1
  module QML
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.4'
3
3
  end
@@ -10,6 +10,7 @@ describe QML::Dispatchable do
10
10
  it 'queues a method call as a task to the dispatcher' do
11
11
  foo = DispatchableFoo.new
12
12
  foo.later.value = 'hoge'
13
+ QML.application.process_events # wait for event loop hook to be enabled
13
14
  expect(foo.value).to be_nil
14
15
  QML.application.process_events
15
16
  expect(foo.value).to eq 'hoge'
@@ -19,17 +19,40 @@ describe QML::Dispatcher do
19
19
  end
20
20
  end
21
21
 
22
+ describe '#add_task' do
23
+ before do
24
+ dispatcher.add_task {}
25
+ end
26
+
27
+ it 'adds a task' do
28
+ expect(dispatcher.empty?).to eq false
29
+ end
30
+
31
+ it 'sets the event loop hook enabled later' do
32
+ QML.application.process_events
33
+ expect(QML::Kernel.event_loop_hook_timer.active).to eq true
34
+ end
35
+ end
36
+
22
37
  describe '#run_tasks' do
23
- it 'runs queued tasks' do
24
- finished = []
38
+ let(:finished) { [] }
39
+ before do
25
40
  2.times.each do |i|
26
41
  dispatcher.add_task do
27
42
  finished[i] = true
28
43
  end
29
44
  end
30
45
  dispatcher.run_tasks until dispatcher.empty?
46
+ end
47
+
48
+ it 'runs queued tasks' do
31
49
  expect(finished).to eq [true, true]
32
50
  end
51
+
52
+ it 'sets the event loop hook disabled when finished later' do
53
+ QML.application.process_events
54
+ expect(QML::Kernel.event_loop_hook_timer.active).to eq false
55
+ end
33
56
  end
34
57
  end
35
58
 
@@ -40,6 +63,7 @@ describe QML do
40
63
  QML.later do
41
64
  finished = true
42
65
  end
66
+ QML.application.process_events # wait for event loop hook to be enabled
43
67
  expect(finished).to eq false
44
68
  QML.application.process_events
45
69
  expect(finished).to eq true
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: qml
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryohei Ikegami
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-22 00:00:00.000000000 Z
11
+ date: 2014-07-24 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -159,11 +159,9 @@ files:
159
159
  - ext/qml/accessclass.h
160
160
  - ext/qml/accessobject.cpp
161
161
  - ext/qml/accessobject.h
162
- - ext/qml/application.cpp
163
- - ext/qml/application.h
164
162
  - ext/qml/common.h
165
- - ext/qml/ext_accesssupport.cpp
166
- - ext/qml/ext_accesssupport.h
163
+ - ext/qml/ext_accesswrapperfactory.cpp
164
+ - ext/qml/ext_accesswrapperfactory.h
167
165
  - ext/qml/ext_anywrapper.cpp
168
166
  - ext/qml/ext_anywrapper.h
169
167
  - ext/qml/ext_kernel.cpp
@@ -185,6 +183,8 @@ files:
185
183
  - ext/qml/foreignobject.h
186
184
  - ext/qml/functioninfo.h
187
185
  - ext/qml/init.cpp
186
+ - ext/qml/kernel.cpp
187
+ - ext/qml/kernel.h
188
188
  - ext/qml/listmodel.cpp
189
189
  - ext/qml/listmodel.h
190
190
  - ext/qml/markable.h
@@ -255,6 +255,7 @@ files:
255
255
  - lib/qml/geometry/rectangle.rb
256
256
  - lib/qml/geometry/size.rb
257
257
  - lib/qml/image_provider.rb
258
+ - lib/qml/init.rb
258
259
  - lib/qml/meta_object.rb
259
260
  - lib/qml/models.rb
260
261
  - lib/qml/name_helper.rb
@@ -1,54 +0,0 @@
1
- #include "application.h"
2
- #include "util.h"
3
-
4
- namespace RubyQml {
5
- namespace Application {
6
-
7
- namespace {
8
-
9
- int argc;
10
- QList<QByteArray> argData;
11
- char **argv;
12
-
13
- QApplication *application_;
14
- QQmlEngine *engine_;
15
-
16
- }
17
-
18
- void failIfUninitialized()
19
- {
20
- if (!initialized()) {
21
- fail("QML::UninitializedError", "ruby-qml not yet initialized");
22
- }
23
- }
24
-
25
- QApplication *application()
26
- {
27
- failIfUninitialized();
28
- return application_;
29
- }
30
-
31
- QQmlEngine *engine()
32
- {
33
- failIfUninitialized();
34
- return engine_;
35
- }
36
-
37
- bool initialized()
38
- {
39
- return application_;
40
- }
41
-
42
- void init(const QList<QByteArray> &args)
43
- {
44
- argc = args.size();
45
- argData = args;
46
- argv = new char*[argc];
47
- std::transform(argData.begin(), argData.end(), argv, [](QByteArray &ba) { return ba.data(); });
48
-
49
- application_ = new QApplication(argc, argv);
50
- engine_ = new QQmlEngine();
51
- }
52
-
53
- }
54
- } // namespace RubyQml
@@ -1,17 +0,0 @@
1
- #pragma once
2
-
3
- #include <QList>
4
- #include <QApplication>
5
- #include <QQmlEngine>
6
-
7
- namespace RubyQml {
8
- namespace Application {
9
-
10
- QApplication *application();
11
- QQmlEngine *engine();
12
- bool initialized();
13
-
14
- void init(const QList<QByteArray> &args);
15
-
16
- }
17
- } // namespace RubyQml