📄 search.c
字号:
/* -*- 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 + -