@@ -171,6 +171,8 @@ wxMenu* main_window::create_tools_menu() {
171171 menu->AppendSeparator ();
172172 menu->Append (ID_TABLE_OF_CONTENTS, _ (" Table of contents\t Ctrl+T" ));
173173 menu->AppendSeparator ();
174+ menu->Append (ID_OPEN_CONTAINING_FOLDER, _ (" Open &containing folder" ));
175+ menu->AppendSeparator ();
174176 menu->Append (ID_TOGGLE_BOOKMARK, _ (" Toggle bookmark\t Ctrl+Shift+B" ));
175177 menu->Append (ID_BOOKMARK_WITH_NOTE, _ (" Bookmark with ¬e\t Ctrl+Shift+N" ));
176178 menu->AppendSeparator ();
@@ -233,6 +235,7 @@ void main_window::bind_events() {
233235 {ID_WORD_COUNT, &main_window::on_word_count},
234236 {ID_DOC_INFO, &main_window::on_doc_info},
235237 {ID_TABLE_OF_CONTENTS, &main_window::on_toc},
238+ {ID_OPEN_CONTAINING_FOLDER, &main_window::on_open_containing_folder},
236239 {ID_OPTIONS, &main_window::on_options},
237240 {ID_SLEEP_TIMER, &main_window::on_sleep_timer},
238241 {wxID_ABOUT, &main_window::on_about},
@@ -328,6 +331,7 @@ void main_window::update_ui() {
328331 ID_WORD_COUNT,
329332 ID_DOC_INFO,
330333 ID_TABLE_OF_CONTENTS,
334+ ID_OPEN_CONTAINING_FOLDER,
331335 };
332336 for (const auto id : doc_items) {
333337 enable (id, has_doc);
@@ -610,6 +614,18 @@ void main_window::on_toc(wxCommandEvent&) {
610614 save_position_immediately ();
611615}
612616
617+ void main_window::on_open_containing_folder (wxCommandEvent&) {
618+ auto * const tab = doc_manager->get_active_tab ();
619+ if (tab == nullptr ) {
620+ return ;
621+ }
622+ const wxString path = tab->file_path ;
623+ const wxString dir = wxFileName (path).GetPath ();
624+ if (!wxLaunchDefaultBrowser (" file://" + dir)) {
625+ wxMessageBox (_ (" Failed to open containing folder." ), _ (" Error" ), wxICON_ERROR);
626+ }
627+ }
628+
613629void main_window::on_options (wxCommandEvent&) {
614630 auto & config_mgr = wxGetApp ().get_config_manager ();
615631 const wxTextCtrl* active_text_ctrl = doc_manager->get_active_text_ctrl ();
0 commit comments