def __init__(self, desktop): super(SelectionGrid, self).__init__() dimensions = desktop.availableGeometry() self.screen_width = dimensions.width() self.screen_height = dimensions.height() self.windows = WindowHelper() self.load_config() keybinder.bind(self.settings['hotkey'], self.toggle) self.construct_grid() self.init_grid_ui()
class SelectionGrid(QtGui.QFrame): reset_grid = QtCore.Signal() highlight_selection = QtCore.Signal() def __init__(self, desktop): super(SelectionGrid, self).__init__() dimensions = desktop.availableGeometry() self.screen_width = dimensions.width() self.screen_height = dimensions.height() self.windows = WindowHelper() self.load_config() keybinder.bind(self.settings['hotkey'], self.toggle) self.construct_grid() self.init_grid_ui() def construct_grid(self): self.grid = QtGui.QGridLayout(self) for i in range(1, self.settings['grid_rows'] + 1): for j in range(1, self.settings['grid_columns'] + 1): grid_box = GridBox(self, i, j) self.grid.addWidget(grid_box, i, j) def mousePressEvent(self, event): if event.button() == QtCore.Qt.LeftButton: grid_box = self.childAt(event.x(), event.y()) color = self.settings['selected_box_background_color'] grid_box.setStyleSheet('background-color: {color};border:none;'.format(color=color)) row, col = self.get_box_position(grid_box) self.current_selection = { 'start_row': row, 'start_col': col } def mouseReleaseEvent(self, event): if event.button() == QtCore.Qt.LeftButton: self.windows.resize_window(*self.calculate_resize()) self.hide() self.reset_grid.emit() def mouseMoveEvent(self, event): if event.buttons() & QtCore.Qt.LeftButton: grid_box = self.childAt(event.x(), event.y()) if grid_box: row, col = self.get_box_position(grid_box) self.current_selection['outer_x'] = col self.current_selection['outer_y'] = row self.highlight_selection.emit() def calculate_resize(self): y1 = self.current_selection['start_row'] y2 = self.current_selection['outer_y'] x1 = self.current_selection['start_col'] x2 = self.current_selection['outer_x'] start_x, end_x = sorted((x1, x2)) start_y, end_y = sorted((y1, y2)) box_size_x = self.screen_width / self.settings['grid_columns'] box_size_y = self.screen_height / self.settings['grid_rows'] x_pos = (start_x - 1) * box_size_x y_pos = (start_y - 1) * box_size_y size_x = box_size_x * (end_x - start_x + 1) size_y = box_size_y * (end_y - start_y + 1) return (self.active_window_id, x_pos, y_pos, size_x, size_y) def get_box_position(self, grid_box): index = self.grid.indexOf(grid_box) row, col, __, __ = self.grid.getItemPosition(index) return (row, col) def init_grid_ui(self): w = self.settings['grid_window_width'] h = self.settings['grid_window_height'] x = (self.screen_width - w) / 2 y = (self.screen_height - h) / 2 self.setGeometry(x, y, w, h) self.setWindowTitle('boxes') self.setWindowFlags(QtCore.Qt.FramelessWindowHint) color = self.settings['background_color'] self.setStyleSheet( 'background-color: {color};' 'border-radius: 5px;' .format(color=color) ) def show_grid(self): self.active_window_id = self.windows.get_active_window() self.show() def toggle(self): if self.isVisible(): self.hide() else: self.show_grid() def load_config(self): self.settings = DEFAULTS self.settings['grid_window_width'] = self.screen_width / 3.5 self.settings['grid_window_height'] = self.screen_height / 3.5 if os.path.isfile(CONFIG): cfg = ConfigParser.ConfigParser() with open(CONFIG) as f: cfg.readfp(f) for option in self.settings: method = 'getint' if type(self.settings[option]) == int else 'get' try: self.settings[option] = getattr(cfg, method)('Grid', option) except: continue