From 47f9f4599c6e683c2dae5ec0f726fb3ce5c3f30b Mon Sep 17 00:00:00 2001 From: milleniumbug Date: Wed, 6 Apr 2016 19:58:18 +0200 Subject: [PATCH 1/5] added new directory tree feature: create new file here --- src/directories.cc | 26 ++++++++++++++++++++++++++ src/directories.h | 1 + 2 files changed, 27 insertions(+) diff --git a/src/directories.cc b/src/directories.cc index 5898c4c..0b019a6 100644 --- a/src/directories.cc +++ b/src/directories.cc @@ -299,6 +299,32 @@ Directories::Directories() : Gtk::TreeView(), stop_update_thread(false) { }); menu.append(menu_item_delete); + menu_item_create.set_label("Create new file here"); + menu_item_create.signal_activate().connect([this] { + if(menu_popup_row_path.empty()) + return; + EntryBox::get().clear(); + auto source_path=std::make_shared(menu_popup_row_path); + EntryBox::get().entries.emplace_back("", [this, source_path](const std::string &content){ + bool is_directory=boost::filesystem::is_directory(*source_path); + auto target_path = (is_directory ? *source_path : source_path->parent_path())/content; + if(!boost::filesystem::exists(target_path)) + filesystem::write(target_path, ""); + else + Terminal::get().print("Cannot create "+target_path.string()+": file already exists.\n", true); + update(); + + EntryBox::get().hide(); + }); + auto entry_it=EntryBox::get().entries.begin(); + entry_it->set_placeholder_text("Filename"); + EntryBox::get().buttons.emplace_back("Create file", [this, entry_it](){ + entry_it->activate(); + }); + EntryBox::get().show(); + }); + menu.append(menu_item_create); + menu.show_all(); menu.accelerate(*this); } diff --git a/src/directories.h b/src/directories.h index 61daccc..a458ef0 100644 --- a/src/directories.h +++ b/src/directories.h @@ -69,6 +69,7 @@ private: Dispatcher dispatcher; Gtk::Menu menu; + Gtk::MenuItem menu_item_create; Gtk::MenuItem menu_item_rename; Gtk::MenuItem menu_item_delete; boost::filesystem::path menu_popup_row_path; From 889a112df277491586fdaf5dddffa51323068708 Mon Sep 17 00:00:00 2001 From: milleniumbug Date: Wed, 6 Apr 2016 20:41:21 +0200 Subject: [PATCH 2/5] added opening the file on using the "create new file here" option --- src/directories.cc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/directories.cc b/src/directories.cc index 0b019a6..9e7095f 100644 --- a/src/directories.cc +++ b/src/directories.cc @@ -309,7 +309,10 @@ Directories::Directories() : Gtk::TreeView(), stop_update_thread(false) { bool is_directory=boost::filesystem::is_directory(*source_path); auto target_path = (is_directory ? *source_path : source_path->parent_path())/content; if(!boost::filesystem::exists(target_path)) + { filesystem::write(target_path, ""); + Notebook::get().open(target_path); + } else Terminal::get().print("Cannot create "+target_path.string()+": file already exists.\n", true); update(); From 9cd138b5412f4e058e19d1de37e3ee586b6c5188 Mon Sep 17 00:00:00 2001 From: milleniumbug Date: Wed, 6 Apr 2016 20:54:08 +0200 Subject: [PATCH 3/5] renamed the "Create new file here" to "Create file" --- src/directories.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/directories.cc b/src/directories.cc index 9e7095f..e0fd174 100644 --- a/src/directories.cc +++ b/src/directories.cc @@ -299,7 +299,7 @@ Directories::Directories() : Gtk::TreeView(), stop_update_thread(false) { }); menu.append(menu_item_delete); - menu_item_create.set_label("Create new file here"); + menu_item_create.set_label("Create file"); menu_item_create.signal_activate().connect([this] { if(menu_popup_row_path.empty()) return; From 5f311bd9a0489de35106c8c5fc492f743b9aacd8 Mon Sep 17 00:00:00 2001 From: milleniumbug Date: Sat, 9 Apr 2016 21:19:24 +0200 Subject: [PATCH 4/5] Made creating files in root directory possible --- src/directories.cc | 33 ++++++++++++++++++++++++++++++--- src/directories.h | 5 ++++- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/directories.cc b/src/directories.cc index e0fd174..6564e14 100644 --- a/src/directories.cc +++ b/src/directories.cc @@ -299,8 +299,8 @@ Directories::Directories() : Gtk::TreeView(), stop_update_thread(false) { }); menu.append(menu_item_delete); - menu_item_create.set_label("Create file"); - menu_item_create.signal_activate().connect([this] { + auto create_file_label = "Create file"; + auto create_file_signal = [this] { if(menu_popup_row_path.empty()) return; EntryBox::get().clear(); @@ -325,11 +325,34 @@ Directories::Directories() : Gtk::TreeView(), stop_update_thread(false) { entry_it->activate(); }); EntryBox::get().show(); - }); + }; + + menu_item_create.set_label(create_file_label); + menu_item_create.signal_activate().connect(create_file_signal); menu.append(menu_item_create); menu.show_all(); menu.accelerate(*this); + + menu_root_item_create.set_label(create_file_label); + menu_root_item_create.signal_activate().connect(create_file_signal); + menu_root.append(menu_root_item_create); + + menu_root.show_all(); + menu_root.accelerate(*this); + + set_headers_clickable(); + forall([this](Gtk::Widget &widget) { + if(widget.get_name()=="GtkButton") { + widget.signal_button_press_event().connect([this](GdkEventButton *event) { + if(event->type==GDK_BUTTON_PRESS && event->button==GDK_BUTTON_SECONDARY && !path.empty()) { + menu_popup_row_path=this->path; + menu_root.popup(event->button, event->time); + } + return true; + }); + } + }); } Directories::~Directories() { @@ -429,6 +452,10 @@ bool Directories::on_button_press_event(GdkEventButton* event) { menu.popup(event->button, event->time); return true; } + else { + menu_popup_row_path=this->path; + menu_root.popup(event->button, event->time); + } } return Gtk::TreeView::on_button_press_event(event); diff --git a/src/directories.h b/src/directories.h index a458ef0..c2d22cd 100644 --- a/src/directories.h +++ b/src/directories.h @@ -68,10 +68,13 @@ private: std::atomic stop_update_thread; Dispatcher dispatcher; + Gtk::Menu menu_root; + Gtk::MenuItem menu_root_item_create; + Gtk::Menu menu; - Gtk::MenuItem menu_item_create; Gtk::MenuItem menu_item_rename; Gtk::MenuItem menu_item_delete; + Gtk::MenuItem menu_item_create; boost::filesystem::path menu_popup_row_path; }; From 45b86c4816f430017f8d3015470d8e778240ed30 Mon Sep 17 00:00:00 2001 From: eidheim Date: Sun, 10 Apr 2016 11:39:24 +0200 Subject: [PATCH 5/5] Cleanup and improvements related to #187: right click menu operations in directory view --- src/directories.cc | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) diff --git a/src/directories.cc b/src/directories.cc index e514a5e..e07b437 100644 --- a/src/directories.cc +++ b/src/directories.cc @@ -63,8 +63,10 @@ bool Directories::TreeStore::drag_data_received_vfunc(const TreeModel::Path &pat auto it=directories.get_selection()->get_selected(); if(it) { auto source_path=it->get_value(directories.column_record.path); - auto target_path=get_target_folder(path); + if(source_path.empty()) + return false; + auto target_path=get_target_folder(path); target_path/=source_path.filename(); if(source_path==target_path) @@ -218,7 +220,7 @@ Directories::Directories() : Gtk::TreeView(), stop_update_thread(false) { auto target_path=source_path->parent_path()/content; boost::filesystem::rename(*source_path, target_path, ec); if(ec) - Terminal::get().print("Error: could not rename "+source_path->string()+": "+ec.message()+'\n'); + Terminal::get().print("Error: could not rename "+source_path->string()+": "+ec.message()+'\n', true); else { update(); select(target_path); @@ -297,7 +299,7 @@ Directories::Directories() : Gtk::TreeView(), stop_update_thread(false) { }); menu.append(menu_item_delete); - auto create_file_label = "Create file"; + auto create_file_label = "Create File"; auto create_file_signal = [this] { if(menu_popup_row_path.empty()) return; @@ -306,14 +308,16 @@ Directories::Directories() : Gtk::TreeView(), stop_update_thread(false) { EntryBox::get().entries.emplace_back("", [this, source_path](const std::string &content){ bool is_directory=boost::filesystem::is_directory(*source_path); auto target_path = (is_directory ? *source_path : source_path->parent_path())/content; - if(!boost::filesystem::exists(target_path)) - { - filesystem::write(target_path, ""); - Notebook::get().open(target_path); + if(!boost::filesystem::exists(target_path)) { + if(filesystem::write(target_path, "")) { + update(); + Notebook::get().open(target_path); + } + else + Terminal::get().print("Error: could not create "+target_path.string()+'\n', true); } else - Terminal::get().print("Cannot create "+target_path.string()+": file already exists.\n", true); - update(); + Terminal::get().print("Error: could not create "+target_path.string()+": file already exists\n", true); EntryBox::get().hide(); }); @@ -446,15 +450,27 @@ void Directories::select(const boost::filesystem::path &select_path) { bool Directories::on_button_press_event(GdkEventButton* event) { if(event->type==GDK_BUTTON_PRESS && event->button==GDK_BUTTON_SECONDARY) { + EntryBox::get().hide(); Gtk::TreeModel::Path path; if(get_path_at_pos(static_cast(event->x), static_cast(event->y), path)) { menu_popup_row_path=get_model()->get_iter(path)->get_value(column_record.path); + if(menu_popup_row_path.empty()) { + auto parent=get_model()->get_iter(path)->parent(); + if(parent) + menu_popup_row_path=parent->get_value(column_record.path); + else { + menu_popup_row_path=this->path; + menu_root.popup(event->button, event->time); + return true; + } + } menu.popup(event->button, event->time); return true; } - else { + else if(!this->path.empty()) { menu_popup_row_path=this->path; menu_root.popup(event->button, event->time); + return true; } }