1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-19 00:55:08 +00:00
serenity/Applications/Browser/main.cpp
Andreas Kling 06113b4ffe LibHTML+Browser: Show the number of pending resource loads
For now this is simply a counter+hook exposed by ResourceLoader and
shown in the Browser status bar.

This is not very nuanced, and it would be nice to expose more info so
we could eventually do something like a progress bar.
2019-10-10 22:07:08 +02:00

123 lines
3.7 KiB
C++

#include <LibCore/CFile.h>
#include <LibGUI/GAboutDialog.h>
#include <LibGUI/GAction.h>
#include <LibGUI/GApplication.h>
#include <LibGUI/GBoxLayout.h>
#include <LibGUI/GMenu.h>
#include <LibGUI/GMenuBar.h>
#include <LibGUI/GStatusBar.h>
#include <LibGUI/GTextBox.h>
#include <LibGUI/GToolBar.h>
#include <LibGUI/GWindow.h>
#include <LibHTML/CSS/StyleResolver.h>
#include <LibHTML/DOM/Element.h>
#include <LibHTML/Dump.h>
#include <LibHTML/HtmlView.h>
#include <LibHTML/Layout/LayoutBlock.h>
#include <LibHTML/Layout/LayoutInline.h>
#include <LibHTML/Layout/LayoutNode.h>
#include <LibHTML/Parser/CSSParser.h>
#include <LibHTML/Parser/HTMLParser.h>
#include <LibHTML/ResourceLoader.h>
#include <stdio.h>
static const char* home_url = "file:///home/anon/www/welcome.html";
int main(int argc, char** argv)
{
GApplication app(argc, argv);
auto window = GWindow::construct();
window->set_rect(100, 100, 640, 480);
auto widget = GWidget::construct();
widget->set_fill_with_background_color(true);
widget->set_layout(make<GBoxLayout>(Orientation::Vertical));
widget->layout()->set_spacing(0);
auto toolbar = GToolBar::construct(widget);
auto html_widget = HtmlView::construct(widget);
toolbar->add_action(GCommonActions::make_go_back_action([&](auto&) {
// FIXME: Implement back action
}));
toolbar->add_action(GCommonActions::make_go_forward_action([&](auto&) {
// FIXME: Implement forward action
}));
toolbar->add_action(GCommonActions::make_go_home_action([&](auto&) {
html_widget->load(home_url);
}));
toolbar->add_action(GCommonActions::make_reload_action([&](auto&) {
html_widget->reload();
}));
auto location_box = GTextBox::construct(toolbar);
location_box->on_return_pressed = [&] {
html_widget->load(location_box->text());
};
html_widget->on_load_start = [&](auto& url) {
location_box->set_text(url.to_string());
};
html_widget->on_link_click = [&](auto& url) {
html_widget->load(html_widget->document()->complete_url(url));
};
html_widget->on_title_change = [&](auto& title) {
window->set_title(String::format("%s - Browser", title.characters()));
};
auto focus_location_box_action = GAction::create("Focus location box", { Mod_Ctrl, Key_L }, [&](auto&) {
location_box->select_all();
location_box->set_focus(true);
});
auto statusbar = GStatusBar::construct(widget);
ResourceLoader::the().on_load_counter_change = [&] {
if (ResourceLoader::the().pending_loads() == 0) {
statusbar->set_text("");
return;
}
statusbar->set_text(String::format("Loading (%d pending resources...)", ResourceLoader::the().pending_loads()));
};
auto menubar = make<GMenuBar>();
auto app_menu = make<GMenu>("Browser");
app_menu->add_action(GCommonActions::make_quit_action([&](auto&) {
app.quit();
}));
menubar->add_menu(move(app_menu));
auto help_menu = make<GMenu>("Help");
help_menu->add_action(GAction::create("About", [&](const GAction&) {
GAboutDialog::show("Browser", GraphicsBitmap::load_from_file("/res/icons/32x32/filetype-html.png"), window);
}));
menubar->add_menu(move(help_menu));
app.set_menubar(move(menubar));
window->set_icon(GraphicsBitmap::load_from_file("/res/icons/16x16/filetype-html.png"));
window->set_title("Browser");
window->set_main_widget(widget);
window->show();
URL url_to_load = home_url;
if (app.args().size() >= 1) {
url_to_load = URL();
url_to_load.set_protocol("file");
url_to_load.set_path(app.args()[0]);
}
html_widget->load(url_to_load);
return app.exec();
}