408d3fd
--- alexandria-book-collection-manager-0.7.4/lib/alexandria/library_store.rb.delbroken	2020-01-03 17:38:07.340338529 +0900
408d3fd
+++ alexandria-book-collection-manager-0.7.4/lib/alexandria/library_store.rb	2020-01-04 13:04:55.467319713 +0900
408d3fd
@@ -68,7 +68,7 @@ module Alexandria
408d3fd
             md = /([\dxX]{10,13})#{Library::EXT[:book]}/.match(filename)
Mamoru Tasaka 7dd7dd0
             if md
Mamoru Tasaka 7dd7dd0
               file_isbn = md[1]
Mamoru Tasaka 7dd7dd0
-              ruined_books << [nil, file_isbn, library]
Mamoru Tasaka 7dd7dd0
+              ruined_books << [nil, file_isbn, library, filename, library.path]
Mamoru Tasaka 7dd7dd0
             else
408d3fd
               log.warn { "Filename #{filename} does not contain an ISBN" }
408d3fd
               # TODO: delete this file...
408d3fd
--- alexandria-book-collection-manager-0.7.4/lib/alexandria/ui/ui_manager.rb.delbroken	2020-01-03 17:37:42.404366230 +0900
408d3fd
+++ alexandria-book-collection-manager-0.7.4/lib/alexandria/ui/ui_manager.rb	2020-01-04 13:09:04.588530827 +0900
408d3fd
@@ -694,6 +694,73 @@ module Alexandria
Mamoru Tasaka 7dd7dd0
                 false
Mamoru Tasaka 7dd7dd0
               end
Mamoru Tasaka 7dd7dd0
             end
Mamoru Tasaka 7dd7dd0
+          else ## if response_type == Gtk::Dialog::RESPONSE_OK
Mamoru Tasaka 7dd7dd0
+            handle_and_delete_ruined_books
Mamoru Tasaka 7dd7dd0
+          end
Mamoru Tasaka 7dd7dd0
+        end
Mamoru Tasaka 7dd7dd0
+      end
Mamoru Tasaka 7dd7dd0
+
Mamoru Tasaka 7dd7dd0
+      def handle_and_delete_ruined_books
Mamoru Tasaka 7dd7dd0
+        title = _("Delete Book Data")
Mamoru Tasaka 7dd7dd0
+        new_message = _("Or do you wish to delete the data files for the following books are malformed or empty?\n")
Mamoru Tasaka 7dd7dd0
+
Mamoru Tasaka 7dd7dd0
+        @libraries.ruined_books.each { |bi|
Mamoru Tasaka 7dd7dd0
+          new_message += "\n#{bi[1] or bi[1].inspect}"
Mamoru Tasaka 7dd7dd0
+        }
Mamoru Tasaka 7dd7dd0
+        recovery_dialog = Gtk::MessageDialog.new(@main_app, Gtk::Dialog::MODAL,
Mamoru Tasaka 7dd7dd0
+                                                 Gtk::MessageDialog::WARNING,
Mamoru Tasaka 7dd7dd0
+                                                 Gtk::MessageDialog::BUTTONS_OK_CANCEL,
Mamoru Tasaka 7dd7dd0
+                                                 new_message ).show
Mamoru Tasaka 7dd7dd0
+        recovery_dialog.signal_connect('response') do |dialog, response_type|
Mamoru Tasaka 7dd7dd0
+          recovery_dialog.destroy
Mamoru Tasaka 7dd7dd0
+          if response_type == Gtk::Dialog::RESPONSE_OK
Mamoru Tasaka 7dd7dd0
+            books_to_add = []
Mamoru Tasaka 7dd7dd0
+
Mamoru Tasaka 7dd7dd0
+            # progress indicator...
Mamoru Tasaka 7dd7dd0
+            @progressbar.fraction = 0
Mamoru Tasaka 7dd7dd0
+            @appbar.children.first.visible = true   # show the progress bar
Mamoru Tasaka 7dd7dd0
+
Mamoru Tasaka 7dd7dd0
+            total_book_count = @libraries.ruined_books.size
Mamoru Tasaka 7dd7dd0
+            fraction_per_book = 1.0 / total_book_count
Mamoru Tasaka 7dd7dd0
+            prog_percentage = 0
Mamoru Tasaka 7dd7dd0
+
Mamoru Tasaka 7dd7dd0
+            @libraries.ruined_books.reverse!
Mamoru Tasaka 7dd7dd0
+            Gtk.idle_add do
Mamoru Tasaka 7dd7dd0
+              ruined_book = @libraries.ruined_books.pop
Mamoru Tasaka 7dd7dd0
+              if ruined_book
Mamoru Tasaka 7dd7dd0
+                book, isbn, library, filename, path = ruined_book
Mamoru Tasaka 7dd7dd0
+                filename_path = File.join(path, filename)
Mamoru Tasaka 7dd7dd0
+                begin
Mamoru Tasaka 7dd7dd0
+                  File.delete(filename_path)
Mamoru Tasaka 7dd7dd0
+                  set_status_label(_("The file '%s' removed") % filename)
Mamoru Tasaka 7dd7dd0
+                  log.debug {"The maybe-malformed file #{filename} removed"}
Mamoru Tasaka 7dd7dd0
+
Mamoru Tasaka 7dd7dd0
+                rescue Exception => ex
Mamoru Tasaka 7dd7dd0
+                  log.error { "Could not delete #{filename_path}: #{ex}" }
Mamoru Tasaka 7dd7dd0
+                  log.error { ex.backtrace.join("\n") }
Mamoru Tasaka 7dd7dd0
+                end
Mamoru Tasaka 7dd7dd0
+
Mamoru Tasaka 7dd7dd0
+                prog_percentage += fraction_per_book
Mamoru Tasaka 7dd7dd0
+                @progressbar.fraction = prog_percentage
Mamoru Tasaka 7dd7dd0
+
Mamoru Tasaka 7dd7dd0
+                true
Mamoru Tasaka 7dd7dd0
+              else
Mamoru Tasaka 7dd7dd0
+                ## Totally copied and pasted from refresh_books...
Mamoru Tasaka 7dd7dd0
+                ## call this the second strike... (CathalMagus)
Mamoru Tasaka 7dd7dd0
+
Mamoru Tasaka 7dd7dd0
+                # @iconview.unfreeze
Mamoru Tasaka 7dd7dd0
+                # @filtered_model.refilter
Mamoru Tasaka 7dd7dd0
+                # @listview.columns_autosize
Mamoru Tasaka 7dd7dd0
+
Mamoru Tasaka 7dd7dd0
+                @progressbar.fraction = 1
Mamoru Tasaka 7dd7dd0
+                ## Hide the progress bar.
Mamoru Tasaka 7dd7dd0
+                @appbar.children.first.visible = false
Mamoru Tasaka 7dd7dd0
+                ## Refresh the status bar.
Mamoru Tasaka 7dd7dd0
+                set_status_label('')
Mamoru Tasaka 7dd7dd0
+                # on_books_selection_changed
Mamoru Tasaka 7dd7dd0
+                false
Mamoru Tasaka 7dd7dd0
+              end
Mamoru Tasaka 7dd7dd0
+            end
Mamoru Tasaka 7dd7dd0
           end
Mamoru Tasaka 7dd7dd0
         end
Mamoru Tasaka 7dd7dd0
       end