[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