Revision: 3195
http://skim-app.svn.sourceforge.net/skim-app/?rev=3195&view=rev
Author: hofman
Date: 2007-11-11 05:01:59 -0800 (Sun, 11 Nov 2007)
Log Message:
-----------
Add AppleScript access to some more note preference settings.
Modified Paths:
--------------
trunk/SKApplicationController.h
trunk/SKApplicationController.m
trunk/SKPDFAnnotationNote.h
trunk/SKPDFAnnotationNote.m
trunk/Skim.sdef
Modified: trunk/SKApplicationController.h
===================================================================
--- trunk/SKApplicationController.h 2007-11-11 10:42:50 UTC (rev 3194)
+++ trunk/SKApplicationController.h 2007-11-11 13:01:59 UTC (rev 3195)
@@ -83,6 +83,18 @@
- (void)setFullScreenBackgroundColor:(NSColor *)color;
- (NSDictionary *)defaultNoteColors;
- (void)setDefaultNoteColors:(NSDictionary *)colorDict;
+- (NSDictionary *)defaultLineWidths;
+- (void)setDefaultLineWidth:(NSDictionary *)dict;
+- (NSDictionary *)defaultLineStyles;
+- (void)setDefaultLineStyles:(NSDictionary *)dict;
+- (NSDictionary *)defaultDashPatterns;
+- (void)setDefaultDashPattern:(NSDictionary *)dict;
+- (int)defaultStartLineStyle;
+- (void)setDefaultStartLineStyle:(int)style;
+- (int)defaultEndLineStyle;
+- (void)setDefaultEndLineStyle:(int)style;
+- (int)defaultIconType;
+- (void)setDefaultIconType:(int)type;
- (unsigned int)countOfLines;
- (SKLine *)objectInLinesAtIndex:(unsigned int)index;
Modified: trunk/SKApplicationController.m
===================================================================
--- trunk/SKApplicationController.m 2007-11-11 10:42:50 UTC (rev 3194)
+++ trunk/SKApplicationController.m 2007-11-11 13:01:59 UTC (rev 3195)
@@ -511,7 +511,7 @@
static NSSet *applicationScriptingKeys = nil;
if (applicationScriptingKeys == nil)
applicationScriptingKeys = [[NSSet alloc]
initWithObjects:@"defaultPdfViewSettings", @"defaultFullScreenPdfViewSettings",
@"backgroundColor", @"fullScreenBackgroundColor",
- @"defaultNoteColors", @"lines", nil];
+ @"defaultNoteColors", @"defaultLineWidths", @"defaultLineStyles",
@"defaultDashPatterns", @"defaultStartLineSyle", @"defaultEndLineSyle",
@"defaultIconType", @"lines", nil];
return [applicationScriptingKeys containsObject:key];
}
@@ -600,6 +600,96 @@
[sud setColor:color forKey:SKSquareNoteInteriorColorKey];
}
+- (NSDictionary *)defaultLineWidths {
+ NSUserDefaults *sud = [NSUserDefaults standardUserDefaults];
+ return [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithFloat:[sud
floatForKey:SKFreeTextNoteLineWidthKey]], @"textNote",
+ [NSNumber numberWithFloat:[sud floatForKey:SKCircleNoteLineWidthKey]],
@"circleNote",
+ [NSNumber numberWithFloat:[sud floatForKey:SKSquareNoteLineWidthKey]],
@"squareNote",
+ [NSNumber numberWithFloat:[sud floatForKey:SKLineNoteLineWidthKey]],
@"lineNote", nil];
+}
+
+- (void)setDefaultLineWidth:(NSDictionary *)dict {
+ NSUserDefaults *sud = [NSUserDefaults standardUserDefaults];
+ NSNumber *number;
+ if (number = [dict objectForKey:@"textNote"])
+ [sud setFloat:[number floatValue] forKey:SKFreeTextNoteLineWidthKey];
+ if (number = [dict objectForKey:@"circleNote"])
+ [sud setFloat:[number floatValue] forKey:SKCircleNoteLineWidthKey];
+ if (number = [dict objectForKey:@"squareNote"])
+ [sud setFloat:[number floatValue] forKey:SKSquareNoteLineWidthKey];
+ if (number = [dict objectForKey:@"lineNote"])
+ [sud setFloat:[number floatValue] forKey:SKLineNoteLineWidthKey];
+}
+
+- (NSDictionary *)defaultLineStyles {
+ NSUserDefaults *sud = [NSUserDefaults standardUserDefaults];
+ return [NSDictionary dictionaryWithObjectsAndKeys:
+ [NSNumber numberWithInt:SKScriptingBorderStyleFromBorderStyle([sud
integerForKey:SKFreeTextNoteLineStyleKey])], @"textNote",
+ [NSNumber numberWithInt:SKScriptingBorderStyleFromBorderStyle([sud
integerForKey:SKCircleNoteLineStyleKey])], @"circleNote",
+ [NSNumber numberWithInt:SKScriptingBorderStyleFromBorderStyle([sud
integerForKey:SKSquareNoteLineStyleKey])], @"squareNote",
+ [NSNumber numberWithInt:SKScriptingBorderStyleFromBorderStyle([sud
integerForKey:SKLineNoteLineStyleKey])], @"lineNote", nil];
+}
+
+- (void)setDefaultLineStyles:(NSDictionary *)dict {
+ NSUserDefaults *sud = [NSUserDefaults standardUserDefaults];
+ NSNumber *number;
+ if (number = [dict objectForKey:@"textNote"])
+ [sud setInteger:SKBorderStyleFromScriptingBorderStyle([number
intValue]) forKey:SKFreeTextNoteLineStyleKey];
+ if (number = [dict objectForKey:@"circleNote"])
+ [sud setInteger:SKBorderStyleFromScriptingBorderStyle([number
intValue]) forKey:SKCircleNoteLineStyleKey];
+ if (number = [dict objectForKey:@"squareNote"])
+ [sud setInteger:SKBorderStyleFromScriptingBorderStyle([number
intValue]) forKey:SKSquareNoteLineStyleKey];
+ if (number = [dict objectForKey:@"lineNote"])
+ [sud setInteger:SKBorderStyleFromScriptingBorderStyle([number
intValue]) forKey:SKLineNoteLineStyleKey];
+}
+
+- (NSDictionary *)defaultDashPatterns {
+ NSUserDefaults *sud = [NSUserDefaults standardUserDefaults];
+ return [NSDictionary dictionaryWithObjectsAndKeys:
+ [sud arrayForKey:SKFreeTextNoteDashPatternKey], @"textNote",
+ [sud arrayForKey:SKCircleNoteDashPatternKey], @"circleNote",
+ [sud arrayForKey:SKSquareNoteDashPatternKey], @"squareNote",
+ [sud arrayForKey:SKLineNoteDashPatternKey], @"lineNote", nil];
+}
+
+- (void)setDefaultDashPattern:(NSDictionary *)dict {
+ NSUserDefaults *sud = [NSUserDefaults standardUserDefaults];
+ NSArray *array;
+ if (array = [dict objectForKey:@"textNote"])
+ [sud setObject:array forKey:SKFreeTextNoteDashPatternKey];
+ if (array = [dict objectForKey:@"circleNote"])
+ [sud setObject:array forKey:SKCircleNoteDashPatternKey];
+ if (array = [dict objectForKey:@"squareNote"])
+ [sud setObject:array forKey:SKSquareNoteDashPatternKey];
+ if (array = [dict objectForKey:@"lineNote"])
+ [sud setObject:array forKey:SKLineNoteDashPatternKey];
+}
+
+- (int)defaultStartLineStyle {
+ return SKScriptingLineStyleFromLineStyle([[NSUserDefaults
standardUserDefaults] integerForKey:SKLineNoteStartLineStyleKey]);
+}
+
+- (void)setDefaultStartLineStyle:(int)style {
+ return [[NSUserDefaults standardUserDefaults]
setInteger:SKLineStyleFromScriptingLineStyle(style)
forKey:SKLineNoteStartLineStyleKey];
+}
+
+- (int)defaultEndLineStyle {
+ return SKScriptingLineStyleFromLineStyle([[NSUserDefaults
standardUserDefaults] integerForKey:SKLineNoteEndLineStyleKey]);
+}
+
+- (void)setDefaultEndLineStyle:(int)style {
+ return [[NSUserDefaults standardUserDefaults]
setInteger:SKLineStyleFromScriptingLineStyle(style)
forKey:SKLineNoteEndLineStyleKey];
+}
+
+- (int)defaultIconType {
+ return SKScriptingIconTypeFromIconType([[NSUserDefaults
standardUserDefaults] integerForKey:SKAnchoredNoteIconTypeKey]);
+}
+
+- (void)setDefaultIconType:(int)type {
+ return [[NSUserDefaults standardUserDefaults]
setInteger:SKIconTypeFromScriptingIconType(type)
forKey:SKAnchoredNoteIconTypeKey];
+}
+
- (unsigned int)countOfLines {
return UINT_MAX;
}
Modified: trunk/SKPDFAnnotationNote.h
===================================================================
--- trunk/SKPDFAnnotationNote.h 2007-11-11 10:42:50 UTC (rev 3194)
+++ trunk/SKPDFAnnotationNote.h 2007-11-11 13:01:59 UTC (rev 3195)
@@ -206,6 +206,15 @@
#pragma mark -
+extern int SKScriptingBorderStyleFromBorderStyle(int borderStyle);
+extern int SKBorderStyleFromScriptingBorderStyle(int borderStyle);
+extern int SKScriptingLineStyleFromLineStyle(int lineStyle);
+extern int SKLineStyleFromScriptingLineStyle(int lineStyle);
+extern int SKScriptingIconTypeFromIconType(int iconType);
+extern int SKIconTypeFromScriptingIconType(int iconType);
+
+#pragma mark -
+
static inline
Rect RectFromNSRect(NSRect rect) {
Rect qdRect;
Modified: trunk/SKPDFAnnotationNote.m
===================================================================
--- trunk/SKPDFAnnotationNote.m 2007-11-11 10:42:50 UTC (rev 3194)
+++ trunk/SKPDFAnnotationNote.m 2007-11-11 13:01:59 UTC (rev 3195)
@@ -84,6 +84,78 @@
SKASBorderStyleUnderline = 'Undl'
};
+int SKScriptingBorderStyleFromBorderStyle(int borderStyle) {
+ switch (borderStyle) {
+ case kPDFBorderStyleSolid: return SKASBorderStyleSolid;
+ case kPDFBorderStyleDashed: return SKASBorderStyleDashed;
+ case kPDFBorderStyleBeveled: return SKASBorderStyleBeveled;
+ case kPDFBorderStyleInset: return SKASBorderStyleInset;
+ case kPDFBorderStyleUnderline: return SKASBorderStyleUnderline;
+ default: return SKASBorderStyleSolid;
+ }
+}
+
+int SKBorderStyleFromScriptingBorderStyle(int borderStyle) {
+ switch (borderStyle) {
+ case SKASBorderStyleSolid: return kPDFBorderStyleSolid;
+ case SKASBorderStyleDashed: return kPDFBorderStyleDashed;
+ case SKASBorderStyleBeveled: return kPDFBorderStyleBeveled;
+ case SKASBorderStyleInset: return kPDFBorderStyleInset;
+ case SKASBorderStyleUnderline: return kPDFBorderStyleUnderline;
+ default: return kPDFBorderStyleSolid;
+ }
+}
+
+int SKScriptingLineStyleFromLineStyle(int lineStyle) {
+ switch (lineStyle) {
+ case kPDFLineStyleNone: return SKASLineStyleNone;
+ case kPDFLineStyleSquare: return SKASLineStyleSquare;
+ case kPDFLineStyleCircle: return SKASLineStyleCircle;
+ case kPDFLineStyleDiamond: return SKASLineStyleDiamond;
+ case kPDFLineStyleOpenArrow: return SKASLineStyleOpenArrow;
+ case kPDFLineStyleClosedArrow: return SKASLineStyleClosedArrow;
+ default: return SKASLineStyleNone;
+ }
+}
+
+int SKLineStyleFromScriptingLineStyle(int lineStyle) {
+ switch (lineStyle) {
+ case kPDFLineStyleNone: return SKASLineStyleNone;
+ case kPDFLineStyleSquare: return SKASLineStyleSquare;
+ case kPDFLineStyleCircle: return SKASLineStyleCircle;
+ case kPDFLineStyleDiamond: return SKASLineStyleDiamond;
+ case kPDFLineStyleOpenArrow: return SKASLineStyleOpenArrow;
+ case kPDFLineStyleClosedArrow: return SKASLineStyleClosedArrow;
+ default: return SKASLineStyleNone;
+ }
+}
+
+int SKScriptingIconTypeFromIconType(int iconType) {
+ switch (iconType) {
+ case kPDFTextAnnotationIconComment: return
SKASTextAnnotationIconComment;
+ case kPDFTextAnnotationIconKey: return SKASTextAnnotationIconKey;
+ case kPDFTextAnnotationIconNote: return SKASTextAnnotationIconNote;
+ case kPDFTextAnnotationIconHelp: return SKASTextAnnotationIconHelp;
+ case kPDFTextAnnotationIconNewParagraph: return
SKASTextAnnotationIconNewParagraph;
+ case kPDFTextAnnotationIconParagraph: return
SKASTextAnnotationIconParagraph;
+ case kPDFTextAnnotationIconInsert: return SKASTextAnnotationIconInsert;
+ default: return kPDFTextAnnotationIconNote;
+ }
+}
+
+int SKIconTypeFromScriptingIconType(int iconType) {
+ switch (iconType) {
+ case SKASTextAnnotationIconComment: return
kPDFTextAnnotationIconComment;
+ case SKASTextAnnotationIconKey: return kPDFTextAnnotationIconKey;
+ case SKASTextAnnotationIconNote: return kPDFTextAnnotationIconNote;
+ case SKASTextAnnotationIconHelp: return kPDFTextAnnotationIconHelp;
+ case SKASTextAnnotationIconNewParagraph: return
kPDFTextAnnotationIconNewParagraph;
+ case SKASTextAnnotationIconParagraph: return
kPDFTextAnnotationIconParagraph;
+ case SKASTextAnnotationIconInsert: return kPDFTextAnnotationIconInsert;
+ default: return kPDFTextAnnotationIconNote;
+ }
+}
+
#define TYPE_KEY @"type"
#define BOUNDS_KEY @"bounds"
#define PAGE_INDEX_KEY @"pageIndex"
@@ -574,26 +646,11 @@
}
- (int)asBorderStyle {
- switch ([self borderStyle]) {
- case kPDFBorderStyleSolid: return SKASBorderStyleSolid;
- case kPDFBorderStyleDashed: return SKASBorderStyleDashed;
- case kPDFBorderStyleBeveled: return SKASBorderStyleBeveled;
- case kPDFBorderStyleInset: return SKASBorderStyleInset;
- case kPDFBorderStyleUnderline: return SKASBorderStyleUnderline;
- default: return SKASBorderStyleSolid;
- }
+ return SKScriptingBorderStyleFromBorderStyle([self borderStyle]);
}
- (void)setAsBorderStyle:(int)borderStyle {
- PDFBorderStyle style = kPDFBorderStyleSolid;
- switch (borderStyle) {
- case SKASBorderStyleSolid: style = kPDFBorderStyleSolid; break;
- case SKASBorderStyleDashed: style = kPDFBorderStyleDashed; break;
- case SKASBorderStyleBeveled: style = kPDFBorderStyleBeveled; break;
- case SKASBorderStyleInset: style = kPDFBorderStyleInset; break;
- case SKASBorderStyleUnderline: style = kPDFBorderStyleUnderline; break;
- }
- [self setBorderStyle:style];
+ [self setBorderStyle:SKBorderStyleFromScriptingBorderStyle(borderStyle)];
}
- (NSData *)startPointAsQDPoint {
@@ -1468,30 +1525,11 @@
}
- (int)asIconType {
- switch ([self iconType]) {
- case kPDFTextAnnotationIconComment: return
SKASTextAnnotationIconComment;
- case kPDFTextAnnotationIconKey: return SKASTextAnnotationIconKey;
- case kPDFTextAnnotationIconNote: return SKASTextAnnotationIconNote;
- case kPDFTextAnnotationIconHelp: return SKASTextAnnotationIconHelp;
- case kPDFTextAnnotationIconNewParagraph: return
SKASTextAnnotationIconNewParagraph;
- case kPDFTextAnnotationIconParagraph: return
SKASTextAnnotationIconParagraph;
- case kPDFTextAnnotationIconInsert: return SKASTextAnnotationIconInsert;
- default: return kPDFTextAnnotationIconNote;
- }
+ return SKScriptingIconTypeFromIconType([self iconType]);
}
- (void)setAsIconType:(int)type {
- PDFTextAnnotationIconType iconType = SKASTextAnnotationIconNote;
- switch (type) {
- case SKASTextAnnotationIconComment: iconType =
kPDFTextAnnotationIconComment; break;
- case SKASTextAnnotationIconKey: iconType = kPDFTextAnnotationIconKey;
break;
- case SKASTextAnnotationIconNote: iconType =
kPDFTextAnnotationIconNote; break;
- case SKASTextAnnotationIconHelp: iconType =
kPDFTextAnnotationIconHelp; break;
- case SKASTextAnnotationIconNewParagraph: iconType =
kPDFTextAnnotationIconNewParagraph; break;
- case SKASTextAnnotationIconParagraph: iconType =
kPDFTextAnnotationIconParagraph; break;
- case SKASTextAnnotationIconInsert: iconType =
kPDFTextAnnotationIconInsert; break;
- }
- [self setIconType:iconType];
+ [self setIconType:SKIconTypeFromScriptingIconType(type)];
}
- (id)richText;
@@ -1798,53 +1836,19 @@
}
- (int)asStartLineStyle {
- switch ([self startLineStyle]) {
- case kPDFLineStyleNone: return SKASLineStyleNone;
- case kPDFLineStyleSquare: return SKASLineStyleSquare;
- case kPDFLineStyleCircle: return SKASLineStyleCircle;
- case kPDFLineStyleDiamond: return SKASLineStyleDiamond;
- case kPDFLineStyleOpenArrow: return SKASLineStyleOpenArrow;
- case kPDFLineStyleClosedArrow: return SKASLineStyleClosedArrow;
- default: return SKASLineStyleNone;
- }
+ return SKScriptingLineStyleFromLineStyle([self startLineStyle]);
}
- (int)asEndLineStyle {
- switch ([self endLineStyle]) {
- case kPDFLineStyleNone: return SKASLineStyleNone;
- case kPDFLineStyleSquare: return SKASLineStyleSquare;
- case kPDFLineStyleCircle: return SKASLineStyleCircle;
- case kPDFLineStyleDiamond: return SKASLineStyleDiamond;
- case kPDFLineStyleOpenArrow: return SKASLineStyleOpenArrow;
- case kPDFLineStyleClosedArrow: return SKASLineStyleClosedArrow;
- default: return SKASLineStyleNone;
- }
+ return SKScriptingLineStyleFromLineStyle([self endLineStyle]);
}
- (void)setAsStartLineStyle:(int)style {
- int startLineStyle = 0;
- switch (style) {
- case SKASLineStyleNone: startLineStyle = kPDFLineStyleNone; break;
- case SKASLineStyleSquare: startLineStyle = kPDFLineStyleSquare; break;
- case SKASLineStyleCircle: startLineStyle = kPDFLineStyleCircle; break;
- case SKASLineStyleDiamond: startLineStyle = kPDFLineStyleDiamond;
break;
- case SKASLineStyleOpenArrow: startLineStyle = kPDFLineStyleOpenArrow;
break;
- case SKASLineStyleClosedArrow: startLineStyle =
kPDFLineStyleClosedArrow; break;
- }
- [self setStartLineStyle:startLineStyle];
+ [self setStartLineStyle:SKLineStyleFromScriptingLineStyle(style)];
}
- (void)setAsEndLineStyle:(int)style {
- int endLineStyle = 0;
- switch (style) {
- case SKASLineStyleNone: endLineStyle = kPDFLineStyleNone; break;
- case SKASLineStyleSquare: endLineStyle = kPDFLineStyleSquare; break;
- case SKASLineStyleCircle: endLineStyle = kPDFLineStyleCircle; break;
- case SKASLineStyleDiamond: endLineStyle = kPDFLineStyleDiamond; break;
- case SKASLineStyleOpenArrow: endLineStyle = kPDFLineStyleOpenArrow;
break;
- case SKASLineStyleClosedArrow: endLineStyle =
kPDFLineStyleClosedArrow; break;
- }
- [self setEndLineStyle:endLineStyle];
+ [self setEndLineStyle:SKLineStyleFromScriptingLineStyle(style)];
}
@end
Modified: trunk/Skim.sdef
===================================================================
--- trunk/Skim.sdef 2007-11-11 10:42:50 UTC (rev 3194)
+++ trunk/Skim.sdef 2007-11-11 13:01:59 UTC (rev 3195)
@@ -50,6 +50,30 @@
description="The default colors used for new notes.">
<cocoa key="defaultNoteColors"/>
</property>
+ <property name="default note line widths" type="note line widths"
code="DNtW"
+ description="The default line width used for new notes.">
+ <cocoa key="defaultLineWidths"/>
+ </property>
+ <property name="default note line styles" type="note line styles"
code="DNtS"
+ description="The default line styles used for new notes.">
+ <cocoa key="defaultLineStyles"/>
+ </property>
+ <property name="default note dash patterns" type="note dash
patterns" code="DNtD"
+ description="The default dash patterns used for new notes.">
+ <cocoa key="defaultDashPatterns"/>
+ </property>
+ <property name="default note start line style" type="line ending
style" code="DNSL"
+ description="The default start line style used for new lines.">
+ <cocoa key="defaultStartLineStyle"/>
+ </property>
+ <property name="default note end line style" type="line ending
style" code="DNEL"
+ description="The default end line style used for new lines.">
+ <cocoa key="defaultEndLineStyle"/>
+ </property>
+ <property name="default note icon type" type="icon type"
code="DNtI"
+ description="The default icon type used for new anchored
notes.">
+ <cocoa key="defaultIconType"/>
+ </property>
<responds-to name="open">
<cocoa method="handleOpenScriptCommand:"/>
</responds-to>
@@ -867,6 +891,67 @@
</property>
</record-type>
+ <record-type name="note line widths" code="NLWd">
+ <property name="text note" code="NTxt" type="real"
+ description="Default text note line width.">
+ <cocoa key="textNote"/>
+ </property>
+ <property name="circle note" code="NCir" type="real"
+ description="Default circle line width.">
+ <cocoa key="circleNote"/>
+ </property>
+ <property name="box note" code="NSqu" type="real"
+ description="Default box line width.">
+ <cocoa key="squareNote"/>
+ </property>
+ <property name="line note" code="NLin" type="real"
+ description="Default line line width.">
+ <cocoa key="lineNote"/>
+ </property>
+ </record-type>
+
+ <record-type name="note line styles" code="NLSt">
+ <property name="text note" code="NTxt" type="note line style"
+ description="Default text note line width.">
+ <cocoa key="textNote"/>
+ </property>
+ <property name="circle note" code="NCir" type="note line style"
+ description="Default circle line width.">
+ <cocoa key="circleNote"/>
+ </property>
+ <property name="box note" code="NSqu" type="note line style"
+ description="Default box line width.">
+ <cocoa key="squareNote"/>
+ </property>
+ <property name="line note" code="NLin" type="note line style"
+ description="Default line line width.">
+ <cocoa key="lineNote"/>
+ </property>
+ </record-type>
+
+ <record-type name="note dash patterns" code="NDsh">
+ <property name="text note" code="NTxt"
+ description="Default text note dash pattern.">
+ <type type="real" list="yes"/>
+ <cocoa key="textNote"/>
+ </property>
+ <property name="circle note" code="NCir"
+ description="Default circle dash pattern.">
+ <type type="real" list="yes"/>
+ <cocoa key="circleNote"/>
+ </property>
+ <property name="box note" code="NSqu"
+ description="Default box dash pattern.">
+ <type type="real" list="yes"/>
+ <cocoa key="squareNote"/>
+ </property>
+ <property name="line note" code="NLin"
+ description="Default line dash pattern.">
+ <type type="real" list="yes"/>
+ <cocoa key="lineNote"/>
+ </property>
+ </record-type>
+
<value-type name="RGBA color" code="RGBA">
<cocoa class="NSColor"/>
</value-type>
This was sent by the SourceForge.net collaborative development platform, the
world's largest Open Source development site.
-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >> http://get.splunk.com/
_______________________________________________
Skim-app-commit mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/skim-app-commit