[Xfce4-commits] [panel-plugins/xfce4-whiskermenu-plugin] 03/10: Add interface for LauncherView.

noreply at xfce.org noreply at xfce.org
Tue Dec 31 11:39:52 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 7369ad8d1f6f55657f98f5f56df6cafc4aeda8bb
Author: Graeme Gott <graeme at gottcode.org>
Date:   Wed Dec 18 11:53:14 2019 -0500

    Add interface for LauncherView.
---
 panel-plugin/CMakeLists.txt                        |  2 +-
 panel-plugin/favorites-page.cpp                    |  9 ++-
 panel-plugin/favorites-page.h                      |  3 +-
 .../{launcher-view.cpp => launcher-tree-view.cpp}  | 85 ++++++++++++----------
 .../{launcher-view.h => launcher-tree-view.h}      | 30 ++------
 panel-plugin/launcher-view.h                       | 64 +++++++---------
 panel-plugin/page.cpp                              | 39 +++++-----
 panel-plugin/page.h                                | 14 +++-
 panel-plugin/search-page.cpp                       | 11 ++-
 panel-plugin/search-page.h                         |  3 +-
 10 files changed, 137 insertions(+), 123 deletions(-)

diff --git a/panel-plugin/CMakeLists.txt b/panel-plugin/CMakeLists.txt
index d0825bd..cce0447 100644
--- a/panel-plugin/CMakeLists.txt
+++ b/panel-plugin/CMakeLists.txt
@@ -78,7 +78,7 @@ add_library(whiskermenu MODULE
 	favorites-page.cpp
 	icon-size.cpp
 	launcher.cpp
-	launcher-view.cpp
+	launcher-tree-view.cpp
 	page.cpp
 	plugin.cpp
 	profile-picture.cpp
diff --git a/panel-plugin/favorites-page.cpp b/panel-plugin/favorites-page.cpp
index 89d57b8..8512e24 100644
--- a/panel-plugin/favorites-page.cpp
+++ b/panel-plugin/favorites-page.cpp
@@ -35,7 +35,7 @@ using namespace WhiskerMenu;
 FavoritesPage::FavoritesPage(Window* window) :
 	Page(window)
 {
-	set_reorderable(true);
+	view_created();
 }
 
 //-----------------------------------------------------------------------------
@@ -275,3 +275,10 @@ void FavoritesPage::sort_descending()
 }
 
 //-----------------------------------------------------------------------------
+
+void FavoritesPage::view_created()
+{
+	set_reorderable(true);
+}
+
+//-----------------------------------------------------------------------------
diff --git a/panel-plugin/favorites-page.h b/panel-plugin/favorites-page.h
index e8be1f6..16f19b2 100644
--- a/panel-plugin/favorites-page.h
+++ b/panel-plugin/favorites-page.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013 Graeme Gott <graeme at gottcode.org>
+ * Copyright (C) 2013, 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
@@ -47,6 +47,7 @@ private:
 	void sort(std::vector<Launcher*>& items) const;
 	void sort_ascending();
 	void sort_descending();
+	void view_created();
 };
 
 }
diff --git a/panel-plugin/launcher-view.cpp b/panel-plugin/launcher-tree-view.cpp
similarity index 76%
rename from panel-plugin/launcher-view.cpp
rename to panel-plugin/launcher-tree-view.cpp
index 42a0bf1..347302f 100644
--- a/panel-plugin/launcher-view.cpp
+++ b/panel-plugin/launcher-tree-view.cpp
@@ -15,7 +15,7 @@
  * along with this library.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include "launcher-view.h"
+#include "launcher-tree-view.h"
 
 #include "category.h"
 #include "settings.h"
@@ -37,8 +37,7 @@ static gboolean is_separator(GtkTreeModel* model, GtkTreeIter* iter, gpointer)
 
 //-----------------------------------------------------------------------------
 
-LauncherView::LauncherView() :
-	m_model(NULL),
+LauncherTreeView::LauncherTreeView() :
 	m_icon_size(0),
 	m_row_activated(false)
 {
@@ -51,8 +50,8 @@ LauncherView::LauncherView() :
 	gtk_tree_view_set_fixed_height_mode(m_view, true);
 	gtk_tree_view_set_row_separator_func(m_view, &is_separator, NULL, NULL);
 	create_column();
-	g_signal_connect_slot(m_view, "key-press-event", &LauncherView::on_key_press_event, this);
-	g_signal_connect_slot(m_view, "key-release-event", &LauncherView::on_key_release_event, this);
+	g_signal_connect_slot(m_view, "key-press-event", &LauncherTreeView::on_key_press_event, this);
+	g_signal_connect_slot(m_view, "key-release-event", &LauncherTreeView::on_key_release_event, this);
 
 	// Use single clicks to activate items
 	exo_tree_view_set_single_click(EXO_TREE_VIEW(m_view), true);
@@ -64,25 +63,23 @@ LauncherView::LauncherView() :
 	g_object_ref_sink(m_view);
 
 	// Handle drag-and-drop
-	g_signal_connect_slot(m_view, "button-press-event", &LauncherView::on_button_press_event, this);
-	g_signal_connect_slot(m_view, "row-activated", &LauncherView::on_row_activated, this);
-	g_signal_connect_slot<GtkTreeView*,GtkTreeIter*,GtkTreePath*>(m_view, "test-collapse-row", &LauncherView::test_row_toggle, this);
-	g_signal_connect_slot<GtkTreeView*,GtkTreeIter*,GtkTreePath*>(m_view, "test-expand-row", &LauncherView::test_row_toggle, this);
+	g_signal_connect_slot(m_view, "button-press-event", &LauncherTreeView::on_button_press_event, this);
+	g_signal_connect_slot(m_view, "row-activated", &LauncherTreeView::on_row_activated, this);
+	g_signal_connect_slot<GtkTreeView*,GtkTreeIter*,GtkTreePath*>(m_view, "test-collapse-row", &LauncherTreeView::test_row_toggle, this);
+	g_signal_connect_slot<GtkTreeView*,GtkTreeIter*,GtkTreePath*>(m_view, "test-expand-row", &LauncherTreeView::test_row_toggle, this);
 }
 
 //-----------------------------------------------------------------------------
 
-LauncherView::~LauncherView()
+LauncherTreeView::~LauncherTreeView()
 {
-	m_model = NULL;
-
 	gtk_widget_destroy(GTK_WIDGET(m_view));
 	g_object_unref(m_view);
 }
 
 //-----------------------------------------------------------------------------
 
-GtkTreePath* LauncherView::get_cursor() const
+GtkTreePath* LauncherTreeView::get_cursor() const
 {
 	GtkTreePath* path = NULL;
 	gtk_tree_view_get_cursor(m_view, &path, NULL);
@@ -91,7 +88,7 @@ GtkTreePath* LauncherView::get_cursor() const
 
 //-----------------------------------------------------------------------------
 
-GtkTreePath* LauncherView::get_path_at_pos(int x, int y) const
+GtkTreePath* LauncherTreeView::get_path_at_pos(int x, int y) const
 {
 	GtkTreePath* path = NULL;
 	gtk_tree_view_get_path_at_pos(m_view, x, y, &path, NULL, NULL, NULL);
@@ -100,7 +97,7 @@ GtkTreePath* LauncherView::get_path_at_pos(int x, int y) const
 
 //-----------------------------------------------------------------------------
 
-GtkTreePath* LauncherView::get_selected_path() const
+GtkTreePath* LauncherTreeView::get_selected_path() const
 {
 	GtkTreePath* path = NULL;
 	GtkTreeSelection* selection = gtk_tree_view_get_selection(m_view);
@@ -114,7 +111,7 @@ GtkTreePath* LauncherView::get_selected_path() const
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::activate_path(GtkTreePath* path)
+void LauncherTreeView::activate_path(GtkTreePath* path)
 {
 	GtkTreeViewColumn* column = gtk_tree_view_get_column(m_view, 0);
 	gtk_tree_view_row_activated(m_view, path, column);
@@ -122,14 +119,14 @@ void LauncherView::activate_path(GtkTreePath* path)
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::scroll_to_path(GtkTreePath* path)
+void LauncherTreeView::scroll_to_path(GtkTreePath* path)
 {
 	gtk_tree_view_scroll_to_cell(m_view, path, NULL, true, 0.5f, 0.5f);
 }
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::select_path(GtkTreePath* path)
+void LauncherTreeView::select_path(GtkTreePath* path)
 {
 	GtkTreeSelection* selection = gtk_tree_view_get_selection(m_view);
 	gtk_tree_selection_select_path(selection, path);
@@ -137,7 +134,7 @@ void LauncherView::select_path(GtkTreePath* path)
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::set_cursor(GtkTreePath* path)
+void LauncherTreeView::set_cursor(GtkTreePath* path)
 {
 	GtkTreeSelection* selection = gtk_tree_view_get_selection(m_view);
 	GtkSelectionMode mode = gtk_tree_selection_get_mode(selection);
@@ -148,14 +145,14 @@ void LauncherView::set_cursor(GtkTreePath* path)
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::set_fixed_height_mode(bool fixed_height)
+void LauncherTreeView::set_fixed_height_mode(bool fixed_height)
 {
 	gtk_tree_view_set_fixed_height_mode(m_view, fixed_height);
 }
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::set_selection_mode(GtkSelectionMode mode)
+void LauncherTreeView::set_selection_mode(GtkSelectionMode mode)
 {
 	GtkTreeSelection* selection = gtk_tree_view_get_selection(m_view);
 	gtk_tree_selection_set_mode(selection, mode);
@@ -163,28 +160,36 @@ void LauncherView::set_selection_mode(GtkSelectionMode mode)
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::hide_tooltips()
+void LauncherTreeView::hide_tooltips()
 {
 	gtk_tree_view_set_tooltip_column(m_view, -1);
 }
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::show_tooltips()
+void LauncherTreeView::show_tooltips()
+{
+	gtk_tree_view_set_tooltip_column(m_view, COLUMN_TOOLTIP);
+}
+
+//-----------------------------------------------------------------------------
+
+void LauncherTreeView::clear_selection()
 {
-	gtk_tree_view_set_tooltip_column(m_view, LauncherView::COLUMN_TOOLTIP);
+	GtkTreeSelection* selection = gtk_tree_view_get_selection(m_view);
+	gtk_tree_selection_unselect_all(selection);
 }
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::collapse_all()
+void LauncherTreeView::collapse_all()
 {
 	gtk_tree_view_collapse_all(m_view);
 }
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::set_model(GtkTreeModel* model)
+void LauncherTreeView::set_model(GtkTreeModel* model)
 {
 	m_model = model;
 	gtk_tree_view_set_model(m_view, model);
@@ -192,7 +197,7 @@ void LauncherView::set_model(GtkTreeModel* model)
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::unset_model()
+void LauncherTreeView::unset_model()
 {
 	m_model = NULL;
 	gtk_tree_view_set_model(m_view, NULL);
@@ -200,35 +205,35 @@ void LauncherView::unset_model()
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::set_drag_source(GdkModifierType start_button_mask, const GtkTargetEntry* targets, gint n_targets, GdkDragAction actions)
+void LauncherTreeView::set_drag_source(GdkModifierType start_button_mask, const GtkTargetEntry* targets, gint n_targets, GdkDragAction actions)
 {
 	gtk_tree_view_enable_model_drag_source(m_view, start_button_mask, targets, n_targets, actions);
 }
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::set_drag_dest(const GtkTargetEntry* targets, gint n_targets, GdkDragAction actions)
+void LauncherTreeView::set_drag_dest(const GtkTargetEntry* targets, gint n_targets, GdkDragAction actions)
 {
 	gtk_tree_view_enable_model_drag_dest(m_view, targets, n_targets, actions);
 }
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::unset_drag_source()
+void LauncherTreeView::unset_drag_source()
 {
 	gtk_tree_view_unset_rows_drag_source(m_view);
 }
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::unset_drag_dest()
+void LauncherTreeView::unset_drag_dest()
 {
 	gtk_tree_view_unset_rows_drag_dest(m_view);
 }
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::reload_icon_size()
+void LauncherTreeView::reload_icon_size()
 {
 	// Force exo to reload SVG icons
 	if (m_icon_size != wm_settings->launcher_icon_size.get_size())
@@ -240,7 +245,7 @@ void LauncherView::reload_icon_size()
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::create_column()
+void LauncherTreeView::create_column()
 {
 	m_icon_size = wm_settings->launcher_icon_size.get_size();
 
@@ -254,13 +259,13 @@ void LauncherView::create_column()
 		g_object_set(icon_renderer, "follow-state", false, NULL);
 		g_object_set(icon_renderer, "size", m_icon_size, NULL);
 		gtk_tree_view_column_pack_start(m_column, icon_renderer, false);
-		gtk_tree_view_column_add_attribute(m_column, icon_renderer, "icon", LauncherView::COLUMN_ICON);
+		gtk_tree_view_column_add_attribute(m_column, icon_renderer, "icon", COLUMN_ICON);
 	}
 
 	GtkCellRenderer* text_renderer = gtk_cell_renderer_text_new();
 	g_object_set(text_renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
 	gtk_tree_view_column_pack_start(m_column, text_renderer, true);
-	gtk_tree_view_column_add_attribute(m_column, text_renderer, "markup", LauncherView::COLUMN_TEXT);
+	gtk_tree_view_column_add_attribute(m_column, text_renderer, "markup", COLUMN_TEXT);
 
 	gtk_tree_view_column_set_sizing(m_column, GTK_TREE_VIEW_COLUMN_FIXED);
 
@@ -269,7 +274,7 @@ void LauncherView::create_column()
 
 //-----------------------------------------------------------------------------
 
-gboolean LauncherView::on_key_press_event(GtkWidget*, GdkEvent* event)
+gboolean LauncherTreeView::on_key_press_event(GtkWidget*, GdkEvent* event)
 {
 	GdkEventKey* key_event = reinterpret_cast<GdkEventKey*>(event);
 	if ((key_event->keyval == GDK_KEY_Up) || (key_event->keyval == GDK_KEY_Down))
@@ -281,7 +286,7 @@ gboolean LauncherView::on_key_press_event(GtkWidget*, GdkEvent* event)
 
 //-----------------------------------------------------------------------------
 
-gboolean LauncherView::on_key_release_event(GtkWidget*, GdkEvent* event)
+gboolean LauncherTreeView::on_key_release_event(GtkWidget*, GdkEvent* event)
 {
 	GdkEventKey* key_event = reinterpret_cast<GdkEventKey*>(event);
 	if ((key_event->keyval == GDK_KEY_Up) || (key_event->keyval == GDK_KEY_Down))
@@ -293,7 +298,7 @@ gboolean LauncherView::on_key_release_event(GtkWidget*, GdkEvent* event)
 
 //-----------------------------------------------------------------------------
 
-gboolean LauncherView::on_button_press_event(GtkWidget*, GdkEvent*)
+gboolean LauncherTreeView::on_button_press_event(GtkWidget*, GdkEvent*)
 {
 	m_row_activated = false;
 
@@ -302,7 +307,7 @@ gboolean LauncherView::on_button_press_event(GtkWidget*, GdkEvent*)
 
 //-----------------------------------------------------------------------------
 
-void LauncherView::on_row_activated(GtkTreeView* tree_view, GtkTreePath* path, GtkTreeViewColumn*)
+void LauncherTreeView::on_row_activated(GtkTreeView* tree_view, GtkTreePath* path, GtkTreeViewColumn*)
 {
 	Element* element = NULL;
 	GtkTreeIter iter;
@@ -327,7 +332,7 @@ void LauncherView::on_row_activated(GtkTreeView* tree_view, GtkTreePath* path, G
 
 //-----------------------------------------------------------------------------
 
-gboolean LauncherView::test_row_toggle()
+gboolean LauncherTreeView::test_row_toggle()
 {
 	bool allow = !m_row_activated;
 	m_row_activated = false;
diff --git a/panel-plugin/launcher-view.h b/panel-plugin/launcher-tree-view.h
similarity index 84%
copy from panel-plugin/launcher-view.h
copy to panel-plugin/launcher-tree-view.h
index 95c28a4..4c0a30f 100644
--- a/panel-plugin/launcher-view.h
+++ b/panel-plugin/launcher-tree-view.h
@@ -15,19 +15,19 @@
  * along with this library.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#ifndef WHISKERMENU_LAUNCHER_VIEW_H
-#define WHISKERMENU_LAUNCHER_VIEW_H
+#ifndef WHISKERMENU_LAUNCHER_TREE_VIEW_H
+#define WHISKERMENU_LAUNCHER_TREE_VIEW_H
 
-#include <gtk/gtk.h>
+#include "launcher-view.h"
 
 namespace WhiskerMenu
 {
 
-class LauncherView
+class LauncherTreeView : public LauncherView
 {
 public:
-	LauncherView();
-	~LauncherView();
+	LauncherTreeView();
+	~LauncherTreeView();
 
 	GtkWidget* get_widget() const
 	{
@@ -48,13 +48,9 @@ public:
 	void hide_tooltips();
 	void show_tooltips();
 
+	void clear_selection();
 	void collapse_all();
 
-	GtkTreeModel* get_model() const
-	{
-		return m_model;
-	}
-
 	void set_model(GtkTreeModel* model);
 	void unset_model();
 
@@ -65,15 +61,6 @@ public:
 
 	void reload_icon_size();
 
-	enum Columns
-	{
-		COLUMN_ICON = 0,
-		COLUMN_TEXT,
-		COLUMN_TOOLTIP,
-		COLUMN_LAUNCHER,
-		N_COLUMNS
-	};
-
 private:
 	void create_column();
 	gboolean on_key_press_event(GtkWidget*, GdkEvent* event);
@@ -83,7 +70,6 @@ private:
 	gboolean test_row_toggle();
 
 private:
-	GtkTreeModel* m_model;
 	GtkTreeView* m_view;
 	GtkTreeViewColumn* m_column;
 	int m_icon_size;
@@ -92,4 +78,4 @@ private:
 
 }
 
-#endif // WHISKERMENU_LAUNCHER_VIEW_H
+#endif // WHISKERMENU_LAUNCHER_TREE_VIEW_H
diff --git a/panel-plugin/launcher-view.h b/panel-plugin/launcher-view.h
index 95c28a4..976f686 100644
--- a/panel-plugin/launcher-view.h
+++ b/panel-plugin/launcher-view.h
@@ -26,44 +26,48 @@ namespace WhiskerMenu
 class LauncherView
 {
 public:
-	LauncherView();
-	~LauncherView();
+	LauncherView() :
+		m_model(NULL)
+	{
+	}
 
-	GtkWidget* get_widget() const
+	virtual ~LauncherView()
 	{
-		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);
+	virtual GtkWidget* get_widget() const=0;
 
-	void set_fixed_height_mode(bool fixed_height);
-	void set_selection_mode(GtkSelectionMode mode);
+	virtual GtkTreePath* get_cursor() const=0;
+	virtual GtkTreePath* get_path_at_pos(int x, int y) const=0;
+	virtual GtkTreePath* get_selected_path() const=0;
+	virtual void activate_path(GtkTreePath* path)=0;
+	virtual void scroll_to_path(GtkTreePath* path)=0;
+	virtual void select_path(GtkTreePath* path)=0;
+	virtual void set_cursor(GtkTreePath* path)=0;
 
-	void hide_tooltips();
-	void show_tooltips();
+	virtual void set_fixed_height_mode(bool fixed_height)=0;
+	virtual void set_selection_mode(GtkSelectionMode mode)=0;
 
-	void collapse_all();
+	virtual void hide_tooltips()=0;
+	virtual void show_tooltips()=0;
+
+	virtual void clear_selection()=0;
+	virtual void collapse_all()=0;
 
 	GtkTreeModel* get_model() const
 	{
 		return m_model;
 	}
 
-	void set_model(GtkTreeModel* model);
-	void unset_model();
+	virtual void set_model(GtkTreeModel* model)=0;
+	virtual void unset_model()=0;
 
-	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();
+	virtual void set_drag_source(GdkModifierType start_button_mask, const GtkTargetEntry* targets, gint n_targets, GdkDragAction actions)=0;
+	virtual void set_drag_dest(const GtkTargetEntry* targets, gint n_targets, GdkDragAction actions)=0;
+	virtual void unset_drag_source()=0;
+	virtual void unset_drag_dest()=0;
 
-	void reload_icon_size();
+	virtual void reload_icon_size()=0;
 
 	enum Columns
 	{
@@ -74,20 +78,8 @@ public:
 		N_COLUMNS
 	};
 
-private:
-	void create_column();
-	gboolean on_key_press_event(GtkWidget*, GdkEvent* event);
-	gboolean on_key_release_event(GtkWidget*, GdkEvent* event);
-	gboolean on_button_press_event(GtkWidget*, GdkEvent* event);
-	void on_row_activated(GtkTreeView* tree_view, GtkTreePath* path, GtkTreeViewColumn* column);
-	gboolean test_row_toggle();
-
-private:
+protected:
 	GtkTreeModel* m_model;
-	GtkTreeView* m_view;
-	GtkTreeViewColumn* m_column;
-	int m_icon_size;
-	bool m_row_activated;
 };
 
 }
diff --git a/panel-plugin/page.cpp b/panel-plugin/page.cpp
index 3b84091..a48b107 100644
--- a/panel-plugin/page.cpp
+++ b/panel-plugin/page.cpp
@@ -19,7 +19,7 @@
 
 #include "favorites-page.h"
 #include "launcher.h"
-#include "launcher-view.h"
+#include "launcher-tree-view.h"
 #include "recent-page.h"
 #include "slot.h"
 #include "window.h"
@@ -40,14 +40,7 @@ Page::Page(Window* window) :
 	m_reorderable(false)
 {
 	// Create view
-	m_view = new LauncherView();
-	g_signal_connect_slot(m_view->get_widget(), "button-press-event", &Page::view_button_press_event, this);
-	g_signal_connect_slot(m_view->get_widget(), "button-release-event", &Page::view_button_release_event, this);
-	g_signal_connect_slot(m_view->get_widget(), "drag-data-get", &Page::view_drag_data_get, this);
-	g_signal_connect_slot(m_view->get_widget(), "drag-end", &Page::view_drag_end, this);
-	g_signal_connect_slot(m_view->get_widget(), "popup-menu", &Page::view_popup_menu_event, this);
-	g_signal_connect_slot(m_view->get_widget(), "row-activated", &Page::item_activated, this);
-	g_signal_connect_swapped(m_view->get_widget(), "start-interactive-search", G_CALLBACK(gtk_widget_grab_focus), m_window->get_search_entry());
+	create_view();
 
 	// Add scrolling to view
 	m_widget = gtk_scrolled_window_new(NULL, NULL);
@@ -124,6 +117,21 @@ void Page::set_reorderable(bool reorderable)
 
 //-----------------------------------------------------------------------------
 
+void Page::create_view()
+{
+	m_view = new LauncherTreeView();
+	g_signal_connect(m_view->get_widget(), "row-activated", G_CALLBACK(&Page::row_activated_slot), this);
+	g_signal_connect_swapped(m_view->get_widget(), "start-interactive-search", G_CALLBACK(gtk_widget_grab_focus), m_window->get_search_entry());
+	g_signal_connect_slot(m_view->get_widget(), "button-press-event", &Page::view_button_press_event, this);
+	g_signal_connect_slot(m_view->get_widget(), "button-release-event", &Page::view_button_release_event, this);
+	g_signal_connect_slot(m_view->get_widget(), "drag-data-get", &Page::view_drag_data_get, this);
+	g_signal_connect_slot(m_view->get_widget(), "drag-end", &Page::view_drag_end, this);
+	g_signal_connect_slot(m_view->get_widget(), "popup-menu", &Page::view_popup_menu_event, this);
+	set_reorderable(m_reorderable);
+}
+
+//-----------------------------------------------------------------------------
+
 bool Page::remember_launcher(Launcher*)
 {
 	return true;
@@ -131,10 +139,10 @@ bool Page::remember_launcher(Launcher*)
 
 //-----------------------------------------------------------------------------
 
-void Page::item_activated(GtkTreeView* view, GtkTreePath* path, GtkTreeViewColumn*)
+void Page::launcher_activated(GtkTreePath* path)
 {
 	GtkTreeIter iter;
-	GtkTreeModel* model = gtk_tree_view_get_model(view);
+	GtkTreeModel* model = m_view->get_model();
 	gtk_tree_model_get_iter(model, &iter, path);
 
 	// Find element
@@ -159,12 +167,12 @@ void Page::item_activated(GtkTreeView* view, GtkTreePath* path, GtkTreeViewColum
 	m_window->hide();
 
 	// Execute app
-	element->run(gtk_widget_get_screen(GTK_WIDGET(view)));
+	element->run(gtk_widget_get_screen(m_widget));
 }
 
 //-----------------------------------------------------------------------------
 
-void Page::item_action_activated(GtkMenuItem* menuitem, DesktopAction* action)
+void Page::launcher_action_activated(GtkMenuItem* menuitem, DesktopAction* action)
 {
 	g_assert(m_selected_launcher != NULL);
 
@@ -330,7 +338,7 @@ G_GNUC_BEGIN_IGNORE_DEPRECATIONS
 			GtkWidget* image = gtk_image_new_from_icon_name(action->get_icon(), GTK_ICON_SIZE_MENU);
 			gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
 G_GNUC_END_IGNORE_DEPRECATIONS
-			g_signal_connect_slot(menuitem, "activate", &Page::item_action_activated, this, action);
+			g_signal_connect_slot(menuitem, "activate", &Page::launcher_action_activated, this, action);
 			gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
 		}
 
@@ -377,7 +385,6 @@ G_GNUC_END_IGNORE_DEPRECATIONS
 	gtk_widget_show_all(menu);
 
 	// Show context menu
-	gtk_tree_view_set_hover_selection(GTK_TREE_VIEW(m_view->get_widget()), false);
 	gtk_menu_attach_to_widget(GTK_MENU(menu), m_view->get_widget(), NULL);
 	gtk_menu_popup_at_pointer(GTK_MENU(menu), event);
 }
@@ -388,8 +395,6 @@ void Page::destroy_context_menu(GtkMenuShell* menu)
 {
 	m_selected_launcher = NULL;
 
-	gtk_tree_view_set_hover_selection(GTK_TREE_VIEW(m_view->get_widget()), true);
-
 	gtk_widget_destroy(GTK_WIDGET(menu));
 
 	m_window->on_context_menu_destroyed();
diff --git a/panel-plugin/page.h b/panel-plugin/page.h
index cdfcaca..a38b17d 100644
--- a/panel-plugin/page.h
+++ b/panel-plugin/page.h
@@ -52,12 +52,17 @@ protected:
 		return m_window;
 	}
 
+	virtual void view_created()
+	{
+	}
+
 	void set_reorderable(bool reorderable);
 
 private:
+	void create_view();
 	virtual bool remember_launcher(Launcher* launcher);
-	void item_activated(GtkTreeView* view, GtkTreePath* path, GtkTreeViewColumn*);
-	void item_action_activated(GtkMenuItem* menuitem, DesktopAction* action);
+	void launcher_activated(GtkTreePath* path);
+	void launcher_action_activated(GtkMenuItem* menuitem, DesktopAction* action);
 	gboolean view_button_press_event(GtkWidget* view, GdkEvent* event);
 	gboolean view_button_release_event(GtkWidget*, GdkEvent* event);
 	void view_drag_data_get(GtkWidget*, GdkDragContext*, GtkSelectionData* data, guint info, guint);
@@ -73,6 +78,11 @@ private:
 	void create_context_menu(GtkTreePath* path, GdkEvent* event);
 	virtual void extend_context_menu(GtkWidget* menu);
 
+	static void row_activated_slot(GtkTreeView*, GtkTreePath* path, GtkTreeViewColumn*, gpointer user_data)
+	{
+		reinterpret_cast<Page*>(user_data)->launcher_activated(path);
+	}
+
 private:
 	Window* m_window;
 	GtkWidget* m_widget;
diff --git a/panel-plugin/search-page.cpp b/panel-plugin/search-page.cpp
index 7a742aa..aac145c 100644
--- a/panel-plugin/search-page.cpp
+++ b/panel-plugin/search-page.cpp
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013, 2016 Graeme Gott <graeme at gottcode.org>
+ * Copyright (C) 2013, 2016, 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
@@ -35,7 +35,7 @@ using namespace WhiskerMenu;
 SearchPage::SearchPage(Window* window) :
 	Page(window)
 {
-	get_view()->set_selection_mode(GTK_SELECTION_BROWSE);
+	view_created();
 
 	g_signal_connect_slot(window->get_search_entry(), "icon-release", &SearchPage::clear_search, this);
 	g_signal_connect_slot(window->get_search_entry(), "key-press-event", &SearchPage::cancel_search, this);
@@ -232,3 +232,10 @@ gboolean SearchPage::cancel_search(GtkWidget* widget, GdkEvent* event)
 }
 
 //-----------------------------------------------------------------------------
+
+void SearchPage::view_created()
+{
+	get_view()->set_selection_mode(GTK_SELECTION_BROWSE);
+}
+
+//-----------------------------------------------------------------------------
diff --git a/panel-plugin/search-page.h b/panel-plugin/search-page.h
index 74a417a..bd81f63 100644
--- a/panel-plugin/search-page.h
+++ b/panel-plugin/search-page.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013, 2015 Graeme Gott <graeme at gottcode.org>
+ * Copyright (C) 2013, 2015, 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
@@ -42,6 +42,7 @@ private:
 	void activate_search();
 	void clear_search(GtkEntry* entry, GtkEntryIconPosition icon_pos, GdkEvent*);
 	gboolean cancel_search(GtkWidget* widget, GdkEvent* event);
+	void view_created();
 
 private:
 	Query m_query;

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list