cadquery-freecad-module/Libs/pyqode/core/widgets/terminal.py

67 lines
2.3 KiB
Python

import os
import sys
from pyqode.core.backend import server
from pyqode.core import modes
from . import output_window
class Terminal(output_window.OutputWindow):
"""
Simple (rudimentary) terminal widget.
It will run cmd.exe on Windows and bash on GNU/Linux.
Please note that this widget does not support all VT100 features, only the most basic one. The goal is to have
a small widget for running commands in a PyQt application, it does not aim to be a perfect emulator,
just a quick one.
"""
def __init__(self, parent=None, color_scheme=None, backend=server.__file__):
if sys.platform == 'win32':
input_handler = output_window.BufferedInputHandler()
program = 'cmd.exe'
args = []
use_pty = False
flg_bash = False
else:
program = 'bash'
args = ['-l']
input_handler = output_window.ImmediateInputHandler()
use_pty = True
flg_bash = True
working_dir = os.path.expanduser('~')
super(Terminal, self).__init__(parent=parent, color_scheme=color_scheme, input_handler=input_handler,
backend=backend)
self._formatter.flg_bash = flg_bash
self.start_process(program, arguments=args, print_command=False, use_pseudo_terminal=use_pty,
working_dir=working_dir)
def _init_code_edit(self, backend):
self.modes.append(modes.SymbolMatcherMode())
self.modes.append(modes.IndenterMode())
super(Terminal, self)._init_code_edit(backend)
try:
self.panels.remove('ReadOnlyPanel')
except KeyError:
pass
def change_directory(self, directory):
"""
Changes the current directory.
Change is made by running a "cd" command followed by a "clear" command.
:param directory:
:return:
"""
self._process.write(('cd %s\n' % directory).encode())
if sys.platform == 'win32':
self._process.write((os.path.splitdrive(directory)[0] + '\r\n').encode())
self.clear()
else:
self._process.write(b'\x0C')
def terminate_process(self):
self._process.write(b'\x04')
self._process.waitForBytesWritten()