From 88ab363b4a7b66df87a6f9caf7fa999b3cbb76c6 Mon Sep 17 00:00:00 2001 From: yggverse Date: Sat, 13 Apr 2024 05:54:12 +0300 Subject: [PATCH] implement window/tab title update --- config.json | 18 +++++++++- src/Entity/App.php | 75 +++++++++++++++++++++++++++-------------- src/Entity/Tab/Page.php | 71 ++++++++++++++++++++++++++++---------- 3 files changed, 121 insertions(+), 43 deletions(-) diff --git a/config.json b/config.json index 706079e..e913902 100644 --- a/config.json +++ b/config.json @@ -1,11 +1,19 @@ { "app": { - "title":"Yoda", "theme":"Default", "header": { "enabled":true, + "title": + { + "default":"Yoda", + "postfix":" - Yoda", + "length": + { + "max":32 + } + }, "button": { "close":true @@ -17,6 +25,14 @@ { "page": { + "title": + { + "default":"New page", + "length": + { + "max":32 + } + }, "redirect": { "follow": diff --git a/src/Entity/App.php b/src/Entity/App.php index 84e2413..b8b4125 100644 --- a/src/Entity/App.php +++ b/src/Entity/App.php @@ -7,7 +7,8 @@ namespace Yggverse\Yoda\Entity; class App { public \GtkWindow $window; - public \GtkNotebook $tab; + public \GtkHeaderBar $header; + public \GtkNotebook $tabs; public object $config; @@ -24,18 +25,18 @@ class App if ($this->config->header->enabled) { - $header = new \GtkHeaderBar(); + $this->header = new \GtkHeaderBar(); - $header->set_title( - $this->config->title + $this->header->set_title( + $this->config->header->title->default ); - $header->set_show_close_button( + $this->header->set_show_close_button( $this->config->header->button->close ); $this->window->set_titlebar( - $header + $this->header ); } @@ -47,43 +48,67 @@ class App } ); - $page = new \Yggverse\Yoda\Entity\Tab\Page( - $this - ); + $this->tabs = new \GtkNotebook(); - $page->open( - $this->config->tab->page->header->button->home->url + $this->tabs->set_scrollable( + true ); - $this->tab = new \GtkNotebook(); + $this->window->add( + $this->tabs + ); - $this->tab->set_scrollable( - true + $this->openPage( + $this->config->tab->page->header->button->home->url // @TODO ); - $this->tab->append_page( - $page->box, - new \GtkLabel( - 'New page' // @TODO - ) + $this->window->show_all(); + } + + public function openPage( + string $url + ): void + { + $page = new \Yggverse\Yoda\Entity\Tab\Page( + $this ); - $this->tab->set_menu_label( + $this->tabs->append_page( $page->box, new \GtkLabel( - '2' // @TODO + $this->config->tab->page->title->default ) ); - $this->tab->set_tab_reorderable( + $this->tabs->set_tab_reorderable( $page->box, true ); - $this->window->add( - $this->tab + $page->open( + $url ); + } - $this->window->show_all(); + public function setTitle( + ?string $value = null + ): void + { + if ($value) + { + $title = urldecode( + strlen($value) > $this->config->header->title->length->max ? substr($value, 0, $this->config->header->title->length->max) . '...' + : $value + ); + } + + else + { + $title = $this->config->header->title->default; + } + + $this->header->set_title( + $title + ); } } \ No newline at end of file diff --git a/src/Entity/Tab/Page.php b/src/Entity/Tab/Page.php index 04d41a2..649a1cb 100644 --- a/src/Entity/Tab/Page.php +++ b/src/Entity/Tab/Page.php @@ -350,7 +350,7 @@ class Page { case str_starts_with($url, 'gemini://'): - $this->_gemini( + $this->_openGemini( $url, $code ); @@ -359,18 +359,23 @@ class Page default: - $this->_yoda( + $this->_openYoda( $url ); } } - private function _gemini( + private function _openGemini( string $url, int $code = 0, int $redirects = 0 ): void { + // Init base URL + $origin = new \Yggverse\Net\Address( + $url + ); + // Track response time $start = microtime(true); @@ -430,7 +435,7 @@ class Page { if ($redirects > $this->config->redirect->follow->max) { - $this->_yoda( + $this->_openYoda( 'yoda://redirect' ); @@ -457,7 +462,7 @@ class Page else { - $this->_yoda( + $this->_openYoda( 'yoda://redirect' ); @@ -468,7 +473,7 @@ class Page // Process error codes if (20 != $response->getCode()) // not found { - $this->_yoda( + $this->_openYoda( 'yoda://nothing' ); @@ -487,17 +492,24 @@ class Page if ($h1 = $body->getH1()) { - $this->app->window->set_title( - sprintf( - '%s - %s', - empty($h1[0]) ? $address->getHost() : $h1[0], - $this->app->config->title - ) - ); + $title = $h1[0] . + $this->app->config->header->title->postfix; + } - // @TODO update tab title + else + { + $title = $origin->getHost() . + $this->app->config->header->title->postfix; } + $this->app->setTitle( + $title + ); + + $this->setTitle( + $title + ); + $this->status->set_markup( str_replace( // Custom macros mask from config.json [ @@ -533,7 +545,7 @@ class Page ); } - private function _yoda( + private function _openYoda( string $url ): void { @@ -556,11 +568,36 @@ class Page if ($h1 = $body->getH1()) { - $this->app->window->set_title( + $this->app->setTitle( + $h1[0] + ); + + $this->setTitle( $h1[0] ); + } + } + + public function setTitle( + ?string $value = null + ): void + { + if ($value) + { + $title = urldecode( + strlen($value) > $this->config->title->length->max ? substr($value, 0, $this->config->title->length->max) . '...' + : $value + ); + } - // @TODO update tab title + else + { + $title = $this->config->title->default; } + + $this->app->tabs->set_tab_label_text( + $this->box, + $title + ); } } \ No newline at end of file