Skip to content

Commit

Permalink
Full refactor of gui.window
Browse files Browse the repository at this point in the history
  • Loading branch information
imirzov committed Apr 29, 2021
1 parent d360aaa commit cf6e956
Show file tree
Hide file tree
Showing 9 changed files with 250 additions and 230 deletions.
4 changes: 2 additions & 2 deletions config/sendkeys.xml
Original file line number Diff line number Diff line change
Expand Up @@ -87,14 +87,14 @@
<widget class="QLineEdit" name="customEdit"/>
</item>
<item>
<widget class="QPushButton" name="customSend">
<widget class="QPushButton" name="b4">
<property name="text">
<string>Send cutom command</string>
</property>
</widget>
</item>
<item>
<widget class="QPushButton" name="testAllSymbols">
<widget class="QPushButton" name="b5">
<property name="text">
<string>Test all symbols</string>
</property>
Expand Down
54 changes: 28 additions & 26 deletions src/actions.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,14 @@

"""
s - Settings
w - Window
f - Window factory
w - Master window
m - Model
t - Tree
j - Job
"""
def actions(p, s, w, m, t, j, i):
def actions(p, s, f, m, t, j, i):
w = f.mw
w.keyPressEvent = t.keyPressEvent

# File actions
Expand All @@ -44,15 +46,15 @@ def actions(p, s, w, m, t, j, i):

# CGX actions
w.action_cgx_paint_elsets.triggered.connect(
lambda: gui.cgx.paint_elsets(w, m))
lambda: gui.cgx.paint_elsets(f, m))
w.action_cgx_paint_surfaces.triggered.connect(
lambda: gui.cgx.paint_surfaces(w, m))
w.action_cgx_inp.triggered.connect(lambda: gui.cgx.open_inp(w, j.inp, len(m.Mesh.nodes)))
w.action_cgx_frd.triggered.connect(lambda: gui.cgx.open_frd(w, j.frd))
w.action_cgx_cmap_classic.triggered.connect(lambda: w.connections[1].post('cmap classic'))
w.action_cgx_cmap_inferno.triggered.connect(lambda: w.connections[1].post('cmap inferno'))
w.action_cgx_cmap_turbo.triggered.connect(lambda: w.connections[1].post('cmap turbo'))
w.action_cgx_cmap_viridis.triggered.connect(lambda: w.connections[1].post('cmap viridis'))
lambda: gui.cgx.paint_surfaces(f, m))
w.action_cgx_inp.triggered.connect(lambda: gui.cgx.open_inp(f, j.inp, len(m.Mesh.nodes)))
w.action_cgx_frd.triggered.connect(lambda: gui.cgx.open_frd(f, j.frd))
w.action_cgx_cmap_classic.triggered.connect(lambda: f.connections[1].post('cmap classic'))
w.action_cgx_cmap_inferno.triggered.connect(lambda: f.connections[1].post('cmap inferno'))
w.action_cgx_cmap_turbo.triggered.connect(lambda: f.connections[1].post('cmap turbo'))
w.action_cgx_cmap_viridis.triggered.connect(lambda: f.connections[1].post('cmap viridis'))

# Help actions
w.action_help_readme.triggered.connect(
Expand All @@ -70,27 +72,27 @@ def actions(p, s, w, m, t, j, i):
w.treeView.collapsed.connect(t.treeViewCollapsed)

# ToolBar actions
w.action_view_minus_x.triggered.connect(lambda: w.connections[1].post('rot -x'))
w.action_view_minus_y.triggered.connect(lambda: w.connections[1].post('rot -y'))
w.action_view_minus_z.triggered.connect(lambda: w.connections[1].post('rot -z'))
w.action_view_plus_x.triggered.connect(lambda: w.connections[1].post('rot x'))
w.action_view_plus_y.triggered.connect(lambda: w.connections[1].post('rot y'))
w.action_view_plus_z.triggered.connect(lambda: w.connections[1].post('rot z'))
w.action_view_frame.triggered.connect(lambda: w.connections[1].post('frame'))
w.action_view_minus_x.triggered.connect(lambda: f.connections[1].post('rot -x'))
w.action_view_minus_y.triggered.connect(lambda: f.connections[1].post('rot -y'))
w.action_view_minus_z.triggered.connect(lambda: f.connections[1].post('rot -z'))
w.action_view_plus_x.triggered.connect(lambda: f.connections[1].post('rot x'))
w.action_view_plus_y.triggered.connect(lambda: f.connections[1].post('rot y'))
w.action_view_plus_z.triggered.connect(lambda: f.connections[1].post('rot z'))
w.action_view_frame.triggered.connect(lambda: f.connections[1].post('frame'))

# Workaround for iso view
# Three rotation posts to CGX window doesn't work in Windows
# So one may use .fbd commands
def action_view_iso():
file_name = os.path.join(p.config, 'iso.fbd')
file_name = os.path.join(p.config, 'cgx_iso.fbd')
if not os.path.isfile(file_name):
logging.error('No config file iso.fbd')
logging.error('No config file cgx_iso.fbd')
return
w.connections[1].post('read ' + file_name)
f.connections[1].post('read ' + file_name)
w.action_view_iso.triggered.connect(action_view_iso)
w.action_view_line.triggered.connect(lambda: w.connections[1].post('view elem off'))
w.action_view_line.triggered.connect(lambda: w.connections[1].post('view line'))
w.action_view_fill.triggered.connect(lambda: w.connections[1].post('view elem off'))
w.action_view_fill.triggered.connect(lambda: w.connections[1].post('view fill'))
w.action_view_elem.triggered.connect(lambda: w.connections[1].post('view fill'))
w.action_view_elem.triggered.connect(lambda: w.connections[1].post('view elem'))
w.action_view_line.triggered.connect(lambda: f.connections[1].post('view elem off'))
w.action_view_line.triggered.connect(lambda: f.connections[1].post('view line'))
w.action_view_fill.triggered.connect(lambda: f.connections[1].post('view elem off'))
w.action_view_fill.triggered.connect(lambda: f.connections[1].post('view fill'))
w.action_view_elem.triggered.connect(lambda: f.connections[1].post('view fill'))
w.action_view_elem.triggered.connect(lambda: f.connections[1].post('view elem'))
19 changes: 9 additions & 10 deletions src/cae.py
Original file line number Diff line number Diff line change
Expand Up @@ -77,22 +77,21 @@
# Default start model (INP file)
# could be chosen with command line parameter
parser = argparse.ArgumentParser()
parser.add_argument('-inp',
type=str, help='your .inp file',
default=s.start_model)
parser.add_argument('-inp', type=str,
help='your .inp file', default=s.start_model)
args = parser.parse_args()

# Show CAE window and get window ID
# A new logger's handler is created here
w = gui.window.MasterWindow(p, s)
w.show()
f = gui.window.Factory(p, s)
f.mw.run()

# Main block
m = model.Model() # generate FEM model
t = tree.Tree(p, s, w, m) # create treeView items based on KOM
j = model.job.Job(p, s, w, m) # create job object
i = importer.Importer(p, s, w, m, t, j)
actions.actions(p, s, w, m, t, j, i) # window actions
t = tree.Tree(p, s, f, m) # create treeView items based on KOM
j = model.job.Job(p, s, f, m) # create job object
i = importer.Importer(p, s, f, m, t, j)
actions.actions(p, s, f, m, t, j, i) # window actions

# Import default model
if len(args.inp):
Expand All @@ -112,7 +111,7 @@
app.exec()

# Kill CGX after CAE exit
w.kill_slave()
f.kill_slave()

# Recursively clean cached files in all subfolders
clean.cache(p.src)
74 changes: 34 additions & 40 deletions src/gui/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
Distributed under GNU General Public License v3.0
Classes for keycodes sending from master window to slave.
mw = master window
sw = slave window
"""

# Standard modules
Expand Down Expand Up @@ -68,20 +70,20 @@ def fcn(wc, title):
def post_wrapper(wc):
def wrap(method):
def fcn(wc, cmd):
if wc.slave_process is not None \
and wc.slave_process.poll() is None\
if wc.sw.process is not None \
and wc.sw.process.poll() is None\
and wc.wid2 is not None:

if len(cmd):
# Drop previously pressed keys
if 'cgx' in wc.slave_title:
if 'cgx' in wc.sw.title:
method(wc, '\n')

# Post command
method(wc, cmd + '\n')

# Flush CGX buffer to get continuous output
if 'cgx' in wc.slave_title:
if 'cgx' in wc.sw.title:
method(wc, ' ')

return
Expand All @@ -99,27 +101,27 @@ def fcn(wc, cmd):
# TODO make possible to use QtWidgets.QDialog as master
class WindowConnection:

def __init__(self, master_window=None, slave_title=None):
self.master_window = master_window # QtWidgets.QMainWindow
self.slave_title = slave_title
self.wid1 = None # master window - CAE
self.wid2 = None # slave window - CGX, text editor, web browser
self.slave_process = None
self.master_title = None
self.w = 100
self.h = 100
self.opened_windows = {} # {wid:(pid, wname)}
def __init__(self, f):
if f is None:
return

# TODO Pass all these arguemtns, not Factory
self.mw = f.mw # master window
self.sw = f.sw # slave window
self.w = f.w
self.h = f.h
self.s = f.s # global settings

if master_window is not None:
self.slave_process = master_window.slave_process
self.master_title = master_window.windowTitle()
self.w = master_window.desktopSize.width()
self.h = master_window.desktopSize.height()
self.wid1 = None # master window id
self.wid2 = None # slave window id
self.opened_windows = {} # {wid:(pid, wname)}

def connect(self):
self.wid1 = self.get_wid(self.master_title)
self.wid2 = self.get_wid(self.slave_title)

self.wid1 = self.get_wid(self.mw.windowTitle())
self.wid2 = self.get_wid(self.sw.title)
if self.s.align_windows:
self.align()

def disconnect(self):
self.wid1 = None
self.wid2 = None
Expand All @@ -136,8 +138,8 @@ def log_opened_windows(self):

class WindowConnectionLinux(WindowConnection):

def __init__(self, master_window, slave_title):
super(WindowConnectionLinux, self).__init__(master_window, slave_title)
def __init__(self, f):
super(WindowConnectionLinux, self).__init__(f)

self.d = Xlib.display.Display()
self.screen = self.d.screen()
Expand Down Expand Up @@ -303,7 +305,7 @@ def send_hotkey(self, *keys):
# CAE window is already aligned in __init__()
def align(self):
# Align master
self.master_window.setGeometry(0, 0, math.floor(self.w/3), self.h)
self.mw.setGeometry(0, 0, math.floor(self.w/3), self.h)
# if self.wid1 is not None:
# win = self.d.create_resource_object('window', self.wid1)
# win.set_input_focus(Xlib.X.RevertToNone, Xlib.X.CurrentTime)
Expand Down Expand Up @@ -334,8 +336,8 @@ def align(self):

class WindowConnectionWindows(WindowConnection):

def __init__(self, master_window, slave_title):
super(WindowConnectionWindows, self).__init__(master_window, slave_title)
def __init__(self, f):
super(WindowConnectionWindows, self).__init__(f)

# 0:lowercase, 1:shifted
self.keyboardMapping = {
Expand Down Expand Up @@ -463,7 +465,7 @@ def enum_proc(hwnd, lParam):
def align(self):

# Align master
self.master_window.setGeometry(0, 0, math.floor(self.w/3), self.h)
self.mw.setGeometry(0, 0, math.floor(self.w/3), self.h)
# ctypes.windll.user32.SetProcessDPIAware() # account for scaling
# if self.wid1 is not None:
# ok = forceFocus(self.wid1)
Expand Down Expand Up @@ -512,23 +514,15 @@ def test2():
print('ERROR! No web browsers!')
return

if os.name == 'nt':
master_window = window.MasterWindowWindows(p, s)
if os.name == 'posix':
master_window = window.MasterWindowLinux(p, s)
else:
msg = 'SORRY, {} OS is not supported.'.format(os.name)
print(msg)
raise SystemExit # the best way to exit

mw = window.MasterWindow(p, s)
for slave_title in reversed(browsers):
slave_title = slave_title.replace('-browser', '')
master_window.create_connection(2, slave_title)
wid2 = master_window.connections[2].wid2
mw.create_connection(2, slave_title)
wid2 = mw.connections[2].wid2
msg = '{} {}'.format(slave_title, wid2)
print(msg)
if wid2 is not None and s.align_windows:
master_window.connections[2].align()
mw.connections[2].align()
break

app.exec() # execute application
Expand Down
19 changes: 10 additions & 9 deletions src/gui/dialog.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,12 +48,13 @@ class KeywordDialog(QtWidgets.QDialog):
"""
p - Path
s - Settings
w - Window
f - Window Factory
"""
def __init__(self, p, s, w, KOM, item):
def __init__(self, p, s, f, KOM, item):
self.p = p
self.s = s
self.master_window = w
self.f = f
self.mw = f.mw
self.item = item # needed to pass to other functions
self.widgets = [] # list of created widgets

Expand Down Expand Up @@ -302,17 +303,17 @@ def onHelp(self):
# slave_title = wb_name.replace('-browser', '') # chromium
slave_title = self.item.name
logging.debug('Checking \'' + slave_title + '\'')
self.master_window.create_connection(2, slave_title)
if self.master_window.connections[2].wid2 is not None:
self.master_window.connections[2].align()
self.f.create_connection(2, slave_title)
if self.f.connections[2].wid2 is not None:
self.f.connections[2].align()
# break
elif os.name == 'nt':
# TODO Check on Windows 10 webbrowser._tryorder
slave_title = self.item.name[1:] + '.html'
logging.debug('Checking ' + slave_title)
self.master_window.create_connection(2, slave_title)
if self.master_window.connections[2].wid2 is not None and self.s.align_windows:
self.master_window.connections[2].align()
self.f.create_connection(2, slave_title)
if self.f.connections[2].wid2 is not None and self.s.align_windows:
self.f.connections[2].align()
else:
logging.error('Unsupported OS.')
raise SystemExit
Expand Down
Loading

0 comments on commit cf6e956

Please sign in to comment.