设计师编程指南之Sketch插件开发 7 GUI

往期文章索引:

1 / 入门基本概念、page的相关操作

2 / artboard 、NSFileManager 和 NSString 关于文件及文件夹的相关操作

3 / DIY一个Sketch插件,生成猫猫狗狗的全家福

4 / NSPasteboard 、text 的操作

5/ Shape 的一些操作,主要介绍 line 及 rect

6/ Shape的curve操作

本期给大家介绍4种GUI交互方式:

1 提示用户

2 用户文本输入的方式

3 选项框输入的方式

4 保存数据至本地文件

1

提示用户

有2类,第一种类似于 web 开发的 alert 窗口:

[NSApp displayDialog:@'No artboards selected!']

另外一种,相当于 android 里的 toast (会自动消失的)

var doc=context.document; [doc showMessage:@"hello world"]

获取用户输入

输入框,相当于 webinput ,返回用户输入的 value

var doc=context.document; [doc askForUserInput:@"Enter something" initialValue:@"default"];

3

选项框

初始化一个 NSAlert 对象,设置其标题,及按钮。

// Create dialog

var dialog = NSAlert.alloc().init();
dialog.setMessageText("This a alert view"); dialog.addButtonWithTitle("Save");
dialog.addButtonWithTitle("Cancel");

新建一个 NSView ,作为 selectckeckbox 的容器

var customView = NSView.alloc().initWithFrame(NSMakeRect(0, 0, 200, 180));

var label = createLabel(NSMakeRect(0, 150, 200, 25), 12, false, 'Label1:'); customView.addSubview(label);

var select=createSelect(NSMakeRect(0, 125, 200, 25), ["item1", "item2"]); customView.addSubview(select);

var checkbox = createCheckbox(NSMakeRect(0, 60, 200, 25), "checked", "checked_value", true, true);     customView.addSubview(checkbox);

customView 添加进 dialog 里即可。

// Add custom view to dialog
dialog.setAccessoryView(customView);

分别封装3个函数:createLabel 、 createSelect 、 createCheckbox

function createLabel(frame, size, bold, text) {
   var label = NSTextField.alloc().initWithFrame(frame);
   
   label.setStringValue(text);
   label.setBezeled(false);
   label.setDrawsBackground(false);
   label.setEditable(false);
   label.setSelectable(false);
   
   if (bold) {        
       label.setFont(NSFont.boldSystemFontOfSize(size));
   }else {
       label.setFont(NSFont.systemFontOfSize(size));
   }
   
   return label;
    };

function createSelect(frame, items) {      
       
        var select = NSPopUpButton.alloc().initWithFrame(frame);
       
        select.addItemsWithTitles(items);         return select;
        };
                  
                  
function createCheckbox(frame, name, value, onstate, enabled) {
   
   var checkbox = NSButton.alloc().initWithFrame(frame);
   
   checkbox.setButtonType(NSSwitchButton);    
   // checkbox.setBezelStyle(1);
   
   checkbox.setTitle(name);    
   checkbox.setTag(value);    
   checkbox.setState(onstate ? NSOnState : NSOffState);    
   checkbox.setEnabled(enabled);
    return checkbox;
   
};

监测 select 的事件变化,当 select 选项为第一个时,设置 checkbox 的状态为 true 。

// Listen for select box change event

select.setCOSJSTargetFunction(function(sender) {
         if (select.indexOfSelectedItem() == 0) {
              checkbox.setState(NSOnState);
        checkbox.setEnabled(true);
         } else if (select.indexOfSelectedItem() == 1) {
              checkbox.setState(NSOffState);         checkbox.setEnabled(false);
         }
        
});     

4

保存数据至本地文件

通过 NSSavePanel ,自定义一种文件格式,这里随意设定了一组数据 fileData


// Open dialog and exit if user selects Cancel

if (dialog.runModal() != NSAlertFirstButtonReturn) {

return;

}else{

//checkbox state    log('checkbox state:'+checkbox.state())    log('select selected Item:'+select.indexOfSelectedItem())        // Create save dialog and set properties        
var save = NSSavePanel.savePanel();    
   save.setNameFieldStringValue("untitled.mixlab");    save.setAllowedFileTypes(["mixlab"]);    save.setAllowsOtherFileTypes(false);    save.setExtensionHidden(false);
   if (save.runModal()) {
       var fileData={             "mixlab":"hello world",             "version":48,             "author":"shadow"            };            
       var filePath = save.URL().path();            
       var file = NSString.stringWithString(JSON.stringify(fileData));        file.writeToFile_atomically_encoding_error(filePath, true, NSUTF8StringEncoding, null);        
   };
};

ps:关于打开本地文件GUI,在DIY一个Sketch插件,生成猫猫狗狗的全家福这篇文章已经介绍过。

*

知识星球

更多 sketch 插件的开发,代码的下载,可以在知识星球交流。还包括:

1 看到一些好案例关键技术解决方案,写出文章又不成体系,发星球;

2 我会在知识星球发一些非常机密的研究心得;

3 一些非常有技巧的知识,给付费用户;

4 公众号的迭代版本,针对文章发更为升级、核心的内容。

5 当然,还有资深的专家在星球里。

*

热门文章

斜杆青年,这里有适合你的跨界社区

建筑师编程指南之SketchUp插件开发 1

DIY一个Sketch插件,生成猫猫狗狗的全家福

我们利用周末尝试了一次CO-CODING活动

全栈设计+编程的方法论,以“猜对联”小程序为例

*

关于公众号:

本公众号定期更新人工智能&设计&科技内容。

谈点设计,敲点代码,偶尔创作点人工智能实验产品

码字不易,开启新的打赏方式:

(0)

相关推荐