Initial commit
[resorg.git] / ui.c
bloba88460906ea33c55d5d02d1d65e35935a85ed62f
1 /*
2 * This file is part of Resource Organizer.
4 * Copyright (C) 2014 Nikita Zlobin <nick87720z@gmail.com>
6 * Resource Organizer is free software: you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
11 * Resource Organizer is distributed in the hope that it will be
12 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with Resource Organizer. If not, see
18 * <http://www.gnu.org/licenses/>.
21 #include "config.h"
23 #include <gtk/gtk.h>
24 #include <stdlib.h>
25 #include <string.h>
27 #include "misc.h"
28 #include "ui.h"
30 GtkBuilder * builder;
31 GtkWidget * win;
32 GtkListStore * list;
33 GtkTreeModelFilter * filter;
34 GtkTreeModelSort * sort;
35 GtkTreeView * view;
36 GtkEntryBuffer * filterBuffer;
37 GtkCheckButton * ladspaCheck,
38 * dssiCheck,
39 * lv2Check,
40 * vstCheck;
42 void on_win_close (void)
44 gtk_main_quit ();
47 void column_clicked (GtkTreeViewColumn * col)
49 static GtkTreeViewColumn * prev;
50 int col_i = 0;
53 GList * list = gtk_tree_view_get_columns (view);
54 for (GList * c = list; c && c->data != col; c = c->next, col_i++);
55 g_list_free (list);
58 // Order change
59 typeof (col->sort_order) order = (prev == col) ?
60 (col->sort_order == GTK_SORT_ASCENDING ? GTK_SORT_DESCENDING : GTK_SORT_ASCENDING) :
61 GTK_SORT_ASCENDING;
62 gtk_tree_view_column_set_sort_order (col, order);
63 gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (sort), col_i, order);
65 prev = col;
68 void view_drag_data_get (
69 GtkWidget * w,
70 UNUSED GdkDragContext * context,
71 GtkSelectionData * sel_data,
72 UNUSED int info,
73 UNUSED int time,
74 UNUSED void * data
76 GtkTreeModel * mod;
77 GtkTreeIter i;
78 GValue path_val = G_VALUE_INIT;
80 GtkTreeSelection * sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (w));
81 if (! gtk_tree_selection_get_selected (sel, &mod, &i))
83 fprintf (stderr, "Can't drag, because nothing selected\n");
84 return;
87 gtk_tree_model_get_value (mod, &i, COL_URL, & path_val);
88 const char * path = g_value_get_string (& path_val);
90 gtk_selection_data_set_text (sel_data, path, -1);
93 gboolean filter_visible (
94 GtkTreeModel * model,
95 GtkTreeIter * iter,
96 __attribute__((unused)) gpointer user_data
98 gboolean ret_val = TRUE;
99 char * name,
100 * type,
101 * author,
102 * file,
103 * entry_text = NULL;
105 gtk_tree_model_get (model, iter,
106 COL_NAME, &name,
107 COL_TYPE_NAME, &type,
108 COL_AUTHOR, &author,
109 COL_FILE, &file, -1);
110 if (!name || !type || !author || !file)
111 goto reject;
113 if (strcmp (type, "LADSPA") == 0 && !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (ladspaCheck)))
114 goto reject;
116 if (strcmp (type, "DSSI") == 0 && !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dssiCheck)))
117 goto reject;
119 if (strcmp (type, "LV2") == 0 && !gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (lv2Check)))
120 goto reject;
122 if( gtk_entry_buffer_get_length (filterBuffer))
123 entry_text = (char *) gtk_entry_buffer_get_text (filterBuffer);
125 if ( entry_text &&
126 (!g_strrstr( name, entry_text) &&
127 !g_strrstr( type, entry_text) &&
128 !g_strrstr( author, entry_text))
130 goto reject;
132 exit:;
133 free (name);
134 free (type);
135 free (author);
136 free (file);
137 return ret_val;
139 reject:;
140 ret_val = FALSE;
141 goto exit;
144 int ui_init (int argc, char ** argv)
146 GError * gErr = NULL;
147 gtk_init (& argc, & argv);
149 builder = gtk_builder_new ();
150 gtk_builder_add_from_file (builder, DATADIR "/resorg/browser.ui", & gErr);
151 if (gErr)
153 gErrorReport (& gErr);
154 return -1;
157 list = GTK_LIST_STORE (gtk_builder_get_object (builder, "listStore"));
158 filter = GTK_TREE_MODEL_FILTER (gtk_builder_get_object (builder, "listFilter"));
159 sort = GTK_TREE_MODEL_SORT (gtk_builder_get_object (builder, "listSort"));
160 view = GTK_TREE_VIEW (gtk_builder_get_object (builder, "treeView"));
161 filterBuffer = gtk_entry_get_buffer (GTK_ENTRY (gtk_builder_get_object (builder, "filterEntry")));
162 ladspaCheck = GTK_CHECK_BUTTON (gtk_builder_get_object (builder, "ladspaCheck"));
163 dssiCheck = GTK_CHECK_BUTTON (gtk_builder_get_object (builder, "dssiCheck"));
164 lv2Check = GTK_CHECK_BUTTON (gtk_builder_get_object (builder, "lv2Check"));
165 vstCheck = GTK_CHECK_BUTTON (gtk_builder_get_object (builder, "vstCheck"));
166 win = GTK_WIDGET (gtk_builder_get_object (builder, "mainWin"));
169 GtkTargetEntry entry = {
170 .target = "STRING",
171 .flags = GTK_TARGET_OTHER_APP,
172 .info = 0
175 gtk_drag_source_set (GTK_WIDGET (view), GDK_BUTTON1_MASK, & entry, 1, GDK_ACTION_COPY);
176 gtk_tree_view_enable_model_drag_source (view, GDK_BUTTON1_MASK, & entry, 1, GDK_ACTION_COPY);
179 gtk_tree_model_filter_set_visible_func (filter, filter_visible, NULL, NULL);
180 gtk_builder_connect_signals (builder, NULL);
181 gtk_tree_view_column_clicked (gtk_tree_view_get_column (view, COL_NAME));
183 return 0;