Last minute stuff - Alex
[terminatorX.git] / src / tX_loaddlg.cc
1 /*
2     terminatorX - realtime audio scratching software
3     Copyright (C) 1999-2003  Alexander K├Ânig
4  
5     This program is free software; you can redistribute it and/or modify
6     it under the terms of the GNU General Public License as published by
7     the Free Software Foundation; either version 2 of the License, or
8     (at your option) any later version.
9  
10     This program is distributed in the hope that it will be useful,
11     but WITHOUT ANY WARRANTY; without even the implied warranty of
12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13     GNU General Public License for more details.
14  
15     You should have received a copy of the GNU General Public License
16     along with this program; if not, write to the Free Software
17     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  
19     File: tX_loaddlg.cc
20  
21     Description: Displays the progress indicator dialog for file
22                  loading.
23                  
24 */ 
25 #include <gtk/gtk.h>
26 #include "tX_loaddlg.h"
27 #include <math.h>
28 #include <stdio.h>
29 #include <string.h>
30 #include "tX_mastergui.h"
31
32 GtkWidget *ld_loaddlg=(GtkWidget *) NULL;
33 GtkWidget *ld_single_l=(GtkWidget *)NULL;
34 GtkWidget *ld_single_p=(GtkWidget *)NULL;
35 GtkWidget *ld_multi_l=(GtkWidget *)NULL;
36 GtkWidget *ld_multi_p=(GtkWidget *)NULL;
37 //GtkWindow *ld_window=(GtkWindow *)NULL;
38
39 int ld_mode;
40 int ld_count;
41 int ld_current;
42
43 gfloat ld_old_prog;
44
45 #define WID_DYN TRUE, TRUE, 0
46 #define WID_FIX FALSE, FALSE, 0
47 #define add_widget_dyn(wid); gtk_box_pack_start(GTK_BOX(vbox), wid, WID_DYN);\
48         gtk_widget_show(wid);
49         
50 #define add_widget_fix(wid); gtk_box_pack_start(GTK_BOX(vbox), wid, WID_FIX);\
51         gtk_widget_show(wid);
52
53 #define gtk_flush(); { int ctr=0; while (gtk_events_pending()) { ctr++; if (ctr>5) break; gtk_main_iteration(); gdk_flush(); }}
54
55
56 int ld_create_loaddlg(int mode, int count)
57 {
58         GtkWidget *vbox=gtk_vbox_new(0, 5);
59         GtkWidget *actionarea;
60         GtkWidget *dummy;
61         
62         if (ld_loaddlg) return(1);
63         
64         ld_mode=mode;
65         ld_count=count;
66
67         ld_loaddlg=gtk_window_new(GTK_WINDOW_POPUP);
68         gtk_window_set_position(GTK_WINDOW(ld_loaddlg), GTK_WIN_POS_CENTER_ON_PARENT);
69         gtk_window_set_title(GTK_WINDOW(ld_loaddlg), "terminatorX - loading");
70         gtk_window_set_transient_for(GTK_WINDOW(ld_loaddlg), GTK_WINDOW(main_window));
71         
72         gtk_container_set_border_width(GTK_CONTAINER(ld_loaddlg), 5);
73         gtk_container_add(GTK_CONTAINER(ld_loaddlg), vbox);
74         gtk_widget_set_size_request(vbox, 400, -1);
75         gtk_widget_show(vbox);
76         
77         //gtk_widget_show(ld_loaddlg);
78                 
79         if (mode==TX_LOADDLG_MODE_MULTI) {
80                 ld_multi_l=gtk_label_new("Loading Set");
81                 gtk_misc_set_alignment(GTK_MISC(ld_multi_l), 0.5, 0.5);
82                 add_widget_fix(ld_multi_l);
83                 
84                 ld_multi_p=gtk_progress_bar_new();
85                 add_widget_fix(ld_multi_p);
86                 
87                 dummy=gtk_hseparator_new();
88                 add_widget_fix(dummy);
89                 
90                 ld_current=0;
91         }
92         
93         ld_single_l=gtk_label_new("Loading File");
94         add_widget_fix(ld_single_l);
95                 
96         ld_single_p=gtk_progress_bar_new();
97         add_widget_fix(ld_single_p);
98
99         gtk_window_set_modal(GTK_WINDOW(ld_loaddlg), TRUE);
100         //gtk_window_set_default_size(GTK_WINDOW(ld_loaddlg), 400, 100);
101         gtk_widget_realize(ld_loaddlg);
102         gdk_window_set_decorations(ld_loaddlg->window, (GdkWMDecoration) 0);
103         gtk_widget_show(ld_loaddlg);
104         gdk_window_set_cursor(ld_loaddlg->window, tX_cursor::get_cursor());
105
106         gtk_flush();
107                 
108         return 0;
109 }
110
111 char *strip_path(char *name)
112 {
113         char *tmp;
114
115         if (!name) return NULL;
116         
117         tmp=strrchr(name, (int) '/');
118         
119         if (tmp) {
120                 if (strlen(tmp)>1) {
121                         tmp++;
122                 }
123         } else 
124                 tmp=name;
125                 
126         return(tmp);
127 }
128
129 void ld_set_setname(char *name)
130 {
131         char *setname;
132         char buffer[1024];
133         
134         setname=strip_path(name);
135         sprintf(buffer, "Loading tX-set [%s]", setname);
136         gtk_label_set_text(GTK_LABEL(ld_multi_l), buffer);
137         gtk_flush();
138 }
139
140 void ld_set_filename(char *name)
141 {
142         char *filename;
143         char buffer[1024];
144         gfloat setprog;
145         
146         ld_current++;
147         ld_old_prog=-1;
148         filename=strip_path(name);
149         if (ld_mode==TX_LOADDLG_MODE_MULTI) {
150                 sprintf(buffer, "Loading file No. %i of %i [%s]", ld_current, ld_count, filename);
151         } else {
152                 sprintf(buffer, "Loading file [%s]", filename); 
153         }
154         gtk_label_set_text(GTK_LABEL(ld_single_l), buffer);
155         
156         if (ld_mode==TX_LOADDLG_MODE_MULTI) {
157                 setprog=(((float) ld_current)/((float) ld_count));
158                 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ld_multi_p), setprog);
159                 gtk_flush();            
160         }
161         gtk_flush();
162 }
163
164 void ld_set_progress(gfloat progress)
165 {
166         progress=floor(progress*200.0)/200.0;
167         if (progress>1.0) progress=1.0;
168         
169         if (progress!=ld_old_prog) {
170                 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ld_single_p), progress);
171                 gtk_flush();
172         }
173         
174         ld_old_prog=progress;
175 }
176
177 void ld_destroy()
178 {
179         if (ld_loaddlg) {
180                 gtk_widget_hide(ld_loaddlg);
181                 gtk_widget_destroy(ld_loaddlg);
182         }
183         
184         ld_loaddlg=NULL;
185         mg_update_status();
186 }