close tab on middle button click, implement pin tab on double click

This commit is contained in:
yggverse 2024-09-16 17:00:18 +03:00
parent 2804809643
commit abe969742d
2 changed files with 107 additions and 42 deletions

View File

@ -15,40 +15,15 @@ Label::Label(
action__tab_close = ACTION__TAB_CLOSE; action__tab_close = ACTION__TAB_CLOSE;
// Init extras // Init extras
text = _("New page");
is_pinned = false; is_pinned = false;
// Setup label controller
auto const EVENT__GESTURE_CLICK = Gtk::GestureClick::create();
/* @TODO remove as default
controller->set_button(
GDK_BUTTON_PRIMARY
);*/
EVENT__GESTURE_CLICK->signal_pressed().connect(
[this](int n, double x, double y)
{
if (n == 2) // double click
{
action__tab_close->activate();
}
}
);
add_controller(
EVENT__GESTURE_CLICK
);
// Init widget // Init widget
set_ellipsize( set_ellipsize(
Pango::EllipsizeMode::END Pango::EllipsizeMode::END
); );
/* @TODO require als set_xalign(0)
set_halign(
Gtk::Align::START
); */
set_has_tooltip( set_has_tooltip(
true true
); );
@ -60,6 +35,52 @@ Label::Label(
set_width_chars( set_width_chars(
WIDTH_CHARS WIDTH_CHARS
); );
// Init primary button controller
const auto EVENT__BUTTON_PRIMARY = Gtk::GestureClick::create();
EVENT__BUTTON_PRIMARY->set_button(
GDK_BUTTON_PRIMARY
);
add_controller(
EVENT__BUTTON_PRIMARY
);
// Connect events
EVENT__BUTTON_PRIMARY->signal_pressed().connect(
[this](int n, double x, double y)
{
if (n == 2) // double click
{
pin(
!is_pinned // toggle
);
}
}
);
// Init middle button controller
const auto EVENT__BUTTON_MIDDLE = Gtk::GestureClick::create();
EVENT__BUTTON_MIDDLE->set_button(
GDK_BUTTON_MIDDLE
);
add_controller(
EVENT__BUTTON_MIDDLE
);
// Connect events
EVENT__BUTTON_MIDDLE->signal_pressed().connect(
[this](int n, double x, double y)
{
if (!is_pinned)
{
action__tab_close->activate();
}
}
);
} }
// Actions // Actions
@ -91,16 +112,16 @@ int Label::session_restore(
{ {
// Restore widget data // Restore widget data
update( update(
sqlite3_column_int(
statement,
DB::SESSION::IS_PINNED
) == 1,
reinterpret_cast<const char*>( reinterpret_cast<const char*>(
sqlite3_column_text( sqlite3_column_text(
statement, statement,
DB::SESSION::TEXT DB::SESSION::TEXT
) )
) ),
sqlite3_column_int(
statement,
DB::SESSION::IS_PINNED
) == 1
); );
// Restore children components here (on available) // Restore children components here (on available)
@ -122,31 +143,70 @@ int Label::session_save(
db, db,
APP_BROWSER_MAIN_TAB__SESSION__ID, APP_BROWSER_MAIN_TAB__SESSION__ID,
is_pinned, is_pinned,
get_text() text
); );
} }
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::update( void Label::update(
const Glib::ustring & TEXT const Glib::ustring & TEXT
) { ) {
set_text( // Keep new value in memory (used for pin actions)
TEXT text = TEXT;
);
// Update widget
set_tooltip_text( set_tooltip_text(
TEXT // same value for tooltip (ellipsize mode) TEXT // same value for tooltip (ellipsize mode)
); );
if (!is_pinned)
{
set_text(
TEXT
);
}
} }
void Label::update( void Label::update(
const int & IS_PINNED, const Glib::ustring & TEXT,
const Glib::ustring & TEXT const int & IS_PINNED
) { ) {
is_pinned = IS_PINNED;
update( update(
TEXT TEXT
); );
pin(
IS_PINNED
);
} }
// Database model // Database model

View File

@ -67,6 +67,7 @@ namespace app::browser::main::tab
// Extras // Extras
bool is_pinned; bool is_pinned;
Glib::ustring text;
// Defaults // Defaults
static const int WIDTH_CHARS = 16; static const int WIDTH_CHARS = 16;
@ -90,13 +91,17 @@ namespace app::browser::main::tab
const sqlite3_int64 & APP_BROWSER_MAIN_TAB__SESSION__ID const sqlite3_int64 & APP_BROWSER_MAIN_TAB__SESSION__ID
); // return sqlite3_finalize status code ); // return sqlite3_finalize status code
void pin(
const bool & IS_PINNED
);
void update( void update(
const Glib::ustring & TEXT const Glib::ustring & TEXT
); );
void update( void update(
const int & IS_PINNED, const Glib::ustring & TEXT,
const Glib::ustring & TEXT const int & IS_PINNED
); );
}; };
} }