[ justnena @ 31.08.2013. 12:11 ] @
Zdravo svima! Pocela sam da pravim tekst editor pomocu curses biblioteke. Vecina f-ja radi kako treba, ali sam zapela kod markiranja teksta. Isto tako, zelela bih da implementiram neki meni, tako da se u njemu moze kretati strelicama. U handleInput metodi je kontrola pritiska na tastere, drow metoda je za iscrtavanje prozora. Koristila sam dvostruko spregnutu listu za cuvanje teksta, a pomocu tree-a treba implementirati taj meni. Cenila bih bilo kakvu pomoc ili predlog?

import curses
import string
from dlist_mod import DoubleList
from tree import TreeNode
from stack_mod import Stack
import logging

stdscr=curses.initscr()
curses.start_color()
stdscr.keypad(1)
curses.noecho()
curses.cbreak()


logging.basicConfig(filename = "editor.log")

KEY_CTRL_F = 6
KEY_BACKSPACE = 8
KEY_ENTER = 343
KEY_SHIFT_LEFT = 391
KEY_SHIFT_RIGHT = 400
KEY_SHIFT_DOWN = 548
KEY_SHIFT_UP = 547
KEY_CTRL_H = 77
KEY_CTRL_E = 5
KEY_CTRL_R = 7
KEY_CTRL_S = 4
KEY_CTRL_X = 24
KEY_CTRL_N = 14
KEY_CTRL_V = 22

class Editor:
"""klasa Editor"""

def __init__(self, stdscr):
""""inicijalizacija"""

self.stdscr = stdscr
self.maxy, self.maxx = self.stdscr.getmaxyx()
curses.init_pair(1, curses.COLOR_BLUE, curses.COLOR_WHITE)

self.undoStack = Stack()
self.redoStack = Stack()


self.lines = DoubleList()
self.lines.append("6)Like s str other dynamic languages, Python is often used as a scripting language, but is also used in a wide range of non-scripting contexts.")
self.lines.append("7)Using third-party tools, Python code can be packaged into standalone executable programs.")
self.lines.append("3)The language provides constructs intended to enable clear programs on both a small and large scale.")
self.lines.append("4)Python supports multiple programming paradigms, including object-oriented, imperative and functional programming styles.")
self.lines.append("5)It features a dynamic type system and automatic memory management and has a large and comprehensive standard library.")
self.lines.append("8)Python interpreters are available for many operating systems. ")
self.lines.append("9)CPython, the reference implementation of Python, is free and open source software and has a community-based development model.")
self.lines.append("1)Python is a popular general-purpose, high-level programming language whose design philosophy emphasizes code readability.")
self.lines.append("2)Python's syntax allows programmers to express concepts in fewer lines of code than would be possible in languages such as C.")
self.cursorY = 0
self.cursorX = 0

self.offsetY = 0
self.offsetX = 0

self.selectX = 0
self.selectY = 0

self.isSelecting = False


self.mainMenu = TreeNode("")

self.fileMenu=TreeNode("File")
self.mainMenu.children.append(self.fileMenu)

newMenu=TreeNode("New")
self.fileMenu.children.append(newMenu)
openMenu=TreeNode("Open")
self.fileMenu.children.append(openMenu)
saveMenu=TreeNode("Save")
self.fileMenu.children.append(saveMenu)
saveAsMenu=TreeNode("Save as")
self.fileMenu.children.append(saveAsMenu)
exitMenu=TreeNode("Exit")
self.fileMenu.children.append(exitMenu)


editMenu=TreeNode("Edit")
self.mainMenu.children.append(editMenu)

cutMenu=TreeNode("Cut")
editMenu.children.append(cutMenu)
copyMenu=TreeNode("Copy")
editMenu.children.append(copyMenu)
pasteMenu=TreeNode("Paste")
editMenu.children.append(pasteMenu)

viewMenu=TreeNode("View")
self.mainMenu.children.append(viewMenu)

showLinesMenu=TreeNode("Show lines")
viewMenu.children.append(showLinesMenu)

toolsMenu=TreeNode("Tools")
self.mainMenu.children.append(toolsMenu)

optionsMenu=TreeNode("Options")

toolsMenu.children.append(optionsMenu)

def draw(self):
"""Ova funkcija sluzi za iscrtavanje prozora"""
# iscrtavanje
self.maxy, self.maxx = self.stdscr.getmaxyx()

self.stdscr.clear()

for i, line in enumerate(self.lines.values()):
# ograniciti prostor ispisa
dy = i - self.offsetY+1
visibleLine = line[self.offsetX:self.maxx + self.offsetX - 1]
self.stdscr.addstr(dy, 0, visibleLine)
if dy >= 0 and dy < self.maxy:

for l in line:
if self.isSelecting and self.selectY == i:

x1 = min(self.selectX, self.cursorX)
x2 = max(self.selectX,self.cursorX)
preSelectedLine = line [:x1]
SelectedLine = line [x1:x2]
postSelectedLine = line [x2:]

self.stdscr.addstr(dy,0,preSelectedLine)#, curses.color_pair(1))
self.stdscr.addstr(dy,x1,SelectedLine, curses.color_pair(1))
self.stdscr.addstr(dy,x2,postSelectedLine)#, curses.color_pair(1))

elif self.isSelecting and self.selectY == i:
x1 = min(self.selectX, self.cursorX)
x2 = max(self.selectX,self.cursorX)
preSelectedLine = line [:x2]
SelectedLine = line [x1:x2]
postSelectedLine = ""

self.stdscr.addstr(dy,0,preSelectedLine)#, curses.color_pair(1))
self.stdscr.addstr(dy,x1,SelectedLine, curses.color_pair(1))
# self.stdscr.addstr(dy,x2,postSelectedLine)#, curses.color_pair(1))








topMenuX = 0
for topMenu in self.mainMenu.children:
topMenuStr = topMenu.data
self.stdscr.addstr(0,topMenuX,topMenuStr)
topMenuX += len(topMenuStr) + 1
self.stdscr.move(self.cursorY - self.offsetY + 1, self.cursorX - self.offsetX)



def left(self):
"""Funkcija za pomeranje u levo."""
if self.cursorX > 0:
if self.cursorX == self.offsetX:
self.offsetX -= 1
self.cursorX -= 1
elif self.cursorY > 0:
self.cursorY -= 1
self.end()

def right(self):
""" Funkcija za pomeranje kursora desno."""
self.maxy, self.maxx = self.stdscr.getmaxyx()
line = self.lines.index(self.cursorY)
if self.cursorX < len(line):
if self.cursorX - self.offsetX == self.maxx - 1:
self.offsetX += 1
self.cursorX += 1
elif self.cursorY != self.lines.size() - 1:
self.home()
self.down()


def down(self):
"""Funkcija za pomeranje kursora dole."""
if self.cursorY < self.lines.size() - 1:
if self.cursorY - self.offsetY == self.maxy - 1:
self.offsetY += 1
self.cursorY += 1

line = self.lines.index(self.cursorY)
while self.cursorX > len(line):
self.left()


def up(self):
"""Funkcija za pomeranje kursora gore."""
if self.cursorY > 0:
if self.offsetY == self.cursorY:
self.offsetY -= 1
self.cursorY -= 1

line = self.lines.index(self.cursorY)
while self.cursorX > len(line):
self.left()




def printCh(self, ch):
# trenutna linija
line = self.lines.index(self.cursorY)

# ubacivanje novih slova u liniju
line = line[:self.cursorX] + chr(ch) + line[self.cursorX:]

# menjanje linije
self.lines.insertIndex(self.cursorY, line)
self.lines.removeIndex(self.cursorY + 1)

self.right()

def handleInput(self):

ch = self.stdscr.getch()
logging.error(ch)


if ch == curses.KEY_LEFT:
if self.isSelecting:
self.isSelecting = False
self.left()

elif ch == curses.KEY_RIGHT:
if self.isSelecting:
self.isSelecting = False
self.right()

elif ch == curses.KEY_DOWN:
self.down()
elif ch == curses.KEY_UP:
self.up()

elif ch == 442:
self.redo()
elif ch == 26:
self.undo()

elif ch == curses.KEY_F5:
self.load()
elif ch == curses.KEY_F6:
self.save()
elif ch == curses.KEY_F9:
self.save()
self.saveAs()
elif ch == 18:

self.replace()

elif ch == KEY_SHIFT_RIGHT:
if not self.isSelecting:
self.isSelecting = True
self.selectX = self.cursorX
self.selectY = self.cursorY
self.right()

elif ch == KEY_SHIFT_UP: # Pretrazivanje
self.shiftUp()
elif ch == KEY_SHIFT_LEFT: # Pretrazivanje
self.ShiftLeft()

elif ch == KEY_SHIFT_DOWN: # Pretrazivanje
if not self.isSelecting:
self.isSelecting = True
self.selectX = self.cursorX
self.selectY = self.cursorY
self.down()

elif ch == KEY_CTRL_H: # selektovanje od trenutne pozicije kursora ka pocetku reda
if not self.isSelecting:
self.isSelecting = True
self.selectX = self.cursorX
self.selectY = self.cursorY
self.home()

elif ch == curses.KEY_END:
if self.isSelecting:
self.isSelecting = False
self.end()

elif ch == KEY_CTRL_E: # selektovanje od trenutne pozicije kursora ka kraju reda u dokumentu
if not self.isSelecting:
self.isSelecting = True
self.selectX = self.cursorX
self.selectY = self.cursorY
self.end()


elif ch == 27: # Escape izlaz iz programa
exit()



elif ch < 127 and chr(ch) in string.printable:
state = self.saveState()
self.undoStack.push(state)
self.redoStack.push(state)
self.redoStack = Stack()
# trenutna linija
line = self.lines.index(self.cursorY)


# ubacivanje slova u liniju
line = line[:self.cursorX] + chr(ch) + line[self.cursorX:]
# modifikovanje linije
self.lines.insertIndex(self.cursorY, line)
self.lines.removeIndex(self.cursorY + 1)

self.right()

def loop(self):
while True:
self.draw()
self.handleInput()




def main(stdscrLocal):
global stdscr
stdscr = stdscrLocal
editor = Editor(stdscr)
editor.loop()

if __name__ == "__main__":
curses.wrapper(main)

[Ovu poruku je menjao justnena dana 01.09.2013. u 16:52 GMT+1]