From d05ecbfb48dfc69dc5bd9353d9b7e303efc0b969 Mon Sep 17 00:00:00 2001 From: IG Date: Mon, 7 Oct 2024 14:23:01 +0100 Subject: [PATCH] "actions" menu - copy to clipboard and email --- bt/app/strings.h | 2 + bt/app/ui/picker_app.cpp | 105 +++++++++++++++++++++++++++++++++++++-- bt/app/ui/picker_app.h | 20 ++++++++ bt/res.inl | 103 ++++++++++++++++++++++++++++++++++++++ docs/README.md | 9 ++-- docs/release-notes.md | 7 +-- 6 files changed, 235 insertions(+), 11 deletions(-) diff --git a/bt/app/strings.h b/bt/app/strings.h index 4eb9169..4153d03 100644 --- a/bt/app/strings.h +++ b/bt/app/strings.h @@ -17,4 +17,6 @@ namespace bt::strings { const std::string LuaScript{"Lua script"}; const std::string LuaScriptTooltip{"function name to execute"}; const std::string RuleIsARegex{"Rule is a Regular Expression (advanced)"}; + + const std::string PickerUrlTooltip{"Editable before opening"}; } \ No newline at end of file diff --git a/bt/app/ui/picker_app.cpp b/bt/app/ui/picker_app.cpp index b5f4a68..e902dc7 100644 --- a/bt/app/ui/picker_app.cpp +++ b/bt/app/ui/picker_app.cpp @@ -4,6 +4,11 @@ #include "../../res.inl" #include "fmt/core.h" #include "../common/win32/user.h" +#include "../strings.h" +#define _USE_MATH_DEFINES +#include +#include "../../common/win32/clipboard.h" +#include "../../common/win32/shell.h" using namespace std; namespace w = grey::widgets; @@ -13,7 +18,7 @@ namespace bt::ui { : url{url}, title{APP_LONG_NAME " - Pick"}, app{grey::app::make(title, WindowMinWidth, WindowHeight)}, wnd_main{ title, &is_open } { app->initial_theme_id = g_config.theme_id; - app->load_icon_font = false; + //app->load_icon_font = false; app->win32_can_resize = false; app->win32_center_on_screen = true; app->win32_close_on_focus_lost = g_config.picker_close_on_focus_loss; @@ -56,6 +61,7 @@ namespace bt::ui { app->on_initialised = [this]() { app->preload_texture("incognito", incognito_icon_png, incognito_icon_png_len); + app->preload_texture("more", picker_more_icon_png, picker_more_icon_png_len); // for each browser, get instances int max_instances{0}; @@ -136,10 +142,9 @@ namespace bt::ui { // URL editor ImGui::PushItemWidth(-1); w::sl(); - if(w::input(url, "##url")) { - } + w::input(url, "##url"); ImGui::PopItemWidth(); - w::tooltip("You can change this URL before making a decision to change which URL will be invoked"); + w::tooltip(bt::strings::PickerUrlTooltip); render_browser_bar(); render_profile_bar(); @@ -163,6 +168,84 @@ namespace bt::ui { return is_open; } + // Function to get the coordinates of a point on a circle + void get_point_on_circle(float x_center, float y_center, float radius, float angle, float& x, float& y) { + x = x_center + radius * std::cos(angle); + y = y_center + radius * std::sin(angle); + } + + void picker_app::render_action_menu(float x, float y) { + + if(!has_profile_bar) y += ProfileSquareSize * app->scale / 2; + float sq_size = BrowserSquareSize * app->scale; + ImVec2 wp = ImGui::GetWindowViewport()->WorkPos; + float tlh = ImGui::GetTextLineHeight(); + float cx = x + sq_size / 2; + float cy = y + sq_size / 2; + ImDrawList* dl = ImGui::GetWindowDrawList(); + + // occupy entire space + w::set_pos(x, y); + ImGui::Dummy(ImVec2(sq_size, sq_size)); + action_menu_hovered = w::is_hovered(); + + // find center in absolute coordinates + //auto img_rect_min = ImGui::GetItemRectMin(); + //auto img_rect_max = ImGui::GetItemRectMax(); + //float center_x = (img_rect_max.x + img_rect_min.x) / 2; + //float center_y = (img_rect_max.y + img_rect_min.y) / 2; + + if(action_menu_hovered) { + ImU32 col_bg = w::imcol32(ImGuiCol_MenuBarBg); + //dl->AddCircleFilled(ImVec2(cx + wp.x, cy + wp.y), sq_size / 2, col_bg); + //dl->PathArcTo(ImVec2(cx + wp.x, cy + wp.y), sq_size / 2 - 2, 0, M_PI); + } + + // draw collapsed "action" + { + float x1 = x + sq_size / 2 - tlh / 2; + float y1 = y + sq_size / 2 - tlh / 2; + w::set_pos(x1, y1); + w::label(ICON_MD_ADD_CIRCLE, 0, action_menu_hovered); + if(w::is_hovered()) + ImGui::SetMouseCursor(ImGuiMouseCursor_Hand); + } + + // draw menu items in a circle + if(action_menu_hovered) { + ImU32 col_dot = w::imcol32(ImGuiCol_Text); + + float angle = 0; // PI is half a circle + + for(action_menu_item& mi : action_menu_items) { + if(mi.angle_final == 0) mi.angle_final = angle; + + if(mi.angle < mi.angle_final || mi.x == 0 || mi.y == 0) { + mi.angle += 0.1; + get_point_on_circle(cx, cy, sq_size / 4, mi.angle, mi.x, mi.y); + } + + w::set_pos(mi.x, mi.y); + w::label(mi.icon, w::emphasis::primary, 0); + if(w::is_hovered()) + ImGui::SetMouseCursor(ImGuiMouseCursor_Hand); + w::tooltip(mi.tooltip); + if(w::is_leftclicked()) { + menu_item_clicked(mi.id); + } + + //dl->AddCircleFilled(ImVec2(x2 + wp.x, y2 + wp.y), 2, col_dot); + + angle += M_PI / action_menu_items.size(); + } + } else { + for(action_menu_item& mi : action_menu_items) { + mi.angle = 0; + mi.angle_final = 0; + } + } + } + void picker_app::render_browser_bar() { float sq_size = BrowserSquareSize * app->scale; float pad = BrowserSquarePadding * app->scale; @@ -248,6 +331,9 @@ namespace bt::ui { idx++; } + // "extra actions" area + render_action_menu(sq_size * idx + browser_bar_left_pad, y); + w::set_pos(0, y + BrowserSquareSize * app->scale); } @@ -405,4 +491,15 @@ namespace bt::ui { this->decision = decision; is_open = false; } + + void picker_app::menu_item_clicked(const std::string& id) { + if(id == "copy") { + win32::clipboard::set_ascii_text(url); + is_open = false; + } else if(id == "email") { + win32::clipboard::set_ascii_text(url); + win32::shell::exec(fmt::format("mailto:?body={}", url), ""); + is_open = false; + } + } } \ No newline at end of file diff --git a/bt/app/ui/picker_app.h b/bt/app/ui/picker_app.h index bbb2ca8..b2381f8 100644 --- a/bt/app/ui/picker_app.h +++ b/bt/app/ui/picker_app.h @@ -14,6 +14,16 @@ namespace bt::ui { ImVec2 max; }; + struct action_menu_item { + std::string id; + std::string icon; + std::string tooltip; + float x{0}; + float y{0}; + float angle{0}; + float angle_final{0}; + }; + picker_app(const std::string& url); ~picker_app(); @@ -30,6 +40,7 @@ namespace bt::ui { const float ProfileSquareSize = 40.0f; const float ProfileSquarePadding = 5.0f; const float InactiveProfileSquarePadding = 7.0f; + const float ActionSquareSize = 20.0f; const float WindowMinWidth = BrowserSquareSize * 6; const float WindowHeight = BrowserSquareSize + ProfileSquareSize + 80; float wnd_width; @@ -51,11 +62,18 @@ namespace bt::ui { std::vector profiles_cb; // active profile coordinates float browser_bar_left_pad{0}; + bool action_menu_hovered{false}; + std::vector action_menu_items{ + action_menu_item{"copy", ICON_MD_CONTENT_COPY, "Copy to clipboard & close"}, + action_menu_item{"email", ICON_MD_EMAIL, "Email link"} + }; + grey::widgets::window wnd_main; std::shared_ptr decision; bool run_frame(); + void render_action_menu(float x, float y); void render_browser_bar(); void render_profile_bar(); void render_connection_box(); @@ -65,5 +83,7 @@ namespace bt::ui { * @param decision */ void make_decision(std::shared_ptr decision); + + void menu_item_clicked(const std::string& id); }; } \ No newline at end of file diff --git a/bt/res.inl b/bt/res.inl index f9e835b..fad3ddf 100644 --- a/bt/res.inl +++ b/bt/res.inl @@ -876,3 +876,106 @@ static unsigned char gecko_icon_png[] = { 0x42, 0x60, 0x82 }; static unsigned int gecko_icon_png_len = 855; + +static unsigned char picker_more_icon_png[] = { + 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d, + 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x30, + 0x08, 0x06, 0x00, 0x00, 0x00, 0x57, 0x02, 0xf9, 0x87, 0x00, 0x00, 0x00, + 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, + 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x04, 0x4e, 0x49, 0x44, + 0x41, 0x54, 0x68, 0x81, 0xed, 0x5a, 0x49, 0x4f, 0x14, 0x41, 0x14, 0x9e, + 0x61, 0x90, 0xb8, 0x30, 0x84, 0x4d, 0x4f, 0x88, 0x02, 0x3d, 0x03, 0x01, + 0x03, 0x98, 0x98, 0xa8, 0x57, 0xa3, 0x02, 0x9e, 0x00, 0x09, 0x9b, 0xde, + 0x15, 0x50, 0x0f, 0xe8, 0x55, 0x0e, 0x06, 0x04, 0xe3, 0x59, 0xc1, 0xc4, + 0xe5, 0xe2, 0x16, 0x3c, 0x69, 0x38, 0x18, 0x89, 0x27, 0x37, 0x8c, 0x11, + 0xd0, 0x44, 0x90, 0x9f, 0x20, 0x8b, 0x09, 0x60, 0xd8, 0x0e, 0x96, 0xef, + 0x6b, 0x7a, 0x4c, 0xcf, 0xeb, 0xea, 0x9e, 0x9e, 0x99, 0xee, 0x69, 0x4c, + 0xec, 0xe4, 0x4b, 0x26, 0xdd, 0xaf, 0x5e, 0x7d, 0x5f, 0xd7, 0xab, 0xaa, + 0x57, 0xaf, 0xc7, 0x27, 0x84, 0x48, 0xfb, 0x97, 0xe1, 0xf3, 0x9a, 0xc0, + 0x96, 0x10, 0xa0, 0x28, 0x4a, 0x56, 0x20, 0x10, 0x38, 0xe5, 0xf7, 0xfb, + 0x07, 0x08, 0x23, 0x3e, 0x9f, 0xef, 0x3b, 0xe1, 0x27, 0x61, 0x43, 0x03, + 0x7e, 0xcf, 0xe0, 0x19, 0x6c, 0xc8, 0xb6, 0x0e, 0x6d, 0x3c, 0x15, 0x30, + 0x3c, 0x3c, 0x1c, 0xd0, 0x48, 0x3f, 0x23, 0x72, 0xab, 0x04, 0x11, 0x27, + 0x56, 0xa9, 0x2d, 0x9c, 0xd4, 0xc1, 0x57, 0x4a, 0x05, 0xd0, 0xd5, 0x4c, + 0x04, 0xbe, 0x26, 0x40, 0xda, 0x0c, 0x5f, 0x48, 0x48, 0x93, 0xeb, 0x02, + 0x82, 0xc1, 0x60, 0x29, 0xbd, 0xb5, 0xd7, 0x0e, 0x12, 0x8f, 0x02, 0xf9, + 0x1e, 0xa5, 0x3e, 0xc2, 0xae, 0x08, 0xa0, 0xeb, 0x2c, 0x75, 0xb2, 0x6c, + 0xd6, 0x79, 0x46, 0x5e, 0x89, 0xc8, 0x3f, 0xda, 0x29, 0xf6, 0xb5, 0x3d, + 0x16, 0xe1, 0x4b, 0x13, 0xe2, 0x40, 0xcf, 0x82, 0xa8, 0xec, 0xdb, 0x50, + 0x51, 0xd1, 0x33, 0x4f, 0xf7, 0xc6, 0xd5, 0x67, 0x79, 0x47, 0x3a, 0x44, + 0x46, 0x6e, 0xb1, 0x95, 0x90, 0x25, 0xea, 0xab, 0xdd, 0x31, 0x01, 0x88, + 0x4f, 0x4c, 0x3c, 0xe9, 0x1b, 0x4b, 0x0b, 0x88, 0x9c, 0xea, 0x76, 0xa1, + 0x74, 0xbc, 0x13, 0x55, 0x03, 0xc2, 0x3e, 0xfa, 0x7f, 0xab, 0x6d, 0xb2, + 0xab, 0xda, 0x54, 0x1f, 0x26, 0xa3, 0xd1, 0x67, 0x67, 0x6e, 0x58, 0x0a, + 0xd0, 0xc8, 0x0f, 0xc9, 0x3a, 0x08, 0x86, 0x6b, 0x44, 0xd9, 0x95, 0x99, + 0xf8, 0x88, 0x4b, 0x50, 0x76, 0xf9, 0xbb, 0x08, 0x86, 0x4e, 0x98, 0x89, + 0x18, 0x8c, 0x25, 0xc2, 0x52, 0x00, 0x39, 0xe8, 0xe7, 0x4e, 0xd3, 0xb6, + 0xed, 0x14, 0x7b, 0x4f, 0xdf, 0x4d, 0x9a, 0x38, 0x47, 0x41, 0xe3, 0x1d, + 0xf2, 0xbd, 0x43, 0x3a, 0x12, 0x09, 0x09, 0xd0, 0x62, 0x3e, 0xca, 0x59, + 0x7a, 0xe6, 0x1e, 0x11, 0xbe, 0xf8, 0xd9, 0x71, 0xf2, 0x11, 0x84, 0x2e, + 0x7c, 0x12, 0xe9, 0xbb, 0x76, 0x1b, 0x44, 0x10, 0x97, 0xb6, 0xb8, 0x04, + 0x60, 0xb5, 0xe1, 0x13, 0x16, 0xe4, 0x31, 0xdc, 0x6e, 0x91, 0xd7, 0x87, + 0x94, 0x44, 0xc4, 0x22, 0x71, 0x0a, 0xd9, 0x16, 0xc0, 0x97, 0x4a, 0x84, + 0x8d, 0x9b, 0x6f, 0x5e, 0x36, 0x12, 0xfe, 0xf4, 0xed, 0x3c, 0x94, 0x5e, + 0xd9, 0x12, 0xa0, 0x6d, 0x52, 0x51, 0x8d, 0xdd, 0x88, 0xf9, 0x98, 0x73, + 0xa2, 0x61, 0xc8, 0x10, 0x4a, 0xb4, 0xd9, 0x35, 0x5a, 0x0a, 0xc0, 0x8c, + 0xe7, 0x3b, 0x6c, 0x30, 0x74, 0x32, 0xe5, 0xe4, 0x23, 0x08, 0x86, 0x6b, + 0xb9, 0x88, 0x49, 0xbe, 0x2a, 0x45, 0x09, 0x40, 0x6e, 0xc3, 0xd7, 0x79, + 0x27, 0x96, 0xca, 0x44, 0x51, 0xda, 0x3d, 0x65, 0xd8, 0x27, 0x90, 0x3b, + 0x99, 0x0a, 0xd0, 0x12, 0xb3, 0xbf, 0xc6, 0x39, 0x07, 0xcf, 0x78, 0x46, + 0x3e, 0x82, 0xec, 0xaa, 0x56, 0x3e, 0x17, 0x9e, 0x4a, 0x05, 0x20, 0xbd, + 0xf5, 0xb1, 0xac, 0x52, 0xe9, 0x7c, 0xef, 0xb9, 0x00, 0xa5, 0xe3, 0x2d, + 0x0f, 0xa3, 0x95, 0xf2, 0xf2, 0xf2, 0x4c, 0x83, 0x00, 0x1e, 0x3e, 0xc8, + 0x6d, 0xb0, 0xe5, 0x7b, 0x2d, 0x00, 0x1c, 0x32, 0x72, 0x8b, 0x78, 0x18, + 0xd5, 0x18, 0x04, 0xd0, 0xd0, 0xdc, 0xd0, 0x1b, 0x21, 0x31, 0xf3, 0x9c, + 0xbc, 0x86, 0xbc, 0xc3, 0xe7, 0x78, 0x18, 0xf5, 0xcb, 0x04, 0x8c, 0xe8, + 0x8d, 0x90, 0x39, 0x7a, 0x4d, 0x3c, 0x82, 0xc2, 0x96, 0x87, 0x5c, 0xc0, + 0x0b, 0x83, 0x00, 0x7a, 0x30, 0xa3, 0x37, 0x42, 0x4a, 0xcc, 0x1d, 0x1d, + 0xba, 0x29, 0xc4, 0x83, 0x31, 0x21, 0xe6, 0x96, 0x85, 0x98, 0x25, 0xdc, + 0xff, 0xb0, 0x79, 0xcf, 0x6d, 0x3b, 0x6c, 0xa2, 0x6c, 0x1e, 0x4c, 0xcb, + 0x04, 0x2c, 0xe8, 0x8d, 0x90, 0xc3, 0x73, 0x47, 0xe8, 0x80, 0x5f, 0xb8, + 0xe7, 0xb6, 0x5d, 0xc5, 0xd5, 0x39, 0x2e, 0x60, 0x4e, 0x26, 0x60, 0x5d, + 0x6f, 0x54, 0xd9, 0xb7, 0x6e, 0x70, 0x84, 0x37, 0xc5, 0xaf, 0xb9, 0x5f, + 0xc6, 0x0e, 0x9d, 0xb6, 0xab, 0xec, 0x5d, 0xe3, 0x02, 0xd6, 0x12, 0x12, + 0x30, 0x2b, 0xe9, 0xf0, 0xc7, 0x92, 0xb1, 0x43, 0xa7, 0xed, 0xec, 0x0a, + 0x98, 0xd7, 0x1b, 0xe1, 0x48, 0x68, 0x67, 0xc8, 0xef, 0xd9, 0x0c, 0x8d, + 0x64, 0xec, 0xec, 0x86, 0x90, 0xad, 0x49, 0x8c, 0x4e, 0x67, 0x6d, 0x4c, + 0x4e, 0x27, 0xed, 0x24, 0x93, 0x78, 0xca, 0x20, 0x80, 0x2f, 0xa3, 0x85, + 0xad, 0x8f, 0x3c, 0x5f, 0x3e, 0x23, 0xb0, 0xb5, 0x8c, 0xf2, 0x83, 0x3b, + 0xaa, 0x07, 0x5e, 0x13, 0x8f, 0x40, 0xb2, 0x91, 0x5d, 0x37, 0x08, 0x40, + 0x96, 0x17, 0x95, 0x4a, 0xe4, 0x16, 0x6f, 0x9d, 0x54, 0x22, 0x67, 0x7f, + 0xec, 0x54, 0x42, 0x9a, 0xcc, 0xc5, 0x5b, 0x2e, 0x71, 0x01, 0xca, 0xf9, + 0x37, 0xf6, 0x92, 0x39, 0x2d, 0x8c, 0x86, 0xa3, 0xd2, 0xe9, 0xea, 0x76, + 0xcf, 0x05, 0x64, 0x57, 0xb6, 0xf0, 0xf0, 0x79, 0xa2, 0xe7, 0xcc, 0x0f, + 0x34, 0x51, 0x61, 0xa4, 0x1e, 0x68, 0x52, 0x70, 0x90, 0x37, 0x43, 0x69, + 0xf7, 0x37, 0xd9, 0x81, 0xa6, 0xd6, 0x54, 0x80, 0x76, 0xa4, 0x1c, 0xd7, + 0x37, 0x40, 0xd1, 0xc9, 0x2b, 0x01, 0x99, 0x25, 0xc7, 0x78, 0xf8, 0x4c, + 0x58, 0x1e, 0x29, 0xb5, 0x51, 0x68, 0x62, 0x8d, 0xd4, 0xa2, 0x53, 0xaa, + 0xc9, 0x17, 0xd4, 0xdf, 0x96, 0x1d, 0xea, 0x1b, 0x38, 0x5f, 0xb3, 0xb2, + 0xca, 0xa8, 0xbe, 0x21, 0x2a, 0x66, 0x28, 0x75, 0xa4, 0x8a, 0x7c, 0xa8, + 0x6b, 0x4c, 0x56, 0x56, 0x79, 0x29, 0xe3, 0x6a, 0x56, 0xd8, 0x0a, 0x53, + 0xa3, 0x25, 0xbd, 0x03, 0x14, 0x9b, 0x52, 0x53, 0xd8, 0x9a, 0xa6, 0xbe, + 0xf2, 0xf9, 0xdb, 0x5f, 0xcc, 0xca, 0xca, 0x52, 0x6c, 0x0b, 0x00, 0x50, + 0xe2, 0xe6, 0x43, 0x88, 0xea, 0x9c, 0x9b, 0x23, 0x11, 0xea, 0xfa, 0x68, + 0x56, 0x5a, 0x6c, 0x36, 0xe3, 0x19, 0xab, 0xb8, 0xdb, 0x67, 0x70, 0x46, + 0xe1, 0x84, 0xa2, 0x93, 0x1b, 0x31, 0xcf, 0xc3, 0x46, 0x0b, 0x9d, 0x6b, + 0x56, 0x1c, 0xed, 0x94, 0xd7, 0x07, 0xb9, 0x53, 0x75, 0x75, 0x52, 0x8e, + 0xab, 0x75, 0x9b, 0x64, 0x89, 0x63, 0xa9, 0x94, 0xac, 0x36, 0x11, 0xf2, + 0xb7, 0xac, 0xf8, 0xc5, 0x14, 0xa0, 0x13, 0xd1, 0x2b, 0xed, 0x80, 0xd6, + 0x68, 0x7c, 0xa4, 0x40, 0xe9, 0x23, 0xae, 0xb4, 0x03, 0x1f, 0x38, 0x68, + 0x87, 0x55, 0x37, 0x29, 0x7f, 0x9a, 0x19, 0x79, 0xcb, 0x37, 0x6f, 0x5b, + 0x80, 0x6e, 0x4e, 0xb4, 0x61, 0x32, 0xc9, 0x3a, 0xdb, 0xcc, 0x9d, 0x8a, + 0xd4, 0xa4, 0x0b, 0x99, 0x23, 0xd2, 0x5f, 0x1c, 0x49, 0x71, 0x28, 0x02, + 0xd4, 0x4f, 0x4c, 0x74, 0x0f, 0xcf, 0x60, 0xc3, 0x73, 0x1b, 0x3e, 0x61, + 0xad, 0x62, 0x3e, 0x61, 0x01, 0xda, 0xea, 0x14, 0x42, 0x95, 0xd8, 0xa2, + 0xf3, 0xa4, 0x80, 0xa5, 0xd2, 0x6c, 0xb5, 0x71, 0x44, 0x40, 0x04, 0xa8, + 0x12, 0x53, 0x87, 0x93, 0x0e, 0x92, 0x9f, 0x20, 0x9f, 0xf5, 0x89, 0x70, + 0x49, 0xf6, 0x43, 0x77, 0x1d, 0x6a, 0x95, 0x44, 0x60, 0x25, 0x01, 0xd2, + 0x2b, 0x48, 0xcc, 0x90, 0xdb, 0xa4, 0xfc, 0x43, 0x37, 0x07, 0xd2, 0x5b, + 0xe4, 0xe8, 0x38, 0x68, 0x10, 0x9e, 0x13, 0xb9, 0x29, 0xdf, 0x66, 0x99, + 0x66, 0x5d, 0x03, 0x7e, 0x4f, 0xe1, 0x19, 0x6c, 0x60, 0xab, 0x4f, 0x89, + 0x93, 0xc1, 0xff, 0x3f, 0x7b, 0x78, 0x8d, 0x3f, 0x15, 0xb3, 0x9c, 0xca, + 0xc0, 0xea, 0x02, 0xa6, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, + 0xae, 0x42, 0x60, 0x82 +}; +static unsigned int picker_more_icon_png_len = 1180; diff --git a/docs/README.md b/docs/README.md index c80e1ed..6258e88 100644 --- a/docs/README.md +++ b/docs/README.md @@ -8,9 +8,8 @@ ## 📦Features at a Glance - Extremely lightweight on memory and resources, written in safe modern C++. - - Self-contained single `.exe` under 2 Mb in size with no dependencies. - - Available as `.msi` [installer](https://aloneguid.github.io/bt/install-msi.html). - - [Portable mode](https://aloneguid.github.io/bt/portable-mode.html) supported. + - Self-contained single `.exe` under 3 Mb in size with no dependencies. + - Available as `.msi` [installer](https://aloneguid.github.io/bt/install-msi.html), plain zip archive, with optional [portable mode](https://aloneguid.github.io/bt/portable-mode.html). - Fits on a floppy disk if you can find it in 2023! 💾 - Completely free and [open-source](https://github.com/aloneguid/bt). - Intelligent detection of the most popular browsers. @@ -18,6 +17,7 @@ - Detection of browser profiles. - Support for [Firefox Containers](https://aloneguid.github.io/bt/firefox-containers.html). - Support for incognito mode / tor mode. +- [Command line support](https://aloneguid.github.io/bt/commandline.html). - Supports Microsoft Store apps. - Special support for [Arc browser.](https://arc.net/) - Add your own, custom browser or application customised with any parameters you want. @@ -29,6 +29,7 @@ - [Office 365 URL unwrapping](https://aloneguid.github.io/bt/url-proc.html#office-365-link-unwrapping). - [Find/replace](http://localhost:63342/wrs/preview/url-proc.html#substitutions) functionality, including regular expression support. - [Custom scripting](https://aloneguid.github.io/bt/scripting.html) for URL processing and rule matching using [Lua](https://www.lua.org/) programming language. +- [Pipeline debugger](https://aloneguid.github.io/bt/debugger.html) brings clarity to complicated rules and pipelines. - **[Extensions](https://aloneguid.github.io/bt/browser-extensions.html)** to integrate with Chrome, Edge, Firefox, or any Chromium-based or Firefox-based browser (Opera, Vivaldi, Brave, Waterfox, LibreWolf etc.). [![Chrome Web Store Version](https://img.shields.io/chrome-web-store/v/oggcljknmiiomjekepdoindjcpnpglnd)](https://chrome.google.com/webstore/detail/browser-tamer/oggcljknmiiomjekepdoindjcpnpglnd) [![Mozilla Add-on Version](https://img.shields.io/amo/v/browser-tamer)](https://addons.mozilla.org/eu/firefox/addon/browser-tamer/) - Open links in ["chromeless (frameless)" window](https://aloneguid.github.io/bt/rules.html#frameless-windows). @@ -45,7 +46,7 @@ Feel free to [raise an issue here](https://github.com/aloneguid/bt/issues/new) o ## Contributing -I value your interest in this open-source project. While **I don't accept pull requests** (there is no way to turn them off in GitHub), your support through coffee donations directly contributes to the project's development and sustainability, allowing me to invest more resources into refining, addressing issues, and implementing new features. Your involvement, in any form, is greatly appreciated. Thank you for being a part of our journey! +I value your interest in this open-source project, and your support through coffee donations directly contributes to the project's development and sustainability, allowing me to invest more resources into refining, addressing issues, and implementing new features. Your involvement, in any form, is greatly appreciated. Thank you for being a part of our journey! diff --git a/docs/release-notes.md b/docs/release-notes.md index 84f8661..0c8006c 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -1,13 +1,14 @@ ## 4.2.0 -(in dev) - ### New features: - Ability to hide profiles, in addition to the browsers (#71). Thanks to @ilapro53 for the idea. - Picker option "always on top" will make sure picker always shows on top of other windows (off by default). - Added configuration option to manually invoke Picker when `CAPS LOCKS` is on. -- todo: copy to clipboard & close in picker +- Picker includes an extra menu to the right of browser list, which at the moment has two extra options: + - Copy link to clipboard and close picker. + - Email link with a default email client. + ## 4.1.2