144 set_name(
"ContextMenu");
146 auto item = cast<SPItem>(
object);
155 auto gmenu = Gio::Menu::create();
156 auto gmenu_section = Gio::Menu::create();
164 bool has_hidden_below_cursor =
false;
165 bool has_locked_below_cursor =
false;
168 has_hidden_below_cursor =
true;
171 has_locked_below_cursor =
true;
187 if (
auto page = cast<SPPage>(
object)) {
188 auto &page_manager = document->getPageManager();
189 page_manager.selectPage(
page);
191 gmenu_section = Gio::Menu::create();
193 gmenu->append_section(gmenu_section);
195 gmenu_section = Gio::Menu::create();
197 AppendItemFromAction(gmenu_section,
"doc.page-move-backward", _(
"Move Page _Backward"),
"pages-order-backwards");
198 AppendItemFromAction(gmenu_section,
"doc.page-move-forward", _(
"Move Page _Forward"),
"pages-order-forwards");
199 gmenu->append_section(gmenu_section);
210 selection.
set(
object);
218 gmenu_section = Gio::Menu::create();
219 AppendItemFromAction(gmenu_section,
"win.dialog-open('DocumentProperties')", _(
"Document Properties..."),
"document-properties");
220 gmenu->append_section(gmenu_section);
225 gmenu_section = Gio::Menu::create();
229 gmenu->append_section(gmenu_section);
232 auto gmenu_dialogs = Gio::Menu::create();
233 if (!hide_layers_and_objects_menu_item) {
234 AppendItemFromAction(gmenu_dialogs,
"win.dialog-open('Objects')", _(
"Layers and Objects..."),
"dialog-objects" );
236 AppendItemFromAction(gmenu_dialogs,
"win.dialog-open('ObjectProperties')", _(
"_Object Properties..."),
"dialog-object-properties" );
238 if (is<SPShape>(
item) || is<SPText>(
item) || is<SPGroup>(
item)) {
239 AppendItemFromAction(gmenu_dialogs,
"win.dialog-open('FillStroke')", _(
"_Fill and Stroke..."),
"dialog-fill-and-stroke" );
244 AppendItemFromAction( gmenu_dialogs,
"win.dialog-open('Trace')", _(
"_Trace Bitmap..."),
"bitmap-trace" );
246 if (
image->getClipObject()) {
249 if (strncmp(
image->href,
"data", 4) == 0) {
251 AppendItemFromAction( gmenu_dialogs,
"app.org.inkscape.filter.extract-image", _(
"Extract Image..."),
"" );
254 AppendItemFromAction( gmenu_dialogs,
"app.org.inkscape.filter.selected.embed-image", _(
"Embed Image"),
"" );
265 if (is<SPText>(
item)) {
266 AppendItemFromAction( gmenu_dialogs,
"win.dialog-open('Text')", _(
"_Text and Font..."),
"dialog-text-and-font" );
267 AppendItemFromAction( gmenu_dialogs,
"win.dialog-open('Spellcheck')", _(
"Check Spellin_g..."),
"tools-check-spelling" );
269 gmenu->append_section(gmenu_dialogs);
271 if (!is<SPAnchor>(
item)) {
275 gmenu_section = Gio::Menu::create();
276 auto gmenu_submenu = Gio::Menu::create();
277 AppendItemFromAction( gmenu_submenu,
"win.select-same-fill-and-stroke", _(
"Fill _and Stroke"),
"edit-select-same-fill-and-stroke");
278 AppendItemFromAction( gmenu_submenu,
"win.select-same-fill", _(
"_Fill Color"),
"edit-select-same-fill" );
279 AppendItemFromAction( gmenu_submenu,
"win.select-same-stroke-color", _(
"_Stroke Color"),
"edit-select-same-stroke-color" );
280 AppendItemFromAction( gmenu_submenu,
"win.select-same-stroke-style", _(
"Stroke St_yle"),
"edit-select-same-stroke-style" );
281 AppendItemFromAction( gmenu_submenu,
"win.select-same-object-type", _(
"_Object Type"),
"edit-select-same-object-type" );
282 gmenu_section->append_submenu(_(
"Select Sa_me"), gmenu_submenu);
283 gmenu->append_section(gmenu_section);
286 gmenu_section = Gio::Menu::create();
287 AppendItemFromAction( gmenu_section,
"win.selection-move-to-layer", _(
"_Move to Layer..."),
"" );
288 AppendItemFromAction( gmenu_section,
"app.selection-link", _(
"Create Anchor (Hyperlink)"),
"" );
290 if (is<SPGroup>(
item)) {
300 if (group && !group->isLayer()) {
302 AppendItemFromAction( gmenu_section,
"app.selection-ungroup-pop", _(
"_Pop Selection out of Group"),
"" );
304 gmenu->append_section(gmenu_section);
307 gmenu_section = Gio::Menu::create();
308 if (selection.size() > 1) {
316 if (selection.size() > 1) {
322 gmenu->append_section(gmenu_section);
325 gmenu_section = Gio::Menu::create();
328 gmenu->append_section(gmenu_section);
332 gmenu_section = Gio::Menu::create();
333 AppendItemFromAction( gmenu_section,
"app.element-a-open-link", _(
"_Open Link in Browser"),
"" );
336 gmenu->append_section(gmenu_section);
341 gmenu_section = Gio::Menu::create();
342 if (has_hidden_below_cursor) {
343 AppendItemFromAction( gmenu_section,
"ctx.unhide-objects-below-cursor", _(
"Unhide Objects Below Cursor"),
"" );
345 if (has_locked_below_cursor) {
346 AppendItemFromAction( gmenu_section,
"ctx.unlock-objects-below-cursor", _(
"Unlock Objects Below Cursor"),
"" );
348 gmenu->append_section(gmenu_section);
352 gmenu_section = Gio::Menu::create();
354 AppendItemFromAction(gmenu_section,
"win.layer-duplicate", _(
"D_uplicate Layer"),
"layer-duplicate");
357 AppendItemFromAction(gmenu_section,
"win.layer-to-group", _(
"Layer to _Group"),
"dialog-objects");
358 gmenu->append_section(gmenu_section);
360 gmenu_section = Gio::Menu::create();
363 gmenu->append_section(gmenu_section);
365 gmenu_section = Gio::Menu::create();
366 AppendItemFromAction(gmenu_section,
"win.layer-hide-toggle-others", _(
"_Hide/Show Other Layers"),
"");
369 gmenu->append_section(gmenu_section);
371 gmenu_section = Gio::Menu::create();
372 AppendItemFromAction(gmenu_section,
"win.layer-lock-toggle-others", _(
"_Lock/Unlock Other Layers"),
"");
375 gmenu->append_section(gmenu_section);
379 set_menu_model(gmenu);
380 set_position(Gtk::PositionType::BOTTOM);
381 set_halign(Gtk::Align::START);
382 set_has_arrow(
false);
384 set_flags(Gtk::PopoverMenu::Flags::NESTED);
390 bool const shift_icons = prefs->
getInt(
"/theme/shiftIcons",
true);
394 if (window->has_css_class(
"dark")) {
395 add_css_class(
"dark");
397 add_css_class(
"bright");
399 if (prefs->
getBool(
"/theme/symbolicIcons",
false)) {
400 add_css_class(
"symbolic");
402 add_css_class(
"regular");