@ -15,6 +15,7 @@ from PyQt5.QtWidgets import (
QFileDialog
)
from einops import rearrange
from . region_label_collection import RegionLabelCollection
@ -38,12 +39,11 @@ class WorldRegionsWidget(QScrollArea):
world_regions_image_raw_data = np . array
currently_hovered_label = object
cursor_add_region = QCursor
cursor_remove_region = QCursor
cursor_hover_region = QCursor
cursor_plot_region = QCursor
cursor_region_context = QCursor
cursor_blank = QCursor
def __init__ ( self , zoom_factor = 1.0 , min_zoom_factor = 0.5 , max_zoom_factor = 24.0 , region_size = 48 ) :
super ( ) . __init__ ( )
@ -106,15 +106,15 @@ class WorldRegionsWidget(QScrollArea):
self . cursor_remove_region = QCursor (
QPixmap ( os . path . join ( self . root_dir , ' cursors/remove_region.png ' ) ) . scaled ( * scale_options ) , - 1 , - 1
)
self . cursor_ plot_ region = QCursor (
self . cursor_ region_context = QCursor (
QPixmap ( os . path . join ( self . root_dir , ' cursors/region_context.png ' ) ) . scaled ( * scale_options ) , - 1 , - 1
)
self . cursor_blank = QCursor (
QPixmap ( os . path . join ( self . root_dir , ' cursors/blank_cursor.png ' ) ) . scaled ( * scale_options ) , - 1 , - 1
)
self . setCursor ( self . cursor_hover_region )
def set_currently_hovered_label ( self , label ) :
self . currently_hovered_label = label
def action_zoom_in ( self ) :
self . world_label_zoom_factor + = self . min_zoom_factor
if self . world_label_zoom_factor > = self . max_zoom_factor :
@ -125,7 +125,7 @@ class WorldRegionsWidget(QScrollArea):
self . zoom_adjusted_label_size
)
self . adjust_scrollbar_positions ( )
self . center_mouse_on_hovered_label( )
self . region_label_collection. center_mouse_on_hovered_label( )
def action_zoom_out ( self ) :
self . world_label_zoom_factor - = self . min_zoom_factor
@ -137,16 +137,16 @@ class WorldRegionsWidget(QScrollArea):
self . zoom_adjusted_label_size
)
self . adjust_scrollbar_positions ( )
self . center_mouse_on_hovered_label( )
self . region_label_collection. center_mouse_on_hovered_label( )
def adjust_scrollbar_positions ( self ) :
size = ( self . currently_hovered_label. width ( ) )
widget_index_x = int ( self . currently_hovered_label . region_string . split ( " . " ) [ 1 ] ) + 17
widget_index_y = int ( ( int ( self . currently_hovered_label . region_string . split ( " . " ) [ 2 ] ) * - 1 ) ) + 16
size = ( self . region_label_collection. currently_hovered_label. width ( ) )
widget_index_x , widget_index_y = self . region_label_collection . create_grid_index_from_region_string (
self . region_label_collection . currently_hovered_label . region_string
)
widget_position_x = int ( widget_index_x * size )
widget_position_y = int ( widget_index_y * size )
widget_position_x = int ( ( widget_index_x + 1 ) * size )
widget_position_y = int ( ( widget_index_y + 1 ) * size )
self . horizontalScrollBar ( ) . setValue (
int ( widget_position_x - size / 2 - self . width ( ) / 2 )
@ -155,41 +155,48 @@ class WorldRegionsWidget(QScrollArea):
int ( widget_position_y - size / 2 - self . height ( ) / 2 )
)
def center_mouse_on_hovered_label ( self ) :
QCursor . setPos ( self . currently_hovered_label . mapToGlobal ( QPoint (
int ( self . currently_hovered_label . width ( ) / 2 ) ,
int ( self . currently_hovered_label . height ( ) / 2 )
) ) )
@staticmethod
def control_is_pressed ( key_event = None ) - > bool :
modifiers = QApplication . keyboardModifiers ( )
return any ( [
modifiers == Qt . ControlModifier ,
key_event is not None and key_event . key ( ) in ( 16777249 , 16777250 )
] )
def trigger_cursor_change ( self , event = None ) :
@staticmethod
def shift_is_pressed ( key_event = None ) - > bool :
modifiers = QApplication . keyboardModifiers ( )
control_is_pressed = (
modifiers == Qt . ControlModifier or ( event is not None and event . key ( ) in ( 16777249 , 16777250 ) )
)
shift_is_pressed = (
modifiers == Qt . ShiftModifier or ( event is not None and event . key ( ) == 16777248 )
)
return any ( [
modifiers == Qt . ShiftModifier ,
key_event is not None and key_event . key ( ) == 16777248
] )
if control_is_pressed :
def trigger_cursor_change ( self , key_event = None ) :
if self . control_is_pressed ( key_event = key_event ) :
try :
if self . currently_hovered_label. is_region :
if not self . currently_hovered_label. is_marked :
if self . region_label_collection. currently_hovered_label. is_region :
if not self . region_label_collection. currently_hovered_label. is_marked :
self . setCursor ( self . cursor_add_region )
else :
self . setCursor ( self . cursor_remove_region )
# all states are covered here, we can return
return
else :
self . setCursor ( self . cursor_blank )
# all possible eventualities covered!
return
except AttributeError :
pass
elif shift_is_pressed :
elif self . shift_is_pressed ( key_event = key_event ) :
try :
if self . currently_hovered_label . is_region :
self . setCursor ( self . cursor_plot_region )
# it's either on or not
return
if self . region_label_collection . currently_hovered_label . is_region :
self . setCursor ( self . cursor_region_context )
else :
self . setCursor ( self . cursor_blank )
return
except AttributeError :
pass
@ -198,44 +205,47 @@ class WorldRegionsWidget(QScrollArea):
self . setCursor ( self . cursor_hover_region )
""" altering class functions """
def mousePressEvent ( self , event) :
if event. button ( ) == Qt . LeftButton :
def mousePressEvent ( self , mouse_ event) :
if mouse_ event. button ( ) == Qt . LeftButton :
self . trigger_cursor_change ( )
if event . button ( ) == Qt . RightButton :
if mouse_event . button ( ) == Qt . RightButton and all ( [
not self . shift_is_pressed ( ) ,
not self . control_is_pressed ( )
] ) :
self . drag_in_progress = True
self . drag_start . setX ( event . x ( ) )
self . drag_start . setY ( event . y ( ) )
self . drag_start . setX ( mouse_ event. x ( ) )
self . drag_start . setY ( mouse_ event. y ( ) )
else :
self . drag_in_progress = False
super ( ) . mousePressEvent ( event)
super ( ) . mousePressEvent ( mouse_ event)
def mouseReleaseEvent ( self , event) :
if event. button ( ) == Qt . LeftButton :
def mouseReleaseEvent ( self , mouse_ event) :
if mouse_ event. button ( ) == Qt . LeftButton :
self . drag_in_progress = False
if event. button ( ) == Qt . RightButton :
if mouse_ event. button ( ) == Qt . RightButton :
self . trigger_cursor_change ( )
super ( ) . mouseReleaseEvent ( event)
super ( ) . mouseReleaseEvent ( mouse_ event)
def mouseMoveEvent ( self , event) :
def mouseMoveEvent ( self , mouse_ event) :
if self . drag_in_progress :
self . verticalScrollBar ( ) . setValue (
self . verticalScrollBar ( ) . value ( ) - ( event. y ( ) - self . drag_start . y ( ) )
self . verticalScrollBar ( ) . value ( ) - ( mouse_ event. y ( ) - self . drag_start . y ( ) )
)
self . horizontalScrollBar ( ) . setValue (
self . horizontalScrollBar ( ) . value ( ) - ( event. x ( ) - self . drag_start . x ( ) )
self . horizontalScrollBar ( ) . value ( ) - ( mouse_ event. x ( ) - self . drag_start . x ( ) )
)
self . drag_start = QPoint (
event. x ( ) , event. y ( )
mouse_ event. x ( ) , mouse_ event. y ( )
)
super ( ) . mouseMoveEvent ( event)
super ( ) . mouseMoveEvent ( mouse_ event)
def wheelEvent ( self , event) :
if event. angleDelta ( ) . y ( ) > 0 :
def wheelEvent ( self , mouse_ event) :
if mouse_ event. angleDelta ( ) . y ( ) > 0 :
self . action_zoom_in ( )
else :
self . action_zoom_out ( )
@ -244,16 +254,19 @@ class WorldRegionsWidget(QScrollArea):
we do not want to scroll with the wheel , this is not a list """
# super().wheelEvent(event)
def keyPressEvent ( self , event ) :
if event . key ( ) in ( 16777249 , 16777250 , 16777248 ) :
self . trigger_cursor_change ( event )
def keyPressEvent ( self , key_event ) :
if any ( [
self . shift_is_pressed ( key_event = key_event ) ,
self . control_is_pressed ( key_event = key_event )
] ) :
self . trigger_cursor_change ( key_event )
super ( ) . keyPressEvent ( event )
super ( ) . keyPressEvent ( key_ event)
def keyReleaseEvent ( self , event) :
def keyReleaseEvent ( self , key_ event) :
self . setCursor ( self . cursor_hover_region )
super ( ) . keyReleaseEvent ( event)
super ( ) . keyReleaseEvent ( key_ event)
# file operations
def open_world_file_dialogue ( self ) :
@ -279,6 +292,7 @@ class WorldRegionsWidget(QScrollArea):
self . world_loaded = True
def save_world_file_dialogue ( self ) :
map_data = rearrange ( self . region_label_collection . blockshaped_map_data , ' x y dx dy -> (x dx) (y dy) ' )
options = QFileDialog . Options ( )
file_name , _ = QFileDialog . getSaveFileName (
self , caption = ' save the world ' , filter = ' RAW files (*.raw) ' , options = options
@ -286,5 +300,5 @@ class WorldRegionsWidget(QScrollArea):
if file_name :
with open ( file_name , ' w+b ' ) as raw_file :
raw_file . write (
bytearray ( np . flipud ( self . region_label_collection. raw_ map_data) )
bytearray ( np . flipud ( map_data) )
)