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 +4 -4
- data/bin/src/SceneManager.rb +177 -108
- data/bin/src/glade/SceneManager.glade +158 -2
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA1:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ce04019a545c83f545f5f5e3085dc83e70fab1b2
|
|
4
|
+
data.tar.gz: 25d7a7cd3073350cb970895546ba0005e79e5aa0
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 547ef94aa42f319346118b389eaeaceb16cec1275f5cb15790c12201aff149730ebab57bcfde3a5c711cf3a22f312441d0fa1b1aadee00df0f8a0202b81b4407
|
|
7
|
+
data.tar.gz: dfefe42335f84bdad9ff1c0bce889e3f84b120b8bb08f3a057a25c36cbf7a0583cf7780719867a6d3542f67417fb41b08a4b0e2f6d8c826660363bef287d0340
|
data/bin/src/SceneManager.rb
CHANGED
|
@@ -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
|
|
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
|
|
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/
|
|
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? '
|
|
124
|
-
x = data.split("
|
|
125
|
-
x = x[1].split("
|
|
126
|
-
@savantHostName = x[0]
|
|
127
|
-
@str = @scliBridge + "readstate \"
|
|
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
|
|
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/
|
|
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? '
|
|
138
|
-
x = data.split("
|
|
139
|
-
|
|
140
|
-
x = x[
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
@
|
|
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
|
-
|
|
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">
|
|
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
|
|
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"><big><b>Advanced</b></big></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.
|
|
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-
|
|
12
|
+
date: 2017-05-12 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: sqlite3
|