manqod 1.1505.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/manqod +309 -0
- data/doc/HOWTOS +11 -0
- data/doc/INSTALL +6 -0
- data/doc/LICENCE +450 -0
- data/doc/README +33 -0
- data/doc/benchmarkings/ListLoader.rb +177 -0
- data/doc/manqod.png +0 -0
- data/doc/manqod.svg +99 -0
- data/doc/server.conf.example +24 -0
- data/lib/About.rb +93 -0
- data/lib/BarMenu/BarMenuItem.rb +46 -0
- data/lib/BarMenu.rb +76 -0
- data/lib/ButtonMenu/ButtonMenuItem.rb +82 -0
- data/lib/ButtonMenu/EndSeparator.rb +14 -0
- data/lib/ButtonMenu/StartSeparator.rb +14 -0
- data/lib/ButtonMenu.rb +154 -0
- data/lib/Common/Conf.rb +119 -0
- data/lib/Common/Eprint.rb +180 -0
- data/lib/Common/EventCache.rb +41 -0
- data/lib/Common/Fixnum.rb +18 -0
- data/lib/Common/Images.rb +41 -0
- data/lib/Common/ManqodDB.rb +40 -0
- data/lib/Common/MyExec.rb +77 -0
- data/lib/Common/MyImage.rb +47 -0
- data/lib/Common/Nick.rb +25 -0
- data/lib/Common/String.rb +15 -0
- data/lib/FormHolder/Form/InputHolder/Button.rb +133 -0
- data/lib/FormHolder/Form/InputHolder/Calendar.rb +101 -0
- data/lib/FormHolder/Form/InputHolder/CalendarButton.rb +117 -0
- data/lib/FormHolder/Form/InputHolder/ColorButton.rb +54 -0
- data/lib/FormHolder/Form/InputHolder/Combo.rb +82 -0
- data/lib/FormHolder/Form/InputHolder/ComboWithNew.rb +103 -0
- data/lib/FormHolder/Form/InputHolder/Common/Model.rb +337 -0
- data/lib/FormHolder/Form/InputHolder/ConstCombo.rb +18 -0
- data/lib/FormHolder/Form/InputHolder/ConstText.rb +17 -0
- data/lib/FormHolder/Form/InputHolder/Duration.rb +73 -0
- data/lib/FormHolder/Form/InputHolder/EditableList.rb +57 -0
- data/lib/FormHolder/Form/InputHolder/FieldCombo.rb +40 -0
- data/lib/FormHolder/Form/InputHolder/FieldList.rb +40 -0
- data/lib/FormHolder/Form/InputHolder/FileChooser.rb +131 -0
- data/lib/FormHolder/Form/InputHolder/FontButton.rb +37 -0
- data/lib/FormHolder/Form/InputHolder/FormImage.rb +74 -0
- data/lib/FormHolder/Form/InputHolder/HScale.rb +44 -0
- data/lib/FormHolder/Form/InputHolder/Hidden.rb +41 -0
- data/lib/FormHolder/Form/InputHolder/Label.rb +40 -0
- data/lib/FormHolder/Form/InputHolder/List.rb +176 -0
- data/lib/FormHolder/Form/InputHolder/MultiLine.rb +63 -0
- data/lib/FormHolder/Form/InputHolder/Password.rb +41 -0
- data/lib/FormHolder/Form/InputHolder/QBuilder/QObject.rb +269 -0
- data/lib/FormHolder/Form/InputHolder/QBuilder.rb +333 -0
- data/lib/FormHolder/Form/InputHolder/RadioGroup.rb +82 -0
- data/lib/FormHolder/Form/InputHolder/SourceView.rb +100 -0
- data/lib/FormHolder/Form/InputHolder/Spin.rb +49 -0
- data/lib/FormHolder/Form/InputHolder/Text.rb +55 -0
- data/lib/FormHolder/Form/InputHolder/TimeStamp.rb +82 -0
- data/lib/FormHolder/Form/InputHolder/TimeStampButton.rb +93 -0
- data/lib/FormHolder/Form/InputHolder/Toggle.rb +43 -0
- data/lib/FormHolder/Form/InputHolder.rb +458 -0
- data/lib/FormHolder/Form.rb +529 -0
- data/lib/FormHolder.rb +203 -0
- data/lib/Gtk.rb +101 -0
- data/lib/GtkAttributes.rb +76 -0
- data/lib/Kernel.rb +48 -0
- data/lib/ListHolder/EditableList/CellRenderers/Combo.rb +91 -0
- data/lib/ListHolder/EditableList/CellRenderers/ComboText.rb +22 -0
- data/lib/ListHolder/EditableList/CellRenderers/ConstCombo.rb +12 -0
- data/lib/ListHolder/EditableList/CellRenderers/ConstText.rb +23 -0
- data/lib/ListHolder/EditableList/CellRenderers/Pixbuf.rb +18 -0
- data/lib/ListHolder/EditableList/CellRenderers/Progress.rb +36 -0
- data/lib/ListHolder/EditableList/CellRenderers/Text.rb +51 -0
- data/lib/ListHolder/EditableList/CellRenderers/Toggle.rb +35 -0
- data/lib/ListHolder/EditableList/Column.rb +223 -0
- data/lib/ListHolder/EditableList/DrbListModel.rb +809 -0
- data/lib/ListHolder/EditableList/ListPrintOperation/ColumnsHeaderLayout.rb +56 -0
- data/lib/ListHolder/EditableList/ListPrintOperation/CustomPageSetup.rb +100 -0
- data/lib/ListHolder/EditableList/ListPrintOperation/FooterLayout.rb +26 -0
- data/lib/ListHolder/EditableList/ListPrintOperation/HeaderLayout.rb +35 -0
- data/lib/ListHolder/EditableList/ListPrintOperation/IterLayout.rb +89 -0
- data/lib/ListHolder/EditableList/ListPrintOperation.rb +365 -0
- data/lib/ListHolder/EditableList.rb +309 -0
- data/lib/ListHolder/GanttHolder/Gantt/Rectangle.rb +290 -0
- data/lib/ListHolder/GanttHolder/Gantt.rb +317 -0
- data/lib/ListHolder/GanttHolder/GanttFooter.rb +27 -0
- data/lib/ListHolder/GanttHolder/GanttScaler.rb +60 -0
- data/lib/ListHolder/GanttHolder.rb +31 -0
- data/lib/ListHolder/HistoryWindow.rb +63 -0
- data/lib/ListHolder/ListButtonHolder/ArchiveButton.rb +37 -0
- data/lib/ListHolder/ListButtonHolder/ButtonGroup.rb +32 -0
- data/lib/ListHolder/ListButtonHolder/FilterButton.rb +28 -0
- data/lib/ListHolder/ListButtonHolder/ListButton.rb +305 -0
- data/lib/ListHolder/ListButtonHolder/OrderingButton.rb +26 -0
- data/lib/ListHolder/ListButtonHolder/SumPanelButton.rb +23 -0
- data/lib/ListHolder/ListButtonHolder.rb +94 -0
- data/lib/ListHolder/ListPanel/ListFilter/FRenderer/Combo.rb +94 -0
- data/lib/ListHolder/ListPanel/ListFilter/FRenderer/ConstCombo.rb +11 -0
- data/lib/ListHolder/ListPanel/ListFilter/FRenderer/Text.rb +26 -0
- data/lib/ListHolder/ListPanel/ListFilter/FRenderer/Toggle.rb +41 -0
- data/lib/ListHolder/ListPanel/ListFilter/FRenderer.rb +58 -0
- data/lib/ListHolder/ListPanel/ListFilter.rb +42 -0
- data/lib/ListHolder/ListPanel/ListSum/Text.rb +32 -0
- data/lib/ListHolder/ListPanel/ListSum.rb +72 -0
- data/lib/ListHolder/ListPanel.rb +60 -0
- data/lib/ListHolder.rb +241 -0
- data/lib/LoginWindow.rb +77 -0
- data/lib/MainRouter.rb +64 -0
- data/lib/ManqodCommon.rb +295 -0
- data/lib/ManqodHelp/FormatEditor/FormatJustificationWidget.rb +76 -0
- data/lib/ManqodHelp/FormatsEditor.rb +139 -0
- data/lib/ManqodHelp/HelpBrowser/FormatTagTable/FormatTag.rb +84 -0
- data/lib/ManqodHelp/HelpBrowser/FormatTagTable.rb +39 -0
- data/lib/ManqodHelp/HelpBrowser.rb +135 -0
- data/lib/ManqodHelp/HelpIndex.rb +62 -0
- data/lib/ManqodHelp/HelpToolbar.rb +16 -0
- data/lib/ManqodHelp.rb +120 -0
- data/lib/ManqodRPC.rb +37 -0
- data/lib/Memcache.rb +82 -0
- data/lib/MyConfig.rb +93 -0
- data/lib/Print/PrintItem/TextLayout.rb +47 -0
- data/lib/Print/PrintItem.rb +240 -0
- data/lib/Print.rb +199 -0
- data/lib/PrintEditor/ItemInfo/ItemImage.rb +30 -0
- data/lib/PrintEditor/ItemInfo/ItemList.rb +44 -0
- data/lib/PrintEditor/ItemInfo/ItemTextAlignment.rb +27 -0
- data/lib/PrintEditor/ItemInfo.rb +129 -0
- data/lib/PrintEditor/PageLayout.rb +91 -0
- data/lib/PrintEditor/PrintEditorItem.rb +310 -0
- data/lib/PrintEditor.rb +195 -0
- data/lib/RelationBuilder/RTable/RField.rb +91 -0
- data/lib/RelationBuilder/RTable.rb +293 -0
- data/lib/RelationBuilder/Relation/RelationHandle.rb +70 -0
- data/lib/RelationBuilder/Relation.rb +161 -0
- data/lib/RelationBuilder/RunQuery.rb +55 -0
- data/lib/RelationBuilder/SearchWindow.rb +72 -0
- data/lib/RelationBuilder.rb +468 -0
- data/lib/SB/ListProgress.rb +150 -0
- data/lib/SB/Messaging.rb +77 -0
- data/lib/SB.rb +29 -0
- data/lib/mynotebook.rb +131 -0
- data/lib/mytouchwindow.rb +162 -0
- data/lib/mywindow.rb +134 -0
- data/lib/wysiwyg-print-label.rb +57 -0
- metadata +231 -0
data/doc/manqod.svg
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
2
|
+
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
3
|
+
<svg
|
4
|
+
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
5
|
+
xmlns:cc="http://web.resource.org/cc/"
|
6
|
+
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
7
|
+
xmlns:svg="http://www.w3.org/2000/svg"
|
8
|
+
xmlns="http://www.w3.org/2000/svg"
|
9
|
+
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
10
|
+
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
11
|
+
version="1.0"
|
12
|
+
width="120"
|
13
|
+
height="120"
|
14
|
+
id="svg2"
|
15
|
+
sodipodi:version="0.32"
|
16
|
+
inkscape:version="0.45.1"
|
17
|
+
sodipodi:docname="manqod.svg"
|
18
|
+
sodipodi:docbase="/home/balint/manqod"
|
19
|
+
inkscape:output_extension="org.inkscape.output.svg.inkscape">
|
20
|
+
<metadata
|
21
|
+
id="metadata2220">
|
22
|
+
<rdf:RDF>
|
23
|
+
<cc:Work
|
24
|
+
rdf:about="">
|
25
|
+
<dc:format>image/svg+xml</dc:format>
|
26
|
+
<dc:type
|
27
|
+
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
28
|
+
</cc:Work>
|
29
|
+
</rdf:RDF>
|
30
|
+
</metadata>
|
31
|
+
<sodipodi:namedview
|
32
|
+
inkscape:window-height="975"
|
33
|
+
inkscape:window-width="1280"
|
34
|
+
inkscape:pageshadow="2"
|
35
|
+
inkscape:pageopacity="0.0"
|
36
|
+
guidetolerance="10.0"
|
37
|
+
gridtolerance="10.0"
|
38
|
+
objecttolerance="10.0"
|
39
|
+
borderopacity="1.0"
|
40
|
+
bordercolor="#666666"
|
41
|
+
pagecolor="#ffffff"
|
42
|
+
id="base"
|
43
|
+
inkscape:zoom="3.3916667"
|
44
|
+
inkscape:cx="60"
|
45
|
+
inkscape:cy="60"
|
46
|
+
inkscape:window-x="0"
|
47
|
+
inkscape:window-y="0"
|
48
|
+
inkscape:current-layer="svg2" />
|
49
|
+
<defs
|
50
|
+
id="defs4">
|
51
|
+
<marker
|
52
|
+
refX="0"
|
53
|
+
refY="0"
|
54
|
+
orient="auto"
|
55
|
+
style="overflow:visible"
|
56
|
+
id="Arrow1Lend">
|
57
|
+
<path
|
58
|
+
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
59
|
+
transform="matrix(-0.8,0,0,-0.8,-10,0)"
|
60
|
+
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
|
61
|
+
id="path3211" />
|
62
|
+
</marker>
|
63
|
+
<marker
|
64
|
+
refX="0"
|
65
|
+
refY="0"
|
66
|
+
orient="auto"
|
67
|
+
style="overflow:visible"
|
68
|
+
id="Arrow1Lstart">
|
69
|
+
<path
|
70
|
+
d="M 0,0 L 5,-5 L -12.5,0 L 5,5 L 0,0 z "
|
71
|
+
transform="matrix(0.8,0,0,0.8,10,0)"
|
72
|
+
style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;marker-start:none"
|
73
|
+
id="path3208" />
|
74
|
+
</marker>
|
75
|
+
<filter
|
76
|
+
id="filter3341">
|
77
|
+
<feGaussianBlur
|
78
|
+
id="feGaussianBlur3343"
|
79
|
+
stdDeviation="0.55820388"
|
80
|
+
inkscape:collect="always" />
|
81
|
+
</filter>
|
82
|
+
<filter
|
83
|
+
inkscape:collect="always"
|
84
|
+
id="filter3226">
|
85
|
+
<feGaussianBlur
|
86
|
+
inkscape:collect="always"
|
87
|
+
stdDeviation="2.1985714"
|
88
|
+
id="feGaussianBlur3228" />
|
89
|
+
</filter>
|
90
|
+
</defs>
|
91
|
+
<path
|
92
|
+
id="path2174"
|
93
|
+
style="opacity:0.95679139;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#593600;stroke-width:7.66729735;stroke-linecap:round;stroke-linejoin:round;marker-start:none;marker-mid:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;filter:url(#filter3226)"
|
94
|
+
transform="matrix(-0.6622058,0,0,0.6022433,99.834328,0.4997877)"
|
95
|
+
d="M 36.27118,25.946988 C 51.47057,12.240538 53.06342,13.330338 63.41404,13.003188 C 78.44657,12.528048 81.9109,22.364018 84.84261,30.146038 C 88.67761,40.325788 84.21223,51.406798 80.5569,58.717468 C 75.93338,67.964498 70.14034,76.097998 67.69975,85.860328 C 65.78395,93.523538 67.70719,103.13467 67.70719,111.15619 C 67.70719,118.79594 66.13417,128.52125 66.19939,136.02621 C 66.31258,149.05231 67.22526,152.77325 67.37543,158.46493 C 67.59145,166.65259 66.87035,168.28128 66.87035,172.42632"
|
96
|
+
inkscape:export-filename="/home/balint/manqod/manqod.png"
|
97
|
+
inkscape:export-xdpi="90"
|
98
|
+
inkscape:export-ydpi="90" />
|
99
|
+
</svg>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# this is the main server uri (this usually matches with your server's and client's server.conf)
|
2
|
+
#
|
3
|
+
# for the host part you can use a fqdn or an ip
|
4
|
+
# use ip addresses to avoid waiting for the dns queries
|
5
|
+
#
|
6
|
+
#server_uri = "druby://192.168.1.1:5549"
|
7
|
+
|
8
|
+
# the server needs to connect back to clients, so client sends it's address on initial connection
|
9
|
+
# by default manqod will use your address returned by gethostname and send that to the server
|
10
|
+
# use client_uri, if you don't have a fqdn, or the server is not be able to resolve your fqdn, or can't reach you by the resolved fqdn
|
11
|
+
#
|
12
|
+
# for the port part you can fix the port or set 0, than your OS will asign one
|
13
|
+
#
|
14
|
+
#client_uri = "druby://192.168.1.2:0"
|
15
|
+
|
16
|
+
#the name of the connection, it was entered in the manqod-server-console on connection creation - not the visible name in the combo on the login window
|
17
|
+
#connection = "books"
|
18
|
+
|
19
|
+
#the authentication parameters in cleartext
|
20
|
+
#username = "guest"
|
21
|
+
#password = "password"
|
22
|
+
|
23
|
+
#these values might be overridden by the commandline parameters
|
24
|
+
|
data/lib/About.rb
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
#this file is part of manqod
|
2
|
+
#manqod is distributed under the CDDL licence
|
3
|
+
#the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
|
4
|
+
|
5
|
+
class About < Gtk::VBox
|
6
|
+
include ManqodCommon
|
7
|
+
class Versions < Gtk::HBox
|
8
|
+
def initialize
|
9
|
+
super(true,3)
|
10
|
+
end
|
11
|
+
def add(text)
|
12
|
+
pack_start(Gtk::Label.new(text),true,true,2)
|
13
|
+
self
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class Svn
|
18
|
+
def initialize(dir)
|
19
|
+
@dir=dir
|
20
|
+
@efilename="#{dir}/.svn/entries"
|
21
|
+
@svn = `which svn`.strip
|
22
|
+
end
|
23
|
+
attr_accessor :entries, :efilename, :revision, :format, :source, :last_update
|
24
|
+
def load
|
25
|
+
if FileTest.exists?(efilename)
|
26
|
+
@entries=Array.new
|
27
|
+
@entries=File.new(efilename,"r").readlines
|
28
|
+
return false if entries.nil?
|
29
|
+
@format=entries[0]
|
30
|
+
i=0
|
31
|
+
while entries[i].index("dir")!=0 and i<entries.size do i=i+1;end
|
32
|
+
@revision=entries[i+1]
|
33
|
+
while entries[i].index("svn://")!=0 and i<entries.size do i=i+1;end
|
34
|
+
@source=entries[i]
|
35
|
+
while entries[i]!="\n" and i<entries.size do i=i+1;end
|
36
|
+
while entries[i]=="\n" and i<entries.size do i=i+1;end
|
37
|
+
@last_update=entries[i]
|
38
|
+
true
|
39
|
+
else
|
40
|
+
einfo("file not found: #{efilename}")
|
41
|
+
false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
def up
|
45
|
+
cr=revision
|
46
|
+
`cd #{@dir} && #{@svn} up`
|
47
|
+
self.load
|
48
|
+
cr!=revision
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def initialize
|
53
|
+
@title="about"
|
54
|
+
super(false,3)
|
55
|
+
path=File::expand_path(File.join(File.dirname(__FILE__),".."))
|
56
|
+
svn=Svn.new(path)
|
57
|
+
|
58
|
+
if svn.load
|
59
|
+
pack_start(rev=Gtk::Label.new("manqod version subversion revision #{svn.revision}"))
|
60
|
+
pack_start(Gtk::HBox.new.pack_start(Gtk::Label.new).
|
61
|
+
pack_start(upb=Gtk::Button.new("update"),false,false).
|
62
|
+
pack_start(Gtk::Label.new),false,false
|
63
|
+
)
|
64
|
+
pack_start(Gtk::Label.new("manqod subversion source #{svn.source}"))
|
65
|
+
pack_start(lu=Gtk::Label.new("manqod subversion last update #{svn.last_update}"))
|
66
|
+
upb.signal_connect("clicked"){|me|
|
67
|
+
if svn.up
|
68
|
+
rev.set_text("#{rev.text} -> #{svn.revision}")
|
69
|
+
lu.set_text("#{lu.text} -> #{svn.last_update}")
|
70
|
+
warn("Manqod has been updated, please restart manqod!")
|
71
|
+
else
|
72
|
+
warn("No updates available!")
|
73
|
+
end
|
74
|
+
}
|
75
|
+
else
|
76
|
+
pack_start(Gtk::Label.new("manqod version unknown"))
|
77
|
+
end
|
78
|
+
pack_start(Gtk::Label.new("Logged in: #{nick}"))
|
79
|
+
pack_start(Gtk::Label.new("LICENCE"))
|
80
|
+
pack_start(Gtk::Label.new("
|
81
|
+
the author of this program(manqod) is Dobai-Pataky Balint(dpblnt@gmail.com)
|
82
|
+
manqod is released under the CDDL licence(http://www.opensource.org/licenses/cddl1.php) don't worry this only means the following:
|
83
|
+
* you can use it, copy it, modify it
|
84
|
+
* if you want your modifications to be distributed send them back to me, i'll merge them in
|
85
|
+
* nobody can sell it"))
|
86
|
+
pack_end(Versions.new.add("GTK+- #{Gtk::VERSION.join(".")}").add("Ruby #{RUBY_VERSION}").add("GLib #{GLib::VERSION.join(".")}").add("Ruby/GLib #{GLib::BINDING_VERSION.join(".")}").add("Ruby/GTK #{Gtk::BINDING_VERSION.join(".")}"))
|
87
|
+
end
|
88
|
+
attr_accessor :title
|
89
|
+
|
90
|
+
def update(notifier)
|
91
|
+
@title=notifier.text
|
92
|
+
end
|
93
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
#this file is part of manqod
|
2
|
+
#manqod is distributed under the CDDL licence
|
3
|
+
#the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
|
4
|
+
|
5
|
+
class BarMenuItem < Gtk::ImageMenuItem
|
6
|
+
include ManqodCommon
|
7
|
+
include Conf
|
8
|
+
|
9
|
+
def initialize(menubar,iid)
|
10
|
+
@menubar=menubar
|
11
|
+
@id=iid
|
12
|
+
if row=admin.qrow("select gtkmenu.*,
|
13
|
+
modules.modname
|
14
|
+
from gtkmenu
|
15
|
+
left join modules on gtkmenu.module = modules.id
|
16
|
+
where gtkmenu.id='#{id}'")
|
17
|
+
@modname=row["modname"]
|
18
|
+
if row["module"].to_i == -1
|
19
|
+
@target=nil
|
20
|
+
else
|
21
|
+
@target=row['target']
|
22
|
+
end
|
23
|
+
end
|
24
|
+
@text=row['display']
|
25
|
+
super(text)
|
26
|
+
set_image(Gtk::Image.new(image_of_id(row['imageid'].to_i,"gtk-menu")))
|
27
|
+
child.modify_font(Pango::FontDescription.new(get_conf(0,0,"bar-menu-font")))
|
28
|
+
signal_connect("activate"){
|
29
|
+
edebug("menuitem #{id} #{target} emiting signal","menu","debug")
|
30
|
+
@menubar.update(self)
|
31
|
+
}
|
32
|
+
self
|
33
|
+
end
|
34
|
+
attr_accessor :target
|
35
|
+
attr_accessor :id
|
36
|
+
attr_accessor :modname
|
37
|
+
attr_accessor :text
|
38
|
+
|
39
|
+
def inspect
|
40
|
+
"SubMenuItem(#{id},#{text})"
|
41
|
+
end
|
42
|
+
def to_s
|
43
|
+
inspect
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
data/lib/BarMenu.rb
ADDED
@@ -0,0 +1,76 @@
|
|
1
|
+
#this file is part of manqod
|
2
|
+
#manqod is distributed under the CDDL licence
|
3
|
+
#the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
|
4
|
+
|
5
|
+
class BarMenu < Gtk::MenuBar
|
6
|
+
include ManqodCommon
|
7
|
+
include Conf
|
8
|
+
|
9
|
+
|
10
|
+
def initialize(mainrouter,pack_dir="horizontal")
|
11
|
+
super()
|
12
|
+
set_pack_direction(if pack_dir=="vertical" then Gtk::MenuBar::PACK_DIRECTION_TTB; else Gtk::MenuBar::PACK_DIRECTION_LTR;end)
|
13
|
+
@mainrouter=mainrouter
|
14
|
+
@last=nil
|
15
|
+
reinitialize
|
16
|
+
end
|
17
|
+
attr_accessor :last
|
18
|
+
attr_reader :mainrouter
|
19
|
+
|
20
|
+
def reinitialize
|
21
|
+
def remove_main_menu_items(pmenu)
|
22
|
+
pmenu.each{|menu_item|
|
23
|
+
pmenu.remove(menu_item)
|
24
|
+
}
|
25
|
+
end
|
26
|
+
def recmenuitem(parentid,pmenu)
|
27
|
+
admin_rows("select gtkmenu.*,
|
28
|
+
ifnull(childcnt.cnt,'0') as childs
|
29
|
+
from gtkmenu
|
30
|
+
left join (select count(id) as cnt,parent from gtkmenu group by parent) as childcnt on childcnt.parent=gtkmenu.id
|
31
|
+
left join (select count(id) as cnt,userid,groupid from usergroups group by groupid,userid) as ugrp on ugrp.groupid = gtkmenu.groupid
|
32
|
+
where gtkmenu.parent='#{parentid}' and userid='#{nick_id}' and ugrp.cnt>0
|
33
|
+
order by oid"){|row|
|
34
|
+
menuitem=BarMenuItem.new(self,row['id'])
|
35
|
+
@last=menuitem if row['id']==get_conf(0,0,"lastmenu")
|
36
|
+
if row['childs'].to_i > 0
|
37
|
+
menuitem.submenu=Gtk::Menu.new()
|
38
|
+
recmenuitem(row['id'],if row['parent'].to_i==-1 then pmenu else menuitem.submenu end)
|
39
|
+
end
|
40
|
+
pmenu.append(menuitem) unless row['parent'].to_i == -1
|
41
|
+
}
|
42
|
+
end
|
43
|
+
remove_main_menu_items(self)
|
44
|
+
recmenuitem(-1,self)
|
45
|
+
show_all
|
46
|
+
end
|
47
|
+
|
48
|
+
def update(notifier)
|
49
|
+
case notifier.class.name
|
50
|
+
when 'MyWindow'
|
51
|
+
reinitialize
|
52
|
+
@mainrouter.update(last) if last
|
53
|
+
when 'BarMenuItem'
|
54
|
+
if notifier.target
|
55
|
+
last=notifier
|
56
|
+
set_conf(0,0,"lastmenu",notifier.id) if notifier.modname != "quit"
|
57
|
+
edebug("#{last.target} emiting signal","menu","debug")
|
58
|
+
#setting the window insensitive so user can't interact while destroying and reiniting stuff
|
59
|
+
# get_ancestor(Gtk::Window).set_sensitive(false)
|
60
|
+
set_sensitive(false)
|
61
|
+
@mainrouter.update(last)
|
62
|
+
set_sensitive(true) unless destroyed?
|
63
|
+
# get_ancestor(Gtk::Window).set_sensitive(true) if !self.destroyed?
|
64
|
+
end
|
65
|
+
else
|
66
|
+
edebug("unknown routing: #{notifier.class.name}","menu","warning")
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
def to_s
|
71
|
+
"Main Menu"
|
72
|
+
end
|
73
|
+
def inspect
|
74
|
+
to_s
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
#this file is part of manqod
|
2
|
+
#manqod is distributed under the CDDL licence
|
3
|
+
#the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
|
4
|
+
|
5
|
+
class ButtonMenuItem < Gtk::Button
|
6
|
+
include Observable
|
7
|
+
include ManqodCommon
|
8
|
+
def initialize(menu_id,parent_menu)
|
9
|
+
@menu_id=menu_id
|
10
|
+
@submenu=nil
|
11
|
+
@parent_menu=parent_menu
|
12
|
+
@image_size=nil
|
13
|
+
if row=admin.qrow("select gtkmenu.*,
|
14
|
+
modules.modname
|
15
|
+
from gtkmenu
|
16
|
+
left join modules on gtkmenu.module = modules.id
|
17
|
+
where gtkmenu.id='#{menu_id}'")
|
18
|
+
@modname=row["modname"]
|
19
|
+
if row["module"].to_i == -1
|
20
|
+
@target=nil
|
21
|
+
else
|
22
|
+
@target=row['target']
|
23
|
+
end
|
24
|
+
@text=row['display']
|
25
|
+
@image_id=row['imageid'].to_i
|
26
|
+
end
|
27
|
+
super()
|
28
|
+
set_use_underline(true)
|
29
|
+
set_relief(Gtk::ReliefStyle::NONE)
|
30
|
+
set_no_show_all(true)
|
31
|
+
set_label(text)
|
32
|
+
# set_image(Gtk::Image.new(image_of_id(@image_id,"gtk-large-toolbar")))
|
33
|
+
# resize_image("gtk-large-toolbar")
|
34
|
+
set_image_position(Gtk::PositionType::TOP)
|
35
|
+
signal_connect("clicked"){|me|
|
36
|
+
edebug(self.inspect+" clicked, so emiting signal","menu","debug")
|
37
|
+
parent_menu.submenu.hide_tree
|
38
|
+
show_up(self)
|
39
|
+
self.changed
|
40
|
+
notify_observers(self)
|
41
|
+
}
|
42
|
+
self
|
43
|
+
end
|
44
|
+
attr_accessor :target
|
45
|
+
attr_accessor :menu_id
|
46
|
+
attr_accessor :submenu
|
47
|
+
attr_accessor :text
|
48
|
+
attr_accessor :parent_menu
|
49
|
+
attr_accessor :modname
|
50
|
+
|
51
|
+
def update(notifier)
|
52
|
+
edebug(self.inspect+" we've been called, so emiting signal","menu","debug")
|
53
|
+
changed
|
54
|
+
notify_observers(notifier)
|
55
|
+
end
|
56
|
+
|
57
|
+
def to_s
|
58
|
+
"ButtonMenuItem(#{text})"
|
59
|
+
end
|
60
|
+
|
61
|
+
def show_up(caller)
|
62
|
+
edebug(inspect+" showup","menu","debug")
|
63
|
+
if submenu
|
64
|
+
if caller==self
|
65
|
+
submenu.show_items("gtk-small-toolbar",nil)
|
66
|
+
else
|
67
|
+
submenu.show_items("gtk-large-toolbar",caller)
|
68
|
+
end
|
69
|
+
parent_menu.show_up(self) if parent_menu
|
70
|
+
else
|
71
|
+
parent_menu.show_up(parent_menu) if parent_menu
|
72
|
+
end
|
73
|
+
end
|
74
|
+
def resize_image(new_size)
|
75
|
+
if @image_size!=new_size
|
76
|
+
set_image(Gtk::Image.new(image_of_id(@image_id,new_size)))
|
77
|
+
@image_size=new_size
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#this file is part of manqod
|
2
|
+
#manqod is distributed under the CDDL licence
|
3
|
+
#the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
|
4
|
+
|
5
|
+
class EndSeparator < Gtk::Arrow
|
6
|
+
def initialize(pack_dir)
|
7
|
+
super(if pack_dir == "vertical" then Gtk::Arrow::UP;else Gtk::Arrow::LEFT;end,Gtk::SHADOW_OUT)
|
8
|
+
set_size_request(20,10)
|
9
|
+
set_no_show_all(true)
|
10
|
+
end
|
11
|
+
def inspect
|
12
|
+
"EndSeparator of "+get_ancestor(MenuHolder).inspect
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
#this file is part of manqod
|
2
|
+
#manqod is distributed under the CDDL licence
|
3
|
+
#the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
|
4
|
+
|
5
|
+
class StartSeparator < Gtk::Arrow
|
6
|
+
def initialize(pack_dir)
|
7
|
+
super(if pack_dir == "vertical" then Gtk::Arrow::DOWN;else Gtk::Arrow::RIGHT;end,Gtk::SHADOW_OUT)
|
8
|
+
set_size_request(20,10)
|
9
|
+
set_no_show_all(true)
|
10
|
+
end
|
11
|
+
def inspect
|
12
|
+
"StartSeparator of "+get_ancestor(MenuHolder).inspect
|
13
|
+
end
|
14
|
+
end
|
data/lib/ButtonMenu.rb
ADDED
@@ -0,0 +1,154 @@
|
|
1
|
+
#this file is part of manqod
|
2
|
+
#manqod is distributed under the CDDL licence
|
3
|
+
#the author of manqod is Dobai-Pataky Balint(dpblnt@gmail.com)
|
4
|
+
|
5
|
+
class MenuHolder < Gtk::Alignment
|
6
|
+
include Observable
|
7
|
+
include ManqodCommon
|
8
|
+
include Conf
|
9
|
+
|
10
|
+
def initialize(parent_menu,pack_dir="horizontal")
|
11
|
+
@parent_menu=parent_menu
|
12
|
+
@pack_dir=pack_dir
|
13
|
+
@last=nil
|
14
|
+
if pack_dir=="vertical" then super(1,1,0,1);else super(1,1,1,0);end
|
15
|
+
@holder=if pack_dir=="vertical" then Gtk::VBox.new; else Gtk::HBox.new;end
|
16
|
+
holder.set_homogeneous(false)
|
17
|
+
holder.set_border_width(0)
|
18
|
+
add(holder)
|
19
|
+
# add(Gtk::Frame.new.add(holder))
|
20
|
+
# set_layout_style(Gtk::ButtonBox::SPREAD)
|
21
|
+
# set_icon_size_set(true)
|
22
|
+
# set_icon_size(Gtk::IconSize.from_name("gtk-small-toolbar"))
|
23
|
+
reinitialize
|
24
|
+
end
|
25
|
+
attr_accessor :last
|
26
|
+
attr_accessor :parent_menu
|
27
|
+
attr_accessor :holder
|
28
|
+
attr_accessor :pack_dir
|
29
|
+
|
30
|
+
def reinitialize
|
31
|
+
def remove_main_menu_items(pmenu)
|
32
|
+
pmenu.holder.each{|menu_item| pmenu.remove(menu_item)}
|
33
|
+
end
|
34
|
+
def recmenuitem(parentid,pmenu)
|
35
|
+
menuitem=nil
|
36
|
+
admin_rows("select gtkmenu.*,
|
37
|
+
ifnull(childs.cnt,0) as child_cnt
|
38
|
+
from gtkmenu
|
39
|
+
left join (select count(id) as cnt,parent from gtkmenu group by gtkmenu.parent) as childs on childs.parent = gtkmenu.id
|
40
|
+
left join (select count(id) as cnt, groupid from usergroups where userid='#{nick_id}' group by groupid) as perm on perm.groupid = gtkmenu.groupid
|
41
|
+
where gtkmenu.parent='#{parentid}' and (perm.cnt>0) order by oid"){|row|
|
42
|
+
menuitem=ButtonMenuItem.new(row['id'],pmenu)
|
43
|
+
if pmenu.nil?
|
44
|
+
menuitem.add_observer(self)
|
45
|
+
else
|
46
|
+
menuitem.add_observer(pmenu)
|
47
|
+
end
|
48
|
+
@last=menuitem if row['id'].to_i==get_conf(0,0,"lastmenu").to_i
|
49
|
+
if row['child_cnt'].to_i > 0
|
50
|
+
menuitem.submenu=MenuHolder.new(menuitem,pack_dir)
|
51
|
+
@last=menuitem.submenu.last if menuitem.submenu.last
|
52
|
+
end
|
53
|
+
holder.pack_start(menuitem,false,true)
|
54
|
+
holder.pack_start(menuitem.submenu,false,true) if menuitem.submenu
|
55
|
+
}
|
56
|
+
edebug("#{menuitem.inspect}(parentid: #{parentid}) added","menu","debug")
|
57
|
+
menuitem# unless menuitem.nil?
|
58
|
+
end
|
59
|
+
|
60
|
+
remove_main_menu_items(self)
|
61
|
+
case parent_menu.class.name
|
62
|
+
when 'MainRouter'
|
63
|
+
fomenu=recmenuitem(-1,nil)
|
64
|
+
add_observer(parent_menu)
|
65
|
+
if last.nil?
|
66
|
+
begin
|
67
|
+
fomenu.show_up(fomenu)
|
68
|
+
rescue =>err
|
69
|
+
tell_exception("no main menu!",backtrace_to_debug(err),"menu","error",false,false,"you might not have permission to view the main menu")
|
70
|
+
end
|
71
|
+
else
|
72
|
+
last.show_up(last)
|
73
|
+
end
|
74
|
+
when 'ButtonMenuItem'
|
75
|
+
holder.pack_start(StartSeparator.new(pack_dir),true,true) if !parent_menu.parent_menu.nil?
|
76
|
+
recmenuitem(parent_menu.menu_id,parent_menu)
|
77
|
+
holder.pack_end(EndSeparator.new(pack_dir),true,true) if !parent_menu.parent_menu.nil?
|
78
|
+
else
|
79
|
+
edebug("reinitialize: unknown routing(#{caller.class.name})","menu","warning")
|
80
|
+
end
|
81
|
+
# show_all
|
82
|
+
end
|
83
|
+
|
84
|
+
def show_items(new_size,caller)
|
85
|
+
before_caller=true
|
86
|
+
holder.each{|menuitem|
|
87
|
+
menuitem.resize_image(new_size) if menuitem.class.name == "ButtonMenuItem"
|
88
|
+
# set_child_packing(menuitem,false,true,1,Gtk::PackType::START) if before_caller
|
89
|
+
# set_child_packing(menuitem,false,true,1,Gtk::PackType::END) if !before_caller
|
90
|
+
menuitem.show
|
91
|
+
before_caller=false if caller == menuitem
|
92
|
+
edebug("#{menuitem} showing","menu")
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
96
|
+
def hide_tree
|
97
|
+
holder.each{|menuitem|
|
98
|
+
menuitem.submenu.hide_items if menuitem.class.name=="ButtonMenuItem" and menuitem.submenu
|
99
|
+
}
|
100
|
+
hide_items
|
101
|
+
end
|
102
|
+
|
103
|
+
def hide_items(except_this=nil)
|
104
|
+
holder.each{|menuitem|
|
105
|
+
if menuitem==except_this
|
106
|
+
menuitem.show
|
107
|
+
edebug(menuitem.inspect+" showing","menu","debug")
|
108
|
+
else
|
109
|
+
menuitem.hide
|
110
|
+
edebug(menuitem.inspect+" hiding","menu","debug")
|
111
|
+
end #if menuitem.class.name == "MenuItem"
|
112
|
+
# end
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
116
|
+
def update(notifier)
|
117
|
+
case notifier.class.name
|
118
|
+
when 'MyWindow'
|
119
|
+
edebug(inspect+" emiting signal","menu","debug")
|
120
|
+
# reinitialize
|
121
|
+
if last
|
122
|
+
last.show_up(last)
|
123
|
+
changed
|
124
|
+
notify_observers(last)
|
125
|
+
end
|
126
|
+
when 'ButtonMenuItem'
|
127
|
+
if notifier.target
|
128
|
+
@last=notifier
|
129
|
+
set_conf(0,0,"lastmenu",notifier.menu_id) if notifier.modname != "quit"
|
130
|
+
edebug(inspect+" emiting signal","menu","debug")
|
131
|
+
changed
|
132
|
+
#focused=get_ancestor(Gtk::Window).focus
|
133
|
+
#setting the window insensitive so user can't interact while destroying and reinitint stuff
|
134
|
+
# get_ancestor(Gtk::Window).
|
135
|
+
set_sensitive(false)
|
136
|
+
measure(last,"cyan"){notify_observers(last)}
|
137
|
+
# get_ancestor(Gtk::Window).
|
138
|
+
set_sensitive(true) unless destroyed?
|
139
|
+
#.set_focus(focused)
|
140
|
+
end
|
141
|
+
else
|
142
|
+
edebug(".update: unknown routing(#{notifier.class.name})","menu","warning")
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def inspect
|
147
|
+
ret="ButtonMenuHolder"
|
148
|
+
ret=ret+" of "+parent_menu.text if parent_menu.class.name == "ButtonMenuItem"
|
149
|
+
ret
|
150
|
+
end
|
151
|
+
def to_s
|
152
|
+
inspect
|
153
|
+
end
|
154
|
+
end
|