savant-scenes 1.0.1 → 1.0.2

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