ig3tool 0.1.0
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.
- data/bin/ig3tool +114 -0
- data/lib/glade/bib.glade +539 -0
- data/lib/glade/bibliotheek.glade +994 -0
- data/lib/glade/icons/cola.png +0 -0
- data/lib/glade/icons/emblem-money.png +0 -0
- data/lib/glade/icons/emblem-package.png +0 -0
- data/lib/glade/icons/emblem-penning.xpm +98 -0
- data/lib/glade/icons/emblem-people.png +0 -0
- data/lib/glade/icons/emblem-sales.png +0 -0
- data/lib/glade/icons/gdict.png +0 -0
- data/lib/glade/icons/members_klein.png +0 -0
- data/lib/glade/icons/members_xklein.png +0 -0
- data/lib/glade/icons/no.xpm +34 -0
- data/lib/glade/icons/stock_book.svg +338 -0
- data/lib/glade/icons/stock_book_klein.png +0 -0
- data/lib/glade/icons/stock_book_xklein.png +0 -0
- data/lib/glade/icons/stock_bookmark.svg +327 -0
- data/lib/glade/icons/stock_bookmark_klein.png +0 -0
- data/lib/glade/icons/stock_bookmark_xklein.png +0 -0
- data/lib/glade/icons/stock_print.png +0 -0
- data/lib/glade/interne.glade +228 -0
- data/lib/glade/loginwindow.glade +255 -0
- data/lib/glade/memberinfo.svg +411 -0
- data/lib/glade/memberinfo_klein.png +0 -0
- data/lib/glade/memberinfo_xklein.png +0 -0
- data/lib/glade/members.glade +596 -0
- data/lib/glade/members.svg +559 -0
- data/lib/glade/members_klein.png +0 -0
- data/lib/glade/members_xklein.png +0 -0
- data/lib/glade/penningtool.glade +731 -0
- data/lib/glade/people.glade +947 -0
- data/lib/glade/printen.glade +358 -0
- data/lib/glade/printer.png +0 -0
- data/lib/glade/printer_klein.png +0 -0
- data/lib/glade/printer_xklein.png +0 -0
- data/lib/glade/printerlog_klein.png +0 -0
- data/lib/glade/printerlog_xklein.png +0 -0
- data/lib/glade/printing.glade +841 -0
- data/lib/glade/products.glade +404 -0
- data/lib/glade/sales.glade +426 -0
- data/lib/glade/stock_book.svg +338 -0
- data/lib/glade/stock_book_klein.png +0 -0
- data/lib/glade/stock_book_xklein.png +0 -0
- data/lib/glade/stock_bookmark_klein.png +0 -0
- data/lib/glade/stock_bookmark_xklein.png +0 -0
- data/lib/glade/vendingmachine.glade +207 -0
- data/lib/lib/errors.rb +90 -0
- data/lib/lib/util.rb +89 -0
- data/lib/ui/automaatwindow.rb +107 -0
- data/lib/ui/bibliotheekwindow.rb +453 -0
- data/lib/ui/bibwindow.rb +537 -0
- data/lib/ui/gladehelper.rb +110 -0
- data/lib/ui/internewindow.rb +126 -0
- data/lib/ui/loginwindow.rb +60 -0
- data/lib/ui/memberswindow.rb +327 -0
- data/lib/ui/messagebox.rb +23 -0
- data/lib/ui/peoplewindow.rb +333 -0
- data/lib/ui/printenwindow.rb +329 -0
- data/lib/ui/printingwindow.rb +395 -0
- data/lib/ui/productswindow.rb +160 -0
- data/lib/ui/saleswindow.rb +207 -0
- data/lib/ui/toolwindow.rb +97 -0
- metadata +128 -0
data/lib/ui/bibwindow.rb
ADDED
@@ -0,0 +1,537 @@
|
|
1
|
+
begin
|
2
|
+
require "amazon/search"
|
3
|
+
$global['amazon_loaded'] = true
|
4
|
+
rescue Exception => e
|
5
|
+
STDERR.puts "Ruby/Amazon kon niet geladen worden: " + e.to_s
|
6
|
+
end
|
7
|
+
|
8
|
+
require "ui/messagebox"
|
9
|
+
|
10
|
+
module Ig3tool
|
11
|
+
|
12
|
+
class BibWindow < GladeHelper
|
13
|
+
|
14
|
+
## - Constants ----
|
15
|
+
MENU_PATH = ["Bibliotheek", "Bibliotheek"]
|
16
|
+
ICON = "gdict.png"
|
17
|
+
|
18
|
+
## - Class procedures ----
|
19
|
+
def initialize
|
20
|
+
super("bib.glade")
|
21
|
+
|
22
|
+
@isbn_entry = @glade.get_widget("isbn")
|
23
|
+
@title_entry = @glade.get_widget("title")
|
24
|
+
@author_entry = @glade.get_widget("author")
|
25
|
+
@publisher_entry = @glade.get_widget("publisher")
|
26
|
+
@date_entry = @glade.get_widget("year")
|
27
|
+
@section_entry = @glade.get_widget("section")
|
28
|
+
@copies_entry = @glade.get_widget("copies")
|
29
|
+
|
30
|
+
@entries = [@isbn_entry, @title_entry, @author_entry,
|
31
|
+
@publisher_entry, @date_entry, @section_entry, @copies_entry]
|
32
|
+
|
33
|
+
@loan_isbn_entry = @glade.get_widget("loan_isbn")
|
34
|
+
@loan_memberid_entry = @glade.get_widget("loan_memberid")
|
35
|
+
@loan_warranty_entry = @glade.get_widget("loan_warranty")
|
36
|
+
|
37
|
+
@loan_entries = [ @loan_isbn_entry, @loan_memberid_entry, @loan_warranty_entry ]
|
38
|
+
|
39
|
+
@notification_label = @glade.get_widget("notification_label")
|
40
|
+
|
41
|
+
# Creer een ListStore voor de Treeview van de Boeken
|
42
|
+
@books_view = @glade.get_widget("booklist")
|
43
|
+
# ListStore (Single selection) - Naam, Auteur, Section, ISBN, Date, Copies (ISBN is _GEEN_ integer!)
|
44
|
+
@books_store = Gtk::ListStore.new(String, String, String)
|
45
|
+
renderer = Gtk::CellRendererText.new
|
46
|
+
@books_view.append_column Gtk::TreeViewColumn.new("Sectie",renderer,:text => 0)
|
47
|
+
@books_view.append_column Gtk::TreeViewColumn.new("Auteur",renderer,:text => 1)
|
48
|
+
@books_view.append_column Gtk::TreeViewColumn.new("Isbn",renderer,:text => 2)
|
49
|
+
@books_view.model = @books_store
|
50
|
+
|
51
|
+
# Creer een ListStore voor de Treeview van de Loans
|
52
|
+
@books_loan_view = @glade.get_widget("loan_booklist")
|
53
|
+
# ListStore (Single selection) - Memberusername, Naam, Auteur, ISBN, Memberid, Loandate, Returndate, Warranty (ISBN is _GEEN_ integer!)
|
54
|
+
@books_loan_store = Gtk::ListStore.new(String, String, String, String, String, String, String, String)
|
55
|
+
renderer = Gtk::CellRendererText.new
|
56
|
+
@books_loan_view.append_column Gtk::TreeViewColumn.new("Username",renderer,:text => 0)
|
57
|
+
@books_loan_view.append_column Gtk::TreeViewColumn.new("Naam",renderer,:text => 1)
|
58
|
+
@books_loan_view.append_column Gtk::TreeViewColumn.new("Auteur",renderer,:text => 2)
|
59
|
+
@books_loan_view.append_column Gtk::TreeViewColumn.new("ISBN",renderer,:text => 3)
|
60
|
+
@books_loan_view.append_column Gtk::TreeViewColumn.new("Memberid",renderer,:text => 4)
|
61
|
+
@books_loan_view.append_column Gtk::TreeViewColumn.new("Leen",renderer,:text => 5)
|
62
|
+
@books_loan_view.append_column Gtk::TreeViewColumn.new("Terug",renderer,:text => 6)
|
63
|
+
@books_loan_view.append_column Gtk::TreeViewColumn.new("Waarborg",renderer,:text => 7)
|
64
|
+
@books_loan_view.model = @books_loan_store
|
65
|
+
|
66
|
+
_create_books_rightclick_menu # Instantieer een rightclick menu voor de book list
|
67
|
+
_create_loan_books_rightclick_menu # Instantieer een rightclick menu voor de loan book list
|
68
|
+
|
69
|
+
Thread.new do
|
70
|
+
r = @books_store.append
|
71
|
+
r[0] = "LL"
|
72
|
+
r[1] = "Loading..."
|
73
|
+
r[2] = ""
|
74
|
+
|
75
|
+
_fill_booklist # Vul de boekenlijst
|
76
|
+
_fill_loan_booklist # Toon alle uitgeleende boeken
|
77
|
+
end
|
78
|
+
|
79
|
+
@window.show_all
|
80
|
+
end
|
81
|
+
|
82
|
+
## - Handlers (GUI) ----
|
83
|
+
def isbn_activate_cb
|
84
|
+
@isbn_entry.text = @isbn_entry.text.strip
|
85
|
+
isbn = @isbn_entry.text
|
86
|
+
@loan_isbn_entry.text = isbn
|
87
|
+
if isbn.nil? or isbn.empty?
|
88
|
+
return
|
89
|
+
elsif _isbn?(false,isbn) # Returnt nil/isbn
|
90
|
+
begin
|
91
|
+
answer = _lookup_database_isbn(isbn) # Controleer eerst in de Ig3tool DB
|
92
|
+
if answer # Indien niet nil -> Hash van het object uit de server
|
93
|
+
_fill_in_book(answer)
|
94
|
+
else
|
95
|
+
_lookup_amazon_isbn(isbn) # Lookup op amazon
|
96
|
+
end
|
97
|
+
rescue Exception => e
|
98
|
+
_print_msg "Fout: Isbn activate: #{$!}"
|
99
|
+
end
|
100
|
+
else
|
101
|
+
puts "Dit is geen geldig ISBN"
|
102
|
+
@notification_label.text = "Dit is geen geldig ISBN"
|
103
|
+
end
|
104
|
+
return
|
105
|
+
end
|
106
|
+
|
107
|
+
def entry_activate
|
108
|
+
lookup_clicked_cb
|
109
|
+
|
110
|
+
# Controleer elk veld op empty?
|
111
|
+
# Handig voor de focus van het lege veld
|
112
|
+
@entries.each do |entry|
|
113
|
+
entry.text = entry.text.strip
|
114
|
+
if entry.text.empty? and entry.name != "copies"
|
115
|
+
entry.grab_focus
|
116
|
+
return
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
def entry_changed
|
122
|
+
_clear_notifictions
|
123
|
+
end
|
124
|
+
|
125
|
+
def booklist_row_activated_cb # Boek geselecteerd in de lijst
|
126
|
+
@isbn_entry.text = @books_view.selection.selected[2]
|
127
|
+
@isbn_entry.activate
|
128
|
+
end
|
129
|
+
|
130
|
+
def booklist_button_release_event_cb(widget, event) # Indien geklikt op de lijst
|
131
|
+
if event.kind_of? Gdk::EventButton and event.button == 3 # Indien Rechtermuisknop
|
132
|
+
@books_view_menu.popup(nil, nil, event.button, event.time) if @books_view.selection.selected # Indien de selectie niet leeg is
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
def clear_clicked_cb
|
137
|
+
@entries.each do |entry|
|
138
|
+
entry.text = ""
|
139
|
+
end
|
140
|
+
@loan_entries.each do |entry|
|
141
|
+
entry.text = ""
|
142
|
+
end
|
143
|
+
@copies_entry.text = "1"
|
144
|
+
@loan_warranty_entry.text = "5"
|
145
|
+
_clear_notifictions
|
146
|
+
@isbn_entry.activate
|
147
|
+
end
|
148
|
+
|
149
|
+
def lookup_clicked_cb # Zoek een boek adhv de entries
|
150
|
+
attrs = _get_book
|
151
|
+
attrs.each do |k, v|
|
152
|
+
attrs.delete k if v.nil? or v.empty?
|
153
|
+
end
|
154
|
+
|
155
|
+
if attrs.empty?
|
156
|
+
_fill_booklist
|
157
|
+
else
|
158
|
+
begin
|
159
|
+
books = $global["client"].bib_lookup attrs
|
160
|
+
_set_booklist(books)
|
161
|
+
rescue Exception => e
|
162
|
+
_print_msg "Fout: Lookup Clicked: #{$!}"
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
|
167
|
+
def save_clicked_cb # Boek toevoegen
|
168
|
+
if @isbn_entry.text.empty? or @title_entry.text.empty? or @author_entry.text.empty? or @publisher_entry.text.empty? or @section_entry.text.empty?
|
169
|
+
_print_msg "Fout: Het ISBN, de titel, de auteur, de uitgever en het sectie moeten ingevuld zijn"
|
170
|
+
return
|
171
|
+
end
|
172
|
+
|
173
|
+
if !_isbn?(false,@isbn_entry.text)
|
174
|
+
_print_msg "Fout: Dit is geen geldig ISBN nummer!"
|
175
|
+
return
|
176
|
+
end
|
177
|
+
|
178
|
+
# Controleer eerst of de boek al in de database zit adhv isbn
|
179
|
+
# Indien ja, geef een messagebox: Overschrijven/Cancel
|
180
|
+
answer = _lookup_database_isbn(@isbn_entry.text)
|
181
|
+
|
182
|
+
# Indien het boek bestaat
|
183
|
+
if answer
|
184
|
+
# Indien de user op Nee geklikt heeft, return (stopt het toevoegen)
|
185
|
+
return unless Ig3tool::messagebox("Boek toevoegen","Dit isbn nummer zit al in de database, wil je de informatie overschrijven?")
|
186
|
+
end
|
187
|
+
|
188
|
+
begin
|
189
|
+
answer = $global['client'].bib_add! _get_book
|
190
|
+
rescue Exception => e
|
191
|
+
_print_msg "Fout: Toevoegen: #{$!}"
|
192
|
+
else
|
193
|
+
_print_msg "Het boek is toegevoegd.", answer
|
194
|
+
_fill_booklist
|
195
|
+
end
|
196
|
+
|
197
|
+
end
|
198
|
+
|
199
|
+
def delete_clicked_cb # Verwijder een boek
|
200
|
+
_delete_book @isbn_entry.text
|
201
|
+
end
|
202
|
+
|
203
|
+
def loan_isbn_activate_cb
|
204
|
+
@isbn_entry.text = @loan_isbn_entry.text
|
205
|
+
@isbn_entry.activate
|
206
|
+
end
|
207
|
+
|
208
|
+
# Na ingeven memberid, zoek de geleende boeken op
|
209
|
+
def loan_memberid_activate_cb
|
210
|
+
memberid = @loan_memberid_entry.text = @loan_memberid_entry.text.strip
|
211
|
+
_fill_loan_booklist(memberid)
|
212
|
+
end
|
213
|
+
|
214
|
+
# Uitlenen
|
215
|
+
def loan_clicked_cb
|
216
|
+
if @loan_isbn_entry.text.empty? or @loan_memberid_entry.text.empty? or @loan_warranty_entry.text.empty?
|
217
|
+
_print_msg "Het ISBN, de memberid en de waarborg zijn verplichte velden!"
|
218
|
+
return
|
219
|
+
end
|
220
|
+
|
221
|
+
begin
|
222
|
+
answer = $global['client'].bib_loan!({:isbn => @loan_isbn_entry.text,
|
223
|
+
:member => @loan_memberid_entry.text,
|
224
|
+
:warranty => @loan_warranty_entry.text })
|
225
|
+
rescue Exception => e
|
226
|
+
_print_msg "Fout: Uitlenen: #{$!}", "#{@loan_isbn_entry.text},#{@loan_memberid_entry.text},#{@loan_warranty_entry.text}"
|
227
|
+
else
|
228
|
+
clear_clicked_cb
|
229
|
+
_fill_loan_booklist
|
230
|
+
_print_msg "Het boek werd uitgeleend", answer
|
231
|
+
end
|
232
|
+
end
|
233
|
+
|
234
|
+
# Verlengen
|
235
|
+
def extend_clicked_cb
|
236
|
+
if @loan_isbn_entry.text.empty? or @loan_memberid_entry.text.empty?
|
237
|
+
_print_msg "Het ISBN en memberid zijn verplichte velden!"
|
238
|
+
return
|
239
|
+
end
|
240
|
+
_loan_verlengen(@loan_isbn_entry.text, @loan_memberid_entry.text)
|
241
|
+
_fill_loan_booklist
|
242
|
+
end
|
243
|
+
|
244
|
+
# Terugbrengen
|
245
|
+
def return_clicked_cb
|
246
|
+
if @loan_isbn_entry.text.empty? or @loan_memberid_entry.text.empty?
|
247
|
+
_print_msg "Het ISBN en memberid zijn verplichte velden!"
|
248
|
+
return
|
249
|
+
end
|
250
|
+
_loan_terugbrengen(@loan_isbn_entry.text, @loan_memberid_entry.text)
|
251
|
+
_fill_loan_booklist
|
252
|
+
end
|
253
|
+
|
254
|
+
# Refresh lists
|
255
|
+
def refresh_activate_cb
|
256
|
+
clear_clicked_cb
|
257
|
+
_fill_booklist
|
258
|
+
_fill_loan_booklist
|
259
|
+
end
|
260
|
+
|
261
|
+
# Book Loan list rij activated
|
262
|
+
def loan_booklist_row_activated_cb # Boek geselecteerd in de lijst
|
263
|
+
@loan_isbn_entry.text = @books_loan_view.selection.selected[3]
|
264
|
+
@loan_memberid_entry.text = @books_loan_view.selection.selected[4]
|
265
|
+
@loan_isbn_entry.activate
|
266
|
+
end
|
267
|
+
|
268
|
+
# Rightclick op de loan booklist
|
269
|
+
def loan_booklist_button_release_event_cb(widget, event) # Indien geklikt op de lijsta
|
270
|
+
if event.kind_of? Gdk::EventButton and event.button == 3 # Indien Rechtermuisknop
|
271
|
+
@books_loan_view_menu.popup(nil, nil, event.button, event.time) if @books_loan_view.selection.selected # Indien de selectie niet leeg is
|
272
|
+
end
|
273
|
+
end
|
274
|
+
|
275
|
+
|
276
|
+
# --------------
|
277
|
+
# Prive functies
|
278
|
+
private
|
279
|
+
def _isbn? (strong_check,code)
|
280
|
+
if !strong_check and code =~ /^XXX/ # Indien zelfgemaakte barcode
|
281
|
+
return code
|
282
|
+
# indien oude isbn (10 cijfers)
|
283
|
+
elsif code.length == 10
|
284
|
+
code = code.gsub(/[^0-9Xx]+/, '').tr('x', 'X')
|
285
|
+
sum = 0
|
286
|
+
9.times {|i| sum += code[i].chr.to_i * (10 - i) }
|
287
|
+
sum += if code =~ /X$/ then 10 else code[9].chr.to_i end
|
288
|
+
if sum % 11 == 0
|
289
|
+
return code
|
290
|
+
end
|
291
|
+
# indien nieuwe isbn (13 cijfers - 2007)
|
292
|
+
elsif code.length == 13
|
293
|
+
sum = 0
|
294
|
+
multiply = 1
|
295
|
+
0.upto(11){|i|
|
296
|
+
sum += code[i].chr.to_i * multiply
|
297
|
+
if multiply == 1 then multiply = 3 else multiply = 1 end
|
298
|
+
}
|
299
|
+
if ((10 - (sum % 10)) == code[12].chr.to_i)
|
300
|
+
return code
|
301
|
+
end
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
def _lookup_amazon_isbn (isbn)
|
306
|
+
return false unless $global['amazon_loaded'] # Indien de amazon gem niet geladen is, return
|
307
|
+
return false unless _isbn?(true,isbn) # Indien strenge test faalt
|
308
|
+
|
309
|
+
if isbn.length == 13 # indien in de nieuwe vorm, maak er een oude van
|
310
|
+
isbn = isbn[3..11]
|
311
|
+
sum = 0
|
312
|
+
9.times {|i| sum += isbn[i].chr.to_i * (10 - i) }
|
313
|
+
controlecijfer = 11 - (sum % 11)
|
314
|
+
if controlecijfer != 10
|
315
|
+
isbn = isbn + controlecijfer.to_s
|
316
|
+
else
|
317
|
+
isbn = isbn + "X"
|
318
|
+
end
|
319
|
+
end
|
320
|
+
|
321
|
+
# You need a amazon-dev-token in client.rb
|
322
|
+
token = CONFIG['amazon-dev-token']
|
323
|
+
return unless $global['amazon_loaded'] and token.instance_of?(String) and not token.empty?
|
324
|
+
|
325
|
+
begin
|
326
|
+
req = Amazon::Search::Request.new(CONFIG["amazon-dev-token"],CONFIG["amazon-associates-id"])
|
327
|
+
res = req.asin_search(isbn)
|
328
|
+
prod = res.products
|
329
|
+
return if prod.length == 0
|
330
|
+
book = prod[0]
|
331
|
+
|
332
|
+
@title_entry.text = book['product_name'].to_s.strip
|
333
|
+
@author_entry.text = book['authors'].join(', ').strip if !book['authors'] and book['authors'].class == "Array" # opgelet, niets wegdoen!
|
334
|
+
@publisher_entry.text = book['manufacturer'].to_s.strip
|
335
|
+
@date_entry.text = book['release_date'].to_s.strip
|
336
|
+
rescue Exception => e
|
337
|
+
_print_msg "Fout: Lookup Amazon: #{$!}", "ISBN: #{isbn}"
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
def _lookup_database_isbn(isbn)
|
342
|
+
begin
|
343
|
+
answer = $global['client'].bib_books( [ isbn ] )
|
344
|
+
rescue Exception => e
|
345
|
+
_print_msg "Fout: Lookup: #{$!}", "ISBN: #{isbn}"
|
346
|
+
nil
|
347
|
+
else
|
348
|
+
answer
|
349
|
+
end
|
350
|
+
end
|
351
|
+
|
352
|
+
def _create_books_rightclick_menu
|
353
|
+
# Creeer een menu
|
354
|
+
@books_view_menu = Gtk::Menu.new
|
355
|
+
books_view_menu_edit_item = Gtk::MenuItem.new("Edit")
|
356
|
+
books_view_menu_delete_item = Gtk::MenuItem.new("Delete")
|
357
|
+
books_view_menu_edit_item.signal_connect("activate") {
|
358
|
+
# Show selected Book
|
359
|
+
# Treeview heeft default Mode Gtk::SELECTION_SINGLE
|
360
|
+
puts @books_view.selection.selected[2]
|
361
|
+
@isbn_entry.text = @books_view.selection.selected[2]
|
362
|
+
@isbn_entry.activate
|
363
|
+
}
|
364
|
+
|
365
|
+
# Delete het geselecteerde boek
|
366
|
+
books_view_menu_delete_item.signal_connect("activate") {
|
367
|
+
_books_view_delete_selected
|
368
|
+
}
|
369
|
+
|
370
|
+
@books_view_menu.append(books_view_menu_edit_item)
|
371
|
+
@books_view_menu.append(books_view_menu_delete_item)
|
372
|
+
@books_view_menu.show_all
|
373
|
+
end
|
374
|
+
|
375
|
+
def _create_loan_books_rightclick_menu
|
376
|
+
# Creeer een menu
|
377
|
+
@books_loan_view_menu = Gtk::Menu.new
|
378
|
+
books_loan_view_menu_verlengen_item = Gtk::MenuItem.new("Verlengen")
|
379
|
+
books_loan_view_menu_terugbrengen_item = Gtk::MenuItem.new("Terugbrengen")
|
380
|
+
# Verlengen
|
381
|
+
books_loan_view_menu_verlengen_item.signal_connect("activate") {
|
382
|
+
# Treeview heeft default Mode Gtk::SELECTION_SINGLE
|
383
|
+
_loan_verlengen(@books_loan_view.selection.selected[3], @books_loan_view.selection.selected[4])
|
384
|
+
}
|
385
|
+
# Terugbrengen
|
386
|
+
books_loan_view_menu_terugbrengen_item.signal_connect("activate") {
|
387
|
+
_loan_terugbrengen(@books_loan_view.selection.selected[3], @books_loan_view.selection.selected[4])
|
388
|
+
}
|
389
|
+
|
390
|
+
@books_loan_view_menu.append(books_loan_view_menu_verlengen_item)
|
391
|
+
@books_loan_view_menu.append(books_loan_view_menu_terugbrengen_item)
|
392
|
+
@books_loan_view_menu.show_all
|
393
|
+
end
|
394
|
+
|
395
|
+
def _clear_notifictions
|
396
|
+
@notification_label.text = ""
|
397
|
+
end
|
398
|
+
|
399
|
+
# Verwijder de huidig geselecteerde Persoon (Via rightclick)
|
400
|
+
def _books_view_delete_selected
|
401
|
+
# Treeview heeft default Mode Gtk::SELECTION_SINGLE
|
402
|
+
if iter = @books_view.selection.selected
|
403
|
+
_delete_book(iter[0][2])
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
# Vul de entries in (GUI)
|
408
|
+
def _fill_in_book (book)
|
409
|
+
return unless book
|
410
|
+
@title_entry.text = book.title
|
411
|
+
@author_entry.text = book.author
|
412
|
+
@publisher_entry.text = book.publisher
|
413
|
+
@date_entry.text = book.year
|
414
|
+
@section_entry.text = book.section
|
415
|
+
@copies_entry.text = book.copies
|
416
|
+
end
|
417
|
+
|
418
|
+
def _get_book
|
419
|
+
Hash.zipnew(@entries.collect { |x| x.name }, @entries.collect { |x| x.text.strip })
|
420
|
+
end
|
421
|
+
|
422
|
+
def _fill_booklist
|
423
|
+
# TODO - kleur de boeken in een speciaal kleur indien uitgeleend
|
424
|
+
# pas op voor het # copies tov # x uitgeleend!
|
425
|
+
|
426
|
+
# Haal de boeken op van de server
|
427
|
+
begin
|
428
|
+
answer = $global['client'].bib_books
|
429
|
+
_set_booklist(answer)
|
430
|
+
rescue Exception => e
|
431
|
+
_print_msg "Fout: Fill-Booklist: #{$!}"
|
432
|
+
end
|
433
|
+
end
|
434
|
+
|
435
|
+
def _set_booklist(books = [], clear = true)
|
436
|
+
@books_store.clear if clear
|
437
|
+
|
438
|
+
@books_view.model = nil # Performance issues
|
439
|
+
for book in books
|
440
|
+
# ListStore (Single selection) - Naam, Auteur, Section, ISBN, Date, Copies (ISBN is _GEEN_ integer!)
|
441
|
+
iter = @books_store.append
|
442
|
+
iter[0] = book.section[0..4]
|
443
|
+
iter[1] = book.title
|
444
|
+
iter[2] = book.isbn
|
445
|
+
end
|
446
|
+
@books_view.model = @books_store # Performance issues
|
447
|
+
end
|
448
|
+
|
449
|
+
def _fill_loan_booklist(memberid = nil)
|
450
|
+
|
451
|
+
# TODO kleur de mensen in het rood die te laat zijn met hun terugbrengen
|
452
|
+
|
453
|
+
@books_loan_store.clear
|
454
|
+
answer = nil
|
455
|
+
# Haal de uitgeleende boeken op van de server
|
456
|
+
begin
|
457
|
+
if memberid
|
458
|
+
answer = $global['client'].bib_loans( [ memberid ] ) # Indien een memberid geselecteerd
|
459
|
+
else
|
460
|
+
answer = $global['client'].bib_loans # Alle loans weergeven indien niet
|
461
|
+
end
|
462
|
+
rescue Exception => e
|
463
|
+
_print_msg "Fout: Fill-Loan-Booklist: #{$!}", "Memberid: #{memberid}"
|
464
|
+
else
|
465
|
+
return if answer.nil?
|
466
|
+
|
467
|
+
# Answer is een BookLoan
|
468
|
+
@books_loan_view.model = nil # Performance issues
|
469
|
+
for bookloan in answer
|
470
|
+
book = $global['client'].bib_info( [bookloan.isbn] ) # Haal de info op over het boek
|
471
|
+
person = $global['client'].person_member( [bookloan.member_id] ) # Haal de persoon op
|
472
|
+
if person.nil? or book.nil?
|
473
|
+
_print_msg "Fout: Fill-Loan-Booklist: #{$!}", "BookLoan: #{bookloan}, Book: #{book}, Person: #{person}"
|
474
|
+
return
|
475
|
+
end
|
476
|
+
# ListStore (Single selection) - Memberusername, Naam, Auteur, ISBN, Memberid, Loandate, Returndate, Warranty (ISBN is _GEEN_ integer!)
|
477
|
+
iter = @books_loan_store.append
|
478
|
+
iter[0] = person.username
|
479
|
+
iter[1] = book.title[0..30]
|
480
|
+
iter[2] = book.author[0..10]
|
481
|
+
iter[3] = book.isbn
|
482
|
+
iter[4] = bookloan.member_id
|
483
|
+
iter[5] = bookloan.loan_date
|
484
|
+
iter[6] = bookloan.return_date
|
485
|
+
iter[7] = bookloan.warranty
|
486
|
+
end
|
487
|
+
@books_loan_view.model = @books_loan_store
|
488
|
+
end
|
489
|
+
|
490
|
+
end
|
491
|
+
|
492
|
+
def _delete_book(isbn)
|
493
|
+
return unless isbn.nil?
|
494
|
+
begin
|
495
|
+
answer = $global['client'].bib_remove!( { :isbn => @isbn } )
|
496
|
+
rescue Exception => e
|
497
|
+
_print_msg "Fout: Verwijderen: #{$!}"
|
498
|
+
else
|
499
|
+
_print_msg "Het boek werd verwijderd", answer
|
500
|
+
_fill_booklist
|
501
|
+
_fill_loan_booklist
|
502
|
+
end
|
503
|
+
end
|
504
|
+
|
505
|
+
def _loan_verlengen(isbn, memberid)
|
506
|
+
begin
|
507
|
+
answer = $global['client'].bib_extend!({ :isbn => isbn,
|
508
|
+
:member => memberid })
|
509
|
+
returndate = Time.at(answer.return_date).to_s
|
510
|
+
rescue Exception => e
|
511
|
+
_print_msg "Fout: Verlengen: #{$!}", "#{isbn}, #{memberid}"
|
512
|
+
else
|
513
|
+
_print_msg "De uitleentermijn van het boek werd verlengd tot #{returndate}.", answer
|
514
|
+
end
|
515
|
+
end
|
516
|
+
|
517
|
+
def _loan_terugbrengen(isbn, memberid)
|
518
|
+
begin
|
519
|
+
answer = $global['client'].bib_return!( { :isbn => isbn,
|
520
|
+
:member => memberid })
|
521
|
+
rescue Exception => e
|
522
|
+
_print_msg "Fout: Return: #{$!}", "#{isbn},#{memberid}"
|
523
|
+
else
|
524
|
+
_print_msg "Het boek werd teruggebracht.", answer
|
525
|
+
end
|
526
|
+
end
|
527
|
+
|
528
|
+
def _print_msg (msg, extra_info = nil)
|
529
|
+
puts msg
|
530
|
+
puts " - #{extra_info}" if extra_info
|
531
|
+
@notification_label.text = msg
|
532
|
+
end
|
533
|
+
end
|
534
|
+
|
535
|
+
register_window(BibWindow)
|
536
|
+
|
537
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
module Ig3tool
|
4
|
+
|
5
|
+
class GladeHelper
|
6
|
+
GLADE_DIR = Pathname.new(__FILE__).parent.parent + "glade"
|
7
|
+
|
8
|
+
def initialize (gladefile, toplevel = "window")
|
9
|
+
filename = GLADE_DIR + gladefile
|
10
|
+
@glade = GladeXML.new(filename.to_s, toplevel) {|h| method(h) }
|
11
|
+
@window = @glade.get_widget(toplevel)
|
12
|
+
@window.title += " - Ig3tool"
|
13
|
+
@window.move(169,0) # Zet het naast het toolwindow
|
14
|
+
@window.signal_connect("delete-event") do
|
15
|
+
@window.hide
|
16
|
+
true
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def show
|
21
|
+
@window.show
|
22
|
+
end
|
23
|
+
|
24
|
+
def present
|
25
|
+
@window.present
|
26
|
+
end
|
27
|
+
|
28
|
+
def _get_widget(widget)
|
29
|
+
@glade.get_widget(widget)
|
30
|
+
end
|
31
|
+
|
32
|
+
# Debugger combobox invullen
|
33
|
+
def make_debugger_combo (combo, window = nil)
|
34
|
+
debuggers = $global["client"].person_debuggers
|
35
|
+
debuggers.sort! {|a,b| a.username <=> b.username }
|
36
|
+
|
37
|
+
debugger_model = Gtk::ListStore.new(Object, String)
|
38
|
+
debuggers.each do |d|
|
39
|
+
row = debugger_model.append
|
40
|
+
row[0] = d
|
41
|
+
row[1] = d.username
|
42
|
+
end
|
43
|
+
|
44
|
+
combo.model = debugger_model
|
45
|
+
combo.active = 0
|
46
|
+
combo.clear
|
47
|
+
renderer = Gtk::CellRendererText.new
|
48
|
+
combo.pack_start(renderer, true)
|
49
|
+
combo.set_attributes(renderer, :text => 1)
|
50
|
+
|
51
|
+
# Indien het window gekleurd moet worden adhv zijn 'interne' status
|
52
|
+
add_window_colorer(combo, window) if window
|
53
|
+
end
|
54
|
+
|
55
|
+
# Status combobox invullen
|
56
|
+
def make_status_combo (combo,statussen = nil)
|
57
|
+
begin
|
58
|
+
statussen = $global["client"].person_statussen unless statussen
|
59
|
+
statussen_model = Gtk::ListStore.new(Object, String)
|
60
|
+
statussen.each do |key, value|
|
61
|
+
row = statussen_model.append
|
62
|
+
row[0] = key
|
63
|
+
row[1] = value
|
64
|
+
end
|
65
|
+
combo.model = statussen_model
|
66
|
+
combo.active = 0
|
67
|
+
combo.clear
|
68
|
+
renderer = Gtk::CellRendererText.new
|
69
|
+
combo.pack_start(renderer, true)
|
70
|
+
combo.set_attributes(renderer, :text => 1)
|
71
|
+
rescue Exception => e
|
72
|
+
puts "Fout: Make_status_combo: #{$!}"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
def add_window_colorer(combo, window)
|
77
|
+
combo.signal_connect("changed") do
|
78
|
+
if combo.active_iter
|
79
|
+
debugger = combo.active_iter[1]
|
80
|
+
saldo = $global["client"].interne(debugger)
|
81
|
+
else
|
82
|
+
saldo = 0
|
83
|
+
end
|
84
|
+
if saldo < 0
|
85
|
+
shade = [65535, 0, 0]
|
86
|
+
ratio = (saldo < -7500) ? 1 : Rational(saldo,(-75 * 100)) # In cent + Need rational!
|
87
|
+
else
|
88
|
+
shade = [0, 65535, 0]
|
89
|
+
ratio = (saldo > 20000) ? 1 : Rational(saldo,(200 * 100))
|
90
|
+
end
|
91
|
+
ratio1 = 1 - ratio
|
92
|
+
base = Gtk::Widget.default_style.bg(Gtk::STATE_NORMAL)
|
93
|
+
window.modify_bg(Gtk::STATE_NORMAL,
|
94
|
+
Gdk::Color.new(
|
95
|
+
(base.red * ratio1 + shade[0] * ratio).to_i,
|
96
|
+
(base.green * ratio1 + shade[1] * ratio).to_i,
|
97
|
+
(base.blue * ratio1 + shade[2] * ratio).to_i))
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
def make_eval_widget(widget)
|
102
|
+
widget.signal_connect "focus-out-event" do
|
103
|
+
Ig3tool::number_eval_widget widget
|
104
|
+
false
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
end
|
109
|
+
|
110
|
+
end
|