mirror of
https://git.meli.delivery/meli/meli
synced 2024-11-03 09:40:15 +00:00
Add tag settings in UI config module
This commit is contained in:
parent
19a268b8a7
commit
bca33370cc
@ -20,8 +20,7 @@
|
|||||||
*/
|
*/
|
||||||
use crate::backends::SpecialUseMailbox;
|
use crate::backends::SpecialUseMailbox;
|
||||||
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||||
use std::collections::{hash_map::DefaultHasher, HashMap, HashSet};
|
use std::collections::HashMap;
|
||||||
use std::hash::Hasher;
|
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Default, Clone)]
|
#[derive(Debug, Serialize, Default, Clone)]
|
||||||
pub struct AccountSettings {
|
pub struct AccountSettings {
|
||||||
@ -83,8 +82,6 @@ pub struct FolderConf {
|
|||||||
pub ignore: ToggleFlag,
|
pub ignore: ToggleFlag,
|
||||||
#[serde(default = "none")]
|
#[serde(default = "none")]
|
||||||
pub usage: Option<SpecialUseMailbox>,
|
pub usage: Option<SpecialUseMailbox>,
|
||||||
#[serde(default, deserialize_with = "tag_set_de")]
|
|
||||||
pub ignore_tags: HashSet<u64>,
|
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
pub extra: HashMap<String, String>,
|
pub extra: HashMap<String, String>,
|
||||||
}
|
}
|
||||||
@ -97,7 +94,6 @@ impl Default for FolderConf {
|
|||||||
subscribe: ToggleFlag::Unset,
|
subscribe: ToggleFlag::Unset,
|
||||||
ignore: ToggleFlag::Unset,
|
ignore: ToggleFlag::Unset,
|
||||||
usage: None,
|
usage: None,
|
||||||
ignore_tags: HashSet::default(),
|
|
||||||
extra: HashMap::default(),
|
extra: HashMap::default(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -184,17 +180,3 @@ impl Serialize for ToggleFlag {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn tag_set_de<'de, D>(deserializer: D) -> std::result::Result<HashSet<u64>, D::Error>
|
|
||||||
where
|
|
||||||
D: Deserializer<'de>,
|
|
||||||
{
|
|
||||||
Ok(<Vec<String>>::deserialize(deserializer)?
|
|
||||||
.into_iter()
|
|
||||||
.map(|tag| {
|
|
||||||
let mut hasher = DefaultHasher::new();
|
|
||||||
hasher.write(tag.as_bytes());
|
|
||||||
hasher.finish()
|
|
||||||
})
|
|
||||||
.collect())
|
|
||||||
}
|
|
||||||
|
@ -505,16 +505,28 @@ impl CompactListing {
|
|||||||
.hash();
|
.hash();
|
||||||
let folder = &context.accounts[self.cursor_pos.0].folder_confs[&folder_hash];
|
let folder = &context.accounts[self.cursor_pos.0].folder_confs[&folder_hash];
|
||||||
let mut tags = String::new();
|
let mut tags = String::new();
|
||||||
|
let mut colors = StackVec::new();
|
||||||
let backend_lck = context.accounts[self.cursor_pos.0].backend.read().unwrap();
|
let backend_lck = context.accounts[self.cursor_pos.0].backend.read().unwrap();
|
||||||
if let Some(t) = backend_lck.tags() {
|
if let Some(t) = backend_lck.tags() {
|
||||||
let tags_lck = t.read().unwrap();
|
let tags_lck = t.read().unwrap();
|
||||||
for t in e.labels().iter() {
|
for t in e.labels().iter() {
|
||||||
if folder.folder_conf.ignore_tags.contains(t) {
|
if folder
|
||||||
|
.conf_override
|
||||||
|
.tags
|
||||||
|
.as_ref()
|
||||||
|
.map(|s| s.ignore_tags.contains(t))
|
||||||
|
.unwrap_or(false)
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
tags.push(' ');
|
tags.push(' ');
|
||||||
tags.push_str(tags_lck.get(t).as_ref().unwrap());
|
tags.push_str(tags_lck.get(t).as_ref().unwrap());
|
||||||
tags.push(' ');
|
tags.push(' ');
|
||||||
|
if let Some(&c) = context.settings.tags.colors.get(t) {
|
||||||
|
colors.push(c);
|
||||||
|
} else {
|
||||||
|
colors.push(8);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if !tags.is_empty() {
|
if !tags.is_empty() {
|
||||||
tags.pop();
|
tags.pop();
|
||||||
|
@ -483,16 +483,28 @@ impl ConversationsListing {
|
|||||||
.hash();
|
.hash();
|
||||||
let folder = &context.accounts[self.cursor_pos.0].folder_confs[&folder_hash];
|
let folder = &context.accounts[self.cursor_pos.0].folder_confs[&folder_hash];
|
||||||
let mut tags = String::new();
|
let mut tags = String::new();
|
||||||
|
let mut colors = StackVec::new();
|
||||||
let backend_lck = context.accounts[self.cursor_pos.0].backend.read().unwrap();
|
let backend_lck = context.accounts[self.cursor_pos.0].backend.read().unwrap();
|
||||||
if let Some(t) = backend_lck.tags() {
|
if let Some(t) = backend_lck.tags() {
|
||||||
let tags_lck = t.read().unwrap();
|
let tags_lck = t.read().unwrap();
|
||||||
for t in e.labels().iter() {
|
for t in e.labels().iter() {
|
||||||
if folder.folder_conf.ignore_tags.contains(t) {
|
if folder
|
||||||
|
.conf_override
|
||||||
|
.tags
|
||||||
|
.as_ref()
|
||||||
|
.map(|s| s.ignore_tags.contains(t))
|
||||||
|
.unwrap_or(false)
|
||||||
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
tags.push(' ');
|
tags.push(' ');
|
||||||
tags.push_str(tags_lck.get(t).as_ref().unwrap());
|
tags.push_str(tags_lck.get(t).as_ref().unwrap());
|
||||||
tags.push(' ');
|
tags.push(' ');
|
||||||
|
if let Some(&c) = context.settings.tags.colors.get(t) {
|
||||||
|
colors.push(c);
|
||||||
|
} else {
|
||||||
|
colors.push(8);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if !tags.is_empty() {
|
if !tags.is_empty() {
|
||||||
tags.pop();
|
tags.pop();
|
||||||
|
@ -603,22 +603,6 @@ impl PlainListing {
|
|||||||
}
|
}
|
||||||
let envelope: EnvelopeRef = context.accounts[self.cursor_pos.0].collection.get_env(i);
|
let envelope: EnvelopeRef = context.accounts[self.cursor_pos.0].collection.get_env(i);
|
||||||
let mut tags = String::new();
|
let mut tags = String::new();
|
||||||
let backend_lck = context.accounts[self.cursor_pos.0].backend.read().unwrap();
|
|
||||||
if let Some(t) = backend_lck.tags() {
|
|
||||||
let tags_lck = t.read().unwrap();
|
|
||||||
for t in envelope.labels().iter() {
|
|
||||||
if folder.folder_conf.ignore_tags.contains(t) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
tags.push(' ');
|
|
||||||
tags.push_str(tags_lck.get(t).as_ref().unwrap());
|
|
||||||
tags.push(' ');
|
|
||||||
}
|
|
||||||
if !tags.is_empty() {
|
|
||||||
tags.pop();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
drop(backend_lck);
|
|
||||||
|
|
||||||
let entry_strings = PlainListing::make_entry_string(envelope, tags);
|
let entry_strings = PlainListing::make_entry_string(envelope, tags);
|
||||||
min_width.1 = cmp::max(min_width.1, entry_strings.date.grapheme_width()); /* date */
|
min_width.1 = cmp::max(min_width.1, entry_strings.date.grapheme_width()); /* date */
|
||||||
|
@ -28,6 +28,7 @@ pub mod composing;
|
|||||||
pub mod notifications;
|
pub mod notifications;
|
||||||
pub mod pager;
|
pub mod pager;
|
||||||
pub mod pgp;
|
pub mod pgp;
|
||||||
|
pub mod tags;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
pub mod shortcuts;
|
pub mod shortcuts;
|
||||||
pub mod terminal;
|
pub mod terminal;
|
||||||
@ -37,6 +38,7 @@ pub use self::accounts::Account;
|
|||||||
pub use self::composing::*;
|
pub use self::composing::*;
|
||||||
pub use self::pgp::*;
|
pub use self::pgp::*;
|
||||||
pub use self::shortcuts::*;
|
pub use self::shortcuts::*;
|
||||||
|
pub use self::tags::*;
|
||||||
|
|
||||||
use self::default_vals::*;
|
use self::default_vals::*;
|
||||||
use self::notifications::NotificationsSettings;
|
use self::notifications::NotificationsSettings;
|
||||||
@ -70,6 +72,7 @@ pub struct MailUIConf {
|
|||||||
pub composing: Option<ComposingSettings>,
|
pub composing: Option<ComposingSettings>,
|
||||||
pub identity: Option<String>,
|
pub identity: Option<String>,
|
||||||
pub index_style: Option<IndexStyle>,
|
pub index_style: Option<IndexStyle>,
|
||||||
|
pub tags: Option<TagsSettings>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
@ -230,6 +233,8 @@ pub struct FileSettings {
|
|||||||
shortcuts: Shortcuts,
|
shortcuts: Shortcuts,
|
||||||
composing: ComposingSettings,
|
composing: ComposingSettings,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
|
tags: TagsSettings,
|
||||||
|
#[serde(default)]
|
||||||
pgp: PGPSettings,
|
pgp: PGPSettings,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
terminal: TerminalSettings,
|
terminal: TerminalSettings,
|
||||||
@ -260,6 +265,7 @@ pub struct Settings {
|
|||||||
pub pager: PagerSettings,
|
pub pager: PagerSettings,
|
||||||
pub notifications: NotificationsSettings,
|
pub notifications: NotificationsSettings,
|
||||||
pub shortcuts: Shortcuts,
|
pub shortcuts: Shortcuts,
|
||||||
|
pub tags: TagsSettings,
|
||||||
pub composing: ComposingSettings,
|
pub composing: ComposingSettings,
|
||||||
pub pgp: PGPSettings,
|
pub pgp: PGPSettings,
|
||||||
pub terminal: TerminalSettings,
|
pub terminal: TerminalSettings,
|
||||||
@ -376,6 +382,7 @@ impl Settings {
|
|||||||
pager: fs.pager,
|
pager: fs.pager,
|
||||||
notifications: fs.notifications,
|
notifications: fs.notifications,
|
||||||
shortcuts: fs.shortcuts,
|
shortcuts: fs.shortcuts,
|
||||||
|
tags: fs.tags,
|
||||||
composing: fs.composing,
|
composing: fs.composing,
|
||||||
pgp: fs.pgp,
|
pgp: fs.pgp,
|
||||||
terminal: fs.terminal,
|
terminal: fs.terminal,
|
||||||
|
@ -1,5 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* meli - configuration module.
|
||||||
|
*
|
||||||
|
* Copyright 2019 Manos Pitsidianakis
|
||||||
|
*
|
||||||
|
* This file is part of meli.
|
||||||
|
*
|
||||||
|
* meli is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* meli is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with meli. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
use crate::terminal::Key;
|
use crate::terminal::Key;
|
||||||
//use std::any::TypeId;
|
|
||||||
use fnv::FnvHashMap;
|
use fnv::FnvHashMap;
|
||||||
|
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
|
69
ui/src/conf/tags.rs
Normal file
69
ui/src/conf/tags.rs
Normal file
@ -0,0 +1,69 @@
|
|||||||
|
/*
|
||||||
|
* meli - configuration module.
|
||||||
|
*
|
||||||
|
* Copyright 2019 Manos Pitsidianakis
|
||||||
|
*
|
||||||
|
* This file is part of meli.
|
||||||
|
*
|
||||||
|
* meli is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* meli is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with meli. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
use serde::{Deserialize, Deserializer};
|
||||||
|
use std::collections::{hash_map::DefaultHasher, HashMap, HashSet};
|
||||||
|
use std::hash::Hasher;
|
||||||
|
|
||||||
|
#[derive(Debug, Deserialize, Clone, Serialize)]
|
||||||
|
pub struct TagsSettings {
|
||||||
|
#[serde(default, deserialize_with = "tag_color_de")]
|
||||||
|
pub colors: HashMap<u64, u8>,
|
||||||
|
#[serde(default, deserialize_with = "tag_set_de")]
|
||||||
|
pub ignore_tags: HashSet<u64>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for TagsSettings {
|
||||||
|
fn default() -> Self {
|
||||||
|
TagsSettings {
|
||||||
|
colors: Default::default(),
|
||||||
|
ignore_tags: Default::default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn tag_set_de<'de, D>(deserializer: D) -> std::result::Result<HashSet<u64>, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
Ok(<Vec<String>>::deserialize(deserializer)?
|
||||||
|
.into_iter()
|
||||||
|
.map(|tag| {
|
||||||
|
let mut hasher = DefaultHasher::new();
|
||||||
|
hasher.write(tag.as_bytes());
|
||||||
|
hasher.finish()
|
||||||
|
})
|
||||||
|
.collect())
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn tag_color_de<'de, D>(deserializer: D) -> std::result::Result<HashMap<u64, u8>, D::Error>
|
||||||
|
where
|
||||||
|
D: Deserializer<'de>,
|
||||||
|
{
|
||||||
|
Ok(<HashMap<String, u8>>::deserialize(deserializer)?
|
||||||
|
.into_iter()
|
||||||
|
.map(|(tag, color)| {
|
||||||
|
let mut hasher = DefaultHasher::new();
|
||||||
|
hasher.write(tag.as_bytes());
|
||||||
|
(hasher.finish(), color)
|
||||||
|
})
|
||||||
|
.collect())
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user