diff options
Diffstat (limited to 'header.cc')
-rw-r--r-- | header.cc | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/header.cc b/header.cc new file mode 100644 index 0000000..c40e44e --- /dev/null +++ b/header.cc @@ -0,0 +1,210 @@ +#include "header.h" +#include "readerview.h" +#include "mods.h" +#include <gtk/gtk.h> + +Header::Header(ReaderView *reader, Gtk::Window *window) +: back(), forward(), book(), menu(), bookMenu(), menuMenu() +{ + this->mods = new Mods(this, window); + this->reader = reader; + this->window = window; + set_show_close_button(true); + set_title ("Bible Reader"); + set_has_subtitle(false); + //this->override_background_color(*(new Gdk::RGBA("#1d1f21"))); + //this->override_color(*(new Gdk::RGBA("#c5c8c6"))); + + back.set_image_from_icon_name("go-previous-symbolic"); + forward.set_image_from_icon_name("go-next-symbolic"); + menu.set_image_from_icon_name("open-menu-symbolic"); + + back.signal_clicked().connect([reader, this]() { + reader->setChapter(reader->getChapter() - 1); + updateButtons(); + }); + + forward.signal_clicked().connect([reader, this]() { + reader->setChapter(reader->getChapter() + 1); + updateButtons(); + }); + + pack_start(back); + pack_start(book); + pack_start(forward); + pack_end(menu); + + book.set_popover(bookMenu); + menu.set_popover(menuMenu); + + updateButtons(); + updateMenus(); +} + +Header::~Header() {} + +void Header::updateButtons() { + back.set_sensitive(reader->getChapter() > 1); + forward.set_sensitive(reader->getChapter() < reader->getChapterMax()); + if(reader->getBook() == "") { + book.set_label(""); + book.set_sensitive(false); + } else { + book.set_label(reader->getBook() + " " + std::to_string(reader->getChapter())); + book.set_sensitive(true); + } +} + +void Header::updateMenus() { + // Wipe them out and start over + if(bookMenu.get_children().size() != 0) { + delete bookMenu.get_children()[0]; + } + if(menuMenu.get_children().size() != 0) { + delete menuMenu.get_children()[0]; + } + + // Populate bookMenu + Gtk::HBox *outer = Gtk::manage(new Gtk::HBox); + bookMenu.add(*outer); + + //TODO: Disgusting code duplication. Fix with strategy pattern? Or loop? + + Gtk::ScrolledWindow *swl = Gtk::manage(new Gtk::ScrolledWindow); + Gtk::VBox *boxl = Gtk::manage(new Gtk::VBox); + outer->add(*swl); + swl->add(*boxl); + swl->set_propagate_natural_width(true); + swl->set_min_content_height(300); + for(std::string bookName : reader->getAllBooks()) { + Gtk::Button *item = Gtk::manage(new Gtk::Button(bookName)); + item->set_relief(Gtk::ReliefStyle::RELIEF_NONE); + item->signal_clicked().connect([bookName, this]() { + bookMenu.popdown(); + reader->setChapter(1); + reader->setBook(bookName); + updateButtons(); + updateMenus(); + showText(); + }); + boxl->add(*item); + } + + Gtk::ScrolledWindow *swr = Gtk::manage(new Gtk::ScrolledWindow); + Gtk::VBox *boxr = Gtk::manage(new Gtk::VBox); + outer->add(*swr); + swr->add(*boxr); + swr->set_propagate_natural_width(true); + swr->set_min_content_height(300); + for(int chapter = 1; chapter <= reader->getChapterMax(); chapter++) { + Gtk::Button *item = Gtk::manage(new Gtk::Button(std::to_string(chapter))); + item->set_relief(Gtk::ReliefStyle::RELIEF_NONE); + item->signal_clicked().connect([chapter, this]() { + bookMenu.popdown(); + reader->setChapter(chapter); + updateButtons(); + showText(); + }); + boxr->add(*item); + } + + bool *hasAllocated = new bool(false); + outer->signal_size_allocate().connect([this, swl, swr, hasAllocated](Gdk::Rectangle rec) { + if(! *hasAllocated) { + // First figure out the books + auto allBooks = reader->getAllBooks(); + int position = std::find(allBooks.begin(), allBooks.end(), reader->getBookFull()) - allBooks.begin(); + swl->get_vadjustment()->set_value(swl->get_vadjustment()->get_upper() * position / allBooks.size()); + swr->get_vadjustment()->set_value(swr->get_vadjustment()->get_upper() * (reader->getChapter() - 1) / reader->getChapterMax()); + } + *hasAllocated = true; + }); + + bookMenu.show_all_children(); + book.signal_pressed().connect([this, hasAllocated, swl, swr]() { + *hasAllocated = false; + }); + + // Populate menuMenu + Gtk::VBox *outerBox = Gtk::manage(new Gtk::VBox); + menuMenu.add(*outerBox); + + Gtk::VBox *versionBox = Gtk::manage(new Gtk::VBox); + Gtk::Label *scaleLabel = Gtk::manage(new Gtk::Label); + scaleLabel->set_text("Text Size"); + versionBox->add(*scaleLabel); + Gtk::Scale *scale = Gtk::manage(new Gtk::Scale); + scale->set_range(8000, 20000); + scale->set_value(libbible::settingsReadInt("fontsize")); + scale->set_draw_value(false); + scale->signal_value_changed().connect([scale, this]() { + libbible::settingsWriteInt("fontsize", (int) scale->get_value()); + this->reader->refresh(); + }); + versionBox->add(*scale); + + vector<string> versions = reader->getAllVersions(); + if(versions.size() > 8) { + Gtk::ScrolledWindow *sw = Gtk::manage(new Gtk::ScrolledWindow); + sw->set_propagate_natural_width(true); + sw->set_min_content_height(300); + sw->add(*versionBox); + outerBox->add(*sw); + } else { + outerBox->add(*versionBox); + } + for(string version : versions) { + Gtk::Button *item = Gtk::manage(new Gtk::Button(version)); + item->set_relief(Gtk::ReliefStyle::RELIEF_NONE); + item->signal_clicked().connect([version, this]() { + menuMenu.popdown(); + this->reader->setVersion(version); + updateButtons(); + updateMenus(); + showText(); + }); + Gtk::Button *delVersion = Gtk::manage(new Gtk::Button); + delVersion->set_image_from_icon_name("list-remove-symbolic"); + delVersion->set_relief(Gtk::ReliefStyle::RELIEF_NONE); + delVersion->signal_clicked().connect([version, this]() { + menuMenu.popdown(); + std::vector<std::string> toDel {version}; + this->mods->uninstallMods(toDel); + reader->modsUpdated(); + updateButtons(); + updateMenus(); + }); + item->set_halign(Gtk::ALIGN_FILL); + delVersion->set_halign(Gtk::ALIGN_END); + Gtk::HBox *hbox = Gtk::manage(new Gtk::HBox); + hbox->add(*item); + hbox->add(*delVersion); + versionBox->add(*hbox); + item->set_sensitive(version != reader->getVersion()); + } + Gtk::Button *add = Gtk::manage(new Gtk::Button); + add->set_image_from_icon_name("list-add-symbolic"); + add->signal_clicked().connect([this]() { + menuMenu.popdown(); + showMods(); + updateMenus(); + updateButtons(); + }); + versionBox->add(*add); + + menuMenu.show_all_children(); +} + +void Header::showMods() { + window->remove(); + window->add(*this->mods); + //this->mods->displayMain(); + window->show_all_children(); +} + +void Header::showText() { + window->remove(); + window->add(*this->reader); + //this->reader->setChapter(1); + window->show_all_children(); +} |