kee

Offline IOU signer with QR as transport
git clone https://holbrook.no/src/kee
Info | Log | Files | Refs | README | LICENSE

commit e9dffe565c48297d45a6bcf677b5c7c77a2640f2
parent 8946223e127136fe0e1a58ac40e54ea72a7ac88d
Author: lash <dev@holbrook.no>
Date:   Tue, 19 Mar 2024 15:08:03 +0000

Add action bar

Diffstat:
M.gitignore | 1+
Msrc/gtk/kee-uicontext.h | 1-
Msrc/gtk/menu.c | 48+++++++++++++++++++++++++++---------------------
Msrc/gtk/menu.h | 3+++
Asrc/gtk/tests/Makefile | 16++++++++++++++++
Asrc/gtk/tests/nav.c | 37+++++++++++++++++++++++++++++++++++++
Msrc/gtk/ui.c | 14++++++++++++--
Asrc/state.c | 30++++++++++++++++++++++++++++++
8 files changed, 126 insertions(+), 24 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -2,3 +2,4 @@ src/gtk/*.ui **/*.o testdata_mdb *\~ +**/test_* diff --git a/src/gtk/kee-uicontext.h b/src/gtk/kee-uicontext.h @@ -9,7 +9,6 @@ #define KEE_W_FRONTLIST "frontlist" #define KEE_W_CAMERA_VIEWFINDER "camera_view" #define KEE_W_WINDOW "win" -#define KEE_W_HEADER "header" #define KEE_W_PASSPHRASE "passphrase" #define KEE_ST_UI_HEAD_ADD 0x1 diff --git a/src/gtk/menu.c b/src/gtk/menu.c @@ -71,53 +71,59 @@ static GtkWidget* menu_button_setup(GObject *head, GtkApplication *gapp, KeeUico return butt; } - -void header_setup(GtkApplication *gapp, KeeUicontext *uctx) { - GtkWidget *head; +static void footer_setup(GtkApplication *gapp, KeeUicontext *uctx) { + GtkWidget *foot; GtkWidget *butt; GtkToggleButton *butt_prev; - head = gtk_header_bar_new(); - - butt = menu_button_setup(G_OBJECT(head), gapp, uctx); - gtk_header_bar_pack_end(GTK_HEADER_BAR(head), butt); - butt = gtk_button_new_from_icon_name("go-previous"); - gtk_header_bar_pack_start(GTK_HEADER_BAR(head), butt); - gtk_widget_set_visible(butt, false); - - butt = gtk_button_new_from_icon_name("insert-object"); - gtk_header_bar_pack_start(GTK_HEADER_BAR(head), butt); - gtk_widget_set_sensitive(butt, false); - g_object_set_data(G_OBJECT(head), KEE_W_UI_MENU_QUICK_ADD, butt); + foot = gtk_action_bar_new(); butt = gtk_toggle_button_new(); gtk_button_set_icon_name(GTK_BUTTON(butt), "insert-image"); - gtk_header_bar_pack_start(GTK_HEADER_BAR(head), butt); + gtk_action_bar_pack_start(GTK_ACTION_BAR(foot), butt); gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(butt), true); - gtk_widget_set_visible(butt, false); butt_prev = GTK_TOGGLE_BUTTON(butt); butt = gtk_toggle_button_new(); gtk_toggle_button_set_group(GTK_TOGGLE_BUTTON(butt), butt_prev); gtk_button_set_icon_name(GTK_BUTTON(butt), "document-new"); - gtk_header_bar_pack_start(GTK_HEADER_BAR(head), butt); - gtk_widget_set_visible(butt, false); + gtk_action_bar_pack_start(GTK_ACTION_BAR(foot), butt); butt_prev = GTK_TOGGLE_BUTTON(butt); butt = gtk_toggle_button_new(); gtk_toggle_button_set_group(GTK_TOGGLE_BUTTON(butt), butt_prev); gtk_button_set_icon_name(GTK_BUTTON(butt), "document-save"); + gtk_action_bar_pack_start(GTK_ACTION_BAR(foot), butt); + + g_object_set_data(G_OBJECT(uctx), KEE_W_FOOTER, GTK_ACTION_BAR(foot)); + + g_signal_connect (uctx, "state", G_CALLBACK(menu_handle_state), foot); +} + +static void header_setup(GtkApplication *gapp, KeeUicontext *uctx) { + GtkWidget *head; + GtkWidget *butt; + head = gtk_header_bar_new(); + + butt = menu_button_setup(G_OBJECT(head), gapp, uctx); + gtk_header_bar_pack_end(GTK_HEADER_BAR(head), butt); + + butt = gtk_button_new_from_icon_name("go-previous"); gtk_header_bar_pack_start(GTK_HEADER_BAR(head), butt); gtk_widget_set_visible(butt, false); + butt = gtk_button_new_from_icon_name("insert-object"); + gtk_header_bar_pack_start(GTK_HEADER_BAR(head), butt); + gtk_widget_set_sensitive(butt, false); + g_object_set_data(G_OBJECT(head), KEE_W_UI_MENU_QUICK_ADD, butt); + g_object_set_data(G_OBJECT(uctx), KEE_W_HEADER, GTK_HEADER_BAR(head)); g_signal_connect (uctx, "state", G_CALLBACK(menu_handle_state), head); - - } void menu_setup(GtkApplication *gapp, KeeUicontext *uctx) { header_setup(gapp, uctx); + footer_setup(gapp, uctx); } diff --git a/src/gtk/menu.h b/src/gtk/menu.h @@ -3,6 +3,9 @@ #include "kee-uicontext.h" +#define KEE_W_HEADER "header" +#define KEE_W_FOOTER "footer" + #define KEE_W_UI_MENU_QUICK_ADD "quick_add" #define KEE_W_UI_MENU_ACT_IMPORT "act_import" diff --git a/src/gtk/tests/Makefile b/src/gtk/tests/Makefile @@ -0,0 +1,16 @@ +OBJS := $(patsubst %.c,%.o,$(wildcard *.c)) +LINKOBJS := $(wildcard ../../*.o) $(wildcard ../*.o) ../../aux/varint/varint.o +INCLUDES := -I../.. -I.. +CFLAGS += `pkg-config --cflags gtk4 gstreamer-1.0` $(INCLUDES) -g3 -Wall +LIBS := `pkg-config --libs gtk4 zlib lmdb libgcrypt libxdg-basedir gstreamer-1.0` -lb64 +LDFLAGS += $(LIBS) + +all: $(OBJS) + +%.o: %.c + $(CC) $(CFLAGS) $< -o test_$* $(LINKOBJS) $(LDFLAGS) + +test_run: $(wildcard test_*) + ./$< + +test: all test_run diff --git a/src/gtk/tests/nav.c b/src/gtk/tests/nav.c @@ -0,0 +1,37 @@ +#include <gtk/gtk.h> + +#include "nav.h" + +int main(int argc, char **argv) { + struct KeeNav nav; + GtkWidget *a; + GtkWidget *b; + GtkWidget *r; + + gtk_init(); + a = gtk_label_new("foo"); + b = gtk_label_new("bar"); + + kee_nav_push(&nav, a); + kee_nav_push(&nav, b); + r = kee_nav_pop(&nav); + if (r != b) { + return 1; + } + kee_nav_push(&nav, b); + r = kee_nav_pop(&nav); + if (r != b) { + return 1; + } + r = kee_nav_pop(&nav); + if (r != a) { + return 1; + } + + r = kee_nav_pop(&nav); + if (r) { + return 1; + } + + return 0; +} diff --git a/src/gtk/ui.c b/src/gtk/ui.c @@ -9,6 +9,7 @@ #include "context.h" #include "state.h" #include "view.h" +#include "menu.h" static void new_item(GtkListItemFactory *factory, GtkListItem *item, gpointer user_data) { @@ -168,13 +169,14 @@ static GtkWidget* ui_build_view(KeeUicontext *uctx) { void ui_build(GtkApplication *app, KeeUicontext *uctx) { GtkWidget *widget; GtkWidget *win; + GtkWidget *box; GtkWidget *stack; win = gtk_application_window_new (app); gtk_window_set_title (GTK_WINDOW (win), "kee"); gtk_window_set_default_size (GTK_WINDOW (win), 800, 600); - + stack = gtk_stack_new(); kee_view_init(GTK_STACK(stack)); @@ -190,12 +192,20 @@ void ui_build(GtkApplication *app, KeeUicontext *uctx) { kee_view_next("view"); kee_view_next("unlock"); - gtk_window_set_child(GTK_WINDOW(win), GTK_WIDGET(stack)); widget = g_object_get_data(G_OBJECT(uctx), KEE_W_HEADER); gtk_window_set_titlebar(GTK_WINDOW(win), widget); g_object_set_data(G_OBJECT(uctx), KEE_W_WINDOW, GTK_WINDOW(win)); + box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); + gtk_widget_set_vexpand(box, true); + gtk_box_append(GTK_BOX(box), stack); + + widget = g_object_get_data(G_OBJECT(uctx), KEE_W_FOOTER); + gtk_box_append(GTK_BOX(box), widget); + + gtk_window_set_child(GTK_WINDOW(win), box); + gtk_window_present(GTK_WINDOW (win)); } diff --git a/src/state.c b/src/state.c @@ -0,0 +1,30 @@ +#include <string.h> + +#include "state.h" + + +void kee_state_zero(kee_state_t *state) { + memset(state, 0, sizeof(kee_state_t)); +} + +char kee_state_add(kee_state_t *target, kee_state_t *delta) { + char hint; + + hint = 0; + if (delta->ui_menu) { + target->ui_menu |= delta->ui_menu; + hint |= KEE_ST_HINT_UI_MENU; + } + if (delta->key) { + target->key |= delta->key; + hint |= KEE_ST_HINT_KEY; + } + return hint; +} + +char kee_state_sub(kee_state_t *target, kee_state_t *delta) { + char hint; + + hint = 0; + return hint; +}