diff options
author | Caolán McNamara <caolanm@redhat.com> | 2018-10-08 12:07:58 +0100 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2018-10-09 15:17:04 +0200 |
commit | 15ea661bec6e38f4b4b641ed79bd5591345fefbd (patch) | |
tree | a9a8c17a99b7c0356d8ba3d77c1b5f582cdfc43f /vcl | |
parent | 7ceee0f1ec0e349d0df4980d7fdedbd13c7917c5 (diff) |
tdf#120377 weld cluster of animation pages and dialog
Change-Id: Ia5a9880c1e6d88141bd654a9cc761b289f27c249
Reviewed-on: https://gerrit.libreoffice.org/61542
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/app/salvtables.cxx | 41 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkinst.cxx | 131 |
2 files changed, 118 insertions, 54 deletions
diff --git a/vcl/source/app/salvtables.cxx b/vcl/source/app/salvtables.cxx index fb8363ff10e4..3d03b0a70124 100644 --- a/vcl/source/app/salvtables.cxx +++ b/vcl/source/app/salvtables.cxx @@ -519,6 +519,24 @@ namespace { return Image(BitmapEx(rDevice.GetBitmapEx(Point(), rDevice.GetOutputSizePixel()))); } + + void insert_to_menu(PopupMenu* pMenu, int pos, const OUString& rId, const OUString& rStr, + const OUString* pIconName, VirtualDevice* pImageSurface, bool bCheck) + { + const auto nCount = pMenu->GetItemCount(); + const sal_uInt16 nLastId = nCount ? pMenu->GetItemId(nCount-1) : 0; + const sal_uInt16 nNewid = nLastId + 1; + pMenu->InsertItem(nNewid, rStr, bCheck ? MenuItemBits::CHECKABLE : MenuItemBits::NONE, + OUStringToOString(rId, RTL_TEXTENCODING_UTF8), pos == -1 ? MENU_APPEND : pos); + if (pIconName) + { + pMenu->SetItemImage(nNewid, createImage(*pIconName)); + } + else if (pImageSurface) + { + pMenu->SetItemImage(nNewid, createImage(*pImageSurface)); + } + } } class SalInstanceMenu : public weld::Menu @@ -555,21 +573,9 @@ public: } virtual void insert(int pos, const OUString& rId, const OUString& rStr, - const OUString* pIconName, VirtualDevice* pImageSurface) override + const OUString* pIconName, VirtualDevice* pImageSurface, bool bCheck) override { - const auto nCount = m_xMenu->GetItemCount(); - const sal_uInt16 nLastId = nCount ? m_xMenu->GetItemId(nCount-1) : 0; - const sal_uInt16 nNewid = nLastId + 1; - m_xMenu->InsertItem(nNewid, rStr, MenuItemBits::NONE, - OUStringToOString(rId, RTL_TEXTENCODING_UTF8), pos == -1 ? MENU_APPEND : pos); - if (pIconName) - { - m_xMenu->SetItemImage(nNewid, createImage(*pIconName)); - } - else if (pImageSurface) - { - m_xMenu->SetItemImage(nNewid, createImage(*pImageSurface)); - } + insert_to_menu(m_xMenu, pos, rId, rStr, pIconName, pImageSurface, bCheck); } virtual ~SalInstanceMenu() override @@ -1196,6 +1202,12 @@ public: return false; } + virtual void insert_item(int pos, const OUString& rId, const OUString& rStr, + const OUString* pIconName, VirtualDevice* pImageSurface, bool bCheck) override + { + insert_to_menu(m_xMenuButton->GetPopupMenu(), pos, rId, rStr, pIconName, pImageSurface, bCheck); + } + virtual void set_item_active(const OString& rIdent, bool bActive) override { PopupMenu* pMenu = m_xMenuButton->GetPopupMenu(); @@ -1616,6 +1628,7 @@ public: virtual void set_font(const vcl::Font& rFont) override { m_xEntry->SetFont(rFont); + m_xEntry->Invalidate(); } virtual void connect_cursor_position(const Link<Entry&, void>& rLink) override diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx index fa976af04dae..bd4fa42195a5 100644 --- a/vcl/unx/gtk3/gtk3gtkinst.cxx +++ b/vcl/unx/gtk3/gtk3gtkinst.cxx @@ -1594,6 +1594,43 @@ namespace } } +namespace +{ + GdkPixbuf* load_icon_by_name(const OUString& rIconName, const OUString& rIconTheme, const OUString& rUILang) + { + GdkPixbuf* pixbuf = nullptr; + auto xMemStm = ImageTree::get().getImageStream(rIconName, rIconTheme, rUILang); + if (xMemStm) + { + GdkPixbufLoader *pixbuf_loader = gdk_pixbuf_loader_new(); + gdk_pixbuf_loader_write(pixbuf_loader, static_cast<const guchar*>(xMemStm->GetData()), + xMemStm->Seek(STREAM_SEEK_TO_END), nullptr); + gdk_pixbuf_loader_close(pixbuf_loader, nullptr); + pixbuf = gdk_pixbuf_loader_get_pixbuf(pixbuf_loader); + if (pixbuf) + g_object_ref(pixbuf); + g_object_unref(pixbuf_loader); + } + return pixbuf; + } + + GdkPixbuf* load_icon_by_name(const OUString& rIconName) + { + OUString sIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme(); + OUString sUILang = Application::GetSettings().GetUILanguageTag().getBcp47(); + return load_icon_by_name(rIconName, sIconTheme, sUILang); + } + + GdkPixbuf* load_icon_from_surface(VirtualDevice& rDevice) + { + Size aSize(rDevice.GetOutputSizePixel()); + cairo_surface_t* surface = get_underlying_cairo_surface(rDevice); + double m_fXScale, m_fYScale; + cairo_surface_get_device_scale(surface, &m_fXScale, &m_fYScale); + return gdk_pixbuf_get_from_surface(surface, 0, 0, aSize.Width() * m_fXScale, aSize.Height() * m_fYScale); + } +} + class MenuHelper { protected: @@ -1653,6 +1690,47 @@ public: g_signal_handlers_unblock_by_func(a.second, reinterpret_cast<void*>(signalActivate), this); } + void insert_item(int pos, const OUString& rId, const OUString& rStr, + const OUString* pIconName, VirtualDevice* pImageSufface, + bool bCheck) + { + GtkWidget* pImage = nullptr; + if (pIconName) + { + GdkPixbuf* pixbuf = load_icon_by_name(*pIconName); + if (!pixbuf) + { + pImage = gtk_image_new_from_pixbuf(pixbuf); + g_object_unref(pixbuf); + } + } + else if (pImageSufface) + pImage = gtk_image_new_from_surface(get_underlying_cairo_surface(*pImageSufface)); + + GtkWidget *pItem; + if (pImage) + { + GtkWidget *pBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); + GtkWidget *pLabel = gtk_label_new(MapToGtkAccelerator(rStr).getStr()); + pItem = bCheck ? gtk_check_menu_item_new() : gtk_menu_item_new(); + gtk_container_add(GTK_CONTAINER(pBox), pImage); + gtk_container_add(GTK_CONTAINER(pBox), pLabel); + gtk_container_add(GTK_CONTAINER(pItem), pBox); + gtk_widget_show_all(pItem); + } + else + { + pItem = bCheck ? gtk_check_menu_item_new_with_label(MapToGtkAccelerator(rStr).getStr()) + : gtk_menu_item_new_with_label(MapToGtkAccelerator(rStr).getStr()); + } + gtk_buildable_set_name(GTK_BUILDABLE(pItem), OUStringToOString(rId, RTL_TEXTENCODING_UTF8).getStr()); + gtk_menu_shell_append(GTK_MENU_SHELL(m_pMenu), pItem); + gtk_widget_show(pItem); + add_to_map(GTK_MENU_ITEM(pItem)); + if (pos != -1) + gtk_menu_reorder_child(m_pMenu, pItem, pos); + } + void set_item_sensitive(const OString& rIdent, bool bSensitive) { gtk_widget_set_sensitive(GTK_WIDGET(m_aMap[rIdent]), bSensitive); @@ -1698,43 +1776,6 @@ public: } }; -namespace -{ - GdkPixbuf* load_icon_by_name(const OUString& rIconName, const OUString& rIconTheme, const OUString& rUILang) - { - GdkPixbuf* pixbuf = nullptr; - auto xMemStm = ImageTree::get().getImageStream(rIconName, rIconTheme, rUILang); - if (xMemStm) - { - GdkPixbufLoader *pixbuf_loader = gdk_pixbuf_loader_new(); - gdk_pixbuf_loader_write(pixbuf_loader, static_cast<const guchar*>(xMemStm->GetData()), - xMemStm->Seek(STREAM_SEEK_TO_END), nullptr); - gdk_pixbuf_loader_close(pixbuf_loader, nullptr); - pixbuf = gdk_pixbuf_loader_get_pixbuf(pixbuf_loader); - if (pixbuf) - g_object_ref(pixbuf); - g_object_unref(pixbuf_loader); - } - return pixbuf; - } - - GdkPixbuf* load_icon_by_name(const OUString& rIconName) - { - OUString sIconTheme = Application::GetSettings().GetStyleSettings().DetermineIconTheme(); - OUString sUILang = Application::GetSettings().GetUILanguageTag().getBcp47(); - return load_icon_by_name(rIconName, sIconTheme, sUILang); - } - - GdkPixbuf* load_icon_from_surface(VirtualDevice& rDevice) - { - Size aSize(rDevice.GetOutputSizePixel()); - cairo_surface_t* surface = get_underlying_cairo_surface(rDevice); - double m_fXScale, m_fYScale; - cairo_surface_get_device_scale(surface, &m_fXScale, &m_fYScale); - return gdk_pixbuf_get_from_surface(surface, 0, 0, aSize.Width() * m_fXScale, aSize.Height() * m_fYScale); - } -} - class GtkInstanceMenu : public MenuHelper, public virtual weld::Menu { protected: @@ -1833,7 +1874,8 @@ public: } virtual void insert(int pos, const OUString& rId, const OUString& rStr, - const OUString* pIconName, VirtualDevice* pImageSufface) override + const OUString* pIconName, VirtualDevice* pImageSufface, + bool bCheck) override { GtkWidget* pImage = nullptr; if (pIconName) @@ -1853,14 +1895,17 @@ public: { GtkWidget *pBox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6); GtkWidget *pLabel = gtk_label_new(MapToGtkAccelerator(rStr).getStr()); - pItem = gtk_menu_item_new(); + pItem = bCheck ? gtk_check_menu_item_new() : gtk_menu_item_new(); gtk_container_add(GTK_CONTAINER(pBox), pImage); gtk_container_add(GTK_CONTAINER(pBox), pLabel); gtk_container_add(GTK_CONTAINER(pItem), pBox); gtk_widget_show_all(pItem); } else - pItem = gtk_menu_item_new_with_label(MapToGtkAccelerator(rStr).getStr()); + { + pItem = bCheck ? gtk_check_menu_item_new_with_label(MapToGtkAccelerator(rStr).getStr()) + : gtk_menu_item_new_with_label(MapToGtkAccelerator(rStr).getStr()); + } gtk_buildable_set_name(GTK_BUILDABLE(pItem), OUStringToOString(rId, RTL_TEXTENCODING_UTF8).getStr()); gtk_menu_shell_append(GTK_MENU_SHELL(m_pMenu), pItem); gtk_widget_show(pItem); @@ -3256,6 +3301,12 @@ public: gtk_image_set_from_surface(m_pImage, nullptr); } + virtual void insert_item(int pos, const OUString& rId, const OUString& rStr, + const OUString* pIconName, VirtualDevice* pImageSufface, bool bCheck) override + { + MenuHelper::insert_item(pos, rId, rStr, pIconName, pImageSufface, bCheck); + } + virtual void set_item_active(const OString& rIdent, bool bActive) override { MenuHelper::set_item_active(rIdent, bActive); |