[Xfce4-commits] [panel-plugins/xfce4-whiskermenu-plugin] 04/10: Add icon view.
noreply at xfce.org
noreply at xfce.org
Tue Dec 31 11:39:53 CET 2019
This is an automated email from the git hooks/post-receive script.
g o t t c o d e p u s h e d a c o m m i t t o b r a n c h m a s t e r
in repository panel-plugins/xfce4-whiskermenu-plugin.
commit 69ef471b25fbeb32aa543adae02de6874f64b665
Author: Graeme Gott <graeme at gottcode.org>
Date: Wed Dec 18 17:52:08 2019 -0500
Add icon view.
---
panel-plugin/CMakeLists.txt | 1 +
panel-plugin/launcher-icon-view.cpp | 277 ++++++++++++++++++++++++++++++++++++
panel-plugin/launcher-icon-view.h | 72 ++++++++++
panel-plugin/page.cpp | 1 +
panel-plugin/page.h | 5 +
5 files changed, 356 insertions(+)
diff --git a/panel-plugin/CMakeLists.txt b/panel-plugin/CMakeLists.txt
index cce0447..bd9e181 100644
--- a/panel-plugin/CMakeLists.txt
+++ b/panel-plugin/CMakeLists.txt
@@ -78,6 +78,7 @@ add_library(whiskermenu MODULE
favorites-page.cpp
icon-size.cpp
launcher.cpp
+ launcher-icon-view.cpp
launcher-tree-view.cpp
page.cpp
plugin.cpp
diff --git a/panel-plugin/launcher-icon-view.cpp b/panel-plugin/launcher-icon-view.cpp
new file mode 100644
index 0000000..4e451cc
--- /dev/null
+++ b/panel-plugin/launcher-icon-view.cpp
@@ -0,0 +1,277 @@
+/*
+ * Copyright (C) 2019 Graeme Gott <graeme at gottcode.org>
+ *
+ * This library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "launcher-icon-view.h"
+
+#include "settings.h"
+#include "slot.h"
+
+#include <exo/exo.h>
+
+using namespace WhiskerMenu;
+
+//-----------------------------------------------------------------------------
+
+LauncherIconView::LauncherIconView() :
+ m_icon_renderer(NULL),
+ m_icon_size(-1)
+{
+ // Create the view
+ m_view = GTK_ICON_VIEW(gtk_icon_view_new());
+
+ m_icon_renderer = exo_cell_renderer_icon_new();
+ g_object_set(m_icon_renderer,
+ "follow-state", false,
+ "xalign", 0.5,
+ "yalign", 1.0,
+ NULL);
+ GtkCellLayout* cell_layout = GTK_CELL_LAYOUT(m_view);
+ gtk_cell_layout_pack_start(cell_layout, m_icon_renderer, false);
+ gtk_cell_layout_set_attributes(cell_layout, m_icon_renderer, "icon", COLUMN_ICON, NULL);
+
+ gtk_icon_view_set_markup_column(m_view, COLUMN_TEXT);
+
+ reload_icon_size();
+
+ // Use single clicks to activate items
+ gtk_icon_view_set_activate_on_single_click(m_view, true);
+
+ // Only allow up to one selected item
+ gtk_icon_view_set_selection_mode(m_view, GTK_SELECTION_SINGLE);
+
+ g_object_ref_sink(m_view);
+}
+
+//-----------------------------------------------------------------------------
+
+LauncherIconView::~LauncherIconView()
+{
+ gtk_widget_destroy(GTK_WIDGET(m_view));
+ g_object_unref(m_view);
+}
+
+//-----------------------------------------------------------------------------
+
+GtkTreePath* LauncherIconView::get_cursor() const
+{
+ GtkTreePath* path = NULL;
+ gtk_icon_view_get_cursor(m_view, &path, NULL);
+ return path;
+}
+
+//-----------------------------------------------------------------------------
+
+GtkTreePath* LauncherIconView::get_path_at_pos(int x, int y) const
+{
+ return gtk_icon_view_get_path_at_pos(m_view, x, y);
+}
+
+//-----------------------------------------------------------------------------
+
+GtkTreePath* LauncherIconView::get_selected_path() const
+{
+ GtkTreePath* path = NULL;
+ GList* selection = gtk_icon_view_get_selected_items(m_view);
+ if (selection != NULL)
+ {
+ path = gtk_tree_path_copy(reinterpret_cast<GtkTreePath*>(selection->data));
+ }
+ g_list_free_full(selection, (GDestroyNotify)gtk_tree_path_free);
+ return path;
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::activate_path(GtkTreePath* path)
+{
+ gtk_icon_view_item_activated(m_view, path);
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::scroll_to_path(GtkTreePath* path)
+{
+ gtk_icon_view_scroll_to_path(m_view, path, true, 0.5f, 0.5f);
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::select_path(GtkTreePath* path)
+{
+ gtk_icon_view_select_path(m_view, path);
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::set_cursor(GtkTreePath* path)
+{
+ gtk_icon_view_set_cursor(m_view,path, NULL, false);
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::set_fixed_height_mode(bool)
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::set_selection_mode(GtkSelectionMode mode)
+{
+ gtk_icon_view_set_selection_mode(m_view, mode);
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::hide_tooltips()
+{
+ gtk_icon_view_set_tooltip_column(m_view, -1);
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::show_tooltips()
+{
+ gtk_icon_view_set_tooltip_column(m_view, COLUMN_TOOLTIP);
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::clear_selection()
+{
+ gtk_icon_view_unselect_all(m_view);
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::collapse_all()
+{
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::set_model(GtkTreeModel* model)
+{
+ m_model = model;
+ gtk_icon_view_set_model(m_view, model);
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::unset_model()
+{
+ m_model = NULL;
+ gtk_icon_view_set_model(m_view, NULL);
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::set_drag_source(GdkModifierType start_button_mask, const GtkTargetEntry* targets, gint n_targets, GdkDragAction actions)
+{
+ gtk_icon_view_enable_model_drag_source(m_view, start_button_mask, targets, n_targets, actions);
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::set_drag_dest(const GtkTargetEntry* targets, gint n_targets, GdkDragAction actions)
+{
+ gtk_icon_view_enable_model_drag_dest(m_view, targets, n_targets, actions);
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::unset_drag_source()
+{
+ gtk_icon_view_unset_model_drag_source(m_view);
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::unset_drag_dest()
+{
+ gtk_icon_view_unset_model_drag_dest(m_view);
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherIconView::reload_icon_size()
+{
+ // Fetch icon size
+ if (m_icon_size == wm_settings->launcher_icon_size.get_size())
+ {
+ return;
+ }
+ m_icon_size = wm_settings->launcher_icon_size.get_size();
+
+ // Configure icon renderer
+ if (m_icon_size > 1)
+ {
+ g_object_set(m_icon_renderer, "size", m_icon_size, "visible", true, NULL);
+ }
+ else
+ {
+ g_object_set(m_icon_renderer, "visible", false, NULL);
+ }
+
+ // Adjust item size
+ int padding = 2;
+ int width = 88;
+ switch (wm_settings->launcher_icon_size)
+ {
+ case IconSize::Smallest:
+ padding = 2;
+ width = 88;
+ break;
+
+ case IconSize::Smaller:
+ padding = 2;
+ width = 92;
+ break;
+
+ case IconSize::Small:
+ padding = 4;
+ width = 100;
+ break;
+
+ case IconSize::Normal:
+ padding = 4;
+ width = 108;
+ break;
+
+ case IconSize::Large:
+ padding = 4;
+ width = 116;
+ break;
+
+ case IconSize::Larger:
+ padding = 6;
+ width = 136;
+ break;
+
+ case IconSize::Largest:
+ padding = 6;
+ width = 152;
+ break;
+
+ default:
+ break;
+ }
+ gtk_icon_view_set_item_padding(m_view, padding);
+ gtk_icon_view_set_item_width(m_view, width);
+}
+
+//-----------------------------------------------------------------------------
diff --git a/panel-plugin/launcher-icon-view.h b/panel-plugin/launcher-icon-view.h
new file mode 100644
index 0000000..b810000
--- /dev/null
+++ b/panel-plugin/launcher-icon-view.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2019 Graeme Gott <graeme at gottcode.org>
+ *
+ * This library is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef WHISKERMENU_LAUNCHER_ICON_VIEW_H
+#define WHISKERMENU_LAUNCHER_ICON_VIEW_H
+
+#include "launcher-view.h"
+
+namespace WhiskerMenu
+{
+
+class LauncherIconView : public LauncherView
+{
+public:
+ LauncherIconView();
+ ~LauncherIconView();
+
+ GtkWidget* get_widget() const
+ {
+ return GTK_WIDGET(m_view);
+ }
+
+ GtkTreePath* get_cursor() const;
+ GtkTreePath* get_path_at_pos(int x, int y) const;
+ GtkTreePath* get_selected_path() const;
+ void activate_path(GtkTreePath* path);
+ void scroll_to_path(GtkTreePath* path);
+ void select_path(GtkTreePath* path);
+ void set_cursor(GtkTreePath* path);
+
+ void set_fixed_height_mode(bool fixed_height);
+ void set_selection_mode(GtkSelectionMode mode);
+
+ void hide_tooltips();
+ void show_tooltips();
+
+ void clear_selection();
+ void collapse_all();
+
+ void set_model(GtkTreeModel* model);
+ void unset_model();
+
+ void set_drag_source(GdkModifierType start_button_mask, const GtkTargetEntry* targets, gint n_targets, GdkDragAction actions);
+ void set_drag_dest(const GtkTargetEntry* targets, gint n_targets, GdkDragAction actions);
+ void unset_drag_source();
+ void unset_drag_dest();
+
+ void reload_icon_size();
+
+private:
+ GtkIconView* m_view;
+ GtkCellRenderer* m_icon_renderer;
+ int m_icon_size;
+};
+
+}
+
+#endif // WHISKERMENU_LAUNCHER_ICON_VIEW_H
diff --git a/panel-plugin/page.cpp b/panel-plugin/page.cpp
index a48b107..732d901 100644
--- a/panel-plugin/page.cpp
+++ b/panel-plugin/page.cpp
@@ -19,6 +19,7 @@
#include "favorites-page.h"
#include "launcher.h"
+#include "launcher-icon-view.h"
#include "launcher-tree-view.h"
#include "recent-page.h"
#include "slot.h"
diff --git a/panel-plugin/page.h b/panel-plugin/page.h
index a38b17d..27c90da 100644
--- a/panel-plugin/page.h
+++ b/panel-plugin/page.h
@@ -78,6 +78,11 @@ private:
void create_context_menu(GtkTreePath* path, GdkEvent* event);
virtual void extend_context_menu(GtkWidget* menu);
+ static void item_activated_slot(GtkIconView*, GtkTreePath* path, gpointer user_data)
+ {
+ reinterpret_cast<Page*>(user_data)->launcher_activated(path);
+ }
+
static void row_activated_slot(GtkTreeView*, GtkTreePath* path, GtkTreeViewColumn*, gpointer user_data)
{
reinterpret_cast<Page*>(user_data)->launcher_activated(path);
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list