Revision: 16656
          http://sourceforge.net/p/skim-app/code/16656
Author:   hofman
Date:     2026-10-13 16:51:31 +0000 (Tue, 13 Oct 2026)
Log Message:
-----------
add an action to crop all even or odd pages, add as an alternate item to Crop 
Page

Modified Paths:
--------------
    trunk/Base.lproj/MainMenu.xib
    trunk/SKMainWindowController_Actions.h
    trunk/SKMainWindowController_Actions.m
    trunk/SKMainWindowController_UI.m
    trunk/de.lproj/Localizable.strings
    trunk/de.lproj/MainMenu.strings
    trunk/en.lproj/Localizable.strings
    trunk/en.lproj/MainMenu.strings
    trunk/es.lproj/Localizable.strings
    trunk/es.lproj/MainMenu.strings
    trunk/fr.lproj/Localizable.strings
    trunk/fr.lproj/MainMenu.strings
    trunk/it.lproj/Localizable.strings
    trunk/it.lproj/MainMenu.strings
    trunk/ja.lproj/Localizable.strings
    trunk/ja.lproj/MainMenu.strings
    trunk/nl.lproj/Localizable.strings
    trunk/nl.lproj/MainMenu.strings
    trunk/pl.lproj/Localizable.strings
    trunk/pl.lproj/MainMenu.strings
    trunk/ru.lproj/Localizable.strings
    trunk/ru.lproj/MainMenu.strings
    trunk/tr.lproj/Localizable.strings
    trunk/tr.lproj/MainMenu.strings
    trunk/zh_CN.lproj/Localizable.strings
    trunk/zh_CN.lproj/MainMenu.strings
    trunk/zh_TW.lproj/Localizable.strings
    trunk/zh_TW.lproj/MainMenu.strings

Modified: trunk/Base.lproj/MainMenu.xib
===================================================================
--- trunk/Base.lproj/MainMenu.xib       2026-10-13 09:26:34 UTC (rev 16655)
+++ trunk/Base.lproj/MainMenu.xib       2026-10-13 16:51:31 UTC (rev 16656)
@@ -1197,6 +1197,12 @@
                                     <action selector="crop:" target="-1" 
id="769"/>
                                 </connections>
                             </menuItem>
+                            <menuItem title="Crop Odd Pages" alternate="YES" 
keyEquivalent="k" id="c8k-Ij-2Cy">
+                                <modifierMask key="keyEquivalentModifierMask" 
control="YES" option="YES" command="YES"/>
+                                <connections>
+                                    <action selector="cropHalf:" target="-1" 
id="PNJ-Ag-Bbw"/>
+                                </connections>
+                            </menuItem>
                             <menuItem title="Reset Crop" keyEquivalent="K" 
id="3CO-Cw-8Fj">
                                 <modifierMask key="keyEquivalentModifierMask" 
option="YES" command="YES"/>
                                 <connections>

Modified: trunk/SKMainWindowController_Actions.h
===================================================================
--- trunk/SKMainWindowController_Actions.h      2026-10-13 09:26:34 UTC (rev 
16655)
+++ trunk/SKMainWindowController_Actions.h      2026-10-13 16:51:31 UTC (rev 
16656)
@@ -86,6 +86,7 @@
 - (IBAction)rotateAllLeft:(nullable id)sender;
 - (IBAction)crop:(nullable id)sender;
 - (IBAction)cropAll:(nullable id)sender;
+- (IBAction)cropHalf:(nullable id)sender;
 - (IBAction)autoCropAll:(nullable id)sender;
 - (IBAction)smartAutoCropAll:(nullable id)sender;
 - (IBAction)resetCrop:(nullable id)sender;

Modified: trunk/SKMainWindowController_Actions.m
===================================================================
--- trunk/SKMainWindowController_Actions.m      2026-10-13 09:26:34 UTC (rev 
16655)
+++ trunk/SKMainWindowController_Actions.m      2026-10-13 16:51:31 UTC (rev 
16656)
@@ -601,11 +601,16 @@
     NSInteger rectCount = [rects count];
     NSPointerArray *oldRects = [[NSPointerArray alloc] initForRectPointers];
     for (i = 0; i < count; i++) {
-        PDFPage *page = [[pdfView document] pageAtIndex:i];
-        NSRect rect = NSIntersectionRect([rects rectAtIndex:i % rectCount], 
[page boundsForBox:kPDFDisplayBoxMediaBox]);
-        NSRect oldRect = [page boundsForBox:kPDFDisplayBoxCropBox];
-        [oldRects addPointer:&oldRect];
-        [page setBounds:rect forBox:kPDFDisplayBoxCropBox];
+        NSRect rect = [rects rectAtIndex:i % rectCount];
+        if (NSEqualRects(rect, NSZeroRect)) {
+            [oldRects addPointer:&rect];
+        } else {
+            PDFPage *page = [[pdfView document] pageAtIndex:i];
+            rect = NSIntersectionRect(rect, [page 
boundsForBox:kPDFDisplayBoxMediaBox]);
+            NSRect oldRect = [page boundsForBox:kPDFDisplayBoxCropBox];
+            [oldRects addPointer:&oldRect];
+            [page setBounds:rect forBox:kPDFDisplayBoxCropBox];
+        }
     }
     
     NSUndoManager *undoManager = [[self document] undoManager];
@@ -670,6 +675,52 @@
         [pdfView setSelectToolRect:NSZeroRect];
 }
 
+- (IBAction)cropHalf:(id)sender {
+    NSRect selRect = NSIntegralRect([pdfView selectToolRect]);
+    NSRect rect[2] = {NSZeroRect, NSZeroRect};
+    NSPointerArray *rectArray = [[NSPointerArray alloc] initForRectPointers];
+    BOOL emptySelection = NSIsEmptyRect(selRect);
+    
+    if ([[pdfView document] pageCount] < 2) {
+        NSBeep();
+        return;
+    }
+    
+    if (emptySelection) {
+        NSInteger i, j, count = [[pdfView document] pageCount], k = [[pdfView 
currentPage] pageIndex] % 2;
+        
+        [self beginProgressSheetWithMessage:[NSLocalizedString(@"Cropping 
Pages", @"Message for progress sheet") stringByAppendingEllipsis] 
maxValue:MIN(18, count)];
+        
+        if (count < 19) {
+            for (i = k; i < count; i += 2) {
+                rect[k] = NSUnionRect(rect[k], [[[pdfView document] 
pageAtIndex:i] autoCropBox]);
+                [self incrementProgressSheet];
+            }
+        } else {
+            NSInteger start[3] = {2 - k, 2 * ((count - 5) / 4) + k, 2 * 
((count - k) / 2) - 6 + k};
+            for (j = 0; j < 3; j++) {
+                for (i = start[j]; i < start[j] + 6; i += 2) {
+                    rect[k] = NSUnionRect(rect[k], [[[pdfView document] 
pageAtIndex:i] autoCropBox]);
+                    [self incrementProgressSheet];
+                }
+            }
+        }
+        [rectArray addPointer:rect];
+        [rectArray addPointer:rect+1];
+        
+        [self dismissProgressSheet];
+    } else {
+        rect[[[pdfView selectToolPage] pageIndex] % 2] = selRect;
+        [rectArray addPointer:rect];
+        [rectArray addPointer:rect+1];
+    }
+    
+    [self cropPagesToRects:rectArray];
+    
+    if (emptySelection == NO)
+        [pdfView setSelectToolRect:NSZeroRect];
+}
+
 - (IBAction)autoCropAll:(id)sender {
     NSPointerArray *rectArray = [[NSPointerArray alloc] initForRectPointers];
     PDFDocument *pdfDoc = [pdfView document];

Modified: trunk/SKMainWindowController_UI.m
===================================================================
--- trunk/SKMainWindowController_UI.m   2026-10-13 09:26:34 UTC (rev 16655)
+++ trunk/SKMainWindowController_UI.m   2026-10-13 16:51:31 UTC (rev 16656)
@@ -1844,6 +1844,13 @@
         return [self interactionMode] != SKPresentationMode && [[self 
pdfDocument] isLocked] == NO;
     } else if (action == @selector(cropAll:) || action == @selector(crop:) || 
action == @selector(autoCropAll:) || action == @selector(smartAutoCropAll:)) {
         return [self interactionMode] != SKPresentationMode && [[self 
pdfDocument] isLocked] == NO;
+    } else if (action == @selector(cropHalf:)) {
+        PDFPage *page = [pdfView selectToolPage] ?: [pdfView currentPage];
+        if (([page pageIndex] % 2))
+            [menuItem setTitle:NSLocalizedString(@"Crop Even Pages", @"Menu 
item title")];
+        else
+            [menuItem setTitle:NSLocalizedString(@"Crop Odd Pages", @"Menu 
item title")];
+        return [self interactionMode] != SKPresentationMode && [[self 
pdfDocument] isLocked] == NO && [[self pdfDocument] pageCount] > 1;
     } else if (action == @selector(resetCrop:)) {
         return mwcFlags.hasCropped && [self interactionMode] != 
SKPresentationMode && [[self pdfDocument] isLocked] == NO;
     } else if (action == @selector(autoSelectContent:)) {

Modified: trunk/de.lproj/Localizable.strings
===================================================================
(Binary files differ)

Modified: trunk/de.lproj/MainMenu.strings
===================================================================
(Binary files differ)

Modified: trunk/en.lproj/Localizable.strings
===================================================================
(Binary files differ)

Modified: trunk/en.lproj/MainMenu.strings
===================================================================
(Binary files differ)

Modified: trunk/es.lproj/Localizable.strings
===================================================================
(Binary files differ)

Modified: trunk/es.lproj/MainMenu.strings
===================================================================
(Binary files differ)

Modified: trunk/fr.lproj/Localizable.strings
===================================================================
(Binary files differ)

Modified: trunk/fr.lproj/MainMenu.strings
===================================================================
(Binary files differ)

Modified: trunk/it.lproj/Localizable.strings
===================================================================
(Binary files differ)

Modified: trunk/it.lproj/MainMenu.strings
===================================================================
(Binary files differ)

Modified: trunk/ja.lproj/Localizable.strings
===================================================================
(Binary files differ)

Modified: trunk/ja.lproj/MainMenu.strings
===================================================================
(Binary files differ)

Modified: trunk/nl.lproj/Localizable.strings
===================================================================
(Binary files differ)

Modified: trunk/nl.lproj/MainMenu.strings
===================================================================
(Binary files differ)

Modified: trunk/pl.lproj/Localizable.strings
===================================================================
(Binary files differ)

Modified: trunk/pl.lproj/MainMenu.strings
===================================================================
(Binary files differ)

Modified: trunk/ru.lproj/Localizable.strings
===================================================================
(Binary files differ)

Modified: trunk/ru.lproj/MainMenu.strings
===================================================================
(Binary files differ)

Modified: trunk/tr.lproj/Localizable.strings
===================================================================
(Binary files differ)

Modified: trunk/tr.lproj/MainMenu.strings
===================================================================
(Binary files differ)

Modified: trunk/zh_CN.lproj/Localizable.strings
===================================================================
(Binary files differ)

Modified: trunk/zh_CN.lproj/MainMenu.strings
===================================================================
(Binary files differ)

Modified: trunk/zh_TW.lproj/Localizable.strings
===================================================================
(Binary files differ)

Modified: trunk/zh_TW.lproj/MainMenu.strings
===================================================================
(Binary files differ)

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit

Reply via email to