savant-scenes 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: f9e5402055742f0f70932825792310aa90141712
4
- data.tar.gz: f5fc4f1f20d3420f0e8df55b11c85ffb711f33e2
3
+ metadata.gz: ce04019a545c83f545f5f5e3085dc83e70fab1b2
4
+ data.tar.gz: 25d7a7cd3073350cb970895546ba0005e79e5aa0
5
5
  SHA512:
6
- metadata.gz: ee0003002a456eaa16107db29af9e58a525e1336426d90f0e326df4b9d83e54e2d82926af4782c6f9e522eb2be1f79ea7e72ea3c6971e3fe849060038bca59b2
7
- data.tar.gz: 28fc520229783fce34564cff5764c7ce5658b955b9924ae7a11f0699e59c279794c00bd9d03042d140b7227ef9bfe17034fb6d41c6f8fa2185e1b16c4a51785f
6
+ metadata.gz: 547ef94aa42f319346118b389eaeaceb16cec1275f5cb15790c12201aff149730ebab57bcfde3a5c711cf3a22f312441d0fa1b1aadee00df0f8a0202b81b4407
7
+ data.tar.gz: dfefe42335f84bdad9ff1c0bce889e3f84b120b8bb08f3a057a25c36cbf7a0583cf7780719867a6d3542f67417fb41b08a4b0e2f6d8c826660363bef287d0340
@@ -6,6 +6,7 @@ require 'socket'
6
6
  require 'timeout'
7
7
  require 'ipaddress'
8
8
  require 'sqlite3'
9
+ require 'date'
9
10
 
10
11
 
11
12
  class SceneManager
@@ -16,11 +17,16 @@ class SceneManager
16
17
  def initialize
17
18
  #Initialize the Scenes List view
18
19
  @listviewSavantScenes = VR::ListView.new(:modify => TrueClass, :scene => String, :user => String, :id => String, :image => String, :isGlobal => String, :isActive => String, :isScheduled => String, :hasCustomImage => String, :userSceneOrder => String, :tags => String)
20
+
19
21
  @listviewSavantScenes.col_sortable(true)
22
+
20
23
  @listviewSavantScenes.col_sort_column_id(:scene => @listviewSavantScenes.id(:scene), :user => @listviewSavantScenes.id(:user))
24
+
21
25
  @listviewSavantScenes.col_title(:modify => "", :scene => "Scene Name", :tags => "Zones Affected", :isGlobal => "Global", :isActive => "Active", :isScheduled => "Scheduled", :hasCustomImage => "Custom Image", :userSceneOrder => "User Order")
26
+
22
27
  @listviewSavantScenes.col_xalign(:isGlobal => 0.5, :isActive => 0.5, :isScheduled => 0.5, :hasCustomImage => 0.5, :userSceneOrder => 0.5)
23
28
  @listviewSavantScenes.col_width(:tags => 100, :image => 100)
29
+
24
30
  @listviewSavantScenes.ren_editable(:scene => true, :user => true, :id => true, :isGlobal => String)
25
31
 
26
32
  row = @listviewSavantScenes.add_row
@@ -62,6 +68,21 @@ class SceneManager
62
68
  #
63
69
  # @listviewSavantScenes.renderer(:isActive).edited_callback = Proc.new { |model_sym, row, view |
64
70
  # alert "Scene is scheduled changed to : " + row[:isScheduled].to_s
71
+
72
+
73
+
74
+ @listviewAdvanced = VR::ListView.new(:time => VR::Col::CalendarCol, :event => String, :user => String, :deviceName => String, :deviceModel => String, :deviceApp => String, :deviceOS => String, :deviceUID => String, :zone => String, :component => String, :logicalComponent => String, :variantID => String, :serviceID => String, :type => String, :argument => String)
75
+
76
+ @listviewAdvanced.col_sortable(true)
77
+
78
+ @listviewAdvanced.col_sort_column_id(:time => @listviewAdvanced.id(:time), :event => @listviewAdvanced.id(:event), :user => @listviewAdvanced.id(:user), :deviceName => @listviewAdvanced.id(:deviceName), :deviceUID => @listviewAdvanced.id(:deviceUID), :zone => @listviewAdvanced.id(:zone), :component => @listviewAdvanced.id(:component), :logicalComponent => @listviewAdvanced.id(:logicalComponent), :variantID => @listviewAdvanced.id(:variantID), :serviceID => @listviewAdvanced.id(:serviceID), :type => @listviewAdvanced.id(:type), :argument => @listviewAdvanced.id(:argument))
79
+
80
+ @listviewAdvanced.col_title(:time => "Time", :event => "Event", :user => "User", :deviceName => "Device Name", :deviceModel => "Device Model", :deviceApp => "Device App", :deviceOS => "Device OS", :deviceUID => "Device UID", :zone => "Zone", :component => "Component", :logicalComponent => "Logical", :variantID => "Variant", :serviceID => "Service", :type => "Command", :argument => "Argument")
81
+
82
+ row = @listviewAdvanced.add_row
83
+ row[:event] = ""
84
+ @listviewAdvanced.visible = true
85
+
65
86
  # }
66
87
  end
67
88
 
@@ -70,6 +91,9 @@ class SceneManager
70
91
  @savantURL = "192.168.77.40"
71
92
  @login = 'RPM'
72
93
  @password = 'RPM'
94
+
95
+ @builder["buttonAdvanced"].hide
96
+ @builder["buttonActivateScene"].hide
73
97
 
74
98
  @ftv = VR::FileTreeView.new(Dir.home, File.join(File.dirname(__FILE__), "/../img"), glob = "*", validate_block = nil)
75
99
  @builder["scrolledwindow_BackupRestore"].add(@ftv)
@@ -99,7 +123,7 @@ class SceneManager
99
123
  begin
100
124
  @builder["labelHostInfo"].label = ""
101
125
  Net::SSH.start(ip, @login, :password => @password, :paranoid => false, :timeout => 3) do |ssh|
102
- #Check host type and update sclibridge location for reference, though only Pro Host is supported
126
+ #Check host type and update sclibridge location
103
127
  ssh.open_channel do |ch, success|
104
128
  ch.exec("uname")
105
129
  ch.on_data do |ch, data|
@@ -107,74 +131,68 @@ class SceneManager
107
131
  @scliBridge = "~/Applications/RacePointMedia/sclibridge "
108
132
  @dis = "/Users/RPM/Library/Application Support/RacePointMedia/statusfiles/dis/dashboard.sqlite"
109
133
  else
110
- @scliBridge = "/usr/local/bin/sclibridge "
134
+ @scliBridge = "source ~/.zshrc && /usr/local/bin/sclibridge "
111
135
  @dis = "GNUstep/Library/ApplicationSupport/RacePointMedia/statusfiles/dis/dashboard.sqlite"
112
- alert "smart host"
113
136
  end
114
137
  end
138
+ ch.on_extended_data do |ch, type, data|
139
+ alert "Error: #{data.inspect}"
140
+ end
115
141
  end
116
142
  ssh.loop
117
- #parse the rpmSystemInfo.plist form the pro host to get host name
143
+ #parse the scscredentials.plist from the pro host to get host name and then version
118
144
  if @scliBridge == "~/Applications/RacePointMedia/sclibridge "
119
145
  ssh.open_channel do |ch, success|
120
146
 
121
- ch.exec("plutil -p 'library/application support/racepointmedia/userconfig.rpmconfig/rpmSystemInfo.plist'")
147
+ ch.exec("plutil -p 'library/application support/racepointmedia/statusfiles/scscredentials.plist'")
122
148
  ch.on_data do |ch, data|
123
- if data.to_s.include? 'module'
124
- x = data.split("\"RPMSystemName\" => ")
125
- x = x[1].split("\n")
126
- @savantHostName = x[0][1..-2]
127
- @str = @scliBridge + "readstate \"" + @savantHostName + ".SoftwareVersion\""
149
+ if data.to_s.include? 'savantcs.com'
150
+ x = data.split(%q{"name" => "})
151
+ x = x[1].split(%q{"})
152
+ @savantHostName = x[0]
153
+ @str = @scliBridge + "readstate \'" + @savantHostName + ".SoftwareVersion\'"
154
+ @savantHostVersion = ssh.exec!(@str)
128
155
  end
129
156
  end
157
+ ch.on_extended_data do |ch, type, data|
158
+ alert "Error: #{data.inspect}"
159
+ end
130
160
  end
131
161
  ssh.loop
132
- #parse the rpmSystemInfo.plist from the smart host to get host name
133
- elsif @scliBridge == "/usr/local/bin/sclibridge "
162
+ #parse the scscredentials.plist from the smart host to get host name and then version
163
+ elsif @scliBridge == "source ~/.zshrc && /usr/local/bin/sclibridge "
134
164
  ssh.open_channel do |ch, success|
135
- ch.exec("strings 'GNUstep/Library/ApplicationSupport/RacePointMedia/userConfig.rpmConfig/rpmSystemInfo.plist'")
165
+ ch.exec("strings 'GNUstep/Library/ApplicationSupport/RacePointMedia/statusfiles/scsCredentials.plist'")
136
166
  ch.on_data do |ch, data|
137
- if data.to_s.include? 'DOCTYPE'
138
- x = data.split("RPMUserDefinedName</key><string>")
139
- y = x[1].split("</string>")
140
- x = x[1].split("VERSION</key><integer>")
141
- x = x[1].split("</integer>")
142
- alert("Instant host found at specified IP address. Instant hosts are not supported (even by Savant!)", :parent => self)
143
- return false
144
- @instantHost = true
145
- elsif data.to_s.include? 'module'
146
- x = data.split('module')
147
- x = x[1].split("\n")
148
- @savantHostName = x[0][1..-1]
149
- @str = @scliBridge + "readstate \"" + @savantHostName + ".SoftwareVersion\""
150
- alert @str
167
+ if data.to_s.include? 'savantcs.com'
168
+ x = data.split("name</key>")
169
+ x = x[1].split(%q{</string>})
170
+ x = x[0].split(%q{<string>})
171
+ @savantHostName = x[1]
172
+
173
+ @str = @scliBridge + "readstate \'" + @savantHostName + ".SoftwareVersion\'"
174
+ @savantHostVersion = ssh.exec!(@str)
151
175
  end
152
176
  end
177
+
178
+ ch.on_extended_data do |ch, type, data|
179
+ alert "Error: #{data.inspect}"
180
+ end
153
181
  end
154
182
  ssh.loop
155
- end
156
- #Use host name to query SoftwareVersion state from host
157
- ssh.open_channel do |ch, success|
158
- ch.exec(@str)
159
- ch.on_data do |ch, data|
160
- @savantHostVersion = data
161
- end
162
- end
163
- ssh.loop
164
- end
165
- alert @savantHostName
166
- alert @savantHostVersion
167
- @builder["labelHostInfo"].text = @savantHostName + " Version : " + @savantHostVersion
168
183
 
169
- #return true if version is 8.3 or later
170
- if @savantHostVersion.to_r > 8.2 && !@savantHostVersion.empty?
171
- return true
172
- else
173
- return false
184
+ end
174
185
  end
175
-
186
+ unless @savantHostVersion.empty? || @savantHostName.empty?
187
+ @builder["labelHostInfo"].text = @savantHostName + " Version : " + @savantHostVersion
188
+ #return true if version is 8.3 or later
189
+ if @savantHostVersion.to_r > 8.2
190
+ return true
191
+ else
192
+ return false
193
+ end
194
+ end
176
195
  rescue Net::SSH::ConnectionTimeout, SocketError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED, Errno::EHOSTDOWN
177
-
178
196
  end
179
197
  end
180
198
 
@@ -190,6 +208,11 @@ class SceneManager
190
208
  @builder["window1"].show_all
191
209
  unless savantVersion?(@savantURL)
192
210
  @builder["buttonActivateScene"].hide
211
+ end
212
+ if @savantHostVersion.to_r > 8.0
213
+ @builder["buttonAdvanced"].show
214
+ else
215
+ @builder["buttonAdvanced"].hide
193
216
  end
194
217
  end
195
218
 
@@ -197,10 +220,8 @@ class SceneManager
197
220
  def buttonScanHost__clicked(*argv)
198
221
  @savantURL = @builder["savantURL"].text
199
222
  if is_port_open?(@savantURL,"11263") || is_port_open?(@savantURL,"48664") || is_port_open?(@savantURL,"1124")
200
- unless savantVersion?(@savantURL)
201
- @builder["buttonActivateScene"].hide
202
- end
203
223
  begin
224
+ savantVersion?(@savantURL)
204
225
  @listviewSavantScenes.model.clear
205
226
  Net::SSH.start(@savantURL, @login, :password => @password, :paranoid => false, :timeout => 3) do |ssh|
206
227
  # test to see if remote files exist and transfer them if they do
@@ -369,64 +390,6 @@ class SceneManager
369
390
  end
370
391
  end
371
392
 
372
- # Duplicate the selected scenes
373
- # def buttonDuplicateScene__clicked(*argv)
374
- # get_glade_variables()
375
- #
376
- # duplicateIDs = []
377
- # duplicateScenes = []
378
- # duplicateUserss = []
379
- # duplicateImages = []
380
- # duplicateTags = []
381
- # duplicateGlobals = []
382
- # duplicateActives = []
383
- # duplicateScheduled = []
384
- # duplicateCustomImages = []
385
- # duplicateSceneOrders = []
386
- #
387
- # count = 0
388
- # @listviewSavantScenes.each_row do |row|
389
- # if row[:modify]
390
- # count += 1
391
- # duplicateIDs << row[:id]
392
- # duplicateScenes << row[:scene]
393
- # duplicateUsers << row[:user]
394
- # duplicateImages << row[:image]
395
- # duplicateTags << row[:tags]
396
- # duplicateGlobals << row[:isGlobal]
397
- # duplicateActives << row[:isActive]
398
- # duplicateScheduled << row[:isScheduled]
399
- # duplicateCustomImages << row[:HasCustomImage]
400
- # duplicateSceneOrders << row[:userSceneOrder]
401
- # end
402
- # end
403
- # make sure a scene was selected, else alert the user
404
- # if count > 0
405
- # confirm the edits should be made
406
- # strAlert = "Do you want to delete the following scenes from the Savant host?\n\n" + deleteScenes.join("\n")
407
- # if alert(strAlert, :headline => "Delete Scenes?", :button_yes => "Delete", :button_cancel => "Cancel", :parent => self)
408
- # edit the database with the updated info
409
- # deleteIDs.each do |id|
410
- # stm = @db.prepare( "delete from sceneusermap where sceneIdentifier=?" )
411
- # stm.bind_param 1, id
412
- # stm.execute
413
- # stm.close
414
- # stm = @db.prepare( "delete from scenes where identifier=?" )
415
- # stm.bind_param 1, id
416
- # stm.execute
417
- # stm.close
418
- # stm = @db.prepare( "delete from scenedefinitions where sceneIdentifier=?" )
419
- # stm.bind_param 1, id
420
- # stm.execute
421
- # stm.close
422
- # end
423
- # updateDatabase()
424
- # buttonScanHost__clicked()
425
- # end
426
- # else
427
- # alert("Please select at least 1 row to modify.", :parent => self)
428
- # end
429
- # end
430
393
 
431
394
  # #
432
395
  # BACKUP AND RESTORE #
@@ -504,4 +467,110 @@ class SceneManager
504
467
  @builder["window1"].destroy
505
468
  end
506
469
 
470
+
471
+
472
+ def buttonAdvanced__clicked(*argv)
473
+ @savantURL = @builder["savantURL"].text
474
+ unless @scliBridge == "~/Applications/RacePointMedia/sclibridge "
475
+ @builder["buttonAnalytics"].hide
476
+ end
477
+ @builder["windowAdvanced"].show
478
+ end
479
+
480
+ def buttonAdvancedCancel__clicked(*argv)
481
+ @builder["windowAdvanced"].hide
482
+ @listviewAdvanced.model.clear
483
+ end
484
+
485
+ #Rebuild listviewAdvanced window
486
+ def repaintAdvanced
487
+ @builder["listviewAdvanced"].hide
488
+ @builder["listviewAdvanced"].show_all
489
+ unless @scliBridge == "~/Applications/RacePointMedia/sclibridge "
490
+ @builder["buttonAnalytics"].hide
491
+ end
492
+ end
493
+
494
+ #Scan the specified IP for Analytics
495
+ def buttonAnalytics__clicked(*argv)
496
+ @builder["labelAdvanced"].label = "<big><b>Analytics</b></big>"
497
+ @builder["windowLoading"].show
498
+ begin
499
+ @listviewAdvanced.model.clear
500
+ Net::SSH.start(@savantURL, @login, :password => @password, :paranoid => false, :timeout => 3) do |ssh|
501
+ # test to see if remote files exist and transfer them if they do
502
+ if @scliBridge == "~/Applications/RacePointMedia/sclibridge "
503
+ @dis = "/Users/RPM/Library/Application Support/RacePointMedia/statusfiles/eventHistory.sqlite"
504
+ else
505
+ @dis = "GNUstep/Library/ApplicationSupport/RacePointMedia/statusfiles/eventHistory.sqlite"
506
+ end
507
+ fileExists = ssh.exec!("[ -f #{@dis} ] && echo 'true' || echo 'false'")
508
+ unless fileExists == 'false'
509
+ ssh.scp.download!(@dis, '/tmp/')
510
+ #read from sqlite database and add to listview
511
+ @db = SQLite3::Database.open('/tmp/eventHistory.sqlite')
512
+ @db.execute( "select * from Analytics" ) do |rowData|
513
+ row = @listviewAdvanced.add_row
514
+ row[:time] = Time.at(rowData[12])
515
+ row[:event] = rowData[1]
516
+ row[:user] = rowData[3]
517
+ row[:deviceName] = rowData[10]
518
+ row[:deviceModel] = rowData[9]
519
+ row[:deviceApp] = rowData[6]
520
+ row[:deviceOS] = rowData[4]
521
+ row[:deviceUID] = rowData[5]
522
+ end
523
+ @listviewAdvanced.col_visible(true)
524
+ @listviewAdvanced.col_visible(:zone => false, :component => false, :logicalComponent => false, :variantID => false, :serviceID => false, :type => false, :argument => false)
525
+
526
+ repaintAdvanced
527
+ end
528
+ end
529
+ rescue Net::SSH::ConnectionTimeout, SocketError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED, Errno::EHOSTDOWN
530
+ alert("Host not reached.", :parent => self)
531
+ end
532
+ @builder["windowLoading"].hide
533
+ end
534
+
535
+ #Scan the specified IP for Events
536
+ def buttonEvents__clicked(*argv)
537
+ @builder["labelAdvanced"].label = "<big><b>Events</b></big>"
538
+ @builder["windowLoading"].show
539
+ begin
540
+ @listviewAdvanced.model.clear
541
+ Net::SSH.start(@savantURL, @login, :password => @password, :paranoid => false, :timeout => 3) do |ssh|
542
+ # test to see if remote files exist and transfer them if they do
543
+ if @scliBridge == "~/Applications/RacePointMedia/sclibridge "
544
+ @dis = "/Users/RPM/Library/Application Support/RacePointMedia/statusfiles/eventHistory.sqlite"
545
+ else
546
+ @dis = "GNUstep/Library/ApplicationSupport/RacePointMedia/statusfiles/eventHistory.sqlite"
547
+ end
548
+ fileExists = ssh.exec!("[ -f #{@dis} ] && echo 'true' || echo 'false'")
549
+ unless fileExists == 'false'
550
+ ssh.scp.download!(@dis, '/tmp/')
551
+ #read from sqlite database and add to listview
552
+ @db = SQLite3::Database.open('/tmp/eventHistory.sqlite')
553
+ @db.execute( "select * from Events" ) do |rowData|
554
+ row = @listviewAdvanced.add_row
555
+ row[:time] = Time.at(rowData[0].to_i)
556
+ row[:user] = rowData[1]
557
+ row[:zone] = rowData[5]
558
+ row[:component] = rowData[6]
559
+ row[:logicalComponent] = rowData[7]
560
+ row[:variantID] = rowData[8]
561
+ row[:serviceID] = rowData[9]
562
+ row[:type] = rowData[2]
563
+ row[:argument] = rowData[3]
564
+ end
565
+ @listviewAdvanced.col_visible(true)
566
+ @listviewAdvanced.col_visible(:event => false, :deviceName => false, :deviceModel => false, :deviceApp => false, :deviceOS => false, :deviceUID => false)
567
+
568
+ repaintAdvanced
569
+ end
570
+ end
571
+ rescue Net::SSH::ConnectionTimeout, SocketError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED, Errno::EHOSTDOWN
572
+ alert("Host not reached.", :parent => self)
573
+ end
574
+ @builder["windowLoading"].hide
575
+ end
507
576
  end
@@ -172,7 +172,7 @@
172
172
  <property name="name">30</property>
173
173
  <property name="visible">True</property>
174
174
  <property name="can_focus">False</property>
175
- <property name="margin_left">240</property>
175
+ <property name="margin_left">180</property>
176
176
  <property name="margin_top">12</property>
177
177
  <property name="margin_bottom">12</property>
178
178
  <property name="column_spacing">3</property>
@@ -246,6 +246,18 @@
246
246
  <property name="top_attach">0</property>
247
247
  </packing>
248
248
  </child>
249
+ <child>
250
+ <object class="GtkButton" id="buttonAdvanced">
251
+ <property name="label" translatable="yes">Advanced</property>
252
+ <property name="visible">True</property>
253
+ <property name="can_focus">True</property>
254
+ <property name="receives_default">True</property>
255
+ </object>
256
+ <packing>
257
+ <property name="left_attach">4</property>
258
+ <property name="top_attach">0</property>
259
+ </packing>
260
+ </child>
249
261
  </object>
250
262
  <packing>
251
263
  <property name="left_attach">0</property>
@@ -282,7 +294,9 @@
282
294
  <property name="label" translatable="yes"> Savant scene manager copies the dashboard.sqlite file from the host to a temporary folder and lists all scenes from all users on that host.
283
295
  You can backup and restore this database, as well as delete scenes or edit certain properties: Scene Name, user email, and if the scene is Global.
284
296
 
285
- If the host is running at least 8.3, you can also activate scenes.</property>
297
+ If the host is running 8.x, you can see Event History.
298
+ If the host is a Pro Host, you can see Analytics Data.
299
+ If the host is running at least 8.3, you can Activate Scenes.</property>
286
300
  <property name="justify">center</property>
287
301
  <property name="wrap">True</property>
288
302
  <property name="wrap_mode">word-char</property>
@@ -297,6 +311,148 @@ If the host is running at least 8.3, you can also activate scenes.</property>
297
311
  </object>
298
312
  </child>
299
313
  </object>
314
+ <object class="GtkWindow" id="windowAdvanced">
315
+ <property name="can_focus">False</property>
316
+ <property name="modal">True</property>
317
+ <property name="window_position">center-on-parent</property>
318
+ <property name="gravity">center</property>
319
+ <property name="transient_for">window1</property>
320
+ <child>
321
+ <object class="GtkGrid">
322
+ <property name="visible">True</property>
323
+ <property name="can_focus">False</property>
324
+ <child>
325
+ <object class="GtkLabel" id="labelAdvanced">
326
+ <property name="visible">True</property>
327
+ <property name="can_focus">False</property>
328
+ <property name="margin_top">12</property>
329
+ <property name="margin_bottom">12</property>
330
+ <property name="label" translatable="yes">&lt;big&gt;&lt;b&gt;Advanced&lt;/b&gt;&lt;/big&gt;</property>
331
+ <property name="use_markup">True</property>
332
+ </object>
333
+ <packing>
334
+ <property name="left_attach">0</property>
335
+ <property name="top_attach">0</property>
336
+ </packing>
337
+ </child>
338
+ <child>
339
+ <object class="GtkScrolledWindow" id="listviewAdvanced">
340
+ <property name="visible">True</property>
341
+ <property name="can_focus">True</property>
342
+ <property name="margin_left">12</property>
343
+ <property name="margin_right">12</property>
344
+ <property name="margin_top">12</property>
345
+ <property name="margin_bottom">12</property>
346
+ <property name="shadow_type">in</property>
347
+ <property name="min_content_width">600</property>
348
+ <property name="min_content_height">300</property>
349
+ <property name="propagate_natural_width">True</property>
350
+ <child>
351
+ <placeholder/>
352
+ </child>
353
+ </object>
354
+ <packing>
355
+ <property name="left_attach">0</property>
356
+ <property name="top_attach">1</property>
357
+ </packing>
358
+ </child>
359
+ <child>
360
+ <object class="GtkGrid">
361
+ <property name="visible">True</property>
362
+ <property name="can_focus">False</property>
363
+ <property name="margin_left">12</property>
364
+ <property name="margin_right">12</property>
365
+ <property name="margin_top">12</property>
366
+ <property name="margin_bottom">12</property>
367
+ <property name="hexpand">True</property>
368
+ <property name="column_spacing">12</property>
369
+ <property name="column_homogeneous">True</property>
370
+ <child>
371
+ <object class="GtkButton" id="buttonAnalytics">
372
+ <property name="label" translatable="yes">Analytics</property>
373
+ <property name="visible">True</property>
374
+ <property name="can_focus">True</property>
375
+ <property name="receives_default">True</property>
376
+ </object>
377
+ <packing>
378
+ <property name="left_attach">0</property>
379
+ <property name="top_attach">0</property>
380
+ </packing>
381
+ </child>
382
+ <child>
383
+ <object class="GtkButton" id="buttonEvents">
384
+ <property name="label" translatable="yes">Event History</property>
385
+ <property name="visible">True</property>
386
+ <property name="can_focus">True</property>
387
+ <property name="receives_default">True</property>
388
+ </object>
389
+ <packing>
390
+ <property name="left_attach">1</property>
391
+ <property name="top_attach">0</property>
392
+ </packing>
393
+ </child>
394
+ <child>
395
+ <object class="GtkButton" id="buttonAdvancedCancel">
396
+ <property name="label" translatable="yes">Cancel</property>
397
+ <property name="visible">True</property>
398
+ <property name="can_focus">True</property>
399
+ <property name="receives_default">True</property>
400
+ </object>
401
+ <packing>
402
+ <property name="left_attach">3</property>
403
+ <property name="top_attach">0</property>
404
+ </packing>
405
+ </child>
406
+ <child>
407
+ <object class="GtkAlignment">
408
+ <property name="visible">True</property>
409
+ <property name="can_focus">False</property>
410
+ <child>
411
+ <placeholder/>
412
+ </child>
413
+ </object>
414
+ <packing>
415
+ <property name="left_attach">2</property>
416
+ <property name="top_attach">0</property>
417
+ </packing>
418
+ </child>
419
+ </object>
420
+ <packing>
421
+ <property name="left_attach">0</property>
422
+ <property name="top_attach">2</property>
423
+ </packing>
424
+ </child>
425
+ </object>
426
+ </child>
427
+ </object>
428
+ <object class="GtkWindow" id="windowLoading">
429
+ <property name="width_request">100</property>
430
+ <property name="height_request">100</property>
431
+ <property name="can_focus">False</property>
432
+ <property name="resizable">False</property>
433
+ <property name="modal">True</property>
434
+ <property name="window_position">center-on-parent</property>
435
+ <property name="default_width">100</property>
436
+ <property name="default_height">100</property>
437
+ <property name="urgency_hint">True</property>
438
+ <property name="decorated">False</property>
439
+ <property name="deletable">False</property>
440
+ <property name="gravity">center</property>
441
+ <property name="transient_for">windowAdvanced</property>
442
+ <child>
443
+ <object class="GtkAlignment">
444
+ <property name="visible">True</property>
445
+ <property name="can_focus">False</property>
446
+ <child>
447
+ <object class="GtkLabel">
448
+ <property name="visible">True</property>
449
+ <property name="can_focus">False</property>
450
+ <property name="label" translatable="yes">Loading....</property>
451
+ </object>
452
+ </child>
453
+ </object>
454
+ </child>
455
+ </object>
300
456
  <object class="GtkWindow" id="windowBackupRestore">
301
457
  <property name="width_request">300</property>
302
458
  <property name="height_request">300</property>
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: savant-scenes
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Corey Miller
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir:
10
10
  - bin
11
11
  cert_chain: []
12
- date: 2017-05-05 00:00:00.000000000 Z
12
+ date: 2017-05-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sqlite3