batebates/sudoku

View on GitHub
src/view/OverlayManager.rb

Summary

Maintainability
B
5 hrs
Test Coverage
#===Gère l'interface au dessus de la grille
class OverlayManager
    private_class_method :new

    @@overlayPanel = nil;
    @@buttons = nil;
    @@open = false;

    def OverlayManager.init(overlay)
        new(overlay);
    end

    def initialize(overlay)
        @@buttons = Array.new();
        @@overlayPanel = Gtk::Fixed.new();
        sudokuChoiceGrid = Gtk::Grid.new();
        sudokuChoiceGrid.name = "overlay-grid";

        for i in 0...9
            x = i % 3;
            y = i / 3;

            buttonChoice = Gtk::Button.new();
            buttonLabel = Gtk::Label.new((i + 1).to_s);
            buttonBox = Gtk::Box.new(:horizontal, 0);
            buttonBox.add(buttonLabel);

            buttonChoice.set_border_width(2);
            buttonChoice.set_size_request(32, 32);
            buttonChoice.add(buttonBox);
            buttonChoice.signal_connect("clicked") { |widget|
                onClick(widget);
            }
            buttonChoice.add_events(Gdk::EventMask::BUTTON_PRESS_MASK);
            buttonChoice.signal_connect("button_press_event") { |widget, event|
                if(event.button == 3)
                    onFlag(widget);
                end
            }

            if(x == 0)
                buttonChoice.set_margin_left(4);
            elsif(x == 2)
                buttonChoice.set_margin_right(4);
            end

            if(y == 0)
                buttonChoice.set_margin_top(4);
            elsif(y == 2)
                buttonChoice.set_margin_bottom(4);
            end


            sudokuChoiceGrid.attach(buttonChoice, x, y, 1, 1);
            @@buttons.push(buttonChoice);
        end

        @@overlayPanel.put(sudokuChoiceGrid, 0, 0);

        overlay.add_overlay(@@overlayPanel);
        overlay.set_overlay_pass_through(@@overlayPanel, true);
    end

    def onFlag(widget)
        square = SquareView.selectedSquareView();
        excluded = SudokuAPI.API.getExclude(square.caze.x, square.caze.y);
        value = OverlayManager.buttonId(widget);

        if(excluded.include?(value))
            if(square.caze.value != value)
                SudokuAPI.API.removeExclude(square.caze.x, square.caze.y, value);
                OverlayManager.hide();
                OverlayManager.show();
            end
        else
            if(square.caze.value != value)
                SudokuAPI.API.addExclude(square.caze.x, square.caze.y, value);
                OverlayManager.hide();
                OverlayManager.show();
            end
        end
    end

    def onClick(widget)
        if(widget.name == "overlayButtonHide")
            OverlayManager.hide();
            return;
        end

        value = OverlayManager.buttonId(widget);

        square = SquareView.selectedSquareView();
        SquareView.selectedSquareView().caze.insertValue(value);
        OverlayManager.hide();
    end

    def OverlayManager.clear()
        for i in 0...9
            if(@@buttons[i].children.length > 0)
                @@buttons[i].remove(@@buttons[i].children[0]);
            end
        end
    end

    #===Cache l'overlay
    def OverlayManager.hide()
        @@open = false;
        @@overlayPanel.hide();
        OverlayManager.clear();
    end

    #===Affiche l'overlay
    def OverlayManager.show()
        @@open = true;
        square = SquareView.selectedSquareView();
        caze = SquareView.selectedSquareView().caze;
        OverlayManager.clear();

        possibleValues = SudokuAPI.API.candidateCaze(caze.x, caze.y);
        excludedValues = SudokuAPI.API.getExclude(caze.x, caze.y);

        if(caze.value != 0)
            possibleValues.push(caze.value);
        end

        if(!(caze.hint || Config.getValue("show_hint")))
            possibleValues = [1,2,3,4,5,6,7,8,9];
        end

        for i in 0...9
            if(possibleValues.include?(i + 1) && !excludedValues.include?(i + 1))
                if(caze.value == i + 1)
                    @@buttons[i].add(Gtk::Image.new(:file => AssetManager.assetsResource("eraser.png")));
                else
                    @@buttons[i].add(Gtk::Label.new((i + 1).to_s));
                end
            end
        end

        @@overlayPanel.show_all();

        for i in 0...9
            if(!possibleValues.include?(i + 1) || excludedValues.include?(i + 1))
                @@buttons[i].name = "overlayButtonHide";
            else
                @@buttons[i].name = "overlayButtonShow";
            end
        end
    end

    def OverlayManager.buttonId(button)
        id = 1;
        @@buttons.each { |widget|
            if(widget == button)
                return id;
            end
            id+=1;
        }
    end

    def OverlayManager.move(x, y)
        @@overlayPanel.move(@@overlayPanel.children[0], x, y);
    end

    def OverlayManager.overlayPanel()
        @@overlayPanel;
    end

    def OverlayManager.open?()
        return @@open;
    end
end