#!/usr/bin/env qore

# This is basically a direct port of the QT widget example
# "shapedclock" to Qore using Qore's "qt" module.

# Note that Qore's "qt" module requires QT 4.3 or above

# use the "qt-gui" module
%requires qt-gui

# this is an object-oriented program; the application class is "shapedclock_example"
%exec-class shapedclock_example
# require all variables to be explicitly declared
%require-our
# enable all parse warnings
%enable-all-warnings

class ShapedClock inherits QWidget
{
    constructor($parent) : QWidget($parent, Qt::FramelessWindowHint)
    {
	my $timer = new QTimer($self);
	$.connect($timer, SIGNAL("timeout()"), SLOT("update()"));
	$timer.start(1000);

	my $quitAction = new QAction(TR("E&xit"), $self);
	$quitAction.setShortcut(TR("Ctrl+Q"));
	QAPP().connect($quitAction, SIGNAL("triggered()"), SLOT("quit()"));
	$.addAction($quitAction);

	$.setContextMenuPolicy(Qt::ActionsContextMenu);
	$.setToolTip(TR("Drag the clock with the left mouse button.\nUse the right mouse button to open a context menu."));
	$.setWindowTitle(TR("Shaped Analog Clock"));
    }

    mousePressEvent($event)
    {
	if ($event.button() == Qt::LeftButton) {
	    $.dragPosition = new QPoint($event.globalPos().x() - $.frameGeometry().topLeft().x(),
					$event.globalPos().y
					() - $.frameGeometry().topLeft().y
					());
		$event.accept();
	}
    }

    mouseMoveEvent($event)
    {
	if ($event.buttons() & Qt::LeftButton) {
	    $.move($event.globalPos().x() - $.dragPosition.x(), $event.globalPos().y
		   () - $.dragPosition.y
		   ());
	    $event.accept();
	}
    }

    paintEvent($event)
    {
	my $side = min($.width(), $.height());
	my $time = now();

	my $painter = new QPainter($self);
	$painter.setRenderHint(QPainter::Antialiasing);
	$painter.translate($.width() / 2, $.height() / 2);
	$painter.scale($side / 200.0, $side / 200.0);

	$painter.setPen(Qt::NoPen);
	$painter.setBrush($hourColor);

	$painter.save();
	$painter.rotate(30.0 * ((get_hours($time) + get_minutes($time) / 60.0)));
	$painter.drawConvexPolygon($hourHand);
	$painter.restore();

	$painter.setPen($hourColor);

	for (my $i = 0; $i < 12; ++$i) {
	    $painter.drawLine(88, 0, 96, 0);
	    $painter.rotate(30.0);
	}

	$painter.setPen(Qt::NoPen);
	$painter.setBrush($minuteColor);

	$painter.save();
	$painter.rotate(6.0 * (get_minutes($time) + get_seconds($time) / 60.0));
	$painter.drawConvexPolygon($minuteHand);
	$painter.restore();

	$painter.setPen($minuteColor);

	for (my $j = 0; $j < 60; ++$j) {
	    if (($j % 5) != 0)
		$painter.drawLine(92, 0, 96, 0);
	    $painter.rotate(6.0);
	}
    }

    resizeEvent($event)
    {
	my $side = min($.width(), $.height());
	my $maskedRegion = new QRegion($.width() / 2 - $side / 2, $.height() / 2 - $side / 2, $side,
				       $side, QRegion::Ellipse);
	$.setMask($maskedRegion);
    }

    sizeHint()
    {
	return new QSize(100, 100);
    }
}

class shapedclock_example inherits QApplication
{
    constructor()
    {
	our $hourHand = new QPolygon((new QPoint(7, 8), new QPoint(-7, 8), new QPoint(0, -40)));
	our $minuteHand = new QPolygon((new QPoint(7, 8), new QPoint(-7, 8), new QPoint(0, -70)));

	our $hourColor = new QColor(127, 0, 127);
	our $minuteColor = new QColor(0, 127, 127, 191);

        my $clock = new ShapedClock();
        $clock.show();
        $.exec();
    }
}