Browse Source

Added close symbol on tabs.

merge-requests/365/head
eidheim 10 years ago
parent
commit
5ed9b6eb72
  1. 60
      src/notebook.cc
  2. 10
      src/notebook.h

60
src/notebook.cc

@ -27,6 +27,17 @@ namespace sigc {
#endif
}
Notebook::TabLabel::TabLabel(const std::string &title) : Gtk::Box(Gtk::ORIENTATION_HORIZONTAL) {
label.set_text(title);
button.set_image_from_icon_name("window-close-symbolic", Gtk::ICON_SIZE_MENU);
button.set_border_width(0.0);
button.set_use_underline(false);
button.set_relief(Gtk::ReliefStyle::RELIEF_NONE);
pack_start(label, Gtk::PACK_SHRINK);
pack_end(button, Gtk::PACK_SHRINK);
show_all();
}
Notebook::Notebook() : Gtk::Notebook(), last_index(-1) {
Gsv::init();
@ -115,8 +126,19 @@ void Notebook::open(const boost::filesystem::path &file_path) {
#endif
configure(source_views.size()-1);
//Set up tab label
std::string title=file_path.filename().string();
append_page(*hboxes.back(), title);
tab_labels.emplace_back(new TabLabel(title));
auto source_view=source_views.back();
tab_labels.back()->button.signal_clicked().connect([this, source_view](){
for(int c=0;c<size();c++) {
if(get_view(c)==source_view) {
close(c);
break;
}
}
});
append_page(*hboxes.back(), *tab_labels.back());
set_tab_reorderable(*hboxes.back(), true);
show_all_children();
@ -131,7 +153,6 @@ void Notebook::open(const boost::filesystem::path &file_path) {
get_current_view()->get_buffer()->set_modified(false);
get_current_view()->grab_focus();
//Add star on tab label when the page is not saved:
auto source_view=get_current_view();
get_current_view()->get_buffer()->signal_modified_changed().connect([this, source_view]() {
std::string title=source_view->file_path.filename().string();
if(source_view->get_buffer()->get_modified())
@ -144,7 +165,7 @@ void Notebook::open(const boost::filesystem::path &file_path) {
}
}
if(page!=-1)
set_tab_label_text(*(get_nth_page(page)), title);
tab_labels.at(page)->label.set_text(title);
});
JDEBUG("end");
@ -249,22 +270,28 @@ bool Notebook::save_current() {
return save(get_current_page());
}
bool Notebook::close_current_page() {
bool Notebook::close(int page) {
JDEBUG("start");
if (get_current_page()!=-1) {
if(get_current_view()->get_buffer()->get_modified()){
if(!save_modified_dialog()) {
if (page!=-1) {
auto view=get_view(page);
if(view->get_buffer()->get_modified()){
if(!save_modified_dialog(page)) {
JDEBUG("end false");
return false;
}
}
int page = get_current_page();
int index=get_index(page);
auto index=get_index(page);
if(page==get_current_page()) {
if(last_index!=static_cast<size_t>(-1)) {
set_current_page(page_num(*hboxes.at(last_index)));
last_index=-1;
}
}
else if(index==last_index)
last_index=-1;
else if(index<last_index && last_index!=static_cast<size_t>(-1))
last_index--;
remove_page(page);
#if GTKSOURCEVIEWMM_MAJOR_VERSION > 2 & GTKSOURCEVIEWMM_MINOR_VERSION > 17
source_maps.erase(source_maps.begin()+index);
@ -277,11 +304,18 @@ bool Notebook::close_current_page() {
source_views.erase(source_views.begin()+index);
scrolled_windows.erase(scrolled_windows.begin()+index);
hboxes.erase(hboxes.begin()+index);
tab_labels.erase(tab_labels.begin()+index);
}
JDEBUG("end true");
return true;
}
bool Notebook::close_current_page() {
if(get_current_page()==-1)
return false;
return close(get_current_page());
}
boost::filesystem::path Notebook::get_current_folder() {
boost::filesystem::path current_path;
@ -293,13 +327,13 @@ boost::filesystem::path Notebook::get_current_folder() {
return current_path;
}
bool Notebook::save_modified_dialog() {
bool Notebook::save_modified_dialog(int page) {
Gtk::MessageDialog dialog((Gtk::Window&)(*get_toplevel()), "Save file!", false, Gtk::MESSAGE_QUESTION, Gtk::BUTTONS_YES_NO);
dialog.set_default_response(Gtk::RESPONSE_YES);
dialog.set_secondary_text("Do you want to save: " + get_current_view()->file_path.string()+" ?");
dialog.set_secondary_text("Do you want to save: " + get_view(page)->file_path.string()+" ?");
int result = dialog.run();
if(result==Gtk::RESPONSE_YES) {
save_current();
save(page);
return true;
}
else if(result==Gtk::RESPONSE_NO) {

10
src/notebook.h

@ -10,12 +10,19 @@
#include <sigc++/sigc++.h>
class Notebook : public Gtk::Notebook {
class TabLabel : public Gtk::Box {
public:
TabLabel(const std::string &title);
Gtk::Label label;
Gtk::Button button;
};
public:
Notebook();
Source::View* get_view(int page);
size_t get_index(int page);
int size();
Source::View* get_current_view();
bool close(int page);
bool close_current_page();
void open(const boost::filesystem::path &file_path);
bool save(int page);
@ -24,11 +31,12 @@ public:
boost::filesystem::path get_current_folder();
private:
bool save_modified_dialog();
bool save_modified_dialog(int page);
std::vector<Source::View*> source_views; //Is NOT freed in destructor, this is intended for quick program exit.
std::vector<std::unique_ptr<Gtk::Widget> > source_maps;
std::vector<std::unique_ptr<Gtk::ScrolledWindow> > scrolled_windows;
std::vector<std::unique_ptr<Gtk::HBox> > hboxes;
std::vector<std::unique_ptr<TabLabel> > tab_labels;
size_t last_index;
};

Loading…
Cancel
Save