%ffp Category :"FM Test" Name :"Button Cycle Test 4" Version :"1.0" Author :"Alex Hunter" Organization:"AFH Systems Group" Copyright :"Freeware" Filename :"Cycle4.8bf" Description :"Cycles a button through 4 states" URL :"www.filtermeister.com" // Define 4-state Arrow control ctl(0):ICON(notify) ,image="Arw06up.ico" ,color=cadetblue ,size=(32,32) ,val=0 // Dummy hidden control (used to maintain state of arrow control) ctl(1):STATICTEXT,invisible,val=0 // Embed icons needed by standalone filter Embed:icon="Arw06up.ico" Embed:icon="Arw06rt.ico" Embed:icon="Arw06dn.ico" Embed:icon="Arw06lt.ico" OnCtl(n):{ if (n == 0 && (e == FME_CLICKED || e == FME_DBLCLK)) { // Arrow control was clicked or double-clicked... // Compute next state modulo 4 setCtlVal(1, (ctl(1) + 1) % 4); setCtlVal(0, ctl(1)); // Change icon depending on next state switch (ctl(0)) { case 0: setCtlImage(0, "Arw06up.ico", 0); break; case 1: setCtlImage(0, "Arw06rt.ico", 0); break; case 2: setCtlImage(0, "Arw06dn.ico", 0); break; case 3: setCtlImage(0, "Arw06lt.ico", 0); break; } //switch // Update the proxy preview doAction(CA_PREVIEW); return true; //don't do default action } //if return false; //do default action } //OnCtl ForEveryTile:{ const int x_disp = M / 8; const int y_disp = M / 8; switch (ctl(0)) { case 0: // up-arrow for (x = 0; x < X; x++) { if (updateProgress(x, X)) abort(); for (y = 0; y < y_disp; y++) pset(x, y, 0, 255); } break; case 1: // right-arrow for (y = 0; y < Y; y++) { if (updateProgress(y, Y)) abort(); for (x = X - x_disp; x < X; x++) pset(x, y, 1, 255); } break; case 2: // down-arrow for (x = 0; x < X; x++) { if (updateProgress(x, X)) abort(); for (y = Y - y_disp; y < Y; y++) pset(x, y, 0, 255); } break; case 3: // left-arrow for (y = 0; y < Y; y++) { if (updateProgress(y, Y)) abort(); for (x = 0; x < x_disp; x++) pset(x, y, 1, 255); } break; } //switch return true; } //ForEveryTile