parent
5c2408db5a
commit
a52f8ecc16
@ -0,0 +1,140 @@
|
|||||||
|
#include "libublsettingsui-gtk3.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
GtkWidget *MainWindow;
|
||||||
|
GtkWidget *StatusBox;
|
||||||
|
GtkWidget *HeadLabel;
|
||||||
|
GtkWidget *WindowImage;
|
||||||
|
|
||||||
|
GtkWidget *CancelButton;
|
||||||
|
GtkWidget *AcceptButton;
|
||||||
|
|
||||||
|
GtkWidget *MainTree;
|
||||||
|
GtkCellRenderer *SelectionCell;
|
||||||
|
GtkTreeStore *treestore;
|
||||||
|
|
||||||
|
GtkWidget *MainIconView;
|
||||||
|
GtkListStore *liststore;
|
||||||
|
|
||||||
|
int apps_size;
|
||||||
|
config_str apps;
|
||||||
|
|
||||||
|
dictionary *apps_convert;
|
||||||
|
|
||||||
|
int multiple;
|
||||||
|
} yon_app_chooser_window;
|
||||||
|
|
||||||
|
struct application {
|
||||||
|
char *name;
|
||||||
|
char *path;
|
||||||
|
char *description;
|
||||||
|
char *tags;
|
||||||
|
char *execute;
|
||||||
|
char *icon;
|
||||||
|
config_str other;
|
||||||
|
int other_size;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
config_str yon_apps_get_from_file(char *file,int *final_size){
|
||||||
|
(*final_size)=0;
|
||||||
|
config_str final = NULL;
|
||||||
|
int size;
|
||||||
|
config_str parsed = yon_dir_get_contents(file,&size);
|
||||||
|
for (int i=0;i<size;i++){
|
||||||
|
if (strstr(parsed[i],".desktop")){
|
||||||
|
char *path = yon_char_unite(file,"/",parsed[i]);
|
||||||
|
yon_char_parsed_add_or_create_if_exists(final,&final_size,path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
yon_char_parsed_free(parsed,size);
|
||||||
|
return final;
|
||||||
|
}
|
||||||
|
|
||||||
|
int yon_apps_get(yon_app_chooser_window *window){
|
||||||
|
window->apps = NULL;
|
||||||
|
window->apps_size=0;
|
||||||
|
int merged_size;
|
||||||
|
config_str merged = NULL;
|
||||||
|
|
||||||
|
// int temp_size;
|
||||||
|
// config_str temp = yon_apps_get_from_file("/usr/shared/applications",&temp_size);
|
||||||
|
|
||||||
|
// int local_size;
|
||||||
|
// config_str local = yon_apps_get_from_file("/usr/local/shared/applications",&temp_size);
|
||||||
|
|
||||||
|
window->apps = yon_apps_get_from_file("/usr/shared/applications",&window->apps_size);
|
||||||
|
return window->apps_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
int yon_app_chooser_convert_apps(yon_app_chooser_window *window){
|
||||||
|
GKeyFile *file = g_key_file_new();
|
||||||
|
window->apps_convert = NULL;
|
||||||
|
for (int i=0;i<window->apps_size;i++){
|
||||||
|
if (g_key_file_load_from_file(file,window->apps[i],G_KEY_FILE_KEEP_TRANSLATIONS,NULL)){
|
||||||
|
struct application *app = new(struct application);
|
||||||
|
app->name = g_key_file_get_string(file,"[Desktop Entry]","Name",NULL);
|
||||||
|
app->description = g_key_file_get_string(file,"[Desktop Entry]","Comment",NULL);
|
||||||
|
app->tags = g_key_file_get_string(file,"[Desktop Entry]","Categories",NULL);
|
||||||
|
app->execute = g_key_file_get_string(file,"[Desktop Entry]","Exec",NULL);
|
||||||
|
app->icon = g_key_file_get_string(file,"[Desktop Entry]","Icon",NULL);
|
||||||
|
app->path = yon_char_new(window->apps[i]);
|
||||||
|
yon_dictionary_add_or_create_if_exists_with_data(window->apps_convert,app->name,app);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (window->apps_convert) return 1; else return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int yon_tree_store_setup_apps(yon_app_chooser_window *window){
|
||||||
|
GtkTreeIter iter,itar;
|
||||||
|
GtkTreeModel *model = GTK_TREE_MODEL(window->treestore);
|
||||||
|
for_iter (model,&iter){
|
||||||
|
char *tags;
|
||||||
|
gtk_tree_model_get(model,&iter,3,&tags,-1);
|
||||||
|
int required_size;
|
||||||
|
config_str required_tags = yon_char_parse(tags,&required_size,";");
|
||||||
|
|
||||||
|
dictionary *dict;
|
||||||
|
for_dictionaries(dict,window->apps_convert){
|
||||||
|
int parsed_size;
|
||||||
|
struct application *cur_app = (struct application*)dict->data;
|
||||||
|
config_str parsed_tags = yon_char_parse(cur_app->tags,&parsed_size,";");
|
||||||
|
if (yon_char_parsed_includes_char_parsed(required_tags,parsed_tags,required_size,parsed_size)){
|
||||||
|
gtk_tree_store_append(window->treestore,&itar,&iter);
|
||||||
|
gtk_tree_store_set(window->treestore,&itar,0,0,1,cur_app->name,2,cur_app->description,3,cur_app->tags,4,0,5,cur_app->icon,6,cur_app->execute,-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
yon_app_chooser_window *yon_app_chooser_window_new(int multiple_choise){
|
||||||
|
yon_app_chooser_window *window = new(yon_app_chooser_window);
|
||||||
|
GtkBuilder *builder = gtk_builder_new_from_resource(ui_glade_path_app_chooser);
|
||||||
|
window->MainWindow = yon_gtk_builder_get_widget(builder,"MainWindow");
|
||||||
|
window->StatusBox = yon_gtk_builder_get_widget(builder,"StatusBox");
|
||||||
|
window->HeadLabel = yon_gtk_builder_get_widget(builder,"HeadLabel");
|
||||||
|
window->WindowImage = yon_gtk_builder_get_widget(builder,"WindowImage");
|
||||||
|
|
||||||
|
window->CancelButton = yon_gtk_builder_get_widget(builder,"CancelButton");
|
||||||
|
window->AcceptButton = yon_gtk_builder_get_widget(builder,"AcceptButton");
|
||||||
|
|
||||||
|
window->MainTree = yon_gtk_builder_get_widget(builder,"MainTree");
|
||||||
|
window->SelectionCell = GTK_CELL_RENDERER(gtk_builder_get_object(builder,"MainWindow"));
|
||||||
|
window->treestore = GTK_TREE_STORE(gtk_builder_get_object(builder,"MainWindow"));
|
||||||
|
|
||||||
|
window->MainIconView = yon_gtk_builder_get_widget(builder,"MainIconView");
|
||||||
|
window->liststore = GTK_LIST_STORE(gtk_builder_get_object(builder,"MainWindow"));
|
||||||
|
|
||||||
|
g_signal_connect(G_OBJECT(window->CancelButton),"clicked",G_CALLBACK(on_subwindow_close),NULL);
|
||||||
|
g_signal_connect(G_OBJECT(window->AcceptButton),"clicked",G_CALLBACK(on_app_chooser_accept),window);
|
||||||
|
g_signal_connect(G_OBJECT(window->SelectionCell),"toggled",G_CALLBACK(on_app_selection_toggled),window);
|
||||||
|
|
||||||
|
window->multiple = multiple_choise;
|
||||||
|
|
||||||
|
if (!yon_apps_get(window)) return NULL;
|
||||||
|
if (!yon_app_chooser_convert_apps(window)) return NULL;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
Reference in new issue