mirror of
				https://github.com/ElvishArtisan/rivendell.git
				synced 2025-11-04 16:14:03 +01:00 
			
		
		
		
	* Added a 'RDAIRPLAY.MESSAGE_WIDGET_URL' field to the database. * Incremented the database version to 374. * Added 'RDAirPlayConf::messageWidgetUrl()' and 'RDAirPlayConf::setMessageWidgetUrl()' methods. * Modified rdairplay(1) to make the Message Widget retain the loaded URL across instances. * Modified rdairplay(1) to make the Message Widget continually poll and update loaded URLs using the 'file:' schema. Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
		
			
				
	
	
		
			177 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			177 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// messagewidget.cpp
 | 
						|
//
 | 
						|
// Message Widget for RDAirPlay Rivendell
 | 
						|
//
 | 
						|
//   (C) Copyright 2024 Fred Gleason <fredg@paravelsystems.com>
 | 
						|
//
 | 
						|
//   This program is free software; you can redistribute it and/or modify
 | 
						|
//   it under the terms of the GNU General Public License version 2 as
 | 
						|
//   published by the Free Software Foundation.
 | 
						|
//
 | 
						|
//   This program is distributed in the hope that it will be useful,
 | 
						|
//   but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
//   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
//   GNU General Public License for more details.
 | 
						|
//
 | 
						|
//   You should have received a copy of the GNU General Public
 | 
						|
//   License along with this program; if not, write to the Free Software
 | 
						|
//   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 | 
						|
//
 | 
						|
 | 
						|
#include <QEvent>
 | 
						|
#include <QKeyEvent>
 | 
						|
#include <QWebFrame>
 | 
						|
 | 
						|
#include <rdapplication.h>
 | 
						|
#include <rdeventfilter.h>
 | 
						|
 | 
						|
#include "colors.h"
 | 
						|
#include "messagewidget.h"
 | 
						|
 | 
						|
MessageWidget::MessageWidget(QWidget *parent)
 | 
						|
  : QWidget(parent)
 | 
						|
{
 | 
						|
  setStyleSheet("background-color: "+
 | 
						|
		QColor(LOGLINEBOX_BACKGROUND_COLOR).name());
 | 
						|
 | 
						|
  //
 | 
						|
  // Generate Fonts
 | 
						|
  //
 | 
						|
  for(unsigned i=0;i<MESSAGE_FONT_QUANTITY;i++) {
 | 
						|
    d_message_fonts[i]=QFont(font().family(),12+2*i,QFont::Normal);
 | 
						|
    d_message_fonts[i].setPixelSize(12+2*i);
 | 
						|
    d_message_metrics[i]=new QFontMetrics(d_message_fonts[i]);
 | 
						|
  }
 | 
						|
 | 
						|
  //
 | 
						|
  // Message Display
 | 
						|
  //
 | 
						|
  d_label=new QLabel(this);
 | 
						|
  d_label->setWordWrap(true);
 | 
						|
  d_label->setAlignment(Qt::AlignCenter);
 | 
						|
  d_view=new QWebView(this);
 | 
						|
  connect(d_view,SIGNAL(loadFinished(bool)),
 | 
						|
	  this,SLOT(webLoadFinishedData(bool)));
 | 
						|
  d_view->hide();
 | 
						|
  RDEventFilter *filter=new RDEventFilter(this);
 | 
						|
  filter->addFilter(QEvent::Enter);
 | 
						|
  filter->addFilter(QEvent::Leave);
 | 
						|
  filter->addFilter(QEvent::KeyPress);
 | 
						|
  filter->addFilter(QEvent::KeyRelease);
 | 
						|
  filter->addFilter(QEvent::MouseButtonPress);
 | 
						|
  filter->addFilter(QEvent::MouseButtonRelease);
 | 
						|
  filter->addFilter(QEvent::MouseButtonDblClick);
 | 
						|
  filter->addFilter(QEvent::MouseMove);
 | 
						|
  filter->addFilter(QEvent::Wheel);
 | 
						|
  d_view->installEventFilter(filter);
 | 
						|
 | 
						|
  //
 | 
						|
  // Refresh Timer
 | 
						|
  //
 | 
						|
  d_refresh_timer=new QTimer(this);
 | 
						|
  d_refresh_timer->setSingleShot(true);
 | 
						|
  connect(d_refresh_timer,SIGNAL(timeout()),this,SLOT(refreshData()));
 | 
						|
 | 
						|
  //
 | 
						|
  // Load Current Page
 | 
						|
  //
 | 
						|
  QString url=rda->airplayConf()->messageWidgetUrl();
 | 
						|
  if(!url.isEmpty()) {
 | 
						|
    setUrl(url);
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
  
 | 
						|
void MessageWidget::setText(const QString &str,const QColor &col)
 | 
						|
{
 | 
						|
  QPalette pal=d_label->palette();
 | 
						|
 | 
						|
  pal.setColor(QPalette::Active,QPalette::Foreground,col);
 | 
						|
  pal.setColor(QPalette::Inactive,QPalette::Foreground,col);
 | 
						|
  d_label->setPalette(pal);
 | 
						|
  d_label->setFont(MessageFont(str));
 | 
						|
  d_label->setText(str);
 | 
						|
  d_label->show();
 | 
						|
  d_view->hide();
 | 
						|
 | 
						|
  d_refresh_timer->stop();
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool MessageWidget::setUrl(const QString &str)
 | 
						|
{
 | 
						|
  QUrl url(str);
 | 
						|
  if(!url.isValid()) {
 | 
						|
    setText(tr("invalid URL")+": "+str.toUtf8().constData(),Qt::black);
 | 
						|
    d_refresh_timer->stop();
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
  if((url.scheme().toLower()!="http")&&
 | 
						|
     (url.scheme().toLower()!="https")&&
 | 
						|
     (url.scheme().toLower()!="file")) {
 | 
						|
    setText(tr("unsupported URL scheme")+": "+str.toUtf8().constData(),
 | 
						|
		   Qt::black);
 | 
						|
    d_refresh_timer->stop();
 | 
						|
    return false;
 | 
						|
  }
 | 
						|
  d_view->load(url);
 | 
						|
  d_view->show();
 | 
						|
  d_label->hide();
 | 
						|
 | 
						|
  d_url=str;
 | 
						|
  rda->airplayConf()->setMessageWidgetUrl(str);
 | 
						|
  if(url.scheme().toLower()=="file") {
 | 
						|
    d_refresh_timer->start(1000);
 | 
						|
  }
 | 
						|
  else {
 | 
						|
    d_refresh_timer->stop();
 | 
						|
  }
 | 
						|
 | 
						|
  return true;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void MessageWidget::clear()
 | 
						|
{
 | 
						|
  d_label->clear();
 | 
						|
  d_label->show();
 | 
						|
  d_view->hide();
 | 
						|
  d_refresh_timer->stop();
 | 
						|
 | 
						|
  rda->airplayConf()->setMessageWidgetUrl(QString());
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void MessageWidget::webLoadFinishedData(bool state)
 | 
						|
{
 | 
						|
  d_view->page()->mainFrame()->
 | 
						|
    setScrollBarPolicy(Qt::Horizontal,Qt::ScrollBarAlwaysOff);
 | 
						|
  d_view->page()->mainFrame()->
 | 
						|
    setScrollBarPolicy(Qt::Vertical,Qt::ScrollBarAlwaysOff);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void MessageWidget::refreshData()
 | 
						|
{
 | 
						|
  d_view->load(d_url);
 | 
						|
  d_refresh_timer->start(1000);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
void MessageWidget::resizeEvent(QResizeEvent *e)
 | 
						|
{
 | 
						|
  d_label->setGeometry(0,0,size().width(),size().height());
 | 
						|
  d_view->setGeometry(0,0,size().width(),size().height());
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
QFont MessageWidget::MessageFont(QString str) const
 | 
						|
{
 | 
						|
  for(int i=(MESSAGE_FONT_QUANTITY-1);i>=0;i--) {
 | 
						|
    if(d_message_metrics[i]->width(str)<MESSAGE_WIDGET_WIDTH) {
 | 
						|
      return d_message_fonts[i];
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return d_message_fonts[0];
 | 
						|
}
 |