diff options
| author | mio <stigma@disroot.org> | 2025-04-21 13:38:39 +1000 | 
|---|---|---|
| committer | mio <stigma@disroot.org> | 2025-04-27 11:35:46 +1000 | 
| commit | acabf89e015ed0931b5534af54a27c2a575d0bc2 (patch) | |
| tree | f93a2b62606873ec5873db633557a0d5e2381b9e | |
| parent | 37df0c3b3c2ff66308d5e345ac8ead8de6304612 (diff) | |
| download | codeine-other/media-info-window.tar.gz codeine-other/media-info-window.zip | |
Rework media information dialogother/media-info-window
Currently, the info dialog (shortcut I) can exceed the screen bounds as
it requests all information and displays it in a single vertical list.
This commit changes it so less information is requested and cleans up
the dialog.
Signed-off-by: mio <stigma@disroot.org>
| -rw-r--r-- | src/app/mainWindow.cpp | 106 | ||||
| -rw-r--r-- | src/app/mainWindow.h | 2 | ||||
| -rw-r--r-- | src/app/stateChange.cpp | 11 | ||||
| -rw-r--r-- | src/app/theStream.cpp | 85 | ||||
| -rw-r--r-- | src/app/theStream.h | 27 | 
5 files changed, 172 insertions, 59 deletions
| diff --git a/src/app/mainWindow.cpp b/src/app/mainWindow.cpp index 79cd025..4c556b9 100644 --- a/src/app/mainWindow.cpp +++ b/src/app/mainWindow.cpp @@ -20,6 +20,7 @@  #include <twin.h>  #include <tqcstring.h>  #include <tqevent.h>      //::stateChanged() +#include <tqgroupbox.h>  #include <tqlayout.h>     //ctor  #include <tqpopupmenu.h>  //because XMLGUI is poorly designed  #include <tqobjectlist.h> @@ -56,6 +57,102 @@ constexpr auto kSubtitleSelectActionName = "subtitle_channels_select";  namespace Codeine { +   class MediaInfoDialog : public KDialogBase +   { +      TQLabel* m_videoWidth; +      TQLabel* m_videoHeight; +      TQLabel* m_videoBitRate; +      TQLabel* m_audioBits; +      TQLabel* m_audioSampleRate; +      TQLabel* m_audioBitRate; + +   public: +      MediaInfoDialog(TQWidget *parent, const TQMap<MetaData, TQString>& meta) +         : KDialogBase(parent, "meta_data_dialog", true, i18n("Media Information"), Close) +      { +         TQFrame *widget = makeMainWidget(); +         widget->setMinimumWidth(250); +         auto layout = new TQVBoxLayout(widget, 0, 4); +         auto group = new TQGroupBox(2, Horizontal, i18n("General"), widget); +         layout->addWidget(group); + +         auto label = new TQLabel(i18n("Title") + ":", group); +         auto value = new TQLabel(meta[MetaData::Title], group); +         label->setBuddy(value); + +         label = new TQLabel(i18n("Artist") + ":", group); +         value = new TQLabel(meta[MetaData::Artist], group); +         label->setBuddy(value); + +         label = new TQLabel(i18n("Album") + ":", group); +         value = new TQLabel(meta[MetaData::Album], group); +         label->setBuddy(value); + +         label = new TQLabel(i18n("Genre") + ":", group); +         value = new TQLabel(meta[MetaData::Genre], group); +         label->setBuddy(value); + +         label = new TQLabel(i18n("Year") + ":", group); +         value = new TQLabel(meta[MetaData::Year], group); +         label->setBuddy(value); + +         label = new TQLabel(i18n("Comment") + ":", group); +         value = new TQLabel(meta[MetaData::Comment], group); +         label->setBuddy(value); + +         group = new TQGroupBox(2, Horizontal, i18n("Video"), widget); +         layout->addWidget(group); + +         label = new TQLabel(i18n("Bitrate") + ":", group); +         m_videoBitRate = new TQLabel(group); +         label->setBuddy(m_videoBitRate); + +         label = new TQLabel(i18n("Codec") + ":", group); +         value = new TQLabel(meta[MetaData::VideoCodec], group); +         label->setBuddy(value); + +         label = new TQLabel(i18n("Height") + ":", group); +         m_videoHeight = new TQLabel(group); +         label->setBuddy(m_videoHeight); + +         label = new TQLabel(i18n("Width") + ":", group); +         m_videoWidth = new TQLabel(group); +         label->setBuddy(m_videoWidth); + +         group = new TQGroupBox(2, Horizontal, i18n("Audio"), widget); +         layout->addWidget(group); + +         label = new TQLabel(i18n("Bitrate") + ":", group); +         m_audioBitRate = new TQLabel(group); +         label->setBuddy(m_audioBitRate); + +         label = new TQLabel(i18n("Codec") + ":", group); +         value = new TQLabel(meta[MetaData::AudioCodec], group); +         label->setBuddy(value); + +         label = new TQLabel(i18n("Bit Depth") + ":", group); +         m_audioBits = new TQLabel(group); +         label->setBuddy(m_audioBits); + +         label = new TQLabel(i18n("Sample Rate") + ":", group); +         m_audioSampleRate = new TQLabel(group); +         label->setBuddy(m_audioSampleRate); + +         resize(sizeHint()); +         disableResize(); +      } + +      void setStreamInfo(const TQMap<StreamInfo, TQString>& info) +      { +         m_videoWidth->setText(info[StreamInfo::VideoWidth] + " px"); +         m_videoHeight->setText(info[StreamInfo::VideoHeight] + " px"); +         m_videoBitRate->setText(info[StreamInfo::VideoBitRate] + " bps"); +         m_audioBits->setText(info[StreamInfo::AudioBits] + "-bit"); +         m_audioSampleRate->setText(info[StreamInfo::AudioSampleRate] + " Hz"); +         m_audioBitRate->setText(info[StreamInfo::AudioBitRate] + " bps"); +      } +   }; +     /// @see codeine.h     TQWidget *mainWindow() { return tdeApp->mainWidget(); } @@ -66,6 +163,7 @@ MainWindow::MainWindow()        , m_positionSlider( new Slider( this, 65535 ) )        , m_timeLabel( new TQLabel( " 0:00:00 ", this ) )        , m_titleLabel( new KSqueezedTextLabel( this ) ) +      , m_mediaInfoDialog(nullptr)  {     DEBUG_BLOCK @@ -647,7 +745,13 @@ MainWindow::configure()  void  MainWindow::streamInformation()  { -   MessageBox::information( TheStream::information(), i18n("Media Information") ); +   if (!m_mediaInfoDialog) +   { +      TQMap<MetaData, TQString> metaData = TheStream::metaData(); +      m_mediaInfoDialog = new MediaInfoDialog(this, metaData); +   } +   m_mediaInfoDialog->setStreamInfo(TheStream::info()); +   m_mediaInfoDialog->show();  }  void diff --git a/src/app/mainWindow.h b/src/app/mainWindow.h index fbb6be4..3db1f09 100644 --- a/src/app/mainWindow.h +++ b/src/app/mainWindow.h @@ -18,6 +18,7 @@ class VolumeAction;  namespace Codeine  {     class AudioView; +   class MediaInfoDialog;     class MainWindow : public TDEMainWindow     { @@ -72,6 +73,7 @@ namespace Codeine        TQLabel  *m_titleLabel;        TQWidget *m_analyzer;        AudioView *m_audioView; +      MediaInfoDialog *m_mediaInfoDialog;        TQWidgetStack *m_widgetStack;        VolumeAction *m_volumeAction; diff --git a/src/app/stateChange.cpp b/src/app/stateChange.cpp index 2418209..1e79bdb 100644 --- a/src/app/stateChange.cpp +++ b/src/app/stateChange.cpp @@ -102,7 +102,6 @@ MainWindow::engineStateChanged( Engine::State state )        }     } -     /// update statusBar     {        using namespace Engine; @@ -120,6 +119,16 @@ MainWindow::engineStateChanged( Engine::State state )        m_widgetStack->raiseWidget(m_audioView);     } +   // Update MediaInfoDialog +   if (state == Engine::Empty || state == Engine::TrackEnded || state == Engine::Loaded) +   { +      if (m_mediaInfoDialog) +      { +         reinterpret_cast<TQWidget*>(m_mediaInfoDialog)->deleteLater(); +         m_mediaInfoDialog = nullptr; +      } +   } +     /// update position slider     switch( state ) diff --git a/src/app/theStream.cpp b/src/app/theStream.cpp index 3f7e35a..09005f9 100644 --- a/src/app/theStream.cpp +++ b/src/app/theStream.cpp @@ -76,69 +76,42 @@ namespace Codeine           return url.prettyURL();     } - -   static inline TQString -   entryHelper( const TQString &plate, const TQString &s1, const TQString &s2 ) +   TQMap<MetaData, TQString> TheStream::metaData()     { -      return s2.isEmpty() ? s2 : plate.arg( s1 ).arg( s2 ); -   } +#define xmeta(x) xine_get_meta_info(e->m_stream, (x)) -   static inline TQString -   sectionHelper( const TQString §ionTitle, const TQStringList &entries ) -   { -      TQString s; +      TQMap<MetaData, TQString> data; -      foreach( entries ) -         if( !(*it).isEmpty() ) -            s += *it; +      data[MetaData::Title] = xmeta(XINE_META_INFO_TITLE); +      data[MetaData::Comment] = xmeta(XINE_META_INFO_COMMENT); +      data[MetaData::Artist] = xmeta(XINE_META_INFO_ARTIST); +      data[MetaData::Genre] = xmeta(XINE_META_INFO_GENRE); +      data[MetaData::Album] = xmeta(XINE_META_INFO_ALBUM); +      data[MetaData::Year] = xmeta(XINE_META_INFO_YEAR); +      data[MetaData::VideoCodec] = xmeta(XINE_META_INFO_VIDEOCODEC); +      data[MetaData::AudioCodec] = xmeta(XINE_META_INFO_AUDIOCODEC); -      return s.isEmpty() ? s : "<h2>" + sectionTitle + "</h2>" + s; +      return data; + +#undef xmeta     } -   TQString -   TheStream::information() +   TQMap<StreamInfo, TQString> TheStream::info()     { -      #define meta( x ) xine_get_meta_info( e->m_stream, x ) -      #define info( x, y ) x.arg( xine_get_stream_info( e->m_stream, y ) ) -      #define simple( x ) TQString::number( xine_get_stream_info( e->m_stream, x ) ) - -      const TQString plate = "<p><b>%1</b>: %2</p>"; -      TQString s; - -      s += sectionHelper( i18n("Metadata"), -         TQStringList() -            << entryHelper( plate, i18n("Title"), meta( XINE_META_INFO_TITLE ) ) -            << entryHelper( plate, i18n("Comment"), meta( XINE_META_INFO_COMMENT ) ) -            << entryHelper( plate, i18n("Artist"), meta( XINE_META_INFO_ARTIST ) ) -            << entryHelper( plate, i18n("Genre"), meta( XINE_META_INFO_GENRE ) ) -            << entryHelper( plate, i18n("Album"), meta( XINE_META_INFO_ALBUM ) ) -            << entryHelper( plate, i18n("Year"), meta( XINE_META_INFO_YEAR ) ) ); - -      s += sectionHelper( i18n("Audio Properties"), -         TQStringList() -            << entryHelper( plate, i18n("Bitrate"), info( i18n("%1 bps"), XINE_STREAM_INFO_AUDIO_BITRATE ) ) -            << entryHelper( plate, i18n("Sample-rate"), info( i18n("%1 Hz"),  XINE_STREAM_INFO_AUDIO_SAMPLERATE ) ) ); - -      s += sectionHelper( i18n("Technical Information"), -         TQStringList() -            << entryHelper( plate, i18n("Video Codec"), meta( XINE_META_INFO_VIDEOCODEC ) ) -            << entryHelper( plate, i18n("Audio Codec"), meta( XINE_META_INFO_AUDIOCODEC ) ) -            << entryHelper( plate, i18n("System Layer"), meta( XINE_META_INFO_SYSTEMLAYER ) ) -            << entryHelper( plate, i18n("Input Plugin"), meta( XINE_META_INFO_INPUT_PLUGIN  )) -            << entryHelper( plate, i18n("CDINDEX_DISCID"), meta( XINE_META_INFO_CDINDEX_DISCID ) ) ); - -      TQStringList texts; -      texts << "BITRATE" << "SEEKABLE" << "VIDEO_WIDTH" << "VIDEO_HEIGHT" << "VIDEO_RATIO" << "VIDEO_CHANNELS" << "VIDEO_STREAMS" << "VIDEO_BITRATE" << "VIDEO_FOURCC" << "VIDEO_HANDLED" << "FRAME_DURATION" << "AUDIO_CHANNELS" << "AUDIO_BITS" << "-AUDIO_SAMPLERATE" << "-AUDIO_BITRATE" << "AUDIO_FOURCC" << "AUDIO_HANDLED" << "HAS_CHAPTERS" << "HAS_VIDEO" << "HAS_AUDIO" << "-IGNORE_VIDEO" << "-IGNORE_AUDIO" << "-IGNORE_SPU" << "VIDEO_HAS_STILL" << "MAX_AUDIO_CHANNEL" << "MAX_SPU_CHANNEL" << "AUDIO_MODE" << "SKIPPED_FRAMES" << "DISCARDED_FRAMES"; - -      s += "<h2>Other</h2>"; -      for( uint x = 0; x <= 28; ++x ) -         s += entryHelper( plate, texts[x], simple( x ) ); - -      #undef meta -      #undef info -      #undef simple - -      return s; +#define xinfo(x) TQString::number(xine_get_stream_info(e->m_stream, (x))) + +      TQMap<StreamInfo, TQString> data; + +      data[StreamInfo::VideoWidth] = xinfo(XINE_STREAM_INFO_VIDEO_WIDTH); +      data[StreamInfo::VideoHeight] = xinfo(XINE_STREAM_INFO_VIDEO_HEIGHT); +      data[StreamInfo::VideoBitRate] = xinfo(XINE_STREAM_INFO_VIDEO_BITRATE); +      data[StreamInfo::AudioBits] = xinfo(XINE_STREAM_INFO_AUDIO_BITS); +      data[StreamInfo::AudioSampleRate] = xinfo(XINE_STREAM_INFO_AUDIO_SAMPLERATE); +      data[StreamInfo::AudioBitRate] = xinfo(XINE_STREAM_INFO_AUDIO_BITRATE); + +      return data; + +#undef xinfo     }     #undef e diff --git a/src/app/theStream.h b/src/app/theStream.h index 7679a10..f616862 100644 --- a/src/app/theStream.h +++ b/src/app/theStream.h @@ -20,11 +20,37 @@  namespace Codeine
  {
 +   enum class MetaData
 +   {
 +      Title = 0,
 +      Comment,
 +      Artist,
 +      Genre,
 +      Album,
 +      Year,
 +      VideoCodec,
 +      AudioCodec,
 +   };
 +
 +   enum class StreamInfo
 +   {
 +      VideoWidth = 0,
 +      VideoHeight,
 +      VideoBitRate,
 +      AudioBits,
 +      AudioSampleRate,
 +      AudioBitRate
 +   };
 +
     class TheStream
     {
     CODEINE_NO_EXPORT( TheStream )
     public:
 +
 +      static TQMap<MetaData, TQString> metaData();
 +      static TQMap<StreamInfo, TQString> info();
 +
        static const KURL &url();
        static bool canSeek();
 @@ -38,7 +64,6 @@ namespace Codeine        static int audioChannel();
        static TQString prettyTitle();
 -      static TQString information();
        static inline bool hasProfile()
              { return TDEGlobal::config()->hasGroup( url().prettyURL() ); }
 | 
