Fixed conflict in 'ChangeLog'

Signed-off-by: Fred Gleason <fredg@paravelsystems.com>
This commit is contained in:
Fred Gleason 2022-10-21 11:39:36 -04:00
commit 61a4b6a3ce
48 changed files with 1862 additions and 722 deletions

View File

@ -23490,5 +23490,61 @@
2022-10-13 Fred Gleason <fredg@paravelsystems.com>
* Added a 'RedHat Enterprise Linux 9' subsection to the
'DISTRO-SPECIFIC NOTES' section of 'INSTALL'.
2022-10-14 Fred Gleason <fredg@paravelsystems.com>
* Added a 'SERVICES.BYPASS_MODE' field to the database.
* Added a 'SERVICES.MUS_TRANS_TYPE_OFFSET' field to the database.
* Added a 'SERVICES.MUS_TRANS_TYPE_LENGTH' field to the database.
* Added a 'SERVICES.MUS_TIME_TYPE_OFFSET' field to the database.
* Added a 'SERVICES.MUS_TIME_TYPE_LENGTH' field to the database.
* Added a 'IMPORT_TEMPLATES.TRANS_TYPE_OFFSET' field to the database.
* Added a 'IMPORT_TEMPLATES.TRANS_TYPE_LENGTH' field to the database.
* Added a 'IMPORT_TEMPLATES.TIME_TYPE_OFFSET' field to the database.
* Added a 'IMPORT_TEMPLATES.TIME_TYPE_LENGTH' field to the database.
* Added a 'IMPORTER_LINES.TRANS_TYPE' field to the database.
* Added a 'IMPORTER_LINES.TIME_TYPE' field to the database.
* Added a 'IMPORTER_LINES.GRACE_TIME' field to the database.
* Incremented the database schema to 363.
* Added a 'Bypass Grid Processing' dropdown to the 'Edit Service'
dialog in rdadmin(1).
* Added 'Transition Type' and 'Time Type' parameters to the music
import parameters in the 'Edit Service' dialog in rdadmin(1).
2022-10-15 Fred Gleason <fredg@paravelsystems.com>
* Added a 'Trans' column to the 'Imported Events' list in the
'Test Music Import' list in rdadmin(1).
2022-10-15 Fred Gleason <fredg@paravelsystems.com>
* Fixed a regression in the 'Test Music Import' dialog that caused
the 'Imported Events' list to fail to be cleared when starting a
new test.
2022-10-16 Fred Gleason <fredg@paravelsystems.com>
* Modified the 'Log Grids' dialog in rdlogmanager(1) to not display
services with 'Bypass Grid Processing' set to 'Yes'.
2022-10-18 Fred Gleason <fredg@paravelsystems.com>
* Added a 'RDEventLine::loadBypass()' method.
* Implemented log generation and importation for bypass grid
processing in rdlogmanager(1).
2022-10-18 Fred Gleason <fredg@paravelsystems.com>
* Added code to 'RDSvc::create()' to include the
'SERVICES.BYPASS_MODE', 'SERVICES.MUS_TRANS_TYPE_OFFSET',
'SERVICES.MUS_TRANS_TYPE_LENGTH', 'SERVICES.MUS_TIME_TYPE_OFFSET'
and 'SERVICES.MUS_TIME_TYPE_LENGTH' fields when cloning a new
Service entry.
2022-10-18 Fred Gleason <fredg@paravelsystems.com>
* Added values for the `IMPORTER_TEMPLATES.TRANS_TYPE_*` and
`IMPORTER_TEMPLATES.TIME_TYPE_*` parser settings for the
'Rivendell Standard Import' profile.
* Incremented the database version to 364.
2022-10-19 Fred Gleason <fredg@paravelsystems.com>
* Added files from 'docs/examples/' to the RPM package.
2022-10-20 Fred Gleason <fredg@paravelsystems.com>
* Modified the 'List Grids' dialog in rdlogmanager(1) to show
all services, with a 'Has Grid' column.
2022-10-20 Fred Gleason <fredg@paravelsystems.com>
* Documented grid processing bypass in the Operations Guide.
2022-10-20 Fred Gleason <fredg@paravelsystems.com>
* Fixed a bug in rdlogmanager(1) that caused the Chain-To event
to be dropped when linking music events in bypass grid mode.
2022-10-20 Fred Gleason <fredg@paravelsystems.com>
* Modified the start time display string to use 'H' and 'S' to
distinguish hard and soft start times.
2022-10-21 Fred Gleason <fredg@paravelsystems.com>
* Added an Ubuntu-specific pam(7) configuration.

View File

@ -1,8 +1,8 @@
00:00:00 10001 Lonely Cowboy 00:02:53 GUID4567890123456789012345678901
00:02:53 10002 E Song 00:03:27 GUID4567890123456789012345678902
00:06:20 10003 Likeness 00:02:54 GUID4567890123456789012345678903
00:00:00 10001 Lonely Cowboy 00:02:53 GUID4567890123456789012345678901 SEGUE SOFT
00:02:53 10002 E Song 00:03:27 GUID4567890123456789012345678902 PLAY HARD
00:06:20 10003 Likeness 00:02:54 GUID4567890123456789012345678903 STOP
00:09:14 10004 Atchafalaya 00:28:02 GUID4567890123456789012345678904
00:30:00 BREAK Spot Break 00:02:00
00:30:00 BREAK Spot Break 00:02:00 SOFT
00:32:00 10005 Mr. Banks 00:03:54 GUID4567890123456789012345678905
00:35:54 TRACK Voicetrack 00:01:30
00:38:24 10006 The Grey and the Green 00:03:23 GUID4567890123456789012345678906

View File

@ -2,7 +2,7 @@
##
## docs/examples/automake.am for Rivendell
##
## (C) Copyright 2002-2006,2016 Fred Gleason <fredg@paravelsystems.com>
## (C) Copyright 2002-2022 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
@ -24,6 +24,8 @@ EXTRA_DIST = 0320090805.tfc\
0320090805.cpi\
0320090805.vti\
080509T3.LOG\
bypass_music.tfc\
bypass_traffic.tfc\
cart_report.asc
CLEANFILES = *~

View File

@ -0,0 +1,39 @@
10:00:00 060105 Legal ID 00:00:14 STOP HARD
10:03:30 10001 25 Or 6 To 4 00:04:48 GUID4567890123456789012345678901 SEGUE
10:07:00 10004 American Pie (Part 1) 00:04:03 GUID4567890123456789012345678901 SEGUE
10:09:30 10005 Backstabbers 00:03:00 GUID4567890123456789012345678902 SEGUE
10:13:00 10006 Bad, Bad, Leroy Brown 00:02:58 GUID4567890123456789012345678903 SEGUE
10:15:00 BREAK Spot Break 00:02:00 PLAY SOFT
10:17:00 10007 Bad Blood 00:03:05 GUID4567890123456789012345678904 SEGUE
10:20:30 10008 Baker Street 00:06:01 GUID4567890123456789012345678905 SEGUE
10:24:00 10009 Band On The Run 00:05:08 GUID4567890123456789012345678906 SEGUE
10:30:00 TRACK Voicetrack 00:00:30 SEGUE
10:31:00 10010 Bang A Gong 00:04:22 GUID4567890123456789012345678907 SEGUE
10:34:30 10011 Bang The Drum All Day 00:03:13 GUID4567890123456789012345678908 SEGUE
10:38:00 10012 Big Shot 00:03:55 GUID4567890123456789012345678909 SEGUE
10:41:30 10013 Black And White 00:03:21 GUID4567890123456789012345678910 SEGUE
10:45:00 BREAK Spot Break 00:02:00 PLAY SOFT
10:48:30 10014 Black Magic Woman-Gypsy Queen 00:05:17 GUID4567890123456789012345678911 SEGUE
10:52:00 10015 Boogie Wonderland 00:04:46 GUID4567890123456789012345678912 SEGUE
10:55:30 10016 Born To Run 00:04:27 GUID4567890123456789012345678913 SEGUE
10:59:00 10017 Brand New Key 00:02:22 GUID4567890123456789012345678914 SEGUE
11:00:00 060105 Legal ID 00:00:14 STOP HARD
11:03:30 10018 Brother Louie 00:03:52 GUID4567890123456789012345678915 SEGUE
11:07:00 10019 Brown Sugar 00:03:47 GUID4567890123456789012345678916 SEGUE
11:09:30 10020 Can't Get Enough 00:04:13 GUID4567890123456789012345678917 SEGUE
11:13:00 10021 Can't Get Enough of Your Love, Bab 00:03:48 GUID4567890123456789012345678918 SEGUE
11:15:00 BREAK Spot Break 00:02:00 PLAY SOFT
11:17:00 10022 Carry On 00:04:20 GUID4567890123456789012345678919 SEGUE
11:20:30 10023 Cat's in the Cradle 00:03:43 GUID4567890123456789012345678920 SEGUE
11:24:00 10024 Celebrate 00:02:54 GUID4567890123456789012345678921 SEGUE
11:30:00 TRACK Voicetrack 00:00:30 SEGUE
11:31:00 10025 Changes 00:03:31 GUID4567890123456789012345678922 SEGUE
11:34:30 10026 Changes in Latitude 00:03:13 GUID4567890123456789012345678923 SEGUE
11:38:00 10027 Cheesburger in Paradise 00:02:46 GUID4567890123456789012345678924 SEGUE
11:41:30 10028 China Grove 00:03:13 GUID4567890123456789012345678925 SEGUE
11:45:00 BREAK Spot Break 00:02:00 PLAY SOFT
11:48:30 10029 Could It Be I'm Fallin' in Love 00:04:09 GUID4567890123456789012345678926 SEGUE
11:52:00 10030 Couldn't Get It Right 00:03:11 GUID4567890123456789012345678927 SEGUE
11:55:30 10031 Crazy Little Thing Called Love 00:02:40 GUID4567890123456789012345678928 SEGUE
11:59:00 10032 Crocodile Rock 00:03:51 GUID4567890123456789012345678929 SEGUE
12:00:00 060105 Legal ID 00:00:14 STOP HARD

View File

@ -0,0 +1,8 @@
10:15:00 999009 30 Second Tone 00:00:30 PLAY
10:15:30 990013 Record Test 00:00:30 PLAY
10:45:00 040041 Irish Music Bed 00:01:00 PLAY
10:46:00 810011 The Nutcracker - Divertissement 00:00:30 PLAY
10:46:30 999009 30 Second Tone 00:00:30 PLAY
11:15:00 070000 FF-PROMO 00:01:00 PLAY
11:16:00 990013 Record Test 00:00:30 PLAY
11:46:00 040038 AM Show Promo 00:36:00 PLAY

Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 KiB

After

Width:  |  Height:  |  Size: 151 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

@ -327,6 +327,44 @@
The <computeroutput>Service Description</computeroutput> field is
for a free-form string that describes the service.
</para>
<!--
<title>The <computeroutput>General</computeroutput> Section</title>
<para>
<mediaobject>
<imageobject>
<imagedata align="center" fileref="rdadmin.services_dialog_general.png" width="75mm" depth="36mm"/>
</imageobject>
<caption>
<para>The General Section</para>
</caption>
</mediaobject>
</para>
<para>
The <computeroutput>Service Name</computeroutput> field contains
the name of the service (read-only). This value is available in
<link linkend="sect.filepath_wildcards.definition">
filepath wildcards</link> as <userinput>%s</userinput>.
</para>
<para>
The <computeroutput>Service Description</computeroutput> field is
for a free-form string that describes the service.
</para>
-->
<para>
The <computeroutput>Bypass Grid Processing</computeroutput> dropdown,
if set to <computeroutput>Yes</computeroutput>, will completely
disable RDLogManager's native grid/clock/event template system
for this service; helpful for centralizing log template management
in a third-party music scheduler system. (See
<xref linkend="sect.rdlogmanager.rdlogmanager.grids.bypassing_grid_processing" />
for an overview). Logs generated in this mode will contain a single
music import link covering
the entire broadcast day (<userinput>00:00:00</userinput> through
<userinput>23:59:59</userinput>). See
<xref linkend="sect.rdadmin.manage_services.general.inline_event_scheduling_parameters" />
for information on encoding transition and time parameters when using
this option.
</para>
<para>
The <computeroutput>Program Code</computeroutput> is a string that
is sent to PyPAD scripts as part of every Now &amp; Next update.
@ -654,7 +692,7 @@
<para>
<mediaobject>
<imageobject>
<imagedata align="center" fileref="rdadmin.import_parser_fields.png" width="90mm" depth="54mm"/>
<imagedata align="center" fileref="rdadmin.import_parser_fields.png" width="90mm"/>
</imageobject>
<caption>
<para>The Log Parser Settings</para>
@ -723,7 +761,64 @@
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><computeroutput>Transition Type:</computeroutput></term>
<listitem>
<para>
The transition type to be assigned to this event. The
following strings are recognized:
<simplelist>
<member><userinput>PLAY</userinput></member>
<member><userinput>SEGUE</userinput></member>
<member><userinput>STOP</userinput></member>
</simplelist>
</para>
<para>
See <xref linkend="sect.rdlogedit.event_transitions" /> for
discussion of the meaning of these types. If left blank,
a <userinput>PLAY</userinput> transition will be applied.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><computeroutput>Time Type:</computeroutput></term>
<listitem>
<para>
The time type to be assigned to this event. The
following strings are recognized:
<variablelist>
<varlistentry>
<term><userinput>HARD</userinput></term>
<listitem>
<para>
Apply a hard start (Start Immediately) to this
item, using the specified start time of the event.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><userinput>SOFT</userinput></term>
<listitem>
<para>
Apply a soft start (Make Next) to this
item, using the specified start time of the event.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
<para>
If left blank, no time start options will be applied.
</para>
</listitem>
</varlistentry>
</variablelist>
<note>
The <computeroutput>Transition Type</computeroutput> and
<computeroutput>Time Type</computeroutput> fields are available
only if the <computeroutput>Bypass Grid Processing</computeroutput>
dropdown has been set to <computeroutput>Yes</computeroutput>.
</note>
</sect2>
<sect2 xml:id="sect.rdadmin.manage_services.testing_data_importation">
<title>Testing Data Importation</title>

View File

@ -420,36 +420,24 @@
</para>
</sect2>
<sect2 xml:id="sect.rdlogedit.the_hard_time_type">
<title>The Hard Time Type</title>
<title>The Hard and Soft Time Types</title>
<para>
A hard time type causes the event to be executed or otherwise acted
A hard or soft time type causes the event to be executed or otherwise
acted
upon when the wall clock equals the time associated with the event.
Hard times are a powerful feature that can be used to synchronize
the log to various external events. An event can be assigned a
hard time by clicking the <computeroutput>Start at</computeroutput>
Hard/soft times are powerful features that can be used to synchronize
the log to various external events. An event can be assigned a
hard/soft time by clicking the <computeroutput>Start at</computeroutput>
check box in the Edit Log Entry
and filling in the desired time, and will show up with the letter
<computeroutput>T</computeroutput> appearing at the beginning of
<computeroutput>H</computeroutput> or
<computeroutput>S</computeroutput> appearing at the beginning of
its listed time in the
<computeroutput>Time</computeroutput> column of the Edit Log dialog.
</para>
<para>
The specific action that is performed when the time matches is
determined by the option parameters supplied as part of the event.
Three basic actions are possible:
</para>
<para>
<itemizedlist>
<listitem>
Start the event immediately
</listitem>
<listitem>
Cue to the event (&quot;Make Next&quot;)
</listitem>1
<listitem>
Wait up to some period of time, then start the event
</listitem>
</itemizedlist>
</para>
<sect3 xml:id="sect.rdlogedit.start_immediately">
<title>Start Immediately</title>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 24 KiB

View File

@ -45,173 +45,201 @@
</sect1>
<sect1 xml:id="sect.rdlogmanager.grids">
<title>Grids</title>
<para>
Each Rivendell service has an RDLogManager grid. To see the list of
available grids, touch the <computeroutput>Edit Grids</computeroutput>
button to open the Log Grids dialog.
</para>
<para>
<mediaobject>
<imageobject>
<imagedata align="center" fileref="rdlogmanager.log_grids_dialog.png" width="65mm" depth="53mm" />
</imageobject>
<caption><para>The Log Grids Dialog</para></caption>
</mediaobject>
</para>
<para>
To open a particular grid, select its service name and touch the
<computeroutput>Edit</computeroutput>
button.
</para>
<para>
<mediaobject>
<imageobject>
<imagedata align="center" fileref="rdlogmanager.edit_grid_dialog.png" width="145mm" depth="95mm" />
</imageobject>
<caption><para>The Edit Grid Dialog</para></caption>
</mediaobject>
</para>
<para>
Each grid has slots for every hour of every day of the broadcast week
168 slots in all. By specifying a particular clock to go into each
of these slots, a set of rules that RDLogManager can use to generate
a log for any given day of the week is built up. To specify a clock,
simply touch the particular hour of interest to open up the
<computeroutput>Select Log Clock</computeroutput> dialog.
</para>
<para>
<mediaobject>
<imageobject>
<imagedata align="center" fileref="rdlogmanager.log_clocks.png" width="96mm" depth="68mm" />
</imageobject>
<caption><para>The Log Clocks Dialog</para></caption>
</mediaobject>
</para>
<para>
Click the desired clock, then touch the
<computeroutput>OK</computeroutput> button. To clear the
assignment of any clock to the selected hour, touch the
<computeroutput>Clear</computeroutput> button,
then <computeroutput>OK</computeroutput>.
</para>
<para>
It is possible to 'drill down' directly to the underlying
configuration of a clock (to be covered shortly) by right-clicking on
the relevant hour in a grid and selecting
<computeroutput> Edit Clock</computeroutput>.
</para>
</sect1>
<sect1 xml:id="sect.rdlogmanager.clocks">
<title>Clocks</title>
<para>
An RDLogManager clock is a collection of RDLogManager events,
arranged in terms of their start time (relative to the beginning of
the hour) and length. It basically can be thought of as the
&quot;schedule&quot; of an hour <emphasis>any</emphasis> hour.
Once defined, a clock
can be plugged into any hour of a grid of any service, thus making
for easy modularization and changes to a service's schedule.
</para>
<para>
To see the list of available clocks, touch the
<computeroutput>Edit Clocks</computeroutput> button in
RDLogManager's Main Menu to open the Log Clocks dialog.
Each RDLogManager clock can be assigned a
three-letter code and color, as an aid in identifying it when
assigned to grids. To add a new clock, touch the
<computeroutput>Add</computeroutput> button, or to
edit a clock's parameters, click on it and touch the
<computeroutput>Edit</computeroutput> button.
In each case, the Edit Clock dialog will open.
Clocks can also be deleted by touching the
<computeroutput>Delete</computeroutput> button or renamed
by touching the <computeroutput>Rename</computeroutput> button.
</para>
<para>
<mediaobject>
<imageobject>
<imagedata align="center" fileref="rdlogmanager.log_clock_list.png" width="97mm" depth="69mm" />
</imageobject>
<caption><para>The Log Clock List Dialog</para></caption>
</mediaobject>
</para>
<para>
<mediaobject>
<imageobject>
<imagedata align="center" fileref="rdlogmanager.edit_clock_dialog.png" width="145mm" depth="104mm" />
</imageobject>
<caption><para>The Edit Clock Dialog</para></caption>
</mediaobject>
</para>
<para>
The Edit Clock dialog consists of three main sections: a tabular
list of events in chronological order, a graphical depiction of the
clock in the traditional “broadcast clock” format, and a series of
action buttons across the bottom. The clock's three-letter code is
set by means of the <computeroutput>Code</computeroutput> field
in the upper right-hand corner of the
table area. Its color can be set by touching the
<computeroutput>Color</computeroutput> button. To
save the clock without exiting the dialog, touch the
<computeroutput>Save</computeroutput>
or <computeroutput>Save As</computeroutput>
buttons. To add a new event to the clock, touch the
<computeroutput>Add</computeroutput> button, or
to edit an existing entry touch the
<computeroutput>Edit</computeroutput> button. In either case,
the Edit Event Assignment dialog will open. To
delete an entry, touch the <computeroutput>Delete</computeroutput>
button. As in the case of grids,
it is possible to 'drill down' into the underlying RDLogManager
event by right-clicking on the respective entry in the clock event
table and selecting <computeroutput>Edit Event</computeroutput>.
</para>
<para>
<mediaobject>
<imageobject>
<imagedata align="center" fileref="rdlogmanager.edit_event_assignment_dialog.png" width="88mm" depth="26mm" />
</imageobject>
<caption><para>The Edit Event Assignment Dialog</para></caption>
</mediaobject>
</para>
<para>
The Edit Event Assignment dialog simply consists of an
<computeroutput>Event</computeroutput> field
for the name of the RDLogManager event and
<computeroutput>Start Time</computeroutput> and
<computeroutput>End Time</computeroutput>
fields for the start and end times relative to the start of the
hour. A list of available events can be brought up by touching the
<computeroutput>Select</computeroutput> button to bring up the
Log Events dialog.
</para>
<para>
Each clock can be designated as being associated with one or more
services. This can make finding the correct clock for a given
service much faster, as the
<computeroutput>Filter</computeroutput> control on the List Clocks dialog
can then be used. To program these associations, touch the
<computeroutput>Services List</computeroutput> button in the Edit
Clock dialog to bring up the Service
Associations dialog.
</para>
<para>
<mediaobject>
<imageobject>
<imagedata align="center" fileref="rdlogmanager.service_association_dialog.png" width="65mm" depth="39mm" />
</imageobject>
<caption><para>The Service Association Dialog</para></caption>
</mediaobject>
</para>
<para>
To designate a service as being valid for this clock, select the
services name in the <computeroutput>Available Services</computeroutput>
list and then touch the <computeroutput>Add &gt;&gt;</computeroutput>
button. Likewise, to deselect a service, select its name in the
<computeroutput>Enabled Services</computeroutput> list and then touch
the <computeroutput>&lt;&lt; Remove</computeroutput> button.
</para>
</sect1>
<sect2 xml:id="sect.rdlogmanager.rdlogmanager.grids.bypassing_grid_processing">
<title>Bypassing Grid Processing</title>
<para>
Certain third-party music scheduler systems support the ability to
compose the entire schedule for a service (including placement of
traffic breaks) within its own native user interface, thus potentially
centralizing and simplifying log template maintenance. To facilitate
this mode of operation, it is possible to configure RDLogManager to
bypass its native grid/clock/event template system entirely on a
service by service basis,
instead passing the schedule generated by the music scheduler system
through to Rivendell logs unchanged.
For information on configuring this mode of operation, see
the <computeroutput>Bypass Grid Processing</computeroutput> dropdown
and related discussion in
<xref linkend="sect.rdadmin.manage_services" />.
</para>
<para>
If a service has been configured to bypass grid processing, then
it will not have a grid. Skip forward to
<xref linkend="sect.rdlogmanager.generating_logs" />.
</para>
</sect2>
<sect2 xml:id="sect.rdlogmanager.grids.configuring_grids">
<title>Configuring Grids</title>
<para>
Each Rivendell service has an RDLogManager grid. To see the list of
available grids, touch the <computeroutput>Edit Grids</computeroutput>
button to open the Log Grids dialog.
</para>
<para>
<mediaobject>
<imageobject>
<imagedata align="center" fileref="rdlogmanager.log_grids_dialog.png" width="65mm" />
</imageobject>
<caption><para>The Log Grids Dialog</para></caption>
</mediaobject>
</para>
<para>
To open a particular grid, select its service name and touch the
<computeroutput>Edit</computeroutput>
button.
</para>
<para>
<mediaobject>
<imageobject>
<imagedata align="center" fileref="rdlogmanager.edit_grid_dialog.png" width="145mm" depth="95mm" />
</imageobject>
<caption><para>The Edit Grid Dialog</para></caption>
</mediaobject>
</para>
<para>
Each grid has slots for every hour of every day of the broadcast week
168 slots in all. By specifying a particular clock to go into each
of these slots, a set of rules that RDLogManager can use to generate
a log for any given day of the week is built up. To specify a clock,
simply touch the particular hour of interest to open up the
<computeroutput>Select Log Clock</computeroutput> dialog.
</para>
<para>
<mediaobject>
<imageobject>
<imagedata align="center" fileref="rdlogmanager.log_clocks.png" width="96mm" depth="68mm" />
</imageobject>
<caption><para>The Log Clocks Dialog</para></caption>
</mediaobject>
</para>
<para>
Click the desired clock, then touch the
<computeroutput>OK</computeroutput> button. To clear the
assignment of any clock to the selected hour, touch the
<computeroutput>Clear</computeroutput> button,
then <computeroutput>OK</computeroutput>.
</para>
<para>
It is possible to 'drill down' directly to the underlying
configuration of a clock (to be covered shortly) by right-clicking on
the relevant hour in a grid and selecting
<computeroutput> Edit Clock</computeroutput>.
</para>
</sect2>
</sect1>
<sect1 xml:id="sect.rdlogmanager.clocks">
<title>Clocks</title>
<para>
An RDLogManager clock is a collection of RDLogManager events,
arranged in terms of their start time (relative to the beginning of
the hour) and length. It basically can be thought of as the
&quot;schedule&quot; of an hour <emphasis>any</emphasis> hour.
Once defined, a clock
can be plugged into any hour of a grid of any service, thus making
for easy modularization and changes to a service's schedule.
</para>
<para>
To see the list of available clocks, touch the
<computeroutput>Edit Clocks</computeroutput> button in
RDLogManager's Main Menu to open the Log Clocks dialog.
Each RDLogManager clock can be assigned a
three-letter code and color, as an aid in identifying it when
assigned to grids. To add a new clock, touch the
<computeroutput>Add</computeroutput> button, or to
edit a clock's parameters, click on it and touch the
<computeroutput>Edit</computeroutput> button.
In each case, the Edit Clock dialog will open.
Clocks can also be deleted by touching the
<computeroutput>Delete</computeroutput> button or renamed
by touching the <computeroutput>Rename</computeroutput> button.
</para>
<para>
<mediaobject>
<imageobject>
<imagedata align="center" fileref="rdlogmanager.log_clock_list.png" width="97mm" depth="69mm" />
</imageobject>
<caption><para>The Log Clock List Dialog</para></caption>
</mediaobject>
</para>
<para>
<mediaobject>
<imageobject>
<imagedata align="center" fileref="rdlogmanager.edit_clock_dialog.png" width="145mm" depth="104mm" />
</imageobject>
<caption><para>The Edit Clock Dialog</para></caption>
</mediaobject>
</para>
<para>
The Edit Clock dialog consists of three main sections: a tabular
list of events in chronological order, a graphical depiction of the
clock in the traditional “broadcast clock” format, and a series of
action buttons across the bottom. The clock's three-letter code is
set by means of the <computeroutput>Code</computeroutput> field
in the upper right-hand corner of the
table area. Its color can be set by touching the
<computeroutput>Color</computeroutput> button. To
save the clock without exiting the dialog, touch the
<computeroutput>Save</computeroutput>
or <computeroutput>Save As</computeroutput>
buttons. To add a new event to the clock, touch the
<computeroutput>Add</computeroutput> button, or
to edit an existing entry touch the
<computeroutput>Edit</computeroutput> button. In either case,
the Edit Event Assignment dialog will open. To
delete an entry, touch the <computeroutput>Delete</computeroutput>
button. As in the case of grids,
it is possible to 'drill down' into the underlying RDLogManager
event by right-clicking on the respective entry in the clock event
table and selecting <computeroutput>Edit Event</computeroutput>.
</para>
<para>
<mediaobject>
<imageobject>
<imagedata align="center" fileref="rdlogmanager.edit_event_assignment_dialog.png" width="88mm" depth="26mm" />
</imageobject>
<caption><para>The Edit Event Assignment Dialog</para></caption>
</mediaobject>
</para>
<para>
The Edit Event Assignment dialog simply consists of an
<computeroutput>Event</computeroutput> field
for the name of the RDLogManager event and
<computeroutput>Start Time</computeroutput> and
<computeroutput>End Time</computeroutput>
fields for the start and end times relative to the start of the
hour. A list of available events can be brought up by touching the
<computeroutput>Select</computeroutput> button to bring up the
Log Events dialog.
</para>
<para>
Each clock can be designated as being associated with one or more
services. This can make finding the correct clock for a given
service much faster, as the
<computeroutput>Filter</computeroutput> control on the List Clocks
dialog can then be used. To program these associations, touch the
<computeroutput>Services List</computeroutput> button in the Edit
Clock dialog to bring up the Service
Associations dialog.
</para>
<para>
<mediaobject>
<imageobject>
<imagedata align="center" fileref="rdlogmanager.service_association_dialog.png" width="65mm" depth="39mm" />
</imageobject>
<caption><para>The Service Association Dialog</para></caption>
</mediaobject>
</para>
<para>
To designate a service as being valid for this clock, select the
services name in the <computeroutput>Available Services</computeroutput>
list and then touch the <computeroutput>Add &gt;&gt;</computeroutput>
button. Likewise, to deselect a service, select its name in the
<computeroutput>Enabled Services</computeroutput> list and then touch
the <computeroutput>&lt;&lt; Remove</computeroutput> button.
</para>
</sect1>
<sect1 xml:id="sect.rdlogmanager.events">
<title>Events</title>
<para>

View File

@ -30,3 +30,8 @@ EVENT_ID_OFFSET int(11)
EVENT_ID_LENGTH int(11)
ANNC_TYPE_OFFSET int(11)
ANNC_TYPE_LENGTH int(11)
TRANS_TYPE_OFFSET int(11)
TRANS_TYPE_LENGTH int(11)
TIME_TYPE_OFFSET int(11)
TIME_TYPE_LENGTH int(11)

View File

@ -16,6 +16,9 @@ START_SECS int(11) signed
CART_NUMBER int(10) unsigned
TITLE varchar(191)
LENGTH int(11) signed
TRANS_TYPE int(11) signed RDLogLine::TransType
TIME_TYPE int(11) signed RDLogLine::TimeType
GRACE_TIME int(11) signed
EXT_DATA varchar(32)
EXT_EVENT_ID varchar(32)
EXT_ANNC_TYPE varchar(8)

View File

@ -4,12 +4,13 @@ The SERVICES table holds data concerning each audio service configured
on the system. Following is the layout of a record in the SERVICES
table:
FIELD NAME TYPE REMARKS
---------------------------------------------------------------
NAME varchar(10) unsigned Primary Key
DESCRIPTION varchar(191)
NAME_TEMPLATE varchar(191)
DESCRIPTION_TEMPLATE varchar(191)
FIELD NAME TYPE REMARKS
------------------------------------------------------------------------------
NAME varchar(10) unsigned Primary Key
DESCRIPTION varchar(191)
BYPASS_MODE enum('N','Y')
NAME_TEMPLATE varchar(191)
DESCRIPTION_TEMPLATE varchar(191)
PROGRAM_CODE varchar(191)
CHAIN_LOG enum('N','Y')
SUB_EVENT_INHERITANCE int(11) 0=Inherit from parent event,
@ -82,3 +83,7 @@ MUS_EVENT_ID_OFFSET int(11)
MUS_EVENT_ID_LENGTH int(11)
MUS_ANNC_TYPE_OFFSET int(11)
MUS_ANNC_TYPE_LENGTH int(11)
MUS_TRANS_TYPE_OFFSET int(11)
MUS_TRANS_TYPE_LENGTH int(11)
MUS_TIME_TYPE_OFFSET int(11)
MUS_TIME_TYPE_LENGTH int(11)

View File

@ -24,7 +24,7 @@
/*
* Current Database Version
*/
#define RD_VERSION_DATABASE 362
#define RD_VERSION_DATABASE 364
#endif // DBVERSION_H

View File

@ -294,6 +294,7 @@ void RDEventLine::clear()
event_artist_sep=15;
event_title_sep=100;
event_nested_event="";
event_using_bypass=false;
}
@ -354,12 +355,53 @@ bool RDEventLine::load()
event_preimport_list->load();
event_postimport_list->load();
event_using_bypass=false;
return true;
}
bool RDEventLine::loadBypass()
{
//
// Internal read-only event for processing inline traffic imports
//
event_preposition=0;
event_time_type=RDLogLine::Relative;
event_grace_time=0;
event_use_autofill=false;
event_use_timescale=false;
event_import_source=RDEventLine::Traffic;
event_start_slop=0;
event_end_slop=0;
event_first_transtype=RDLogLine::Play;
event_default_transtype=RDLogLine::Play;
event_color=QColor();
event_preimport_list->clear();
event_postimport_list->clear();
event_start_time=QTime(0,0,0,0);
event_length=0;
event_autofill_slop=-1;
event_sched_group="";
event_have_code="";
event_have_code2="";
event_artist_sep=15;
event_title_sep=100;
event_nested_event="";
event_using_bypass=true;
return true;
}
bool RDEventLine::save(RDConfig *config)
{
if(event_using_bypass) {
return false;
}
QString sql=QString("select `NAME` from `EVENTS` where ")+
"`NAME`='"+RDEscapeString(event_name)+"'";
RDSqlQuery *q=new RDSqlQuery(sql);
@ -914,7 +956,7 @@ bool RDEventLine::generateLog(QString logname,const QString &svcname,
}
bool RDEventLine::linkLog(RDLogModel *e,RDLog *log,const QString &svcname,
void RDEventLine::linkLog(RDLogModel *e,RDLog *log,const QString &svcname,
RDLogLine *link_logline,const QString &track_str,
const QString &label_cart,const QString &track_cart,
QString *errors)
@ -1033,7 +1075,6 @@ bool RDEventLine::linkLog(RDLogModel *e,RDLog *log,const QString &svcname,
logline->setStartTime(RDLogLine::Logged,time);
logline->setType(RDLogLine::TrafficLink);
logline->setSource(event_src);
// logline->setTransType(trans_type);
logline->setEventLength(event_length);
logline->setLinkEventName(event_nested_event);
logline->setLinkStartTime(q->value(9).toTime());
@ -1055,7 +1096,6 @@ bool RDEventLine::linkLog(RDLogModel *e,RDLog *log,const QString &svcname,
logline->setStartTime(RDLogLine::Logged,time);
logline->setType(RDLogLine::Track);
logline->setSource(event_src);
// logline->setTransType(RDLogLine::Segue);
logline->setMarkerComment(q->value(7).toString());
logline->setEventLength(event_length);
logline->setLinkEventName(event_name);
@ -1077,7 +1117,6 @@ bool RDEventLine::linkLog(RDLogModel *e,RDLog *log,const QString &svcname,
logline->setStartTime(RDLogLine::Logged,time);
logline->setType(RDLogLine::Marker);
logline->setSource(event_src);
// logline->(RDLogLine::Segue);
logline->setMarkerComment(q->value(7).toString());
logline->setEventLength(event_length);
logline->setLinkEventName(event_name);
@ -1102,9 +1141,6 @@ bool RDEventLine::linkLog(RDLogModel *e,RDLog *log,const QString &svcname,
QTime(start_start_hour,0,0).addSecs(q->value(1).toInt()));
logline->setType(RDLogLine::Cart);
logline->setCartNumber(q->value(0).toUInt());
// logline->setGraceTime(grace_time);
// logline->setTimeType(time_type);
// logline->setTransType(trans_type);
logline->setExtStartTime(QTime(0,0,0).addSecs(3600*start_start_hour+
q->value(1).toInt()));
logline->setExtLength(q->value(2).toInt());
@ -1226,8 +1262,6 @@ bool RDEventLine::linkLog(RDLogModel *e,RDLog *log,const QString &svcname,
}
}
}
return false;
}

View File

@ -2,7 +2,7 @@
//
// Abstract a Rivendell Log Manager Event
//
// (C) Copyright 2002-2020 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2022 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
@ -21,7 +21,7 @@
#ifndef RDEVENT_LINE_H
#define RDEVENT_LINE_H
#include <qdatetime.h>
#include <QDateTime>
#include <rdlogmodel.h>
#include <rdeventimportlist.h>
@ -75,10 +75,11 @@ class RDEventLine
void setLength(int msecs);
void clear();
bool load();
bool loadBypass();
bool save(RDConfig *config);
bool generateLog(QString logname,const QString &svcname,
QString *errors,QString clockname);
bool linkLog(RDLogModel *e,RDLog *log,const QString &svcname,
void linkLog(RDLogModel *e,RDLog *log,const QString &svcname,
RDLogLine *link_logline,const QString &track_str,
const QString &label_cart,const QString &track_cart,
QString *errors);
@ -94,6 +95,7 @@ class RDEventLine
private:
int GetLength(unsigned cartnum,int def_length=0);
QString event_name;
bool event_using_bypass;
int event_preposition;
RDLogLine::TimeType event_time_type;
int event_grace_time;

View File

@ -36,7 +36,7 @@ RDListSvcs::RDListSvcs(const QString &caption,QWidget *parent)
// Services
//
edit_svc_view=new RDTableView(this);
edit_svc_model=new RDServiceListModel(false,this);
edit_svc_model=new RDServiceListModel(false,false,this);
edit_svc_model->setFont(font());
edit_svc_model->setPalette(palette());
edit_svc_view->setModel(edit_svc_model);

View File

@ -443,7 +443,12 @@ QString RDLogLine::startTimeText() const
QString ret("");
if(timeType()==RDLogLine::Hard) {
ret="T";
if(graceTime()<0) {
ret="S";
}
else {
ret="H";
}
}
else {
if(!startTime(RDLogLine::Logged).isValid()) {

View File

@ -2,7 +2,7 @@
//
// Data model for Rivendell log imports
//
// (C) Copyright 2021 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2022 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
@ -39,11 +39,14 @@ RDLogImportModel::RDLogImportModel(const QString &hostname,pid_t proc_id,
unsigned right=Qt::AlignRight|Qt::AlignVCenter;
d_headers.push_back(tr("Start Time"));
d_alignments.push_back(left);
d_alignments.push_back(right);
d_headers.push_back(tr("Cart"));
d_alignments.push_back(center);
d_headers.push_back(tr("Trans"));
d_alignments.push_back(center);
d_headers.push_back(tr("Len"));
d_alignments.push_back(right);
@ -59,7 +62,7 @@ RDLogImportModel::RDLogImportModel(const QString &hostname,pid_t proc_id,
d_headers.push_back(tr("Annc Type"));
d_alignments.push_back(left);
d_headers.push_back(tr("Line"));
d_headers.push_back(tr("Line Number"));
d_alignments.push_back(right);
updateModel();
@ -165,6 +168,16 @@ void RDLogImportModel::refresh()
}
void RDLogImportModel::clear()
{
beginResetModel();
d_texts.clear();
d_icons.clear();
d_ids.clear();
endResetModel();
}
void RDLogImportModel::updateModel()
{
QList<QVariant> texts;
@ -197,52 +210,58 @@ void RDLogImportModel::updateRow(int row,RDSqlQuery *q)
}
// Start Time
texts[0]=RDSvc::timeString(q->value(1).toInt(),q->value(2).toInt());
QString prefix;
if((RDLogLine::TimeType)q->value(12).toUInt()==RDLogLine::Hard) {
if(q->value(13).toInt()<0) {
prefix="S:";
}
else {
prefix="H:";
}
}
texts[0]=prefix+RDSvc::timeString(q->value(1).toInt(),q->value(2).toInt());
// Cart
// texts.push_back(q->value(2));
// Transition Type
texts[2]=RDLogLine::transText((RDLogLine::TransType)q->value(11).toUInt());
// Length
if(!q->value(4).isNull()) {
texts[2]=RDGetTimeLength(q->value(4).toInt(),false,false);
texts[3]=RDGetTimeLength(q->value(4).toInt(),false,false);
}
// Title
// texts.push_back(q->value(2));
// GUID
texts[4]=q->value(5).toString().trimmed();
texts[5]=q->value(5).toString().trimmed();
// Event ID
texts[5]=q->value(6).toString().trimmed();
texts[6]=q->value(6).toString().trimmed();
// Annc Type
texts[6]=q->value(7).toString().trimmed();
texts[7]=q->value(7).toString().trimmed();
// Line
texts[7]=QString::asprintf("%u",1+q->value(10).toUInt());
texts[8]=QString::asprintf("%u",1+q->value(10).toUInt());
switch((RDLogLine::Type)q->value(9).toUInt()) {
case RDLogLine::Cart:
d_icons[row]=rda->iconEngine()->typeIcon(RDLogLine::Cart);
texts[1]=q->value(3); // Cart Number
texts[3]=q->value(8).toString().trimmed(); // Title
texts[4]=q->value(8).toString().trimmed(); // Title
break;
case RDLogLine::Marker:
d_icons[row]=rda->iconEngine()->typeIcon(RDLogLine::Marker);
texts[1]=tr("NOTE"); // Cart Number
texts[3]=q->value(8).toString().trimmed(); // Title
texts[4]=q->value(8).toString().trimmed(); // Title
break;
case RDLogLine::TrafficLink:
d_icons[row]=rda->iconEngine()->typeIcon(RDLogLine::TrafficLink);
texts[3]=tr("[spot break]"); // Title
texts[4]=tr("[spot break]"); // Title
break;
case RDLogLine::Track:
d_icons[row]=rda->iconEngine()->typeIcon(RDLogLine::Track);
texts[3]=tr("[voice track]"); // Title
texts[4]=tr("[voice track]"); // Title
break;
case RDLogLine::Macro:
@ -272,7 +291,10 @@ QString RDLogImportModel::sqlFields() const
"`EXT_ANNC_TYPE`,"+ // 07
"`TITLE`,"+ // 08
"`TYPE`,"+ // 09
"`FILE_LINE` "+ // 10
"`FILE_LINE`,"+ // 10
"`TRANS_TYPE`,"+ // 11
"`TIME_TYPE`,"+ // 12
"`GRACE_TIME` "+ // 13
"from `IMPORTER_LINES` ";
return sql;

View File

@ -2,7 +2,7 @@
//
// Data model for Rivendell log imports
//
// (C) Copyright 2021 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2021-2022 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
@ -28,6 +28,7 @@
#include <rddb.h>
#include <rdnotification.h>
#include <rdsvc.h>
class RDLogImportModel : public QAbstractTableModel
{
@ -45,6 +46,7 @@ class RDLogImportModel : public QAbstractTableModel
QVariant data(const QModelIndex &index,int role=Qt::DisplayRole) const;
int lineId(const QModelIndex &row) const;
void refresh();
void clear();
protected:
void updateModel();

View File

@ -1027,10 +1027,13 @@ QString RDLogModel::StartTimeString(int line) const
RDLogLine *ll=logLine(line);
if(ll!=NULL) {
QString code="H";
switch(ll->timeType()) {
case RDLogLine::Hard:
return QString("T")+
rda->tenthsTimeString(ll->startTime(RDLogLine::Logged));
if(ll->graceTime()<0) {
code="S";
}
return code+rda->tenthsTimeString(ll->startTime(RDLogLine::Logged));
break;
default:

View File

@ -1791,7 +1791,11 @@ QString RDLogPlay::cellText(int col,int row,RDLogLine *ll) const
if((ll->status()==RDLogLine::Scheduled)||
(ll->status()==RDLogLine::Paused)) {
if(ll->timeType()==RDLogLine::Hard) {
return tr("T")+rda->tenthsTimeString(ll->startTime(RDLogLine::Logged));
if(ll->graceTime()<0) {
return tr("S")+
rda->tenthsTimeString(ll->startTime(RDLogLine::Logged));
}
return tr("H")+rda->tenthsTimeString(ll->startTime(RDLogLine::Logged));
}
if(!ll->startTime(RDLogLine::Predicted).isNull()) {
return rda->tenthsTimeString(ll->startTime(RDLogLine::Predicted));

View File

@ -22,10 +22,12 @@
#include "rdescape_string.h"
#include "rdservicelistmodel.h"
RDServiceListModel::RDServiceListModel(bool incl_none,QObject *parent)
RDServiceListModel::RDServiceListModel(bool incl_none,bool exclude_bypass,
QObject *parent)
: QAbstractTableModel(parent)
{
d_include_none=incl_none;
d_exclude_bypass=exclude_bypass;
//
// Load Color Map
@ -47,31 +49,34 @@ RDServiceListModel::RDServiceListModel(bool incl_none,QObject *parent)
unsigned center=Qt::AlignCenter;
unsigned right=Qt::AlignRight|Qt::AlignVCenter;
d_headers.push_back(tr("Name"));
d_headers.push_back(tr("Name")); // 00
d_alignments.push_back(left);
d_headers.push_back(tr("Description"));
d_headers.push_back(tr("Description")); // 01
d_alignments.push_back(left);
d_headers.push_back(tr("Pgm Code"));
d_headers.push_back(tr("Pgm Code")); // 02
d_alignments.push_back(left);
d_headers.push_back(tr("Track Group"));
d_headers.push_back(tr("Track Group")); // 03
d_alignments.push_back(left);
d_headers.push_back(tr("Log Shelf Life"));
d_headers.push_back(tr("Log Shelf Life")); // 04
d_alignments.push_back(right);
d_headers.push_back(tr("ELR Shelf Life"));
d_headers.push_back(tr("ELR Shelf Life")); // 05
d_alignments.push_back(right);
d_headers.push_back(tr("Auto Refresh"));
d_headers.push_back(tr("Auto Refresh")); // 06
d_alignments.push_back(center);
d_headers.push_back(tr("Chain Log"));
d_headers.push_back(tr("Chain Log")); // 07
d_alignments.push_back(center);
d_headers.push_back(tr("Import Markers"));
d_headers.push_back(tr("Import Markers")); // 08
d_alignments.push_back(center);
d_headers.push_back(tr("Has Grid")); // 09
d_alignments.push_back(center);
updateModel();
@ -168,6 +173,15 @@ QVariant RDServiceListModel::data(const QModelIndex &index,int role) const
}
bool RDServiceListModel::hasGrid(const QModelIndex &index) const
{
if(index.isValid()) {
return d_has_grids.at(index.row());
}
return false;
}
QString RDServiceListModel::serviceName(const QModelIndex &row) const
{
return d_texts.at(row.row()).at(0).toString();
@ -194,6 +208,7 @@ QModelIndex RDServiceListModel::addService(const QString &svcname)
list[0]=svcname;
d_texts.insert(offset,list);
d_icons.insert(offset,list);
d_has_grids.insert(offset,"N");
updateRowLine(offset);
endInsertRows();
@ -207,6 +222,7 @@ void RDServiceListModel::removeService(const QModelIndex &row)
d_texts.removeAt(row.row());
d_icons.removeAt(row.row());
d_has_grids.removeAt(row.row());
endRemoveRows();
}
@ -257,10 +273,14 @@ void RDServiceListModel::updateModel()
RDSqlQuery *q=NULL;
QString sql=sqlFields();
if(d_exclude_bypass) {
sql+="where `BYPASS_MODE`='N' ";
}
sql+="order by NAME ";
beginResetModel();
d_texts.clear();
d_icons.clear();
d_has_grids.clear();
if(d_include_none) {
d_texts.push_back(texts);
d_icons.push_back(texts);
@ -270,11 +290,13 @@ void RDServiceListModel::updateModel()
d_texts.back().push_back(QVariant());
d_icons.back().push_back(QVariant());
}
d_has_grids.push_back("N");
}
q=new RDSqlQuery(sql);
while(q->next()) {
d_texts.push_back(texts);
d_icons.push_back(texts);
d_has_grids.push_back("N");
updateRow(d_texts.size()-1,q);
}
delete q;
@ -342,8 +364,18 @@ void RDServiceListModel::updateRow(int row,RDSqlQuery *q)
texts.push_back(q->value(8));
icons.push_back(QVariant());
// Has Grid
if(q->value(9).toString()=="Y") {
texts.push_back("N");
}
else {
texts.push_back("Y");
}
icons.push_back(QVariant());
d_texts[row]=texts;
d_icons[row]=icons;
d_has_grids[row]=q->value(9).toString()!="Y";
}
@ -358,7 +390,8 @@ QString RDServiceListModel::sqlFields() const
"`SERVICES`.`ELR_SHELFLIFE`,"+ // 05
"`SERVICES`.`AUTO_REFRESH`,"+ // 06
"`SERVICES`.`CHAIN_LOG`,"+ // 07
"`SERVICES`.`INCLUDE_IMPORT_MARKERS` "+ // 08
"`SERVICES`.`INCLUDE_IMPORT_MARKERS`,"+ // 08
"`BYPASS_MODE` "+ // 09
"from `SERVICES` ";
return sql;

View File

@ -42,7 +42,7 @@ class RDServiceListModel : public QAbstractTableModel
{
Q_OBJECT
public:
RDServiceListModel(bool incl_none,QObject *parent);
RDServiceListModel(bool incl_none,bool exclude_bypass,QObject *parent);
~RDServiceListModel();
QPalette palette();
void setPalette(const QPalette &pal);
@ -52,6 +52,7 @@ class RDServiceListModel : public QAbstractTableModel
QVariant headerData(int section,Qt::Orientation orient,
int role=Qt::DisplayRole) const;
QVariant data(const QModelIndex &index,int role=Qt::DisplayRole) const;
bool hasGrid(const QModelIndex &index) const;
QString serviceName(const QModelIndex &row) const;
QModelIndex addService(const QString &name);
void removeService(const QModelIndex &row);
@ -70,10 +71,12 @@ class RDServiceListModel : public QAbstractTableModel
QFont d_font;
QFont d_bold_font;
bool d_include_none;
bool d_exclude_bypass;
QList<QVariant> d_headers;
QList<QVariant> d_alignments;
QList<QList<QVariant> > d_texts;
QList<QList<QVariant> > d_icons;
QList<bool> d_has_grids;
QMap<QString,QVariant> d_group_color_map;
};

File diff suppressed because it is too large Load Diff

View File

@ -2,7 +2,7 @@
//
// Abstract a Rivendell Service
//
// (C) Copyright 2002-2020 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2022 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
@ -23,10 +23,10 @@
#include <vector>
#include <qobject.h>
#include <qsqldatabase.h>
#include <QObject>
#include "rdconfig.h"
#include "rdlog.h"
#include "rdloglock.h"
#include "rdstation.h"
#include "rduser.h"
@ -38,7 +38,8 @@ class RDSvc : public QObject
enum ImportSource {Traffic=0,Music=1};
enum ImportField {CartNumber=0,ExtData=3,ExtEventId=4,ExtAnncType=5,
Title=6,StartHours=7,StartMinutes=8,StartSeconds=9,
LengthHours=10,LengthMinutes=11,LengthSeconds=12};
LengthHours=10,LengthMinutes=11,LengthSeconds=12,
TransType=13,TimeType=14};
enum ShelflifeOrigin {OriginAirDate=0,OriginCreationDate=1};
enum SubEventInheritance {ParentEvent=0,SchedFile=1};
RDSvc(QString svcname,RDStation *station,RDConfig *config,QObject *parent=0);
@ -46,6 +47,8 @@ class RDSvc : public QObject
bool exists() const;
QString description() const;
void setDescription(const QString &desc) const;
bool bypassMode() const;
void setBypassMode(bool state) const;
QString programCode() const;
void setProgramCode(const QString &str) const;
QString nameTemplate() const;
@ -122,6 +125,25 @@ class RDSvc : public QObject
bool CheckId(std::vector<int> *v,int value);
QString MakeErrorLine(int indent,unsigned lineno,const QString &msg) const;
bool ResolveInlineEvents(const QString &logname,QString *err_msg);
bool ValidateInlineEvents(QString *err_msg) const;
void ProcessGridEvents(RDLog *log,RDLogModel *dst_model,RDLogModel *src_model,
const QString &track_str,const QString &label_cart,
const QString &track_cart,RDLog::Source link_src,
RDLogLine::Type src_type,QString *err_msgs);
void ProcessBypassMusicEvents(RDLog *log,RDLogModel *dst_model,
RDLogModel *src_model,const QString &track_str,
const QString &label_cart,
const QString &track_cart,
RDLog::Source link_src,RDLogLine::Type src_type,
QString *err_msgs);
void ProcessBypassTrafficEvents(RDLog *log,RDLogModel *dst_model,
RDLogModel *src_model,
const QString &track_str,
const QString &label_cart,
const QString &track_cart,
RDLog::Source link_src,
QString *err_msgs);
int GetCartLength(unsigned cartnum,int def_length) const;
QString svc_name;
RDStation *svc_station;
RDConfig *svc_config;

View File

@ -66,7 +66,7 @@ AddSvc::AddSvc(QString *svcname,QWidget *parent)
//
svc_exemplar_box=new QComboBox(this);
svc_exemplar_box->setGeometry(155,36,sizeHint().width()-165,19);
svc_services_model=new RDServiceListModel(true,this);
svc_services_model=new RDServiceListModel(true,false,this);
svc_services_model->setFont(defaultFont());
svc_services_model->setPalette(palette());
svc_exemplar_box->setModel(svc_services_model);

View File

@ -155,7 +155,7 @@ EditCartSlots::EditCartSlots(RDStation *station,RDStation *cae_station,
//
edit_service_box=new QComboBox(this);
edit_service_box->setGeometry(127,240,120,20);
edit_service_model=new RDServiceListModel(true,this);
edit_service_model=new RDServiceListModel(true,false,this);
edit_service_model->setFont(defaultFont());
edit_service_model->setPalette(palette());
edit_service_box->setModel(edit_service_model);

View File

@ -64,7 +64,7 @@ EditRDAirPlay::EditRDAirPlay(RDStation *station,RDStation *cae_station,
//
// Models
//
air_service_model=new RDServiceListModel(true,this);
air_service_model=new RDServiceListModel(true,false,this);
//
// Channel Assignments Section

View File

@ -54,7 +54,7 @@ EditRDPanel::EditRDPanel(RDStation *station,RDStation *cae_station,
//
// Models
//
air_service_model=new RDServiceListModel(true,this);
air_service_model=new RDServiceListModel(true,false,this);
//
// Channel Assignments Section

View File

@ -2,7 +2,7 @@
//
// Edit a Rivendell Service
//
// (C) Copyright 2002-2021 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2022 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
@ -36,8 +36,6 @@
EditSvc::EditSvc(QString svc,QWidget *parent)
: RDDialog(parent)
{
setModal(true);
QString sql;
RDSqlQuery *q;
QString group;
@ -46,10 +44,8 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
//
// Fix the Window Size
//
setMinimumWidth(sizeHint().width());
setMaximumWidth(sizeHint().width());
setMinimumHeight(sizeHint().height());
setMaximumHeight(sizeHint().height());
setMinimumSize(sizeHint());
setMinimumSize(sizeHint());
svc_svc=new RDSvc(svc,rda->station(),rda->config());
@ -62,6 +58,11 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
RDIdValidator *log_validator=new RDIdValidator(this);
log_validator->addBannedChar(' ');
//
// Dialogs
//
svc_test_import_dialog=new TestImport(this);
//
// General Section
//
@ -124,57 +125,73 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
label->setGeometry(10,115,170,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Bypass Grid Processing
//
svc_bypass_box=new QComboBox(this);
svc_bypass_box->setGeometry(185,136,60,19);
svc_bypass_box->insertItem(0,tr("No"));
svc_bypass_box->insertItem(1,tr("Yes"));
connect(svc_bypass_box,SIGNAL(activated(const QString &)),
this,SLOT(textChangedData(const QString &)));
connect(svc_bypass_box,SIGNAL(activated(int)),
this,SLOT(bypassModeChangedData(int)));
label=new QLabel(tr("Bypass Grid Processing")+":",this);
label->setGeometry(10,136,170,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Inline Event Inheritance Log
//
svc_sub_event_inheritance_box=new QComboBox(this);
svc_sub_event_inheritance_box->setGeometry(185,136,240,19);
svc_sub_event_inheritance_box->setGeometry(185,157,240,19);
svc_sub_event_inheritance_box->
insertItem((int)RDSvc::ParentEvent,tr("From Relative Position"));
svc_sub_event_inheritance_box->
insertItem((int)RDSvc::SchedFile,tr("From Scheduler File"));
connect(svc_sub_event_inheritance_box,SIGNAL(activated(const QString &)),
this,SLOT(textChangedData(const QString &)));
label=new QLabel(tr("Inline Event Start/Length")+":",this);
label->setGeometry(10,136,170,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
svc_sub_event_inheritance_label=
new QLabel(tr("Inline Event Start/Length")+":",this);
svc_sub_event_inheritance_label->setGeometry(10,157,170,19);
svc_sub_event_inheritance_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Voicetracking Group
//
svc_voice_group_box=new QComboBox(this);
svc_voice_group_box->setGeometry(185,157,240,19);
svc_voice_group_box->setGeometry(185,178,180,19);
svc_voice_group_box->insertItem(0,tr("[none]"));
label=new QLabel(tr("Voicetrack Group:"),this);
label->setGeometry(10,157,170,19);
label->setGeometry(10,178,170,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Autospot Group
//
svc_autospot_group_box=new QComboBox(this);
svc_autospot_group_box->setGeometry(185,178,240,19);
svc_autospot_group_box->setGeometry(185,199,180,19);
svc_autospot_group_box->insertItem(0,tr("[none]"));
label=new QLabel(tr("AutoSpot Group:"),this);
label->setGeometry(10,178,170,19);
label->setGeometry(10,199,170,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Chain Log
//
svc_chain_box=new QCheckBox(this);
svc_chain_box->setGeometry(30,201,15,15);
svc_chain_box->setGeometry(30,222,15,15);
label=new QLabel(tr("Insert CHAIN TO at log end"),this);
label->setGeometry(50,201,170,19);
label->setGeometry(50,222,170,19);
label->setAlignment(Qt::AlignLeft);
//
// Default Auto Refresh
//
svc_autorefresh_box=new QCheckBox(this);
svc_autorefresh_box->setGeometry(230,201,15,15);
svc_autorefresh_box->setGeometry(230,222,15,15);
label=new QLabel(tr("Enable AutoRefresh By Default"),this);
label->setGeometry(250,201,200,19);
label->setGeometry(250,222,200,19);
label->setAlignment(Qt::AlignLeft);
//
@ -259,7 +276,7 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
// Traffic Import Section
//
label=new QLabel(tr("Traffic Data Import"),this);
label->setGeometry(10,231,160,24);
label->setGeometry(10,252,160,24);
label->setFont(sectionLabelFont());
label->setAlignment(Qt::AlignLeft);
@ -267,11 +284,11 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
// Linux Traffic Import Path
//
svc_tfc_path_edit=new QLineEdit(this);
svc_tfc_path_edit->setGeometry(185,255,240,19);
svc_tfc_path_edit->setGeometry(185,276,240,19);
svc_tfc_path_edit->setMaxLength(191);
svc_tfc_path_edit->setValidator(validator);
label=new QLabel(tr("Import Path:"),this);
label->setGeometry(10,255,170,19);
label->setGeometry(10,276,170,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
connect(svc_tfc_path_edit,SIGNAL(textChanged(const QString &)),
this,SLOT(textChangedData(const QString &)));
@ -280,10 +297,10 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
// Linux Traffic Preimport Command
//
svc_tfc_preimport_cmd_edit=new QLineEdit(this);
svc_tfc_preimport_cmd_edit->setGeometry(185,276,240,19);
svc_tfc_preimport_cmd_edit->setGeometry(185,297,240,19);
svc_tfc_preimport_cmd_edit->setValidator(validator);
label=new QLabel(tr("Preimport Command:"),this);
label->setGeometry(10,276,170,19);
label->setGeometry(10,297,170,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
connect(svc_tfc_preimport_cmd_edit,SIGNAL(textChanged(const QString &)),
this,SLOT(textChangedData(const QString &)));
@ -292,10 +309,10 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
// Note Cart
//
svc_tfc_label_cart_edit=new QLineEdit(this);
svc_tfc_label_cart_edit->setGeometry(185,297,240,19);
svc_tfc_label_cart_edit->setGeometry(185,318,240,19);
svc_tfc_label_cart_edit->setMaxLength(32);
label=new QLabel(tr("Insert Marker String")+":",this);
label->setGeometry(10,297,170,19);
label->setGeometry(10,318,170,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
connect(svc_tfc_label_cart_edit,SIGNAL(textChanged(const QString &)),
this,SLOT(textChangedData(const QString &)));
@ -304,10 +321,10 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
// Track String
//
svc_tfc_track_edit=new QLineEdit(this);
svc_tfc_track_edit->setGeometry(185,318,240,19);
svc_tfc_track_edit->setGeometry(185,339,240,19);
svc_tfc_track_edit->setMaxLength(32);
label=new QLabel(tr("Insert Voice Track String:"),this);
label->setGeometry(10,318,170,19);
label->setGeometry(10,339,170,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
connect(svc_tfc_track_edit,SIGNAL(textChanged(const QString &)),
this,SLOT(textChangedData(const QString &)));
@ -316,9 +333,9 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
// Traffic Import Template
//
svc_tfc_import_template_box=new QComboBox(this);
svc_tfc_import_template_box->setGeometry(185,339,240,19);
svc_tfc_import_template_box->setGeometry(185,360,240,19);
label=new QLabel(tr("Import Template:"),this);
label->setGeometry(10,339,170,19);
label->setGeometry(10,360,170,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
connect(svc_tfc_import_template_box,SIGNAL(activated(int)),
this,SLOT(tfcTemplateActivatedData(int)));
@ -326,15 +343,15 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
//
// Traffic Parser Settings
//
svc_tfc_fields=new ImportFields(this);
svc_tfc_fields->setGeometry(10,360,svc_tfc_fields->sizeHint().width(),
svc_tfc_fields=new ImportFields(RDSvc::Traffic,this);
svc_tfc_fields->setGeometry(10,381,svc_tfc_fields->sizeHint().width(),
svc_tfc_fields->sizeHint().height());
//
// Traffic Test Button
//
button=new QPushButton(this);
button->setGeometry(360,360,60,40);
button->setGeometry(360,381,60,40);
button->setFont(buttonFont());
button->setText(tr("Test \nTraffic"));
connect(button,SIGNAL(clicked()),this,SLOT(trafficData()));
@ -343,7 +360,7 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
// Traffic Copy Button
//
svc_tfc_copy_button=new QPushButton(this);
svc_tfc_copy_button->setGeometry(360,410,60,40);
svc_tfc_copy_button->setGeometry(360,431,60,40);
svc_tfc_copy_button->setFont(buttonFont());
svc_tfc_copy_button->setText(tr("Copy To\nCustom"));
connect(svc_tfc_copy_button,SIGNAL(clicked()),this,SLOT(trafficCopyData()));
@ -352,7 +369,7 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
// Music Import Section
//
label=new QLabel(tr("Music Data Import"),this);
label->setGeometry(445,234,160,24);
label->setGeometry(445,252,160,24);
label->setFont(sectionLabelFont());
label->setAlignment(Qt::AlignLeft);
@ -360,11 +377,11 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
// Linux Music Import Path
//
svc_mus_path_edit=new QLineEdit(this);
svc_mus_path_edit->setGeometry(620,256,240,19);
svc_mus_path_edit->setGeometry(620,277,240,19);
svc_mus_path_edit->setMaxLength(191);
svc_mus_path_edit->setValidator(validator);
label=new QLabel(tr("Import Path:"),this);
label->setGeometry(450,256,165,19);
label->setGeometry(450,277,165,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
connect(svc_mus_path_edit,SIGNAL(textChanged(const QString &)),
this,SLOT(textChangedData(const QString &)));
@ -373,11 +390,11 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
// Linux Music Preimport Command
//
svc_mus_preimport_cmd_edit=new QLineEdit(this);
svc_mus_preimport_cmd_edit->setGeometry(620,276,240,19);
svc_mus_preimport_cmd_edit->setGeometry(620,297,240,19);
svc_mus_preimport_cmd_edit->setValidator(validator);
label=
new QLabel(tr("Preimport Command:"),this);
label->setGeometry(450,276,165,19);
label->setGeometry(450,297,165,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
connect(svc_mus_preimport_cmd_edit,SIGNAL(textChanged(const QString &)),
this,SLOT(textChangedData(const QString &)));
@ -386,10 +403,10 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
// Label Cart
//
svc_mus_label_cart_edit=new QLineEdit(this);
svc_mus_label_cart_edit->setGeometry(620,297,240,19);
svc_mus_label_cart_edit->setGeometry(620,318,240,19);
svc_mus_label_cart_edit->setMaxLength(32);
label=new QLabel(tr("Insert Marker String")+":",this);
label->setGeometry(450,297,165,19);
label->setGeometry(450,318,165,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
connect(svc_mus_label_cart_edit,SIGNAL(textChanged(const QString &)),
this,SLOT(textChangedData(const QString &)));
@ -398,10 +415,10 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
// Insert Voice Track String
//
svc_mus_track_edit=new QLineEdit(this);
svc_mus_track_edit->setGeometry(620,318,240,19);
svc_mus_track_edit->setGeometry(620,339,240,19);
svc_mus_track_edit->setMaxLength(255);
label=new QLabel(tr("Insert Voice Track String:"),this);
label->setGeometry(450,318,165,19);
label->setGeometry(450,339,165,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
connect(svc_mus_track_edit,SIGNAL(textChanged(const QString &)),
this,SLOT(textChangedData(const QString &)));
@ -410,10 +427,10 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
// Insert Spot Break String
//
svc_mus_break_edit=new QLineEdit(this);
svc_mus_break_edit->setGeometry(620,339,240,19);
svc_mus_break_edit->setGeometry(620,360,240,19);
svc_mus_break_edit->setMaxLength(255);
label=new QLabel(tr("Insert Traffic Break String:"),this);
label->setGeometry(450,339,165,19);
label->setGeometry(450,360,165,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
connect(svc_mus_break_edit,SIGNAL(textChanged(const QString &)),
this,SLOT(textChangedData(const QString &)));
@ -422,9 +439,9 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
// Music Import Template
//
svc_mus_import_template_box=new QComboBox(this);
svc_mus_import_template_box->setGeometry(620,360,240,19);
svc_mus_import_template_box->setGeometry(620,381,240,19);
label=new QLabel(tr("Import Template:"),this);
label->setGeometry(450,360,165,19);
label->setGeometry(450,381,165,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
connect(svc_mus_import_template_box,SIGNAL(activated(int)),
this,SLOT(musTemplateActivatedData(int)));
@ -432,15 +449,17 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
//
// Music Parser Settings
//
svc_mus_fields=new ImportFields(this);
svc_mus_fields->setGeometry(445,381,svc_mus_fields->sizeHint().width(),
svc_mus_fields=new ImportFields(RDSvc::Music,this);
connect(svc_bypass_box,SIGNAL(activated(int)),
svc_mus_fields,SLOT(setBypassMode(int)));
svc_mus_fields->setGeometry(445,402,svc_mus_fields->sizeHint().width(),
svc_mus_fields->sizeHint().height());
//
// Music Test Button
//
button=new QPushButton(this);
button->setGeometry(795,381,60,40);
button->setGeometry(795,402,60,40);
button->setFont(buttonFont());
button->setText(tr("Test \nMusic"));
connect(button,SIGNAL(clicked()),this,SLOT(musicData()));
@ -449,7 +468,7 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
// Music Copy Button
//
svc_mus_copy_button=new QPushButton(this);
svc_mus_copy_button->setGeometry(795,431,60,40);
svc_mus_copy_button->setGeometry(795,452,60,40);
svc_mus_copy_button->setFont(buttonFont());
svc_mus_copy_button->setText(tr("Copy To\nCustom"));
connect(svc_mus_copy_button,SIGNAL(clicked()),this,SLOT(musicCopyData()));
@ -500,6 +519,7 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
//
svc_name_edit->setText(svc_svc->name());
svc_description_edit->setText(svc_svc->description());
svc_bypass_box->setCurrentIndex(svc_svc->bypassMode());
svc_program_code_edit->setText(svc_svc->programCode());
svc_name_template_edit->setText(svc_svc->nameTemplate());
svc_description_template_edit->setText(svc_svc->descriptionTemplate());
@ -563,6 +583,7 @@ EditSvc::EditSvc(QString svc,QWidget *parent)
setText(svc_svc->trackString(RDSvc::Music));
tfcTemplateActivatedData(svc_tfc_import_template_box->currentIndex());
musTemplateActivatedData(svc_mus_import_template_box->currentIndex());
bypassModeChangedData(svc_bypass_box->currentIndex());
import_changed=false;
}
@ -571,12 +592,13 @@ EditSvc::~EditSvc()
{
delete svc_name_edit;
delete svc_description_edit;
delete svc_test_import_dialog;
}
QSize EditSvc::sizeHint() const
{
return QSize(870,691);
return QSize(870,712+42);
}
@ -594,6 +616,16 @@ void EditSvc::autofillData()
}
void EditSvc::bypassModeChangedData(int n)
{
if(n!=0) {
svc_sub_event_inheritance_box->setCurrentIndex((int)RDSvc::SchedFile);
}
svc_sub_event_inheritance_label->setEnabled(n==0);
svc_sub_event_inheritance_box->setEnabled(n==0);
}
void EditSvc::enableHostsData()
{
EditSvcPerms *edit_perms=new EditSvcPerms(svc_svc,this);
@ -668,7 +700,7 @@ void EditSvc::tfcTemplateActivatedData(int index)
svc_tfc_import_template_box->currentText());
}
svc_tfc_fields->setFields(svc_svc,RDSvc::Traffic);
svc_tfc_fields->setFields(svc_svc);
svc_tfc_fields->setEnabled(index==0);
svc_tfc_copy_button->setEnabled(index!=0);
import_changed=true;
@ -701,7 +733,7 @@ void EditSvc::musTemplateActivatedData(int index)
svc_mus_import_template_box->currentText());
}
svc_mus_fields->setFields(svc_svc,RDSvc::Music);
svc_mus_fields->setFields(svc_svc);
svc_mus_fields->setEnabled(index==0);
svc_mus_copy_button->setEnabled(index!=0);
import_changed=true;
@ -742,15 +774,14 @@ void EditSvc::TestDataImport(RDSvc::ImportSource src)
}
Save();
}
TestImport *testimport=new TestImport(svc_svc,src,this);
testimport->exec();
delete testimport;
svc_test_import_dialog->exec(svc_svc,src);
}
void EditSvc::Save()
{
svc_svc->setDescription(svc_description_edit->text());
svc_svc->setBypassMode(svc_bypass_box->currentIndex());
svc_svc->setProgramCode(svc_program_code_edit->text());
svc_svc->setNameTemplate(svc_name_template_edit->text().trimmed());
svc_svc->setDescriptionTemplate(svc_description_template_edit->text());
@ -781,7 +812,7 @@ void EditSvc::Save()
setPreimportCommand(RDSvc::Traffic,svc_tfc_preimport_cmd_edit->text());
if(svc_tfc_import_template_box->currentIndex()==0) {
svc_svc->setImportTemplate(RDSvc::Traffic,"");
svc_tfc_fields->readFields(svc_svc,RDSvc::Traffic);
svc_tfc_fields->readFields(svc_svc);
}
else {
svc_svc->setImportTemplate(RDSvc::Traffic,
@ -793,7 +824,7 @@ void EditSvc::Save()
svc_svc->setPreimportCommand(RDSvc::Music,svc_mus_preimport_cmd_edit->text());
if(svc_mus_import_template_box->currentIndex()==0) {
svc_svc->setImportTemplate(RDSvc::Music,"");
svc_mus_fields->readFields(svc_svc,RDSvc::Music);
svc_mus_fields->readFields(svc_svc);
}
else {
svc_svc->setImportTemplate(RDSvc::Music,

View File

@ -2,7 +2,7 @@
//
// Edit a Rivendell Service
//
// (C) Copyright 2002-2019 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2022 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
@ -21,16 +21,17 @@
#ifndef EDIT_SVC_H
#define EDIT_SVC_H
#include <qcheckbox.h>
#include <qcombobox.h>
#include <qlabel.h>
#include <qlineedit.h>
#include <qspinbox.h>
#include <QCheckBox>
#include <QComboBox>
#include <QLabel>
#include <QLineEdit>
#include <QSpinBox>
#include <rddialog.h>
#include <rdsvc.h>
#include "importfields.h"
#include "test_import.h"
class EditSvc : public RDDialog
{
@ -43,6 +44,7 @@ class EditSvc : public RDDialog
private slots:
void autofillData();
void bypassModeChangedData(int n);
void enableHostsData();
void trafficData();
void trafficCopyData();
@ -63,6 +65,9 @@ class EditSvc : public RDDialog
QLineEdit *svc_program_code_edit;
QLineEdit *svc_name_template_edit;
QLineEdit *svc_description_template_edit;
QComboBox *svc_bypass_box;
QLabel *svc_sub_event_inheritance_label;
QComboBox *svc_sub_event_inheritance_box;
QComboBox *svc_voice_group_box;
QComboBox *svc_autospot_group_box;
QLineEdit *svc_tfc_path_edit;
@ -78,7 +83,6 @@ class EditSvc : public RDDialog
QLineEdit *svc_mus_label_cart_edit;
QLineEdit *svc_mus_break_edit;
QLineEdit *svc_mus_track_edit;
QComboBox *svc_sub_event_inheritance_box;
QCheckBox *svc_chain_box;
QCheckBox *svc_autorefresh_box;
QCheckBox *svc_loglife_box;
@ -92,8 +96,8 @@ class EditSvc : public RDDialog
QPushButton *svc_tfc_copy_button;
QPushButton *svc_mus_copy_button;
bool import_changed;
TestImport *svc_test_import_dialog;
};
#endif
#endif // EDIT_SVC_H

View File

@ -2,7 +2,7 @@
//
// Import Parser Parameters for RDAdmin.
//
// (C) Copyright 2010-2021 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2010-2022 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
@ -22,21 +22,23 @@
#include "importfields.h"
ImportFields::ImportFields(QWidget *parent)
ImportFields::ImportFields(RDSvc::ImportSource src,QWidget *parent)
: RDWidget(parent)
{
QLabel *label;
import_changed=false;
bypass_mode=false;
import_source=src;
//
// Traffic Cartname Parser Data Section
// Cartname Parser Data Section
//
label=new QLabel(tr("Cart Number:"),this);
label->setGeometry(0,0,125,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Traffic Cart Offset
// Cart Offset
//
cart_offset_spin=new QSpinBox(this);
cart_offset_spin->setGeometry(175,0,50,19);
@ -48,7 +50,7 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Cart Length
// Cart Length
//
cart_length_spin=new QSpinBox(this);
cart_length_spin->setGeometry(285,0,50,19);
@ -91,14 +93,14 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Start Hours Parser Data Section
// Start Hours Parser Data Section
//
label=new QLabel(tr("Start Time - Hours:"),this);
label->setGeometry(0,42,125,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Traffic Start Hours Offset
// Start Hours Offset
//
hours_offset_spin=new QSpinBox(this);
hours_offset_spin->setGeometry(175,42,50,19);
@ -110,7 +112,7 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Start Hours Length
// Start Hours Length
//
hours_length_spin=new QSpinBox(this);
hours_length_spin->setGeometry(285,42,50,19);
@ -122,14 +124,14 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Start Minutes Parser Data Section
// Start Minutes Parser Data Section
//
label=new QLabel(tr("Start Time - Minutes:"),this);
label->setGeometry(0,63,125,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Traffic Start Minutes Offset
// Start Minutes Offset
//
minutes_offset_spin=new QSpinBox(this);
minutes_offset_spin->setGeometry(175,63,50,19);
@ -141,7 +143,7 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Start Minutes Length
// Start Minutes Length
//
minutes_length_spin=new QSpinBox(this);
minutes_length_spin->setGeometry(285,63,50,19);
@ -153,14 +155,14 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Start Seconds Parser Data Section
// Start Seconds Parser Data Section
//
label=new QLabel(tr("Start Time - Seconds:"),this);
label->setGeometry(0,84,125,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Traffic Start Seconds Offset
// Start Seconds Offset
//
seconds_offset_spin=new QSpinBox(this);
seconds_offset_spin->setGeometry(175,84,50,19);
@ -172,7 +174,7 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Start Seconds Length
// Start Seconds Length
//
seconds_length_spin=new QSpinBox(this);
seconds_length_spin->setGeometry(285,84,50,19);
@ -184,14 +186,14 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Length Hours Parser Data Section
// Length Hours Parser Data Section
//
label=new QLabel(tr("Length - Hours:"),this);
label->setGeometry(0,106,125,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Traffic Length Hours Offset
// Length Hours Offset
//
len_hours_offset_spin=new QSpinBox(this);
len_hours_offset_spin->setGeometry(175,106,50,19);
@ -203,7 +205,7 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Length Hours Length
// Length Hours Length
//
len_hours_length_spin=new QSpinBox(this);
len_hours_length_spin->setGeometry(285,106,50,19);
@ -215,14 +217,14 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Length Minutes Parser Data Section
// Length Minutes Parser Data Section
//
label=new QLabel(tr("Length - Minutes:"),this);
label->setGeometry(0,127,125,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Traffic Length Minutes Offset
// Length Minutes Offset
//
len_minutes_offset_spin=new QSpinBox(this);
len_minutes_offset_spin->setGeometry(175,127,50,19);
@ -234,7 +236,7 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Length Minutes Length
// Length Minutes Length
//
len_minutes_length_spin=new QSpinBox(this);
len_minutes_length_spin->setGeometry(285,127,50,19);
@ -246,14 +248,14 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Length Seconds Parser Data Section
// Length Seconds Parser Data Section
//
label=new QLabel(tr("Length - Seconds:"),this);
label->setGeometry(0,148,125,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Traffic Length Seconds Offset
// Length Seconds Offset
//
len_seconds_offset_spin=new QSpinBox(this);
len_seconds_offset_spin->setGeometry(175,148,50,19);
@ -265,7 +267,7 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Length Seconds Length
// Length Seconds Length
//
len_seconds_length_spin=new QSpinBox(this);
len_seconds_length_spin->setGeometry(285,148,50,19);
@ -277,14 +279,14 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic GUID Parser Data Section
// GUID Parser Data Section
//
label=new QLabel(tr("Globally Unique ID:"),this);
label->setGeometry(0,169,125,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Traffic Contract # Offset
// Contract # Offset
//
data_offset_spin=new QSpinBox(this);
data_offset_spin->setGeometry(175,169,50,19);
@ -296,7 +298,7 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Contract # Length
// Contract # Length
//
data_length_spin=new QSpinBox(this);
data_length_spin->setGeometry(285,169,50,19);
@ -308,14 +310,14 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Event ID Parser Data Section
// Event ID Parser Data Section
//
label=new QLabel(tr("Event ID:"),this);
label->setGeometry(0,190,125,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Traffic Event ID Offset
// Event ID Offset
//
event_id_offset_spin=new QSpinBox(this);
event_id_offset_spin->setGeometry(175,190,50,19);
@ -327,7 +329,7 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Event ID Length
// Event ID Length
//
event_id_length_spin=new QSpinBox(this);
event_id_length_spin->setGeometry(285,190,50,19);
@ -339,14 +341,14 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Announcement Type Parser Data Section
// Announcement Type Parser Data Section
//
label=new QLabel(tr("Annc. Type:"),this);
label->setGeometry(0,211,125,19);
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Traffic Announcement Type Offset
// Announcement Type Offset
//
annctype_offset_spin=new QSpinBox(this);
annctype_offset_spin->setGeometry(175,211,50,19);
@ -358,7 +360,7 @@ ImportFields::ImportFields(QWidget *parent)
this,SLOT(valueChangedData(int)));
//
// Traffic Announcement Type Length
// Announcement Type Length
//
annctype_length_spin=new QSpinBox(this);
annctype_length_spin->setGeometry(285,211,50,19);
@ -368,11 +370,96 @@ ImportFields::ImportFields(QWidget *parent)
label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
connect(annctype_length_spin,SIGNAL(valueChanged(int)),
this,SLOT(valueChangedData(int)));
//
// Transition Type Parser Data Section
//
trans_type_label=new QLabel(tr("Transition Type")+":",this);
trans_type_label->setGeometry(0,232,125,19);
trans_type_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
trans_type_label->setVisible(import_source==RDSvc::Music);
trans_type_label->setEnabled(bypass_mode);
//
// Transition Type Offset
//
trans_type_offset_spin=new QSpinBox(this);
trans_type_offset_spin->setGeometry(175,232,50,19);
trans_type_offset_spin->setRange(0,RD_MAX_IMPORT_LINE_LENGTH);
trans_type_offset_spin->setVisible(import_source==RDSvc::Music);
trans_type_offset_spin->setEnabled(bypass_mode);
trans_type_offset_label=new QLabel(tr("Offset:"),this);
trans_type_offset_label->setGeometry(125,232,45,19);
trans_type_offset_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
trans_type_offset_label->setVisible(import_source==RDSvc::Music);
trans_type_offset_label->setEnabled(bypass_mode);
connect(trans_type_offset_spin,SIGNAL(valueChanged(int)),
this,SLOT(valueChangedData(int)));
//
// Transition Type Length
//
trans_type_length_spin=new QSpinBox(this);
trans_type_length_spin->setGeometry(285,232,50,19);
trans_type_length_spin->setRange(0,8);
trans_type_length_spin->setVisible(import_source==RDSvc::Music);
trans_type_length_spin->setEnabled(bypass_mode);
trans_type_length_label=new QLabel(tr("Length:"),this);
trans_type_length_label->setGeometry(230,232,50,19);
trans_type_length_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
trans_type_length_label->setVisible(import_source==RDSvc::Music);
trans_type_length_label->setEnabled(bypass_mode);
connect(trans_type_length_spin,SIGNAL(valueChanged(int)),
this,SLOT(valueChangedData(int)));
//
// Time Type Parser Data Section
//
time_type_label=new QLabel(tr("Time Type")+":",this);
time_type_label->setGeometry(0,253,125,19);
time_type_label->setVisible(import_source==RDSvc::Music);
time_type_label->setEnabled(bypass_mode);
time_type_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
//
// Time Type Offset
//
time_type_offset_spin=new QSpinBox(this);
time_type_offset_spin->setGeometry(175,253,50,19);
time_type_offset_spin->setRange(0,RD_MAX_IMPORT_LINE_LENGTH);
time_type_offset_spin->setVisible(import_source==RDSvc::Music);
time_type_offset_spin->setEnabled(bypass_mode);
time_type_offset_label=new QLabel(tr("Offset:"),this);
time_type_offset_label->setGeometry(125,253,45,19);
time_type_offset_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
time_type_offset_label->setVisible(import_source==RDSvc::Music);
time_type_offset_label->setEnabled(bypass_mode);
connect(time_type_offset_spin,SIGNAL(valueChanged(int)),
this,SLOT(valueChangedData(int)));
//
// Time Type Length
//
time_type_length_spin=new QSpinBox(this);
time_type_length_spin->setGeometry(285,253,50,19);
time_type_length_spin->setRange(0,8);
time_type_length_spin->setVisible(import_source==RDSvc::Music);
time_type_length_spin->setEnabled(bypass_mode);
time_type_length_label=new QLabel(tr("Length:"),this);
time_type_length_label->setGeometry(230,253,50,19);
time_type_length_label->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
time_type_length_label->setVisible(import_source==RDSvc::Music);
time_type_length_label->setEnabled(bypass_mode);
connect(time_type_length_spin,SIGNAL(valueChanged(int)),
this,SLOT(valueChangedData(int)));
}
QSize ImportFields::sizeHint() const
{
if(import_source==RDSvc::Music) {
return QSize(335,230+42);
}
return QSize(335,230);
}
@ -389,70 +476,168 @@ bool ImportFields::changed() const
}
void ImportFields::readFields(RDSvc *svc,RDSvc::ImportSource type)
void ImportFields::readFields(RDSvc *svc)
{
svc->setImportOffset(type,RDSvc::CartNumber,cart_offset_spin->value());
svc->setImportLength(type,RDSvc::CartNumber,cart_length_spin->value());
svc->setImportOffset(type,RDSvc::Title,title_offset_spin->value());
svc->setImportLength(type,RDSvc::Title,title_length_spin->value());
svc->setImportOffset(type,RDSvc::StartHours,hours_offset_spin->value());
svc->setImportLength(type,RDSvc::StartHours,hours_length_spin->value());
svc->setImportOffset(type,RDSvc::StartMinutes,minutes_offset_spin->value());
svc->setImportLength(type,RDSvc::StartMinutes,minutes_length_spin->value());
svc->setImportOffset(type,RDSvc::StartSeconds,seconds_offset_spin->value());
svc->setImportLength(type,RDSvc::StartSeconds,seconds_length_spin->value());
svc->setImportOffset(type,RDSvc::LengthHours,len_hours_offset_spin->value());
svc->setImportLength(type,RDSvc::LengthHours,len_hours_length_spin->value());
svc->setImportOffset(type,RDSvc::LengthMinutes,
svc->setImportOffset(import_source,RDSvc::CartNumber,
cart_offset_spin->value());
svc->setImportLength(import_source,RDSvc::CartNumber,
cart_length_spin->value());
svc->setImportOffset(import_source,RDSvc::Title,title_offset_spin->value());
svc->setImportLength(import_source,RDSvc::Title,title_length_spin->value());
svc->setImportOffset(import_source,RDSvc::StartHours,
hours_offset_spin->value());
svc->setImportLength(import_source,RDSvc::StartHours,
hours_length_spin->value());
svc->setImportOffset(import_source,RDSvc::StartMinutes,
minutes_offset_spin->value());
svc->setImportLength(import_source,RDSvc::StartMinutes,
minutes_length_spin->value());
svc->setImportOffset(import_source,RDSvc::StartSeconds,
seconds_offset_spin->value());
svc->setImportLength(import_source,RDSvc::StartSeconds,
seconds_length_spin->value());
svc->setImportOffset(import_source,RDSvc::LengthHours,
len_hours_offset_spin->value());
svc->setImportLength(import_source,RDSvc::LengthHours,
len_hours_length_spin->value());
svc->setImportOffset(import_source,RDSvc::LengthMinutes,
len_minutes_offset_spin->value());
svc->setImportLength(type,RDSvc::LengthMinutes,
svc->setImportLength(import_source,RDSvc::LengthMinutes,
len_minutes_length_spin->value());
svc->setImportOffset(type,RDSvc::LengthSeconds,
svc->setImportOffset(import_source,RDSvc::LengthSeconds,
len_seconds_offset_spin->value());
svc->setImportLength(type,RDSvc::LengthSeconds,
svc->setImportLength(import_source,RDSvc::LengthSeconds,
len_seconds_length_spin->value());
svc->setImportOffset(type,RDSvc::ExtData,data_offset_spin->value());
svc->setImportLength(type,RDSvc::ExtData,data_length_spin->value());
svc->setImportOffset(type,RDSvc::ExtEventId,event_id_offset_spin->value());
svc->setImportLength(type,RDSvc::ExtEventId,event_id_length_spin->value());
svc->setImportOffset(type,RDSvc::ExtAnncType,annctype_offset_spin->value());
svc->setImportLength(type,RDSvc::ExtAnncType,annctype_length_spin->value());
svc->setImportOffset(import_source,RDSvc::ExtData,
data_offset_spin->value());
svc->setImportLength(import_source,RDSvc::ExtData,data_length_spin->value());
svc->setImportOffset(import_source,RDSvc::ExtEventId,
event_id_offset_spin->value());
svc->setImportLength(import_source,RDSvc::ExtEventId,
event_id_length_spin->value());
svc->setImportOffset(import_source,RDSvc::ExtAnncType,
annctype_offset_spin->value());
svc->setImportLength(import_source,RDSvc::ExtAnncType,
annctype_length_spin->value());
if(import_source==RDSvc::Music) {
svc->setImportOffset(import_source,RDSvc::TransType,
trans_type_offset_spin->value());
svc->setImportLength(import_source,RDSvc::TransType,
trans_type_length_spin->value());
svc->setImportOffset(import_source,RDSvc::TimeType,
time_type_offset_spin->value());
svc->setImportLength(import_source,RDSvc::TimeType,
time_type_length_spin->value());
}
import_changed=false;
}
void ImportFields::setFields(RDSvc *svc,RDSvc::ImportSource type)
void ImportFields::setFields(RDSvc *svc)
{
cart_offset_spin->setValue(svc->importOffset(type,RDSvc::CartNumber));
cart_length_spin->setValue(svc->importLength(type,RDSvc::CartNumber));
title_offset_spin->setValue(svc->importOffset(type,RDSvc::Title));
title_length_spin->setValue(svc->importLength(type,RDSvc::Title));
hours_offset_spin->setValue(svc->importOffset(type,RDSvc::StartHours));
hours_length_spin->setValue(svc->importLength(type,RDSvc::StartHours));
minutes_offset_spin->setValue(svc->importOffset(type,RDSvc::StartMinutes));
minutes_length_spin->setValue(svc->importLength(type,RDSvc::StartMinutes));
seconds_offset_spin->setValue(svc->importOffset(type,RDSvc::StartSeconds));
seconds_length_spin->setValue(svc->importLength(type,RDSvc::StartSeconds));
len_hours_offset_spin->setValue(svc->importOffset(type,RDSvc::LengthHours));
len_hours_length_spin->setValue(svc->importLength(type,RDSvc::LengthHours));
setBypassMode(svc->bypassMode());
cart_offset_spin->
setValue(svc->importOffset(import_source,RDSvc::CartNumber));
cart_length_spin->
setValue(svc->importLength(import_source,RDSvc::CartNumber));
title_offset_spin->setValue(svc->importOffset(import_source,RDSvc::Title));
title_length_spin->setValue(svc->importLength(import_source,RDSvc::Title));
hours_offset_spin->
setValue(svc->importOffset(import_source,RDSvc::StartHours));
hours_length_spin->
setValue(svc->importLength(import_source,RDSvc::StartHours));
minutes_offset_spin->
setValue(svc->importOffset(import_source,RDSvc::StartMinutes));
minutes_length_spin->
setValue(svc->importLength(import_source,RDSvc::StartMinutes));
seconds_offset_spin->
setValue(svc->importOffset(import_source,RDSvc::StartSeconds));
seconds_length_spin->
setValue(svc->importLength(import_source,RDSvc::StartSeconds));
len_hours_offset_spin->
setValue(svc->importOffset(import_source,RDSvc::LengthHours));
len_hours_length_spin->
setValue(svc->importLength(import_source,RDSvc::LengthHours));
len_minutes_offset_spin->
setValue(svc->importOffset(type,RDSvc::LengthMinutes));
setValue(svc->importOffset(import_source,RDSvc::LengthMinutes));
len_minutes_length_spin->
setValue(svc->importLength(type,RDSvc::LengthMinutes));
setValue(svc->importLength(import_source,RDSvc::LengthMinutes));
len_seconds_offset_spin->
setValue(svc->importOffset(type,RDSvc::LengthSeconds));
setValue(svc->importOffset(import_source,RDSvc::LengthSeconds));
len_seconds_length_spin->
setValue(svc->importLength(type,RDSvc::LengthSeconds));
data_offset_spin->setValue(svc->importOffset(type,RDSvc::ExtData));
data_length_spin->setValue(svc->importLength(type,RDSvc::ExtData));
event_id_offset_spin->setValue(svc->importOffset(type,RDSvc::ExtEventId));
event_id_length_spin->setValue(svc->importLength(type,RDSvc::ExtEventId));
annctype_offset_spin->setValue(svc->importOffset(type,RDSvc::ExtAnncType));
annctype_length_spin->setValue(svc->importLength(type,RDSvc::ExtAnncType));
setValue(svc->importLength(import_source,RDSvc::LengthSeconds));
data_offset_spin->setValue(svc->importOffset(import_source,RDSvc::ExtData));
data_length_spin->setValue(svc->importLength(import_source,RDSvc::ExtData));
event_id_offset_spin->
setValue(svc->importOffset(import_source,RDSvc::ExtEventId));
event_id_length_spin->
setValue(svc->importLength(import_source,RDSvc::ExtEventId));
annctype_offset_spin->
setValue(svc->importOffset(import_source,RDSvc::ExtAnncType));
annctype_length_spin->
setValue(svc->importLength(import_source,RDSvc::ExtAnncType));
if(import_source==RDSvc::Music) {
trans_type_offset_spin->
setValue(svc->importOffset(import_source,RDSvc::TransType));
trans_type_length_spin->
setValue(svc->importLength(import_source,RDSvc::TransType));
time_type_offset_spin->
setValue(svc->importOffset(import_source,RDSvc::TimeType));
time_type_length_spin->
setValue(svc->importLength(import_source,RDSvc::TimeType));
}
import_changed=false;
}
bool ImportFields::bypassMode() const
{
return bypass_mode;
}
void ImportFields::setBypassMode(bool state)
{
if(state!=bypass_mode) {
trans_type_label->setEnabled(state);
trans_type_offset_label->setEnabled(state);
trans_type_offset_spin->setEnabled(state);
trans_type_length_label->setEnabled(state);
trans_type_length_spin->setEnabled(state);
time_type_label->setEnabled(state);
time_type_offset_label->setEnabled(state);
time_type_offset_spin->setEnabled(state);
time_type_length_label->setEnabled(state);
time_type_length_spin->setEnabled(state);
bypass_mode=state;
import_changed=true;
}
}
void ImportFields::setBypassMode(int n)
{
setBypassMode((bool)n);
}
void ImportFields::setEnabled(bool state)
{
QWidget::setEnabled(state);
trans_type_label->setEnabled(state&&bypass_mode);
trans_type_offset_label->setEnabled(state&&bypass_mode);
trans_type_offset_spin->setEnabled(state&&bypass_mode);
trans_type_length_label->setEnabled(state&&bypass_mode);
trans_type_length_spin->setEnabled(state&&bypass_mode);
time_type_label->setEnabled(state&&bypass_mode);
time_type_offset_label->setEnabled(state&&bypass_mode);
time_type_offset_spin->setEnabled(state&&bypass_mode);
time_type_length_label->setEnabled(state&&bypass_mode);
time_type_length_spin->setEnabled(state&&bypass_mode);
}
void ImportFields::valueChangedData(int)
{
import_changed=true;

View File

@ -2,7 +2,7 @@
//
// Import Parser Parameters for RDAdmin.
//
// (C) Copyright 2010-2019 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2010-2022 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
@ -17,13 +17,12 @@
// License along with this program; if not, write to the Free Software
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
//
//
#ifndef IMPORTFIELDS_H
#define IMPORTFIELDS_H
#include <qlabel.h>
#include <qspinbox.h>
#include <QLabel>
#include <QSpinBox>
#include <rdsvc.h>
#include <rdwidget.h>
@ -32,17 +31,25 @@ class ImportFields : public RDWidget
{
Q_OBJECT
public:
ImportFields(QWidget *parent=0);
ImportFields(RDSvc::ImportSource src,QWidget *parent=0);
QSize sizeHint() const;
QSizePolicy sizePolicy() const;
bool changed() const;
void readFields(RDSvc *svc,RDSvc::ImportSource type);
void setFields(RDSvc *svc,RDSvc::ImportSource type);
void readFields(RDSvc *svc);
void setFields(RDSvc *svc);
bool bypassMode() const;
void setBypassMode(bool state);
public slots:
void setBypassMode(int n);
void setEnabled(bool state);
private slots:
void valueChangedData(int);
private:
RDSvc::ImportSource import_source;
bool bypass_mode;
bool import_changed;
QSpinBox *cart_offset_spin;
QSpinBox *cart_length_spin;
@ -66,6 +73,16 @@ class ImportFields : public RDWidget
QSpinBox *data_length_spin;
QSpinBox *event_id_offset_spin;
QSpinBox *event_id_length_spin;
QLabel *trans_type_label;
QLabel *trans_type_offset_label;
QSpinBox *trans_type_offset_spin;
QLabel *trans_type_length_label;
QSpinBox *trans_type_length_spin;
QLabel *time_type_label;
QLabel *time_type_offset_label;
QSpinBox *time_type_offset_spin;
QLabel *time_type_length_label;
QSpinBox *time_type_length_spin;
};

View File

@ -80,7 +80,7 @@ ListSvcs::ListSvcs(QWidget *parent)
list_title_label=new QLabel(tr("Services:"),this);
list_title_label->setFont(labelFont());
list_title_label->setGeometry(14,11,85,19);
list_services_model=new RDServiceListModel(false,this);
list_services_model=new RDServiceListModel(false,false,this);
list_services_model->setFont(defaultFont());
list_services_model->setPalette(palette());
list_services_view->setModel(list_services_model);

View File

@ -2,7 +2,7 @@
//
// Test a Rivendell Log Import
//
// (C) Copyright 2002-2021 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2022 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
@ -33,30 +33,18 @@
#include "globals.h"
#include "test_import.h"
TestImport::TestImport(RDSvc *svc,RDSvc::ImportSource src,QWidget *parent)
TestImport::TestImport(QWidget *parent)
: RDDialog(parent)
{
QString sql;
QDate current_date=QDate::currentDate();
test_svc=svc;
test_src=src;
test_svc=NULL;
test_src=RDSvc::Music;
//
// Fix the Window Size
//
setMinimumSize(sizeHint());
switch(test_src) {
case RDSvc::Traffic:
setWindowTitle("RDAdmin - "+tr("Test Traffic Import"));
break;
case RDSvc::Music:
setWindowTitle("RDAdmin - "+tr("Test Music Import"));
break;
}
//
// Date Selector
//
@ -64,7 +52,6 @@ TestImport::TestImport(RDSvc *svc,RDSvc::ImportSource src,QWidget *parent)
test_date_label=new QLabel(tr("Test Date:"),this);
test_date_label->setFont(labelFont());
test_date_label->setAlignment(Qt::AlignVCenter|Qt::AlignRight);
test_date_edit->setDate(current_date);
connect(test_date_edit,SIGNAL(dateChanged(const QDate &)),
this,SLOT(dateChangedData(const QDate &)));
@ -75,6 +62,7 @@ TestImport::TestImport(RDSvc *svc,RDSvc::ImportSource src,QWidget *parent)
button->setGeometry(200,5,60,30);
button->setFont(subButtonFont());
button->setText(tr("Select"));
test_date_edit->setDate(QDate::currentDate());
connect(button,SIGNAL(clicked()),this,SLOT(selectData()));
//
@ -114,8 +102,6 @@ TestImport::TestImport(RDSvc *svc,RDSvc::ImportSource src,QWidget *parent)
test_close_button->setFont(buttonFont());
test_close_button->setText(tr("Close"));
connect(test_close_button,SIGNAL(clicked()),this,SLOT(closeData()));
dateChangedData(current_date);
}
@ -136,6 +122,28 @@ QSizePolicy TestImport::sizePolicy() const
}
int TestImport::exec(RDSvc *svc,RDSvc::ImportSource src)
{
test_svc=svc;
test_src=src;
switch(test_src) {
case RDSvc::Traffic:
setWindowTitle("RDAdmin - "+tr("Test Traffic Import"));
break;
case RDSvc::Music:
setWindowTitle("RDAdmin - "+tr("Test Music Import"));
break;
}
test_events_model->clear();
dateChangedData(test_date_edit->date());
return QDialog::exec();
}
void TestImport::selectData()
{
RDDateDialog *datedialog=
@ -164,16 +172,18 @@ void TestImport::importData()
QString sql=QString("delete from `IMPORTER_LINES` where ")+
"`STATION_NAME`='"+RDEscapeString(rda->station()->name())+"' && "+
QString::asprintf("`PROCESS_ID`=%u",getpid());
// printf("IMPORTER_LINES cleanup SQL: %s\n",(const char *)sql);
RDSqlQuery::apply(sql);
printf("IMPORTER_LINES cleanup SQL: %s\n",sql.toUtf8().constData());
// RDSqlQuery::apply(sql);
}
void TestImport::dateChangedData(const QDate &date)
{
test_filename_edit->
setText(RDDateDecode(test_svc->importPath(test_src),date,
rda->station(),rda->config(),test_svc->name()));
if(test_svc!=NULL) {
test_filename_edit->
setText(RDDateDecode(test_svc->importPath(test_src),date,
rda->station(),rda->config(),test_svc->name()));
}
}

View File

@ -2,7 +2,7 @@
//
// Test a Rivendell Log Import
//
// (C) Copyright 2002-2021 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2022 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
@ -35,11 +35,14 @@ class TestImport : public RDDialog
{
Q_OBJECT
public:
TestImport(RDSvc *svc,RDSvc::ImportSource src,QWidget *parent=0);
TestImport(QWidget *parent=0);
~TestImport();
QSize sizeHint() const;
QSizePolicy sizePolicy() const;
public slots:
int exec(RDSvc *svc,RDSvc::ImportSource src);
private slots:
void selectData();
void importData();

View File

@ -964,9 +964,16 @@ void LogLineBox::PrintTime()
switch(line_logline->timeType()) {
case RDLogLine::Hard:
line_time_label->setFont(line_bold_font);
line_time_label->
setText("T"+rda->tenthsTimeString(line_logline->
startTime(RDLogLine::Logged)));
if(line_logline->graceTime()<0) {
line_time_label->
setText("S"+rda->tenthsTimeString(line_logline->
startTime(RDLogLine::Logged)));
}
else {
line_time_label->
setText("H"+rda->tenthsTimeString(line_logline->
startTime(RDLogLine::Logged)));
}
line_time_label->setPalette(line_hard_palette);
break;

View File

@ -209,7 +209,12 @@ void ListReports::GenerateLogReport(QString *report)
// Time
//
if(logline->timeType()==RDLogLine::Hard) {
*report+="T";
if(logline->graceTime()<0) {
*report+="S";
}
else {
*report+="H";
}
}
else {
*report+=" ";

View File

@ -39,13 +39,19 @@ ListGrids::ListGrids(QWidget *parent)
edit_grids_view=new RDTableView(this);
edit_grids_view->
setGeometry(10,10,sizeHint().width()-20,sizeHint().height()-80);
edit_grids_model=new RDServiceListModel(false,this);
edit_grids_model=new RDServiceListModel(false,false,this);
edit_grids_model->setFont(font());
edit_grids_model->setPalette(palette());
edit_grids_view->setModel(edit_grids_model);
for(int i=2;i<edit_grids_model->columnCount();i++) {
for(int i=2;i<(edit_grids_model->columnCount()-1);i++) {
edit_grids_view->hideColumn(i);
}
connect(edit_grids_view->selectionModel(),
SIGNAL(selectionChanged(const QItemSelection &,
const QItemSelection &)),
this,
SLOT(selectionChangedData(const QItemSelection &,
const QItemSelection &)));
connect(edit_grids_view,SIGNAL(doubleClicked(const QModelIndex &)),
this,SLOT(doubleClickedData(const QModelIndex &)));
connect(edit_grids_model,SIGNAL(modelReset()),
@ -55,21 +61,23 @@ ListGrids::ListGrids(QWidget *parent)
//
// Edit Button
//
QPushButton *button=new QPushButton(this);
button->setGeometry(10,sizeHint().height()-60,80,50);
button->setFont(buttonFont());
button->setText(tr("Edit"));
connect(button,SIGNAL(clicked()),this,SLOT(editData()));
edit_edit_button=new QPushButton(this);
edit_edit_button->setGeometry(10,sizeHint().height()-60,80,50);
edit_edit_button->setFont(buttonFont());
edit_edit_button->setText(tr("Edit"));
edit_edit_button->setDisabled(true);
connect(edit_edit_button,SIGNAL(clicked()),this,SLOT(editData()));
//
// Close Button
//
button=new QPushButton(this);
button->setGeometry(sizeHint().width()-90,sizeHint().height()-60,80,50);
button->setDefault(true);
button->setFont(buttonFont());
button->setText(tr("Close"));
connect(button,SIGNAL(clicked()),this,SLOT(closeData()));
edit_close_button=new QPushButton(this);
edit_close_button->
setGeometry(sizeHint().width()-90,sizeHint().height()-60,80,50);
edit_close_button->setDefault(true);
edit_close_button->setFont(buttonFont());
edit_close_button->setText(tr("Close"));
connect(edit_close_button,SIGNAL(clicked()),this,SLOT(closeData()));
}
@ -89,7 +97,7 @@ void ListGrids::editData()
{
QModelIndexList rows=edit_grids_view->selectionModel()->selectedRows();
if(rows.size()!=1) {
if((rows.size()!=1)||(!edit_grids_model->hasGrid(rows.at(0)))) {
return;
}
EditGrid *d=new EditGrid(edit_grids_model->serviceName(rows.first()),this);
@ -98,6 +106,19 @@ void ListGrids::editData()
}
void ListGrids::selectionChangedData(const QItemSelection &selected,
const QItemSelection &previous)
{
QModelIndexList rows=edit_grids_view->selectionModel()->selectedRows();
if(rows.size()!=1) {
edit_edit_button->setDisabled(true);
return;
}
edit_edit_button->setEnabled(edit_grids_model->hasGrid(rows.at(0)));
}
void ListGrids::doubleClickedData(const QModelIndex &index)
{
editData();

View File

@ -2,7 +2,7 @@
//
// List Rivendell Log Grids
//
// (C) Copyright 2002-2021 Fred Gleason <fredg@paravelsystems.com>
// (C) Copyright 2002-2022 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
@ -21,6 +21,8 @@
#ifndef LIST_GRIDS_H
#define LIST_GRIDS_H
#include <QPushButton>
#include <rddialog.h>
#include <rdservicelistmodel.h>
#include <rdtableview.h>
@ -35,12 +37,16 @@ class ListGrids : public RDDialog
private slots:
void editData();
void selectionChangedData(const QItemSelection &selected,
const QItemSelection &previous);
void doubleClickedData(const QModelIndex &index);
void closeData();
private:
RDTableView *edit_grids_view;
RDServiceListModel *edit_grids_model;
QPushButton *edit_edit_button;
QPushButton *edit_close_button;
};

View File

@ -39,7 +39,7 @@ ListSvcs::ListSvcs(QWidget *parent)
// Log List
//
list_log_view=new RDTableView(this);
list_log_model=new RDServiceListModel(false,this);
list_log_model=new RDServiceListModel(false,false,this);
list_log_model->setFont(font());
list_log_model->setPalette(palette());
list_log_view->setModel(list_log_model);

View File

@ -140,6 +140,12 @@ cp NEWS $RPM_BUILD_ROOT/@DOC_PATH@/
cp README $RPM_BUILD_ROOT/@DOC_PATH@/
cp UPGRADING $RPM_BUILD_ROOT/@DOC_PATH@/
cp CODINGSTYLE $RPM_BUILD_ROOT/@DOC_PATH@/
mkdir -p $RPM_BUILD_ROOT/@DOC_PATH@/examples
cp docs/examples/*.cpi $RPM_BUILD_ROOT/@DOC_PATH@/examples/
cp docs/examples/*.elr $RPM_BUILD_ROOT/@DOC_PATH@/examples/
cp docs/examples/*.LOG $RPM_BUILD_ROOT/@DOC_PATH@/examples/
cp docs/examples/*.tfc $RPM_BUILD_ROOT/@DOC_PATH@/examples/
cp docs/examples/*.vti $RPM_BUILD_ROOT/@DOC_PATH@/examples/
cp conf/*.conf $RPM_BUILD_ROOT/@DOC_PATH@/
cat conf/rd.conf-sample | sed s/SyslogFacility=1/SyslogFacility=23/ > $RPM_BUILD_ROOT/@DOC_PATH@/rd.conf-sample
cp conf/asound.conf-sample $RPM_BUILD_ROOT/@DOC_PATH@/

View File

@ -41,6 +41,45 @@ bool MainObject::RevertSchema(int cur_schema,int set_schema,QString *err_msg)
// NEW SCHEMA REVERSIONS GO HERE...
//
// Revert 364
//
if((cur_schema==364)&&(set_schema<cur_schema)) {
sql=QString("update `IMPORT_TEMPLATES` set ")+
"`TRANS_TYPE_OFFSET`=NULL,"+
"`TRANS_TYPE_LENGTH`=NULL,"+
"`TIME_TYPE_OFFSET`=NULL,"+
"`TIME_TYPE_LENGTH`=NULL "+
"where `NAME`='Rivendell Standard Import'";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
WriteSchemaVersion(--cur_schema);
}
//
// Revert 363
//
if((cur_schema==363)&&(set_schema<cur_schema)) {
DropColumn("IMPORTER_LINES","GRACE_TIME");
DropColumn("IMPORTER_LINES","TIME_TYPE");
DropColumn("IMPORTER_LINES","TRANS_TYPE");
DropColumn("IMPORT_TEMPLATES","TIME_TYPE_LENGTH");
DropColumn("IMPORT_TEMPLATES","TIME_TYPE_OFFSET");
DropColumn("IMPORT_TEMPLATES","TRANS_TYPE_LENGTH");
DropColumn("IMPORT_TEMPLATES","TRANS_TYPE_OFFSET");
DropColumn("SERVICES","MUS_TIME_TYPE_LENGTH");
DropColumn("SERVICES","MUS_TIME_TYPE_OFFSET");
DropColumn("SERVICES","MUS_TRANS_TYPE_LENGTH");
DropColumn("SERVICES","MUS_TRANS_TYPE_OFFSET");
DropColumn("SERVICES","BYPASS_MODE");
WriteSchemaVersion(--cur_schema);
}
//
// Revert 362
//

View File

@ -160,7 +160,7 @@ void MainObject::InitializeSchemaMap() {
global_version_map["3.4"]=317;
global_version_map["3.5"]=346;
global_version_map["3.6"]=347;
global_version_map["4.0"]=362;
global_version_map["4.0"]=364;
}

View File

@ -11197,6 +11197,89 @@ bool MainObject::UpdateSchema(int cur_schema,int set_schema,QString *err_msg)
WriteSchemaVersion(++cur_schema);
}
if((cur_schema<363)&&(set_schema>cur_schema)) {
sql=QString("alter table `SERVICES` ")+
"add column `BYPASS_MODE` enum('N','Y') not null default 'N' "+
"after `DESCRIPTION`";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("alter table `SERVICES` ")+
"add column `MUS_TRANS_TYPE_OFFSET` int after `MUS_ANNC_TYPE_LENGTH`";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("alter table `SERVICES` ")+
"add column `MUS_TRANS_TYPE_LENGTH` int after `MUS_TRANS_TYPE_OFFSET`";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("alter table `SERVICES` ")+
"add column `MUS_TIME_TYPE_OFFSET` int after `MUS_TRANS_TYPE_LENGTH`";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("alter table `SERVICES` ")+
"add column `MUS_TIME_TYPE_LENGTH` int after `MUS_TIME_TYPE_OFFSET`";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("alter table `IMPORT_TEMPLATES` ")+
"add column `TRANS_TYPE_OFFSET` int after `ANNC_TYPE_LENGTH`";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("alter table `IMPORT_TEMPLATES` ")+
"add column `TRANS_TYPE_LENGTH` int after `TRANS_TYPE_OFFSET`";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("alter table `IMPORT_TEMPLATES` ")+
"add column `TIME_TYPE_OFFSET` int after `TRANS_TYPE_LENGTH`";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("alter table `IMPORT_TEMPLATES` ")+
"add column `TIME_TYPE_LENGTH` int after `TIME_TYPE_OFFSET`";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("alter table `IMPORTER_LINES` ")+
"add column `TRANS_TYPE` int not null default 255 after `LENGTH`";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("alter table `IMPORTER_LINES` ")+
"add column `TIME_TYPE` int not null default 0 after `TRANS_TYPE`";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
sql=QString("alter table `IMPORTER_LINES` ")+
"add column `GRACE_TIME` int not null default 0 after `TIME_TYPE`";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
WriteSchemaVersion(++cur_schema);
}
if((cur_schema<364)&&(set_schema>cur_schema)) {
sql=QString("update `IMPORT_TEMPLATES` set ")+
"`TRANS_TYPE_OFFSET`=102,"+
"`TRANS_TYPE_LENGTH`=5,"+
"`TIME_TYPE_OFFSET`=108,"+
"`TIME_TYPE_LENGTH`=4 "+
"where `NAME`='Rivendell Standard Import'";
if(!RDSqlQuery::apply(sql,err_msg)) {
return false;
}
WriteSchemaVersion(++cur_schema);
}
// NEW SCHEMA UPDATES GO HERE...