⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 search.c

📁 Aqualung is an advanced music player primarily targeted for the GNU/Linux operating system, but als
💻 C
📖 第 1 页 / 共 2 页
字号:
/*                                                     -*- linux-c -*-    Copyright (C) 2004 Tom Szilagyi    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    the Free Software Foundation; either version 2 of the License, or    (at your option) any later version.    This program 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 program; if not, write to the Free Software    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.    $Id: search.c,v 1.14 2006/09/25 18:17:29 peterszilagyi Exp $*/#include <config.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <gtk/gtk.h>#include <gdk/gdkkeysyms.h>#include "common.h"#include "music_browser.h"#include "gui_main.h"#include "i18n.h"#include "search.h"extern int search_ms_flags;extern GtkWidget* gui_stock_label_button(gchar *blabel, const gchar *bstock);extern GtkTreeStore * music_store;extern GtkWidget * music_tree;extern GtkWidget * browser_window;GtkWidget * search_window = NULL;GtkWidget * searchkey_entry;GtkWidget * check_case;GtkWidget * check_exact;GtkWidget * check_sfac;GtkWidget * check_artist;GtkWidget * check_record;GtkWidget * check_track;GtkWidget * check_comment;GtkWidget * sres_list;GtkListStore * search_store;GtkTreeSelection * search_select;int casesens;int exactonly;int selectfc;int artist_yes;int record_yes;int track_yes;int comment_yes;static voidget_toggle_buttons_state(void) {        casesens = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_case)) ? 1 : 0;	exactonly = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_exact)) ? 1 : 0;	selectfc = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_sfac)) ? 1 : 0;	artist_yes = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_artist)) ? 1 : 0;	record_yes = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_record)) ? 1 : 0;	track_yes = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_track)) ? 1 : 0;	comment_yes = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_comment)) ? 1 : 0;}voidclear_search_store(void) {	int i;	GtkTreeIter iter;	i = 0;	while (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(search_store), &iter, NULL, i++)) {		gpointer gptr;		GtkTreePath * path;		gtk_tree_model_get(GTK_TREE_MODEL(search_store), &iter,				   3, &gptr, -1);		path = (GtkTreePath *)gptr;		if (path != NULL) {			gtk_tree_path_free(path);		}	}	gtk_list_store_clear(search_store);}static gintclose_button_clicked(GtkWidget * widget, gpointer data) {        get_toggle_buttons_state();        search_ms_flags = (casesens * SEARCH_F_CS) | (exactonly * SEARCH_F_EM) | (selectfc * SEARCH_F_SF) |                          (artist_yes * SEARCH_F_AN) | (record_yes * SEARCH_F_RT) | (track_yes * SEARCH_F_TT) |                          (comment_yes * SEARCH_F_CO);	clear_search_store();        gtk_widget_destroy(search_window);        search_window = NULL;        return TRUE;}intsearch_window_close(GtkWidget * widget, gpointer * data) {        get_toggle_buttons_state();        search_ms_flags = (casesens * SEARCH_F_CS) | (exactonly * SEARCH_F_EM) | (selectfc * SEARCH_F_SF) |                          (artist_yes * SEARCH_F_AN) | (record_yes * SEARCH_F_RT) | (track_yes * SEARCH_F_TT) |                          (comment_yes * SEARCH_F_CO);	clear_search_store();        search_window = NULL;        return 0;}static gintsfac_clicked(GtkWidget * widget, gpointer data) {        get_toggle_buttons_state();        if (selectfc) {                gtk_widget_hide(sres_list);                gtk_window_resize(GTK_WINDOW(search_window), 420, 215);        } else {                gtk_window_resize(GTK_WINDOW(search_window), 420, 430);                gtk_widget_show(sres_list);        }        return TRUE;}static gintsearch_button_clicked(GtkWidget * widget, gpointer data) {	int valid;	const char * key_string = gtk_entry_get_text(GTK_ENTRY(searchkey_entry));	char key[MAXLEN];	GPatternSpec * pattern;	int h, i, j, k;	GtkTreeIter store_iter;	GtkTreeIter artist_iter;	GtkTreeIter record_iter;	GtkTreeIter track_iter;	GtkTreeIter sfac_iter;        get_toggle_buttons_state();	clear_search_store();	valid = 0;	for (i = 0; key_string[i] != '\0'; i++) {		if ((key_string[i] != '?') && (key_string[i] != '*')) {			valid = 1;			break;		}	}	if (!valid) {		return TRUE;	}	if (!casesens) {		key_string = g_utf8_strup(key_string, -1);	}	if (exactonly) {		strcpy(key, key_string);	} else {		snprintf(key, MAXLEN-1, "*%s*", key_string);	}	pattern = g_pattern_spec_new(key);	h = 0;	while (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(music_store), &store_iter, NULL, h++)) {		i = 0;		while (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(music_store),						     &artist_iter, &store_iter, i++)) {			char * artist_name;			char * comment;			gtk_tree_model_get(GTK_TREE_MODEL(music_store), &artist_iter,					   0, &artist_name, 3, &comment, -1);			if (artist_yes) {				char * tmp = NULL;				if (casesens) {					tmp = strdup(artist_name);				} else {					tmp = g_utf8_strup(artist_name, -1);				}				if (g_pattern_match_string(pattern, tmp)) {					GtkTreeIter iter;					GtkTreePath * path;					path = gtk_tree_model_get_path(GTK_TREE_MODEL(music_store),								       &artist_iter);					gtk_list_store_append(search_store, &iter);					gtk_list_store_set(search_store, &iter,							   0, artist_name,							   1, "",							   2, "",							   3, (gpointer)path,							   -1);				}				g_free(tmp);			}			if (comment_yes) {				char * tmp = NULL;				if (casesens) {					tmp = strdup(comment);				} else {					tmp = g_utf8_strup(comment, -1);				}				if (g_pattern_match_string(pattern, tmp)) {					GtkTreeIter iter;					GtkTreePath * path;					path = gtk_tree_model_get_path(GTK_TREE_MODEL(music_store),								       &artist_iter);				gtk_list_store_append(search_store, &iter);				gtk_list_store_set(search_store, &iter,						   0, artist_name,						   1, "",						   2, "",						   3, (gpointer)path,						   -1);				}				g_free(tmp);			}			g_free(comment);			j = 0;			while (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(music_store), &record_iter,							     &artist_iter, j++)) {				char * record_name;				gtk_tree_model_get(GTK_TREE_MODEL(music_store), &record_iter,						   0, &record_name, 3, &comment, -1);								if (record_yes) {					char * tmp = NULL;					if (casesens) {						tmp = strdup(record_name);					} else {						tmp = g_utf8_strup(record_name, -1);					}					if (g_pattern_match_string(pattern, tmp)) {												GtkTreeIter iter;						GtkTreePath * path;												path = gtk_tree_model_get_path(GTK_TREE_MODEL(music_store),									       &record_iter);						gtk_list_store_append(search_store, &iter);						gtk_list_store_set(search_store, &iter,								   0, artist_name,								   1, record_name,								   2, "",								   3, (gpointer)path,								   -1);					}					g_free(tmp);				}								if (comment_yes) {					char * tmp = NULL;					if (casesens) {						tmp = strdup(comment);					} else {						tmp = g_utf8_strup(comment, -1);					}					if (g_pattern_match_string(pattern, tmp)) {												GtkTreeIter iter;						GtkTreePath * path;												path = gtk_tree_model_get_path(GTK_TREE_MODEL(music_store),									       &record_iter);						gtk_list_store_append(search_store, &iter);						gtk_list_store_set(search_store, &iter,								   0, artist_name,								   1, record_name,								   2, "",								   3, (gpointer)path,								   -1);					}					g_free(tmp);				}				g_free(comment);								k = 0;				while (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(music_store),								     &track_iter, &record_iter, k++)) {										char * track_name;										gtk_tree_model_get(GTK_TREE_MODEL(music_store), &track_iter,							   0, &track_name, 3, &comment, -1);										if (track_yes) {						char * tmp = NULL;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -