Skip to content

Commit 3afb5e3

Browse files
committed
add a gesture for guide creation
and better guide drawing
1 parent bef3b39 commit 3afb5e3

File tree

5 files changed

+62
-17
lines changed

5 files changed

+62
-17
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
- fix select modifier handling
66
- add region resize and drag snap
7-
- add hguide and vguide regions
7+
- add hguide and vguide, plus a gesture for creation
88
- improve menu homing
99
- improve antialias on zoom out
1010
- add region context menu

meson.build

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
project('nip4', 'c',
22
# ie. a major after nip2 8.9 for workspace save file versioning
3-
version: '9.0.9-1',
3+
version: '9.0.9-2',
44
license: 'GPL',
55
meson_version: '>=0.64',
66
default_options: [

org.libvips.nip4.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@
334334
{
335335
"type" : "git",
336336
"url" : "https://github.com/jcupitt/nip4.git",
337-
"tag" : "v9.0.9"
337+
"tag" : "v9.0.9-2"
338338
}
339339
]
340340
}

src/imageui.c

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1266,6 +1266,18 @@ imageui_region_new(Imageui *imageui, RegionviewType type, VipsRect *rect)
12661266
vips_buf_appendd(&buf, rect->height);
12671267
break;
12681268

1269+
case REGIONVIEW_HGUIDE:
1270+
vips_buf_appendf(&buf, "%s ", CLASS_HGUIDE);
1271+
row_qualified_name(row, &buf);
1272+
vips_buf_appendd(&buf, VIPS_RECT_BOTTOM(rect));
1273+
break;
1274+
1275+
case REGIONVIEW_VGUIDE:
1276+
vips_buf_appendf(&buf, "%s ", CLASS_VGUIDE);
1277+
row_qualified_name(row, &buf);
1278+
vips_buf_appendd(&buf, VIPS_RECT_RIGHT(rect));
1279+
break;
1280+
12691281
default:
12701282
g_assert_not_reached();
12711283
}

src/regionview.c

Lines changed: 47 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,28 @@ regionview_draw_init_region_label(Regionview *regionview)
278278
2 * regionview_label_margin;
279279
}
280280

281+
static void
282+
regionview_draw_init_guide_label(Regionview *regionview)
283+
{
284+
if (regionview->draw_type == REGIONVIEW_HGUIDE) {
285+
regionview->label.left = regionview->frame.left;
286+
regionview->label.top = regionview->frame.top
287+
- 2 * regionview_label_margin
288+
- regionview->ink_rect.height
289+
- regionview_line_width;
290+
}
291+
else {
292+
regionview->label.left = regionview->frame.left
293+
+ regionview_line_width;
294+
regionview->label.top = regionview->frame.top;
295+
}
296+
297+
regionview->label.width = regionview->ink_rect.width +
298+
2 * regionview_label_margin;
299+
regionview->label.height = regionview->ink_rect.height +
300+
2 * regionview_label_margin;
301+
}
302+
281303
/* gsk clips the case where the region is completely off screen, but does
282304
* NOT clip if we are within the rect. This will cause terrible
283305
* performance and even crashes with large zooms.
@@ -549,19 +571,24 @@ static void
549571
regionview_draw_guide(Regionview *regionview, GtkSnapshot *snapshot)
550572
{
551573
Imageui *imageui = regionview->imageui;
552-
double zoom = imageui_get_zoom(imageui);
553-
554-
// two points to mark
555-
double left;
556-
double top;
557-
imageui_image_to_gtk(imageui,
558-
regionview->draw_area.left, regionview->draw_area.top, &left, &top);
559-
regionview->frame.left = left;
560-
regionview->frame.top = top;
561-
regionview->frame.width = regionview->draw_area.width * zoom;
562-
regionview->frame.height = regionview->draw_area.height * zoom;
574+
Tilesource *tilesource = imageui_get_tilesource(imageui);
575+
576+
// the full width or height of the image
577+
if (regionview->draw_type == REGIONVIEW_HGUIDE) {
578+
regionview->frame.left = 0;
579+
regionview->frame.top = VIPS_RECT_BOTTOM(&regionview->draw_area);
580+
regionview->frame.width = tilesource->display_width;
581+
regionview->frame.height = 0;
582+
}
583+
else {
584+
regionview->frame.left = VIPS_RECT_RIGHT(&regionview->draw_area);
585+
regionview->frame.top = 0;
586+
regionview->frame.width = 0;
587+
regionview->frame.height = tilesource->display_height;
588+
}
589+
imageui_image_to_gtk_rect(imageui, &regionview->frame, &regionview->frame);
563590

564-
regionview_draw_init_region_label(regionview);
591+
regionview_draw_init_guide_label(regionview);
565592

566593
regionview_draw_label_shadow(regionview, snapshot);
567594

@@ -750,11 +777,18 @@ regionview_hit(Regionview *regionview, int x, int y)
750777
static void
751778
regionview_pick_type(Regionview *regionview)
752779
{
753-
if (abs(regionview->our_area.width) < 10)
780+
if (abs(regionview->our_area.width) < 10 &&
781+
abs(regionview->our_area.height) < 10)
754782
regionview->type = REGIONVIEW_MARK;
755783
else if (regionview->our_area.width > 0 &&
756784
regionview->our_area.height > 0)
757785
regionview->type = REGIONVIEW_REGION;
786+
else if (regionview->our_area.width < 0 &&
787+
regionview->our_area.height > 0)
788+
regionview->type = REGIONVIEW_HGUIDE;
789+
else if (regionview->our_area.width > 0 &&
790+
regionview->our_area.height < 0)
791+
regionview->type = REGIONVIEW_VGUIDE;
758792
else
759793
regionview->type = REGIONVIEW_ARROW;
760794
}
@@ -859,7 +893,6 @@ regionview_resize(Regionview *regionview, guint modifiers,
859893
break;
860894
}
861895

862-
863896
if (!regionview->frozen)
864897
regionview_pick_type(regionview);
865898

0 commit comments

Comments
 (0)