Skip to content

Commit

Permalink
🪲 Make kernel an attribute of scene so that when multiple files are o…
Browse files Browse the repository at this point in the history
…pened, they do not share the same kernel
  • Loading branch information
vanyle committed Dec 11, 2021
1 parent a19cb24 commit 256c948
Show file tree
Hide file tree
Showing 4 changed files with 12 additions and 93 deletions.
78 changes: 4 additions & 74 deletions opencodeblocks/blocks/containerblock.py
Original file line number Diff line number Diff line change
@@ -1,86 +1,16 @@
# OpenCodeBlock an open-source tool for modular visual programing in python

"""
Exports OCBSliderBlock.
Exports OCBContainerBlock.
"""

from typing import OrderedDict
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QHBoxLayout, QLabel, QLineEdit, QSlider, QVBoxLayout
from opencodeblocks.blocks.block import OCBBlock


class OCBSliderBlock(OCBBlock):
class OCBContainerBlock(OCBBlock):
"""
Features a slider ranging from 0 to 1 and an area to choose what value to assign the slider to.
A block that can contain other blocks.
"""

def __init__(self, **kwargs):
super().__init__(**kwargs)

self.layout = QVBoxLayout(self.root)

self.slider = QSlider(Qt.Horizontal)
self.slider.valueChanged.connect(self.valueChanged)

self.variable_layout = QHBoxLayout(self.root)
self.variable_text = QLineEdit("slider_value")
self.variable_value = QLabel(f"{self.slider.value()/100}")

self.variable_text.setFixedWidth(self.root.width() / 2)

self.variable_layout.addWidget(self.variable_text)
self.variable_layout.addWidget(self.variable_value)

self.layout.setContentsMargins(
self.edge_size * 2,
self.title_widget.height() + self.edge_size * 2,
self.edge_size * 2,
self.edge_size * 2
)
self.layout.addWidget(self.slider)
self.layout.addLayout(self.variable_layout)

self.holder.setWidget(self.root)

def valueChanged(self):
""" This is called when the value of the slider changes """
python_code = f"{self.var_name} = {self.value}"
self.variable_value.setText(f"{self.value}")

# The code execution part will be added when the execution flow is merged.
# We print for now
print(python_code)

@property
def value(self):
""" The value of the slider """
return str(self.slider.value() / 100)
@value.setter
def value(self, value: str):
self.slider.setValue(int(float(value) * 100))

@property
def var_name(self):
""" The name of the python variable associated with the slider """
return self.variable_text.text()
@var_name.setter
def var_name(self, value: str):
self.variable_text.setText(value)

def serialize(self):
""" Return a serialized version of this widget """
base_dict = super().serialize()
base_dict["value"] = self.value
base_dict["var_name"] = self.var_name

return base_dict

def deserialize(self, data: OrderedDict,
hashmap: dict = None, restore_id: bool = True):
""" Restore a slider block from it's serialized state """
for dataname in ['value','var_name']:
if dataname in data:
setattr(self, dataname, data[dataname])

super().deserialize(data, hashmap, restore_id)
# WIP
6 changes: 2 additions & 4 deletions opencodeblocks/blocks/executableblock.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,6 @@
from opencodeblocks.blocks.block import OCBBlock
from opencodeblocks.graphics.socket import OCBSocket

from opencodeblocks.graphics.kernel import get_main_kernel


class OCBExecutableBlock(OCBBlock):

Expand Down Expand Up @@ -63,7 +61,7 @@ def run_code(self):

# Queue the code to execute
code = self.source
kernel = get_main_kernel()
kernel = self.scene().kernel
kernel.execution_queue.append((self, code))

self.is_running = True
Expand All @@ -82,7 +80,7 @@ def execution_finished(self):
@staticmethod
def _interrupt_execution():
"""Interrupt an execution, reset the blocks in the queue"""
kernel = get_main_kernel()
kernel = self.scene().kernel
for block, _ in kernel.execution_queue:
# Reset the blocks that have not been run
block.execution_finished()
Expand Down
15 changes: 1 addition & 14 deletions opencodeblocks/graphics/kernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@

import queue
from typing import Tuple
from PyQt5.QtCore import QThreadPool
from jupyter_client.manager import start_new_kernel

from opencodeblocks.graphics.worker import Worker
Expand Down Expand Up @@ -71,7 +70,7 @@ def run_block(self, block, code: str):
worker.signals.finished.connect(self.run_queue)
worker.signals.finished.connect(block.execution_finished)
worker.signals.error.connect(block.reset_has_been_run)
get_main_threadpool().start(worker)
block.scene().threadpool.start(worker)

def run_queue(self):
""" Runs the next code in the queue """
Expand Down Expand Up @@ -139,15 +138,3 @@ def __del__(self):
Shuts down the kernel
"""
self.kernel_manager.shutdown_kernel()


kernel = Kernel()
threadpool = QThreadPool()

def get_main_kernel():
""" Return a handle to the main kernel """
return kernel

def get_main_threadpool():
""" Return a handle to the thread pool """
return threadpool
6 changes: 5 additions & 1 deletion opencodeblocks/scene/scene.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from types import FunctionType, ModuleType
from typing import List, OrderedDict, Union

from PyQt5.QtCore import QLine, QRectF
from PyQt5.QtCore import QLine, QRectF, QThreadPool
from PyQt5.QtGui import QColor, QPainter, QPen
from PyQt5.QtWidgets import QGraphicsScene

Expand All @@ -19,6 +19,7 @@
from opencodeblocks.graphics.edge import OCBEdge
from opencodeblocks.scene.clipboard import SceneClipboard
from opencodeblocks.scene.history import SceneHistory
from opencodeblocks.graphics.kernel import Kernel

import networkx as nx

Expand Down Expand Up @@ -52,6 +53,9 @@ def __init__(self, parent=None,
self.history = SceneHistory(self)
self.clipboard = SceneClipboard(self)

self.kernel = Kernel()
self.threadpool = QThreadPool()

@property
def has_been_modified(self):
""" True if the scene has been modified, False otherwise. """
Expand Down

0 comments on commit 256c948

Please sign in to comment.