shenmegui 0.2.1 → 0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: bc6619aba89ab7ea20df38ca2ac5de628a9c543b
4
- data.tar.gz: c3ae4650931f9496dac8559595c865bf0f908657
3
+ metadata.gz: 76f49e57833803f7d6359cefd0ede3e57f5c492a
4
+ data.tar.gz: 10ea23f6a66f9d535c7862a66e1b8df4de6aa57f
5
5
  SHA512:
6
- metadata.gz: b16399a6fd8f540f6f7ab4bc2fd93a215e2cdad35a4a456fb17eeedc2889f124c4892b65ab621807b58ad999a175a6d7a0cad7557a8d5ee37543b5cd3fccf55b
7
- data.tar.gz: c17d69a7269ccc136ae14371200b0849198230db52f511bbe2d2fb32b9d169657e2546176196e289a7c321919018517b55588661ddf8f79f688a26f66916f0a3
6
+ metadata.gz: 0d87c7220e9d410870899e94651ac8b8c3d74b7964a034770eec0d308378698ba303adc05bb8cb984d2cf91db8ca0629bfcf7733d55dbbf547b9aac24dfe0d62
7
+ data.tar.gz: 29c16632cd4ddde9e85c850944171737456e5a4ed6a04473db3cb3a0d0ef46e87cd04c095618ac75c657224506832965effa803b060d90190eadd6430d9ab44c
@@ -5,12 +5,14 @@ module ShenmeGUI
5
5
  class Base
6
6
  attr_accessor :id, :properties, :events, :children, :parent
7
7
 
8
- def hook(obj)
8
+ def add_hook(obj)
9
9
  case obj
10
10
  when String
11
11
  HookedString.new(obj, self)
12
12
  when Array
13
13
  HookedArray.new(obj, self)
14
+ when Hash
15
+ HookedHash.new(obj, self)
14
16
  else
15
17
  obj
16
18
  end
@@ -23,8 +25,7 @@ module ShenmeGUI
23
25
  end
24
26
 
25
27
  define_method("#{x}=") do |v|
26
- v = hook v
27
- @properties[x] = v
28
+ update_properties({x => v})
28
29
  sync
29
30
  end
30
31
  end
@@ -32,14 +33,13 @@ module ShenmeGUI
32
33
 
33
34
  def self.shortcut(prop)
34
35
  define_method(:initialize) do |x=nil, params={}|
35
- x = hook x
36
36
  params.merge!({prop => x})
37
37
  super(params)
38
38
  end
39
39
 
40
40
  end
41
41
 
42
- available_events = %w{click input dblclick mouseover mouseout blur focus mousedown mouseup change onselect}.collect(&:to_sym)
42
+ available_events = %w{click input dblclick mouseover mouseout blur focus mousedown mouseup change select}.collect(&:to_sym)
43
43
  available_events.each do |x|
44
44
  define_method("on#{x}") do |&block|
45
45
  return events[x] if block.nil?
@@ -60,19 +60,20 @@ module ShenmeGUI
60
60
  ShenmeGUI.socket.send(msg)
61
61
  end
62
62
 
63
- def update(data)
64
- data = Hash[data.keys.collect(&:to_sym).zip(data.values.collect{|x| hook(x)})]
63
+ def update_properties(data)
64
+ data = Hash[data.keys.collect(&:to_sym).zip(data.values.collect{|x| add_hook(x)})]
65
65
  @properties.update(data)
66
66
  end
67
67
 
68
- def add_events
68
+ def sync_events
69
69
  data = @events.keys
70
70
  msg = "add_event:#{@id}->#{data.to_json}"
71
71
  ShenmeGUI.socket.send(msg)
72
72
  end
73
73
 
74
74
  def initialize(params={})
75
- @properties = Hash[params.keys.collect(&:to_sym).zip(params.values.collect{|x| hook(x)})]
75
+ @properties = {}
76
+ update_properties(params)
76
77
  @id = ShenmeGUI.elements.size
77
78
  ShenmeGUI.elements << self
78
79
  @children = []
@@ -117,18 +118,27 @@ module ShenmeGUI
117
118
  end
118
119
 
119
120
  class Textline < Base
120
- property :text, :selection_start, :selection_end
121
+ property :text, :selection
121
122
  shortcut :text
122
123
 
124
+ def text=(v)
125
+ update_properties({text: v, selection: [v.size]*2 })
126
+ sync
127
+ end
123
128
  end
124
129
 
125
130
  class Textarea < Base
126
- property :text, :selection_start, :selection_end
131
+ property :text, :selection
127
132
  shortcut :text
128
133
 
129
134
  def <<(t)
130
135
  text << "\n#{t}"
131
136
  end
137
+
138
+ def text=(v)
139
+ update_properties({text: v, selection: [v.size]*2 })
140
+ sync
141
+ end
132
142
  end
133
143
 
134
144
  class Stack < Base
@@ -144,7 +154,7 @@ module ShenmeGUI
144
154
 
145
155
  class Checkbox < Base
146
156
  property :options, :checked, :arrange
147
- shortcut :options
157
+ shortcut :options
148
158
  end
149
159
 
150
160
  class Progress < Base
@@ -15,7 +15,7 @@ module ShenmeGUI
15
15
  data = JSON.parse(match_data[3]) if match_data[3]
16
16
  case command
17
17
  when :sync
18
- target.update(data)
18
+ target.update_properties(data)
19
19
  else
20
20
  event_lambda = target.events[command]
21
21
  @this = @elements[id]
@@ -45,14 +45,14 @@ module ShenmeGUI
45
45
  FileDialog.get_save_file_name(params)
46
46
  end
47
47
 
48
- def enable_debug
48
+ def enable_debugging
49
49
  Thread.new do
50
50
  ShenmeGUI.instance_eval do
51
51
  bind = binding
52
52
  while true
53
53
  begin
54
54
  command = $stdin.gets.chomp
55
- result = eval command, bind
55
+ result = bind.eval command
56
56
  puts "=> #{result}"
57
57
  rescue
58
58
  puts "#{$!}"
@@ -69,7 +69,10 @@ module ShenmeGUI
69
69
  EM::WebSocket.run(:host => "0.0.0.0", :port => 80) do |ws|
70
70
  ws.onopen do
71
71
  puts "WebSocket connection open"
72
- @elements.each { |e| e.add_events; e.sync }
72
+ @elements.each do |e|
73
+ e.sync_events
74
+ e.sync
75
+ end
73
76
  end
74
77
 
75
78
  ws.onclose { puts "Connection closed" }
@@ -37,8 +37,9 @@ module ShenmeGUI
37
37
  filter = params[:filter] ? "#{params[:filter]}\0#{params[:filter]}\0\0" : 0
38
38
  title = params[:title] || 0
39
39
  flags = 0x00880000
40
- flags += 0x00000200 if params[:multiselect]
41
- flags += 0x10000000 if params[:showhidden]
40
+ flags += 0x00000200 if params[:multi_select]
41
+ flags += 0x10000000 if params[:show_hidden]
42
+ initial_path = params[:initial_path] ? params[:initial_path] : 0
42
43
 
43
44
  path = "\0" * 1024
44
45
  ofn = Struct_OPENFILENAME.malloc
@@ -52,7 +53,7 @@ module ShenmeGUI
52
53
  ofn.nMaxFile = path.size
53
54
  ofn.lpstrFileTitle = 0
54
55
  ofn.nMaxFileTitle = 0
55
- ofn.lpstrInitialDir = 0
56
+ ofn.lpstrInitialDir = initial_path
56
57
  ofn.lpstrTitle = title
57
58
  ofn.nFileOffset = 0
58
59
  ofn.nFileExtension = 0
@@ -85,3 +86,5 @@ module ShenmeGUI
85
86
 
86
87
  end
87
88
  end
89
+
90
+ #ShenmeGUI::FileDialog.get_open_file_name(initial_path: 'C:\\')
@@ -37,4 +37,23 @@ module ShenmeGUI
37
37
  end
38
38
 
39
39
  end
40
+
41
+ class HookedHash < Hash
42
+ @unhook_methods = %i{[]= clear delete delete_if keep_if merge! update rehash reject! replace select! shift}
43
+ @unhook_methods = Hash[@unhook_methods.collect{|x| [x, Hash.instance_method(x)]}]
44
+
45
+ def initialize(hsh, owner)
46
+ @owner = owner
47
+ super(hsh)
48
+ end
49
+
50
+ @unhook_methods.each do |k, v|
51
+ define_method(k) do |*arr, &block|
52
+ result = v.bind(self).call(*arr, &block)
53
+ @owner.sync
54
+ result
55
+ end
56
+ end
57
+
58
+ end
40
59
  end
@@ -25,8 +25,7 @@ var changeListeners = {
25
25
  event: ['input','select'],
26
26
  function: (function(){
27
27
  this.properties.text = this.value;
28
- this.properties.selection_start = this.selectionStart;
29
- this.properties.selection_end = this.selectionEnd;
28
+ this.properties.selection = [this.selectionStart, this.selectionEnd];
30
29
  sync(this);
31
30
  })
32
31
  },
@@ -35,8 +34,7 @@ var changeListeners = {
35
34
  event: ['input','select'],
36
35
  function: (function(){
37
36
  this.properties.text = this.value;
38
- this.properties.selection_start = this.selectionStart;
39
- this.properties.selection_end = this.selectionEnd;
37
+ this.properties.selection = [this.selectionStart, this.selectionEnd];
40
38
  sync(this);
41
39
  })
42
40
  },
@@ -119,10 +117,18 @@ var syncHandlers = {
119
117
 
120
118
  textline: (function(target, data){
121
119
  target.value = data.text;
120
+ if(data.selection){
121
+ target.selectionStart = data.selection[0];
122
+ target.selectionEnd = data.selection[1];
123
+ }
122
124
  }),
123
125
 
124
126
  textarea: (function(target, data){
125
127
  target.value = data.text;
128
+ if(data.selection){
129
+ target.selectionStart = data.selection[0];
130
+ target.selectionEnd = data.selection[1];
131
+ }
126
132
  }),
127
133
 
128
134
  image: (function(target, data){
@@ -38,7 +38,6 @@ body {
38
38
  margin-right: 2px; }
39
39
 
40
40
  .button, .checkbox, .image, .progress, .radio, .select, .textarea, .textline, .label {
41
- display: inline-block;
42
41
  margin-bottom: 0.5em;
43
42
  margin-right: 0.2em;
44
43
  max-width: 100%; }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shenmegui
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: '0.3'
5
5
  platform: ruby
6
6
  authors:
7
7
  - CicholGricenchos
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-11 00:00:00.000000000 Z
11
+ date: 2015-03-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: em-websocket