def lookforkeys(event, deltax, deltay): global oldcells, selrect, selpatt # look for keys used to flip/rotate selection if event == "key x none" or event == "key y none": # flip floating selection left-right or top-bottom if len(oldcells) > 0: g.clear(0) g.putcells(selpatt, deltax, deltay) if " x " in event: g.flip(0) else: g.flip(1) selpatt = g.transform(g.getcells(selrect), -deltax, -deltay) if len(oldcells) > 0: g.clear(0) g.putcells(oldcells) g.putcells(selpatt, deltax, deltay) g.update() return if event == "key > none" or event == "key < none": # rotate floating selection clockwise or anticlockwise; # because we use g.rotate below we have to use the exact same # calculation (see Selection::Rotate in wxselect.cpp) for rotrect: midx = selrect[0] + int((selrect[2]-1)/2) midy = selrect[1] + int((selrect[3]-1)/2) newleft = midx + selrect[1] - midy newtop = midy + selrect[0] - midx rotrect = [ newleft, newtop, selrect[3], selrect[2] ] if not rectingrid(rotrect): g.warn("Rotation is not allowed if selection would be outside grid.") return g.clear(0) if len(oldcells) > 0: g.putcells(oldcells) oldcells = g.join(oldcells, g.getcells(rotrect)) g.clear(0) g.select(rotrect) g.clear(0) g.select(selrect) g.putcells(selpatt, deltax, deltay) if " > " in event: g.rotate(0) else: g.rotate(1) selrect = g.getselrect() if selrect != rotrect: g.warn("Bug: selrect != rotrect") selpatt = g.transform(g.getcells(selrect), -deltax, -deltay) if len(oldcells) > 0: g.clear(0) g.putcells(oldcells) g.putcells(selpatt, deltax, deltay) g.update() return if event == "key h none": showhelp2() return g.doevent(event)
answer = g.getstring("Enter direction to rotate in\n" + "(valid rotations are cw and ccw, default is cw):", "cw", "Rotate selection") if answer != "cw" and answer != "ccw": g.exit ("Unknown direction: " + answer + " (must be cw/ccw)") cells = g.getcells (rect) jvn_rotate = (( 9, 12, 11, 10), (13, 16, 15, 14), (17, 20, 19, 18), (21, 24, 23, 22)) def rotated (rotations, direction, state): for rotation in rotations: length = len (rotation) for i in range (length): if rotation[i] == state: return rotation[(i + direction) % length] return state for i in range (0, int (math.floor (len (cells) / 3) * 3), 3): cells[i + 2] = rotated (jvn_rotate, {"cw": 1, "ccw": -1}[answer], cells[i + 2]) g.putcells (cells) g.rotate ({"cw": 0, "ccw": 1}[answer])