Skip to content

Commit

Permalink
Add a 'Close All' menu item
Browse files Browse the repository at this point in the history
* This resets all back to initial state
* Export file is no longer reseted when all pages are deleted

close pdfarranger#593
  • Loading branch information
kbengs committed Dec 5, 2021
1 parent 6a5beee commit 6412988
Show file tree
Hide file tree
Showing 4 changed files with 52 additions and 13 deletions.
6 changes: 6 additions & 0 deletions data/menu.ui
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,12 @@ along with PDF Arranger. If not, see <http://www.gnu.org/licenses/>.
<attribute name="action">win.about</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">_Close All</attribute>
<attribute name="action">win.close</attribute>
</item>
</section>
<section>
<item>
<attribute name="label" translatable="yes">_Quit</attribute>
Expand Down
1 change: 1 addition & 0 deletions pdfarranger/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
('save-as', '<Primary><Shift>s'),
('export-selection(2)', '<Primary>e'),
('export-all', '<Primary><Shift>e'),
('close', '<Primary>w'),
('quit', '<Primary>q'),
('new', '<Primary>n'),
('import', '<Primary>o'),
Expand Down
53 changes: 40 additions & 13 deletions pdfarranger/pdfarranger.py
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,7 @@ def __create_actions(self):
('new', self.on_action_new),
('import', self.on_action_add_doc_activate),
('zoom', self.zoom_change, 'i'),
('close', self.on_action_close),
('quit', self.on_quit),
('undo', self.undomanager.undo),
('redo', self.undomanager.redo),
Expand Down Expand Up @@ -530,7 +531,6 @@ def do_activate(self):

self.model.connect('row-inserted', self.__update_num_pages)
self.model.connect('row-deleted', self.__update_num_pages)
self.model.connect('row-deleted', self.reset_export_file)

# Status bar to the left
self.status_bar = self.uiXML.get_object('statusbar')
Expand Down Expand Up @@ -892,18 +892,45 @@ def update_geometry(self, treeiter):
p.set_size(page.get_size())
self.model.set(treeiter, 0, p)

def save_dialog(self):
if self.export_file:
msg = _('Save changes to “{}” before closing?').format(os.path.basename(self.export_file))
else:
msg = _('Save changes before closing?')
d = Gtk.MessageDialog(self.window, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.NONE, msg)
d.format_secondary_markup(_("Your changes will be lost if you don’t save them."))
d.add_buttons(_('Do_n’t Save'), 1, _('_Cancel'), 2, _('_Save'), 3)
response = d.run()
d.destroy()
return response

def on_action_close(self, _action, _param=None, _unknown=None):
if self.is_unsaved and (self.export_file or len(self.model) > 0):
response = self.save_dialog()
if response == 2 or response == Gtk.ResponseType.DELETE_EVENT:
# DELETE_EVENT is returned if Esc is pressed
return
elif response == 3:
# Save.
if len(self.model) == 0:
self.error_message_dialog(_('A document without pages can not be saved.'))
return
self.save_or_choose()
# Close file only if it has been really saved.
if self.is_unsaved:
return
self.model.clear()
self.pdfqueue = []
self.undomanager.clear()
self.__update_num_pages(self.model)
self.retitle()
self.metadata = {}
self.reset_export_file()
malloc_trim()

def on_quit(self, _action, _param=None, _unknown=None):
if self.is_unsaved:
if self.export_file:
msg = _('Save changes to “{}” before closing?').format(os.path.basename(self.export_file))
else:
msg = _('Save changes before closing?')
d = Gtk.MessageDialog(self.window, 0, Gtk.MessageType.WARNING, Gtk.ButtonsType.NONE, msg)
d.format_secondary_markup(_("Your changes will be lost if you don’t save them."))
d.add_buttons(_('Do_n’t Save'), 1, _('_Cancel'), 2, _('_Save'), 3)
response = d.run()
d.destroy()

response = self.save_dialog()
if response == 1:
# Quit
self.close_application()
Expand Down Expand Up @@ -2122,8 +2149,8 @@ def about_dialog(self, _action, _parameter, _unknown):
about_dialog.connect('delete_event', lambda w, *args: w.destroy())
about_dialog.show_all()

def reset_export_file(self, model, _path, _itr=None, _user_data=None):
if len(model) == 0:
def reset_export_file(self, model=None, _path=None, _itr=None, _user_data=None):
if len(self.model) == 0:
self.set_export_file(None)
self.set_unsaved(False)

Expand Down
5 changes: 5 additions & 0 deletions pdfarranger/undo.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,11 @@ def __init__(self, app):
self.undoaction = None
self.redoaction = None

def clear(self):
self.states = []
self.label = None
self.current = 0

def commit(self, label):
"""
Must be called *BEFORE* each undoable actions
Expand Down

0 comments on commit 6412988

Please sign in to comment.