a42cf50a0a4bae1abb3c98bc291f1ffbd8850f1e
[terminatorX.git] / src / tX_loaddlg.cc
1 /*
2     terminatorX - realtime audio scratching software
3     Copyright (C) 1999-2020  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, see <http://www.gnu.org/licenses/>.
17  
18     File: tX_loaddlg.cc
19  
20     Description: Displays the progress indicator dialog for file
21                  loading.
22                  
23 */ 
24 #include <gtk/gtk.h>
25 #include "tX_loaddlg.h"
26 #include <math.h>
27 #include <stdio.h>
28 #include <string.h>
29 #include "tX_mastergui.h"
30
31 GtkWidget *ld_loaddlg=(GtkWidget *) NULL;
32 GtkWidget *ld_single_l=(GtkWidget *)NULL;
33 GtkWidget *ld_single_p=(GtkWidget *)NULL;
34 GtkWidget *ld_multi_l=(GtkWidget *)NULL;
35 GtkWidget *ld_multi_p=(GtkWidget *)NULL;
36 //GtkWindow *ld_window=(GtkWindow *)NULL;
37
38 int ld_mode;
39 int ld_count;
40 int ld_current;
41
42 gfloat ld_old_prog;
43
44 #define WID_DYN TRUE, TRUE, 0
45 #define WID_FIX FALSE, FALSE, 0
46 #define add_widget_dyn(wid); gtk_box_pack_start(GTK_BOX(vbox), wid, WID_DYN);\
47         gtk_widget_show(wid);
48         
49 #define add_widget_fix(wid); gtk_box_pack_start(GTK_BOX(vbox), wid, WID_FIX);\
50         gtk_widget_show(wid);
51
52 #define gtk_flush(); { int ctr=0; while (gtk_events_pending()) { ctr++; if (ctr>5) break; gtk_main_iteration(); gdk_flush(); }}
53
54
55 int ld_create_loaddlg(int mode, int count)
56 {
57         GtkWidget *vbox=gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
58         GtkWidget *dummy;
59         
60         if (ld_loaddlg) return 1;
61         
62         ld_mode=mode;
63         ld_count=count;
64
65         ld_loaddlg=gtk_window_new(GTK_WINDOW_TOPLEVEL);
66         gtk_window_set_position(GTK_WINDOW(ld_loaddlg), GTK_WIN_POS_CENTER_ON_PARENT);
67         gtk_window_set_title(GTK_WINDOW(ld_loaddlg), "terminatorX - loading");
68         gtk_window_set_transient_for(GTK_WINDOW(ld_loaddlg), GTK_WINDOW(main_window));
69         
70         gtk_container_set_border_width(GTK_CONTAINER(ld_loaddlg), 5);
71         gtk_container_add(GTK_CONTAINER(ld_loaddlg), vbox);
72         gtk_widget_set_size_request(vbox, 400, -1);
73         gtk_widget_show(vbox);
74         
75         if (mode==TX_LOADDLG_MODE_MULTI) {
76                 ld_multi_l=gtk_label_new("Loading Set");
77                 add_widget_fix(ld_multi_l);
78                 
79                 ld_multi_p=gtk_progress_bar_new();
80                 add_widget_fix(ld_multi_p);
81                 
82                 dummy=gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
83                 add_widget_fix(dummy);
84                 
85                 ld_current=0;
86         }
87         
88         ld_single_l=gtk_label_new("Loading File");
89         add_widget_fix(ld_single_l);
90                 
91         ld_single_p=gtk_progress_bar_new();
92         add_widget_fix(ld_single_p);
93
94         gtk_window_set_modal(GTK_WINDOW(ld_loaddlg), TRUE);
95         gtk_widget_realize(ld_loaddlg);
96         gdk_window_set_decorations(gtk_widget_get_window(ld_loaddlg), (GdkWMDecoration) 0);
97         gtk_widget_show(ld_loaddlg);
98         gdk_window_set_cursor(gtk_widget_get_window(ld_loaddlg), tX_cursor::get_cursor());
99
100         gtk_flush();
101                 
102         return 0;
103 }
104
105 char *strip_path(char *name)
106 {
107         char *tmp;
108
109         if (!name) return NULL;
110         
111         tmp=strrchr(name, (int) '/');
112         
113         if (tmp) {
114                 if (strlen(tmp)>1) {
115                         tmp++;
116                 }
117         } else 
118                 tmp=name;
119                 
120         return(tmp);
121 }
122
123 void ld_set_setname(char *name)
124 {
125         char *setname;
126         char buffer[1024];
127         
128         setname=strip_path(name);
129         sprintf(buffer, "Loading tX-set [%s]", setname);
130         gtk_label_set_text(GTK_LABEL(ld_multi_l), buffer);
131         gtk_flush();
132 }
133
134 void ld_set_filename(char *name)
135 {
136         char *filename;
137         char buffer[1024];
138         gfloat setprog;
139         
140         ld_current++;
141         ld_old_prog=-1;
142         filename=strip_path(name);
143         if (ld_mode==TX_LOADDLG_MODE_MULTI) {
144                 sprintf(buffer, "Loading file No. %i of %i [%s]", ld_current, ld_count, filename);
145         } else {
146                 sprintf(buffer, "Loading file [%s]", filename); 
147         }
148         gtk_label_set_text(GTK_LABEL(ld_single_l), buffer);
149         
150         if (ld_mode==TX_LOADDLG_MODE_MULTI) {
151                 setprog=(((float) ld_current)/((float) ld_count));
152                 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ld_multi_p), setprog);
153                 gtk_flush();            
154         }
155         gtk_flush();
156 }
157
158 void ld_set_progress(gfloat progress)
159 {
160         progress=floor(progress*200.0)/200.0;
161         if (progress>1.0) progress=1.0;
162         
163         if (progress!=ld_old_prog) {
164                 gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(ld_single_p), progress);
165                 gtk_flush();
166         }
167         
168         ld_old_prog=progress;
169 }
170
171 void ld_destroy()
172 {
173         if (ld_loaddlg) {
174                 gtk_widget_hide(ld_loaddlg);
175                 gtk_widget_destroy(ld_loaddlg);
176         }
177         
178         ld_loaddlg=NULL;
179         mg_update_status();
180 }