From 4eb824594ec1e7b1fda15241e4149bf249a0c05b Mon Sep 17 00:00:00 2001 From: yggverse Date: Tue, 17 Sep 2024 07:31:49 +0300 Subject: [PATCH] use separated widgets for tab label feature --- Makefile | 4 +- po/POTFILES.in | 4 +- src/app/browser/main/tab/label.cpp | 138 +++++++++++++---------------- src/app/browser/main/tab/label.hpp | 35 ++++---- 4 files changed, 85 insertions(+), 96 deletions(-) diff --git a/Makefile b/Makefile index 4a584929..290ec427 100644 --- a/Makefile +++ b/Makefile @@ -31,7 +31,9 @@ SRCS = src/app.cpp\ src/app/browser/main/tab/page/navigation/history/forward.cpp\ src/app/browser/main/tab/page/navigation/reload.cpp\ src/app/browser/main/tab/page/navigation/request.cpp\ - src/app/browser/main/tab/label.cpp + src/app/browser/main/tab/label.cpp\ + src/app/browser/main/tab/label/pin.cpp\ + src/app/browser/main/tab/label/title.cpp OBJS = $(SRCS:.cpp=.o) diff --git a/po/POTFILES.in b/po/POTFILES.in index 9c82f1b5..c26d237a 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -26,4 +26,6 @@ src/app/browser/main/tab/page/navigation/history/back.cpp src/app/browser/main/tab/page/navigation/history/forward.cpp src/app/browser/main/tab/page/navigation/reload.cpp src/app/browser/main/tab/page/navigation/request.cpp -src/app/browser/main/tab/label.cpp \ No newline at end of file +src/app/browser/main/tab/label.cpp +src/app/browser/main/tab/label/pin.cpp +src/app/browser/main/tab/label/title.cpp \ No newline at end of file diff --git a/src/app/browser/main/tab/label.cpp b/src/app/browser/main/tab/label.cpp index 680b9077..81f7b94b 100644 --- a/src/app/browser/main/tab/label.cpp +++ b/src/app/browser/main/tab/label.cpp @@ -1,4 +1,6 @@ #include "label.hpp" +#include "label/pin.hpp" +#include "label/title.hpp" using namespace app::browser::main::tab; @@ -15,26 +17,35 @@ Label::Label( action__tab_close = ACTION__TAB_CLOSE; // Init extras - text = _("New page"); - is_pinned = false; // Init widget - set_ellipsize( - Pango::EllipsizeMode::END + set_orientation( + Gtk::Orientation::HORIZONTAL ); - set_has_tooltip( - true + set_halign( + Gtk::Align::CENTER ); - set_single_line_mode( - true - ); + // Init components + labelPin = Gtk::make_managed(); - set_width_chars( - WIDTH_CHARS - ); + labelPin->hide(); + + append( + * labelPin + ); + + labelTitle = Gtk::make_managed(); + + set_tooltip_text( + labelTitle->get_text() + ); + + append( + * labelTitle + ); // Init primary button controller const auto EVENT__BUTTON_PRIMARY = Gtk::GestureClick::create(); @@ -53,7 +64,7 @@ Label::Label( { if (n == 2) // double click { - pin( + update( !is_pinned // toggle ); } @@ -112,12 +123,6 @@ int Label::session_restore( { // Restore widget data update( - reinterpret_cast( - sqlite3_column_text( - statement, - Database::Session::TEXT - ) - ), sqlite3_column_int( statement, Database::Session::IS_PINNED @@ -125,6 +130,7 @@ int Label::session_restore( ); // Restore children components here (on available) + // @TODO } } @@ -142,76 +148,57 @@ int Label::session_save( return Database::Session::add( database, APP_BROWSER_MAIN_TAB__SESSION__ID, - is_pinned, - text + is_pinned ); } -void Label::pin( - const bool & IS_PINNED -) { - // Toggle status - is_pinned = IS_PINNED; - - // Update widget - if (is_pinned) - { - set_width_chars( - 1 - ); - - set_text( - "•" // @TODO GTK icon - ); - } - - else - { - set_width_chars( - WIDTH_CHARS - ); - - set_text( - text - ); - } -} - void Label::pin() { - pin( + update( !is_pinned ); } void Label::update( - const Glib::ustring & TEXT + const bool & IS_PINNED ) { - // Keep new value in memory (used for pin actions) - text = TEXT; + // Toggle status + is_pinned = IS_PINNED; - // Update widget - set_tooltip_text( - TEXT // same value for tooltip (ellipsize mode) - ); - - if (!is_pinned) + if (is_pinned) { - set_text( - TEXT - ); + labelPin->show(); + labelTitle->hide(); + } + + else + { + labelPin->hide(); + labelTitle->show(); } } void Label::update( - const Glib::ustring & TEXT, + const Glib::ustring & TITLE +) { + set_tooltip_text( + TITLE + ); + + labelTitle->set_text( + TITLE + ); +} + +void Label::update( + const Glib::ustring & TITLE, const int & IS_PINNED ) { update( - TEXT + TITLE ); - pin( + update( IS_PINNED ); } @@ -229,8 +216,7 @@ int Label::Database::Session::init( ( `id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `app_browser_main_tab__session__id` INTEGER NOT NULL, `time` INTEGER NOT NULL DEFAULT CURRENT_TIMESTAMP, - `is_pinned` INTEGER NOT NULL, - `text` VARCHAR (1024) NOT NULL + `is_pinned` INTEGER NOT NULL ) )SQL", nullptr, @@ -298,8 +284,7 @@ int Label::Database::Session::clean( sqlite3_int64 Label::Database::Session::add( sqlite3 * database, const sqlite3_int64 & APP_BROWSER_MAIN_TAB__SESSION__ID, - const bool & IS_PINNED, - const Glib::ustring & TEXT + const bool & IS_PINNED ) { char * error; // @TODO @@ -309,17 +294,14 @@ sqlite3_int64 Label::Database::Session::add( R"SQL( INSERT INTO `app_browser_main_tab_label__session` ( `app_browser_main_tab__session__id`, - `is_pinned`, - `text` + `is_pinned` ) VALUES ( - '%d', - '%d', - '%s' + %d, + %d ) )SQL", APP_BROWSER_MAIN_TAB__SESSION__ID, - IS_PINNED, - TEXT + IS_PINNED ).c_str(), nullptr, nullptr, diff --git a/src/app/browser/main/tab/label.hpp b/src/app/browser/main/tab/label.hpp index 8494f51f..a859c9d0 100644 --- a/src/app/browser/main/tab/label.hpp +++ b/src/app/browser/main/tab/label.hpp @@ -5,15 +5,20 @@ #include #include #include +#include #include #include -#include -#include #include namespace app::browser::main::tab { - class Label : public Gtk::Label + namespace label + { + class Pin; + class Title; + } + + class Label : public Gtk::Box { public: @@ -32,8 +37,7 @@ namespace app::browser::main::tab ID, APP_BROWSER_MAIN_TAB__SESSION__ID, TIME, - IS_PINNED, - TEXT + IS_PINNED }; // table fields index static int init( @@ -48,8 +52,7 @@ namespace app::browser::main::tab static sqlite3_int64 add( sqlite3 * database, const sqlite3_int64 & APP_BROWSER_MAIN_TAB__SESSION__ID, - const bool & IS_PINNED, - const Glib::ustring & TEXT + const bool & IS_PINNED ); // return sqlite3_last_insert_rowid }; }; @@ -67,10 +70,10 @@ namespace app::browser::main::tab // Extras bool is_pinned; - Glib::ustring text; - // Defaults - static const int WIDTH_CHARS = 16; + // Components + label::Pin * labelPin; + label::Title * labelTitle; /* * Class API @@ -91,18 +94,18 @@ namespace app::browser::main::tab const sqlite3_int64 & APP_BROWSER_MAIN_TAB__SESSION__ID ); // return sqlite3_finalize status code - void pin( - const bool & IS_PINNED - ); - void pin(); void update( - const Glib::ustring & TEXT + const bool & IS_PINNED ); void update( - const Glib::ustring & TEXT, + const Glib::ustring & TITLE + ); + + void update( + const Glib::ustring & TITLE, const int & IS_PINNED ); };