Class: Alexandria::UI::PreferencesDialog

Inherits:
BuilderBase show all
Includes:
Logging, GetText
Defined in:
lib/alexandria/ui/preferences_dialog.rb

Instance Method Summary collapse

Methods included from Logging

included, #log

Constructor Details

#initialize(parent, &changed_block) ⇒ PreferencesDialog

Returns a new instance of PreferencesDialog.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
# File 'lib/alexandria/ui/preferences_dialog.rb', line 21

def initialize(parent, &changed_block)
  super("preferences_dialog__builder.glade", widget_names)
  @preferences_dialog.transient_for = parent
  @changed_block = changed_block

  @cols = {
    @checkbutton_col_authors      => "col_authors_visible",
    @checkbutton_col_isbn         => "col_isbn_visible",
    @checkbutton_col_publisher    => "col_publisher_visible",
    @checkbutton_col_publish_date => "col_publish_date_visible",
    @checkbutton_col_edition      => "col_edition_visible",
    @checkbutton_col_redd         => "col_redd_visible",
    @checkbutton_col_own          => "col_own_visible",
    @checkbutton_col_want         => "col_want_visible",
    @checkbutton_col_rating       => "col_rating_visible",
    @checkbutton_col_tags         => "col_tags_visible",
    @checkbutton_col_loaned_to    => "col_loaned_to_visible"
  }
  @cols.each_pair do |checkbutton, pref_name|
    if checkbutton
      checkbutton.active = Preferences.instance.get_variable(pref_name)
    else
      log.warn do
        "no CheckButton for property #{pref_name} " \
          "(probably conflicting versions of GUI and lib code)"
      end
    end
  end

  model = Gtk::ListStore.new(String, String, TrueClass, Integer)
  @treeview_providers.model = model
  reload_providers
  model.signal_connect_after("row-changed") { update_priority }

  renderer = Gtk::CellRendererToggle.new
  renderer.activatable = true
  renderer.signal_connect("toggled") do |_rndrr, path|
    tree_path = Gtk::TreePath.new(path)
    @treeview_providers.selection.select_path(tree_path)
    prov = selected_provider
    if prov
      prov.toggle_enabled
      adjust_selected_provider(prov)
      # reload_providers
    end
  end

  # renderer.active = true
  column = Gtk::TreeViewColumn.new("Enabled", renderer)
  column.set_cell_data_func(renderer) do |_col, rndr, _mod, iter|
    value = iter[2]
    rndr.active = value
  end

  @treeview_providers.append_column(column)

  renderer = Gtk::CellRendererText.new
  column = Gtk::TreeViewColumn.new("Providers",
                                   renderer)
  column.set_cell_data_func(renderer) do |_col, rndr, _mod, iter|
    rndr.markup = iter[0]
  end
  @treeview_providers.append_column(column)
  @treeview_providers.selection
    .signal_connect("changed") { sensitize_providers }

  @button_prov_setup.sensitive = false

  @button_prov_up.sensitive =
    @button_prov_down.sensitive = BookProviders.list.length > 1

  @buttonbox_prov.set_child_secondary(@button_prov_add, true)
  @buttonbox_prov.set_child_secondary(@button_prov_remove, true)

  if BookProviders.abstract_classes.empty?
    @checkbutton_prov_advanced.sensitive = false
  else
    view_advanced = Preferences.instance.view_advanced_settings
    @checkbutton_prov_advanced.active = true if view_advanced
  end

  sensitize_providers
  setup_barcode_scanner_tab
end

Instance Method Details

#event_is_right_click(event) ⇒ Object



144
145
146
# File 'lib/alexandria/ui/preferences_dialog.rb', line 144

def event_is_right_click(event)
  (event.event_type == :button_press) && (event.button == 3)
end

#on_closeObject



242
243
244
245
# File 'lib/alexandria/ui/preferences_dialog.rb', line 242

def on_close
  @preferences_dialog.destroy
  Alexandria::Preferences.instance.save!
end

#on_column_toggled(checkbutton) ⇒ Object



229
230
231
232
233
234
235
# File 'lib/alexandria/ui/preferences_dialog.rb', line 229

def on_column_toggled(checkbutton)
  raise if @cols[checkbutton].nil?

  Preferences.instance.set_variable(@cols[checkbutton], checkbutton.active?)

  @changed_block.call
end

#on_helpObject



247
248
249
250
# File 'lib/alexandria/ui/preferences_dialog.rb', line 247

def on_help
  Alexandria::UI.display_help(@preferences_dialog,
                              "alexandria-preferences")
end

#on_provider_addObject



184
185
186
187
188
189
190
# File 'lib/alexandria/ui/preferences_dialog.rb', line 184

def on_provider_add
  provider = NewProviderDialog.new(@preferences_dialog).acquire
  return unless provider

  BookProviders.instance.update_priority
  reload_providers
end

#on_provider_advanced_toggled(checkbutton) ⇒ Object



178
179
180
181
182
# File 'lib/alexandria/ui/preferences_dialog.rb', line 178

def on_provider_advanced_toggled(checkbutton)
  on = checkbutton.active?
  Preferences.instance.view_advanced_settings = on
  @button_prov_add.visible = @button_prov_remove.visible = on
end

#on_provider_downObject



169
170
171
172
173
174
175
176
# File 'lib/alexandria/ui/preferences_dialog.rb', line 169

def on_provider_down
  iter = @treeview_providers.selection.selected
  next_iter = iter.dup
  next_iter.next!
  @treeview_providers.model.move_after(iter, next_iter)
  sensitize_providers
  update_priority
end

#on_provider_removeObject



205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
# File 'lib/alexandria/ui/preferences_dialog.rb', line 205

def on_provider_remove
  provider = selected_provider
  dialog = AlertDialog.new(@main_app,
                           _("Are you sure you want to " \
                             "permanently delete the provider " \
                             "'%s'?") % provider.fullname,
                           Gtk::Stock::DIALOG_QUESTION,
                           [[Gtk::Stock::CANCEL,
                             Gtk::ResponseType::CANCEL],
                            [Gtk::Stock::DELETE,
                             Gtk::ResponseType::OK]],
                           _("If you continue, the provider and " \
                             "all of its preferences will be " \
                             "permanently deleted."))
  dialog.default_response = Gtk::ResponseType::CANCEL
  dialog.show_all
  if dialog.run == Gtk::ResponseType::OK
    provider.remove
    BookProviders.instance.update_priority
    reload_providers
  end
  dialog.destroy
end

#on_provider_setupObject



152
153
154
155
156
157
# File 'lib/alexandria/ui/preferences_dialog.rb', line 152

def on_provider_setup
  provider = selected_provider
  unless prefs_empty(provider.prefs)
    ProviderPreferencesDialog.new(@preferences_dialog, provider).acquire
  end
end

#on_provider_upObject



159
160
161
162
163
164
165
166
167
# File 'lib/alexandria/ui/preferences_dialog.rb', line 159

def on_provider_up
  iter = @treeview_providers.selection.selected
  previous_path = iter.path
  previous_path.prev!
  model = @treeview_providers.model
  model.move_after(model.get_iter(previous_path), iter)
  sensitize_providers
  update_priority
end

#on_providers_button_press_event(_widget, event) ⇒ Object



237
238
239
240
# File 'lib/alexandria/ui/preferences_dialog.rb', line 237

def on_providers_button_press_event(_widget, event)
  # double left click
  on_provider_setup if (event.event_type == :"2button_press") && (event.button == 1)
end

#on_scanner_device_type(_combo) ⇒ Object



192
193
194
195
# File 'lib/alexandria/ui/preferences_dialog.rb', line 192

def on_scanner_device_type(_combo)
  iter = @scanner_device_type.active_iter
  Preferences.instance.barcode_scanner = iter[1] if iter && iter[1]
end

#on_use_scan_sound(checkbox) ⇒ Object



201
202
203
# File 'lib/alexandria/ui/preferences_dialog.rb', line 201

def on_use_scan_sound(checkbox)
  Preferences.instance.play_scan_sound = checkbox.active?
end

#on_use_scanning_sound(checkbox) ⇒ Object



197
198
199
# File 'lib/alexandria/ui/preferences_dialog.rb', line 197

def on_use_scanning_sound(checkbox)
  Preferences.instance.play_scanning_sound = checkbox.active?
end

#prefs_empty(prefs) ⇒ Object



148
149
150
# File 'lib/alexandria/ui/preferences_dialog.rb', line 148

def prefs_empty(prefs)
  prefs.empty? || ((prefs.size == 1) && (prefs.first.name == "enabled"))
end

#setup_barcode_scanner_tabObject



123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/alexandria/ui/preferences_dialog.rb', line 123

def setup_barcode_scanner_tab
  @scanner_device_model = Gtk::ListStore.new(String, String)
  chosen_scanner_name = Preferences.instance.barcode_scanner
  index = 0
  @scanner_device_type.model = @scanner_device_model
  renderer = Gtk::CellRendererText.new
  @scanner_device_type.pack_start(renderer, true)
  @scanner_device_type.add_attribute(renderer, "text", 0)

  Alexandria::Scanners.each_scanner do |scanner|
    iter = @scanner_device_model.append
    iter[0] = scanner.display_name
    iter[1] = scanner.name
    @scanner_device_type.active = index if chosen_scanner_name == scanner.name
    index += 1
  end

  @use_scanning_sound.active = Preferences.instance.play_scanning_sound
  @use_scan_sound.active = Preferences.instance.play_scan_sound
end

#showObject



106
107
108
# File 'lib/alexandria/ui/preferences_dialog.rb', line 106

def show
  @preferences_dialog.show
end

#widget_namesObject



110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/alexandria/ui/preferences_dialog.rb', line 110

def widget_names
  [:button_prov_add, :button_prov_down, :button_prov_remove,
   :button_prov_setup, :button_prov_up, :buttonbox_prov,
   :checkbutton_col_authors, :checkbutton_col_edition,
   :checkbutton_col_isbn, :checkbutton_col_loaned_to,
   :checkbutton_col_own, :checkbutton_col_publish_date,
   :checkbutton_col_publisher, :checkbutton_col_rating,
   :checkbutton_col_redd, :checkbutton_col_tags,
   :checkbutton_col_want, :checkbutton_prov_advanced,
   :preferences_dialog, :treeview_providers,
   :scanner_device_type, :use_scanning_sound, :use_scan_sound]
end