/*
* This file is part of DisOrder
- * Copyright (C) 2006, 2007 Richard Kettlewell
+ * Copyright (C) 2006-2008 Richard Kettlewell
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
static void fill_root_node(struct choosenode *cn);
static void fill_directory_node(struct choosenode *cn);
static void got_files(void *v, int nvec, char **vec);
-static void got_resolved_file(void *v, const char *track);
+static void got_resolved_file(void *v, const char *error, const char *track);
static void got_dirs(void *v, int nvec, char **vec);
static void expand_node(struct choosenode *cn, int contingent);
int n;
D(("got_files %d files for %s %s", nvec, cn->path, cnflags(cn)));
- /* Complicated by the need to resolve aliases. We can save a bit of effort
- * by re-using cbd though. */
+ /* Complicated by the need to resolve aliases. */
cn->flags &= ~CN_GETTING_FILES;
--gets_in_flight;
if((cn->pending = nvec)) {
cn->flags |= CN_RESOLVING_FILES;
for(n = 0; n < nvec; ++n) {
- disorder_eclient_resolve(client, got_resolved_file, vec[n], cbd);
+ disorder_eclient_resolve(client, got_resolved_file, vec[n], cn);
++gets_in_flight;
}
}
}
/** @brief Called with an alias resolved filename */
-static void got_resolved_file(void *v, const char *track) {
- struct callbackdata *cbd = v;
- struct choosenode *cn = cbd->u.choosenode, *file_cn;
-
- D(("resolved %s %s %d left", cn->path, cnflags(cn), cn->pending - 1));
- /* TODO as below */
- file_cn = newnode(cn, track,
- trackname_transform("track", track, "display"),
- trackname_transform("track", track, "sort"),
- 0/*flags*/, 0/*fill*/);
- --gets_in_flight;
- /* Only bother updating when we've got the lot */
- if(--cn->pending == 0) {
- cn->flags &= ~CN_RESOLVING_FILES;
- updated_node(cn, gets_in_flight == 0, "got_resolved_file");
- if(!(cn->flags & CN_GETTING_ANY))
- filled(cn);
+static void got_resolved_file(void *v, const char *error, const char *track) {
+ struct choosenode *const cn = v, *file_cn;
+
+ if(error) {
+ popup_protocol_error(0, error);
+ } else {
+ D(("resolved %s %s %d left", cn->path, cnflags(cn), cn->pending - 1));
+ /* TODO as below */
+ file_cn = newnode(cn, track,
+ trackname_transform("track", track, "display"),
+ trackname_transform("track", track, "sort"),
+ 0/*flags*/, 0/*fill*/);
+ --gets_in_flight;
+ /* Only bother updating when we've got the lot */
+ if(--cn->pending == 0) {
+ cn->flags &= ~CN_RESOLVING_FILES;
+ updated_node(cn, gets_in_flight == 0, "got_resolved_file");
+ if(!(cn->flags & CN_GETTING_ANY))
+ filled(cn);
+ }
}
}
assert(cn->container);
/* Set colors */
BEGIN(colors);
- /* This section turns out to reliably take >50% of the elapsed time when
- * displaying the tree, both when it's largely unexpanded and when it's
- * heavily expanded. */
- if(search_result)
- gtk_widget_modify_bg(cn->container, GTK_STATE_NORMAL, &search_bg);
- else
- gtk_widget_modify_bg(cn->container, GTK_STATE_NORMAL, &layout_bg);
- gtk_widget_modify_bg(cn->container, GTK_STATE_SELECTED, &selected_bg);
- gtk_widget_modify_bg(cn->container, GTK_STATE_PRELIGHT, &selected_bg);
- gtk_widget_modify_fg(cn->label, GTK_STATE_NORMAL, &item_fg);
- gtk_widget_modify_fg(cn->label, GTK_STATE_SELECTED, &selected_fg);
- gtk_widget_modify_fg(cn->label, GTK_STATE_PRELIGHT, &selected_fg);
+ if(search_result) {
+ gtk_widget_set_style(cn->container, search_style);
+ gtk_widget_set_style(cn->label, search_style);
+ } else {
+ gtk_widget_set_style(cn->container, layout_style);
+ gtk_widget_set_style(cn->label, layout_style);
+ }
END(colors);
/* Make sure the icon is right */
BEGIN(markers);
return FALSE;
}
+/** @brief Determine whether the edit menu's select none option should be sensitive
+ *
+ * TODO not implemented, see also choose_selectnone_activate()
+ */
+static int choose_selectnone_sensitive(GtkWidget attribute((unused)) *w) {
+ return FALSE;
+}
+
/** @brief Called when the edit menu's properties option is activated */
static void choose_properties_activate(GtkWidget attribute((unused)) *w) {
activate_track_properties(0, 0);
static void choose_selectall_activate(GtkWidget attribute((unused)) *w) {
}
+/** @brief Called when the edit menu's select none option is activated
+ *
+ * TODO not implemented, see choose_selectnone_sensitive() */
+static void choose_selectnone_activate(GtkWidget attribute((unused)) *w) {
+}
+
/** @brief Main menu callbacks for Choose screen */
static const struct tabtype tabtype_choose = {
choose_properties_sensitive,
choose_selectall_sensitive,
+ choose_selectnone_sensitive,
choose_properties_activate,
choose_selectall_activate,
+ choose_selectnone_activate,
};
/* Public entry points ----------------------------------------------------- */
/* Text entry box for search terms */
NW(entry);
searchentry = gtk_entry_new();
+ gtk_widget_set_style(searchentry, tool_style);
g_signal_connect(searchentry, "changed", G_CALLBACK(searchentry_changed), 0);
gtk_tooltips_set_tip(tips, searchentry, "Enter search terms here; search is automatic", "");
/* Cancel button to clear the search */
NW(button);
clearsearch = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
- gtk_widget_modify_bg(clearsearch, GTK_STATE_NORMAL, &tool_bg);
- gtk_widget_modify_bg(clearsearch, GTK_STATE_ACTIVE, &tool_active);
- gtk_widget_modify_bg(clearsearch, GTK_STATE_PRELIGHT, &tool_active);
- gtk_widget_modify_bg(clearsearch, GTK_STATE_SELECTED, &tool_active);
+ gtk_widget_set_style(clearsearch, tool_style);
g_signal_connect(G_OBJECT(clearsearch), "clicked",
G_CALLBACK(clearsearch_clicked), 0);
gtk_tooltips_set_tip(tips, clearsearch, "Clear search terms", "");
prevsearch = iconbutton("up.png", "Previous search result");
g_signal_connect(G_OBJECT(prevsearch), "clicked",
G_CALLBACK(prev_clicked), 0);
+ gtk_widget_set_style(prevsearch, tool_style);
gtk_widget_set_sensitive(prevsearch, 0);
- gtk_widget_modify_bg(prevsearch, GTK_STATE_NORMAL, &tool_bg);
- gtk_widget_modify_bg(prevsearch, GTK_STATE_ACTIVE, &tool_active);
- gtk_widget_modify_bg(prevsearch, GTK_STATE_PRELIGHT, &tool_active);
- gtk_widget_modify_bg(prevsearch, GTK_STATE_SELECTED, &tool_active);
- gtk_widget_modify_bg(prevsearch, GTK_STATE_INSENSITIVE, &tool_active);
nextsearch = iconbutton("down.png", "Next search result");
g_signal_connect(G_OBJECT(nextsearch), "clicked",
G_CALLBACK(next_clicked), 0);
+ gtk_widget_set_style(nextsearch, tool_style);
gtk_widget_set_sensitive(nextsearch, 0);
- gtk_widget_modify_bg(nextsearch, GTK_STATE_NORMAL, &tool_bg);
- gtk_widget_modify_bg(nextsearch, GTK_STATE_ACTIVE, &tool_active);
- gtk_widget_modify_bg(nextsearch, GTK_STATE_PRELIGHT, &tool_active);
- gtk_widget_modify_bg(nextsearch, GTK_STATE_SELECTED, &tool_active);
- gtk_widget_modify_bg(nextsearch, GTK_STATE_INSENSITIVE, &tool_active);
/* hbox packs the search tools button together on a line */
NW(hbox);
* namespace */
NW(layout);
chooselayout = gtk_layout_new(0, 0);
- gtk_widget_modify_bg(chooselayout, GTK_STATE_NORMAL, &layout_bg);
+ gtk_widget_set_style(chooselayout, layout_style);
choose_reset();
register_reset(choose_reset);
/* Create the popup menus */