savant-scenes 1.0.197 → 1.1.0

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: 0007c1e9f3e8d20ce5c408b5779ebdbbe8ee1e27
4
- data.tar.gz: dc1c8d35fe5b4c13176f04153a2380590dcb161b
3
+ metadata.gz: e1e18993338df2f5af7ecf72cefd29641b6cf60d
4
+ data.tar.gz: b7cbed0345fbb29bc73ab0fd0c1bd957ad746b9a
5
5
  SHA512:
6
- metadata.gz: c36428e925283652eccf8d6e6437e1d57ae3daec7c2fd656e884fae7648715f70cba1e4b6af3dc5a892f63f4459f993546ef9291fdeabfee1fb3b576b21c2035
7
- data.tar.gz: b0899d0e9bd7d4a8e06da7ca2436b1a3673e029a68677dd94d2ff6313cc248020fe2a4d006b4a7df2f321426f32660a8ce3f60eded3b158f5ba980c7eaaf873e
6
+ metadata.gz: b7b467d85c69a312edf819654cfc6171a15449fbd1966f2c781c72c59cd3634406ba1e4a9fc27e8765f311e0a2aef9574dd1deebb8c55ecb9e72978a54d8a428
7
+ data.tar.gz: 96c60c822028ac53c44ac22059ae3185d712e03d8dba366d8445e9d5d3696e8d40520cffbd390b8278a1a79b7dd4b93343dda974c2ae134ea0089a9ae7f95eac
@@ -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|
@@ -116,87 +140,59 @@ class SceneManager
116
140
  end
117
141
  end
118
142
  ssh.loop
119
- #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
120
144
  if @scliBridge == "~/Applications/RacePointMedia/sclibridge "
121
145
  ssh.open_channel do |ch, success|
122
146
 
123
- ch.exec("plutil -p 'library/application support/racepointmedia/userconfig.rpmconfig/rpmSystemInfo.plist'")
147
+ ch.exec("plutil -p 'library/application support/racepointmedia/statusfiles/scscredentials.plist'")
124
148
  ch.on_data do |ch, data|
125
- if data.to_s.include? 'module'
126
- x = data.split("\"RPMSystemName\" => ")
127
- x = x[1].split("\n")
128
- @savantHostName = x[0][1..-2]
129
- @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)
130
155
  end
131
156
  end
132
- end
133
- ssh.loop
134
- #Use host name to query SoftwareVersion state from host
135
- ssh.open_channel do |ch, success|
136
- ch.exec(@str)
137
- ch.on_data do |ch, data|
138
- #alert data.inspect
139
- @savantHostVersion = data
140
- end
141
157
  ch.on_extended_data do |ch, type, data|
142
158
  alert "Error: #{data.inspect}"
143
159
  end
144
160
  end
145
161
  ssh.loop
146
- #parse the rpmSystemInfo.plist from the smart host to get host name
162
+ #parse the scscredentials.plist from the smart host to get host name and then version
147
163
  elsif @scliBridge == "source ~/.zshrc && /usr/local/bin/sclibridge "
148
164
  ssh.open_channel do |ch, success|
149
- ch.exec("strings 'GNUstep/Library/ApplicationSupport/RacePointMedia/userConfig.rpmConfig/rpmSystemInfo.plist'")
165
+ ch.exec("strings 'GNUstep/Library/ApplicationSupport/RacePointMedia/statusfiles/scsCredentials.plist'")
150
166
  ch.on_data do |ch, data|
151
- if data.to_s.include? 'DOCTYPE'
152
- x = data.split("RPMUserDefinedName</key><string>")
153
- y = x[1].split("</string>")
154
- x = x[1].split("VERSION</key><integer>")
155
- x = x[1].split("</integer>")
156
- alert("Instant host found at specified IP address. Instant hosts are not supported (even by Savant!)", :parent => self)
157
- return false
158
- @instantHost = true
159
- elsif data.to_s.include? 'module'
160
- x = data.split('module')
161
- x = x[1].split("\n")
162
- @savantHostName = x[0][1..-1]
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
+
163
173
  @str = @scliBridge + "readstate \'" + @savantHostName + ".SoftwareVersion\'"
174
+ @savantHostVersion = ssh.exec!(@str)
164
175
  end
165
176
  end
177
+
166
178
  ch.on_extended_data do |ch, type, data|
167
179
  alert "Error: #{data.inspect}"
168
180
  end
169
181
  end
170
182
  ssh.loop
171
- #Get version from file on smart host
172
- @savantHostVersion = ssh.exec!(@str)
173
- # ssh.open_channel do |ch, success|
174
- # alert "in channel"
175
- # ch.exec("strings 'GNUstep/Library/ApplicationSupport/RacePointMedia/statusfiles/scsCredentials.plist'")
176
- # ch.on_data do |ch, data|
177
- # alert data
178
- # if data.to_s.include? 'version'
179
- # x = data.split("version</key>")
180
- # x = x[1].split(%q{</string>})
181
- # x = x[0].split(%q{<string>})
182
- # @savantHostVersion = x[1]
183
- # end
184
- # end
185
- # end
186
- # ssh.loop
187
- end
188
- end
189
- @builder["labelHostInfo"].text = @savantHostName + " Version : " + @savantHostVersion
190
183
 
191
- #return true if version is 8.3 or later
192
- if @savantHostVersion.to_r > 8.2 && !@savantHostVersion.empty?
193
- return true
194
- else
195
- return false
184
+ end
196
185
  end
197
-
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
198
195
  rescue Net::SSH::ConnectionTimeout, SocketError, Errno::EHOSTUNREACH, Errno::ECONNREFUSED, Errno::EHOSTDOWN
199
-
200
196
  end
201
197
  end
202
198
 
@@ -212,6 +208,11 @@ class SceneManager
212
208
  @builder["window1"].show_all
213
209
  unless savantVersion?(@savantURL)
214
210
  @builder["buttonActivateScene"].hide
211
+ end
212
+ if @savantHostVersion.to_r > 8.0
213
+ @builder["buttonAdvanced"].show
214
+ else
215
+ @builder["buttonAdvanced"].hide
215
216
  end
216
217
  end
217
218
 
@@ -219,10 +220,8 @@ class SceneManager
219
220
  def buttonScanHost__clicked(*argv)
220
221
  @savantURL = @builder["savantURL"].text
221
222
  if is_port_open?(@savantURL,"11263") || is_port_open?(@savantURL,"48664") || is_port_open?(@savantURL,"1124")
222
- unless savantVersion?(@savantURL)
223
- @builder["buttonActivateScene"].hide
224
- end
225
223
  begin
224
+ savantVersion?(@savantURL)
226
225
  @listviewSavantScenes.model.clear
227
226
  Net::SSH.start(@savantURL, @login, :password => @password, :paranoid => false, :timeout => 3) do |ssh|
228
227
  # test to see if remote files exist and transfer them if they do
@@ -391,64 +390,6 @@ class SceneManager
391
390
  end
392
391
  end
393
392
 
394
- # Duplicate the selected scenes
395
- # def buttonDuplicateScene__clicked(*argv)
396
- # get_glade_variables()
397
- #
398
- # duplicateIDs = []
399
- # duplicateScenes = []
400
- # duplicateUserss = []
401
- # duplicateImages = []
402
- # duplicateTags = []
403
- # duplicateGlobals = []
404
- # duplicateActives = []
405
- # duplicateScheduled = []
406
- # duplicateCustomImages = []
407
- # duplicateSceneOrders = []
408
- #
409
- # count = 0
410
- # @listviewSavantScenes.each_row do |row|
411
- # if row[:modify]
412
- # count += 1
413
- # duplicateIDs << row[:id]
414
- # duplicateScenes << row[:scene]
415
- # duplicateUsers << row[:user]
416
- # duplicateImages << row[:image]
417
- # duplicateTags << row[:tags]
418
- # duplicateGlobals << row[:isGlobal]
419
- # duplicateActives << row[:isActive]
420
- # duplicateScheduled << row[:isScheduled]
421
- # duplicateCustomImages << row[:HasCustomImage]
422
- # duplicateSceneOrders << row[:userSceneOrder]
423
- # end
424
- # end
425
- # make sure a scene was selected, else alert the user
426
- # if count > 0
427
- # confirm the edits should be made
428
- # strAlert = "Do you want to delete the following scenes from the Savant host?\n\n" + deleteScenes.join("\n")
429
- # if alert(strAlert, :headline => "Delete Scenes?", :button_yes => "Delete", :button_cancel => "Cancel", :parent => self)
430
- # edit the database with the updated info
431
- # deleteIDs.each do |id|
432
- # stm = @db.prepare( "delete from sceneusermap where sceneIdentifier=?" )
433
- # stm.bind_param 1, id
434
- # stm.execute
435
- # stm.close
436
- # stm = @db.prepare( "delete from scenes where identifier=?" )
437
- # stm.bind_param 1, id
438
- # stm.execute
439
- # stm.close
440
- # stm = @db.prepare( "delete from scenedefinitions where sceneIdentifier=?" )
441
- # stm.bind_param 1, id
442
- # stm.execute
443
- # stm.close
444
- # end
445
- # updateDatabase()
446
- # buttonScanHost__clicked()
447
- # end
448
- # else
449
- # alert("Please select at least 1 row to modify.", :parent => self)
450
- # end
451
- # end
452
393
 
453
394
  # #
454
395
  # BACKUP AND RESTORE #
@@ -526,4 +467,110 @@ class SceneManager
526
467
  @builder["window1"].destroy
527
468
  end
528
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
529
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.197
4
+ version: 1.1.0
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-08 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