Class: Alexandria::UI::BookPropertiesDialogBase

Inherits:
BuilderBase
  • Object
show all
Extended by:
GetText
Includes:
Logging, CalendarPopup, GetText
Defined in:
lib/alexandria/ui/book_properties_dialog_base.rb

Direct Known Subclasses

BookPropertiesDialog, NewBookDialogManual

Constant Summary collapse

COVER_MAXWIDTH =

pixels

140
COVER_ABSOLUTE_MAXHEIGHT =

pixels, above this we scale down…

250
@@latest_filechooser_directory =
Dir.home

Instance Method Summary collapse

Methods included from Logging

included, #log

Methods included from CalendarPopup

#assign_selected_date, #clear_date_entry, #display_calendar_popup, #setup_calendar_widgets

Constructor Details

#initialize(parent, cover_file) ⇒ BookPropertiesDialogBase

Returns a new instance of BookPropertiesDialogBase.



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
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 24

def initialize(parent, cover_file)
  super("book_properties_dialog__builder.glade", widget_names)
  @setup_finished = false
  @book_properties_dialog.transient_for = parent
  @parent = parent
  @cover_file = cover_file
  @original_cover_file = nil
  @delete_cover_file = false # fixing bug #16707

  @entry_title.complete_titles
  @entry_title.grab_focus
  @entry_publisher.complete_publishers
  @entry_edition.complete_editions
  @entry_loaned_to.complete_borrowers

  @entry_tags.complete_tags

  @treeview_authors.model = Gtk::ListStore.new(String, TrueClass)
  @treeview_authors.selection.mode = :single
  renderer = Gtk::CellRendererText.new
  renderer.signal_connect("edited") do |_cell, path_string, new_text|
    path = Gtk::TreePath.new(path_string)
    iter = @treeview_authors.model.get_iter(path)
    iter[0] = new_text
  end
  renderer.signal_connect("editing_started") do |_cell, entry, _path_string|
    entry.complete_authors
  end
  col = Gtk::TreeViewColumn.new("", renderer,
                                text: 0,
                                editable: 1)
  @treeview_authors.append_column(col)

  setup_date_widgets
  GLib::Timeout.add(150) do
    @setup_finished = true

    false
  end
end

Instance Method Details

#on_add_authorObject



110
111
112
113
114
115
116
117
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 110

def on_add_author
  iter = @treeview_authors.model.append
  iter[0] = _("Author")
  iter[1] = true
  @treeview_authors.set_cursor(iter.path,
                               @treeview_authors.get_column(0),
                               true)
end

#on_change_coverObject



155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 155

def on_change_cover
  dialog = Gtk::FileChooserDialog.new(title: _("Select a cover image"),
                                      parent: @book_properties_dialog,
                                      action: :open,
                                      buttons: [[_("No Cover"), :reject],
                                                [Gtk::Stock::CANCEL, :cancel],
                                                [Gtk::Stock::OPEN, :accept]])
  dialog.current_folder = @@latest_filechooser_directory
  response = dialog.run
  case response
  when Gtk::ResponseType::ACCEPT
    begin
      @delete_cover_file = false
      cover = GdkPixbuf::Pixbuf.new(file: dialog.filename)
      # At this stage the file format is recognized.

      if File.exist?(@cover_file) && !@original_cover_file
        # make a back up, but only of the original
        @original_cover_file = "#{@cover_file}~"
        FileUtils.cp(@cover_file, @original_cover_file)
      end
      if cover.height > COVER_ABSOLUTE_MAXHEIGHT
        FileUtils.cp(dialog.filename, "#{@cover_file}.orig")
        new_width = cover.width / (cover.height / COVER_ABSOLUTE_MAXHEIGHT.to_f)
        log.info do
          "Scaling large cover image to " \
            "#{new_width.to_i} x #{COVER_ABSOLUTE_MAXHEIGHT}"
        end
        cover = cover.scale(new_width.to_i, COVER_ABSOLUTE_MAXHEIGHT)
        cover.save(@cover_file, "jpeg")
      else
        FileUtils.cp(dialog.filename, @cover_file)
      end

      self.cover = cover
      @@latest_filechooser_directory = dialog.current_folder
    rescue RuntimeError => ex
      ErrorDialog.new(@book_properties_dialog, ex.message).display
    end
  when Gtk::ResponseType::REJECT
    ## FileUtils.rm_f(@cover_file) # fixing bug #16707
    @delete_cover_file = true

    self.cover = Icons::BOOK_ICON
  end
  dialog.destroy
end

#on_destroyObject



203
204
205
206
207
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 203

def on_destroy
  @book_properties_dialog.hide
  # Stop notebook trying to set tab labels at this time
  @notebook.show_tabs = false
end

#on_image_no_rating_pressObject



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

def on_image_no_rating_press
  self.rating = 0
end

#on_image_rating1_pressObject



124
125
126
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 124

def on_image_rating1_press
  self.rating = 1
end

#on_image_rating2_pressObject



128
129
130
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 128

def on_image_rating2_press
  self.rating = 2
end

#on_image_rating3_pressObject



132
133
134
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 132

def on_image_rating3_press
  self.rating = 3
end

#on_image_rating4_pressObject



136
137
138
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 136

def on_image_rating4_press
  self.rating = 4
end

#on_image_rating5_pressObject



140
141
142
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 140

def on_image_rating5_press
  self.rating = 5
end

#on_loanedObject



209
210
211
212
213
214
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 209

def on_loaned
  loaned = @checkbutton_loaned.active?
  @entry_loaned_to.sensitive = loaned
  @date_loaned_since.sensitive = loaned
  @label_loaning_duration.visible = loaned
end

#on_loaned_date_changedObject



216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 216

def on_loaned_date_changed
  date_regexes =  [%r{[0123]?[0-9]/[0123]?[0-9]/[0-9]{4}},
                   /[0-9]{4}-[0123]?[0-9]-[0123]?[0-9]/]
  matches_regex = false
  date_regexes.each do |regex|
    matches_regex = regex.match(@date_loaned_since.text)
    break if matches_regex
  end
  return unless matches_regex

  t = parse_date(@date_loaned_since.text)
  if t.nil?
    @label_loaning_duration.label = ""
    return
  end
  loaned_time = Time.at(t)
  n_days = ((Time.now - loaned_time) / (3600 * 24)).to_i
  if n_days > 365_250 # 1,000 years
    @label_loaning_duration.label = ""
    return
  end
  @label_loaning_duration.label = if n_days > 0
                                    n_("%d day", "%d days", n_days) % n_days
                                  else
                                    ""
                                  end
end

#on_remove_authorObject



119
120
121
122
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 119

def on_remove_author
  iter = @treeview_authors.selection.selected
  @treeview_authors.model.remove(iter) if iter
end

#on_title_changedObject



101
102
103
104
105
106
107
108
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 101

def on_title_changed
  title = @entry_title.text.strip
  @book_properties_dialog.title = if title.empty?
                                    _("Properties")
                                  else
                                    _("Properties for '%s'") % title
                                  end
end

#own_toggledObject



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

def own_toggled
  @checkbutton_want.inconsistent = @checkbutton_own.active?
end

#redd_toggledObject



244
245
246
247
248
249
250
251
252
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 244

def redd_toggled
  redd_yes = @checkbutton_redd.active?
  @redd_date.sensitive = redd_yes

  return unless redd_yes && @redd_date.text.strip.empty?

  # don't do this when popping up the dialog for the first time
  display_calendar_popup(@redd_date) if @setup_finished
end

#setup_date_widgetsObject



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 69

def setup_date_widgets
  @redd_date.signal_connect("icon-press") do |entry, primary, _icon|
    case primary.nick
    when "primary"
      display_calendar_popup(entry)
    when "secondary"
      clear_date_entry(entry)
    end
  end

  @date_loaned_since.signal_connect("icon-press") do |entry, primary, _icon|
    case primary.nick
    when "primary"
      display_calendar_popup(entry)
    when "secondary"
      clear_date_entry(entry)
      @label_loaning_duration.label = ""
    end
  end
end

#showObject



65
66
67
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 65

def show
  @book_properties_dialog.show
end

#want_toggledObject



152
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 152

def want_toggled; end

#widget_namesObject



90
91
92
93
94
95
96
97
98
99
# File 'lib/alexandria/ui/book_properties_dialog_base.rb', line 90

def widget_names
  [:book_properties_dialog, :button_box, :button_cover,
   :checkbutton_loaned, :checkbutton_own, :checkbutton_redd,
   :checkbutton_want, :date_loaned_since, :entry_edition,
   :entry_loaned_to, :entry_publish_date, :entry_publisher, :entry_isbn,
   :entry_tags, :entry_title, :image_cover, :image_rating1,
   :image_rating2, :image_rating3, :image_rating4, :image_rating5,
   :label_loaning_duration, :notebook, :redd_date, :textview_notes,
   :treeview_authors]
end