Skip to content

Commit

Permalink
"actions" menu - copy to clipboard and email
Browse files Browse the repository at this point in the history
  • Loading branch information
aloneguid committed Oct 7, 2024
1 parent 3e8a9fa commit d05ecbf
Show file tree
Hide file tree
Showing 6 changed files with 235 additions and 11 deletions.
2 changes: 2 additions & 0 deletions bt/app/strings.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"};
}
105 changes: 101 additions & 4 deletions bt/app/ui/picker_app.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,11 @@
#include "../../res.inl"
#include "fmt/core.h"
#include "../common/win32/user.h"
#include "../strings.h"
#define _USE_MATH_DEFINES
#include <math.h>
#include "../../common/win32/clipboard.h"
#include "../../common/win32/shell.h"

using namespace std;
namespace w = grey::widgets;
Expand All @@ -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;
Expand Down Expand Up @@ -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};
Expand Down Expand Up @@ -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();
Expand All @@ -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;
Expand Down Expand Up @@ -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);
}

Expand Down Expand Up @@ -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;
}
}
}
20 changes: 20 additions & 0 deletions bt/app/ui/picker_app.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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;
Expand All @@ -51,11 +62,18 @@ namespace bt::ui {
std::vector<connection_box> profiles_cb; // active profile coordinates
float browser_bar_left_pad{0};

bool action_menu_hovered{false};
std::vector<action_menu_item> 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<bt::browser_instance> decision;

bool run_frame();
void render_action_menu(float x, float y);
void render_browser_bar();
void render_profile_bar();
void render_connection_box();
Expand All @@ -65,5 +83,7 @@ namespace bt::ui {
* @param decision
*/
void make_decision(std::shared_ptr<bt::browser_instance> decision);

void menu_item_clicked(const std::string& id);
};
}
103 changes: 103 additions & 0 deletions bt/res.inl
Original file line number Diff line number Diff line change
Expand Up @@ -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;
9 changes: 5 additions & 4 deletions docs/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,16 @@
## 📦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.
- **Firefox**, **Edge**, **Chrome**, **Brave** and so on.
- 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.
Expand All @@ -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).
Expand All @@ -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!

<a href="https://www.buymeacoffee.com/alonecoffee" target="_blank"><img height="50" src="bmc-button.svg" /></a>

7 changes: 4 additions & 3 deletions docs/release-notes.md
Original file line number Diff line number Diff line change
@@ -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

Expand Down

0 comments on commit d05ecbf

Please sign in to comment.