[anjuta] project-manager: bgo #534966 - Order alphabetically project's targets on project tab
- From: Sebastien Granjoux <sgranjoux src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [anjuta] project-manager: bgo #534966 - Order alphabetically project's targets on project tab
- Date: Sat, 29 Jan 2011 20:48:11 +0000 (UTC)
commit 1921e7f984e5602e4b2ba8ea75058f68a4fe8a65
Author: Sébastien Granjoux <seb sfo free fr>
Date: Sat Jan 29 21:42:42 2011 +0100
project-manager: bgo #534966 - Order alphabetically project's targets on project tab
plugins/project-manager/anjuta-project-manager.xml | 2 +
plugins/project-manager/plugin.c | 18 +++-
plugins/project-manager/project-model.c | 141 ++++++++++++++++++++
plugins/project-manager/project-model.h | 1 +
plugins/project-manager/project-view.c | 13 ++
plugins/project-manager/project-view.h | 2 +
6 files changed, 176 insertions(+), 1 deletions(-)
---
diff --git a/plugins/project-manager/anjuta-project-manager.xml b/plugins/project-manager/anjuta-project-manager.xml
index 4c9688b..4306f6f 100644
--- a/plugins/project-manager/anjuta-project-manager.xml
+++ b/plugins/project-manager/anjuta-project-manager.xml
@@ -34,6 +34,8 @@
<menuitem name="Remove" action="ActionPopupProjectRemove"/>
<separator name="separator3"/>
<menuitem name="Properties" action="ActionPopupProjectProperties"/>
+ <separator name="separator4"/>
+ <menuitem name="SortShortcut" action="ActionPopupProjectSortShortcut"/>
</popup>
<popup name="PopupFileManager">
<placeholder name="PlaceholderPopupFileProject">
diff --git a/plugins/project-manager/plugin.c b/plugins/project-manager/plugin.c
index 24b836c..b24d8d8 100644
--- a/plugins/project-manager/plugin.c
+++ b/plugins/project-manager/plugin.c
@@ -544,6 +544,12 @@ on_popup_properties (GtkAction *action, ProjectManagerPlugin *plugin)
}
static void
+on_popup_sort_shortcuts (GtkAction *action, ProjectManagerPlugin *plugin)
+{
+ gbf_project_view_sort_shortcuts (plugin->view);
+}
+
+static void
on_popup_new_package (GtkAction *action, ProjectManagerPlugin *plugin)
{
GtkTreeIter selected_module;
@@ -959,6 +965,11 @@ static GtkActionEntry popup_actions[] =
"ActionPopupProjectRemove", GTK_STOCK_REMOVE,
N_("Re_move"), NULL, N_("Remove from project"),
G_CALLBACK (on_popup_remove)
+ },
+ {
+ "ActionPopupProjectSortShortcut", GTK_STOCK_SORT_ASCENDING,
+ N_("_Sort"), NULL, N_("Sort shortcuts"),
+ G_CALLBACK (on_popup_sort_shortcuts)
}
};
@@ -973,7 +984,7 @@ update_ui (ProjectManagerPlugin *plugin)
/* Close project is always here */
main_caps = 0x101;
- popup_caps = 0x000;
+ popup_caps = 0x100;
/* Check for supported node */
caps = anjuta_pm_project_get_capabilities (plugin->project);
@@ -1044,10 +1055,12 @@ on_treeview_selection_changed (GtkTreeSelection *sel,
AnjutaProjectNode *node;
gint state = 0;
GFile *selected_file;
+ GbfTreeData *data;
ui = anjuta_shell_get_ui (ANJUTA_PLUGIN (plugin)->shell, NULL);
node = gbf_project_view_find_selected (plugin->view,
ANJUTA_PROJECT_UNKNOWN);
+ data = gbf_project_view_get_first_selected (plugin->view, NULL);
if (node != NULL)
{
@@ -1081,6 +1094,9 @@ on_treeview_selection_changed (GtkTreeSelection *sel,
action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
"ActionPopupProjectRemove");
g_object_set (G_OBJECT (action), "sensitive", INT_TO_GBOOLEAN (state & ANJUTA_PROJECT_CAN_REMOVE), NULL);
+ action = anjuta_ui_get_action (ui, "ActionGroupProjectManagerPopup",
+ "ActionPopupProjectSortShortcut");
+ g_object_set (G_OBJECT (action), "sensitive", (data != NULL) && (data->type == GBF_TREE_NODE_SHORTCUT), NULL);
selected_file = node != NULL ? anjuta_project_node_get_file (node) : NULL;
if (selected_file)
diff --git a/plugins/project-manager/project-model.c b/plugins/project-manager/project-model.c
index 2ece8e1..1cd7e57 100644
--- a/plugins/project-manager/project-model.c
+++ b/plugins/project-manager/project-model.c
@@ -296,6 +296,110 @@ gbf_project_model_remove_invalid_shortcut (GbfProjectModel *model, GtkTreeIter *
return FALSE;
}
+/* Sort model
+ *---------------------------------------------------------------------------*/
+
+static gint
+sort_by_name (GtkTreeModel *model,
+ GtkTreeIter *iter_a,
+ GtkTreeIter *iter_b,
+ gpointer user_data)
+{
+ GbfTreeData *data_a, *data_b;
+
+ gtk_tree_model_get (model, iter_a,
+ GBF_PROJECT_MODEL_COLUMN_DATA, &data_a,
+ -1);
+ gtk_tree_model_get (model, iter_b,
+ GBF_PROJECT_MODEL_COLUMN_DATA, &data_b,
+ -1);
+
+ return strcmp (data_a->name, data_b->name);
+}
+
+
+static void
+gbf_project_model_merge (GtkTreeModel *model,
+ GtkTreePath *begin,
+ GtkTreePath *half,
+ GtkTreePath *end,
+ GtkTreeIterCompareFunc compare_func,
+ gpointer user_data)
+{
+ GtkTreeIter right;
+ GtkTreeIter left;
+
+ if (gtk_tree_model_get_iter (model, &left, begin) &&
+ gtk_tree_model_get_iter (model, &right, half))
+ {
+ gint depth;
+ gint ll, lr;
+
+
+ /* Get number of elements in both list */
+ ll = (gtk_tree_path_get_indices_with_depth (half, &depth)[depth - 1]
+ - gtk_tree_path_get_indices_with_depth (begin, &depth)[depth - 1]);
+ lr = (gtk_tree_path_get_indices_with_depth (end, &depth)[depth - 1]
+ - gtk_tree_path_get_indices_with_depth (half, &depth)[depth - 1]);
+
+ while (ll && lr)
+ {
+ if (compare_func (model, &left, &right, user_data) <= 0)
+ {
+ gtk_tree_model_iter_next (model, &left);
+ ll--;
+ }
+ else
+ {
+ GtkTreeIter iter;
+
+ iter = right;
+ gtk_tree_model_iter_next (model, &right);
+ lr--;
+ gtk_tree_store_move_before (GTK_TREE_STORE (model), &iter, &left);
+ }
+ }
+ }
+}
+
+/* sort using merge sort */
+static void
+gbf_project_model_sort (GtkTreeModel *model,
+ GtkTreePath *begin,
+ GtkTreePath *end,
+ GtkTreeIterCompareFunc compare_func,
+ gpointer user_data)
+{
+ GtkTreePath *half;
+ gint depth;
+
+ /* Empty list are sorted */
+ if (gtk_tree_path_compare (begin, end) >= 0)
+ {
+ return;
+ }
+
+ /* Split the list in two */
+ half = gtk_tree_path_copy (begin);
+ gtk_tree_path_up (half);
+ gtk_tree_path_append_index (half, (gtk_tree_path_get_indices_with_depth (begin, &depth)[depth -1] +
+ gtk_tree_path_get_indices_with_depth (end, &depth)[depth - 1]) / 2);
+
+ /* List with a single element are sorted too */
+ if (gtk_tree_path_compare (begin, half) < 0)
+ {
+ gbf_project_model_sort (model, begin, half, compare_func, user_data);
+ gbf_project_model_sort (model, half, end, compare_func, user_data);
+ gbf_project_model_merge (model, begin, half, end, compare_func, user_data);
+ }
+
+ gtk_tree_path_free (half);
+}
+
+
+/* Public function
+ *---------------------------------------------------------------------------*/
+
gboolean
gbf_project_model_remove (GbfProjectModel *model, GtkTreeIter *iter)
{
@@ -1057,3 +1161,40 @@ gbf_project_model_set_default_shortcut (GbfProjectModel *model,
{
model->priv->default_shortcut = enable;
}
+
+void
+gbf_project_model_sort_shortcuts (GbfProjectModel *model)
+{
+ GtkTreeIter iter;
+
+ /* Get all shortcut */
+ if (gtk_tree_model_iter_children (GTK_TREE_MODEL (model), &iter, NULL))
+ {
+ GtkTreePath *begin;
+ GtkTreePath *end;
+ gboolean valid;
+
+ begin = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
+ do
+ {
+ GbfTreeData *data;
+
+ gtk_tree_model_get (GTK_TREE_MODEL (model), &iter,
+ GBF_PROJECT_MODEL_COLUMN_DATA, &data,
+ -1);
+
+ /* Shortcuts are always at the beginning */
+ if (data->type != GBF_TREE_NODE_SHORTCUT) break;
+
+ valid = gtk_tree_model_iter_next (GTK_TREE_MODEL (model), &iter);
+ }
+ while (valid);
+
+
+
+ end = gtk_tree_model_get_path (GTK_TREE_MODEL (model), &iter);
+ gbf_project_model_sort (GTK_TREE_MODEL (model), begin, end, sort_by_name, NULL);
+ gtk_tree_path_free (begin);
+ gtk_tree_path_free (end);
+ }
+}
diff --git a/plugins/project-manager/project-model.h b/plugins/project-manager/project-model.h
index 56a63ac..7571fc2 100644
--- a/plugins/project-manager/project-model.h
+++ b/plugins/project-manager/project-model.h
@@ -118,6 +118,7 @@ void gbf_project_model_move_target_shortcut (GbfProjectModel *mode
GtkTreePath *before_path);
void gbf_project_model_set_default_shortcut (GbfProjectModel *model, gboolean enable);
+void gbf_project_model_sort_shortcuts (GbfProjectModel *model);
#endif
diff --git a/plugins/project-manager/project-view.c b/plugins/project-manager/project-view.c
index aaebfcb..a331503 100644
--- a/plugins/project-manager/project-view.c
+++ b/plugins/project-manager/project-view.c
@@ -1107,6 +1107,19 @@ gbf_project_view_update_tree (GbfProjectView *view, AnjutaProjectNode *parent, G
/* Shorcuts functions
*---------------------------------------------------------------------------*/
+void
+gbf_project_view_sort_shortcuts (GbfProjectView *view)
+{
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (view->model),
+ GTK_TREE_SORTABLE_UNSORTED_SORT_COLUMN_ID,
+ GTK_SORT_ASCENDING);
+ gbf_project_model_sort_shortcuts (view->model);
+ gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (view->model),
+ GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID,
+ GTK_SORT_ASCENDING);
+
+}
+
GList *
gbf_project_view_get_shortcut_list (GbfProjectView *view)
{
diff --git a/plugins/project-manager/project-view.h b/plugins/project-manager/project-view.h
index 510415e..a528e0d 100644
--- a/plugins/project-manager/project-view.h
+++ b/plugins/project-manager/project-view.h
@@ -97,6 +97,8 @@ void gbf_project_view_set_shortcut_list (GbfProjectView *view,
void gbf_project_view_set_expanded_list (GbfProjectView *view,
GList *expanded);
+void gbf_project_view_sort_shortcuts (GbfProjectView *view);
+
void gbf_project_view_update_tree (GbfProjectView *view,
AnjutaProjectNode *parent,
GtkTreeIter *iter);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]