From e482336d47e4af6e6449fba63c3f3e785a327baa Mon Sep 17 00:00:00 2001 From: Ivan Yarcev Date: Mon, 29 Sep 2025 18:34:27 +0600 Subject: [PATCH] WIP Advanced install --- source/CMakeLists.txt | 1 + source/ubinstall-gtk-advanced.c | 256 ++++++++++++++++++++++++++++ source/ubinstall-gtk-installation.c | 150 +--------------- source/ubinstall-gtk.c | 4 +- source/ubinstall-gtk.h | 28 ++- source/ubl-settings-advanced.c | 64 ------- 6 files changed, 291 insertions(+), 212 deletions(-) create mode 100644 source/ubinstall-gtk-advanced.c delete mode 100644 source/ubl-settings-advanced.c diff --git a/source/CMakeLists.txt b/source/CMakeLists.txt index 3174321..7f8ebf7 100644 --- a/source/CMakeLists.txt +++ b/source/CMakeLists.txt @@ -125,6 +125,7 @@ endif() set(SOURCE_FILES ubinstall-gtk.c + ubinstall-gtk-advanced.c ubinstall-gtk-page-switch.c ubinstall-gtk-keyboard.c ubinstall-gtk-region.c diff --git a/source/ubinstall-gtk-advanced.c b/source/ubinstall-gtk-advanced.c new file mode 100644 index 0000000..fca3dd9 --- /dev/null +++ b/source/ubinstall-gtk-advanced.c @@ -0,0 +1,256 @@ +#include "ubinstall-gtk.h" + +advanced_section *yon_advanced_section_new(); +void yon_advanced_section_remove(); + +int sections_size=0; +advanced_section *sections[2] = {NULL}; + +advanced_section *yon_advanced_section_new(){ + if (sections_size>=2) return NULL; + advanced_section *section = malloc(sizeof(advanced_section)); + memset(section,0,sizeof(advanced_section)); + return section; +} + +void yon_advanced_section_remove(char *part){ + int pos = yon_advanced_section_get(part); + switch(pos){ + case 0: + if (sections[0]){ + free(sections[0]); + if (sections[1]){ + sections[0]=sections[1]; + sections[1]=NULL; + } else { + sections[0]=NULL; + } + sections_size--; + } + break; + case 1: + if (sections[1]){ + free(sections[1]); + sections[1]=NULL; + sections_size--; + } + break; + default: return; + } +} + +int yon_advanced_section_get(char *partition){ + if (yon_char_is_empty(partition)) return -1; + if (sections_size>0&&!strcmp(sections[0]->part_label,partition)){ + return 0; + } else if (sections_size>1&&!strcmp(sections[1]->part_label,partition)){ + return 1; + } + return -1; +} + +void yon_advanced_partition_set_from_section(advanced_partition *part, advanced_section *section){ + gtk_label_set_text(GTK_LABEL(part->SectionLabel),section->part_label); + if (section->format){ + gtk_switch_set_active(GTK_SWITCH(part->FormatSwitch),1); + gtk_spin_button_set_value(GTK_SPIN_BUTTON(part->SizeSpin),section->size); + gtk_combo_box_set_active(GTK_COMBO_BOX(part->SizeCombo),yon_get_size_get_from_letter(section->size_letter)); + gtk_entry_set_text(GTK_ENTRY(part->PartLabelEntry),section->part_label); + gtk_entry_set_text(GTK_ENTRY(part->FileSystemLabelEntry),section->fs_label); + gtk_combo_box_set_active_id(GTK_COMBO_BOX(part->FileSystemTypeCombo),section->fs_type); + gtk_combo_box_set_active_id(GTK_COMBO_BOX(part->EncryptionCombo),section->encryption); + gtk_entry_set_text(GTK_ENTRY(part->EncryptionEntry),section->encryption_password); + } + +} + +void yon_advanced_update(main_window *widgets){ + GList *list = gtk_container_get_children(GTK_CONTAINER(widgets->AdvancedPartitionAddBox)); + GList *iter; + for (iter = list; iter; iter=iter->next){ + gtk_widget_destroy(GTK_WIDGET(iter->data)); + } + for (int i=0;iAdvancedPartitionAddBox),part->MainBox,0,0,0); + } +} + +void on_advanced_partition_create(GtkWidget *, main_window *widgets){ + GtkTreeIter iter; + for_iter(GTK_TREE_MODEL(widgets->DevicesList),&iter){ + char *target; + int active; + gtk_tree_model_get(GTK_TREE_MODEL(widgets->DevicesList),&iter,0,&target,3,&active,-1); + gtk_list_store_set(widgets->DevicesList,&iter,3,!active,-1); + if (!active){ + if (sections_size==2) return; + advanced_section *section = yon_advanced_section_new(); + sections[sections_size]=section; + sections_size++; + } + } + yon_advanced_update(widgets); +} + +void on_advanced_partition_add(GtkWidget *, char *path, main_window *widgets){ + GtkTreeIter iter; + if (gtk_tree_model_get_iter_from_string(GTK_TREE_MODEL(widgets->PartitionsList),&iter,path)){ + char *target; + int status; + gtk_tree_model_get(GTK_TREE_MODEL(widgets->PartitionsList),&iter,0,&target,5,&status,-1); + gtk_list_store_set(widgets->DevicesList,&iter,3,!status,-1); + if (!status){ + if (sections_size==2) return; + advanced_section *section = yon_advanced_section_new(); + sections[sections_size]=section; + sections_size++; + } else { + yon_advanced_section_remove(target); + } + } + yon_advanced_update(widgets); + +} + +void yon_install_advanced_init(main_window *){ +} + +void on_install_advanced_partition_chosen(GtkCellRenderer*, gchar *path, main_window *widgets){ + GtkTreeIter iter; + GtkTreeModel *model = GTK_TREE_MODEL(widgets->PartitionsList); + + int chosen = 0; + chosen = yon_advanced_get_part_size(widgets); + + gtk_tree_model_get_iter_from_string(model,&iter,path); + int status; + char *target_part; + gtk_tree_model_get(model,&iter,0,&target_part,7,&status,-1); + + if (!status){ + if (chosen<2){ + gtk_list_store_set(widgets->PartitionsList,&iter,7,!status,-1); + chosen++; + advanced_partition *part = yon_advanced_partition_new(); + part->part_type = ADVANCED_PART_EXISTING; + part->order_iter = g_sequence_append(widgets->advanced_partition_order,part); + part->part = target_part; + gtk_box_pack_start(GTK_BOX(widgets->AdvancedPartitionAddBox),part->MainBox,0,0,0); + gtk_widget_show(part->MainBox); + yon_advanced_partition_setup(part,widgets); + on_advanced_parts_added(NULL,NULL,widgets); + } + } else { + gtk_list_store_set(widgets->PartitionsList,&iter,7,!status,-1); + advanced_partition *part = g_object_get_data(G_OBJECT(widgets->AdvancedPartitionAddBox),target_part); + if (part){ + on_advanced_part_remove(part->RemoveButton,widgets); + } + } +} + +void yon_advanced_parts_update(main_window *widgets){ + int size; + config_str partitions; + partitions = yon_config_load(yon_debug_output("%s\n",get_parts_and_devices_command),&size); + for (int i=0;iDevicesList); + GtkTreeIter iter; + for_iter (model,&iter){ + char *disk_path; + int status; + gtk_tree_model_get(model,&iter,0,&disk_path,5,&status,-1); + if (!status) continue; + + for (int i=0;i2){ + char sizemod='\0'; + capacity_long = atol(parsed[2]); + + char *temp = yon_char_from_double(yon_size_long_convert_automatic(capacity_long,&sizemod)); + capacity = yon_char_append_c(temp,sizemod); + free(temp); + } + if (parsed_size>7&&!yon_char_is_empty(parsed[7])){ + char sizemod='\0'; + free_space_long = capacity_long-atol(parsed[7]); + char *temp = yon_char_from_double(yon_size_long_convert_automatic(free_space_long,&sizemod)); + free_space = yon_char_append_c(temp,sizemod); + free(temp); + } + if (parsed_size>3){ + fs_type = parsed[3]; + } + if (parsed_size>4){ + label = parsed[4]; + } + + GtkTreeIter itar; + gtk_list_store_append(widgets->PartitionsList,&itar); + gtk_list_store_set(widgets->PartitionsList,&itar,0,name,1,capacity,2,free_space,3,fs_type,4,label,5,capacity_long,6,free_space_long,8,1,-1); + } + yon_char_parsed_free(parsed,parsed_size); + } + } + } + yon_char_parsed_free(partitions,size); +} + +void on_install_advanced_device_chosen(GtkCellRenderer *, gchar *path, main_window *widgets){ + gtk_list_store_clear(widgets->PartitionsList); + yon_advanced_partition_clear(widgets); + GtkTreeIter iter; + GtkTreeModel *model = GTK_TREE_MODEL(widgets->DevicesList); + + int chosen = 0; + chosen = yon_advanced_get_part_size(widgets); + + if (gtk_tree_model_get_iter_from_string(model,&iter,path)){ + int status; + char *target; + gtk_tree_model_get(model,&iter,0,&target,5,&status,-1); + if (!status){ // checks + if (chosen <2){ + gtk_list_store_set(widgets->DevicesList,&iter,5,!status,-1); + chosen++; + } else { + for_iter (model,&iter){ + gtk_tree_model_get(model,&iter,5,&status,-1); + if (!status){ + gtk_list_store_set(widgets->DevicesList,&iter,6,0,-1); + } + } + + } + } else { // unchecks + gtk_list_store_set(widgets->DevicesList,&iter,5,!status,-1); + if (chosen == 2){ + for_iter (model,&iter){ + gtk_list_store_set(widgets->DevicesList,&iter,6,1,-1); + } + } + chosen--; + } + } + + if (chosen) gtk_widget_set_sensitive(widgets->AdvancedAddButton,1); + else gtk_widget_set_sensitive(widgets->AdvancedAddButton,0); + yon_advanced_parts_update(widgets); +} \ No newline at end of file diff --git a/source/ubinstall-gtk-installation.c b/source/ubinstall-gtk-installation.c index 064d435..b20b5e1 100644 --- a/source/ubinstall-gtk-installation.c +++ b/source/ubinstall-gtk-installation.c @@ -195,13 +195,13 @@ int yon_advanced_sections_save(dictionary *dict){ char *size = yon_char_unite(size_first,size_last?",":NULL,size_last,NULL); yon_config_register(part_size_parameter,part_size_parameter_command,size); - char *part_label_first = (char*)gtk_entry_get_text(GTK_ENTRY(first_section->SectionMarkEntry)); - char *part_label_last = last_section&&!strcmp(format_last,"yes")?(char*)gtk_entry_get_text(GTK_ENTRY(last_section->SectionMarkEntry)):NULL; + char *part_label_first = (char*)gtk_entry_get_text(GTK_ENTRY(first_section->PartLabelEntry)); + char *part_label_last = last_section&&!strcmp(format_last,"yes")?(char*)gtk_entry_get_text(GTK_ENTRY(last_section->PartLabelEntry)):NULL; char *part_label = yon_char_unite(part_label_first,part_label_last?",":NULL,part_label_last,NULL); yon_config_register(part_label_parameter,part_label_parameter_command,part_label); - char *fs_label_first = (char*)gtk_entry_get_text(GTK_ENTRY(first_section->FileSystemMarkentry)); - char *fs_label_last = last_section&&!strcmp(format_last,"yes")?(char*)gtk_entry_get_text(GTK_ENTRY(last_section->FileSystemMarkentry)):NULL; + char *fs_label_first = (char*)gtk_entry_get_text(GTK_ENTRY(first_section->FileSystemLabelEntry)); + char *fs_label_last = last_section&&!strcmp(format_last,"yes")?(char*)gtk_entry_get_text(GTK_ENTRY(last_section->FileSystemLabelEntry)):NULL; char *fs_label = yon_char_unite(fs_label_first,fs_label_last?",":NULL,fs_label_last,NULL); yon_config_register(part_fs_label_parameter,part_fs_label_parameter_command,fs_label); @@ -279,11 +279,6 @@ int yon_install_advanced_save(main_window *widgets){ return 1; } -void yon_install_advanced_init(main_window *){ - // char *boot = config(boot_parameter); - // char *swap = config(swap_parameter); -} - void yon_set_max_size_from_partition(GtkTreeView *table, GtkSpinButton *spin_button, GtkComboBox *spin_combo){ GtkTreeModel *model; GtkTreeIter iter; @@ -641,9 +636,9 @@ advanced_partition *yon_advanced_partition_new(){ part->FormatSwitch = yon_gtk_builder_get_widget(builder,"FormatSwitch"); part->SizeSpin = yon_gtk_builder_get_widget(builder,"SizeSpin"); part->SizeCombo = yon_gtk_builder_get_widget(builder,"SizeCombo"); - part->SectionMarkEntry = yon_gtk_builder_get_widget(builder,"SectionMarkEntry"); + part->PartLabelEntry = yon_gtk_builder_get_widget(builder,"PartLabelEntry"); part->FileSystemTypeCombo = yon_gtk_builder_get_widget(builder,"FileSystemTypeCombo"); - part->FileSystemMarkentry = yon_gtk_builder_get_widget(builder,"FileSystemMarkentry"); + part->FileSystemLabelEntry = yon_gtk_builder_get_widget(builder,"FileSystemLabelEntry"); part->EncryptionCombo = yon_gtk_builder_get_widget(builder,"EncryptionCombo"); part->EncryptionEntry = yon_gtk_builder_get_widget(builder,"EncryptionEntry"); part->EncryptionButton = yon_gtk_builder_get_widget(builder,"EncryptionButton"); @@ -719,136 +714,3 @@ void on_install_advanced_add_new(GtkWidget *, main_window *widgets){ yon_advanced_partition_setup(part,widgets); on_advanced_parts_added(NULL,NULL,widgets); } - -void on_install_advanced_device_chosen(GtkCellRenderer *, gchar *path, main_window *widgets){ - gtk_list_store_clear(widgets->PartitionsList); - yon_advanced_partition_clear(widgets); - - int size; - config_str partitions; - partitions = yon_config_load(yon_debug_output("%s\n",get_parts_and_devices_command),&size); - for (int i=0;iDevicesList); - - int chosen = 0; - chosen = yon_advanced_get_part_size(widgets); - - if (gtk_tree_model_get_iter_from_string(model,&iter,path)){ - int status; - gtk_tree_model_get(model,&iter,5,&status,-1); - if (!status){ - if (chosen <2){ - gtk_list_store_set(widgets->DevicesList,&iter,5,!status,-1); - chosen++; - } else { - for_iter (model,&iter){ - gtk_tree_model_get(model,&iter,5,&status,-1); - if (!status){ - gtk_list_store_set(widgets->DevicesList,&iter,6,0,-1); - } - } - - } - } else { - gtk_list_store_set(widgets->DevicesList,&iter,5,!status,-1); - if (chosen == 2){ - for_iter (model,&iter){ - gtk_list_store_set(widgets->DevicesList,&iter,6,1,-1); - } - } - chosen--; - } - } - - if (chosen) gtk_widget_set_sensitive(widgets->AdvancedAddButton,1); - else gtk_widget_set_sensitive(widgets->AdvancedAddButton,0); - - for_iter (model,&iter){ - char *disk_path; - int status; - gtk_tree_model_get(model,&iter,0,&disk_path,5,&status,-1); - if (!status) continue; - - for (int i=0;i2){ - char sizemod='\0'; - capacity_long = atol(parsed[2]); - - char *temp = yon_char_from_double(yon_size_long_convert_automatic(capacity_long,&sizemod)); - capacity = yon_char_append_c(temp,sizemod); - free(temp); - } - if (parsed_size>7&&!yon_char_is_empty(parsed[7])){ - char sizemod='\0'; - free_space_long = capacity_long-atol(parsed[7]); - char *temp = yon_char_from_double(yon_size_long_convert_automatic(free_space_long,&sizemod)); - free_space = yon_char_append_c(temp,sizemod); - free(temp); - } - if (parsed_size>3){ - fs_type = parsed[3]; - } - if (parsed_size>4){ - label = parsed[4]; - } - - GtkTreeIter itar; - gtk_list_store_append(widgets->PartitionsList,&itar); - gtk_list_store_set(widgets->PartitionsList,&itar,0,name,1,capacity,2,free_space,3,fs_type,4,label,5,capacity_long,6,free_space_long,8,1,-1); - } - yon_char_parsed_free(parsed,parsed_size); - } - } - } - -} - -void on_install_advanced_partition_chosen(GtkCellRenderer*, gchar *path, main_window *widgets){ - GtkTreeIter iter; - GtkTreeModel *model = GTK_TREE_MODEL(widgets->PartitionsList); - - int chosen = 0; - chosen = yon_advanced_get_part_size(widgets); - - gtk_tree_model_get_iter_from_string(model,&iter,path); - int status; - char *target_part; - gtk_tree_model_get(model,&iter,0,&target_part,7,&status,-1); - - if (!status){ - if (chosen<2){ - gtk_list_store_set(widgets->PartitionsList,&iter,7,!status,-1); - chosen++; - advanced_partition *part = yon_advanced_partition_new(); - part->part_type = ADVANCED_PART_EXISTING; - part->order_iter = g_sequence_append(widgets->advanced_partition_order,part); - part->part = target_part; - gtk_box_pack_start(GTK_BOX(widgets->AdvancedPartitionAddBox),part->MainBox,0,0,0); - gtk_widget_show(part->MainBox); - yon_advanced_partition_setup(part,widgets); - on_advanced_parts_added(NULL,NULL,widgets); - } - } else { - gtk_list_store_set(widgets->PartitionsList,&iter,7,!status,-1); - advanced_partition *part = g_object_get_data(G_OBJECT(widgets->AdvancedPartitionAddBox),target_part); - if (part){ - on_advanced_part_remove(part->RemoveButton,widgets); - } - } -} \ No newline at end of file diff --git a/source/ubinstall-gtk.c b/source/ubinstall-gtk.c index e00263c..99e9cfb 100644 --- a/source/ubinstall-gtk.c +++ b/source/ubinstall-gtk.c @@ -886,7 +886,7 @@ void yon_main_window_create(main_window *widgets){ g_signal_connect(G_OBJECT(widgets->AdvancedSwapFixedSwitch),"state-set",G_CALLBACK(yon_gtk_widget_set_sensitive_from_switch),widgets->AdvancedSwapFixedSpin); g_signal_connect(G_OBJECT(widgets->AdvancedSwapFixedSwitch),"state-set",G_CALLBACK(yon_gtk_widget_set_sensitive_from_switch),widgets->AdvancedSwapFixedSizeSwitch); - g_signal_connect(G_OBJECT(widgets->AdvancedAddButton),"clicked",G_CALLBACK(on_install_advanced_add_new),widgets); + // g_signal_connect(G_OBJECT(widgets->AdvancedAddButton),"clicked",G_CALLBACK(on_install_advanced_add_new),widgets); g_signal_connect(G_OBJECT(widgets->AdvancedDeviceChosenCell),"toggled",G_CALLBACK(on_install_advanced_device_chosen),widgets); g_signal_connect(G_OBJECT(widgets->AdvancedPartChosenCell),"toggled",G_CALLBACK(on_install_advanced_partition_chosen),widgets); g_signal_connect(G_OBJECT(widgets->KeyboardLayoutChosenCell),"toggled",G_CALLBACK(on_keyboard_layout_chosen),widgets); @@ -895,6 +895,8 @@ void yon_main_window_create(main_window *widgets){ g_signal_connect(G_OBJECT(widgets->StartScenarioButton),"clicked",G_CALLBACK(yon_quick_install),widgets); g_signal_connect(G_OBJECT(widgets->SourceButton),"clicked",G_CALLBACK(on_source_clicked),widgets); g_signal_connect(G_OBJECT(widgets->SkipInstallationButton),"clicked",G_CALLBACK(on_system_setup_pass),widgets); + // g_signal_connect(G_OBJECT(widgets->AdvancedAddButton),"clicked",G_CALLBACK(on_advanced_new),widgets); + // g_signal_connect(G_OBJECT(widgets->AdvancedPartChosenCell),"toggled",G_CALLBACK(on_advanced_added),widgets); gtk_tree_model_filter_set_visible_func(GTK_TREE_MODEL_FILTER(widgets->InstallerCountryFilter),(GtkTreeModelFilterVisibleFunc)on_country_filter,widgets,NULL); { diff --git a/source/ubinstall-gtk.h b/source/ubinstall-gtk.h index 307e6a6..c590248 100755 --- a/source/ubinstall-gtk.h +++ b/source/ubinstall-gtk.h @@ -701,9 +701,9 @@ typedef struct { GtkWidget *FormatRevealer; GtkWidget *SizeSpin; GtkWidget *SizeCombo; - GtkWidget *SectionMarkEntry; + GtkWidget *PartLabelEntry; GtkWidget *FileSystemTypeCombo; - GtkWidget *FileSystemMarkentry; + GtkWidget *FileSystemLabelEntry; GtkWidget *EncryptionCombo; GtkWidget *EncryptionEntry; GtkWidget *EncryptionButton; @@ -930,6 +930,20 @@ typedef struct { } source_element; +typedef struct { + char *partition; + char *device_source; + gboolean format; + unsigned long size; + char size_letter; + char *part_label; + char *fs_type; + char *fs_label; + char *encryption; + char *encryption_password; +} advanced_section; + + void config_init(); main_window *yon_main_window_complete(); ubinstall_language_window *yon_ubinstall_language_new(); @@ -1139,4 +1153,12 @@ gboolean on_country_filter(GtkTreeModel *self, GtkTreeIter *iter, main_window *w int yon_char_parsed_compare(const void *a, const void *b); gboolean yon_os_component_insert(os_row *row); void *yon_os_components_setup(main_window *widgets); -gboolean yon_spinner_switch_off(GtkSpinner *target); \ No newline at end of file +gboolean yon_spinner_switch_off(GtkSpinner *target); +void on_advanced_added(GtkWidget *, char *, main_window *); +void on_advanced_new(GtkWidget *, main_window *); +int yon_advanced_section_get(char *partition); +void yon_advanced_partition_set_from_section(advanced_partition *part, advanced_section *section); +void yon_advanced_update(main_window *widgets); +void on_advanced_partition_create(GtkWidget *, main_window *widgets); +void yon_advanced_parts_update(main_window *widgets); +void on_advanced_partition_add(GtkWidget *, char *path, main_window *widgets); \ No newline at end of file diff --git a/source/ubl-settings-advanced.c b/source/ubl-settings-advanced.c deleted file mode 100644 index 57c7fed..0000000 --- a/source/ubl-settings-advanced.c +++ /dev/null @@ -1,64 +0,0 @@ -#include "ubinstall-gtk.h" - -typedef struct { - char *section; - int sys_section; - int user_section; - int format; - int size; - char size_letter; - char *part_label; - char *fs_type; - char *fs_label; - char *encryption; - char *encryption_password; - -} advanced_section; - -int sections_size=0; -advanced_section *sections[2] = {NULL}; - -advanced_section *yon_advanced_section_new(){ - if (sections_size>=2) return NULL; - - advanced_section *section = malloc(sizeof(advanced_section)); - memset(section,0,sizeof(advanced_section)); - sections[sections_size] = section; - sections_size++; - return section; -} - -void yon_advanced_section_remove(int pos){ - switch(pos){ - case 0: - free(sections[0]); - if (sections[1]){ - sections[0]=sections[1]; - sections[1]=NULL; - } else { - sections[0]=NULL; - } - sections_size--; - break; - case 1: - if (sections[1]){ - free(sections[1]); - sections[1]=NULL; - sections_size--; - } - break; - default: return; - } -} - - - -// add section from tree view -void yon_advanced_add(main_window *widgets){ - -} - -//new section from button -void yon_advanced_new(main_window *widgets){ - -} \ No newline at end of file