Skip to content

Commit 8ed6d39

Browse files
committed
feat(Surface): added selected range APIs
1 parent b76b7eb commit 8ed6d39

4 files changed

Lines changed: 56 additions & 0 deletions

File tree

include/redasm/surface/graph.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ RD_API bool rd_surfacegraph_go_forward(RDSurfaceGraph* self);
2525
RD_API bool rd_surfacegraph_can_go_back(const RDSurfaceGraph* self);
2626
RD_API bool rd_surfacegraph_can_go_forward(const RDSurfaceGraph* self);
2727
RD_API bool rd_surfacegraph_has_selection(const RDSurfaceGraph* self);
28+
RD_API bool rd_surfacegraph_get_selected_range(const RDSurfaceGraph* self, RDAddress* start, RDAddress* end);
2829
RD_API bool rd_surfacegraph_get_current_address(const RDSurfaceGraph* self, RDAddress* address);
2930
RD_API bool rd_surfacegraph_get_address_under_cursor(RDSurfaceGraph* self, RDAddress* address);
3031
RD_API bool rd_surfacegraph_get_cell_data_under_cursor(const RDSurfaceGraph* self, RDCellData* cd);

include/redasm/surface/surface.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ RD_API bool rd_surface_select(RDSurface* self, int row, int col);
4141
RD_API bool rd_surface_select_word(RDSurface* self, int row, int col);
4242
RD_API bool rd_surface_go_back(RDSurface* self);
4343
RD_API bool rd_surface_go_forward(RDSurface* self);
44+
RD_API bool rd_surface_get_selected_range(const RDSurface* self, RDAddress* start, RDAddress* end);
4445
RD_API bool rd_surface_get_current_address(const RDSurface* self, RDAddress* address);
4546
RD_API bool rd_surface_get_address_under_pos(const RDSurface* self, const RDSurfacePos* pos, RDAddress* address);
4647
RD_API bool rd_surface_get_address_under_cursor(const RDSurface* self, RDAddress* address);

src/surface/graph.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,33 @@ bool rd_surfacegraph_get_current_address(const RDSurfaceGraph* self,
223223
return rd_i_renderer_get_address(self->renderer, self->state.pos, address);
224224
}
225225

226+
bool rd_surfacegraph_get_selected_range(const RDSurfaceGraph* self,
227+
RDAddress* start, RDAddress* end) {
228+
if(!rd_surfacegraph_has_selection(self)) return false;
229+
230+
if(start) {
231+
RDSurfacePos start_pos =
232+
rd_i_surfacestate_get_start_selection(&self->state);
233+
234+
if((usize)start_pos.row >= vect_length(&self->renderer->rows_front))
235+
return false;
236+
237+
*start = vect_at(&self->renderer->rows_front, start_pos.row)->address;
238+
}
239+
240+
if(end) {
241+
RDSurfacePos end_pos =
242+
rd_i_surfacestate_get_end_selection(&self->state);
243+
244+
if((usize)end_pos.row >= vect_length(&self->renderer->rows_front))
245+
return false;
246+
247+
*end = vect_at(&self->renderer->rows_front, end_pos.row)->address;
248+
}
249+
250+
return true;
251+
}
252+
226253
const char* rd_surfacegraph_get_word_under_pos(const RDSurfaceGraph* self,
227254
const RDSurfacePos* pos) {
228255
return rd_i_renderer_get_word_under_pos(self->renderer, pos);

src/surface/surface.c

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -476,6 +476,33 @@ const char* rd_surface_get_selected_text(RDSurface* self) {
476476
return rd_i_renderer_get_text(self->renderer, startpos, endpos);
477477
}
478478

479+
bool rd_surface_get_selected_range(const RDSurface* self, RDAddress* start,
480+
RDAddress* end) {
481+
if(!rd_surface_has_selection(self)) return false;
482+
483+
if(start) {
484+
RDSurfacePos start_pos =
485+
rd_i_surfacestate_get_start_selection(&self->state);
486+
487+
if((usize)start_pos.row >= vect_length(&self->renderer->rows_front))
488+
return false;
489+
490+
*start = vect_at(&self->renderer->rows_front, start_pos.row)->address;
491+
}
492+
493+
if(end) {
494+
RDSurfacePos end_pos =
495+
rd_i_surfacestate_get_end_selection(&self->state);
496+
497+
if((usize)end_pos.row >= vect_length(&self->renderer->rows_front))
498+
return false;
499+
500+
*end = vect_at(&self->renderer->rows_front, end_pos.row)->address;
501+
}
502+
503+
return true;
504+
}
505+
479506
bool rd_surface_get_current_address(const RDSurface* self, RDAddress* address) {
480507
return rd_i_renderer_get_address(self->renderer, self->state.pos, address);
481508
}

0 commit comments

Comments
 (0)