Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replace GtkToolbar with GtkBox for gtk4 #5114

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/core/gui/FloatingToolbox.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,8 +82,9 @@ auto FloatingToolbox::countWidgets() -> int {

for (int index = TBFloatFirst; index <= TBFloatLast; index++) {
const char* guiName = TOOLBAR_DEFINITIONS[index].guiName;
GtkToolbar* toolbar1 = GTK_TOOLBAR(this->mainWindow->get(guiName));
count += gtk_toolbar_get_n_items(toolbar1);
GtkWidget* tb = this->mainWindow->get(guiName);
gtk_container_foreach(
GTK_CONTAINER(tb), +[](GtkWidget*, gpointer c) { (*static_cast<int*>(c))++; }, &count);
}

return count;
Expand Down
6 changes: 3 additions & 3 deletions src/core/gui/MainWindow.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -610,7 +610,7 @@ void MainWindow::setToolbarVisible(bool visible) {

settings->setToolbarVisible(visible);
for (auto& w: this->toolbarWidgets) {
if (!visible || (gtk_toolbar_get_n_items(GTK_TOOLBAR(w.get())) != 0)) {
if (!visible) { // || (gtk_toolbar_get_n_items(GTK_TOOLBAR(w.get())) != 0)) {
gtk_widget_set_visible(w.get(), visible);
}
}
Expand Down Expand Up @@ -684,9 +684,9 @@ auto MainWindow::getSelectedToolbar() const -> ToolbarData* { return this->selec

auto MainWindow::getToolbarWidgets() const -> const ToolbarWidgetArray& { return toolbarWidgets; }

auto MainWindow::getToolbarName(GtkToolbar* toolbar) const -> const char* {
auto MainWindow::getToolbarName(GtkWidget* toolbar) const -> const char* {
for (size_t i = 0; i < TOOLBAR_DEFINITIONS_LEN; i++) {
if (static_cast<void*>(this->toolbarWidgets[i].get()) == static_cast<void*>(toolbar)) {
if (this->toolbarWidgets[i].get() == toolbar) {
return TOOLBAR_DEFINITIONS[i].propName;
}
}
Expand Down
2 changes: 1 addition & 1 deletion src/core/gui/MainWindow.h
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ class MainWindow: public GladeGui {
void updateColorscheme();

const ToolbarWidgetArray& getToolbarWidgets() const;
const char* getToolbarName(GtkToolbar* toolbar) const;
const char* getToolbarName(GtkWidget* toolbar) const;

Layout* getLayout() const;

Expand Down
4 changes: 2 additions & 2 deletions src/core/gui/ToolbarDefinitions.h
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ typedef struct {
bool horizontal;
} ToolbarEntryDefintion;

const static ToolbarEntryDefintion TOOLBAR_DEFINITIONS[] = {
constexpr ToolbarEntryDefintion TOOLBAR_DEFINITIONS[] = {
{"tbTop1", "toolbarTop1", true}, {"tbTop2", "toolbarTop2", true},
{"tbLeft1", "toolbarLeft1", false}, {"tbLeft2", "toolbarLeft2", false},
{"tbRight1", "toolbarRight1", false}, {"tbRight2", "toolbarRight2", false},
Expand All @@ -38,7 +38,7 @@ const static ToolbarEntryDefintion TOOLBAR_DEFINITIONS[] = {
};


const static int TOOLBAR_DEFINITIONS_LEN = G_N_ELEMENTS(TOOLBAR_DEFINITIONS);
constexpr size_t TOOLBAR_DEFINITIONS_LEN = G_N_ELEMENTS(TOOLBAR_DEFINITIONS);

#define TBFloatFirst 8
#define TBFloatLast 11
96 changes: 50 additions & 46 deletions src/core/gui/dialog/toolbarCustomize/ToolbarAdapter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -180,18 +180,18 @@ void ToolbarAdapter::toolitemDragDataGet(GtkWidget* widget, GdkDragContext* cont

g_return_if_fail(data != nullptr);

GtkToolbar* tb = GTK_TOOLBAR(adapter->w);
// GtkToolbar* tb = GTK_TOOLBAR(adapter->w);
int position = -1;
for (int i = 0; i < gtk_toolbar_get_n_items(tb); i++) {
GtkToolItem* it = gtk_toolbar_get_nth_item(tb, i);

if (static_cast<void*>(it) == static_cast<void*>(widget)) {
adapter->cleanToolItem(it);
gtk_container_remove(GTK_CONTAINER(tb), GTK_WIDGET(it));
position = i;
break;
}
}
// for (int i = 0; i < gtk_toolbar_get_n_items(tb); i++) {
// GtkToolItem* it = gtk_toolbar_get_nth_item(tb, i);
//
// if (static_cast<void*>(it) == static_cast<void*>(widget)) {
// adapter->cleanToolItem(it);
// gtk_container_remove(GTK_CONTAINER(tb), GTK_WIDGET(it));
// position = i;
// break;
// }
// }

g_return_if_fail(position != -1);

Expand All @@ -204,9 +204,9 @@ void ToolbarAdapter::toolitemDragDataGet(GtkWidget* widget, GdkDragContext* cont
/**
* A tool item was dragged to the toolbar
*/
auto ToolbarAdapter::toolbarDragMotionCb(GtkToolbar* toolbar, GdkDragContext* context, gint x, gint y, guint time,
auto ToolbarAdapter::toolbarDragMotionCb(GtkWidget* toolbar, GdkDragContext* context, gint x, gint y, guint time,
ToolbarAdapter* adapter) -> bool {
GdkAtom target = gtk_drag_dest_find_target(GTK_WIDGET(toolbar), context, nullptr);
GdkAtom target = gtk_drag_dest_find_target(toolbar, context, nullptr);
if (target != ToolbarDragDropHelper::atomToolItem) {
gdk_drag_status(context, static_cast<GdkDragAction>(0), time);
return false;
Expand All @@ -229,31 +229,31 @@ auto ToolbarAdapter::toolbarDragMotionCb(GtkToolbar* toolbar, GdkDragContext* co
if (d->type == TOOL_ITEM_ITEM) {
GtkWidget* iconWidget = d->item->getNewToolIcon();
GtkToolItem* it = gtk_tool_button_new(iconWidget, "");
gtk_toolbar_set_drop_highlight_item(toolbar, it, ipos);
// gtk_toolbar_set_drop_highlight_item(toolbar, it, ipos);
} else if (d->type == TOOL_ITEM_SEPARATOR) {
GtkToolItem* it = gtk_separator_tool_item_new();
gtk_toolbar_set_drop_highlight_item(toolbar, it, ipos);
// gtk_toolbar_set_drop_highlight_item(toolbar, it, ipos);
} else if (d->type == TOOL_ITEM_SPACER) {
GtkToolItem* it = gtk_separator_tool_item_new();
gtk_tool_item_set_expand(it, true);
gtk_toolbar_set_drop_highlight_item(toolbar, it, ipos);
// gtk_toolbar_set_drop_highlight_item(toolbar, it, ipos);
} else if (d->type == TOOL_ITEM_COLOR) {
GtkWidget* iconWidget = ColorIcon::newGtkImage(d->namedColor->getColor(), 16, true);
GtkToolItem* it = gtk_tool_button_new(iconWidget, "");
gtk_toolbar_set_drop_highlight_item(toolbar, it, ipos);
// gtk_toolbar_set_drop_highlight_item(toolbar, it, ipos);
} else {
g_warning("ToolbarAdapter::toolbarDragMotionCb Unhandled type %i", d->type);
}

return true;
}

void ToolbarAdapter::toolbarDragLeafeCb(GtkToolbar* toolbar, GdkDragContext* context, guint time,
void ToolbarAdapter::toolbarDragLeafeCb(GtkWidget* toolbar, GdkDragContext* context, guint time,
ToolbarAdapter* adapter) {
gtk_toolbar_set_drop_highlight_item(toolbar, nullptr, -1);
// gtk_toolbar_set_drop_highlight_item(toolbar, nullptr, -1);
}

void ToolbarAdapter::toolbarDragDataReceivedCb(GtkToolbar* toolbar, GdkDragContext* context, gint x, gint y,
void ToolbarAdapter::toolbarDragDataReceivedCb(GtkWidget* toolbar, GdkDragContext* context, gint x, gint y,
GtkSelectionData* data, guint info, guint time,
ToolbarAdapter* adapter) {
auto* d = reinterpret_cast<ToolItemDragDropData const*>(gtk_selection_data_get_data(data));
Expand All @@ -263,10 +263,11 @@ void ToolbarAdapter::toolbarDragDataReceivedCb(GtkToolbar* toolbar, GdkDragConte
gint pos = toolbarGetDropIndex(toolbar, x, y, horizontal);

if (d->type == TOOL_ITEM_ITEM) {
auto it = d->item->createToolItem(horizontal);
auto it = d->item->createItem(horizontal);

gtk_toolbar_insert(toolbar, GTK_TOOL_ITEM(it.get()), pos); // Increases the ref-count of *it
adapter->prepareToolItem(GTK_TOOL_ITEM(it.get()));
gtk_widget_show_all(it.get());
// gtk_toolbar_insert(toolbar, it, pos);
// adapter->prepareToolItem(it);

ToolbarData* tb = adapter->window->getSelectedToolbar();
const char* name = adapter->window->getToolbarName(toolbar);
Expand All @@ -278,24 +279,25 @@ void ToolbarAdapter::toolbarDragDataReceivedCb(GtkToolbar* toolbar, GdkDragConte
} else if (d->type == TOOL_ITEM_COLOR) {
auto item = std::make_unique<ColorToolItem>(*(d->namedColor));

auto it = item->createToolItem(horizontal);
// auto it = item->createItem(horizontal);

gtk_toolbar_insert(toolbar, GTK_TOOL_ITEM(it.get()), pos);
adapter->prepareToolItem(GTK_TOOL_ITEM(it.get()));

ToolbarData* tb = adapter->window->getSelectedToolbar();
const char* name = adapter->window->getToolbarName(toolbar);

string id = item->getId();

int newId = tb->insertItem(name, id, pos);
ToolitemDragDrop::attachMetadataColor(it.get(), newId, d->namedColor, item.get());
// gtk_widget_show_all(it.get());
// gtk_toolbar_insert(toolbar, it, pos);
// adapter->prepareToolItem(it);
//
// ToolbarData* tb = adapter->window->getSelectedToolbar();
// const char* name = adapter->window->getToolbarName(toolbar);
//
// string id = item->getId();
//
// int newId = tb->insertItem(name, id, pos);
// ToolitemDragDrop::attachMetadataColor(GTK_WIDGET(it), newId, d->namedColor, item);

adapter->window->getToolMenuHandler()->addColorToolItem(std::move(item));
} else if (d->type == TOOL_ITEM_SEPARATOR) {
GtkToolItem* it = gtk_separator_tool_item_new();
gtk_widget_show_all(GTK_WIDGET(it));
gtk_toolbar_insert(toolbar, it, pos);
// gtk_toolbar_insert(toolbar, it, pos);
adapter->prepareToolItem(it);

ToolbarData* tb = adapter->window->getSelectedToolbar();
Expand All @@ -308,7 +310,7 @@ void ToolbarAdapter::toolbarDragDataReceivedCb(GtkToolbar* toolbar, GdkDragConte
gtk_separator_tool_item_set_draw(GTK_SEPARATOR_TOOL_ITEM(it), false);
gtk_tool_item_set_expand(it, true);
gtk_widget_show_all(GTK_WIDGET(it));
gtk_toolbar_insert(toolbar, it, pos);
// gtk_toolbar_insert(toolbar, it, pos);
adapter->prepareToolItem(it);

ToolbarData* tb = adapter->window->getSelectedToolbar();
Expand All @@ -321,19 +323,21 @@ void ToolbarAdapter::toolbarDragDataReceivedCb(GtkToolbar* toolbar, GdkDragConte
}
}

auto ToolbarAdapter::toolbarGetDropIndex(GtkToolbar* toolbar, gint x, gint y, bool horizontal) -> gint {
auto ToolbarAdapter::toolbarGetDropIndex(GtkWidget* toolbar, gint x, gint y, bool horizontal) -> gint {
return 0;
/*
* gtk_toolbar_get_drop_index does not use the correct coordinate system for the y coordinate
* since the y coordinate is only relevant in vertical toolbars the transformation is NOT required for horizontal
* toolbars
*/
if (horizontal) {
return gtk_toolbar_get_drop_index(toolbar, x, y);
} else {
gint wx = 0;
gint wy = 0;
gtk_widget_translate_coordinates(GTK_WIDGET(toolbar), gtk_widget_get_toplevel(GTK_WIDGET(toolbar)), x, y, &wx,
&wy);
return gtk_toolbar_get_drop_index(toolbar, x, wy);
}
// if (horizontal) {
// return gtk_toolbar_get_drop_index(toolbar, x, y);
// } else {
// gint wx = 0;
// gint wy = 0;
// gtk_widget_translate_coordinates(GTK_WIDGET(toolbar), gtk_widget_get_toplevel(GTK_WIDGET(toolbar)), x, y,
// &wx,
// &wy);
// return gtk_toolbar_get_drop_index(toolbar, x, wy);
// }
}
8 changes: 4 additions & 4 deletions src/core/gui/dialog/toolbarCustomize/ToolbarAdapter.h
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,10 @@ class ToolbarAdapter {
/**
* A tool item was dragged to the toolbar
*/
static bool toolbarDragMotionCb(GtkToolbar* toolbar, GdkDragContext* context, gint x, gint y, guint time,
static bool toolbarDragMotionCb(GtkWidget* toolbar, GdkDragContext* context, gint x, gint y, guint time,
ToolbarAdapter* adapter);
static void toolbarDragLeafeCb(GtkToolbar* toolbar, GdkDragContext* context, guint time, ToolbarAdapter* adapter);
static void toolbarDragDataReceivedCb(GtkToolbar* toolbar, GdkDragContext* context, gint x, gint y,
static void toolbarDragLeafeCb(GtkWidget* toolbar, GdkDragContext* context, guint time, ToolbarAdapter* adapter);
static void toolbarDragDataReceivedCb(GtkWidget* toolbar, GdkDragContext* context, gint x, gint y,
GtkSelectionData* data, guint info, guint time, ToolbarAdapter* adapter);

/**
Expand All @@ -70,7 +70,7 @@ class ToolbarAdapter {
* @param horizontal denotes whether the toolbar is horizontal
* @return gint position at which drop item should be inserted
*/
static gint toolbarGetDropIndex(GtkToolbar* toolbar, gint x, gint y, bool horizontal);
static gint toolbarGetDropIndex(GtkWidget* toolbar, gint x, gint y, bool horizontal);

private:
GtkWidget* w;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ void ToolbarDragDropHandler::prepareToolbarsForDragAndDrop() {
this->toolbars.clear();

for (auto w: win->getToolbarWidgets()) {
this->toolbars.emplace_back(std::make_unique<ToolbarAdapter>(w.get(), win->getToolbarName(GTK_TOOLBAR(w.get())),
this->toolbars.emplace_back(std::make_unique<ToolbarAdapter>(w.get(), win->getToolbarName(w.get()),
control->getWindow()->getToolMenuHandler(), win));
}
}
Expand Down
15 changes: 0 additions & 15 deletions src/core/gui/toolbarMenubar/AbstractToolItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,3 @@ AbstractToolItem::~AbstractToolItem() = default;

auto AbstractToolItem::getId() const -> const std::string& { return id; }
auto AbstractToolItem::getCategory() const -> Category { return category; }

xoj::util::WidgetSPtr AbstractToolItem::createToolItem(bool horizontal) {
xoj::util::WidgetSPtr item = createItem(horizontal);
gtk_widget_set_can_focus(item.get(), false); // todo(gtk4) not necessary anymore
if (GTK_IS_TOOL_ITEM(item.get())) {
gtk_widget_show_all(item.get());
return item;
}

// Wrap in a GtkToolItem
GtkToolItem* wrap = gtk_tool_item_new();
gtk_container_add(GTK_CONTAINER(wrap), item.get());
gtk_widget_show_all(GTK_WIDGET(wrap));
return xoj::util::WidgetSPtr(GTK_WIDGET(wrap), xoj::util::adopt);
}
3 changes: 1 addition & 2 deletions src/core/gui/toolbarMenubar/AbstractToolItem.h
Original file line number Diff line number Diff line change
Expand Up @@ -47,10 +47,9 @@ class AbstractToolItem {
public:
virtual xoj::util::WidgetSPtr createItem(bool horizontal) = 0;

xoj::util::WidgetSPtr createToolItem(bool horizontal);

const std::string& getId() const;
Category getCategory() const;

virtual std::string getToolDisplayName() const = 0;

/**
Expand Down
20 changes: 1 addition & 19 deletions src/core/gui/toolbarMenubar/ColorSelectorToolItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,25 +33,7 @@ auto ColorSelectorToolItem::createItem(bool) -> xoj::util::WidgetSPtr {
gtk_button_set_child(GTK_BUTTON(btn), ColorIcon::newGtkImage(c, ICON_SIZE, false));
}),
btn, GConnectFlags(0));

// Make a proxy for GtkToolbar
GtkToolItem* it = gtk_tool_item_new();
gtk_container_add(GTK_CONTAINER(it), btn);
/// Makes a proxy item for the toolbar's overflow menu
auto createProxy = [&]() {
constexpr int PROXY_ICON_SIZE = 16;
GtkWidget* proxy = gtk_menu_item_new();
auto* box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
gtk_container_add(GTK_CONTAINER(proxy), box);
gtk_box_append(GTK_BOX(box), ColorIcon::newGtkImage(Colors::gray, PROXY_ICON_SIZE, false));
gtk_box_append(GTK_BOX(box), gtk_label_new(getToolDisplayName().c_str()));
gtk_actionable_set_action_name(GTK_ACTIONABLE(proxy),
(std::string("win.") + Action_toString(Action::SELECT_COLOR)).c_str());
xoj::util::gtk::fixActionableInitialSensitivity(GTK_ACTIONABLE(proxy));
return proxy;
};
gtk_tool_item_set_proxy_menu_item(it, "", createProxy());
return xoj::util::WidgetSPtr(GTK_WIDGET(it), xoj::util::adopt);
return xoj::util::WidgetSPtr(btn, xoj::util::adopt);
}

auto ColorSelectorToolItem::getToolDisplayName() const -> std::string { return _("Select color"); }
Expand Down
26 changes: 1 addition & 25 deletions src/core/gui/toolbarMenubar/ColorToolItem.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,31 +27,7 @@ auto ColorToolItem::createItem(bool) -> xoj::util::WidgetSPtr {
gtk_widget_set_tooltip_text(btn, this->namedColor.getName().c_str());
gtk_button_set_child(GTK_BUTTON(btn), getNewToolIcon());


// For the sake of deprecated GtkToolbar, wrap the button in a GtkToolItem
// Todo(gtk4): remove
GtkToolItem* it = gtk_tool_item_new();
gtk_container_add(GTK_CONTAINER(it), btn);
/// Makes a proxy item for the toolbar's overflow menu
auto createProxy = [this]() {
GtkWidget* proxy = gtk_check_menu_item_new();
gtk_check_menu_item_set_draw_as_radio(GTK_CHECK_MENU_ITEM(proxy), true);

auto* box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
gtk_container_add(GTK_CONTAINER(proxy), box);
gtk_box_append(GTK_BOX(box), getNewToolIcon());
gtk_box_append(GTK_BOX(box), gtk_label_new(getToolDisplayName().c_str()));

gtk_actionable_set_action_name(GTK_ACTIONABLE(proxy),
(std::string("win.") + Action_toString(Action::TOOL_COLOR)).c_str());
if (target) {
gtk_actionable_set_action_target_value(GTK_ACTIONABLE(proxy), target.get());
}
xoj::util::gtk::fixActionableInitialSensitivity(GTK_ACTIONABLE(proxy));
return proxy;
};
gtk_tool_item_set_proxy_menu_item(it, "", createProxy());
return xoj::util::WidgetSPtr(GTK_WIDGET(it), xoj::util::adopt);
return xoj::util::WidgetSPtr(btn, xoj::util::adopt);
}

auto ColorToolItem::getToolDisplayName() const -> std::string { return this->namedColor.getName(); }
Expand Down
17 changes: 1 addition & 16 deletions src/core/gui/toolbarMenubar/FontButton.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -53,22 +53,7 @@ auto FontButton::createItem(bool horizontal) -> xoj::util::WidgetSPtr {
}),
btn, GConnectFlags(0));

GtkToolItem* it = gtk_tool_item_new();
gtk_container_add(GTK_CONTAINER(it), btn);
/// Makes a proxy item for the toolbar's overflow menu
auto createProxy = [this]() {
GtkWidget* proxy = gtk_menu_item_new();
auto* box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6);
gtk_container_add(GTK_CONTAINER(proxy), box);
gtk_box_append(GTK_BOX(box), getNewToolIcon());
gtk_box_append(GTK_BOX(box), gtk_label_new(getToolDisplayName().c_str()));
gtk_actionable_set_action_name(GTK_ACTIONABLE(proxy),
(std::string("win.") + Action_toString(Action::SELECT_FONT)).c_str());
xoj::util::gtk::fixActionableInitialSensitivity(GTK_ACTIONABLE(proxy));
return proxy;
};
gtk_tool_item_set_proxy_menu_item(it, "", createProxy());
return xoj::util::WidgetSPtr(GTK_WIDGET(it), xoj::util::adopt);
return xoj::util::WidgetSPtr(btn, xoj::util::adopt);
}

auto FontButton::getToolDisplayName() const -> std::string { return _("Font"); }
Expand Down
Loading