Skip to content

Commit

Permalink
Add filtering by summary in commit log
Browse files Browse the repository at this point in the history
  • Loading branch information
ArekPiekarz committed Aug 21, 2022
1 parent 2d81fa6 commit 405db9e
Show file tree
Hide file tree
Showing 12 changed files with 550 additions and 243 deletions.
87 changes: 0 additions & 87 deletions src/commit_log_author_filter_entry.rs

This file was deleted.

45 changes: 45 additions & 0 deletions src/commit_log_author_filter_widgets.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
use crate::commit_log_text_filter_widgets::{CommitLogTextFilterWidgets, WidgetData};
use crate::event::{Event, handleUnknown, IEventHandler, Sender, Source};
use crate::gui_element_provider::GuiElementProvider;


pub(crate) struct CommitLogAuthorFilterWidgets
{
inner: CommitLogTextFilterWidgets
}

impl IEventHandler for CommitLogAuthorFilterWidgets
{
fn handle(&mut self, source: Source, event: &Event)
{
match event {
Event::InvalidAuthorTextInputted(e) => self.onInvalidTextInputted(e),
Event::ValidAuthorTextInputted => self.onValidTextInputted(),
_ => handleUnknown(source, event)
}
}
}

impl CommitLogAuthorFilterWidgets
{
pub fn new(guiElementProvider: &GuiElementProvider, sender: Sender) -> Self
{
Self{inner: CommitLogTextFilterWidgets::new(
&WidgetData{name: "Commit log author filter entry", source: Source::CommitLogAuthorFilterEntry},
&WidgetData{name: "Commit log author filter case button", source: Source::CommitLogAuthorFilterCaseButton},
&WidgetData{name: "Commit log author filter regex button", source: Source::CommitLogAuthorFilterRegexButton},
guiElementProvider,
sender)
}
}

fn onInvalidTextInputted(&mut self, error: &regex::Error)
{
self.inner.handle(Source::CommitLogAuthorFilterEntry, &Event::InvalidTextInputted(error.clone()));
}

fn onValidTextInputted(&mut self)
{
self.inner.handle(Source::CommitLogAuthorFilterEntry, &Event::ValidTextInputted);
}
}
105 changes: 77 additions & 28 deletions src/commit_log_filters.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
use crate::config::{AuthorFilter, CommitLogFilter, Config};
use crate::config::{AuthorFilter, CommitLogFilter, Config, SummaryFilter};
use crate::event::{Event, FilterIndex, handleUnknown, IEventHandler, Sender, Source};

use itertools::Itertools;
Expand All @@ -18,11 +18,14 @@ impl IEventHandler for CommitLogFilters
use Source as S;
use Event as E;
match (source, event) {
(S::CommitLogAuthorFilterCaseButton, E::Toggled(isEnabled)) => self.onCaseButtonToggled(*isEnabled),
(S::CommitLogAuthorFilterRegexButton, E::Toggled(isEnabled)) => self.onRegexButtonToggled(*isEnabled),
(_, E::ActiveFilterChosen(index)) => self.onActiveFilterChosen(*index),
(_, E::FilterNameChosen(name)) => self.onFilterNameChosen(name),
(_, E::TextEntered(text)) => self.onTextEntered(text),
(S::CommitLogAuthorFilterCaseButton, E::Toggled(isEnabled)) => self.onAuthorCaseButtonToggled(*isEnabled),
(S::CommitLogAuthorFilterEntry, E::TextEntered(text)) => self.onAuthorTextEntered(text),
(S::CommitLogAuthorFilterRegexButton, E::Toggled(isEnabled)) => self.onAuthorRegexButtonToggled(*isEnabled),
(S::CommitLogSummaryFilterCaseButton, E::Toggled(isEnabled)) => self.onSummaryCaseButtonToggled(*isEnabled),
(S::CommitLogSummaryFilterEntry, E::TextEntered(text)) => self.onSummaryTextEntered(text),
(S::CommitLogSummaryFilterRegexButton, E::Toggled(isEnabled)) => self.onSummaryRegexButtonToggled(*isEnabled),
(_, E::ActiveFilterChosen(index)) => self.onActiveFilterChosen(*index),
(_, E::FilterNameChosen(name)) => self.onFilterNameChosen(name),
_ => handleUnknown(source, event)
}
}
Expand Down Expand Up @@ -51,7 +54,7 @@ impl CommitLogFilters
self.notifyFiltersUpdated();
}

fn onCaseButtonToggled(&mut self, isEnabled: bool)
fn onAuthorCaseButtonToggled(&mut self, isEnabled: bool)
{
if self.filters[self.currentFilter.index].authorFilter.caseSensitive == isEnabled {
self.currentFilter.authorFilterChanges.caseSensitive = None;
Expand All @@ -60,7 +63,7 @@ impl CommitLogFilters
}
}

fn onRegexButtonToggled(&mut self, isEnabled: bool)
fn onAuthorRegexButtonToggled(&mut self, isEnabled: bool)
{
if self.filters[self.currentFilter.index].authorFilter.usesRegex == isEnabled {
self.currentFilter.authorFilterChanges.usesRegex = None;
Expand All @@ -69,6 +72,42 @@ impl CommitLogFilters
}
}

fn onAuthorTextEntered(&mut self, text: &str)
{
if self.filters[self.currentFilter.index].authorFilter.pattern == text {
self.currentFilter.authorFilterChanges.pattern = None;
} else {
self.currentFilter.authorFilterChanges.pattern = Some(text.into());
}
}

fn onSummaryCaseButtonToggled(&mut self, isEnabled: bool)
{
if self.filters[self.currentFilter.index].summaryFilter.caseSensitive == isEnabled {
self.currentFilter.summaryFilterChanges.caseSensitive = None;
} else {
self.currentFilter.summaryFilterChanges.caseSensitive = Some(isEnabled);
}
}

fn onSummaryRegexButtonToggled(&mut self, isEnabled: bool)
{
if self.filters[self.currentFilter.index].summaryFilter.usesRegex == isEnabled {
self.currentFilter.summaryFilterChanges.usesRegex = None;
} else {
self.currentFilter.summaryFilterChanges.usesRegex = Some(isEnabled);
}
}

fn onSummaryTextEntered(&mut self, text: &str)
{
if self.filters[self.currentFilter.index].summaryFilter.pattern == text {
self.currentFilter.summaryFilterChanges.pattern = None;
} else {
self.currentFilter.summaryFilterChanges.pattern = Some(text.into());
}
}

fn onFilterNameChosen(&mut self, name: &str)
{
match self.filters.iter().find_position(|filter| filter.name == name)
Expand All @@ -89,36 +128,42 @@ impl CommitLogFilters
}
}

fn onTextEntered(&mut self, text: &str)
{
if self.filters[self.currentFilter.index].authorFilter.pattern == text {
self.currentFilter.authorFilterChanges.pattern = None;
} else {
self.currentFilter.authorFilterChanges.pattern = Some(text.into());
}
}

fn addFilter(&mut self, name: &str)
{
let newFilter = CommitLogFilter{name: name.into(), authorFilter: self.mergeOriginalAndChangedFilter()};
let newFilter = CommitLogFilter{
name: name.into(),
summaryFilter: self.mergeOriginalAndChangedSummaryFilter(),
authorFilter: self.mergeOriginalAndChangedAuthorFilter()};
self.filters.push(newFilter);
self.currentFilter = CurrentFilter::new(self.filters.len()-1);
}

fn mergeOriginalAndChangedFilter(&self) -> AuthorFilter
fn mergeOriginalAndChangedSummaryFilter(&self) -> SummaryFilter
{
let baseFilter = &self.filters[self.currentFilter.index].summaryFilter;
let filterChanges = &self.currentFilter.summaryFilterChanges;
SummaryFilter{
pattern: filterChanges.pattern.as_ref().unwrap_or(&baseFilter.pattern).into(),
caseSensitive: filterChanges.caseSensitive.unwrap_or(baseFilter.caseSensitive),
usesRegex: filterChanges.usesRegex.unwrap_or(baseFilter.usesRegex)
}
}

fn mergeOriginalAndChangedAuthorFilter(&self) -> AuthorFilter
{
let baseFilter = &self.filters[self.currentFilter.index].authorFilter;
let authorFilterChanges = &self.currentFilter.authorFilterChanges;
let filterChanges = &self.currentFilter.authorFilterChanges;
AuthorFilter{
pattern: authorFilterChanges.pattern.as_ref().unwrap_or(&baseFilter.pattern).into(),
caseSensitive: authorFilterChanges.caseSensitive.unwrap_or(baseFilter.caseSensitive),
usesRegex: authorFilterChanges.usesRegex.unwrap_or(baseFilter.usesRegex)
pattern: filterChanges.pattern.as_ref().unwrap_or(&baseFilter.pattern).into(),
caseSensitive: filterChanges.caseSensitive.unwrap_or(baseFilter.caseSensitive),
usesRegex: filterChanges.usesRegex.unwrap_or(baseFilter.usesRegex)
}
}

fn updateFilter(&mut self, index: FilterIndex)
{
self.filters[index].authorFilter = self.mergeOriginalAndChangedFilter();
self.filters[index].summaryFilter = self.mergeOriginalAndChangedSummaryFilter();
self.filters[index].authorFilter = self.mergeOriginalAndChangedAuthorFilter();
self.currentFilter = CurrentFilter::new(index);
}

Expand Down Expand Up @@ -153,25 +198,29 @@ impl CommitLogFilters
struct CurrentFilter
{
index: usize,
authorFilterChanges: AuthorFilterChanges
summaryFilterChanges: SummaryFilterChanges,
authorFilterChanges: AuthorFilterChanges,
}

impl CurrentFilter
{
fn new(index: FilterIndex) -> Self
{
Self{index, authorFilterChanges: AuthorFilterChanges::new()}
Self{index, summaryFilterChanges: SummaryFilterChanges::new(), authorFilterChanges: AuthorFilterChanges::new()}
}
}

struct AuthorFilterChanges
type SummaryFilterChanges = TextFilterChanges;
type AuthorFilterChanges = TextFilterChanges;

struct TextFilterChanges
{
pattern: Option<String>,
caseSensitive: Option<bool>,
usesRegex: Option<bool>
}

impl AuthorFilterChanges
impl TextFilterChanges
{
fn new() -> Self
{
Expand Down
Loading

0 comments on commit 405db9e

Please sign in to comment.