qasim 0.1.11.dev.2014102811
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +31 -0
- data/Gemfile +7 -0
- data/LICENSE-GPL-3 +674 -0
- data/Makefile +180 -0
- data/README.md +81 -0
- data/Rakefile +1 -0
- data/TODO.md +28 -0
- data/bin/qasim-cli +89 -0
- data/bin/qasim-gui +300 -0
- data/conf/config +2 -0
- data/conf/default.map +32 -0
- data/conf/qasim.desktop +13 -0
- data/data/icons/qasim.128.png +0 -0
- data/data/icons/qasim.16.png +0 -0
- data/data/icons/qasim.256.png +0 -0
- data/data/icons/qasim.32.png +0 -0
- data/data/icons/qasim.64.png +0 -0
- data/data/icons/qasim.png +0 -0
- data/data/icons/qasim.svg +192 -0
- data/data/text/authors.html +7 -0
- data/data/text/gpl-3.0-standalone.html +694 -0
- data/data/text/thanks.html +0 -0
- data/debian/changelog +73 -0
- data/debian/compat +1 -0
- data/debian/control +13 -0
- data/debian/copyright +38 -0
- data/debian/dirs +3 -0
- data/debian/docs +0 -0
- data/debian/rules +80 -0
- data/debian/source/format +1 -0
- data/demo.map +29 -0
- data/examples/config +2 -0
- data/examples/default.map +32 -0
- data/lib/qasim.rb +11 -0
- data/lib/qasim/config.rb +56 -0
- data/lib/qasim/configold.rb +123 -0
- data/lib/qasim/constants.rb +11 -0
- data/lib/qasim/map.rb +225 -0
- data/lib/qasim/qasim.qrc +8 -0
- data/lib/qasim/ui.rb +7 -0
- data/lib/qasim/ui/about.rb +58 -0
- data/lib/qasim/ui/about.ui +192 -0
- data/lib/qasim/ui/listmaps.ui +59 -0
- data/lib/qasim/ui/preferences.rb +12 -0
- data/lib/qasim/ui/preferences.ui +90 -0
- data/lib/qasim/version.rb +5 -0
- data/man/qasim-cli.1 +98 -0
- data/man/qasim-gui.1 +98 -0
- data/man/sshfs-mapper.1 +98 -0
- data/mapparser.y +155 -0
- data/qasim.gemspec +34 -0
- data/sshfs-mapper.completion +24 -0
- data/sshfs-mapper.sh +253 -0
- metadata +147 -0
@@ -0,0 +1,11 @@
|
|
1
|
+
module Qasim
|
2
|
+
APP_ICON_PATH = File.join QASIM_DATA_DIR, "icons"
|
3
|
+
|
4
|
+
APP_SYSCONFIG_DIR = "/etc/qasim/maps.d"
|
5
|
+
|
6
|
+
APP_CONFIG_DIR = if ENV['XDG_CONFIG_HOME'] then
|
7
|
+
File.join ENV['XDG_CONFIG_HOME'], 'qasim'
|
8
|
+
else
|
9
|
+
File.join ENV['HOME'], '.config', 'qasim'
|
10
|
+
end
|
11
|
+
end
|
data/lib/qasim/map.rb
ADDED
@@ -0,0 +1,225 @@
|
|
1
|
+
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
#require 'rdebug/base'
|
5
|
+
require 'qasim'
|
6
|
+
|
7
|
+
module Qasim
|
8
|
+
|
9
|
+
class Map
|
10
|
+
attr_reader :path,
|
11
|
+
:host,
|
12
|
+
:port,
|
13
|
+
:enable,
|
14
|
+
:user,
|
15
|
+
:map,
|
16
|
+
:name
|
17
|
+
|
18
|
+
class MapParseError < RuntimeError ; end
|
19
|
+
class ConnectError < RuntimeError ; end
|
20
|
+
|
21
|
+
CYPHER_ARCFOUR = :arcfour
|
22
|
+
CYPHER_AES256CBC = "aes-256-cbc".to_sym
|
23
|
+
CYPHERS = [ CYPHER_ARCFOUR, CYPHER_AES256CBC ]
|
24
|
+
|
25
|
+
|
26
|
+
#
|
27
|
+
# Set defaults properties for maps
|
28
|
+
#
|
29
|
+
def initialize config, map_path
|
30
|
+
@config = config
|
31
|
+
@path = map_path
|
32
|
+
@host = nil
|
33
|
+
@port = 22
|
34
|
+
@enable = false
|
35
|
+
@user = nil
|
36
|
+
@cypher = :arcfour
|
37
|
+
@links = {}
|
38
|
+
@debug = false
|
39
|
+
@name = (File.basename map_path).gsub(/\.map$/,'')
|
40
|
+
|
41
|
+
self.load @path
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
#
|
46
|
+
# Load map description from file
|
47
|
+
#
|
48
|
+
def load path=nil
|
49
|
+
@path=path unless path.nil?
|
50
|
+
#rdebug "Parsing map #{@path}"
|
51
|
+
f = File.open @path
|
52
|
+
linect = 0
|
53
|
+
local_env = ENV.clone
|
54
|
+
f.each do |line|
|
55
|
+
line = line.strip
|
56
|
+
linect += 1
|
57
|
+
|
58
|
+
while line =~ /\$(\w+)/ do
|
59
|
+
#puts "FOUND PATTERN %s => %s" % [$1, local_env[$1]]
|
60
|
+
case line
|
61
|
+
when /\$\{(.+)\}/ then
|
62
|
+
pattern = $1
|
63
|
+
puts pattern
|
64
|
+
line.gsub!(/\$\{#{pattern}\}/,local_env[pattern])
|
65
|
+
when /\$(\w+)/ then
|
66
|
+
pattern = $1
|
67
|
+
line.gsub!(/\$#{pattern}/,local_env[pattern])
|
68
|
+
else
|
69
|
+
puts "w: unknown pattern: %s" % line
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
case line
|
74
|
+
when /^\s*REMOTE_USER\s*=\s*(.*)\s*$/ then
|
75
|
+
@user = $1
|
76
|
+
#rdebug "d: remote_user => #{$1}"
|
77
|
+
when /^\s*REMOTE_PORT\s*=\s*(.*)\s*$/ then
|
78
|
+
@port = $1.to_i
|
79
|
+
#rdebug "d: remote_port => #{$1}"
|
80
|
+
when /^\s*REMOTE_HOST\s*=\s*(.*)\s*$/ then
|
81
|
+
@host = $1
|
82
|
+
#rdebug "d: remote_host => #{$1}"
|
83
|
+
when /^\s*REMOTE_CYPHER\s*=\s*(.*)\s*$/ then
|
84
|
+
if CYPHERS.map{|x| x.to_s}.include? $1 then
|
85
|
+
@host = $1.to_sym
|
86
|
+
end
|
87
|
+
when /^\s*MAP\s*=\s*(.*)\s+(.*)\s*$/ then
|
88
|
+
@links[$1] = $2
|
89
|
+
#rdebug "d: link #{$1} => #{$2}"
|
90
|
+
when /^\s*$/,/^\s*#/ then
|
91
|
+
#rdebug "d: dropping empty line"
|
92
|
+
else
|
93
|
+
raise MapParseError, "parse error at #{@path}:#{linect}"
|
94
|
+
end
|
95
|
+
end
|
96
|
+
f.close
|
97
|
+
end
|
98
|
+
|
99
|
+
|
100
|
+
#
|
101
|
+
# Write map description to file
|
102
|
+
#
|
103
|
+
def write path=nil
|
104
|
+
@path=path unless path.nil?
|
105
|
+
|
106
|
+
File.open(@path, "w") do |f|
|
107
|
+
f.puts "REMOTE_USER=%s" % @user
|
108
|
+
f.puts "REMOTE_PORT=%s" % @port
|
109
|
+
f.puts "REMOTE_HOST=%s" % @host
|
110
|
+
f.puts "REMOTE_CYPHER=%s" % @cypher
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
|
115
|
+
#
|
116
|
+
# Test map liveness (how ?)
|
117
|
+
# FIXME: not implemented
|
118
|
+
#
|
119
|
+
def online?
|
120
|
+
#rdebug "testing online? %s " % self.inspect
|
121
|
+
#FIXME: test liveness
|
122
|
+
end
|
123
|
+
|
124
|
+
|
125
|
+
#
|
126
|
+
# Test if map is connected / mounted
|
127
|
+
#
|
128
|
+
def connected?
|
129
|
+
f = File.open("/proc/mounts")
|
130
|
+
sshfs_mounted = (f.readlines.select do |line|
|
131
|
+
line =~ /\s+fuse.sshfs\s+/
|
132
|
+
end).map do |line|
|
133
|
+
line.split(/\s+/)[1]
|
134
|
+
end
|
135
|
+
f.close
|
136
|
+
|
137
|
+
score = 0
|
138
|
+
@links.each do |name, remotepath|
|
139
|
+
score += 1
|
140
|
+
local_path = File.join @config.mnt_dir, name
|
141
|
+
|
142
|
+
if sshfs_mounted.include? local_path then
|
143
|
+
score -= 1
|
144
|
+
end
|
145
|
+
end
|
146
|
+
if score == 0 then return true
|
147
|
+
else return false
|
148
|
+
# FIXME: explain why ?
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
|
153
|
+
#
|
154
|
+
# Connect map
|
155
|
+
#
|
156
|
+
def connect &block
|
157
|
+
puts "[#{File.basename @path}] Connecting..."
|
158
|
+
puts " #{@user}@#{@host}:#{@port}"
|
159
|
+
#puts " links = %s" % @links.map{ |k,v| "%s => %s" % [ k, v ] }.join(', ')
|
160
|
+
# do something
|
161
|
+
# test server connection
|
162
|
+
# mount
|
163
|
+
#
|
164
|
+
# FIXME: test connexion with Net::SSH + timeout or ask password
|
165
|
+
@links.each do |name, remotepath|
|
166
|
+
localpath = File.join ENV['HOME'], "mnt", name
|
167
|
+
FileUtils.mkdir_p localpath
|
168
|
+
cmd = "sshfs"
|
169
|
+
cmd_args = [
|
170
|
+
"-o","allow_root" ,
|
171
|
+
"-o","idmap=user" ,
|
172
|
+
"-o","uid=%s" % Process.uid,
|
173
|
+
"-o","gid=%s" % Process.gid,
|
174
|
+
"-o","reconnect", # auto-reconnection
|
175
|
+
"-o","workaround=all",
|
176
|
+
"-o","cache_timeout=900", # 15 min cache for files
|
177
|
+
"-o","cache_stat_timeout=1800", # 30 min cache for directories
|
178
|
+
"-o","cache_link_timout=1800", # 30 min cache for links
|
179
|
+
"-o","attr_timeout=1800", # 30 min attr cache
|
180
|
+
"-o","entry_timeout=1800", # 30 min entry cache
|
181
|
+
"-o","ServerAliveInterval=15", # prevent I/O hang
|
182
|
+
"-o","ServerAliveCountMax=3", # prevent I/O hang
|
183
|
+
"-o","no_readahead",
|
184
|
+
#"-o","Ciphers=arcfour", # force cypher
|
185
|
+
"-o","Port=%s" % @port,
|
186
|
+
"%s@%s:%s" % [@user,@host,remotepath],
|
187
|
+
localpath ]
|
188
|
+
#rdebug "command: %s" % [ cmd, cmd_args ].flatten.join(' ')
|
189
|
+
if block_given? then
|
190
|
+
yield name, cmd, cmd_args
|
191
|
+
else
|
192
|
+
system cmd, cmd_args
|
193
|
+
if $?.exitstatus != 0 then
|
194
|
+
raise ConnectError, self
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
|
201
|
+
#
|
202
|
+
# Disconnect map
|
203
|
+
#
|
204
|
+
def disconnect &block
|
205
|
+
puts "Disconnecting map #{@path}"
|
206
|
+
@links.each do |name, remotepath|
|
207
|
+
localpath = File.join ENV['HOME'], "mnt", name
|
208
|
+
cmd = "fusermount"
|
209
|
+
cmd_args = [
|
210
|
+
"-u", #umount
|
211
|
+
"-z" ,#lazy
|
212
|
+
localpath ]
|
213
|
+
#rdebug "command: %s" % [ cmd, cmd_args ].flatten.join(' ')
|
214
|
+
if block_given? then
|
215
|
+
yield name, cmd, cmd_args
|
216
|
+
else
|
217
|
+
system cmd, cmd_args
|
218
|
+
if $?.exitstatus != 0 then
|
219
|
+
raise ConnectError, self
|
220
|
+
end
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
end
|
data/lib/qasim/qasim.qrc
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
<RCC>
|
2
|
+
<qresource prefix="qasim">
|
3
|
+
<file alias="authors">../../data/text/authors.html</file>
|
4
|
+
<file alias="thanks">../../data/text/thanks.html</file>
|
5
|
+
<file alias="licence-gpl3">../../data/text/gpl-3.0-standalone.html</file>
|
6
|
+
<file alias="qasim-icon">../../data/icons/qasim.svg</file>
|
7
|
+
</qresource>
|
8
|
+
</RCC>
|
data/lib/qasim/ui.rb
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
|
2
|
+
require 'qasim/ui/about_ui'
|
3
|
+
|
4
|
+
module Qasim ; module Ui
|
5
|
+
class About < Qt::Dialog
|
6
|
+
def initialize(parent = nil)
|
7
|
+
super
|
8
|
+
@ui = Ui_About.new
|
9
|
+
@ui.setup_ui(self)
|
10
|
+
|
11
|
+
#FIXME: attach button events to dialog.close
|
12
|
+
#Qt::Object.connect( w, SIGNAL( :clicked ), a, SLOT( :quit ) )
|
13
|
+
|
14
|
+
# Change title according to current version
|
15
|
+
title_str = "Qasim v%s (%s)" % [ Qasim::APP_VERSION, Qasim::APP_DATE ]
|
16
|
+
@ui.title_label.text = Qt::Application.translate(
|
17
|
+
"About",
|
18
|
+
title_str,
|
19
|
+
nil,
|
20
|
+
Qt::Application::UnicodeUTF8
|
21
|
+
)
|
22
|
+
|
23
|
+
# Read Authors
|
24
|
+
file = Qt::File.new(':/qasim/authors')
|
25
|
+
if file.open(Qt::File::ReadOnly | Qt::File::Text)
|
26
|
+
stream = Qt::TextStream.new( file )
|
27
|
+
@ui.authors_textedit.text = stream.readAll()
|
28
|
+
file.close
|
29
|
+
else
|
30
|
+
# FIXME handle error on authors reading
|
31
|
+
end
|
32
|
+
|
33
|
+
# Read Thanks
|
34
|
+
file = Qt::File.new(':/qasim/thanks')
|
35
|
+
if file.open(Qt::File::ReadOnly | Qt::File::Text)
|
36
|
+
stream = Qt::TextStream.new( file )
|
37
|
+
@ui.thanks_textedit.text = stream.readAll()
|
38
|
+
file.close
|
39
|
+
else
|
40
|
+
# FIXME handle error on thanks reading
|
41
|
+
end
|
42
|
+
|
43
|
+
# Read License
|
44
|
+
file = Qt::File.new(':/qasim/licence-gpl3')
|
45
|
+
if file.open(Qt::File::ReadOnly | Qt::File::Text)
|
46
|
+
stream = Qt::TextStream.new( file )
|
47
|
+
@ui.license_textedit.text = stream.readAll()
|
48
|
+
file.close
|
49
|
+
else
|
50
|
+
# FIXME handle error on licence reading
|
51
|
+
end
|
52
|
+
|
53
|
+
# set first tab
|
54
|
+
@ui.tab_widget.setCurrentIndex(0)
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
end ; end
|
@@ -0,0 +1,192 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<ui version="4.0">
|
3
|
+
<class>About</class>
|
4
|
+
<widget class="QDialog" name="About">
|
5
|
+
<property name="geometry">
|
6
|
+
<rect>
|
7
|
+
<x>0</x>
|
8
|
+
<y>0</y>
|
9
|
+
<width>470</width>
|
10
|
+
<height>500</height>
|
11
|
+
</rect>
|
12
|
+
</property>
|
13
|
+
<property name="windowTitle">
|
14
|
+
<string>About</string>
|
15
|
+
</property>
|
16
|
+
<property name="windowIcon">
|
17
|
+
<iconset resource="../qasim.qrc">
|
18
|
+
<normaloff>:/qasim/qasim-icon</normaloff>:/qasim/qasim-icon</iconset>
|
19
|
+
</property>
|
20
|
+
<property name="sizeGripEnabled">
|
21
|
+
<bool>true</bool>
|
22
|
+
</property>
|
23
|
+
<layout class="QVBoxLayout" name="verticalLayout_2">
|
24
|
+
<item>
|
25
|
+
<layout class="QVBoxLayout" name="vertical_layout">
|
26
|
+
<item>
|
27
|
+
<layout class="QHBoxLayout" name="horizontal_layout">
|
28
|
+
<item>
|
29
|
+
<widget class="QLabel" name="icon_label">
|
30
|
+
<property name="text">
|
31
|
+
<string/>
|
32
|
+
</property>
|
33
|
+
<property name="pixmap">
|
34
|
+
<pixmap resource="../qasim.qrc">:/qasim/qasim-icon</pixmap>
|
35
|
+
</property>
|
36
|
+
</widget>
|
37
|
+
</item>
|
38
|
+
<item>
|
39
|
+
<widget class="QLabel" name="title_label">
|
40
|
+
<property name="sizePolicy">
|
41
|
+
<sizepolicy hsizetype="Expanding" vsizetype="Maximum">
|
42
|
+
<horstretch>0</horstretch>
|
43
|
+
<verstretch>0</verstretch>
|
44
|
+
</sizepolicy>
|
45
|
+
</property>
|
46
|
+
<property name="font">
|
47
|
+
<font>
|
48
|
+
<weight>75</weight>
|
49
|
+
<bold>true</bold>
|
50
|
+
</font>
|
51
|
+
</property>
|
52
|
+
<property name="text">
|
53
|
+
<string>Qasim vVERSION (DATE)</string>
|
54
|
+
</property>
|
55
|
+
</widget>
|
56
|
+
</item>
|
57
|
+
</layout>
|
58
|
+
</item>
|
59
|
+
<item>
|
60
|
+
<widget class="QTabWidget" name="tab_widget">
|
61
|
+
<property name="currentIndex">
|
62
|
+
<number>0</number>
|
63
|
+
</property>
|
64
|
+
<widget class="QWidget" name="about_tab">
|
65
|
+
<attribute name="title">
|
66
|
+
<string>About</string>
|
67
|
+
</attribute>
|
68
|
+
<layout class="QGridLayout" name="gridLayout">
|
69
|
+
<item row="0" column="0">
|
70
|
+
<widget class="QLabel" name="about_label">
|
71
|
+
<property name="sizePolicy">
|
72
|
+
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
73
|
+
<horstretch>0</horstretch>
|
74
|
+
<verstretch>0</verstretch>
|
75
|
+
</sizepolicy>
|
76
|
+
</property>
|
77
|
+
<property name="minimumSize">
|
78
|
+
<size>
|
79
|
+
<width>300</width>
|
80
|
+
<height>200</height>
|
81
|
+
</size>
|
82
|
+
</property>
|
83
|
+
<property name="text">
|
84
|
+
<string><html><head/><body><p align="center">A cross platform SSHFS Mapping tool.</p><p align="center">Copyright © 2011-2012 The Qasim Team</p><p align="center"><br/></p><p align="center"><a href="http://github.com/Glenux/Qasim"><span style=" text-decoration: underline; color:#0057ae;">http://github.com/Glenux/Qasim</span></a></p></body></html></string>
|
85
|
+
</property>
|
86
|
+
<property name="scaledContents">
|
87
|
+
<bool>false</bool>
|
88
|
+
</property>
|
89
|
+
<property name="margin">
|
90
|
+
<number>10</number>
|
91
|
+
</property>
|
92
|
+
</widget>
|
93
|
+
</item>
|
94
|
+
</layout>
|
95
|
+
</widget>
|
96
|
+
<widget class="QWidget" name="authors_tab">
|
97
|
+
<attribute name="title">
|
98
|
+
<string>Authors</string>
|
99
|
+
</attribute>
|
100
|
+
<layout class="QVBoxLayout" name="_2">
|
101
|
+
<item>
|
102
|
+
<widget class="QTextEdit" name="authors_textedit">
|
103
|
+
<property name="sizePolicy">
|
104
|
+
<sizepolicy hsizetype="Expanding" vsizetype="Expanding">
|
105
|
+
<horstretch>0</horstretch>
|
106
|
+
<verstretch>0</verstretch>
|
107
|
+
</sizepolicy>
|
108
|
+
</property>
|
109
|
+
<property name="html">
|
110
|
+
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
111
|
+
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
112
|
+
p, li { white-space: pre-wrap; }
|
113
|
+
</style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;">
|
114
|
+
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></string>
|
115
|
+
</property>
|
116
|
+
</widget>
|
117
|
+
</item>
|
118
|
+
</layout>
|
119
|
+
</widget>
|
120
|
+
<widget class="QWidget" name="thanks_tab">
|
121
|
+
<attribute name="title">
|
122
|
+
<string>Thanks to</string>
|
123
|
+
</attribute>
|
124
|
+
<layout class="QVBoxLayout" name="verticalLayout_4">
|
125
|
+
<item>
|
126
|
+
<widget class="QTextEdit" name="thanks_textedit"/>
|
127
|
+
</item>
|
128
|
+
</layout>
|
129
|
+
</widget>
|
130
|
+
<widget class="QWidget" name="license_tab">
|
131
|
+
<attribute name="title">
|
132
|
+
<string>License</string>
|
133
|
+
</attribute>
|
134
|
+
<layout class="QVBoxLayout" name="verticalLayout_5">
|
135
|
+
<item>
|
136
|
+
<widget class="QTextEdit" name="license_textedit">
|
137
|
+
<property name="minimumSize">
|
138
|
+
<size>
|
139
|
+
<width>300</width>
|
140
|
+
<height>200</height>
|
141
|
+
</size>
|
142
|
+
</property>
|
143
|
+
<property name="html">
|
144
|
+
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
145
|
+
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
146
|
+
p, li { white-space: pre-wrap; }
|
147
|
+
</style></head><body style=" font-family:'DejaVu Sans'; font-size:9pt; font-weight:400; font-style:normal;">
|
148
|
+
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></string>
|
149
|
+
</property>
|
150
|
+
</widget>
|
151
|
+
</item>
|
152
|
+
</layout>
|
153
|
+
</widget>
|
154
|
+
</widget>
|
155
|
+
</item>
|
156
|
+
</layout>
|
157
|
+
</item>
|
158
|
+
<item>
|
159
|
+
<widget class="QDialogButtonBox" name="button_box">
|
160
|
+
<property name="orientation">
|
161
|
+
<enum>Qt::Horizontal</enum>
|
162
|
+
</property>
|
163
|
+
<property name="standardButtons">
|
164
|
+
<set>QDialogButtonBox::Close</set>
|
165
|
+
</property>
|
166
|
+
</widget>
|
167
|
+
</item>
|
168
|
+
</layout>
|
169
|
+
</widget>
|
170
|
+
<resources>
|
171
|
+
<include location="../qasim.qrc"/>
|
172
|
+
<include location="../../../qasim.qrc"/>
|
173
|
+
</resources>
|
174
|
+
<connections>
|
175
|
+
<connection>
|
176
|
+
<sender>button_box</sender>
|
177
|
+
<signal>clicked(QAbstractButton*)</signal>
|
178
|
+
<receiver>About</receiver>
|
179
|
+
<slot>accept()</slot>
|
180
|
+
<hints>
|
181
|
+
<hint type="sourcelabel">
|
182
|
+
<x>463</x>
|
183
|
+
<y>493</y>
|
184
|
+
</hint>
|
185
|
+
<hint type="destinationlabel">
|
186
|
+
<x>469</x>
|
187
|
+
<y>12</y>
|
188
|
+
</hint>
|
189
|
+
</hints>
|
190
|
+
</connection>
|
191
|
+
</connections>
|
192
|
+
</ui>
|