mirror of
https://github.com/RGBCube/serenity
synced 2025-05-19 00:55:08 +00:00

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.
123 lines
3.7 KiB
C++
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();
|
|
}
|