savant-scenes 1.0.197 → 1.1.0

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: 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