Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_spreadsheet/space_spreadsheet.cc
| Show First 20 Lines • Show All 106 Lines • ▼ Show 20 Lines | static SpaceLink *spreadsheet_create(const ScrArea *UNUSED(area), const Scene *UNUSED(scene)) | ||||
| return (SpaceLink *)spreadsheet_space; | return (SpaceLink *)spreadsheet_space; | ||||
| } | } | ||||
| static void spreadsheet_free(SpaceLink *sl) | static void spreadsheet_free(SpaceLink *sl) | ||||
| { | { | ||||
| SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)sl; | SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)sl; | ||||
| MEM_SAFE_FREE(sspreadsheet->runtime); | delete sspreadsheet->runtime; | ||||
| LISTBASE_FOREACH_MUTABLE (SpreadsheetRowFilter *, row_filter, &sspreadsheet->row_filters) { | LISTBASE_FOREACH_MUTABLE (SpreadsheetRowFilter *, row_filter, &sspreadsheet->row_filters) { | ||||
| spreadsheet_row_filter_free(row_filter); | spreadsheet_row_filter_free(row_filter); | ||||
| } | } | ||||
| LISTBASE_FOREACH_MUTABLE (SpreadsheetColumn *, column, &sspreadsheet->columns) { | LISTBASE_FOREACH_MUTABLE (SpreadsheetColumn *, column, &sspreadsheet->columns) { | ||||
| spreadsheet_column_free(column); | spreadsheet_column_free(column); | ||||
| } | } | ||||
| LISTBASE_FOREACH_MUTABLE (SpreadsheetContext *, context, &sspreadsheet->context_path) { | LISTBASE_FOREACH_MUTABLE (SpreadsheetContext *, context, &sspreadsheet->context_path) { | ||||
| spreadsheet_context_free(context); | spreadsheet_context_free(context); | ||||
| } | } | ||||
| } | } | ||||
| static void spreadsheet_init(wmWindowManager *UNUSED(wm), ScrArea *area) | static void spreadsheet_init(wmWindowManager *UNUSED(wm), ScrArea *area) | ||||
| { | { | ||||
| SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)area->spacedata.first; | SpaceSpreadsheet *sspreadsheet = (SpaceSpreadsheet *)area->spacedata.first; | ||||
| if (sspreadsheet->runtime == nullptr) { | if (sspreadsheet->runtime == nullptr) { | ||||
| sspreadsheet->runtime = (SpaceSpreadsheet_Runtime *)MEM_callocN( | sspreadsheet->runtime = new SpaceSpreadsheet_Runtime(); | ||||
| sizeof(SpaceSpreadsheet_Runtime), __func__); | |||||
| } | } | ||||
| } | } | ||||
| static SpaceLink *spreadsheet_duplicate(SpaceLink *sl) | static SpaceLink *spreadsheet_duplicate(SpaceLink *sl) | ||||
| { | { | ||||
| const SpaceSpreadsheet *sspreadsheet_old = (SpaceSpreadsheet *)sl; | const SpaceSpreadsheet *sspreadsheet_old = (SpaceSpreadsheet *)sl; | ||||
| SpaceSpreadsheet *sspreadsheet_new = (SpaceSpreadsheet *)MEM_dupallocN(sspreadsheet_old); | SpaceSpreadsheet *sspreadsheet_new = (SpaceSpreadsheet *)MEM_dupallocN(sspreadsheet_old); | ||||
| sspreadsheet_new->runtime = (SpaceSpreadsheet_Runtime *)MEM_dupallocN(sspreadsheet_old->runtime); | sspreadsheet_new->runtime = new SpaceSpreadsheet_Runtime(*sspreadsheet_old->runtime); | ||||
| BLI_listbase_clear(&sspreadsheet_new->row_filters); | BLI_listbase_clear(&sspreadsheet_new->row_filters); | ||||
| LISTBASE_FOREACH (const SpreadsheetRowFilter *, src_filter, &sspreadsheet_old->row_filters) { | LISTBASE_FOREACH (const SpreadsheetRowFilter *, src_filter, &sspreadsheet_old->row_filters) { | ||||
| SpreadsheetRowFilter *new_filter = spreadsheet_row_filter_copy(src_filter); | SpreadsheetRowFilter *new_filter = spreadsheet_row_filter_copy(src_filter); | ||||
| BLI_addtail(&sspreadsheet_new->row_filters, new_filter); | BLI_addtail(&sspreadsheet_new->row_filters, new_filter); | ||||
| } | } | ||||
| BLI_listbase_clear(&sspreadsheet_new->columns); | BLI_listbase_clear(&sspreadsheet_new->columns); | ||||
| LISTBASE_FOREACH (SpreadsheetColumn *, src_column, &sspreadsheet_old->columns) { | LISTBASE_FOREACH (SpreadsheetColumn *, src_column, &sspreadsheet_old->columns) { | ||||
| ▲ Show 20 Lines • Show All 139 Lines • ▼ Show 20 Lines | static std::unique_ptr<DataSource> get_data_source(const bContext *C) | ||||
| Object *object_eval = spreadsheet_get_object_eval(sspreadsheet, depsgraph); | Object *object_eval = spreadsheet_get_object_eval(sspreadsheet, depsgraph); | ||||
| if (object_eval) { | if (object_eval) { | ||||
| return data_source_from_geometry(C, object_eval); | return data_source_from_geometry(C, object_eval); | ||||
| } | } | ||||
| return {}; | return {}; | ||||
| } | } | ||||
| static float get_column_width(const ColumnValues &values) | static float get_default_column_width(const ColumnValues &values) | ||||
| { | { | ||||
| if (values.default_width > 0) { | if (values.default_width > 0.0f) { | ||||
| return values.default_width; | return values.default_width; | ||||
| } | } | ||||
| static const float float_width = 3; | |||||
| switch (values.type()) { | |||||
| case SPREADSHEET_VALUE_TYPE_BOOL: | |||||
| return 2.0f; | |||||
| case SPREADSHEET_VALUE_TYPE_INT32: | |||||
| return float_width; | |||||
| case SPREADSHEET_VALUE_TYPE_FLOAT: | |||||
| return float_width; | |||||
| case SPREADSHEET_VALUE_TYPE_FLOAT2: | |||||
| return 2.0f * float_width; | |||||
| case SPREADSHEET_VALUE_TYPE_FLOAT3: | |||||
| return 3.0f * float_width; | |||||
| case SPREADSHEET_VALUE_TYPE_COLOR: | |||||
| return 4.0f * float_width; | |||||
| case SPREADSHEET_VALUE_TYPE_INSTANCES: | |||||
| return 8.0f; | |||||
| } | |||||
| return float_width; | |||||
| } | |||||
| static float get_column_width(const ColumnValues &values) | |||||
| { | |||||
| float data_width = get_default_column_width(values); | |||||
| const int fontid = UI_style_get()->widget.uifont_id; | const int fontid = UI_style_get()->widget.uifont_id; | ||||
| BLF_size(fontid, UI_DEFAULT_TEXT_POINTS, U.dpi); | BLF_size(fontid, UI_DEFAULT_TEXT_POINTS, U.dpi); | ||||
| const StringRefNull name = values.name(); | const StringRefNull name = values.name(); | ||||
| const float name_width = BLF_width(fontid, name.data(), name.size()); | const float name_width = BLF_width(fontid, name.data(), name.size()); | ||||
| return std::max<float>(name_width / UI_UNIT_X + 1.0f, 3.0f); | return std::max<float>(name_width / UI_UNIT_X + 1.0f, data_width); | ||||
| } | } | ||||
| static float get_column_width_in_pixels(const ColumnValues &values) | static float get_column_width_in_pixels(const ColumnValues &values) | ||||
| { | { | ||||
| return get_column_width(values) * SPREADSHEET_WIDTH_UNIT; | return get_column_width(values) * SPREADSHEET_WIDTH_UNIT; | ||||
| } | } | ||||
| static int get_index_column_width(const int tot_rows) | static int get_index_column_width(const int tot_rows) | ||||
| Show All 19 Lines | LISTBASE_FOREACH_MUTABLE (SpreadsheetColumn *, column, &columns) { | ||||
| if (!used_ids.add(*column->id)) { | if (!used_ids.add(*column->id)) { | ||||
| /* Remove duplicate columns for now. */ | /* Remove duplicate columns for now. */ | ||||
| BLI_remlink(&columns, column); | BLI_remlink(&columns, column); | ||||
| spreadsheet_column_free(column); | spreadsheet_column_free(column); | ||||
| continue; | continue; | ||||
| } | } | ||||
| } | } | ||||
| data_source.foreach_default_column_ids([&](const SpreadsheetColumnID &column_id) { | data_source.foreach_default_column_ids( | ||||
| [&](const SpreadsheetColumnID &column_id, const bool is_extra) { | |||||
| std::unique_ptr<ColumnValues> values = data_source.get_column_values(column_id); | std::unique_ptr<ColumnValues> values = data_source.get_column_values(column_id); | ||||
| if (values) { | if (values) { | ||||
| if (used_ids.add(column_id)) { | if (used_ids.add(column_id)) { | ||||
| SpreadsheetColumnID *new_id = spreadsheet_column_id_copy(&column_id); | SpreadsheetColumnID *new_id = spreadsheet_column_id_copy(&column_id); | ||||
| SpreadsheetColumn *new_column = spreadsheet_column_new(new_id); | SpreadsheetColumn *new_column = spreadsheet_column_new(new_id); | ||||
| if (is_extra) { | |||||
| BLI_addhead(&columns, new_column); | |||||
| } | |||||
| else { | |||||
| BLI_addtail(&columns, new_column); | BLI_addtail(&columns, new_column); | ||||
| } | } | ||||
| } | } | ||||
| } | |||||
| }); | }); | ||||
| } | } | ||||
| static void spreadsheet_main_region_draw(const bContext *C, ARegion *region) | static void spreadsheet_main_region_draw(const bContext *C, ARegion *region) | ||||
| { | { | ||||
| SpaceSpreadsheet *sspreadsheet = CTX_wm_space_spreadsheet(C); | SpaceSpreadsheet *sspreadsheet = CTX_wm_space_spreadsheet(C); | ||||
| sspreadsheet->runtime->cache.set_all_unused(); | |||||
| spreadsheet_update_context_path(C); | spreadsheet_update_context_path(C); | ||||
| std::unique_ptr<DataSource> data_source = get_data_source(C); | std::unique_ptr<DataSource> data_source = get_data_source(C); | ||||
| if (!data_source) { | if (!data_source) { | ||||
| data_source = std::make_unique<DataSource>(); | data_source = std::make_unique<DataSource>(); | ||||
| } | } | ||||
| update_visible_columns(sspreadsheet->columns, *data_source); | update_visible_columns(sspreadsheet->columns, *data_source); | ||||
| Show All 24 Lines | static void spreadsheet_main_region_draw(const bContext *C, ARegion *region) | ||||
| std::unique_ptr<SpreadsheetDrawer> drawer = spreadsheet_drawer_from_layout(spreadsheet_layout); | std::unique_ptr<SpreadsheetDrawer> drawer = spreadsheet_drawer_from_layout(spreadsheet_layout); | ||||
| draw_spreadsheet_in_region(C, region, *drawer); | draw_spreadsheet_in_region(C, region, *drawer); | ||||
| /* Tag other regions for redraw, because the main region updates data for them. */ | /* Tag other regions for redraw, because the main region updates data for them. */ | ||||
| ARegion *footer = BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_FOOTER); | ARegion *footer = BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_FOOTER); | ||||
| ED_region_tag_redraw(footer); | ED_region_tag_redraw(footer); | ||||
| ARegion *sidebar = BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_UI); | ARegion *sidebar = BKE_area_find_region_type(CTX_wm_area(C), RGN_TYPE_UI); | ||||
| ED_region_tag_redraw(sidebar); | ED_region_tag_redraw(sidebar); | ||||
| /* Free all cache items that have not been used. */ | |||||
| sspreadsheet->runtime->cache.remove_all_unused(); | |||||
| } | } | ||||
| static void spreadsheet_main_region_listener(const wmRegionListenerParams *params) | static void spreadsheet_main_region_listener(const wmRegionListenerParams *params) | ||||
| { | { | ||||
| ARegion *region = params->region; | ARegion *region = params->region; | ||||
| wmNotifier *wmn = params->notifier; | wmNotifier *wmn = params->notifier; | ||||
| switch (wmn->category) { | switch (wmn->category) { | ||||
| ▲ Show 20 Lines • Show All 278 Lines • Show Last 20 Lines | |||||