Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(391)

Side by Side Diff: chrome/browser/gtk/bookmark_tree_model.cc

Issue 210036: Make it possible to edit bookmark folder names inline. This (Closed)
Patch Set: comments Created 11 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/gtk/bookmark_tree_model.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/gtk/bookmark_tree_model.h" 5 #include "chrome/browser/gtk/bookmark_tree_model.h"
6 6
7 #include <gtk/gtk.h> 7 #include <gtk/gtk.h>
8 8
9 #include "app/resource_bundle.h" 9 #include "app/resource_bundle.h"
10 #include "base/string_util.h" 10 #include "base/string_util.h"
11 #include "chrome/browser/bookmarks/bookmark_model.h" 11 #include "chrome/browser/bookmarks/bookmark_model.h"
12 #include "chrome/browser/gtk/bookmark_utils_gtk.h" 12 #include "chrome/browser/gtk/bookmark_utils_gtk.h"
13 #include "chrome/browser/gtk/gtk_theme_provider.h" 13 #include "chrome/browser/gtk/gtk_theme_provider.h"
14 14
15 namespace { 15 namespace {
16 16
17 const char* kCellRendererTextKey = "__CELL_RENDERER_TEXT__";
18
17 void AddSingleNodeToTreeStore(GtkTreeStore* store, const BookmarkNode* node, 19 void AddSingleNodeToTreeStore(GtkTreeStore* store, const BookmarkNode* node,
18 GtkTreeIter *iter, GtkTreeIter* parent) { 20 GtkTreeIter *iter, GtkTreeIter* parent) {
19 gtk_tree_store_append(store, iter, parent); 21 gtk_tree_store_append(store, iter, parent);
20 // It would be easy to show a different icon when the folder is open (as they 22 // It would be easy to show a different icon when the folder is open (as they
21 // do on Windows, for example), using pixbuf-expander-closed and 23 // do on Windows, for example), using pixbuf-expander-closed and
22 // pixbuf-expander-open. Unfortunately there is no GTK_STOCK_OPEN_DIRECTORY 24 // pixbuf-expander-open. Unfortunately there is no GTK_STOCK_OPEN_DIRECTORY
23 // (and indeed, Nautilus does not render an expanded directory any 25 // (and indeed, Nautilus does not render an expanded directory any
24 // differently). 26 // differently).
25 gtk_tree_store_set(store, iter, 27 gtk_tree_store_set(store, iter,
26 bookmark_utils::FOLDER_ICON, 28 bookmark_utils::FOLDER_ICON, GtkThemeProvider::GetFolderIcon(true),
27 GtkThemeProvider::GetFolderIcon(true), 29 bookmark_utils::FOLDER_NAME, WideToUTF8(node->GetTitle()).c_str(),
28 bookmark_utils::FOLDER_NAME, 30 bookmark_utils::ITEM_ID, node->id(),
29 WideToUTF8(node->GetTitle()).c_str(), 31 bookmark_utils::IS_EDITABLE, node->is_folder(),
30 bookmark_utils::ITEM_ID, node->id(), 32 -1);
31 -1);
32 } 33 }
33 34
34 // Helper function for CommitTreeStoreDifferencesBetween() which recursively 35 // Helper function for CommitTreeStoreDifferencesBetween() which recursively
35 // merges changes back from a GtkTreeStore into a tree of BookmarkNodes. This 36 // merges changes back from a GtkTreeStore into a tree of BookmarkNodes. This
36 // function only works on non-root nodes; our caller handles that special case. 37 // function only works on non-root nodes; our caller handles that special case.
37 void RecursiveResolve(BookmarkModel* bb_model, const BookmarkNode* bb_node, 38 void RecursiveResolve(BookmarkModel* bb_model, const BookmarkNode* bb_node,
38 GtkTreeModel* tree_model, GtkTreeIter* parent_iter, 39 GtkTreeModel* tree_model, GtkTreeIter* parent_iter,
39 GtkTreePath* selected_path, 40 GtkTreePath* selected_path,
40 const BookmarkNode** selected_node) { 41 const BookmarkNode** selected_node) {
41 GtkTreePath* current_path = gtk_tree_model_get_path(tree_model, parent_iter); 42 GtkTreePath* current_path = gtk_tree_model_get_path(tree_model, parent_iter);
(...skipping 24 matching lines...) Expand all
66 DCHECK(child_bb_node); 67 DCHECK(child_bb_node);
67 bb_model->SetTitle(child_bb_node, title); 68 bb_model->SetTitle(child_bb_node, title);
68 } 69 }
69 RecursiveResolve(bb_model, child_bb_node, 70 RecursiveResolve(bb_model, child_bb_node,
70 tree_model, &child_iter, 71 tree_model, &child_iter,
71 selected_path, selected_node); 72 selected_path, selected_node);
72 } while (gtk_tree_model_iter_next(tree_model, &child_iter)); 73 } while (gtk_tree_model_iter_next(tree_model, &child_iter));
73 } 74 }
74 } 75 }
75 76
77 // Update the folder name in the GtkTreeStore.
78 void OnFolderNameEdited(GtkCellRendererText* render,
79 gchar* path, gchar* new_folder_name, GtkTreeStore* tree_store) {
80 GtkTreeIter folder_iter;
81 GtkTreePath* tree_path = gtk_tree_path_new_from_string(path);
82 gboolean rv = gtk_tree_model_get_iter(GTK_TREE_MODEL(tree_store),
83 &folder_iter, tree_path);
84 DCHECK(rv);
85 gtk_tree_store_set(tree_store, &folder_iter,
86 bookmark_utils::FOLDER_NAME, new_folder_name,
87 -1);
88 gtk_tree_path_free(tree_path);
89 }
90
76 } // namespace 91 } // namespace
77 92
78 namespace bookmark_utils { 93 namespace bookmark_utils {
79 94
80 GtkTreeStore* MakeFolderTreeStore() { 95 GtkTreeStore* MakeFolderTreeStore() {
81 return gtk_tree_store_new(FOLDER_STORE_NUM_COLUMNS, GDK_TYPE_PIXBUF, 96 return gtk_tree_store_new(FOLDER_STORE_NUM_COLUMNS, GDK_TYPE_PIXBUF,
82 G_TYPE_STRING, G_TYPE_INT64); 97 G_TYPE_STRING, G_TYPE_INT64, G_TYPE_BOOLEAN);
83 } 98 }
84 99
85 void AddToTreeStore(BookmarkModel* model, int64 selected_id, 100 void AddToTreeStore(BookmarkModel* model, int64 selected_id,
86 GtkTreeStore* store, GtkTreeIter* selected_iter) { 101 GtkTreeStore* store, GtkTreeIter* selected_iter) {
87 const BookmarkNode* root_node = model->root_node(); 102 const BookmarkNode* root_node = model->root_node();
88 for (int i = 0; i < root_node->GetChildCount(); ++i) { 103 for (int i = 0; i < root_node->GetChildCount(); ++i) {
89 AddToTreeStoreAt(root_node->GetChild(i), selected_id, store, 104 AddToTreeStoreAt(root_node->GetChild(i), selected_id, store,
90 selected_iter, NULL); 105 selected_iter, NULL);
91 } 106 }
92 } 107 }
93 108
94 GtkWidget* MakeTreeViewForStore(GtkTreeStore* store) { 109 GtkWidget* MakeTreeViewForStore(GtkTreeStore* store) {
95 GtkTreeViewColumn* column = gtk_tree_view_column_new(); 110 GtkTreeViewColumn* column = gtk_tree_view_column_new();
96 GtkCellRenderer* image_renderer = gtk_cell_renderer_pixbuf_new(); 111 GtkCellRenderer* image_renderer = gtk_cell_renderer_pixbuf_new();
97 gtk_tree_view_column_pack_start(column, image_renderer, FALSE); 112 gtk_tree_view_column_pack_start(column, image_renderer, FALSE);
98 gtk_tree_view_column_add_attribute(column, image_renderer, 113 gtk_tree_view_column_add_attribute(column, image_renderer,
99 "pixbuf", FOLDER_ICON); 114 "pixbuf", FOLDER_ICON);
100 GtkCellRenderer* text_renderer = gtk_cell_renderer_text_new(); 115 GtkCellRenderer* text_renderer = gtk_cell_renderer_text_new();
101 g_object_set(text_renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL); 116 g_object_set(text_renderer, "ellipsize", PANGO_ELLIPSIZE_END, NULL);
117 g_signal_connect(text_renderer, "edited", G_CALLBACK(OnFolderNameEdited),
118 store);
102 gtk_tree_view_column_pack_start(column, text_renderer, TRUE); 119 gtk_tree_view_column_pack_start(column, text_renderer, TRUE);
103 gtk_tree_view_column_add_attribute(column, text_renderer, 120 gtk_tree_view_column_set_attributes(column, text_renderer,
104 "text", FOLDER_NAME); 121 "text", FOLDER_NAME,
122 "editable", IS_EDITABLE,
123 NULL);
105 124
106 GtkWidget* tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); 125 GtkWidget* tree_view = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store));
107 // Let |tree_view| own the store. 126 // Let |tree_view| own the store.
108 g_object_unref(store); 127 g_object_unref(store);
109 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), FALSE); 128 gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(tree_view), FALSE);
110 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column); 129 gtk_tree_view_append_column(GTK_TREE_VIEW(tree_view), column);
130 g_object_set_data(G_OBJECT(tree_view), kCellRendererTextKey, text_renderer);
111 return tree_view; 131 return tree_view;
112 } 132 }
113 133
134 GtkCellRenderer* GetCellRendererText(GtkTreeView* tree_view) {
135 return static_cast<GtkCellRenderer*>(
136 g_object_get_data(G_OBJECT(tree_view), kCellRendererTextKey));
137 }
138
114 void AddToTreeStoreAt(const BookmarkNode* node, int64 selected_id, 139 void AddToTreeStoreAt(const BookmarkNode* node, int64 selected_id,
115 GtkTreeStore* store, GtkTreeIter* selected_iter, 140 GtkTreeStore* store, GtkTreeIter* selected_iter,
116 GtkTreeIter* parent) { 141 GtkTreeIter* parent) {
117 if (!node->is_folder()) 142 if (!node->is_folder())
118 return; 143 return;
119 144
120 GtkTreeIter iter; 145 GtkTreeIter iter;
121 AddSingleNodeToTreeStore(store, node, &iter, parent); 146 AddSingleNodeToTreeStore(store, node, &iter, parent);
122 if (selected_iter && node->id() == selected_id) { 147 if (selected_iter && node->id() == selected_id) {
123 // Save the iterator. Since we're using a GtkTreeStore, we're 148 // Save the iterator. Since we're using a GtkTreeStore, we're
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
194 ret_val = UTF8ToWide(utf8str); 219 ret_val = UTF8ToWide(utf8str);
195 g_value_unset(&value); 220 g_value_unset(&value);
196 } else { 221 } else {
197 NOTREACHED() << "Impossible type mismatch"; 222 NOTREACHED() << "Impossible type mismatch";
198 } 223 }
199 224
200 return ret_val; 225 return ret_val;
201 } 226 }
202 227
203 } // namespace bookmark_utils 228 } // namespace bookmark_utils
OLDNEW
« no previous file with comments | « chrome/browser/gtk/bookmark_tree_model.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698