Browse Source

implement label title object storage

CPP-GTK4
yggverse 2 months ago
parent
commit
d66692a42a
  1. 46
      src/app/browser/main/tab/label.cpp
  2. 4
      src/app/browser/main/tab/label.hpp
  3. 196
      src/app/browser/main/tab/label/title.cpp
  4. 61
      src/app/browser/main/tab/label/title.hpp

46
src/app/browser/main/tab/label.cpp

@ -37,7 +37,9 @@ Label::Label(
* labelPin * labelPin
); );
labelTitle = Gtk::make_managed<label::Title>(); labelTitle = Gtk::make_managed<label::Title>(
database
);
set_tooltip_text( set_tooltip_text(
labelTitle->get_text() labelTitle->get_text()
@ -129,8 +131,13 @@ int Label::session_restore(
) == 1 ) == 1
); );
// Restore children components here (on available) // Restore children components
// @TODO labelTitle->session_restore(
sqlite3_column_int64(
statement,
Database::Session::ID
)
);
} }
} }
@ -139,17 +146,23 @@ int Label::session_restore(
); );
} }
int Label::session_save( sqlite3_int64 Label::session_save(
const sqlite3_int64 & APP_BROWSER_MAIN_TAB__SESSION__ID const sqlite3_int64 & APP_BROWSER_MAIN_TAB__SESSION__ID
) { ) {
// Delegate save action to child components (on available) // Create new session
const sqlite3_int64 APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID = Database::Session::add(
// Save label session
return Database::Session::add(
database, database,
APP_BROWSER_MAIN_TAB__SESSION__ID, APP_BROWSER_MAIN_TAB__SESSION__ID,
is_pinned is_pinned
); );
// Delegate save action to child components
labelTitle->session_save(
APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID
);
// Return ID
return APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID;
} }
void Label::pin() void Label::pin()
@ -185,7 +198,7 @@ void Label::update(
TITLE TITLE
); );
labelTitle->set_text( labelTitle->update(
TITLE TITLE
); );
} }
@ -251,6 +264,11 @@ int Label::Database::Session::clean(
{ {
while (sqlite3_step(statement) == SQLITE_ROW) while (sqlite3_step(statement) == SQLITE_ROW)
{ {
const sqlite3_int64 APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID = sqlite3_column_int64(
statement,
Database::Session::ID
);
// Delete record // Delete record
const int EXEC_STATUS = sqlite3_exec( const int EXEC_STATUS = sqlite3_exec(
database, database,
@ -258,10 +276,7 @@ int Label::Database::Session::clean(
R"SQL( R"SQL(
DELETE FROM `app_browser_main_tab_label__session` WHERE `id` = %d DELETE FROM `app_browser_main_tab_label__session` WHERE `id` = %d
)SQL", )SQL",
sqlite3_column_int64( APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID
statement,
Database::Session::ID
)
).c_str(), ).c_str(),
nullptr, nullptr,
nullptr, nullptr,
@ -271,7 +286,10 @@ int Label::Database::Session::clean(
// Delegate children dependencies cleanup // Delegate children dependencies cleanup
if (EXEC_STATUS == SQLITE_OK) if (EXEC_STATUS == SQLITE_OK)
{ {
// nothing here. label::Title::Database::Session::clean(
database,
APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID
);
} }
} }
} }

4
src/app/browser/main/tab/label.hpp

@ -90,9 +90,9 @@ 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
int session_save( sqlite3_int64 session_save(
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_last_insert_rowid
void pin(); void pin();

196
src/app/browser/main/tab/label/title.cpp

@ -2,10 +2,20 @@
using namespace app::browser::main::tab::label; using namespace app::browser::main::tab::label;
Title::Title() Title::Title(
{ sqlite3 * database
) {
// Init database
Database::Session::init(
this->database = database
);
// Init extras
text = _("New page");
// Init widget
set_text( set_text(
_("New page") text
); );
set_ellipsize( set_ellipsize(
@ -19,4 +29,184 @@ Title::Title()
set_single_line_mode( set_single_line_mode(
true true
); );
}
// Actions
int Title::session_restore(
const sqlite3_int64 & APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID
) {
sqlite3_stmt * statement;
const int PREPARE_STATUS = sqlite3_prepare_v3(
database,
Glib::ustring::sprintf(
R"SQL(
SELECT * FROM `app_browser_main_tab_label_title__session`
WHERE `app_browser_main_tab_label__session__id` = %d
ORDER BY `id` DESC LIMIT 1
)SQL",
APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID
).c_str(),
-1,
SQLITE_PREPARE_NORMALIZE,
&statement,
nullptr
);
if (PREPARE_STATUS == SQLITE_OK)
{
// Restore label text from latest database record
while (sqlite3_step(statement) == SQLITE_ROW)
{
// Restore widget data
update(
reinterpret_cast<const char*>(
sqlite3_column_text(
statement,
Database::Session::TEXT
)
)
);
// Restore children components here (on available)
}
}
return sqlite3_finalize(
statement
);
}
sqlite3_int64 Title::session_save(
const sqlite3_int64 & APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID
) {
// Create new session record
const sqlite3_int64 APP_BROWSER_MAIN_TAB_LABEL_TITLE__SESSION__ID = Database::Session::add(
database,
APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID,
text
);
// Delegate save action to child components (on available)
// Return ID
return APP_BROWSER_MAIN_TAB_LABEL_TITLE__SESSION__ID;
}
void Title::update(
const Glib::ustring & TEXT
) {
set_text(
text = TEXT
);
}
// Database model
int Title::Database::Session::init(
sqlite3 * database
) {
char * error;
return sqlite3_exec(
database,
R"SQL(
CREATE TABLE IF NOT EXISTS `app_browser_main_tab_label_title__session`
(
`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `app_browser_main_tab_label__session__id` INTEGER NOT NULL,
`time` INTEGER NOT NULL DEFAULT CURRENT_TIMESTAMP,
`text` VARCHAR(1024) NOT NULL
)
)SQL",
nullptr,
nullptr,
&error
);
}
int Title::Database::Session::clean(
sqlite3 * database,
const sqlite3_int64 & APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID
) {
char * error; // @TODO
sqlite3_stmt * statement;
const int PREPARE_STATUS = sqlite3_prepare_v3(
database,
Glib::ustring::sprintf(
R"SQL(
SELECT * FROM `app_browser_main_tab_label_title__session`
WHERE `app_browser_main_tab_label__session__id` = %d
)SQL",
APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID
).c_str(),
-1,
SQLITE_PREPARE_NORMALIZE,
&statement,
nullptr
);
if (PREPARE_STATUS == SQLITE_OK)
{
while (sqlite3_step(statement) == SQLITE_ROW)
{
// Delete record
const int EXEC_STATUS = sqlite3_exec(
database,
Glib::ustring::sprintf(
R"SQL(
DELETE FROM `app_browser_main_tab_label_title__session` WHERE `id` = %d
)SQL",
sqlite3_column_int64(
statement,
Database::Session::ID
)
).c_str(),
nullptr,
nullptr,
&error
);
// Delegate children dependencies cleanup
if (EXEC_STATUS == SQLITE_OK)
{
// nothing here.
}
}
}
return sqlite3_finalize(
statement
);
}
sqlite3_int64 Title::Database::Session::add(
sqlite3 * database,
const sqlite3_int64 & APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID,
Glib::ustring & TEXT
) {
char * error; // @TODO
sqlite3_exec(
database,
Glib::ustring::sprintf(
R"SQL(
INSERT INTO `app_browser_main_tab_label_title__session` (
`app_browser_main_tab_label__session__id`,
`text`
) VALUES (
'%d',
'%s'
)
)SQL",
APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID,
TEXT
).c_str(),
nullptr,
nullptr,
&error
);
return sqlite3_last_insert_rowid(
database
);
} }

61
src/app/browser/main/tab/label/title.hpp

@ -5,16 +5,60 @@
#include <glibmm/ustring.h> #include <glibmm/ustring.h>
#include <gtkmm/label.h> #include <gtkmm/label.h>
#include <pangomm/layout.h> #include <pangomm/layout.h>
#include <sqlite3.h>
namespace app::browser::main::tab::label namespace app::browser::main::tab::label
{ {
class Title : public Gtk::Label class Title : public Gtk::Label
{ {
public:
/*
* Class database
*
* Allowed parental access to enums and relationship methods
*/
struct Database
{
// app_browser_main_tab_label_title__*
struct Session
{
enum
{
ID,
APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID,
TIME,
TEXT
}; // table fields index
static int init(
sqlite3 * database
); // return sqlite3_exec status code
static int clean(
sqlite3 * database,
const sqlite3_int64 & APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID
); // return sqlite3_finalize status code
static sqlite3_int64 add(
sqlite3 * database,
const sqlite3_int64 & APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID,
Glib::ustring & TEXT
); // return sqlite3_last_insert_rowid
};
};
/* /*
* Internal members * Internal members
*/ */
private: private:
// Database
sqlite3 * database;
// Extras
Glib::ustring text;
// Defaults // Defaults
static const int WIDTH_CHARS = 16; static const int WIDTH_CHARS = 16;
@ -23,7 +67,22 @@ namespace app::browser::main::tab::label
*/ */
public: public:
Title(); Title(
sqlite3 * database
);
// Actions
int session_restore(
const sqlite3_int64 & APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID
); // return sqlite3_finalize status code
sqlite3_int64 session_save(
const sqlite3_int64 & APP_BROWSER_MAIN_TAB_LABEL__SESSION__ID
); // return sqlite3_last_insert_rowid
void update(
const Glib::ustring & TEXT
);
}; };
} }

Loading…
Cancel
Save